Commit 23e994ca authored by James Almer's avatar James Almer

avformat/utils: use the existing packet reference when parsing complete frames

If the parser returns full frames, then the output pointer retured by
av_parser_parse2() is guaranteed to point to data contained in the
input packet's buffer.

Create a new reference to said buffer in that case, to avoid
unnecessary data copy when queueing the packet later in the function.
Reviewed-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
Signed-off-by: 's avatarJames Almer <jamrial@gmail.com>
parent b14761d1
......@@ -1472,6 +1472,22 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
if (!out_pkt.size)
continue;
if (pkt->buf && out_pkt.data == pkt->data) {
/* reference pkt->buf only when out_pkt.data is guaranteed to point
* to data in it and not in the parser's internal buffer. */
/* XXX: Ensure this is the case with all parsers when st->parser->flags
* is PARSER_FLAG_COMPLETE_FRAMES and check for that instead? */
out_pkt.buf = av_buffer_ref(pkt->buf);
if (!out_pkt.buf) {
ret = AVERROR(ENOMEM);
goto fail;
}
} else {
ret = av_packet_make_refcounted(&out_pkt);
if (ret < 0)
goto fail;
}
if (pkt->side_data) {
out_pkt.side_data = pkt->side_data;
out_pkt.side_data_elems = pkt->side_data_elems;
......@@ -1512,10 +1528,11 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
ret = ff_packet_list_put(&s->internal->parse_queue,
&s->internal->parse_queue_end,
&out_pkt, FF_PACKETLIST_FLAG_REF_PACKET);
av_packet_unref(&out_pkt);
if (ret < 0)
&out_pkt, 0);
if (ret < 0) {
av_packet_unref(&out_pkt);
goto fail;
}
}
/* end of the stream => close and free the parser */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment