[FFmpeg-devel] [PATCHv3] avformat/mpegts: opus muxing & demuxing for mapping family 255

Michael Niedermayer michael at niedermayer.cc
Wed Oct 25 04:45:20 EEST 2017


On Thu, Sep 14, 2017 at 06:48:33PM +0200, pkv.stream wrote:
> Thanks for your comments Moritz.
> Corrected patch in attachment.
> Regards
> 
> Le 14/09/2017 à 5:46 PM, Moritz Barsnick a écrit :
> >On Fri, Sep 08, 2017 at 01:46:38 +0200, pkv.stream wrote:
> >>-                    avpriv_request_sample(fc, "Opus in MPEG-TS - channel_config_code > 0x8");
> >[...]
> >>+                            avpriv_request_sample(fc, "Opus in MPEG-TS - channel_config_code");
> >You probably need to mention the channel_config_code in the new
> >message.
> >
> >>+                        for (j = 0; j < channels; j++) {
> >>+                            opus_channel_map255[j] = j;
> >>+                            }
> >Misplaced closing bracket.
> >
> >Moritz
> >_______________________________________________
> >ffmpeg-devel mailing list
> >ffmpeg-devel at ffmpeg.org
> >http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> 

>  mpegts.c    |   64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
>  mpegtsenc.c |   19 ++++++++++++-----
>  2 files changed, 74 insertions(+), 9 deletions(-)
> d2e34a72c7152584ae9423174f254d5d761325c3  0001-avformat-mpegts-opus-muxing-demuxing-expanded.patch
> From 9175cb61dabce42417199cc6d6272d8290c39a5c Mon Sep 17 00:00:00 2001
> From: pkviet <pkv.stream at gmail.com>
> Date: Fri, 8 Sep 2017 01:34:22 +0200
> Subject: [PATCH] avformat/mpegts: opus muxing & demuxing expanded
> 
> Support for opus in mpegts demuxer was brought by commit
> 9cfa68c560bdec82d2d5ec079f9c5b0f9ca37af0 (Kieran Kunhya).
> Support for opus in mpegts muxer was then added by commit
> 01509cdf9287b975eced1fd609a8201fbd1438e3 (S. Droge).
> Later commit 37941878f193a2316c514bd5ba55bfe9d2dfdfcf by Michael Graczyk
> added support of mapping_family encoder parameter which allows for up to
> 255 audio channels (for family 255).
> While matroska muxer & demuxer readily accepts mapping_family, it is not
> the case for mpegts muxer & demuxer for all the range of the parameter
> (family 255 and also part of family 1 with channel_config_code > 0x81
> unsupported).
> This commit brings such a support.
> ---
>  libavformat/mpegts.c    | 64 ++++++++++++++++++++++++++++++++++++++++++++++---
>  libavformat/mpegtsenc.c | 19 ++++++++++-----
>  2 files changed, 74 insertions(+), 9 deletions(-)
> 
> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
> index 4d2f5c6..8d8977b 100644
> --- a/libavformat/mpegts.c
> +++ b/libavformat/mpegts.c
> @@ -1633,7 +1633,7 @@ static const uint8_t opus_stream_cnt[9] = {
>      1, 1, 1, 2, 2, 3, 4, 4, 5,
>  };
>  
> -static const uint8_t opus_channel_map[8][8] = {
> +static const uint8_t opus_channel_map_a[8][8] = {
>      { 0 },
>      { 0,1 },
>      { 0,2,1 },
> @@ -1644,6 +1644,17 @@ static const uint8_t opus_channel_map[8][8] = {
>      { 0,6,1,2,3,4,5,7 },
>  };
>  
> +static const uint8_t opus_channel_map_b[8][8] = {
> +    { 0 },
> +    { 0,1 },
> +    { 0,1,2 },
> +    { 0,1,2,3 },
> +    { 0,1,2,3,4 },
> +    { 0,1,2,3,4,5 },
> +    { 0,1,2,3,4,5,6 },
> +    { 0,1,2,3,4,5,6,7 },
> +};
> +
>  int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type,
>                                const uint8_t **pp, const uint8_t *desc_list_end,
>                                Mp4Descr *mp4_descr, int mp4_descr_count, int pid,
> @@ -1887,9 +1898,56 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
>                      st->codecpar->extradata[18] = channel_config_code ? (channels > 2) : /* Dual Mono */ 255;
>                      st->codecpar->extradata[19] = opus_stream_cnt[channel_config_code];
>                      st->codecpar->extradata[20] = opus_coupled_stream_cnt[channel_config_code];
> -                    memcpy(&st->codecpar->extradata[21], opus_channel_map[channels - 1], channels);
> +                    memcpy(&st->codecpar->extradata[21], opus_channel_map_a[channels - 1], channels);
>                  } else {
> -                    avpriv_request_sample(fc, "Opus in MPEG-TS - channel_config_code > 0x8");
> +                    if (channel_config_code == 0x81) {
> +                        channels = get8(pp, desc_end);
> +                        st->codecpar->extradata_size = 22 + channels;
> +                        size_t extradata_size;
> +                        extradata_size = (22 + channels) * sizeof(uint8_t);
> +                        uint8_t *extradata;

this produces warnings:
libavformat/mpegts.c:1906:25: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]


> +                        extradata = av_malloc(extradata_size);
> +                        if (!extradata)
> +                            return AVERROR(ENOMEM);

> +                        for (i = 0; i <= (22+channels); i++) {

the extradata_size expression is repeated 3 times, code duplication
should be avoided


> +                            if (i < 9) {
> +                                extradata[i] = opus_default_extradata[i];
> +                            }
> +                            else {
> +                                extradata[i] = 0;
> +                            }
> +                        }

> +                        memcpy(st->codecpar->extradata, extradata, sizeof(extradata));

this looks wrong


> +                        av_free(extradata);
> +                        st->codecpar->extradata[9] = channels;
> +                        st->codecpar->extradata[18] = 255;
> +                        st->codecpar->extradata[19] = channels;
> +                        st->codecpar->extradata[20] = 0;
> +                        size_t channel_map_size = channels * sizeof(uint8_t);
> +                        uint8_t *opus_channel_map255;
> +                        opus_channel_map255 = av_malloc(channel_map_size);
> +                        if (!opus_channel_map255)
> +                            return AVERROR(ENOMEM);
> +                        uint8_t j;
> +                        for (j = 0; j < channels; j++) {
> +                            opus_channel_map255[j] = j;
> +                        }
> +                        memcpy(&st->codecpar->extradata[21], opus_channel_map255, channels);
> +                        av_free(opus_channel_map255);
> +                    } else {
> +                        if ((channel_config_code >= 0x82) && (channel_config_code <= 0x88)) {

> +                            channels = get8(pp, desc_end);
> +                            st->codecpar->extradata[9] = channels;
> +                            st->codecpar->extradata[18] = 1;
> +                            st->codecpar->extradata[19] = channels;
> +                            st->codecpar->extradata[20] = 0;
> +                            memcpy(&st->codecpar->extradata[21], opus_channel_map_b[channels - 1], channels);

the channels value is not checked before use in memcpy


> +                        }
> +                        else {
> +                            avpriv_request_sample(fc, "Opus in MPEG-TS - channel_config_code %i", channel_config_code);
> +                        }
> +
> +                    }
>                  }
>                  st->need_parsing = AVSTREAM_PARSE_FULL;
>                  st->internal->need_context_update = 1;
> diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
> index fdfa544..af1dfc6 100644
> --- a/libavformat/mpegtsenc.c
> +++ b/libavformat/mpegtsenc.c

muxer and demuxer changes should be in seperate patches

thx

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The real ebay dictionary, page 1
"Used only once"    - "Some unspecified defect prevented a second use"
"In good condition" - "Can be repaird by experienced expert"
"As is" - "You wouldnt want it even if you were payed for it, if you knew ..."
-------------- 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/20171025/cfae9e84/attachment.sig>


More information about the ffmpeg-devel mailing list