瀏覽代碼

mac-vth264: Use float for expected frame rate

The encoder property kVTCompressionPropertyKey_ExpectedFrameRate is a
hint to the video encoder. Since frame rates can be fractional, let's
use a float here instead of an int.
Ryan Foster 3 年之前
父節點
當前提交
6360b2e425
共有 1 個文件被更改,包括 12 次插入2 次删除
  1. 12 2
      plugins/mac-vth264/encoder.c

+ 12 - 2
plugins/mac-vth264/encoder.c

@@ -108,6 +108,16 @@ static CFStringRef obs_to_vt_colorspace(enum video_colorspace cs)
 	if ((code = (x)) != noErr) \
 		return code;
 
+static OSStatus session_set_prop_float(VTCompressionSessionRef session,
+				       CFStringRef key, float val)
+{
+	CFNumberRef n = CFNumberCreate(NULL, kCFNumberFloat32Type, &val);
+	OSStatus code = VTSessionSetProperty(session, key, n);
+	CFRelease(n);
+
+	return code;
+}
+
 static OSStatus session_set_prop_int(VTCompressionSessionRef session,
 				     CFStringRef key, int32_t val)
 {
@@ -300,9 +310,9 @@ static bool create_encoder(struct vt_h264_encoder *enc)
 	STATUS_CHECK(session_set_prop_int(
 		s, kVTCompressionPropertyKey_MaxKeyFrameInterval,
 		enc->keyint * ((float)enc->fps_num / enc->fps_den)));
-	STATUS_CHECK(session_set_prop_int(
+	STATUS_CHECK(session_set_prop_float(
 		s, kVTCompressionPropertyKey_ExpectedFrameRate,
-		ceil((float)enc->fps_num / enc->fps_den)));
+		(float)enc->fps_num / enc->fps_den));
 	STATUS_CHECK(session_set_prop(
 		s, kVTCompressionPropertyKey_AllowFrameReordering,
 		enc->bframes ? kCFBooleanTrue : kCFBooleanFalse));