diff options
author | Jan Schmidt <thaytan@noraisin.net> | 2009-09-22 11:48:50 +0100 |
---|---|---|
committer | Jan Schmidt <thaytan@noraisin.net> | 2009-09-22 11:50:11 +0100 |
commit | 600516be9044a012b490e5ccef5ac868482dffe5 (patch) | |
tree | 0fa793922ebcb48d9b5151059fc05837a7cdf6c0 /gst/matroska/matroska-mux.c | |
parent | 123181a1147264915a6fbbe79eeb2dbef16bc391 (diff) |
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.
Diffstat (limited to 'gst/matroska/matroska-mux.c')
-rw-r--r-- | gst/matroska/matroska-mux.c | 9 |
1 files changed, 7 insertions, 2 deletions
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; } |