summaryrefslogtreecommitdiffstats
path: root/gst/matroska
diff options
context:
space:
mode:
authorJan Schmidt <thaytan@noraisin.net>2009-09-22 11:48:50 +0100
committerJan Schmidt <thaytan@noraisin.net>2009-09-22 11:50:11 +0100
commit600516be9044a012b490e5ccef5ac868482dffe5 (patch)
tree0fa793922ebcb48d9b5151059fc05837a7cdf6c0 /gst/matroska
parent123181a1147264915a6fbbe79eeb2dbef16bc391 (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')
-rw-r--r--gst/matroska/matroska-mux.c9
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;
}