一、背景
实测ffmpeg init 264 decode的时候,配置的是1080p的分辨率,直接来360p的数据,可以正常解析,反之init配置360p分辨率,实际来1080p数据,也可以正常解析。
二、分析
分析源码是每次解码器收到SPS数据的时候,都会重新更新初始化一次解码器参数。
h264_decode_frame
->ff_h264_decode_extradata
->decode_nal_units
->ff_h264_decode_seq_parameter_set
获取SPS里面的编码参数,例如分辨率等。
h264_decode_frame
->decode_nal_units
->ff_h264_decode_slice_header(按照SPS参数,更新新的编码参数,如分辨率)
->h264_slice_header_init
->ff_h264_alloc_tables 按照新的分辨率申请宏块内存
ff_h264_decode_slice_header(按照SPS参数,更新新的编码参数,如分辨率)
ff_h264_alloc_tables 按照新的分辨率申请宏块内存
三、结论
解码器在每次收到IDR帧的SPS可以重新初始化解码器,可以自适应解码不同分辨率的数据。