[Libva] [PATCH] Parse aspect ratio when using GStreamer codec parsers

Simon Farnsworth simon.farnsworth at onelan.co.uk
Mon Sep 10 07:54:30 PDT 2012


Not all encoded material uses square pixels. MPEG-4 part 2 already parsed
the aspect ratio from the bitstream; add equivalent code for H.264, MPEG-2
and VC-1.

Signed-off-by: Simon Farnsworth <simon.farnsworth at onelan.co.uk>
---

I've chosen to only set the aspect ratio if a known ratio is provided. This
means that unspecified inherits the last set aspect ratio; I think that this
is what's intended in the standard, so I'm not worried about this.

The patch applies cleanly to master and the 0.3-branch; I've only built amd
tested it on 0.3-branch

 gst-libs/gst/vaapi/gstvaapidecoder_h264.c  | 52 +++++++++++++++++++++++++++++
 gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c |  1 +
 gst-libs/gst/vaapi/gstvaapidecoder_vc1.c   | 53 ++++++++++++++++++++++++++++++
 3 files changed, 106 insertions(+)

diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
index 89fef91..556e791 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
@@ -685,6 +685,7 @@ end:
 static GstVaapiDecoderStatus
 decode_sps(GstVaapiDecoderH264 *decoder, GstH264NalUnit *nalu)
 {
+    GstVaapiDecoder * const base_decoder = GST_VAAPI_DECODER(decoder);
     GstVaapiDecoderH264Private * const priv = decoder->priv;
     GstH264SPS * const sps = &priv->last_sps;
     GstH264ParserResult result;
@@ -699,6 +700,57 @@ decode_sps(GstVaapiDecoderH264 *decoder, GstH264NalUnit *nalu)
     if (result != GST_H264_PARSER_OK)
         return get_status(result);
 
+    if (sps->vui_parameters_present_flag) {
+        GstH264VUIParams * vui = &sps->vui_parameters;
+        if (vui->aspect_ratio_info_present_flag) {
+            static const guint aspect_ratio_h_table[] = {
+                [1]  = 1,
+                [2]  = 12,
+                [3]  = 10,
+                [4]  = 16,
+                [5]  = 40,
+                [6]  = 24,
+                [7]  = 20,
+                [8]  = 32,
+                [9]  = 80,
+                [10] = 18,
+                [11] = 15,
+                [12] = 64,
+                [13] = 160,
+                [14] = 4,
+                [15] = 3,
+                [16] = 2,
+            };
+            static const guint aspect_ratio_v_table[] = {
+                [1]  = 1,
+                [2]  = 11,
+                [3]  = 11,
+                [4]  = 11,
+                [5]  = 33,
+                [6]  = 11,
+                [7]  = 11,
+                [8]  = 11,
+                [9]  = 33,
+                [10] = 11,
+                [11] = 11,
+                [12] = 33,
+                [13] = 99,
+                [14] = 3,
+                [15] = 2,
+                [16] = 1,
+            };
+            /* Intent is "if aspect ratio in tables above" */
+            if (vui->aspect_ratio_idc >= 1 && vui->aspect_ratio_idc <= 16)
+                gst_vaapi_decoder_set_pixel_aspect_ratio(base_decoder,
+                                                         aspect_ratio_h_table[vui->aspect_ratio_idc],
+                                                         aspect_ratio_v_table[vui->aspect_ratio_idc]);
+            /* Extended aspect ratio */
+            else if (vui->aspect_ratio_idc == 255 )
+                gst_vaapi_decoder_set_pixel_aspect_ratio(base_decoder,
+                                                         vui->sar_width,
+                                                         vui->sar_height);
+        }
+    }
     return ensure_context(decoder, sps);
 }
 
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c
index 38ecb33..48e9c2b 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c
@@ -513,6 +513,7 @@ decode_sequence(GstVaapiDecoderMpeg2 *decoder, guchar *buf, guint buf_size)
     priv->fps_d = seq_hdr->fps_d;
     pts_set_framerate(&priv->tsg, priv->fps_n, priv->fps_d);
     gst_vaapi_decoder_set_framerate(base_decoder, priv->fps_n, priv->fps_d);
+    gst_vaapi_decoder_set_pixel_aspect_ratio(base_decoder, seq_hdr->par_w, seq_hdr->par_h);
 
     priv->width                 = seq_hdr->width;
     priv->height                = seq_hdr->height;
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c b/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c
index 63fbc73..4a674fe 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c
@@ -330,6 +330,59 @@ decode_sequence(GstVaapiDecoderVC1 *decoder, GstVC1BDU *rbdu, GstVC1BDU *ebdu)
     switch (seq_hdr->profile) {
     case GST_VC1_PROFILE_SIMPLE:
     case GST_VC1_PROFILE_MAIN:
+        break;
+    case GST_VC1_PROFILE_ADVANCED:
+        if (adv_hdr->aspect_ratio_flag) {
+            static const guint aspect_ratio_h_table[] = {
+                [1]  = 1,
+                [2]  = 12,
+                [3]  = 10,
+                [4]  = 16,
+                [5]  = 40,
+                [6]  = 24,
+                [7]  = 20,
+                [8]  = 32,
+                [9]  = 80,
+                [10] = 18,
+                [11] = 15,
+                [12] = 64,
+                [13] = 160,
+            };
+            static const guint aspect_ratio_v_table[] = {
+                [1]  = 1,
+                [2]  = 11,
+                [3]  = 11,
+                [4]  = 11,
+                [5]  = 33,
+                [6]  = 11,
+                [7]  = 11,
+                [8]  = 11,
+                [9]  = 33,
+                [10] = 11,
+                [11] = 11,
+                [12] = 33,
+                [13] = 99,
+            };
+            /* Intent is "if aspect ratio in tables above" */
+            if (adv_hdr->aspect_ratio >= 1 && adv_hdr->aspect_ratio <= 13)
+                gst_vaapi_decoder_set_pixel_aspect_ratio(base_decoder,
+                                                         aspect_ratio_h_table[adv_hdr->aspect_ratio],
+                                                         aspect_ratio_v_table[adv_hdr->aspect_ratio]);
+            /* Extended aspect ratio */
+            else if (adv_hdr->aspect_ratio == 255 )
+                gst_vaapi_decoder_set_pixel_aspect_ratio(base_decoder,
+                                                         adv_hdr->aspect_horiz_size,
+                                                         adv_hdr->aspect_vert_size);
+        }
+        break;
+    default:
+        g_assert(0 && "XXX: we already validated the profile above");
+        break;
+    }
+
+    switch (seq_hdr->profile) {
+    case GST_VC1_PROFILE_SIMPLE:
+    case GST_VC1_PROFILE_MAIN:
         width  = seq_hdr->struct_c.coded_width;
         height = seq_hdr->struct_c.coded_height;
         break;
-- 
1.7.11.2



More information about the Libva mailing list