summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/internal.h3
-rw-r--r--libavformat/matroskadec.c8
2 files changed, 6 insertions, 5 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h
index d85b9a3d9b..8631694d00 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -98,6 +98,9 @@ struct AVFormatInternal {
* for short periods that are guaranteed not to overlap
* with calls to av_read_frame() (or ff_read_packet())
* or with each other.
+ * It may be used by demuxers as a replacement for
+ * stack packets (unless they call one of the aforementioned
+ * functions with their own AVFormatContext).
* Every user has to ensure that this packet is blank
* after using it.
*/
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 9acfdf5b32..1dc188c946 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -381,6 +381,8 @@ typedef struct MatroskaDemuxContext {
/* byte position of the segment inside the stream */
int64_t segment_start;
+ /* This packet coincides with AVFormatInternal.parse_pkt
+ * and is not owned by us. */
AVPacket *pkt;
/* the packet queue */
@@ -2945,9 +2947,7 @@ static int matroska_read_header(AVFormatContext *s)
}
ebml_free(ebml_syntax, &ebml);
- matroska->pkt = av_packet_alloc();
- if (!matroska->pkt)
- return AVERROR(ENOMEM);
+ matroska->pkt = s->internal->parse_pkt;
/* The next thing is a segment. */
pos = avio_tell(matroska->ctx->pb);
@@ -3528,7 +3528,6 @@ static int matroska_parse_frame(MatroskaDemuxContext *matroska,
if (!pkt_size && !additional_size)
goto no_output;
- av_packet_unref(pkt);
if (!buf)
pkt->buf = av_buffer_create(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE,
NULL, NULL, 0);
@@ -3902,7 +3901,6 @@ static int matroska_read_close(AVFormatContext *s)
int n;
matroska_clear_queue(matroska);
- av_packet_free(&matroska->pkt);
for (n = 0; n < matroska->tracks.nb_elem; n++)
if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)