RK3288 VP8 decoding support
Subsystems (4)
v4 cover RK3288 VP8 decoding support
This patchset adds support for Hantro G1 VP8 stateless decoding, as available on RK3288 SoC.
In order to support VP8 stateless decoding, a new pixel format is introduced V4L2_PIX_FMT_VP8_FRAME, to be used with a new control V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER.
Changes in v4:
* Zero padding fields, and document this as a specification.
* Minor cosmetic changes.
Changes in v3:
* Validate num_dct_parts field, as suggested by Philipp. This fixes the kernel oops reported by Philipp.
* Add documentation for num_dct_parts constraint.
* Renamed macroblock_bit_offset to first_part_header_bits and fixed its documentation.
Changes in v2:
* Verified that all the fields in the uAPI come from the spec [1].
* Structures and fields have 8-bytes alignment and sizes, as suggested by Boris.
* Moved 1-bit fields to a bit in the appropriate flags fields.
* Dropped dequant_factors[4][3][2], I really couldn't find this field or anything similar in the spec. It's not mentioned anywhere in Chromium or FFMPEG, so I decided to drop it.
[1] https://www.rfc-editor.org/rfc/rfc6386.html
Ezequiel Garcia (2):
media: v4l2-ctrl: Move compound control validation
media: v4l2-ctrl: Validate VP8 stateless decoder controls
Pawel Osciak (1):
media: uapi: Add VP8 stateless decoder API
ZhiChao Yu (1):
media: hantro: Add support for VP8 decoding on rk3288
Documentation/media/uapi/v4l/biblio.rst | 10 + .../media/uapi/v4l/ext-ctrls-codec.rst | 323 +++++++++++ .../media/uapi/v4l/pixfmt-compressed.rst | 20 + drivers/media/v4l2-core/v4l2-ctrls.c | 157 ++++-- drivers/media/v4l2-core/v4l2-ioctl.c | 1 + drivers/staging/media/hantro/Makefile | 4 +- drivers/staging/media/hantro/hantro.h | 27 + drivers/staging/media/hantro/hantro_drv.c | 6 + .../staging/media/hantro/hantro_g1_vp8_dec.c | 526 ++++++++++++++++++ drivers/staging/media/hantro/hantro_hw.h | 17 + drivers/staging/media/hantro/hantro_v4l2.c | 1 + drivers/staging/media/hantro/hantro_vp8.c | 188 +++++++ drivers/staging/media/hantro/rk3288_vpu_hw.c | 22 +- include/media/v4l2-ctrls.h | 3 + include/media/vp8-ctrls.h | 110 ++++ 15 files changed, 1356 insertions(+), 59 deletions(-) create mode 100644 drivers/staging/media/hantro/hantro_g1_vp8_dec.c create mode 100644 drivers/staging/media/hantro/hantro_vp8.c create mode 100644 include/media/vp8-ctrls.h
Signature · 1 line
2.20.1
PATCH v4 1/4 media: v4l2-ctrl: Move compound control validation
Rework std_validate moving the compound controls to its own validation function.
While here, fix the pointer math to account the index parameter.
---
Changes from v3:
* None.
Changes from v2:
* New patch
--- drivers/media/v4l2-core/v4l2-ctrls.c | 126 +++++++++++++++------------ 1 file changed, 69 insertions(+), 57 deletions(-)
drivers/media/v4l2-core/v4l2-ctrls.c +69 -57
@@ -1629,10 +1629,77 @@ static void std_log(const struct v4l2_ctrl *ctrl) })/* Validate a new control */ +static int std_validate_compound (const struct v4l2_ctrl *ctrl,u32 idx, +union v4l2_ctrl_ptr ptr) +{ +struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params; +void *p = ptr.p + idx * ctrl->elem_size; + +switch ((u32 )ctrl->type) { +case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS : + p_mpeg2_slice_params = p; + +switch (p_mpeg2_slice_params->sequence.chroma_format) { +case 1 :/* 4:2:0 */ +case 2 :/* 4:2:2 */ +case 3 :/* 4:4:4 */ +break ; +default : +return -EINVAL ; + } + +switch (p_mpeg2_slice_params->picture.intra_dc_precision) { +case 0 :/* 8 bits */ +case 1 :/* 9 bits */ +case 2 :/* 10 bits */ +case 3 :/* 11 bits */ +break ; +default : +return -EINVAL ; + } + +switch (p_mpeg2_slice_params->picture.picture_structure) { +case 1 :/* interlaced top field */ +case 2 :/* interlaced bottom field */ +case 3 :/* progressive */ +break ; +default : +return -EINVAL ; + } + +switch (p_mpeg2_slice_params->picture.picture_coding_type) { +case V4L2_MPEG2_PICTURE_CODING_TYPE_I : +case V4L2_MPEG2_PICTURE_CODING_TYPE_P : +case V4L2_MPEG2_PICTURE_CODING_TYPE_B : +break ; +default : +return -EINVAL ; + } + +break ; + +case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION : +break ; + +case V4L2_CTRL_TYPE_FWHT_PARAMS : +break ; + +case V4L2_CTRL_TYPE_H264_SPS : +case V4L2_CTRL_TYPE_H264_PPS : +case V4L2_CTRL_TYPE_H264_SCALING_MATRIX : +case V4L2_CTRL_TYPE_H264_SLICE_PARAMS : +case V4L2_CTRL_TYPE_H264_DECODE_PARAMS : +break ; +default : +return -EINVAL ; + } + +return 0 ; +} +static int std_validate (const struct v4l2_ctrl *ctrl,u32 idx,union v4l2_ctrl_ptr ptr) { -struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;size_t len;u64 offset;s64 val;
@@ -1695,63 +1762,8 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,return -ERANGE ;return 0 ; -case V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS : - p_mpeg2_slice_params = ptr.p; - -switch (p_mpeg2_slice_params->sequence.chroma_format) { -case 1 :/* 4:2:0 */ -case 2 :/* 4:2:2 */ -case 3 :/* 4:4:4 */ -break ; -default : -return -EINVAL ; - } - -switch (p_mpeg2_slice_params->picture.intra_dc_precision) { -case 0 :/* 8 bits */ -case 1 :/* 9 bits */ -case 2 :/* 10 bits */ -case 3 :/* 11 bits */ -break ; -default : -return -EINVAL ; - } - -switch (p_mpeg2_slice_params->picture.picture_structure) { -case 1 :/* interlaced top field */ -case 2 :/* interlaced bottom field */ -case 3 :/* progressive */ -break ; -default : -return -EINVAL ; - } - -switch (p_mpeg2_slice_params->picture.picture_coding_type) { -case V4L2_MPEG2_PICTURE_CODING_TYPE_I : -case V4L2_MPEG2_PICTURE_CODING_TYPE_P : -case V4L2_MPEG2_PICTURE_CODING_TYPE_B : -break ; -default : -return -EINVAL ; - } - -return 0 ; - -case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION : -return 0 ; - -case V4L2_CTRL_TYPE_FWHT_PARAMS : -return 0 ; - -case V4L2_CTRL_TYPE_H264_SPS : -case V4L2_CTRL_TYPE_H264_PPS : -case V4L2_CTRL_TYPE_H264_SCALING_MATRIX : -case V4L2_CTRL_TYPE_H264_SLICE_PARAMS : -case V4L2_CTRL_TYPE_H264_DECODE_PARAMS : -return 0 ; -default : -return -EINVAL ; +return std_validate_compound (ctrl, idx, ptr); } }
Signature · 1 line
2.20.1
PATCH v4 2/4 media: uapi: Add VP8 stateless decoder API
In reply to Ezequiel GarciaFrom: Pawel Osciak <[email protected]>
Add the parsed VP8 frame pixel format and controls, to be used with the new stateless decoder API for VP8 to provide parameters for accelerator (aka stateless) codecs.
--
Changes from v3:
* s/VP8 FRAME/VP8 Frame
* Specify zeroing of padding fields in the documentation.
Changes from v2:
* Rename and document macroblock_bit_offset to first_part_header_bits.
* Document num_dct_part constraints.
Changes from v1:
* Move 1-bit fields to flags in the respective structures.
* Add padding fields to make all structures 8-byte aligned.
* Reorder fields where needed to avoid padding as much as possible.
* Fix documentation as needed.
Changes from RFC:
* Make sure the uAPI has the same size on x86, x86_64, arm and arm64.
* Move entropy coder state fields to a struct.
* Move key_frame field to the flags.
* Remove unneeded first_part_offset field.
* Add documentation.
--- Documentation/media/uapi/v4l/biblio.rst | 10 + .../media/uapi/v4l/ext-ctrls-codec.rst | 323 ++++++++++++++++++ .../media/uapi/v4l/pixfmt-compressed.rst | 20 ++ drivers/media/v4l2-core/v4l2-ctrls.c | 10 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/media/v4l2-ctrls.h | 3 + include/media/vp8-ctrls.h | 110 ++++++ 7 files changed, 477 insertions(+) create mode 100644 include/media/vp8-ctrls.h
Documentation/media/uapi/v4l/biblio.rst +10 -0
@@ -395,3 +395,13 @@ colimg :title: Color Imaging: Fundamentals and Applications :author: Erik Reinhard et al. + +.. _vp8: + +VP8 +=== + + +:title: RFC 6386: "VP8 Data Format and Decoding Guide" + +:author: J. Bankoski et al.
Documentation/media/uapi/v4l/ext-ctrls-codec.rst +323 -0
329 lines not on this page · raw message
Documentation/media/uapi/v4l/pixfmt-compressed.rst +20 -0
@@ -133,6 +133,26 @@ Compressed Formats - ``V4L2_PIX_FMT_VP8`` - 'VP80' - VP8 video elementary stream. + * .. _V4L2-PIX-FMT-VP8-FRAME: + + - ``V4L2_PIX_FMT_VP8_FRAME`` + - 'VP8F' + - VP8 parsed frame, as extracted from the container. + This format is adapted for stateless video decoders that implement a + VP8 pipeline (using the :ref:`mem2mem` and :ref:`media-request-api`). + Metadata associated with the frame to decode is required to be passed + through the ``V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER`` control. + See the :ref:`associated Codec Control IDs <v4l2-mpeg-vp8>`. + Exactly one output and one capture buffer must be provided for use with + this pixel format. The output buffer must contain the appropriate number + of macroblocks to decode a full corresponding frame to the matching + capture buffer. + + .. note:: + + This format is not yet part of the public kernel API and it + is expected to change. + * .. _V4L2-PIX-FMT-VP9: - ``V4L2_PIX_FMT_VP9``
drivers/media/v4l2-core/v4l2-ctrls.c +10 -0
@@ -885,6 +885,7 @@ const char *v4l2_ctrl_get_name(u32 id)case V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP :return "VPX P-Frame QP Value" ;case V4L2_CID_MPEG_VIDEO_VP8_PROFILE :return "VP8 Profile" ;case V4L2_CID_MPEG_VIDEO_VP9_PROFILE :return "VP9 Profile" ; +case V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER :return "VP8 Frame Header" ;/* HEVC controls */ case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP :return "HEVC I-Frame QP Value" ;
@@ -1345,6 +1346,9 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS : *type =V4L2_CTRL_TYPE_H264_DECODE_PARAMS ;break ; +case V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER : + *type =V4L2_CTRL_TYPE_VP8_FRAME_HEADER ; +break ;default : *type =V4L2_CTRL_TYPE_INTEGER ;break ;
@@ -1690,6 +1694,9 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,case V4L2_CTRL_TYPE_H264_SLICE_PARAMS :case V4L2_CTRL_TYPE_H264_DECODE_PARAMS :break ; + +case V4L2_CTRL_TYPE_VP8_FRAME_HEADER : +break ;default :return -EINVAL ; }
@@ -2360,6 +2367,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,case V4L2_CTRL_TYPE_H264_DECODE_PARAMS : elem_size =sizeof (struct v4l2_ctrl_h264_decode_params );break ; +case V4L2_CTRL_TYPE_VP8_FRAME_HEADER : + elem_size =sizeof (struct v4l2_ctrl_vp8_frame_header ); +break ;default :if (type <V4L2_CTRL_COMPOUND_TYPES ) elem_size =sizeof (s32);
drivers/media/v4l2-core/v4l2-ioctl.c +1 -0
@@ -1331,6 +1331,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_VC1_ANNEX_G : descr ="VC-1 (SMPTE 412M Annex G)" ;break ;case V4L2_PIX_FMT_VC1_ANNEX_L : descr ="VC-1 (SMPTE 412M Annex L)" ;break ;case V4L2_PIX_FMT_VP8 : descr ="VP8" ;break ; +case V4L2_PIX_FMT_VP8_FRAME : descr ="VP8 Frame" ;break ;case V4L2_PIX_FMT_VP9 : descr ="VP9" ;break ;case V4L2_PIX_FMT_HEVC : descr ="HEVC" ;break ;/* aka H.265 */ case V4L2_PIX_FMT_FWHT : descr ="FWHT" ;break ;/* used in vicodec */
include/media/v4l2-ctrls.h +3 -0
@@ -20,6 +20,7 @@#include <media/mpeg2-ctrls.h> #include <media/fwht-ctrls.h> #include <media/h264-ctrls.h> +#include <media/vp8-ctrls.h> /* forward references */ struct file ;
@@ -48,6 +49,7 @@ struct poll_table_struct;* @p_h264_scaling_matrix: Pointer to a struct v4l2_ctrl_h264_scaling_matrix. * @p_h264_slice_params: Pointer to a struct v4l2_ctrl_h264_slice_params. * @p_h264_decode_params: Pointer to a struct v4l2_ctrl_h264_decode_params. +* @p_vp8_frame_header: Pointer to a VP8 frame header structure. * @p: Pointer to a compound value. */ union v4l2_ctrl_ptr {
@@ -65,6 +67,7 @@ union v4l2_ctrl_ptr {struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix;struct v4l2_ctrl_h264_slice_params *p_h264_slice_params;struct v4l2_ctrl_h264_decode_params *p_h264_decode_params; +struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header;void *p; };
include/media/vp8-ctrls.h new file +110 -0
110 lines not on this page · raw message
Signature · 1 line
2.20.1
PATCH v4 3/4 media: v4l2-ctrl: Validate VP8 stateless decoder controls
In reply to Ezequiel GarciaOnly one field needs to be validated: 'num_dct_parts'. This field is used to iterate over the user-provided array 'dct_part_sizes'.
---
Changes from v3:
* Zero padding fields, as pointed out by Hans.
Changes from v2:
* New patch
--- drivers/media/v4l2-core/v4l2-ctrls.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/media/v4l2-core/v4l2-ctrls.c +21 -0
@@ -1633,10 +1633,15 @@ static void std_log(const struct v4l2_ctrl *ctrl) })/* Validate a new control */ + +#define zero_padding (s) \ + memset(&s.padding, 0, sizeof(s.padding)) +static int std_validate_compound (const struct v4l2_ctrl *ctrl,u32 idx,union v4l2_ctrl_ptr ptr) {struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params; +struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header;void *p = ptr.p + idx * ctrl->elem_size;switch ((u32 )ctrl->type) {
@@ -1696,6 +1701,22 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,break ;case V4L2_CTRL_TYPE_VP8_FRAME_HEADER : + p_vp8_frame_header = p; + +switch (p_vp8_frame_header->num_dct_parts) { +case 1 : +case 2 : +case 4 : +case 8 : +break ; +default : +return -EINVAL ; + } +zero_padding (p_vp8_frame_header->segment_header); +zero_padding (p_vp8_frame_header->lf_header); +zero_padding (p_vp8_frame_header->quant_header); +zero_padding (p_vp8_frame_header->entropy_header); +zero_padding (p_vp8_frame_header->coder_state);break ;default :return -EINVAL ;
Signature · 1 line
2.20.1
PATCH v4 4/4 media: hantro: Add support for VP8 decoding on rk3288
In reply to Ezequiel GarciaFrom: ZhiChao Yu <[email protected]>
Introduce VP8 decoding support in RK3288.
---
Changes from v3:
* Minor change, correct wrong dma_addr_t type.
Changes from v2:
* Minor cosmetic cleanups in variable declarations and comments.
* Add MB_WIDTH and MB_HEIGHT macros.
Changes from v1:
* Place operators at the end of each line.
* Update to uAPI changes.
--- drivers/staging/media/hantro/Makefile | 4 +- drivers/staging/media/hantro/hantro.h | 27 + drivers/staging/media/hantro/hantro_drv.c | 6 + .../staging/media/hantro/hantro_g1_vp8_dec.c | 526 ++++++++++++++++++ drivers/staging/media/hantro/hantro_hw.h | 17 + drivers/staging/media/hantro/hantro_v4l2.c | 1 + drivers/staging/media/hantro/hantro_vp8.c | 188 +++++++ drivers/staging/media/hantro/rk3288_vpu_hw.c | 22 +- 8 files changed, 789 insertions(+), 2 deletions(-) create mode 100644 drivers/staging/media/hantro/hantro_g1_vp8_dec.c create mode 100644 drivers/staging/media/hantro/hantro_vp8.c
drivers/staging/media/hantro/Makefile +3 -1
@@ -5,10 +5,12 @@ hantro-vpu-y += \ hantro_v4l2.o \ hantro_h1_jpeg_enc.o \ hantro_g1_mpeg2_dec.o \ + hantro_g1_vp8_dec.o \ rk3399_vpu_hw_jpeg_enc.o \ rk3399_vpu_hw_mpeg2_dec.o \ hantro_jpeg.o \ - hantro_mpeg2.o + hantro_mpeg2.o \ + hantro_vp8.o hantro-vpu-$(CONFIG_VIDEO_HANTRO_ROCKCHIP) += \ rk3288_vpu_hw.o \
drivers/staging/media/hantro/hantro.h +27 -0
@@ -25,6 +25,10 @@#include "hantro_hw.h" +#define VP8_MB_DIM 16 +#define VP8_MB_WIDTH (w) DIV_ROUND_UP(w, VP8_MB_DIM) +#define VP8_MB_HEIGHT (h) DIV_ROUND_UP(h, VP8_MB_DIM) +#define MPEG2_MB_DIM 16#define MPEG2_MB_WIDTH (w) DIV_ROUND_UP(w, MPEG2_MB_DIM)#define MPEG2_MB_HEIGHT (h) DIV_ROUND_UP(h, MPEG2_MB_DIM)
@@ -40,6 +44,7 @@ struct hantro_codec_ops;#define HANTRO_ENCODERS 0x0000ffff#define HANTRO_MPEG2_DECODER BIT(16) +#define HANTRO_VP8_DECODER BIT(17)#define HANTRO_DECODERS 0xffff0000/**
@@ -97,11 +102,13 @@ struct hantro_variant {* @HANTRO_MODE_NONE: No operating mode. Used for RAW video formats. * @HANTRO_MODE_JPEG_ENC: JPEG encoder. * @HANTRO_MODE_MPEG2_DEC: MPEG-2 decoder. +* @HANTRO_MODE_VP8_DEC: VP8 decoder. */ enum hantro_codec_mode {HANTRO_MODE_NONE =-1 ,HANTRO_MODE_JPEG_ENC ,HANTRO_MODE_MPEG2_DEC , +HANTRO_MODE_VP8_DEC , };/*
@@ -215,6 +222,7 @@ struct hantro_dev {* @codec_ops: Set of operations related to codec mode. * @jpeg_enc: JPEG-encoding context. * @mpeg2_dec: MPEG-2-decoding context. +* @vp8_dec: VP8-decoding context. */ struct hantro_ctx {struct hantro_dev *dev;
@@ -241,6 +249,7 @@ struct hantro_ctx {union {struct hantro_jpeg_enc_hw_ctx jpeg_enc;struct hantro_mpeg2_dec_hw_ctx mpeg2_dec; +struct hantro_vp8_dec_hw_ctx vp8_dec; }; };
@@ -265,6 +274,12 @@ struct hantro_fmt {struct v4l2_frmsize_stepwise frmsize; }; +struct hantro_reg { +u32 base; +u32 shift; +u32 mask; +}; +/* Logging helpers */ /**
@@ -343,6 +358,18 @@ static inline u32 vdpu_read(struct hantro_dev *vpu, u32 reg)return val; } +static inline void hantro_reg_write (struct hantro_dev *vpu, +const struct hantro_reg *reg, +u32 val) +{ +u32 v; + + v =vdpu_read (vpu, reg->base); + v &= ~(reg->mask << reg->shift); + v |= ((val & reg->mask) << reg->shift); +vdpu_write_relaxed (vpu, v, reg->base); +} +bool hantro_is_encoder_ctx (const struct hantro_ctx *ctx);void *hantro_get_ctrl (struct hantro_ctx *ctx,u32 id);
drivers/staging/media/hantro/hantro_drv.c +6 -0
@@ -284,6 +284,12 @@ static struct hantro_ctrl controls[] = { .cfg = { .elem_size = sizeof(struct v4l2_ctrl_mpeg2_quantization), }, + }, { + .id = V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER, + .codec = HANTRO_VP8_DECODER, + .cfg = { + .elem_size = sizeof(struct v4l2_ctrl_vp8_frame_header), + }, }, };
drivers/staging/media/hantro/hantro_g1_vp8_dec.c new file +526 -0
526 lines not on this page · raw message
drivers/staging/media/hantro/hantro_hw.h +17 -0
@@ -12,6 +12,7 @@#include <linux/interrupt.h> #include <linux/v4l2-controls.h> #include <media/mpeg2-ctrls.h> +#include <media/vp8-ctrls.h> #include <media/videobuf2-core.h> struct hantro_dev ;
@@ -47,6 +48,16 @@ struct hantro_mpeg2_dec_hw_ctx {struct hantro_aux_buf qtable; }; +/** +* struct hantro_vp8d_hw_ctx +* @segment_map: Segment map buffer. +* @prob_tbl: Probability table buffer. +*/ +struct hantro_vp8_dec_hw_ctx { +struct hantro_aux_buf segment_map; +struct hantro_aux_buf prob_tbl; +}; +/** * struct hantro_codec_ops - codec mode specific operations *
@@ -99,4 +110,10 @@ void hantro_mpeg2_dec_copy_qtable(u8 *qtable,int hantro_mpeg2_dec_init (struct hantro_ctx *ctx);void hantro_mpeg2_dec_exit (struct hantro_ctx *ctx); +void hantro_g1_vp8_dec_run (struct hantro_ctx *ctx); +int hantro_vp8_dec_init (struct hantro_ctx *ctx); +void hantro_vp8_dec_exit (struct hantro_ctx *ctx); +void hantro_vp8_prob_update (struct hantro_ctx *ctx, +const struct v4l2_ctrl_vp8_frame_header *hdr); +#endif /* HANTRO_HW_H_ */
drivers/staging/media/hantro/hantro_v4l2.c +1 -0
@@ -344,6 +344,7 @@ hantro_update_requires_request(struct hantro_ctx *ctx, u32 fourcc) ctx->fh.m2m_ctx->out_q_ctx.q.requires_requests = false;break ;case V4L2_PIX_FMT_MPEG2_SLICE : +case V4L2_PIX_FMT_VP8_FRAME : ctx->fh.m2m_ctx->out_q_ctx.q.requires_requests = true;break ;default :
drivers/staging/media/hantro/hantro_vp8.c new file +188 -0
188 lines not on this page · raw message
drivers/staging/media/hantro/rk3288_vpu_hw.c +21 -1
@@ -74,6 +74,19 @@ static const struct hantro_fmt rk3288_vpu_dec_fmts[] = { .step_height = MPEG2_MB_DIM, }, }, + { + .fourcc = V4L2_PIX_FMT_VP8_FRAME, + .codec_mode = HANTRO_MODE_VP8_DEC, + .max_depth = 2, + .frmsize = { + .min_width = 48, + .max_width = 3840, + .step_width = VP8_MB_DIM, + .min_height = 48, + .max_height = 2160, + .step_height = VP8_MB_DIM, + }, + }, };static irqreturn_t rk3288_vepu_irq (int irq,void *dev_id)
@@ -155,6 +168,12 @@ static const struct hantro_codec_ops rk3288_vpu_codec_ops[] = { .init = hantro_mpeg2_dec_init, .exit = hantro_mpeg2_dec_exit, }, + [HANTRO_MODE_VP8_DEC] = { + .run = hantro_g1_vp8_dec_run, + .reset = rk3288_vpu_dec_reset, + .init = hantro_vp8_dec_init, + .exit = hantro_vp8_dec_exit, + }, };/*
@@ -177,7 +196,8 @@ const struct hantro_variant rk3288_vpu_variant = { .dec_offset = 0x400, .dec_fmts = rk3288_vpu_dec_fmts, .num_dec_fmts = ARRAY_SIZE(rk3288_vpu_dec_fmts), - .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER, + .codec =HANTRO_JPEG_ENCODER |HANTRO_MPEG2_DECODER | + HANTRO_VP8_DECODER, .codec_ops = rk3288_vpu_codec_ops, .irqs = rk3288_irqs, .num_irqs = ARRAY_SIZE(rk3288_irqs),
Signature · 1 line
2.20.1