From: Tom Greenwood Date: Tue, 22 Oct 2013 17:49:22 +0000 (+0100) Subject: vp8dec: Fix for handling resolution changes when decoding VP8 X-Git-Tag: 1.19.3~509^2~4212 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5430b6c351e015265a79eb92fc9203ec8bc06de2;p=platform%2Fupstream%2Fgstreamer.git vp8dec: Fix for handling resolution changes when decoding VP8 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 --- diff --git a/ext/vpx/gstvp8dec.c b/ext/vpx/gstvp8dec.c index 6f3d7d7..fc022c7 100644 --- a/ext/vpx/gstvp8dec.c +++ b/ext/vpx/gstvp8dec.c @@ -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) {