summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/media/platform/msm/vidc/msm_vdec.c128
-rw-r--r--drivers/media/platform/msm/vidc/msm_vidc_common.c6
2 files changed, 25 insertions, 109 deletions
diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c
index 96fefea39241..ee3df23115a5 100644
--- a/drivers/media/platform/msm/vidc/msm_vdec.c
+++ b/drivers/media/platform/msm/vidc/msm_vdec.c
@@ -601,10 +601,6 @@ static struct msm_vidc_ctrl msm_vdec_ctrls[] = {
#define NUM_CTRLS ARRAY_SIZE(msm_vdec_ctrls)
-static int set_buffer_size(struct msm_vidc_inst *inst,
- u32 buffer_size, enum hal_buffer buffer_type);
-static int update_output_buffer_size(struct msm_vidc_inst *inst,
- struct v4l2_format *f, int num_planes);
static int vdec_hal_to_v4l2(int id, int value);
static u32 get_frame_size_nv12(int plane,
@@ -1181,13 +1177,6 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
for (i = 0; i < fmt->num_planes; ++i)
inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[i] =
f->fmt.pix_mp.plane_fmt[i].sizeimage;
- rc = update_output_buffer_size(inst, f, fmt->num_planes);
- if (rc) {
- dprintk(VIDC_ERR,
- "%s - failed to update buffer size: %d\n",
- __func__, rc);
- goto exit;
- }
}
if (stride && scanlines) {
@@ -1220,95 +1209,6 @@ exit:
return rc;
}
-static int set_buffer_size(struct msm_vidc_inst *inst,
- u32 buffer_size, enum hal_buffer buffer_type)
-{
- int rc = 0;
- struct hfi_device *hdev;
- struct hal_buffer_size_minimum b;
-
- if (!inst || !inst->core || !inst->core->device) {
- dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
- return -EINVAL;
- }
-
- hdev = inst->core->device;
-
- dprintk(VIDC_DBG,
- "Set minimum buffer size = %d for buffer type %d to fw\n",
- buffer_size, buffer_type);
-
- b.buffer_type = buffer_type;
- b.buffer_size = buffer_size;
- rc = call_hfi_op(hdev, session_set_property,
- inst->session, HAL_PARAM_BUFFER_SIZE_MINIMUM,
- &b);
- if (rc)
- dprintk(VIDC_ERR,
- "%s - failed to set actual buffer size %u on firmware\n",
- __func__, buffer_size);
- return rc;
-}
-
-static int update_output_buffer_size(struct msm_vidc_inst *inst,
- struct v4l2_format *f, int num_planes)
-{
- int rc = 0, i = 0;
- struct hal_buffer_requirements *bufreq;
-
- if (!inst || !f)
- return -EINVAL;
-
- /*
- * Firmware expects driver to always set the minimum buffer
- * size negotiated with the v4l2 client. Firmware will use this
- * size to check for buffer sufficiency in dynamic buffer mode.
- */
- for (i = 0; i < num_planes; ++i) {
- enum hal_buffer type = msm_comm_get_hal_output_buffer(inst);
-
- if (EXTRADATA_IDX(num_planes) &&
- i == EXTRADATA_IDX(num_planes))
- continue;
-
- bufreq = get_buff_req_buffer(inst, type);
- if (!bufreq)
- goto exit;
-
- if (f->fmt.pix_mp.plane_fmt[i].sizeimage >=
- bufreq->buffer_size) {
- rc = set_buffer_size(inst,
- f->fmt.pix_mp.plane_fmt[i].sizeimage, type);
- if (rc)
- goto exit;
- }
- }
-
- /*
- * Set min buffer size for DPB buffers as well.
- * Firmware mandates setting of minimum buffer size
- * and actual buffer count for both OUTPUT and OUTPUT2.
- * Hence we are setting back the same buffer size
- * information back to firmware.
- */
- if (msm_comm_get_stream_output_mode(inst) ==
- HAL_VIDEO_DECODER_SECONDARY) {
- bufreq = get_buff_req_buffer(inst, HAL_BUFFER_OUTPUT);
- if (!bufreq) {
- rc = -EINVAL;
- goto exit;
- }
-
- rc = set_buffer_size(inst, bufreq->buffer_size,
- HAL_BUFFER_OUTPUT);
- if (rc)
- goto exit;
- }
-
-exit:
- return rc;
-}
-
static int set_default_properties(struct msm_vidc_inst *inst)
{
struct hfi_device *hdev;
@@ -1370,13 +1270,9 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
inst->prop.width[CAPTURE_PORT] = f->fmt.pix_mp.width;
inst->prop.height[CAPTURE_PORT] = f->fmt.pix_mp.height;
- if (msm_comm_get_stream_output_mode(inst) ==
- HAL_VIDEO_DECODER_PRIMARY) {
- inst->prop.width[OUTPUT_PORT] = f->fmt.pix_mp.width;
- inst->prop.height[OUTPUT_PORT] = f->fmt.pix_mp.height;
- msm_comm_set_color_format(inst, HAL_BUFFER_OUTPUT,
+ msm_comm_set_color_format(inst,
+ msm_comm_get_hal_output_buffer(inst),
f->fmt.pix_mp.pixelformat);
- }
inst->fmts[fmt->type] = fmt;
if (msm_comm_get_stream_output_mode(inst) ==
@@ -1384,8 +1280,6 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
frame_sz.buffer_type = HAL_BUFFER_OUTPUT2;
frame_sz.width = inst->prop.width[CAPTURE_PORT];
frame_sz.height = inst->prop.height[CAPTURE_PORT];
- msm_comm_set_color_format(inst, HAL_BUFFER_OUTPUT2,
- f->fmt.pix_mp.pixelformat);
dprintk(VIDC_DBG,
"buffer type = %d width = %d, height = %d\n",
frame_sz.buffer_type, frame_sz.width,
@@ -1793,12 +1687,28 @@ static inline int start_streaming(struct msm_vidc_inst *inst)
int rc = 0;
struct hfi_device *hdev;
bool slave_side_cp = inst->core->resources.slave_side_cp;
+ struct hal_buffer_size_minimum b;
+ unsigned int buffer_size;
+ struct msm_vidc_format *fmt = NULL;
+ fmt = inst->fmts[CAPTURE_PORT];
+ buffer_size = fmt->get_frame_size(0,
+ inst->prop.height[CAPTURE_PORT],
+ inst->prop.width[CAPTURE_PORT]);
hdev = inst->core->device;
if (msm_comm_get_stream_output_mode(inst) ==
- HAL_VIDEO_DECODER_SECONDARY)
+ HAL_VIDEO_DECODER_SECONDARY) {
rc = msm_vidc_check_scaling_supported(inst);
+ b.buffer_type = HAL_BUFFER_OUTPUT2;
+ } else {
+ b.buffer_type = HAL_BUFFER_OUTPUT;
+ }
+
+ b.buffer_size = buffer_size;
+ rc = call_hfi_op(hdev, session_set_property,
+ inst->session, HAL_PARAM_BUFFER_SIZE_MINIMUM,
+ &b);
if (rc) {
dprintk(VIDC_ERR, "H/w scaling is not in valid range\n");
return -EINVAL;
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index 1f071ba36ec1..587aa930cf9c 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -3010,6 +3010,7 @@ static int set_output_buffers(struct msm_vidc_inst *inst,
struct hal_buffer_requirements *output_buf, *extradata_buf;
int i;
struct hfi_device *hdev;
+ struct hal_buffer_size_minimum b;
hdev = inst->core->device;
@@ -3026,6 +3027,11 @@ static int set_output_buffers(struct msm_vidc_inst *inst,
output_buf->buffer_size);
buffer_size = output_buf->buffer_size;
+ b.buffer_type = buffer_type;
+ b.buffer_size = buffer_size;
+ rc = call_hfi_op(hdev, session_set_property,
+ inst->session, HAL_PARAM_BUFFER_SIZE_MINIMUM,
+ &b);
extradata_buf = get_buff_req_buffer(inst, HAL_BUFFER_EXTRADATA_OUTPUT);
if (extradata_buf) {