[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