]> granicus.if.org Git - handbrake/commitdiff
decavcodec: fix hang in avcodec decoder
authorJohn Stebbins <jstebbins.hb@gmail.com>
Fri, 6 Nov 2015 21:00:14 +0000 (13:00 -0800)
committerJohn Stebbins <jstebbins.hb@gmail.com>
Tue, 10 Nov 2015 20:59:30 +0000 (12:59 -0800)
libavcodec/mpeg12dec.c expects input buffers to be zero padded to 32 bit
alignment.  If not zero padded, it can get caught in an infinite loop.

(cherry picked from commit f7b0c5773abe43b003295ecf631c83cc43a1ee91)

libhb/decavcodec.c

index 2029aa21d55d795c74a44a2018a71952586421d8..8c732c6d7e8504dac547bed6a771ed4e40c0d620 100644 (file)
@@ -537,6 +537,14 @@ static int decavcodecaWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
     hb_work_private_t * pv = w->private_data;
     hb_buffer_t * in = *buf_in;
 
+    // libavcodec/mpeg12dec.c requires buffers to be zero padded.
+    // If not zero padded, it can get stuck in an infinite loop.
+    // It's likely there are other decoders that expect the same.
+    if (in->data != NULL)
+    {
+        memset(in->data + in->size, 0, in->alloc - in->size);
+    }
+
     if ( in->size <= 0 )
     {
         /* EOF on input stream - send it downstream & say that we're done */
@@ -1810,6 +1818,14 @@ static int decavcodecvWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
     *buf_in = NULL;
     *buf_out = NULL;
 
+    // libavcodec/mpeg12dec.c requires buffers to be zero padded.
+    // If not zero padded, it can get stuck in an infinite loop.
+    // It's likely there are other decoders that expect the same.
+    if (in->data != NULL)
+    {
+        memset(in->data + in->size, 0, in->alloc - in->size);
+    }
+
     /* if we got an empty buffer signaling end-of-stream send it downstream */
     if ( in->size == 0 )
     {