mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-28 04:31:06 +00:00
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:
parent
d83ffd1231
commit
0a9ce66ec7
1 changed files with 27 additions and 0 deletions
|
@ -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));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue