mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
codecs: vp9: Also consider render_width/height
Also emits new_sequence if on keyframe and the render_width/height have change. The subclass can always optimize this if the frame resolution didn't change, the output caps needs to reflect this though. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1407>
This commit is contained in:
parent
f699c08af9
commit
43759ffeaa
1 changed files with 23 additions and 9 deletions
|
@ -66,8 +66,10 @@ GST_DEBUG_CATEGORY (gst_vp9_decoder_debug);
|
||||||
|
|
||||||
struct _GstVp9DecoderPrivate
|
struct _GstVp9DecoderPrivate
|
||||||
{
|
{
|
||||||
gint width;
|
gint frame_width;
|
||||||
gint height;
|
gint frame_height;
|
||||||
|
gint render_width;
|
||||||
|
gint render_height;
|
||||||
GstVP9Profile profile;
|
GstVP9Profile profile;
|
||||||
|
|
||||||
gboolean had_sequence;
|
gboolean had_sequence;
|
||||||
|
@ -145,6 +147,11 @@ gst_vp9_decoder_start (GstVideoDecoder * decoder)
|
||||||
priv->parser = gst_vp9_stateful_parser_new ();
|
priv->parser = gst_vp9_stateful_parser_new ();
|
||||||
priv->dpb = gst_vp9_dpb_new ();
|
priv->dpb = gst_vp9_dpb_new ();
|
||||||
priv->wait_keyframe = TRUE;
|
priv->wait_keyframe = TRUE;
|
||||||
|
priv->profile = GST_VP9_PROFILE_UNDEFINED;
|
||||||
|
priv->frame_width = 0;
|
||||||
|
priv->frame_height = 0;
|
||||||
|
priv->render_width = 0;
|
||||||
|
priv->render_height = 0;
|
||||||
|
|
||||||
priv->output_queue =
|
priv->output_queue =
|
||||||
gst_queue_array_new_for_struct (sizeof (GstVp9DecoderOutputFrame), 1);
|
gst_queue_array_new_for_struct (sizeof (GstVp9DecoderOutputFrame), 1);
|
||||||
|
@ -176,11 +183,21 @@ gst_vp9_decoder_check_codec_change (GstVp9Decoder * self,
|
||||||
GstFlowReturn ret = GST_FLOW_OK;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
gboolean changed = FALSE;
|
gboolean changed = FALSE;
|
||||||
|
|
||||||
if (priv->width != frame_hdr->width || priv->height != frame_hdr->height) {
|
if (priv->frame_width != frame_hdr->width
|
||||||
GST_INFO_OBJECT (self, "resolution changed %dx%d", frame_hdr->width,
|
|| priv->frame_height != frame_hdr->height) {
|
||||||
|
GST_INFO_OBJECT (self, "frame resolution changed %dx%d", frame_hdr->width,
|
||||||
frame_hdr->height);
|
frame_hdr->height);
|
||||||
priv->width = frame_hdr->width;
|
priv->frame_width = frame_hdr->width;
|
||||||
priv->height = frame_hdr->height;
|
priv->frame_height = frame_hdr->height;
|
||||||
|
changed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (priv->render_width != frame_hdr->render_width
|
||||||
|
|| priv->render_height != frame_hdr->render_height) {
|
||||||
|
GST_INFO_OBJECT (self, "render resolution changed %dx%d",
|
||||||
|
frame_hdr->render_width, frame_hdr->render_height);
|
||||||
|
priv->render_width = frame_hdr->render_width;
|
||||||
|
priv->render_height = frame_hdr->render_height;
|
||||||
changed = TRUE;
|
changed = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,9 +252,6 @@ gst_vp9_decoder_set_format (GstVideoDecoder * decoder,
|
||||||
|
|
||||||
self->input_state = gst_video_codec_state_ref (state);
|
self->input_state = gst_video_codec_state_ref (state);
|
||||||
|
|
||||||
priv->width = GST_VIDEO_INFO_WIDTH (&state->info);
|
|
||||||
priv->height = GST_VIDEO_INFO_HEIGHT (&state->info);
|
|
||||||
|
|
||||||
query = gst_query_new_latency ();
|
query = gst_query_new_latency ();
|
||||||
if (gst_pad_peer_query (GST_VIDEO_DECODER_SINK_PAD (self), query))
|
if (gst_pad_peer_query (GST_VIDEO_DECODER_SINK_PAD (self), query))
|
||||||
gst_query_parse_latency (query, &priv->is_live, NULL, NULL);
|
gst_query_parse_latency (query, &priv->is_live, NULL, NULL);
|
||||||
|
|
Loading…
Reference in a new issue