From 600516be9044a012b490e5ccef5ac868482dffe5 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Tue, 22 Sep 2009 11:48:50 +0100 Subject: matroskamux: Don't get stuck in an infinite loop with Dirac At the end, Dirac streams have an EOS packet with 0 length. Don't ever sit in an infinite loop when processing one. Allows muxing Dirac into mkv to complete successfully. --- gst/matroska/matroska-mux.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'gst/matroska') diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c index 71e69979..8fb9d4e1 100644 --- a/gst/matroska/matroska-mux.c +++ b/gst/matroska/matroska-mux.c @@ -2431,6 +2431,8 @@ gst_matroska_mux_create_buffer_header (GstMatroskaTrackContext * track, return hdr; } +#define DIRAC_PARSE_CODE_SEQUENCE 0x00 + static GstBuffer * gst_matroska_mux_handle_dirac_packet (GstMatroskaMux * mux, GstMatroskaPad * collect_pad, GstBuffer * buf) @@ -2451,13 +2453,13 @@ gst_matroska_mux_handle_dirac_packet (GstMatroskaMux * mux, /* Check if this buffer contains a picture packet */ while (size >= 13) { - if (GST_READ_UINT32_BE (data) != 0x42424344) { + if (GST_READ_UINT32_BE (data) != 0x42424344 /* 'BBCD' */ ) { gst_buffer_unref (buf); return ret; } parse_code = GST_READ_UINT8 (data + 4); - if (parse_code == 0x00) { + if (parse_code == DIRAC_PARSE_CODE_SEQUENCE) { if (ctx->dirac_unit) { gst_buffer_unref (ctx->dirac_unit); ctx->dirac_unit = NULL; @@ -2469,6 +2471,9 @@ gst_matroska_mux_handle_dirac_packet (GstMatroskaMux * mux, next_parse_offset = GST_READ_UINT32_BE (data + 5); + if (G_UNLIKELY (next_parse_offset == 0)) + break; + data += next_parse_offset; size -= next_parse_offset; } -- cgit