From patchwork Mon May 7 23:11:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 8856 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp3385258jad; Mon, 7 May 2018 16:12:11 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrO9yT/foo01iQem+1hdkV6qVcro50CkGYwfyofk0I2zMibBrDxe4IQiGPFYPAFgVn6etJa X-Received: by 2002:adf:bd03:: with SMTP id j3-v6mr34152981wrh.138.1525734731049; Mon, 07 May 2018 16:12:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525734731; cv=none; d=google.com; s=arc-20160816; b=FzNirnQBp+llQOUshdhR0M29ZlVCBoQHXxGB6UQxcmDbIXXru4/SIMcP0EGg0j9HdR GojqinLIZ7XVvU+vl7dK0syOQp6r7fT4rwdP7OC4oaLaCQaeWig8dJioqiFE8ZBLRv7s nxRMHC3uQ85pONKYy2k75udQTETiepG/YFeR7LbavGtHSGbNL1wcFGo5gk2f81LA6DZg FB1eQzgR/gTib+slElUda/TM5hgiJNoU3eA6yihu3GW5KB+Y9tTpPD8szQBCf+abMLlL gk+y3eCYf70UbE46+P188dGSzoBZ+bxWOyhYU2xG5HDO2i9HuBMt7Xvc9gYpSSS0KHbw CdXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=6hbxvlmjUZ+f6Qd4dmrPVEGtmbCIPbUROYtpZ6uFIKU=; b=D6968qeLlnMVSsWx5OPWnwMGivk5pCTySJ149NeJglz9YCrucPq2HuDlfyDJX48264 aqMk5IBlorVsslut2d6StRZ8rGgLN0gvrLzpLl0rMBYd+HzBi1Xj2HvhpQEy7K83OjMk F0Verambem6ICyn0GhEK8OY7HroxuPwROqnpHBe+zAr4iErU1MopAeLfq1E9UIK5eItC l/zwTQ5SG0sToIzlZOoHElEV3UtA38HS7sWAvZd9n71Kxcyb05RQC1OWajMbXhQ91aWz Xd2kA42atSkEdMCFOH7AA7bHn6lzRHyOxHr13mH9fsP6h3QFBXVtzAan2dFe8lIxVzvA pbBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=eYgBS6Qp; 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 o5-v6si20984671wrf.105.2018.05.07.16.12.10; Mon, 07 May 2018 16:12:11 -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=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=eYgBS6Qp; 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 95BFB68A5DD; Tue, 8 May 2018 02:11:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f176.google.com (mail-wr0-f176.google.com [209.85.128.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5481568A4C5 for ; Tue, 8 May 2018 02:11:05 +0300 (EEST) Received: by mail-wr0-f176.google.com with SMTP id p5-v6so30323743wre.12 for ; Mon, 07 May 2018 16:11:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=6PBnNlfYrwzxoD79KkSl48A3SLJcAwqKkhlMBuvxKiM=; b=eYgBS6QprP21RnFSy+Vn02de+Bk64PpIQXI26SCWWkGw3nzSnb8UGPMt4+QfYj+w1f AUzNo/7hNr+UjUZhynSnTRNpnuuVZTZwEnoKPqQJuVsjs0HwGgBB7beauByQHGIvxnNn cpBBWSWauUgXR4r3o697+616mNyAI8FPACRW5uH3/GF4/e4cY6mjHbKZ4LJSCd/AoGLi GEFdG5ry+hrqfBZy5vyBoiXkO2RtcvxWs49OX+JWN15mS7Unuv+toXfFRr1kDX9Ipbx+ 2Jry3CQicov5VJ3km6P1vRCXxeww6Z/njPDVhTTHDPH/cgZ2XDwrF2b8dJ3WJmcbop6w oROw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=6PBnNlfYrwzxoD79KkSl48A3SLJcAwqKkhlMBuvxKiM=; b=lovdH1eLnHmdMG+NTde5gU18mEUw/nq+RrucprmuWJyJ+oydqoaD7jMyLiHKwlBXOx WdWXvJmcCFaizR8ueyTlukDQtLwT2FfqaFWqyLtglx8v2iC6GSxjNDzT4q9kyIn6bLEW w1Ho4Hk0qQmGVQu5y2YEaKbM5aHsy+jjyV6vFCk+1Bv/GbGKR0RAUIJiycOzpzn3oV6n v6xLd4bu7Br+yikHWU5ve355iNt7luRloMy+CVUetdpwq9kjaoakpFf36xOSVwwNMXyK VcgDc2V1znO0cmw5OwgJvGJSxblNwqVRr+9mZ5TcFO6AOjI07KzED6+2z87dF/vsQZ4r yRTQ== X-Gm-Message-State: ALQs6tBVv5A6+HGZxkiXOahPtCeZ8ScfMIyLw56wqODzsRjKPKj3TdZM 6xn91l79x+/Kreat5ycC4em64RDQ X-Received: by 2002:adf:8861:: with SMTP id e30-v6mr29939225wre.252.1525734699869; Mon, 07 May 2018 16:11:39 -0700 (PDT) Received: from rywe.jkqxz.net (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id h133sm10179527wmf.47.2018.05.07.16.11.39 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 May 2018 16:11:39 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 May 2018 00:11:29 +0100 Message-Id: <20180507231131.29840-4-sw@jkqxz.net> X-Mailer: git-send-email 2.16.3 In-Reply-To: <20180507231131.29840-1-sw@jkqxz.net> References: <20180507231131.29840-1-sw@jkqxz.net> Subject: [FFmpeg-devel] [PATCH 4/6] cbs_h264: Add support for pan-scan rectangle SEI messages 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- No immediate use for this or the following patch, but they were helpful for SEI testing. libavcodec/cbs_h264.h | 12 ++++++++++++ libavcodec/cbs_h2645.c | 1 + libavcodec/cbs_h264_syntax_template.c | 28 ++++++++++++++++++++++++++++ libavcodec/h264_sei.h | 1 + 4 files changed, 42 insertions(+) diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h index 2219d9da8d..b9536611ef 100644 --- a/libavcodec/cbs_h264.h +++ b/libavcodec/cbs_h264.h @@ -264,6 +264,17 @@ typedef struct H264RawSEIPicTiming { H264RawSEIPicTimestamp timestamp[3]; } H264RawSEIPicTiming; +typedef struct H264RawSEIPanScanRect { + uint32_t pan_scan_rect_id; + uint8_t pan_scan_rect_cancel_flag; + uint8_t pan_scan_cnt_minus1; + int32_t pan_scan_rect_left_offset[3]; + int32_t pan_scan_rect_right_offset[3]; + int32_t pan_scan_rect_top_offset[3]; + int32_t pan_scan_rect_bottom_offset[3]; + uint16_t pan_scan_rect_repetition_period; +} H264RawSEIPanScanRect; + typedef struct H264RawSEIUserDataRegistered { uint8_t itu_t_t35_country_code; uint8_t itu_t_t35_country_code_extension_byte; @@ -301,6 +312,7 @@ typedef struct H264RawSEIPayload { union { H264RawSEIBufferingPeriod buffering_period; H264RawSEIPicTiming pic_timing; + H264RawSEIPanScanRect pan_scan_rect; // H264RawSEIFiller filler -> no fields. H264RawSEIUserDataRegistered user_data_registered; H264RawSEIUserDataUnregistered user_data_unregistered; diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index 64a1a2d1ee..b8194cb3b1 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -424,6 +424,7 @@ static void cbs_h264_free_sei_payload(H264RawSEIPayload *payload) switch (payload->payload_type) { case H264_SEI_TYPE_BUFFERING_PERIOD: case H264_SEI_TYPE_PIC_TIMING: + case H264_SEI_TYPE_PAN_SCAN_RECT: case H264_SEI_TYPE_RECOVERY_POINT: case H264_SEI_TYPE_DISPLAY_ORIENTATION: break; diff --git a/libavcodec/cbs_h264_syntax_template.c b/libavcodec/cbs_h264_syntax_template.c index b789207e33..fb1685e6e6 100644 --- a/libavcodec/cbs_h264_syntax_template.c +++ b/libavcodec/cbs_h264_syntax_template.c @@ -626,6 +626,30 @@ static int FUNC(sei_pic_timing)(CodedBitstreamContext *ctx, RWContext *rw, return 0; } +static int FUNC(sei_pan_scan_rect)(CodedBitstreamContext *ctx, RWContext *rw, + H264RawSEIPanScanRect *current) +{ + int err, i; + + ue(pan_scan_rect_id, 0, UINT32_MAX - 1); + flag(pan_scan_rect_cancel_flag); + + if (!current->pan_scan_rect_cancel_flag) { + ue(pan_scan_cnt_minus1, 0, 2); + + for (i = 0; i <= current->pan_scan_cnt_minus1; i++) { + ses(pan_scan_rect_left_offset[i], INT32_MIN + 1, INT32_MAX, 1, i); + ses(pan_scan_rect_right_offset[i], INT32_MIN + 1, INT32_MAX, 1, i); + ses(pan_scan_rect_top_offset[i], INT32_MIN + 1, INT32_MAX, 1, i); + ses(pan_scan_rect_bottom_offset[i], INT32_MIN + 1, INT32_MAX, 1, i); + } + + ue(pan_scan_rect_repetition_period, 0, 16384); + } + + return 0; +} + static int FUNC(sei_user_data_registered)(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEIUserDataRegistered *current, uint32_t *payload_size) @@ -737,6 +761,10 @@ static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw, CHECK(FUNC(sei_pic_timing) (ctx, rw, ¤t->payload.pic_timing)); break; + case H264_SEI_TYPE_PAN_SCAN_RECT: + CHECK(FUNC(sei_pan_scan_rect) + (ctx, rw, ¤t->payload.pan_scan_rect)); + break; case H264_SEI_TYPE_FILLER_PAYLOAD: { for (i = 0; i < current->payload_size; i++) diff --git a/libavcodec/h264_sei.h b/libavcodec/h264_sei.h index 9488382b9f..6455f3cec5 100644 --- a/libavcodec/h264_sei.h +++ b/libavcodec/h264_sei.h @@ -27,6 +27,7 @@ typedef enum { H264_SEI_TYPE_BUFFERING_PERIOD = 0, ///< buffering period (H.264, D.1.1) H264_SEI_TYPE_PIC_TIMING = 1, ///< picture timing + H264_SEI_TYPE_PAN_SCAN_RECT = 2, ///< pan-scan rectangle H264_SEI_TYPE_FILLER_PAYLOAD = 3, ///< filler data H264_SEI_TYPE_USER_DATA_REGISTERED = 4, ///< registered user data as specified by Rec. ITU-T T.35 H264_SEI_TYPE_USER_DATA_UNREGISTERED = 5, ///< unregistered user data