新的版本,断点进入发现老的解码函数avcodec_decode_video2实际上还是调用的这2个函数.
avcodec_decode_video2
--->compat_decode
--->avcodec_send_packet
--->decode_receive_frame_internal
avcodec_decode_video2
--->compat_decode
--->avcodec_receive_frame
avcodec_send_packet 发送数据到ffmepg,放到解码队列中
avcodec_receive_frame 将成功的解码队列中取出1个frame (如果失败会返回0)
avcodec_send_packet后显示ret已经-11
ff_decode_get_packet,再h264_decode_frame(它会根据 NAL Unit 的类型进行解码)
decode时,2种调用方式,如下:(libavcodec/decode.c)
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpacket)
avpacket 解码和解封装是2个线程,如果解封装后,调用此函数后,会将avpacket的引用计数加1 或者 复制一份(没有计数引用)。因此在调用了后,释放掉 avpacket。
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
frame会每次清掉上一次frame,然后重新赋值,可以给同一个frame