[FFmpeg-devel] [PATCH]Add Opus and Speex muxer
Carl Eugen Hoyos
cehoyos at ag.or.at
Sat Nov 30 02:01:14 CET 2013
On Saturday 30 November 2013 01:47:14 am James Almer wrote:
> On 29/11/13 9:09 PM, Carl Eugen Hoyos wrote:
> > HI!
> >
> > Attached patch - mostly untested - tries to address ticket #3181
[Sorry, I cannot comment on the mimetypes.]
> > +#if CONFIG_SPEEX_MUXER
> > +AVOutputFormat ff_speex_muxer = {
> > + .name = "speex",
> > + .long_name = NULL_IF_CONFIG_SMALL("Speex"),
> > + .mime_type = "application/ogg",
>
> This needs to be changed to "audio/ogg".
Thank you, fixed.
> > + .extensions = "spx",
> > + .priv_data_size = sizeof(OGGContext),
> > + .audio_codec = AV_CODEC_ID_SPEEX,
>
> .video_codec = AV_CODEC_ID_NONE,
Changed (although I wonder why this needed).
> > + .write_header = ogg_write_header,
> > + .write_packet = ogg_write_packet,
> > + .write_trailer = ogg_write_trailer,
> > + .flags = AVFMT_TS_NEGATIVE,
> > + .priv_class = &ogg_muxer_class,
> > +};
> > +#endif
>
> Same for Opus.
>
> Also, you should add relevant _select lines to configure so the Opus and
> Speex muxers get enabled when the existing ogg muxer is enabled.
I don't think this is a good idea.
> Otherwise
> any build that does something like "--disable-everything
> --enable-muxer=ogg" alone will have trouble muxing opus and spx files even
> though the necessary code is all present.
I believe many such combinations / configure lines are possible, the
question - as we interpreted it so far - was not if it makes sense but if it
is possible without additional trouble to have one symbol less.
Thank you, Carl Eugen
-------------- next part --------------
diff --git a/libavformat/Makefile b/libavformat/Makefile
index b08ce57..6e5e8d0 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -269,6 +269,8 @@ OBJS-$(CONFIG_OGG_MUXER) += oggenc.o \
vorbiscomment.o
OBJS-$(CONFIG_OMA_DEMUXER) += omadec.o pcm.o oma.o
OBJS-$(CONFIG_OMA_MUXER) += omaenc.o rawenc.o oma.o id3v2enc.o
+OBJS-$(CONFIG_OPUS_MUXER) += oggenc.o \
+ vorbiscomment.o
OBJS-$(CONFIG_PAF_DEMUXER) += paf.o
OBJS-$(CONFIG_PCM_ALAW_DEMUXER) += pcmdec.o pcm.o
OBJS-$(CONFIG_PCM_ALAW_MUXER) += pcmenc.o rawenc.o
@@ -365,6 +367,8 @@ OBJS-$(CONFIG_SOX_DEMUXER) += soxdec.o pcm.o
OBJS-$(CONFIG_SOX_MUXER) += soxenc.o rawenc.o
OBJS-$(CONFIG_SPDIF_DEMUXER) += spdif.o spdifdec.o
OBJS-$(CONFIG_SPDIF_MUXER) += spdif.o spdifenc.o
+OBJS-$(CONFIG_SPEEX_MUXER) += oggenc.o \
+ vorbiscomment.o
OBJS-$(CONFIG_SRT_DEMUXER) += srtdec.o subtitles.o
OBJS-$(CONFIG_SRT_MUXER) += srtenc.o
OBJS-$(CONFIG_STR_DEMUXER) += psxstr.o
diff --git a/libavformat/allformats.c b/libavformat/allformats.c
index 0841167..f1039dd 100644
--- a/libavformat/allformats.c
+++ b/libavformat/allformats.c
@@ -205,6 +205,7 @@ void av_register_all(void)
REGISTER_DEMUXER (NUV, nuv);
REGISTER_MUXDEMUX(OGG, ogg);
REGISTER_MUXDEMUX(OMA, oma);
+ REGISTER_MUXER (OPUS, opus);
REGISTER_DEMUXER (PAF, paf);
REGISTER_MUXDEMUX(PCM_ALAW, pcm_alaw);
REGISTER_MUXDEMUX(PCM_MULAW, pcm_mulaw);
@@ -264,6 +265,7 @@ void av_register_all(void)
REGISTER_DEMUXER (SOL, sol);
REGISTER_MUXDEMUX(SOX, sox);
REGISTER_MUXDEMUX(SPDIF, spdif);
+ REGISTER_MUXER (SPEEX, speex);
REGISTER_MUXDEMUX(SRT, srt);
REGISTER_DEMUXER (STR, str);
REGISTER_DEMUXER (SUBVIEWER1, subviewer1);
diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c
index e846d3b..c3efd6b 100644
--- a/libavformat/oggenc.c
+++ b/libavformat/oggenc.c
@@ -86,14 +86,6 @@ static const AVOption options[] = {
{ NULL },
};
-static const AVClass ogg_muxer_class = {
- .class_name = "Ogg muxer",
- .item_name = av_default_item_name,
- .option = options,
- .version = LIBAVUTIL_VERSION_INT,
-};
-
-
static void ogg_update_checksum(AVFormatContext *s, AVIOContext *pb, int64_t crc_offset)
{
int64_t pos = avio_tell(pb);
@@ -624,11 +616,19 @@ static int ogg_write_trailer(AVFormatContext *s)
return 0;
}
+#if CONFIG_OGG_MUXER
+static const AVClass ogg_muxer_class = {
+ .class_name = "Ogg muxer",
+ .item_name = av_default_item_name,
+ .option = options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
+
AVOutputFormat ff_ogg_muxer = {
.name = "ogg",
.long_name = NULL_IF_CONFIG_SMALL("Ogg"),
.mime_type = "application/ogg",
- .extensions = "ogg,ogv,spx,opus",
+ .extensions = "ogg,ogv",
.priv_data_size = sizeof(OGGContext),
.audio_codec = AV_CODEC_ID_FLAC,
.video_codec = AV_CODEC_ID_THEORA,
@@ -638,3 +638,52 @@ AVOutputFormat ff_ogg_muxer = {
.flags = AVFMT_TS_NEGATIVE,
.priv_class = &ogg_muxer_class,
};
+#endif
+
+#if CONFIG_SPEEX_MUXER
+static const AVClass speex_muxer_class = {
+ .class_name = "Speex muxer",
+ .item_name = av_default_item_name,
+ .option = options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
+
+AVOutputFormat ff_speex_muxer = {
+ .name = "speex",
+ .long_name = NULL_IF_CONFIG_SMALL("Speex"),
+ .mime_type = "audio/ogg",
+ .extensions = "spx",
+ .priv_data_size = sizeof(OGGContext),
+ .audio_codec = AV_CODEC_ID_SPEEX,
+ .video_codec = AV_CODEC_ID_NONE,
+ .write_header = ogg_write_header,
+ .write_packet = ogg_write_packet,
+ .write_trailer = ogg_write_trailer,
+ .flags = AVFMT_TS_NEGATIVE,
+ .priv_class = &speex_muxer_class,
+};
+#endif
+
+#if CONFIG_OPUS_MUXER
+static const AVClass opus_muxer_class = {
+ .class_name = "Opus muxer",
+ .item_name = av_default_item_name,
+ .option = options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
+
+AVOutputFormat ff_opus_muxer = {
+ .name = "opus",
+ .long_name = NULL_IF_CONFIG_SMALL("Opus"),
+ .mime_type = "audio/ogg",
+ .extensions = "opus",
+ .priv_data_size = sizeof(OGGContext),
+ .audio_codec = AV_CODEC_ID_OPUS,
+ .video_codec = AV_CODEC_ID_NONE,
+ .write_header = ogg_write_header,
+ .write_packet = ogg_write_packet,
+ .write_trailer = ogg_write_trailer,
+ .flags = AVFMT_TS_NEGATIVE,
+ .priv_class = &opus_muxer_class,
+};
+#endif
More information about the ffmpeg-devel
mailing list