diff --git a/libobs/obs-avc.c b/libobs/obs-avc.c index b453cab33..8592472d1 100644 --- a/libobs/obs-avc.c +++ b/libobs/obs-avc.c @@ -19,6 +19,30 @@ #include "obs-avc.h" #include "util/array-serializer.h" +bool obs_avc_keyframe(const uint8_t *data, size_t size) +{ + const uint8_t *nal_start, *nal_end; + const uint8_t *end = data + size; + int type; + + nal_start = obs_avc_find_startcode(data, end); + while (true) { + while (nal_start < end && !*(nal_start++)); + + if (nal_start == end) + break; + + type = nal_start[0] & 0x1F; + + if (type == OBS_NAL_SLICE_IDR || type == OBS_NAL_SLICE) + return (type == OBS_NAL_SLICE_IDR); + + nal_end = obs_avc_find_startcode(nal_start, end); + nal_start = nal_end; + } + + return false; +} /* NOTE: I noticed that FFmpeg does some unusual special handling of certain * scenarios that I was unaware of, so instead of just searching for {0, 0, 1} diff --git a/libobs/obs-avc.h b/libobs/obs-avc.h index 9990347a2..8ff1ac404 100644 --- a/libobs/obs-avc.h +++ b/libobs/obs-avc.h @@ -48,6 +48,7 @@ enum { /* Helpers for parsing AVC NAL units. */ +EXPORT bool obs_avc_keyframe(const uint8_t *data, size_t size); EXPORT const uint8_t *obs_avc_find_startcode(const uint8_t *p, const uint8_t *end); EXPORT void obs_parse_avc_packet(struct encoder_packet *avc_packet,