新的版本,斷點進入發現老的解碼函數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