avcodec_send_packet 和avcodec_receive_frame实现解码

新的版本,断点进入发现老的解码函数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

posted @ 2019-10-08 11:23  weiweivv  阅读(6098)  评论(0)    收藏  举报