diff options
author | Maksym Veremeyenko <verem@m1stereo.tv> | 2011-02-25 17:41:55 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2011-02-25 22:31:16 +0100 |
commit | ea1afa124cb58c7eebd4fd3706434fafb58b00c0 (patch) | |
tree | f8ced3ad4ff07fff9aae8176fba54b11f1e369da /libavformat/movenc.c | |
parent | e211e255aa399d68239ffa42c9cc7a52eb3d55a9 (diff) | |
download | ffmpeg-streaming-ea1afa124cb58c7eebd4fd3706434fafb58b00c0.zip ffmpeg-streaming-ea1afa124cb58c7eebd4fd3706434fafb58b00c0.tar.gz |
use tapt atom for sample aspect ratio
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavformat/movenc.c')
-rw-r--r-- | libavformat/movenc.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 711aa68..376555d 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); } |