pkt->pos = orig_pos;
if (!pkt->size)
- av_free_packet(pkt);
+ av_packet_unref(pkt);
return pkt->size > orig_size ? pkt->size - orig_size : ret;
}
s, 0, s->format_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;
/* Add the packet in the buffered packet list. */
*plast_pktl = pktl;
- pktl->pkt = *pkt;
- return &pktl->pkt;
+ return 0;
}
int avformat_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;
- if (copy.size <= 0) {
+ if (s->streams[i]->attached_pic.size <= 0) {
av_log(s, AV_LOG_WARNING,
"Attached picture on stream %d has invalid size, "
"ignoring\n", i);
continue;
}
- 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;
}
continue;
}
+ if (!pkt->buf) {
+ AVPacket tmp = { 0 };
+ ret = av_packet_ref(&tmp, pkt);
+ if (ret < 0)
+ return ret;
+ *pkt = tmp;
+ }
+
if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
(pkt->flags & AV_PKT_FLAG_CORRUPT)) {
av_log(s, AV_LOG_WARNING,
"Dropped corrupted packet (stream = %d)\n",
pkt->stream_index);
- av_free_packet(pkt);
+ av_packet_unref(pkt);
continue;
}
if (!pktl && st->request_probe <= 0)
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)
while (*pkt_buf) {
AVPacketList *pktl = *pkt_buf;
*pkt_buf = pktl->next;
- av_free_packet(&pktl->pkt);
+ av_packet_unref(&pktl->pkt);
av_freep(&pktl);
}
*pkt_buf_end = NULL;
compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts);
- if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
- 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)) {
- av_free_packet(&out_pkt);
- ret = AVERROR(ENOMEM);
+ ret = add_to_pktbuf(&s->internal->parse_queue, &out_pkt,
+ &s->internal->parse_queue_end, 1);
+ av_packet_unref(&out_pkt);
+ if (ret < 0)
goto fail;
- }
}
/* end of the stream => close and free the parser */
}
fail:
- av_free_packet(pkt);
+ av_packet_unref(pkt);
return ret;
}
return ret;
} else {
/* free packet */
- av_free_packet(&cur_pkt);
+ av_packet_unref(&cur_pkt);
}
if (pkt->flags & AV_PKT_FLAG_KEY)
st->skip_to_keyframe = 0;
if (st->skip_to_keyframe) {
- av_free_packet(&cur_pkt);
+ av_packet_unref(&cur_pkt);
if (got_packet) {
*pkt = cur_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);
+ av_packet_unref(pkt);
+ if (ret < 0)
+ return ret;
}
return_packet:
} while (read_status == AVERROR(EAGAIN));
if (read_status < 0)
break;
- av_free_packet(&pkt);
+ av_packet_unref(&pkt);
if (stream_index == pkt.stream_index && pkt.dts > timestamp) {
if (pkt.flags & AV_PKT_FLAG_KEY)
break;
st->info->last_duration = duration;
}
}
- av_free_packet(pkt);
+ av_packet_unref(pkt);
}
/* check if all audio/video streams have valid duration */
break;
}
- if (ic->flags & AVFMT_FLAG_NOBUFFER)
- free_packet_buffer(&ic->internal->packet_buffer,
- &ic->internal->packet_buffer_end);
- {
- pkt = add_to_pktbuf(&ic->internal->packet_buffer, &pkt1,
- &ic->internal->packet_buffer_end);
- if (!pkt) {
- ret = AVERROR(ENOMEM);
- goto find_stream_info_err;
- }
- 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;
}
av_parser_close(st->parser);
}
if (st->attached_pic.data)
- av_free_packet(&st->attached_pic);
+ av_packet_unref(&st->attached_pic);
av_dict_free(&st->metadata);
av_freep(&st->probe_data.buf);
av_freep(&st->index_entries);