You've already forked FFmpeg
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:
@@ -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);
|
||||||
|
Reference in New Issue
Block a user