[vlc-devel] [PATCH] added support for "quicktime reference" file.

Steve Lhomme robux4 at gmail.com
Tue Sep 19 14:30:51 CEST 2017


On Tue, Sep 19, 2017 at 2:07 PM, Rajneesh Soni <soni.rajneesh at gmail.com> wrote:
> ticket - https://trac.videolan.org/vlc/ticket/3073
>
> Fixes as per suggestion from RĂ©mi Denis-Courmont
>
> - demux.s is read only,
> - track stream is deleted on track cleanup.
>
> QuickTime reference movie allow the MDAT data to be located separately then the MOOV (header data),
> This separatation allow fast editing of the file. DREF atom contains the location of the media data.
> This location can be local file or a http/https location.Quicktime player 7 is able to play
> such file but VLC fails to play.
> This commit parse the dref atom and if the track data are in located separately.
> it will launch a new stream to fetch the track data.
> ---
>  modules/demux/mp4/mp4.c | 57 +++++++++++++++++++++++++++++++++++--------------
>  modules/demux/mp4/mp4.h |  4 ++++
>  2 files changed, 45 insertions(+), 16 deletions(-)
>
> diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
> index f8b8d24..98987df 100644
> --- a/modules/demux/mp4/mp4.c
> +++ b/modules/demux/mp4/mp4.c
> @@ -37,6 +37,7 @@
>  #include <assert.h>
>  #include <limits.h>
>  #include "../codec/cc.h"
> +#include "vlc_stream_extractor.h"
>
>  /*****************************************************************************
>   * Module descriptor
> @@ -65,7 +66,7 @@ vlc_module_end ()
>   * Local prototypes
>   *****************************************************************************/
>  static int   Demux   ( demux_t * );
> -static int   DemuxRef( demux_t *p_demux ){ (void)p_demux; return 0;}
> +//static int   DemuxRef( demux_t *p_demux ){ (void)p_demux; return 0;}

If you don't want it, just remove it.

>  static int   DemuxFrag( demux_t * );
>  static int   Control ( demux_t *, int, va_list );
>
> @@ -884,7 +885,7 @@ static int Open( vlc_object_t * p_this )
>          else
>          {
>              msg_Warn( p_demux, "cannot find /moov/mvhd (pure ref file)" );
> -            p_demux->pf_demux = DemuxRef;
> +            p_demux->pf_demux = Demux ;//DemuxRef;

No need to keep old stuff in a patch.

>              return VLC_SUCCESS;
>          }
>      }
> @@ -1205,6 +1206,7 @@ static int DemuxTrack( demux_t *p_demux, mp4_track_t *tk, uint64_t i_readpos,
>  {
>      uint32_t i_nb_samples = 0;
>      uint32_t i_samplessize = 0;
> +    stream_t *p_active_stream = p_demux->s;
>
>      if( !tk->b_ok || tk->i_sample >= tk->i_sample_count )
>          return VLC_DEMUXER_EOS;
> @@ -1212,6 +1214,17 @@ static int DemuxTrack( demux_t *p_demux, mp4_track_t *tk, uint64_t i_readpos,
>      if( tk->b_chapters_source )
>          return VLC_DEMUXER_SUCCESS;
>
> +    if( tk->b_is_dref && !tk->b_dref_started )
> +    {
> +         tk->s = vlc_stream_NewMRL(p_demux,tk->p_dref_url);
> +         tk->b_dref_started = true;
> +    }
> +
> +    if( tk->b_is_dref )
> +    {
> +            p_active_stream = tk->s;
> +    }
> +
>      uint32_t i_run_seq = MP4_TrackGetRunSeq( tk );
>      mtime_t i_current_nzdts = MP4_TrackGetDTS( p_demux, tk );
>      const mtime_t i_demux_max_nzdts =(i_max_preload < UINT_MAX)
> @@ -1235,9 +1248,9 @@ static int DemuxTrack( demux_t *p_demux, mp4_track_t *tk, uint64_t i_readpos,
>              block_t *p_block;
>              int64_t i_delta;
>
> -            if( vlc_stream_Tell( p_demux->s ) != i_readpos )
> +            if( vlc_stream_Tell( p_active_stream ) != i_readpos )
>              {
> -                if( MP4_Seek( p_demux->s, i_readpos ) != VLC_SUCCESS )
> +                if( MP4_Seek( p_active_stream, i_readpos ) != VLC_SUCCESS )
>                  {
>                      msg_Warn( p_demux, "track[0x%x] will be disabled (eof?)"
>                                         ": Failed to seek to %"PRIu64,
> @@ -1248,7 +1261,7 @@ static int DemuxTrack( demux_t *p_demux, mp4_track_t *tk, uint64_t i_readpos,
>              }
>
>              /* now read pes */
> -            if( !(p_block = vlc_stream_Block( p_demux->s, i_samplessize )) )
> +            if( !(p_block = vlc_stream_Block( p_active_stream, i_samplessize )) )
>              {
>                  msg_Warn( p_demux, "track[0x%x] will be disabled (eof?)"
>                                     ": Failed to read %d bytes sample at %"PRIu64,
> @@ -1292,6 +1305,7 @@ static int DemuxTrack( demux_t *p_demux, mp4_track_t *tk, uint64_t i_readpos,
>      return VLC_DEMUXER_SUCCESS;
>
>  end:
> +
>      return VLC_DEMUXER_EGENERIC;
>  }
>
> @@ -3336,21 +3350,29 @@ static void MP4_TrackSetup( demux_t *p_demux, mp4_track_t *p_track,
>          for( i = 0; i < elst->i_entry_count; i++ )
>          {
>              msg_Dbg( p_demux, "   - [%d] duration=%"PRId64"ms media time=%"PRId64
> -                     "ms) rate=%d.%d", i,
> -                     MP4_rescale( elst->i_segment_duration[i], p_sys->i_timescale, 1000 ),
> -                     elst->i_media_time[i] >= 0 ?
> -                        MP4_rescale( elst->i_media_time[i], p_track->i_timescale, 1000 ) :
> -                        INT64_C(-1),
> -                     elst->i_media_rate_integer[i],
> -                     elst->i_media_rate_fraction[i] );
> +                    "ms) rate=%d.%d", i,
> +                    MP4_rescale( elst->i_segment_duration[i], p_sys->i_timescale, 1000 ),
> +                    elst->i_media_time[i] >= 0 ?
> +                    MP4_rescale( elst->i_media_time[i], p_track->i_timescale, 1000 ) :
> +                    INT64_C(-1),
> +                    elst->i_media_rate_integer[i],
> +                    elst->i_media_rate_fraction[i] );
>          }
>      }
>
>
> -/*  TODO
> -    add support for:
> -    p_dinf = MP4_BoxGet( p_minf, "dinf" );
> -*/
> +/*  extract the dinf url if applicable  */
> +    MP4_Box_t *p_dref = MP4_BoxGet(p_box_trak, "mdia/minf/dinf/dref");
> +    MP4_Box_t *p_url = MP4_BoxGet(p_dref, "url ");
> +
> +    if( p_url )
> +    {
> +      p_track->b_is_dref = true;
> +      p_track->b_dref_started = false;
> +      p_track->p_dref_url = strdup(BOXDATA(p_url)->psz_location);
> +      msg_Dbg( p_demux," url in the vstub dref url = %s  \n",p_track->p_dref_url);
> +    }
> +
>      if( !( p_track->p_stbl = MP4_BoxGet( p_box_trak,"mdia/minf/stbl" ) ) ||
>          !( p_track->p_stsd = MP4_BoxGet( p_box_trak,"mdia/minf/stbl/stsd") ) )
>      {
> @@ -3513,6 +3535,9 @@ static void MP4_TrackClean( es_out_t *out, mp4_track_t *p_track )
>      if ( p_track->asfinfo.p_frame )
>          block_ChainRelease( p_track->asfinfo.p_frame );
>
> +    if( p_track->b_is_dref && p_track->s )
> +         vlc_stream_Delete( p_track->s );
> +
>      free( p_track->context.runs.p_array );
>  }
>
> diff --git a/modules/demux/mp4/mp4.h b/modules/demux/mp4/mp4.h
> index 99cb9bb..145bad6 100644
> --- a/modules/demux/mp4/mp4.h
> +++ b/modules/demux/mp4/mp4.h
> @@ -164,6 +164,10 @@ typedef struct
>          uint64_t i_trun_sample_pos;
>
>      } context;
> +    bool b_dref_started;
> +    bool b_is_dref;
> +    char *p_dref_url;
> +    stream_t *s;
>
>      /* ASF packets handling */
>      const MP4_Box_t *p_asf;
> --
> 2.7.4
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list