avcodec/videotoolboxenc: add low-latency encoding

When using low-latency mode, it eliminates frame reordering
and follows a one-in-one-out encoding mode

Signed-off-by: xufuji456 <839789740@qq.com>
Signed-off-by: Rick Kern <kernrj@gmail.com>
This commit is contained in:
xufuji456 2023-05-19 14:05:14 +08:00 committed by Rick Kern
parent 47430a3cb1
commit 5cd304298e
1 changed files with 14 additions and 0 deletions

View File

@ -105,6 +105,7 @@ static struct{
CFStringRef kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder;
CFStringRef kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder;
CFStringRef kVTVideoEncoderSpecification_EnableLowLatencyRateControl;
getParameterSetAtIndex CMVideoFormatDescriptionGetHEVCParameterSetAtIndex;
} compat_keys;
@ -171,6 +172,8 @@ static void loadVTEncSymbols(void){
"EnableHardwareAcceleratedVideoEncoder");
GET_SYM(kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder,
"RequireHardwareAcceleratedVideoEncoder");
GET_SYM(kVTVideoEncoderSpecification_EnableLowLatencyRateControl,
"EnableLowLatencyRateControl");
}
typedef enum VT_H264Profile {
@ -1441,6 +1444,17 @@ static int vtenc_create_encoder(AVCodecContext *avctx,
}
}
// low-latency mode: eliminate frame reordering, follow a one-in-one-out encoding mode
if ((avctx->flags & AV_CODEC_FLAG_LOW_DELAY) && avctx->codec_id == AV_CODEC_ID_H264) {
status = VTSessionSetProperty(vtctx->session,
compat_keys.kVTVideoEncoderSpecification_EnableLowLatencyRateControl,
kCFBooleanTrue);
if (status) {
av_log(avctx, AV_LOG_ERROR, "Error setting low latency property: %d\n", status);
}
}
status = VTCompressionSessionPrepareToEncodeFrames(vtctx->session);
if (status) {
av_log(avctx, AV_LOG_ERROR, "Error: cannot prepare encoder: %d\n", status);