On 4/1/19 11:28 AM, yunfei.dong wrote:
> Dear Hans,
> 
> I am very sorry.
> 
> This is not v4.
> And I just want to send vpu firmware patch(vpu_d.bin) in github, it
> looks that I sent a error patch.
> 
> Sorry to bother you.

Just to be clear: I can ignore this patch?

Regards,

        Hans

>  
> Best Regards,
> Yunfei Dong
> 
> 
> On Mon, 2019-04-01 at 11:06 +0200, Hans Verkuil wrote:
>> On 4/1/19 10:18 AM, Yunfei Dong wrote:
>>> Enlarge the plane number to support more complex case
>>> and add the support for fmt change case.
>>
>> Is this v4 of this patch? What are the changes since v3?
>>
>> Regards,
>>
>>      Hans
>>
>>>
>>> Change-Id: If61f994b8853f370967fb81b92b407e2c2ae94b8
>>> Signed-off-by: Yunfei Dong <yunfei.d...@mediatek.com>
>>> ---
>>>  drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c |   62 
>>> +++++++++++++-------
>>>  drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h |   16 ++---
>>>  .../media/platform/mtk-vcodec/vdec/vdec_h264_if.c  |    4 +-
>>>  .../media/platform/mtk-vcodec/vdec/vdec_vp8_if.c   |    4 +-
>>>  .../media/platform/mtk-vcodec/vdec/vdec_vp9_if.c   |   11 ++--
>>>  5 files changed, 57 insertions(+), 40 deletions(-)
>>>
>>> diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c 
>>> b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
>>> index d022c65..43587c0 100644
>>> --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
>>> +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
>>> @@ -129,9 +129,9 @@ static struct vb2_buffer *get_display_buffer(struct 
>>> mtk_vcodec_ctx *ctx)
>>>     mutex_lock(&ctx->lock);
>>>     if (dstbuf->used) {
>>>             vb2_set_plane_payload(&dstbuf->vb.vb2_buf, 0,
>>> -                                   ctx->picinfo.y_bs_sz);
>>> +                                   ctx->picinfo.fb_sz[0]);
>>>             vb2_set_plane_payload(&dstbuf->vb.vb2_buf, 1,
>>> -                                   ctx->picinfo.c_bs_sz);
>>> +                                   ctx->picinfo.fb_sz[1]);
>>>  
>>>             dstbuf->ready_to_display = true;
>>>  
>>> @@ -278,6 +278,27 @@ static void mtk_vdec_flush_decoder(struct 
>>> mtk_vcodec_ctx *ctx)
>>>     clean_free_buffer(ctx);
>>>  }
>>>  
>>> +static void mtk_vdec_update_fmt(struct mtk_vcodec_ctx *ctx,
>>> +                           unsigned int pixelformat)
>>> +{
>>> +   struct mtk_video_fmt *fmt;
>>> +   struct mtk_q_data *dst_q_data;
>>> +   unsigned int k;
>>> +
>>> +   dst_q_data = &ctx->q_data[MTK_Q_DATA_DST];
>>> +   for (k = 0; k < NUM_FORMATS; k++) {
>>> +           fmt = &mtk_video_formats[k];
>>> +           if (fmt->fourcc == pixelformat) {
>>> +                   mtk_v4l2_debug(1, "Update cap fourcc(%d -> %d)",
>>> +                           dst_q_data->fmt.fourcc, pixelformat);
>>> +                   dst_q_data->fmt = fmt;
>>> +                   return;
>>> +           }
>>> +   }
>>> +
>>> +   mtk_v4l2_err("Cannot get fourcc(%d), using init value", pixelformat);
>>> +}
>>> +
>>>  static int mtk_vdec_pic_info_update(struct mtk_vcodec_ctx *ctx)
>>>  {
>>>     unsigned int dpbsize = 0;
>>> @@ -299,6 +320,10 @@ static int mtk_vdec_pic_info_update(struct 
>>> mtk_vcodec_ctx *ctx)
>>>             return -EINVAL;
>>>     }
>>>  
>>> +   if (ctx->last_decoded_picinfo.cap_fourcc != ctx->picinfo.cap_fourcc &&
>>> +           ctx->picinfo.cap_fourcc != 0)
>>> +           mtk_vdec_update_fmt(ctx, ctx->picinfo.cap_fourcc);
>>> +
>>>     if ((ctx->last_decoded_picinfo.pic_w == ctx->picinfo.pic_w) ||
>>>         (ctx->last_decoded_picinfo.pic_h == ctx->picinfo.pic_h))
>>>             return 0;
>>> @@ -352,11 +377,11 @@ static void mtk_vdec_worker(struct work_struct *work)
>>>     pfb = &dst_buf_info->frame_buffer;
>>>     pfb->base_y.va = vb2_plane_vaddr(&dst_buf->vb2_buf, 0);
>>>     pfb->base_y.dma_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 
>>> 0);
>>> -   pfb->base_y.size = ctx->picinfo.y_bs_sz + ctx->picinfo.y_len_sz;
>>> +   pfb->base_y.size = ctx->picinfo.fb_sz[0];
>>>  
>>>     pfb->base_c.va = vb2_plane_vaddr(&dst_buf->vb2_buf, 1);
>>>     pfb->base_c.dma_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 
>>> 1);
>>> -   pfb->base_c.size = ctx->picinfo.c_bs_sz + ctx->picinfo.c_len_sz;
>>> +   pfb->base_c.size = ctx->picinfo.fb_sz[1];
>>>     pfb->status = 0;
>>>     mtk_v4l2_debug(3, "===>[%d] vdec_if_decode() ===>", ctx->id);
>>>  
>>> @@ -976,14 +1001,13 @@ static int vidioc_vdec_g_fmt(struct file *file, void 
>>> *priv,
>>>              * So we just return picinfo yet, and update picinfo in
>>>              * stop_streaming hook function
>>>              */
>>> -           q_data->sizeimage[0] = ctx->picinfo.y_bs_sz +
>>> -                                   ctx->picinfo.y_len_sz;
>>> -           q_data->sizeimage[1] = ctx->picinfo.c_bs_sz +
>>> -                                   ctx->picinfo.c_len_sz;
>>> +           q_data->sizeimage[0] = ctx->picinfo.fb_sz[0];
>>> +           q_data->sizeimage[1] = ctx->picinfo.fb_sz[1];
>>>             q_data->bytesperline[0] = ctx->last_decoded_picinfo.buf_w;
>>>             q_data->bytesperline[1] = ctx->last_decoded_picinfo.buf_w;
>>>             q_data->coded_width = ctx->picinfo.buf_w;
>>>             q_data->coded_height = ctx->picinfo.buf_h;
>>> +           ctx->last_decoded_picinfo.cap_fourcc = q_data->fmt->fourcc;
>>>  
>>>             /*
>>>              * Width and height are set to the dimensions
>>> @@ -1103,10 +1127,11 @@ static void vb2ops_vdec_buf_queue(struct vb2_buffer 
>>> *vb)
>>>     struct mtk_vcodec_mem src_mem;
>>>     bool res_chg = false;
>>>     int ret = 0;
>>> -   unsigned int dpbsize = 1;
>>> +   unsigned int dpbsize = 1, i = 0;
>>>     struct mtk_vcodec_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
>>>     struct vb2_v4l2_buffer *vb2_v4l2 = NULL;
>>>     struct mtk_video_dec_buf *buf = NULL;
>>> +   struct mtk_q_data *dst_q_data;
>>>  
>>>     mtk_v4l2_debug(3, "[%d] (%d) id=%d, vb=%p",
>>>                     ctx->id, vb->vb2_queue->type,
>>> @@ -1194,21 +1219,18 @@ static void vb2ops_vdec_buf_queue(struct vb2_buffer 
>>> *vb)
>>>     }
>>>  
>>>     ctx->last_decoded_picinfo = ctx->picinfo;
>>> -   ctx->q_data[MTK_Q_DATA_DST].sizeimage[0] =
>>> -                                           ctx->picinfo.y_bs_sz +
>>> -                                           ctx->picinfo.y_len_sz;
>>> -   ctx->q_data[MTK_Q_DATA_DST].bytesperline[0] =
>>> -                                           ctx->picinfo.buf_w;
>>> -   ctx->q_data[MTK_Q_DATA_DST].sizeimage[1] =
>>> -                                           ctx->picinfo.c_bs_sz +
>>> -                                           ctx->picinfo.c_len_sz;
>>> -   ctx->q_data[MTK_Q_DATA_DST].bytesperline[1] = ctx->picinfo.buf_w;
>>> +   dst_q_data = &ctx->q_data[MTK_Q_DATA_DST];
>>> +   for (i = 0; i < dst_q_data->fmt->num_planes; i++) {
>>> +           dst_q_data->sizeimage[i] = ctx->picinfo.fb_sz[i];
>>> +           dst_q_data->bytesperline[i] = ctx->picinfo.buf_w;
>>> +   }
>>> +
>>>     mtk_v4l2_debug(2, "[%d] vdec_if_init() OK wxh=%dx%d pic wxh=%dx%d 
>>> sz[0]=0x%x sz[1]=0x%x",
>>>                     ctx->id,
>>>                     ctx->picinfo.buf_w, ctx->picinfo.buf_h,
>>>                     ctx->picinfo.pic_w, ctx->picinfo.pic_h,
>>> -                   ctx->q_data[MTK_Q_DATA_DST].sizeimage[0],
>>> -                   ctx->q_data[MTK_Q_DATA_DST].sizeimage[1]);
>>> +                   dst_q_data->sizeimage[0],
>>> +                   dst_q_data->sizeimage[1]);
>>>  
>>>     ret = vdec_if_get_param(ctx, GET_PARAM_DPB_SIZE, &dpbsize);
>>>     if (dpbsize == 0)
>>> diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h 
>>> b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
>>> index e7e2a10..662a84b 100644
>>> --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
>>> +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
>>> @@ -211,24 +211,20 @@ struct mtk_vcodec_pm {
>>>   * @pic_h: picture height
>>>   * @buf_w: picture buffer width (64 aligned up from pic_w)
>>>   * @buf_h: picture buffer heiht (64 aligned up from pic_h)
>>> - * @y_bs_sz: Y bitstream size
>>> - * @c_bs_sz: CbCr bitstream size
>>> - * @y_len_sz: additional size required to store decompress information for 
>>> y
>>> - *         plane
>>> - * @c_len_sz: additional size required to store decompress information for 
>>> cbcr
>>> - *         plane
>>> + * @fb_sz: bitstream size of each plane
>>>   * E.g. suppose picture size is 176x144,
>>>   *      buffer size will be aligned to 176x160.
>>> + * @cap_fourcc: fourcc number(may changed when resolution change)
>>> + * @reserved: align struct to 64-bit in order to adjust 32-bit and 64-bit 
>>> os.
>>>   */
>>>  struct vdec_pic_info {
>>>     unsigned int pic_w;
>>>     unsigned int pic_h;
>>>     unsigned int buf_w;
>>>     unsigned int buf_h;
>>> -   unsigned int y_bs_sz;
>>> -   unsigned int c_bs_sz;
>>> -   unsigned int y_len_sz;
>>> -   unsigned int c_len_sz;
>>> +   unsigned int fb_sz[VIDEO_MAX_PLANES];
>>> +   unsigned int cap_fourcc;
>>> +   unsigned int reserved;
>>>  };
>>>  
>>>  /**
>>> diff --git a/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_if.c 
>>> b/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_if.c
>>> index 02c960c..cdbcd69 100644
>>> --- a/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_if.c
>>> +++ b/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_if.c
>>> @@ -253,8 +253,8 @@ static void get_pic_info(struct vdec_h264_inst *inst,
>>>     *pic = inst->vsi->pic;
>>>     mtk_vcodec_debug(inst, "pic(%d, %d), buf(%d, %d)",
>>>                      pic->pic_w, pic->pic_h, pic->buf_w, pic->buf_h);
>>> -   mtk_vcodec_debug(inst, "Y(%d, %d), C(%d, %d)", pic->y_bs_sz,
>>> -                    pic->y_len_sz, pic->c_bs_sz, pic->c_len_sz);
>>> +   mtk_vcodec_debug(inst, "fb size: Y(%d), C(%d)",
>>> +                    pic->fb_sz[0], pic->fb_sz[1]);
>>>  }
>>>  
>>>  static void get_crop_info(struct vdec_h264_inst *inst, struct v4l2_rect 
>>> *cr)
>>> diff --git a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp8_if.c 
>>> b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp8_if.c
>>> index bac3723..ba79136 100644
>>> --- a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp8_if.c
>>> +++ b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp8_if.c
>>> @@ -294,8 +294,8 @@ static void get_pic_info(struct vdec_vp8_inst *inst, 
>>> struct vdec_pic_info *pic)
>>>  
>>>     mtk_vcodec_debug(inst, "pic(%d, %d), buf(%d, %d)",
>>>                      pic->pic_w, pic->pic_h, pic->buf_w, pic->buf_h);
>>> -   mtk_vcodec_debug(inst, "Y(%d, %d), C(%d, %d)", pic->y_bs_sz,
>>> -                    pic->y_len_sz, pic->c_bs_sz, pic->c_len_sz);
>>> +   mtk_vcodec_debug(inst, "fb size: Y(%d), C(%d)",
>>> +                    pic->fb_sz[0], pic->fb_sz[1]);
>>>  }
>>>  
>>>  static void vp8_dec_finish(struct vdec_vp8_inst *inst)
>>> diff --git a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c 
>>> b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c
>>> index bc8349b..6fe8320 100644
>>> --- a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c
>>> +++ b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c
>>> @@ -702,10 +702,8 @@ static void init_all_fb_lists(struct vdec_vp9_inst 
>>> *inst)
>>>  
>>>  static void get_pic_info(struct vdec_vp9_inst *inst, struct vdec_pic_info 
>>> *pic)
>>>  {
>>> -   pic->y_bs_sz = inst->vsi->buf_sz_y_bs;
>>> -   pic->c_bs_sz = inst->vsi->buf_sz_c_bs;
>>> -   pic->y_len_sz = inst->vsi->buf_len_sz_y;
>>> -   pic->c_len_sz = inst->vsi->buf_len_sz_c;
>>> +   pic->fb_sz[0] = inst->vsi->buf_sz_y_bs + inst->vsi->buf_len_sz_y;
>>> +   pic->fb_sz[1] = inst->vsi->buf_sz_c_bs + inst->vsi->buf_len_sz_c;
>>>  
>>>     pic->pic_w = inst->vsi->pic_w;
>>>     pic->pic_h = inst->vsi->pic_h;
>>> @@ -714,8 +712,9 @@ static void get_pic_info(struct vdec_vp9_inst *inst, 
>>> struct vdec_pic_info *pic)
>>>  
>>>     mtk_vcodec_debug(inst, "pic(%d, %d), buf(%d, %d)",
>>>              pic->pic_w, pic->pic_h, pic->buf_w, pic->buf_h);
>>> -   mtk_vcodec_debug(inst, "Y(%d, %d), C(%d, %d)", pic->y_bs_sz,
>>> -            pic->y_len_sz, pic->c_bs_sz, pic->c_len_sz);
>>> +   mtk_vcodec_debug(inst, "fb size: Y(%d), C(%d)",
>>> +           pic->fb_sz[0],
>>> +           pic->fb_sz[1]);
>>>  }
>>>  
>>>  static void get_disp_fb(struct vdec_vp9_inst *inst, struct vdec_fb 
>>> **out_fb)
>>>
>>
> 
> 

Reply via email to