[PATCH 1/2] use tapt atom for sample aspect ratio
Maksym Veremeyenko
verem
Mon Feb 14 09:52:06 CET 2011
---
libavformat/movenc.c | 48 +++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 43 insertions(+), 5 deletions(-)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 5e6e3a6..b05fcf0 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1215,11 +1215,8 @@ 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)) {
- 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);
+ put_be32(pb, track->enc->width << 16);
+ put_be32(pb, track->height << 16);
}
else {
put_be32(pb, 0);
@@ -1228,6 +1225,42 @@ static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st)
return 0x5c;
}
+static int mov_write_clef_tag(ByteIOContext *pb, MOVTrack *track)
+{
+ int32_t width;
+
+ width = av_q2d(track->enc->sample_aspect_ratio) * track->enc->width;
+
+ put_be32(pb, 0x14);
+ put_tag(pb, "clef");
+ put_be32(pb, 0);
+ put_be32(pb, width << 16);
+ put_be32(pb, track->height << 16);
+
+ return 0x14;
+};
+
+static int mov_write_enof_tag(ByteIOContext *pb, MOVTrack *track)
+{
+ put_be32(pb, 0x14);
+ put_tag(pb, "enof");
+ put_be32(pb, 0);
+ put_be32(pb, track->enc->width << 16);
+ put_be32(pb, track->enc->height << 16);
+
+ return 0x14;
+};
+
+static int mov_write_tapt_tag(ByteIOContext *pb, MOVTrack *track)
+{
+ int64_t pos = url_ftell(pb);
+ put_be32(pb, 0); /* size */
+ put_tag(pb, "tapt");
+ mov_write_clef_tag(pb, track);
+ mov_write_enof_tag(pb, track);
+ 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(ByteIOContext *pb, MOVTrack *track)
{
@@ -1310,6 +1343,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);
+ };
return updateSize(pb, pos);
}
--
1.7.4
--------------000207010502020105090000
Content-Type: text/x-patch;
name="0002-store-pasp-atom-for-all-types-of-quicktime-movie.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="0002-store-pasp-atom-for-all-types-of-quicktime-movie.patch"
More information about the ffmpeg-devel
mailing list