vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Jun 11 17:27:52 2015 +0200| [d991fd3a901af13a246fe372036c09ced859c7a3] | committer: Francois Cartegnie
demux: mp4: split smooth fmt from whole track setup > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d991fd3a901af13a246fe372036c09ced859c7a3 --- modules/demux/mp4/mp4.c | 87 ++++++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 38 deletions(-) diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c index b50beca..85c1bcc 100644 --- a/modules/demux/mp4/mp4.c +++ b/modules/demux/mp4/mp4.c @@ -116,7 +116,7 @@ struct demux_sys_t * Declaration of local function *****************************************************************************/ static void MP4_TrackCreate ( demux_t *, mp4_track_t *, MP4_Box_t *, bool b_force_enable ); -static int MP4_SmoothTrackCreate( demux_t *, mp4_track_t *, MP4_Box_t *); +static int MP4_SmoothTrackCreate( demux_t *, mp4_track_t *, const MP4_Box_t *); static void MP4_TrackDestroy( demux_t *, mp4_track_t * ); static block_t * MP4_Block_Read( demux_t *, const mp4_track_t *, int ); @@ -3436,7 +3436,7 @@ static int build_raw_avcC( uint8_t **p_extra, const uint8_t *CodecPrivateData, * Build a mp4_track_t from a StraBox */ -static inline int MP4_SetCodecExtraData( es_format_t *fmt, MP4_Box_data_stra_t *p_data ) +static inline int MP4_SetCodecExtraData( es_format_t *fmt, const MP4_Box_data_stra_t *p_data ) { fmt->p_extra = malloc( p_data->cpd_len ); if( unlikely( !fmt->p_extra ) ) @@ -3446,29 +3446,9 @@ static inline int MP4_SetCodecExtraData( es_format_t *fmt, MP4_Box_data_stra_t * return VLC_SUCCESS; } -static int MP4_SmoothTrackCreate( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_stra ) +static int MP4_SmoothFormatFill( const MP4_Box_data_stra_t *p_data, const mp4_track_t *p_track, + es_format_t *fmt ) { - demux_sys_t *p_sys = p_demux->p_sys; - int ret; - MP4_Box_data_stra_t *p_data = BOXDATA(p_stra); - if( !p_data ) - return VLC_EGENERIC; - - p_track->b_ok = false; - p_track->b_selected = false; - p_track->i_sample_count = UINT32_MAX; - - p_track->i_timescale = p_sys->i_timescale; - p_track->i_width = p_data->MaxWidth; - p_track->i_height = p_data->MaxHeight; - p_track->i_track_ID = p_data->i_track_ID; - - es_format_t *fmt = &p_track->fmt; - if( fmt == NULL ) - return VLC_EGENERIC; - - es_format_Init( fmt, p_data->i_es_cat, 0 ); - /* Set language FIXME */ fmt->psz_language = strdup( "en" ); @@ -3490,9 +3470,8 @@ static int MP4_SmoothTrackCreate( demux_t *p_demux, mp4_track_t *p_track, MP4_Bo } else { - ret = MP4_SetCodecExtraData( fmt, p_data ); - if( ret != VLC_SUCCESS ) - return ret; + if ( MP4_SetCodecExtraData( fmt, p_data ) != VLC_SUCCESS ) + return VLC_EGENERIC; } fmt->video.i_width = p_data->MaxWidth; @@ -3505,14 +3484,6 @@ static int MP4_SmoothTrackCreate( demux_t *p_demux, mp4_track_t *p_track, MP4_Bo ChunkGetESSampleRate( &fmt->video.i_frame_rate, &fmt->video.i_frame_rate_base, p_track ); - if( fmt->video.i_frame_rate_base != 0 ) - { - p_demux->p_sys->f_fps = (float)fmt->video.i_frame_rate / - (float)fmt->video.i_frame_rate_base; - } - else - p_demux->p_sys->f_fps = 24; - break; case AUDIO_ES: @@ -3523,9 +3494,8 @@ static int MP4_SmoothTrackCreate( demux_t *p_demux, mp4_track_t *p_track, MP4_Bo fmt->i_bitrate = p_data->Bitrate; - ret = MP4_SetCodecExtraData( fmt, p_data ); - if( ret != VLC_SUCCESS ) - return ret; + if ( MP4_SetCodecExtraData( fmt, p_data ) != VLC_SUCCESS ) + return VLC_EGENERIC; break; @@ -3533,6 +3503,47 @@ static int MP4_SmoothTrackCreate( demux_t *p_demux, mp4_track_t *p_track, MP4_Bo break; } + return VLC_SUCCESS; +} + +static int MP4_SmoothTrackCreate( demux_t *p_demux, mp4_track_t *p_track, const MP4_Box_t *p_stra ) +{ + demux_sys_t *p_sys = p_demux->p_sys; + + p_track->b_ok = false; + p_track->b_selected = false; + + MP4_Box_data_stra_t *p_data = BOXDATA(p_stra); + if( !p_data ) + return VLC_EGENERIC; + + p_track->i_sample_count = UINT32_MAX; + + p_track->i_timescale = p_sys->i_timescale; + p_track->i_track_ID = p_data->i_track_ID; + + es_format_t *fmt = &p_track->fmt; + es_format_Init( &p_track->fmt, p_data->i_es_cat, 0 ); + + if( MP4_SmoothFormatFill( p_data, p_track, fmt ) != VLC_SUCCESS ) + { + es_format_Clean( fmt ); + return VLC_EGENERIC; + } + else if( fmt->i_cat == VIDEO_ES ) + { + p_track->i_width = fmt->video.i_visible_width; + p_track->i_height = fmt->video.i_visible_height; + + if( fmt->video.i_frame_rate_base != 0 ) + { + p_demux->p_sys->f_fps = (float)fmt->video.i_frame_rate / + (float)fmt->video.i_frame_rate_base; + } + else + p_demux->p_sys->f_fps = 24; + } + p_track->b_ok = true; return VLC_SUCCESS; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
