|
@@ -1024,6 +1024,64 @@ static int handle_output_metadata_buffer(struct msm_vidc_inst *inst,
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool is_metabuffer_dequeued(struct msm_vidc_inst *inst,
|
|
|
|
+ struct msm_vidc_buffer *buf)
|
|
|
|
+{
|
|
|
|
+ bool found = false;
|
|
|
|
+ struct msm_vidc_buffers *buffers;
|
|
|
|
+ struct msm_vidc_buffer *buffer;
|
|
|
|
+ enum msm_vidc_buffer_type buffer_type;
|
|
|
|
+
|
|
|
|
+ if (is_input_buffer(buf->type) && is_input_meta_enabled(inst))
|
|
|
|
+ buffer_type = MSM_VIDC_BUF_INPUT_META;
|
|
|
|
+ else if (is_output_buffer(buf->type) && is_output_meta_enabled(inst))
|
|
|
|
+ buffer_type = MSM_VIDC_BUF_OUTPUT_META;
|
|
|
|
+ else
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ buffers = msm_vidc_get_buffers(inst, buffer_type, __func__);
|
|
|
|
+ if (!buffers)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ list_for_each_entry(buffer, &buffers->list, list) {
|
|
|
|
+ if (buffer->index == buf->index &&
|
|
|
|
+ buffer->attr & MSM_VIDC_ATTR_DEQUEUED) {
|
|
|
|
+ found = true;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return found;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int msm_vidc_check_meta_buffers(struct msm_vidc_inst *inst)
|
|
|
|
+{
|
|
|
|
+ int rc = 0;
|
|
|
|
+ int i;
|
|
|
|
+ struct msm_vidc_buffers *buffers;
|
|
|
|
+ struct msm_vidc_buffer *buf;
|
|
|
|
+ const enum msm_vidc_buffer_type buffer_type[] = {
|
|
|
|
+ MSM_VIDC_BUF_INPUT,
|
|
|
|
+ MSM_VIDC_BUF_OUTPUT,
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(buffer_type); i++) {
|
|
|
|
+ buffers = msm_vidc_get_buffers(inst, buffer_type[i], __func__);
|
|
|
|
+ if (!buffers)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ list_for_each_entry(buf, &buffers->list, list) {
|
|
|
|
+ if (buf->attr & MSM_VIDC_ATTR_DEQUEUED) {
|
|
|
|
+ if (!is_metabuffer_dequeued(inst, buf)) {
|
|
|
|
+ print_vidc_buffer(VIDC_ERR, "err ",
|
|
|
|
+ "meta not dequeued", inst, buf);
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return rc;
|
|
|
|
+}
|
|
|
|
+
|
|
static int handle_dequeue_buffers(struct msm_vidc_inst *inst)
|
|
static int handle_dequeue_buffers(struct msm_vidc_inst *inst)
|
|
{
|
|
{
|
|
int rc = 0;
|
|
int rc = 0;
|
|
@@ -1031,13 +1089,18 @@ static int handle_dequeue_buffers(struct msm_vidc_inst *inst)
|
|
struct msm_vidc_buffers *buffers;
|
|
struct msm_vidc_buffers *buffers;
|
|
struct msm_vidc_buffer *buf;
|
|
struct msm_vidc_buffer *buf;
|
|
struct msm_vidc_buffer *dummy;
|
|
struct msm_vidc_buffer *dummy;
|
|
- static const enum msm_vidc_buffer_type buffer_type[] = {
|
|
|
|
|
|
+ const enum msm_vidc_buffer_type buffer_type[] = {
|
|
MSM_VIDC_BUF_INPUT_META,
|
|
MSM_VIDC_BUF_INPUT_META,
|
|
MSM_VIDC_BUF_INPUT,
|
|
MSM_VIDC_BUF_INPUT,
|
|
MSM_VIDC_BUF_OUTPUT_META,
|
|
MSM_VIDC_BUF_OUTPUT_META,
|
|
MSM_VIDC_BUF_OUTPUT,
|
|
MSM_VIDC_BUF_OUTPUT,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ /* check metabuffers dequeued before sending vb2_buffer_done() */
|
|
|
|
+ rc = msm_vidc_check_meta_buffers(inst);
|
|
|
|
+ if (rc)
|
|
|
|
+ return rc;
|
|
|
|
+
|
|
for (i = 0; i < ARRAY_SIZE(buffer_type); i++) {
|
|
for (i = 0; i < ARRAY_SIZE(buffer_type); i++) {
|
|
buffers = msm_vidc_get_buffers(inst, buffer_type[i], __func__);
|
|
buffers = msm_vidc_get_buffers(inst, buffer_type[i], __func__);
|
|
if (!buffers)
|
|
if (!buffers)
|
|
@@ -1134,12 +1197,12 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
|
|
struct hfi_buffer *buffer;
|
|
struct hfi_buffer *buffer;
|
|
u32 hfi_handle_size = 0;
|
|
u32 hfi_handle_size = 0;
|
|
const struct msm_vidc_hfi_buffer_handle *hfi_handle_arr = NULL;
|
|
const struct msm_vidc_hfi_buffer_handle *hfi_handle_arr = NULL;
|
|
- static const struct msm_vidc_hfi_buffer_handle enc_input_hfi_handle[] = {
|
|
|
|
|
|
+ const struct msm_vidc_hfi_buffer_handle enc_input_hfi_handle[] = {
|
|
{HFI_BUFFER_METADATA, handle_input_metadata_buffer },
|
|
{HFI_BUFFER_METADATA, handle_input_metadata_buffer },
|
|
{HFI_BUFFER_RAW, handle_input_buffer },
|
|
{HFI_BUFFER_RAW, handle_input_buffer },
|
|
{HFI_BUFFER_VPSS, handle_release_internal_buffer },
|
|
{HFI_BUFFER_VPSS, handle_release_internal_buffer },
|
|
};
|
|
};
|
|
- static const struct msm_vidc_hfi_buffer_handle enc_output_hfi_handle[] = {
|
|
|
|
|
|
+ const struct msm_vidc_hfi_buffer_handle enc_output_hfi_handle[] = {
|
|
{HFI_BUFFER_METADATA, handle_output_metadata_buffer },
|
|
{HFI_BUFFER_METADATA, handle_output_metadata_buffer },
|
|
{HFI_BUFFER_BITSTREAM, handle_output_buffer },
|
|
{HFI_BUFFER_BITSTREAM, handle_output_buffer },
|
|
{HFI_BUFFER_BIN, handle_release_internal_buffer },
|
|
{HFI_BUFFER_BIN, handle_release_internal_buffer },
|
|
@@ -1149,7 +1212,7 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
|
|
{HFI_BUFFER_ARP, handle_release_internal_buffer },
|
|
{HFI_BUFFER_ARP, handle_release_internal_buffer },
|
|
{HFI_BUFFER_DPB, handle_release_internal_buffer },
|
|
{HFI_BUFFER_DPB, handle_release_internal_buffer },
|
|
};
|
|
};
|
|
- static const struct msm_vidc_hfi_buffer_handle dec_input_hfi_handle[] = {
|
|
|
|
|
|
+ const struct msm_vidc_hfi_buffer_handle dec_input_hfi_handle[] = {
|
|
{HFI_BUFFER_METADATA, handle_input_metadata_buffer },
|
|
{HFI_BUFFER_METADATA, handle_input_metadata_buffer },
|
|
{HFI_BUFFER_BITSTREAM, handle_input_buffer },
|
|
{HFI_BUFFER_BITSTREAM, handle_input_buffer },
|
|
{HFI_BUFFER_BIN, handle_release_internal_buffer },
|
|
{HFI_BUFFER_BIN, handle_release_internal_buffer },
|
|
@@ -1158,7 +1221,7 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
|
|
{HFI_BUFFER_LINE, handle_release_internal_buffer },
|
|
{HFI_BUFFER_LINE, handle_release_internal_buffer },
|
|
{HFI_BUFFER_PERSIST, handle_release_internal_buffer },
|
|
{HFI_BUFFER_PERSIST, handle_release_internal_buffer },
|
|
};
|
|
};
|
|
- static const struct msm_vidc_hfi_buffer_handle dec_output_hfi_handle[] = {
|
|
|
|
|
|
+ const struct msm_vidc_hfi_buffer_handle dec_output_hfi_handle[] = {
|
|
{HFI_BUFFER_METADATA, handle_output_metadata_buffer },
|
|
{HFI_BUFFER_METADATA, handle_output_metadata_buffer },
|
|
{HFI_BUFFER_RAW, handle_output_buffer },
|
|
{HFI_BUFFER_RAW, handle_output_buffer },
|
|
{HFI_BUFFER_DPB, handle_release_internal_buffer },
|
|
{HFI_BUFFER_DPB, handle_release_internal_buffer },
|
|
@@ -1292,7 +1355,7 @@ static int handle_session_command(struct msm_vidc_inst *inst,
|
|
struct hfi_packet *pkt)
|
|
struct hfi_packet *pkt)
|
|
{
|
|
{
|
|
int i, rc;
|
|
int i, rc;
|
|
- static const struct msm_vidc_hfi_packet_handle hfi_pkt_handle[] = {
|
|
|
|
|
|
+ const struct msm_vidc_hfi_packet_handle hfi_pkt_handle[] = {
|
|
{HFI_CMD_OPEN, handle_session_open },
|
|
{HFI_CMD_OPEN, handle_session_open },
|
|
{HFI_CMD_CLOSE, handle_session_close },
|
|
{HFI_CMD_CLOSE, handle_session_close },
|
|
{HFI_CMD_START, handle_session_start },
|
|
{HFI_CMD_START, handle_session_start },
|
|
@@ -1558,7 +1621,7 @@ static int handle_system_response(struct msm_vidc_core *core,
|
|
struct hfi_packet *packet;
|
|
struct hfi_packet *packet;
|
|
u8 *pkt, *start_pkt;
|
|
u8 *pkt, *start_pkt;
|
|
int i, j;
|
|
int i, j;
|
|
- static const struct msm_vidc_core_hfi_range be[] = {
|
|
|
|
|
|
+ const struct msm_vidc_core_hfi_range be[] = {
|
|
{HFI_SYSTEM_ERROR_BEGIN, HFI_SYSTEM_ERROR_END, handle_system_error },
|
|
{HFI_SYSTEM_ERROR_BEGIN, HFI_SYSTEM_ERROR_END, handle_system_error },
|
|
{HFI_PROP_BEGIN, HFI_PROP_END, handle_system_property },
|
|
{HFI_PROP_BEGIN, HFI_PROP_END, handle_system_property },
|
|
{HFI_CMD_BEGIN, HFI_CMD_END, handle_system_init },
|
|
{HFI_CMD_BEGIN, HFI_CMD_END, handle_system_init },
|
|
@@ -1605,7 +1668,7 @@ static int __handle_session_response(struct msm_vidc_inst *inst,
|
|
u8 *pkt, *start_pkt;
|
|
u8 *pkt, *start_pkt;
|
|
bool dequeue = false;
|
|
bool dequeue = false;
|
|
int i, j;
|
|
int i, j;
|
|
- static const struct msm_vidc_inst_hfi_range be[] = {
|
|
|
|
|
|
+ const struct msm_vidc_inst_hfi_range be[] = {
|
|
{HFI_SESSION_ERROR_BEGIN, HFI_SESSION_ERROR_END, handle_session_error },
|
|
{HFI_SESSION_ERROR_BEGIN, HFI_SESSION_ERROR_END, handle_session_error },
|
|
{HFI_INFORMATION_BEGIN, HFI_INFORMATION_END, handle_session_info },
|
|
{HFI_INFORMATION_BEGIN, HFI_INFORMATION_END, handle_session_info },
|
|
{HFI_PROP_BEGIN, HFI_PROP_END, handle_session_property },
|
|
{HFI_PROP_BEGIN, HFI_PROP_END, handle_session_property },
|