Loading drivers/media/platform/msm/vidc/msm_vdec.c +84 −0 Original line number Diff line number Diff line Loading @@ -1752,6 +1752,81 @@ static int msm_vdec_queue_setup(struct vb2_queue *q, return rc; } static inline int set_max_internal_buffers_size(struct msm_vidc_inst *inst) { int rc = 0; struct { enum hal_buffer type; struct hal_buffer_requirements *req; size_t size; } internal_buffers[] = { { HAL_BUFFER_INTERNAL_SCRATCH, NULL, 0}, { HAL_BUFFER_INTERNAL_SCRATCH_1, NULL, 0}, { HAL_BUFFER_INTERNAL_SCRATCH_2, NULL, 0}, { HAL_BUFFER_INTERNAL_PERSIST, NULL, 0}, { HAL_BUFFER_INTERNAL_PERSIST_1, NULL, 0}, }; struct hal_frame_size frame_sz; int i; frame_sz.buffer_type = HAL_BUFFER_INPUT; frame_sz.width = inst->capability.width.max; frame_sz.height = (inst->capability.mbs_per_frame.max * 256) / inst->capability.width.max; dprintk(VIDC_DBG, "Max buffer reqs, buffer type = %d width = %d, height = %d, max_mbs_per_frame = %d\n", frame_sz.buffer_type, frame_sz.width, frame_sz.height, inst->capability.mbs_per_frame.max); msm_comm_try_set_prop(inst, HAL_PARAM_FRAME_SIZE, &frame_sz); rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "%s Failed to get max buf req, %d\n", __func__, rc); return 0; } for (i = 0; i < ARRAY_SIZE(internal_buffers); i++) { internal_buffers[i].req = get_buff_req_buffer(inst, internal_buffers[i].type); internal_buffers[i].size = internal_buffers[i].req ? internal_buffers[i].req->buffer_size : 0; } frame_sz.buffer_type = HAL_BUFFER_INPUT; frame_sz.width = inst->prop.width[OUTPUT_PORT]; frame_sz.height = inst->prop.height[OUTPUT_PORT]; msm_comm_try_set_prop(inst, HAL_PARAM_FRAME_SIZE, &frame_sz); rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "%s Failed to get back old buf req, %d\n", __func__, rc); return rc; } dprintk(VIDC_DBG, "Old buffer reqs, buffer type = %d width = %d, height = %d\n", frame_sz.buffer_type, frame_sz.width, frame_sz.height); for (i = 0; i < ARRAY_SIZE(internal_buffers); i++) { if (internal_buffers[i].req) { internal_buffers[i].req->buffer_size = internal_buffers[i].size; dprintk(VIDC_DBG, "Changing buffer type : %d size to : %zd\n", internal_buffers[i].type, internal_buffers[i].size); } } return 0; } static inline int start_streaming(struct msm_vidc_inst *inst) { int rc = 0; Loading @@ -1766,6 +1841,15 @@ static inline int start_streaming(struct msm_vidc_inst *inst) dprintk(VIDC_ERR, "H/w scaling is not in valid range\n"); return -EINVAL; } if ((inst->flags & VIDC_SECURE) && !inst->in_reconfig) { rc = set_max_internal_buffers_size(inst); if (rc) { dprintk(VIDC_ERR, "Failed to set max scratch buffer size: %d\n", rc); goto fail_start; } } rc = msm_comm_set_scratch_buffers(inst); if (rc) { dprintk(VIDC_ERR, Loading drivers/media/platform/msm/vidc/msm_vidc_common.c +32 −0 Original line number Diff line number Diff line Loading @@ -3120,6 +3120,8 @@ static bool reuse_internal_buffers(struct msm_vidc_inst *inst, } } reused = true; dprintk(VIDC_DBG, "Re-using internal buffer type : %d\n", buffer_type); } mutex_unlock(&buf_list->lock); return reused; Loading Loading @@ -3369,6 +3371,36 @@ int msm_vidc_comm_cmd(void *instance, union msm_v4l2_cmd *cmd) "Failed to flush buffers: %d\n", rc); } break; case V4L2_DEC_QCOM_CMD_RECONFIG_HINT: { u32 *ptr = NULL; struct hal_buffer_requirements *output_buf; rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "Getting buffer requirements failed: %d\n", rc); break; } output_buf = get_buff_req_buffer(inst, msm_comm_get_hal_output_buffer(inst)); if (!output_buf) { dprintk(VIDC_DBG, "This output buffer not required, buffer_type: %x\n", HAL_BUFFER_OUTPUT); } else { ptr = (u32 *)dec->raw.data; ptr[0] = output_buf->buffer_size; ptr[1] = output_buf->buffer_count_actual; dprintk(VIDC_DBG, "Reconfig hint, size is %u, count is %u\n", ptr[0], ptr[1]); } break; } default: dprintk(VIDC_ERR, "Unknown Command %d\n", which_cmd); rc = -ENOTSUPP; Loading include/uapi/linux/videodev2.h +1 −0 Original line number Diff line number Diff line Loading @@ -1615,6 +1615,7 @@ struct v4l2_encoder_cmd { #define V4L2_DEC_CMD_PAUSE (2) #define V4L2_DEC_CMD_RESUME (3) #define V4L2_DEC_QCOM_CMD_FLUSH (4) #define V4L2_DEC_QCOM_CMD_RECONFIG_HINT (5) /* Flags for V4L2_DEC_CMD_START */ #define V4L2_DEC_CMD_START_MUTE_AUDIO (1 << 0) Loading Loading
drivers/media/platform/msm/vidc/msm_vdec.c +84 −0 Original line number Diff line number Diff line Loading @@ -1752,6 +1752,81 @@ static int msm_vdec_queue_setup(struct vb2_queue *q, return rc; } static inline int set_max_internal_buffers_size(struct msm_vidc_inst *inst) { int rc = 0; struct { enum hal_buffer type; struct hal_buffer_requirements *req; size_t size; } internal_buffers[] = { { HAL_BUFFER_INTERNAL_SCRATCH, NULL, 0}, { HAL_BUFFER_INTERNAL_SCRATCH_1, NULL, 0}, { HAL_BUFFER_INTERNAL_SCRATCH_2, NULL, 0}, { HAL_BUFFER_INTERNAL_PERSIST, NULL, 0}, { HAL_BUFFER_INTERNAL_PERSIST_1, NULL, 0}, }; struct hal_frame_size frame_sz; int i; frame_sz.buffer_type = HAL_BUFFER_INPUT; frame_sz.width = inst->capability.width.max; frame_sz.height = (inst->capability.mbs_per_frame.max * 256) / inst->capability.width.max; dprintk(VIDC_DBG, "Max buffer reqs, buffer type = %d width = %d, height = %d, max_mbs_per_frame = %d\n", frame_sz.buffer_type, frame_sz.width, frame_sz.height, inst->capability.mbs_per_frame.max); msm_comm_try_set_prop(inst, HAL_PARAM_FRAME_SIZE, &frame_sz); rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "%s Failed to get max buf req, %d\n", __func__, rc); return 0; } for (i = 0; i < ARRAY_SIZE(internal_buffers); i++) { internal_buffers[i].req = get_buff_req_buffer(inst, internal_buffers[i].type); internal_buffers[i].size = internal_buffers[i].req ? internal_buffers[i].req->buffer_size : 0; } frame_sz.buffer_type = HAL_BUFFER_INPUT; frame_sz.width = inst->prop.width[OUTPUT_PORT]; frame_sz.height = inst->prop.height[OUTPUT_PORT]; msm_comm_try_set_prop(inst, HAL_PARAM_FRAME_SIZE, &frame_sz); rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "%s Failed to get back old buf req, %d\n", __func__, rc); return rc; } dprintk(VIDC_DBG, "Old buffer reqs, buffer type = %d width = %d, height = %d\n", frame_sz.buffer_type, frame_sz.width, frame_sz.height); for (i = 0; i < ARRAY_SIZE(internal_buffers); i++) { if (internal_buffers[i].req) { internal_buffers[i].req->buffer_size = internal_buffers[i].size; dprintk(VIDC_DBG, "Changing buffer type : %d size to : %zd\n", internal_buffers[i].type, internal_buffers[i].size); } } return 0; } static inline int start_streaming(struct msm_vidc_inst *inst) { int rc = 0; Loading @@ -1766,6 +1841,15 @@ static inline int start_streaming(struct msm_vidc_inst *inst) dprintk(VIDC_ERR, "H/w scaling is not in valid range\n"); return -EINVAL; } if ((inst->flags & VIDC_SECURE) && !inst->in_reconfig) { rc = set_max_internal_buffers_size(inst); if (rc) { dprintk(VIDC_ERR, "Failed to set max scratch buffer size: %d\n", rc); goto fail_start; } } rc = msm_comm_set_scratch_buffers(inst); if (rc) { dprintk(VIDC_ERR, Loading
drivers/media/platform/msm/vidc/msm_vidc_common.c +32 −0 Original line number Diff line number Diff line Loading @@ -3120,6 +3120,8 @@ static bool reuse_internal_buffers(struct msm_vidc_inst *inst, } } reused = true; dprintk(VIDC_DBG, "Re-using internal buffer type : %d\n", buffer_type); } mutex_unlock(&buf_list->lock); return reused; Loading Loading @@ -3369,6 +3371,36 @@ int msm_vidc_comm_cmd(void *instance, union msm_v4l2_cmd *cmd) "Failed to flush buffers: %d\n", rc); } break; case V4L2_DEC_QCOM_CMD_RECONFIG_HINT: { u32 *ptr = NULL; struct hal_buffer_requirements *output_buf; rc = msm_comm_try_get_bufreqs(inst); if (rc) { dprintk(VIDC_ERR, "Getting buffer requirements failed: %d\n", rc); break; } output_buf = get_buff_req_buffer(inst, msm_comm_get_hal_output_buffer(inst)); if (!output_buf) { dprintk(VIDC_DBG, "This output buffer not required, buffer_type: %x\n", HAL_BUFFER_OUTPUT); } else { ptr = (u32 *)dec->raw.data; ptr[0] = output_buf->buffer_size; ptr[1] = output_buf->buffer_count_actual; dprintk(VIDC_DBG, "Reconfig hint, size is %u, count is %u\n", ptr[0], ptr[1]); } break; } default: dprintk(VIDC_ERR, "Unknown Command %d\n", which_cmd); rc = -ENOTSUPP; Loading
include/uapi/linux/videodev2.h +1 −0 Original line number Diff line number Diff line Loading @@ -1615,6 +1615,7 @@ struct v4l2_encoder_cmd { #define V4L2_DEC_CMD_PAUSE (2) #define V4L2_DEC_CMD_RESUME (3) #define V4L2_DEC_QCOM_CMD_FLUSH (4) #define V4L2_DEC_QCOM_CMD_RECONFIG_HINT (5) /* Flags for V4L2_DEC_CMD_START */ #define V4L2_DEC_CMD_START_MUTE_AUDIO (1 << 0) Loading