From patchwork Wed Nov 1 17:49:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Breeden, Joshua" X-Patchwork-Id: 5817 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp1057645jah; Wed, 1 Nov 2017 10:50:00 -0700 (PDT) X-Google-Smtp-Source: ABhQp+SDrMp1Bk9R3Ht+G3xCuGnAmDzXc9DzYyutET8DFMgSffLOKAkztaUoDSX5zBWVzEmgKnqu X-Received: by 10.28.157.83 with SMTP id g80mr879147wme.9.1509558600160; Wed, 01 Nov 2017 10:50:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509558600; cv=none; d=google.com; s=arc-20160816; b=JtqqTrLi7HIoCLKYXYs1AHKtpHbaMUvyJDN3ChwjSCEWyfc3f0bDD7XRD/XC8G5QUl jaZrpL60UI0Ew014BROgTFV2YdqcH/swcAD8HgnlUzHxE3UX2CPu/5KFZAN7XuiNHx5o PhzIlfMttpOXdtEDKtQ3aJkZj5JKKVDEG9dD7YXzoCtMX5+H9j1yh8kdB2+1DMmXSO39 OzI3TCe2MFbdhzZ6ciTgenZBpGWHSqfP7bETpwMPMLF/C+YevIyq6xJ3gXsNWSYpL4Bb k4ZmbuFcnbopUCHPPoPhGBzofKX6fkD2ivM8vf4wz0AeJDhVaqfYqlioGffjFAMEniJ0 UoXw== 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 :mime-version:content-language:accept-language:in-reply-to :references:message-id:date:thread-index:thread-topic:to:from :dkim-signature:delivered-to:arc-authentication-results; bh=B55L9WGjf2yqScTJwUux1jDrbJwV2STd5YwFGYCx4Os=; b=o5eiWJfTEoqbBaO7QcSj/Sjah9DOTt9FAC9P/7Oza8lTiol7Af3LfWWNI+b62D2Xu6 GT2hXvmc2VfpoivUkHgRrQR/0yZX3z3DfT4QeCVJbqf77BuA6gNalfZK2TbgnNStiHUz oQWJCLOM+kBHOCL3tHVEvOvWtWwC4MMqcT5gNrhBX9zXBFg1PDi/f2CC9ljb8Cfft9zS 23EhIkIstE5oFEq2ojsnoAWtzGBTC09Uhf1Mg8hJ9LdZlnKz2bvE3k8oDo1lSUFNv6n/ akrUmtEGI5lg18H92H6RZFLjw2rScS5qmAmpBJPUPXVWfG+WUIbw3PJxoDcvu4qXRjHn 52oA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@harris.com header.s=key1 header.b=Jr9hdT+9; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id r13si1165449wmf.217.2017.11.01.10.49.59; Wed, 01 Nov 2017 10:50:00 -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=@harris.com header.s=key1 header.b=Jr9hdT+9; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C0F9968A144; Wed, 1 Nov 2017 19:49:47 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mlbxsmtp02.harris.com (mlbxsmtpout02.harris.com [192.52.234.93]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 30D486806C4 for ; Wed, 1 Nov 2017 19:49:41 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; d=harris.com; s=key1; c=relaxed/simple; q=dns/txt; i=@harris.com; t=1509558590; h=From:Sender:Reply-To:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=mCtB5y13SlyP67DPVYVjyboHpfL0xoY/TmTZ+YX76Zo=; b=Jr9hdT+9cK8jBt3I6bMo9xcdT3rHTPSdP3nPoI5+OHu9pSx816M5XdqdCeFBzjPd gTBhKHkttd3LQ77ybYs1Kkdimk6+37fnTS9gYb8upF0xAWNHAWrAMeLNgQ5KvQzs RiuIXqKMjtxBxd5Ku71uhnxsFvFf9bhhk1guDJs2/emSOswzIF6SMs6AG2shZi2O uJP+dchLf0k2nHO9ykfqFhEse3RvjCQHkqBj92RESucW3LdqLCwFLKMLqBt+ulRx Ug/UbgoMhxYqHqzNWgQxgmo/FaV4sLYk+KkoPoHX5D0MJTLy3b90EcLucfYayty9 Vpf61pj6OPSuO9eChlZfCA==; X-AuditID: c034ea5c-6a7ff70000001488-7b-59fa093ef66f Received: from MLBXCH17.cs.myharris.net ( [10.64.224.135]) (using TLS with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (Client did not present a certificate) by mlbxsmtp02.harris.com (mail) with SMTP id F3.9F.05256.E390AF95; Wed, 1 Nov 2017 13:49:50 -0400 (EDT) Received: from MLBXCH15.cs.myharris.net (10.64.224.133) by MLBXCH17.cs.myharris.net (10.64.224.135) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Wed, 1 Nov 2017 13:49:49 -0400 Received: from MLBXCH15.cs.myharris.net ([10.64.224.133]) by MLBXCH15.cs.myharris.net ([10.64.224.133]) with mapi id 15.00.1347.000; Wed, 1 Nov 2017 13:49:49 -0400 From: "Breeden, Joshua" To: FFmpeg development discussions and patches Thread-Topic: [FFmpeg-devel] Support for h264/SVC over RTP and SVC base layer decoding in h264 Thread-Index: AQHTUnkinI8mFmw0jE+8SLrq04m+0KL+9nwAgACZN1CAAGKcgP//2jpH Date: Wed, 1 Nov 2017 17:49:48 +0000 Message-ID: <1509558649378.6548@harris.com> References: <1509476048958.76834@harris.com> <1509549588675.6675@harris.com>, In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.64.248.69] MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrFIsWRmVeSWpSXmKPExsXC5fCgXdeO81ekwdlXYhbfPp1hdmD0+LNo M0sAYxSXTUpqTmZZapG+XQJXxpJpG5gLzoZV9N7fzd7AuCq4i5GDQ0LARKJtfVEXIxeHkEA/ k8TOc4+ZIJztjBKzf3azQDjLGSU231/N2sXIycEmoCuxeskZRhBbRMBDYtfVOWwgtrBAvMTu o9+ZIeIJEge6T7NB2G4SyxffAatnEVCROP/gAVgNr4C2xLYXl9kgFtxilLhw5RY7SIJTIFBi 2dk+MJtRQEzi+6k1TCA2s4C4xK0n88FsCQERiYcXIRZICIhKvHz8jxXCNpDYunQfC8RrChLf fziDmMwCXhIfN4RCrBWUODnzCcsERtFZSIbOQqiahaQKokRP4sbUKWwQtrbEsoWvmSHseInv c7awQbT6Syw9KjwL6BdmgZuMEmtOPGWEqFGUmNL9kB3CTpL4P+8tVG+QxPHPSxkhGu4wSrz4 Oo8NWcMCRt5VjKK5OUkVxbklBQZGehmJRUWZxXrJ+bmbGIGxfsDkVcwOxpWv7A8xCnAwKvHw 8jD/ihRiTSwrrsw9xKgCNOfRhtUXGKVY8vLzUpVEeM+d+RkpxJuSWFmVWpQfX1Sak1p8iFGa g0VJnNf8CVBKID2xJDU7NbUgtQgmy8TBKdXAOFenvPtrT+fi6f99mCdcfGh19c5Ulncs6hd+ lZ7vVjz38e8PJhHRvoLSnMOBG/v2Nosv8Og7r7ZrWtLmNezP721junAnIkSKgc0qbKv2pNDg HcwX+Dl/7Z6a8rSi+3BY0ZVHbrccrBpCJtryGDYuqzh64PxLNe4MFraXD5SOH7r04Mrq7cGa 2kosxRmJhlrMRcWJALOetV79AgAA Subject: Re: [FFmpeg-devel] Support for h264/SVC over RTP and SVC base layer decoding in h264 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" > No but I wonder if the variables "y" and "t" can have more useful names > (that may or may not make the comment unneeded), I've made the variable names more self-explanatory and condensed the comments > Please do not remove the empty line. And fixed this as well. Thanks, Joshua Breeden From a592febfab5d5a7c534f6d21a42bf23289ff3ffa Mon Sep 17 00:00:00 2001 From: Joshua Breeden Date: Wed, 1 Nov 2017 13:39:54 -0400 Subject: [PATCH 2/2] Add support for non-interleaved H.264 SVC over RTP --- Changelog | 1 + libavformat/rtpdec.c | 1 + libavformat/rtpdec_formats.h | 1 + libavformat/rtpdec_h264.c | 79 +++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 8c45b2946d..4e816bffd4 100644 --- a/Changelog +++ b/Changelog @@ -7,6 +7,7 @@ version : requires 2.1 (or later) and pkg-config. - VDA dropped (use VideoToolbox instead) - MagicYUV encoder +- RTP depacketization of non-interleaved H.264/SVC (RFC 6190) version 3.4: diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c index 4acb1ca629..1c5814749a 100644 --- a/libavformat/rtpdec.c +++ b/libavformat/rtpdec.c @@ -96,6 +96,7 @@ void ff_register_rtp_dynamic_payload_handlers(void) ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler); ff_register_dynamic_payload_handler(&ff_h263_rfc2190_dynamic_handler); ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler); + ff_register_dynamic_payload_handler(&ff_h264_svc_dynamic_handler); ff_register_dynamic_payload_handler(&ff_hevc_dynamic_handler); ff_register_dynamic_payload_handler(&ff_ilbc_dynamic_handler); ff_register_dynamic_payload_handler(&ff_jpeg_dynamic_handler); diff --git a/libavformat/rtpdec_formats.h b/libavformat/rtpdec_formats.h index a436c9d62c..b67d1e338f 100644 --- a/libavformat/rtpdec_formats.h +++ b/libavformat/rtpdec_formats.h @@ -64,6 +64,7 @@ extern RTPDynamicProtocolHandler ff_h263_1998_dynamic_handler; extern RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler; extern RTPDynamicProtocolHandler ff_h263_rfc2190_dynamic_handler; extern RTPDynamicProtocolHandler ff_h264_dynamic_handler; +extern RTPDynamicProtocolHandler ff_h264_svc_dynamic_handler; extern RTPDynamicProtocolHandler ff_hevc_dynamic_handler; extern RTPDynamicProtocolHandler ff_ilbc_dynamic_handler; extern RTPDynamicProtocolHandler ff_jpeg_dynamic_handler; diff --git a/libavformat/rtpdec_h264.c b/libavformat/rtpdec_h264.c index 6f8148ab6d..25b67f3571 100644 --- a/libavformat/rtpdec_h264.c +++ b/libavformat/rtpdec_h264.c @@ -308,6 +308,68 @@ static int h264_handle_packet_fu_a(AVFormatContext *ctx, PayloadContext *data, A return ff_h264_handle_frag_packet(pkt, buf, len, start_bit, &nal, 1); } +static int h264_handle_packet_pacsi(AVFormatContext *ctx, PayloadContext *data, AVPacket *pkt, + const uint8_t *buf, int len, + int *nal_counters, int nal_mask) +{ + uint8_t *dst = NULL; + const uint8_t *src = buf; + int src_len = len; + int total_length = 0; + int ret; + int tl0_pic_idx_bytes, donc_bytes; + int opt_offset; + + if (len < 5) + return AVERROR_INVALIDDATA; + + src += 4; + src_len -= 4; + + tl0_pic_idx_bytes = 3 * ((src[0] >> 6) & 1); + donc_bytes = 2 * ((src[0] >> 5) & 1); + + opt_offset = tl0_pic_idx_bytes + donc_bytes + 1; + src += opt_offset; + src_len -= opt_offset; + + // calculate size of NALs plus start codes + while (src_len > 2) { + uint16_t nal_size = AV_RB16(src); + + total_length += sizeof(start_sequence) + nal_size; + src += 2 + nal_size; + src_len -= 2 + nal_size; + } + + // create packet to hold NALs + if ((ret = av_new_packet(pkt, total_length)) < 0) + return ret; + dst = pkt->data; + src = buf + 4 + opt_offset; + src_len = len - 4 - opt_offset; + + // copy NALs with start codes + while (src_len > 2) { + uint16_t nal_size = AV_RB16(src); + src += 2; + src_len -= 2; + + memcpy(dst, start_sequence, sizeof(start_sequence)); + dst += sizeof(start_sequence); + memcpy(dst, src, nal_size); + if (nal_counters) + nal_counters[(*src) & nal_mask]++; + dst += nal_size; + + // eat what we handled + src += nal_size; + src_len -= nal_size; + } + + return 0; +} + // return 0 on packet, no more left, 1 on packet, 1 on partial packet static int h264_handle_packet(AVFormatContext *ctx, PayloadContext *data, AVStream *st, AVPacket *pkt, uint32_t *timestamp, @@ -360,7 +422,11 @@ static int h264_handle_packet(AVFormatContext *ctx, PayloadContext *data, NAL_COUNTERS, NAL_MASK); break; - case 30: // undefined + case 30: // PACSI (Annex G - SVC) + result = h264_handle_packet_pacsi(ctx, data, pkt, buf, len, + NAL_COUNTERS, NAL_MASK); + break; + case 31: // undefined default: av_log(ctx, AV_LOG_ERROR, "Undefined type (%d)\n", type); @@ -418,3 +484,14 @@ RTPDynamicProtocolHandler ff_h264_dynamic_handler = { .close = h264_close_context, .parse_packet = h264_handle_packet, }; + +RTPDynamicProtocolHandler ff_h264_svc_dynamic_handler = { + .enc_name = "H264-SVC", + .codec_type = AVMEDIA_TYPE_VIDEO, + .codec_id = AV_CODEC_ID_H264, + .need_parsing = AVSTREAM_PARSE_FULL, + .priv_data_size = sizeof(PayloadContext), + .parse_sdp_a_line = parse_h264_sdp_line, + .close = h264_close_context, + .parse_packet = h264_handle_packet, +}; -- 2.11.0