[Libva] [Libva-intel-driver][PATCH 2/2] Encode/VP9: Don't use hardcoded offsets

Xiang, Haihao haihao.xiang at intel.com
Mon Aug 15 02:46:11 UTC 2016


codec_private_data in struct i965_coded_buffer_segment is used to store
codec related data. Add 'struct vp9_encode_status' for the data that will
be written into codec_private_data

Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
---
 src/gen9_vp9_encoder.c | 26 ++++++++------------------
 src/gen9_vp9_encoder.h | 12 ++++++++----
 2 files changed, 16 insertions(+), 22 deletions(-)

diff --git a/src/gen9_vp9_encoder.c b/src/gen9_vp9_encoder.c
index edfbda6..76cd1d7 100644
--- a/src/gen9_vp9_encoder.c
+++ b/src/gen9_vp9_encoder.c
@@ -5985,15 +5985,16 @@ gen9_vp9_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *en
     /* the definition of status buffer offset for VP9 */
     {
         struct vp9_encode_status_buffer_internal *status_buffer;
+        uint32_t base_offset = offsetof(struct i965_coded_buffer_segment, codec_private_data);
 
         status_buffer = &vp9_state->status_buffer;
         memset(status_buffer, 0,
                sizeof(struct vp9_encode_status_buffer_internal));
 
-        status_buffer->bs_byte_count_offset = 2048;
-        status_buffer->image_status_mask_offset = 2052;
-        status_buffer->image_status_ctrl_offset = 2056;
-        status_buffer->media_index_offset       = 2060;
+        status_buffer->bs_byte_count_offset = base_offset + offsetof(struct vp9_encode_status, bs_byte_count);
+        status_buffer->image_status_mask_offset = base_offset + offsetof(struct vp9_encode_status, image_status_mask);
+        status_buffer->image_status_ctrl_offset = base_offset + offsetof(struct vp9_encode_status, image_status_ctrl);
+        status_buffer->media_index_offset       = base_offset + offsetof(struct vp9_encode_status, media_index);
 
         status_buffer->vp9_bs_frame_reg_offset = 0x1E9E0;
         status_buffer->vp9_image_mask_reg_offset = 0x1E9F0;
@@ -6014,24 +6015,13 @@ gen9_vp9_get_coded_status(VADriverContextP ctx,
                           struct intel_encoder_context *encoder_context,
                           struct i965_coded_buffer_segment *coded_buf_seg)
 {
-    struct gen9_vp9_state *vp9_state = NULL;
-    struct vp9_encode_status_buffer_internal *status_buffer;
-    unsigned int *buf_ptr;
+    struct vp9_encode_status *vp9_encode_status;
 
     if (!encoder_context || !coded_buf_seg)
         return VA_STATUS_ERROR_INVALID_BUFFER;
 
-    vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
-
-    if (!vp9_state)
-        return VA_STATUS_ERROR_INVALID_BUFFER;
-
-    status_buffer = &vp9_state->status_buffer;
-
-    buf_ptr = (unsigned int *)((char *)coded_buf_seg + status_buffer->bs_byte_count_offset);
-
-    /* the stream size is writen into the bs_byte_count_offset address of buffer */
-    coded_buf_seg->base.size = *buf_ptr;
+    vp9_encode_status = (struct vp9_encode_status *)coded_buf_seg->codec_private_data;
+    coded_buf_seg->base.size = vp9_encode_status->bs_byte_count;
 
     /* One VACodedBufferSegment for VP9 will be added later.
      * It will be linked to the next element of coded_buf_seg->base.next
diff --git a/src/gen9_vp9_encoder.h b/src/gen9_vp9_encoder.h
index 8034240..ad2d875 100644
--- a/src/gen9_vp9_encoder.h
+++ b/src/gen9_vp9_encoder.h
@@ -1849,15 +1849,19 @@ enum INTEL_ENC_VP9_TU_MODE
 #define VP9_GOLDEN_REF         0x02
 #define VP9_ALT_REF            0x04
 
-/* the vp9_encode_status_buffer is the shadow
- * of vp9_encode_status_buffer_internal.
- */
+struct vp9_encode_status
+{
+    uint32_t bs_byte_count;
+    uint32_t image_status_mask;
+    uint32_t image_status_ctrl;
+    uint32_t media_index;
+};
+
 struct vp9_encode_status_buffer_internal
 {
     uint32_t bs_byte_count_offset;
     uint32_t reserved[15];
 
-    /* the above is shared with the gen9_encode_status_buffer */
     uint32_t image_status_mask_offset;
     uint32_t image_status_ctrl_offset;
 
-- 
1.9.1



More information about the Libva mailing list