vp8dec: Fix for handling resolution changes when decoding VP8
authorTom Greenwood <tcdgreenwood@hotmail.com>
Tue, 22 Oct 2013 17:49:22 +0000 (18:49 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 2 Sep 2014 05:42:24 +0000 (08:42 +0300)
If the resolution changes in the bitstream without the input caps changing we
would previously output corrupted video or crash.

https://bugzilla.gnome.org/show_bug.cgi?id=719359

ext/vpx/gstvp8dec.c

index 6f3d7d7..fc022c7 100644 (file)
@@ -497,8 +497,10 @@ gst_vp8_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
   long decoder_deadline = 0;
   GstClockTimeDiff deadline;
   GstMapInfo minfo;
+  GstVideoInfo *info;
+  GstVideoCodecState *new_output_state;
 
-  GST_DEBUG_OBJECT (decoder, "handle_frame");
+  GST_LOG_OBJECT (decoder, "handle_frame");
 
   dec = GST_VP8_DEC (decoder);
 
@@ -550,6 +552,25 @@ gst_vp8_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
           (double) -deadline / GST_SECOND);
       gst_video_decoder_drop_frame (decoder, frame);
     } else {
+      info = &dec->output_state->info;
+      if (GST_VIDEO_INFO_WIDTH (info) != img->d_w
+          || GST_VIDEO_INFO_HEIGHT (info) != img->d_h) {
+        GST_DEBUG_OBJECT (dec,
+            "Changed output resolution was %d x %d now is got %u x %u (display %u x %u)",
+            GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info), img->w,
+            img->h, img->d_w, img->d_h);
+
+        new_output_state =
+            gst_video_decoder_set_output_state (GST_VIDEO_DECODER (dec),
+            GST_VIDEO_FORMAT_I420, img->d_w, img->d_h, dec->output_state);
+        if (dec->output_state) {
+          gst_video_codec_state_unref (dec->output_state);
+        }
+        dec->output_state = new_output_state;
+        /* No need to call negotiate() here, it will be automatically called
+         * by allocate_output_frame() below */
+      }
+
       ret = gst_video_decoder_allocate_output_frame (decoder, frame);
 
       if (ret == GST_FLOW_OK) {