media: mediatek: vcodec: support stateless hevc decoder
Add mediatek hevc decoder linux driver which use the stateless API in MT8195. Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Tested-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Tested-by: Nathan Hebert <nhebert@chromium.org> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> [hverkuil: add () around 'flag' in macro]
This commit is contained in:
parent
ae440c5da3
commit
2674486aac
6 changed files with 1162 additions and 1 deletions
|
@ -13,6 +13,7 @@ mtk-vcodec-dec-y := vdec/vdec_h264_if.o \
|
||||||
vdec/vdec_h264_req_if.o \
|
vdec/vdec_h264_req_if.o \
|
||||||
vdec/vdec_h264_req_common.o \
|
vdec/vdec_h264_req_common.o \
|
||||||
vdec/vdec_h264_req_multi_if.o \
|
vdec/vdec_h264_req_multi_if.o \
|
||||||
|
vdec/vdec_hevc_req_multi_if.o \
|
||||||
mtk_vcodec_dec_drv.o \
|
mtk_vcodec_dec_drv.o \
|
||||||
vdec_drv_if.o \
|
vdec_drv_if.o \
|
||||||
vdec_vpu_if.o \
|
vdec_vpu_if.o \
|
||||||
|
|
|
@ -107,11 +107,63 @@ static const struct mtk_stateless_control mtk_stateless_controls[] = {
|
||||||
},
|
},
|
||||||
.codec_type = V4L2_PIX_FMT_VP9_FRAME,
|
.codec_type = V4L2_PIX_FMT_VP9_FRAME,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.cfg = {
|
||||||
|
.id = V4L2_CID_STATELESS_HEVC_SPS,
|
||||||
|
},
|
||||||
|
.codec_type = V4L2_PIX_FMT_HEVC_SLICE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cfg = {
|
||||||
|
.id = V4L2_CID_STATELESS_HEVC_PPS,
|
||||||
|
},
|
||||||
|
.codec_type = V4L2_PIX_FMT_HEVC_SLICE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cfg = {
|
||||||
|
.id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX,
|
||||||
|
},
|
||||||
|
.codec_type = V4L2_PIX_FMT_HEVC_SLICE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cfg = {
|
||||||
|
.id = V4L2_CID_STATELESS_HEVC_DECODE_PARAMS,
|
||||||
|
},
|
||||||
|
.codec_type = V4L2_PIX_FMT_HEVC_SLICE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cfg = {
|
||||||
|
.id = V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,
|
||||||
|
.def = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
|
||||||
|
.max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10,
|
||||||
|
.menu_skip_mask =
|
||||||
|
BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE),
|
||||||
|
},
|
||||||
|
.codec_type = V4L2_PIX_FMT_HEVC_SLICE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cfg = {
|
||||||
|
.id = V4L2_CID_STATELESS_HEVC_DECODE_MODE,
|
||||||
|
.min = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED,
|
||||||
|
.def = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED,
|
||||||
|
.max = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED,
|
||||||
|
},
|
||||||
|
.codec_type = V4L2_PIX_FMT_HEVC_SLICE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cfg = {
|
||||||
|
.id = V4L2_CID_STATELESS_HEVC_START_CODE,
|
||||||
|
.min = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B,
|
||||||
|
.def = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B,
|
||||||
|
.max = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B,
|
||||||
|
},
|
||||||
|
.codec_type = V4L2_PIX_FMT_HEVC_SLICE,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NUM_CTRLS ARRAY_SIZE(mtk_stateless_controls)
|
#define NUM_CTRLS ARRAY_SIZE(mtk_stateless_controls)
|
||||||
|
|
||||||
static struct mtk_video_fmt mtk_video_formats[5];
|
static struct mtk_video_fmt mtk_video_formats[6];
|
||||||
|
|
||||||
static struct mtk_video_fmt default_out_format;
|
static struct mtk_video_fmt default_out_format;
|
||||||
static struct mtk_video_fmt default_cap_format;
|
static struct mtk_video_fmt default_cap_format;
|
||||||
|
@ -356,6 +408,7 @@ static void mtk_vcodec_add_formats(unsigned int fourcc,
|
||||||
case V4L2_PIX_FMT_H264_SLICE:
|
case V4L2_PIX_FMT_H264_SLICE:
|
||||||
case V4L2_PIX_FMT_VP8_FRAME:
|
case V4L2_PIX_FMT_VP8_FRAME:
|
||||||
case V4L2_PIX_FMT_VP9_FRAME:
|
case V4L2_PIX_FMT_VP9_FRAME:
|
||||||
|
case V4L2_PIX_FMT_HEVC_SLICE:
|
||||||
mtk_video_formats[count_formats].fourcc = fourcc;
|
mtk_video_formats[count_formats].fourcc = fourcc;
|
||||||
mtk_video_formats[count_formats].type = MTK_FMT_DEC;
|
mtk_video_formats[count_formats].type = MTK_FMT_DEC;
|
||||||
mtk_video_formats[count_formats].num_planes = 1;
|
mtk_video_formats[count_formats].num_planes = 1;
|
||||||
|
@ -412,6 +465,10 @@ static void mtk_vcodec_get_supported_formats(struct mtk_vcodec_ctx *ctx)
|
||||||
mtk_vcodec_add_formats(V4L2_PIX_FMT_VP9_FRAME, ctx);
|
mtk_vcodec_add_formats(V4L2_PIX_FMT_VP9_FRAME, ctx);
|
||||||
out_format_count++;
|
out_format_count++;
|
||||||
}
|
}
|
||||||
|
if (ctx->dev->dec_capability & MTK_VDEC_FORMAT_HEVC_FRAME) {
|
||||||
|
mtk_vcodec_add_formats(V4L2_PIX_FMT_HEVC_SLICE, ctx);
|
||||||
|
out_format_count++;
|
||||||
|
}
|
||||||
|
|
||||||
if (cap_format_count)
|
if (cap_format_count)
|
||||||
default_cap_format = mtk_video_formats[cap_format_count - 1];
|
default_cap_format = mtk_video_formats[cap_format_count - 1];
|
||||||
|
|
|
@ -347,6 +347,7 @@ enum mtk_vdec_format_types {
|
||||||
MTK_VDEC_FORMAT_H264_SLICE = 0x100,
|
MTK_VDEC_FORMAT_H264_SLICE = 0x100,
|
||||||
MTK_VDEC_FORMAT_VP8_FRAME = 0x200,
|
MTK_VDEC_FORMAT_VP8_FRAME = 0x200,
|
||||||
MTK_VDEC_FORMAT_VP9_FRAME = 0x400,
|
MTK_VDEC_FORMAT_VP9_FRAME = 0x400,
|
||||||
|
MTK_VDEC_FORMAT_HEVC_FRAME = 0x1000,
|
||||||
MTK_VCODEC_INNER_RACING = 0x20000,
|
MTK_VCODEC_INNER_RACING = 0x20000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
1097
drivers/media/platform/mediatek/vcodec/vdec/vdec_hevc_req_multi_if.c
Normal file
1097
drivers/media/platform/mediatek/vcodec/vdec/vdec_hevc_req_multi_if.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -49,6 +49,10 @@ int vdec_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc)
|
||||||
ctx->dec_if = &vdec_vp9_slice_lat_if;
|
ctx->dec_if = &vdec_vp9_slice_lat_if;
|
||||||
ctx->hw_id = IS_VDEC_LAT_ARCH(hw_arch) ? MTK_VDEC_LAT0 : MTK_VDEC_CORE;
|
ctx->hw_id = IS_VDEC_LAT_ARCH(hw_arch) ? MTK_VDEC_LAT0 : MTK_VDEC_CORE;
|
||||||
break;
|
break;
|
||||||
|
case V4L2_PIX_FMT_HEVC_SLICE:
|
||||||
|
ctx->dec_if = &vdec_hevc_slice_multi_if;
|
||||||
|
ctx->hw_id = MTK_VDEC_LAT0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,7 @@ extern const struct vdec_common_if vdec_vp8_if;
|
||||||
extern const struct vdec_common_if vdec_vp8_slice_if;
|
extern const struct vdec_common_if vdec_vp8_slice_if;
|
||||||
extern const struct vdec_common_if vdec_vp9_if;
|
extern const struct vdec_common_if vdec_vp9_if;
|
||||||
extern const struct vdec_common_if vdec_vp9_slice_lat_if;
|
extern const struct vdec_common_if vdec_vp9_slice_lat_if;
|
||||||
|
extern const struct vdec_common_if vdec_hevc_slice_multi_if;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vdec_if_init() - initialize decode driver
|
* vdec_if_init() - initialize decode driver
|
||||||
|
|
Loading…
Add table
Reference in a new issue