Go to the documentation of this file.
21 #ifndef AVCODEC_MIPS_VC1DSP_MIPS_H
22 #define AVCODEC_MIPS_VC1DSP_MIPS_H
183 ptrdiff_t
stride,
int h,
int x,
int y);
186 ptrdiff_t
stride,
int h,
int x,
int y);
189 ptrdiff_t
stride,
int h,
int x,
int y);
192 ptrdiff_t
stride,
int h,
int x,
int y);
198 #define FF_PUT_VC1_MSPEL_MC_MSA(hmode, vmode) \
199 void ff_put_vc1_mspel_mc ## hmode ## vmode ## _msa(uint8_t *dst, \
200 const uint8_t *src, \
201 ptrdiff_t stride, int rnd); \
202 void ff_put_vc1_mspel_mc ## hmode ## vmode ## _16_msa(uint8_t *dst, \
203 const uint8_t *src, \
204 ptrdiff_t stride, int rnd);
void ff_avg_vc1_mspel_mc30_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_v_loop_filter16_mmi(uint8_t *src, int stride, int pq)
void ff_put_vc1_mspel_mc33_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc13_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_h_loop_filter8_mmi(uint8_t *src, int stride, int pq)
void ff_vc1_inv_trans_8x4_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
void ff_vc1_inv_trans_8x8_msa(int16_t block[64])
void ff_put_vc1_mspel_mc21_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc33_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_inv_trans_8x4_mmi(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
void ff_put_vc1_mspel_mc22_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc00_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc32_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc00_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc03_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_inv_trans_8x4_dc_mmi(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
void ff_avg_vc1_mspel_mc22_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc10_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc01_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_inv_trans_8x8_dc_mmi(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
void ff_avg_vc1_mspel_mc01_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc31_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc20_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc20_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc02_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc13_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_inv_trans_8x8_mmi(int16_t block[64])
void ff_avg_vc1_mspel_mc03_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_h_loop_filter4_mmi(uint8_t *src, int stride, int pq)
void ff_avg_vc1_mspel_mc11_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_h_loop_filter16_mmi(uint8_t *src, int stride, int pq)
void ff_put_vc1_mspel_mc13_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int h, int x, int y)
void ff_avg_vc1_mspel_mc31_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc02_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_v_s_overlap_mmi(int16_t *top, int16_t *bottom)
#define FF_PUT_VC1_MSPEL_MC_MSA(hmode, vmode)
void ff_avg_vc1_mspel_mc22_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc23_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_v_loop_filter8_mmi(uint8_t *src, int stride, int pq)
void ff_avg_vc1_mspel_mc21_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc31_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc10_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc21_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc10_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_inv_trans_4x4_mmi(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
void ff_put_vc1_mspel_mc11_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_inv_trans_4x8_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
void ff_put_vc1_mspel_mc12_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc01_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc03_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc12_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int h, int x, int y)
void ff_put_vc1_mspel_mc23_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_inv_trans_4x4_dc_mmi(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
void ff_vc1_inv_trans_4x8_mmi(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
void ff_put_vc1_mspel_mc10_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc30_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc11_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc32_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc12_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc31_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc20_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc00_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc12_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_v_loop_filter4_mmi(uint8_t *src, int stride, int pq)
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
void ff_put_vc1_mspel_mc00_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc32_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_h_overlap_mmi(uint8_t *src, int stride)
void ff_put_vc1_mspel_mc11_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_inv_trans_4x8_dc_mmi(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
void ff_put_vc1_mspel_mc23_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc33_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc03_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc20_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc01_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_vc1_mspel_mc13_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_v_overlap_mmi(uint8_t *src, int stride)
void ff_avg_vc1_mspel_mc33_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_vc1_h_s_overlap_mmi(int16_t *left, int16_t *right, int left_stride, int right_stride, int flags)
#define flags(name, subs,...)
The exact code depends on how similar the blocks are and how related they are to the block
void ff_put_vc1_mspel_mc02_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc30_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc21_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc02_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc32_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc22_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_vc1_mspel_mc30_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_put_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int h, int x, int y)
void ff_avg_vc1_mspel_mc23_16_mmi(uint8_t *dst, const uint8_t *src, ptrdiff_t stride, int rnd)
void ff_avg_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst, uint8_t *src, ptrdiff_t stride, int h, int x, int y)