From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 0B8DE4C031 for ; Sat, 20 Jul 2024 12:45:47 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8146D68D957; Sat, 20 Jul 2024 15:45:23 +0300 (EEST) Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BA4C268D8EE for ; Sat, 20 Jul 2024 15:45:16 +0300 (EEST) Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-1fc4fcbb131so24922745ad.3 for ; Sat, 20 Jul 2024 05:45:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1721479514; x=1722084314; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=LfGf6xOjyzbJy670uNDIefRaGCX/f1wcDGhIe93y3eo=; b=gWlQFPiO/TYfSCQ8neAa+m4Z0VrT7Kn1x1K9R2EHu5OFbXOvkvBG23jZDZeudU1UyX jO/lDqQPjcfuzYqncdpS6Z1e/79vT64ds0purjjG4hWM5r1Rlgtd8gZ5eVLSzil8D93e 9J7o/RxZKXhPcI03HWxWW7E6DvfXwP1gSY2FfZe6yrWVzaRTUiKCRYnz3hA2M91ib3UH wBU+j/8OoSn6arl/ES0yz1umJLjkzKPsanbdVeYp8Vacb3GCtHGEWFNW3XKpkBAHE8OS CEUyNDd2IEPEantLW6LSJkTbNzwwcD0OBCoOYqo5K9UGQBQsW5ln88qVe85WP9dHaT1Y 9sIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721479514; x=1722084314; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LfGf6xOjyzbJy670uNDIefRaGCX/f1wcDGhIe93y3eo=; b=F3P8dxe0RRYTLk5QJYNyl/18suUQ1fAkMbCVjRXpAJ3CP0pFciCnl/UpYjG7Dmelbu peIeLqp5vYfiVI3QrLrDnLLAkCjqWIx2Kqd/C887p2rU5kzvOWirWQ9BqzOEYUY/dQyn BlbdlnSDFTftjUQU9J2FCGuKfraeiHh0q4EwIMslJe49SqDqWjL3XfyPqoC9sCuNqZY/ xjIGP2q+zPnew8/1e+CxZT3fbEdNx9WQQ/40j54MGFY2RgsqgSntESdiCtcYHN1/V0MP /OKiffDdYU8NpRacjEbdw6tQBH48Cu1v8+KgKCBzTXm1hcz7wB1UxCVRNWwUc8PpChE0 EPIQ== X-Gm-Message-State: AOJu0YwFK8z9HodzTULa/cYJpxt29s5Cm506dzVIiJ1lTKLFvG+2co6X A1e2bg0Xcnj/V/vyKJSsUjLaCxbFFmuC06xN5zOrWi4um5Od2JYEvG7TkA== X-Google-Smtp-Source: AGHT+IFMoFQzBl2IMzTHhcS3c85Oqe0FrgXqycYuiaLWP9Y9yNCdp8Y4ZK226ODU+fltH2IMAwBJPA== X-Received: by 2002:a17:902:ce07:b0:1fc:5a11:4ac7 with SMTP id d9443c01a7336-1fd74662a4cmr22715465ad.64.1721479514428; Sat, 20 Jul 2024 05:45:14 -0700 (PDT) Received: from localhost.localdomain ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fd6f25de96sm21359765ad.54.2024.07.20.05.45.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jul 2024 05:45:14 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 20 Jul 2024 09:45:10 -0300 Message-ID: <20240720124510.1689-4-jamrial@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240720124510.1689-1-jamrial@gmail.com> References: <20240720124510.1689-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/4] avcodec/h264dec: add support for LCEVC enhancement 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Signed-off-by: James Almer --- libavcodec/Makefile | 2 +- libavcodec/avcodec.h | 5 ++++ libavcodec/h264_picture.c | 1 + libavcodec/h264_slice.c | 19 ++++++++++++++++ libavcodec/h264dec.c | 48 ++++++++++++++++++++++++++++++++++++--- libavcodec/h264dec.h | 3 +++ 6 files changed, 74 insertions(+), 4 deletions(-) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 771e2b597e..69492eee10 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -407,7 +407,7 @@ OBJS-$(CONFIG_H263_V4L2M2M_ENCODER) += v4l2_m2m_enc.o OBJS-$(CONFIG_H264_DECODER) += h264dec.o h264_cabac.o h264_cavlc.o \ h264_direct.o h264_loopfilter.o \ h264_mb.o h264_picture.o \ - h264_refs.o \ + h264_refs.o lcevcdec.o \ h264_slice.o h264data.o h274.o OBJS-$(CONFIG_H264_AMF_ENCODER) += amfenc_h264.o OBJS-$(CONFIG_H264_CUVID_DECODER) += cuviddec.o diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 2da63c87ea..ff20d22545 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -418,6 +418,11 @@ typedef struct RcOverride{ * Do not apply film grain, export it instead. */ #define AV_CODEC_EXPORT_DATA_FILM_GRAIN (1 << 3) +/** + * Decoding only. + * Do not apply picture enhancement layers, export them instead. + */ +#define AV_CODEC_EXPORT_DATA_ENHANCEMENTS (1 << 3) /** * The decoder will keep a reference to the frame and may reuse it later. diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c index 3234141dbd..1cdb926d15 100644 --- a/libavcodec/h264_picture.c +++ b/libavcodec/h264_picture.c @@ -103,6 +103,7 @@ static void h264_copy_picture_params(H264Picture *dst, const H264Picture *src) dst->mb_height = src->mb_height; dst->mb_stride = src->mb_stride; dst->needs_fg = src->needs_fg; + dst->needs_lcevc = src->needs_lcevc; } int ff_h264_ref_picture(H264Picture *dst, const H264Picture *src) diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index a66b75ca80..263172e600 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -191,6 +191,13 @@ static int alloc_picture(H264Context *h, H264Picture *pic) av_assert0(!pic->f->data[0]); +#if CONFIG_LIBLCEVC_DEC + if (pic->needs_lcevc) { + pic->f->width = FFMAX(h->avctx->width, h->avctx->coded_width) * 2 / FFMAX(h->avctx->sample_aspect_ratio.den, 1); + pic->f->height = FFMAX(h->avctx->height, h->avctx->coded_height) * 2 / FFMAX(h->avctx->sample_aspect_ratio.num, 1); + } +#endif + pic->tf.f = pic->f; ret = ff_thread_get_ext_buffer(h->avctx, &pic->tf, pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); @@ -206,6 +213,13 @@ static int alloc_picture(H264Context *h, H264Picture *pic) goto fail; } +#if CONFIG_LIBLCEVC_DEC + if (pic->needs_lcevc) { + pic->f->width = FFMAX(h->avctx->width, h->avctx->coded_width); + pic->f->height = FFMAX(h->avctx->height, h->avctx->coded_height); + } +#endif + ret = ff_hwaccel_frame_priv_alloc(h->avctx, &pic->hwaccel_picture_private); if (ret < 0) goto fail; @@ -459,6 +473,8 @@ int ff_h264_update_thread_context(AVCodecContext *dst, h->recovery_frame = h1->recovery_frame; h->non_gray = h1->non_gray; + av_buffer_replace(&h->lcevc, h1->lcevc); + return err; } @@ -519,6 +535,9 @@ static int h264_frame_start(H264Context *h) pic->needs_fg = h->sei.common.film_grain_characteristics.present && !h->avctx->hwaccel && !(h->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN); + pic->needs_lcevc = h->sei.common.lcevc.info && !h->avctx->hwaccel && + !(h->avctx->export_side_data & AV_CODEC_EXPORT_DATA_ENHANCEMENTS); + if ((ret = alloc_picture(h, pic)) < 0) return ret; diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index e186bc18dc..a80d8e16d5 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -57,6 +57,10 @@ #include "thread.h" #include "threadframe.h" +#if CONFIG_LIBLCEVC_DEC +#include "lcevcdec.h" +#endif + const uint16_t ff_h264_mb_sizes[4] = { 256, 384, 512, 768 }; int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx) @@ -378,6 +382,8 @@ static av_cold int h264_decode_end(AVCodecContext *avctx) h264_free_pic(h, &h->cur_pic); h264_free_pic(h, &h->last_pic_for_ec); + av_buffer_unref(&h->lcevc); + return 0; } @@ -405,6 +411,9 @@ FF_ENABLE_DEPRECATION_WARNINGS #endif if (!avctx->internal->is_copy) { +#if CONFIG_LIBLCEVC_DEC + FFLCEVCContext *lcevc; +#endif if (avctx->extradata_size > 0 && avctx->extradata) { ret = ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, &h->ps, &h->is_avc, &h->nal_length_size, @@ -419,6 +428,21 @@ FF_ENABLE_DEPRECATION_WARNINGS ret = 0; } } +#if CONFIG_LIBLCEVC_DEC + lcevc = av_mallocz(sizeof(FFLCEVCContext)); + ret = ff_lcevc_init(lcevc, avctx); + if (ret < 0) { + int explode = avctx->err_recognition & AV_EF_EXPLODE; + av_log(avctx, explode ? AV_LOG_ERROR: AV_LOG_WARNING, + "Error initializing LCEVC\n"); + if (explode) { + av_free(lcevc); + return ret; + } + ret = 0; + } + h->lcevc = av_buffer_create(lcevc, sizeof(FFLCEVCContext), ff_lcevc_free, lcevc, 0); +#endif } if (h->ps.sps && h->ps.sps->bitstream_restriction_flag && @@ -668,9 +692,23 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size) h->setup_finished = 1; } - if (h->avctx->hwaccel && - (ret = FF_HW_CALL(h->avctx, start_frame, buf, buf_size)) < 0) - goto end; + if (h->avctx->hwaccel) { + ret = FF_HW_CALL(h->avctx, start_frame, buf, buf_size); + if (ret < 0) + goto end; + } +#if CONFIG_LIBLCEVC_DEC + else if (h->cur_pic_ptr->needs_lcevc) { + FrameDecodeData *fdd = (FrameDecodeData*)h->cur_pic_ptr->f->private_ref->data; + fdd->post_process_opaque = av_buffer_ref(h->lcevc); + if (!fdd->post_process_opaque) { + ret = -1; + goto end; + } + fdd->post_process_opaque_free = ff_lcevc_unref; + fdd->post_process = ff_lcevc_process; + } +#endif } max_slice_ctx = avctx->hwaccel ? 1 : h->nb_slice_ctx; @@ -905,6 +943,10 @@ static int output_frame(H264Context *h, AVFrame *dst, H264Picture *srcp) if (!(h->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN)) av_frame_remove_side_data(dst, AV_FRAME_DATA_FILM_GRAIN_PARAMS); +#if CONFIG_LIBLCEVC_DEC + if (!(h->avctx->export_side_data & AV_CODEC_EXPORT_DATA_ENHANCEMENTS)) + av_frame_remove_side_data(dst, AV_FRAME_DATA_LCEVC); +#endif return 0; fail: diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index ccd7583bf4..419d699bab 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -154,6 +154,7 @@ typedef struct H264Picture { int invalid_gap; int sei_recovery_frame_cnt; int needs_fg; ///< whether picture needs film grain synthesis (see `f_grain`) + int needs_lcevc; ///< whether picture needs LCEVC enhancement const PPS *pps; @@ -580,6 +581,8 @@ typedef struct H264Context { int non_gray; ///< Did we encounter a intra frame after a gray gap frame int noref_gray; int skip_gray; + + AVBufferRef *lcevc; // FFLCEVCContext } H264Context; extern const uint16_t ff_h264_mb_sizes[4]; -- 2.45.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".