avcodec_send_packet()和avcodec_receive_frame()函数的源码
时间: 2023-09-14 21:08:30 浏览: 107
avcodec_sample.rar_avcodec g711_ffmpeg 解码_ffmpeg audio_ffmpeg c
avcodec_send_packet()和avcodec_receive_frame()函数的源码如下:
```
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
{
int ret;
if (!avctx || !avpkt)
return AVERROR(EINVAL);
ret = ff_thread_can_start_frame(avctx->internal);
if (ret < 0)
return ret;
ret = avctx->codec->send_packet(avctx, avpkt);
if (ret == AVERROR_EOF)
avctx->internal->draining = 1;
else if (ret == AVERROR(EAGAIN))
avctx->internal->need_context_update = 1;
if (ret < 0)
av_packet_unref(avpkt);
return ret;
}
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
{
int ret;
if (!avctx || !frame)
return AVERROR(EINVAL);
ret = ff_thread_can_start_frame(avctx->internal);
if (ret < 0)
return ret;
ret = avctx->codec->receive_frame(avctx, frame);
if (ret == AVERROR_EOF)
avctx->internal->draining = 1;
else if (ret == AVERROR(EAGAIN))
avctx->internal->need_context_update = 1;
return ret;
}
```
这两个函数都是调用了avctx->codec(即AVCodec结构体中的AVCodecContext)中对应的解码函数(avcodec_send_packet和avcodec_receive_frame)进行实际的数据处理。其中,avcodec_send_packet()函数将AVPacket发送到解码器中进行解码,avcodec_receive_frame()函数从解码器中接收解码后的AVFrame。两个函数都返回处理后的结果,可以根据返回值判断处理是否成功。
阅读全文