76 if (prefer_delayed_free) {
84 }
else if (can_direct_free) {
96 int prefer_delayed_free,
int can_direct_free,
int free_mem)
102 for (i = 0; i < 5; i++)
175 for (i = 0; i < 4; i++)
178 for (i = 0; i < 4; i++)
182 for (i = 0; i < 3; i++)
191 for (i = 0; i < 4; i++) {
224 if (buf_size - size < 0)
248 for (i = 0; i < 4; i++) {
312 int header_size, hscale, vscale, i, j, k, l,
m, ret;
319 header_size =
AV_RL24(buf) >> 5;
331 if (header_size > buf_size - 7*s->
keyframe) {
337 if (
AV_RL24(buf) != 0x2a019d) {
341 width =
AV_RL16(buf+3) & 0x3fff;
342 height =
AV_RL16(buf+5) & 0x3fff;
343 hscale = buf[4] >> 6;
344 vscale = buf[6] >> 6;
348 if (hscale || vscale)
352 for (i = 0; i < 4; i++)
353 for (j = 0; j < 16; j++)
365 buf_size -= header_size;
412 for (i = 0; i < 4; i++)
413 for (j = 0; j < 8; j++)
414 for (k = 0; k < 3; k++)
431 for (i = 0; i < 4; i++)
434 for (i = 0; i < 3; i++)
438 for (i = 0; i < 2; i++)
439 for (j = 0; j < 19; j++)
463 for (i = 0; i < 3; i++)
465 for (i = 9; i > 3; i--)
507 *mbsplits_cur, *firstidx;
517 top_mv = top_mb->
bmv;
534 for (n = 0; n < num; n++) {
536 uint32_t left, above;
540 left =
AV_RN32A(&left_mv[mbsplits_left[k + 3]]);
542 left =
AV_RN32A(&cur_mv[mbsplits_cur[k - 1]]);
544 above =
AV_RN32A(&top_mv[mbsplits_top[k + 12]]);
546 above =
AV_RN32A(&cur_mv[mbsplits_cur[k - 4]]);
575 enum { CNT_ZERO, CNT_NEAREST, CNT_NEAR, CNT_SPLITMV };
576 enum { VP8_EDGE_TOP, VP8_EDGE_LEFT, VP8_EDGE_TOPLEFT };
598 #define MV_EDGE_CHECK(n)\
600 VP8Macroblock *edge = mb_edge[n];\
601 int edge_ref = edge->ref_frame;\
602 if (edge_ref != VP56_FRAME_CURRENT) {\
603 uint32_t mv = AV_RN32A(&edge->mv);\
605 if (cur_sign_bias != sign_bias[edge_ref]) {\
608 mv = ((mv&0x7fff7fff) + 0x00010001) ^ (mv&0x80008000);\
610 if (!n || mv != AV_RN32A(&near_mv[idx]))\
611 AV_WN32A(&near_mv[++idx], mv);\
612 cnt[idx] += 1 + (n != 2);\
614 cnt[CNT_ZERO] += 1 + (n != 2);\
627 if (cnt[CNT_SPLITMV] &&
AV_RN32A(&near_mv[1 + VP8_EDGE_TOP]) ==
AV_RN32A(&near_mv[1 + VP8_EDGE_TOPLEFT]))
628 cnt[CNT_NEAREST] += 1;
631 if (cnt[CNT_NEAR] > cnt[CNT_NEAREST]) {
633 FFSWAP(
VP56mv, near_mv[CNT_NEAREST], near_mv[CNT_NEAR]);
640 clamp_mv(s, &mb->
mv, &near_mv[CNT_ZERO + (cnt[CNT_NEAREST] >= cnt[CNT_ZERO])]);
670 int mb_x,
int keyframe,
int layout)
686 for (y = 0; y < 4; y++) {
687 for (x = 0; x < 4; x++) {
691 left[y] = top[x] = *intra4x4;
697 for (i = 0; i < 16; i++)
712 *segment = ref ? *ref : *segment;
758 #ifndef decode_block_coeffs_internal
770 int i,
uint8_t *token_prob, int16_t qmul[2])
783 token_prob = probs[i][0];
789 token_prob = probs[i+1][1];
809 int cat = (a<<1) + b;
810 coeff = 3 + (8<<cat);
814 token_prob = probs[i+1][2];
838 int i,
int zero_nhood, int16_t qmul[2])
840 uint8_t *token_prob = probs[i][zero_nhood];
850 int i, x, y, luma_start = 0, luma_ctx = 3;
851 int nnz_pred, nnz, nnz_total = 0;
856 nnz_pred = t_nnz[8] + l_nnz[8];
861 l_nnz[8] = t_nnz[8] = !!nnz;
875 for (y = 0; y < 4; y++)
876 for (x = 0; x < 4; x++) {
877 nnz_pred = l_nnz[y] + t_nnz[x];
882 t_nnz[x] = l_nnz[y] = !!nnz;
889 for (i = 4; i < 6; i++)
890 for (y = 0; y < 2; y++)
891 for (x = 0; x < 2; x++) {
892 nnz_pred = l_nnz[i+2*y] + t_nnz[i+2*x];
896 t_nnz[i+2*x] = l_nnz[i+2*y] = !!nnz;
909 int linesize,
int uvlinesize,
int simple)
913 AV_COPY64(top_border+16, src_cb + 7*uvlinesize);
914 AV_COPY64(top_border+24, src_cr + 7*uvlinesize);
920 int linesize,
int uvlinesize,
int mb_x,
int mb_y,
int mb_width,
921 int simple,
int xchg)
923 uint8_t *top_border_m1 = top_border-32;
925 src_cb -= uvlinesize;
926 src_cr -= uvlinesize;
928 #define XCHG(a,b,xchg) do { \
929 if (xchg) AV_SWAP64(b,a); \
930 else AV_COPY64(b,a); \
933 XCHG(top_border_m1+8, src_y-8, xchg);
934 XCHG(top_border, src_y, xchg);
935 XCHG(top_border+8, src_y+8, 1);
936 if (mb_x < mb_width-1)
937 XCHG(top_border+32, src_y+16, 1);
941 if (!simple || !mb_y) {
942 XCHG(top_border_m1+16, src_cb-8, xchg);
943 XCHG(top_border_m1+24, src_cr-8, xchg);
944 XCHG(top_border+16, src_cb, 1);
945 XCHG(top_border+24, src_cr, 1);
1010 if (!mb_x && mb_y) {
1044 int x, y,
mode, nnz;
1064 uint8_t tr_top[4] = { 127, 127, 127, 127 };
1074 tr = tr_right[-1]*0x01010101u;
1081 for (y = 0; y < 4; y++) {
1083 for (x = 0; x < 4; x++) {
1091 topright = tr_right;
1096 dst = copy_dst + 12;
1100 AV_WN32A(copy_dst+4, 127
U * 0x01010101U);
1106 copy_dst[3] = ptr[4*x-s->
linesize-1];
1113 copy_dst[35] = 129
U;
1115 copy_dst[11] = ptr[4*x -1];
1116 copy_dst[19] = ptr[4*x+s->
linesize -1];
1117 copy_dst[27] = ptr[4*x+s->
linesize*2-1];
1118 copy_dst[35] = ptr[4*x+s->
linesize*3-1];
1162 { 0, 1, 2, 1, 2, 1, 2, 1 },
1164 { 0, 3, 5, 3, 5, 3, 5, 3 },
1165 { 0, 2, 3, 2, 3, 2, 3, 2 },
1187 int x_off,
int y_off,
int block_w,
int block_h,
1195 int mx = (mv->
x << 1)&7, mx_idx =
subpel_idx[0][mx];
1196 int my = (mv->
y << 1)&7, my_idx =
subpel_idx[0][my];
1198 x_off += mv->
x >> 2;
1199 y_off += mv->
y >> 2;
1203 src += y_off * linesize + x_off;
1204 if (x_off < mx_idx || x_off >= width - block_w -
subpel_idx[2][mx] ||
1205 y_off < my_idx || y_off >= height - block_h -
subpel_idx[2][my]) {
1208 x_off - mx_idx, y_off - my_idx, width, height);
1211 mc_func[my_idx][mx_idx](
dst, linesize, src, linesize, block_h, mx, my);
1214 mc_func[0][0](
dst, linesize, src + y_off * linesize + x_off, linesize, block_h, 0, 0);
1238 int block_w,
int block_h,
int width,
int height,
int linesize,
1247 x_off += mv->
x >> 3;
1248 y_off += mv->
y >> 3;
1251 src1 += y_off * linesize + x_off;
1252 src2 += y_off * linesize + x_off;
1254 if (x_off < mx_idx || x_off >= width - block_w -
subpel_idx[2][mx] ||
1255 y_off < my_idx || y_off >= height - block_h -
subpel_idx[2][my]) {
1258 x_off - mx_idx, y_off - my_idx, width, height);
1260 mc_func[my_idx][mx_idx](dst1, linesize, src1, linesize, block_h, mx, my);
1264 x_off - mx_idx, y_off - my_idx, width, height);
1266 mc_func[my_idx][mx_idx](dst2, linesize, src2, linesize, block_h, mx, my);
1268 mc_func[my_idx][mx_idx](dst1, linesize, src1, linesize, block_h, mx, my);
1269 mc_func[my_idx][mx_idx](dst2, linesize, src2, linesize, block_h, mx, my);
1273 mc_func[0][0](dst1, linesize, src1 + y_off * linesize + x_off, linesize, block_h, 0, 0);
1274 mc_func[0][0](dst2, linesize, src2 + y_off * linesize + x_off, linesize, block_h, 0, 0);
1280 AVFrame *ref_frame,
int x_off,
int y_off,
1281 int bx_off,
int by_off,
1282 int block_w,
int block_h,
1289 ref_frame, mv, x_off + bx_off, y_off + by_off,
1290 block_w, block_h, width, height, s->
linesize,
1298 x_off >>= 1; y_off >>= 1;
1299 bx_off >>= 1; by_off >>= 1;
1300 width >>= 1; height >>= 1;
1301 block_w >>= 1; block_h >>= 1;
1303 dst[2] + by_off * s->
uvlinesize + bx_off, ref_frame,
1304 &uvmv, x_off + bx_off, y_off + by_off,
1305 block_w, block_h, width, height, s->
uvlinesize,
1314 if (s->
ref_count[ref-1] > (mb_xy >> 5)) {
1315 int x_off = mb_x << 4, y_off = mb_y << 4;
1316 int mx = (mb->
mv.
x>>2) + x_off + 8;
1317 int my = (mb->
mv.
y>>2) + y_off;
1324 off= (mx>>1) + ((my>>1) + (mb_x&7))*s->
uvlinesize + 64;
1336 int x_off = mb_x << 4, y_off = mb_y << 4;
1344 0, 0, 16, 16, width,
height, &mb->
mv);
1351 for (y = 0; y < 4; y++) {
1352 for (x = 0; x < 4; x++) {
1355 4*x + x_off, 4*y + y_off, 4, 4,
1362 x_off >>= 1; y_off >>= 1; width >>= 1;
height >>= 1;
1363 for (y = 0; y < 2; y++) {
1364 for (x = 0; x < 2; x++) {
1365 uvmv.
x = mb->
bmv[ 2*y * 4 + 2*x ].
x +
1366 mb->
bmv[ 2*y * 4 + 2*x+1].
x +
1367 mb->
bmv[(2*y+1) * 4 + 2*x ].x +
1368 mb->
bmv[(2*y+1) * 4 + 2*x+1].
x;
1369 uvmv.
y = mb->
bmv[ 2*y * 4 + 2*x ].
y +
1370 mb->
bmv[ 2*y * 4 + 2*x+1].
y +
1371 mb->
bmv[(2*y+1) * 4 + 2*x ].y +
1372 mb->
bmv[(2*y+1) * 4 + 2*x+1].
y;
1373 uvmv.
x = (uvmv.
x + 2 + (uvmv.
x >> (
INT_BIT-1))) >> 2;
1374 uvmv.
y = (uvmv.
y + 2 + (uvmv.
y >> (
INT_BIT-1))) >> 2;
1380 dst[2] + 4*y*s->
uvlinesize + x*4, ref, &uvmv,
1381 4*x + x_off, 4*y + y_off, 4, 4,
1390 0, 0, 16, 8, width,
height, &bmv[0]);
1392 0, 8, 16, 8, width,
height, &bmv[1]);
1396 0, 0, 8, 16, width,
height, &bmv[0]);
1398 8, 0, 8, 16, width,
height, &bmv[1]);
1402 0, 0, 8, 8, width,
height, &bmv[0]);
1404 8, 0, 8, 8, width,
height, &bmv[1]);
1406 0, 8, 8, 8, width,
height, &bmv[2]);
1408 8, 8, 8, 8, width,
height, &bmv[3]);
1420 for (y = 0; y < 4; y++) {
1423 if (nnz4&~0x01010101) {
1424 for (x = 0; x < 4; x++) {
1441 for (ch = 0; ch < 2; ch++) {
1445 if (nnz4&~0x01010101) {
1446 for (y = 0; y < 2; y++) {
1447 for (x = 0; x < 2; x++) {
1454 goto chroma_idct_end;
1468 int interior_limit, filter_level;
1482 filter_level = av_clip_uintp2(filter_level, 6);
1484 interior_limit = filter_level;
1489 interior_limit =
FFMAX(interior_limit, 1);
1498 int mbedge_lim, bedge_lim, hev_thresh;
1504 static const uint8_t hev_thresh_lut[2][64] = {
1505 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
1506 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1507 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1509 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
1510 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1511 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1518 bedge_lim = 2*filter_level + inner_limit;
1519 mbedge_lim = bedge_lim + 4;
1521 hev_thresh = hev_thresh_lut[s->
keyframe][filter_level];
1525 mbedge_lim, inner_limit, hev_thresh);
1527 mbedge_lim, inner_limit, hev_thresh);
1532 inner_limit, hev_thresh);
1534 inner_limit, hev_thresh);
1536 inner_limit, hev_thresh);
1538 uvlinesize, bedge_lim,
1539 inner_limit, hev_thresh);
1544 mbedge_lim, inner_limit, hev_thresh);
1546 mbedge_lim, inner_limit, hev_thresh);
1551 linesize, bedge_lim,
1552 inner_limit, hev_thresh);
1554 linesize, bedge_lim,
1555 inner_limit, hev_thresh);
1557 linesize, bedge_lim,
1558 inner_limit, hev_thresh);
1560 dst[2] + 4 * uvlinesize,
1561 uvlinesize, bedge_lim,
1562 inner_limit, hev_thresh);
1568 int mbedge_lim, bedge_lim;
1577 bedge_lim = 2*filter_level + inner_limit;
1578 mbedge_lim = bedge_lim + 4;
1605 #define MARGIN (16 << 2)
1614 for (mb_y = 0; mb_y < s->
mb_height; mb_y++) {
1622 for (mb_x = 0; mb_x < s->
mb_width; mb_x++, mb_xy++, mb++) {
1636 #define check_thread_pos(td, otd, mb_x_check, mb_y_check)\
1638 int tmp = (mb_y_check << 16) | (mb_x_check & 0xFFFF);\
1639 if (otd->thread_mb_pos < tmp) {\
1640 pthread_mutex_lock(&otd->lock);\
1641 td->wait_mb_pos = tmp;\
1643 if (otd->thread_mb_pos >= tmp)\
1645 pthread_cond_wait(&otd->cond, &otd->lock);\
1647 td->wait_mb_pos = INT_MAX;\
1648 pthread_mutex_unlock(&otd->lock);\
1652 #define update_pos(td, mb_y, mb_x)\
1654 int pos = (mb_y << 16) | (mb_x & 0xFFFF);\
1655 int sliced_threading = (avctx->active_thread_type == FF_THREAD_SLICE) && (num_jobs > 1);\
1656 int is_null = (next_td == NULL) || (prev_td == NULL);\
1657 int pos_check = (is_null) ? 1 :\
1658 (next_td != td && pos >= next_td->wait_mb_pos) ||\
1659 (prev_td != td && pos >= prev_td->wait_mb_pos);\
1660 td->thread_mb_pos = pos;\
1661 if (sliced_threading && pos_check) {\
1662 pthread_mutex_lock(&td->lock);\
1663 pthread_cond_broadcast(&td->cond);\
1664 pthread_mutex_unlock(&td->lock);\
1668 #define check_thread_pos(td, otd, mb_x_check, mb_y_check)
1669 #define update_pos(td, mb_y, mb_x)
1673 int jobnr,
int threadnr)
1678 int i, y, mb_x, mb_xy = mb_y*s->
mb_width;
1688 if (mb_y == 0) prev_td = td;
1689 else prev_td = &s->
thread_data[(jobnr + num_jobs - 1)%num_jobs];
1690 if (mb_y == s->
mb_height-1) next_td = td;
1691 else next_td = &s->
thread_data[(jobnr + 1)%num_jobs];
1696 memset(mb - 1, 0,
sizeof(*mb));
1703 for (i = 0; i < 3; i++)
1704 for (y = 0; y < 16>>!!i; y++)
1705 dst[i][y*curframe->
linesize[i]-1] = 129;
1714 for (mb_x = 0; mb_x < s->
mb_width; mb_x++, mb_xy++, mb++) {
1716 if (prev_td != td) {
1717 if (threadnr != 0) {
1729 prev_frame && prev_frame->ref_index[0] ? prev_frame->ref_index[0] + mb_xy :
NULL, 0);
1759 if (s->
deblock_filter && num_jobs != 1 && threadnr == num_jobs-1) {
1783 int jobnr,
int threadnr)
1802 if (mb_y == 0) prev_td = td;
1803 else prev_td = &s->
thread_data[(jobnr + num_jobs - 1)%num_jobs];
1804 if (mb_y == s->
mb_height-1) next_td = td;
1805 else next_td = &s->
thread_data[(jobnr + 1)%num_jobs];
1807 for (mb_x = 0; mb_x < s->
mb_width; mb_x++, mb++) {
1809 if (prev_td != td) {
1817 if (num_jobs == 1) {
1837 int jobnr,
int threadnr)
1845 for (mb_y = jobnr; mb_y < s->
mb_height; mb_y += num_jobs) {
1867 int ret, i, referenced, num_jobs;
1892 for (i = 0; i < 5; i++)
1894 &s->
frames[i] != prev_frame &&
1901 for (i = 0; i < 5; i++)
1902 if (&s->
frames[i] != prev_frame &&
1913 if (curframe->data[0])
1929 curframe->reference = referenced ? 3 : 0;
1955 s->
linesize = curframe->linesize[0];
2051 #define REBASE(pic) \
2052 pic ? pic - &s_src->frames[0] + &s->frames[0] : NULL
2066 s->
prob[0] = s_src->
prob[!s_src->update_probabilities];