浏览代码

mac-videotoolbox: Use type_data as it was intended

gxalpha 3 年之前
父节点
当前提交
8c987a86ac
共有 1 个文件被更改,包括 50 次插入64 次删除
  1. 50 64
      plugins/mac-videotoolbox/encoder.c

+ 50 - 64
plugins/mac-videotoolbox/encoder.c

@@ -19,12 +19,11 @@
 #define VT_BLOG(level, format, ...) \
 	VT_LOG_ENCODER(enc->encoder, level, format, ##__VA_ARGS__)
 
-static DARRAY(struct vt_encoder_list_item {
-	const char *name;
+struct vt_encoder_type_data {
 	const char *disp_name;
 	const char *id;
-	const char *codec_name;
-}) vt_encoder_list;
+	bool hardware_accelerated;
+};
 
 struct vt_encoder {
 	obs_encoder_t *encoder;
@@ -813,16 +812,14 @@ static bool vt_extra_data(void *data, uint8_t **extra_data, size_t *size)
 
 static const char *vt_getname(void *data)
 {
-	uintptr_t encoder_id = (uintptr_t)data;
-	const char *disp_name =
-		vt_encoder_list.array[(int)encoder_id].disp_name;
+	struct vt_encoder_type_data *type_data = data;
 
-	if (strcmp("Apple H.264 (HW)", disp_name) == 0) {
+	if (strcmp("Apple H.264 (HW)", type_data->disp_name) == 0) {
 		return obs_module_text("VTH264EncHW");
-	} else if (strcmp("Apple H.264 (SW)", disp_name) == 0) {
+	} else if (strcmp("Apple H.264 (SW)", type_data->disp_name) == 0) {
 		return obs_module_text("VTH264EncSW");
 	}
-	return disp_name;
+	return type_data->disp_name;
 }
 
 #define TEXT_VT_ENCODER obs_module_text("VTEncoder")
@@ -895,11 +892,36 @@ static void vt_defaults(obs_data_t *settings)
 	obs_data_set_default_bool(settings, "bframes", true);
 }
 
+static void vt_free_type_data(void *data)
+{
+	struct vt_encoder_type_data *type_data = data;
+
+	bfree((char *)type_data->disp_name);
+	bfree((char *)type_data->id);
+	bfree(type_data);
+}
+
 OBS_DECLARE_MODULE()
 OBS_MODULE_USE_DEFAULT_LOCALE("mac-videotoolbox", "en-US")
 
-void encoder_list_create()
+bool obs_module_load(void)
 {
+	struct obs_encoder_info info = {
+		.type = OBS_ENCODER_VIDEO,
+		.codec = "h264",
+		.get_name = vt_getname,
+		.create = vt_create,
+		.destroy = vt_destroy,
+		.encode = vt_encode,
+		.update = vt_update,
+		.get_properties = vt_properties,
+		.get_defaults = vt_defaults,
+		.get_video_info = vt_video_info,
+		.get_extra_data = vt_extra_data,
+		.free_type_data = vt_free_type_data,
+		.caps = OBS_ENCODER_CAP_DYN_BITRATE,
+	};
+
 	CFArrayRef encoder_list;
 	VTCopyVideoEncoderList(NULL, &encoder_list);
 	CFIndex size = CFArrayGetCount(encoder_list);
@@ -919,68 +941,32 @@ void encoder_list_create()
 			bfree(codec_name);
 			continue;
 		}
-		VT_DICTSTR(kVTVideoEncoderList_EncoderName, name);
+		bfree(codec_name);
 		VT_DICTSTR(kVTVideoEncoderList_EncoderID, id);
 		VT_DICTSTR(kVTVideoEncoderList_DisplayName, disp_name);
-		struct vt_encoder_list_item enc = {
-			.name = name,
-			.id = id,
-			.disp_name = disp_name,
-			.codec_name = codec_name,
-		};
-		da_push_back(vt_encoder_list, &enc);
-#undef VT_DICTSTR
-	}
 
-	CFRelease(encoder_list);
-}
+		CFBooleanRef hardware_ref = CFDictionaryGetValue(
+			encoder_dict,
+			kVTVideoEncoderList_IsHardwareAccelerated);
+		bool hardware_accelerated = false;
+		if (hardware_ref)
+			hardware_accelerated = CFBooleanGetValue(hardware_ref);
+
+		info.id = id;
+		struct vt_encoder_type_data *type_data =
+			bzalloc(sizeof(struct vt_encoder_type_data));
+		type_data->disp_name = disp_name;
+		type_data->id = id;
+		type_data->hardware_accelerated = hardware_accelerated;
+		info.type_data = type_data;
 
-void encoder_list_destroy()
-{
-	for (size_t i = 0; i < vt_encoder_list.num; i++) {
-		bfree((char *)vt_encoder_list.array[i].name);
-		bfree((char *)vt_encoder_list.array[i].id);
-		bfree((char *)vt_encoder_list.array[i].codec_name);
-		bfree((char *)vt_encoder_list.array[i].disp_name);
-	}
-	da_free(vt_encoder_list);
-}
-
-void register_encoders()
-{
-	struct obs_encoder_info info = {
-		.type = OBS_ENCODER_VIDEO,
-		.codec = "h264",
-		.get_name = vt_getname,
-		.create = vt_create,
-		.destroy = vt_destroy,
-		.encode = vt_encode,
-		.update = vt_update,
-		.get_properties = vt_properties,
-		.get_defaults = vt_defaults,
-		.get_video_info = vt_video_info,
-		.get_extra_data = vt_extra_data,
-		.caps = OBS_ENCODER_CAP_DYN_BITRATE,
-	};
-
-	for (size_t i = 0; i < vt_encoder_list.num; i++) {
-		info.id = vt_encoder_list.array[i].id;
-		info.type_data = (void *)i;
 		obs_register_encoder(&info);
+#undef VT_DICTSTR
 	}
-}
 
-bool obs_module_load(void)
-{
-	encoder_list_create();
-	register_encoders();
+	CFRelease(encoder_list);
 
 	VT_LOG(LOG_INFO, "Adding VideoToolbox encoders");
 
 	return true;
 }
-
-void obs_module_unload(void)
-{
-	encoder_list_destroy();
-}