vlc | branch: master | Denis Charmet <[email protected]> | Tue Oct 22 23:15:44 2013 +0200| [afd070360514d4572a3bbde02656fbca3feae735] | committer: Denis Charmet
Add HEVC support in MP4 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=afd070360514d4572a3bbde02656fbca3feae735 --- modules/demux/mp4/libmp4.c | 24 ++++++++++++++++++++++++ modules/demux/mp4/libmp4.h | 9 +++++++++ modules/demux/mp4/mp4.c | 22 ++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c index d2276d6..3abb940 100644 --- a/modules/demux/mp4/libmp4.c +++ b/modules/demux/mp4/libmp4.c @@ -1303,6 +1303,29 @@ static int MP4_ReadBox_esds( stream_t *p_stream, MP4_Box_t *p_box ) #undef es_descriptor } +static void MP4_FreeBox_hvcC(MP4_Box_t *p_box ) +{ + MP4_Box_data_hvcC_t *p_hvcC = p_box->data.p_hvcC; + if( p_hvcC->i_hvcC > 0 ) FREENULL( p_hvcC->p_hvcC) ; +} + +static int MP4_ReadBox_hvcC( stream_t *p_stream, MP4_Box_t *p_box ) +{ + MP4_Box_data_hvcC_t *p_hvcC; + + MP4_READBOX_ENTER( MP4_Box_data_hvcC_t ); + p_hvcC = p_box->data.p_hvcC; + + p_hvcC->i_hvcC = i_read; + if( p_hvcC->i_hvcC > 0 ) + { + uint8_t * p = p_hvcC->p_hvcC = malloc( p_hvcC->i_hvcC ); + if( p ) + memcpy( p, p_peek, i_read ); + } + MP4_READBOX_EXIT( 1 ); +} + static void MP4_FreeBox_avcC( MP4_Box_t *p_box ) { MP4_Box_data_avcC_t *p_avcC = p_box->data.p_avcC; @@ -3180,6 +3203,7 @@ static const struct { ATOM_dcom, MP4_ReadBox_dcom, MP4_FreeBox_Common }, { ATOM_cmvd, MP4_ReadBox_cmvd, MP4_FreeBox_cmvd }, { ATOM_avcC, MP4_ReadBox_avcC, MP4_FreeBox_avcC }, + { ATOM_hvcC, MP4_ReadBox_hvcC, MP4_FreeBox_hvcC }, { ATOM_dac3, MP4_ReadBox_dac3, MP4_FreeBox_Common }, { ATOM_dvc1, MP4_ReadBox_dvc1, MP4_FreeBox_Common }, { ATOM_enda, MP4_ReadBox_enda, MP4_FreeBox_Common }, diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h index 88de85a..c430f22 100644 --- a/modules/demux/mp4/libmp4.h +++ b/modules/demux/mp4/libmp4.h @@ -167,6 +167,8 @@ #define ATOM_avcC VLC_FOURCC( 'a', 'v', 'c', 'C' ) #define ATOM_m4ds VLC_FOURCC( 'm', '4', 'd', 's' ) +#define ATOM_hvcC VLC_FOURCC( 'h', 'v', 'c', 'C' ) + #define ATOM_dvc VLC_FOURCC( 'd', 'v', 'c', ' ' ) #define ATOM_dvp VLC_FOURCC( 'd', 'v', 'p', ' ' ) #define ATOM_dv5n VLC_FOURCC( 'd', 'v', '5', 'n' ) @@ -1149,6 +1151,12 @@ typedef struct uint8_t *CodecPrivateData; } MP4_Box_data_stra_t; +typedef struct +{ + uint32_t i_hvcC; + uint8_t *p_hvcC; +} MP4_Box_data_hvcC_t; + /* typedef struct MP4_Box_data__s { @@ -1233,6 +1241,7 @@ typedef union MP4_Box_data_s MP4_Box_data_tfrf_t *p_tfrf; MP4_Box_data_tfxd_t *p_tfxd; + MP4_Box_data_hvcC_t *p_hvcC; void *p_data; /* for unknow type */ } MP4_Box_data_t; diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c index 1ccd510..c30dc77 100644 --- a/modules/demux/mp4/mp4.c +++ b/modules/demux/mp4/mp4.c @@ -2217,6 +2217,28 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track, } break; } + case VLC_FOURCC( 'h', 'v', 'c', '1' ): + { + MP4_Box_t *p_hvcC = MP4_BoxGet( p_sample, "hvcC" ); + + if( p_hvcC ) + { + p_track->fmt.i_extra = p_hvcC->data.p_hvcC->i_hvcC; + if( p_track->fmt.i_extra > 0 ) + { + p_track->fmt.p_extra = malloc( p_hvcC->data.p_hvcC->i_hvcC ); + memcpy( p_track->fmt.p_extra, p_hvcC->data.p_hvcC->p_hvcC, + p_track->fmt.i_extra ); + } + p_track->fmt.i_codec = VLC_CODEC_HEVC; + } + else + { + msg_Err( p_demux, "missing hvcC" ); + } + break; + } + case VLC_CODEC_ADPCM_MS: case VLC_CODEC_ADPCM_IMA_WAV: _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
