On 6/9/19 4:38 PM, Maxime Jourdan wrote:
> Tag all the coded formats where the venus vdec supports dynamic
> resolution switching.
>
> Signed-off-by: Maxime Jourdan <[email protected]>
> ---
> drivers/media/platform/qcom/venus/core.h | 1 +
> drivers/media/platform/qcom/venus/vdec.c | 11 +++++++++++
> 2 files changed, 12 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/venus/core.h
> b/drivers/media/platform/qcom/venus/core.h
> index 7a3feb5cee00..74eb42668627 100644
> --- a/drivers/media/platform/qcom/venus/core.h
> +++ b/drivers/media/platform/qcom/venus/core.h
> @@ -55,6 +55,7 @@ struct venus_format {
> u32 pixfmt;
> unsigned int num_planes;
> u32 type;
> + u32 flags;
> };
>
> #define MAX_PLANES 4
> diff --git a/drivers/media/platform/qcom/venus/vdec.c
> b/drivers/media/platform/qcom/venus/vdec.c
> index 2a47b9b8c5bc..8aabc23966b8 100644
> --- a/drivers/media/platform/qcom/venus/vdec.c
> +++ b/drivers/media/platform/qcom/venus/vdec.c
> @@ -46,42 +46,52 @@ static const struct venus_format vdec_formats[] = {
> .pixfmt = V4L2_PIX_FMT_MPEG4,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> }, {
> .pixfmt = V4L2_PIX_FMT_MPEG2,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> }, {
> .pixfmt = V4L2_PIX_FMT_H263,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> }, {
> .pixfmt = V4L2_PIX_FMT_VC1_ANNEX_G,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> }, {
> .pixfmt = V4L2_PIX_FMT_VC1_ANNEX_L,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> }, {
> .pixfmt = V4L2_PIX_FMT_H264,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> }, {
> .pixfmt = V4L2_PIX_FMT_VP8,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> }, {
> .pixfmt = V4L2_PIX_FMT_VP9,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> }, {
> .pixfmt = V4L2_PIX_FMT_XVID,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> }, {
> .pixfmt = V4L2_PIX_FMT_HEVC,
> .num_planes = 1,
> .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> + .flags = V4L2_FMT_FLAG_DYN_RESOLUTION,
> },
> };
>
> @@ -360,6 +370,7 @@ static int vdec_enum_fmt(struct file *file, void *fh,
> struct v4l2_fmtdesc *f)
> return -EINVAL;
>
> f->pixelformat = fmt->pixfmt;
> + f->flags = fmt->flags;
Ah, there is a bug in v4l_fill_fmtdesc() in v4l2-ioctl.c: at the end
fmt->flags overwritten, so the V4L2_FMT_FLAG_DYN_RESOLUTION is cleared
again. That line in v4l_fill_fmtdesc() should be |=.
Regards,
Hans
>
> return 0;
> }
>