[FFmpeg-devel] [PATCH]lavf/pcmdec: Map mime_type audio/L16 to the s16le demuxer
Michael Niedermayer
michael at niedermayer.cc
Wed Aug 17 18:32:22 EEST 2016
On Tue, Aug 09, 2016 at 12:51:30AM +0200, Carl Eugen Hoyos wrote:
> Hi!
>
> 2016-08-05 12:44 GMT+02:00 Nicolas George <george at nsup.org>:
> > Le nonidi 19 thermidor, an CCXXIV, Carl Eugen Hoyos a écrit :
> >> Hi!
> >>
> >> Attached patch implements RFC 2586.
> >>
> >> Please comment, Carl Eugen
> >
> >> From ba470c643c836826d75854e3e3539eb09ddd288a Mon Sep 17 00:00:00 2001
> >> From: Carl Eugen Hoyos <cehoyos at ag.or.at>
> >> Date: Fri, 5 Aug 2016 12:22:17 +0200
> >> Subject: [PATCH] lavf/pcmdec: Map mime_type audio/L16 to s16le as specified
> >> in RFC 2586.
> >>
> >> ---
> >> libavformat/pcmdec.c | 63 +++++++++++++++++++++++++++++++++-----------------
> >> 1 file changed, 42 insertions(+), 21 deletions(-)
> >>
> >> diff --git a/libavformat/pcmdec.c b/libavformat/pcmdec.c
> >> index df94345..36ef2c2 100644
> >> --- a/libavformat/pcmdec.c
> >> +++ b/libavformat/pcmdec.c
> >> @@ -36,6 +36,7 @@ static int pcm_read_header(AVFormatContext *s)
> >> {
> >> PCMAudioDemuxerContext *s1 = s->priv_data;
> >> AVStream *st;
> >> + uint8_t *mime_type_opt = NULL;
> >>
> >> st = avformat_new_stream(s, NULL);
> >> if (!st)
> >> @@ -47,6 +48,25 @@ static int pcm_read_header(AVFormatContext *s)
> >> st->codecpar->sample_rate = s1->sample_rate;
> >> st->codecpar->channels = s1->channels;
> >>
> >> + av_opt_get(s->pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type_opt);
> >> + if (mime_type_opt) {
> >
> >> + const char *mime_type = mime_type_opt;
> >
> > I do not understand the need for that line.
>
> Removed.
>
> >> + size_t len = strlen(s->iformat->mime_type);
> >
> > Maybe I am missing something obvious, but I think s->iformat->mime_type is
> > NULL for all the other formats. It needs to be checked.
>
> Added the check.
>
> >> + int rate, channels = 0;
> >> + if (!av_strncasecmp(s->iformat->mime_type, mime_type, len)) {
> >
> >> + if ( !sscanf(mime_type + len, ";rate=%d;channels=%d", &rate, &channels)
> >
> > If I understand the way MIME type works, ";channels=2;rate=48000" would be
> > exactly as valid, and spaces can surround the semicolons.
>
> I changed this hunk.
>
> >> + || !rate) {
> >> + av_log(s, AV_LOG_ERROR,
> >> + "Invalid sample_rate found in mime_type \"%s\"\n",
> >> + mime_type);
> >> + return AVERROR_INVALIDDATA;
> >> + }
> >> + st->codecpar->sample_rate = rate;
> >> + if (channels)
> >> + st->codecpar->channels = channels;
> >> + }
> >> + }
> >> +
> >> st->codecpar->bits_per_coded_sample =
> >> av_get_bits_per_sample(st->codecpar->codec_id);
> >>
> >> @@ -65,7 +85,7 @@ static const AVOption pcm_options[] = {
> >> { NULL },
> >> };
> >>
> >> -#define PCMDEF(name_, long_name_, ext, codec) \
> >
> >> +#define PCMDEF(name_, long_name_, ext, codec, mime_type_) \
> >
> > Instead of changing PCMDEF and all the subsequent declarations, you can
> > create a new macro PCMDEF_WITH_MIME.
> >
> > Even simpler: make PCMDEF varadic, add __ARGS__ in the structure definition.
> > Then, adding the MIME type is just a matter of adding ".mime_type = ..." in
> > the macro call.
>
> Yes, much simpler.
>
> New patch attached.
>
> Thank you, Carl Eugen
> pcmdec.c | 34 ++++++++++++++++++++++++++++++++--
> version.h | 2 +-
> 2 files changed, 33 insertions(+), 3 deletions(-)
> 069eb6ba5db3434e3cc6abca155d8a712c54a8e3 0002-lavf-pcmdec-Map-mime_type-audio-L16-to-the-s16le-dem.patch
> From 3ef0951db492f1425a574aac71fe73f144c2d99a Mon Sep 17 00:00:00 2001
> From: Carl Eugen Hoyos <cehoyos at ag.or.at>
> Date: Tue, 9 Aug 2016 00:46:57 +0200
> Subject: [PATCH 2/2] lavf/pcmdec: Map mime_type audio/L16 to the s16le
> demuxer as specified in RFC 2586.
>
> ---
> libavformat/pcmdec.c | 34 ++++++++++++++++++++++++++++++++--
> libavformat/version.h | 2 +-
> 2 files changed, 33 insertions(+), 3 deletions(-)
>
> diff --git a/libavformat/pcmdec.c b/libavformat/pcmdec.c
> index df94345..e3cc2ae 100644
> --- a/libavformat/pcmdec.c
> +++ b/libavformat/pcmdec.c
> @@ -36,6 +36,7 @@ static int pcm_read_header(AVFormatContext *s)
> {
> PCMAudioDemuxerContext *s1 = s->priv_data;
> AVStream *st;
> + uint8_t *mime_type = NULL;
>
> st = avformat_new_stream(s, NULL);
> if (!st)
> @@ -47,6 +48,34 @@ static int pcm_read_header(AVFormatContext *s)
> st->codecpar->sample_rate = s1->sample_rate;
> st->codecpar->channels = s1->channels;
>
> + av_opt_get(s->pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type);
> + if (mime_type && s->iformat->mime_type) {
> + int rate = 0, channels = 0;
> + size_t len = strlen(s->iformat->mime_type);
> + if (!strncmp(s->iformat->mime_type, mime_type, len)) {
> + uint8_t *options = mime_type + len;
> + len = strlen(mime_type);
> + while (options < mime_type + len) {
> + options = strstr(options, ";");
> + if (!options++)
> + break;
> + if (!rate)
> + sscanf(options, " rate=%d", &rate);
> + if (!channels)
> + sscanf(options, " channels=%d", &channels);
> + }
rate and channels probably should be subject to some sanity checks
like < 0
(unless its checked later)
no further comments from me
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Frequently ignored answer#1 FFmpeg bugs should be sent to our bugtracker. User
questions about the command line tools should be sent to the ffmpeg-user ML.
And questions about how to use libav* should be sent to the libav-user ML.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160817/7d444974/attachment.sig>
More information about the ffmpeg-devel
mailing list