This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit da99d3f209c3ab22fae9452015cf68e49b9d4461
Author:     Lynne <[email protected]>
AuthorDate: Sat Feb 7 01:55:21 2026 +0100
Commit:     Lynne <[email protected]>
CommitDate: Thu Feb 19 19:42:30 2026 +0100

    vulkan_ffv1: implement parallel probability adaptation
---
 libavcodec/ffv1_vulkan.c             |  2 +-
 libavcodec/ffv1enc_vulkan.c          |  8 ++---
 libavcodec/vulkan/ffv1_dec.comp.glsl | 67 ++++++++++++++++++++++++++----------
 libavcodec/vulkan/rangecoder.glsl    | 12 ++++++-
 libavcodec/vulkan_ffv1.c             |  9 ++---
 5 files changed, 70 insertions(+), 28 deletions(-)

diff --git a/libavcodec/ffv1_vulkan.c b/libavcodec/ffv1_vulkan.c
index 91cfb7bd73..7908cc5f5a 100644
--- a/libavcodec/ffv1_vulkan.c
+++ b/libavcodec/ffv1_vulkan.c
@@ -86,7 +86,7 @@ static int init_state_transition_data(FFVulkanContext *s,
                          buf_len,
                          NULL, NULL,
                          VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
-                         VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
+                         VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
                          VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
                          VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
 
diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c
index b57292a783..490dc5f514 100644
--- a/libavcodec/ffv1enc_vulkan.c
+++ b/libavcodec/ffv1enc_vulkan.c
@@ -784,7 +784,7 @@ static int init_rct_search_shader(AVCodecContext *avctx, 
VkSpecializationInfo *s
 
     const FFVulkanDescriptorSetBinding desc_set_const[] = {
         { /* rangecoder_buf */
-            .type   = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+            .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
     };
@@ -827,7 +827,7 @@ static int init_setup_shader(AVCodecContext *avctx, 
VkSpecializationInfo *sl)
 
     const FFVulkanDescriptorSetBinding desc_set_const[] = {
         { /* rangecoder_buf */
-            .type   = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+            .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
     };
@@ -867,7 +867,7 @@ static int init_reset_shader(AVCodecContext *avctx, 
VkSpecializationInfo *sl)
 
     const FFVulkanDescriptorSetBinding desc_set_const[] = {
         { /* rangecoder_buf */
-            .type   = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+            .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
     };
@@ -910,7 +910,7 @@ static int init_encode_shader(AVCodecContext *avctx, 
VkSpecializationInfo *sl)
 
     const FFVulkanDescriptorSetBinding desc_set_const[] = {
         { /* rangecoder_buf */
-            .type   = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+            .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
         { /* quant_buf */
diff --git a/libavcodec/vulkan/ffv1_dec.comp.glsl 
b/libavcodec/vulkan/ffv1_dec.comp.glsl
index 584735f35e..1f37c23b2a 100644
--- a/libavcodec/vulkan/ffv1_dec.comp.glsl
+++ b/libavcodec/vulkan/ffv1_dec.comp.glsl
@@ -36,35 +36,51 @@ layout (set = 1, binding = 2, scalar) writeonly buffer 
slice_status_buf {
 layout (set = 1, binding = 3) uniform uimage2D dec[];
 
 #ifndef GOLOMB
-#define READ(c, off) get_rac(c, uint64_t(slice_state) + (state_off + off))
-int get_isymbol(inout RangeCoder c, uint state_off)
+
+#define READ(c, idx) get_rac_noadapt(c, idx)
+int get_isymbol(inout RangeCoder c)
 {
     if (READ(c, 0))
         return 0;
 
     uint e = 1;
-    for (; e < 33; e++)
-        if (!READ(c, min(e, 10)))
+    for (; e < 11; e++) {
+        if (!READ(c, e))
             break;
-
-    if (expectEXT(e == 1, false)) {
-        return READ(c, 11) ? -1 : 1;
-    } else if (expectEXT(e == 33, false)) {
-        corrupt = true;
-        return 0;
     }
 
     int a = 1;
-    for (uint i = e + 20; i >= 22; i--) {
-        a <<= 1;
-        a |= int(READ(c, min(i, 31)));
+    uint i = e;
+
+    if (bits > 8 && e == 11) {
+        do {
+            rc_state[10] = zero_one_state[rc_state[10] + 256];
+            e++;
+        } while (READ(c, 10));
+
+        e--;
+        i = e - 1;
+
+        a += a + int(READ(c, 31));
+        for (; i >= 11; i--) {
+            rc_state[31] = zero_one_state[rc_state[31] +
+                                          (rc_data[31] ? 256 : 0)];
+            a += a + int(READ(c, 31));
+        }
     }
 
+    i += 20;
+    for (; i >= 22; i--)
+        a += a + int(READ(c, i));
+
     return READ(c, min(e + 10, 21)) ? -a : a;
 }
 
 void decode_line_pcm(inout SliceContext sc, ivec2 sp, int w, int y, int p)
 {
+    if (gl_LocalInvocationID.x > 0)
+        return;
+
 #ifndef RGB
     if (p > 0 && p < 3) {
         w = ceil_rshift(w, chroma_shift.x);
@@ -99,13 +115,28 @@ void decode_line(inout SliceContext sc, ivec2 sp, int w,
                             quant_table_idx, extend_lookup[quant_table_idx]);
 
         uint context_off = state_off + CONTEXT_SIZE*abs(pr[0]);
+        u8buf cd = u8buf(uint64_t(slice_state) + context_off);
 
-        int diff = get_isymbol(sc.c, context_off);
-        if (pr[0] < 0)
-            diff = -diff;
+        rc_state[gl_LocalInvocationID.x] = cd[gl_LocalInvocationID.x].v;
+        rc_dec[gl_LocalInvocationID.x] = false;
+        barrier();
 
-        uint v = zero_extend(pr[1] + diff, bits);
-        imageStore(dec[p], sp + LADDR(ivec2(x, y)), uvec4(v));
+        int diff;
+        if (gl_LocalInvocationID.x == 0)
+            diff = get_isymbol(sc.c);
+
+        barrier();
+        uint i = gl_LocalInvocationID.x;
+        if (rc_dec[i])
+            cd[i].v = zero_one_state[rc_state[i] + (rc_data[i] ? 256 : 0)];
+
+        if (gl_LocalInvocationID.x == 0) {
+            if (pr[0] < 0)
+                diff = -diff;
+
+            uint v = zero_extend(pr[1] + diff, bits);
+            imageStore(dec[p], sp + LADDR(ivec2(x, y)), uvec4(v));
+        }
     }
 }
 #else
diff --git a/libavcodec/vulkan/rangecoder.glsl 
b/libavcodec/vulkan/rangecoder.glsl
index 15f6655359..545f13d463 100644
--- a/libavcodec/vulkan/rangecoder.glsl
+++ b/libavcodec/vulkan/rangecoder.glsl
@@ -25,7 +25,7 @@
 
 #define CONTEXT_SIZE 32
 
-layout (set = 0, binding = 0, scalar) uniform rangecoder_buf {
+layout (set = 0, binding = 0, scalar) readonly buffer rangecoder_buf {
     uint8_t zero_one_state[512];
 };
 
@@ -40,6 +40,10 @@ struct RangeCoder {
     uint8_t  outstanding_byte;
 };
 
+shared uint8_t rc_state[CONTEXT_SIZE];
+shared bool rc_data[CONTEXT_SIZE];
+shared bool rc_dec[CONTEXT_SIZE];
+
 void rac_init(out RangeCoder r, u8buf data, uint buf_size)
 {
     r.bytestream_start = uint64_t(data);
@@ -239,6 +243,12 @@ bool get_rac_direct(inout RangeCoder c, inout uint8_t 
state)
     return bit;
 }
 
+bool get_rac_noadapt(inout RangeCoder c, uint idx)
+{
+    rc_dec[idx] = true;
+    return (rc_data[idx] = get_rac_internal(c, c.range * rc_state[idx] >> 8));
+}
+
 bool get_rac(inout RangeCoder c, uint64_t state)
 {
     return get_rac_direct(c, u8buf(state).v);
diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c
index bdc3be50b4..3b1bce97d1 100644
--- a/libavcodec/vulkan_ffv1.c
+++ b/libavcodec/vulkan_ffv1.c
@@ -540,7 +540,7 @@ static int init_setup_shader(FFV1Context *f, 
FFVulkanContext *s,
 
     const FFVulkanDescriptorSetBinding desc_set_const[] = {
         { /* rangecoder_buf */
-            .type   = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+            .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
         { /* crc_ieee_buf */
@@ -591,7 +591,7 @@ static int init_reset_shader(FFV1Context *f, 
FFVulkanContext *s,
 
     const FFVulkanDescriptorSetBinding desc_set_const[] = {
         { /* rangecoder_buf */
-            .type   = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+            .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
     };
@@ -628,15 +628,16 @@ static int init_decode_shader(FFV1Context *f, 
FFVulkanContext *s,
 {
     int err;
 
+    uint32_t wg_x = ac != AC_GOLOMB_RICE ? CONTEXT_SIZE : 1;
     ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, sl,
-                      (uint32_t []) { 1, 1, 1 }, 0);
+                      (uint32_t []) { wg_x, 1, 1 }, 0);
 
     ff_vk_shader_add_push_const(shd, 0, sizeof(FFv1ShaderParams),
                                 VK_SHADER_STAGE_COMPUTE_BIT);
 
     const FFVulkanDescriptorSetBinding desc_set_const[] = {
         { /* rangecoder_buf */
-            .type   = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+            .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
         { /* quant_buf */

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to