/*
* MOV, 3GP, MP4 muxer
- * Copyright (c) 2003 Thomas Raivio.
- * Copyright (c) 2004 Gildas Bazin <gbazin at videolan dot org>.
+ * Copyright (c) 2003 Thomas Raivio
+ * Copyright (c) 2004 Gildas Bazin <gbazin at videolan dot org>
*
* This file is part of FFmpeg.
*
uint8_t *vosData;
MOVIentry *cluster;
int audio_vbr;
+ int height; ///< active picture (w/o VBI) height for D-10/IMX
} MOVTrack;
typedef struct MOVContext {
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) */
static int mov_write_hdlr_tag(ByteIOContext *pb, MOVTrack *track)
{
- const char *descr, *hdlr, *hdlr_type;
+ const char *hdlr, *descr = NULL, *hdlr_type = NULL;
int64_t pos = url_ftell(pb);
if (!track) { /* no media --> data handler */
if (track->enc->codec_type == CODEC_TYPE_VIDEO) {
hdlr_type = "vide";
descr = "VideoHandler";
- } else if (track->enc->codec_type == CODEC_TYPE_AUDIO){
+ } else if (track->enc->codec_type == CODEC_TYPE_AUDIO) {
hdlr_type = "soun";
descr = "SoundHandler";
- } else if (track->enc->codec_type == CODEC_TYPE_SUBTITLE){
+ } else if (track->enc->codec_type == CODEC_TYPE_SUBTITLE) {
if (track->mode == MODE_IPOD) hdlr_type = "sbtl";
else hdlr_type = "text";
descr = "SubtitleHandler";
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);
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)
if (enc->codec_id == CODEC_ID_H264 && trk->vosLen > 0 && *(uint8_t *)trk->vosData != 1) {
/* from x264 or from bytestream h264 */
/* nal reformating needed */
- int ret = ff_avc_parse_nal_units(pkt->data, &pkt->data, &pkt->size);
- if (ret < 0)
- return ret;
- assert(pkt->size);
- size = pkt->size;
- } else if ((enc->codec_id == CODEC_ID_DNXHD ||
+ size = ff_avc_parse_nal_units(pb, pkt->data, pkt->size);
+ } else {
+ put_buffer(pb, pkt->data, size);
+ }
+
+ if ((enc->codec_id == CODEC_ID_DNXHD ||
enc->codec_id == CODEC_ID_AC3) && !trk->vosLen) {
/* copy frame to create needed atoms */
trk->vosLen = size;
return -1;
}
- trk->cluster[trk->entry].pos = url_ftell(pb);
+ trk->cluster[trk->entry].pos = url_ftell(pb) - size;
trk->cluster[trk->entry].samplesInChunk = samplesInChunk;
trk->cluster[trk->entry].size = size;
trk->cluster[trk->entry].entries = samplesInChunk;
trk->sampleCount += samplesInChunk;
mov->mdat_size += size;
- put_buffer(pb, pkt->data, size);
-
put_flush_packet(pb);
return 0;
}
return res;
}
-#ifdef CONFIG_MOV_MUXER
+#if CONFIG_MOV_MUXER
AVOutputFormat mov_muxer = {
"mov",
NULL_IF_CONFIG_SMALL("MOV format"),
.codec_tag = (const AVCodecTag* const []){codec_movvideo_tags, codec_movaudio_tags, 0},
};
#endif
-#ifdef CONFIG_TGP_MUXER
+#if CONFIG_TGP_MUXER
AVOutputFormat tgp_muxer = {
"3gp",
NULL_IF_CONFIG_SMALL("3GP format"),
.codec_tag = (const AVCodecTag* const []){codec_3gp_tags, 0},
};
#endif
-#ifdef CONFIG_MP4_MUXER
+#if CONFIG_MP4_MUXER
AVOutputFormat mp4_muxer = {
"mp4",
NULL_IF_CONFIG_SMALL("MP4 format"),
.codec_tag = (const AVCodecTag* const []){ff_mp4_obj_type, 0},
};
#endif
-#ifdef CONFIG_PSP_MUXER
+#if CONFIG_PSP_MUXER
AVOutputFormat psp_muxer = {
"psp",
NULL_IF_CONFIG_SMALL("PSP MP4 format"),
.codec_tag = (const AVCodecTag* const []){ff_mp4_obj_type, 0},
};
#endif
-#ifdef CONFIG_TG2_MUXER
+#if CONFIG_TG2_MUXER
AVOutputFormat tg2_muxer = {
"3g2",
NULL_IF_CONFIG_SMALL("3GP2 format"),
.codec_tag = (const AVCodecTag* const []){codec_3gp_tags, 0},
};
#endif
-#ifdef CONFIG_IPOD_MUXER
+#if CONFIG_IPOD_MUXER
AVOutputFormat ipod_muxer = {
"ipod",
NULL_IF_CONFIG_SMALL("iPod H.264 MP4 format"),