162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Helper functions for vp9 codecs. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2021 Collabora, Ltd. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author: Andrzej Pietrasiewicz <andrzej.p@collabora.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef _MEDIA_V4L2_VP9_H 1162306a36Sopenharmony_ci#define _MEDIA_V4L2_VP9_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <media/v4l2-ctrls.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/** 1662306a36Sopenharmony_ci * struct v4l2_vp9_frame_mv_context - motion vector-related probabilities 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci * @joint: motion vector joint probabilities. 1962306a36Sopenharmony_ci * @sign: motion vector sign probabilities. 2062306a36Sopenharmony_ci * @classes: motion vector class probabilities. 2162306a36Sopenharmony_ci * @class0_bit: motion vector class0 bit probabilities. 2262306a36Sopenharmony_ci * @bits: motion vector bits probabilities. 2362306a36Sopenharmony_ci * @class0_fr: motion vector class0 fractional bit probabilities. 2462306a36Sopenharmony_ci * @fr: motion vector fractional bit probabilities. 2562306a36Sopenharmony_ci * @class0_hp: motion vector class0 high precision fractional bit probabilities. 2662306a36Sopenharmony_ci * @hp: motion vector high precision fractional bit probabilities. 2762306a36Sopenharmony_ci * 2862306a36Sopenharmony_ci * A member of v4l2_vp9_frame_context. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_cistruct v4l2_vp9_frame_mv_context { 3162306a36Sopenharmony_ci u8 joint[3]; 3262306a36Sopenharmony_ci u8 sign[2]; 3362306a36Sopenharmony_ci u8 classes[2][10]; 3462306a36Sopenharmony_ci u8 class0_bit[2]; 3562306a36Sopenharmony_ci u8 bits[2][10]; 3662306a36Sopenharmony_ci u8 class0_fr[2][2][3]; 3762306a36Sopenharmony_ci u8 fr[2][3]; 3862306a36Sopenharmony_ci u8 class0_hp[2]; 3962306a36Sopenharmony_ci u8 hp[2]; 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/** 4362306a36Sopenharmony_ci * struct v4l2_vp9_frame_context - frame probabilities, including motion-vector related 4462306a36Sopenharmony_ci * 4562306a36Sopenharmony_ci * @tx8: TX 8x8 probabilities. 4662306a36Sopenharmony_ci * @tx16: TX 16x16 probabilities. 4762306a36Sopenharmony_ci * @tx32: TX 32x32 probabilities. 4862306a36Sopenharmony_ci * @coef: coefficient probabilities. 4962306a36Sopenharmony_ci * @skip: skip probabilities. 5062306a36Sopenharmony_ci * @inter_mode: inter mode probabilities. 5162306a36Sopenharmony_ci * @interp_filter: interpolation filter probabilities. 5262306a36Sopenharmony_ci * @is_inter: is inter-block probabilities. 5362306a36Sopenharmony_ci * @comp_mode: compound prediction mode probabilities. 5462306a36Sopenharmony_ci * @single_ref: single ref probabilities. 5562306a36Sopenharmony_ci * @comp_ref: compound ref probabilities. 5662306a36Sopenharmony_ci * @y_mode: Y prediction mode probabilities. 5762306a36Sopenharmony_ci * @uv_mode: UV prediction mode probabilities. 5862306a36Sopenharmony_ci * @partition: partition probabilities. 5962306a36Sopenharmony_ci * @mv: motion vector probabilities. 6062306a36Sopenharmony_ci * 6162306a36Sopenharmony_ci * Drivers which need to keep track of frame context(s) can use this struct. 6262306a36Sopenharmony_ci * The members correspond to probability tables, which are specified only implicitly in the 6362306a36Sopenharmony_ci * vp9 spec. Section 10.5 "Default probability tables" contains all the types of involved 6462306a36Sopenharmony_ci * tables, i.e. the actual tables are of the same kind, and when they are reset (which is 6562306a36Sopenharmony_ci * mandated by the spec sometimes) they are overwritten with values from the default tables. 6662306a36Sopenharmony_ci */ 6762306a36Sopenharmony_cistruct v4l2_vp9_frame_context { 6862306a36Sopenharmony_ci u8 tx8[2][1]; 6962306a36Sopenharmony_ci u8 tx16[2][2]; 7062306a36Sopenharmony_ci u8 tx32[2][3]; 7162306a36Sopenharmony_ci u8 coef[4][2][2][6][6][3]; 7262306a36Sopenharmony_ci u8 skip[3]; 7362306a36Sopenharmony_ci u8 inter_mode[7][3]; 7462306a36Sopenharmony_ci u8 interp_filter[4][2]; 7562306a36Sopenharmony_ci u8 is_inter[4]; 7662306a36Sopenharmony_ci u8 comp_mode[5]; 7762306a36Sopenharmony_ci u8 single_ref[5][2]; 7862306a36Sopenharmony_ci u8 comp_ref[5]; 7962306a36Sopenharmony_ci u8 y_mode[4][9]; 8062306a36Sopenharmony_ci u8 uv_mode[10][9]; 8162306a36Sopenharmony_ci u8 partition[16][3]; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci struct v4l2_vp9_frame_mv_context mv; 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/** 8762306a36Sopenharmony_ci * struct v4l2_vp9_frame_symbol_counts - pointers to arrays of symbol counts 8862306a36Sopenharmony_ci * 8962306a36Sopenharmony_ci * @partition: partition counts. 9062306a36Sopenharmony_ci * @skip: skip counts. 9162306a36Sopenharmony_ci * @intra_inter: is inter-block counts. 9262306a36Sopenharmony_ci * @tx32p: TX32 counts. 9362306a36Sopenharmony_ci * @tx16p: TX16 counts. 9462306a36Sopenharmony_ci * @tx8p: TX8 counts. 9562306a36Sopenharmony_ci * @y_mode: Y prediction mode counts. 9662306a36Sopenharmony_ci * @uv_mode: UV prediction mode counts. 9762306a36Sopenharmony_ci * @comp: compound prediction mode counts. 9862306a36Sopenharmony_ci * @comp_ref: compound ref counts. 9962306a36Sopenharmony_ci * @single_ref: single ref counts. 10062306a36Sopenharmony_ci * @mv_mode: inter mode counts. 10162306a36Sopenharmony_ci * @filter: interpolation filter counts. 10262306a36Sopenharmony_ci * @mv_joint: motion vector joint counts. 10362306a36Sopenharmony_ci * @sign: motion vector sign counts. 10462306a36Sopenharmony_ci * @classes: motion vector class counts. 10562306a36Sopenharmony_ci * @class0: motion vector class0 bit counts. 10662306a36Sopenharmony_ci * @bits: motion vector bits counts. 10762306a36Sopenharmony_ci * @class0_fp: motion vector class0 fractional bit counts. 10862306a36Sopenharmony_ci * @fp: motion vector fractional bit counts. 10962306a36Sopenharmony_ci * @class0_hp: motion vector class0 high precision fractional bit counts. 11062306a36Sopenharmony_ci * @hp: motion vector high precision fractional bit counts. 11162306a36Sopenharmony_ci * @coeff: coefficient counts. 11262306a36Sopenharmony_ci * @eob: eob counts 11362306a36Sopenharmony_ci * 11462306a36Sopenharmony_ci * The fields correspond to what is specified in section 8.3 "Clear counts process" of the spec. 11562306a36Sopenharmony_ci * Different pieces of hardware can report the counts in different order, so we cannot rely on 11662306a36Sopenharmony_ci * simply overlaying a struct on a relevant block of memory. Instead we provide pointers to 11762306a36Sopenharmony_ci * arrays or array of pointers to arrays in case of coeff, or array of pointers for eob. 11862306a36Sopenharmony_ci */ 11962306a36Sopenharmony_cistruct v4l2_vp9_frame_symbol_counts { 12062306a36Sopenharmony_ci u32 (*partition)[16][4]; 12162306a36Sopenharmony_ci u32 (*skip)[3][2]; 12262306a36Sopenharmony_ci u32 (*intra_inter)[4][2]; 12362306a36Sopenharmony_ci u32 (*tx32p)[2][4]; 12462306a36Sopenharmony_ci u32 (*tx16p)[2][4]; 12562306a36Sopenharmony_ci u32 (*tx8p)[2][2]; 12662306a36Sopenharmony_ci u32 (*y_mode)[4][10]; 12762306a36Sopenharmony_ci u32 (*uv_mode)[10][10]; 12862306a36Sopenharmony_ci u32 (*comp)[5][2]; 12962306a36Sopenharmony_ci u32 (*comp_ref)[5][2]; 13062306a36Sopenharmony_ci u32 (*single_ref)[5][2][2]; 13162306a36Sopenharmony_ci u32 (*mv_mode)[7][4]; 13262306a36Sopenharmony_ci u32 (*filter)[4][3]; 13362306a36Sopenharmony_ci u32 (*mv_joint)[4]; 13462306a36Sopenharmony_ci u32 (*sign)[2][2]; 13562306a36Sopenharmony_ci u32 (*classes)[2][11]; 13662306a36Sopenharmony_ci u32 (*class0)[2][2]; 13762306a36Sopenharmony_ci u32 (*bits)[2][10][2]; 13862306a36Sopenharmony_ci u32 (*class0_fp)[2][2][4]; 13962306a36Sopenharmony_ci u32 (*fp)[2][4]; 14062306a36Sopenharmony_ci u32 (*class0_hp)[2][2]; 14162306a36Sopenharmony_ci u32 (*hp)[2][2]; 14262306a36Sopenharmony_ci u32 (*coeff[4][2][2][6][6])[3]; 14362306a36Sopenharmony_ci u32 *eob[4][2][2][6][6][2]; 14462306a36Sopenharmony_ci}; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ciextern const u8 v4l2_vp9_kf_y_mode_prob[10][10][9]; /* Section 10.4 of the spec */ 14762306a36Sopenharmony_ciextern const u8 v4l2_vp9_kf_partition_probs[16][3]; /* Section 10.4 of the spec */ 14862306a36Sopenharmony_ciextern const u8 v4l2_vp9_kf_uv_mode_prob[10][9]; /* Section 10.4 of the spec */ 14962306a36Sopenharmony_ciextern const struct v4l2_vp9_frame_context v4l2_vp9_default_probs; /* Section 10.5 of the spec */ 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/** 15262306a36Sopenharmony_ci * v4l2_vp9_fw_update_probs() - Perform forward update of vp9 probabilities 15362306a36Sopenharmony_ci * 15462306a36Sopenharmony_ci * @probs: current probabilities values 15562306a36Sopenharmony_ci * @deltas: delta values from compressed header 15662306a36Sopenharmony_ci * @dec_params: vp9 frame decoding parameters 15762306a36Sopenharmony_ci * 15862306a36Sopenharmony_ci * This function performs forward updates of probabilities for the vp9 boolean decoder. 15962306a36Sopenharmony_ci * The frame header can contain a directive to update the probabilities (deltas), if so, then 16062306a36Sopenharmony_ci * the deltas are provided in the header, too. The userspace parses those and passes the said 16162306a36Sopenharmony_ci * deltas struct to the kernel. 16262306a36Sopenharmony_ci */ 16362306a36Sopenharmony_civoid v4l2_vp9_fw_update_probs(struct v4l2_vp9_frame_context *probs, 16462306a36Sopenharmony_ci const struct v4l2_ctrl_vp9_compressed_hdr *deltas, 16562306a36Sopenharmony_ci const struct v4l2_ctrl_vp9_frame *dec_params); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci/** 16862306a36Sopenharmony_ci * v4l2_vp9_reset_frame_ctx() - Reset appropriate frame context 16962306a36Sopenharmony_ci * 17062306a36Sopenharmony_ci * @dec_params: vp9 frame decoding parameters 17162306a36Sopenharmony_ci * @frame_context: array of the 4 frame contexts 17262306a36Sopenharmony_ci * 17362306a36Sopenharmony_ci * This function resets appropriate frame contexts, based on what's in dec_params. 17462306a36Sopenharmony_ci * 17562306a36Sopenharmony_ci * Returns the frame context index after the update, which might be reset to zero if 17662306a36Sopenharmony_ci * mandated by the spec. 17762306a36Sopenharmony_ci */ 17862306a36Sopenharmony_ciu8 v4l2_vp9_reset_frame_ctx(const struct v4l2_ctrl_vp9_frame *dec_params, 17962306a36Sopenharmony_ci struct v4l2_vp9_frame_context *frame_context); 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci/** 18262306a36Sopenharmony_ci * v4l2_vp9_adapt_coef_probs() - Perform backward update of vp9 coefficients probabilities 18362306a36Sopenharmony_ci * 18462306a36Sopenharmony_ci * @probs: current probabilities values 18562306a36Sopenharmony_ci * @counts: values of symbol counts after the current frame has been decoded 18662306a36Sopenharmony_ci * @use_128: flag to request that 128 is used as update factor if true, otherwise 112 is used 18762306a36Sopenharmony_ci * @frame_is_intra: flag indicating that FrameIsIntra is true 18862306a36Sopenharmony_ci * 18962306a36Sopenharmony_ci * This function performs backward updates of coefficients probabilities for the vp9 boolean 19062306a36Sopenharmony_ci * decoder. After a frame has been decoded the counts of how many times a given symbol has 19162306a36Sopenharmony_ci * occurred are known and are used to update the probability of each symbol. 19262306a36Sopenharmony_ci */ 19362306a36Sopenharmony_civoid v4l2_vp9_adapt_coef_probs(struct v4l2_vp9_frame_context *probs, 19462306a36Sopenharmony_ci struct v4l2_vp9_frame_symbol_counts *counts, 19562306a36Sopenharmony_ci bool use_128, 19662306a36Sopenharmony_ci bool frame_is_intra); 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci/** 19962306a36Sopenharmony_ci * v4l2_vp9_adapt_noncoef_probs() - Perform backward update of vp9 non-coefficients probabilities 20062306a36Sopenharmony_ci * 20162306a36Sopenharmony_ci * @probs: current probabilities values 20262306a36Sopenharmony_ci * @counts: values of symbol counts after the current frame has been decoded 20362306a36Sopenharmony_ci * @reference_mode: specifies the type of inter prediction to be used. See 20462306a36Sopenharmony_ci * &v4l2_vp9_reference_mode for more details 20562306a36Sopenharmony_ci * @interpolation_filter: specifies the filter selection used for performing inter prediction. 20662306a36Sopenharmony_ci * See &v4l2_vp9_interpolation_filter for more details 20762306a36Sopenharmony_ci * @tx_mode: specifies the TX mode. See &v4l2_vp9_tx_mode for more details 20862306a36Sopenharmony_ci * @flags: combination of V4L2_VP9_FRAME_FLAG_* flags 20962306a36Sopenharmony_ci * 21062306a36Sopenharmony_ci * This function performs backward updates of non-coefficients probabilities for the vp9 boolean 21162306a36Sopenharmony_ci * decoder. After a frame has been decoded the counts of how many times a given symbol has 21262306a36Sopenharmony_ci * occurred are known and are used to update the probability of each symbol. 21362306a36Sopenharmony_ci */ 21462306a36Sopenharmony_civoid v4l2_vp9_adapt_noncoef_probs(struct v4l2_vp9_frame_context *probs, 21562306a36Sopenharmony_ci struct v4l2_vp9_frame_symbol_counts *counts, 21662306a36Sopenharmony_ci u8 reference_mode, u8 interpolation_filter, u8 tx_mode, 21762306a36Sopenharmony_ci u32 flags); 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci/** 22062306a36Sopenharmony_ci * v4l2_vp9_seg_feat_enabled() - Check if a segmentation feature is enabled 22162306a36Sopenharmony_ci * 22262306a36Sopenharmony_ci * @feature_enabled: array of 8-bit flags (for all segments) 22362306a36Sopenharmony_ci * @feature: id of the feature to check 22462306a36Sopenharmony_ci * @segid: id of the segment to look up 22562306a36Sopenharmony_ci * 22662306a36Sopenharmony_ci * This function returns true if a given feature is active in a given segment. 22762306a36Sopenharmony_ci */ 22862306a36Sopenharmony_cibool 22962306a36Sopenharmony_civ4l2_vp9_seg_feat_enabled(const u8 *feature_enabled, 23062306a36Sopenharmony_ci unsigned int feature, 23162306a36Sopenharmony_ci unsigned int segid); 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci#endif /* _MEDIA_V4L2_VP9_H */ 234