From patchwork Tue Aug 29 21:53:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "pkv.stream" X-Patchwork-Id: 4880 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.15.201 with SMTP id 70csp3561800jao; Tue, 29 Aug 2017 15:00:46 -0700 (PDT) X-Google-Smtp-Source: ADKCNb61uLXeYKTl4H4nVOXnTUwOAaxCKIJrSfIwbRTODM42y/8/BVC0Qj2XI8uo/0kbofwA2fOP X-Received: by 10.223.153.226 with SMTP id y89mr1067420wrb.46.1504044046415; Tue, 29 Aug 2017 15:00:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504044046; cv=none; d=google.com; s=arc-20160816; b=Kvih5sDwQ3RgQ5HtZqfrnWqzloX9fecuGTDD58bkYNXwjxp1cVdX90L5V7rS6GjnDm sKGaOBgpYb62hz62HFg6/lR0AoXH0TdA9P1jAI2xRccZ2vm6ZUUovPfwGMr5fo5QmR3C LnXBYr/AwNQu8wHUzeEiKwerQ9sqpeZAjBL7fvo6l+wpCOAHDTtkRm7r/5bLsHG/nVMr NytCQOUj8BKGCprPWo3j+h48sxrit6Y6A3wB8Kfsg7lIQYMwGFVEQwTuelrNlQBMeEYl zjPDfhgP/M6eSd/fOdG9fXgnD5fTvLK6LtfLdFNReRORM8kUG/S26lOU1TTEWAmqykQN nx9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :content-language:mime-version:user-agent:date:message-id:to:from :dkim-signature:delivered-to:arc-authentication-results; bh=fQqWvdfve2JwwAWlsiynwJs5fNQqUDFU+fwAKZvP2UY=; b=E4iRNDzY38w5QfGqUFaOjBBsGiLtVOLZfRgQyw4N+ZXiaSXOnsxvWK+OfgfVr25zHK tg7ZY1ha4lPVwb/lfxm0lg4Z5ZlhEYwjlxkyzf6mK80SuaPDaLUaCfAg9cKq1A0dcH2x zMf5mhtbtukSUOkhmIQHaTuPUbafr52IIl64wefPFCgViQMNxo3GSMSNiPpjOaJL+ml7 dpn0shczPfN2nqAyh88Ryp1+LLCebBtczjeKBdrLZypJkHM59s2KN0wsR9JNvOJr1fa9 A9Kn3w5kk08pf6ANTKV19aJ5OBi0LnhyLiAK1rKu3MZGeFusXCIjWk+/QdzziBjK5v5W wG8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=JxSfYGwB; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y2si384242wmy.266.2017.08.29.15.00.45; Tue, 29 Aug 2017 15:00:46 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=JxSfYGwB; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DD64768A1EC; Wed, 30 Aug 2017 01:00:41 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com [74.125.82.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 33BA568A151 for ; Wed, 30 Aug 2017 01:00:35 +0300 (EEST) Received: by mail-wm0-f45.google.com with SMTP id t201so5894012wmt.1 for ; Tue, 29 Aug 2017 15:00:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:message-id:date:user-agent:mime-version :content-language; bh=4mSYbhPH15WuI6szmm8CTZ2n3T2CQJEUEmnBFMkQoaE=; b=JxSfYGwBFi9ZREaiZyoWvFmHYWwaTK8g7QEmU7WsT8ZpW+Hq07BZZJLglKgLgjfQY2 6257BKseGqcicgVL3nKH4kC6Ze6xnQ0P68/fXKoocEDHKWWkruuijG2JJIU/Oh1Clerb PfDpuGqaIgVnDu0Ss3+XcMX8BccolIptj7GpNdnm8Bvgotonk23BZ3mZ92B+oazLsoRv PULg2kMw7AnT0mIui1n4xK2dLa5XZcvyoaswMlXlXAZ+B1LjMYgkMTAnDIzgxrCLajhD S/+XJ6SkUv6KW4rMfrux5GZ3qsA+t2wlpLlN5Eh2qu0wIff6i/nD+BR9Fi8jV0vhHQ90 6glQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:message-id:date:user-agent :mime-version:content-language; bh=4mSYbhPH15WuI6szmm8CTZ2n3T2CQJEUEmnBFMkQoaE=; b=BbQ6q63BwnHJ2PXP9SFNwA4KPQYUBxCbnWSblJh0Wadgfa/TeNFYaNkABCzbE+e+Oa HlkGwMMBAdryKJU6li/GkITwfdFdozPhqhF/+GEuBX4BfuvaX6cK1rgvcWHzF8twTE2v a7rrD7syAZLlBkM7K7ai92X5QjfMqhAKCELmz+3LGkhSbGGSUie5/dfte0CY43xCnIqD bkC2Se6UUkWeKIgT3fqbvbfc1JUzxzyGg31FeN5kcDGbk+I1duQqVpUbX55nMf525Soq CcEuwUbORB+59p++doIqQxruqpJ17ITOLuJ/YSlWhvn5vwAf1yEsACDREUNvZg163vel Z3ag== X-Gm-Message-State: AHYfb5jH/JK6dXM9VOb8TxlIPCWx+V5PNCPdE1vVDedMwIlQjzjL0J0C snNNLaH9Q2AeXtrK X-Received: by 10.28.156.17 with SMTP id f17mr396771wme.153.1504043639073; Tue, 29 Aug 2017 14:53:59 -0700 (PDT) Received: from [192.168.0.2] ([176.159.7.188]) by smtp.googlemail.com with ESMTPSA id l80sm77615wrc.8.2017.08.29.14.53.57 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Aug 2017 14:53:58 -0700 (PDT) From: "pkv.stream" To: ffmpeg-devel@ffmpeg.org Message-ID: Date: Tue, 29 Aug 2017 23:53:57 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 Content-Language: fr Subject: [FFmpeg-devel] [PATCH] avformat/mpegts: opus muxing & demuxing expanded X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Hello again (patch attached this time), this patch expands support for mapping_family 255 (and part of 1) for mpegts muxer and demuxer. (Ambisonics family 2 & 3 not covered). See commit commentary. My case use (as an example) is that I needed to broadcast in mpeg-ts with 16 audio channels coming from SDI, corresponding to 16 different languages. Opus supports up to 255 channels but the mpegts muxer and demuxer allowed only up to 8 channels. Thanks for all reviews and opinion. From e0e8edb1173539deb653081209d6b7e4bf94b1c1 Mon Sep 17 00:00:00 2001 From: pkviet Date: Tue, 29 Aug 2017 01:24:12 +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. --- libavcodec/libopusenc.c | 2 +- libavformat/mpegts.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++--- libavformat/mpegtsenc.c | 19 +++++++++++------ 3 files changed, 65 insertions(+), 10 deletions(-) diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c index c40fcde..77d8310 100644 --- a/libavcodec/libopusenc.c +++ b/libavcodec/libopusenc.c @@ -368,7 +368,7 @@ static av_cold int libopus_encode_init(AVCodecContext *avctx) goto fail; } - /* Header includes channel mapping table if and only if mapping family is 0 */ + /* Header includes channel mapping table if and only if mapping family is NOT 0 */ header_size = 19 + (mapping_family == 0 ? 0 : 2 + avctx->channels); avctx->extradata = av_malloc(header_size + AV_INPUT_BUFFER_PADDING_SIZE); if (!avctx->extradata) { diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 4d2f5c6..8c2349b 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,46 @@ 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; + int *extradata = av_malloc((22 + channels) * sizeof(int)); + for (int i = 0; i <= (22+channels); i++) { + if (i < 9) { + extradata[i] = opus_default_extradata[i]; + } + else { + extradata[i] = 0; + } + } + memcpy(st->codecpar->extradata, extradata, sizeof(extradata)); + av_free(extradata); + st->codecpar->extradata[9] = channels; + st->codecpar->extradata[18] = 255; + st->codecpar->extradata[19] = channels; + st->codecpar->extradata[20] = 0; + int *opus_channel_map255 = av_malloc(channels * sizeof(int)); + for (uint8_t i = 0; i < channels; i++) { + opus_channel_map255[i] = i; + } + 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); + } + else { + avpriv_request_sample(fc, "Opus in MPEG-TS - 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 @@ -421,8 +421,8 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) *q++ = 'D'; } if (st->codecpar->codec_id==AV_CODEC_ID_OPUS) { - /* 6 bytes registration descriptor, 4 bytes Opus audio descriptor */ - if (q - data > SECTION_LENGTH - 6 - 4) { + /* 6 bytes registration descriptor, 6 bytes Opus audio descriptor */ + if (q - data > SECTION_LENGTH - 6 - 6) { err = 1; break; } @@ -435,7 +435,7 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) *q++ = 's'; *q++ = 0x7f; /* DVB extension descriptor */ - *q++ = 2; + *q++ = 4; *q++ = 0x80; if (st->codecpar->extradata && st->codecpar->extradata_size >= 19) { @@ -483,9 +483,14 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) *q++ = 0xff; } } else { - /* Unsupported */ - av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping for family %d", st->codecpar->extradata[18]); - *q++ = 0xff; + /* mapping family 255 , set channel_config_code to 0x81 */ + if (st->codecpar->extradata[18] == 255) { + *q++ = 0x81; + } else { + /* Unsupported */ + av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping for family %d", st->codecpar->extradata[18]); + *q++ = 0xff; + } } } else if (st->codecpar->channels <= 2) { /* Assume RTP mapping family */ @@ -495,6 +500,8 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) av_log(s, AV_LOG_ERROR, "Unsupported Opus channel mapping"); *q++ = 0xff; } + *q++ = st->codecpar->extradata[9]; + *q++ = st->codecpar->extradata[18]; } if (lang) {