Module: Mesa
Branch: main
Commit: e2f95ad296d665891cf455030094e1e9d20d4b43
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e2f95ad296d665891cf455030094e1e9d20d4b43

Author: Hyunjun Ko <[email protected]>
Date:   Fri Jun 16 14:40:23 2023 +0900

vulkan/video: keep delta weight and offsets of predicted weight tables in h265 
slice parsing

Signed-off-by: Hyunjun Ko <[email protected]>
Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23790>

---

 src/vulkan/runtime/vk_video.c | 31 +++++++++++++++++--------------
 src/vulkan/runtime/vk_video.h |  7 +++++++
 2 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/src/vulkan/runtime/vk_video.c b/src/vulkan/runtime/vk_video.c
index 2c456e316d9..6920d9de59b 100644
--- a/src/vulkan/runtime/vk_video.c
+++ b/src/vulkan/runtime/vk_video.c
@@ -456,19 +456,20 @@ h265_pred_weight_table(struct vk_video_h265_slice_params 
*params,
 
    for (i = 0; i < params->num_ref_idx_l0_active; ++i) {
       if (params->luma_weight_l0_flag[i]) {
-         unsigned delta_luma_weight_l0 = vl_rbsp_se(rbsp);
-         params->luma_weight_l0[i] = (1 << params->luma_log2_weight_denom) + 
delta_luma_weight_l0;
+         params->delta_luma_weight_l0[i] = vl_rbsp_se(rbsp);
+         params->luma_weight_l0[i] = (1 << params->luma_log2_weight_denom) + 
params->delta_luma_weight_l0[i];
          params->luma_offset_l0[i] = vl_rbsp_se(rbsp);
       }
 
       if (params->chroma_weight_l0_flag[i]) {
          for (j = 0; j < 2; j++) {
-            unsigned delta_chroma_weight_l0 = vl_rbsp_se(rbsp);
-            unsigned delta_chroma_offset_l0 = vl_rbsp_se(rbsp);
+            params->delta_chroma_weight_l0[i][j] = vl_rbsp_se(rbsp);
+            params->delta_chroma_offset_l0[i][j] = vl_rbsp_se(rbsp);
 
-            params->chroma_weight_l0[i][j] = (1 << 
params->chroma_log2_weight_denom) + delta_chroma_weight_l0;
-            params->chroma_offset_l0[i][j] = delta_chroma_offset_l0 -
-               ((128 * params->chroma_weight_l0[i][j]) >> 
params->chroma_log2_weight_denom) + 128;
+            params->chroma_weight_l0[i][j] =
+               (1 << params->chroma_log2_weight_denom) + 
params->delta_chroma_weight_l0[i][j];
+            params->chroma_offset_l0[i][j] = 
CLAMP(params->delta_chroma_offset_l0[i][j] -
+               ((128 * params->chroma_weight_l0[i][j]) >> 
params->chroma_log2_weight_denom) + 128, -128, 127);
          }
       } else {
          for (j = 0; j < 2; j++) {
@@ -497,19 +498,21 @@ h265_pred_weight_table(struct vk_video_h265_slice_params 
*params,
 
       for (i = 0; i < params->num_ref_idx_l1_active; ++i) {
          if (params->luma_weight_l1_flag[i]) {
-            unsigned delta_luma_weight_l1 = vl_rbsp_se(rbsp);
-            params->luma_weight_l1[i] = (1 << params->luma_log2_weight_denom) 
+ delta_luma_weight_l1;
+            params->delta_luma_weight_l1[i] = vl_rbsp_se(rbsp);
+            params->luma_weight_l1[i] =
+               (1 << params->luma_log2_weight_denom) + 
params->delta_luma_weight_l1[i];
             params->luma_offset_l1[i] = vl_rbsp_se(rbsp);
          }
 
          if (params->chroma_weight_l1_flag[i]) {
             for (j = 0; j < 2; j++) {
-               unsigned delta_chroma_weight_l1 = vl_rbsp_se(rbsp);
-               unsigned delta_chroma_offset_l1 = vl_rbsp_se(rbsp);
+               params->delta_chroma_weight_l1[i][j] = vl_rbsp_se(rbsp);
+               params->delta_chroma_offset_l1[i][j] = vl_rbsp_se(rbsp);
 
-               params->chroma_weight_l1[i][j] = (1 << 
params->chroma_log2_weight_denom) + delta_chroma_weight_l1;
-               params->chroma_offset_l1[i][j] = delta_chroma_offset_l1 -
-                  ((128 * params->chroma_weight_l1[i][j]) >> 
params->chroma_log2_weight_denom) + 128;
+               params->chroma_weight_l1[i][j] =
+                  (1 << params->chroma_log2_weight_denom) + 
params->delta_chroma_weight_l1[i][j];
+               params->chroma_offset_l1[i][j] = 
CLAMP(params->delta_chroma_offset_l1[i][j] -
+                  ((128 * params->chroma_weight_l1[i][j]) >> 
params->chroma_log2_weight_denom) + 128, -128, 127);
             }
          } else {
             for (j = 0; j < 2; j++) {
diff --git a/src/vulkan/runtime/vk_video.h b/src/vulkan/runtime/vk_video.h
index d266339a052..29fb905c92f 100644
--- a/src/vulkan/runtime/vk_video.h
+++ b/src/vulkan/runtime/vk_video.h
@@ -152,6 +152,13 @@ struct vk_video_h265_slice_params {
    uint8_t chroma_weight_l1_flag[16];
    int16_t chroma_weight_l1[16][2];
    int16_t chroma_offset_l1[16][2];
+
+   int8_t delta_luma_weight_l0[16];
+   int8_t delta_luma_weight_l1[16];
+   int8_t delta_chroma_weight_l0[16][2];
+   int8_t delta_chroma_weight_l1[16][2];
+   int16_t delta_chroma_offset_l0[16][2];
+   int16_t delta_chroma_offset_l1[16][2];
 };
 
 void

Reply via email to