[FFmpeg-devel] [PATCH 3/4] movenc: allow writing of multiple trefs per track

Clément Bœsch ubitux at gmail.com
Sat Aug 25 17:28:04 CEST 2012


On Sat, Aug 25, 2012 at 11:44:13AM +0200, Jean First wrote:
> Signed-off-by: Jean First <jeanfirst at gmail.com>
> ---
>  libavformat/movenc.c |   42 +++++++++++++++++++++++++++++++-----------
>  libavformat/movenc.h |    3 ++-
>  2 files changed, 33 insertions(+), 12 deletions(-)
> 
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 1cb1853..aa055ee 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -1665,12 +1665,18 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVTrack *track)
>  
>  static int mov_write_tref_tag(AVIOContext *pb, MOVTrack *track)
>  {
> -    avio_wb32(pb, 20);   // size
> +    int i;
> +    int64_t pos1, pos2;
> +    pos1 = avio_tell(pb);
> +    avio_wb32(pb, 0); /* size */
>      ffio_wfourcc(pb, "tref");
> -    avio_wb32(pb, 12);   // size (subatom)
> +    pos2 = avio_tell(pb);
> +    avio_wb32(pb, 0);  // size (subatom)
>      avio_wl32(pb, track->tref_tag);
> -    avio_wb32(pb, track->tref_id);
> -    return 20;
> +    for (i = 0; i < track->tref_count; i++)
> +        avio_wb32(pb, track->tref_ids[i]);
> +    update_size(pb, pos2);
> +    return update_size(pb, pos1);
>  }
>  
>  // goes at the end of each track!  ... Critical for PSP playback ("Incompatible data" without it)
> @@ -2205,21 +2211,35 @@ static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
>      if (mov->chapter_track)
>          for (i=0; i<s->nb_streams; i++) {
>              mov->tracks[i].tref_tag = MKTAG('c','h','a','p');
> -            mov->tracks[i].tref_id = mov->tracks[mov->chapter_track].track_id;
> +            mov->tracks[i].tref_count++;
> +            mov->tracks[i].tref_ids = av_realloc(mov->tracks[i].tref_ids,
> +                    mov->tracks[i].tref_count * sizeof(*mov->tracks[i].tref_ids));
> +            if (!mov->tracks[i].tref_ids)
> +                return AVERROR(ENOMEM);
> +            mov->tracks[i].tref_ids[mov->tracks[i].tref_count - 1] = mov->tracks[mov->chapter_track].track_id;
>          }
>      for (i = 0; i < mov->nb_streams; i++) {
>          if (mov->tracks[i].tag == MKTAG('r','t','p',' ')) {
>              mov->tracks[i].tref_tag = MKTAG('h','i','n','t');
> -            mov->tracks[i].tref_id =
> -                mov->tracks[mov->tracks[i].src_track].track_id;
> +            mov->tracks[i].tref_count++;
> +            mov->tracks[i].tref_ids = av_realloc(mov->tracks[i].tref_ids,
> +                    mov->tracks[i].tref_count * sizeof(*mov->tracks[i].tref_ids));
> +            if (!mov->tracks[i].tref_ids)
> +                return AVERROR(ENOMEM);
> +            mov->tracks[i].tref_ids[mov->tracks[i].tref_count - 1] = mov->tracks[mov->tracks[i].src_track].track_id;
>          }
>      }
>      for (i = 0; i < mov->nb_streams; i++) {
>          if (mov->tracks[i].tag == MKTAG('t','m','c','d')) {
> -            int src_trk = mov->tracks[i].src_track;
> -            mov->tracks[src_trk].tref_tag = mov->tracks[i].tag;
> -            mov->tracks[src_trk].tref_id  = mov->tracks[i].track_id;
> -            mov->tracks[i].track_duration = mov->tracks[src_trk].track_duration;
> +            MOVTrack *src_track = &mov->tracks[mov->tracks[i].src_track];
> +            src_track->tref_tag = mov->tracks[i].tag;
> +            mov->tracks[i].track_duration = src_track->track_duration;
> +            src_track->tref_count++;
> +            src_track->tref_ids = av_realloc(src_track->tref_ids,
> +                    src_track->tref_count * sizeof(*src_track->tref_ids));
> +            if (!src_track->tref_ids)
> +                return AVERROR(ENOMEM);
> +            src_track->tref_ids[src_track->tref_count - 1] = mov->tracks[i].track_id;
>          }
>      }
>  
> diff --git a/libavformat/movenc.h b/libavformat/movenc.h
> index 72427d8..e3cb8e5 100644
> --- a/libavformat/movenc.h
> +++ b/libavformat/movenc.h
> @@ -103,7 +103,8 @@ typedef struct MOVIndex {
>      int         audio_vbr;
>      int         height; ///< active picture (w/o VBI) height for D-10/IMX
>      uint32_t    tref_tag;
> -    int         tref_id; ///< trackID of the referenced track
> +    uint32_t    *tref_ids; ///< trackID of the referenced track
> +    unsigned    tref_count;
>      int64_t     start_dts;
>  
>      int         hint_track;   ///< the track that hints this track, -1 if no hint track is set

Won't this leak?

-- 
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120825/afabac48/attachment.asc>


More information about the ffmpeg-devel mailing list