X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmovenc.c;h=5e3334a2a714955ceb20877120dfe83f8838f892;hb=15c71dfd03a699a9ce503bf061d58b88ec49d860;hp=e4dbbc99da05a0f1e95ea3c37ccfca55a885d52f;hpb=ebbede22657a17c40f913857b23c8de85e75fe5c;p=ffmpeg diff --git a/libavformat/movenc.c b/libavformat/movenc.c index e4dbbc99da0..5e3334a2a71 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -51,7 +51,7 @@ static const AVOption options[] = { { "separate_moof", "Write separate moof/mdat atoms for each track", 0, AV_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_SEPARATE_MOOF}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" }, { "frag_custom", "Flush fragments on caller requests", 0, AV_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_FRAG_CUSTOM}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" }, { "isml", "Create a live smooth streaming feed (for pushing to a publishing point)", 0, AV_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_ISML}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" }, - FF_RTP_FLAG_OPTS(MOVMuxContext, rtp_flags) + FF_RTP_FLAG_OPTS(MOVMuxContext, rtp_flags), { "skip_iods", "Skip writing iods atom.", offsetof(MOVMuxContext, iods_skip), AV_OPT_TYPE_INT, {.dbl = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM}, { "iods_audio_profile", "iods audio profile atom.", offsetof(MOVMuxContext, iods_audio_profile), AV_OPT_TYPE_INT, {.dbl = -1}, -1, 255, AV_OPT_FLAG_ENCODING_PARAM}, { "iods_video_profile", "iods video profile atom.", offsetof(MOVMuxContext, iods_video_profile), AV_OPT_TYPE_INT, {.dbl = -1}, -1, 255, AV_OPT_FLAG_ENCODING_PARAM}, @@ -264,14 +264,6 @@ static int mov_write_extradata_tag(AVIOContext *pb, MOVTrack *track) return track->enc->extradata_size; } -static int mov_write_enda_tag(AVIOContext *pb) -{ - avio_wb32(pb, 10); - ffio_wfourcc(pb, "enda"); - avio_wb16(pb, 1); /* little endian */ - return 10; -} - static void put_descr(AVIOContext *pb, int tag, unsigned int size) { int i = 3; @@ -299,8 +291,8 @@ static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic put_descr(pb, 0x04, 13 + decoder_specific_info_len); // Object type indication - if ((track->enc->codec_id == CODEC_ID_MP2 || - track->enc->codec_id == CODEC_ID_MP3) && + if ((track->enc->codec_id == AV_CODEC_ID_MP2 || + track->enc->codec_id == AV_CODEC_ID_MP3) && track->enc->sample_rate > 24000) avio_w8(pb, 0x6B); // 11172-3 else @@ -334,14 +326,6 @@ static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic return update_size(pb, pos); } -static int mov_pcm_le_gt16(enum CodecID codec_id) -{ - return codec_id == CODEC_ID_PCM_S24LE || - codec_id == CODEC_ID_PCM_S32LE || - codec_id == CODEC_ID_PCM_F32LE || - codec_id == CODEC_ID_PCM_F64LE; -} - static int mov_write_ms_tag(AVIOContext *pb, MOVTrack *track) { int64_t pos = avio_tell(pb); @@ -397,23 +381,20 @@ static int mov_write_wave_tag(AVIOContext *pb, MOVTrack *track) ffio_wfourcc(pb, "frma"); avio_wl32(pb, track->tag); - if (track->enc->codec_id == CODEC_ID_AAC) { + if (track->enc->codec_id == AV_CODEC_ID_AAC) { /* useless atom needed by mplayer, ipod, not needed by quicktime */ avio_wb32(pb, 12); /* size */ ffio_wfourcc(pb, "mp4a"); avio_wb32(pb, 0); mov_write_esds_tag(pb, track); - } else if (mov_pcm_le_gt16(track->enc->codec_id)) { - mov_write_enda_tag(pb); - } else if (track->enc->codec_id == CODEC_ID_AMR_NB) { + } else if (track->enc->codec_id == AV_CODEC_ID_AMR_NB) { mov_write_amr_tag(pb, track); - } else if (track->enc->codec_id == CODEC_ID_AC3) { - mov_write_chan_tag(pb, track); + } else if (track->enc->codec_id == AV_CODEC_ID_AC3) { mov_write_ac3_tag(pb, track); - } else if (track->enc->codec_id == CODEC_ID_ALAC) { + } else if (track->enc->codec_id == AV_CODEC_ID_ALAC) { mov_write_extradata_tag(pb, track); - } else if (track->enc->codec_id == CODEC_ID_ADPCM_MS || - track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) { + } else if (track->enc->codec_id == AV_CODEC_ID_ADPCM_MS || + track->enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) { mov_write_ms_tag(pb, track); } @@ -527,25 +508,25 @@ static int mov_write_glbl_tag(AVIOContext *pb, MOVTrack *track) * Compute flags for 'lpcm' tag. * See CoreAudioTypes and AudioStreamBasicDescription at Apple. */ -static int mov_get_lpcm_flags(enum CodecID codec_id) +static int mov_get_lpcm_flags(enum AVCodecID codec_id) { switch (codec_id) { - case CODEC_ID_PCM_F32BE: - case CODEC_ID_PCM_F64BE: + case AV_CODEC_ID_PCM_F32BE: + case AV_CODEC_ID_PCM_F64BE: return 11; - case CODEC_ID_PCM_F32LE: - case CODEC_ID_PCM_F64LE: + case AV_CODEC_ID_PCM_F32LE: + case AV_CODEC_ID_PCM_F64LE: return 9; - case CODEC_ID_PCM_U8: + case AV_CODEC_ID_PCM_U8: return 10; - case CODEC_ID_PCM_S16BE: - case CODEC_ID_PCM_S24BE: - case CODEC_ID_PCM_S32BE: + case AV_CODEC_ID_PCM_S16BE: + case AV_CODEC_ID_PCM_S24BE: + case AV_CODEC_ID_PCM_S32BE: return 14; - case CODEC_ID_PCM_S8: - case CODEC_ID_PCM_S16LE: - case CODEC_ID_PCM_S24LE: - case CODEC_ID_PCM_S32LE: + case AV_CODEC_ID_PCM_S8: + case AV_CODEC_ID_PCM_S16LE: + case AV_CODEC_ID_PCM_S24LE: + case AV_CODEC_ID_PCM_S32LE: return 12; default: return 0; @@ -630,32 +611,35 @@ static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) avio_wb16(pb, 0); avio_wb16(pb, 0); /* packet size (= 0) */ - avio_wb16(pb, track->enc->sample_rate); + avio_wb16(pb, track->enc->sample_rate <= UINT16_MAX ? + track->enc->sample_rate : 0); avio_wb16(pb, 0); /* Reserved */ } if(track->mode == MODE_MOV && - (track->enc->codec_id == CODEC_ID_AAC || - track->enc->codec_id == CODEC_ID_AC3 || - track->enc->codec_id == CODEC_ID_AMR_NB || - track->enc->codec_id == CODEC_ID_ALAC || - track->enc->codec_id == CODEC_ID_ADPCM_MS || - track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV || - mov_pcm_le_gt16(track->enc->codec_id))) + (track->enc->codec_id == AV_CODEC_ID_AAC || + track->enc->codec_id == AV_CODEC_ID_AC3 || + track->enc->codec_id == AV_CODEC_ID_AMR_NB || + track->enc->codec_id == AV_CODEC_ID_ALAC || + track->enc->codec_id == AV_CODEC_ID_ADPCM_MS || + track->enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV)) mov_write_wave_tag(pb, track); else if(track->tag == MKTAG('m','p','4','a')) mov_write_esds_tag(pb, track); - else if(track->enc->codec_id == CODEC_ID_AMR_NB) + else if(track->enc->codec_id == AV_CODEC_ID_AMR_NB) mov_write_amr_tag(pb, track); - else if(track->enc->codec_id == CODEC_ID_AC3) + else if(track->enc->codec_id == AV_CODEC_ID_AC3) mov_write_ac3_tag(pb, track); - else if(track->enc->codec_id == CODEC_ID_ALAC) + else if(track->enc->codec_id == AV_CODEC_ID_ALAC) mov_write_extradata_tag(pb, track); - else if (track->enc->codec_id == CODEC_ID_WMAPRO) + else if (track->enc->codec_id == AV_CODEC_ID_WMAPRO) mov_write_wfex_tag(pb, track); else if (track->vos_len > 0) mov_write_glbl_tag(pb, track); + if (track->mode == MODE_MOV && track->enc->codec_type == AVMEDIA_TYPE_AUDIO) + mov_write_chan_tag(pb, track); + return update_size(pb, pos); } @@ -749,11 +733,11 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track) if (!ff_codec_get_tag(ff_mp4_obj_type, track->enc->codec_id)) return 0; - if (track->enc->codec_id == CODEC_ID_H264) tag = MKTAG('a','v','c','1'); - else if (track->enc->codec_id == CODEC_ID_AC3) tag = MKTAG('a','c','-','3'); - else if (track->enc->codec_id == CODEC_ID_DIRAC) tag = MKTAG('d','r','a','c'); - else if (track->enc->codec_id == CODEC_ID_MOV_TEXT) tag = MKTAG('t','x','3','g'); - else if (track->enc->codec_id == CODEC_ID_VC1) tag = MKTAG('v','c','-','1'); + if (track->enc->codec_id == AV_CODEC_ID_H264) tag = MKTAG('a','v','c','1'); + else if (track->enc->codec_id == AV_CODEC_ID_AC3) tag = MKTAG('a','c','-','3'); + else if (track->enc->codec_id == AV_CODEC_ID_DIRAC) tag = MKTAG('d','r','a','c'); + else if (track->enc->codec_id == AV_CODEC_ID_MOV_TEXT) tag = MKTAG('t','x','3','g'); + else if (track->enc->codec_id == AV_CODEC_ID_VC1) tag = MKTAG('v','c','-','1'); else if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) tag = MKTAG('m','p','4','v'); else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO) tag = MKTAG('m','p','4','a'); @@ -761,14 +745,14 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track) } static const AVCodecTag codec_ipod_tags[] = { - { CODEC_ID_H264, MKTAG('a','v','c','1') }, - { CODEC_ID_MPEG4, MKTAG('m','p','4','v') }, - { CODEC_ID_AAC, MKTAG('m','p','4','a') }, - { CODEC_ID_ALAC, MKTAG('a','l','a','c') }, - { CODEC_ID_AC3, MKTAG('a','c','-','3') }, - { CODEC_ID_MOV_TEXT, MKTAG('t','x','3','g') }, - { CODEC_ID_MOV_TEXT, MKTAG('t','e','x','t') }, - { CODEC_ID_NONE, 0 }, + { AV_CODEC_ID_H264, MKTAG('a','v','c','1') }, + { AV_CODEC_ID_MPEG4, MKTAG('m','p','4','v') }, + { AV_CODEC_ID_AAC, MKTAG('m','p','4','a') }, + { AV_CODEC_ID_ALAC, MKTAG('a','l','a','c') }, + { AV_CODEC_ID_AC3, MKTAG('a','c','-','3') }, + { AV_CODEC_ID_MOV_TEXT, MKTAG('t','x','3','g') }, + { AV_CODEC_ID_MOV_TEXT, MKTAG('t','e','x','t') }, + { AV_CODEC_ID_NONE, 0 }, }; static int ipod_get_codec_tag(AVFormatContext *s, MOVTrack *track) @@ -855,13 +839,13 @@ static int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track) int tag = track->enc->codec_tag; if (!tag || (track->enc->strict_std_compliance >= FF_COMPLIANCE_NORMAL && - (track->enc->codec_id == CODEC_ID_DVVIDEO || - track->enc->codec_id == CODEC_ID_RAWVIDEO || - track->enc->codec_id == CODEC_ID_H263 || + (track->enc->codec_id == AV_CODEC_ID_DVVIDEO || + track->enc->codec_id == AV_CODEC_ID_RAWVIDEO || + track->enc->codec_id == AV_CODEC_ID_H263 || av_get_bits_per_sample(track->enc->codec_id)))) { // pcm audio - if (track->enc->codec_id == CODEC_ID_DVVIDEO) + if (track->enc->codec_id == AV_CODEC_ID_DVVIDEO) tag = mov_get_dv_codec_tag(s, track); - else if (track->enc->codec_id == CODEC_ID_RAWVIDEO) + else if (track->enc->codec_id == AV_CODEC_ID_RAWVIDEO) tag = mov_get_rawvideo_codec_tag(s, track); else if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) { tag = ff_codec_get_tag(ff_codec_movvideo_tags, track->enc->codec_id); @@ -889,25 +873,25 @@ static int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track) } static const AVCodecTag codec_3gp_tags[] = { - { CODEC_ID_H263, MKTAG('s','2','6','3') }, - { CODEC_ID_H264, MKTAG('a','v','c','1') }, - { CODEC_ID_MPEG4, MKTAG('m','p','4','v') }, - { CODEC_ID_AAC, MKTAG('m','p','4','a') }, - { CODEC_ID_AMR_NB, MKTAG('s','a','m','r') }, - { CODEC_ID_AMR_WB, MKTAG('s','a','w','b') }, - { CODEC_ID_MOV_TEXT, MKTAG('t','x','3','g') }, - { CODEC_ID_NONE, 0 }, + { AV_CODEC_ID_H263, MKTAG('s','2','6','3') }, + { AV_CODEC_ID_H264, MKTAG('a','v','c','1') }, + { AV_CODEC_ID_MPEG4, MKTAG('m','p','4','v') }, + { AV_CODEC_ID_AAC, MKTAG('m','p','4','a') }, + { AV_CODEC_ID_AMR_NB, MKTAG('s','a','m','r') }, + { AV_CODEC_ID_AMR_WB, MKTAG('s','a','w','b') }, + { AV_CODEC_ID_MOV_TEXT, MKTAG('t','x','3','g') }, + { AV_CODEC_ID_NONE, 0 }, }; static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track) { - int tag = track->enc->codec_tag; + int tag; if (track->mode == MODE_MP4 || track->mode == MODE_PSP) tag = mp4_get_codec_tag(s, track); else if (track->mode == MODE_ISM) { tag = mp4_get_codec_tag(s, track); - if (!tag && track->enc->codec_id == CODEC_ID_WMAPRO) + if (!tag && track->enc->codec_id == AV_CODEC_ID_WMAPRO) tag = MKTAG('w', 'm', 'a', ' '); } else if (track->mode == MODE_IPOD) tag = ipod_get_codec_tag(s, track); @@ -995,7 +979,7 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track) avio_wb16(pb, 0); /* Codec stream revision (=0) */ if (track->mode == MODE_MOV) { ffio_wfourcc(pb, "FFMP"); /* Vendor */ - if(track->enc->codec_id == CODEC_ID_RAWVIDEO) { + if(track->enc->codec_id == AV_CODEC_ID_RAWVIDEO) { avio_wb32(pb, 0); /* Temporal Quality */ avio_wb32(pb, 0x400); /* Spatial Quality = lossless*/ } else { @@ -1027,19 +1011,19 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track) avio_wb16(pb, 0xffff); /* Reserved */ if(track->tag == MKTAG('m','p','4','v')) mov_write_esds_tag(pb, track); - else if(track->enc->codec_id == CODEC_ID_H263) + else if(track->enc->codec_id == AV_CODEC_ID_H263) mov_write_d263_tag(pb); - else if(track->enc->codec_id == CODEC_ID_SVQ3) + else if(track->enc->codec_id == AV_CODEC_ID_SVQ3) mov_write_svq3_tag(pb); - else if(track->enc->codec_id == CODEC_ID_DNXHD) + else if(track->enc->codec_id == AV_CODEC_ID_DNXHD) mov_write_avid_tag(pb, track); - else if(track->enc->codec_id == CODEC_ID_H264) { + else if(track->enc->codec_id == AV_CODEC_ID_H264) { mov_write_avcc_tag(pb, track); if(track->mode == MODE_IPOD) mov_write_uuid_tag_ipod(pb); } else if (track->enc->field_order != AV_FIELD_UNKNOWN) mov_write_fiel_tag(pb, track); - else if (track->enc->codec_id == CODEC_ID_VC1 && track->vos_len > 0) + else if (track->enc->codec_id == AV_CODEC_ID_VC1 && track->vos_len > 0) mov_write_dvc1_tag(pb, track); else if (track->vos_len > 0) mov_write_glbl_tag(pb, track); @@ -2136,7 +2120,7 @@ static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov) param_write_int(pb, "systemBitrate", track->enc->bit_rate); param_write_int(pb, "trackID", track_id); if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) { - if (track->enc->codec_id == CODEC_ID_H264) { + if (track->enc->codec_id == AV_CODEC_ID_H264) { uint8_t *ptr; int size = track->enc->extradata_size; if (!ff_avc_write_annexb_extradata(track->enc->extradata, &ptr, @@ -2147,7 +2131,7 @@ static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov) av_free(ptr); } param_write_string(pb, "FourCC", "H264"); - } else if (track->enc->codec_id == CODEC_ID_VC1) { + } else if (track->enc->codec_id == AV_CODEC_ID_VC1) { param_write_string(pb, "FourCC", "WVC1"); param_write_hex(pb, "CodecPrivateData", track->enc->extradata, track->enc->extradata_size); @@ -2157,9 +2141,9 @@ static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov) param_write_int(pb, "DisplayWidth", track->enc->width); param_write_int(pb, "DisplayHeight", track->enc->height); } else { - if (track->enc->codec_id == CODEC_ID_AAC) { + if (track->enc->codec_id == AV_CODEC_ID_AAC) { param_write_string(pb, "FourCC", "AACL"); - } else if (track->enc->codec_id == CODEC_ID_WMAPRO) { + } else if (track->enc->codec_id == AV_CODEC_ID_WMAPRO) { param_write_string(pb, "FourCC", "WMAP"); } param_write_hex(pb, "CodecPrivateData", track->enc->extradata, @@ -2491,7 +2475,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) AVStream *st = s->streams[i]; if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) has_video = 1; - if (st->codec->codec_id == CODEC_ID_H264) + if (st->codec->codec_id == AV_CODEC_ID_H264) has_h264 = 1; } @@ -2582,7 +2566,7 @@ static void mov_write_uuidprof_tag(AVIOContext *pb, AVFormatContext *s) ffio_wfourcc(pb, "VPRF"); /* video */ avio_wb32(pb, 0x0); avio_wb32(pb, 0x1); /* TrackID */ - if (video_codec->codec_id == CODEC_ID_H264) { + if (video_codec->codec_id == AV_CODEC_ID_H264) { ffio_wfourcc(pb, "avc1"); avio_wb16(pb, 0x014D); avio_wb16(pb, 0x0015); @@ -2832,7 +2816,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) } } - if (enc->codec_id == CODEC_ID_AMR_NB) { + if (enc->codec_id == AV_CODEC_ID_AMR_NB) { /* We must find out how many AMR blocks there are in one packet */ static uint16_t packed_size[16] = {13, 14, 16, 18, 20, 21, 27, 32, 6, 0, 0, 0, 0, 0, 0, 1}; @@ -2858,7 +2842,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) memcpy(trk->vos_data, enc->extradata, trk->vos_len); } - if (enc->codec_id == CODEC_ID_H264 && trk->vos_len > 0 && *(uint8_t *)trk->vos_data != 1) { + if (enc->codec_id == AV_CODEC_ID_H264 && trk->vos_len > 0 && *(uint8_t *)trk->vos_data != 1) { /* from x264 or from bytestream h264 */ /* nal reformating needed */ if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams) { @@ -2872,8 +2856,8 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) avio_write(pb, pkt->data, size); } - if ((enc->codec_id == CODEC_ID_DNXHD || - enc->codec_id == CODEC_ID_AC3) && !trk->vos_len) { + if ((enc->codec_id == AV_CODEC_ID_DNXHD || + enc->codec_id == AV_CODEC_ID_AC3) && !trk->vos_len) { /* copy frame to create needed atoms */ trk->vos_len = size; trk->vos_data = av_malloc(size); @@ -2912,10 +2896,10 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) trk->flags |= MOV_TRACK_CTTS; trk->cluster[trk->entry].cts = pkt->pts - pkt->dts; trk->cluster[trk->entry].flags = 0; - if (enc->codec_id == CODEC_ID_VC1) { + if (enc->codec_id == AV_CODEC_ID_VC1) { mov_parse_vc1_frame(pkt, trk, mov->fragments); } else if (pkt->flags & AV_PKT_FLAG_KEY) { - if (mov->mode == MODE_MOV && enc->codec_id == CODEC_ID_MPEG2VIDEO && + if (mov->mode == MODE_MOV && enc->codec_id == AV_CODEC_ID_MPEG2VIDEO && trk->entry > 0) { // force sync sample for the first key frame mov_parse_mpeg2_frame(pkt, &trk->cluster[trk->entry].flags); if (trk->cluster[trk->entry].flags & MOV_PARTIAL_SYNC_SAMPLE) @@ -3111,7 +3095,8 @@ static int mov_write_header(AVFormatContext *s) }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO){ track->timescale = st->codec->sample_rate; /* set sample_size for PCM and ADPCM */ - if (av_get_bits_per_sample(st->codec->codec_id)) { + if (av_get_bits_per_sample(st->codec->codec_id) || + st->codec->codec_id == AV_CODEC_ID_ILBC) { if (!st->codec->block_align) { av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set\n", i); goto error; @@ -3122,17 +3107,11 @@ static int mov_write_header(AVFormatContext *s) if (av_get_bits_per_sample(st->codec->codec_id) < 8) { track->audio_vbr = 1; } - if (track->mode != MODE_MOV) { - if (track->timescale > UINT16_MAX) { - av_log(s, AV_LOG_ERROR, "track %d: output format does not support " - "sample rate %dhz\n", i, track->timescale); - goto error; - } - if (track->enc->codec_id == CODEC_ID_MP3 && track->timescale < 16000) { - av_log(s, AV_LOG_ERROR, "track %d: muxing mp3 at %dhz is not supported\n", - i, track->enc->sample_rate); - goto error; - } + if (track->mode != MODE_MOV && + track->enc->codec_id == AV_CODEC_ID_MP3 && track->timescale < 16000) { + av_log(s, AV_LOG_ERROR, "track %d: muxing mp3 at %dhz is not supported\n", + i, track->enc->sample_rate); + goto error; } }else if(st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE){ track->timescale = st->codec->time_base.den; @@ -3269,15 +3248,12 @@ static int mov_write_trailer(AVFormatContext *s) MOV_CLASS(mov) AVOutputFormat ff_mov_muxer = { .name = "mov", - .long_name = NULL_IF_CONFIG_SMALL("MOV format"), + .long_name = NULL_IF_CONFIG_SMALL("QuickTime / MOV"), .extensions = "mov", .priv_data_size = sizeof(MOVMuxContext), - .audio_codec = CODEC_ID_AAC, -#if CONFIG_LIBX264_ENCODER - .video_codec = CODEC_ID_H264, -#else - .video_codec = CODEC_ID_MPEG4, -#endif + .audio_codec = AV_CODEC_ID_AAC, + .video_codec = CONFIG_LIBX264_ENCODER ? + AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4, .write_header = mov_write_header, .write_packet = mov_write_packet, .write_trailer = mov_write_trailer, @@ -3292,11 +3268,11 @@ AVOutputFormat ff_mov_muxer = { MOV_CLASS(tgp) AVOutputFormat ff_tgp_muxer = { .name = "3gp", - .long_name = NULL_IF_CONFIG_SMALL("3GP format"), + .long_name = NULL_IF_CONFIG_SMALL("3GP (3GPP file format)"), .extensions = "3gp", .priv_data_size = sizeof(MOVMuxContext), - .audio_codec = CODEC_ID_AMR_NB, - .video_codec = CODEC_ID_H263, + .audio_codec = AV_CODEC_ID_AMR_NB, + .video_codec = AV_CODEC_ID_H263, .write_header = mov_write_header, .write_packet = mov_write_packet, .write_trailer = mov_write_trailer, @@ -3309,16 +3285,13 @@ AVOutputFormat ff_tgp_muxer = { MOV_CLASS(mp4) AVOutputFormat ff_mp4_muxer = { .name = "mp4", - .long_name = NULL_IF_CONFIG_SMALL("MP4 format"), + .long_name = NULL_IF_CONFIG_SMALL("MP4 (MPEG-4 Part 14)"), .mime_type = "application/mp4", .extensions = "mp4", .priv_data_size = sizeof(MOVMuxContext), - .audio_codec = CODEC_ID_AAC, -#if CONFIG_LIBX264_ENCODER - .video_codec = CODEC_ID_H264, -#else - .video_codec = CODEC_ID_MPEG4, -#endif + .audio_codec = AV_CODEC_ID_AAC, + .video_codec = CONFIG_LIBX264_ENCODER ? + AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4, .write_header = mov_write_header, .write_packet = mov_write_packet, .write_trailer = mov_write_trailer, @@ -3331,15 +3304,12 @@ AVOutputFormat ff_mp4_muxer = { MOV_CLASS(psp) AVOutputFormat ff_psp_muxer = { .name = "psp", - .long_name = NULL_IF_CONFIG_SMALL("PSP MP4 format"), + .long_name = NULL_IF_CONFIG_SMALL("PSP MP4 (MPEG-4 Part 14)"), .extensions = "mp4,psp", .priv_data_size = sizeof(MOVMuxContext), - .audio_codec = CODEC_ID_AAC, -#if CONFIG_LIBX264_ENCODER - .video_codec = CODEC_ID_H264, -#else - .video_codec = CODEC_ID_MPEG4, -#endif + .audio_codec = AV_CODEC_ID_AAC, + .video_codec = CONFIG_LIBX264_ENCODER ? + AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4, .write_header = mov_write_header, .write_packet = mov_write_packet, .write_trailer = mov_write_trailer, @@ -3352,11 +3322,11 @@ AVOutputFormat ff_psp_muxer = { MOV_CLASS(tg2) AVOutputFormat ff_tg2_muxer = { .name = "3g2", - .long_name = NULL_IF_CONFIG_SMALL("3GP2 format"), + .long_name = NULL_IF_CONFIG_SMALL("3GP2 (3GPP2 file format)"), .extensions = "3g2", .priv_data_size = sizeof(MOVMuxContext), - .audio_codec = CODEC_ID_AMR_NB, - .video_codec = CODEC_ID_H263, + .audio_codec = AV_CODEC_ID_AMR_NB, + .video_codec = AV_CODEC_ID_H263, .write_header = mov_write_header, .write_packet = mov_write_packet, .write_trailer = mov_write_trailer, @@ -3369,12 +3339,12 @@ AVOutputFormat ff_tg2_muxer = { MOV_CLASS(ipod) AVOutputFormat ff_ipod_muxer = { .name = "ipod", - .long_name = NULL_IF_CONFIG_SMALL("iPod H.264 MP4 format"), + .long_name = NULL_IF_CONFIG_SMALL("iPod H.264 MP4 (MPEG-4 Part 14)"), .mime_type = "application/mp4", .extensions = "m4v,m4a", .priv_data_size = sizeof(MOVMuxContext), - .audio_codec = CODEC_ID_AAC, - .video_codec = CODEC_ID_H264, + .audio_codec = AV_CODEC_ID_AAC, + .video_codec = AV_CODEC_ID_H264, .write_header = mov_write_header, .write_packet = mov_write_packet, .write_trailer = mov_write_trailer, @@ -3387,12 +3357,12 @@ AVOutputFormat ff_ipod_muxer = { MOV_CLASS(ismv) AVOutputFormat ff_ismv_muxer = { .name = "ismv", - .long_name = NULL_IF_CONFIG_SMALL("ISMV/ISMA (Smooth Streaming) format"), + .long_name = NULL_IF_CONFIG_SMALL("ISMV/ISMA (Smooth Streaming)"), .mime_type = "application/mp4", .extensions = "ismv,isma", .priv_data_size = sizeof(MOVMuxContext), - .audio_codec = CODEC_ID_AAC, - .video_codec = CODEC_ID_H264, + .audio_codec = AV_CODEC_ID_AAC, + .video_codec = AV_CODEC_ID_H264, .write_header = mov_write_header, .write_packet = mov_write_packet, .write_trailer = mov_write_trailer,