# HG changeset patch # User bcoudurier # Date 1234430136 0 # Node ID 0cd7acf426f3d42f1cf43982a0b55c5055e4e3ad # Parent f6b8d158434868e138fb408abca68bb38e812c4f write active picture height for d-10/imx in mov diff -r f6b8d1584348 -r 0cd7acf426f3 movenc.c --- a/movenc.c Thu Feb 12 08:10:43 2009 +0000 +++ b/movenc.c Thu Feb 12 09:15:36 2009 +0000 @@ -69,6 +69,7 @@ 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 @@ 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 @@ 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 @@ 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)