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);
(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) {