From patchwork Sun May 3 22:05:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19456 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 2BFE044B674 for ; Mon, 4 May 2020 01:06:00 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0B0B868BFA7; Mon, 4 May 2020 01:06:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1EE4168BD3D for ; Mon, 4 May 2020 01:05:53 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id v4so14147273wme.1 for ; Sun, 03 May 2020 15:05:53 -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:mime-version :content-transfer-encoding; bh=qbG87fybNTONdo5exnkc7kbVt5mfU4/AIHxfY1NM5og=; b=x9iBffU8krxdJH4v7cUvh8vA5kJg+T7OIAQwko2cF/B8nQgl5vruYBE+/hislOAIxy knMDpssh+aG++yST9bFuCOlyIg0wJpsRCnzlj8q4g2YXOIlX9ZyW0wskp5TLi9uSENLb YBYnWojNfjyinefVtTBdq/k6Oik27KXNhN+wke0AmmZV5nlL0fMxVOofXAwTrKOYwJAI 9xPPbw3t85yGXrNWrRaiqZarInSavq+7hbqbO/hwjKb6XK0rPCluD7Blgjtgu8zPbXqB UUOHKUjff6Te9h1netKXRtVlPTu880/kkhEQ/WFURrK5SN/FUEuoVAe+bQKFAOCEOj/3 b0ew== 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:mime-version :content-transfer-encoding; bh=qbG87fybNTONdo5exnkc7kbVt5mfU4/AIHxfY1NM5og=; b=hfpn+XiV7zu/yJvRsatPddO+Ll9Ed2KxPpBjdfzBO85L8L2nTVcmV6x13sseuIffUw Kt8MLkdeXmgaJxbEkKdvfedTLavx/pz19Lr4n7P3FqpNo4blUqcxQaH4PeddIuNk/APw 5OQOpvoSdRPhmQ9ctBXUWbnxoAsqbBGwzbjxWkeBOsFng3G1bc8h13br95hAHiojNni9 D9K15gO7+2HcWX5p2yE2mxrvOyGwhJ0EP+wSBBwLlC2c8EhHYEufxvTg4l3TbMY+qBA1 pt6PsGGHkt/sEoDHVhaDxIpb4JWPlExQSORZW64zNFNTnNuVAxc1YMb93Bq5RdZwF/4B fszg== X-Gm-Message-State: AGi0Pub/AINAilVWRkH5Mmf2phmrH9oCF1Omb9+g0CqOYxTrYqWFbgsh cDRwTWtaUfW6lB4gHwB0Vd4xBfsrqak= X-Google-Smtp-Source: APiQypJM8uNiOMxkprFaQ+L2DMN0erLq5qrlaqr3C6w1xcVBNFVJ1h2GusZhz2B298WXDF2/VBfh4w== X-Received: by 2002:a7b:c642:: with SMTP id q2mr11585433wmk.41.1588543552104; Sun, 03 May 2020 15:05:52 -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 a24sm10307285wmb.24.2020.05.03.15.05.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:51 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:27 +0100 Message-Id: <20200503220548.23543-1-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 01/22] cbs: Mention all codecs in unit type comment 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" --- libavcodec/cbs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h index 9ca1fbd609..cb3081e2c6 100644 --- a/libavcodec/cbs.h +++ b/libavcodec/cbs.h @@ -45,8 +45,10 @@ struct CodedBitstreamType; /** * The codec-specific type of a bitstream unit. * + * AV1: obu_type * H.264 / AVC: nal_unit_type * H.265 / HEVC: nal_unit_type + * JPEG: marker value (without 0xff prefix) * MPEG-2: start code value (without prefix) * VP9: unused, set to zero (every unit is a frame) */ From patchwork Sun May 3 22:05:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19486 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:3c87:0:0:0:0:0 with SMTP id j129csp3060489yba; Sun, 3 May 2020 15:06:15 -0700 (PDT) X-Google-Smtp-Source: APiQypJYgZxn8AaDsIUf7CrMUBtQf74CvaUNqwEAUB6TWWrJeGyMRDXL/TBXiTRj5GxQwEl3TdQa X-Received: by 2002:a1c:1f8e:: with SMTP id f136mr10876730wmf.166.1588543575591; Sun, 03 May 2020 15:06:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588543575; cv=none; d=google.com; s=arc-20160816; b=tSdMIuRl5C/JqB17WWhvRw/CmNyjOUY0GmNma67GOuvEX+ljN9gyuFX6vIuu1sRPVF z6zipbz4wVqv193j4cE36PxIb+iZYwCK99dZAtT39E7NTSbKermS2UJH8E3QDGHD57cr uCLkQgJ8eEYtP30Id/3Dw5yuNJjEtSD4UdZua2PYwDESfbMX/WCBH3RopYiKCTAx1Ylp 6v8EDp53G25n8Vhor9vhVMGdJm6DSg87nUvTT7q9ps+7+c+ZzyWwOmXEEyCjqF+e1AMK R2gZZugB2GFs1/U+x0IAfvtvmOG1Omv3TINmI//tnMwg0dJfUxOM9elnAqjevs5Mz3cc U/fg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=Wq6KrruQLcaeFE5boNjR/cbnGvckY++lJfzfV7LGYzU=; b=HVyKscKTN45UzamTNVtwx+0iGtjLl8ofId/qLpzoMjugp2v62R1inGNITAb9ps945c /NmfhrYZ186Kc4gdnqsJoYTbvx8qwCVBanT5au7FM4SGsLmwPtASACN8XprPbgFQ1Hv+ mlj036ikpQ2gS8bRVvwGyPfM1c2jlEuDLL8t8gPk5NyGGE5L1IcMs093RTxWWDamUvun uFwMo7lpEJ5+3O+hHQrKUVyuxfD4V51u+W7NJj2Bx2VGtSJ33Tz6a2oO71DS1kOBKBTY EMQStzB1QjyG9SOaSMopU0I0xgvyXYSnpFXkutWSBb0Rk06xCTQLC8zN8OQmPusKMxaY 27iQ== 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=tulH8RzW; 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 l23si5849914wme.88.2020.05.03.15.06.14; Sun, 03 May 2020 15:06:15 -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=tulH8RzW; 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 9F81468C071; Mon, 4 May 2020 01:06:01 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DF1F068BD3D for ; Mon, 4 May 2020 01:05:53 +0300 (EEST) Received: by mail-wm1-f41.google.com with SMTP id g12so6670704wmh.3 for ; Sun, 03 May 2020 15:05:53 -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:mime-version :content-transfer-encoding; bh=t+vu1XH0oOfsoXiS64/Cw0y1bardXyu599syp/ha150=; b=tulH8RzW+2riQppE4j6bsSiKpCmpUM4+KTnM0qX5SIyvGFmJnQgf23qzk0emIh6fim s9mgdiscziz276DtI/1Hj0Y/WxUS63iQ26TLgnLjEN1A3nIQxcx3Rf+OJzH/pIdEcMee UuhygUGsmVzTvcMoXFZw87DeS7iKgb3BAFWYwJcjKHb0/hg2qid7X7nI5VZwY9TEK7h2 lz9385nrjIBZNqu1HXTlq6HGxH7BOrkiJUXZsd1GbNNobwJHCay292vovPKAtosK3qtt FCNUxVI4MJ97aoyw7PYp9tk/RWifAcJkJgbe9scR4hQ94qgOA/9o4yrFzK4/MaSR1tGh rZhw== 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:mime-version:content-transfer-encoding; bh=t+vu1XH0oOfsoXiS64/Cw0y1bardXyu599syp/ha150=; b=hKDfNUldHWzEwGG4NDp0RInDjkc9BI+4rkOjeZRZRoi+JeKJtBOfe4KVVM9VWW7GOj roU+dbPefYLPRXGxFQfvJRaDquveK17PysIiV4jmPE7nviFTecwtfWZ2yD7IRMPbx5pS lJ4O3zs2D4zdGhlf8fmBSEAjsSYxreYgNu0YoacC2VmJrxe7HkjLD0RWiHm8G5HpCuBq y1HngID+9RdR7kCSfcGWmO7xgkgnzmQspB3mBGIO02eXvvZhyZ9L3ci0yqPix6zrUo+2 CyR8o+jg7Uv1nh2PdHdL1gV7Sqwlb5TnFGen8zEe46xLS2juLR7ury9PWcAwTl7cUNUV Mnxw== X-Gm-Message-State: AGi0PubeW+4xTNgdmU7l3WYFMRM4O9vSb8tyVv+xGfjW4PFGFONM+bpW oK2dlc1+ZpWH8EyNmUDG92bVRfEF7WQ= X-Received: by 2002:a7b:c7d6:: with SMTP id z22mr11817535wmk.73.1588543552950; Sun, 03 May 2020 15:05:52 -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 a24sm10307285wmb.24.2020.05.03.15.05.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:52 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:28 +0100 Message-Id: <20200503220548.23543-2-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 02/22] cbs: Ensure that reference fields always follow the associated pointer 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" X-TUID: hfdUrLKL5y/G Content-Length: 8924 Having these together allows us to find both pointers given the address of only one of them. --- libavcodec/cbs_av1.h | 6 +++--- libavcodec/cbs_h264.h | 18 +++++++++--------- libavcodec/cbs_h265.h | 16 ++++++++-------- libavcodec/cbs_jpeg.h | 2 +- libavcodec/cbs_mpeg2.h | 10 +++++----- libavcodec/cbs_vp9.h | 2 +- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h index fdc629b00c..8925c45772 100644 --- a/libavcodec/cbs_av1.h +++ b/libavcodec/cbs_av1.h @@ -284,8 +284,8 @@ typedef struct AV1RawFrameHeader { typedef struct AV1RawTileData { uint8_t *data; - size_t data_size; AVBufferRef *data_ref; + size_t data_size; } AV1RawTileData; typedef struct AV1RawTileGroup { @@ -346,8 +346,8 @@ typedef struct AV1RawMetadataITUTT35 { uint8_t itu_t_t35_country_code_extension_byte; uint8_t *payload; - size_t payload_size; AVBufferRef *payload_ref; + size_t payload_size; } AV1RawMetadataITUTT35; typedef struct AV1RawMetadataTimecode { @@ -379,8 +379,8 @@ typedef struct AV1RawMetadata { typedef struct AV1RawPadding { uint8_t *payload; - size_t payload_size; AVBufferRef *payload_ref; + size_t payload_size; } AV1RawPadding; diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h index 9f7c2a0d30..65659ae52c 100644 --- a/libavcodec/cbs_h264.h +++ b/libavcodec/cbs_h264.h @@ -277,16 +277,16 @@ typedef struct H264RawSEIPanScanRect { typedef struct H264RawSEIUserDataRegistered { uint8_t itu_t_t35_country_code; uint8_t itu_t_t35_country_code_extension_byte; - uint8_t *data; - size_t data_length; + uint8_t *data; AVBufferRef *data_ref; + size_t data_length; } H264RawSEIUserDataRegistered; typedef struct H264RawSEIUserDataUnregistered { uint8_t uuid_iso_iec_11578[16]; - uint8_t *data; - size_t data_length; + uint8_t *data; AVBufferRef *data_ref; + size_t data_length; } H264RawSEIUserDataUnregistered; typedef struct H264RawSEIRecoveryPoint { @@ -334,9 +334,9 @@ typedef struct H264RawSEIPayload { H264RawSEIAlternativeTransferCharacteristics alternative_transfer_characteristics; struct { - uint8_t *data; - size_t data_length; + uint8_t *data; AVBufferRef *data_ref; + size_t data_length; } other; } payload; } H264RawSEIPayload; @@ -429,10 +429,10 @@ typedef struct H264RawSliceHeader { typedef struct H264RawSlice { H264RawSliceHeader header; - uint8_t *data; - size_t data_size; - int data_bit_start; + uint8_t *data; AVBufferRef *data_ref; + size_t data_size; + int data_bit_start; } H264RawSlice; typedef struct H264RawFiller { diff --git a/libavcodec/cbs_h265.h b/libavcodec/cbs_h265.h index ad746bf35f..f5eb5af5b2 100644 --- a/libavcodec/cbs_h265.h +++ b/libavcodec/cbs_h265.h @@ -184,8 +184,8 @@ typedef struct H265RawVUI { typedef struct H265RawPSExtensionData { uint8_t *data; - size_t bit_length; AVBufferRef *data_ref; + size_t bit_length; } H265RawPSExtensionData; typedef struct H265RawVPS { @@ -541,10 +541,10 @@ typedef struct H265RawSliceHeader { typedef struct H265RawSlice { H265RawSliceHeader header; - uint8_t *data; - size_t data_size; - int data_bit_start; + uint8_t *data; AVBufferRef *data_ref; + size_t data_size; + int data_bit_start; } H265RawSlice; @@ -600,15 +600,15 @@ typedef struct H265RawSEIUserDataRegistered { uint8_t itu_t_t35_country_code; uint8_t itu_t_t35_country_code_extension_byte; uint8_t *data; - size_t data_length; AVBufferRef *data_ref; + size_t data_length; } H265RawSEIUserDataRegistered; typedef struct H265RawSEIUserDataUnregistered { uint8_t uuid_iso_iec_11578[16]; uint8_t *data; - size_t data_length; AVBufferRef *data_ref; + size_t data_length; } H265RawSEIUserDataUnregistered; typedef struct H265RawSEIRecoveryPoint { @@ -710,9 +710,9 @@ typedef struct H265RawSEIPayload { alternative_transfer_characteristics; H265RawSEIAlphaChannelInfo alpha_channel_info; struct { - uint8_t *data; - size_t data_length; + uint8_t *data; AVBufferRef *data_ref; + size_t data_length; } other; } payload; } H265RawSEIPayload; diff --git a/libavcodec/cbs_jpeg.h b/libavcodec/cbs_jpeg.h index ff1961106f..6305f0ee86 100644 --- a/libavcodec/cbs_jpeg.h +++ b/libavcodec/cbs_jpeg.h @@ -80,8 +80,8 @@ typedef struct JPEGRawScanHeader { typedef struct JPEGRawScan { JPEGRawScanHeader header; uint8_t *data; - size_t data_size; AVBufferRef *data_ref; + size_t data_size; } JPEGRawScan; typedef struct JPEGRawQuantisationTable { diff --git a/libavcodec/cbs_mpeg2.h b/libavcodec/cbs_mpeg2.h index 5bcafd09f0..f7075a460d 100644 --- a/libavcodec/cbs_mpeg2.h +++ b/libavcodec/cbs_mpeg2.h @@ -76,9 +76,9 @@ typedef struct MPEG2RawSequenceHeader { typedef struct MPEG2RawUserData { uint8_t user_data_start_code; - uint8_t *user_data; - size_t user_data_length; + uint8_t *user_data; AVBufferRef *user_data_ref; + size_t user_data_length; } MPEG2RawUserData; typedef struct MPEG2RawSequenceExtension { @@ -206,10 +206,10 @@ typedef struct MPEG2RawSliceHeader { typedef struct MPEG2RawSlice { MPEG2RawSliceHeader header; - uint8_t *data; - size_t data_size; - int data_bit_start; + uint8_t *data; AVBufferRef *data_ref; + size_t data_size; + int data_bit_start; } MPEG2RawSlice; typedef struct MPEG2RawSequenceEnd { diff --git a/libavcodec/cbs_vp9.h b/libavcodec/cbs_vp9.h index 40e62476ed..af15eb4bac 100644 --- a/libavcodec/cbs_vp9.h +++ b/libavcodec/cbs_vp9.h @@ -165,8 +165,8 @@ typedef struct VP9RawFrame { VP9RawFrameHeader header; uint8_t *data; - size_t data_size; AVBufferRef *data_ref; + size_t data_size; } VP9RawFrame; typedef struct VP9RawSuperframeIndex { From patchwork Sun May 3 22:05:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19485 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:3c87:0:0:0:0:0 with SMTP id j129csp3060562yba; Sun, 3 May 2020 15:06:21 -0700 (PDT) X-Google-Smtp-Source: APiQypIjmiSUUog972aGh8+PAwju0S0cwVjvZznRBziDjHvnjLYU2C9y2pI0VuY+UEFoYeBF8xR8 X-Received: by 2002:a5d:6a4e:: with SMTP id t14mr2362806wrw.353.1588543581746; Sun, 03 May 2020 15:06:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588543581; cv=none; d=google.com; s=arc-20160816; b=h/Y3yxzz2Ow9+VmFrFudbkzXdcwLFR3ovxd6z9AQXuhHwArAP3A/tu+34k0UGr4dQ3 NO6m9UZRen7o+T4RN6uVBgU71roT+5yZkASVCztY1utpMO0UhFDWs2zPXIqp+e5V0lK2 Irk9UBmqY6yX72m61m5ptEyqJOvR+eUUw4JLn7mxsOzXMejHyTL1VzSP7Lnulmr6j44U /XE87Hcc+XkydnJWJ1sTxWDIv5mt5BmCAeNN+2GtjiWM8tFupvZXG6dWvPAvWIBmws+g DdbsICAbEfnoyGgxLkNnFjDZ7jLI5RXVv/jxUmIP/1TB64y7JQYdJPGFcjfnEm8DM7lb SdLA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=blx7s3p9xNsVaTnvQe0esrhbmOFwhuinGt8FX31+0q8=; b=skKJbtI6y+4MoTx1Tf4NX1IWjCG1UtMtLEAlMBGYLB0WoPjJqPx9T7wqiN19YnycBe DoDWeVHSs8WqcYWv9xOrVREn46gl3FhdcXmCN3EG4xVMFH/G2DOfbRfqZd++vIBYLYqy KVrr+29psmNS7dDo2Vzqr3p/oJ9Wh80TLac1sAALXVvedrX4M4K/znfFMBKIU1zpGUpj 2mKvTxU9a7KagDpwQR0KGhJckm5hh4tPGeircae92YbAR/1W+bGjGXWEPovByT6UTf/m gNZZVbvUvPUZhTWYyrrpqhJjGYeu4g0cI1zBFUBChgXHNZ0Z+lA1/Y5du89pWwfndKb5 GDvw== 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=RsEgPXa9; 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 g10si9755654wrb.99.2020.05.03.15.06.21; Sun, 03 May 2020 15:06:21 -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=RsEgPXa9; 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 1AC0D68C099; Mon, 4 May 2020 01:06:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 015CF68BECC for ; Mon, 4 May 2020 01:05:54 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id h4so6225260wmb.4 for ; Sun, 03 May 2020 15:05:54 -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:mime-version :content-transfer-encoding; bh=pVYvLDSOR14rXDzwVYS1gJuTRadWAbcfQSkZdRObVJY=; b=RsEgPXa93XphB534z7iMHwEIArg/KFaMGfs2VtxIxYEGHMhTCKIWEHIneKyLYqSkVA dfvnzwBhsU3EUfVPimUsSizH/FNfpIWJfmLhbRMdDyDJ0FiP8J2Kb41rkkUwGKpvN9zJ ucXKnGY75sEHH0nAOXopJiwlC2ZyX9HAz6ovuuv6AhUH3JieOedMuuH8y8wq4Xx5JK5H 3fETxZiutDI/m5KV9xaKu7Lg6k3gmGPMFRyYW8LOZlZiLc3DP1mWujXyAMLtLg8YbKn1 AHSc6qI/Y2I9qb9kjYUfRCkF2DqbyPK20jtkpt0YcJ+JqcQDocdrfg9lpJarONgrzhbw U6RQ== 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:mime-version:content-transfer-encoding; bh=pVYvLDSOR14rXDzwVYS1gJuTRadWAbcfQSkZdRObVJY=; b=n60Mi9T6R8tbMrWuZC82J5v9zpjLssb5K9Skl7xnmPATGrIPqndcNA6LJE1cX8IcZk 6wQAiOqjvLs7EzczWLtE2gjJWUWd6aO9pCrryas/DFazQoi7bmBIBUvywUtG3LL0K0FR VLMeo2MsxiGdAr3xY9lESn5ksTyBy1uhXv4IqJL1Puwzo1NsPoCLjycKGFJKUDMkKFOO 7DzDXAhvGA5ziZFflzyla/gIuApAj7EsUTDqmZc5D/jeMcLwc3S2/tQO7EOrr5PPnASy BYAGVH5TtPOSe4CeKRODMs2PScnkHVpIA9MzBZ0THKcY6LgkiEz4EKe+3CvMBx41t4xn lYRg== X-Gm-Message-State: AGi0PuakgPlLIcAzuzXjaCFokCAOz7CugrRNF17a8CCuy3Qs9TvXHz0+ o3CVUW/YMvFSCZltnmy0x6RckpWhLLE= X-Received: by 2002:a1c:5448:: with SMTP id p8mr10778211wmi.173.1588543553943; Sun, 03 May 2020 15:05:53 -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 a24sm10307285wmb.24.2020.05.03.15.05.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:53 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:29 +0100 Message-Id: <20200503220548.23543-3-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 03/22] cbs: Describe allocate/free methods in tabular form 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" X-TUID: 5sx8JAk8Q+DF Content-Length: 9832 Unit types are split into three categories, depending on how their content is managed: * POD structure - these require no special treatment. * Structure containing references to refcounted buffers - these can use a common free function when the offsets of all the internal references are known. * More complex structures - these still require ad-hoc treatment. For each codec we can then maintain a table of descriptors for each set of equivalent unit types, defining the mechanism needed to allocate/free that unit content. This is not required to be used immediately - a new alloc function supports this, but does not replace the old one which works without referring to these tables. --- libavcodec/cbs.c | 69 +++++++++++++++++++++++++++++++++++++++ libavcodec/cbs.h | 9 +++++ libavcodec/cbs_internal.h | 61 ++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c index 0bd5e1ac5d..6cc559e545 100644 --- a/libavcodec/cbs.c +++ b/libavcodec/cbs.c @@ -812,3 +812,72 @@ void ff_cbs_delete_unit(CodedBitstreamContext *ctx, frag->units + position + 1, (frag->nb_units - position) * sizeof(*frag->units)); } + +static void cbs_default_free_unit_content(void *opaque, uint8_t *data) +{ + const CodedBitstreamUnitTypeDescriptor *desc = opaque; + if (desc->content_type == CBS_CONTENT_TYPE_INTERNAL_REFS) { + int i; + for (i = 0; i < desc->nb_ref_offsets; i++) { + void **ptr = (void**)(data + desc->ref_offsets[i]); + av_buffer_unref((AVBufferRef**)(ptr + 1)); + } + } + av_free(data); +} + +static const CodedBitstreamUnitTypeDescriptor + *cbs_find_unit_type_desc(CodedBitstreamContext *ctx, + CodedBitstreamUnit *unit) +{ + const CodedBitstreamUnitTypeDescriptor *desc; + int i, j; + + if (!ctx->codec->unit_types) + return NULL; + + for (i = 0;; i++) { + desc = &ctx->codec->unit_types[i]; + if (desc->nb_unit_types == 0) + break; + if (desc->nb_unit_types == CBS_UNIT_TYPE_RANGE) { + if (unit->type >= desc->unit_type_range_start && + unit->type <= desc->unit_type_range_end) + return desc; + } else { + for (j = 0; j < desc->nb_unit_types; j++) { + if (desc->unit_types[j] == unit->type) + return desc; + } + } + } + return NULL; +} + +int ff_cbs_alloc_unit_content2(CodedBitstreamContext *ctx, + CodedBitstreamUnit *unit) +{ + const CodedBitstreamUnitTypeDescriptor *desc; + + av_assert0(!unit->content && !unit->content_ref); + + desc = cbs_find_unit_type_desc(ctx, unit); + if (!desc) + return AVERROR(ENOSYS); + + unit->content = av_mallocz(desc->content_size); + if (!unit->content) + return AVERROR(ENOMEM); + + unit->content_ref = + av_buffer_create(unit->content, desc->content_size, + desc->content_free ? desc->content_free + : cbs_default_free_unit_content, + (void*)desc, 0); + if (!unit->content_ref) { + av_freep(&unit->content); + return AVERROR(ENOMEM); + } + + return 0; +} diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h index cb3081e2c6..2a5959a2b0 100644 --- a/libavcodec/cbs.h +++ b/libavcodec/cbs.h @@ -352,6 +352,15 @@ int ff_cbs_alloc_unit_content(CodedBitstreamContext *ctx, size_t size, void (*free)(void *opaque, uint8_t *content)); +/** + * Allocate a new internal content buffer matching the type of the unit. + * + * The content will be zeroed. + */ +int ff_cbs_alloc_unit_content2(CodedBitstreamContext *ctx, + CodedBitstreamUnit *unit); + + /** * Allocate a new internal data buffer of the given size in the unit. * diff --git a/libavcodec/cbs_internal.h b/libavcodec/cbs_internal.h index 4c5a535ca6..282492bc88 100644 --- a/libavcodec/cbs_internal.h +++ b/libavcodec/cbs_internal.h @@ -25,11 +25,72 @@ #include "put_bits.h" +enum CBSContentType { + // Unit content is a simple structure. + CBS_CONTENT_TYPE_POD, + // Unit content contains some references to other structures, but all + // managed via buffer reference counting. The descriptor defines the + // structure offsets of every buffer reference. + CBS_CONTENT_TYPE_INTERNAL_REFS, + // Unit content is something more complex. The descriptor defines + // special functions to manage the content. + CBS_CONTENT_TYPE_COMPLEX, +}; + +enum { + // Maximum number of unit types described by the same unit type + // descriptor. + CBS_MAX_UNIT_TYPES = 3, + // Maximum number of reference buffer offsets in any one unit. + CBS_MAX_REF_OFFSETS = 2, + // Special value used in a unit type descriptor to indicate that it + // applies to a large range of types rather than a set of discrete + // values. + CBS_UNIT_TYPE_RANGE = -1, +}; + +typedef const struct CodedBitstreamUnitTypeDescriptor { + // Number of entries in the unit_types array, or the special value + // CBS_UNIT_TYPE_RANGE to indicate that the range fields should be + // used instead. + int nb_unit_types; + + // Array of unit types that this entry describes. + const CodedBitstreamUnitType unit_types[CBS_MAX_UNIT_TYPES]; + + // Start and end of unit type range, used if nb_unit_types is + // CBS_UNIT_TYPE_RANGE. + const CodedBitstreamUnitType unit_type_range_start; + const CodedBitstreamUnitType unit_type_range_end; + + // The type of content described. + enum CBSContentType content_type; + // The size of the structure which should be allocated to contain + // the decomposed content of this type of unit. + size_t content_size; + + // Number of entries in the ref_offsets array. Only used if the + // content_type is CBS_CONTENT_TYPE_INTERNAL_REFS. + int nb_ref_offsets; + // The structure must contain two adjacent elements: + // type *field; + // AVBufferRef *field_ref; + // where field points to something in the buffer referred to by + // field_ref. This offset is then set to offsetof(struct, field). + size_t ref_offsets[CBS_MAX_REF_OFFSETS]; + + void (*content_free)(void *opaque, uint8_t *data); +} CodedBitstreamUnitTypeDescriptor; + typedef struct CodedBitstreamType { enum AVCodecID codec_id; size_t priv_data_size; + // List of unit type descriptors for this codec. + // Terminated by a descriptor with nb_unit_types equal to zero. + const CodedBitstreamUnitTypeDescriptor *unit_types; + // Split frag->data into coded bitstream units, creating the // frag->units array. Fill data but not content on each unit. // The header argument should be set if the fragment came from From patchwork Sun May 3 22:05:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19457 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id D6F2F44B916 for ; Mon, 4 May 2020 01:06:02 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BF43A68C08C; Mon, 4 May 2020 01:06:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B93E468BF6F for ; Mon, 4 May 2020 01:05:55 +0300 (EEST) Received: by mail-wm1-f47.google.com with SMTP id 188so6230441wmc.2 for ; Sun, 03 May 2020 15:05:55 -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:mime-version :content-transfer-encoding; bh=M6fAXqAb4mxr3kerLCmMOScFxCQ/GWuWt15SOqa6Bi8=; b=Zwn0GlNfrZuf3DSQuUqs83KWapsOOYr2Pz+gX6ON4UA7vGi3icI12qFJVaJ3w+2SO7 uCZJW7NWUvL9sg+mi7VFdbNQcrPj9tqgsDwFgBbShizBKT13xO6FYzwve1QwUlD9ibeR rIVLZ14NA2oL4dl9qMbP5MkDOzNukXBP/FtmuhzjSlGqt6bzqSXBmXRNlFLAs94nD/xf QNX14xj5qRPSc7LuDG3b3/QFmcZiIrBCCBlGaMpMxSXmzYQOFqes0mNuq7okwD7TWPOS t7VivWqSCVSWTPGUtH6/O1cqQ+oQTBq4c1hzyWYQrQbGL0MiPdU5PUOmC52ZnDHEYBxd 0wVQ== 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:mime-version:content-transfer-encoding; bh=M6fAXqAb4mxr3kerLCmMOScFxCQ/GWuWt15SOqa6Bi8=; b=DvtmjLupw2iSnOyHb24tqZZIefoBvLHENrIxup0CHEt37tNW3+Lq7Z7NwWNfcnmkz1 PJuz1PN76C7fE2qL2boca59IPFOoddSRO6N87j2R588tplhh4JaexJ7qwpvfDzIVIZ3R iZ+B+NKDdYfUSQmp5bsgO+b+MaYMmxmzIbjW8cCfIeFcXBdKNVv1eoBpy6BXfE5LOZaw IZNc6/6EtHDsmZhZuMKaMhx3TQoAKX7saOVKHvy7dfTlinmTX/4KiM/uQXo+leshe37H pb7bDo9vUPuG7lB8a/p+iC4U+LLb8O8MxjYUZyT3rlhS/GBGadI5tbegA/naHMZoojao VPQQ== X-Gm-Message-State: AGi0PuYmADikkd0pxZuNVUbiJBGlDxPLL6q6Tyi/dxY7IdTQ2jPF0we+ zrhjeqH+A+5RrnGMuSHNV9Y6yX5pLeU= X-Google-Smtp-Source: APiQypKEDMhwdqilor0ESXQ3ushf9pTHmwXRQRuPHp8nq5ovlD2k7ErB0QrZrO2gUxOOCStrM228FQ== X-Received: by 2002:a05:600c:258:: with SMTP id 24mr10917046wmj.73.1588543554706; Sun, 03 May 2020 15:05:54 -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 a24sm10307285wmb.24.2020.05.03.15.05.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:54 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:30 +0100 Message-Id: <20200503220548.23543-4-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 04/22] cbs: Add macros to support defining unit type tables 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" --- libavcodec/cbs_internal.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/libavcodec/cbs_internal.h b/libavcodec/cbs_internal.h index 282492bc88..35159f9c5f 100644 --- a/libavcodec/cbs_internal.h +++ b/libavcodec/cbs_internal.h @@ -167,6 +167,30 @@ int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc, #define MIN_INT_BITS(length) (-(INT64_C(1) << ((length) - 1))) +#define CBS_UNIT_TYPE_POD(type, structure) { \ + .nb_unit_types = 1, \ + .unit_types = { type }, \ + .content_type = CBS_CONTENT_TYPE_POD, \ + .content_size = sizeof(structure), \ + } +#define CBS_UNIT_TYPE_INTERNAL_REF(type, structure, ref_field) { \ + .nb_unit_types = 1, \ + .unit_types = { type }, \ + .content_type = CBS_CONTENT_TYPE_INTERNAL_REFS, \ + .content_size = sizeof(structure), \ + .nb_ref_offsets = 1, \ + .ref_offsets = { offsetof(structure, ref_field) }, \ + } +#define CBS_UNIT_TYPE_COMPLEX(type, structure, free_func) { \ + .nb_unit_types = 1, \ + .unit_types = { type }, \ + .content_type = CBS_CONTENT_TYPE_COMPLEX, \ + .content_size = sizeof(structure), \ + .content_free = free_func, \ + } +#define CBS_UNIT_TYPE_END_OF_LIST { .nb_unit_types = 0 } + + extern const CodedBitstreamType ff_cbs_type_av1; extern const CodedBitstreamType ff_cbs_type_h264; extern const CodedBitstreamType ff_cbs_type_h265; From patchwork Sun May 3 22:05:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19458 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 9B84144B916 for ; Mon, 4 May 2020 01:06:03 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 838F668C0CA; Mon, 4 May 2020 01:06:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 90D8C68BFF6 for ; Mon, 4 May 2020 01:05:56 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id l18so7924829wrn.6 for ; Sun, 03 May 2020 15:05:56 -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:mime-version :content-transfer-encoding; bh=ZYvyPUlED/rQJBDB6twO3HHVd431HYEJhzNlAMgz7dE=; b=LnZRcfUdJLG0SY/7eKALyO/fmk4gtDKTdyTntQ1t98qwXndBmCWGEx8WPsgmmfA2FU bD/2h9zNQl+LtddGoS683gfYGvxcN8Fa+J4UfPGATYLTW0u+vscwPvv/dbIVNE4RGc39 UOcPiU5nNpqQ7rRJP+g1zsfDDmvUiHWx9VIIAAKzt+mLmoyeBobvVwhjaKeaUZkiLgGW CsGuK9dhLfJM047+inPxc/bXh6Mj4mZkAju1TbjnIuN9CVAdvJS+kjqPzzRInEdgTDzW m2dYDSrIoOAB7B70S5JHBmNe6WplpbQC5LjI1CEL05cZYZk+y1OgIS9ZbffikJusgPHj DIKw== 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:mime-version:content-transfer-encoding; bh=ZYvyPUlED/rQJBDB6twO3HHVd431HYEJhzNlAMgz7dE=; b=L0QY2SIMig9wPDYciAz6icoXuWE9jHh/J/zCG/uZX0tWQFhA3VEtVQ/GD42wiu1yHw uuiXRA15RpamP79S8OFX5wIe+a6mu3T1AVm974ancnKAsAS4U+omc5aS0UAYpuAV+Iem FtyiCxQWlE9zkqJhR+nE98mhrkvO05BsugoVSLD4BRCIkviqb60isnHYszx5D3at1nun L+Qgr1atXZgDM6GVO9CBgz2bazViPBLYG5oyi3GvtVtGU287r3Q9IK3oXcsJL2+cLaYK KAcODki9UKNzzof5cyXEttijpz7xoxCDlnmRsUwuO8IctVtp1cLTmab9M6/+jpmnRn9y viYw== X-Gm-Message-State: AGi0PuZoa+gnmprDRiBzTC4S0V0vwSNmln8Pz6wOuiZKDLmKASRBRV1N P5nu4TPlVNxu4N1C4l/nQ0lsrcKy6L0= X-Google-Smtp-Source: APiQypJ5Od7cs01OP0nmCg35TQaQpLhT2ZAUciDRh5XX3+dzjpCP/cpIdLfKcPC5Sif5CN5rjYFDQQ== X-Received: by 2002:adf:e88d:: with SMTP id d13mr15080419wrm.375.1588543555663; Sun, 03 May 2020 15:05:55 -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 a24sm10307285wmb.24.2020.05.03.15.05.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:55 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:31 +0100 Message-Id: <20200503220548.23543-5-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 05/22] cbs_h264: Use table-based alloc/free 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" --- libavcodec/cbs_h2645.c | 163 ++++++++++++++++++----------------------- 1 file changed, 70 insertions(+), 93 deletions(-) diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index d42073cc5a..b5a033dcbd 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -443,52 +443,6 @@ static int cbs_h2645_read_more_rbsp_data(GetBitContext *gbc) #undef allocate -static void cbs_h264_free_pps(void *opaque, uint8_t *content) -{ - H264RawPPS *pps = (H264RawPPS*)content; - av_buffer_unref(&pps->slice_group_id_ref); - av_freep(&content); -} - -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: - case H264_SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME: - case H264_SEI_TYPE_ALTERNATIVE_TRANSFER: - break; - case H264_SEI_TYPE_USER_DATA_REGISTERED: - av_buffer_unref(&payload->payload.user_data_registered.data_ref); - break; - case H264_SEI_TYPE_USER_DATA_UNREGISTERED: - av_buffer_unref(&payload->payload.user_data_unregistered.data_ref); - break; - default: - av_buffer_unref(&payload->payload.other.data_ref); - break; - } -} - -static void cbs_h264_free_sei(void *opaque, uint8_t *content) -{ - H264RawSEI *sei = (H264RawSEI*)content; - int i; - for (i = 0; i < sei->payload_count; i++) - cbs_h264_free_sei_payload(&sei->payload[i]); - av_freep(&content); -} - -static void cbs_h264_free_slice(void *opaque, uint8_t *content) -{ - H264RawSlice *slice = (H264RawSlice*)content; - av_buffer_unref(&slice->data_ref); - av_freep(&content); -} - static void cbs_h265_free_vps(void *opaque, uint8_t *content) { H265RawVPS *vps = (H265RawVPS*)content; @@ -790,15 +744,14 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; + err = ff_cbs_alloc_unit_content2(ctx, unit); + if (err < 0) + return err; + switch (unit->type) { case H264_NAL_SPS: { - H264RawSPS *sps; - - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*sps), NULL); - if (err < 0) - return err; - sps = unit->content; + H264RawSPS *sps = unit->content; err = cbs_h264_read_sps(ctx, &gbc, sps); if (err < 0) @@ -812,12 +765,6 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, case H264_NAL_SPS_EXT: { - err = ff_cbs_alloc_unit_content(ctx, unit, - sizeof(H264RawSPSExtension), - NULL); - if (err < 0) - return err; - err = cbs_h264_read_sps_extension(ctx, &gbc, unit->content); if (err < 0) return err; @@ -826,13 +773,7 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, case H264_NAL_PPS: { - H264RawPPS *pps; - - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*pps), - &cbs_h264_free_pps); - if (err < 0) - return err; - pps = unit->content; + H264RawPPS *pps = unit->content; err = cbs_h264_read_pps(ctx, &gbc, pps); if (err < 0) @@ -848,15 +789,9 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, case H264_NAL_IDR_SLICE: case H264_NAL_AUXILIARY_SLICE: { - H264RawSlice *slice; + H264RawSlice *slice = unit->content; int pos, len; - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*slice), - &cbs_h264_free_slice); - if (err < 0) - return err; - slice = unit->content; - err = cbs_h264_read_slice_header(ctx, &gbc, &slice->header); if (err < 0) return err; @@ -878,11 +813,6 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, case H264_NAL_AUD: { - err = ff_cbs_alloc_unit_content(ctx, unit, - sizeof(H264RawAUD), NULL); - if (err < 0) - return err; - err = cbs_h264_read_aud(ctx, &gbc, unit->content); if (err < 0) return err; @@ -891,11 +821,6 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, case H264_NAL_SEI: { - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(H264RawSEI), - &cbs_h264_free_sei); - if (err < 0) - return err; - err = cbs_h264_read_sei(ctx, &gbc, unit->content); if (err < 0) return err; @@ -904,11 +829,6 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, case H264_NAL_FILLER_DATA: { - err = ff_cbs_alloc_unit_content(ctx, unit, - sizeof(H264RawFiller), NULL); - if (err < 0) - return err; - err = cbs_h264_read_filler(ctx, &gbc, unit->content); if (err < 0) return err; @@ -918,12 +838,6 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, case H264_NAL_END_SEQUENCE: case H264_NAL_END_STREAM: { - err = ff_cbs_alloc_unit_content(ctx, unit, - sizeof(H264RawNALUnitHeader), - NULL); - if (err < 0) - return err; - err = (unit->type == H264_NAL_END_SEQUENCE ? cbs_h264_read_end_of_sequence : cbs_h264_read_end_of_stream)(ctx, &gbc, unit->content); @@ -1493,11 +1407,74 @@ static void cbs_h265_close(CodedBitstreamContext *ctx) av_buffer_unref(&h265->pps_ref[i]); } +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: + case H264_SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME: + case H264_SEI_TYPE_ALTERNATIVE_TRANSFER: + break; + case H264_SEI_TYPE_USER_DATA_REGISTERED: + av_buffer_unref(&payload->payload.user_data_registered.data_ref); + break; + case H264_SEI_TYPE_USER_DATA_UNREGISTERED: + av_buffer_unref(&payload->payload.user_data_unregistered.data_ref); + break; + default: + av_buffer_unref(&payload->payload.other.data_ref); + break; + } +} + +static void cbs_h264_free_sei(void *opaque, uint8_t *content) +{ + H264RawSEI *sei = (H264RawSEI*)content; + int i; + for (i = 0; i < sei->payload_count; i++) + cbs_h264_free_sei_payload(&sei->payload[i]); + av_freep(&content); +} + +static const CodedBitstreamUnitTypeDescriptor cbs_h264_unit_types[] = { + CBS_UNIT_TYPE_POD(H264_NAL_SPS, H264RawSPS), + CBS_UNIT_TYPE_POD(H264_NAL_SPS_EXT, H264RawSPSExtension), + + CBS_UNIT_TYPE_INTERNAL_REF(H264_NAL_PPS, H264RawPPS, slice_group_id), + + { + .nb_unit_types = 3, + .unit_types = { + H264_NAL_IDR_SLICE, + H264_NAL_SLICE, + H264_NAL_AUXILIARY_SLICE, + }, + .content_type = CBS_CONTENT_TYPE_INTERNAL_REFS, + .content_size = sizeof(H264RawSlice), + .nb_ref_offsets = 1, + .ref_offsets = { offsetof(H264RawSlice, data) }, + }, + + CBS_UNIT_TYPE_POD(H264_NAL_AUD, H264RawAUD), + CBS_UNIT_TYPE_POD(H264_NAL_FILLER_DATA, H264RawFiller), + CBS_UNIT_TYPE_POD(H264_NAL_END_SEQUENCE, H264RawNALUnitHeader), + CBS_UNIT_TYPE_POD(H264_NAL_END_STREAM, H264RawNALUnitHeader), + + CBS_UNIT_TYPE_COMPLEX(H264_NAL_SEI, H264RawSEI, &cbs_h264_free_sei), + + CBS_UNIT_TYPE_END_OF_LIST +}; + const CodedBitstreamType ff_cbs_type_h264 = { .codec_id = AV_CODEC_ID_H264, .priv_data_size = sizeof(CodedBitstreamH264Context), + .unit_types = cbs_h264_unit_types, + .split_fragment = &cbs_h2645_split_fragment, .read_unit = &cbs_h264_read_nal_unit, .write_unit = &cbs_h264_write_nal_unit, From patchwork Sun May 3 22:05:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19459 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id AEEED44B916 for ; Mon, 4 May 2020 01:06:05 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 90F8968C103; Mon, 4 May 2020 01:06:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 900FC68C0A5 for ; Mon, 4 May 2020 01:05:57 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id z6so6695138wml.2 for ; Sun, 03 May 2020 15:05:57 -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:mime-version :content-transfer-encoding; bh=j8g9f0V6vfVOzT31O1+sChqApBuXbwkr/RMe4oNyuoo=; b=N1JKgT6uttCK2gum7Ny3M0GUQJmR0Bh4I41kb6f6//df+oWkZcQ+SDhxfo39qBu1Aq epG9vdLdjK39o7jeTJyH2bCQxt37NOl2PknYUF8GupBSe7k7I5C4ozhEF/oAuxFGToRK pjPx6yT773EfJb3jgyzT4mgaP+5M6L2MBvJUNBcoJfY8uSFw6e5lAaOB35fHhbp2/QI5 qSFedlLpG/x5iRTHTFiGIxmAzpePNQeTf7lMJpjAyq0ZeprExV6gqQShOcjmncwU3G9w tgUjwGmlAvDtVR7DeK3uUXwVkxEn2jrWaRYu1maYlGAH5RjQTdMIj4j+zdCfwesyDAGQ Nvsw== 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:mime-version:content-transfer-encoding; bh=j8g9f0V6vfVOzT31O1+sChqApBuXbwkr/RMe4oNyuoo=; b=p3b3bCjCQ0TiEFLGKPiSvw2ySDUEapUl0bSKiHfCF44J1UTOWHOGtHYBPaJ/vciWvM hcdXxVGIKwl5toPjm1YXcs1wpQy8yC/wD2jXVB1Vnlc4WootXCmZNClC92nzRWA+2y8m ok+tBOvOPjl5FER6Z98JAXP/oFkMZti/HrYYWXZjQnqxgWzNip0oFFR3AnlmxRf2LEPR csdV98xv4vkuT1wjxQw7vFoWORdAD9TUf8RU5R+dZZErk+1ktES5vRggHHnl62AFZUFh bqMTu9GGwJXLJev0YSfaV/pN1Q2M4Svwk0jayyC6JWuLuEBJrc2V0cgrJnB1NElTT0c1 qOEA== X-Gm-Message-State: AGi0PuZOOmhRa4kkcDdlFDWc7V7rNisF8S3Cat7JbPjsjO6Ey6/t4FiX 4oUQz4y+6O84s9x85egAMR8fBoRxbjs= X-Google-Smtp-Source: APiQypKqfJYko44oVA2HjQK0kYxtNWiKksntFA5q9lTyArh+sc8pw9USreGMN/h9LkHX9K79CzZNSg== X-Received: by 2002:a05:600c:210c:: with SMTP id u12mr11638873wml.135.1588543556673; Sun, 03 May 2020 15:05:56 -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 a24sm10307285wmb.24.2020.05.03.15.05.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:56 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:32 +0100 Message-Id: <20200503220548.23543-6-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 06/22] cbs: Add support functions for handling unit content references 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" Use the unit type table to determine what we need to do to clone the internals of the unit content when making copies for refcounting or writeability. (This will still fail for units with complex content if they do not have a defined clone function.) Setup and naming from a patch by Andreas Rheinhardt , but with the implementation changed to use the unit type information if possible rather than requiring a codec-specific function. --- libavcodec/cbs.c | 163 ++++++++++++++++++++++++++++++++++++++ libavcodec/cbs.h | 29 +++++++ libavcodec/cbs_internal.h | 1 + 3 files changed, 193 insertions(+) diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c index 6cc559e545..2f39ddbfb4 100644 --- a/libavcodec/cbs.c +++ b/libavcodec/cbs.c @@ -881,3 +881,166 @@ int ff_cbs_alloc_unit_content2(CodedBitstreamContext *ctx, return 0; } + +static int cbs_clone_unit_content(AVBufferRef **clone_ref, + CodedBitstreamUnit *unit, + const CodedBitstreamUnitTypeDescriptor *desc) +{ + uint8_t *src, *copy; + uint8_t **src_ptr, **copy_ptr; + AVBufferRef **src_buf, **copy_buf; + int err, i; + + av_assert0(unit->content); + src = unit->content; + + copy = av_memdup(src, desc->content_size); + if (!copy) + return AVERROR(ENOMEM); + + for (i = 0; i < desc->nb_ref_offsets; i++) { + src_ptr = (uint8_t**)(src + desc->ref_offsets[i]); + src_buf = (AVBufferRef**)(src_ptr + 1); + copy_ptr = (uint8_t**)(copy + desc->ref_offsets[i]); + copy_buf = (AVBufferRef**)(copy_ptr + 1); + + if (!*src_ptr) { + av_assert0(!*src_buf); + continue; + } + if (!*src_buf) { + // We can't handle a non-refcounted pointer here - we don't + // have enough information to handle whatever structure lies + // at the other end of it. + err = AVERROR(EINVAL); + goto fail; + } + + // src_ptr is required to point somewhere inside src_buf. If it + // doesn't, there is a bug somewhere. + av_assert0(*src_ptr >= (*src_buf)->data && + *src_ptr < (*src_buf)->data + (*src_buf)->size); + + *copy_buf = av_buffer_ref(*src_buf); + if (!*copy_buf) { + err = AVERROR(ENOMEM); + goto fail; + } + *copy_ptr = (*copy_buf)->data + (*src_ptr - (*src_buf)->data); + } + + *clone_ref = av_buffer_create(copy, desc->content_size, + desc->content_free ? desc->content_free : + cbs_default_free_unit_content, + (void*)desc, 0); + if (!*clone_ref) { + err = AVERROR(ENOMEM); + goto fail; + } + + return 0; + +fail: + for (--i; i >= 0; i--) + av_buffer_unref((AVBufferRef**)(copy + desc->ref_offsets[i])); + av_freep(©); + *clone_ref = NULL; + return err; +} + +int ff_cbs_make_unit_refcounted(CodedBitstreamContext *ctx, + CodedBitstreamUnit *unit) +{ + const CodedBitstreamUnitTypeDescriptor *desc; + AVBufferRef *ref; + int err; + + av_assert0(unit->content); + if (unit->content_ref) { + // Already refcounted, nothing to do. + return 0; + } + + desc = cbs_find_unit_type_desc(ctx, unit); + if (!desc) + return AVERROR(ENOSYS); + + switch (desc->content_type) { + case CBS_CONTENT_TYPE_POD: + ref = av_buffer_alloc(desc->content_size); + if (!ref) + return AVERROR(ENOMEM); + memcpy(ref->data, unit->content, desc->content_size); + err = 0; + break; + + case CBS_CONTENT_TYPE_INTERNAL_REFS: + err = cbs_clone_unit_content(&ref, unit, desc); + break; + + case CBS_CONTENT_TYPE_COMPLEX: + if (!desc->content_clone) + return AVERROR_PATCHWELCOME; + err = desc->content_clone(&ref, unit); + break; + + default: + av_assert0(0 && "Invalid content type."); + } + + if (err < 0) + return err; + + unit->content_ref = ref; + unit->content = ref->data; + return 0; +} + +int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx, + CodedBitstreamUnit *unit) +{ + const CodedBitstreamUnitTypeDescriptor *desc; + AVBufferRef *ref; + int err; + + // This can only be applied to refcounted units. + err = ff_cbs_make_unit_refcounted(ctx, unit); + if (err < 0) + return err; + av_assert0(unit->content && unit->content_ref); + + if (av_buffer_is_writable(unit->content_ref)) + return 0; + + desc = cbs_find_unit_type_desc(ctx, unit); + if (!desc) + return AVERROR(ENOSYS); + + switch (desc->content_type) { + case CBS_CONTENT_TYPE_POD: + err = av_buffer_make_writable(&unit->content_ref); + break; + + case CBS_CONTENT_TYPE_INTERNAL_REFS: + err = cbs_clone_unit_content(&ref, unit, desc); + break; + + case CBS_CONTENT_TYPE_COMPLEX: + if (!desc->content_clone) + return AVERROR_PATCHWELCOME; + err = desc->content_clone(&ref, unit); + break; + + default: + av_assert0(0 && "Invalid content type."); + } + if (err < 0) + return err; + + if (desc->content_type != CBS_CONTENT_TYPE_POD) { + av_buffer_unref(&unit->content_ref); + unit->content_ref = ref; + } + unit->content = unit->content_ref->data; + return 0; +} diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h index 2a5959a2b0..eb7f4b878b 100644 --- a/libavcodec/cbs.h +++ b/libavcodec/cbs.h @@ -407,4 +407,33 @@ void ff_cbs_delete_unit(CodedBitstreamContext *ctx, int position); +/** + * Make the content of a unit refcounted. + * + * If the unit is not refcounted, this will do a deep copy of the unit + * content to new refcounted buffers. + * + * It is not valid to call this function on a unit which does not have + * decomposed content. + */ +int ff_cbs_make_unit_refcounted(CodedBitstreamContext *ctx, + CodedBitstreamUnit *unit); + +/** + * Make the content of a unit writable so that internal fields can be + * modified. + * + * If it is known that there are no other references to the content of + * the unit, does nothing and returns success. Otherwise (including the + * case where the unit content is not refcounted), it does a full clone + * of the content (including any internal buffers) to make a new copy, + * and replaces the existing references inside the unit with that. + * + * It is not valid to call this function on a unit which does not have + * decomposed content. + */ +int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx, + CodedBitstreamUnit *unit); + + #endif /* AVCODEC_CBS_H */ diff --git a/libavcodec/cbs_internal.h b/libavcodec/cbs_internal.h index 35159f9c5f..d991e1eedf 100644 --- a/libavcodec/cbs_internal.h +++ b/libavcodec/cbs_internal.h @@ -80,6 +80,7 @@ typedef const struct CodedBitstreamUnitTypeDescriptor { size_t ref_offsets[CBS_MAX_REF_OFFSETS]; void (*content_free)(void *opaque, uint8_t *data); + int (*content_clone)(AVBufferRef **ref, CodedBitstreamUnit *unit); } CodedBitstreamUnitTypeDescriptor; typedef struct CodedBitstreamType { From patchwork Sun May 3 22:05:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19461 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id F3EC744B916 for ; Mon, 4 May 2020 01:06:07 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D512668C147; Mon, 4 May 2020 01:06:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8716D68C0CB for ; Mon, 4 May 2020 01:05:58 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id g13so18643166wrb.8 for ; Sun, 03 May 2020 15:05:58 -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:mime-version :content-transfer-encoding; bh=5BBBBGbBaNllygcc6HNTRmpaYFdD8YLFTCwDpj47Bjg=; b=RcPgScEgDcsY0lYmLtCUmrpOP69ZlWgiU54AdErls3eKryGT9ulBrmGCgJU8QYoiTb pTH2PMmoRKximVMJLfLrW8IihkGlK27bL6suoWA10xZDVsujpAxgqa9Us+yQixoHbtF/ VCBeNQuOAVIKV43NqRTikZC9TyGEvZbOM4eAk8Fjm2siTUbH0b19tXjl6FGeVZXfzuPP LEhE4APO0DmLsTZYCgWVsHwRPpcPe+JZGdTqbZCa4qzr5gGfvb87LKwpWp3cLXyYrDRX YtIHTxvqHHA9KyH56K/XYFoF5PY0pJSlVG8X1lmtAdprJjBLX4OPfpEdAGFzZ9R8Buq1 O/uw== 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:mime-version:content-transfer-encoding; bh=5BBBBGbBaNllygcc6HNTRmpaYFdD8YLFTCwDpj47Bjg=; b=H45l7ZA0NV66ZeArj+Oum3cPd2u3krb595T1WioN1Upi0jOiSS0cGjnkMdrreLLBi5 zzaGc7VY7QB8J6sTkVFV0RzCdshjQ/C+ECckdbcyOr33Mbr9DMdrEBRRUxXz5esgf9G8 K0fW5kVsZ++gMB8LYz7y8SzCY/5rMDM8nxR4VIURejTusOA2xolpqZZ8mNjZLI2HdHp2 U78sKJnfa2nYORJI3ohlgZFjR4VpFxOVUqMDW3g/uS/OUHtUQm6FviPm8xR5PPgfu2wM A3p1hIdoxWYrKQFpSk0s9yHE37crxsNHorD8o3I7yl4J+W8Pk+WkTGI85lMP5x/GDCS1 Pz5A== X-Gm-Message-State: AGi0PuY0hu7LL/jnq3UmiJfdOlJXJhZ2b9dc17P4p7fG2Mjpxb674ojZ YNXVh/HbzrgnoRhOh7N8HbWxfjxGaFY= X-Google-Smtp-Source: APiQypKWJ4HNmrNGsXEzWCpc1vbziaUMZ8QP6YqyGruBrg2DNSNRpCYbfY9e2zOFNJniDI3ikRvklA== X-Received: by 2002:a5d:4211:: with SMTP id n17mr14918562wrq.286.1588543557622; Sun, 03 May 2020 15:05:57 -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 a24sm10307285wmb.24.2020.05.03.15.05.56 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:56 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:33 +0100 Message-Id: <20200503220548.23543-7-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 07/22] cbs_h2645: Ensure that non-refcounted parameter sets are fully copied 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" Only copying the main structure is not necessarily sufficient - there could be references to substructures. --- libavcodec/cbs_h2645.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index b5a033dcbd..e4fbd8e633 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -708,18 +708,20 @@ static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \ CodedBitstreamH26 ## h26n ## Context *priv = ctx->priv_data; \ H26 ## h26n ## Raw ## ps_name *ps_var = unit->content; \ unsigned int id = ps_var->id_element; \ + int err; \ if (id >= FF_ARRAY_ELEMS(priv->ps_var)) { \ av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid " #ps_name \ " id : %d.\n", id); \ return AVERROR_INVALIDDATA; \ } \ + err = ff_cbs_make_unit_refcounted(ctx, unit); \ + if (err < 0) \ + return err; \ if (priv->ps_var[id] == priv->active_ ## ps_var) \ priv->active_ ## ps_var = NULL ; \ av_buffer_unref(&priv->ps_var ## _ref[id]); \ - if (unit->content_ref) \ - priv->ps_var ## _ref[id] = av_buffer_ref(unit->content_ref); \ - else \ - priv->ps_var ## _ref[id] = av_buffer_alloc(sizeof(*ps_var)); \ + av_assert0(unit->content_ref); \ + priv->ps_var ## _ref[id] = av_buffer_ref(unit->content_ref); \ if (!priv->ps_var ## _ref[id]) \ return AVERROR(ENOMEM); \ priv->ps_var[id] = (H26 ## h26n ## Raw ## ps_name *)priv->ps_var ## _ref[id]->data; \ From patchwork Sun May 3 22:05:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19463 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 05E2144B916 for ; Mon, 4 May 2020 01:06:10 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E284768C17B; Mon, 4 May 2020 01:06:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 775BB68C0DC for ; Mon, 4 May 2020 01:05:59 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id g13so18643193wrb.8 for ; Sun, 03 May 2020 15:05:59 -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:mime-version :content-transfer-encoding; bh=Lz6JGR3L7Ce+PC0wCfGEcQg4tTAkGce4d0aPlG84GFw=; b=jQVSsCjpHLXxt+BIaDzEDSHQNbEFnFSz5AW7EJL1eLcsKeMJKA1YEajLiQv8LjX/I1 MOcttBnIQzgx64f6T2WsKG02BOk8DGbP7XUzsnxBFgFsyMf6/92Sx0kmJ4YGOeNudeqF eTbAEuf1TAtFpWbG0g7MF6UU8RdoMXjmCXq59expiTJyFwSMNzx4lcb8dmDQ+Wc/mZeV d/M5zRYUGO5xI4urHmBBTQ7n5q3zLt937nGT2d6fsVdbfjPywL/73GM23WHktlfsHfO4 ooB33dsPJYiq40fTX0E/ILcaHw4EXnV5FS5IolndveP1o16NnbQr320SqbKYYqYd2Xiv DCbg== 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:mime-version:content-transfer-encoding; bh=Lz6JGR3L7Ce+PC0wCfGEcQg4tTAkGce4d0aPlG84GFw=; b=a6Qyx2wgXSsdi3NnQTDHPF3xWp/PH1mZtA5Eg+R2RmoFQ8BLXEzw50HrwIdJ15jQX9 nsJ8CYGCazCTp/yT8Y6HFDM/UwxaTaH7N1OIT4S/E4nl/kv4w6wofmzTnGPBLMqElLqr k/yXg4rMDN5ZtDXfAv6yGTJukVbCZc9U8mVdaDANT1h4r81B8rDru50pRBrJfYinV7mU YyHk6Gyk13YRykEbLFt+f13UNz8ry1+LuQLL6itHaS3MsD3RQKLFZUk/4OY3fOCnaILW Oi4PjVwo7pP57j+JOM+6k4i8snnhyAFyjDXbC//yS40LiFhRIx4/pPNMmqLF9gyGRGSQ Hawg== X-Gm-Message-State: AGi0PuavlTDjRL1dx3v3QKA1oIYpaaVl3pLthZDQ6O4DW4AnOJye7mvZ uC+zggWAyacsaxDVukl9KMqSstpA2bg= X-Google-Smtp-Source: APiQypLz/YYrXwxT9qoMmiQnRHd2yFGC7Thb7oT/B0xO295Cm4dps9WknvCanBKFaD4Qfo8/bAFmqQ== X-Received: by 2002:adf:df82:: with SMTP id z2mr17093724wrl.58.1588543558668; Sun, 03 May 2020 15:05:58 -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 a24sm10307285wmb.24.2020.05.03.15.05.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:58 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:34 +0100 Message-Id: <20200503220548.23543-8-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 08/22] h264_redundant_pps: Make it reference-compatible 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" From: Andreas Rheinhardt Since c6a63e11092c975b89d824f08682fe31948d3686, the parameter sets modified as content of PPS units were references shared with the CodedBitstreamH264Context, so modifying them alters the parsing process of future access units which meant that frames often got discarded because invalid values were parsed. This patch makes h264_redundant_pps compatible with the reality of reference-counted parameter sets. Fixes #7807. Signed-off-by: Andreas Rheinhardt Signed-off-by: Mark Thompson --- libavcodec/h264_redundant_pps_bsf.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/libavcodec/h264_redundant_pps_bsf.c b/libavcodec/h264_redundant_pps_bsf.c index 8405738c4b..4d5dd9a90f 100644 --- a/libavcodec/h264_redundant_pps_bsf.c +++ b/libavcodec/h264_redundant_pps_bsf.c @@ -40,8 +40,19 @@ typedef struct H264RedundantPPSContext { static int h264_redundant_pps_fixup_pps(H264RedundantPPSContext *ctx, - H264RawPPS *pps) + CodedBitstreamUnit *unit) { + H264RawPPS *pps; + int err; + + // The changes we are about to perform affect the parsing process, + // so we must make sure that the PPS is writable, otherwise the + // parsing of future slices will be incorrect and even raise errors. + err = ff_cbs_make_unit_writable(ctx->input, unit); + if (err < 0) + return err; + pps = unit->content; + // Record the current value of pic_init_qp in order to fix up // following slices, then overwrite with the global value. ctx->current_pic_init_qp = pps->pic_init_qp_minus26 + 26; @@ -88,7 +99,7 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *pkt) if (nal->type == H264_NAL_SPS) au_has_sps = 1; if (nal->type == H264_NAL_PPS) { - err = h264_redundant_pps_fixup_pps(ctx, nal->content); + err = h264_redundant_pps_fixup_pps(ctx, nal); if (err < 0) goto fail; if (!au_has_sps) { @@ -144,7 +155,7 @@ static int h264_redundant_pps_init(AVBSFContext *bsf) for (i = 0; i < au->nb_units; i++) { if (au->units[i].type == H264_NAL_PPS) { - err = h264_redundant_pps_fixup_pps(ctx, au->units[i].content); + err = h264_redundant_pps_fixup_pps(ctx, &au->units[i]); if (err < 0) goto fail; } From patchwork Sun May 3 22:05:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19464 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 39D4344B916 for ; Mon, 4 May 2020 01:06:11 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1ECE468C16D; Mon, 4 May 2020 01:06:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7DFC368C0E6 for ; Mon, 4 May 2020 01:06:00 +0300 (EEST) Received: by mail-wm1-f66.google.com with SMTP id z6so6695238wml.2 for ; Sun, 03 May 2020 15:06:00 -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:mime-version :content-transfer-encoding; bh=zkdGe3gkKuAFi/ybdW3aVmXivZGrwtMqizv9OxgZeCA=; b=EjPX+zzKvEwYCm69UzUlVJSrFOqygbrwPypPsfwMEc3awSFXQLznme2UGFm3BJwdod NrADRNLaL4UAvE/YUgnWD6BlIqbJLp7GZGbJLa06VClRms+DATBSlTqtCvndEnWnb/V/ O2p44D9ylLMzMh+AM+LanGvzPcYKNYKEywl6x1nYORXS4TAass2320nvmpRXTAO5vkj0 IZUYj7u6gWhI8R9TOMJBopnCqDMeo9ErNRwTQW3xjGY9i1J0A+gnOZJkEY0ukDy0sAI/ bFkP+a1Vbg7QfJmMSn2fjwMQDNQYXuggBVXkRbNhyQMH+TGXTmt2IvYKUJagEaDzJgXv Jqtg== 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:mime-version:content-transfer-encoding; bh=zkdGe3gkKuAFi/ybdW3aVmXivZGrwtMqizv9OxgZeCA=; b=KkiLw4gmRwbMN/HNPrXdXSLc5Qw+4ubODSdULpWTpbOBL78JM5lLTTQqVAZK6lVtxa l7McCNvSd1TdZFAYu3UYdkL0uTQlBV03Aq/MTYW0HtEbh1NNjC4NeHRMrW3AWJpKUDqG R8vuM5J+aiYvClmtXSEY3Q5vF/NX/teL+Mtan/jVl/ZzDVbzW4ymRU2RbXJPtyeoHV0V 2+Y8ZVTr4ZJeJ4d0wdHdVRtGtuJuZVllbZeKy6wLdpOcTZxB+emwLLjT1uiXOsQGvfEX 9CMvwTeZUW1S4uS6WQM9dbHZT56oj5KL3EzKNx27dNvkXnel0vexW+PhFpdmFmHCxXgj iMsQ== X-Gm-Message-State: AGi0PuZgqPqlXBADmZqKzdMUCL99G+nJXyWJCLqzAg82LUEM/ipN518u 4gxkNH8E5DNFhXuuZh70uce9KIbV+nU= X-Google-Smtp-Source: APiQypIUNBg+3oezZOqRwSlrC9xnHnizvupvNTB/oMBmhKLWuWlgHsSyo3ZUsgTxlfezeOMHCqLNFA== X-Received: by 2002:a1c:bad4:: with SMTP id k203mr10932702wmf.15.1588543559539; Sun, 03 May 2020 15:05:59 -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 a24sm10307285wmb.24.2020.05.03.15.05.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:58 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:35 +0100 Message-Id: <20200503220548.23543-9-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 09/22] cbs_h265: Use table-based alloc/free 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" --- libavcodec/cbs_h2645.c | 196 +++++++++++++++++++---------------------- 1 file changed, 92 insertions(+), 104 deletions(-) diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index e4fbd8e633..b70aa3c39d 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -443,71 +443,6 @@ static int cbs_h2645_read_more_rbsp_data(GetBitContext *gbc) #undef allocate -static void cbs_h265_free_vps(void *opaque, uint8_t *content) -{ - H265RawVPS *vps = (H265RawVPS*)content; - av_buffer_unref(&vps->extension_data.data_ref); - av_freep(&content); -} - -static void cbs_h265_free_sps(void *opaque, uint8_t *content) -{ - H265RawSPS *sps = (H265RawSPS*)content; - av_buffer_unref(&sps->extension_data.data_ref); - av_freep(&content); -} - -static void cbs_h265_free_pps(void *opaque, uint8_t *content) -{ - H265RawPPS *pps = (H265RawPPS*)content; - av_buffer_unref(&pps->extension_data.data_ref); - av_freep(&content); -} - -static void cbs_h265_free_slice(void *opaque, uint8_t *content) -{ - H265RawSlice *slice = (H265RawSlice*)content; - av_buffer_unref(&slice->data_ref); - av_freep(&content); -} - -static void cbs_h265_free_sei_payload(H265RawSEIPayload *payload) -{ - switch (payload->payload_type) { - case HEVC_SEI_TYPE_BUFFERING_PERIOD: - case HEVC_SEI_TYPE_PICTURE_TIMING: - case HEVC_SEI_TYPE_PAN_SCAN_RECT: - case HEVC_SEI_TYPE_RECOVERY_POINT: - case HEVC_SEI_TYPE_DISPLAY_ORIENTATION: - case HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS: - case HEVC_SEI_TYPE_DECODED_PICTURE_HASH: - case HEVC_SEI_TYPE_TIME_CODE: - case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO: - case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO: - case HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS: - case HEVC_SEI_TYPE_ALPHA_CHANNEL_INFO: - break; - case HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: - av_buffer_unref(&payload->payload.user_data_registered.data_ref); - break; - case HEVC_SEI_TYPE_USER_DATA_UNREGISTERED: - av_buffer_unref(&payload->payload.user_data_unregistered.data_ref); - break; - default: - av_buffer_unref(&payload->payload.other.data_ref); - break; - } -} - -static void cbs_h265_free_sei(void *opaque, uint8_t *content) -{ - H265RawSEI *sei = (H265RawSEI*)content; - int i; - for (i = 0; i < sei->payload_count; i++) - cbs_h265_free_sei_payload(&sei->payload[i]); - av_freep(&content); -} - static int cbs_h2645_fragment_add_nals(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const H2645Packet *packet) @@ -865,16 +800,14 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; + err = ff_cbs_alloc_unit_content2(ctx, unit); + if (err < 0) + return err; + switch (unit->type) { case HEVC_NAL_VPS: { - H265RawVPS *vps; - - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*vps), - &cbs_h265_free_vps); - if (err < 0) - return err; - vps = unit->content; + H265RawVPS *vps = unit->content; err = cbs_h265_read_vps(ctx, &gbc, vps); if (err < 0) @@ -887,13 +820,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, break; case HEVC_NAL_SPS: { - H265RawSPS *sps; - - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*sps), - &cbs_h265_free_sps); - if (err < 0) - return err; - sps = unit->content; + H265RawSPS *sps = unit->content; err = cbs_h265_read_sps(ctx, &gbc, sps); if (err < 0) @@ -907,13 +834,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, case HEVC_NAL_PPS: { - H265RawPPS *pps; - - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*pps), - &cbs_h265_free_pps); - if (err < 0) - return err; - pps = unit->content; + H265RawPPS *pps = unit->content; err = cbs_h265_read_pps(ctx, &gbc, pps); if (err < 0) @@ -942,15 +863,9 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, case HEVC_NAL_IDR_N_LP: case HEVC_NAL_CRA_NUT: { - H265RawSlice *slice; + H265RawSlice *slice = unit->content; int pos, len; - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*slice), - &cbs_h265_free_slice); - if (err < 0) - return err; - slice = unit->content; - err = cbs_h265_read_slice_segment_header(ctx, &gbc, &slice->header); if (err < 0) return err; @@ -972,11 +887,6 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, case HEVC_NAL_AUD: { - err = ff_cbs_alloc_unit_content(ctx, unit, - sizeof(H265RawAUD), NULL); - if (err < 0) - return err; - err = cbs_h265_read_aud(ctx, &gbc, unit->content); if (err < 0) return err; @@ -986,12 +896,6 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, case HEVC_NAL_SEI_PREFIX: case HEVC_NAL_SEI_SUFFIX: { - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(H265RawSEI), - &cbs_h265_free_sei); - - if (err < 0) - return err; - err = cbs_h265_read_sei(ctx, &gbc, unit->content, unit->type == HEVC_NAL_SEI_PREFIX); @@ -1470,6 +1374,88 @@ static const CodedBitstreamUnitTypeDescriptor cbs_h264_unit_types[] = { CBS_UNIT_TYPE_END_OF_LIST }; +static void cbs_h265_free_sei_payload(H265RawSEIPayload *payload) +{ + switch (payload->payload_type) { + case HEVC_SEI_TYPE_BUFFERING_PERIOD: + case HEVC_SEI_TYPE_PICTURE_TIMING: + case HEVC_SEI_TYPE_PAN_SCAN_RECT: + case HEVC_SEI_TYPE_RECOVERY_POINT: + case HEVC_SEI_TYPE_DISPLAY_ORIENTATION: + case HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS: + case HEVC_SEI_TYPE_DECODED_PICTURE_HASH: + case HEVC_SEI_TYPE_TIME_CODE: + case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO: + case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO: + case HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS: + case HEVC_SEI_TYPE_ALPHA_CHANNEL_INFO: + break; + case HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: + av_buffer_unref(&payload->payload.user_data_registered.data_ref); + break; + case HEVC_SEI_TYPE_USER_DATA_UNREGISTERED: + av_buffer_unref(&payload->payload.user_data_unregistered.data_ref); + break; + default: + av_buffer_unref(&payload->payload.other.data_ref); + break; + } +} + +static void cbs_h265_free_sei(void *opaque, uint8_t *content) +{ + H265RawSEI *sei = (H265RawSEI*)content; + int i; + for (i = 0; i < sei->payload_count; i++) + cbs_h265_free_sei_payload(&sei->payload[i]); + av_freep(&content); +} + +static const CodedBitstreamUnitTypeDescriptor cbs_h265_unit_types[] = { + CBS_UNIT_TYPE_INTERNAL_REF(HEVC_NAL_VPS, H265RawVPS, extension_data.data), + CBS_UNIT_TYPE_INTERNAL_REF(HEVC_NAL_SPS, H265RawSPS, extension_data.data), + CBS_UNIT_TYPE_INTERNAL_REF(HEVC_NAL_PPS, H265RawPPS, extension_data.data), + + CBS_UNIT_TYPE_POD(HEVC_NAL_AUD, H265RawAUD), + + { + // Slices of non-IRAP pictures. + .nb_unit_types = CBS_UNIT_TYPE_RANGE, + .unit_type_range_start = HEVC_NAL_TRAIL_N, + .unit_type_range_end = HEVC_NAL_RASL_R, + + .content_type = CBS_CONTENT_TYPE_INTERNAL_REFS, + .content_size = sizeof(H265RawSlice), + .nb_ref_offsets = 1, + .ref_offsets = { offsetof(H265RawSlice, data) }, + }, + + { + // Slices of IRAP pictures. + .nb_unit_types = CBS_UNIT_TYPE_RANGE, + .unit_type_range_start = HEVC_NAL_BLA_W_LP, + .unit_type_range_end = HEVC_NAL_CRA_NUT, + + .content_type = CBS_CONTENT_TYPE_INTERNAL_REFS, + .content_size = sizeof(H265RawSlice), + .nb_ref_offsets = 1, + .ref_offsets = { offsetof(H265RawSlice, data) }, + }, + + { + .nb_unit_types = 2, + .unit_types = { + HEVC_NAL_SEI_PREFIX, + HEVC_NAL_SEI_SUFFIX + }, + .content_type = CBS_CONTENT_TYPE_COMPLEX, + .content_size = sizeof(H265RawSEI), + .content_free = &cbs_h265_free_sei, + }, + + CBS_UNIT_TYPE_END_OF_LIST +}; + const CodedBitstreamType ff_cbs_type_h264 = { .codec_id = AV_CODEC_ID_H264, @@ -1490,6 +1476,8 @@ const CodedBitstreamType ff_cbs_type_h265 = { .priv_data_size = sizeof(CodedBitstreamH265Context), + .unit_types = cbs_h265_unit_types, + .split_fragment = &cbs_h2645_split_fragment, .read_unit = &cbs_h265_read_nal_unit, .write_unit = &cbs_h265_write_nal_unit, From patchwork Sun May 3 22:05:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19466 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 18F6944B916 for ; Mon, 4 May 2020 01:06:13 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F240568C1C6; Mon, 4 May 2020 01:06:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 51D0A68C0C2 for ; Mon, 4 May 2020 01:06:01 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id v4so14147442wme.1 for ; Sun, 03 May 2020 15:06:01 -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:mime-version :content-transfer-encoding; bh=ACibOEwzABeTyZD6OqcsRVgWcSKbEolLyAaHbKdxEt4=; b=l4C4INBnqlwLD3zF7vsruZeDCe8Wq/yBLDKWSMzgoKCsk3/vO2ZGZAI75+HfnQWK0c LHS6vJuiQG2+SOhhcPnOHJ12/vZqd+NN68SVCfWLJ32w3dLCnj+svEOfwz8jh6ybpoPT xIFMTi6Jr8/SSO/LliWXq/BBYDsjX0urVNlpvIjW9+QHc+aW9qL2IThSCZ3edJ+8K8z9 4ZV96EEiN1UsY2wlm9YzHOndZzq+8JLyxOoUjSnSVVBBP5ISEIuvQ40+/Agv+0b/wXPv sfU21S2GGnEJMBLD/+vAXeUQcZCOgLMmvVX5dN/BmrV51XgXaEiysB3VH//Fo9ZYVsCx u9pw== 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:mime-version:content-transfer-encoding; bh=ACibOEwzABeTyZD6OqcsRVgWcSKbEolLyAaHbKdxEt4=; b=ZY6uWyCMT6NoN8VFL2YFUgsb8EDabkO49gdkxC7GVFUR+XeVqiLRn/OT1EJgF6W8w/ ONxBdaQLMWPKymLb04i0mXdIbiyom77PCAUVvjMRPNHJw2v5hdA2uNSsQLWQvnIm8273 nindtsSxVOX7fiM8DAh+uoPZez250YPhDKQnEe/tyZ4G6eiYdEuNKOW1muEgghwcKiUb jv8hhM70mv9ykNeeMLRSBnltrIq88BVgt5I65l9+xKllPuKmQ1Vi7QveZW27aA/wTePI PpUs3dHgBQ4Jo7whwBWMq/+nKhcDjh8aW+mpq5/IoblRhjYsIpD6qRldT+dX3tp49fOR M60A== X-Gm-Message-State: AGi0PuZDHJ1Hhk16VBymdw448vVpDENozfVfvdX0xwzrRqX6PAiOCigO EUnZfT3EyxFlW3PN1bBw7Y46NXYx7K8= X-Google-Smtp-Source: APiQypLp0dW2TY5Kn91Ll0WgWyR3RTfFuLlp0bnuiSjWa/IXDheOIgUkHEwVxtU4a02HGitCLt3dkw== X-Received: by 2002:a05:600c:20c:: with SMTP id 12mr10948330wmi.158.1588543560556; Sun, 03 May 2020 15:06:00 -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 a24sm10307285wmb.24.2020.05.03.15.05.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:05:59 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:36 +0100 Message-Id: <20200503220548.23543-10-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 10/22] cbs_vp9: Use table-based alloc/free 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" --- libavcodec/cbs_vp9.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/libavcodec/cbs_vp9.c b/libavcodec/cbs_vp9.c index eef603bfb2..37b817cfde 100644 --- a/libavcodec/cbs_vp9.c +++ b/libavcodec/cbs_vp9.c @@ -479,13 +479,6 @@ static int cbs_vp9_split_fragment(CodedBitstreamContext *ctx, return 0; } -static void cbs_vp9_free_frame(void *opaque, uint8_t *content) -{ - VP9RawFrame *frame = (VP9RawFrame*)content; - av_buffer_unref(&frame->data_ref); - av_freep(&frame); -} - static int cbs_vp9_read_unit(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit) { @@ -497,8 +490,7 @@ static int cbs_vp9_read_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*frame), - &cbs_vp9_free_frame); + err = ff_cbs_alloc_unit_content2(ctx, unit); if (err < 0) return err; frame = unit->content; @@ -642,11 +634,18 @@ static int cbs_vp9_assemble_fragment(CodedBitstreamContext *ctx, return 0; } +static const CodedBitstreamUnitTypeDescriptor cbs_vp9_unit_types[] = { + CBS_UNIT_TYPE_INTERNAL_REF(0, VP9RawFrame, data), + CBS_UNIT_TYPE_END_OF_LIST +}; + const CodedBitstreamType ff_cbs_type_vp9 = { .codec_id = AV_CODEC_ID_VP9, .priv_data_size = sizeof(CodedBitstreamVP9Context), + .unit_types = cbs_vp9_unit_types, + .split_fragment = &cbs_vp9_split_fragment, .read_unit = &cbs_vp9_read_unit, .write_unit = &cbs_vp9_write_unit, From patchwork Sun May 3 22:05:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19473 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 53F7E44BA76 for ; Mon, 4 May 2020 01:08:16 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 324E068C206; Mon, 4 May 2020 01:06:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3DCC368C0BC for ; Mon, 4 May 2020 01:06:02 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id r26so6707167wmh.0 for ; Sun, 03 May 2020 15:06:02 -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:mime-version :content-transfer-encoding; bh=Np/5pVc8CoSxaT1CvYB6sMke5JXfkwKypOun2gAkmnA=; b=hAdKLn8Y4Dr91v+JsUZWVMeUys4rz5UpYcc2RkpFB/sY/hwzGp6FxxNwuxggeolouw Z0iTo+6QaW5XrxVGVnyOz4/cxUnoBCvS53NnhQJmQ7MVmjA8DuK7f9e/IReqyL67bWdq ZhMO5njzgPvRBFXR6SzAl8kKD4RvC/kYfM5FuhpuGoNmcakG5bamDXt7UqiBt8QrmP3o yp2u2XT+V7LGWdfuf6anRGJV4Q5J9wWr/cPn51lla9TBOhWvyNdEOcf3LgfWuX3zBj3p 1sGbGTNWBHz8RgFVfobaG7WNPMUqw5dOcz11IWf1h9TqTimBa6mko3gMB7sfzpQE0n3d BBig== 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:mime-version:content-transfer-encoding; bh=Np/5pVc8CoSxaT1CvYB6sMke5JXfkwKypOun2gAkmnA=; b=DdGwrxdGNY/KUifGUE+LkWsCWTCyeD4ewPjGRU9AgVEIhbjZPgbo83IyFMpZYFvRVd LapNBBB1XULt0PY+kf6s2wX1WeO9w/eD8trOcsW+ocdA2E+eb0GP/FyLjQGwEU4Jxs4r rLs4lYrvuOc4Cq5XYoOUqiowoiHja+CNy56PBFChQvx7SfwP8jg9wWsdVhY9fRv5Q9kh gJHQzWQzdYFdEqH8n2QddQuXKtyoMPCexoM6MqZc9HC5qvAI90fHvTOtreR/Dg6e0apH TxBYdMDj/6FsBgv3j0+tYQssxb1JtKiXBEviQ1Fmo0OzSI9v++TACA6B6OmJXGUARdN4 nA5g== X-Gm-Message-State: AGi0PubpKLsOIx2rnAW0RU8zBiyO72IhqzowBhb8vZjq7H81NJG1SxKF BzMHrq55/BsCgzKZ8tt5yXmWX3cU6Rk= X-Google-Smtp-Source: APiQypKA58QPU0yJGnew05RgRARAnXvQ9LWMiL2ixhU2gTh64QEwTRiztMY6pR5HmGQqphsXuMoj7w== X-Received: by 2002:a7b:cb0c:: with SMTP id u12mr12088686wmj.137.1588543561442; Sun, 03 May 2020 15:06:01 -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 a24sm10307285wmb.24.2020.05.03.15.06.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:00 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:37 +0100 Message-Id: <20200503220548.23543-11-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 11/22] cbs_av1: Use table-based alloc/free 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" --- libavcodec/cbs_av1.c | 85 ++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 46 deletions(-) diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c index fc228086c2..7b1f6c8a44 100644 --- a/libavcodec/cbs_av1.c +++ b/libavcodec/cbs_av1.c @@ -812,50 +812,6 @@ fail: return err; } -static void cbs_av1_free_tile_data(AV1RawTileData *td) -{ - av_buffer_unref(&td->data_ref); -} - -static void cbs_av1_free_padding(AV1RawPadding *pd) -{ - av_buffer_unref(&pd->payload_ref); -} - -static void cbs_av1_free_metadata(AV1RawMetadata *md) -{ - switch (md->metadata_type) { - case AV1_METADATA_TYPE_ITUT_T35: - av_buffer_unref(&md->metadata.itut_t35.payload_ref); - break; - } -} - -static void cbs_av1_free_obu(void *opaque, uint8_t *content) -{ - AV1RawOBU *obu = (AV1RawOBU*)content; - - switch (obu->header.obu_type) { - case AV1_OBU_TILE_GROUP: - cbs_av1_free_tile_data(&obu->obu.tile_group.tile_data); - break; - case AV1_OBU_FRAME: - cbs_av1_free_tile_data(&obu->obu.frame.tile_group.tile_data); - break; - case AV1_OBU_TILE_LIST: - cbs_av1_free_tile_data(&obu->obu.tile_list.tile_data); - break; - case AV1_OBU_METADATA: - cbs_av1_free_metadata(&obu->obu.metadata); - break; - case AV1_OBU_PADDING: - cbs_av1_free_padding(&obu->obu.padding); - break; - } - - av_freep(&obu); -} - static int cbs_av1_ref_tile_data(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit, GetBitContext *gbc, @@ -890,8 +846,7 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx, GetBitContext gbc; int err, start_pos, end_pos; - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*obu), - &cbs_av1_free_obu); + err = ff_cbs_alloc_unit_content2(ctx, unit); if (err < 0) return err; obu = unit->content; @@ -1260,11 +1215,49 @@ static void cbs_av1_close(CodedBitstreamContext *ctx) av_buffer_unref(&priv->frame_header_ref); } +static void cbs_av1_free_metadata(void *unit, uint8_t *content) +{ + AV1RawOBU *obu = (AV1RawOBU*)content; + AV1RawMetadata *md; + + av_assert0(obu->header.obu_type == AV1_OBU_METADATA); + md = &obu->obu.metadata; + + switch (md->metadata_type) { + case AV1_METADATA_TYPE_ITUT_T35: + av_buffer_unref(&md->metadata.itut_t35.payload_ref); + break; + } +} + +static const CodedBitstreamUnitTypeDescriptor cbs_av1_unit_types[] = { + CBS_UNIT_TYPE_POD(AV1_OBU_SEQUENCE_HEADER, AV1RawOBU), + CBS_UNIT_TYPE_POD(AV1_OBU_TEMPORAL_DELIMITER, AV1RawOBU), + CBS_UNIT_TYPE_POD(AV1_OBU_FRAME_HEADER, AV1RawOBU), + CBS_UNIT_TYPE_POD(AV1_OBU_REDUNDANT_FRAME_HEADER, AV1RawOBU), + + CBS_UNIT_TYPE_INTERNAL_REF(AV1_OBU_TILE_GROUP, AV1RawOBU, + obu.tile_group.tile_data.data), + CBS_UNIT_TYPE_INTERNAL_REF(AV1_OBU_FRAME, AV1RawOBU, + obu.frame.tile_group.tile_data.data), + CBS_UNIT_TYPE_INTERNAL_REF(AV1_OBU_TILE_LIST, AV1RawOBU, + obu.tile_list.tile_data.data), + CBS_UNIT_TYPE_INTERNAL_REF(AV1_OBU_PADDING, AV1RawOBU, + obu.padding.payload), + + CBS_UNIT_TYPE_COMPLEX(AV1_OBU_METADATA, AV1RawOBU, + &cbs_av1_free_metadata), + + CBS_UNIT_TYPE_END_OF_LIST +}; + const CodedBitstreamType ff_cbs_type_av1 = { .codec_id = AV_CODEC_ID_AV1, .priv_data_size = sizeof(CodedBitstreamAV1Context), + .unit_types = cbs_av1_unit_types, + .split_fragment = &cbs_av1_split_fragment, .read_unit = &cbs_av1_read_unit, .write_unit = &cbs_av1_write_obu, From patchwork Sun May 3 22:05:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19460 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id C5DBB44B916 for ; Mon, 4 May 2020 01:06:06 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AF62A68C109; Mon, 4 May 2020 01:06:06 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6306768C0B8 for ; Mon, 4 May 2020 01:06:03 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id k1so18679160wrx.4 for ; Sun, 03 May 2020 15:06:03 -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:mime-version :content-transfer-encoding; bh=eHbMmEIJC8vMjmefiYcEnejXZLWcob8cekGmpiCpa90=; b=jfpfFhFMoPlbyRZm04ID2zhkdVBacSh3c3e9Xy84dvAF5sHSLnym+EcL2o8GleVeLw 23Xn6NG2Wd2euY7peAVSWR6vZfVvfjkOYnXoCWWH5biiWppq1Hew2M7BCZuSZONzalUY p4fbcIhP7ZCaCt/ZZZm9uZvxNQbD2bF32I/DRzJHdGC1119CZhWh2odoeJCo5Gl+hvHp Mtsa69CY+XJmVmlU+DByhLakQHkbg/K0Fy18z+WJmoCRloUYrJptqL09xeUXahyTNHQ4 kLiBctd5XXumdm4fHP4hYif13/9ca25tvkkRJMKMy364k3mBQfv/SUHmn9P+xZkCgUM5 vH1Q== 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:mime-version:content-transfer-encoding; bh=eHbMmEIJC8vMjmefiYcEnejXZLWcob8cekGmpiCpa90=; b=JsyQn4wM5UkqmCherJqR7WJPR1qWAOC91xrwEE/nKngVdnJ1IXOUcqnIiK6NQaji5i eQnqXbb/FgQSEIHtYLFqI7vdhc+glmq8AMjIErxHlUcKKnuOvXLFQ2Dr1d+7VNJ6DGcM 7+MEPHAU5MoyQKfa3ibQUPLgVS/ZLufUOkU3f+14rDo6ix8XJrLnl5zhJMA2KJ5KCP8W cT/aDjmjxLijko/RCv1Yt5vVbuhxSz+QznVGh17IcbXRLWiPft8qfhJ7J86kyDy/yKWh 4PBeMTKUVEm7SSc6Kr9jThTkfL3GHINVxmjfMkofGg8tVf3D22OCPRbzk7xMST6edh+H 6g7g== X-Gm-Message-State: AGi0PuaWk+g7Qcpc+XZHOxnO+FVbYudCMtfA4mkk9OKig2rwm5lEK1sS YxTzugI9q7Xtyk++wPbV6A5DNom3tmI= X-Google-Smtp-Source: APiQypJeV2vjFUvt1X1K2jGv8VSYw4objqF6VsLafvNkRdWbCykWID7rjygqnCteifhbFgYLFZ2fpw== X-Received: by 2002:a5d:5309:: with SMTP id e9mr2714438wrv.311.1588543562284; Sun, 03 May 2020 15:06:02 -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 a24sm10307285wmb.24.2020.05.03.15.06.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:01 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:38 +0100 Message-Id: <20200503220548.23543-12-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 12/22] cbs_mpeg2: Use table-based alloc/free 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" --- libavcodec/cbs_mpeg2.c | 70 +++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/libavcodec/cbs_mpeg2.c b/libavcodec/cbs_mpeg2.c index 97f7889cbb..94e02945f3 100644 --- a/libavcodec/cbs_mpeg2.c +++ b/libavcodec/cbs_mpeg2.c @@ -140,28 +140,6 @@ #undef infer -static void cbs_mpeg2_free_picture_header(void *opaque, uint8_t *content) -{ - MPEG2RawPictureHeader *picture = (MPEG2RawPictureHeader*)content; - av_buffer_unref(&picture->extra_information_picture.extra_information_ref); - av_freep(&content); -} - -static void cbs_mpeg2_free_user_data(void *opaque, uint8_t *content) -{ - MPEG2RawUserData *user = (MPEG2RawUserData*)content; - av_buffer_unref(&user->user_data_ref); - av_freep(&content); -} - -static void cbs_mpeg2_free_slice(void *opaque, uint8_t *content) -{ - MPEG2RawSlice *slice = (MPEG2RawSlice*)content; - av_buffer_unref(&slice->header.extra_information_slice.extra_information_ref); - av_buffer_unref(&slice->data_ref); - av_freep(&content); -} - static int cbs_mpeg2_split_fragment(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, int header) @@ -231,16 +209,14 @@ static int cbs_mpeg2_read_unit(CodedBitstreamContext *ctx, if (err < 0) return err; + err = ff_cbs_alloc_unit_content2(ctx, unit); + if (err < 0) + return err; + if (MPEG2_START_IS_SLICE(unit->type)) { - MPEG2RawSlice *slice; + MPEG2RawSlice *slice = unit->content; int pos, len; - err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(*slice), - &cbs_mpeg2_free_slice); - if (err < 0) - return err; - slice = unit->content; - err = cbs_mpeg2_read_slice_header(ctx, &gbc, &slice->header); if (err < 0) return err; @@ -264,12 +240,7 @@ static int cbs_mpeg2_read_unit(CodedBitstreamContext *ctx, #define START(start_code, type, read_func, free_func) \ case start_code: \ { \ - type *header; \ - err = ff_cbs_alloc_unit_content(ctx, unit, \ - sizeof(*header), free_func); \ - if (err < 0) \ - return err; \ - header = unit->content; \ + type *header = unit->content; \ err = cbs_mpeg2_read_ ## read_func(ctx, &gbc, header); \ if (err < 0) \ return err; \ @@ -420,11 +391,40 @@ static int cbs_mpeg2_assemble_fragment(CodedBitstreamContext *ctx, return 0; } +static const CodedBitstreamUnitTypeDescriptor cbs_mpeg2_unit_types[] = { + CBS_UNIT_TYPE_INTERNAL_REF(MPEG2_START_PICTURE, MPEG2RawPictureHeader, + extra_information_picture.extra_information), + + { + .nb_unit_types = CBS_UNIT_TYPE_RANGE, + .unit_type_range_start = 0x01, + .unit_type_range_end = 0xaf, + + .content_type = CBS_CONTENT_TYPE_INTERNAL_REFS, + .content_size = sizeof(MPEG2RawSlice), + .nb_ref_offsets = 2, + .ref_offsets = { offsetof(MPEG2RawSlice, header.extra_information_slice.extra_information), + offsetof(MPEG2RawSlice, data) }, + }, + + CBS_UNIT_TYPE_INTERNAL_REF(MPEG2_START_USER_DATA, MPEG2RawUserData, + user_data), + + CBS_UNIT_TYPE_POD(MPEG2_START_SEQUENCE_HEADER, MPEG2RawSequenceHeader), + CBS_UNIT_TYPE_POD(MPEG2_START_EXTENSION, MPEG2RawExtensionData), + CBS_UNIT_TYPE_POD(MPEG2_START_SEQUENCE_END, MPEG2RawSequenceEnd), + CBS_UNIT_TYPE_POD(MPEG2_START_GROUP, MPEG2RawGroupOfPicturesHeader), + + CBS_UNIT_TYPE_END_OF_LIST +}; + const CodedBitstreamType ff_cbs_type_mpeg2 = { .codec_id = AV_CODEC_ID_MPEG2VIDEO, .priv_data_size = sizeof(CodedBitstreamMPEG2Context), + .unit_types = cbs_mpeg2_unit_types, + .split_fragment = &cbs_mpeg2_split_fragment, .read_unit = &cbs_mpeg2_read_unit, .write_unit = &cbs_mpeg2_write_unit, From patchwork Sun May 3 22:05:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19462 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0D85D44B916 for ; Mon, 4 May 2020 01:06:09 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EB97268C170; Mon, 4 May 2020 01:06:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2D51368C0D3 for ; Mon, 4 May 2020 01:06:04 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id s8so8350188wrt.9 for ; Sun, 03 May 2020 15:06:04 -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:mime-version :content-transfer-encoding; bh=gNOaQJ/fzaboTZI8tqv+UPwzLnGQqn2G3uVJIR4BFNI=; b=do9Zd8qHWl+qAOGx2Cu9MCQifjs6gNIJmDRkEZMpMfaR64CY07TuzJd82ujMtjzvgM G6zaPRy/nYLY/whZxViLOQaHBSAK7rb1FhzQ3exDVa9hCgBqpKIrUuUJOwCve7c0c6uC uaV/EmCsjpIIsh0Fv4EKcMrPEdC167iaWzucA2CPpPo+VNSJySvTNw6+t/Awtf8WAqil ETKiQhHfXaAGGqXS3RGJj05TmNbZJr2X6uYws89au5GBLrA4aTHzLWtBhTtlOh641Mwt +QO+1rA/9Kl8KKgohCfnlFEcHUDglQXuejnhjRM08XofW5MR/OrN6GMfjsgYqFNXOvR7 zt4A== 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:mime-version:content-transfer-encoding; bh=gNOaQJ/fzaboTZI8tqv+UPwzLnGQqn2G3uVJIR4BFNI=; b=RpAGgJmjl/FAOndV6LxMWvolN5g6JkvZIPpyCN5v/kh8ri/eoZtyJzyB64no14OFia nyLwe7YDQ+J9FSLfFWMA0qzSqDDZh4UELwW34xyXNz6lgCo0ySHp3oBTyaPsIZX96zz0 Tx5dDBdrXzrC/G729KXMOQ1rR7i6j5cS2fS48SyVtCtUnrDOSdnjOPnHnKJkkK2rfDn1 PSewKFuosawtBu5vnltJ9OvKmIX89kf5gy3/uI7TnjCJ0kCEs6DK8aw2QkwnC2uVwTiq 37eyb8r6nojNDHrOVHlxPIo3EXSA3ZsRG5ScZYFJrVXRIt8Ne0+Mxcj3IVqJzNUC+1j5 QGTQ== X-Gm-Message-State: AGi0Pub1htQAYZ6yCYKQfTEs8RV5yGEYEcjjdNZbW2fyWgNMUvJ7p4Ka AY6NtsO2GICrCaODrT+6Ie7NJF/exFk= X-Google-Smtp-Source: APiQypLa3GR6hQGSE57BQbVoly7XhwE0zjzw2T+bBgJgNWQynwSpBkDz7bvhY0cspocVadp81yPujg== X-Received: by 2002:adf:fcc8:: with SMTP id f8mr15548256wrs.230.1588543563263; Sun, 03 May 2020 15:06:03 -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 a24sm10307285wmb.24.2020.05.03.15.06.02 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:02 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:39 +0100 Message-Id: <20200503220548.23543-13-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 13/22] cbs: Expose the function to insert a new empty unit into a fragment 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" This will be helpful when adding new SEI to an existing access unit. --- libavcodec/cbs.c | 10 +++++----- libavcodec/cbs.h | 7 +++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c index 2f39ddbfb4..2346b1621b 100644 --- a/libavcodec/cbs.c +++ b/libavcodec/cbs.c @@ -680,9 +680,9 @@ int ff_cbs_alloc_unit_data(CodedBitstreamContext *ctx, return 0; } -static int cbs_insert_unit(CodedBitstreamContext *ctx, - CodedBitstreamFragment *frag, - int position) +int ff_cbs_insert_unit(CodedBitstreamContext *ctx, + CodedBitstreamFragment *frag, + int position) { CodedBitstreamUnit *units; @@ -742,7 +742,7 @@ int ff_cbs_insert_unit_content(CodedBitstreamContext *ctx, content_ref = NULL; } - err = cbs_insert_unit(ctx, frag, position); + err = ff_cbs_insert_unit(ctx, frag, position); if (err < 0) { av_buffer_unref(&content_ref); return err; @@ -781,7 +781,7 @@ int ff_cbs_insert_unit_data(CodedBitstreamContext *ctx, return AVERROR(ENOMEM); } - err = cbs_insert_unit(ctx, frag, position); + err = ff_cbs_insert_unit(ctx, frag, position); if (err < 0) { av_buffer_unref(&data_ref); return err; diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h index eb7f4b878b..09b06a047d 100644 --- a/libavcodec/cbs.h +++ b/libavcodec/cbs.h @@ -370,6 +370,13 @@ int ff_cbs_alloc_unit_data(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit, size_t size); +/** + * Insert a new empty unit into a fragment. + */ +int ff_cbs_insert_unit(CodedBitstreamContext *ctx, + CodedBitstreamFragment *frag, + int position); + /** * Insert a new unit into a fragment with the given content. * From patchwork Sun May 3 22:05:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19465 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1C2F144B916 for ; Mon, 4 May 2020 01:06:12 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0AFA168C1AB; Mon, 4 May 2020 01:06:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7DE6E68C0DF for ; Mon, 4 May 2020 01:06:05 +0300 (EEST) Received: by mail-wr1-f45.google.com with SMTP id d15so18682705wrx.3 for ; Sun, 03 May 2020 15:06:05 -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:mime-version :content-transfer-encoding; bh=yZpWH3kcBD0+h+4OkUCTQXPYuUoMOnR5ayj5b+8YBhY=; b=NCmYF76hXH0KpoN6qhXk6jkxOWgH0Uy4acByJN4k+oNIB0IHUNYVVdFpAjeZ+GbxKl 2kMdyPSAfOEMcTp4zm/bWX5lRL9+yLIIgq4ZuWqG7kiZ3ORB95mzOakcQ2qjKSTx18mo ZXTUG5fFBDUMDtYM4qJoGEfUunDZHsy1MyY3Scx1WtXmvlTlz89NQ+dY5OzgIpnwWMEE d2P1tdaGVWhkg2UmAe984AIO1pdRlsuIaMx9spQZzb3oUUc4dYIr1jzSNC8d+o/8yvWP Z0QhLPr3Y3vQuNz5FVnTgEyzmy9gij+06z6VWiXxD1P4H8zsQKYX+vOCzERKhaUIs6ss YUOA== 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:mime-version:content-transfer-encoding; bh=yZpWH3kcBD0+h+4OkUCTQXPYuUoMOnR5ayj5b+8YBhY=; b=Q8PMRNf28sGiXRkDV9ae51RcQofBQkIYikkIOioZPDwEMAOr6F4JX82MS0Dizs1Bw0 aLW+wKhYuGXNHjVS3Tx5cqixMo+FUAFi+b7f3QebpirQdJcgOYpB64yQaR8ctE9JUntl 4p80LaNF98viNZjehPn7yfr5im48dHPuM6jjwKg/IJg0wDRU4L78Rr98rY07eUSSCA/3 7n4VeFbKnuEpK787Xe0tDMFzHmcLVVXfBJ9RJC0O+NZMEYmBi8ytoSTZBSXiw08pPbP3 ygjHgz49NT3ziD7WtXV5oQk4wB+drr4BQf0c6nyzPSo06PnKSOvqptanCzmrReWYAjAj ol3g== X-Gm-Message-State: AGi0PuZ0uiU6BHOGblifUwmfQP7mrFC/nKrIDy5V4CFDXupc4+pQvyjl 4jYMKw8hPw8arrIdLlxkxMS/R0fQE3I= X-Google-Smtp-Source: APiQypIzG0dwZ8+QCtjYcc/43VXqPEFwRowsZEbLNH12H0UKo8rEbDkgqVOBPnO47dL/1MaSHPxc1Q== X-Received: by 2002:adf:f5ce:: with SMTP id k14mr17024393wrp.39.1588543564255; Sun, 03 May 2020 15:06:04 -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 a24sm10307285wmb.24.2020.05.03.15.06.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:03 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:40 +0100 Message-Id: <20200503220548.23543-14-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 14/22] cbs_h264: Simplify SEI addition 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" At the same time, move the H.264 SEI functions to a new file - the combined H.26[45] CBS file is already very large, and these functions do not require any of the common read/write elements. --- libavcodec/Makefile | 2 +- libavcodec/cbs_h264.c | 106 +++++++++++++++++++++++++++++++++++++++++ libavcodec/cbs_h264.h | 11 +++++ libavcodec/cbs_h2645.c | 96 +------------------------------------ 4 files changed, 120 insertions(+), 95 deletions(-) create mode 100644 libavcodec/cbs_h264.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 28076c2c83..076f2fd953 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -67,7 +67,7 @@ OBJS-$(CONFIG_BSWAPDSP) += bswapdsp.o OBJS-$(CONFIG_CABAC) += cabac.o OBJS-$(CONFIG_CBS) += cbs.o OBJS-$(CONFIG_CBS_AV1) += cbs_av1.o -OBJS-$(CONFIG_CBS_H264) += cbs_h2645.o h2645_parse.o +OBJS-$(CONFIG_CBS_H264) += cbs_h2645.o cbs_h264.o h2645_parse.o OBJS-$(CONFIG_CBS_H265) += cbs_h2645.o h2645_parse.o OBJS-$(CONFIG_CBS_JPEG) += cbs_jpeg.o OBJS-$(CONFIG_CBS_MPEG2) += cbs_mpeg2.o diff --git a/libavcodec/cbs_h264.c b/libavcodec/cbs_h264.c new file mode 100644 index 0000000000..75759c7f25 --- /dev/null +++ b/libavcodec/cbs_h264.c @@ -0,0 +1,106 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "cbs_h264.h" + +int ff_cbs_h264_add_sei_message(CodedBitstreamContext *ctx, + CodedBitstreamFragment *au, + H264RawSEIPayload *payload) +{ + H264RawSEI *sei = NULL; + int err, i; + + // Find an existing SEI NAL unit to add to. + for (i = 0; i < au->nb_units; i++) { + if (au->units[i].type == H264_NAL_SEI) { + sei = au->units[i].content; + if (sei->payload_count < H264_MAX_SEI_PAYLOADS) + break; + + sei = NULL; + } + } + + if (!sei) { + // Need to make a new SEI NAL unit. Insert it before the first + // slice data NAL unit; if no slice data, add at the end. + CodedBitstreamUnit *unit; + + for (i = 0; i < au->nb_units; i++) { + if (au->units[i].type == H264_NAL_SLICE || + au->units[i].type == H264_NAL_IDR_SLICE) + break; + } + + err = ff_cbs_insert_unit(ctx, au, i); + if (err < 0) + goto fail; + unit = &au->units[i]; + + err = ff_cbs_alloc_unit_content2(ctx, unit); + if (err < 0) { + ff_cbs_delete_unit(ctx, au, i); + goto fail; + } + sei = unit->content; + + *sei = (H264RawSEI) { + .nal_unit_header = { + .nal_unit_type = H264_NAL_SEI, + }, + }; + } + + memcpy(&sei->payload[sei->payload_count], payload, sizeof(*payload)); + ++sei->payload_count; + + return 0; +fail: + ff_cbs_h264_free_sei_payload(payload); + return err; +} + +void ff_cbs_h264_delete_sei_message(CodedBitstreamContext *ctx, + CodedBitstreamFragment *au, + CodedBitstreamUnit *nal, + int position) +{ + H264RawSEI *sei = nal->content; + + av_assert0(nal->type == H264_NAL_SEI); + av_assert0(position >= 0 && position < sei->payload_count); + + if (position == 0 && sei->payload_count == 1) { + // Deleting NAL unit entirely. + int i; + + for (i = 0; i < au->nb_units; i++) { + if (&au->units[i] == nal) + break; + } + + ff_cbs_delete_unit(ctx, au, i); + } else { + ff_cbs_h264_free_sei_payload(&sei->payload[position]); + + --sei->payload_count; + memmove(sei->payload + position, + sei->payload + position + 1, + (sei->payload_count - position) * sizeof(*sei->payload)); + } +} diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h index 65659ae52c..abc0c1b732 100644 --- a/libavcodec/cbs_h264.h +++ b/libavcodec/cbs_h264.h @@ -466,11 +466,22 @@ typedef struct CodedBitstreamH264Context { } CodedBitstreamH264Context; +/** + * Free an SEI payload structure. + * + * This is useful to have standalone when manipulating SEI messages inside + * an access unit. + */ +void ff_cbs_h264_free_sei_payload(H264RawSEIPayload *payload); + /** * Add an SEI message to an access unit. * * On success, the payload will be owned by a unit in access_unit; * on failure, the content of the payload will be freed. + * + * Adds at the end of an existing SEI NAL unit if one is present, otherwise + * creates a new SEI NAL unit to contain the message. */ int ff_cbs_h264_add_sei_message(CodedBitstreamContext *ctx, CodedBitstreamFragment *access_unit, diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index b70aa3c39d..3911cfa100 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -1313,7 +1313,7 @@ static void cbs_h265_close(CodedBitstreamContext *ctx) av_buffer_unref(&h265->pps_ref[i]); } -static void cbs_h264_free_sei_payload(H264RawSEIPayload *payload) +void ff_cbs_h264_free_sei_payload(H264RawSEIPayload *payload) { switch (payload->payload_type) { case H264_SEI_TYPE_BUFFERING_PERIOD: @@ -1341,7 +1341,7 @@ static void cbs_h264_free_sei(void *opaque, uint8_t *content) H264RawSEI *sei = (H264RawSEI*)content; int i; for (i = 0; i < sei->payload_count; i++) - cbs_h264_free_sei_payload(&sei->payload[i]); + ff_cbs_h264_free_sei_payload(&sei->payload[i]); av_freep(&content); } @@ -1485,95 +1485,3 @@ const CodedBitstreamType ff_cbs_type_h265 = { .close = &cbs_h265_close, }; - -int ff_cbs_h264_add_sei_message(CodedBitstreamContext *ctx, - CodedBitstreamFragment *au, - H264RawSEIPayload *payload) -{ - H264RawSEI *sei = NULL; - int err, i; - - // Find an existing SEI NAL unit to add to. - for (i = 0; i < au->nb_units; i++) { - if (au->units[i].type == H264_NAL_SEI) { - sei = au->units[i].content; - if (sei->payload_count < H264_MAX_SEI_PAYLOADS) - break; - - sei = NULL; - } - } - - if (!sei) { - // Need to make a new SEI NAL unit. Insert it before the first - // slice data NAL unit; if no slice data, add at the end. - AVBufferRef *sei_ref; - - sei = av_mallocz(sizeof(*sei)); - if (!sei) { - err = AVERROR(ENOMEM); - goto fail; - } - - sei->nal_unit_header.nal_unit_type = H264_NAL_SEI; - sei->nal_unit_header.nal_ref_idc = 0; - - sei_ref = av_buffer_create((uint8_t*)sei, sizeof(*sei), - &cbs_h264_free_sei, NULL, 0); - if (!sei_ref) { - av_freep(&sei); - err = AVERROR(ENOMEM); - goto fail; - } - - for (i = 0; i < au->nb_units; i++) { - if (au->units[i].type == H264_NAL_SLICE || - au->units[i].type == H264_NAL_IDR_SLICE) - break; - } - - err = ff_cbs_insert_unit_content(ctx, au, i, H264_NAL_SEI, - sei, sei_ref); - av_buffer_unref(&sei_ref); - if (err < 0) - goto fail; - } - - memcpy(&sei->payload[sei->payload_count], payload, sizeof(*payload)); - ++sei->payload_count; - - return 0; -fail: - cbs_h264_free_sei_payload(payload); - return err; -} - -void ff_cbs_h264_delete_sei_message(CodedBitstreamContext *ctx, - CodedBitstreamFragment *au, - CodedBitstreamUnit *nal, - int position) -{ - H264RawSEI *sei = nal->content; - - av_assert0(nal->type == H264_NAL_SEI); - av_assert0(position >= 0 && position < sei->payload_count); - - if (position == 0 && sei->payload_count == 1) { - // Deleting NAL unit entirely. - int i; - - for (i = 0; i < au->nb_units; i++) { - if (&au->units[i] == nal) - break; - } - - ff_cbs_delete_unit(ctx, au, i); - } else { - cbs_h264_free_sei_payload(&sei->payload[position]); - - --sei->payload_count; - memmove(sei->payload + position, - sei->payload + position + 1, - (sei->payload_count - position) * sizeof(*sei->payload)); - } -} From patchwork Sun May 3 22:05:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19467 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 25CB744B916 for ; Mon, 4 May 2020 01:06:14 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 116CD68C1C4; Mon, 4 May 2020 01:06:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BBD9968C115 for ; Mon, 4 May 2020 01:06:05 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id u16so6677985wmc.5 for ; Sun, 03 May 2020 15:06:05 -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:mime-version :content-transfer-encoding; bh=5IGvAxra6geAV5t5+hTiIKKS2q3bsplQgAJ4QAEzQSI=; b=SUiDJgCbhKSAZlxGE74X5DsHDRh0LSHRqh4LG1z6ToQkvSDGLctxJRF67mVHOo/9nW PT8A1iCMyTIO+YvrLHFB/hXFOMrfk7IwI7/CkwlxTG37rV9AtXNM258ArjIpxjKCtgOD 4XMJniwfpN3JBhYHITmYPME5016YygyjfuFkhJbeQIL2LuoVeFxt1uj4en9hE0Iij8bS BnDy0nsWE0J8RCUsDD8Wqxx4YngrXMF7bcMANZVywn1WCV6IAYvWUZTnGodMFPwK0lya LjF9F5+kahYHzF+EoAH22RcslycW/6uXkiL8IfLpFiM3E8Fxm54XtyjAeA/QRM0C+Rw/ ZNQQ== 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:mime-version:content-transfer-encoding; bh=5IGvAxra6geAV5t5+hTiIKKS2q3bsplQgAJ4QAEzQSI=; b=kdULfdsYUbOJDbsqogfeKilWp8IV9rBjUa5W/9bxcVo46BUJOfBX7+YNiOc1X6Mtk1 e9ATm0Z8CjBs/fKbwn7949ve2SCKV7Zz1Fwp6BaCeO7s1QpF3A7Ljen2J8JNRCQelUBH hYCZJXHSDIJ56aQqCOFEhYT05oAizOJf5DqqgeUcEyFNdA5/jy725ZpkOrp0vw0sa5LK wU8kAb/dZSbcerO3Y+h/j6gmZj8DZE+af/RtG7HZk8FgOGto1lEEKy45aY9PWQr/T9jg mn2YB85T5VW1vSly3WmnG9MV3Chi6HiQiNhPMGmZO+3e9DuaMqYcDLmjQkWj3Vf525Xk vnLg== X-Gm-Message-State: AGi0PuawbBGLFrqSk791UU554Sz1uBsUmIHbXwJbE2QPG3rF1Bzy50bI voc1Mvj/+jaIsdJziN+jBt3H5uvt7Xk= X-Google-Smtp-Source: APiQypJdqmYBLgc1Yen/5Jm64Ksn6FDgqPIIfssVptrnGr9u/hzxlhAC1nt2CTKIL7rrPZaV+y9aYA== X-Received: by 2002:a7b:cc0e:: with SMTP id f14mr11155132wmh.39.1588543565003; Sun, 03 May 2020 15:06:05 -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 a24sm10307285wmb.24.2020.05.03.15.06.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:04 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:41 +0100 Message-Id: <20200503220548.23543-15-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 15/22] cbs_h264: Add support for frame packing arrangement 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/cbs_h264.h | 24 ++++++++++++++++ libavcodec/cbs_h2645.c | 1 + libavcodec/cbs_h264_syntax_template.c | 40 +++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h index abc0c1b732..512674ec07 100644 --- a/libavcodec/cbs_h264.h +++ b/libavcodec/cbs_h264.h @@ -296,6 +296,29 @@ typedef struct H264RawSEIRecoveryPoint { uint8_t changing_slice_group_idc; } H264RawSEIRecoveryPoint; +typedef struct H264RawSEIFramePackingArrangement { + uint32_t frame_packing_arrangement_id; + uint8_t frame_packing_arrangement_cancel_flag; + + uint8_t frame_packing_arrangement_type; + uint8_t quincunx_sampling_flag; + uint8_t content_interpretation_type; + uint8_t spatial_flipping_flag; + uint8_t frame0_flipped_flag; + uint8_t field_views_flag; + uint8_t current_frame_is_frame0_flag; + uint8_t frame0_self_contained_flag; + uint8_t frame1_self_contained_flag; + uint8_t frame0_grid_position_x; + uint8_t frame0_grid_position_y; + uint8_t frame1_grid_position_x; + uint8_t frame1_grid_position_y; + uint8_t frame_packing_arrangement_reserved_byte; + uint16_t frame_packing_arrangement_repetition_period; + + uint8_t frame_packing_arrangement_extension_flag; +} H264RawSEIFramePackingArrangement; + typedef struct H264RawSEIDisplayOrientation { uint8_t display_orientation_cancel_flag; uint8_t hor_flip; @@ -329,6 +352,7 @@ typedef struct H264RawSEIPayload { H264RawSEIUserDataRegistered user_data_registered; H264RawSEIUserDataUnregistered user_data_unregistered; H264RawSEIRecoveryPoint recovery_point; + H264RawSEIFramePackingArrangement frame_packing_arrangement; H264RawSEIDisplayOrientation display_orientation; H264RawSEIMasteringDisplayColourVolume mastering_display_colour_volume; H264RawSEIAlternativeTransferCharacteristics diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index 3911cfa100..a48b07057d 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -1320,6 +1320,7 @@ void ff_cbs_h264_free_sei_payload(H264RawSEIPayload *payload) case H264_SEI_TYPE_PIC_TIMING: case H264_SEI_TYPE_PAN_SCAN_RECT: case H264_SEI_TYPE_RECOVERY_POINT: + case H264_SEI_TYPE_FRAME_PACKING: case H264_SEI_TYPE_DISPLAY_ORIENTATION: case H264_SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME: case H264_SEI_TYPE_ALTERNATIVE_TRANSFER: diff --git a/libavcodec/cbs_h264_syntax_template.c b/libavcodec/cbs_h264_syntax_template.c index b65460996b..7880b1472c 100644 --- a/libavcodec/cbs_h264_syntax_template.c +++ b/libavcodec/cbs_h264_syntax_template.c @@ -779,6 +779,42 @@ static int FUNC(sei_recovery_point)(CodedBitstreamContext *ctx, RWContext *rw, return 0; } +static int FUNC(sei_frame_packing_arrangement)(CodedBitstreamContext *ctx, RWContext *rw, + H264RawSEIFramePackingArrangement *current) +{ + int err; + + HEADER("Frame Packing Arrangement"); + + ue(frame_packing_arrangement_id, 0, UINT32_MAX - 1); + flag(frame_packing_arrangement_cancel_flag); + + if (!current->frame_packing_arrangement_cancel_flag) { + u(7, frame_packing_arrangement_type, 0, 7); + flag(quincunx_sampling_flag); + u(6, content_interpretation_type, 0, 2); + flag(spatial_flipping_flag); + flag(frame0_flipped_flag); + flag(field_views_flag); + flag(current_frame_is_frame0_flag); + flag(frame0_self_contained_flag); + flag(frame1_self_contained_flag); + if (!current->quincunx_sampling_flag && + current->frame_packing_arrangement_type != 5) { + ub(4, frame0_grid_position_x); + ub(4, frame0_grid_position_y); + ub(4, frame1_grid_position_x); + ub(4, frame1_grid_position_y); + } + u(8, frame_packing_arrangement_reserved_byte, 0, 0); + ue(frame_packing_arrangement_repetition_period, 0, 16384); + } + + flag(frame_packing_arrangement_extension_flag); + + return 0; +} + static int FUNC(sei_display_orientation)(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEIDisplayOrientation *current) { @@ -879,6 +915,10 @@ static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw, CHECK(FUNC(sei_display_orientation) (ctx, rw, ¤t->payload.display_orientation)); break; + case H264_SEI_TYPE_FRAME_PACKING: + CHECK(FUNC(sei_frame_packing_arrangement) + (ctx, rw, ¤t->payload.frame_packing_arrangement)); + break; case H264_SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME: CHECK(FUNC(sei_mastering_display_colour_volume) (ctx, rw, ¤t->payload.mastering_display_colour_volume)); From patchwork Sun May 3 22:05:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19468 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3BC9244B916 for ; Mon, 4 May 2020 01:06:15 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1EB4E68C1EF; Mon, 4 May 2020 01:06:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E03E968C0BC for ; Mon, 4 May 2020 01:06:06 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id g12so6671137wmh.3 for ; Sun, 03 May 2020 15:06:06 -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:mime-version :content-transfer-encoding; bh=UFQjzdiR1BEz4tIIQ+uYm6HH9ChV1Z56s/FmvK5DD40=; b=wfqK8PA1VnN5liwyOL3a7fVYwF4vHsGJrLkdd7qIfKazwVmnXhR++Fx+QUofxf80Nx IvDyIJZBvsEgy2moSfGZWy6HmL1y+pGYd77TNjMRtqiVtwxIcr1sQyEj52TLVyE41S0f xMOagw35+qAjzZrCHTYUJrVIc4yKWRH2wdOx+05/OCCWzpXfiPBe3tMd8MCU0cN1fw9t kOtJ1pOdmdUs1Hbx0mH2Vpmb2KTXJq3wqfI51eT6rM+CH3QzH5DZIBkMqsA211r67Ynu 118f5VR4n6oLajGPGrM2zXoTOV+g2PP1JT3HM620vpLvFAd0/6zEDlryZYb2vH6xLiTl QlZg== 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:mime-version:content-transfer-encoding; bh=UFQjzdiR1BEz4tIIQ+uYm6HH9ChV1Z56s/FmvK5DD40=; b=EdTEpCBMK+06oCpLSPeOrPgvzwGVZQiI7LB/JAF+mYj+WO5wvK6S/OEOW66H3V/AQ3 LGQWilvPqavXjr8xeG1dpp6Ypyjw7MlJL0/dIDjHrkNWKjUGnRL5MsUyMS8XL3htaEBG notzA/H5obYxeRbQvIu5lWCpYsJ6Oe/0VLFsGxGndg87BDvWOWSpemDtFFRK4hEGXM9M SJHEe8I3/YR5t2+jcZQM6yW07EaYrJJ8I7Xoruay4LqXkF9h3Y5ZdEnpEu6MR/F191Lm ogHmjZK9dzhCyH3NXWzi3+rW77h/yc4BQSpmmxh06aEsEssrDTE2xQfbIHsUOxMhQ+5j 12KQ== X-Gm-Message-State: AGi0PubBNja3WnqwvYcahn43NDM0Tpq5cZi5HTJSIwLofFUqPE1vrxPs Jb0G2+HDQ5YvD2h0XOGX+xLvziSgJUs= X-Google-Smtp-Source: APiQypI9gQhBC87UbjsmQrrMql4R72JWxy4ocaLR1tYX8G7wHoT7C6XIpGiU+ozUyG7kHwD+yK4tSA== X-Received: by 2002:a1c:3c54:: with SMTP id j81mr10793663wma.140.1588543565908; Sun, 03 May 2020 15:06:05 -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 a24sm10307285wmb.24.2020.05.03.15.06.05 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:05 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:42 +0100 Message-Id: <20200503220548.23543-16-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 16/22] cbs_h264: Add a function to turn stereo 3D metadata into SEI 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" --- libavcodec/cbs_h264.c | 47 +++++++++++++++++++++++++++++++++++++++++++ libavcodec/cbs_h264.h | 8 ++++++++ 2 files changed, 55 insertions(+) diff --git a/libavcodec/cbs_h264.c b/libavcodec/cbs_h264.c index 75759c7f25..096949e67b 100644 --- a/libavcodec/cbs_h264.c +++ b/libavcodec/cbs_h264.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/stereo3d.h" + #include "cbs_h264.h" int ff_cbs_h264_add_sei_message(CodedBitstreamContext *ctx, @@ -104,3 +106,48 @@ void ff_cbs_h264_delete_sei_message(CodedBitstreamContext *ctx, (sei->payload_count - position) * sizeof(*sei->payload)); } } + +void ff_cbs_h264_fill_sei_frame_packing_arrangement(H264RawSEIFramePackingArrangement *fp, + const AVStereo3D *st) +{ + static const uint8_t type_map[] = { + [AV_STEREO3D_2D] = 6, + [AV_STEREO3D_SIDEBYSIDE] = 3, + [AV_STEREO3D_TOPBOTTOM] = 4, + [AV_STEREO3D_FRAMESEQUENCE] = 5, + [AV_STEREO3D_CHECKERBOARD] = 0, + [AV_STEREO3D_SIDEBYSIDE_QUINCUNX] = 3, + [AV_STEREO3D_LINES] = 2, + [AV_STEREO3D_COLUMNS] = 1, + }; + + memset(fp, 0, sizeof(*fp)); + + if (st->type >= FF_ARRAY_ELEMS(type_map)) + return; + + fp->frame_packing_arrangement_type = type_map[st->type]; + + fp->quincunx_sampling_flag = + st->type == AV_STEREO3D_CHECKERBOARD || + st->type == AV_STEREO3D_SIDEBYSIDE_QUINCUNX; + + if (st->type == AV_STEREO3D_2D) + fp->content_interpretation_type = 0; + else if (st->flags & AV_STEREO3D_FLAG_INVERT) + fp->content_interpretation_type = 2; + else + fp->content_interpretation_type = 1; + + if (st->type == AV_STEREO3D_FRAMESEQUENCE) { + if (st->flags & AV_STEREO3D_FLAG_INVERT) + fp->current_frame_is_frame0_flag = + st->view == AV_STEREO3D_VIEW_RIGHT; + else + fp->current_frame_is_frame0_flag = + st->view == AV_STEREO3D_VIEW_LEFT; + } + + fp->frame_packing_arrangement_repetition_period = + st->type != AV_STEREO3D_FRAMESEQUENCE; +} diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h index 512674ec07..76211c976b 100644 --- a/libavcodec/cbs_h264.h +++ b/libavcodec/cbs_h264.h @@ -525,4 +525,12 @@ void ff_cbs_h264_delete_sei_message(CodedBitstreamContext *ctx, CodedBitstreamUnit *nal_unit, int position); +struct AVStereo3D; +/** + * Fill an SEI Frame Packing Arrangement structure with values derived from + * the AVStereo3D side-data structure. + */ +void ff_cbs_h264_fill_sei_frame_packing_arrangement(H264RawSEIFramePackingArrangement *fp, + const struct AVStereo3D *st); + #endif /* AVCODEC_CBS_H264_H */ From patchwork Sun May 3 22:05:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19469 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0FD6C44B916 for ; Mon, 4 May 2020 01:06:17 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E9A8268C220; Mon, 4 May 2020 01:06:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B9F2E68C13D for ; Mon, 4 May 2020 01:06:07 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id y24so6699288wma.4 for ; Sun, 03 May 2020 15:06:07 -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:mime-version :content-transfer-encoding; bh=QwhzAKTwK191m5b95Eud9XYjsaM7PM3ygH+mvmtf9Y0=; b=udjwEiNPui+cVSx0orfrl/ERfYQqsE6AQFFV2bPtKMhknyD4HxyICcvUvMFX6nrc8I oo/iA8rYV7tYiXFiC+gVPY20t/9ZPDQi1nJOsF0fRCR7ixj0NFdtF8feBwzHvtlDkDYS 8evdWjaBX59xDsd1Yi/PnRq026gxc8xAEg2ElAQIL7eSKUkpbxYASqVJYOZSonMbrl7X TjjFRCFBlMz7++kelipaLn3/hnx8ehcVObah1tjs73tCXz+AoENEVAuV6EXRXTO1FNjS SFZ+lCIgMvrXqfdhqwOHNrcawj1FL7J79c4Blv5BeE+zb5dh9kpEI5Qh7GNNQ7CGIzRa bgYA== 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:mime-version:content-transfer-encoding; bh=QwhzAKTwK191m5b95Eud9XYjsaM7PM3ygH+mvmtf9Y0=; b=bI84FFSsFX7ZAWHnXBVVSDzXkD3TOaEa6jrio7fceRVy/gVMkwzwNjIRU7eJqf52Mt s0jPm/rD07/1cm0/05/f8yGrq7lYmolTO9PJQc3TFzQ8D1KUM7ewxoIHf15D0zGC7wEv eUuKjwxnfcYM6oLQ3jfiQD1Yfe374uy3VJ5QOakjZpvgESj1KuFEcEj4Br4uCIIRs/gv 3Dgw13V+nG0ZapFHKWL0KTH/Xze8Xi7D/9d8L61z6A0J5n6wfXJKamF5ybHou2Cd/0Ih Pe1bxpteXW2TUecBnYdDgPNq9UMklXNPin8YZcLOZ7UY+nRy//6do8Cx1ALsrdFh7ntp Dzsw== X-Gm-Message-State: AGi0PuZOdzJAof0rDHg1abJ2/Rq6rOA46QBHskywGrD9mCHxEzclpEdz 84BQ+xOaZeRLG30MhLQmfmDjd6qmE4I= X-Google-Smtp-Source: APiQypI7xwIXVOHW4MIqC1HYx2XaauiIffEzwEqAp94OPgOVIxPqF49dmMdaTkR+XG6AKrmQeNjTDg== X-Received: by 2002:a7b:c417:: with SMTP id k23mr11501671wmi.147.1588543566808; Sun, 03 May 2020 15:06:06 -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 a24sm10307285wmb.24.2020.05.03.15.06.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:06 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:43 +0100 Message-Id: <20200503220548.23543-17-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 17/22] vaapi_encode: Unify SEI types enum 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" This was in two disjoint parts in the H.264 and H.265 files. Unify them in the header to avoid any confusion, because they are really the same enum. --- libavcodec/vaapi_encode.h | 10 ++++++++++ libavcodec/vaapi_encode_h264.c | 6 ------ libavcodec/vaapi_encode_h265.c | 5 ----- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index 1329f6428f..3a095231fe 100644 --- a/libavcodec/vaapi_encode.h +++ b/libavcodec/vaapi_encode.h @@ -459,4 +459,14 @@ int ff_vaapi_encode_close(AVCodecContext *avctx); VAAPI_ENCODE_RC_MODE(AVBR, "Average variable-bitrate") +// SEI types used in options for both H.264 and H.265. +enum { + SEI_TIMING = 0x01, + SEI_IDENTIFIER = 0x02, + SEI_RECOVERY_POINT = 0x04, + SEI_MASTERING_DISPLAY = 0x08, + SEI_CONTENT_LIGHT_LEVEL = 0x10, +}; + + #endif /* AVCODEC_VAAPI_ENCODE_H */ diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c index 67b1ecae1b..34a6a8993d 100644 --- a/libavcodec/vaapi_encode_h264.c +++ b/libavcodec/vaapi_encode_h264.c @@ -35,12 +35,6 @@ #include "internal.h" #include "vaapi_encode.h" -enum { - SEI_TIMING = 0x01, - SEI_IDENTIFIER = 0x02, - SEI_RECOVERY_POINT = 0x04, -}; - // Random (version 4) ISO 11578 UUID. static const uint8_t vaapi_encode_h264_sei_identifier_uuid[16] = { 0x59, 0x94, 0x8b, 0x28, 0x11, 0xec, 0x45, 0xaf, diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index e20e8cbdd0..ee44d7c442 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -37,11 +37,6 @@ #include "put_bits.h" #include "vaapi_encode.h" -enum { - SEI_MASTERING_DISPLAY = 0x08, - SEI_CONTENT_LIGHT_LEVEL = 0x10, -}; - typedef struct VAAPIEncodeH265Picture { int pic_order_cnt; From patchwork Sun May 3 22:05:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19470 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 49DBA44B916 for ; Mon, 4 May 2020 01:06:18 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 299CC68C22B; Mon, 4 May 2020 01:06:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7F55E68C146 for ; Mon, 4 May 2020 01:06:08 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id x18so18683947wrq.2 for ; Sun, 03 May 2020 15:06:08 -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:mime-version :content-transfer-encoding; bh=/aGR+CBq9PDIIMoR8E/xdCvQqV7q6sbJBYux+cyithw=; b=NLk/HY7gli59zqqRdQofzaWequ3mVAIiISwMTO4wEd7SJdUC7qyw+P0QU8/bnSDQc9 DRznYRuLW1v4YWJiKdwZKhawhiGWZTrUsg9Z9TuBgkGhV7UQN0e/K8wZvIYU7HWsg2Ha fsP/4Tz+wgqukjNJeYuyVyvGjgLW936RphOa0qZqkiCMsuMbtRgdCzwidUeexiZ4aOK/ EwAufIYMso4OvSPtWSSU5/fEojwYPjyJa7um5Rd3wiuv1R7JKSdtZVAr2MJfyi9Kw7PY OaehSFzugXZPu0xL7fAa0LrMfPORRRsYiIKoGcrvfg/Ift96bzLWBPXJeLPQai+4cxUp Zr9g== 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:mime-version:content-transfer-encoding; bh=/aGR+CBq9PDIIMoR8E/xdCvQqV7q6sbJBYux+cyithw=; b=rCGAWxkTY11YJiz37l6D15pi/CC/ilNocUmWSCNM+7CxSAUt9WAvBFFABXUXJI3LVH gkpRbrKeh430PXSSonuAFA05394ToCuxs1BWfLzkHoaIDIfnM4UiCMHG9XuzddNpPyAd SDYQLuR6yPUcghEYxtAljDlID0JrcV/QbwEatumQWlOgtCxrFhZLg7LP/pM205g3jQGX E4xICetZ4WykykOsJrcr7fxVvp7FPavbnXf+A0bKm3NyaxfrNiRt8mSNxMNmh9F5p6dy G92a+jHOjg94x68E6hkihaFOBa9LiLV/cps0A5JENHToBzY6+KyH0TdlW9SaLMPMDSjd IsLQ== X-Gm-Message-State: AGi0PubJX0wXMynkhCTPStONmghD0j7ENdzZStTddBRWr4kpcG1DBmBY WnExIBIuCRZ1ZZ95c3KMwfEcbZA7i10= X-Google-Smtp-Source: APiQypJjdqYfZJJ5/kKuQv4cd+Jlj2YAc/q1bbcdvWDs3d1IOzZP7x4QulU/fv9hAzRwPuhKsJbk1w== X-Received: by 2002:a05:6000:1146:: with SMTP id d6mr3961093wrx.289.1588543567612; Sun, 03 May 2020 15:06:07 -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 a24sm10307285wmb.24.2020.05.03.15.06.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:07 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:44 +0100 Message-Id: <20200503220548.23543-18-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 18/22] vaapi_encode_h264: Support stereo 3D metadata 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" Insert frame packing arrangement messages into the stream when input frames have associated stereo 3D side-data. --- doc/encoders.texi | 3 +++ libavcodec/vaapi_encode.h | 1 + libavcodec/vaapi_encode_h264.c | 24 +++++++++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/doc/encoders.texi b/doc/encoders.texi index 18bfe8f2eb..4da8c701a2 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -3074,6 +3074,9 @@ Include picture timing parameters (@emph{buffering_period} and @emph{pic_timing} messages). @item recovery_point Include recovery points where appropriate (@emph{recovery_point} messages). +@item frame_packing +Include stereo 3D metadata if the input frames have it +(@emph{frame_packing_arrangement} messages). @end table @end table diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index 3a095231fe..5ba1679b92 100644 --- a/libavcodec/vaapi_encode.h +++ b/libavcodec/vaapi_encode.h @@ -466,6 +466,7 @@ enum { SEI_RECOVERY_POINT = 0x04, SEI_MASTERING_DISPLAY = 0x08, SEI_CONTENT_LIGHT_LEVEL = 0x10, + SEI_FRAME_PACKING = 0x20, }; diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c index 34a6a8993d..d6a9321e5d 100644 --- a/libavcodec/vaapi_encode_h264.c +++ b/libavcodec/vaapi_encode_h264.c @@ -25,6 +25,7 @@ #include "libavutil/common.h" #include "libavutil/internal.h" #include "libavutil/opt.h" +#include "libavutil/stereo3d.h" #include "avcodec.h" #include "cbs.h" @@ -90,6 +91,7 @@ typedef struct VAAPIEncodeH264Context { H264RawSEIBufferingPeriod sei_buffering_period; H264RawSEIPicTiming sei_pic_timing; H264RawSEIRecoveryPoint sei_recovery_point; + H264RawSEIFramePackingArrangement sei_frame_packing; H264RawSEIUserDataUnregistered sei_identifier; char *sei_identifier_string; @@ -245,6 +247,12 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx, sei->payload[i].payload.recovery_point = priv->sei_recovery_point; ++i; } + if (priv->sei_needed & SEI_FRAME_PACKING) { + sei->payload[i].payload_type = H264_SEI_TYPE_FRAME_PACKING; + sei->payload[i].payload.frame_packing_arrangement = + priv->sei_frame_packing; + ++i; + } sei->payload_count = i; av_assert0(sei->payload_count > 0); @@ -694,6 +702,17 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx, priv->sei_needed |= SEI_RECOVERY_POINT; } + if (priv->sei & SEI_FRAME_PACKING) { + AVFrameSideData *sd = av_frame_get_side_data(pic->input_image, + AV_FRAME_DATA_STEREO3D); + if (sd) { + ff_cbs_h264_fill_sei_frame_packing_arrangement( + &priv->sei_frame_packing, (const AVStereo3D*)sd->data); + + priv->sei_needed |= SEI_FRAME_PACKING; + } + } + vpic->CurrPic = (VAPictureH264) { .picture_id = pic->recon_surface, .frame_idx = hpic->frame_num, @@ -1265,7 +1284,7 @@ static const AVOption vaapi_encode_h264_options[] = { { "sei", "Set SEI to include", OFFSET(sei), AV_OPT_TYPE_FLAGS, - { .i64 = SEI_IDENTIFIER | SEI_TIMING | SEI_RECOVERY_POINT }, + { .i64 = SEI_IDENTIFIER | SEI_TIMING | SEI_RECOVERY_POINT | SEI_FRAME_PACKING }, 0, INT_MAX, FLAGS, "sei" }, { "identifier", "Include encoder version identifier", 0, AV_OPT_TYPE_CONST, { .i64 = SEI_IDENTIFIER }, @@ -1276,6 +1295,9 @@ static const AVOption vaapi_encode_h264_options[] = { { "recovery_point", "Include recovery points where appropriate", 0, AV_OPT_TYPE_CONST, { .i64 = SEI_RECOVERY_POINT }, INT_MIN, INT_MAX, FLAGS, "sei" }, + { "frame_packing", "Include frame packing arrangement for stereo 3D", + 0, AV_OPT_TYPE_CONST, { .i64 = SEI_FRAME_PACKING }, + INT_MIN, INT_MAX, FLAGS, "sei" }, { "profile", "Set profile (profile_idc and constraint_set*_flag)", OFFSET(profile), AV_OPT_TYPE_INT, From patchwork Sun May 3 22:05:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19474 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 52A2644AAF6 for ; Mon, 4 May 2020 01:08:45 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3056B68C242; Mon, 4 May 2020 01:06:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7DA0168C115 for ; Mon, 4 May 2020 01:06:09 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id s8so8350331wrt.9 for ; Sun, 03 May 2020 15:06:09 -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:mime-version :content-transfer-encoding; bh=V7NyC9BDzkAhbuw5zndlyO0c/G9cKclFzkLIMXxFbP0=; b=lbY3QaAwd3f8eaM8GSHsk39USaFNPv2ijwm0xaMbovbtwvlAwVJedG7zmknbKK7cQx SNM5BBQNodLUGKWnD0lkZkqbusVfIDrlza/OOQOnTWSpb3xGlkpOUK+sEL3s292vlSVR B8zzuFvQJIFQ9bkFnVBsGoepZhr0cH//FWTFPJ7fN6YSmgBaGEzXkpSluK91ZyGMEjd8 TGEDOYl6+8aeWQauEdDD9xQOqay+5mWmqidDwdqLdRtVOB94UIGUmQb7Nt2xY6XG0Rb/ rrZePgkAGa/6pWIjlQz5EK+WkwJReZmr6Q+DJnEux5qr5w2hWd9AprSohfOqh1eJjkyU kDrw== 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:mime-version:content-transfer-encoding; bh=V7NyC9BDzkAhbuw5zndlyO0c/G9cKclFzkLIMXxFbP0=; b=KH6kZK5CEMSxweAfWcrpkYKHgcsEZdUtfd9nHRweYifRQ7UayFN3WuvdYQSflW5T53 ehSDMYl9DtLT7nnmpKk1uJtE5+ke6VmYmqwKZxMXxvCzCqZi4eCW1WnCH8asgfZ+IwZ2 qTvgb/uKboLtlRrz5Ib9W+u82ilA0A4liIaunO6w/ZoRWCJSz8SDIfAP3VWgR850qZyV lnl7WjuJmJpAu9kfxez1HaeSQiHyIQs+Q4cLZKcPVOs6zpIt6DslAhOkUj2CC9JU/8QG 8RkcPsGT/kCRH82fnEfoAxWbTG5i5n1a2rqpkJkWEh+Hl4tga1twkhCnA7/9iAIrvi1x vecA== X-Gm-Message-State: AGi0PuY+w9EVZGjulu6l7PbNLr/sYnTVuNbx2iRKEla1RgcxlelMTYbl DOzjMyUsfKmdHHQDxZjLkS8lMQ06kTg= X-Google-Smtp-Source: APiQypIqAgyPciHdbyMT+Vw7uQgH3Bp3wsU2JYbmQcDz727nBQZWaA0NhOVW4bav4dJVfVcSLvCn0A== X-Received: by 2002:adf:df8d:: with SMTP id z13mr15736267wrl.304.1588543568618; Sun, 03 May 2020 15:06:08 -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 a24sm10307285wmb.24.2020.05.03.15.06.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:07 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:45 +0100 Message-Id: <20200503220548.23543-19-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 19/22] cbs_h265: Add functions to turn HDR metadata into SEI 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" --- libavcodec/Makefile | 2 +- libavcodec/cbs_h265.c | 100 ++++++++++++++++++++++++++++++++++++++++++ libavcodec/cbs_h265.h | 18 ++++++++ 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 libavcodec/cbs_h265.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 076f2fd953..844e971d42 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -68,7 +68,7 @@ OBJS-$(CONFIG_CABAC) += cabac.o OBJS-$(CONFIG_CBS) += cbs.o OBJS-$(CONFIG_CBS_AV1) += cbs_av1.o OBJS-$(CONFIG_CBS_H264) += cbs_h2645.o cbs_h264.o h2645_parse.o -OBJS-$(CONFIG_CBS_H265) += cbs_h2645.o h2645_parse.o +OBJS-$(CONFIG_CBS_H265) += cbs_h2645.o cbs_h265.o h2645_parse.o OBJS-$(CONFIG_CBS_JPEG) += cbs_jpeg.o OBJS-$(CONFIG_CBS_MPEG2) += cbs_mpeg2.o OBJS-$(CONFIG_CBS_VP9) += cbs_vp9.o diff --git a/libavcodec/cbs_h265.c b/libavcodec/cbs_h265.c new file mode 100644 index 0000000000..afbdd37896 --- /dev/null +++ b/libavcodec/cbs_h265.c @@ -0,0 +1,100 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/mathematics.h" +#include "libavutil/mastering_display_metadata.h" + +#include "cbs_h265.h" + + +static uint32_t rescale_clip(AVRational value, uint32_t scale, uint32_t max) +{ + int64_t scaled = av_rescale(scale, value.num, value.den); + return av_clip64(scaled, 0, max); +} + +static uint32_t rescale_fraction(AVRational value, uint32_t max) +{ + return rescale_clip(value, max, max); +} + +void ff_cbs_h265_fill_sei_mastering_display(H265RawSEIMasteringDisplayColourVolume *mdcv, + const AVMasteringDisplayMetadata *mdm) +{ + memset(mdcv, 0, sizeof(*mdcv)); + + if (mdm->has_primaries) { + // The values in the metadata structure are fractions between 0 and 1, + // while the SEI message contains fixed-point values with an increment + // of 0.00002. So, scale up by 50000 to convert between them. + + for (int a = 0; a < 3; a++) { + // The metadata structure stores this in RGB order, but the SEI + // wants it in GBR order. + static const uint8_t mapping[] = { 1, 2, 0 }; + int b = mapping[a]; + mdcv->display_primaries_x[a] = + rescale_fraction(mdm->display_primaries[b][0], 50000); + mdcv->display_primaries_y[a] = + rescale_fraction(mdm->display_primaries[b][1], 50000); + } + + mdcv->white_point_x = rescale_fraction(mdm->white_point[0], 50000); + mdcv->white_point_y = rescale_fraction(mdm->white_point[1], 50000); + } + + if (mdm->has_luminance) { + // Metadata are rational values in candelas per square metre, SEI + // contains fixed point in units of 0.0001 candelas per square + // metre. So scale up by 10000 to convert between them, and clip to + // ensure that we don't overflow. + + mdcv->max_display_mastering_luminance = + rescale_clip(mdm->max_luminance, 10000, UINT32_MAX); + mdcv->min_display_mastering_luminance = + rescale_clip(mdm->min_luminance, 10000, UINT32_MAX); + + // The spec has a hard requirement that min is less than the max, + // and the SEI-writing code enforces that. + if (!(mdcv->min_display_mastering_luminance < + mdcv->max_display_mastering_luminance)) { + if (mdcv->max_display_mastering_luminance == UINT32_MAX) + mdcv->min_display_mastering_luminance = + mdcv->max_display_mastering_luminance - 1; + else + mdcv->max_display_mastering_luminance = + mdcv->min_display_mastering_luminance + 1; + } + } else { + mdcv->max_display_mastering_luminance = 1; + mdcv->min_display_mastering_luminance = 0; + } +} + +void ff_cbs_h265_fill_sei_content_light_level(H265RawSEIContentLightLevelInfo *cll, + const AVContentLightMetadata *clm) +{ + memset(cll, 0, sizeof(*cll)); + + // Both the metadata and the SEI are in units of candelas per square + // metre, so we only need to clip to ensure that they are in the valid + // range. + + cll->max_content_light_level = av_clip_uintp2(clm->MaxCLL, 16); + cll->max_pic_average_light_level = av_clip_uintp2(clm->MaxFALL, 16); +} diff --git a/libavcodec/cbs_h265.h b/libavcodec/cbs_h265.h index f5eb5af5b2..793675ad41 100644 --- a/libavcodec/cbs_h265.h +++ b/libavcodec/cbs_h265.h @@ -746,4 +746,22 @@ typedef struct CodedBitstreamH265Context { } CodedBitstreamH265Context; +struct AVMasteringDisplayMetadata; +struct AVContentLightMetadata; + +/** + * Fill an SEI Mastering Display Colour Volume structure with values derived + * from the AVMasteringDisplayMetadata side-data structure. + */ +void ff_cbs_h265_fill_sei_mastering_display(H265RawSEIMasteringDisplayColourVolume *mdcv, + const struct AVMasteringDisplayMetadata *mdm); + +/** + * Fill an SEI Content Light Level Info structure with values derived from + * the AVContentLightMetadata side-data structure. + */ +void ff_cbs_h265_fill_sei_content_light_level(H265RawSEIContentLightLevelInfo *cll, + const struct AVContentLightMetadata *clm); + + #endif /* AVCODEC_CBS_H265_H */ From patchwork Sun May 3 22:05:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19471 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 340B044B916 for ; Mon, 4 May 2020 01:06:20 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2148568C255; Mon, 4 May 2020 01:06:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 654A468B330 for ; Mon, 4 May 2020 01:06:10 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id x18so18683977wrq.2 for ; Sun, 03 May 2020 15:06:10 -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:mime-version :content-transfer-encoding; bh=oeka2T44MzcMCt6jXarcUbv4tFS/UT/fSy4ACon/18s=; b=P51TkyaMgoIKBv65kVXILfEZbkH5bYf5DemnrIgfUB4Tww7B8qyBeslkXmN9u8WLMc sVLrS67naSBF4Uw+O3QW8P6CVZ/2sQHoa5ZftqnJlIwvODvKFbvgoFWR8MxGy+Z0nshT KJ4PQpT+HPA8Lp4c/hwlUkfIk0sNAAe2OunIu7o+Ll0NSQR25VNisZIPKwDLr0C+jIcL +ODmI4etSfErRljiPHQr48jaK97DZt5K35jFVydyat4WEnqXZ+gCXvQbLPy4SCY6CM8+ FmNtEe9D8GPIs//R2XMq2WoS5m445jm1puJ5TXFNhaFySSCAiE21ZtffsJe3119AlG9L ULBg== 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:mime-version:content-transfer-encoding; bh=oeka2T44MzcMCt6jXarcUbv4tFS/UT/fSy4ACon/18s=; b=lN8yVvP5BolGuGKq/2ovaD1hruW7MapMHwVNYi3K+x7vrV8hxcYemL95T1+LYK95CV CIm7G77kZf3sj5c+oQVlZ0jwlUajSW8RO+Wyb4ZREao+w7gFY67KAHYZhkcopv5iSVLK 3XK/FTdlaOOOH285ku3kh3IOtQv1shC7juNStUu9ihGPImRXO6C6JWqfy43pA8SF8jZr tp+tq146c0ze3iXEkwu/BT57n8ZY6V7qQJtXbW08zWBQ/S35VJ1VZ8G8i3H72tfIjeiM IRbnMII+THfyj0P304Q3ezOLfB1jSDPYpqPY6f9mX3Jlgdb9TkgGScPeMp2LDmowesY1 8OFw== X-Gm-Message-State: AGi0PuZ548Xz5LHjkPt9Vlk/9oqan6PzPQIgfQ2VVRHYITe4o6VSw5IA /WnWrXQSRKZS6W3YUzkM6fE75m1+CJc= X-Google-Smtp-Source: APiQypJQqunFTiEryXJh6zGtpzRMs20beb6MsratKJ5Vq4Den86AYd+JFFjWV4LwRP2dm2HVuRlgvg== X-Received: by 2002:adf:fa89:: with SMTP id h9mr7384659wrr.119.1588543569535; Sun, 03 May 2020 15:06:09 -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 a24sm10307285wmb.24.2020.05.03.15.06.08 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:08 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:46 +0100 Message-Id: <20200503220548.23543-20-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 20/22] vaapi_encode_h265: Use common handling for HDR metadata 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" --- libavcodec/vaapi_encode_h265.c | 45 +++++----------------------------- 1 file changed, 6 insertions(+), 39 deletions(-) diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index ee44d7c442..4307da7bb1 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -745,39 +745,10 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, AVMasteringDisplayMetadata *mdm = (AVMasteringDisplayMetadata *)sd->data; - // SEI is needed when both the primaries and luminance are set + // Only needed when both primaries and luminance are set. if (mdm->has_primaries && mdm->has_luminance) { - H265RawSEIMasteringDisplayColourVolume *mdcv = - &priv->sei_mastering_display; - const int mapping[3] = {1, 2, 0}; - const int chroma_den = 50000; - const int luma_den = 10000; - - for (i = 0; i < 3; i++) { - const int j = mapping[i]; - mdcv->display_primaries_x[i] = - FFMIN(lrint(chroma_den * - av_q2d(mdm->display_primaries[j][0])), - chroma_den); - mdcv->display_primaries_y[i] = - FFMIN(lrint(chroma_den * - av_q2d(mdm->display_primaries[j][1])), - chroma_den); - } - - mdcv->white_point_x = - FFMIN(lrint(chroma_den * av_q2d(mdm->white_point[0])), - chroma_den); - mdcv->white_point_y = - FFMIN(lrint(chroma_den * av_q2d(mdm->white_point[1])), - chroma_den); - - mdcv->max_display_mastering_luminance = - lrint(luma_den * av_q2d(mdm->max_luminance)); - mdcv->min_display_mastering_luminance = - FFMIN(lrint(luma_den * av_q2d(mdm->min_luminance)), - mdcv->max_display_mastering_luminance); - + ff_cbs_h265_fill_sei_mastering_display( + &priv->sei_mastering_display, mdm); priv->sei_needed |= SEI_MASTERING_DISPLAY; } } @@ -790,13 +761,9 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); if (sd) { - AVContentLightMetadata *clm = - (AVContentLightMetadata *)sd->data; - H265RawSEIContentLightLevelInfo *clli = - &priv->sei_content_light_level; - - clli->max_content_light_level = FFMIN(clm->MaxCLL, 65535); - clli->max_pic_average_light_level = FFMIN(clm->MaxFALL, 65535); + ff_cbs_h265_fill_sei_content_light_level( + &priv->sei_content_light_level, + (const AVContentLightMetadata*)sd->data); priv->sei_needed |= SEI_CONTENT_LIGHT_LEVEL; } From patchwork Sun May 3 22:05:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19489 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:3c87:0:0:0:0:0 with SMTP id j129csp3062650yba; Sun, 3 May 2020 15:09:08 -0700 (PDT) X-Google-Smtp-Source: APiQypIG8QND5ZlDZpvkdwaPpFHkFwfdrIg03Rtn1k5PIENccE4ykM3PqRF2dRYIm+wM2wHHOi8y X-Received: by 2002:a1c:1c8:: with SMTP id 191mr10603349wmb.37.1588543748647; Sun, 03 May 2020 15:09:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588543748; cv=none; d=google.com; s=arc-20160816; b=BKnLRHkv/i9OPvSoleIKlyeq22H0wqRH1o0YPYROU8DSbShfmkaMjEYIXFbCrg05V8 4jG2P4borfpIZEq1Ys1DMGQ3SjXq8XjcTewlECKEI+jvoNsgMQXxcnB+5H3tF6HNHkaO 8bnCsy2AmOJoK88Jx4AmfoFi20Njlk8Vgbr6KOcAFGFJ9mEHIbDZkywD6Yic4I6/I+DB kpqZiRuGODpdGsVVIHM5lfUChyGqpSsf/ibgjQiNc3LYnGWoqGLAuzaeICObH3X5FQr9 GLl+LURP/YNUEPYhYHUoy+rfhV2hdqeNREDz128uw54bmitml6i5afesvk3StKUWhoFn 47bQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=mqS/NYJOtqVxCqMW9oofCjPByvB2H70dRb87X55lJ0Q=; b=OUwQInJXG/vosZES8rzRkA60o8Go4jxC8uW8ZS+m2tAk6B2IQgwYfUHhEJtAkjLoYL TO705xuHRvI+PAKIDLukSgAew94cdxsBQx12jHSzgZpV5EJ7tdO7aLsC+CqL/iiG3SH8 p9kD6rqLK+jEN8mnwKhSENn5nadaiPrRV/+WYu4bb2z75xcvks8ym8RoGE1w3t9f2qTs 1cRwcseWXUBKN6dEYb6HZXRpi96zSOGoQiLEW1OW3xqeNjDVSXjvdYGDyY15lZHMumSE EqizlwJpvqCBmAQeySAm9w2fqhMsUSSXQouH3LIxjOGhlsG++YizHfafigvqTrlNbn7U W6Tg== 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=iFaXYucc; 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 m8si5657826wml.199.2020.05.03.15.09.08; Sun, 03 May 2020 15:09:08 -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=iFaXYucc; 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 5FBB968C290; Mon, 4 May 2020 01:06:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B736368C197 for ; Mon, 4 May 2020 01:06:11 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id h9so8330509wrt.0 for ; Sun, 03 May 2020 15:06:11 -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:mime-version :content-transfer-encoding; bh=Yd6qr+cuPOrg2RiT+TiLU3JENvknTr7VpdIIHfwNsIE=; b=iFaXYuccEfwlFI+C1tVgWKOKRKYmKD/pBGD+h1pjzJ1eO7AA8wzFni2Wv9AT82Lvfx S2cFmk2VgtN/bJtClBvDSkfwDSsy9/3vIe5G76+EuirKDL0HJa+WHJ/xjz2Cg0yEEs/w xtVaH3sMT8sZ3U9y29RHygFQuOy/Z4B8ms3zOuFmViCmaxr1rWYRIu2njvJsSxXtQHxs CgKBG5LcRpvJYLXeXyDGzYVvzDILUHtth2X688zR7h1NM/HiVWT5dW7+/ZfDbLF3my72 cPvWgYjOaEZ9CtWWYid910errWTT0siyiShm4sNkLMVzLxCVd3mc8UvTi2fdJYhcPqx1 fYGw== 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:mime-version:content-transfer-encoding; bh=Yd6qr+cuPOrg2RiT+TiLU3JENvknTr7VpdIIHfwNsIE=; b=KGKG+XofXvraBNqRbROMHrS/swi9kqOUOs/7CJiWgak5aA8rKucjusdu278vYVLw1L 1qipz1MGuDkBz+V7o+eSP3vhDytlSwD42RbiFDAQ4a7l2EQIl92m4tQJ874Fguc+tJ6o oB2lC/u0y8cPP6RjtvrlHtjPvb/5YcxXBx8DW+utEZdQ2a2lttgT7Ecegp42Vux7FWjU 8LCsVfbbZ7yOe7o755baW9TuBCN/2j8HmtEzSmsYL3w66LXPtHuldEutkhamdr4xNBvb +cXX6tBtVbC4/Lgup3fxf9JiBdFvUFk5QmeFbl0BZOjFnzAjRLlZerBnQ/wZ4F1bVTQQ i9cg== X-Gm-Message-State: AGi0PuZv7BIr3HbyoY2jwGgxkHKMZ9TRHArfTPvKK59oMDIv4f8bg2Tl o4J0Si/7BpoEcSqL3euZOdodkr04V7s= X-Received: by 2002:a05:6000:8:: with SMTP id h8mr7840476wrx.372.1588543570445; Sun, 03 May 2020 15:06:10 -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 a24sm10307285wmb.24.2020.05.03.15.06.09 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:09 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:47 +0100 Message-Id: <20200503220548.23543-21-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 21/22] h264_metadata_bsf: Refactor the filter function into smaller parts 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" X-TUID: MSUAUhh2LYk1 Content-Length: 25929 --- libavcodec/h264_metadata_bsf.c | 447 ++++++++++++++++++--------------- 1 file changed, 244 insertions(+), 203 deletions(-) diff --git a/libavcodec/h264_metadata_bsf.c b/libavcodec/h264_metadata_bsf.c index 451eaa0b67..bfb5b7d7e4 100644 --- a/libavcodec/h264_metadata_bsf.c +++ b/libavcodec/h264_metadata_bsf.c @@ -54,6 +54,7 @@ typedef struct H264MetadataContext { int done_first_au; int aud; + H264RawAUD aud_nal; AVRational sample_aspect_ratio; @@ -76,6 +77,7 @@ typedef struct H264MetadataContext { int crop_bottom; const char *sei_user_data; + H264RawSEIPayload sei_user_data_payload; int delete_filler; @@ -87,6 +89,59 @@ typedef struct H264MetadataContext { } H264MetadataContext; +static int h264_metadata_insert_aud(AVBSFContext *bsf, + CodedBitstreamFragment *au) +{ + H264MetadataContext *ctx = bsf->priv_data; + int primary_pic_type_mask = 0xff; + int err, i, j; + + static const int primary_pic_type_table[] = { + 0x084, // 2, 7 + 0x0a5, // 0, 2, 5, 7 + 0x0e7, // 0, 1, 2, 5, 6, 7 + 0x210, // 4, 9 + 0x318, // 3, 4, 8, 9 + 0x294, // 2, 4, 7, 9 + 0x3bd, // 0, 2, 3, 4, 5, 7, 8, 9 + 0x3ff, // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + }; + + for (i = 0; i < au->nb_units; i++) { + if (au->units[i].type == H264_NAL_SLICE || + au->units[i].type == H264_NAL_IDR_SLICE) { + H264RawSlice *slice = au->units[i].content; + for (j = 0; j < FF_ARRAY_ELEMS(primary_pic_type_table); j++) { + if (!(primary_pic_type_table[j] & + (1 << slice->header.slice_type))) + primary_pic_type_mask &= ~(1 << j); + } + } + } + for (j = 0; j < FF_ARRAY_ELEMS(primary_pic_type_table); j++) + if (primary_pic_type_mask & (1 << j)) + break; + if (j >= FF_ARRAY_ELEMS(primary_pic_type_table)) { + av_log(bsf, AV_LOG_ERROR, "No usable primary_pic_type: " + "invalid slice types?\n"); + return AVERROR_INVALIDDATA; + } + + ctx->aud_nal = (H264RawAUD) { + .nal_unit_header.nal_unit_type = H264_NAL_AUD, + .primary_pic_type = j, + }; + + err = ff_cbs_insert_unit_content(ctx->cbc, au, + 0, H264_NAL_AUD, &ctx->aud_nal, NULL); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to insert AUD.\n"); + return err; + } + + return 0; +} + static int h264_metadata_update_sps(AVBSFContext *bsf, H264RawSPS *sps) { @@ -318,221 +373,60 @@ static int h264_metadata_update_side_data(AVBSFContext *bsf, AVPacket *pkt) return 0; } -static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *pkt) +static int h264_metadata_handle_display_orientation(AVBSFContext *bsf, + AVPacket *pkt, + CodedBitstreamFragment *au, + int seek_point) { H264MetadataContext *ctx = bsf->priv_data; - CodedBitstreamFragment *au = &ctx->access_unit; - int err, i, j, has_sps; - H264RawAUD aud; - - err = ff_bsf_get_packet_ref(bsf, pkt); - if (err < 0) - return err; - - err = h264_metadata_update_side_data(bsf, pkt); - if (err < 0) - goto fail; - - err = ff_cbs_read_packet(ctx->cbc, au, pkt); - if (err < 0) { - av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n"); - goto fail; - } - - if (au->nb_units == 0) { - av_log(bsf, AV_LOG_ERROR, "No NAL units in packet.\n"); - err = AVERROR_INVALIDDATA; - goto fail; - } - - // If an AUD is present, it must be the first NAL unit. - if (au->units[0].type == H264_NAL_AUD) { - if (ctx->aud == REMOVE) - ff_cbs_delete_unit(ctx->cbc, au, 0); - } else { - if (ctx->aud == INSERT) { - static const int primary_pic_type_table[] = { - 0x084, // 2, 7 - 0x0a5, // 0, 2, 5, 7 - 0x0e7, // 0, 1, 2, 5, 6, 7 - 0x210, // 4, 9 - 0x318, // 3, 4, 8, 9 - 0x294, // 2, 4, 7, 9 - 0x3bd, // 0, 2, 3, 4, 5, 7, 8, 9 - 0x3ff, // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 - }; - int primary_pic_type_mask = 0xff; - - for (i = 0; i < au->nb_units; i++) { - if (au->units[i].type == H264_NAL_SLICE || - au->units[i].type == H264_NAL_IDR_SLICE) { - H264RawSlice *slice = au->units[i].content; - for (j = 0; j < FF_ARRAY_ELEMS(primary_pic_type_table); j++) { - if (!(primary_pic_type_table[j] & - (1 << slice->header.slice_type))) - primary_pic_type_mask &= ~(1 << j); - } - } - } - for (j = 0; j < FF_ARRAY_ELEMS(primary_pic_type_table); j++) - if (primary_pic_type_mask & (1 << j)) - break; - if (j >= FF_ARRAY_ELEMS(primary_pic_type_table)) { - av_log(bsf, AV_LOG_ERROR, "No usable primary_pic_type: " - "invalid slice types?\n"); - err = AVERROR_INVALIDDATA; - goto fail; - } - - aud = (H264RawAUD) { - .nal_unit_header.nal_unit_type = H264_NAL_AUD, - .primary_pic_type = j, - }; + int err, i, j; - err = ff_cbs_insert_unit_content(ctx->cbc, au, - 0, H264_NAL_AUD, &aud, NULL); - if (err < 0) { - av_log(bsf, AV_LOG_ERROR, "Failed to insert AUD.\n"); - goto fail; - } - } - } - - has_sps = 0; - for (i = 0; i < au->nb_units; i++) { - if (au->units[i].type == H264_NAL_SPS) { - err = h264_metadata_update_sps(bsf, au->units[i].content); - if (err < 0) - goto fail; - has_sps = 1; - } - } + for (i = au->nb_units - 1; i >= 0; i--) { + H264RawSEI *sei; + if (au->units[i].type != H264_NAL_SEI) + continue; + sei = au->units[i].content; - // Only insert the SEI in access units containing SPSs, and also - // unconditionally in the first access unit we ever see. - if (ctx->sei_user_data && (has_sps || !ctx->done_first_au)) { - H264RawSEIPayload payload = { - .payload_type = H264_SEI_TYPE_USER_DATA_UNREGISTERED, - }; - H264RawSEIUserDataUnregistered *udu = - &payload.payload.user_data_unregistered; + for (j = sei->payload_count - 1; j >= 0; j--) { + H264RawSEIDisplayOrientation *disp; + int32_t *matrix; - for (i = j = 0; j < 32 && ctx->sei_user_data[i]; i++) { - int c, v; - c = ctx->sei_user_data[i]; - if (c == '-') { + if (sei->payload[j].payload_type != + H264_SEI_TYPE_DISPLAY_ORIENTATION) continue; - } else if (av_isxdigit(c)) { - c = av_tolower(c); - v = (c <= '9' ? c - '0' : c - 'a' + 10); - } else { - goto invalid_user_data; - } - if (j & 1) - udu->uuid_iso_iec_11578[j / 2] |= v; - else - udu->uuid_iso_iec_11578[j / 2] = v << 4; - ++j; - } - if (j == 32 && ctx->sei_user_data[i] == '+') { - size_t len = strlen(ctx->sei_user_data + i + 1); - - udu->data_ref = av_buffer_alloc(len + 1); - if (!udu->data_ref) { - err = AVERROR(ENOMEM); - goto fail; - } - - udu->data = udu->data_ref->data; - udu->data_length = len + 1; - memcpy(udu->data, ctx->sei_user_data + i + 1, len + 1); + disp = &sei->payload[j].payload.display_orientation; - err = ff_cbs_h264_add_sei_message(ctx->cbc, au, &payload); - if (err < 0) { - av_log(bsf, AV_LOG_ERROR, "Failed to add user data SEI " - "message to access unit.\n"); - goto fail; - } - - } else { - invalid_user_data: - av_log(bsf, AV_LOG_ERROR, "Invalid user data: " - "must be \"UUID+string\".\n"); - err = AVERROR(EINVAL); - goto fail; - } - } - - if (ctx->delete_filler) { - for (i = au->nb_units - 1; i >= 0; i--) { - if (au->units[i].type == H264_NAL_FILLER_DATA) { - ff_cbs_delete_unit(ctx->cbc, au, i); + if (ctx->display_orientation == REMOVE || + ctx->display_orientation == INSERT) { + ff_cbs_h264_delete_sei_message(ctx->cbc, au, + &au->units[i], j); continue; } - if (au->units[i].type == H264_NAL_SEI) { - // Filler SEI messages. - H264RawSEI *sei = au->units[i].content; - - for (j = sei->payload_count - 1; j >= 0; j--) { - if (sei->payload[j].payload_type == - H264_SEI_TYPE_FILLER_PAYLOAD) - ff_cbs_h264_delete_sei_message(ctx->cbc, au, - &au->units[i], j); - } + matrix = av_malloc(9 * sizeof(int32_t)); + if (!matrix) + return AVERROR(ENOMEM); + + av_display_rotation_set(matrix, + disp->anticlockwise_rotation * + 180.0 / 65536.0); + av_display_matrix_flip(matrix, disp->hor_flip, disp->ver_flip); + + // If there are multiple display orientation messages in an + // access unit, then the last one added to the packet (i.e. + // the first one in the access unit) will prevail. + err = av_packet_add_side_data(pkt, AV_PKT_DATA_DISPLAYMATRIX, + (uint8_t*)matrix, + 9 * sizeof(int32_t)); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to attach extracted " + "displaymatrix side data to packet.\n"); + av_freep(matrix); + return AVERROR(ENOMEM); } } } - if (ctx->display_orientation != PASS) { - for (i = au->nb_units - 1; i >= 0; i--) { - H264RawSEI *sei; - if (au->units[i].type != H264_NAL_SEI) - continue; - sei = au->units[i].content; - - for (j = sei->payload_count - 1; j >= 0; j--) { - H264RawSEIDisplayOrientation *disp; - int32_t *matrix; - - if (sei->payload[j].payload_type != - H264_SEI_TYPE_DISPLAY_ORIENTATION) - continue; - disp = &sei->payload[j].payload.display_orientation; - - if (ctx->display_orientation == REMOVE || - ctx->display_orientation == INSERT) { - ff_cbs_h264_delete_sei_message(ctx->cbc, au, - &au->units[i], j); - continue; - } - - matrix = av_malloc(9 * sizeof(int32_t)); - if (!matrix) { - err = AVERROR(ENOMEM); - goto fail; - } - - av_display_rotation_set(matrix, - disp->anticlockwise_rotation * - 180.0 / 65536.0); - av_display_matrix_flip(matrix, disp->hor_flip, disp->ver_flip); - - // If there are multiple display orientation messages in an - // access unit, then the last one added to the packet (i.e. - // the first one in the access unit) will prevail. - err = av_packet_add_side_data(pkt, AV_PKT_DATA_DISPLAYMATRIX, - (uint8_t*)matrix, - 9 * sizeof(int32_t)); - if (err < 0) { - av_log(bsf, AV_LOG_ERROR, "Failed to attach extracted " - "displaymatrix side data to packet.\n"); - av_freep(matrix); - goto fail; - } - } - } - } if (ctx->display_orientation == INSERT) { H264RawSEIPayload payload = { .payload_type = H264_SEI_TYPE_DISPLAY_ORIENTATION, @@ -576,7 +470,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *pkt) } } - if (has_sps || !ctx->done_first_au) { + if (seek_point) { if (!isnan(ctx->rotate)) { disp->anticlockwise_rotation = (uint16_t)rint((ctx->rotate >= 0.0 ? ctx->rotate @@ -598,11 +492,108 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *pkt) if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to add display orientation " "SEI message to access unit.\n"); + return err; + } + } + } + + return 0; +} + +static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *pkt) +{ + H264MetadataContext *ctx = bsf->priv_data; + CodedBitstreamFragment *au = &ctx->access_unit; + int err, i, j, has_sps, seek_point; + + err = ff_bsf_get_packet_ref(bsf, pkt); + if (err < 0) + return err; + + err = h264_metadata_update_side_data(bsf, pkt); + if (err < 0) + goto fail; + + err = ff_cbs_read_packet(ctx->cbc, au, pkt); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n"); + goto fail; + } + + if (au->nb_units == 0) { + av_log(bsf, AV_LOG_ERROR, "No NAL units in packet.\n"); + err = AVERROR_INVALIDDATA; + goto fail; + } + + // If an AUD is present, it must be the first NAL unit. + if (au->units[0].type == H264_NAL_AUD) { + if (ctx->aud == REMOVE) + ff_cbs_delete_unit(ctx->cbc, au, 0); + } else { + if (ctx->aud == INSERT) { + err = h264_metadata_insert_aud(bsf, au); + if (err < 0) goto fail; + } + } + + has_sps = 0; + for (i = 0; i < au->nb_units; i++) { + if (au->units[i].type == H264_NAL_SPS) { + err = h264_metadata_update_sps(bsf, au->units[i].content); + if (err < 0) + goto fail; + has_sps = 1; + } + } + + // The current packet should be treated as a seek point for metadata + // insertion if any of: + // - It is the first packet in the stream. + // - It contains an SPS, indicating that a sequence might start here. + // - It is marked as containing a key frame. + seek_point = !ctx->done_first_au || has_sps || + (pkt->flags & AV_PKT_FLAG_KEY); + + if (ctx->sei_user_data && seek_point) { + err = ff_cbs_h264_add_sei_message(ctx->cbc, au, + &ctx->sei_user_data_payload); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to add user data SEI " + "message to access unit.\n"); + goto fail; + } + } + + if (ctx->delete_filler) { + for (i = au->nb_units - 1; i >= 0; i--) { + if (au->units[i].type == H264_NAL_FILLER_DATA) { + ff_cbs_delete_unit(ctx->cbc, au, i); + continue; + } + + if (au->units[i].type == H264_NAL_SEI) { + // Filler SEI messages. + H264RawSEI *sei = au->units[i].content; + + for (j = sei->payload_count - 1; j >= 0; j--) { + if (sei->payload[j].payload_type == + H264_SEI_TYPE_FILLER_PAYLOAD) + ff_cbs_h264_delete_sei_message(ctx->cbc, au, + &au->units[i], j); + } } } } + if (ctx->display_orientation != PASS) { + err = h264_metadata_handle_display_orientation(bsf, pkt, au, + seek_point); + if (err < 0) + goto fail; + } + err = ff_cbs_write_packet(ctx->cbc, pkt, au); if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n"); @@ -625,7 +616,57 @@ static int h264_metadata_init(AVBSFContext *bsf) { H264MetadataContext *ctx = bsf->priv_data; CodedBitstreamFragment *au = &ctx->access_unit; - int err, i; + int err, i, j; + + if (ctx->sei_user_data) { + H264RawSEIUserDataUnregistered *udu; + int c, v; + size_t len; + + ctx->sei_user_data_payload = (H264RawSEIPayload) { + .payload_type = H264_SEI_TYPE_USER_DATA_UNREGISTERED, + }; + udu = &ctx->sei_user_data_payload.payload.user_data_unregistered; + + // Parse UUID. It must be a hex string of length 32, possibly + // containing '-'s which we ignore. + for (i = j = 0; j < 32 && ctx->sei_user_data[i]; i++) { + c = ctx->sei_user_data[i]; + if (c == '-') { + continue; + } else if (av_isxdigit(c)) { + c = av_tolower(c); + v = (c <= '9' ? c - '0' : c - 'a' + 10); + } else { + break; + } + if (j & 1) + udu->uuid_iso_iec_11578[j / 2] |= v; + else + udu->uuid_iso_iec_11578[j / 2] = v << 4; + ++j; + } + if (j < 32 || ctx->sei_user_data[i] != '+') { + av_log(bsf, AV_LOG_ERROR, "Invalid user data: " + "must be of the form \"UUID+string\".\n"); + return AVERROR(EINVAL); + } else { + // Skip over the '+'. + ++i; + + // Length of the actual data to insert (could be zero). + len = strlen(ctx->sei_user_data + i); + + udu->data_ref = av_buffer_alloc(len + 1); + if (!udu->data_ref) + return AVERROR(ENOMEM); + + udu->data_length = len + 1; + udu->data = udu->data_ref->data; + memcpy(udu->data, ctx->sei_user_data + 1, len); + udu->data[len] = 0; + } + } err = ff_cbs_init(&ctx->cbc, AV_CODEC_ID_H264, bsf); if (err < 0) From patchwork Sun May 3 22:05:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 19472 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id E0F1744B916 for ; Mon, 4 May 2020 01:06:21 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CD4AF68C295; Mon, 4 May 2020 01:06:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 08C6868C1A9 for ; Mon, 4 May 2020 01:06:11 +0300 (EEST) Received: by mail-wm1-f68.google.com with SMTP id r26so6707414wmh.0 for ; Sun, 03 May 2020 15:06:11 -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:mime-version :content-transfer-encoding; bh=c3mzGeZYMdIcm54dP5zQ4zNA5ISFzKvdgSisuInGl3k=; b=VyAS2SYe3/WH+JgfU8BLFjRaFY1oOQb9iNHsY0Z5q/Q58+tM7J0sryCzln1kcqpjab o6x7KG4heJxX/i57kg/niUcVOI0xMqnucRFjcwq/up/Ok6DZDmB9k0z2r56wCQxaaguj UolpnS//nkjI+lPl47iBJMUAzGtlCkL66jvuIwvnaqo0PYKF/D7fAeEC409NlOMw3zFb S0Im/eOtxGAsWstRWyeWw5cQ3J+v+YV+95C3sRjX/lM9K4En3L1gdQXx4K/FuuFCarl2 1A5CtISkXoCFeBN2t5+wAsFkvFvjpbu06VZrD01Ko6eip8jv5HbMhR5TcahuBvE71tTy kFPw== 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:mime-version:content-transfer-encoding; bh=c3mzGeZYMdIcm54dP5zQ4zNA5ISFzKvdgSisuInGl3k=; b=NhibM682jjPqeBMvpZjGxYOzk52E5w8QdgYGS57H6R+o9x9UFLGRcuVVd6mHvukB85 yzOITCoj6xDozurL5ep14kxMKlJRSyJJ1FI5I1CRd/nwfI8QeoAGY/Ec4AkmpRLTMT2V 9roy2q+g443jbKBKH+xynsjSmhSdfR5n43mcUpy3cRvrwdGDoqS4Yv5kj6RzxnutL+cM M0CJbgC4Rjy++vyBaMhzZB2ugY23WgJxANDYg7uvaIMhGG3kp2a/nB2nsGYHph3uojOI XhqWpj3LmKITHLwfcoUlNy02XnNDFaVIb7iH5dAYcg4KewVhZCtj3dVlBDiqYioukJNk /T+g== X-Gm-Message-State: AGi0PuaTN3Pesto9m6vAmvAEcTpjdvkOzKzLH0jon5GewiTRzQJeUEMN 7mAGDMkImpJ8F61xzEZ/XCAXhI7XA6s= X-Google-Smtp-Source: APiQypIMKBTNN5y9EXhA06gU1j/ydY3cVXakzPINrOGktX2YGtKYfX2tEc6KyOZKWvD9I37OPBZatA== X-Received: by 2002:a7b:ce0b:: with SMTP id m11mr11371609wmc.67.1588543571188; Sun, 03 May 2020 15:06:11 -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 a24sm10307285wmb.24.2020.05.03.15.06.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 May 2020 15:06:10 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 23:05:48 +0100 Message-Id: <20200503220548.23543-22-sw@jkqxz.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200503220548.23543-1-sw@jkqxz.net> References: <20200503220548.23543-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 22/22] h264_metadata_bsf: Improve interpretation of input display matrices 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" The previous code here only worked in more limited cases. --- libavcodec/h264_metadata_bsf.c | 42 +++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/libavcodec/h264_metadata_bsf.c b/libavcodec/h264_metadata_bsf.c index bfb5b7d7e4..10f4c3c56d 100644 --- a/libavcodec/h264_metadata_bsf.c +++ b/libavcodec/h264_metadata_bsf.c @@ -440,23 +440,39 @@ static int h264_metadata_handle_display_orientation(AVBSFContext *bsf, data = av_packet_get_side_data(pkt, AV_PKT_DATA_DISPLAYMATRIX, &size); if (data && size >= 9 * sizeof(int32_t)) { int32_t matrix[9]; + double dmatrix[9]; int hflip, vflip; - double angle; + double scale_x, scale_y, angle; memcpy(matrix, data, sizeof(matrix)); - hflip = vflip = 0; - if (matrix[0] < 0 && matrix[4] > 0) - hflip = 1; - else if (matrix[0] > 0 && matrix[4] < 0) - vflip = 1; - av_display_matrix_flip(matrix, hflip, vflip); + for (i = 0; i < 9; i++) + dmatrix[i] = matrix[i] / 65536.0; + + // Extract scale factors. + scale_x = hypot(dmatrix[0], dmatrix[3]); + scale_y = hypot(dmatrix[1], dmatrix[4]); + + // Select flips to make the main diagonal positive. + hflip = dmatrix[0] < 0.0; + vflip = dmatrix[4] < 0.0; + if (hflip) + scale_x = -scale_x; + if (vflip) + scale_y = -scale_y; + + // Rescale. + for (i = 0; i < 9; i += 3) { + dmatrix[i] /= scale_x; + dmatrix[i + 1] /= scale_y; + } - angle = av_display_rotation_get(matrix); + // Extract rotation. + angle = atan2(dmatrix[3], dmatrix[0]); - if (!(angle >= -180.0 && angle <= 180.0 /* also excludes NaN */) || - matrix[2] != 0 || matrix[5] != 0 || - matrix[6] != 0 || matrix[7] != 0) { + if (!(angle >= -M_PI && angle <= M_PI) || + matrix[2] != 0.0 || matrix[5] != 0.0 || + matrix[6] != 0.0 || matrix[7] != 0.0) { av_log(bsf, AV_LOG_WARNING, "Input display matrix is not " "representable in H.264 parameters.\n"); } else { @@ -464,8 +480,8 @@ static int h264_metadata_handle_display_orientation(AVBSFContext *bsf, disp->ver_flip = vflip; disp->anticlockwise_rotation = (uint16_t)rint((angle >= 0.0 ? angle - : angle + 360.0) * - 65536.0 / 360.0); + : angle + 2 * M_PI) * + 32768.0 / M_PI); write = 1; } }