vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Dec 9 10:56:48 2015 +0100| [bee38da89a496024e77900979c19a85717896bfa] | committer: Francois Cartegnie
packetizer: add isavcC helper > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bee38da89a496024e77900979c19a85717896bfa --- modules/codec/mft.c | 2 +- modules/codec/omxil/mediacodec.c | 2 +- modules/packetizer/h264_nal.c | 9 +++++++++ modules/packetizer/h264_nal.h | 4 ++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/codec/mft.c b/modules/codec/mft.c index 931ffbe..2d638cd 100644 --- a/modules/codec/mft.c +++ b/modules/codec/mft.c @@ -992,7 +992,7 @@ static int InitializeMFT(decoder_t *p_dec) int buf_size = p_dec->fmt_in.i_extra + 20; uint32_t size = p_dec->fmt_in.i_extra; uint8_t *buf = malloc(buf_size); - if (((uint8_t*)p_dec->fmt_in.p_extra)[0] == 1) + if (h264_isavcC((uint8_t*)p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra)) { h264_avcC_to_AnnexB_NAL(p_dec, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra, buf, buf_size, diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c index bfeb9b8..7df856e 100644 --- a/modules/codec/omxil/mediacodec.c +++ b/modules/codec/omxil/mediacodec.c @@ -313,7 +313,7 @@ static int ParseVideoExtra(decoder_t *p_dec, uint8_t *p_extra, int i_extra) if (p_dec->fmt_in.i_codec == VLC_CODEC_H264) { - if (p_extra[0] == 1 + if ( h264_isavcC(p_extra, i_extra) && h264_avcC_to_AnnexB_NAL(p_dec, p_extra, i_extra, p_buf, buf_size, &size, &p_sys->u.video.i_nal_length_size) == VLC_SUCCESS) diff --git a/modules/packetizer/h264_nal.c b/modules/packetizer/h264_nal.c index 70e8761..601f3f4 100644 --- a/modules/packetizer/h264_nal.c +++ b/modules/packetizer/h264_nal.c @@ -31,6 +31,15 @@ static const uint8_t annexb_startcode[] = { 0x00, 0x00, 0x01 }; +bool h264_isavcC( const uint8_t *p_buf, size_t i_buf ) +{ + return ( i_buf > H264_MIN_AVCC_SIZE && + p_buf[0] == 0x01 && + (p_buf[4] & 0xFC) == 0xFC && + (p_buf[4] & 0x03) != 0x02 && + (p_buf[5] & 0xE0) == 0xE0 ); +} + static inline bool strip_AnnexB_startcode( const uint8_t **pp_data, size_t *pi_data ) { const uint8_t *p_data = *pp_data; diff --git a/modules/packetizer/h264_nal.h b/modules/packetizer/h264_nal.h index 98d41cf..e3fca90 100644 --- a/modules/packetizer/h264_nal.h +++ b/modules/packetizer/h264_nal.h @@ -113,6 +113,10 @@ struct h264_nal_pps avcC: AVCDecoderConfigurationRecord combining SPS & PPS in AVC Sample Format */ +#define H264_MIN_AVCC_SIZE 7 + +bool h264_isavcC( const uint8_t *, size_t ); + /* Convert AVC Sample format to Annex B in-place */ void h264_AVC_to_AnnexB( uint8_t *p_buf, uint32_t i_len, uint8_t i_nal_length_size ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
