1定义声明

avcodec.h (libavcodec) line 878 :

/**
 * Force low delay.
 */
#define AV_CODEC_FLAG_LOW_DELAY       (1 << 19)

说明:强制低延时

2调用

mpeg_decode_sequence_extension in mpeg12dec.c (libavcodec) :     if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
mpeg1_decode_sequence in mpeg12dec.c (libavcodec) :     if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
decode_vop_header in mpeg4videodec.c (libavcodec) :         ctx->vol_control_parameters == 0 && !(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)) {
ff_mpeg4_decode_picture_header in mpeg4videodec.c (libavcodec) :     if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
ff_mpv_encode_init in mpegvideo_enc.c (libavcodec) :     if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
ff_mpv_encode_init in mpegvideo_enc.c (libavcodec) :         s->low_delay  = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
ff_mpv_encode_init in mpegvideo_enc.c (libavcodec) :         s->low_delay  = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
options_table.h (libavcodec) line 63 : {"low_delay", "force low delay", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_LOW_DELAY }, INT_MIN, INT_MAX, V|D|E, "flags"},
validate_thread_parameters in pthread.c (libavcodec) :                                 && !(avctx->flags  & AV_CODEC_FLAG_LOW_DELAY)
vc1_decode_frame in vc1dec.c (libavcodec) :     if(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
config_props in vf_mcdeint.c (libavfilter) :     enc_ctx->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY;
config_input in vf_uspp.c (libavfilter) :         avctx_enc->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY;

该函数主要是判断是否针对帧进行多线程解码,多线程解码跟低延时是有冲突的。

static void validate_thread_parameters(AVCodecContext *avctx)
{
    int frame_threading_supported = (avctx->codec->capabilities & AV_CODEC_CAP_FRAME_THREADS)
                                && !(avctx->flags  & AV_CODEC_FLAG_TRUNCATED)
                                && !(avctx->flags  & AV_CODEC_FLAG_LOW_DELAY)
                                && !(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS);
    if (avctx->thread_count == 1) {
        avctx->active_thread_type = 0;
    } else if (frame_threading_supported && (avctx->thread_type & FF_THREAD_FRAME)) {
        avctx->active_thread_type = FF_THREAD_FRAME;
    } else if (avctx->codec->capabilities & AV_CODEC_CAP_SLICE_THREADS &&
               avctx->thread_type & FF_THREAD_SLICE) {
        avctx->active_thread_type = FF_THREAD_SLICE;
    } else if (!(avctx->codec->capabilities & AV_CODEC_CAP_AUTO_THREADS)) {
        avctx->thread_count       = 1;
        avctx->active_thread_type = 0;
    }

    if (avctx->thread_count > MAX_AUTO_THREADS)
        av_log(avctx, AV_LOG_WARNING,
               "Application has requested %d threads. Using a thread count greater than %d is not recommended.\n",
               avctx->thread_count, MAX_AUTO_THREADS);
}

 

  F:\ffmpeg\source\FFmpeg\libavcodec\avcodec.h(900):#define AV_CODEC_FLAG_LOW_DELAY       (1 << 19)
  F:\ffmpeg\source\FFmpeg\libavcodec\mpeg4videodec.c(2708):        ctx->vol_control_parameters == 0 && !(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)) {
  F:\ffmpeg\source\FFmpeg\libavcodec\mpeg4videodec.c(3360):    if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
  F:\ffmpeg\source\FFmpeg\libavcodec\mpeg12dec.c(1423):    if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
  F:\ffmpeg\source\FFmpeg\libavcodec\mpeg12dec.c(2159):    if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
  F:\ffmpeg\source\FFmpeg\libavcodec\mpegvideo_enc.c(660):    if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
  F:\ffmpeg\source\FFmpeg\libavcodec\mpegvideo_enc.c(766):        s->low_delay  = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
  F:\ffmpeg\source\FFmpeg\libavcodec\mpegvideo_enc.c(771):        s->low_delay  = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
  F:\ffmpeg\source\FFmpeg\libavcodec\pthread.c(50):                                && !(avctx->flags  & AV_CODEC_FLAG_LOW_DELAY)
  F:\ffmpeg\source\FFmpeg\libavcodec\vc1dec.c(643):    if(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
  F:\ffmpeg\source\FFmpeg\libavfilter\vf_mcdeint.c(125):    enc_ctx->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY;
  F:\ffmpeg\source\FFmpeg\libavfilter\vf_uspp.c(360):        avctx_enc->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY;

3分析

从上面的调用逻辑可以看到,该宏定义主要是应用于编码输出,降低输出的延时

通过ffplay RTSP H264解码走读,并没有发现用于解码低延时

通过测试例子设置AVCodecContext的flags:
 flags |= AV_CODEC_FLAG_LOW_DELAY

并没有达到实际的低延时解码的效果

 

4总结

在编码过程中减低延时,可以设置AV_CODEC_FLAG_LOW_DELAY标志位

针对特定的解码器mpeg4videodec,mpeg12dec等,可以实现解码低延时