use tapt atom for sample aspect ratio

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
This commit is contained in:
Maksym Veremeyenko 2011-02-25 17:41:55 +02:00 committed by Luca Barbato
parent e211e255aa
commit ea1afa124c
1 changed files with 35 additions and 0 deletions

View File

@ -1216,12 +1216,17 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st)
/* Track width and height, for visual only */ /* Track width and height, for visual only */
if(st && (track->enc->codec_type == AVMEDIA_TYPE_VIDEO || if(st && (track->enc->codec_type == AVMEDIA_TYPE_VIDEO ||
track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE)) { 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); double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio);
if(!sample_aspect_ratio || track->height != track->enc->height) if(!sample_aspect_ratio || track->height != track->enc->height)
sample_aspect_ratio = 1; sample_aspect_ratio = 1;
avio_wb32(pb, sample_aspect_ratio * track->enc->width*0x10000); avio_wb32(pb, sample_aspect_ratio * track->enc->width*0x10000);
avio_wb32(pb, track->height*0x10000); avio_wb32(pb, track->height*0x10000);
} }
}
else { else {
avio_wb32(pb, 0); avio_wb32(pb, 0);
avio_wb32(pb, 0); avio_wb32(pb, 0);
@ -1229,6 +1234,31 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st)
return 0x5c; 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 // 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) 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 mov_write_uuid_tag_psp(pb,track); // PSP Movies require this uuid box
if (track->tag == MKTAG('r','t','p',' ')) if (track->tag == MKTAG('r','t','p',' '))
mov_write_udta_sdp(pb, track->rtp_ctx->streams[0]->codec, track->trackID); 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); return updateSize(pb, pos);
} }