ffmpeg源码剖析:avcode_send_frame()

先贴上源码:

 int attribute_align_arg avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame)
 {
     AVCodecInternal *avci = avctx->internal;
     int ret;
  
     if (!avcodec_is_open(avctx) || !av_codec_is_encoder(avctx->codec))
         return AVERROR(EINVAL);
  
     if (avci->draining)
         return AVERROR_EOF;
  
     if (avci->buffer_frame->data[0])
         return AVERROR(EAGAIN);
  
     if (!frame) {
         avci->draining = 1;
     } else {
         ret = encode_send_frame_internal(avctx, frame);
         if (ret < 0)
             return ret;
     }
  
     if (!avci->buffer_pkt->data && !avci->buffer_pkt->side_data) {
         ret = encode_receive_packet_internal(avctx, avci->buffer_pkt);
         if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
             return ret;
     }
  
     return 0;
 }

根据源码我们深入其中更深层次得调用关系如下:

ffmpeg源码剖析:avcode_send_frame()_第1张图片

当我们在使用这个函数是可能会出现错误:

EAGIAN应该是没有把上一次send的数据读完,然后又send了一次,当再次recevice的时候就会报这个错误。 

EOF应该是没有数据可读了。

你可能感兴趣的:(ffmpeg,音视频)