libobs: Improve HEVC packet priority determination

This commit is contained in:
Dennis Sädtler
2025-08-04 09:45:21 +02:00
committed by Ryan Foster
parent 01e7b78929
commit b0b84ad4c9
+33 -10
View File
@@ -48,22 +48,45 @@ bool obs_hevc_keyframe(const uint8_t *data, size_t size)
static int compute_hevc_keyframe_priority(const uint8_t *nal_start, bool *is_keyframe, int priority)
{
int new_priority;
// HEVC contains NAL unit specifier at [6..1] bits of
// the byte next to the startcode 0x000001
const int type = (nal_start[0] & 0x7F) >> 1;
// Mark IDR slices as key-frames and set them to highest
// priority if needed. Assume other slices are non-key
// frames and set their priority as high
if (type >= OBS_HEVC_NAL_BLA_W_LP && type <= OBS_HEVC_NAL_RSV_IRAP_VCL23) {
*is_keyframe = 1;
priority = OBS_NAL_PRIORITY_HIGHEST;
} else if (type >= OBS_HEVC_NAL_TRAIL_N && type <= OBS_HEVC_NAL_RASL_R) {
if (priority < OBS_NAL_PRIORITY_HIGH)
priority = OBS_NAL_PRIORITY_HIGH;
switch (type) {
case OBS_HEVC_NAL_BLA_W_LP:
case OBS_HEVC_NAL_BLA_W_RADL:
case OBS_HEVC_NAL_BLA_N_LP:
case OBS_HEVC_NAL_IDR_W_RADL:
case OBS_HEVC_NAL_IDR_N_LP:
case OBS_HEVC_NAL_CRA_NUT:
case OBS_HEVC_NAL_RSV_IRAP_VCL22:
case OBS_HEVC_NAL_RSV_IRAP_VCL23:
/* intra random access point (IRAP) picture, keyframe and highest priority */
*is_keyframe = true;
new_priority = OBS_NAL_PRIORITY_HIGHEST;
break;
case OBS_HEVC_NAL_TRAIL_R:
case OBS_HEVC_NAL_TSA_R:
case OBS_HEVC_NAL_STSA_R:
case OBS_HEVC_NAL_RADL_R:
case OBS_HEVC_NAL_RASL_R:
/* sub-layer reference picture (mainly P-frames), high priority */
new_priority = OBS_NAL_PRIORITY_HIGH;
break;
case OBS_HEVC_NAL_TRAIL_N:
case OBS_HEVC_NAL_TSA_N:
case OBS_HEVC_NAL_STSA_N:
case OBS_HEVC_NAL_RADL_N:
case OBS_HEVC_NAL_RASL_N:
/* sub-layer non-reference (SLNR) picture (mainly B-frames), disposable */
new_priority = OBS_NAL_PRIORITY_DISPOSABLE;
break;
default:
new_priority = OBS_NAL_PRIORITY_DISPOSABLE;
}
return priority;
return priority > new_priority ? priority : new_priority;
}
static void serialize_hevc_data(struct serializer *s, const uint8_t *data, size_t size, bool *is_keyframe,