18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * These are the VP8 state controls for use with stateless VP8
48c2ecf20Sopenharmony_ci * codec drivers.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * It turns out that these structs are not stable yet and will undergo
78c2ecf20Sopenharmony_ci * more changes. So keep them private until they are stable and ready to
88c2ecf20Sopenharmony_ci * become part of the official public API.
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#ifndef _VP8_CTRLS_H_
128c2ecf20Sopenharmony_ci#define _VP8_CTRLS_H_
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <linux/types.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#define V4L2_PIX_FMT_VP8_FRAME v4l2_fourcc('V', 'P', '8', 'F')
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#define V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER (V4L2_CID_MPEG_BASE + 2000)
198c2ecf20Sopenharmony_ci#define V4L2_CTRL_TYPE_VP8_FRAME_HEADER 0x301
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#define V4L2_VP8_SEGMENT_HEADER_FLAG_ENABLED              0x01
228c2ecf20Sopenharmony_ci#define V4L2_VP8_SEGMENT_HEADER_FLAG_UPDATE_MAP           0x02
238c2ecf20Sopenharmony_ci#define V4L2_VP8_SEGMENT_HEADER_FLAG_UPDATE_FEATURE_DATA  0x04
248c2ecf20Sopenharmony_ci#define V4L2_VP8_SEGMENT_HEADER_FLAG_DELTA_VALUE_MODE     0x08
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistruct v4l2_vp8_segment_header {
278c2ecf20Sopenharmony_ci	__s8 quant_update[4];
288c2ecf20Sopenharmony_ci	__s8 lf_update[4];
298c2ecf20Sopenharmony_ci	__u8 segment_probs[3];
308c2ecf20Sopenharmony_ci	__u8 padding;
318c2ecf20Sopenharmony_ci	__u32 flags;
328c2ecf20Sopenharmony_ci};
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#define V4L2_VP8_LF_HEADER_ADJ_ENABLE	0x01
358c2ecf20Sopenharmony_ci#define V4L2_VP8_LF_HEADER_DELTA_UPDATE	0x02
368c2ecf20Sopenharmony_ci#define V4L2_VP8_LF_FILTER_TYPE_SIMPLE	0x04
378c2ecf20Sopenharmony_cistruct v4l2_vp8_loopfilter_header {
388c2ecf20Sopenharmony_ci	__s8 ref_frm_delta[4];
398c2ecf20Sopenharmony_ci	__s8 mb_mode_delta[4];
408c2ecf20Sopenharmony_ci	__u8 sharpness_level;
418c2ecf20Sopenharmony_ci	__u8 level;
428c2ecf20Sopenharmony_ci	__u16 padding;
438c2ecf20Sopenharmony_ci	__u32 flags;
448c2ecf20Sopenharmony_ci};
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cistruct v4l2_vp8_quantization_header {
478c2ecf20Sopenharmony_ci	__u8 y_ac_qi;
488c2ecf20Sopenharmony_ci	__s8 y_dc_delta;
498c2ecf20Sopenharmony_ci	__s8 y2_dc_delta;
508c2ecf20Sopenharmony_ci	__s8 y2_ac_delta;
518c2ecf20Sopenharmony_ci	__s8 uv_dc_delta;
528c2ecf20Sopenharmony_ci	__s8 uv_ac_delta;
538c2ecf20Sopenharmony_ci	__u16 padding;
548c2ecf20Sopenharmony_ci};
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_cistruct v4l2_vp8_entropy_header {
578c2ecf20Sopenharmony_ci	__u8 coeff_probs[4][8][3][11];
588c2ecf20Sopenharmony_ci	__u8 y_mode_probs[4];
598c2ecf20Sopenharmony_ci	__u8 uv_mode_probs[3];
608c2ecf20Sopenharmony_ci	__u8 mv_probs[2][19];
618c2ecf20Sopenharmony_ci	__u8 padding[3];
628c2ecf20Sopenharmony_ci};
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cistruct v4l2_vp8_entropy_coder_state {
658c2ecf20Sopenharmony_ci	__u8 range;
668c2ecf20Sopenharmony_ci	__u8 value;
678c2ecf20Sopenharmony_ci	__u8 bit_count;
688c2ecf20Sopenharmony_ci	__u8 padding;
698c2ecf20Sopenharmony_ci};
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci#define V4L2_VP8_FRAME_HEADER_FLAG_KEY_FRAME		0x01
728c2ecf20Sopenharmony_ci#define V4L2_VP8_FRAME_HEADER_FLAG_EXPERIMENTAL		0x02
738c2ecf20Sopenharmony_ci#define V4L2_VP8_FRAME_HEADER_FLAG_SHOW_FRAME		0x04
748c2ecf20Sopenharmony_ci#define V4L2_VP8_FRAME_HEADER_FLAG_MB_NO_SKIP_COEFF	0x08
758c2ecf20Sopenharmony_ci#define V4L2_VP8_FRAME_HEADER_FLAG_SIGN_BIAS_GOLDEN	0x10
768c2ecf20Sopenharmony_ci#define V4L2_VP8_FRAME_HEADER_FLAG_SIGN_BIAS_ALT	0x20
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci#define VP8_FRAME_IS_KEY_FRAME(hdr) \
798c2ecf20Sopenharmony_ci	(!!((hdr)->flags & V4L2_VP8_FRAME_HEADER_FLAG_KEY_FRAME))
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistruct v4l2_ctrl_vp8_frame_header {
828c2ecf20Sopenharmony_ci	struct v4l2_vp8_segment_header segment_header;
838c2ecf20Sopenharmony_ci	struct v4l2_vp8_loopfilter_header lf_header;
848c2ecf20Sopenharmony_ci	struct v4l2_vp8_quantization_header quant_header;
858c2ecf20Sopenharmony_ci	struct v4l2_vp8_entropy_header entropy_header;
868c2ecf20Sopenharmony_ci	struct v4l2_vp8_entropy_coder_state coder_state;
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci	__u16 width;
898c2ecf20Sopenharmony_ci	__u16 height;
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci	__u8 horizontal_scale;
928c2ecf20Sopenharmony_ci	__u8 vertical_scale;
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci	__u8 version;
958c2ecf20Sopenharmony_ci	__u8 prob_skip_false;
968c2ecf20Sopenharmony_ci	__u8 prob_intra;
978c2ecf20Sopenharmony_ci	__u8 prob_last;
988c2ecf20Sopenharmony_ci	__u8 prob_gf;
998c2ecf20Sopenharmony_ci	__u8 num_dct_parts;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	__u32 first_part_size;
1028c2ecf20Sopenharmony_ci	__u32 first_part_header_bits;
1038c2ecf20Sopenharmony_ci	__u32 dct_part_sizes[8];
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	__u64 last_frame_ts;
1068c2ecf20Sopenharmony_ci	__u64 golden_frame_ts;
1078c2ecf20Sopenharmony_ci	__u64 alt_frame_ts;
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	__u64 flags;
1108c2ecf20Sopenharmony_ci};
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci#endif
113