video: driver: add nv12 format support
add nv12 format support Change-Id: I6a9f2eb814504e35797fb91053417f16cfdf8b25 Signed-off-by: Darshana Patil <darshana@codeaurora.org>
Este commit está contenido en:
@@ -202,7 +202,7 @@ int v4l2_type_to_driver_port(struct msm_vidc_inst *inst, u32 type,
|
||||
const char *state_name(enum msm_vidc_inst_state state);
|
||||
int msm_vidc_change_inst_state(struct msm_vidc_inst *inst,
|
||||
enum msm_vidc_inst_state request_state, const char *func);
|
||||
int msm_vidc_get_input_internal_buffers(struct msm_vidc_inst *inst,
|
||||
int msm_vidc_get_internal_buffers(struct msm_vidc_inst *inst,
|
||||
enum msm_vidc_buffer_type buffer_type);
|
||||
int msm_vidc_create_internal_buffers(struct msm_vidc_inst *inst,
|
||||
enum msm_vidc_buffer_type buffer_type);
|
||||
|
@@ -726,27 +726,27 @@ static int msm_vdec_get_input_internal_buffers(struct msm_vidc_inst *inst)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = msm_vidc_get_input_internal_buffers(inst, MSM_VIDC_BUF_BIN);
|
||||
rc = msm_vidc_get_internal_buffers(inst, MSM_VIDC_BUF_BIN);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = msm_vidc_get_input_internal_buffers(inst, MSM_VIDC_BUF_COMV);
|
||||
rc = msm_vidc_get_internal_buffers(inst, MSM_VIDC_BUF_COMV);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = msm_vidc_get_input_internal_buffers(inst, MSM_VIDC_BUF_NON_COMV);
|
||||
rc = msm_vidc_get_internal_buffers(inst, MSM_VIDC_BUF_NON_COMV);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = msm_vidc_get_input_internal_buffers(inst, MSM_VIDC_BUF_LINE);
|
||||
rc = msm_vidc_get_internal_buffers(inst, MSM_VIDC_BUF_LINE);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = msm_vidc_get_input_internal_buffers(inst, MSM_VIDC_BUF_PERSIST);
|
||||
rc = msm_vidc_get_internal_buffers(inst, MSM_VIDC_BUF_PERSIST);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
s_vpr_h(inst->sid, "internal buffer: min size reuse\n");
|
||||
s_vpr_h(inst->sid, "input internal buffer: min size reuse\n");
|
||||
s_vpr_h(inst->sid, "bin buffer: %d %d %d\n",
|
||||
inst->buffers.bin.min_count,
|
||||
inst->buffers.bin.size,
|
||||
@@ -771,11 +771,32 @@ static int msm_vdec_get_input_internal_buffers(struct msm_vidc_inst *inst)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int msm_vdec_get_output_internal_buffers(struct msm_vidc_inst *inst)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!inst) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = msm_vidc_get_internal_buffers(inst, MSM_VIDC_BUF_DPB);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
s_vpr_h(inst->sid, "output internal buffer: min size reuse\n");
|
||||
s_vpr_h(inst->sid, "dpb buffer: %d %d %d\n",
|
||||
inst->buffers.bin.min_count,
|
||||
inst->buffers.bin.size,
|
||||
inst->buffers.bin.reuse);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int msm_vdec_create_input_internal_buffers(struct msm_vidc_inst *inst)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
d_vpr_h("%s()\n", __func__);
|
||||
if (!inst || !inst->core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
@@ -800,11 +821,26 @@ static int msm_vdec_create_input_internal_buffers(struct msm_vidc_inst *inst)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_vdec_create_output_internal_buffers(struct msm_vidc_inst *inst)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!inst || !inst->core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_DPB);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_vdec_queue_input_internal_buffers(struct msm_vidc_inst *inst)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
d_vpr_h("%s()\n", __func__);
|
||||
if (!inst || !inst->core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
@@ -829,16 +865,31 @@ static int msm_vdec_queue_input_internal_buffers(struct msm_vidc_inst *inst)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_vdec_queue_output_internal_buffers(struct msm_vidc_inst *inst)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!inst || !inst->core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_DPB);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_vdec_release_input_internal_buffers(struct msm_vidc_inst *inst)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
d_vpr_h("%s()\n", __func__);
|
||||
if (!inst || !inst->core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
s_vpr_h(inst->sid, "%s()\n",__func__);
|
||||
|
||||
rc = msm_vidc_release_internal_buffers(inst, MSM_VIDC_BUF_BIN);
|
||||
if (rc)
|
||||
@@ -859,6 +910,23 @@ static int msm_vdec_release_input_internal_buffers(struct msm_vidc_inst *inst)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_vdec_release_output_internal_buffers(struct msm_vidc_inst *inst)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!inst || !inst->core) {
|
||||
d_vpr_e("%s: invalid params\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
s_vpr_h(inst->sid, "%s()\n",__func__);
|
||||
|
||||
rc = msm_vidc_release_internal_buffers(inst, MSM_VIDC_BUF_DPB);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_vdec_subscribe_input_port_settings_change(struct msm_vidc_inst *inst,
|
||||
enum msm_vidc_port_type port)
|
||||
{
|
||||
@@ -1447,6 +1515,22 @@ int msm_vdec_streamon_output(struct msm_vidc_inst *inst)
|
||||
if (rc)
|
||||
goto error;
|
||||
|
||||
rc = msm_vdec_get_output_internal_buffers(inst);
|
||||
if (rc)
|
||||
goto error;
|
||||
|
||||
rc = msm_vdec_release_output_internal_buffers(inst);
|
||||
if (rc)
|
||||
goto error;
|
||||
|
||||
rc = msm_vdec_create_output_internal_buffers(inst);
|
||||
if (rc)
|
||||
goto error;
|
||||
|
||||
rc = msm_vdec_queue_output_internal_buffers(inst);
|
||||
if (rc)
|
||||
goto error;
|
||||
|
||||
rc = msm_vidc_session_streamon(inst, OUTPUT_PORT);
|
||||
if (rc)
|
||||
goto error;
|
||||
|
@@ -1557,7 +1557,7 @@ int msm_vidc_destroy_internal_buffer(struct msm_vidc_inst *inst,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int msm_vidc_get_input_internal_buffers(struct msm_vidc_inst *inst,
|
||||
int msm_vidc_get_internal_buffers(struct msm_vidc_inst *inst,
|
||||
enum msm_vidc_buffer_type buffer_type)
|
||||
{
|
||||
u32 buf_size;
|
||||
@@ -2660,7 +2660,7 @@ void msm_vidc_destroy_buffers(struct msm_vidc_inst *inst)
|
||||
if (!buffers)
|
||||
continue;
|
||||
list_for_each_entry_safe(buf, dummy, &buffers->list, list) {
|
||||
s_vpr_e(inst->sid,
|
||||
s_vpr_h(inst->sid,
|
||||
"destroying buffer: type %d idx %d fd %d addr %#x size %d\n",
|
||||
buf->type, buf->index, buf->fd, buf->device_addr, buf->buffer_size);
|
||||
if (is_internal_buffer(buf->type))
|
||||
|
@@ -557,6 +557,35 @@ static int handle_dequeue_buffers(struct msm_vidc_inst* inst)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int handle_dpb_buffer(struct msm_vidc_inst *inst,
|
||||
struct hfi_buffer *buffer)
|
||||
{
|
||||
int rc = 0;
|
||||
struct msm_vidc_buffers *buffers;
|
||||
struct msm_vidc_buffer *buf;
|
||||
bool found;
|
||||
|
||||
buffers = msm_vidc_get_buffers(inst, MSM_VIDC_BUF_DPB, __func__);
|
||||
if (!buffers)
|
||||
return -EINVAL;
|
||||
|
||||
found = false;
|
||||
list_for_each_entry(buf, &buffers->list, list) {
|
||||
if (buf->device_addr == buffer->base_address) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
rc = msm_vidc_destroy_internal_buffer(inst, buf);
|
||||
} else {
|
||||
s_vpr_e(inst->sid, "%s: invalid idx %d daddr %#x\n",
|
||||
__func__, buffer->index, buffer->base_address);
|
||||
return -EINVAL;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int handle_persist_buffer(struct msm_vidc_inst *inst,
|
||||
struct hfi_buffer *buffer)
|
||||
{
|
||||
@@ -734,11 +763,17 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
|
||||
rc = handle_output_metadata_buffer(inst, buffer);
|
||||
else if (buf_type == HFI_BUFFER_BITSTREAM)
|
||||
rc = handle_output_buffer(inst, buffer);
|
||||
else
|
||||
s_vpr_e(inst->sid, "%s: unknown bitstream port buffer type %#x\n",
|
||||
__func__, buf_type);
|
||||
} else if (port_type == HFI_PORT_RAW) {
|
||||
if (buf_type == HFI_BUFFER_METADATA)
|
||||
rc = handle_input_metadata_buffer(inst, buffer);
|
||||
else if (buf_type == HFI_BUFFER_RAW)
|
||||
rc = handle_input_buffer(inst, buffer);
|
||||
else
|
||||
s_vpr_e(inst->sid, "%s: unknown raw port buffer type %#x\n",
|
||||
__func__, buf_type);
|
||||
}
|
||||
} else if (is_decode_session(inst)) {
|
||||
if (port_type == HFI_PORT_BITSTREAM) {
|
||||
@@ -756,11 +791,19 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
|
||||
rc = handle_line_buffer(inst, buffer);
|
||||
else if (buf_type == HFI_BUFFER_PERSIST)
|
||||
rc = handle_persist_buffer(inst, buffer);
|
||||
else
|
||||
s_vpr_e(inst->sid, "%s: unknown bitstream port buffer type %#x\n",
|
||||
__func__, buf_type);
|
||||
} else if (port_type == HFI_PORT_RAW) {
|
||||
if (buf_type == HFI_BUFFER_METADATA)
|
||||
rc = handle_output_metadata_buffer(inst, buffer);
|
||||
else if (buf_type == HFI_BUFFER_RAW)
|
||||
rc = handle_output_buffer(inst, buffer);
|
||||
else if (buf_type == HFI_BUFFER_DPB)
|
||||
rc = handle_dpb_buffer(inst, buffer);
|
||||
else
|
||||
s_vpr_e(inst->sid, "%s: unknown raw port buffer type %#x\n",
|
||||
__func__, buf_type);
|
||||
}
|
||||
} else {
|
||||
s_vpr_e(inst->sid, "%s: invalid session %d\n",
|
||||
|
Referencia en una nueva incidencia
Block a user