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
This commit is contained in:
Tom Greenwood 2013-10-22 18:49:22 +01:00 committed by Sebastian Dröge
parent 8bee49c85e
commit 5430b6c351

View 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) {