* pull request: linux-firmware: Update Mediatek MT8173 VPU firmware
@ 2019-04-01 8:18 ` Yunfei Dong
0 siblings, 0 replies; 16+ messages in thread
From: Yunfei Dong @ 2019-04-01 8:18 UTC (permalink / raw)
To: linux-firmware; +Cc: linux-mediatek, linux-arm-kernel, linux-media, tiffany.lin
Hi linux-firmware maintainers,
The following changes since commit 7bc246451318b3536d9bfd3c4e46d541a9831b33:
Merge branch 'for-upstream' of git://git.chelsio.net/pub/git/linux-firmware (2019-03-14 08:22:39 -0400)
are available in the git repository at:
https://github.com/yunfei-dong/linux_fw_vpu_v1.1.2.git v1.1.2
for you to fetch changes up to c1b685587a6ffd651e900eff4e945619487f91bc:
mediatek: update MT8173 VPU firmware to v1.1.2 (2019-04-01 16:02:08 +0800)
----------------------------------------------------------------
Yunfei Dong (1):
mediatek: update MT8173 VPU firmware to v1.1.2.
vpu_d.bin | Bin 2977008 -> 2977008 bytes vpu_p.bin | Bin 131168 -> 131180 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
^ permalink raw reply [flat|nested] 16+ messages in thread
* pull request: linux-firmware: Update Mediatek MT8173 VPU firmware
@ 2019-04-01 8:18 ` Yunfei Dong
0 siblings, 0 replies; 16+ messages in thread
From: Yunfei Dong @ 2019-04-01 8:18 UTC (permalink / raw)
To: linux-firmware; +Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-media
Hi linux-firmware maintainers,
The following changes since commit 7bc246451318b3536d9bfd3c4e46d541a9831b33:
Merge branch 'for-upstream' of git://git.chelsio.net/pub/git/linux-firmware (2019-03-14 08:22:39 -0400)
are available in the git repository at:
https://github.com/yunfei-dong/linux_fw_vpu_v1.1.2.git v1.1.2
for you to fetch changes up to c1b685587a6ffd651e900eff4e945619487f91bc:
mediatek: update MT8173 VPU firmware to v1.1.2 (2019-04-01 16:02:08 +0800)
----------------------------------------------------------------
Yunfei Dong (1):
mediatek: update MT8173 VPU firmware to v1.1.2.
vpu_d.bin | Bin 2977008 -> 2977008 bytes vpu_p.bin | Bin 131168 -> 131180 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
^ permalink raw reply [flat|nested] 16+ messages in thread
* pull request: linux-firmware: Update Mediatek MT8173 VPU firmware
@ 2019-04-01 8:18 ` Yunfei Dong
0 siblings, 0 replies; 16+ messages in thread
From: Yunfei Dong @ 2019-04-01 8:18 UTC (permalink / raw)
To: linux-firmware; +Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-media
Hi linux-firmware maintainers,
The following changes since commit 7bc246451318b3536d9bfd3c4e46d541a9831b33:
Merge branch 'for-upstream' of git://git.chelsio.net/pub/git/linux-firmware (2019-03-14 08:22:39 -0400)
are available in the git repository at:
https://github.com/yunfei-dong/linux_fw_vpu_v1.1.2.git v1.1.2
for you to fetch changes up to c1b685587a6ffd651e900eff4e945619487f91bc:
mediatek: update MT8173 VPU firmware to v1.1.2 (2019-04-01 16:02:08 +0800)
----------------------------------------------------------------
Yunfei Dong (1):
mediatek: update MT8173 VPU firmware to v1.1.2.
vpu_d.bin | Bin 2977008 -> 2977008 bytes vpu_p.bin | Bin 131168 -> 131180 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
2019-04-01 8:18 ` Yunfei Dong
(?)
@ 2019-04-01 8:18 ` Yunfei Dong
-1 siblings, 0 replies; 16+ messages in thread
From: Yunfei Dong @ 2019-04-01 8:18 UTC (permalink / raw)
To: linux-firmware
Cc: linux-mediatek, linux-arm-kernel, linux-media, tiffany.lin, Yunfei Dong
Enlarge the plane number to support more complex case
and add the support for fmt change case.
Change-Id: If61f994b8853f370967fb81b92b407e2c2ae94b8
Signed-off-by: Yunfei Dong <yunfei.dong@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)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
@ 2019-04-01 8:18 ` Yunfei Dong
0 siblings, 0 replies; 16+ messages in thread
From: Yunfei Dong @ 2019-04-01 8:18 UTC (permalink / raw)
To: linux-firmware
Cc: Yunfei Dong, tiffany.lin, linux-mediatek, linux-arm-kernel, linux-media
Enlarge the plane number to support more complex case
and add the support for fmt change case.
Change-Id: If61f994b8853f370967fb81b92b407e2c2ae94b8
Signed-off-by: Yunfei Dong <yunfei.dong@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)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
@ 2019-04-01 8:18 ` Yunfei Dong
0 siblings, 0 replies; 16+ messages in thread
From: Yunfei Dong @ 2019-04-01 8:18 UTC (permalink / raw)
To: linux-firmware
Cc: Yunfei Dong, tiffany.lin, linux-mediatek, linux-arm-kernel, linux-media
Enlarge the plane number to support more complex case
and add the support for fmt change case.
Change-Id: If61f994b8853f370967fb81b92b407e2c2ae94b8
Signed-off-by: Yunfei Dong <yunfei.dong@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)
--
1.7.9.5
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
2019-04-01 8:18 ` Yunfei Dong
(?)
@ 2019-04-01 9:06 ` Hans Verkuil
-1 siblings, 0 replies; 16+ messages in thread
From: Hans Verkuil @ 2019-04-01 9:06 UTC (permalink / raw)
To: Yunfei Dong, linux-firmware
Cc: linux-mediatek, linux-arm-kernel, linux-media, tiffany.lin
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.dong@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)
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
@ 2019-04-01 9:06 ` Hans Verkuil
0 siblings, 0 replies; 16+ messages in thread
From: Hans Verkuil @ 2019-04-01 9:06 UTC (permalink / raw)
To: Yunfei Dong, linux-firmware
Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-media
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.dong@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)
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
@ 2019-04-01 9:06 ` Hans Verkuil
0 siblings, 0 replies; 16+ messages in thread
From: Hans Verkuil @ 2019-04-01 9:06 UTC (permalink / raw)
To: Yunfei Dong, linux-firmware
Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-media
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.dong@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)
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
2019-04-01 9:06 ` Hans Verkuil
@ 2019-04-01 9:28 ` yunfei.dong
-1 siblings, 0 replies; 16+ messages in thread
From: yunfei.dong @ 2019-04-01 9:28 UTC (permalink / raw)
To: Hans Verkuil
Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-firmware,
linux-media
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.
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.dong@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)
> >
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
@ 2019-04-01 9:28 ` yunfei.dong
0 siblings, 0 replies; 16+ messages in thread
From: yunfei.dong @ 2019-04-01 9:28 UTC (permalink / raw)
To: Hans Verkuil
Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-firmware,
linux-media
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.
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.dong@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)
> >
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
2019-04-01 9:28 ` yunfei.dong
(?)
@ 2019-04-01 9:32 ` Hans Verkuil
-1 siblings, 0 replies; 16+ messages in thread
From: Hans Verkuil @ 2019-04-01 9:32 UTC (permalink / raw)
To: yunfei.dong
Cc: linux-firmware, linux-mediatek, linux-arm-kernel, linux-media,
tiffany.lin
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.dong@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)
>>>
>>
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
@ 2019-04-01 9:32 ` Hans Verkuil
0 siblings, 0 replies; 16+ messages in thread
From: Hans Verkuil @ 2019-04-01 9:32 UTC (permalink / raw)
To: yunfei.dong
Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-firmware,
linux-media
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.dong@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)
>>>
>>
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
@ 2019-04-01 9:32 ` Hans Verkuil
0 siblings, 0 replies; 16+ messages in thread
From: Hans Verkuil @ 2019-04-01 9:32 UTC (permalink / raw)
To: yunfei.dong
Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-firmware,
linux-media
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.dong@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)
>>>
>>
>
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
2019-04-01 9:32 ` Hans Verkuil
@ 2019-04-01 9:39 ` yunfei.dong
-1 siblings, 0 replies; 16+ messages in thread
From: yunfei.dong @ 2019-04-01 9:39 UTC (permalink / raw)
To: Hans Verkuil
Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-firmware,
linux-media
Dear Hans,
Thanks for your help.
Just ignore this patch, and v3 is ok.
Best Regards,
Yunfei Dong
On Mon, 2019-04-01 at 11:32 +0200, Hans Verkuil wrote:
> 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.dong@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)
> >>>
> >>
> >
> >
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields
@ 2019-04-01 9:39 ` yunfei.dong
0 siblings, 0 replies; 16+ messages in thread
From: yunfei.dong @ 2019-04-01 9:39 UTC (permalink / raw)
To: Hans Verkuil
Cc: tiffany.lin, linux-mediatek, linux-arm-kernel, linux-firmware,
linux-media
Dear Hans,
Thanks for your help.
Just ignore this patch, and v3 is ok.
Best Regards,
Yunfei Dong
On Mon, 2019-04-01 at 11:32 +0200, Hans Verkuil wrote:
> 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.dong@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)
> >>>
> >>
> >
> >
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2019-04-01 9:39 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-01 8:18 pull request: linux-firmware: Update Mediatek MT8173 VPU firmware Yunfei Dong
2019-04-01 8:18 ` Yunfei Dong
2019-04-01 8:18 ` Yunfei Dong
2019-04-01 8:18 ` [PATCH] media: mtk-vcodec: enlarge struct vdec_pic_info fields Yunfei Dong
2019-04-01 8:18 ` Yunfei Dong
2019-04-01 8:18 ` Yunfei Dong
2019-04-01 9:06 ` Hans Verkuil
2019-04-01 9:06 ` Hans Verkuil
2019-04-01 9:06 ` Hans Verkuil
2019-04-01 9:28 ` yunfei.dong
2019-04-01 9:28 ` yunfei.dong
2019-04-01 9:32 ` Hans Verkuil
2019-04-01 9:32 ` Hans Verkuil
2019-04-01 9:32 ` Hans Verkuil
2019-04-01 9:39 ` yunfei.dong
2019-04-01 9:39 ` yunfei.dong
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.