mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
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:
parent
8bee49c85e
commit
5430b6c351
1 changed files with 22 additions and 1 deletions
|
@ -497,8 +497,10 @@ gst_vp8_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
|
||||||
long decoder_deadline = 0;
|
long decoder_deadline = 0;
|
||||||
GstClockTimeDiff deadline;
|
GstClockTimeDiff deadline;
|
||||||
GstMapInfo minfo;
|
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);
|
dec = GST_VP8_DEC (decoder);
|
||||||
|
|
||||||
|
@ -550,6 +552,25 @@ gst_vp8_dec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
|
||||||
(double) -deadline / GST_SECOND);
|
(double) -deadline / GST_SECOND);
|
||||||
gst_video_decoder_drop_frame (decoder, frame);
|
gst_video_decoder_drop_frame (decoder, frame);
|
||||||
} else {
|
} 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);
|
ret = gst_video_decoder_allocate_output_frame (decoder, frame);
|
||||||
|
|
||||||
if (ret == GST_FLOW_OK) {
|
if (ret == GST_FLOW_OK) {
|
||||||
|
|
Loading…
Reference in a new issue