codecs: vp9decoder: Pass parser as new_sequence() parameter.
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Mon, 12 Oct 2020 09:07:47 +0000 (11:07 +0200)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 16 Oct 2020 17:50:42 +0000 (17:50 +0000)
In order to know the chroma format, besides profile, subsampling_x and
subsampling_y are needed (Spec 7.2.2 Color config semantics). These values are
in GstVp9Parser but not in  GstVp9Framehdr.

Also, bit_depth is available in parser but not frame header. Evenmore, those
values are copied to picture structure later.

In case of VA-API, to configure the pipeline, it is require to know the chroma
format and depth.

It is possible to know chroma and depth through caps coming from vp9parser, but
it requires string parsing. It would be less error prone to get these values
through the parser structure at new_sequence() virtual method.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1700>

gst-libs/gst/codecs/gstvp9decoder.c
gst-libs/gst/codecs/gstvp9decoder.h
sys/d3d11/gstd3d11vp9dec.c

index a292fc8..3869192 100644 (file)
@@ -187,7 +187,7 @@ gst_vp9_decoder_check_codec_change (GstVp9Decoder * self,
 
     priv->had_sequence = TRUE;
     if (klass->new_sequence)
-      priv->had_sequence = klass->new_sequence (self, frame_hdr);
+      priv->had_sequence = klass->new_sequence (self, priv->parser, frame_hdr);
 
     ret = priv->had_sequence;
   }
index 89161ba..f25252f 100644 (file)
@@ -85,6 +85,7 @@ struct _GstVp9DecoderClass
   GstVideoDecoderClass parent_class;
 
   gboolean        (*new_sequence)      (GstVp9Decoder * decoder,
+                                        const GstVp9Parser * parser,
                                         const GstVp9FrameHdr * frame_hdr);
 
   /**
index 95c9629..17a76e6 100644 (file)
@@ -133,7 +133,7 @@ static gboolean gst_d3d11_vp9_dec_src_query (GstVideoDecoder * decoder,
 
 /* GstVp9Decoder */
 static gboolean gst_d3d11_vp9_dec_new_sequence (GstVp9Decoder * decoder,
-    const GstVp9FrameHdr * frame_hdr);
+    const GstVp9Parser * parser, const GstVp9FrameHdr * frame_hdr);
 static gboolean gst_d3d11_vp9_dec_new_picture (GstVp9Decoder * decoder,
     GstVideoCodecFrame * frame, GstVp9Picture * picture);
 static GstVp9Picture *gst_d3d11_vp9_dec_duplicate_picture (GstVp9Decoder *
@@ -342,7 +342,7 @@ gst_d3d11_vp9_dec_src_query (GstVideoDecoder * decoder, GstQuery * query)
 
 static gboolean
 gst_d3d11_vp9_dec_new_sequence (GstVp9Decoder * decoder,
-    const GstVp9FrameHdr * frame_hdr)
+    const GstVp9Parser * parser, const GstVp9FrameHdr * frame_hdr)
 {
   GstD3D11Vp9Dec *self = GST_D3D11_VP9_DEC (decoder);
   gboolean modified = FALSE;