v2: rebased

v3: Don't store buffers per layer if the layer structure is not submitted before

Signed-off-by: Xiang, Haihao <[email protected]>
Tested-by: Luo, Focus <[email protected]>
---
 src/i965_drv_video.c | 36 ++++++++++++++++++++++++++++++++++--
 src/i965_drv_video.h |  2 ++
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
index a8ecb24..ddad70a 100644
--- a/src/i965_drv_video.c
+++ b/src/i965_drv_video.c
@@ -3097,6 +3097,29 @@ 
i965_encoder_render_packed_header_data_buffer(VADriverContextP ctx,
     return VA_STATUS_SUCCESS;
 }
 
+static int
+i965_encoder_get_misc_paramerter_buffer_index(VADriverContextP ctx,
+                                              struct encode_state *encode,
+                                              VAEncMiscParameterBuffer 
*misc_param)
+{
+    int index = 0;
+
+    if (!encode->has_layers)
+        return 0;
+
+    if (misc_param->type == VAEncMiscParameterTypeRateControl) {
+        VAEncMiscParameterRateControl *misc_rate_control = 
(VAEncMiscParameterRateControl *)misc_param->data;
+
+        index = misc_rate_control->rc_flags.bits.temporal_id;
+    } else if (misc_param->type == VAEncMiscParameterTypeFrameRate) {
+        VAEncMiscParameterFrameRate *misc_frame_rate = 
(VAEncMiscParameterFrameRate *)misc_param->data;
+
+        index = misc_frame_rate->framerate_flags.bits.temporal_id;
+    }
+
+    return index;
+}
+
 static VAStatus
 i965_encoder_render_misc_parameter_buffer(VADriverContextP ctx,
                                           struct object_context *obj_context,
@@ -3104,6 +3127,7 @@ 
i965_encoder_render_misc_parameter_buffer(VADriverContextP ctx,
 {
     struct encode_state *encode = &obj_context->codec_state.encode;
     VAEncMiscParameterBuffer *param = NULL;
+    int index;
 
     ASSERT_RET(obj_buffer->buffer_store->bo == NULL, 
VA_STATUS_ERROR_INVALID_BUFFER);
     ASSERT_RET(obj_buffer->buffer_store->buffer, 
VA_STATUS_ERROR_INVALID_BUFFER);
@@ -3113,8 +3137,16 @@ 
i965_encoder_render_misc_parameter_buffer(VADriverContextP ctx,
     if (param->type >= ARRAY_ELEMS(encode->misc_param))
         return VA_STATUS_ERROR_INVALID_PARAMETER;
 
-    i965_release_buffer_store(&encode->misc_param[param->type][0]);
-    i965_reference_buffer_store(&encode->misc_param[param->type][0], 
obj_buffer->buffer_store);
+    if (param->type == VAEncMiscParameterTypeTemporalLayerStructure)
+        encode->has_layers = 1;
+
+    index = i965_encoder_get_misc_paramerter_buffer_index(ctx, encode, param);
+
+    if (index >= ARRAY_ELEMS(encode->misc_param[0]))
+        return VA_STATUS_ERROR_INVALID_PARAMETER;
+
+    i965_release_buffer_store(&encode->misc_param[param->type][index]);
+    i965_reference_buffer_store(&encode->misc_param[param->type][index], 
obj_buffer->buffer_store);
 
     return VA_STATUS_SUCCESS;
 }
diff --git a/src/i965_drv_video.h b/src/i965_drv_video.h
index 7bef613..2288300 100644
--- a/src/i965_drv_video.h
+++ b/src/i965_drv_video.h
@@ -266,6 +266,8 @@ struct encode_state
 
     int last_packed_header_type;
 
+    int has_layers;
+
     struct buffer_store *misc_param[16][8];
 
     VASurfaceID current_render_target;
-- 
1.9.1

_______________________________________________
Libva mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libva

Reply via email to