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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM