summaryrefslogtreecommitdiff
path: root/libavformat/movenc.c
diff options
context:
space:
mode:
authorMaksym Veremeyenko <verem@m1stereo.tv>2011-02-25 17:41:55 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-02-26 03:16:09 +0100
commit3b2c4ce14024b543e92cc4f86247773f1edf9a86 (patch)
tree865667d06d8ff824f1dd0fbec95ab0a963cfe649 /libavformat/movenc.c
parentc3afa4db913668e50ac8ffc0bc66621664adc1f4 (diff)
use tapt atom for sample aspect ratio
Signed-off-by: Luca Barbato <lu_zero@gentoo.org> (cherry picked from commit ea1afa124cb58c7eebd4fd3706434fafb58b00c0)
Diffstat (limited to 'libavformat/movenc.c')
-rw-r--r--libavformat/movenc.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 711aa68e98..376555d6ae 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1216,11 +1216,16 @@ static int mov_write_tkhd_tag(AVIOContext *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) {
+ avio_wb32(pb, track->enc->width << 16);
+ avio_wb32(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;
avio_wb32(pb, sample_aspect_ratio * track->enc->width*0x10000);
avio_wb32(pb, track->height*0x10000);
+ }
}
else {
avio_wb32(pb, 0);
@@ -1229,6 +1234,31 @@ static int mov_write_tkhd_tag(AVIOContext *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);
+
+ avio_wb32(pb, 0); /* size */
+ put_tag(pb, "tapt");
+
+ avio_wb32(pb, 20);
+ put_tag(pb, "clef");
+ avio_wb32(pb, 0);
+ avio_wb32(pb, width << 16);
+ avio_wb32(pb, track->enc->height << 16);
+
+ avio_wb32(pb, 20);
+ put_tag(pb, "enof");
+ avio_wb32(pb, 0);
+ avio_wb32(pb, track->enc->width << 16);
+ avio_wb32(pb, track->enc->height << 16);
+
+ return updateSize(pb, pos);
+};
+
// This box seems important for the psp playback ... without it the movie seems to hang
static int mov_write_edts_tag(AVIOContext *pb, MOVTrack *track)
{
@@ -1311,6 +1341,11 @@ static int mov_write_trak_tag(AVIOContext *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 && track->mode == MODE_MOV) {
+ 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);
+ };
return updateSize(pb, pos);
}