From: Petro Mozil <mozil.pet...@gmail.com> Date: Sat, 21 Sep 2024 16:52:03 +0300 Subject: [PATCH] lavc: Diracdec / Vulkan Dirac. Fix epirat's suggestion without formatting
Sorry for the delay, this is the patch without formatting. Signed-off-by: Petro Mozil <mozil.pet...@gmail.com> --- libavcodec/diracdec.c | 29 ++++++------------- libavcodec/vulkan_dirac.c | 60 ++++++++++++++++----------------------- 2 files changed, 34 insertions(+), 55 deletions(-) diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c index 9fbc8f18d3..8f5b1eee29 100644 --- a/libavcodec/diracdec.c +++ b/libavcodec/diracdec.c @@ -1675,13 +1675,13 @@ static int dirac_decode_frame_internal(DiracContext *s) } if (s->avctx->hwaccel) { - ret = ffhwaccel(s->avctx->hwaccel)->end_frame(s->avctx); + ret = FF_HW_SIMPLE_CALL(s->avctx, end_frame); if (ret == 0) { - /* Hwaccel failed - fall back on software decoder */ - } return ret; + } } + /* Hwaccel failed - fall back on software decoder */ for (comp = 0; comp < 3; comp++) { Plane *p = &s->plane[comp]; uint8_t *frame = s->current_picture->avframe->data[comp]; @@ -1770,13 +1770,6 @@ static int get_buffer_with_edge(AVCodecContext *avctx, AVFrame *f, int flags) if (ret < 0) return ret; - /*if (avctx->hwaccel) {*/ - /* f->width = s->plane[0].width;*/ - /* f->height = s->plane[0].height;*/ - /* ret = ff_get_buffer(avctx, f, flags);*/ - /* return ret;*/ - /*}*/ - f->width = avctx->width + 2 * EDGE_WIDTH; f->height = avctx->height + 2 * EDGE_WIDTH + 2; ret = ff_get_buffer(avctx, f, flags); @@ -1976,18 +1969,14 @@ static int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf, int s->pshift = s->bit_depth > 8; - /*if (s->pshift) {*/ - /* avctx->pix_fmt = s->sof_pix_fmt;*/ - /*} else {*/ - pix_fmts = (enum AVPixelFormat[]){ + pix_fmts = (enum AVPixelFormat[]){ #if CONFIG_DIRAC_VULKAN_HWACCEL - AV_PIX_FMT_VULKAN, + AV_PIX_FMT_VULKAN, #endif - s->sof_pix_fmt, - AV_PIX_FMT_NONE, - }; - avctx->pix_fmt = ff_get_format(s->avctx, pix_fmts); - /*}*/ + s->sof_pix_fmt, + AV_PIX_FMT_NONE, + }; + avctx->pix_fmt = ff_get_format(s->avctx, pix_fmts); ret = av_pix_fmt_get_chroma_sub_sample(s->sof_pix_fmt, &s->chroma_x_shift, diff --git a/libavcodec/vulkan_dirac.c b/libavcodec/vulkan_dirac.c index 7f30e4f0fe..2520c9f27e 100644 --- a/libavcodec/vulkan_dirac.c +++ b/libavcodec/vulkan_dirac.c @@ -135,13 +135,6 @@ static void free_common(AVCodecContext *avctx) { ff_vk_pipeline_free(s, &dec->horiz_wavelet_pl[i]); ff_vk_shader_free(s, &dec->horiz_wavelet_shd[i]); } - // TODO: Add freeing all pipelines and shaders for wavelets - // - - // if (dec->yuv_sampler) - // vk->DestroySamplerYcbcrConversion(s->hwctx->act_dev, - // dec->yuv_sampler, - // s->hwctx->alloc); if (dec->sampler) vk->DestroySampler(s->hwctx->act_dev, dec->sampler, s->hwctx->alloc); @@ -225,8 +218,6 @@ static inline int alloc_tmp_bufs(DiracContext *ctx, static inline int alloc_host_mapped_buf(DiracVulkanDecodeContext *dec, size_t req_size, void **mem, AVBufferRef **avbuf, FFVkBuffer **buf) { - // FFVulkanFunctions *vk = &dec->vkctx.vkfn; - // VkResult ret; int err; err = ff_vk_create_avbuf(&dec->vkctx, avbuf, req_size, NULL, NULL, @@ -307,7 +298,6 @@ static int alloc_quant_buf(DiracContext *ctx, DiracVulkanDecodeContext *dec) { subband_coeffs(ctx, ctx->num_x - 1, ctx->num_y - 1, 0, 0, tmp) + 8; coef_buf_size = coef_buf_size + 512; dec->slice_vals_size = coef_buf_size / sizeof(int32_t); - // coef_buf_size *= sizeof(int32_t); if (dec->quant_val_buf_vk_ptr) { av_buffer_unref(&dec->av_quant_val_buf); @@ -364,7 +354,6 @@ static int init_cpy_shd(DiracVulkanDecodeContext *s, FFVkSPIRVCompiler *spv, .stages = VK_SHADER_STAGE_COMPUTE_BIT, .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, .mem_quali = "writeonly", - // .mem_layout = ff_vk_shader_rep_fmt(vkctx->output_format), .mem_layout = "rgba16f", .dimensions = 2, .elems = planes, @@ -2988,7 +2977,6 @@ static int init_quant_shd(DiracVulkanDecodeContext *s, FFVkSPIRVCompiler *spv) { uint8_t *spv_data; size_t spv_len; void *spv_opaque = NULL; - // const int planes = av_pix_fmt_count_planes(s->vkctx.output_format); FFVulkanContext *vkctx = &s->vkctx; FFVulkanDescriptorSetBinding *desc; FFVkSPIRVShader *shd = &s->quant_shd; @@ -3219,11 +3207,6 @@ static av_always_inline int inline quant_pl_pass( } static int vulkan_dirac_uninit(AVCodecContext *avctx) { - // DiracContext *d = avctx->priv_data; - // if (d->hwaccel_picture_private) { - // av_freep(d->hwaccel_picture_private); - // } - free_common(avctx); return 0; @@ -3326,8 +3309,9 @@ static int vulkan_dirac_init(AVCodecContext *avctx) { s = &dec->vkctx; err = ff_vk_init(s, avctx, NULL, avctx->hw_frames_ctx); - if (err < 0) - return err; + if (err < 0) { + goto fafil; + } /* Create queue context */ ff_vk_qf_init(s, &dec->qf, VK_QUEUE_COMPUTE_BIT); @@ -3384,13 +3368,15 @@ static int vulkan_dirac_init(AVCodecContext *avctx) { VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - if (err < 0) - return err; + if (err < 0) { + goto fail; + } err = ff_vk_map_buffer(&dec->vkctx, &dec->subband_info, (uint8_t **)&dec->subband_info_ptr, 0); - if (err < 0) - return err; + if (err < 0) { + goto fail; + } return 0; @@ -3444,7 +3430,6 @@ static int vulkan_dirac_frame_params(AVCodecContext *avctx, } static void vulkan_dirac_free_frame_priv(FFRefStructOpaque _hwctx, void *data) { - // AVHWDeviceContext *hwctx = _hwctx.nc; DiracVulkanDecodePicture *dp = data; /* Free frame resources */ @@ -3607,15 +3592,20 @@ static int vulkan_dirac_end_frame(AVCodecContext *avctx) { err = AVERROR_PATCHWELCOME; break; } + if (err < 0) { + goto fail; + } err = cpy_to_image_pass(dec, ctx, exec, views, buf_bar, &nb_buf_bar, img_bar, &nb_img_bar, (ctx->bit_depth - 8) >> 1); - if (err < 0) - goto fail; + if (err < 0) { + goto fail; + } err = ff_vk_exec_submit(&dec->vkctx, exec); - if (err < 0) - goto fail; + if (err < 0) { + goto fail; + } ff_vk_exec_wait(&dec->vkctx, exec); @@ -3690,13 +3680,15 @@ static int vulkan_dirac_update_thread_context(AVCodecContext *dst, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - if (err < 0) - return err; + if (err < 0) { + goto fail; + } err = ff_vk_map_buffer(&dst_ctx->vkctx, &dst_ctx->subband_info, (uint8_t **)&dst_ctx->subband_info_ptr, 0); - if (err < 0) - return err; + if (err < 0) { + goto fail; + } return 0; @@ -3787,7 +3779,6 @@ static int vulkan_dirac_decode_slice(AVCodecContext *avctx, const uint8_t *data, uint32_t size) { DiracContext *s = avctx->priv_data; - /*avctx->execute2(avctx, decode_hq_slice_row, NULL, NULL, s->num_y);*/ for (int i = 0; i < s->num_y; i++) { decode_hq_slice_row(avctx, NULL, i, 0); } @@ -3812,6 +3803,5 @@ const FFHWAccel ff_dirac_vulkan_hwaccel = { .flush = &ff_vk_decode_flush, .update_thread_context = &vulkan_dirac_update_thread_context, .priv_data_size = sizeof(DiracVulkanDecodeContext), - // .caps_internal = HWACCEL_CAP_ASYNC_SAFE | HWACCEL_CAP_THREAD_SAFE, - .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, + .caps_internal = HWACCEL_CAP_ASYNC_SAFE | HWACCEL_CAP_THREAD_SAFE, }; -- 2.46.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".