FFmpeg
ffv1_vulkan.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2025 Lynne <dev@lynne.ee>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "ffv1_vulkan.h"
22 #include "libavutil/crc.h"
23 
25  FFVkBuffer *vkb, FFV1Context *f)
26 {
27  int err;
28  uint8_t *buf_mapped;
29 
30  RET(ff_vk_map_buffer(s, vkb, &buf_mapped, 0));
31 
32  for (int i = 1; i < 256; i++) {
33  buf_mapped[256 + i] = f->state_transition[i];
34  buf_mapped[256 - i] = 256 - (int)f->state_transition[i];
35  }
36 
37  RET(ff_vk_unmap_buffer(s, vkb, 1));
38 
39 fail:
40  return err;
41 }
42 
44  FFVkBuffer *vkb, FFV1Context *f,
45  int (*write_data)(FFVulkanContext *s,
46  FFVkBuffer *vkb, FFV1Context *f))
47 {
48  int err;
49  size_t buf_len = 512*sizeof(uint8_t);
50 
51  RET(ff_vk_create_buf(s, vkb,
52  buf_len,
53  NULL, NULL,
54  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
55  VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
56  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
57  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
58 
59  write_data(s, vkb, f);
60 
61 fail:
62  return err;
63 }
64 
66  FFVkBuffer *vkb, FFV1Context *f)
67 {
68  return init_state_transition_data(s, vkb, f,
70 }
71 
73  FFVkBuffer *vkb, FFV1Context *f)
74 {
75  int err;
76 
77  int16_t *buf_mapped;
78  size_t buf_len = MAX_QUANT_TABLES*
80  MAX_QUANT_TABLE_SIZE*sizeof(int16_t);
81 
82  RET(ff_vk_create_buf(s, vkb,
83  buf_len,
84  NULL, NULL,
85  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
86  VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
87  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
88  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
89  RET(ff_vk_map_buffer(s, vkb, (void *)&buf_mapped, 0));
90 
91  memcpy(buf_mapped, f->quant_tables,
92  sizeof(f->quant_tables));
93 
94  RET(ff_vk_unmap_buffer(s, vkb, 1));
95 
96 fail:
97  return err;
98 }
99 
101  FFVkBuffer *vkb, FFV1Context *f)
102 {
103  int err;
104 
105  uint32_t *buf_mapped;
106  size_t buf_len = 256*sizeof(int32_t);
107 
108  RET(ff_vk_create_buf(s, vkb,
109  buf_len,
110  NULL, NULL,
111  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
112  VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
113  VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
114  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
115  RET(ff_vk_map_buffer(s, vkb, (void *)&buf_mapped, 0));
116 
117  memcpy(buf_mapped, av_crc_get_table(AV_CRC_32_IEEE), buf_len);
118 
119  RET(ff_vk_unmap_buffer(s, vkb, 1));
120 
121 fail:
122  return err;
123 }
ff_vk_create_buf
int ff_vk_create_buf(FFVulkanContext *s, FFVkBuffer *buf, size_t size, void *pNext, void *alloc_pNext, VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags)
Definition: vulkan.c:948
RET
#define RET(x)
Definition: vulkan.h:67
ff_ffv1_vk_init_quant_table_data
int ff_ffv1_vk_init_quant_table_data(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f)
Definition: ffv1_vulkan.c:72
ff_vk_map_buffer
static int ff_vk_map_buffer(FFVulkanContext *s, FFVkBuffer *buf, uint8_t **mem, int invalidate)
Definition: vulkan.h:518
MAX_QUANT_TABLE_SIZE
#define MAX_QUANT_TABLE_SIZE
Definition: ffv1.h:48
crc.h
fail
#define fail()
Definition: checkasm.h:193
s
#define s(width, name)
Definition: cbs_vp9.c:198
NULL
#define NULL
Definition: coverity.c:32
ffv1_vulkan.h
FFVulkanContext
Definition: vulkan.h:276
f
f
Definition: af_crystalizer.c:122
ff_ffv1_vk_init_crc_table_data
int ff_ffv1_vk_init_crc_table_data(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f)
Definition: ffv1_vulkan.c:100
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
init_state_transition_data
static int init_state_transition_data(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f, int(*write_data)(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f))
Definition: ffv1_vulkan.c:43
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
ff_vk_unmap_buffer
static int ff_vk_unmap_buffer(FFVulkanContext *s, FFVkBuffer *buf, int flush)
Definition: vulkan.h:525
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:52
MAX_CONTEXT_INPUTS
#define MAX_CONTEXT_INPUTS
Definition: ffv1.h:50
ff_ffv1_vk_init_state_transition_data
int ff_ffv1_vk_init_state_transition_data(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f)
Definition: ffv1_vulkan.c:65
MAX_QUANT_TABLES
#define MAX_QUANT_TABLES
Definition: ffv1.h:47
FFV1Context
Definition: ffv1.h:112
ff_ffv1_vk_update_state_transition_data
int ff_ffv1_vk_update_state_transition_data(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f)
Definition: ffv1_vulkan.c:24
FFVkBuffer
Definition: vulkan.h:88
int32_t
int32_t
Definition: audioconvert.c:56