},
},
[VPU_FMT_TYPE_RAW] = {
- {
+ /*{
.v4l2_pix_fmt = V4L2_PIX_FMT_YUV420,
.max_width = 8192,
.min_width = 8,
.min_width = 8,
.max_height = 4320,
.min_height = 8,
- },
+ },*/
{
.v4l2_pix_fmt = V4L2_PIX_FMT_YUV420M,
.max_width = 8192,
static void wave5_update_pix_fmt(struct v4l2_pix_format_mplane *pix_mp, unsigned int width,
unsigned int height)
+{
+ switch (pix_mp->pixelformat) {
+ case V4L2_PIX_FMT_YUV420:
+ case V4L2_PIX_FMT_NV12:
+ case V4L2_PIX_FMT_NV21:
+ pix_mp->width = round_up(width, 32);
+ pix_mp->height = round_up(height, 16);
+ pix_mp->plane_fmt[0].bytesperline = round_up(width, 32);
+ pix_mp->plane_fmt[0].sizeimage = width * height * 3 / 2;
+ break;
+ case V4L2_PIX_FMT_YUV420M:
+ pix_mp->width = round_up(width, 32);
+ pix_mp->height = round_up(height, 16);
+ pix_mp->plane_fmt[0].bytesperline = round_up(width, 32);
+ pix_mp->plane_fmt[0].sizeimage = width * height;
+ pix_mp->plane_fmt[1].bytesperline = round_up(width, 32) / 2;
+ pix_mp->plane_fmt[1].sizeimage = width * height / 4;
+ pix_mp->plane_fmt[2].bytesperline = round_up(width, 32) / 2;
+ pix_mp->plane_fmt[2].sizeimage = width * height / 4;
+ break;
+ case V4L2_PIX_FMT_NV12M:
+ case V4L2_PIX_FMT_NV21M:
+ pix_mp->width = round_up(width, 32);
+ pix_mp->height = round_up(height, 16);
+ pix_mp->plane_fmt[0].bytesperline = round_up(width, 32);
+ pix_mp->plane_fmt[0].sizeimage = width * height;
+ pix_mp->plane_fmt[1].bytesperline = round_up(width, 32);
+ pix_mp->plane_fmt[1].sizeimage = width * height / 2;
+ break;
+ default:
+ pix_mp->width = width;
+ pix_mp->height = height;
+ pix_mp->plane_fmt[0].bytesperline = 0;
+ pix_mp->plane_fmt[0].sizeimage = width * height;
+ break;
+ }
+}
+
+static void wave5_update_pix_fmt_r8(struct v4l2_pix_format_mplane *pix_mp, unsigned int width,
+ unsigned int height)
{
switch (pix_mp->pixelformat) {
case V4L2_PIX_FMT_YUV420:
src_buf = v4l2_m2m_src_buf_remove(inst->v4l2_fh.m2m_ctx);
inst->state = VPU_INST_STATE_STOP;
+ //printk("%d wave5 state = %d\n",__LINE__, inst->state);
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
}
}
int ret;
inst->state = VPU_INST_STATE_STOP;
+ //printk("%d wave5 state = %d\n",__LINE__, inst->state);
ret = wave5_vpu_dec_update_bitstream_buffer(inst, 0);
if (ret) {
struct vb2_v4l2_buffer *dst_buf =
v4l2_m2m_dst_buf_remove_by_idx(inst->v4l2_fh.m2m_ctx,
dec_output_info.index_frame_display);
- int stride = dec_output_info.disp_frame.stride;
- int height = dec_output_info.disp_pic_height -
- dec_output_info.rc_display.bottom;
- if (dec_output_info.disp_pic_height != inst->display_fmt.height)
- height = inst->display_fmt.height;
+
+ int stride = inst->display_fmt.width;
+ int height =inst->display_fmt.height;
dev_dbg(inst->dev->dev, "%s %d disp_pic_height %u rc_display.bottom %u\n",
__func__, __LINE__, dec_output_info.disp_pic_height, dec_output_info.rc_display.bottom);
- dev_dbg(inst->dev->dev, "%s %d stride %u height %u\n", __func__, __LINE__, stride, height);
+ dev_dbg(inst->dev->dev, "%s %d stride %u height %u num %d\n", __func__, __LINE__, stride, height,inst->dst_fmt.num_planes);
if (inst->dst_fmt.num_planes == 1) {
vb2_set_plane_payload(&dst_buf->vb2_buf, 0,
((stride / 2) * (height / 2)));
}
- dst_buf->vb2_buf.timestamp = inst->timestamp;
+ if (inst->timestamp) {
+ dst_buf->vb2_buf.timestamp = inst->timestamp;
+ } else {
+ dst_buf->vb2_buf.timestamp = inst->timestamp_cnt++ * inst->codec_info->dec_info.initial_info.ns_per_frame;
+ }
+
dst_buf->field = V4L2_FIELD_NONE;
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
inst->eos = TRUE;
- pr_err("wave5 queue event type: %d id: %d\n",vpu_event_eos.type, vpu_event_eos.id);
+ //pr_err("wave5 queue event type: %d id: %d\n",vpu_event_eos.type, vpu_event_eos.id);
v4l2_event_queue_fh(&inst->v4l2_fh, &vpu_event_eos);
v4l2_m2m_job_finish(inst->v4l2_m2m_dev, inst->v4l2_fh.m2m_ctx);
if (!vpu_fmt) {
f->fmt.pix_mp.pixelformat = inst->dst_fmt.pixelformat;
f->fmt.pix_mp.num_planes = inst->dst_fmt.num_planes;
- wave5_update_pix_fmt(&f->fmt.pix_mp, inst->dst_fmt.width, inst->dst_fmt.height);
+ wave5_update_pix_fmt_r8(&f->fmt.pix_mp, inst->dst_fmt.width, inst->dst_fmt.height);
} else {
int width = clamp(f->fmt.pix_mp.width, vpu_fmt->min_width, vpu_fmt->max_width);
int height = clamp(f->fmt.pix_mp.height, vpu_fmt->min_height, vpu_fmt->max_height);
f->fmt.pix_mp.pixelformat = vpu_fmt->v4l2_pix_fmt;
f->fmt.pix_mp.num_planes = info->mem_planes;
- wave5_update_pix_fmt(&f->fmt.pix_mp, width, height);
+ wave5_update_pix_fmt_r8(&f->fmt.pix_mp, width, height);
}
f->fmt.pix_mp.flags = 0;
int i, ret;
unsigned int scalew, scaleh;
- printk(
+ dev_dbg(inst->dev->dev,
"%s: fourcc: %u width: %u height: %u num_planes: %u colorspace: %u field: %u\n",
__func__, f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.width, f->fmt.pix_mp.height,
f->fmt.pix_mp.num_planes, f->fmt.pix_mp.colorspace, f->fmt.pix_mp.field);
scalew = inst->src_fmt.width / f->fmt.pix_mp.width;
scaleh = inst->src_fmt.height / f->fmt.pix_mp.height;
- if (scalew > 8 || scaleh > 8 || scalew < 1 || scaleh < 1) {
- dev_err(inst->dev->dev,"Scaling should be 1 to 1/8 (down-scaling only)! Use input parameter. \n");
- return -EINVAL;
- }
-
- inst->dst_fmt.width = f->fmt.pix_mp.width;
- inst->dst_fmt.height = f->fmt.pix_mp.height;
+ //if (scalew > 8 || scaleh > 8 || scalew < 1 || scaleh < 1) {
+ // dev_err(inst->dev->dev,"Scaling should be 1 to 1/8 (down-scaling only)! Use input parameter. \n");
+ // return -EINVAL;
+ //}
+
+ inst->display_fmt.width = f->fmt.pix_mp.width;
+ inst->display_fmt.height = f->fmt.pix_mp.height;
+ inst->display_fmt.pixelformat = f->fmt.pix_mp.pixelformat;
+ inst->display_fmt.field = f->fmt.pix_mp.field;
+ inst->display_fmt.flags = f->fmt.pix_mp.flags;
+ inst->display_fmt.num_planes = f->fmt.pix_mp.num_planes;
inst->dst_fmt.pixelformat = f->fmt.pix_mp.pixelformat;
- inst->dst_fmt.field = f->fmt.pix_mp.field;
- inst->dst_fmt.flags = f->fmt.pix_mp.flags;
inst->dst_fmt.num_planes = f->fmt.pix_mp.num_planes;
- for (i = 0; i < inst->dst_fmt.num_planes; i++) {
- inst->dst_fmt.plane_fmt[i].bytesperline = f->fmt.pix_mp.plane_fmt[i].bytesperline;
- inst->dst_fmt.plane_fmt[i].sizeimage = f->fmt.pix_mp.plane_fmt[i].sizeimage;
+ for (i = 0; i < inst->display_fmt.num_planes; i++) {
+ inst->display_fmt.plane_fmt[i].bytesperline = f->fmt.pix_mp.plane_fmt[i].bytesperline;
+ inst->display_fmt.plane_fmt[i].sizeimage = f->fmt.pix_mp.plane_fmt[i].sizeimage;
}
- if (inst->dst_fmt.pixelformat == V4L2_PIX_FMT_NV12 ||
- inst->dst_fmt.pixelformat == V4L2_PIX_FMT_NV12M) {
+ if (inst->display_fmt.pixelformat == V4L2_PIX_FMT_NV12 ||
+ inst->display_fmt.pixelformat == V4L2_PIX_FMT_NV12M) {
inst->cbcr_interleave = true;
inst->nv21 = false;
- } else if (inst->dst_fmt.pixelformat == V4L2_PIX_FMT_NV21 ||
- inst->dst_fmt.pixelformat == V4L2_PIX_FMT_NV21M) {
+ } else if (inst->display_fmt.pixelformat == V4L2_PIX_FMT_NV21 ||
+ inst->display_fmt.pixelformat == V4L2_PIX_FMT_NV21M) {
inst->cbcr_interleave = true;
inst->nv21 = true;
} else {
inst->nv21 = false;
}
- memcpy((void *)&inst->display_fmt, (void *)&inst->dst_fmt, sizeof(struct v4l2_pix_format_mplane));
-
return 0;
}
struct vpu_instance *inst = wave5_to_vpu_inst(fh);
int i, ret;
- printk(
+ dev_dbg(inst->dev->dev,
"%s: fourcc: %u width: %u height: %u num_planes: %u field: %u\n",
__func__, f->fmt.pix_mp.pixelformat, f->fmt.pix_mp.width, f->fmt.pix_mp.height,
f->fmt.pix_mp.num_planes, f->fmt.pix_mp.field);
+
ret = wave5_vpu_dec_try_fmt_out(file, fh, f);
if (ret)
return ret;
inst->quantization = f->fmt.pix_mp.quantization;
inst->xfer_func = f->fmt.pix_mp.xfer_func;
- wave5_update_pix_fmt(&inst->dst_fmt, f->fmt.pix_mp.width, f->fmt.pix_mp.height);
+
+ wave5_update_pix_fmt_r8(&inst->dst_fmt, f->fmt.pix_mp.width, f->fmt.pix_mp.height);
+ wave5_update_pix_fmt_r8(&inst->display_fmt, f->fmt.pix_mp.width, f->fmt.pix_mp.height);
return 0;
}
switch (dc->cmd) {
case V4L2_DEC_CMD_STOP:
+ wave5_handle_bitstream_buffer(inst);
+ inst->ops->start_process(inst);
inst->state = VPU_INST_STATE_STOP;
+ //printk("%d wave5 state = %d\n",__LINE__, inst->state);
ret = wave5_vpu_dec_update_bitstream_buffer(inst, 0);
if (ret) {
if (inst->state == VPU_INST_STATE_NONE && q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
struct dec_open_param open_param;
+ *num_buffers = 4;
+
memset(&open_param, 0, sizeof(struct dec_open_param));
wave5_set_default_dec_openparam(&open_param);
}
inst->state = VPU_INST_STATE_OPEN;
+ //printk("wave5 state = %d\n",inst->state);
if (inst->thumbnail_mode)
wave5_vpu_dec_give_command(inst, ENABLE_DEC_THUMBNAIL_MODE, NULL);
u32 fb_stride, fb_height;
u32 luma_size, chroma_size;
- if (*num_buffers > inst->min_dst_buf_count &&
- *num_buffers < WAVE5_MAX_FBS)
- inst->dst_buf_count = *num_buffers;
+ //if (*num_buffers > inst->min_dst_buf_count &&
+ // *num_buffers < WAVE5_MAX_FBS)
+ // inst->dst_buf_count = *num_buffers;
*num_buffers = inst->dst_buf_count;
non_linear_num = inst->dst_buf_count;
ret = wave5_vpu_dec_issue_seq_init(inst);
if (ret) {
- dev_dbg(inst->dev->dev, "%s: wave5_vpu_dec_issue_seq_init, fail: %d\n",
+ dev_err(inst->dev->dev, "%s: wave5_vpu_dec_issue_seq_init, fail: %d\n",
__func__, ret);
return ret;
}
if (wave5_vpu_wait_interrupt(inst, VPU_DEC_TIMEOUT) < 0)
- dev_dbg(inst->dev->dev, "%s: failed to call vpu_wait_interrupt()\n", __func__);
+ dev_err(inst->dev->dev, "%s: failed to call vpu_wait_interrupt()\n", __func__);
ret = wave5_vpu_dec_complete_seq_init(inst, &initial_info);
if (ret) {
- dev_dbg(inst->dev->dev, "%s: vpu_dec_complete_seq_init, fail: %d, reason: %u\n",
+ dev_err(inst->dev->dev, "%s: vpu_dec_complete_seq_init, fail: %d, reason: %u\n",
__func__, ret, initial_info.seq_init_err_reason);
} else {
static const struct v4l2_event vpu_event_src_ch = {
initial_info.profile, initial_info.min_frame_buffer_count);
inst->state = VPU_INST_STATE_INIT_SEQ;
+ //printk("wave5 state = %d\n",inst->state);
inst->min_dst_buf_count = initial_info.min_frame_buffer_count + 1;
inst->dst_buf_count = inst->min_dst_buf_count;
if (initial_info.pic_width != inst->src_fmt.width ||
initial_info.pic_height != inst->src_fmt.height) {
- wave5_update_pix_fmt(&inst->src_fmt, initial_info.pic_width,
- initial_info.pic_height);
- wave5_update_pix_fmt(&inst->dst_fmt, initial_info.pic_width,
- initial_info.pic_height);
+ if (inst->std == W_AVC_DEC) {
+ wave5_update_pix_fmt(&inst->src_fmt, initial_info.pic_width,
+ initial_info.pic_height);
+ wave5_update_pix_fmt(&inst->dst_fmt, initial_info.pic_width,
+ initial_info.pic_height);
+ } else { //HEVC
+ wave5_update_pix_fmt_r8(&inst->src_fmt, initial_info.pic_width,
+ initial_info.pic_height);
+ wave5_update_pix_fmt_r8(&inst->dst_fmt, initial_info.pic_width,
+ initial_info.pic_height);
+ }
}
+ inst->crop_rect.right = initial_info.pic_crop_rect.right;
+ inst->crop_rect.bottom = initial_info.pic_crop_rect.bottom;
scalew = inst->dst_fmt.width / inst->display_fmt.width;
scaleh = inst->dst_fmt.height / inst->display_fmt.height;
inst->dst_fmt.height);
}
- printk("wave5 queue event type: %d id: %d\n",vpu_event_src_ch.type, vpu_event_src_ch.id);
+ dev_dbg(inst->dev->dev, "wave5 queue event type: %d id: %d\n",vpu_event_src_ch.type, vpu_event_src_ch.id);
v4l2_event_queue_fh(&inst->v4l2_fh, &vpu_event_src_ch);
wave5_handle_src_buffer(inst);
src_buf = v4l2_m2m_src_buf_remove(inst->v4l2_fh.m2m_ctx);
inst->state = VPU_INST_STATE_STOP;
+ //printk("%d wave5 state = %d\n",__LINE__, inst->state);
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
dev_dbg(inst->dev->dev, "%s: wave5_vpu_dec_start_one_frame\n", __func__);
return ret;
if (initial_info.pic_width != inst->src_fmt.width ||
initial_info.pic_height != inst->src_fmt.height) {
- wave5_update_pix_fmt(&inst->src_fmt, initial_info.pic_width,
- initial_info.pic_height);
- wave5_update_pix_fmt(&inst->dst_fmt, initial_info.pic_width,
- initial_info.pic_height);
+ if (inst->std == W_AVC_DEC) {
+ wave5_update_pix_fmt(&inst->src_fmt, initial_info.pic_width,
+ initial_info.pic_height);
+ wave5_update_pix_fmt(&inst->dst_fmt, initial_info.pic_width,
+ initial_info.pic_height);
+ } else { //HEVC
+ wave5_update_pix_fmt_r8(&inst->src_fmt, initial_info.pic_width,
+ initial_info.pic_height);
+ wave5_update_pix_fmt_r8(&inst->dst_fmt, initial_info.pic_width,
+ initial_info.pic_height);
+ }
}
+ inst->crop_rect.right = initial_info.pic_crop_rect.right;
+ inst->crop_rect.bottom = initial_info.pic_crop_rect.bottom;
scalew = inst->dst_fmt.width / inst->display_fmt.width;
scaleh = inst->dst_fmt.height / inst->display_fmt.height;
struct vpu_instance *inst = vb2_get_drv_priv(vb->vb2_queue);
dev_dbg(inst->dev->dev, "%s: type: %4u index: %4u size: ([0]=%4lu, [1]=%4lu, [2]=%4lu)\n",
- __func__, vb->type, vb->index, vb2_plane_size(&vbuf->vb2_buf, 0),
- vb2_plane_size(&vbuf->vb2_buf, 1), vb2_plane_size(&vbuf->vb2_buf, 2));
+ __func__, vb->type, vb->index, vb2_get_plane_payload(&vbuf->vb2_buf, 0),
+ vb2_get_plane_payload(&vbuf->vb2_buf, 1), vb2_get_plane_payload(&vbuf->vb2_buf, 2));
v4l2_m2m_buf_queue(inst->v4l2_fh.m2m_ctx, vbuf);
{
struct vpu_instance *inst = vb2_get_drv_priv(q);
struct vb2_v4l2_buffer *buf;
+ int try_cnt = 0;
bool check_cmd = TRUE;
dev_dbg(inst->dev->dev, "%s: type: %u\n", __func__, q->type);
while (check_cmd) {
struct queue_status_info q_status;
struct dec_output_info dec_output_info;
- int try_cnt = 0;
wave5_vpu_dec_give_command(inst, DEC_GET_QUEUE_STATUS, &q_status);
if (wave5_vpu_wait_interrupt(inst, 600) < 0){
try_cnt++;
- if (try_cnt >= 100)
+ if (try_cnt >= 10)
break;
continue;
}
if (inst->eos) {
inst->eos = FALSE;
inst->state = VPU_INST_STATE_INIT_SEQ;
+ //printk("wave5 state = %d\n",inst->state);
}
inst->queued_dst_buf_num = 0;
}
{
struct vpu_instance *inst = priv;
+ wave5_handle_bitstream_buffer(inst);
inst->ops->start_process(inst);
inst->state = VPU_INST_STATE_PIC_RUN;
+ //printk("wave5 state = %d\n",inst->state);
}
static void wave5_vpu_dec_job_abort(void *priv)