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等,可以实现解码低延时