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 ESMTPS id CC28E4C79A for ; Mon, 10 Mar 2025 03:10:54 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CE67268E82A; Mon, 10 Mar 2025 05:08:59 +0200 (EET) Received: from vidala.pars.ee (vidala.pars.ee [116.203.72.101]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4178168E7C4 for ; Mon, 10 Mar 2025 05:08:41 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; s=202405r; d=lynne.ee; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1741576120; bh=xNBoZZM/REutgg1+rf4EOeh eDzUI+c4tCD9CZmUCPyY=; b=FwE8ELignwvNxz2Vobg1By0BEMmbPtJsxatO+s/C5Yo+ENrERU yURpkwrdeUIr4dRAksey7ZyxuEtJTS8H9qrEwWVu2yMIHlR4zvTuhY/qzlPWWFLd9Z3nIFN85ov wWH6i0wNKP7hv+RLP9lBHu2rwrCVmn1TrnHJEZtt0tzx4GdPC6ih0SuaBGIJxHRKLgVL7BTBfsS FjCeOKmiwKuYNr745fEFt8Eb0KAbYd6HMf+B1HRWXWfi8j+T9DTI/yQbOYCTE/vidVPIwHvUjZA FN1Bl6z8e7uZLU/RC3tifFv9ArVbGIS26Zu6ivPMUI6evYt3BwGsCus/aADVbpN9G/w==; DKIM-Signature: v=1; a=ed25519-sha256; s=202405e; d=lynne.ee; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1741576120; bh=xNBoZZM/REutgg1+rf4EOeh eDzUI+c4tCD9CZmUCPyY=; b=Omn4QCI6Gu0nSDhPZ7xY/0C3rFMfhmb+4GRcxMaXTWCU4AWZL3 kH9KoFwZuNXozOAayNQwwn7hqpSYZNtJ+3Cw==; From: Lynne To: ffmpeg-devel@ffmpeg.org Date: Mon, 10 Mar 2025 04:08:29 +0100 Message-ID: <20250310030837.60814-10-dev@lynne.ee> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250310030837.60814-1-dev@lynne.ee> References: <20250310030837.60814-1-dev@lynne.ee> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/13] ffv1dec: add support for hwaccels 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: Lynne 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: This commit adds support for hardware accelerated decoding to the decoder. The previous commits already refactored the decoder, this commit simply adds calls to hooks to decode. --- libavcodec/ffv1.h | 2 ++ libavcodec/ffv1dec.c | 81 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h index c23d64d54a..8c0e71284d 100644 --- a/libavcodec/ffv1.h +++ b/libavcodec/ffv1.h @@ -125,8 +125,10 @@ typedef struct FFV1Context { int64_t picture_number; int key_frame; ProgressFrame picture, last_picture; + void *hwaccel_picture_private, *hwaccel_last_picture_private; uint32_t crcref; enum AVPixelFormat pix_fmt; + enum AVPixelFormat configured_pix_fmt; const AVFrame *cur_enc_frame; int plane_count; diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index 5e9a765e38..eaa21eebdf 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -41,6 +41,9 @@ #include "libavutil/refstruct.h" #include "thread.h" #include "decode.h" +#include "hwconfig.h" +#include "hwaccel_internal.h" +#include "config_components.h" static inline int get_vlc_symbol(GetBitContext *gb, VlcState *const state, int bits) @@ -365,9 +368,12 @@ static int read_header(FFV1Context *f, RangeCoder *c) if (ret < 0) return ret; - f->avctx->pix_fmt = get_pixel_format(f); - if (f->avctx->pix_fmt < 0) - return AVERROR(EINVAL); + if (f->configured_pix_fmt != f->pix_fmt) { + f->avctx->pix_fmt = get_pixel_format(f); + if (f->avctx->pix_fmt < 0) + return AVERROR(EINVAL); + f->configured_pix_fmt = f->pix_fmt; + } ff_dlog(f->avctx, "%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift, f->pix_fmt); @@ -460,6 +466,9 @@ static av_cold int decode_init(AVCodecContext *avctx) FFV1Context *f = avctx->priv_data; int ret; + f->pix_fmt = AV_PIX_FMT_NONE; + f->configured_pix_fmt = AV_PIX_FMT_NONE; + if ((ret = ff_ffv1_common_init(avctx, f)) < 0) return ret; @@ -644,13 +653,16 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, FFV1Context *f = avctx->priv_data; int ret; AVFrame *p; + const FFHWAccel *hwaccel = NULL; /* This is copied onto the first slice's range coder context */ RangeCoder c; ff_progress_frame_unref(&f->last_picture); - FFSWAP(ProgressFrame, f->picture, f->last_picture); + av_refstruct_unref(&f->hwaccel_last_picture_private); + FFSWAP(ProgressFrame, f->picture, f->last_picture); + FFSWAP(void *, f->hwaccel_picture_private, f->hwaccel_last_picture_private); f->avctx = avctx; f->frame_damaged = 0; @@ -659,11 +671,18 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, if (ret < 0) return ret; + if (avctx->hwaccel) + hwaccel = ffhwaccel(avctx->hwaccel); + ret = ff_progress_frame_get_buffer(avctx, &f->picture, AV_GET_BUFFER_FLAG_REF); if (ret < 0) return ret; + ret = ff_hwaccel_frame_priv_alloc(avctx, &f->hwaccel_picture_private); + if (ret < 0) + return ret; + p = f->picture.f; p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P @@ -680,15 +699,53 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, av_log(avctx, AV_LOG_DEBUG, "ver:%d keyframe:%d coder:%d ec:%d slices:%d bps:%d\n", f->version, !!(p->flags & AV_FRAME_FLAG_KEY), f->ac, f->ec, f->slice_count, f->avctx->bits_per_raw_sample); + /* Start */ + if (hwaccel) { + ret = hwaccel->start_frame(avctx, avpkt->data, avpkt->size); + if (ret < 0) + return ret; + } + ff_thread_finish_setup(avctx); - ret = decode_slices(avctx, c, avpkt); - if (ret < 0) - return ret; + /* Decode slices */ + if (hwaccel) { + uint8_t *buf_end = avpkt->data + avpkt->size; + + if (!(p->flags & AV_FRAME_FLAG_KEY) && f->last_picture.f) + ff_progress_frame_await(&f->last_picture, f->slice_count - 1); + + for (int i = f->slice_count - 1; i >= 0; i--) { + uint8_t *pos; + uint32_t len; + ret = find_next_slice(avctx, avpkt->data, buf_end, i, + &pos, &len); + if (ret < 0) + return ret; + + buf_end -= len; + + ret = hwaccel->decode_slice(avctx, pos, len); + if (ret < 0) + return ret; + } + } else { + ret = decode_slices(avctx, c, avpkt); + if (ret < 0) + return ret; + } + + /* Finalize */ + if (hwaccel) { + ret = hwaccel->end_frame(avctx); + if (ret < 0) + return ret; + } ff_progress_frame_report(&f->picture, INT_MAX); ff_progress_frame_unref(&f->last_picture); + av_refstruct_unref(&f->hwaccel_last_picture_private); if ((ret = av_frame_ref(rframe, f->picture.f)) < 0) return ret; @@ -717,6 +774,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) fdst->ac = fsrc->ac; fdst->colorspace = fsrc->colorspace; fdst->pix_fmt = fsrc->pix_fmt; + fdst->configured_pix_fmt = fsrc->configured_pix_fmt; fdst->ec = fsrc->ec; fdst->intra = fsrc->intra; @@ -752,6 +810,8 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src) av_assert1(fdst->max_slice_count == fsrc->max_slice_count); ff_progress_frame_replace(&fdst->picture, &fsrc->picture); + av_refstruct_replace(&fdst->hwaccel_picture_private, + fsrc->hwaccel_picture_private); return 0; } @@ -762,8 +822,10 @@ static av_cold int ffv1_decode_close(AVCodecContext *avctx) FFV1Context *const s = avctx->priv_data; ff_progress_frame_unref(&s->picture); + av_refstruct_unref(&s->hwaccel_picture_private); + ff_progress_frame_unref(&s->last_picture); - av_freep(&avctx->stats_out); + av_refstruct_unref(&s->hwaccel_last_picture_private); ff_ffv1_close(s); @@ -784,4 +846,7 @@ const FFCodec ff_ffv1_decoder = { AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS, .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_USES_PROGRESSFRAMES, + .hw_configs = (const AVCodecHWConfigInternal *const []) { + NULL + }, }; -- 2.47.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".