av_bsf_receive_packet 源码
时间: 2023-07-27 11:05:42 浏览: 221
收发数据包源代码
4星 · 用户满意度95%
av_bsf_receive_packet 函数是 FFmpeg 中的一个函数,它属于 Bitstream Filter(比特流过滤器)模块。该函数的作用是从输入 AVBSFContext(比特流过滤器上下文)中读取一个压缩数据包(AVPacket),然后经过过滤器处理后将输出的压缩数据包写入到输出 AVBSFContext 中。
以下是 av_bsf_receive_packet 函数的源码实现:
```c
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
{
int ret;
AVPacket *out_pkt = NULL;
if (!pkt)
return AVERROR(EINVAL);
if (!(ctx->filter->input_stream_ids[0] == pkt->stream_index ||
ctx->filter->input_stream_ids[0] == AVSTREAM_ALL_STREAMS)) {
av_log(ctx, AV_LOG_ERROR,
"Packet with wrong stream index: %d (not in %d-%d)\n",
pkt->stream_index, ctx->filter->input_stream_ids[0],
ctx->filter->input_stream_ids[ctx->filter->nb_inputs - 1]);
return AVERROR(EINVAL);
}
if (ctx->finished)
return AVERROR_EOF;
ret = av_packet_ref(pkt);
if (ret < 0)
return ret;
ret = av_packet_make_refcounted(pkt);
if (ret < 0)
goto fail;
ret = ff_bsf_get_packet_ref(ctx, pkt, &out_pkt);
if (ret < 0)
goto fail;
if (out_pkt) {
av_packet_move_ref(pkt, out_pkt);
return 0;
}
return AVERROR(EAGAIN);
fail:
av_packet_unref(pkt);
return ret;
}
```
在这段代码中,我们可以看到以下几个关键步骤:
1. 检查输入的 AVPacket 是否为空,如果为空则返回错误。
2. 检查输入的 AVPacket 的流索引是否与设定的输入流索引匹配。
3. 检查过滤器是否已经处理完毕,如果已经处理完毕则返回 EOF 错误。
4. 通过 av_packet_ref 函数将输入的 AVPacket 引用计数加 1。
5. 通过 av_packet_make_refcounted 函数将输入的 AVPacket 转换为带有引用计数的 AVPacket。
6. 调用 ff_bsf_get_packet_ref 函数进行过滤器处理,得到输出的 AVPacket。
7. 如果输出的 AVPacket 存在,则通过 av_packet_move_ref 函数将其移动到输入的 AVPacket 中。
8. 返回 0 表示处理成功,否则返回对应的错误码。
总体来说,av_bsf_receive_packet 函数的作用相当于是 FFmpeg 中比特流过滤器的核心函数,它通过调用过滤器处理函数来实现对压缩数据包的过滤。
阅读全文