X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmovenc.c;h=0e3fb6a9de92ceafc0569dbcb6fd7533703e4b0c;hb=9ee91c2f53dbc7cc61e65805d57e0a805b5752d7;hp=b78ca60c4ea5d7d2c6da096619a8353a8d3e41bd;hpb=9a4d93887442dad5e0b7156fe1995651f13947d1;p=ffmpeg diff --git a/libavformat/movenc.c b/libavformat/movenc.c index b78ca60c4ea..0e3fb6a9de9 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -236,31 +236,38 @@ static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack* track) return updateSize (pb, pos); } +const CodecTag codec_movaudio_tags[] = { + { CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') }, + { CODEC_ID_PCM_ALAW, MKTAG('a', 'l', 'a', 'w') }, + { CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') }, + { CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') }, + { CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') }, + { CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') }, + { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') }, + { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') }, + { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') }, + { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') }, + { 0, 0 }, +}; + static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack* track) { - int pos = url_ftell(pb); + int pos = url_ftell(pb), tag; + put_be32(pb, 0); /* size */ - if(track->enc->codec_id == CODEC_ID_PCM_MULAW) - put_tag(pb, "ulaw"); - else if(track->enc->codec_id == CODEC_ID_PCM_ALAW) - put_tag(pb, "alaw"); - else if(track->enc->codec_id == CODEC_ID_ADPCM_IMA_QT) - put_tag(pb, "ima4"); - else if(track->enc->codec_id == CODEC_ID_MACE3) - put_tag(pb, "MAC3"); - else if(track->enc->codec_id == CODEC_ID_MACE6) - put_tag(pb, "MAC6"); - else if(track->enc->codec_id == CODEC_ID_AAC) - put_tag(pb, "mp4a"); - else if(track->enc->codec_id == CODEC_ID_AMR_NB) - put_tag(pb, "samr"); - else if(track->enc->codec_id == CODEC_ID_PCM_S16BE) - put_tag(pb, "twos"); - else if(track->enc->codec_id == CODEC_ID_PCM_S16LE) - put_tag(pb, "sowt"); + tag = codec_get_tag(codec_movaudio_tags, track->enc->codec_id); + // if no mac fcc found, try with Microsoft tags + if (!tag) + { + int tmp = codec_get_tag(codec_wav_tags, track->enc->codec_id); + if (tmp) + tag = MKTAG('m', 's', ((tmp >> 8) & 0xff), (tmp & 0xff)); + } + if (!tag) + put_tag(pb, " "); else - put_tag(pb, " "); + put_le32(pb, tag); // store it byteswapped put_be32(pb, 0); /* Reserved */ put_be16(pb, 0); /* Reserved */ @@ -424,22 +431,29 @@ static int mov_write_esds_tag(ByteIOContext *pb, MOVTrack* track) // Basic return updateSize (pb, pos); } +const CodecTag codec_movvideo_tags[] = { + { CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') }, + { CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') }, + { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') }, + { CODEC_ID_H263, MKTAG('s', '2', '6', '3') }, + { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, + { 0, 0 }, +}; + static int mov_write_video_tag(ByteIOContext *pb, MOVTrack* track) { - int pos = url_ftell(pb); + int pos = url_ftell(pb), tag; + put_be32(pb, 0); /* size */ - if(track->enc->codec_id == CODEC_ID_SVQ1) - put_tag(pb, "SVQ1"); - else if(track->enc->codec_id == CODEC_ID_SVQ3) - put_tag(pb, "SVQ3"); - else if(track->enc->codec_id == CODEC_ID_MPEG4) - put_tag(pb, "mp4v"); - else if(track->enc->codec_id == CODEC_ID_H263) - put_tag(pb, "s263"); - else if(track->enc->codec_id == CODEC_ID_DVVIDEO) - put_tag(pb, "dvc "); + + tag = codec_get_tag(codec_movvideo_tags, track->enc->codec_id); + // if no mac fcc found, try with Microsoft tags + if (!tag) + tag = codec_get_tag(codec_bmp_tags, track->enc->codec_id); + if (!tag) + put_tag(pb, " "); else - put_tag(pb, " "); /* Unknown tag */ + put_le32(pb, tag); // store it byteswapped put_be32(pb, 0); /* Reserved */ put_be16(pb, 0); /* Reserved */ @@ -586,7 +600,7 @@ static int mov_write_hdlr_tag(ByteIOContext *pb, MOVTrack* track) put_be32(pb, 0); /* size */ put_tag(pb, "hdlr"); put_be32(pb, 0); /* Version & flags */ - put_tag(pb, hdlr); /* handler */ + put_buffer(pb, hdlr, 4); /* handler */ put_tag(pb, hdlr_type); /* handler type */ put_be32(pb ,0); /* reserved */ put_be32(pb ,0); /* reserved */ @@ -785,6 +799,7 @@ static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov, } /* Encoder */ + if(!(mov->tracks[0].enc->flags & CODEC_FLAG_BITEXACT)) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ @@ -935,10 +950,6 @@ static int mov_write_header(AVFormatContext *s) return 0; } -static int Timestamp(void) { - return 1067949799U+(24107*86400); //its the modification time of this line :) -} - static int mov_write_packet(AVFormatContext *s, int stream_index, const uint8_t *buf, int size, int64_t pts) { @@ -980,7 +991,7 @@ static int mov_write_packet(AVFormatContext *s, int stream_index, if ((enc->codec_id == CODEC_ID_MPEG4 || enc->codec_id == CODEC_ID_AAC) && trk->vosLen == 0) { - assert(enc->extradata_size); +// assert(enc->extradata_size); trk->vosLen = enc->extradata_size; trk->vosData = av_malloc(trk->vosLen); @@ -1002,7 +1013,7 @@ static int mov_write_packet(AVFormatContext *s, int stream_index, if (mov->mdat_written == 0) { mov_write_mdat_tag(pb, mov); mov->mdat_written = 1; - mov->time = Timestamp(); + mov->time = s->timestamp; } trk->cluster[cl][id].pos = url_ftell(pb);