From patchwork Fri Jan 6 17:15:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 39904 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bc95:b0:ad:ade2:bfd2 with SMTP id fx21csp1299434pzb; Fri, 6 Jan 2023 09:15:21 -0800 (PST) X-Google-Smtp-Source: AMrXdXupludAkqwVZe6Y66YDeqieHBCRr31mRgDiG0t2lTVKmWrYNTogeVIMhJoJe64yu9xCa7uC X-Received: by 2002:a17:907:a481:b0:7c0:c1cc:c68 with SMTP id vp1-20020a170907a48100b007c0c1cc0c68mr47566776ejc.6.1673025321362; Fri, 06 Jan 2023 09:15:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673025321; cv=none; d=google.com; s=arc-20160816; b=RWQiEtpkhjgfHQQZa+gRbYPlKreHTzbw2vYHNlg6Yuhm5QL9wJ/L9hKSK/ugG6ctDS +5rkteh1SWdeezhIKhffXpfVUfQTeoOxP0cwgG4HL3m0GtseyPxZGpVCQcI965YjySoK Rqaxy7qLCRLuvupsiZW3jUeNmlJ0EASPcnLkmgIHvGbMQI/pPY6t1hjokOt8BfEJE596 CqMOchPcLjwg8kvh2piBYaQyULK6p249T1NJ/XhfCgldKyXw8UyeEXzrbRP/rM83y9G0 9EMvrMYsRlDbDmBlAcDBqP5rbByj0e0Dh7RupMbTDqZIOxPmHUPFxb4U3hfJLToFUBgT IBuA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:to:mime-version:fcc:date:references :in-reply-to:message-id:from:dkim-signature:delivered-to; bh=tTpU26FwhA6k2/Y/TVGSRG0kSck9m0UEVqKfuq8LhMg=; b=0jWShGgFAtE7c6XAL3vQ8By8kq95+UdpkftHPi0/R1vQtx/bv6zBAdFXzzshRzBaXF O+igISswesz9nSwLMI7w/AxWYr1A3K6iQxXeNEj3NYK6o130yK/mvyDq9Q/OqSjAdJGC wKxXI8pqcEeWpr1zdWdqMkJdho0nGzZbRH4gej9whDTwQ4rGbzSZxPZFib8HEYsHEBam Kob/Fgs7y2LLU1OEpc5usjAShxrbSUrGu5oVNoQ2KTU1ZdDTDJrXXyC9cGbuZxFncMhb W3uDGgx20pgEzRzbUENcF/6dDyN/uYY4UnnqQ2EBszyqx0sMi+VwkMFnodf/VIwbXSrc Z61w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=HSOIw++v; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id qw5-20020a1709066a0500b007c115fb8501si2300979ejc.252.2023.01.06.09.15.19; Fri, 06 Jan 2023 09:15:21 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=HSOIw++v; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EE4E068BCF0; Fri, 6 Jan 2023 19:15:15 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4215668B91B for ; Fri, 6 Jan 2023 19:15:04 +0200 (EET) Received: by mail-pf1-f173.google.com with SMTP id a184so1496975pfa.9; Fri, 06 Jan 2023 09:15:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date :references:in-reply-to:message-id:from:from:to:cc:subject:date :message-id:reply-to; bh=heQVtAeF8yTKDH9eA6mPRQ8zqx2jtJ4D4m2rDNvJG6U=; b=HSOIw++vtBRcRSdtzjUoSJnH2bJOlEWA4sS88beZZjVYQwRgtgorKfGmZtHzfUJF1z eStv++wGQg5YBI/OL0lNmIK97iffsndBa1NkX/9nYisS9+vy/ZMqi9Tgj9TPfTT4V9lq hroocm7Hiob7CuxOgyrb4XplyY2CzCt7I+bntdZUBFVoF5CH89Kj6F58OkbJA0uou62F aOQO79ayX+DbpjI/H2NYzEwdNueEyLkfhrylQZp3+pHFAqVYGTbVUToZ/LoLy6oMz0gv 1VBxhO+3dyR58n7S+Vy8aHwBCUwo1cbJsvoxN6Ovn7rPwsiYHXA+ngtPdfmug7/+c3vl uS+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date :references:in-reply-to:message-id:from:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=heQVtAeF8yTKDH9eA6mPRQ8zqx2jtJ4D4m2rDNvJG6U=; b=RurdJXPMk/v9Ip2vjbCk9Ab9S0mKtrT6m57vctpIObqE0bIvZXXR0sagEFMUGWZ9Km LhNKemL/4FK+m9z5Cs6O8P0+ZVRCQ8kJx/UJewd475X1aH/51BFXJ8Uv647+QaUa+ada wlk/JATe4ra2pPned7uiLfXYtAtJg6YFeXtZ2pQgMgC80dd8l9X7FNE6Bu2N9htCYf8G JwyeFeSOHZDosufmsdqLqtCZlsUMrnZGmjGS8FHpd9pnUqMl0zJZQ/YxZPe7k14qx3sM AhW/9Hid/pas62BzwL3KxCddlWu7OgVK40jLv3TxvqJZTLRJPupziSJ6JgiUXu2czzkg 348Q== X-Gm-Message-State: AFqh2krA78NJqlhG8Eq3bmJX9AWL7jp2OGnT0KjknXhI8sCHXkPgQ/ot BtuppvmTpFLqEyjzGwgpM7LGzM2OJm0= X-Received: by 2002:aa7:87c7:0:b0:57a:9b14:69b7 with SMTP id i7-20020aa787c7000000b0057a9b1469b7mr54732599pfo.0.1673025301773; Fri, 06 Jan 2023 09:15:01 -0800 (PST) Received: from [127.0.0.1] (master.gitmailbox.com. [34.83.118.50]) by smtp.gmail.com with ESMTPSA id 194-20020a6214cb000000b005809d382016sm1359211pfu.74.2023.01.06.09.15.01 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 06 Jan 2023 09:15:01 -0800 (PST) From: Aman Karmani X-Google-Original-From: Aman Karmani Message-Id: In-Reply-To: References: Date: Fri, 06 Jan 2023 17:15:00 +0000 Fcc: Sent MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH v2] avcodec/vaapi_encode_h26x: passthrough A53 CC data as H264/HEVC SEI X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: Aman Karmani , "Xiang, Haihao" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: cVuhrQG15/AP From: Aman Karmani Signed-off-by: Aman Karmani --- avcodec/vaapi_encode_h26x: passthrough A53 CC data as H264/HEVC SEI v2: control via sei parameter Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging-46%2Ftmm1%2Fvaapi-a53cc-v2 Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-46/tmm1/vaapi-a53cc-v2 Pull-Request: https://github.com/ffstaging/FFmpeg/pull/46 Range-diff vs v1: 1: a8eb71f061 ! 1: 9a2fee07a9 avcodec/vaapi_encode_h26x: passthrough A53 CC data as H264/HEVC SEI @@ libavcodec/vaapi_encode_h264.c: static int vaapi_encode_h264_write_extra_header( priv->sei_needed = 0; -@@ libavcodec/vaapi_encode_h264.c: static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx, - VAAPIEncodePicture *prev = pic->prev; - VAAPIEncodeH264Picture *hprev = prev ? prev->priv_data : NULL; - VAEncPictureParameterBufferH264 *vpic = pic->codec_picture_params; -- int i; -+ int i, err; -+ size_t sei_a53cc_len; - - if (pic->type == PICTURE_TYPE_IDR) { - av_assert0(pic->display_order == pic->encode_order); @@ libavcodec/vaapi_encode_h264.c: static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx, priv->sei_needed |= SEI_RECOVERY_POINT; } -+ av_freep(&priv->sei_a53cc_data); -+ err = ff_alloc_a53_sei(pic->input_image, 0, &priv->sei_a53cc_data, &sei_a53cc_len); -+ if (err < 0) -+ return err; -+ if (priv->sei_a53cc_data != NULL) { -+ priv->sei_a53cc.itu_t_t35_country_code = 181; -+ priv->sei_a53cc.data = (uint8_t *)priv->sei_a53cc_data + 1; -+ priv->sei_a53cc.data_length = sei_a53cc_len - 1; ++ if (priv->sei & SEI_A53_CC) { ++ int err; ++ size_t sei_a53cc_len; ++ av_freep(&priv->sei_a53cc_data); ++ err = ff_alloc_a53_sei(pic->input_image, 0, &priv->sei_a53cc_data, &sei_a53cc_len); ++ if (err < 0) ++ return err; ++ if (priv->sei_a53cc_data != NULL) { ++ priv->sei_a53cc.itu_t_t35_country_code = 181; ++ priv->sei_a53cc.data = (uint8_t *)priv->sei_a53cc_data + 1; ++ priv->sei_a53cc.data_length = sei_a53cc_len - 1; + -+ priv->sei_needed |= SEI_A53_CC; ++ priv->sei_needed |= SEI_A53_CC; ++ } + } + vpic->CurrPic = (VAPictureH264) { @@ libavcodec/vaapi_encode_h264.c: static av_cold int vaapi_encode_h264_close(AVCod return ff_vaapi_encode_close(avctx); } +@@ libavcodec/vaapi_encode_h264.c: 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_A53_CC }, + 0, INT_MAX, FLAGS, "sei" }, + { "identifier", "Include encoder version identifier", + 0, AV_OPT_TYPE_CONST, { .i64 = SEI_IDENTIFIER }, +@@ libavcodec/vaapi_encode_h264.c: 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" }, ++ { "a53_cc", "Include A/53 caption data" ++ 0, AV_OPT_TYPE_CONST, { .i64 = SEI_A53_CC }, ++ INT_MIN, INT_MAX, FLAGS, "sei" }, + + { "profile", "Set profile (profile_idc and constraint_set*_flag)", + OFFSET(profile), AV_OPT_TYPE_INT, ## libavcodec/vaapi_encode_h265.c ## @@ @@ libavcodec/vaapi_encode_h265.c: static int vaapi_encode_h265_write_extra_header( priv->sei_needed = 0; -@@ libavcodec/vaapi_encode_h265.c: static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, - VAAPIEncodePicture *prev = pic->prev; - VAAPIEncodeH265Picture *hprev = prev ? prev->priv_data : NULL; - VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params; -- int i; -+ int i, err; -+ size_t sei_a53cc_len; - - if (pic->type == PICTURE_TYPE_IDR) { - av_assert0(pic->display_order == pic->encode_order); @@ libavcodec/vaapi_encode_h265.c: static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, } } -+ av_freep(&priv->sei_a53cc_data); -+ err = ff_alloc_a53_sei(pic->input_image, 0, &priv->sei_a53cc_data, &sei_a53cc_len); -+ if (err < 0) -+ return err; -+ if (priv->sei_a53cc_data != NULL) { -+ priv->sei_a53cc.itu_t_t35_country_code = 181; -+ priv->sei_a53cc.data = (uint8_t *)priv->sei_a53cc_data + 1; -+ priv->sei_a53cc.data_length = sei_a53cc_len - 1; ++ if (priv->sei & SEI_A53_CC) { ++ int err; ++ size_t sei_a53cc_len; ++ av_freep(&priv->sei_a53cc_data); ++ err = ff_alloc_a53_sei(pic->input_image, 0, &priv->sei_a53cc_data, &sei_a53cc_len); ++ if (err < 0) ++ return err; ++ if (priv->sei_a53cc_data != NULL) { ++ priv->sei_a53cc.itu_t_t35_country_code = 181; ++ priv->sei_a53cc.data = (uint8_t *)priv->sei_a53cc_data + 1; ++ priv->sei_a53cc.data_length = sei_a53cc_len - 1; + -+ priv->sei_needed |= SEI_A53_CC; ++ priv->sei_needed |= SEI_A53_CC; ++ } + } + vpic->decoded_curr_pic = (VAPictureHEVC) { @@ libavcodec/vaapi_encode_h265.c: static av_cold int vaapi_encode_h265_close(AVCod return ff_vaapi_encode_close(avctx); } +@@ libavcodec/vaapi_encode_h265.c: static const AVOption vaapi_encode_h265_options[] = { + + { "sei", "Set SEI to include", + OFFSET(sei), AV_OPT_TYPE_FLAGS, +- { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL }, ++ { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL | SEI_A53_CC }, + 0, INT_MAX, FLAGS, "sei" }, + { "hdr", + "Include HDR metadata for mastering display colour volume " +@@ libavcodec/vaapi_encode_h265.c: static const AVOption vaapi_encode_h265_options[] = { + 0, AV_OPT_TYPE_CONST, + { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL }, + INT_MIN, INT_MAX, FLAGS, "sei" }, ++ { "a53_cc", ++ "Include A/53 caption data" ++ 0, AV_OPT_TYPE_CONST, ++ { .i64 = SEI_A53_CC }, ++ INT_MIN, INT_MAX, FLAGS, "sei" }, + + { "tiles", "Tile columns x rows", + OFFSET(common.tile_cols), AV_OPT_TYPE_IMAGE_SIZE, libavcodec/vaapi_encode_h264.c | 33 +++++++++++++++++++++++++++++++- libavcodec/vaapi_encode_h265.c | 35 +++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) base-commit: 3bcec58535d395945a390bdc7af4048a7abc60eb diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c index b1b503b2a6..06b0004a2c 100644 --- a/libavcodec/vaapi_encode_h264.c +++ b/libavcodec/vaapi_encode_h264.c @@ -26,6 +26,7 @@ #include "libavutil/internal.h" #include "libavutil/opt.h" +#include "atsc_a53.h" #include "avcodec.h" #include "cbs.h" #include "cbs_h264.h" @@ -40,6 +41,7 @@ enum { SEI_TIMING = 0x01, SEI_IDENTIFIER = 0x02, SEI_RECOVERY_POINT = 0x04, + SEI_A53_CC = 0x08, }; // Random (version 4) ISO 11578 UUID. @@ -98,6 +100,8 @@ typedef struct VAAPIEncodeH264Context { H264RawSEIRecoveryPoint sei_recovery_point; SEIRawUserDataUnregistered sei_identifier; char *sei_identifier_string; + SEIRawUserDataRegistered sei_a53cc; + void *sei_a53cc_data; int aud_needed; int sei_needed; @@ -248,6 +252,13 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx, if (err < 0) goto fail; } + if (priv->sei_needed & SEI_A53_CC) { + err = ff_cbs_sei_add_message(priv->cbc, au, 1, + SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35, + &priv->sei_a53cc, NULL); + if (err < 0) + goto fail; + } priv->sei_needed = 0; @@ -681,6 +692,22 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx, priv->sei_needed |= SEI_RECOVERY_POINT; } + if (priv->sei & SEI_A53_CC) { + int err; + size_t sei_a53cc_len; + av_freep(&priv->sei_a53cc_data); + err = ff_alloc_a53_sei(pic->input_image, 0, &priv->sei_a53cc_data, &sei_a53cc_len); + if (err < 0) + return err; + if (priv->sei_a53cc_data != NULL) { + priv->sei_a53cc.itu_t_t35_country_code = 181; + priv->sei_a53cc.data = (uint8_t *)priv->sei_a53cc_data + 1; + priv->sei_a53cc.data_length = sei_a53cc_len - 1; + + priv->sei_needed |= SEI_A53_CC; + } + } + vpic->CurrPic = (VAPictureH264) { .picture_id = pic->recon_surface, .frame_idx = hpic->frame_num, @@ -1226,6 +1253,7 @@ static av_cold int vaapi_encode_h264_close(AVCodecContext *avctx) ff_cbs_fragment_free(&priv->current_access_unit); ff_cbs_close(&priv->cbc); av_freep(&priv->sei_identifier_string); + av_freep(&priv->sei_a53cc_data); return ff_vaapi_encode_close(avctx); } @@ -1252,7 +1280,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_A53_CC }, 0, INT_MAX, FLAGS, "sei" }, { "identifier", "Include encoder version identifier", 0, AV_OPT_TYPE_CONST, { .i64 = SEI_IDENTIFIER }, @@ -1263,6 +1291,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" }, + { "a53_cc", "Include A/53 caption data" + 0, AV_OPT_TYPE_CONST, { .i64 = SEI_A53_CC }, + INT_MIN, INT_MAX, FLAGS, "sei" }, { "profile", "Set profile (profile_idc and constraint_set*_flag)", OFFSET(profile), AV_OPT_TYPE_INT, diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index 94b56c6578..991d8a3aba 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -27,6 +27,7 @@ #include "libavutil/opt.h" #include "libavutil/mastering_display_metadata.h" +#include "atsc_a53.h" #include "avcodec.h" #include "cbs.h" #include "cbs_h265.h" @@ -40,6 +41,7 @@ enum { SEI_MASTERING_DISPLAY = 0x08, SEI_CONTENT_LIGHT_LEVEL = 0x10, + SEI_A53_CC = 0x20, }; typedef struct VAAPIEncodeH265Picture { @@ -84,6 +86,8 @@ typedef struct VAAPIEncodeH265Context { SEIRawMasteringDisplayColourVolume sei_mastering_display; SEIRawContentLightLevelInfo sei_content_light_level; + SEIRawUserDataRegistered sei_a53cc; + void *sei_a53cc_data; CodedBitstreamContext *cbc; CodedBitstreamFragment current_access_unit; @@ -226,6 +230,13 @@ static int vaapi_encode_h265_write_extra_header(AVCodecContext *avctx, if (err < 0) goto fail; } + if (priv->sei_needed & SEI_A53_CC) { + err = ff_cbs_sei_add_message(priv->cbc, au, 1, + SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35, + &priv->sei_a53cc, NULL); + if (err < 0) + goto fail; + } priv->sei_needed = 0; @@ -888,6 +899,22 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, } } + if (priv->sei & SEI_A53_CC) { + int err; + size_t sei_a53cc_len; + av_freep(&priv->sei_a53cc_data); + err = ff_alloc_a53_sei(pic->input_image, 0, &priv->sei_a53cc_data, &sei_a53cc_len); + if (err < 0) + return err; + if (priv->sei_a53cc_data != NULL) { + priv->sei_a53cc.itu_t_t35_country_code = 181; + priv->sei_a53cc.data = (uint8_t *)priv->sei_a53cc_data + 1; + priv->sei_a53cc.data_length = sei_a53cc_len - 1; + + priv->sei_needed |= SEI_A53_CC; + } + } + vpic->decoded_curr_pic = (VAPictureHEVC) { .picture_id = pic->recon_surface, .pic_order_cnt = hpic->pic_order_cnt, @@ -1355,6 +1382,7 @@ static av_cold int vaapi_encode_h265_close(AVCodecContext *avctx) ff_cbs_fragment_free(&priv->current_access_unit); ff_cbs_close(&priv->cbc); + av_freep(&priv->sei_a53cc_data); return ff_vaapi_encode_close(avctx); } @@ -1413,7 +1441,7 @@ static const AVOption vaapi_encode_h265_options[] = { { "sei", "Set SEI to include", OFFSET(sei), AV_OPT_TYPE_FLAGS, - { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL }, + { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL | SEI_A53_CC }, 0, INT_MAX, FLAGS, "sei" }, { "hdr", "Include HDR metadata for mastering display colour volume " @@ -1421,6 +1449,11 @@ static const AVOption vaapi_encode_h265_options[] = { 0, AV_OPT_TYPE_CONST, { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL }, INT_MIN, INT_MAX, FLAGS, "sei" }, + { "a53_cc", + "Include A/53 caption data" + 0, AV_OPT_TYPE_CONST, + { .i64 = SEI_A53_CC }, + INT_MIN, INT_MAX, FLAGS, "sei" }, { "tiles", "Tile columns x rows", OFFSET(common.tile_cols), AV_OPT_TYPE_IMAGE_SIZE,