mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-08-28 17:42:28 +08:00
libobs: Improve HEVC packet priority determination
This commit is contained in:
committed by
Ryan Foster
parent
01e7b78929
commit
b0b84ad4c9
+33
-10
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user