Commit d584533c authored by Luca Barbato's avatar Luca Barbato

avformat: Rework add_to_pktbuf

Make it return an error and check its return value when it is used.
Simplify the usage by calling `av_packet_ref` internally when needed.
parent ce70f28a
...@@ -209,12 +209,23 @@ static int init_input(AVFormatContext *s, const char *filename, ...@@ -209,12 +209,23 @@ static int init_input(AVFormatContext *s, const char *filename,
s, 0, s->probesize); s, 0, s->probesize);
} }
static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt, static int add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
AVPacketList **plast_pktl) AVPacketList **plast_pktl, int ref)
{ {
AVPacketList *pktl = av_mallocz(sizeof(AVPacketList)); AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
int ret;
if (!pktl) if (!pktl)
return NULL; return AVERROR(ENOMEM);
if (ref) {
if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) {
av_free(pktl);
return ret;
}
} else {
pktl->pkt = *pkt;
}
if (*packet_buffer) if (*packet_buffer)
(*plast_pktl)->next = pktl; (*plast_pktl)->next = pktl;
...@@ -223,23 +234,21 @@ static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt, ...@@ -223,23 +234,21 @@ static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
/* Add the packet in the buffered packet list. */ /* Add the packet in the buffered packet list. */
*plast_pktl = pktl; *plast_pktl = pktl;
pktl->pkt = *pkt; return 0;
return &pktl->pkt;
} }
static int queue_attached_pictures(AVFormatContext *s) static int queue_attached_pictures(AVFormatContext *s)
{ {
int i; int i, ret;
for (i = 0; i < s->nb_streams; i++) for (i = 0; i < s->nb_streams; i++)
if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC && if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
s->streams[i]->discard < AVDISCARD_ALL) { s->streams[i]->discard < AVDISCARD_ALL) {
AVPacket copy = s->streams[i]->attached_pic;
copy.buf = av_buffer_ref(copy.buf);
if (!copy.buf)
return AVERROR(ENOMEM);
add_to_pktbuf(&s->internal->raw_packet_buffer, &copy, ret = add_to_pktbuf(&s->internal->raw_packet_buffer,
&s->internal->raw_packet_buffer_end); &s->streams[i]->attached_pic,
&s->internal->raw_packet_buffer_end, 1);
if (ret < 0)
return ret;
} }
return 0; return 0;
} }
...@@ -451,8 +460,10 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -451,8 +460,10 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
!st->probe_packets)) !st->probe_packets))
return ret; return ret;
add_to_pktbuf(&s->internal->raw_packet_buffer, pkt, err = add_to_pktbuf(&s->internal->raw_packet_buffer, pkt,
&s->internal->raw_packet_buffer_end); &s->internal->raw_packet_buffer_end, 0);
if (err)
return err;
s->internal->raw_packet_buffer_remaining_size -= pkt->size; s->internal->raw_packet_buffer_remaining_size -= pkt->size;
if ((err = probe_codec(s, st, pkt)) < 0) if ((err = probe_codec(s, st, pkt)) < 0)
...@@ -837,16 +848,10 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index) ...@@ -837,16 +848,10 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
0, 0, AVINDEX_KEYFRAME); 0, 0, AVINDEX_KEYFRAME);
} }
if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) { if ((ret = add_to_pktbuf(&s->internal->parse_queue, &out_pkt,
out_pkt.buf = pkt->buf; &s->internal->parse_queue_end,
pkt->buf = NULL; 1))) {
}
if ((ret = av_dup_packet(&out_pkt)) < 0)
goto fail;
if (!add_to_pktbuf(&s->internal->parse_queue, &out_pkt, &s->internal->parse_queue_end)) {
av_packet_unref(&out_pkt); av_packet_unref(&out_pkt);
ret = AVERROR(ENOMEM);
goto fail; goto fail;
} }
} }
...@@ -1022,9 +1027,10 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) ...@@ -1022,9 +1027,10 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt)
return ret; return ret;
} }
if (av_dup_packet(add_to_pktbuf(&s->internal->packet_buffer, pkt, ret = add_to_pktbuf(&s->internal->packet_buffer, pkt,
&s->internal->packet_buffer_end)) < 0) &s->internal->packet_buffer_end, 1);
return AVERROR(ENOMEM); if (ret < 0)
return ret;
} }
} }
...@@ -2181,12 +2187,12 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) ...@@ -2181,12 +2187,12 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
break; break;
} }
if (ic->flags & AVFMT_FLAG_NOBUFFER) { pkt = &pkt1;
pkt = &pkt1;
} else { if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
pkt = add_to_pktbuf(&ic->internal->packet_buffer, &pkt1, ret = add_to_pktbuf(&ic->internal->packet_buffer, pkt,
&ic->internal->packet_buffer_end); &ic->internal->packet_buffer_end, 0);
if ((ret = av_dup_packet(pkt)) < 0) if (ret < 0)
goto find_stream_info_err; goto find_stream_info_err;
} }
......
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