[FFmpeg-devel] [PATCH] mov tkhd' width and height usage

Benjamin Larsson banan
Thu Feb 24 10:03:46 CET 2011


>
> >From 9b3255389426eb1e600a1783ea5040884c18d07d Mon Sep 17 00:00:00 2001
> From: Maksym Veremeyenko <verem at m1stereo.tv>
> Date: Tue, 15 Feb 2011 12:43:35 +0200
> Subject: [PATCH 1/3] use tapt atom for sample aspect ratio
>
> ---
>  libavformat/movenc.c |   35 +++++++++++++++++++++++++++++++++++
>  1 files changed, 35 insertions(+), 0 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 5e6e3a6..e1dabe3 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -1215,11 +1215,16 @@ static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st)
>      /* Track width and height, for visual only */
>      if(st && (track->enc->codec_type == AVMEDIA_TYPE_VIDEO ||
>                track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE)) {
> +        if(track->mode == MODE_MOV) {
> +            put_be32(pb, track->enc->width << 16);
> +            put_be32(pb, track->enc->height << 16);
> +        } else {
>          double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio);
>          if(!sample_aspect_ratio || track->height != track->enc->height)
>              sample_aspect_ratio = 1;
>          put_be32(pb, sample_aspect_ratio * track->enc->width*0x10000);
>          put_be32(pb, track->height*0x10000);
> +        }
>      }

Ok

>      else {
>          put_be32(pb, 0);
> @@ -1228,6 +1233,31 @@ static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st)
>      return 0x5c;
>  }
>  
> +static int mov_write_tapt_tag(ByteIOContext *pb, MOVTrack *track)
> +{
> +    int32_t width = av_rescale(track->enc->sample_aspect_ratio.num, track->enc->width,
> +                               track->enc->sample_aspect_ratio.den);
> +
> +    int64_t pos = url_ftell(pb);
> +
> +    put_be32(pb, 0); /* size */
> +    put_tag(pb, "tapt");
> +
> +    put_be32(pb, 20);
> +    put_tag(pb, "clef");
> +    put_be32(pb, 0);
> +    put_be32(pb, width << 16);
> +    put_be32(pb, track->enc->height << 16);
> +
> +    put_be32(pb, 20);
> +    put_tag(pb, "enof");
> +    put_be32(pb, 0);
> +    put_be32(pb, track->enc->width << 16);
> +    put_be32(pb, track->enc->height << 16);
> +
> +    return updateSize(pb, pos);
> +};
> +

Ok

>  // This box seems important for the psp playback ... without it the movie seems to hang
>  static int mov_write_edts_tag(ByteIOContext *pb, MOVTrack *track)
>  {
> @@ -1310,6 +1340,11 @@ static int mov_write_trak_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st)
>          mov_write_uuid_tag_psp(pb,track);  // PSP Movies require this uuid box
>      if (track->tag == MKTAG('r','t','p',' '))
>          mov_write_udta_sdp(pb, track->rtp_ctx->streams[0]->codec, track->trackID);
> +    if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) {
> +        double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio);
> +        if (0.0 != sample_aspect_ratio && 1.0 != sample_aspect_ratio)
> +            mov_write_tapt_tag(pb, track);
> +    };

I'm quite sure this in not valid for mp4 so this needs to be

if(track->enc->codec_type == AVMEDIA_TYPE_VIDEO &&
track->mode == MODE_MOV) {

 otherwise Ok
>      return updateSize(pb, pos);
>  }
>  
> -- 1.7.4
> 0002-reindent-after-tapt-patch.patch
>
>
> >From 29285aae9d38ef356cc216f1ca11405974a8d28e Mon Sep 17 00:00:00 2001
> From: Maksym Veremeyenko <verem at m1stereo.tv>
> Date: Tue, 15 Feb 2011 12:49:17 +0200
> Subject: [PATCH 2/3] reindent after tapt patch
>
> ---
>  libavformat/movenc.c |   10 +++++-----
>  1 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index e1dabe3..80af07b 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -1219,11 +1219,11 @@ static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st)
>              put_be32(pb, track->enc->width << 16);
>              put_be32(pb, track->enc->height << 16);
>          } else {
> -        double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio);
> -        if(!sample_aspect_ratio || track->height != track->enc->height)
> -            sample_aspect_ratio = 1;
> -        put_be32(pb, sample_aspect_ratio * track->enc->width*0x10000);
> -        put_be32(pb, track->height*0x10000);
> +            double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio);
> +            if(!sample_aspect_ratio || track->height != track->enc->height)
> +                sample_aspect_ratio = 1;
> +            put_be32(pb, sample_aspect_ratio * track->enc->width*0x10000);
> +            put_be32(pb, track->height*0x10000);
>          }
>      }
>      else {
> -- 1.7.4

Ok

> 0003-store-pasp-atom-for-all-types-of-quicktime-movie.patch
>
>
> >From 011c1ee074636da2af3abd22d7a5954df6ed0b52 Mon Sep 17 00:00:00 2001
> From: Maksym Veremeyenko <verem at m1stereo.tv>
> Date: Tue, 15 Feb 2011 12:44:08 +0200
> Subject: [PATCH 3/3] store pasp atom for all types of quicktime movie
>
> ---
>  libavformat/movenc.c |    3 +--
>  1 files changed, 1 insertions(+), 2 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 80af07b..f06c652 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -839,8 +839,7 @@ static int mov_write_video_tag(ByteIOContext *pb, MOVTrack *track)
>      } else if(track->vosLen > 0)
>          mov_write_glbl_tag(pb, track);
>  
> -    if (track->mode == MODE_MOV &&
> -        track->enc->sample_aspect_ratio.den && track->enc->sample_aspect_ratio.num &&
> +    if (track->enc->sample_aspect_ratio.den && track->enc->sample_aspect_ratio.num &&
>          track->enc->sample_aspect_ratio.den != track->enc->sample_aspect_ratio.num) {
>          mov_write_pasp_tag(pb, track);
>      }
> -- 1.7.4

Ok

MvH
Benjamin Larsson





More information about the ffmpeg-devel mailing list