1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-15 14:13:16 +02:00

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

View File

@@ -105,6 +105,7 @@ static struct{
CFStringRef kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder; CFStringRef kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder;
CFStringRef kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder; CFStringRef kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder;
CFStringRef kVTVideoEncoderSpecification_EnableLowLatencyRateControl;
getParameterSetAtIndex CMVideoFormatDescriptionGetHEVCParameterSetAtIndex; getParameterSetAtIndex CMVideoFormatDescriptionGetHEVCParameterSetAtIndex;
} compat_keys; } compat_keys;
@@ -171,6 +172,8 @@ static void loadVTEncSymbols(void){
"EnableHardwareAcceleratedVideoEncoder"); "EnableHardwareAcceleratedVideoEncoder");
GET_SYM(kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder, GET_SYM(kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder,
"RequireHardwareAcceleratedVideoEncoder"); "RequireHardwareAcceleratedVideoEncoder");
GET_SYM(kVTVideoEncoderSpecification_EnableLowLatencyRateControl,
"EnableLowLatencyRateControl");
} }
typedef enum VT_H264Profile { 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); status = VTCompressionSessionPrepareToEncodeFrames(vtctx->session);
if (status) { if (status) {
av_log(avctx, AV_LOG_ERROR, "Error: cannot prepare encoder: %d\n", status); av_log(avctx, AV_LOG_ERROR, "Error: cannot prepare encoder: %d\n", status);