diff --git a/Changelog b/Changelog index 21aac7dcbd..bd37f87fbe 100644 --- a/Changelog +++ b/Changelog @@ -61,6 +61,7 @@ version next: - decimate filter ported from MPlayer - RTP depacketization of JPEG - Smooth Streaming live segmenter muxer +- F4V muxer version 0.11: diff --git a/configure b/configure index 716a2cb577..c001c5fb1b 100755 --- a/configure +++ b/configure @@ -1793,6 +1793,7 @@ asf_stream_muxer_select="asf_muxer" avisynth_demuxer_deps="avisynth" dirac_demuxer_select="dirac_parser" eac3_demuxer_select="ac3_parser" +f4v_muxer_select="mov_muxer" flac_demuxer_select="flac_parser" ipod_muxer_select="mov_muxer" libnut_demuxer_deps="libnut" diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 44ffd8a65f..8dd917b21a 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -93,6 +93,7 @@ void av_register_all(void) REGISTER_DEMUXER (EA, ea); REGISTER_DEMUXER (EA_CDATA, ea_cdata); REGISTER_MUXDEMUX (EAC3, eac3); + REGISTER_MUXER (F4V, f4v); REGISTER_MUXDEMUX (FFM, ffm); REGISTER_MUXDEMUX (FFMETADATA, ffmetadata); REGISTER_MUXDEMUX (FILMSTRIP, filmstrip); diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 5e20a5c3f9..fffa88c95f 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -933,6 +933,14 @@ static const AVCodecTag codec_3gp_tags[] = { { AV_CODEC_ID_NONE, 0 }, }; +static const AVCodecTag codec_f4v_tags[] = { // XXX: add GIF/PNG/JPEG? + { AV_CODEC_ID_MP3, MKTAG('.','m','p','3') }, + { AV_CODEC_ID_AAC, MKTAG('m','p','4','a') }, + { AV_CODEC_ID_H264, MKTAG('a','v','c','1') }, + { AV_CODEC_ID_VP6F, MKTAG('V','P','6','F') }, + { AV_CODEC_ID_NONE, 0 }, +}; + static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track) { int tag; @@ -947,6 +955,8 @@ static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track) tag = ipod_get_codec_tag(s, track); else if (track->mode & MODE_3GP) tag = ff_codec_get_tag(codec_3gp_tags, track->enc->codec_id); + else if (track->mode & MODE_F4V) + tag = ff_codec_get_tag(codec_f4v_tags, track->enc->codec_id); else tag = mov_get_codec_tag(s, track); @@ -2697,6 +2707,8 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) ffio_wfourcc(pb, has_video ? "M4V ":"M4A "); else if (mov->mode == MODE_ISM) ffio_wfourcc(pb, "isml"); + else if (mov->mode == MODE_F4V) + ffio_wfourcc(pb, "f4v "); else ffio_wfourcc(pb, "qt "); @@ -3388,6 +3400,7 @@ static int mov_write_header(AVFormatContext *s) else if (!strcmp("psp", s->oformat->name)) mov->mode = MODE_PSP; else if (!strcmp("ipod",s->oformat->name)) mov->mode = MODE_IPOD; else if (!strcmp("ismv",s->oformat->name)) mov->mode = MODE_ISM; + else if (!strcmp("f4v", s->oformat->name)) mov->mode = MODE_F4V; mov_write_ftyp_tag(pb,s); if (mov->mode == MODE_PSP) { @@ -3814,3 +3827,21 @@ AVOutputFormat ff_ismv_muxer = { .priv_class = &ismv_muxer_class, }; #endif +#if CONFIG_F4V_MUXER +MOV_CLASS(f4v) +AVOutputFormat ff_f4v_muxer = { + .name = "f4v", + .long_name = NULL_IF_CONFIG_SMALL("F4V Adobe Flash Video"), + .mime_type = "application/f4v", + .extensions = "f4v", + .priv_data_size = sizeof(MOVMuxContext), + .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, + .flags = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH, + .codec_tag = (const AVCodecTag* const []){ codec_f4v_tags, 0 }, + .priv_class = &f4v_muxer_class, +}; +#endif diff --git a/libavformat/movenc.h b/libavformat/movenc.h index 72427d8cfd..b4b3f1c6ac 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -39,6 +39,7 @@ #define MODE_3G2 0x10 #define MODE_IPOD 0x20 #define MODE_ISM 0x40 +#define MODE_F4V 0x80 typedef struct MOVIentry { uint64_t pos;