Go to the documentation of this file.
   57     for (y = 0; y < 8; y++) {
 
   76     for (y = 0; y < 16; y++) {
 
  101     for (y = 0; y < 32; y++) {
 
  135     for (y = 0; y < 8; y++) {
 
  152     for (y = 0; y < 16; y++) {
 
  171     for (y = 0; y < 32; y++) {
 
  197     for (y = 0; y < 4; y++) {
 
  198         int l_m_tl = 
left[3 - y] - tl;
 
  217     for (y = 0; y < 8; y++) {
 
  218         int l_m_tl = 
left[7 - y] - tl;
 
  241     for (y = 0; y < 16; y++) {
 
  242         int l_m_tl = 
left[15 - y] - tl;
 
  273     for (y = 0; y < 32; y++) {
 
  274         int l_m_tl = 
left[31 - y] - tl;
 
  321                                 top[0] + top[1] + top[2] + top[3] + 4) >> 3);
 
  338           left[6] + 
left[7] + top[0] + top[1] + top[2] + top[3] +
 
  339           top[4] + top[5] + top[6] + top[7] + 8) >> 4);
 
  343     for (y = 0; y < 8; y++) {
 
  359           left[13] + 
left[14] + 
left[15] + top[0] + top[1] + top[2] + top[3] +
 
  360           top[4] + top[5] + top[6] + top[7] + top[8] + top[9] + top[10] +
 
  361           top[11] + top[12] + top[13] + top[14] + top[15] + 16) >> 5);
 
  365     for (y = 0; y < 16; y++) {
 
  386           left[31] + top[0] + top[1] + top[2] + top[3] + top[4] + top[5] +
 
  387           top[6] + top[7] + top[8] + top[9] + top[10] + top[11] + top[12] +
 
  388           top[13] + top[14] + top[15] + top[16] + top[17] + top[18] + top[19] +
 
  389           top[20] + top[21] + top[22] + top[23] + top[24] + top[25] + top[26] +
 
  390           top[27] + top[28] + top[29] + top[30] + top[31] + 32) >> 6);
 
  394     for (y = 0; y < 32; y++) {
 
  432     for (y = 0; y < 8; y++) {
 
  451     for (y = 0; y < 16; y++) {
 
  475     for (y = 0; y < 32; y++) {
 
  508         ((top[0] + top[1] + top[2] + top[3] +
 
  509           top[4] + top[5] + top[6] + top[7] + 4) >> 3);
 
  513     for (y = 0; y < 8; y++) {
 
  526         ((top[0] + top[1] + top[2] + top[3] + top[4] + top[5] +
 
  527           top[6] + top[7] + top[8] + top[9] + top[10] + top[11] +
 
  528           top[12] + top[13] + top[14] + top[15] + 8) >> 4);
 
  532     for (y = 0; y < 16; y++) {
 
  547         ((top[0] + top[1] + top[2] + top[3] + top[4] + top[5] +
 
  548           top[6] + top[7] + top[8] + top[9] + top[10] + top[11] +
 
  549           top[12] + top[13] + top[14] + top[15] + top[16] + top[17] +
 
  550           top[18] + top[19] + top[20] + top[21] + top[22] + top[23] +
 
  551           top[24] + top[25] + top[26] + top[27] + top[28] + top[29] +
 
  552           top[30] + top[31] + 16) >> 5);
 
  556     for (y = 0; y < 32; y++) {
 
  592     for (y = 0; y < 8; y++) {
 
  607     for (y = 0; y < 16; y++) {
 
  624     for (y = 0; y < 32; y++) {
 
  657     for (y = 0; y < 8; y++) {
 
  672     for (y = 0; y < 16; y++) {
 
  689     for (y = 0; y < 32; y++) {
 
  723     for (y = 0; y < 8; y++) {
 
  738     for (y = 0; y < 16; y++) {
 
  755     for (y = 0; y < 32; y++) {
 
  771 #define memset_bpc memset 
  775     for (
n = 0; 
n < 
len; 
n++) {
 
  781 #define DST(x, y) dst[(x) + (y) * stride] 
  788     int a0 = top[0], 
a1 = top[1], 
a2 = top[2], 
a3 = top[3],
 
  789         a4 = top[4], 
a5 = top[5], a6 = top[6], a7 = top[7];
 
  796     DST(3,1) = 
DST(2,2) = 
DST(1,3) = (
a4 + 
a5 * 2 + a6 + 2) >> 2;
 
  797     DST(3,2) = 
DST(2,3) = (
a5 + a6 * 2 + a7 + 2) >> 2;
 
  801 #define def_diag_downleft(size) \ 
  802 static void diag_downleft_##size##x##size##_c(uint8_t *_dst, ptrdiff_t stride, \ 
  803                                               const uint8_t *left, const uint8_t *_top) \ 
  805     pixel *dst = (pixel *) _dst; \ 
  806     const pixel *top = (const pixel *) _top; \ 
  810     stride /= sizeof(pixel); \ 
  811     for (i = 0; i < size - 2; i++) \ 
  812         v[i] = (top[i] + top[i + 1] * 2 + top[i + 2] + 2) >> 2; \ 
  813     v[size - 2] = (top[size - 2] + top[size - 1] * 3 + 2) >> 2; \ 
  815     for (j = 0; j < size; j++) { \ 
  816         memcpy(dst + j*stride, v + j, (size - 1 - j) * sizeof(pixel)); \ 
  817         memset_bpc(dst + j*stride + size - 1 - j, top[size - 1], j + 1); \ 
  825 static 
void diag_downright_4x4_c(
uint8_t *_dst, ptrdiff_t 
stride,
 
  831     int tl = top[-1], 
a0 = top[0], 
a1 = top[1], 
a2 = top[2], 
a3 = top[3],
 
  835     DST(0,3) = (l1 + l2 * 2 + l3 + 2) >> 2;
 
  836     DST(0,2) = 
DST(1,3) = (l0 + l1 * 2 + l2 + 2) >> 2;
 
  837     DST(0,1) = 
DST(1,2) = 
DST(2,3) = (tl + l0 * 2 + l1 + 2) >> 2;
 
  838     DST(0,0) = 
DST(1,1) = 
DST(2,2) = 
DST(3,3) = (l0 + tl * 2 + 
a0 + 2) >> 2;
 
  839     DST(1,0) = 
DST(2,1) = 
DST(3,2) = (tl + 
a0 * 2 + 
a1 + 2) >> 2;
 
  844 #define def_diag_downright(size) \ 
  845 static void diag_downright_##size##x##size##_c(uint8_t *_dst, ptrdiff_t stride, \ 
  846                                                const uint8_t *_left, const uint8_t *_top) \ 
  848     pixel *dst = (pixel *) _dst; \ 
  849     const pixel *top = (const pixel *) _top; \ 
  850     const pixel *left = (const pixel *) _left; \ 
  852     pixel v[size + size - 1]; \ 
  854     stride /= sizeof(pixel); \ 
  855     for (i = 0; i < size - 2; i++) { \ 
  856         v[i           ] = (left[i] + left[i + 1] * 2 + left[i + 2] + 2) >> 2; \ 
  857         v[size + 1 + i] = (top[i]  + top[i + 1]  * 2 + top[i + 2]  + 2) >> 2; \ 
  859     v[size - 2] = (left[size - 2] + left[size - 1] * 2 + top[-1] + 2) >> 2; \ 
  860     v[size - 1] = (left[size - 1] + top[-1] * 2 + top[ 0] + 2) >> 2; \ 
  861     v[size    ] = (top[-1] + top[0]  * 2 + top[ 1] + 2) >> 2; \ 
  863     for (j = 0; j < size; j++) \ 
  864         memcpy(dst + j*stride, v + size - 1 - j, size * sizeof(pixel)); \ 
  871 static 
void vert_right_4x4_c(
uint8_t *_dst, ptrdiff_t 
stride,
 
  877     int tl = top[-1], 
a0 = top[0], 
a1 = top[1], 
a2 = top[2], 
a3 = top[3],
 
  881     DST(0,3) = (l0 + l1 * 2 + l2 + 2) >> 2;
 
  882     DST(0,2) = (tl + l0 * 2 + l1 + 2) >> 2;
 
  883     DST(0,0) = 
DST(1,2) = (tl + 
a0 + 1) >> 1;
 
  884     DST(0,1) = 
DST(1,3) = (l0 + tl * 2 + 
a0 + 2) >> 2;
 
  886     DST(1,1) = 
DST(2,3) = (tl + 
a0 * 2 + 
a1 + 2) >> 2;
 
  893 #define def_vert_right(size) \ 
  894 static void vert_right_##size##x##size##_c(uint8_t *_dst, ptrdiff_t stride, \ 
  895                                            const uint8_t *_left, const uint8_t *_top) \ 
  897     pixel *dst = (pixel *) _dst; \ 
  898     const pixel *top = (const pixel *) _top; \ 
  899     const pixel *left = (const pixel *) _left; \ 
  901     pixel ve[size + size/2 - 1], vo[size + size/2 - 1]; \ 
  903     stride /= sizeof(pixel); \ 
  904     for (i = 0; i < size/2 - 2; i++) { \ 
  905         vo[i] = (left[i*2 + 3] + left[i*2 + 2] * 2 + left[i*2 + 1] + 2) >> 2; \ 
  906         ve[i] = (left[i*2 + 4] + left[i*2 + 3] * 2 + left[i*2 + 2] + 2) >> 2; \ 
  908     vo[size/2 - 2] = (left[size - 1] + left[size - 2] * 2 + left[size - 3] + 2) >> 2; \ 
  909     ve[size/2 - 2] = (top[-1] + left[size - 1] * 2 + left[size - 2] + 2) >> 2; \ 
  911     ve[size/2 - 1] = (top[-1] + top[0] + 1) >> 1; \ 
  912     vo[size/2 - 1] = (left[size - 1] + top[-1] * 2 + top[0] + 2) >> 2; \ 
  913     for (i = 0; i < size - 1; i++) { \ 
  914         ve[size/2 + i] = (top[i] + top[i + 1] + 1) >> 1; \ 
  915         vo[size/2 + i] = (top[i - 1] + top[i] * 2 + top[i + 1] + 2) >> 2; \ 
  918     for (j = 0; j < size / 2; j++) { \ 
  919         memcpy(dst +  j*2     *stride, ve + size/2 - 1 - j, size * sizeof(pixel)); \ 
  920         memcpy(dst + (j*2 + 1)*stride, vo + size/2 - 1 - j, size * sizeof(pixel)); \ 
  935         tl = top[-1], 
a0 = top[0], 
a1 = top[1], 
a2 = top[2];
 
  938     DST(2,0) = (tl + 
a0 * 2 + 
a1 + 2) >> 2;
 
  940     DST(0,0) = 
DST(2,1) = (tl + l0 + 1) >> 1;
 
  941     DST(1,0) = 
DST(3,1) = (
a0 + tl * 2 + l0 + 2) >> 2;
 
  942     DST(0,1) = 
DST(2,2) = (l0 + l1 + 1) >> 1;
 
  943     DST(1,1) = 
DST(3,2) = (tl + l0 * 2 + l1 + 2) >> 2;
 
  944     DST(0,2) = 
DST(2,3) = (l1 + l2 + 1) >> 1;
 
  945     DST(1,2) = 
DST(3,3) = (l0 + l1 * 2 + l2 + 2) >> 2;
 
  946     DST(0,3) = (l2 + l3 + 1) >> 1;
 
  947     DST(1,3) = (l1 + l2 * 2 + l3 + 2) >> 2;
 
  950 #define def_hor_down(size) \ 
  951 static void hor_down_##size##x##size##_c(uint8_t *_dst, ptrdiff_t stride, \ 
  952                                          const uint8_t *_left, const uint8_t *_top) \ 
  954     pixel *dst = (pixel *) _dst; \ 
  955     const pixel *top = (const pixel *) _top; \ 
  956     const pixel *left = (const pixel *) _left; \ 
  958     pixel v[size * 3 - 2]; \ 
  960     stride /= sizeof(pixel); \ 
  961     for (i = 0; i < size - 2; i++) { \ 
  962         v[i*2       ] = (left[i + 1] + left[i + 0] + 1) >> 1; \ 
  963         v[i*2    + 1] = (left[i + 2] + left[i + 1] * 2 + left[i + 0] + 2) >> 2; \ 
  964         v[size*2 + i] = (top[i - 1] + top[i] * 2 + top[i + 1] + 2) >> 2; \ 
  966     v[size*2 - 2] = (top[-1] + left[size - 1] + 1) >> 1; \ 
  967     v[size*2 - 4] = (left[size - 1] + left[size - 2] + 1) >> 1; \ 
  968     v[size*2 - 1] = (top[0]  + top[-1] * 2 + left[size - 1] + 2) >> 2; \ 
  969     v[size*2 - 3] = (top[-1] + left[size - 1] * 2 + left[size - 2] + 2) >> 2; \ 
  971     for (j = 0; j < size; j++) \ 
  972         memcpy(dst + j*stride, v + size*2 - 2 - j*2, size * sizeof(pixel)); \ 
  984     int a0 = top[0], 
a1 = top[1], 
a2 = top[2], 
a3 = top[3],
 
  985         a4 = top[4], 
a5 = top[5], a6 = top[6];
 
  997     DST(3,3) = (
a4 + 
a5 * 2 + a6 + 2) >> 2;
 
 1000 #define def_vert_left(size) \ 
 1001 static void vert_left_##size##x##size##_c(uint8_t *_dst, ptrdiff_t stride, \ 
 1002                                           const uint8_t *left, const uint8_t *_top) \ 
 1004     pixel *dst = (pixel *) _dst; \ 
 1005     const pixel *top = (const pixel *) _top; \ 
 1007     pixel ve[size - 1], vo[size - 1]; \ 
 1009     stride /= sizeof(pixel); \ 
 1010     for (i = 0; i < size - 2; i++) { \ 
 1011         ve[i] = (top[i] + top[i + 1] + 1) >> 1; \ 
 1012         vo[i] = (top[i] + top[i + 1] * 2 + top[i + 2] + 2) >> 2; \ 
 1014     ve[size - 2] = (top[size - 2] + top[size - 1] + 1) >> 1; \ 
 1015     vo[size - 2] = (top[size - 2] + top[size - 1] * 3 + 2) >> 2; \ 
 1017     for (j = 0; j < size / 2; j++) { \ 
 1018         memcpy(dst +  j*2      * stride, ve + j, (size - j - 1) * sizeof(pixel)); \ 
 1019         memset_bpc(dst +  j*2      * stride + size - j - 1, top[size - 1], j + 1); \ 
 1020         memcpy(dst + (j*2 + 1) * stride, vo + j, (size - j - 1) * sizeof(pixel)); \ 
 1021         memset_bpc(dst + (j*2 + 1) * stride + size - j - 1, top[size - 1], j + 1); \ 
 1037     DST(0,0) = (l0 + l1 + 1) >> 1;
 
 1038     DST(1,0) = (l0 + l1 * 2 + l2 + 2) >> 2;
 
 1039     DST(0,1) = 
DST(2,0) = (l1 + l2 + 1) >> 1;
 
 1040     DST(1,1) = 
DST(3,0) = (l1 + l2 * 2 + l3 + 2) >> 2;
 
 1041     DST(0,2) = 
DST(2,1) = (l2 + l3 + 1) >> 1;
 
 1042     DST(1,2) = 
DST(3,1) = (l2 + l3 * 3 + 2) >> 2;
 
 1046 #define def_hor_up(size) \ 
 1047 static void hor_up_##size##x##size##_c(uint8_t *_dst, ptrdiff_t stride, \ 
 1048                                        const uint8_t *_left, const uint8_t *top) \ 
 1050     pixel *dst = (pixel *) _dst; \ 
 1051     const pixel *left = (const pixel *) _left; \ 
 1053     pixel v[size*2 - 2]; \ 
 1055     stride /= sizeof(pixel); \ 
 1056     for (i = 0; i < size - 2; i++) { \ 
 1057         v[i*2    ] = (left[i] + left[i + 1] + 1) >> 1; \ 
 1058         v[i*2 + 1] = (left[i] + left[i + 1] * 2 + left[i + 2] + 2) >> 2; \ 
 1060     v[size*2 - 4] = (left[size - 2] + left[size - 1] + 1) >> 1; \ 
 1061     v[size*2 - 3] = (left[size - 2] + left[size - 1] * 3 + 2) >> 2; \ 
 1063     for (j = 0; j < size / 2; j++) \ 
 1064         memcpy(dst + j*stride, v + j*2, size * sizeof(pixel)); \ 
 1065     for (j = size / 2; j < size; j++) { \ 
 1066         memcpy(dst + j*stride, v + j*2, (size*2 - 2 - j*2) * sizeof(pixel)); \ 
 1067         memset_bpc(dst + j*stride + size*2 - 2 - j*2, left[size - 1], \ 
 1088 #define init_intra_pred_bd_aware(tx, sz) \ 
 1089     dsp->intra_pred[tx][TM_VP8_PRED]          = tm_##sz##_c; \ 
 1090     dsp->intra_pred[tx][DC_128_PRED]          = dc_128_##sz##_c; \ 
 1091     dsp->intra_pred[tx][DC_127_PRED]          = dc_127_##sz##_c; \ 
 1092     dsp->intra_pred[tx][DC_129_PRED]          = dc_129_##sz##_c 
 1095     ff_vp9dsp_intrapred_init_10(dsp);
 
 1096 #define init_intra_pred(tx, sz) \ 
 1097     init_intra_pred_bd_aware(tx, sz) 
 1099     #define init_intra_pred(tx, sz) \ 
 1100     dsp->intra_pred[tx][VERT_PRED]            = vert_##sz##_c; \ 
 1101     dsp->intra_pred[tx][HOR_PRED]             = hor_##sz##_c; \ 
 1102     dsp->intra_pred[tx][DC_PRED]              = dc_##sz##_c; \ 
 1103     dsp->intra_pred[tx][DIAG_DOWN_LEFT_PRED]  = diag_downleft_##sz##_c; \ 
 1104     dsp->intra_pred[tx][DIAG_DOWN_RIGHT_PRED] = diag_downright_##sz##_c; \ 
 1105     dsp->intra_pred[tx][VERT_RIGHT_PRED]      = vert_right_##sz##_c; \ 
 1106     dsp->intra_pred[tx][HOR_DOWN_PRED]        = hor_down_##sz##_c; \ 
 1107     dsp->intra_pred[tx][VERT_LEFT_PRED]       = vert_left_##sz##_c; \ 
 1108     dsp->intra_pred[tx][HOR_UP_PRED]          = hor_up_##sz##_c; \ 
 1109     dsp->intra_pred[tx][LEFT_DC_PRED]         = dc_left_##sz##_c; \ 
 1110     dsp->intra_pred[tx][TOP_DC_PRED]          = dc_top_##sz##_c; \ 
 1111     init_intra_pred_bd_aware(tx, sz) 
 1119 #undef init_intra_pred 
 1120 #undef init_intra_pred_bd_aware 
 1123 #define itxfm_wrapper(type_a, type_b, sz, bits, has_dconly) \ 
 1124 static void type_a##_##type_b##_##sz##x##sz##_add_c(uint8_t *_dst, \ 
 1126                                                     int16_t *_block, int eob) \ 
 1129     pixel *dst = (pixel *) _dst; \ 
 1130     dctcoef *block = (dctcoef *) _block, tmp[sz * sz], out[sz]; \ 
 1132     stride /= sizeof(pixel); \ 
 1133     if (has_dconly && eob == 1) { \ 
 1134         const int t  = ((((dctint) block[0] * 11585 + (1 << 13)) >> 14) \ 
 1135                                             * 11585 + (1 << 13)) >> 14; \ 
 1137         for (i = 0; i < sz; i++) { \ 
 1138             for (j = 0; j < sz; j++) \ 
 1139                 dst[j * stride] = av_clip_pixel(dst[j * stride] + \ 
 1141                                                  (int)(t + (1U << (bits - 1))) >> bits : \ 
 1148     for (i = 0; i < sz; i++) \ 
 1149         type_a##sz##_1d(block + i, sz, tmp + i * sz, 0); \ 
 1150     memset(block, 0, sz * sz * sizeof(*block)); \ 
 1151     for (i = 0; i < sz; i++) { \ 
 1152         type_b##sz##_1d(tmp + i, sz, out, 1); \ 
 1153         for (j = 0; j < sz; j++) \ 
 1154             dst[j * stride] = av_clip_pixel(dst[j * stride] + \ 
 1156                                              (int)(out[j] + (1U << (bits - 1))) >> bits : \ 
 1162 #define itxfm_wrap(sz, bits) \ 
 1163 itxfm_wrapper(idct,  idct,  sz, bits, 1) \ 
 1164 itxfm_wrapper(iadst, idct,  sz, bits, 0) \ 
 1165 itxfm_wrapper(idct,  iadst, sz, bits, 0) \ 
 1166 itxfm_wrapper(iadst, iadst, sz, bits, 0) 
 1168 #define IN(x) ((dctint) in[(x) * stride]) 
 1175     t0 = ((
IN(0) + 
IN(2)) * 11585 + (1 << 13)) >> 14;
 
 1176     t1 = ((
IN(0) - 
IN(2)) * 11585 + (1 << 13)) >> 14;
 
 1177     t2 = (
IN(1) *  6270 - 
IN(3) * 15137 + (1 << 13)) >> 14;
 
 1178     t3 = (
IN(1) * 15137 + 
IN(3) *  6270 + (1 << 13)) >> 14;
 
 1191     t0 =  5283 * 
IN(0) + 15212 * 
IN(2) +  9929 * 
IN(3);
 
 1192     t1 =  9929 * 
IN(0) -  5283 * 
IN(2) - 15212 * 
IN(3);
 
 1193     t2 = 13377 * (
IN(0) - 
IN(2) + 
IN(3));
 
 1196     out[0] = (
t0 + 
t3      + (1 << 13)) >> 14;
 
 1197     out[1] = (
t1 + 
t3      + (1 << 13)) >> 14;
 
 1198     out[2] = (
t2           + (1 << 13)) >> 14;
 
 1199     out[3] = (
t0 + 
t1 - 
t3 + (1 << 13)) >> 14;
 
 1207     dctint t0, t0a, 
t1, t1a, 
t2, t2a, 
t3, t3a, 
t4, t4a, 
t5, t5a, 
t6, t6a, 
t7, t7a;
 
 1209     t0a = ((
IN(0) + 
IN(4)) * 11585 + (1 << 13)) >> 14;
 
 1210     t1a = ((
IN(0) - 
IN(4)) * 11585 + (1 << 13)) >> 14;
 
 1211     t2a = (
IN(2) *  6270 - 
IN(6) * 15137 + (1 << 13)) >> 14;
 
 1212     t3a = (
IN(2) * 15137 + 
IN(6) *  6270 + (1 << 13)) >> 14;
 
 1213     t4a = (
IN(1) *  3196 - 
IN(7) * 16069 + (1 << 13)) >> 14;
 
 1214     t5a = (
IN(5) * 13623 - 
IN(3) *  9102 + (1 << 13)) >> 14;
 
 1215     t6a = (
IN(5) *  9102 + 
IN(3) * 13623 + (1 << 13)) >> 14;
 
 1216     t7a = (
IN(1) * 16069 + 
IN(7) *  3196 + (1 << 13)) >> 14;
 
 1227     t5  = ((t6a - t5a) * 11585 + (1 << 13)) >> 14;
 
 1228     t6  = ((t6a + t5a) * 11585 + (1 << 13)) >> 14;
 
 1243     dctint t0, t0a, 
t1, t1a, 
t2, t2a, 
t3, t3a, 
t4, t4a, 
t5, t5a, 
t6, t6a, 
t7, t7a;
 
 1245     t0a = 16305 * 
IN(7) +  1606 * 
IN(0);
 
 1246     t1a =  1606 * 
IN(7) - 16305 * 
IN(0);
 
 1247     t2a = 14449 * 
IN(5) +  7723 * 
IN(2);
 
 1248     t3a =  7723 * 
IN(5) - 14449 * 
IN(2);
 
 1249     t4a = 10394 * 
IN(3) + 12665 * 
IN(4);
 
 1250     t5a = 12665 * 
IN(3) - 10394 * 
IN(4);
 
 1251     t6a =  4756 * 
IN(1) + 15679 * 
IN(6);
 
 1252     t7a = 15679 * 
IN(1) -  4756 * 
IN(6);
 
 1254     t0 = (t0a + t4a + (1 << 13)) >> 14;
 
 1255     t1 = (t1a + t5a + (1 << 13)) >> 14;
 
 1256     t2 = (t2a + t6a + (1 << 13)) >> 14;
 
 1257     t3 = (t3a + t7a + (1 << 13)) >> 14;
 
 1258     t4 = (t0a - t4a + (1 << 13)) >> 14;
 
 1259     t5 = (t1a - t5a + (1 << 13)) >> 14;
 
 1260     t6 = (t2a - t6a + (1 << 13)) >> 14;
 
 1261     t7 = (t3a - t7a + (1 << 13)) >> 14;
 
 1263     t4a = 15137
U * 
t4 +  6270
U * 
t5;
 
 1264     t5a =  6270
U * 
t4 - 15137
U * 
t5;
 
 1265     t6a = 15137
U * 
t7 -  6270
U * 
t6;
 
 1266     t7a =  6270
U * 
t7 + 15137
U * 
t6;
 
 1273     out[1] = -((
dctint)((1
U << 13) + t4a + t6a) >> 14);
 
 1274     out[6] =   (
dctint)((1
U << 13) + t5a + t7a) >> 14;
 
 1275     t6     =   (
dctint)((1
U << 13) + t4a - t6a) >> 14;
 
 1276     t7     =   (
dctint)((1
U << 13) + t5a - t7a) >> 14;
 
 1289     dctint t0, 
t1, 
t2, 
t3, 
t4, 
t5, 
t6, 
t7, 
t8, 
t9, 
t10, 
t11, 
t12, t13, t14, 
t15;
 
 1290     dctint t0a, t1a, t2a, t3a, t4a, t5a, t6a, t7a;
 
 1291     dctint t8a, t9a, t10a, t11a, t12a, t13a, t14a, t15a;
 
 1293     t0a  = (
dctint)((
IN(0) + 
IN(8)) * 11585
U + (1 << 13)) >> 14;
 
 1294     t1a  = (
dctint)((
IN(0) - 
IN(8)) * 11585
U + (1 << 13)) >> 14;
 
 1295     t2a  = (
dctint)(
IN(4)  *  6270
U - 
IN(12) * 15137
U + (1 << 13)) >> 14;
 
 1296     t3a  = (
dctint)(
IN(4)  * 15137
U + 
IN(12) *  6270
U + (1 << 13)) >> 14;
 
 1297     t4a  = (
dctint)(
IN(2)  *  3196
U - 
IN(14) * 16069
U + (1 << 13)) >> 14;
 
 1298     t7a  = (
dctint)(
IN(2)  * 16069
U + 
IN(14) *  3196
U + (1 << 13)) >> 14;
 
 1299     t5a  = (
dctint)(
IN(10) * 13623
U - 
IN(6)  *  9102
U + (1 << 13)) >> 14;
 
 1300     t6a  = (
dctint)(
IN(10) *  9102
U + 
IN(6)  * 13623
U + (1 << 13)) >> 14;
 
 1301     t8a  = (
dctint)(
IN(1)  *  1606
U - 
IN(15) * 16305
U + (1 << 13)) >> 14;
 
 1302     t15a = (
dctint)(
IN(1)  * 16305
U + 
IN(15) *  1606
U + (1 << 13)) >> 14;
 
 1303     t9a  = (
dctint)(
IN(9)  * 12665
U - 
IN(7)  * 10394
U + (1 << 13)) >> 14;
 
 1304     t14a = (
dctint)(
IN(9)  * 10394
U + 
IN(7)  * 12665
U + (1 << 13)) >> 14;
 
 1305     t10a = (
dctint)(
IN(5)  *  7723
U - 
IN(11) * 14449
U + (1 << 13)) >> 14;
 
 1306     t13a = (
dctint)(
IN(5)  * 14449
U + 
IN(11) *  7723
U + (1 << 13)) >> 14;
 
 1307     t11a = (
dctint)(
IN(13) * 15679
U - 
IN(3)  *  4756
U + (1 << 13)) >> 14;
 
 1308     t12a = (
dctint)(
IN(13) *  4756
U + 
IN(3)  * 15679
U + (1 << 13)) >> 14;
 
 1327     t5a  = (
dctint)((
t6 - 
t5) * 11585
U + (1 << 13)) >> 14;
 
 1328     t6a  = (
dctint)((
t6 + 
t5) * 11585
U + (1 << 13)) >> 14;
 
 1329     t9a  = (
dctint)(  t14 *  6270
U - 
t9  * 15137
U  + (1 << 13)) >> 14;
 
 1330     t14a = (
dctint)(  t14 * 15137
U + 
t9  *  6270
U  + (1 << 13)) >> 14;
 
 1331     t10a = (
dctint)(-(t13 * 15137
U + 
t10 *  6270
U) + (1 << 13)) >> 14;
 
 1332     t13a = (
dctint)(  t13 *  6270
U - 
t10 * 15137
U  + (1 << 13)) >> 14;
 
 1351     t10a = (
dctint)((t13  - 
t10)  * 11585
U + (1 << 13)) >> 14;
 
 1352     t13a = (
dctint)((t13  + 
t10)  * 11585
U + (1 << 13)) >> 14;
 
 1353     t11  = (
dctint)((t12a - t11a) * 11585
U + (1 << 13)) >> 14;
 
 1354     t12  = (
dctint)((t12a + t11a) * 11585
U + (1 << 13)) >> 14;
 
 1356     out[ 0] = t0a + t15a;
 
 1357     out[ 1] = t1a + t14;
 
 1358     out[ 2] = t2a + t13a;
 
 1361     out[ 5] = 
t5  + t10a;
 
 1366     out[10] = 
t5  - t10a;
 
 1369     out[13] = t2a - t13a;
 
 1370     out[14] = t1a - t14;
 
 1371     out[15] = t0a - t15a;
 
 1377     dctint t0, 
t1, 
t2, 
t3, 
t4, 
t5, 
t6, 
t7, 
t8, 
t9, 
t10, 
t11, 
t12, t13, t14, 
t15;
 
 1378     dctint t0a, t1a, t2a, t3a, t4a, t5a, t6a, t7a;
 
 1379     dctint t8a, t9a, t10a, t11a, t12a, t13a, t14a, t15a;
 
 1381     t0  = 
IN(15) * 16364
U + 
IN(0)  *   804
U;
 
 1382     t1  = 
IN(15) *   804
U - 
IN(0)  * 16364
U;
 
 1383     t2  = 
IN(13) * 15893
U + 
IN(2)  *  3981
U;
 
 1384     t3  = 
IN(13) *  3981
U - 
IN(2)  * 15893
U;
 
 1385     t4  = 
IN(11) * 14811
U + 
IN(4)  *  7005
U;
 
 1386     t5  = 
IN(11) *  7005
U - 
IN(4)  * 14811
U;
 
 1387     t6  = 
IN(9)  * 13160
U + 
IN(6)  *  9760
U;
 
 1388     t7  = 
IN(9)  *  9760
U - 
IN(6)  * 13160
U;
 
 1389     t8  = 
IN(7)  * 11003
U + 
IN(8)  * 12140
U;
 
 1390     t9  = 
IN(7)  * 12140
U - 
IN(8)  * 11003
U;
 
 1394     t13 = 
IN(3)  * 15426
U - 
IN(12) *  5520
U;
 
 1395     t14 = 
IN(1)  *  2404
U + 
IN(14) * 16207
U;
 
 1403     t5a  = (
dctint)((1
U << 13) + 
t5 + t13) >> 14;
 
 1404     t6a  = (
dctint)((1
U << 13) + 
t6 + t14) >> 14;
 
 1411     t13a = (
dctint)((1
U << 13) + 
t5 - t13) >> 14;
 
 1412     t14a = (
dctint)((1
U << 13) + 
t6 - t14) >> 14;
 
 1415     t8   = t8a  * 16069
U + t9a  *  3196
U;
 
 1416     t9   = t8a  *  3196
U - t9a  * 16069
U;
 
 1417     t10  = t10a *  9102
U + t11a * 13623
U;
 
 1418     t11  = t10a * 13623
U - t11a *  9102
U;
 
 1419     t12  = t13a * 16069
U - t12a *  3196
U;
 
 1420     t13  = t13a *  3196
U + t12a * 16069
U;
 
 1421     t14  = t15a *  9102
U - t14a * 13623
U;
 
 1422     t15  = t15a * 13623
U + t14a *  9102
U;
 
 1433     t9a  = (
dctint)((1
U << 13) + 
t9  + t13) >> 14;
 
 1434     t10a = (
dctint)((1
U << 13) + 
t10 + t14) >> 14;
 
 1437     t13a = (
dctint)((1
U << 13) + 
t9  - t13) >> 14;
 
 1438     t14a = (
dctint)((1
U << 13) + 
t10 - t14) >> 14;
 
 1441     t4a  = 
t4 * 15137
U + 
t5 *  6270
U;
 
 1442     t5a  = 
t4 *  6270
U - 
t5 * 15137
U;
 
 1443     t6a  = 
t7 * 15137
U - 
t6 *  6270
U;
 
 1444     t7a  = 
t7 *  6270
U + 
t6 * 15137
U;
 
 1445     t12  = t12a * 15137
U + t13a *  6270
U;
 
 1446     t13  = t12a *  6270
U - t13a * 15137
U;
 
 1447     t14  = t15a * 15137
U - t14a *  6270
U;
 
 1448     t15  = t15a *  6270
U + t14a * 15137
U;
 
 1454     out[ 3] = -((
dctint)((1
U << 13) + t4a + t6a) >> 14);
 
 1455     out[12] =   (
dctint)((1
U << 13) + t5a + t7a) >> 14;
 
 1456     t6      =   (
dctint)((1
U << 13) + t4a - t6a) >> 14;
 
 1457     t7      =   (
dctint)((1
U << 13) + t5a - t7a) >> 14;
 
 1458     out[ 1] = -(t8a + t10a);
 
 1459     out[14] =   t9a + t11a;
 
 1464     t14a    =   (
dctint)((1
U << 13) + 
t12 - t14) >> 14;
 
 1465     t15a    =   (
dctint)((1
U << 13) + t13 - 
t15) >> 14;
 
 1467     out[ 7] = (
dctint)(-(t2a  + t3a)  * 11585
U  + (1 << 13)) >> 14;
 
 1468     out[ 8] = (
dctint)( (t2a  - t3a)  * 11585
U  + (1 << 13)) >> 14;
 
 1473     out[ 5] = (
dctint)(-(t14a + t15a) * 11585
U  + (1 << 13)) >> 14;
 
 1474     out[10] = (
dctint)( (t14a - t15a) * 11585
U  + (1 << 13)) >> 14;
 
 1528     dctint t13 = t12a - t13a;
 
 1529     dctint t14 = t15a - t14a;
 
 1531     dctint t16 = t16a + t17a;
 
 1532     dctint t17 = t16a - t17a;
 
 1533     dctint t18 = t19a - t18a;
 
 1534     dctint t19 = t19a + t18a;
 
 1535     dctint t20 = t20a + t21a;
 
 1536     dctint t21 = t20a - t21a;
 
 1537     dctint t22 = t23a - t22a;
 
 1538     dctint t23 = t23a + t22a;
 
 1539     dctint t24 = t24a + t25a;
 
 1540     dctint t25 = t24a - t25a;
 
 1541     dctint t26 = t27a - t26a;
 
 1543     dctint t28 = t28a + t29a;
 
 1544     dctint t29 = t28a - t29a;
 
 1545     dctint t30 = t31a - t30a;
 
 1546     dctint t31 = t31a + t30a;
 
 1548     t5a  = (
dctint)((
t6 - 
t5) * 11585
U             + (1 << 13)) >> 14;
 
 1549     t6a  = (
dctint)((
t6 + 
t5) * 11585
U             + (1 << 13)) >> 14;
 
 1550     t9a  = (
dctint)(  t14 *  6270
U - 
t9  * 15137
U  + (1 << 13)) >> 14;
 
 1551     t14a = (
dctint)(  t14 * 15137
U + 
t9  *  6270
U  + (1 << 13)) >> 14;
 
 1552     t10a = (
dctint)(-(t13 * 15137
U + 
t10 *  6270
U) + (1 << 13)) >> 14;
 
 1553     t13a = (
dctint)(  t13 *  6270
U - 
t10 * 15137
U  + (1 << 13)) >> 14;
 
 1554     t17a = (
dctint)(  t30 *  3196
U - t17 * 16069
U  + (1 << 13)) >> 14;
 
 1555     t30a = (
dctint)(  t30 * 16069
U + t17 *  3196
U  + (1 << 13)) >> 14;
 
 1556     t18a = (
dctint)(-(t29 * 16069
U + t18 *  3196
U) + (1 << 13)) >> 14;
 
 1557     t29a = (
dctint)(  t29 *  3196
U - t18 * 16069
U  + (1 << 13)) >> 14;
 
 1558     t21a = (
dctint)(  t26 * 13623
U - t21 *  9102
U  + (1 << 13)) >> 14;
 
 1559     t26a = (
dctint)(  t26 *  9102
U + t21 * 13623
U  + (1 << 13)) >> 14;
 
 1560     t22a = (
dctint)(-(t25 *  9102
U + t22 * 13623
U) + (1 << 13)) >> 14;
 
 1561     t25a = (
dctint)(  t25 * 13623
U - t22 *  9102
U  + (1 << 13)) >> 14;
 
 1596     t10a = (
dctint)((t13  - 
t10)  * 11585
U           + (1 << 13)) >> 14;
 
 1597     t13a = (
dctint)((t13  + 
t10)  * 11585
U           + (1 << 13)) >> 14;
 
 1598     t11  = (
dctint)((t12a - t11a) * 11585
U           + (1 << 13)) >> 14;
 
 1599     t12  = (
dctint)((t12a + t11a) * 11585
U           + (1 << 13)) >> 14;
 
 1600     t18a = (
dctint)(  t29  *  6270
U - t18  * 15137
U  + (1 << 13)) >> 14;
 
 1601     t29a = (
dctint)(  t29  * 15137
U + t18  *  6270
U  + (1 << 13)) >> 14;
 
 1602     t19  = (
dctint)(  t28a *  6270
U - t19a * 15137
U  + (1 << 13)) >> 14;
 
 1603     t28  = (
dctint)(  t28a * 15137
U + t19a *  6270
U  + (1 << 13)) >> 14;
 
 1604     t20  = (
dctint)(-(t27a * 15137
U + t20a *  6270
U) + (1 << 13)) >> 14;
 
 1605     t27  = (
dctint)(  t27a *  6270
U - t20a * 15137
U  + (1 << 13)) >> 14;
 
 1606     t21a = (
dctint)(-(t26  * 15137
U + t21  *  6270
U) + (1 << 13)) >> 14;
 
 1607     t26a = (
dctint)(  t26  *  6270
U - t21  * 15137
U  + (1 << 13)) >> 14;
 
 1642     t20  = (
dctint)((t27a - t20a) * 11585
U + (1 << 13)) >> 14;
 
 1643     t27  = (
dctint)((t27a + t20a) * 11585
U + (1 << 13)) >> 14;
 
 1644     t21a = (
dctint)((t26  - t21 ) * 11585
U + (1 << 13)) >> 14;
 
 1645     t26a = (
dctint)((t26  + t21 ) * 11585
U + (1 << 13)) >> 14;
 
 1646     t22  = (
dctint)((t25a - t22a) * 11585
U + (1 << 13)) >> 14;
 
 1647     t25  = (
dctint)((t25a + t22a) * 11585
U + (1 << 13)) >> 14;
 
 1648     t23a = (
dctint)((t24  - t23 ) * 11585
U + (1 << 13)) >> 14;
 
 1649     t24a = (
dctint)((t24  + t23 ) * 11585
U + (1 << 13)) >> 14;
 
 1652     out[ 1] = 
t1   + t30a;
 
 1654     out[ 3] = 
t3   + t28a;
 
 1656     out[ 5] = t5a  + t26a;
 
 1657     out[ 6] = t6a  + t25;
 
 1658     out[ 7] = 
t7   + t24a;
 
 1659     out[ 8] = 
t8   + t23a;
 
 1660     out[ 9] = t9a  + t22;
 
 1662     out[11] = t11a + t20;
 
 1663     out[12] = t12a + t19a;
 
 1664     out[13] = t13  + t18;
 
 1665     out[14] = t14a + t17a;
 
 1668     out[17] = t14a - t17a;
 
 1669     out[18] = t13  - t18;
 
 1670     out[19] = t12a - t19a;
 
 1671     out[20] = t11a - t20;
 
 1673     out[22] = t9a  - t22;
 
 1674     out[23] = 
t8   - t23a;
 
 1675     out[24] = 
t7   - t24a;
 
 1676     out[25] = t6a  - t25;
 
 1677     out[26] = t5a  - t26a;
 
 1679     out[28] = 
t3   - t28a;
 
 1681     out[30] = 
t1   - t30a;
 
 1721 #undef itxfm_wrapper 
 1726 #define init_itxfm(tx, sz) \ 
 1727     dsp->itxfm_add[tx][DCT_DCT]   = idct_idct_##sz##_add_c; \ 
 1728     dsp->itxfm_add[tx][DCT_ADST]  = iadst_idct_##sz##_add_c; \ 
 1729     dsp->itxfm_add[tx][ADST_DCT]  = idct_iadst_##sz##_add_c; \ 
 1730     dsp->itxfm_add[tx][ADST_ADST] = iadst_iadst_##sz##_add_c 
 1732 #define init_idct(tx, nm) \ 
 1733     dsp->itxfm_add[tx][DCT_DCT]   = \ 
 1734     dsp->itxfm_add[tx][ADST_DCT]  = \ 
 1735     dsp->itxfm_add[tx][DCT_ADST]  = \ 
 1736     dsp->itxfm_add[tx][ADST_ADST] = nm##_add_c 
 1749                                          ptrdiff_t stridea, ptrdiff_t strideb,
 
 1757     for (
i = 0; 
i < 8; 
i++, dst += stridea) {
 
 1759         int p3 = dst[strideb * -4], p2 = dst[strideb * -3];
 
 1760         int p1 = dst[strideb * -2], p0 = dst[strideb * -1];
 
 1761         int q0 = dst[strideb * +0], 
q1 = dst[strideb * +1];
 
 1762         int q2 = dst[strideb * +2], q3 = dst[strideb * +3];
 
 1764         int fm = 
FFABS(p3 - p2) <= I && 
FFABS(p2 - p1) <= I &&
 
 1768         int flat8out, flat8in;
 
 1774             p7 = dst[strideb * -8];
 
 1775             p6 = dst[strideb * -7];
 
 1776             p5 = dst[strideb * -6];
 
 1777             p4 = dst[strideb * -5];
 
 1778             q4 = dst[strideb * +4];
 
 1779             q5 = dst[strideb * +5];
 
 1780             q6 = dst[strideb * +6];
 
 1781             q7 = dst[strideb * +7];
 
 1783             flat8out = 
FFABS(p7 - p0) <= 
F && 
FFABS(p6 - p0) <= 
F &&
 
 1790             flat8in = 
FFABS(p3 - p0) <= 
F && 
FFABS(p2 - p0) <= 
F &&
 
 1794         if (wd >= 16 && flat8out && flat8in) {
 
 1795             dst[strideb * -7] = (p7 + p7 + p7 + p7 + p7 + p7 + p7 + p6 * 2 +
 
 1796                                  p5 + p4 + p3 + p2 + p1 + p0 + 
q0 + 8) >> 4;
 
 1797             dst[strideb * -6] = (p7 + p7 + p7 + p7 + p7 + p7 + p6 + p5 * 2 +
 
 1798                                  p4 + p3 + p2 + p1 + p0 + 
q0 + 
q1 + 8) >> 4;
 
 1799             dst[strideb * -5] = (p7 + p7 + p7 + p7 + p7 + p6 + p5 + p4 * 2 +
 
 1800                                  p3 + p2 + p1 + p0 + 
q0 + 
q1 + q2 + 8) >> 4;
 
 1801             dst[strideb * -4] = (p7 + p7 + p7 + p7 + p6 + p5 + p4 + p3 * 2 +
 
 1802                                  p2 + p1 + p0 + 
q0 + 
q1 + q2 + q3 + 8) >> 4;
 
 1803             dst[strideb * -3] = (p7 + p7 + p7 + p6 + p5 + p4 + p3 + p2 * 2 +
 
 1804                                  p1 + p0 + 
q0 + 
q1 + q2 + q3 + q4 + 8) >> 4;
 
 1805             dst[strideb * -2] = (p7 + p7 + p6 + p5 + p4 + p3 + p2 + p1 * 2 +
 
 1806                                  p0 + 
q0 + 
q1 + q2 + q3 + q4 + q5 + 8) >> 4;
 
 1807             dst[strideb * -1] = (p7 + p6 + p5 + p4 + p3 + p2 + p1 + p0 * 2 +
 
 1808                                  q0 + 
q1 + q2 + q3 + q4 + q5 + q6 + 8) >> 4;
 
 1809             dst[strideb * +0] = (p6 + p5 + p4 + p3 + p2 + p1 + p0 + 
q0 * 2 +
 
 1810                                  q1 + q2 + q3 + q4 + q5 + q6 + q7 + 8) >> 4;
 
 1811             dst[strideb * +1] = (p5 + p4 + p3 + p2 + p1 + p0 + 
q0 + 
q1 * 2 +
 
 1812                                  q2 + q3 + q4 + q5 + q6 + q7 + q7 + 8) >> 4;
 
 1813             dst[strideb * +2] = (p4 + p3 + p2 + p1 + p0 + 
q0 + 
q1 + q2 * 2 +
 
 1814                                  q3 + q4 + q5 + q6 + q7 + q7 + q7 + 8) >> 4;
 
 1815             dst[strideb * +3] = (p3 + p2 + p1 + p0 + 
q0 + 
q1 + q2 + q3 * 2 +
 
 1816                                  q4 + q5 + q6 + q7 + q7 + q7 + q7 + 8) >> 4;
 
 1817             dst[strideb * +4] = (p2 + p1 + p0 + 
q0 + 
q1 + q2 + q3 + q4 * 2 +
 
 1818                                  q5 + q6 + q7 + q7 + q7 + q7 + q7 + 8) >> 4;
 
 1819             dst[strideb * +5] = (p1 + p0 + 
q0 + 
q1 + q2 + q3 + q4 + q5 * 2 +
 
 1820                                  q6 + q7 + q7 + q7 + q7 + q7 + q7 + 8) >> 4;
 
 1821             dst[strideb * +6] = (p0 + 
q0 + 
q1 + q2 + q3 + q4 + q5 + q6 * 2 +
 
 1822                                  q7 + q7 + q7 + q7 + q7 + q7 + q7 + 8) >> 4;
 
 1823         } 
else if (wd >= 8 && flat8in) {
 
 1824             dst[strideb * -3] = (p3 + p3 + p3 + 2 * p2 + p1 + p0 + 
q0 + 4) >> 3;
 
 1825             dst[strideb * -2] = (p3 + p3 + p2 + 2 * p1 + p0 + 
q0 + 
q1 + 4) >> 3;
 
 1826             dst[strideb * -1] = (p3 + p2 + p1 + 2 * p0 + 
q0 + 
q1 + q2 + 4) >> 3;
 
 1827             dst[strideb * +0] = (p2 + p1 + p0 + 2 * 
q0 + 
q1 + q2 + q3 + 4) >> 3;
 
 1828             dst[strideb * +1] = (p1 + p0 + 
q0 + 2 * 
q1 + q2 + q3 + q3 + 4) >> 3;
 
 1829             dst[strideb * +2] = (p0 + 
q0 + 
q1 + 2 * q2 + q3 + q3 + q3 + 4) >> 3;
 
 1843                 int f = av_clip_intp2(3 * (
q0 - p0), 
BIT_DEPTH - 1), f1, f2;
 
 1859 #define lf_8_fn(dir, wd, stridea, strideb) \ 
 1860 static void loop_filter_##dir##_##wd##_8_c(uint8_t *_dst, \ 
 1862                                            int E, int I, int H) \ 
 1864     pixel *dst = (pixel *) _dst; \ 
 1865     stride /= sizeof(pixel); \ 
 1866     loop_filter(dst, E, I, H, stridea, strideb, wd); \ 
 1869 #define lf_8_fns(wd) \ 
 1870 lf_8_fn(h, wd, stride, 1) \ 
 1871 lf_8_fn(v, wd, 1, stride) 
 1880 #define lf_16_fn(dir, stridea) \ 
 1881 static void loop_filter_##dir##_16_16_c(uint8_t *dst, \ 
 1883                                         int E, int I, int H) \ 
 1885     loop_filter_##dir##_16_8_c(dst, stride, E, I, H); \ 
 1886     loop_filter_##dir##_16_8_c(dst + 8 * stridea, stride, E, I, H); \ 
 1894 #define lf_mix_fn(dir, wd1, wd2, stridea) \ 
 1895 static void loop_filter_##dir##_##wd1##wd2##_16_c(uint8_t *dst, \ 
 1897                                                   int E, int I, int H) \ 
 1899     loop_filter_##dir##_##wd1##_8_c(dst, stride, E & 0xff, I & 0xff, H & 0xff); \ 
 1900     loop_filter_##dir##_##wd2##_8_c(dst + 8 * stridea, stride, E >> 8, I >> 8, H >> 8); \ 
 1903 #define lf_mix_fns(wd1, wd2) \ 
 1904 lf_mix_fn(h, wd1, wd2, stride) \ 
 1905 lf_mix_fn(v, wd1, wd2, sizeof(pixel)) 
 1952                                    const uint8_t *_src, ptrdiff_t src_stride,
 
 1958     dst_stride /= 
sizeof(
pixel);
 
 1959     src_stride /= 
sizeof(
pixel);
 
 1963         for (x = 0; x < 
w; x += 4)
 
 1971 #define fpel_fn(type, sz) \ 
 1972 static void type##sz##_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 1973                          const uint8_t *src, ptrdiff_t src_stride, \ 
 1974                          int h, int mx, int my) \ 
 1976     type##_c(dst, dst_stride, src, src_stride, sz, h); \ 
 1979 #define copy_avg_fn(sz) \ 
 1994 #define FILTER_8TAP(src, x, F, stride) \ 
 1995     av_clip_pixel((F[0] * src[x + -3 * stride] + \ 
 1996                    F[1] * src[x + -2 * stride] + \ 
 1997                    F[2] * src[x + -1 * stride] + \ 
 1998                    F[3] * src[x + +0 * stride] + \ 
 1999                    F[4] * src[x + +1 * stride] + \ 
 2000                    F[5] * src[x + +2 * stride] + \ 
 2001                    F[6] * src[x + +3 * stride] + \ 
 2002                    F[7] * src[x + +4 * stride] + 64) >> 7) 
 2005                                           const uint8_t *_src, ptrdiff_t src_stride,
 
 2006                                           int w, 
int h, ptrdiff_t ds,
 
 2012     dst_stride /= 
sizeof(
pixel);
 
 2013     src_stride /= 
sizeof(
pixel);
 
 2017         for (x = 0; x < 
w; x++)
 
 2029 #define filter_8tap_1d_fn(opn, opa, dir, ds) \ 
 2030 static av_noinline void opn##_8tap_1d_##dir##_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2031                                                 const uint8_t *src, ptrdiff_t src_stride, \ 
 2032                                                 int w, int h, const int16_t *filter) \ 
 2034     do_8tap_1d_c(dst, dst_stride, src, src_stride, w, h, ds, filter, opa); \ 
 2042 #undef filter_8tap_1d_fn 
 2045                                           const uint8_t *_src, ptrdiff_t src_stride,
 
 2046                                           int w, 
int h, 
const int16_t *filterx,
 
 2047                                           const int16_t *filtery, 
int avg)
 
 2054     dst_stride /= 
sizeof(
pixel);
 
 2055     src_stride /= 
sizeof(
pixel);
 
 2056     src -= src_stride * 3;
 
 2060         for (x = 0; x < 
w; x++)
 
 2067     tmp_ptr = 
tmp + 64 * 3;
 
 2071         for (x = 0; x < 
w; x++)
 
 2073                 dst[x] = (dst[x] + 
FILTER_8TAP(tmp_ptr, x, filtery, 64) + 1) >> 1;
 
 2083 #define filter_8tap_2d_fn(opn, opa) \ 
 2084 static av_noinline void opn##_8tap_2d_hv_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2085                                            const uint8_t *src, ptrdiff_t src_stride, \ 
 2086                                            int w, int h, const int16_t *filterx, \ 
 2087                                            const int16_t *filtery) \ 
 2089     do_8tap_2d_c(dst, dst_stride, src, src_stride, w, h, filterx, filtery, opa); \ 
 2095 #undef filter_8tap_2d_fn 
 2097 #define filter_fn_1d(sz, dir, dir_m, type, type_idx, avg) \ 
 2098 static void avg##_8tap_##type##_##sz##dir##_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2099                                               const uint8_t *src, ptrdiff_t src_stride, \ 
 2100                                               int h, int mx, int my) \ 
 2102     avg##_8tap_1d_##dir##_c(dst, dst_stride, src, src_stride, sz, h, \ 
 2103                             ff_vp9_subpel_filters[type_idx][dir_m]); \ 
 2106 #define filter_fn_2d(sz, type, type_idx, avg) \ 
 2107 static void avg##_8tap_##type##_##sz##hv_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2108                                            const uint8_t *src, ptrdiff_t src_stride, \ 
 2109                                            int h, int mx, int my) \ 
 2111     avg##_8tap_2d_hv_c(dst, dst_stride, src, src_stride, sz, h, \ 
 2112                        ff_vp9_subpel_filters[type_idx][mx], \ 
 2113                        ff_vp9_subpel_filters[type_idx][my]); \ 
 2118 #define FILTER_BILIN(src, x, mxy, stride) \ 
 2119     (src[x] + ((mxy * (src[x + stride] - src[x]) + 8) >> 4)) 
 2122                                            const uint8_t *_src, ptrdiff_t src_stride,
 
 2123                                            int w, 
int h, ptrdiff_t ds, 
int mxy, 
int avg)
 
 2128     dst_stride /= 
sizeof(
pixel);
 
 2129     src_stride /= 
sizeof(
pixel);
 
 2133         for (x = 0; x < 
w; x++)
 
 2145 #define bilin_1d_fn(opn, opa, dir, ds) \ 
 2146 static av_noinline void opn##_bilin_1d_##dir##_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2147                                                  const uint8_t *src, ptrdiff_t src_stride, \ 
 2148                                                  int w, int h, int mxy) \ 
 2150     do_bilin_1d_c(dst, dst_stride, src, src_stride, w, h, ds, mxy, opa); \ 
 2161                                            const uint8_t *_src, ptrdiff_t src_stride,
 
 2162                                            int w, 
int h, 
int mx, 
int my, 
int avg)
 
 2169     dst_stride /= 
sizeof(
pixel);
 
 2170     src_stride /= 
sizeof(
pixel);
 
 2174         for (x = 0; x < 
w; x++)
 
 2185         for (x = 0; x < 
w; x++)
 
 2187                 dst[x] = (dst[x] + 
FILTER_BILIN(tmp_ptr, x, my, 64) + 1) >> 1;
 
 2197 #define bilin_2d_fn(opn, opa) \ 
 2198 static av_noinline void opn##_bilin_2d_hv_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2199                                             const uint8_t *src, ptrdiff_t src_stride, \ 
 2200                                             int w, int h, int mx, int my) \ 
 2202     do_bilin_2d_c(dst, dst_stride, src, src_stride, w, h, mx, my, opa); \ 
 2210 #define bilinf_fn_1d(sz, dir, dir_m, avg) \ 
 2211 static void avg##_bilin_##sz##dir##_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2212                                       const uint8_t *src, ptrdiff_t src_stride, \ 
 2213                                       int h, int mx, int my) \ 
 2215     avg##_bilin_1d_##dir##_c(dst, dst_stride, src, src_stride, sz, h, dir_m); \ 
 2218 #define bilinf_fn_2d(sz, avg) \ 
 2219 static void avg##_bilin_##sz##hv_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2220                                    const uint8_t *src, ptrdiff_t src_stride, \ 
 2221                                    int h, int mx, int my) \ 
 2223     avg##_bilin_2d_hv_c(dst, dst_stride, src, src_stride, sz, h, mx, my); \ 
 2228 #define bilinf_fn_1d(a, b, c, d) 
 2229 #define bilinf_fn_2d(a, b) 
 2233 #define filter_fn(sz, avg) \ 
 2234 filter_fn_1d(sz, h, mx, regular, FILTER_8TAP_REGULAR, avg) \ 
 2235 filter_fn_1d(sz, v, my, regular, FILTER_8TAP_REGULAR, avg) \ 
 2236 filter_fn_2d(sz,        regular, FILTER_8TAP_REGULAR, avg) \ 
 2237 filter_fn_1d(sz, h, mx, smooth,  FILTER_8TAP_SMOOTH,  avg) \ 
 2238 filter_fn_1d(sz, v, my, smooth,  FILTER_8TAP_SMOOTH,  avg) \ 
 2239 filter_fn_2d(sz,        smooth,  FILTER_8TAP_SMOOTH,  avg) \ 
 2240 filter_fn_1d(sz, h, mx, sharp,   FILTER_8TAP_SHARP,   avg) \ 
 2241 filter_fn_1d(sz, v, my, sharp,   FILTER_8TAP_SHARP,   avg) \ 
 2242 filter_fn_2d(sz,        sharp,   FILTER_8TAP_SHARP,   avg) \ 
 2243 bilinf_fn_1d(sz, h, mx,                               avg) \ 
 2244 bilinf_fn_1d(sz, v, my,                               avg) \ 
 2245 bilinf_fn_2d(sz,                                      avg) 
 2247 #define filter_fn_set(avg) \ 
 2248 filter_fn(64, avg) \ 
 2249 filter_fn(32, avg) \ 
 2250 filter_fn(16, avg) \ 
 2258 #undef filter_fn_set 
 2273     ff_vp9dsp_mc_init_10(dsp);
 
 2276 #define init_fpel(idx1, idx2, sz, type) \ 
 2277     dsp->mc[idx1][FILTER_8TAP_SMOOTH ][idx2][0][0] = type##sz##_c; \ 
 2278     dsp->mc[idx1][FILTER_8TAP_REGULAR][idx2][0][0] = type##sz##_c; \ 
 2279     dsp->mc[idx1][FILTER_8TAP_SHARP  ][idx2][0][0] = type##sz##_c; \ 
 2280     dsp->mc[idx1][FILTER_BILINEAR    ][idx2][0][0] = type##sz##_c 
 2282 #define init_copy_avg(idx, sz) \ 
 2283     init_fpel(idx, 0, sz, copy); \ 
 2284     init_fpel(idx, 1, sz, avg) 
 2292 #undef init_copy_avg 
 2297 #define init_subpel1_bd_aware(idx1, idx2, idxh, idxv, sz, dir, type) \ 
 2298     dsp->mc[idx1][FILTER_8TAP_SMOOTH ][idx2][idxh][idxv] = type##_8tap_smooth_##sz##dir##_c; \ 
 2299     dsp->mc[idx1][FILTER_8TAP_REGULAR][idx2][idxh][idxv] = type##_8tap_regular_##sz##dir##_c; \ 
 2300     dsp->mc[idx1][FILTER_8TAP_SHARP  ][idx2][idxh][idxv] = type##_8tap_sharp_##sz##dir##_c 
 2303 #define init_subpel1 init_subpel1_bd_aware 
 2305 #define init_subpel1(idx1, idx2, idxh, idxv, sz, dir, type) \ 
 2306     init_subpel1_bd_aware(idx1, idx2, idxh, idxv, sz, dir, type); \ 
 2307     dsp->mc[idx1][FILTER_BILINEAR    ][idx2][idxh][idxv] = type##_bilin_##sz##dir##_c 
 2310 #define init_subpel2(idx, idxh, idxv, dir, type) \ 
 2311     init_subpel1(0, idx, idxh, idxv, 64, dir, type); \ 
 2312     init_subpel1(1, idx, idxh, idxv, 32, dir, type); \ 
 2313     init_subpel1(2, idx, idxh, idxv, 16, dir, type); \ 
 2314     init_subpel1(3, idx, idxh, idxv,  8, dir, type); \ 
 2315     init_subpel1(4, idx, idxh, idxv,  4, dir, type) 
 2317 #define init_subpel3(idx, type) \ 
 2318     init_subpel2(idx, 1, 1, hv, type); \ 
 2319     init_subpel2(idx, 0, 1, v, type); \ 
 2320     init_subpel2(idx, 1, 0, h, type) 
 2328 #undef init_subpel1_bd_aware 
 2332                                               const uint8_t *_src, ptrdiff_t src_stride,
 
 2333                                               int w, 
int h, 
int mx, 
int my,
 
 2334                                               int dx, 
int dy, 
int avg,
 
 2337     int tmp_h = (((
h - 1) * dy + my) >> 4) + 8;
 
 2342     dst_stride /= 
sizeof(
pixel);
 
 2343     src_stride /= 
sizeof(
pixel);
 
 2344     src -= src_stride * 3;
 
 2347         int imx = mx, ioff = 0;
 
 2349         for (x = 0; x < 
w; x++) {
 
 2360     tmp_ptr = 
tmp + 64 * 3;
 
 2365         for (x = 0; x < 
w; x++)
 
 2373         tmp_ptr += (my >> 4) * 64;
 
 2379 #define scaled_filter_8tap_fn(opn, opa) \ 
 2380 static av_noinline void opn##_scaled_8tap_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2381                                             const uint8_t *src, ptrdiff_t src_stride, \ 
 2382                                             int w, int h, int mx, int my, int dx, int dy, \ 
 2383                                             const int16_t (*filters)[8]) \ 
 2385     do_scaled_8tap_c(dst, dst_stride, src, src_stride, w, h, mx, my, dx, dy, \ 
 2392 #undef scaled_filter_8tap_fn 
 2396 #define scaled_filter_fn(sz, type, type_idx, avg) \ 
 2397 static void avg##_scaled_##type##_##sz##_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2398                                            const uint8_t *src, ptrdiff_t src_stride, \ 
 2399                                            int h, int mx, int my, int dx, int dy) \ 
 2401     avg##_scaled_8tap_c(dst, dst_stride, src, src_stride, sz, h, mx, my, dx, dy, \ 
 2402                         ff_vp9_subpel_filters[type_idx]); \ 
 2408                                                const uint8_t *_src, ptrdiff_t src_stride,
 
 2409                                                int w, 
int h, 
int mx, 
int my,
 
 2410                                                int dx, 
int dy, 
int avg)
 
 2413     int tmp_h = (((
h - 1) * dy + my) >> 4) + 2;
 
 2417     dst_stride /= 
sizeof(
pixel);
 
 2418     src_stride /= 
sizeof(
pixel);
 
 2421         int imx = mx, ioff = 0;
 
 2423         for (x = 0; x < 
w; x++) {
 
 2438         for (x = 0; x < 
w; x++)
 
 2440                 dst[x] = (dst[x] + 
FILTER_BILIN(tmp_ptr, x, my, 64) + 1) >> 1;
 
 2446         tmp_ptr += (my >> 4) * 64;
 
 2452 #define scaled_bilin_fn(opn, opa) \ 
 2453 static av_noinline void opn##_scaled_bilin_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2454                                              const uint8_t *src, ptrdiff_t src_stride, \ 
 2455                                              int w, int h, int mx, int my, int dx, int dy) \ 
 2457     do_scaled_bilin_c(dst, dst_stride, src, src_stride, w, h, mx, my, dx, dy, opa); \ 
 2463 #undef scaled_bilin_fn 
 2467 #define scaled_bilinf_fn(sz, avg) \ 
 2468 static void avg##_scaled_bilin_##sz##_c(uint8_t *dst, ptrdiff_t dst_stride, \ 
 2469                                         const uint8_t *src, ptrdiff_t src_stride, \ 
 2470                                         int h, int mx, int my, int dx, int dy) \ 
 2472     avg##_scaled_bilin_c(dst, dst_stride, src, src_stride, sz, h, mx, my, dx, dy); \ 
 2477 #define scaled_bilinf_fn(a, b) 
 2481 #define scaled_filter_fns(sz, avg) \ 
 2482 scaled_filter_fn(sz,        regular, FILTER_8TAP_REGULAR, avg) \ 
 2483 scaled_filter_fn(sz,        smooth,  FILTER_8TAP_SMOOTH,  avg) \ 
 2484 scaled_filter_fn(sz,        sharp,   FILTER_8TAP_SHARP,   avg) \ 
 2485 scaled_bilinf_fn(sz,                                      avg) 
 2487 #define scaled_filter_fn_set(avg) \ 
 2488 scaled_filter_fns(64, avg) \ 
 2489 scaled_filter_fns(32, avg) \ 
 2490 scaled_filter_fns(16, avg) \ 
 2491 scaled_filter_fns(8,  avg) \ 
 2492 scaled_filter_fns(4,  avg) 
 2497 #undef scaled_filter_fns 
 2498 #undef scaled_filter_fn_set 
 2499 #undef scaled_filter_fn 
 2500 #undef scaled_bilinf_fn 
 2510 #define init_scaled_bd_aware(idx1, idx2, sz, type) \ 
 2511     dsp->smc[idx1][FILTER_8TAP_SMOOTH ][idx2] = type##_scaled_smooth_##sz##_c; \ 
 2512     dsp->smc[idx1][FILTER_8TAP_REGULAR][idx2] = type##_scaled_regular_##sz##_c; \ 
 2513     dsp->smc[idx1][FILTER_8TAP_SHARP  ][idx2] = type##_scaled_sharp_##sz##_c 
 2516     ff_vp9dsp_scaled_mc_init_10(dsp);
 
 2517 #define init_scaled(a,b,c,d) init_scaled_bd_aware(a,b,c,d) 
 2519 #define init_scaled(idx1, idx2, sz, type) \ 
 2520     init_scaled_bd_aware(idx1, idx2, sz, type); \ 
 2521     dsp->smc[idx1][FILTER_BILINEAR    ][idx2] = type##_scaled_bilin_##sz##_c 
 2524 #define init_scaled_put_avg(idx, sz) \ 
 2525     init_scaled(idx, 0, sz, put); \ 
 2526     init_scaled(idx, 1, sz, avg) 
 2534 #undef init_scaled_put_avg 
 2536 #undef init_scaled_bd_aware 
 2541     FUNC(ff_vp9dsp_intrapred_init)(dsp);
 
 2542     vp9dsp_itxfm_init(dsp);
 
 2543     vp9dsp_loopfilter_init(dsp);
 
 2544     FUNC(ff_vp9dsp_mc_init)(dsp);
 
 2545     FUNC(ff_vp9dsp_scaled_mc_init)(dsp);
 
  
static const uint8_t q1[256]
#define FILTER_8TAP(src, x, F, stride)
#define init_intra_pred(tx, sz)
static void dc_top_32x32_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *_top)
static const struct PPFilter filters[]
static av_always_inline void idct4_1d(const dctcoef *in, ptrdiff_t stride, dctcoef *out, int pass)
#define init_idct(tx, nm)
#define lf_16_fn(dir, stridea)
#define init_copy_avg(idx, sz)
void(* loop_filter_8[3][2])(uint8_t *dst, ptrdiff_t stride, int mb_lim, int lim, int hev_thr)
#define lf_mix_fns(wd1, wd2)
static void hor_8x8_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *top)
static void tm_32x32_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *_top)
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
#define init_itxfm(tx, sz)
#define def_diag_downleft(size)
static void memset_bpc(uint16_t *dst, int val, int len)
static void diag_downleft_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *_top)
void(* loop_filter_mix2[2][2][2])(uint8_t *dst, ptrdiff_t stride, int mb_lim, int lim, int hev_thr)
static av_always_inline void loop_filter(pixel *dst, int E, int I, int H, ptrdiff_t stridea, ptrdiff_t strideb, int wd)
static void dc_left_32x32_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *top)
static av_always_inline void iadst8_1d(const dctcoef *in, ptrdiff_t stride, dctcoef *out, int pass)
static av_always_inline void do_bilin_2d_c(uint8_t *_dst, ptrdiff_t dst_stride, const uint8_t *_src, ptrdiff_t src_stride, int w, int h, int mx, int my, int avg)
static void idct(int16_t block[64])
static av_always_inline void copy_c(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int w, int h)
#define itxfm_wrapper(type_a, type_b, sz, bits, has_dconly)
static void tm_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *_top)
static int t15(InterplayACMContext *s, unsigned ind, unsigned col)
static void vert_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *_top)
static void dc_129_16x16_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
static void dc_127_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
#define scaled_bilin_fn(opn, opa)
static void dc_128_32x32_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
#define PIXEL_SPLAT_X4(x)
static void tm_16x16_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *_top)
static const uint8_t q0[256]
static void vert_32x32_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *_top)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static av_always_inline void do_scaled_8tap_c(uint8_t *_dst, ptrdiff_t dst_stride, const uint8_t *_src, ptrdiff_t src_stride, int w, int h, int mx, int my, int dx, int dy, int avg, const int16_t(*filters)[8])
static void tm_8x8_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *_top)
#define FILTER_BILIN(src, x, mxy, stride)
static av_always_inline void avg_c(uint8_t *_dst, ptrdiff_t dst_stride, const uint8_t *_src, ptrdiff_t src_stride, int w, int h)
F H1 F F H1 F F F F H1<-F-------F-------F v v v H2 H3 H2 ^ ^ ^ F-------F-------F-> H1<-F-------F-------F|||||||||F H1 F|||||||||F H1 Funavailable fullpel samples(outside the picture for example) shall be equalto the closest available fullpel sampleSmaller pel interpolation:--------------------------if diag_mc is set then points which lie on a line between 2 vertically, horizontally or diagonally adjacent halfpel points shall be interpolatedlinearly with rounding to nearest and halfway values rounded up.points which lie on 2 diagonals at the same time should only use the onediagonal not containing the fullpel point F--> O q O<--h1-> O q O<--F v \/v \/v O O O O O O O|/|\|q q q q q|/|\|O O O O O O O ^/\ ^/\ ^ h2--> O q O<--h3-> O q O<--h2 v \/v \/v O O O O O O O|\|/|q q q q q|\|/|O O O O O O O ^/\ ^/\ ^ F--> O q O<--h1-> O q O<--Fthe remaining points shall be bilinearly interpolated from theup to 4 surrounding halfpel and fullpel points, again rounding should be tonearest and halfway values rounded upcompliant Snow decoders MUST support 1-1/8 pel luma and 1/2-1/16 pel chromainterpolation at leastOverlapped block motion compensation:-------------------------------------FIXMELL band prediction:===================Each sample in the LL0 subband is predicted by the median of the left, top andleft+top-topleft samples, samples outside the subband shall be considered tobe 0. To reverse this prediction in the decoder apply the following.for(y=0;y< height;y++){ for(x=0;x< width;x++){ sample[y][x]+=median(sample[y-1][x], sample[y][x-1], sample[y-1][x]+sample[y][x-1]-sample[y-1][x-1]);}}sample[-1][ *]=sample[ *][-1]=0;width, height here are the width and height of the LL0 subband not of the finalvideoDequantization:===============FIXMEWavelet Transform:==================Snow supports 2 wavelet transforms, the symmetric biorthogonal 5/3 integertransform and an integer approximation of the symmetric biorthogonal 9/7daubechies wavelet.2D IDWT(inverse discrete wavelet transform) --------------------------------------------The 2D IDWT applies a 2D filter recursively, each time combining the4 lowest frequency subbands into a single subband until only 1 subbandremains.The 2D filter is done by first applying a 1D filter in the vertical directionand then applying it in the horizontal one. --------------- --------------- --------------- ---------------|LL0|HL0|||||||||||||---+---|HL1||L0|H0|HL1||LL1|HL1|||||LH0|HH0|||||||||||||-------+-------|-> L1 H1 LH1 HH1 LH1 HH1 LH1 HH1 this can end with a L or a H
static void dc_127_32x32_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
static void dc_16x16_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *_top)
static void hor_32x32_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *top)
static void dc_127_8x8_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
static void dc_left_8x8_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *top)
static void dc_128_8x8_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
static void dc_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *_top)
#define filter_8tap_1d_fn(opn, opa, dir, ds)
#define init_scaled_put_avg(idx, sz)
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 top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
#define def_hor_down(size)
static void dc_8x8_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *_top)
static int t27(InterplayACMContext *s, unsigned ind, unsigned col)
static void dc_129_8x8_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
const char const char void * val
static void av_always_inline idct16_1d(float *dst, const float *src, int dst_stridea, int dst_strideb, int src_stridea, int src_strideb, int add)
av_cold void FUNC() ff_vp9dsp_init(VP9DSPContext *dsp)
static av_always_inline void iadst16_1d(const dctcoef *in, ptrdiff_t stride, dctcoef *out, int pass)
static void dc_top_16x16_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *_top)
static void dc_128_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
static void dc_top_8x8_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *_top)
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
#define i(width, name, range_min, range_max)
static av_always_inline void iadst4_1d(const dctcoef *in, ptrdiff_t stride, dctcoef *out, int pass)
#define scaled_filter_fn_set(avg)
static void dc_129_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
#define def_diag_downright(size)
static void hor_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *top)
static void dc_left_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *top)
static void dc_128_16x16_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
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
static void dc_left_16x16_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *top)
static void vert_8x8_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *_top)
static void av_always_inline idct8_1d(float *dst, const float *src, int dst_stridea, int dst_strideb, int src_stridea, int src_strideb, int add)
#define bilin_1d_fn(opn, opa, dir, ds)
#define filter_8tap_2d_fn(opn, opa)
#define filter_fn_set(avg)
#define itxfm_wrap(sz, bits)
static av_always_inline int hev(uint8_t *p, ptrdiff_t stride, int thresh)
static void dc_top_4x4_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *_top)
#define scaled_filter_8tap_fn(opn, opa)
static void dc_127_16x16_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)
#define init_subpel3(idx, type)
#define def_vert_left(size)
void(* loop_filter_16[2])(uint8_t *dst, ptrdiff_t stride, int mb_lim, int lim, int hev_thr)
static void dc_32x32_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *_top)
#define def_vert_right(size)
static void hor_16x16_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *_left, const uint8_t *top)
static av_always_inline void do_8tap_2d_c(uint8_t *_dst, ptrdiff_t dst_stride, const uint8_t *_src, ptrdiff_t src_stride, int w, int h, const int16_t *filterx, const int16_t *filtery, int avg)
static void vert_16x16_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *_top)
#define bilin_2d_fn(opn, opa)
static void dc_129_32x32_c(uint8_t *_dst, ptrdiff_t stride, const uint8_t *left, const uint8_t *top)