media: venus: amend buffer size for bitstream plane
Subsystems (4)
PATCH v2 1/1 media: venus: amend buffer size for bitstream plane
Accept the buffer size requested by client and compare it against driver calculated size and set the maximum to bitstream plane.
--- drivers/media/platform/qcom/venus/venc.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/media/platform/qcom/venus/venc.c +9 -4
@@ -303,6 +303,7 @@ static int venc_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdesc *f)struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;struct v4l2_plane_pix_format *pfmt = pixmp->plane_fmt;const struct venus_format *fmt; +__u32 sizeimage;memset (pfmt[0 ].reserved,0 ,sizeof (pfmt[0 ].reserved));memset (pixmp->reserved,0 ,sizeof (pixmp->reserved));
@@ -334,9 +335,10 @@ static int venc_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdesc *f) pixmp->num_planes = fmt->num_planes; pixmp->flags =0 ; - pfmt[0 ].sizeimage =venus_helper_get_framesz (pixmp->pixelformat, - pixmp->width, - pixmp->height); + sizeimage =venus_helper_get_framesz (pixmp->pixelformat, + pixmp->width, + pixmp->height); + pfmt[0 ].sizeimage =max (ALIGN (pfmt[0 ].sizeimage,SZ_4K ), sizeimage);if (f->type ==V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ) pfmt[0 ].bytesperline =ALIGN (pixmp->width,128 );
@@ -408,8 +410,10 @@ static int venc_s_fmt(struct file *file, void *fh, struct v4l2_format *f)if (f->type ==V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ) inst->fmt_out = fmt; -else if (f->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ) +else if (f->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ) { inst->fmt_cap = fmt; + inst->output_buf_size = pixmp->plane_fmt[0 ].sizeimage; + }return 0 ; }
@@ -908,6 +912,7 @@ static int venc_queue_setup(struct vb2_queue *q, sizes[0 ] =venus_helper_get_framesz (inst->fmt_cap->pixfmt, inst->width, inst->height); + sizes[0 ] =max (sizes[0 ], inst->output_buf_size); inst->output_buf_size = sizes[0 ];break ;default :
Signature · 1 line
1.9.1
Hi Malathi,
Quoted 49 lines · Malathi Gottam
Accept the buffer size requested by client and compare it against driver calculated size and set the maximum to bitstream plane.
Signed-off-by Malathi Gottam <[email protected]>--- drivers/media/platform/qcom/venus/venc.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)drivers/media/platform/qcom/venus/venc.c +8
-4@@ -303,6 +303,7 @@ static int venc_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdesc *f)struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;struct v4l2_plane_pix_format *pfmt = pixmp->plane_fmt;const struct venus_format *fmt; +__u32 sizeimage;memset (pfmt[0 ].reserved,0 ,sizeof (pfmt[0 ].reserved));memset (pixmp->reserved,0 ,sizeof (pixmp->reserved));@@ -334,9 +335,10 @@ static int venc_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdesc *f) pixmp->num_planes = fmt->num_planes; pixmp->flags =0 ; - pfmt[0 ].sizeimage =venus_helper_get_framesz (pixmp->pixelformat, - pixmp->width, - pixmp->height); + sizeimage =venus_helper_get_framesz (pixmp->pixelformat, + pixmp->width, + pixmp->height); + pfmt[0 ].sizeimage =max (ALIGN (pfmt[0 ].sizeimage,SZ_4K ), sizeimage);if (f->type ==V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ) pfmt[0 ].bytesperline =ALIGN (pixmp->width,128 );@@ -408,8 +410,10 @@ static int venc_s_fmt(struct file *file, void *fh, struct v4l2_format *f)if (f->type ==V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ) inst->fmt_out = fmt; -else if (f->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ) +else if (f->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ) { inst->fmt_cap = fmt; + inst->output_buf_size = pixmp->plane_fmt[0 ].sizeimage; + }return 0 ; }
drivers/media/platform/qcom/venus/venc.c static int venc_queue_setup(struct vb2_queue *q, · line 918
Quoted 7 lines
drivers/media/platform/qcom/venus/venc.c +1
-0@@ -908,6 +912,7 @@ static int venc_queue_setup(struct vb2_queue *q, sizes[0 ] =venus_helper_get_framesz (inst->fmt_cap->pixfmt, inst->width, inst->height); + sizes[0 ] =max (sizes[0 ], inst->output_buf_size); inst->output_buf_size = sizes[0 ];break ;default :
I think this should work, but don't we also need to do the same thing for the decoder's OUTPUT queue?
Hi Malathi,
thanks for the patch!
Quoted 14 lines · Malathi Gottam
Accept the buffer size requested by client and compare it against driver calculated size and set the maximum to bitstream plane.
Signed-off-by Malathi Gottam <[email protected]>--- drivers/media/platform/qcom/venus/venc.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)drivers/media/platform/qcom/venus/venc.c +0
-0
drivers/media/platform/qcom/venus/venc.c static int venc_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdesc *f) · line 306
Quoted 4 lines
drivers/media/platform/qcom/venus/venc.c +1
-0@@ -303,6 +303,7 @@ static int venc_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdesc *f)struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;struct v4l2_plane_pix_format *pfmt = pixmp->plane_fmt;const struct venus_format *fmt; +__u32 sizeimage;
please use u32 for kernel internal variables.
Otherwise looks good to me:
Quoted 38 lines
drivers/media/platform/qcom/venus/venc.c +8
-4memset (pfmt[0 ].reserved,0 ,sizeof (pfmt[0 ].reserved));memset (pixmp->reserved,0 ,sizeof (pixmp->reserved));@@ -334,9 +335,10 @@ static int venc_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdesc *f) pixmp->num_planes = fmt->num_planes; pixmp->flags =0 ; - pfmt[0 ].sizeimage =venus_helper_get_framesz (pixmp->pixelformat, - pixmp->width, - pixmp->height); + sizeimage =venus_helper_get_framesz (pixmp->pixelformat, + pixmp->width, + pixmp->height); + pfmt[0 ].sizeimage =max (ALIGN (pfmt[0 ].sizeimage,SZ_4K ), sizeimage);if (f->type ==V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ) pfmt[0 ].bytesperline =ALIGN (pixmp->width,128 );@@ -408,8 +410,10 @@ static int venc_s_fmt(struct file *file, void *fh, struct v4l2_format *f)if (f->type ==V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ) inst->fmt_out = fmt; -else if (f->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ) +else if (f->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ) { inst->fmt_cap = fmt; + inst->output_buf_size = pixmp->plane_fmt[0 ].sizeimage; + }return 0 ; }@@ -908,6 +912,7 @@ static int venc_queue_setup(struct vb2_queue *q, sizes[0 ] =venus_helper_get_framesz (inst->fmt_cap->pixfmt, inst->width, inst->height); + sizes[0 ] =max (sizes[0 ], inst->output_buf_size); inst->output_buf_size = sizes[0 ];break ;default :
Signature · 2 lines
regards, Stan