浏览代码

libobs: Add function to determine AVC keyframes

Added obs_avc_keyframe that returns whether an avc packet is a keyframe
or not.  This function is particularly useful for when writing custom
encoder plugins.
jp9000 10 年之前
父节点
当前提交
9f97b02c32
共有 2 个文件被更改,包括 25 次插入0 次删除
  1. 24 0
      libobs/obs-avc.c
  2. 1 0
      libobs/obs-avc.h

+ 24 - 0
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}

+ 1 - 0
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,