From patchwork Thu Aug 31 23:10:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "pkv.stream" X-Patchwork-Id: 4930 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.15.201 with SMTP id 70csp104100jao; Thu, 31 Aug 2017 16:11:05 -0700 (PDT) X-Received: by 10.28.155.11 with SMTP id d11mr1358970wme.4.1504221064916; Thu, 31 Aug 2017 16:11:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504221064; cv=none; d=google.com; s=arc-20160816; b=vsWNKCQgA6Pm49b1i4WLzQcGh9DUoN4tIrxh88i4kHiROwY81pSAbINiOxZlcfPURw KbebqEDtrkwAKFPTVx4J1lShgI1BkiMaJ8JKFTZr+G6ixYme9cdBL/+h1vmUjLAXvOgL xr1fV6NGk/dvkB+Sk21ZPCvzxRSrlRsJmwmzLhB3se5ko0RjAexbVegrxDisvxByd02H 4jDpp0vAh6b//VMnyKm5s3uPN5lTMFjVakvIsiyvAdP7wz2VNw+5D6oPWlkbAlRGo6kh Qkiwmtu72TjQnfR/EnQTTCFPZgxiI7bmcbzQ8rWlb84YLuIj267+LabTY5wKv0HbhAXY 5Jtw== 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:in-reply-to:mime-version:user-agent:date :message-id:from:references:to:dkim-signature:delivered-to :arc-authentication-results; bh=+2OGpg8rhben3/ey+gRW08Q4s2hQ0VSISmJEW3YvaLE=; b=xmkGbmG1bwIAc/ArcoLEyZYb1T33DQZKgxY6iMwV2aQTTw0HWFbyEJl6pY1fR2PpA5 s+n+/D422Mjl5jB4UGvJP9pnaP5Gt8tkIab+oPP9GVrIgQl56BA6+0ZlEwpHzvkmgis6 IPc9A3OiSUpJg9RxEPnFbcOrsrP0VEKSmzqMh+2hdwqp57R51n+QsvvNdBV8r/HQcywg Ati553BLUG+vNUl0uunPBEMBNTvQPsOJz+duuOanSRqCDwUzNdEaEwd3zCeVsM769o9c rKACQsVQJ2XoX5u4dY5/KhnSYN/zyNP3NLFK7XrpxmWYvEKVnb2nyAGtCM+OSwTwl3xF tykg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=skDn9JTR; 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 e16si32810wrc.289.2017.08.31.16.11.04; Thu, 31 Aug 2017 16:11:04 -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=skDn9JTR; 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 0F3EB68A24A; Fri, 1 Sep 2017 02:11:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f171.google.com (mail-wr0-f171.google.com [209.85.128.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3EE4D68A180 for ; Fri, 1 Sep 2017 02:10:53 +0300 (EEST) Received: by mail-wr0-f171.google.com with SMTP id k9so2475758wre.4 for ; Thu, 31 Aug 2017 16:10:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language; bh=ZPF4AIfjX8LUXtzHjXgMVez2PgvsmYsUBjuhWJ0w7ms=; b=skDn9JTRoOf/d9suh9K+B21/ZdIooBgok2tLugWTt1ow6B6OfdMh+ldLZbAkRNU7iO Vxz/C2cKu+N1QKx8fSkuGrT+rjsIbZO5fSmbT7lEvNUZS8zP59ca+fCmZ7mp5cmpUw3N NZmqmm7uWcpEmu/YC+WUQob+pgKNAk70vpn7l8w+wuy1gBN21h+ChbhE2XUehL42qVJ+ nhX9hnc+OgCn5P6Owrw4SPXtD3cBRMTEJ83YvNkPLURNvFBo71vr6Pf6cE+jYN/39oSR a76DAxkcW0M6deReQ9hdZlxI/FQBZ9NoeyiM1lkYX8sea14mlzXYRJUb9aDsOvBMAlyl r+pA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=ZPF4AIfjX8LUXtzHjXgMVez2PgvsmYsUBjuhWJ0w7ms=; b=dxLSCRCPbLX0VLYQD3CLLld2iqFd2u0Hi1TYxaduJG3BMTNtijDMoR7JnXrlv3hGWp y4Zc+9Skhs/DmnGqC8UVDPqwmebVPQj8tinfB6YNWz3CwGRdgkQuFlkjrmXRFR4/uID2 txA7OZgJw0vE7AAirC2JxAJzkx031fsh0GPazVRqW9+vxTdsOO2/y+W6DoR26JToSHug 0agk9Enh6G8CazlSnKEOdagndF0gIWIPHWzqfLkHDasoAmpkOZR5rBACdJEXpsJnNxX6 GJAfofAhyBLJ4MEmHOOC6DMMAr9cxNjfVqpIBJRUXNeWk5QGFMu9vUwKhlqoW0pWUyc7 XGeQ== X-Gm-Message-State: AHPjjUh6M4SoeSYS1xfAoYzCreJWmYzlwdSD6Dsl1ZSVrts1rtombxwo Pjvic425BmGQjYPr X-Google-Smtp-Source: ADKCNb6V4Bz17yqe+YE4HhQOFWhN01fWnMELdYZ+Qy4UhZZmZUkWdPoEiKnei0uQDxftKX7cIwuohQ== X-Received: by 10.223.133.173 with SMTP id 42mr30297wrt.74.1504221053473; Thu, 31 Aug 2017 16:10:53 -0700 (PDT) Received: from [192.168.0.2] ([176.159.7.188]) by smtp.googlemail.com with ESMTPSA id u15sm917371wrg.31.2017.08.31.16.10.52 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 31 Aug 2017 16:10:52 -0700 (PDT) To: ffmpeg-devel@ffmpeg.org References: <20170831194719.GF7094@nb4> From: "pkv.stream" Message-ID: <83050d58-a87e-3d91-cf7a-3158a13ad7fc@gmail.com> Date: Fri, 1 Sep 2017 01:10:49 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <20170831194719.GF7094@nb4> Content-Language: fr X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] [PATCH 1/2] 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 per Michael requests: 1) I have split patch in 2 2) added malloc checks 3) changed  "for int" loop to C89 style (if I understood well the comment) regards >> libavcodec/libopusenc.c | 2 - >> libavformat/mpegts.c | 54 +++++++++++++++++++++++++++++++++++++++++++++--- >> libavformat/mpegtsenc.c | 19 +++++++++++----- >> 3 files changed, 65 insertions(+), 10 deletions(-) >> ad6985f34e120426fb3d34f916d7984b75d32fd3 0001-avformat-mpegts-opus-muxing-demuxing-expanded.patch >> 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) { > This apears unrelated and should thus be in a seperate patch > > > >> 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; >> + } >> + } > This is missing malloc failure checks, also the "for (int i" syntax is > something we avoid due to some at least past portability issues. > > [...] > > > > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel From 1f8958e5759646609080f8002c9063b8921be855 Mon Sep 17 00:00:00 2001 From: pkviet Date: Tue, 29 Aug 2017 01:24:12 +0200 Subject: [PATCH 1/2] 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 | 61 ++++++++++++++++++++++++++++++++++++++++++++++--- libavformat/mpegtsenc.c | 19 ++++++++++----- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 4d2f5c6..29e060d 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,53 @@ 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 = (22 + channels) * sizeof(uint8_t); + uint8_t *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 = 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) {