vaapidecode: Fix renegotiation for resolution change

Always renegotiate the pool if the immediate frame which going
to be pushed has a different un-cropped resolution than the already
configured one.
This commit is contained in:
Sreerenj Balachandran 2016-01-27 08:56:45 +02:00 committed by Víctor Manuel Jáquez Leal
parent d83ffd1231
commit 0a9ce66ec7

View file

@ -123,6 +123,8 @@ static gboolean
gst_vaapidecode_sink_query (GstVideoDecoder * vdec, GstQuery * query); gst_vaapidecode_sink_query (GstVideoDecoder * vdec, GstQuery * query);
static gboolean static gboolean
gst_vaapidecode_src_query (GstVideoDecoder * vdec, GstQuery * query); gst_vaapidecode_src_query (GstVideoDecoder * vdec, GstQuery * query);
static gboolean
gst_vaapidecode_negotiate (GstVaapiDecode * decode);
static void static void
gst_vaapi_decoder_state_changed (GstVaapiDecoder * decoder, gst_vaapi_decoder_state_changed (GstVaapiDecoder * decoder,
@ -271,6 +273,27 @@ gst_vaapidecode_release (GstVaapiDecode * decode)
gst_object_unref (decode); gst_object_unref (decode);
} }
static gboolean
is_surface_resolution_changed (GstVideoDecoder *vdec, GstVaapiSurface *surface)
{
guint surface_width, surface_height;
guint configured_width, configured_height;
GstVideoCodecState *state;
gboolean ret = FALSE;
gst_vaapi_surface_get_size(surface, &surface_width, &surface_height);
state = gst_video_decoder_get_output_state (vdec);
configured_width = GST_VIDEO_INFO_WIDTH (&state->info);
configured_height = GST_VIDEO_INFO_HEIGHT (&state->info);
gst_video_codec_state_unref (state);
if (surface_width != configured_width || surface_height != configured_height)
ret = TRUE;
return ret;
}
static GstFlowReturn static GstFlowReturn
gst_vaapidecode_push_decoded_frame (GstVideoDecoder * vdec, gst_vaapidecode_push_decoded_frame (GstVideoDecoder * vdec,
GstVideoCodecFrame * out_frame) GstVideoCodecFrame * out_frame)
@ -285,6 +308,10 @@ gst_vaapidecode_push_decoded_frame (GstVideoDecoder * vdec,
if (!GST_VIDEO_CODEC_FRAME_IS_DECODE_ONLY (out_frame)) { if (!GST_VIDEO_CODEC_FRAME_IS_DECODE_ONLY (out_frame)) {
proxy = gst_video_codec_frame_get_user_data (out_frame); proxy = gst_video_codec_frame_get_user_data (out_frame);
/* reconfigure if un-cropped surface resolution changed */
if (is_surface_resolution_changed (vdec, GST_VAAPI_SURFACE_PROXY_SURFACE (proxy)))
gst_vaapidecode_negotiate (decode);
gst_vaapi_surface_proxy_set_destroy_notify (proxy, gst_vaapi_surface_proxy_set_destroy_notify (proxy,
(GDestroyNotify) gst_vaapidecode_release, gst_object_ref (decode)); (GDestroyNotify) gst_vaapidecode_release, gst_object_ref (decode));