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  for (uint32_t i = 0; i < 256; i++) {
118  uint32_t c = i << 24;
119  for (int j = 0; j < 8; j++)
120  c = (c << 1) ^ (0x04C11DB7 & (((int32_t) c) >> 31));
121  buf_mapped[i] = av_bswap32(c);
122  }
123 
124  RET(ff_vk_unmap_buffer(s, vkb, 1));
125 
126 fail:
127  return err;
128 }
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:1031
RET
#define RET(x)
Definition: vulkan.h:68
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:604
MAX_QUANT_TABLE_SIZE
#define MAX_QUANT_TABLE_SIZE
Definition: ffv1.h:48
crc.h
fail
#define fail()
Definition: checkasm.h:217
s
#define s(width, name)
Definition: cbs_vp9.c:198
NULL
#define NULL
Definition: coverity.c:32
ffv1_vulkan.h
FFVulkanContext
Definition: vulkan.h:313
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
f
f
Definition: af_crystalizer.c:122
av_bswap32
#define av_bswap32
Definition: bswap.h:47
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
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:611
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:122
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:125
int32_t
int32_t
Definition: audioconvert.c:56