Browse Source

video: driver: increase encoder max host buffer count

Increase encoder max host bufcount 64 -> 256 to support
superframe(encoder batching) usecase.

Change-Id: I8607b8302a10c52ac47a0c67ee7c359c62aa1d02
Signed-off-by: Govindaraj Rajagopal <[email protected]>
Govindaraj Rajagopal 4 năm trước cách đây
mục cha
commit
f7dc3c7789

+ 1 - 0
driver/vidc/inc/msm_vidc_internal.h

@@ -45,6 +45,7 @@
 #define H265_BITSTREM_ALIGNMENT     32
 #define DEFAULT_MAX_HOST_ENC_BUF_COUNT  64
 #define DEFAULT_MAX_HOST_DEC_BUF_COUNT  64
+#define DEFAULT_MAX_HOST_ENC_SUPER_BUF_COUNT 256
 #define BIT_DEPTH_8 (8 << 16 | 8)
 #define BIT_DEPTH_10 (10 << 16 | 10)
 #define CODED_FRAMES_MBS_ONLY HFI_BITMASK_FRAME_MBS_ONLY_FLAG

+ 3 - 0
driver/vidc/src/msm_venc.c

@@ -255,6 +255,9 @@ static int msm_venc_set_host_max_buf_count(struct msm_vidc_inst *inst,
 		return -EINVAL;
 	}
 
+	if (msm_vidc_is_super_buffer(inst))
+		count = DEFAULT_MAX_HOST_ENC_SUPER_BUF_COUNT;
+
 	i_vpr_h(inst, "%s: count: %u port: %u\n", __func__, count, port);
 	rc = venus_hfi_session_property(inst,
 			HFI_PROP_BUFFER_HOST_MAX_COUNT,

+ 26 - 14
driver/vidc/src/venus_hfi_response.c

@@ -466,14 +466,20 @@ static int handle_input_buffer(struct msm_vidc_inst *inst,
 		return -EINVAL;
 	}
 
-	frame_size = call_session_op(core, buffer_size, inst, MSM_VIDC_BUF_INPUT);
-	batch_size = inst->capabilities->cap[SUPER_FRAME].value;
 	/* attach dequeued flag for, only last frame in the batch */
-	if (msm_vidc_is_super_buffer(inst) &&
-		buffer->addr_offset / frame_size < batch_size - 1) {
-		i_vpr_h(inst, "%s: superframe last buffer not reached: %u, %u, %u\n",
-			__func__, buffer->addr_offset, frame_size, batch_size);
-		return 0;
+	if (msm_vidc_is_super_buffer(inst)) {
+		frame_size = call_session_op(core, buffer_size, inst, MSM_VIDC_BUF_INPUT);
+		batch_size = inst->capabilities->cap[SUPER_FRAME].value;
+		if (!frame_size || !batch_size) {
+			i_vpr_e(inst, "%s: invalid size: frame %u, batch %u\n",
+				__func__, frame_size, batch_size);
+			return -EINVAL;
+		}
+		if (buffer->addr_offset / frame_size < batch_size - 1) {
+			i_vpr_h(inst, "%s: superframe last buffer not reached: %u, %u, %u\n",
+				__func__, buffer->addr_offset, frame_size, batch_size);
+			return 0;
+		}
 	}
 	buf->data_offset = buffer->data_offset;
 	buf->data_size = buffer->data_size;
@@ -591,14 +597,20 @@ static int handle_input_metadata_buffer(struct msm_vidc_inst *inst,
 			__func__, buffer->index, buffer->base_address);
 		return -EINVAL;
 	}
-	frame_size = call_session_op(core, buffer_size, inst, MSM_VIDC_BUF_INPUT_META);
-	batch_size = inst->capabilities->cap[SUPER_FRAME].value;
 	/* attach dequeued flag for, only last frame in the batch */
-	if (msm_vidc_is_super_buffer(inst) &&
-		buffer->addr_offset / frame_size < batch_size - 1) {
-		i_vpr_h(inst, "%s: superframe last buffer not reached: %u, %u, %u\n",
-			__func__, buffer->addr_offset, frame_size, batch_size);
-		return 0;
+	if (msm_vidc_is_super_buffer(inst)) {
+		frame_size = call_session_op(core, buffer_size, inst, MSM_VIDC_BUF_INPUT_META);
+		batch_size = inst->capabilities->cap[SUPER_FRAME].value;
+		if (!frame_size || !batch_size) {
+			i_vpr_e(inst, "%s: invalid size: frame %u, batch %u\n",
+				__func__, frame_size, batch_size);
+			return -EINVAL;
+		}
+		if (buffer->addr_offset / frame_size < batch_size - 1) {
+			i_vpr_h(inst, "%s: superframe last buffer not reached: %u, %u, %u\n",
+				__func__, buffer->addr_offset, frame_size, batch_size);
+			return 0;
+		}
 	}
 	buf->data_size = buffer->data_size;
 	buf->attr &= ~MSM_VIDC_ATTR_QUEUED;