mirror of https://git.ffmpeg.org/ffmpeg.git
movenc: Add an F4V muxer
F4V is Adobe's mp4/iso media variant, with the most significant addition/change being supporting other flash codecs than just aac/h264. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
b3be41ca82
commit
e01fba5562
|
@ -39,6 +39,7 @@ version 10:
|
|||
- mux chapters in ASF files
|
||||
- Opus in Ogg demuxing
|
||||
- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support)
|
||||
- F4V muxer
|
||||
|
||||
|
||||
version 9:
|
||||
|
|
|
@ -1814,6 +1814,7 @@ caf_demuxer_select="riffdec"
|
|||
dirac_demuxer_select="dirac_parser"
|
||||
dxa_demuxer_select="riffdec"
|
||||
eac3_demuxer_select="ac3_parser"
|
||||
f4v_muxer_select="mov_muxer"
|
||||
flac_demuxer_select="flac_parser"
|
||||
hls_muxer_select="mpegts_muxer"
|
||||
ipod_muxer_select="mov_muxer"
|
||||
|
|
|
@ -100,6 +100,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);
|
||||
|
|
|
@ -888,6 +888,15 @@ static const AVCodecTag codec_3gp_tags[] = {
|
|||
{ AV_CODEC_ID_NONE, 0 },
|
||||
};
|
||||
|
||||
static const AVCodecTag codec_f4v_tags[] = {
|
||||
{ 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_VP6A, MKTAG('V','P','6','A') },
|
||||
{ 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;
|
||||
|
@ -902,6 +911,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);
|
||||
|
||||
|
@ -1030,7 +1041,11 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track)
|
|||
mov_write_fiel_tag(pb, track);
|
||||
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)
|
||||
else if (track->enc->codec_id == AV_CODEC_ID_VP6F ||
|
||||
track->enc->codec_id == AV_CODEC_ID_VP6A) {
|
||||
/* Don't write any potential extradata here - the cropping
|
||||
* is signalled via the normal width/height fields. */
|
||||
} else if (track->vos_len > 0)
|
||||
mov_write_glbl_tag(pb, track);
|
||||
|
||||
if (track->enc->sample_aspect_ratio.den && track->enc->sample_aspect_ratio.num &&
|
||||
|
@ -2546,6 +2561,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 ");
|
||||
|
||||
|
@ -3149,6 +3166,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;
|
||||
}
|
||||
|
||||
/* Set the FRAGMENT flag if any of the fragmentation methods are
|
||||
|
@ -3650,3 +3668,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 | AVFMT_TS_NEGATIVE,
|
||||
.codec_tag = (const AVCodecTag* const []){ codec_f4v_tags, 0 },
|
||||
.priv_class = &f4v_muxer_class,
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#define MODE_3G2 0x10
|
||||
#define MODE_IPOD 0x20
|
||||
#define MODE_ISM 0x40
|
||||
#define MODE_F4V 0x80
|
||||
|
||||
typedef struct MOVIentry {
|
||||
uint64_t pos;
|
||||
|
|
|
@ -30,8 +30,8 @@
|
|||
#include "libavutil/avutil.h"
|
||||
|
||||
#define LIBAVFORMAT_VERSION_MAJOR 55
|
||||
#define LIBAVFORMAT_VERSION_MINOR 6
|
||||
#define LIBAVFORMAT_VERSION_MICRO 2
|
||||
#define LIBAVFORMAT_VERSION_MINOR 7
|
||||
#define LIBAVFORMAT_VERSION_MICRO 0
|
||||
|
||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||
LIBAVFORMAT_VERSION_MINOR, \
|
||||
|
|
Loading…
Reference in New Issue