mac-videotoolbox: Add ProRes 4444 (XQ) support

Also leverage P216/P416 pixel formats to retain precision.
This commit is contained in:
jpark37
2022-11-20 19:12:50 -08:00
committed by Patrick Heyer
parent 463bf0dff5
commit 09c2a321ce
2 changed files with 42 additions and 9 deletions

View File

@@ -17,6 +17,8 @@ UseBFrames="Use B-Frames"
RateControl="Rate Control"
ColorFormatUnsupported="The selected color format is not supported by the selected Apple VT encoder. Select a compatible color format in Settings -> Advanced or use a different encoder."
ProResCodec="ProRes Codec"
ProRes4444XQ="ProRes 4444 XQ"
ProRes4444="ProRes 4444"
ProRes422Proxy="ProRes 422 Proxy"
ProRes422LT="ProRes 422 LT"
ProRes422="ProRes 422"

View File

@@ -72,6 +72,10 @@ static const char *codec_type_to_print_fmt(CMVideoCodecType codec_type)
return "h264";
case kCMVideoCodecType_HEVC:
return "hevc";
case kCMVideoCodecType_AppleProRes4444XQ:
return "ap4x";
case kCMVideoCodecType_AppleProRes4444:
return "ap4h";
case kCMVideoCodecType_AppleProRes422Proxy:
return "apco";
case kCMVideoCodecType_AppleProRes422LT:
@@ -685,9 +689,22 @@ static bool set_video_format(struct vt_encoder *enc, enum video_format format,
? kCVPixelFormatType_420YpCbCr10BiPlanarFullRange
: kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange;
return true;
} else {
return false;
}
break;
case VIDEO_FORMAT_P216:
if (!full_range) {
enc->vt_pix_fmt =
kCVPixelFormatType_422YpCbCr16BiPlanarVideoRange;
return true;
}
break;
case VIDEO_FORMAT_P416:
if (!full_range) {
enc->vt_pix_fmt =
kCVPixelFormatType_444YpCbCr16BiPlanarVideoRange;
return true;
}
break;
default:
return false;
}
@@ -1354,32 +1371,44 @@ static obs_properties_t *vt_properties_prores(void *unused, void *data)
for (size_t i = 0; i < size; ++i) {
switch (encoder_list[i].codec_type) {
case kCMVideoCodecType_AppleProRes422Proxy:
case kCMVideoCodecType_AppleProRes4444XQ:
codec_availability_flags |= (1 << 0);
break;
case kCMVideoCodecType_AppleProRes422LT:
case kCMVideoCodecType_AppleProRes4444:
codec_availability_flags |= (1 << 1);
break;
case kCMVideoCodecType_AppleProRes422:
case kCMVideoCodecType_AppleProRes422Proxy:
codec_availability_flags |= (1 << 2);
break;
case kCMVideoCodecType_AppleProRes422HQ:
case kCMVideoCodecType_AppleProRes422LT:
codec_availability_flags |= (1 << 3);
break;
case kCMVideoCodecType_AppleProRes422:
codec_availability_flags |= (1 << 4);
break;
case kCMVideoCodecType_AppleProRes422HQ:
codec_availability_flags |= (1 << 5);
break;
}
}
if (codec_availability_flags & (1 << 0))
obs_property_list_add_int(p, obs_module_text("ProRes4444XQ"),
kCMVideoCodecType_AppleProRes4444XQ);
if (codec_availability_flags & (1 << 1))
obs_property_list_add_int(p, obs_module_text("ProRes4444"),
kCMVideoCodecType_AppleProRes4444);
if (codec_availability_flags & (1 << 2))
obs_property_list_add_int(
p, obs_module_text("ProRes422Proxy"),
kCMVideoCodecType_AppleProRes422Proxy);
if (codec_availability_flags & (1 << 1))
if (codec_availability_flags & (1 << 3))
obs_property_list_add_int(p, obs_module_text("ProRes422LT"),
kCMVideoCodecType_AppleProRes422LT);
if (codec_availability_flags & (1 << 2))
if (codec_availability_flags & (1 << 4))
obs_property_list_add_int(p, obs_module_text("ProRes422"),
kCMVideoCodecType_AppleProRes422);
if (codec_availability_flags & (1 << 3))
if (codec_availability_flags & (1 << 5))
obs_property_list_add_int(p, obs_module_text("ProRes422HQ"),
kCMVideoCodecType_AppleProRes422HQ);
@@ -1561,6 +1590,8 @@ void obs_module_post_load(void)
codec_type);
break;
case kCMVideoCodecType_AppleProRes4444XQ:
case kCMVideoCodecType_AppleProRes4444:
case kCMVideoCodecType_AppleProRes422Proxy:
case kCMVideoCodecType_AppleProRes422LT:
case kCMVideoCodecType_AppleProRes422HQ: