From patchwork Thu Sep 7 23:46:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "pkv.stream" X-Patchwork-Id: 5052 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.15.201 with SMTP id 70csp780460jao; Thu, 7 Sep 2017 16:46:52 -0700 (PDT) X-Received: by 10.28.130.131 with SMTP id e125mr383327wmd.125.1504828011946; Thu, 07 Sep 2017 16:46:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504828011; cv=none; d=google.com; s=arc-20160816; b=o9s56rlx53QbWwrIIjWHuZQaf1J9FUUyei74CkainfCUGapTGtvjQaZXIvckrDDB40 BErlqiwoJYUi7XBXHddBt71ZSjyyy3tsEm7xKgoigNemC14QSsaprtNCqyz/DF6RJWfZ G7r0Ft382YsTMitFSGOdG/C1GwdCyvYBV4H3lPnk6ZjO2mheXmgSwmVlI3RmryBaWsbK +MfyAYI5tZDz/HbJcx+8QRJbRjt9ggjTDHFiiCYGb5cWnHLEMgRdOxEkIo4QVJwyUXh8 s2RulNz2ckKv9mGHizjszLRJfT5/yGBA81z4xEWdfVyyUviuTa+/q8OgJlYY4DKmFb3m RPsQ== 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:from:to :dkim-signature:delivered-to:arc-authentication-results; bh=7qSQmex5RuZfbShpuARZ0jfnAthEX/lRZ93+d8hlWQU=; b=ZihHKdrdnUcoNX+nWkGgGIXq4szQWa/yIJIx46udTivi+QwSHTDeB4g2Lxdg2P0LiH VvIb3IDZ1f0/9QUkyUqysOdArByeV7/AswDP0mYWJpUMmgQQSv+vLdsrG114l+ifaIXq dnyoQc/2vPmBHHP8AHOvKrjS+L3gsVqYzNcbFilpwXXYd2/D+WrHxBNikubKEkqMBi2V 7zPCjB0zPA/f3MrernREHsShA1R30XDurMk52FesYRGj2BB+G2sTTFiAS/UeMUnbW7Vz O66uhn7zweRL6gCS8sbZYtJ3QVv8dB0fsk0iU+5g1N6sDJMi8tzJL1VwaJcTy2KJkdNF hCNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=giMYo9Wp; 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 q143si305510wmb.195.2017.09.07.16.46.51; Thu, 07 Sep 2017 16:46:51 -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=giMYo9Wp; 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 F354A689E46; Fri, 8 Sep 2017 02:46:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f47.google.com (mail-wm0-f47.google.com [74.125.82.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EEC82689DE4 for ; Fri, 8 Sep 2017 02:46:42 +0300 (EEST) Received: by mail-wm0-f47.google.com with SMTP id 137so2270978wmj.1 for ; Thu, 07 Sep 2017 16:46:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version :content-language; bh=myMGEj0o9jhIGbSv3ekl2Bype7WFb+Oe83AKzvIE4+M=; b=giMYo9Wps5m0kLrMfiFUwsn3f2ngPMNBU1GgTwl4v2zWiR84tQrpolxiSI1nhCH4QU vJBd8bul5AnUX0IFwMAk1wxQ6G7nemYpWjbjwZhwB5fj78OSUUI7V73k2/kgEJunNK8H wVmsEosq/di1A1O14cSUeTkbk4zXyTQTS+dCOExz8AxXCUJlrj8naAHMvzTj7lRosoF4 rBH2kWehTk/G1bPA/ohxXsRxcra3D7ZegjXdPKnEALNfhslDdtpwFhM+MQ5P1BPNZms1 i6vnvWx3ri3dcVFVPWSqVs9cHjA8R+DHKSC4nqp2wQDb6V24WznhmcLWget4N8Mod8rk K6kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-language; bh=myMGEj0o9jhIGbSv3ekl2Bype7WFb+Oe83AKzvIE4+M=; b=UsKQ1FObLkaIcAnL+c542f3IIeWXFaZTU20HtG1RPJr5Ime5lSMQARPP3f4Iv6+Nie QrrQudUTR8PnsWV+enMIovOAFtTanUYA/x9S3Kg0SWm3JnyhmHkHaY1Rz97JKXFyYcHj YXDUw8FyjaUh3bkL0imSaFUAb8u/3xRzsosUPP37bfAIIf75XEacyeCunnkRXuwA4O9a 0GSzKFJw9bamzAOm7RK0InogERf8BptIoFCyeJYfGIDEiukkxGVTiyeIRljZ5b2qez0C yUKCHukbftQP26Koz+uWzzvYVKfYeyYtE6mGAkQ7uWRMjN4rC821KJZu9xdXS2qEkLsm SRWQ== X-Gm-Message-State: AHPjjUjB3p7gcOoQBp0uqXfs0r4vvVPfS0e7siOJEsxzKt1BYfEpoYwH w9bvnFBdr3hWy197 X-Google-Smtp-Source: AOwi7QBuAaMP46wEyRqBJsd2pBAZQlZb36flfTKDVOBS+PxxkL8uCU4KtvxW9VV/k+m2kvJq0bDEiw== X-Received: by 10.28.66.65 with SMTP id p62mr307291wma.159.1504828005879; Thu, 07 Sep 2017 16:46:45 -0700 (PDT) Received: from [192.168.0.2] ([176.159.7.188]) by smtp.googlemail.com with ESMTPSA id b89sm960299wrd.42.2017.09.07.16.46.40 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Sep 2017 16:46:43 -0700 (PDT) To: ffmpeg-devel@ffmpeg.org From: "pkv.stream" Message-ID: <103114c7-8ba7-d798-6353-83d346990995@gmail.com> Date: Fri, 8 Sep 2017 01:46:38 +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] [PATCHv3] avformat/mpegts: opus muxing & demuxing for mapping family 255 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" Hi, I've removed inline declarations in the patch since they're not accepted in ffmpeg. Thanks for any more comments or reviews. Regards From d05c62039b3edfd151b8c3824cc8f509f9ea8053 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. --- 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..fd2857c 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; + extradata = av_malloc(extradata_size); + if (!extradata) + return AVERROR(ENOMEM); + for (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; + 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); + } + 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) {