[vlc-commits] packetizer: h264: fix get_profile_level

Francois Cartegnie git at videolan.org
Tue Jul 12 10:41:26 CEST 2016


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Jul 12 10:33:09 2016 +0200| [75bde798da1389e6f23d79f68efd4cb6a5d622e9] | committer: Francois Cartegnie

packetizer: h264: fix get_profile_level

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=75bde798da1389e6f23d79f68efd4cb6a5d622e9
---

 modules/codec/avcodec/directx_va.c |    2 +-
 modules/codec/omxil/mediacodec.c   |   13 +++++++++----
 modules/codec/omxil/omxil.c        |    4 ++--
 modules/codec/videotoolbox.m       |   10 +++++-----
 modules/packetizer/h264_nal.c      |   36 +++++++++++++++++++++---------------
 modules/packetizer/h264_nal.h      |    6 +++---
 6 files changed, 41 insertions(+), 30 deletions(-)

diff --git a/modules/codec/avcodec/directx_va.c b/modules/codec/avcodec/directx_va.c
index fd915e3..4e6a34a 100644
--- a/modules/codec/avcodec/directx_va.c
+++ b/modules/codec/avcodec/directx_va.c
@@ -490,7 +490,7 @@ static bool profile_supported(const directx_va_mode_t *mode, const es_format_t *
         int profile = fmt->i_profile;
         if (mode->codec == AV_CODEC_ID_H264)
         {
-            size_t h264_profile;
+            uint8_t h264_profile;
             if ( h264_get_profile_level(fmt, &h264_profile, NULL, NULL) )
                 profile = h264_profile;
         }
diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c
index 13c72bd..e02b6cd 100644
--- a/modules/codec/omxil/mediacodec.c
+++ b/modules/codec/omxil/mediacodec.c
@@ -517,10 +517,10 @@ static int StartMediaCodec(decoder_t *p_dec)
         if (p_dec->fmt_in.i_codec == VLC_CODEC_H264
          && !p_sys->u.video.i_h264_profile)
         {
-            h264_get_profile_level(&p_dec->fmt_in,
-                                   &p_sys->u.video.i_h264_profile, NULL, NULL);
-            if (p_sys->u.video.i_h264_profile)
+            uint8_t i_profile;
+            if(h264_get_profile_level(&p_dec->fmt_in, &i_profile, NULL, NULL))
             {
+                p_sys->u.video.i_h264_profile = i_profile;
                 if (p_sys->api->configure(p_sys->api,
                                           p_sys->u.video.i_h264_profile, 0, 0) != 0 )
                     return VLC_EGENERIC;
@@ -668,7 +668,12 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init)
     api->psz_mime = mime;
 
     if (p_dec->fmt_in.i_codec == VLC_CODEC_H264)
-        h264_get_profile_level(&p_dec->fmt_in, &i_h264_profile, NULL, NULL);
+    {
+        uint8_t i_profile;
+        if( h264_get_profile_level(&p_dec->fmt_in, &i_profile, NULL, NULL) )
+            i_h264_profile = i_profile;
+    }
+
     if (pf_init(api) != 0)
     {
         free(api);
diff --git a/modules/codec/omxil/omxil.c b/modules/codec/omxil/omxil.c
index a63cb30..7626054 100644
--- a/modules/codec/omxil/omxil.c
+++ b/modules/codec/omxil/omxil.c
@@ -174,7 +174,7 @@ static OMX_ERRORTYPE ImplementationSpecificWorkarounds(decoder_t *p_dec,
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
     OMX_PARAM_PORTDEFINITIONTYPE *def = &p_port->definition;
-    size_t i_profile = 0xFFFF, i_level = 0xFFFF;
+    uint8_t i_profile = 0xFF, i_level = 0xFF;
 
     /* Try to find out the profile of the video */
     if(p_fmt->i_cat == VIDEO_ES && def->eDir == OMX_DirInput &&
@@ -187,7 +187,7 @@ static OMX_ERRORTYPE ImplementationSpecificWorkarounds(decoder_t *p_dec,
            p_fmt->i_codec == VLC_CODEC_H264 &&
            (i_profile != PROFILE_H264_BASELINE || i_level > 30))
         {
-            msg_Dbg(p_dec, "h264 profile/level not supported (0x%x, 0x%x)",
+            msg_Dbg(p_dec, "h264 profile/level not supported (0x" PRIx8 ", 0x" PRIx8 ")",
                     i_profile, i_level);
             return OMX_ErrorNotImplemented;
         }
diff --git a/modules/codec/videotoolbox.m b/modules/codec/videotoolbox.m
index 73423a9..0d3ce75 100644
--- a/modules/codec/videotoolbox.m
+++ b/modules/codec/videotoolbox.m
@@ -129,7 +129,7 @@ struct decoder_sys_t
 static CMVideoCodecType CodecPrecheck(decoder_t *p_dec)
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
-    size_t i_profile = 0xFFFF, i_level = 0xFFFF;
+    uint8_t i_profile = 0xFF, i_level = 0xFF;
     bool b_ret = false;
     CMVideoCodecType codec;
 
@@ -144,7 +144,7 @@ static CMVideoCodecType CodecPrecheck(decoder_t *p_dec)
                 return kCMVideoCodecType_H264;
             }
 
-            msg_Dbg(p_dec, "trying to decode MPEG-4 Part 10: profile %zu, level %zu", i_profile, i_level);
+            msg_Dbg(p_dec, "trying to decode MPEG-4 Part 10: profile %" PRIx8 ", level " PRIx8, i_profile, i_level);
 
             switch (i_profile) {
                 case PROFILE_H264_BASELINE:
@@ -160,7 +160,7 @@ static CMVideoCodecType CodecPrecheck(decoder_t *p_dec)
 
                 default:
                 {
-                    msg_Dbg(p_dec, "unsupported H264 profile %zu", i_profile);
+                    msg_Dbg(p_dec, "unsupported H264 profile %" PRIx8, i_profile);
                     return -1;
                 }
             }
@@ -169,7 +169,7 @@ static CMVideoCodecType CodecPrecheck(decoder_t *p_dec)
             /* a level higher than 5.2 was not tested, so don't dare to
              * try to decode it*/
             if (i_level > 52) {
-                msg_Dbg(p_dec, "unsupported H264 level %zu", i_level);
+                msg_Dbg(p_dec, "unsupported H264 level %" PRIx8, i_level);
                 return -1;
             }
 #else
@@ -177,7 +177,7 @@ static CMVideoCodecType CodecPrecheck(decoder_t *p_dec)
             if (i_level > 42) {
                 /* on Twister, we can do up to 5.2 */
                 if (!deviceSupportsAdvancedLevels() || i_level > 52) {
-                    msg_Dbg(p_dec, "unsupported H264 level %zu", i_level);
+                    msg_Dbg(p_dec, "unsupported H264 level %" PRIx8, i_level);
                     return -1;
                 }
             }
diff --git a/modules/packetizer/h264_nal.c b/modules/packetizer/h264_nal.c
index c68c8ff..cffa112 100644
--- a/modules/packetizer/h264_nal.c
+++ b/modules/packetizer/h264_nal.c
@@ -628,32 +628,38 @@ bool h264_get_chroma_luma( const h264_sequence_parameter_set_t *p_sps, uint8_t *
     return true;
 }
 
-bool h264_get_profile_level(const es_format_t *p_fmt, size_t *p_profile,
-                            size_t *p_level, uint8_t *pi_nal_length_size)
+bool h264_get_profile_level(const es_format_t *p_fmt, uint8_t *pi_profile,
+                            uint8_t *pi_level, uint8_t *pi_nal_length_size)
 {
     uint8_t *p = (uint8_t*)p_fmt->p_extra;
-    if(!p || !p_fmt->p_extra) return false;
+    if(p_fmt->i_extra < 8)
+        return false;
 
     /* Check the profile / level */
-    if (p_fmt->i_original_fourcc == VLC_FOURCC('a','v','c','1') && p[0] == 1)
+    if (p[0] == 1 && p_fmt->i_extra >= 12)
     {
-        if (p_fmt->i_extra < 12) return false;
-        if (pi_nal_length_size) *pi_nal_length_size = 1 + (p[4]&0x03);
-        if (!(p[5]&0x1f)) return false;
+        if (pi_nal_length_size)
+            *pi_nal_length_size = 1 + (p[4]&0x03);
         p += 8;
     }
-    else
+    else if(!p[0] && !p[1]) /* FIXME: WTH is setting AnnexB data here ? */
     {
-        if (p_fmt->i_extra < 8) return false;
-        if (!p[0] && !p[1] && !p[2] && p[3] == 1) p += 4;
-        else if (!p[0] && !p[1] && p[2] == 1) p += 3;
-        else return false;
+        if (!p[2] && p[3] == 1)
+            p += 4;
+        else if (p[2] == 1)
+            p += 3;
+        else
+            return false;
     }
+    else return false;
 
     if ( ((*p++)&0x1f) != 7) return false;
 
-    /* Get profile/level out of first SPS */
-    if (p_profile) *p_profile = p[0];
-    if (p_level) *p_level = p[2];
+    if (pi_profile)
+        *pi_profile = p[0];
+
+    if (pi_level)
+        *pi_level = p[2];
+
     return true;
 }
diff --git a/modules/packetizer/h264_nal.h b/modules/packetizer/h264_nal.h
index 0c4a911..f47f29c 100644
--- a/modules/packetizer/h264_nal.h
+++ b/modules/packetizer/h264_nal.h
@@ -180,8 +180,8 @@ bool h264_get_picture_size( const h264_sequence_parameter_set_t *, unsigned *p_w
 bool h264_get_chroma_luma( const h264_sequence_parameter_set_t *, uint8_t *pi_chroma_format,
                            uint8_t *pi_depth_luma, uint8_t *pi_depth_chroma );
 
-/* Get level and Profile */
-bool h264_get_profile_level(const es_format_t *p_fmt, size_t *p_profile,
-                            size_t *p_level, uint8_t *p_nal_length_size);
+/* Get level and Profile from DecoderConfigurationRecord */
+bool h264_get_profile_level(const es_format_t *p_fmt, uint8_t *pi_profile,
+                            uint8_t *pi_level, uint8_t *p_nal_length_size);
 
 #endif /* H264_NAL_H */



More information about the vlc-commits mailing list