Commit 5430b6c3 authored by Tom Greenwood's avatar Tom Greenwood Committed by Sebastian Dröge

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.
parent 8bee49c8
......@@ -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) {
"Changed output resolution was %d x %d now is got %u x %u (display %u x %u)",
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) {
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment