Loading drivers/media/platform/msm/vidc/hfi_packetization.c +28 −0 Original line number Diff line number Diff line Loading @@ -1025,7 +1025,35 @@ int create_pkt_cmd_session_set_property( break; } case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO: { struct hfi_uncompressed_plane_actual_constraints_info *hfi; struct hal_uncompressed_plane_actual_constraints_info *prop = (struct hal_uncompressed_plane_actual_constraints_info *) pdata; u32 buffer_type; u32 num_plane = prop->num_planes; u32 hfi_pkt_size = 2 * sizeof(u32) + num_plane * sizeof(struct hal_uncompressed_plane_constraints); pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO; hfi = (struct hfi_uncompressed_plane_actual_constraints_info *) &pkt->rg_property_data[1]; buffer_type = get_hfi_buffer(prop->buffer_type); if (buffer_type) hfi->buffer_type = buffer_type; else return -EINVAL; hfi->num_planes = prop->num_planes; memcpy(hfi->rg_plane_format, prop->rg_plane_format, hfi->num_planes *sizeof(struct hal_uncompressed_plane_constraints)); pkt->size += hfi_pkt_size; break; } case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO: break; case HAL_PARAM_FRAME_SIZE: Loading drivers/media/platform/msm/vidc/msm_vdec.c +38 −0 Original line number Diff line number Diff line Loading @@ -521,6 +521,21 @@ struct msm_vidc_format vdec_formats[] = { }, }; struct msm_vidc_format_constraint dec_pix_format_constraints[] = { { .fourcc = V4L2_PIX_FMT_SDE_Y_CBCR_H2V2_P010_VENUS, .num_planes = 2, .y_stride_multiples = 256, .y_max_stride = 8192, .y_min_plane_buffer_height_multiple = 32, .y_buffer_alignment = 256, .uv_stride_multiples = 256, .uv_max_stride = 8192, .uv_min_plane_buffer_height_multiple = 16, .uv_buffer_alignment = 256, }, }; static bool msm_vidc_check_for_vp9d_overload(struct msm_vidc_core *core) { u32 vp9d_instance_count = 0; Loading @@ -542,6 +557,7 @@ static bool msm_vidc_check_for_vp9d_overload(struct msm_vidc_core *core) int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) { struct msm_vidc_format *fmt = NULL; struct msm_vidc_format_constraint *fmt_constraint = NULL; struct hal_frame_size frame_sz; unsigned int extra_idx = 0; int rc = 0; Loading Loading @@ -589,6 +605,28 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) msm_comm_get_hal_output_buffer(inst), f->fmt.pix_mp.pixelformat); fmt_constraint = msm_comm_get_pixel_fmt_constraints(dec_pix_format_constraints, ARRAY_SIZE(dec_pix_format_constraints), f->fmt.pix_mp.pixelformat); if (!fmt_constraint) { dprintk(VIDC_INFO, "Format constraint not required for %d on CAPTURE port\n", f->fmt.pix_mp.pixelformat); } else { rc = msm_comm_set_color_format_constraints(inst, msm_comm_get_hal_output_buffer(inst), fmt_constraint); if (rc) { dprintk(VIDC_ERR, "Set constraint for %d failed on CAPTURE port\n", f->fmt.pix_mp.pixelformat); rc = -EINVAL; goto err_invalid_fmt; } } inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat; if (msm_comm_get_stream_output_mode(inst) == HAL_VIDEO_DECODER_SECONDARY) { Loading drivers/media/platform/msm/vidc/msm_venc.c +40 −0 Original line number Diff line number Diff line Loading @@ -1213,6 +1213,22 @@ static struct msm_vidc_format venc_formats[] = { }, }; struct msm_vidc_format_constraint enc_pix_format_constraints[] = { { .fourcc = V4L2_PIX_FMT_SDE_Y_CBCR_H2V2_P010_VENUS, .num_planes = 2, .y_stride_multiples = 256, .y_max_stride = 8192, .y_min_plane_buffer_height_multiple = 32, .y_buffer_alignment = 256, .uv_stride_multiples = 256, .uv_max_stride = 8192, .uv_min_plane_buffer_height_multiple = 16, .uv_buffer_alignment = 256, }, }; static int msm_venc_set_csc(struct msm_vidc_inst *inst, u32 color_primaries, u32 custom_matrix); Loading Loading @@ -2535,6 +2551,7 @@ static int msm_venc_set_csc(struct msm_vidc_inst *inst, int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) { struct msm_vidc_format *fmt = NULL; struct msm_vidc_format_constraint *fmt_constraint = NULL; int rc = 0; struct hfi_device *hdev; int extra_idx = 0, i = 0; Loading Loading @@ -2722,6 +2739,29 @@ int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) } msm_comm_set_color_format(inst, HAL_BUFFER_INPUT, fmt->fourcc); fmt_constraint = msm_comm_get_pixel_fmt_constraints(enc_pix_format_constraints, ARRAY_SIZE(enc_pix_format_constraints), f->fmt.pix_mp.pixelformat); if (!fmt_constraint) { dprintk(VIDC_ERR, "Format constraint not required for %d on OUTPUT port\n", f->fmt.pix_mp.pixelformat); } else { rc = msm_comm_set_color_format_constraints(inst, HAL_BUFFER_INPUT, fmt_constraint); if (rc) { dprintk(VIDC_ERR, "Set constraint for %d failed on CAPTURE port\n", f->fmt.pix_mp.pixelformat); rc = -EINVAL; goto exit; } } } else { dprintk(VIDC_ERR, "%s - Unsupported buf type: %d\n", __func__, f->type); Loading drivers/media/platform/msm/vidc/msm_vidc_common.c +90 −0 Original line number Diff line number Diff line Loading @@ -991,6 +991,26 @@ struct msm_vidc_format *msm_comm_get_pixel_fmt_fourcc( return &fmt[i]; } struct msm_vidc_format_constraint *msm_comm_get_pixel_fmt_constraints( struct msm_vidc_format_constraint fmt[], int size, int fourcc) { int i; if (!fmt) { dprintk(VIDC_ERR, "Invalid inputs, fmt = %pK\n", fmt); return NULL; } for (i = 0; i < size; i++) { if (fmt[i].fourcc == fourcc) break; } if (i == size) { dprintk(VIDC_INFO, "Format constraint not found.\n"); return NULL; } return &fmt[i]; } struct buf_queue *msm_comm_get_vb2q( struct msm_vidc_inst *inst, enum v4l2_buf_type type) { Loading Loading @@ -6706,3 +6726,73 @@ int msm_comm_release_mark_data(struct msm_vidc_inst *inst) return 0; } int msm_comm_set_color_format_constraints(struct msm_vidc_inst *inst, enum hal_buffer buffer_type, struct msm_vidc_format_constraint *pix_constraint) { struct hal_uncompressed_plane_actual_constraints_info *pconstraint = NULL; u32 num_planes = 2; u32 size = 0; int rc = 0; struct hfi_device *hdev; if (!inst || !inst->core || !inst->core->device) { dprintk(VIDC_ERR, "%s - invalid param\n", __func__); return -EINVAL; } hdev = inst->core->device; size = sizeof(buffer_type) + sizeof(u32) + num_planes * sizeof(struct hal_uncompressed_plane_constraints); pconstraint = kzalloc(size, GFP_KERNEL); if (!pconstraint) { dprintk(VIDC_ERR, "No memory cannot alloc constrain\n"); rc = -ENOMEM; goto exit; } pconstraint->buffer_type = buffer_type; pconstraint->num_planes = pix_constraint->num_planes; //set Y plan constraints dprintk(VIDC_INFO, "Set Y plan constraints.\n"); pconstraint->rg_plane_format[0].stride_multiples = pix_constraint->y_stride_multiples; pconstraint->rg_plane_format[0].max_stride = pix_constraint->y_max_stride; pconstraint->rg_plane_format[0].min_plane_buffer_height_multiple = pix_constraint->y_min_plane_buffer_height_multiple; pconstraint->rg_plane_format[0].buffer_alignment = pix_constraint->y_buffer_alignment; //set UV plan constraints dprintk(VIDC_INFO, "Set UV plan constraints.\n"); pconstraint->rg_plane_format[1].stride_multiples = pix_constraint->uv_stride_multiples; pconstraint->rg_plane_format[1].max_stride = pix_constraint->uv_max_stride; pconstraint->rg_plane_format[1].min_plane_buffer_height_multiple = pix_constraint->uv_min_plane_buffer_height_multiple; pconstraint->rg_plane_format[1].buffer_alignment = pix_constraint->uv_buffer_alignment; rc = call_hfi_op(hdev, session_set_property, inst->session, HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO, pconstraint); if (rc) dprintk(VIDC_ERR, "Failed to set input color format constraint\n"); else dprintk(VIDC_DBG, "Set color format constraint success\n"); exit: if (!pconstraint) kfree(pconstraint); return rc; } drivers/media/platform/msm/vidc/msm_vidc_common.h +5 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,11 @@ const struct msm_vidc_format *msm_comm_get_pixel_fmt_index( const struct msm_vidc_format fmt[], int size, int index, int fmt_type); struct msm_vidc_format *msm_comm_get_pixel_fmt_fourcc( struct msm_vidc_format fmt[], int size, int fourcc, int fmt_type); struct msm_vidc_format_constraint *msm_comm_get_pixel_fmt_constraints( struct msm_vidc_format_constraint fmt[], int size, int fourcc); int msm_comm_set_color_format_constraints(struct msm_vidc_inst *inst, enum hal_buffer buffer_type, struct msm_vidc_format_constraint *pix_constraint); struct buf_queue *msm_comm_get_vb2q( struct msm_vidc_inst *inst, enum v4l2_buf_type type); int msm_comm_try_state(struct msm_vidc_inst *inst, int state); Loading Loading
drivers/media/platform/msm/vidc/hfi_packetization.c +28 −0 Original line number Diff line number Diff line Loading @@ -1025,7 +1025,35 @@ int create_pkt_cmd_session_set_property( break; } case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO: { struct hfi_uncompressed_plane_actual_constraints_info *hfi; struct hal_uncompressed_plane_actual_constraints_info *prop = (struct hal_uncompressed_plane_actual_constraints_info *) pdata; u32 buffer_type; u32 num_plane = prop->num_planes; u32 hfi_pkt_size = 2 * sizeof(u32) + num_plane * sizeof(struct hal_uncompressed_plane_constraints); pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO; hfi = (struct hfi_uncompressed_plane_actual_constraints_info *) &pkt->rg_property_data[1]; buffer_type = get_hfi_buffer(prop->buffer_type); if (buffer_type) hfi->buffer_type = buffer_type; else return -EINVAL; hfi->num_planes = prop->num_planes; memcpy(hfi->rg_plane_format, prop->rg_plane_format, hfi->num_planes *sizeof(struct hal_uncompressed_plane_constraints)); pkt->size += hfi_pkt_size; break; } case HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO: break; case HAL_PARAM_FRAME_SIZE: Loading
drivers/media/platform/msm/vidc/msm_vdec.c +38 −0 Original line number Diff line number Diff line Loading @@ -521,6 +521,21 @@ struct msm_vidc_format vdec_formats[] = { }, }; struct msm_vidc_format_constraint dec_pix_format_constraints[] = { { .fourcc = V4L2_PIX_FMT_SDE_Y_CBCR_H2V2_P010_VENUS, .num_planes = 2, .y_stride_multiples = 256, .y_max_stride = 8192, .y_min_plane_buffer_height_multiple = 32, .y_buffer_alignment = 256, .uv_stride_multiples = 256, .uv_max_stride = 8192, .uv_min_plane_buffer_height_multiple = 16, .uv_buffer_alignment = 256, }, }; static bool msm_vidc_check_for_vp9d_overload(struct msm_vidc_core *core) { u32 vp9d_instance_count = 0; Loading @@ -542,6 +557,7 @@ static bool msm_vidc_check_for_vp9d_overload(struct msm_vidc_core *core) int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) { struct msm_vidc_format *fmt = NULL; struct msm_vidc_format_constraint *fmt_constraint = NULL; struct hal_frame_size frame_sz; unsigned int extra_idx = 0; int rc = 0; Loading Loading @@ -589,6 +605,28 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) msm_comm_get_hal_output_buffer(inst), f->fmt.pix_mp.pixelformat); fmt_constraint = msm_comm_get_pixel_fmt_constraints(dec_pix_format_constraints, ARRAY_SIZE(dec_pix_format_constraints), f->fmt.pix_mp.pixelformat); if (!fmt_constraint) { dprintk(VIDC_INFO, "Format constraint not required for %d on CAPTURE port\n", f->fmt.pix_mp.pixelformat); } else { rc = msm_comm_set_color_format_constraints(inst, msm_comm_get_hal_output_buffer(inst), fmt_constraint); if (rc) { dprintk(VIDC_ERR, "Set constraint for %d failed on CAPTURE port\n", f->fmt.pix_mp.pixelformat); rc = -EINVAL; goto err_invalid_fmt; } } inst->clk_data.opb_fourcc = f->fmt.pix_mp.pixelformat; if (msm_comm_get_stream_output_mode(inst) == HAL_VIDEO_DECODER_SECONDARY) { Loading
drivers/media/platform/msm/vidc/msm_venc.c +40 −0 Original line number Diff line number Diff line Loading @@ -1213,6 +1213,22 @@ static struct msm_vidc_format venc_formats[] = { }, }; struct msm_vidc_format_constraint enc_pix_format_constraints[] = { { .fourcc = V4L2_PIX_FMT_SDE_Y_CBCR_H2V2_P010_VENUS, .num_planes = 2, .y_stride_multiples = 256, .y_max_stride = 8192, .y_min_plane_buffer_height_multiple = 32, .y_buffer_alignment = 256, .uv_stride_multiples = 256, .uv_max_stride = 8192, .uv_min_plane_buffer_height_multiple = 16, .uv_buffer_alignment = 256, }, }; static int msm_venc_set_csc(struct msm_vidc_inst *inst, u32 color_primaries, u32 custom_matrix); Loading Loading @@ -2535,6 +2551,7 @@ static int msm_venc_set_csc(struct msm_vidc_inst *inst, int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) { struct msm_vidc_format *fmt = NULL; struct msm_vidc_format_constraint *fmt_constraint = NULL; int rc = 0; struct hfi_device *hdev; int extra_idx = 0, i = 0; Loading Loading @@ -2722,6 +2739,29 @@ int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) } msm_comm_set_color_format(inst, HAL_BUFFER_INPUT, fmt->fourcc); fmt_constraint = msm_comm_get_pixel_fmt_constraints(enc_pix_format_constraints, ARRAY_SIZE(enc_pix_format_constraints), f->fmt.pix_mp.pixelformat); if (!fmt_constraint) { dprintk(VIDC_ERR, "Format constraint not required for %d on OUTPUT port\n", f->fmt.pix_mp.pixelformat); } else { rc = msm_comm_set_color_format_constraints(inst, HAL_BUFFER_INPUT, fmt_constraint); if (rc) { dprintk(VIDC_ERR, "Set constraint for %d failed on CAPTURE port\n", f->fmt.pix_mp.pixelformat); rc = -EINVAL; goto exit; } } } else { dprintk(VIDC_ERR, "%s - Unsupported buf type: %d\n", __func__, f->type); Loading
drivers/media/platform/msm/vidc/msm_vidc_common.c +90 −0 Original line number Diff line number Diff line Loading @@ -991,6 +991,26 @@ struct msm_vidc_format *msm_comm_get_pixel_fmt_fourcc( return &fmt[i]; } struct msm_vidc_format_constraint *msm_comm_get_pixel_fmt_constraints( struct msm_vidc_format_constraint fmt[], int size, int fourcc) { int i; if (!fmt) { dprintk(VIDC_ERR, "Invalid inputs, fmt = %pK\n", fmt); return NULL; } for (i = 0; i < size; i++) { if (fmt[i].fourcc == fourcc) break; } if (i == size) { dprintk(VIDC_INFO, "Format constraint not found.\n"); return NULL; } return &fmt[i]; } struct buf_queue *msm_comm_get_vb2q( struct msm_vidc_inst *inst, enum v4l2_buf_type type) { Loading Loading @@ -6706,3 +6726,73 @@ int msm_comm_release_mark_data(struct msm_vidc_inst *inst) return 0; } int msm_comm_set_color_format_constraints(struct msm_vidc_inst *inst, enum hal_buffer buffer_type, struct msm_vidc_format_constraint *pix_constraint) { struct hal_uncompressed_plane_actual_constraints_info *pconstraint = NULL; u32 num_planes = 2; u32 size = 0; int rc = 0; struct hfi_device *hdev; if (!inst || !inst->core || !inst->core->device) { dprintk(VIDC_ERR, "%s - invalid param\n", __func__); return -EINVAL; } hdev = inst->core->device; size = sizeof(buffer_type) + sizeof(u32) + num_planes * sizeof(struct hal_uncompressed_plane_constraints); pconstraint = kzalloc(size, GFP_KERNEL); if (!pconstraint) { dprintk(VIDC_ERR, "No memory cannot alloc constrain\n"); rc = -ENOMEM; goto exit; } pconstraint->buffer_type = buffer_type; pconstraint->num_planes = pix_constraint->num_planes; //set Y plan constraints dprintk(VIDC_INFO, "Set Y plan constraints.\n"); pconstraint->rg_plane_format[0].stride_multiples = pix_constraint->y_stride_multiples; pconstraint->rg_plane_format[0].max_stride = pix_constraint->y_max_stride; pconstraint->rg_plane_format[0].min_plane_buffer_height_multiple = pix_constraint->y_min_plane_buffer_height_multiple; pconstraint->rg_plane_format[0].buffer_alignment = pix_constraint->y_buffer_alignment; //set UV plan constraints dprintk(VIDC_INFO, "Set UV plan constraints.\n"); pconstraint->rg_plane_format[1].stride_multiples = pix_constraint->uv_stride_multiples; pconstraint->rg_plane_format[1].max_stride = pix_constraint->uv_max_stride; pconstraint->rg_plane_format[1].min_plane_buffer_height_multiple = pix_constraint->uv_min_plane_buffer_height_multiple; pconstraint->rg_plane_format[1].buffer_alignment = pix_constraint->uv_buffer_alignment; rc = call_hfi_op(hdev, session_set_property, inst->session, HAL_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO, pconstraint); if (rc) dprintk(VIDC_ERR, "Failed to set input color format constraint\n"); else dprintk(VIDC_DBG, "Set color format constraint success\n"); exit: if (!pconstraint) kfree(pconstraint); return rc; }
drivers/media/platform/msm/vidc/msm_vidc_common.h +5 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,11 @@ const struct msm_vidc_format *msm_comm_get_pixel_fmt_index( const struct msm_vidc_format fmt[], int size, int index, int fmt_type); struct msm_vidc_format *msm_comm_get_pixel_fmt_fourcc( struct msm_vidc_format fmt[], int size, int fourcc, int fmt_type); struct msm_vidc_format_constraint *msm_comm_get_pixel_fmt_constraints( struct msm_vidc_format_constraint fmt[], int size, int fourcc); int msm_comm_set_color_format_constraints(struct msm_vidc_inst *inst, enum hal_buffer buffer_type, struct msm_vidc_format_constraint *pix_constraint); struct buf_queue *msm_comm_get_vb2q( struct msm_vidc_inst *inst, enum v4l2_buf_type type); int msm_comm_try_state(struct msm_vidc_inst *inst, int state); Loading