vulkan/video: keep delta weight and offsets of predicted weight tables in h265 slice...
authorHyunjun Ko <zzoon@igalia.com>
Fri, 16 Jun 2023 05:40:23 +0000 (14:40 +0900)
committerHyunjun Ko <zzoon@igalia.com>
Mon, 26 Jun 2023 06:07:53 +0000 (15:07 +0900)
Signed-off-by: Hyunjun Ko <zzoon@igalia.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23790>

src/vulkan/runtime/vk_video.c
src/vulkan/runtime/vk_video.h

index 2c456e3..6920d9d 100644 (file)
@@ -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++) {
index d266339..29fb905 100644 (file)
@@ -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