diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2015-10-15 02:04:28 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2015-10-19 19:27:52 +0200 |
commit | 95ebdb6147d67405ccb55a4806f96f0cbd131e32 (patch) | |
tree | 9f48874913c2d4074185063d7f7a01d34617e013 | |
parent | e1a1b34a96470a871bffb68647687d84ccb33843 (diff) |
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.
-rw-r--r-- | libavformat/utils.c | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c index 94ee9d92f1..a9b864a40e 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -209,12 +209,23 @@ static int init_input(AVFormatContext *s, const char *filename, s, 0, s->probesize); } -static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt, - AVPacketList **plast_pktl) +static int add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt, + AVPacketList **plast_pktl, int ref) { AVPacketList *pktl = av_mallocz(sizeof(AVPacketList)); + int ret; + 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) (*plast_pktl)->next = pktl; @@ -223,23 +234,21 @@ static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt, /* Add the packet in the buffered packet list. */ *plast_pktl = pktl; - pktl->pkt = *pkt; - return &pktl->pkt; + return 0; } static int queue_attached_pictures(AVFormatContext *s) { - int i; + int i, ret; for (i = 0; i < s->nb_streams; i++) if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC && 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, ©, - &s->internal->raw_packet_buffer_end); + ret = add_to_pktbuf(&s->internal->raw_packet_buffer, + &s->streams[i]->attached_pic, + &s->internal->raw_packet_buffer_end, 1); + if (ret < 0) + return ret; } return 0; } @@ -451,8 +460,10 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt) !st->probe_packets)) return ret; - add_to_pktbuf(&s->internal->raw_packet_buffer, pkt, - &s->internal->raw_packet_buffer_end); + err = add_to_pktbuf(&s->internal->raw_packet_buffer, pkt, + &s->internal->raw_packet_buffer_end, 0); + if (err) + return err; s->internal->raw_packet_buffer_remaining_size -= pkt->size; if ((err = probe_codec(s, st, pkt)) < 0) @@ -841,12 +852,12 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index) out_pkt.buf = pkt->buf; pkt->buf = NULL; } - 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)) { + if ((ret = add_to_pktbuf(&s->internal->parse_queue, &out_pkt, + &s->internal->parse_queue_end, + out_pkt.data != pkt->data || + out_pkt.size != pkt->size) < 0)) { av_packet_unref(&out_pkt); - ret = AVERROR(ENOMEM); goto fail; } } @@ -1022,9 +1033,10 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) return ret; } - if (av_dup_packet(add_to_pktbuf(&s->internal->packet_buffer, pkt, - &s->internal->packet_buffer_end)) < 0) - return AVERROR(ENOMEM); + ret = add_to_pktbuf(&s->internal->packet_buffer, pkt, + &s->internal->packet_buffer_end, 1); + if (ret < 0) + return ret; } } @@ -2181,12 +2193,12 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) break; } - if (ic->flags & AVFMT_FLAG_NOBUFFER) { - pkt = &pkt1; - } else { - pkt = add_to_pktbuf(&ic->internal->packet_buffer, &pkt1, - &ic->internal->packet_buffer_end); - if ((ret = av_dup_packet(pkt)) < 0) + pkt = &pkt1; + + if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) { + ret = add_to_pktbuf(&ic->internal->packet_buffer, pkt, + &ic->internal->packet_buffer_end, 0); + if (ret < 0) goto find_stream_info_err; } |