From 6a460c36b65d783e7f1e15001c21a63c2890021e Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Thu, 12 Feb 2009 09:15:36 +0000 Subject: [PATCH] write active picture height for d-10/imx in mov Originally committed as revision 17178 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/movenc.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index c46bcc207d..95b881aec2 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -69,6 +69,7 @@ typedef struct MOVIndex { uint8_t *vosData; MOVIentry *cluster; int audio_vbr; + int height; ///< active picture (w/o VBI) height for D-10/IMX } MOVTrack; typedef struct MOVContext { @@ -691,7 +692,7 @@ static int mov_write_video_tag(ByteIOContext *pb, MOVTrack *track) put_be32(pb, 0); /* Reserved */ } put_be16(pb, track->enc->width); /* Video width */ - put_be16(pb, track->enc->height); /* Video height */ + put_be16(pb, track->height); /* Video height */ put_be32(pb, 0x00480000); /* Horizontal resolution 72dpi */ put_be32(pb, 0x00480000); /* Vertical resolution 72dpi */ put_be32(pb, 0); /* Data size (= 0) */ @@ -1046,9 +1047,10 @@ static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st) if(track->enc->codec_type == CODEC_TYPE_VIDEO || track->enc->codec_type == CODEC_TYPE_SUBTITLE) { double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio); - if(!sample_aspect_ratio) sample_aspect_ratio = 1; + 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->enc->height*0x10000); + put_be32(pb, track->height*0x10000); } else { put_be32(pb, 0); @@ -1654,6 +1656,16 @@ static int mov_write_header(AVFormatContext *s) return -1; } if(st->codec->codec_type == CODEC_TYPE_VIDEO){ + if (track->tag == MKTAG('m','x','3','p') || track->tag == MKTAG('m','x','3','n') || + track->tag == MKTAG('m','x','4','p') || track->tag == MKTAG('m','x','4','n') || + track->tag == MKTAG('m','x','5','p') || track->tag == MKTAG('m','x','5','n')) { + if (st->codec->width != 720 || (st->codec->height != 608 && st->codec->height != 512)) { + av_log(s, AV_LOG_ERROR, "D-10/IMX must use 720x608 or 720x512 video resolution\n"); + return -1; + } + track->height = track->tag>>24 == 'n' ? 486 : 576; + } else + track->height = st->codec->height; track->timescale = st->codec->time_base.den; av_set_pts_info(st, 64, 1, st->codec->time_base.den); if (track->mode == MODE_MOV && track->timescale > 100000)