34 #define VP9_SYNCCODE 0x498342
193 unsigned coef[4][2][2][6][6][3];
194 unsigned eob[4][2][2][6][6][2];
233 { 16, 16 }, { 16, 8 }, { 8, 16 }, { 8, 8 }, { 8, 4 }, { 4, 8 },
234 { 4, 4 }, { 4, 2 }, { 2, 4 }, { 2, 2 }, { 2, 1 }, { 1, 2 }, { 1, 1 },
236 { 8, 8 }, { 8, 4 }, { 4, 8 }, { 4, 4 }, { 4, 2 }, { 2, 4 },
237 { 2, 2 }, { 2, 1 }, { 1, 2 }, { 1, 1 }, { 1, 1 }, { 1, 1 }, { 1, 1 },
253 s->
cols = (w + 7) >> 3;
254 s->
rows = (h + 7) >> 3;
256 #define assign(var, type, n) var = (type) p; p += s->sb_cols * n * sizeof(*var)
259 64 * s->
sb_rows * (1 +
sizeof(*s->
mv[0]) * 2)));
296 return v > 2 * m ? v : v & 1 ? m - ((v + 1) >> 1) : m + (v >> 1);
302 static const int inv_map_table[254] = {
303 7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176,
304 189, 202, 215, 228, 241, 254, 1, 2, 3, 4, 5, 6, 8, 9,
305 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24,
306 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39,
307 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54,
308 55, 56, 57, 58, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
309 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
310 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 100,
311 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115,
312 116, 117, 118, 119, 120, 121, 122, 123, 125, 126, 127, 128, 129, 130,
313 131, 132, 133, 134, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145,
314 146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
315 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
316 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191,
317 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 205, 206,
318 207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221,
319 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 236,
320 237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
361 int c, i, j, k, l,
m,
n, w, h, max, size2,
res, sharp;
483 for (i = 0; i < 4; i++)
486 for (i = 0; i < 2; i++)
505 for (i = 0; i < 7; i++)
509 for (i = 0; i < 3; i++)
516 for (i = 0; i < 8; i++) {
535 int qyac, qydc, quvac, quvdc, lflvl, sh;
545 qydc = av_clip_uintp2(qyac + s->
ydc_qdelta, 8);
548 qyac = av_clip_uintp2(qyac, 8);
566 av_clip_uintp2(lflvl + (s->
lf_delta.
ref[0] << sh), 6);
567 for (j = 1; j < 4; j++) {
585 for (max = 0; (s->
sb_cols >> max) >= 4; max++) ;
586 max =
FFMAX(0, max - 1);
621 if (size2 > size - (data2 - data)) {
650 for (i = 0; i < 2; i++)
653 for (i = 0; i < 2; i++)
654 for (j = 0; j < 2; j++)
658 for (i = 0; i < 2; i++)
659 for (j = 0; j < 3; j++)
667 for (i = 0; i < 4; i++) {
670 for (j = 0; j < 2; j++)
671 for (k = 0; k < 2; k++)
672 for (l = 0; l < 6; l++)
673 for (m = 0; m < 6; m++) {
676 if (m >= 3 && l == 0)
678 for (n = 0; n < 3; n++) {
688 for (j = 0; j < 2; j++)
689 for (k = 0; k < 2; k++)
690 for (l = 0; l < 6; l++)
691 for (m = 0; m < 6; m++) {
705 for (i = 0; i < 3; i++)
709 for (i = 0; i < 7; i++)
710 for (j = 0; j < 3; j++)
716 for (i = 0; i < 4; i++)
717 for (j = 0; j < 2; j++)
722 for (i = 0; i < 4; i++)
731 for (i = 0; i < 5; i++)
740 for (i = 0; i < 5; i++) {
751 for (i = 0; i < 5; i++)
757 for (i = 0; i < 4; i++)
758 for (j = 0; j < 9; j++)
763 for (i = 0; i < 4; i++)
764 for (j = 0; j < 4; j++)
765 for (k = 0; k < 3; k++)
771 for (i = 0; i < 3; i++)
775 for (i = 0; i < 2; i++) {
779 for (j = 0; j < 10; j++)
787 for (j = 0; j < 10; j++)
793 for (i = 0; i < 2; i++) {
794 for (j = 0; j < 2; j++)
795 for (k = 0; k < 3; k++)
800 for (j = 0; j < 3; j++)
807 for (i = 0; i < 2; i++) {
819 return (data2 - data) + size2;
830 VP56mv *pmv,
int ref,
int z,
int idx,
int sb)
832 static const int8_t mv_ref_blk_off[
N_BS_SIZES][8][2] = {
833 [
BS_64x64] = {{ 3, -1 }, { -1, 3 }, { 4, -1 }, { -1, 4 },
834 { -1, -1 }, { 0, -1 }, { -1, 0 }, { 6, -1 }},
835 [
BS_64x32] = {{ 0, -1 }, { -1, 0 }, { 4, -1 }, { -1, 2 },
836 { -1, -1 }, { 0, -3 }, { -3, 0 }, { 2, -1 }},
837 [
BS_32x64] = {{ -1, 0 }, { 0, -1 }, { -1, 4 }, { 2, -1 },
838 { -1, -1 }, { -3, 0 }, { 0, -3 }, { -1, 2 }},
839 [
BS_32x32] = {{ 1, -1 }, { -1, 1 }, { 2, -1 }, { -1, 2 },
840 { -1, -1 }, { 0, -3 }, { -3, 0 }, { -3, -3 }},
841 [
BS_32x16] = {{ 0, -1 }, { -1, 0 }, { 2, -1 }, { -1, -1 },
842 { -1, 1 }, { 0, -3 }, { -3, 0 }, { -3, -3 }},
843 [
BS_16x32] = {{ -1, 0 }, { 0, -1 }, { -1, 2 }, { -1, -1 },
844 { 1, -1 }, { -3, 0 }, { 0, -3 }, { -3, -3 }},
845 [
BS_16x16] = {{ 0, -1 }, { -1, 0 }, { 1, -1 }, { -1, 1 },
846 { -1, -1 }, { 0, -3 }, { -3, 0 }, { -3, -3 }},
847 [
BS_16x8] = {{ 0, -1 }, { -1, 0 }, { 1, -1 }, { -1, -1 },
848 { 0, -2 }, { -2, 0 }, { -2, -1 }, { -1, -2 }},
849 [
BS_8x16] = {{ -1, 0 }, { 0, -1 }, { -1, 1 }, { -1, -1 },
850 { -2, 0 }, { 0, -2 }, { -1, -2 }, { -2, -1 }},
851 [
BS_8x8] = {{ 0, -1 }, { -1, 0 }, { -1, -1 }, { 0, -2 },
852 { -2, 0 }, { -1, -2 }, { -2, -1 }, { -2, -2 }},
853 [
BS_8x4] = {{ 0, -1 }, { -1, 0 }, { -1, -1 }, { 0, -2 },
854 { -2, 0 }, { -1, -2 }, { -2, -1 }, { -2, -2 }},
855 [
BS_4x8] = {{ 0, -1 }, { -1, 0 }, { -1, -1 }, { 0, -2 },
856 { -2, 0 }, { -1, -2 }, { -2, -1 }, { -2, -2 }},
857 [
BS_4x4] = {{ 0, -1 }, { -1, 0 }, { -1, -1 }, { 0, -2 },
858 { -2, 0 }, { -1, -2 }, { -2, -1 }, { -2, -2 }},
861 int row = b->
row, col = b->
col, row7 = b->
row7;
862 const int8_t (*p)[2] = mv_ref_blk_off[b->
bs];
863 #define INVALID_MV 0x80008000U
867 #define RETURN_DIRECT_MV(mv) \
869 uint32_t m = AV_RN32A(&mv); \
873 } else if (mem == INVALID_MV) { \
875 } else if (m != mem) { \
882 if (sb == 2 || sb == 1) {
884 }
else if (sb == 3) {
890 #define RETURN_MV(mv) \
895 clamp_mv(&tmp, &mv, s); \
896 m = AV_RN32A(&tmp); \
900 } else if (mem == INVALID_MV) { \
902 } else if (m != mem) { \
907 uint32_t m = AV_RN32A(&mv); \
909 clamp_mv(pmv, &mv, s); \
911 } else if (mem == INVALID_MV) { \
913 } else if (m != mem) { \
914 clamp_mv(pmv, &mv, s); \
922 if (mv->
ref[0] == ref) {
924 }
else if (mv->
ref[1] == ref) {
930 if (mv->
ref[0] == ref) {
932 }
else if (mv->
ref[1] == ref) {
943 int c = p[i][0] + col,
r = p[i][1] + row;
948 if (mv->
ref[0] == ref) {
950 }
else if (mv->
ref[1] == ref) {
960 if (mv->
ref[0] == ref) {
962 }
else if (mv->
ref[1] == ref) {
967 #define RETURN_SCALE_MV(mv, scale) \
970 VP56mv mv_temp = { -mv.x, -mv.y }; \
971 RETURN_MV(mv_temp); \
978 for (i = 0; i < 8; i++) {
979 int c = p[i][0] + col,
r = p[i][1] + row;
984 if (mv->
ref[0] != ref && mv->
ref[0] >= 0) {
987 if (mv->
ref[1] != ref && mv->
ref[1] >= 0) {
997 if (mv->
ref[0] != ref && mv->
ref[0] >= 0) {
1000 if (mv->
ref[1] != ref && mv->
ref[1] >= 0) {
1008 #undef RETURN_SCALE_MV
1022 for (n = 0, m = 0; m <
c; m++) {
1048 n = (n << 3) | (bit << 1);
1061 return sign ? -(n + 1) : (n + 1);
1070 memset(mv, 0,
sizeof(*mv) * 2);
1076 mode ==
NEWMV ? -1 : sb);
1078 if ((mode ==
NEWMV || sb == -1) &&
1093 if (mode ==
NEWMV) {
1107 mode ==
NEWMV ? -1 : sb);
1108 if ((mode ==
NEWMV || sb == -1) &&
1123 if (mode ==
NEWMV) {
1140 0x0, 0x8, 0x0, 0x8, 0xc, 0x8, 0xc, 0xe, 0xc, 0xe, 0xf, 0xe, 0xf
1143 0x0, 0x0, 0x8, 0x8, 0x8, 0xc, 0xc, 0xc, 0xe, 0xe, 0xe, 0xf, 0xf
1151 int row = b->
row, col = b->
col, row7 = b->
row7;
1152 enum TxfmMode max_tx = max_tx_for_bl_bp[b->
bs];
1169 for (
y = 0;
y < h4;
y++)
1170 for (x = 0; x < w4; x++)
1185 for (
y = 0;
y < h4;
y++)
1205 if (have_a && have_l) {
1229 }
else if (have_l) {
1277 l[0] = a[1] = b->
mode[1];
1279 l[0] = a[1] = b->
mode[1] = b->
mode[0];
1287 l[1] = a[1] = b->
mode[3];
1289 l[1] = a[1] = b->
mode[3] = b->
mode[2];
1293 l[1] = a[1] = b->
mode[3] = b->
mode[1];
1305 }
else if (b->
intra) {
1334 static const uint8_t size_group[10] = {
1335 3, 3, 3, 3, 2, 2, 2, 1, 1, 1
1337 int sz = size_group[b->
bs];
1348 static const uint8_t inter_mode_ctx_lut[14][14] = {
1349 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1350 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1351 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1352 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1353 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1354 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1355 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1356 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1357 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1358 { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5 },
1359 { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 1, 3 },
1360 { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 1, 3 },
1361 { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 0, 3 },
1362 { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 4 },
1397 }
else if (have_l) {
1428 if (refl == refa && refa == s->
varcompref[1]) {
1435 c = (refa == refl) ? 3 : 1;
1452 c = (refl == refa) ? 4 : 2;
1464 }
else if (have_l) {
1590 }
else if (have_l) {
1604 b->
ref[0] = 1 + bit;
1614 3, 0, 0, 1, 0, 0, 0, 0, 0, 0
1739 for (n = 0; n < w4 * 2; n++) {
1743 for (n = 0; n < h4 * 2; n++) {
1759 for (
y = 0;
y < h4;
y++) {
1760 int x, o = (row +
y) * s->
sb_cols * 8 + col;
1763 for (x = 0; x < w4; x++) {
1764 s->
mv[0][o + x].
ref[0] =
1765 s->
mv[0][o + x].
ref[1] = -1;
1767 }
else if (b->
comp) {
1768 for (x = 0; x < w4; x++) {
1769 s->
mv[0][o + x].
ref[0] = b->
ref[0];
1770 s->
mv[0][o + x].
ref[1] = b->
ref[1];
1775 for (x = 0; x < w4; x++) {
1776 s->
mv[0][o + x].
ref[0] = b->
ref[0];
1777 s->
mv[0][o + x].
ref[1] = -1;
1786 enum TxfmMode tx,
unsigned (*cnt)[6][3],
1787 unsigned (*eob)[6][2],
uint8_t (*p)[6][11],
1788 int nnz,
const int16_t *scan,
const int16_t (*nb)[2],
1789 const int16_t *band_counts,
const int16_t *qmul)
1791 int i = 0,
band = 0, band_left = band_counts[
band];
1805 cnt[
band][nnz][0]++;
1807 band_left = band_counts[++
band];
1809 nnz = (1 + cache[nb[i][0]] + cache[nb[i][1]]) >> 1;
1811 if (++i == n_coeffs)
1818 cnt[
band][nnz][1]++;
1826 cnt[
band][nnz][2]++;
1829 cache[rc] = val = 2;
1880 band_left = band_counts[++
band];
1885 nnz = (1 + cache[nb[i][0]] + cache[nb[i][1]]) >> 1;
1887 }
while (++i < n_coeffs);
1896 int row = b->
row, col = b->
col;
1901 int end_x =
FFMIN(2 * (s->
cols - col), w4);
1902 int end_y =
FFMIN(2 * (s->
rows - row), h4);
1903 int n, pl, x,
y, step1d = 1 << b->tx, step = 1 << (b->tx * 2);
1904 int uvstep1d = 1 << b->
uvtx, uvstep = 1 << (b->
uvtx * 2),
res;
1913 static const int16_t band_counts[4][8] = {
1914 { 1, 2, 3, 4, 3, 16 - 13 },
1915 { 1, 2, 3, 4, 11, 64 - 21 },
1916 { 1, 2, 3, 4, 11, 256 - 21 },
1917 { 1, 2, 3, 4, 11, 1024 - 21 },
1919 const int16_t *y_band_counts = band_counts[b->tx];
1920 const int16_t *uv_band_counts = band_counts[b->
uvtx];
1924 for (y = 0; y < end_y; y += step1d)
1925 for (x = 1; x < step1d; x++)
1927 for (x = 0; x < end_x; x += step1d)
1928 for (y = 1; y < step1d; y++)
1931 for (n = 0, y = 0; y < end_y; y += step1d) {
1932 for (x = 0; x < end_x; x += step1d, n += step) {
1936 int nnz = a[x] + l[
y];
1938 b->tx, c, e, p, nnz, yscans[txtp],
1939 ynbs[txtp], y_band_counts, qmul[0])) < 0)
1941 a[x] = l[
y] = !!
res;
1950 for (y = 0; y < end_y; y += step1d)
1951 memset(&l[y + 1], l[y],
FFMIN(end_y - y - 1, step1d - 1));
1952 for (x = 0; x < end_x; x += step1d)
1953 memset(&a[x + 1], a[x],
FFMIN(end_x - x - 1, step1d - 1));
1963 for (pl = 0; pl < 2; pl++) {
1967 for (y = 0; y < end_y; y += uvstep1d)
1968 for (x = 1; x < uvstep1d; x++)
1970 for (x = 0; x < end_x; x += uvstep1d)
1971 for (y = 1; y < uvstep1d; y++)
1974 for (n = 0, y = 0; y < end_y; y += uvstep1d) {
1975 for (x = 0; x < end_x; x += uvstep1d, n += uvstep) {
1976 int nnz = a[x] + l[
y];
1978 16 * uvstep, b->
uvtx, c, e, p, nnz,
1979 uvscan, uvnb, uv_band_counts,
1982 a[x] = l[
y] = !!
res;
1991 for (y = 0; y < end_y; y += uvstep1d)
1992 memset(&l[y + 1], l[y],
FFMIN(end_y - y - 1, uvstep1d - 1));
1993 for (x = 0; x < end_x; x += uvstep1d)
1994 memset(&a[x + 1], a[x],
FFMIN(end_x - x - 1, uvstep1d - 1));
2002 uint8_t *dst_edge, ptrdiff_t stride_edge,
2003 uint8_t *dst_inner, ptrdiff_t stride_inner,
2004 uint8_t *l,
int col,
int x,
int w,
2008 int have_top = row > 0 || y > 0;
2010 int have_right = x < w - 1;
2011 static const uint8_t mode_conv[10][2 ][2 ] = {
2033 static const struct {
2041 [
DC_PRED] = { .needs_top = 1, .needs_left = 1 },
2044 [
VERT_RIGHT_PRED] = { .needs_left = 1, .needs_top = 1, .needs_topleft = 1 },
2045 [
HOR_DOWN_PRED] = { .needs_left = 1, .needs_top = 1, .needs_topleft = 1 },
2048 [
TM_VP8_PRED] = { .needs_left = 1, .needs_top = 1, .needs_topleft = 1 },
2057 mode = mode_conv[
mode][have_left][have_top];
2058 if (edges[mode].needs_top) {
2060 int n_px_need = 4 << tx, n_px_have = (((s->
cols - col) << !p) - x) * 4;
2061 int n_px_need_tr = 0;
2063 if (tx ==
TX_4X4 && edges[mode].needs_topright && have_right)
2070 top = !(row & 7) && !y ?
2072 y == 0 ? &dst_edge[-stride_edge] : &dst_inner[-stride_inner];
2074 topleft = !(row & 7) && !y ?
2076 y == 0 || x == 0 ? &dst_edge[-stride_edge] :
2077 &dst_inner[-stride_inner];
2081 (!edges[mode].needs_topleft || (have_left && top == topleft)) &&
2082 (tx !=
TX_4X4 || !edges[mode].needs_topright || have_right) &&
2083 n_px_need + n_px_need_tr <= n_px_have) {
2087 if (n_px_need <= n_px_have) {
2088 memcpy(*a, top, n_px_need);
2090 memcpy(*a, top, n_px_have);
2091 memset(&(*a)[n_px_have], (*a)[n_px_have - 1],
2092 n_px_need - n_px_have);
2095 memset(*a, 127, n_px_need);
2097 if (edges[mode].needs_topleft) {
2098 if (have_left && have_top) {
2099 (*a)[-1] = topleft[-1];
2101 (*a)[-1] = have_top ? 129 : 127;
2104 if (tx ==
TX_4X4 && edges[mode].needs_topright) {
2105 if (have_top && have_right &&
2106 n_px_need + n_px_need_tr <= n_px_have) {
2107 memcpy(&(*a)[4], &top[4], 4);
2109 memset(&(*a)[4], (*a)[3], 4);
2114 if (edges[mode].needs_left) {
2116 int n_px_need = 4 << tx, i, n_px_have = (((s->
rows - row) << !p) -
y) * 4;
2117 uint8_t *dst = x == 0 ? dst_edge : dst_inner;
2118 ptrdiff_t
stride = x == 0 ? stride_edge : stride_inner;
2120 if (n_px_need <= n_px_have) {
2121 for (i = 0; i < n_px_need; i++)
2122 l[i] = dst[i * stride - 1];
2124 for (i = 0; i < n_px_have; i++)
2125 l[i] = dst[i * stride - 1];
2126 memset(&l[i], l[i - 1], n_px_need - n_px_have);
2129 memset(l, 129, 4 << tx);
2140 int row = b->
row, col = b->
col;
2141 int w4 =
bwh_tab[1][b->
bs][0] << 1, step1d = 1 << b->tx,
n;
2142 int h4 =
bwh_tab[1][b->
bs][1] << 1, x,
y, step = 1 << (b->tx * 2);
2143 int end_x =
FFMIN(2 * (s->
cols - col), w4);
2144 int end_y =
FFMIN(2 * (s->
rows - row), h4);
2146 int uvstep1d = 1 << b->
uvtx, p;
2149 for (
n = 0, y = 0; y < end_y; y += step1d) {
2150 uint8_t *ptr = dst, *ptr_r = dst_r;
2151 for (x = 0; x < end_x; x += step1d, ptr += 4 * step1d,
2152 ptr_r += 4 * step1d,
n += step) {
2162 col, x, w4, row, y, b->tx, 0);
2168 dst_r += 4 * s->
f->
linesize[0] * step1d;
2177 step = 1 << (b->
uvtx * 2);
2178 for (p = 0; p < 2; p++) {
2179 dst = b->
dst[1 + p];
2180 dst_r = s->
f->
data[1 + p] + uv_off;
2181 for (
n = 0, y = 0; y < end_y; y += uvstep1d) {
2182 uint8_t *ptr = dst, *ptr_r = dst_r;
2183 for (x = 0; x < end_x; x += uvstep1d, ptr += 4 * uvstep1d,
2184 ptr_r += 4 * uvstep1d,
n += step) {
2192 col, x, w4, row, y, b->
uvtx, p + 1);
2198 dst_r += 4 * uvstep1d * s->
f->
linesize[1];
2205 uint8_t *dst, ptrdiff_t dst_stride,
2206 const uint8_t *ref, ptrdiff_t ref_stride,
2207 ptrdiff_t
y, ptrdiff_t x,
const VP56mv *
mv,
2208 int bw,
int bh,
int w,
int h)
2210 int mx = mv->
x, my = mv->
y;
2214 ref += y * ref_stride + x;
2218 if (x < !!mx * 3 || y < !!my * 3 ||
2219 x + !!mx * 4 > w - bw || y + !!my * 4 > h - bh) {
2221 ref - !!my * 3 * ref_stride - !!mx * 3,
2223 bw + !!mx * 7, bh + !!my * 7,
2224 x - !!mx * 3, y - !!my * 3, w, h);
2228 mc[!!mx][!!my](dst, dst_stride, ref, ref_stride, bh, mx << 1, my << 1);
2233 ptrdiff_t dst_stride,
2234 const uint8_t *ref_u, ptrdiff_t src_stride_u,
2235 const uint8_t *ref_v, ptrdiff_t src_stride_v,
2236 ptrdiff_t
y, ptrdiff_t x,
const VP56mv *
mv,
2237 int bw,
int bh,
int w,
int h)
2239 int mx = mv->
x, my = mv->
y;
2243 ref_u += y * src_stride_u + x;
2244 ref_v += y * src_stride_v + x;
2248 if (x < !!mx * 3 || y < !!my * 3 ||
2249 x + !!mx * 4 > w - bw || y + !!my * 4 > h - bh) {
2251 ref_u - !!my * 3 * src_stride_u - !!mx * 3, src_stride_u,
2252 bw + !!mx * 7, bh + !!my * 7,
2253 x - !!mx * 3, y - !!my * 3, w, h);
2255 mc[!!mx][!!my](dst_u, dst_stride, ref_u, 80, bh, mx, my);
2258 ref_v - !!my * 3 * src_stride_v - !!mx * 3, src_stride_v,
2259 bw + !!mx * 7, bh + !!my * 7,
2260 x - !!mx * 3, y - !!my * 3, w, h);
2262 mc[!!mx][!!my](dst_v, dst_stride, ref_v, 80, bh, mx, my);
2264 mc[!!mx][!!my](dst_u, dst_stride, ref_u, src_stride_u, bh, mx, my);
2265 mc[!!mx][!!my](dst_v, dst_stride, ref_v, src_stride_v, bh, mx, my);
2272 { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 },
2273 { 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4 },
2277 int row = b->
row, col = b->
col;
2288 row << 3, col << 3, &b->
mv[0][0], 8, 4, w, h);
2290 b->
dst[0] + 4 * ls_y, ls_y,
2292 (row << 3) + 4, col << 3, &b->
mv[2][0], 8, 4, w, h);
2297 row << 3, col << 3, &b->
mv[0][1], 8, 4, w, h);
2299 b->
dst[0] + 4 * ls_y, ls_y,
2301 (row << 3) + 4, col << 3, &b->
mv[2][1], 8, 4, w, h);
2306 row << 3, col << 3, &b->
mv[0][0], 4, 8, w, h);
2309 row << 3, (col << 3) + 4, &b->
mv[1][0], 4, 8, w, h);
2314 row << 3, col << 3, &b->
mv[0][1], 4, 8, w, h);
2317 row << 3, (col << 3) + 4, &b->
mv[1][1], 4, 8, w, h);
2326 row << 3, col << 3, &b->
mv[0][0], 4, 4, w, h);
2329 row << 3, (col << 3) + 4, &b->
mv[1][0], 4, 4, w, h);
2331 b->
dst[0] + 4 * ls_y, ls_y,
2333 (row << 3) + 4, col << 3, &b->
mv[2][0], 4, 4, w, h);
2335 b->
dst[0] + 4 * ls_y + 4, ls_y,
2337 (row << 3) + 4, (col << 3) + 4, &b->
mv[3][0], 4, 4, w, h);
2342 row << 3, col << 3, &b->
mv[0][1], 4, 4, w, h);
2345 row << 3, (col << 3) + 4, &b->
mv[1][1], 4, 4, w, h);
2347 b->
dst[0] + 4 * ls_y, ls_y,
2349 (row << 3) + 4, col << 3, &b->
mv[2][1], 4, 4, w, h);
2351 b->
dst[0] + 4 * ls_y + 4, ls_y,
2353 (row << 3) + 4, (col << 3) + 4, &b->
mv[3][1], 4, 4, w, h);
2357 int bwl = bwlog_tab[0][b->
bs];
2362 row << 3, col << 3, &b->
mv[0][0],bw, bh, w, h);
2367 row << 3, col << 3, &b->
mv[0][1], bw, bh, w, h);
2372 int bwl = bwlog_tab[1][b->
bs];
2386 b->
dst[1], b->
dst[2], ls_uv,
2389 row << 2, col << 2, &mvuv, bw, bh, w, h);
2399 b->
dst[1], b->
dst[2], ls_uv,
2402 row << 2, col << 2, &mvuv, bw, bh, w, h);
2409 int w4 =
bwh_tab[1][b->
bs][0] << 1, step1d = 1 << b->tx,
n;
2410 int h4 =
bwh_tab[1][b->
bs][1] << 1, x,
y, step = 1 << (b->tx * 2);
2411 int end_x =
FFMIN(2 * (s->
cols - col), w4);
2412 int end_y =
FFMIN(2 * (s->
rows - row), h4);
2414 int uvstep1d = 1 << b->
uvtx, p;
2418 for (
n = 0, y = 0; y < end_y; y += step1d) {
2420 for (x = 0; x < end_x; x += step1d, ptr += 4 * step1d,
n += step) {
2435 step = 1 << (b->
uvtx * 2);
2436 for (p = 0; p < 2; p++) {
2437 dst = b->
dst[p + 1];
2438 for (
n = 0, y = 0; y < end_y; y += uvstep1d) {
2440 for (x = 0; x < end_x; x += uvstep1d, ptr += 4 * uvstep1d,
n += step) {
2454 int row_and_7,
int col_and_7,
2455 int w,
int h,
int col_end,
int row_end,
2468 if (tx ==
TX_4X4 && is_uv) {
2483 if (tx ==
TX_4X4 && !skip_inter) {
2484 int t = 1 << col_and_7, m_col = (t << w) - t,
y;
2485 int m_col_odd = (t << (w - 1)) -
t;
2489 int m_row_8 = m_col & 0x01, m_row_4 = m_col - m_row_8;
2491 for (
y = row_and_7;
y < h + row_and_7;
y++) {
2492 int col_mask_id = 2 - !(
y & 7);
2494 lflvl->
mask[is_uv][0][
y][1] |= m_row_8;
2495 lflvl->
mask[is_uv][0][
y][2] |= m_row_4;
2506 if ((col_end & 1) && (
y & 1)) {
2507 lflvl->
mask[is_uv][1][
y][col_mask_id] |= m_col_odd;
2509 lflvl->
mask[is_uv][1][
y][col_mask_id] |= m_col;
2513 int m_row_8 = m_col & 0x11, m_row_4 = m_col - m_row_8;
2515 for (
y = row_and_7;
y < h + row_and_7;
y++) {
2516 int col_mask_id = 2 - !(
y & 3);
2518 lflvl->
mask[is_uv][0][
y][1] |= m_row_8;
2519 lflvl->
mask[is_uv][0][
y][2] |= m_row_4;
2520 lflvl->
mask[is_uv][1][
y][col_mask_id] |= m_col;
2521 lflvl->
mask[is_uv][0][
y][3] |= m_col;
2522 lflvl->
mask[is_uv][1][
y][3] |= m_col;
2526 int y,
t = 1 << col_and_7, m_col = (t << w) - t;
2529 int mask_id = (tx ==
TX_8X8);
2530 int l2 = tx + is_uv - 1, step1d = 1 << l2;
2531 static const unsigned masks[4] = { 0xff, 0x55, 0x11, 0x01 };
2532 int m_row = m_col & masks[l2];
2536 if (is_uv && tx >
TX_8X8 && (w ^ (w - 1)) == 1) {
2537 int m_row_16 = ((t << (w - 1)) -
t) & masks[l2];
2538 int m_row_8 = m_row - m_row_16;
2540 for (y = row_and_7; y < h + row_and_7; y++) {
2541 lflvl->
mask[is_uv][0][
y][0] |= m_row_16;
2542 lflvl->
mask[is_uv][0][
y][1] |= m_row_8;
2545 for (y = row_and_7; y < h + row_and_7; y++)
2546 lflvl->
mask[is_uv][0][y][mask_id] |= m_row;
2549 if (is_uv && tx >
TX_8X8 && (h ^ (h - 1)) == 1) {
2550 for (y = row_and_7; y < h + row_and_7 - 1; y += step1d)
2551 lflvl->
mask[is_uv][1][y][0] |= m_col;
2552 if (y - row_and_7 == h - 1)
2553 lflvl->
mask[is_uv][1][
y][1] |= m_col;
2555 for (y = row_and_7; y < h + row_and_7; y += step1d)
2556 lflvl->
mask[is_uv][1][y][mask_id] |= m_col;
2558 }
else if (tx !=
TX_4X4) {
2561 mask_id = (tx ==
TX_8X8) || (is_uv && h == 1);
2562 lflvl->
mask[is_uv][1][row_and_7][mask_id] |= m_col;
2563 mask_id = (tx ==
TX_8X8) || (is_uv && w == 1);
2564 for (y = row_and_7; y < h + row_and_7; y++)
2565 lflvl->
mask[is_uv][0][y][mask_id] |= t;
2567 int t8 = t & 0x01,
t4 = t -
t8;
2569 for (y = row_and_7; y < h + row_and_7; y++) {
2570 lflvl->
mask[is_uv][0][
y][2] |=
t4;
2571 lflvl->
mask[is_uv][0][
y][1] |=
t8;
2573 lflvl->
mask[is_uv][1][row_and_7][2 - !(row_and_7 & 7)] |= m_col;
2575 int t8 = t & 0x11,
t4 = t -
t8;
2577 for (y = row_and_7; y < h + row_and_7; y++) {
2578 lflvl->
mask[is_uv][0][
y][2] |=
t4;
2579 lflvl->
mask[is_uv][0][
y][1] |=
t8;
2581 lflvl->
mask[is_uv][1][row_and_7][2 - !(row_and_7 & 3)] |= m_col;
2587 struct VP9Filter *lflvl, ptrdiff_t yoff, ptrdiff_t uvoff,
2600 s->
min_mv.
x = -(128 + col * 64);
2601 s->
min_mv.
y = -(128 + row * 64);
2606 b->
uvtx = b->tx - (w4 * 2 == (1 << b->tx) || h4 * 2 == (1 << b->tx));
2616 for (pl = 0; pl < 2; pl++) {
2625 emu[0] = (col + w4) * 8 > s->
f->
linesize[0] ||
2627 emu[1] = (col + w4) * 4 > s->
f->
linesize[1] ||
2653 for (
n = 0; o < w;
n++) {
2659 s->
tmp_y + o, 64, h, 0, 0);
2667 for (
n = 1; o < w;
n++) {
2673 s->
tmp_uv[0] + o, 32, h, 0, 0);
2675 s->
tmp_uv[1] + o, 32, h, 0, 0);
2688 for (y = 0; y < h4; y++)
2689 memset(&lflvl->
level[((row & 7) + y) * 8 + (col & 7)], lvl, w4);
2690 mask_edges(lflvl, 0, row & 7, col & 7, x_end, y_end, 0, 0, b->tx, skip_inter);
2691 mask_edges(lflvl, 1, row & 7, col & 7, x_end, y_end,
2694 b->
uvtx, skip_inter);
2701 limit >>= (sharp + 3) >> 2;
2702 limit =
FFMIN(limit, 9 - sharp);
2704 limit =
FFMAX(limit, 1);
2715 ptrdiff_t yoff, ptrdiff_t uvoff,
enum BlockLevel bl)
2723 ptrdiff_t hbs = 4 >> bl;
2727 res =
decode_b(ctx, row, col, lflvl, yoff, uvoff, bl, bp);
2728 }
else if (col + hbs < s->cols) {
2729 if (row + hbs < s->rows) {
2733 res =
decode_b(ctx, row, col, lflvl, yoff, uvoff, bl, bp);
2736 if (!(
res =
decode_b(ctx, row, col, lflvl, yoff, uvoff, bl, bp))) {
2739 res =
decode_b(ctx, row + hbs, col, lflvl, yoff, uvoff, bl, bp);
2743 if (!(
res =
decode_b(ctx, row, col, lflvl, yoff, uvoff, bl, bp))) {
2746 res =
decode_b(ctx, row, col + hbs, lflvl, yoff, uvoff, bl, bp);
2750 if (!(
res =
decode_sb(ctx, row, col, lflvl, yoff, uvoff, bl + 1))) {
2752 yoff + 8 * hbs, uvoff + 4 * hbs, bl + 1))) {
2756 yoff, uvoff, bl + 1)))
2758 yoff + 8 * hbs, uvoff + 4 * hbs, bl + 1);
2765 if (!(
res =
decode_sb(ctx, row, col, lflvl, yoff, uvoff, bl + 1)))
2767 yoff + 8 * hbs, uvoff + 4 * hbs, bl + 1);
2770 res =
decode_b(ctx, row, col, lflvl, yoff, uvoff, bl, bp);
2772 }
else if (row + hbs < s->rows) {
2775 if (!(
res =
decode_sb(ctx, row, col, lflvl, yoff, uvoff, bl + 1))) {
2779 yoff, uvoff, bl + 1);
2783 res =
decode_b(ctx, row, col, lflvl, yoff, uvoff, bl, bp);
2787 res =
decode_sb(ctx, row, col, lflvl, yoff, uvoff, bl + 1);
2795 int row,
int col, ptrdiff_t yoff, ptrdiff_t uvoff)
2809 for (y = 0; y < 8; y += 2, dst += 16 * ls_y, lvl += 16) {
2810 uint8_t *ptr = dst, *l = lvl, *hmask1 = lflvl->
mask[0][0][
y];
2812 unsigned hm1 = hmask1[0] | hmask1[1] | hmask1[2], hm13 = hmask1[3];
2813 unsigned hm2 = hmask2[1] | hmask2[2], hm23 = hmask2[3];
2814 unsigned hm = hm1 | hm2 | hm13 | hm23;
2816 for (x = 1; hm & ~(x - 1); x <<= 1, ptr += 8, l++) {
2818 int L = *l,
H = L >> 4;
2822 if (hmask1[0] & x) {
2823 if (hmask2[0] & x) {
2829 }
else if (hm2 & x) {
2836 [0](ptr, ls_y,
E, I,
H);
2839 [0](ptr, ls_y, E, I, H);
2842 }
else if (hm2 & x) {
2843 int L = l[8],
H = L >> 4;
2848 [0](ptr + 8 * ls_y, ls_y, E, I, H);
2852 int L = *l,
H = L >> 4;
2864 }
else if (hm23 & x) {
2865 int L = l[8],
H = L >> 4;
2876 dst = s->
f->
data[0] + yoff;
2878 for (y = 0; y < 8; y++, dst += 8 * ls_y, lvl += 8) {
2879 uint8_t *ptr = dst, *l = lvl, *vmask = lflvl->
mask[0][1][
y];
2880 unsigned vm = vmask[0] | vmask[1] | vmask[2], vm3 = vmask[3];
2882 for (x = 1; vm & ~(x - 1); x <<= 2, ptr += 16, l += 2) {
2885 int L = *l,
H = L >> 4;
2889 if (vmask[0] & (x << 1)) {
2895 }
else if (vm & (x << 1)) {
2901 [!!(vmask[1] & (x << 1))]
2902 [1](ptr, ls_y, E, I, H);
2905 [1](ptr, ls_y, E, I, H);
2907 }
else if (vm & (x << 1)) {
2908 int L = l[1],
H = L >> 4;
2912 [1](ptr + 8, ls_y,
E, I,
H);
2916 int L = *l,
H = L >> 4;
2919 if (vm3 & (x << 1)) {
2928 }
else if (vm3 & (x << 1)) {
2929 int L = l[1],
H = L >> 4;
2938 for (p = 0; p < 2; p++) {
2940 dst = s->
f->
data[1 + p] + uvoff;
2941 for (y = 0; y < 8; y += 4, dst += 16 * ls_uv, lvl += 32) {
2942 uint8_t *ptr = dst, *l = lvl, *hmask1 = lflvl->
mask[1][0][
y];
2944 unsigned hm1 = hmask1[0] | hmask1[1] | hmask1[2];
2945 unsigned hm2 = hmask2[1] | hmask2[2], hm = hm1 | hm2;
2947 for (x = 1; hm & ~(x - 1); x <<= 1, ptr += 4) {
2950 int L = *l,
H = L >> 4;
2953 if (hmask1[0] & x) {
2954 if (hmask2[0] & x) {
2960 }
else if (hm2 & x) {
2967 [0](ptr, ls_uv,
E, I,
H);
2970 [0](ptr, ls_uv, E, I, H);
2972 }
else if (hm2 & x) {
2973 int L = l[16],
H = L >> 4;
2977 [0](ptr + 8 * ls_uv, ls_uv, E, I, H);
2985 dst = s->
f->
data[1 + p] + uvoff;
2986 for (y = 0; y < 8; y++, dst += 4 * ls_uv) {
2987 uint8_t *ptr = dst, *l = lvl, *vmask = lflvl->
mask[1][1][
y];
2988 unsigned vm = vmask[0] | vmask[1] | vmask[2];
2990 for (x = 1; vm & ~(x - 1); x <<= 4, ptr += 16, l += 4) {
2993 int L = *l,
H = L >> 4;
2997 if (vmask[0] & (x << 2)) {
3003 }
else if (vm & (x << 2)) {
3009 [!!(vmask[1] & (x << 2))]
3010 [1](ptr, ls_uv, E, I, H);
3013 [1](ptr, ls_uv, E, I, H);
3015 }
else if (vm & (x << 2)) {
3016 int L = l[2],
H = L >> 4;
3020 [1](ptr + 8, ls_uv,
E, I,
H);
3032 int sb_start = ( idx *
n) >> log2_n;
3033 int sb_end = ((idx + 1) * n) >> log2_n;
3034 *start =
FFMIN(sb_start, n) << 3;
3035 *end =
FFMIN(sb_end, n) << 3;
3039 int max_count,
int update_factor)
3041 unsigned ct = ct0 + ct1, p2, p1;
3047 p2 = ((ct0 << 8) + (ct >> 1)) / ct;
3048 p2 = av_clip(p2, 1, 255);
3049 ct =
FFMIN(ct, max_count);
3050 update_factor =
FASTDIV(update_factor * ct, max_count);
3053 *p = p1 + (((p2 - p1) * update_factor + 128) >> 8);
3063 for (i = 0; i < 4; i++)
3064 for (j = 0; j < 2; j++)
3065 for (k = 0; k < 2; k++)
3066 for (l = 0; l < 6; l++)
3067 for (m = 0; m < 6; m++) {
3072 if (l == 0 && m >= 3)
3076 adapt_prob(&pp[1], c[0], c[1] + c[2], 24, uf);
3089 for (i = 0; i < 3; i++)
3093 for (i = 0; i < 4; i++)
3098 for (i = 0; i < 5; i++)
3104 for (i = 0; i < 5; i++)
3110 for (i = 0; i < 5; i++) {
3114 adapt_prob(&pp[0], c[0][0], c[0][1], 20, 128);
3115 adapt_prob(&pp[1], c[1][0], c[1][1], 20, 128);
3120 for (i = 0; i < 4; i++)
3121 for (j = 0; j < 4; j++) {
3125 adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
3126 adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
3132 for (i = 0; i < 2; i++) {
3138 adapt_prob(&p->
tx32p[i][0], c32[0], c32[1] + c32[2] + c32[3], 20, 128);
3146 for (i = 0; i < 4; i++) {
3150 adapt_prob(&pp[0], c[0], c[1] + c[2], 20, 128);
3156 for (i = 0; i < 7; i++) {
3160 adapt_prob(&pp[0], c[2], c[1] + c[0] + c[3], 20, 128);
3161 adapt_prob(&pp[1], c[0], c[1] + c[3], 20, 128);
3170 adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
3171 adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
3176 for (i = 0; i < 2; i++) {
3178 unsigned *
c, (*c2)[2], sum;
3185 sum = c[1] + c[2] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9] + c[10];
3190 adapt_prob(&pp[2], c[2] + c[3], sum, 20, 128);
3193 adapt_prob(&pp[4], c[4] + c[5], sum, 20, 128);
3197 adapt_prob(&pp[7], c[7] + c[8], c[9] + c[10], 20, 128);
3205 for (j = 0; j < 10; j++)
3206 adapt_prob(&pp[j], c2[j][0], c2[j][1], 20, 128);
3208 for (j = 0; j < 2; j++) {
3211 adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
3212 adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
3217 adapt_prob(&pp[0], c[0], c[1] + c[2] + c[3], 20, 128);
3218 adapt_prob(&pp[1], c[1], c[2] + c[3], 20, 128);
3230 for (i = 0; i < 4; i++) {
3234 sum = c[0] + c[1] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9];
3254 for (i = 0; i < 10; i++) {
3258 sum = c[0] + c[1] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8] + c[9];
3282 int res, tile_row, tile_col, i, ref, row, col;
3283 ptrdiff_t yoff = 0, uvoff = 0;
3288 }
else if (res == 0) {
3289 if (!s->
refs[ref]) {
3302 for (i = 0; i < 10; i++) {
3304 if (f->
data[0] && f != s->
f &&
3305 f != s->
refs[0] && f != s->
refs[1] &&
3306 f != s->
refs[2] && f != s->
refs[3] &&
3307 f != s->
refs[4] && f != s->
refs[5] &&
3308 f != s->
refs[6] && f != s->
refs[7])
3313 for (i = 0; i < 10; i++)
3350 if (tile_size > size)
3360 row < s->tiling.tile_row_end;
3361 row += 8, yoff += s->
f->
linesize[0] * 64,
3364 ptrdiff_t yoff2 = yoff, uvoff2 = uvoff;
3381 memcpy(&s->
c, &s->
c_b[tile_col],
sizeof(s->
c));
3383 col < s->tiling.tile_col_end;
3384 col += 8, yoff2 += 64, uvoff2 += 32, lflvl_ptr++) {
3387 memset(lflvl_ptr->
mask, 0,
sizeof(lflvl_ptr->
mask));
3389 if ((res =
decode_sb(ctx, row, col, lflvl_ptr,
3393 memcpy(&s->
c_b[tile_col], &s->
c,
sizeof(s->
c));
3398 if (row + 8 < s->
rows) {
3414 lflvl_ptr = s->
lflvl;
3415 for (col = 0; col < s->
cols;
3416 col += 8, yoff2 += 64, uvoff2 += 32, lflvl_ptr++) {
3429 for (i = 0; i < 4; i++)
3430 for (j = 0; j < 2; j++)
3431 for (k = 0; k < 2; k++)
3432 for (l = 0; l < 6; l++)
3433 for (m = 0; m < 6; m++)
3444 for (i = 0; i < 8; i++)
3466 marker = data[size - 1];
3467 if ((marker & 0xe0) == 0xc0) {
3468 int nbytes = 1 + ((marker >> 3) & 0x3);
3469 int n_frames = 1 + (marker & 0x7), idx_sz = 2 + n_frames * nbytes;
3471 if (size >= idx_sz && data[size - idx_sz] == marker) {
3472 const uint8_t *idx = data + size + 1 - idx_sz;
3474 #define case_n(a, rd) \
3476 while (n_frames--) { \
3480 av_log(avctx, AV_LOG_ERROR, \
3481 "Superframe packet size too big: %d > %d\n", \
3483 return AVERROR_INVALIDDATA; \
3485 res = vp9_decode_frame(avctx, out_pic, got_frame, \
3513 for (i = 0; i < 10; i++)
3516 for (i = 0; i < 8; i++)
3529 for (i = 0; i < 10; i++) {
3546 for (i = 0; i < 10; i++) {
3559 s->
mv[0] = s->
mv[1] = NULL;