169 for (i = 0; i < 4; i++)
172 for (i = 0; i < 4; i++)
176 for (i = 0; i < 3; i++)
185 for (i = 0; i < 4; i++) {
218 if (buf_size - size < 0)
242 for (i = 0; i < 4; i++) {
306 int header_size, hscale, vscale, i, j, k, l,
m,
ret;
313 header_size =
AV_RL24(buf) >> 5;
325 if (header_size > buf_size - 7*s->
keyframe) {
331 if (
AV_RL24(buf) != 0x2a019d) {
335 width =
AV_RL16(buf+3) & 0x3fff;
336 height =
AV_RL16(buf+5) & 0x3fff;
337 hscale = buf[4] >> 6;
338 vscale = buf[6] >> 6;
342 if (hscale || vscale)
346 for (i = 0; i < 4; i++)
347 for (j = 0; j < 16; j++)
359 buf_size -= header_size;
406 for (i = 0; i < 4; i++)
407 for (j = 0; j < 8; j++)
408 for (k = 0; k < 3; k++)
425 for (i = 0; i < 4; i++)
428 for (i = 0; i < 3; i++)
432 for (i = 0; i < 2; i++)
433 for (j = 0; j < 19; j++)
457 for (i = 0; i < 3; i++)
459 for (i = 9; i > 3; i--)
501 *mbsplits_cur, *firstidx;
511 top_mv = top_mb->
bmv;
528 for (n = 0; n < num; n++) {
530 uint32_t left, above;
534 left =
AV_RN32A(&left_mv[mbsplits_left[k + 3]]);
536 left =
AV_RN32A(&cur_mv[mbsplits_cur[k - 1]]);
538 above =
AV_RN32A(&top_mv[mbsplits_top[k + 12]]);
540 above =
AV_RN32A(&cur_mv[mbsplits_cur[k - 4]]);
569 enum { CNT_ZERO, CNT_NEAREST, CNT_NEAR, CNT_SPLITMV };
570 enum { VP8_EDGE_TOP, VP8_EDGE_LEFT, VP8_EDGE_TOPLEFT };
592 #define MV_EDGE_CHECK(n)\
594 VP8Macroblock *edge = mb_edge[n];\
595 int edge_ref = edge->ref_frame;\
596 if (edge_ref != VP56_FRAME_CURRENT) {\
597 uint32_t mv = AV_RN32A(&edge->mv);\
599 if (cur_sign_bias != sign_bias[edge_ref]) {\
602 mv = ((mv&0x7fff7fff) + 0x00010001) ^ (mv&0x80008000);\
604 if (!n || mv != AV_RN32A(&near_mv[idx]))\
605 AV_WN32A(&near_mv[++idx], mv);\
606 cnt[idx] += 1 + (n != 2);\
608 cnt[CNT_ZERO] += 1 + (n != 2);\
621 if (cnt[CNT_SPLITMV] &&
AV_RN32A(&near_mv[1 + VP8_EDGE_TOP]) ==
AV_RN32A(&near_mv[1 + VP8_EDGE_TOPLEFT]))
622 cnt[CNT_NEAREST] += 1;
625 if (cnt[CNT_NEAR] > cnt[CNT_NEAREST]) {
627 FFSWAP(
VP56mv, near_mv[CNT_NEAREST], near_mv[CNT_NEAR]);
634 clamp_mv(s, &mb->
mv, &near_mv[CNT_ZERO + (cnt[CNT_NEAREST] >= cnt[CNT_ZERO])]);
664 int mb_x,
int keyframe,
int layout)
680 for (y = 0; y < 4; y++) {
681 for (x = 0; x < 4; x++) {
685 left[
y] = top[x] = *intra4x4;
691 for (i = 0; i < 16; i++)
706 *segment = ref ? *ref : *segment;
752 #ifndef decode_block_coeffs_internal
764 int i,
uint8_t *token_prob, int16_t qmul[2])
777 token_prob = probs[i][0];
783 token_prob = probs[i+1][1];
803 int cat = (a<<1) + b;
804 coeff = 3 + (8<<cat);
808 token_prob = probs[i+1][2];
832 int i,
int zero_nhood, int16_t qmul[2])
834 uint8_t *token_prob = probs[i][zero_nhood];
844 int i, x,
y, luma_start = 0, luma_ctx = 3;
845 int nnz_pred, nnz, nnz_total = 0;
850 nnz_pred = t_nnz[8] + l_nnz[8];
855 l_nnz[8] = t_nnz[8] = !!nnz;
869 for (y = 0; y < 4; y++)
870 for (x = 0; x < 4; x++) {
871 nnz_pred = l_nnz[
y] + t_nnz[x];
876 t_nnz[x] = l_nnz[
y] = !!nnz;
883 for (i = 4; i < 6; i++)
884 for (y = 0; y < 2; y++)
885 for (x = 0; x < 2; x++) {
886 nnz_pred = l_nnz[i+2*
y] + t_nnz[i+2*x];
890 t_nnz[i+2*x] = l_nnz[i+2*
y] = !!nnz;
903 int linesize,
int uvlinesize,
int simple)
907 AV_COPY64(top_border+16, src_cb + 7*uvlinesize);
908 AV_COPY64(top_border+24, src_cr + 7*uvlinesize);
914 int linesize,
int uvlinesize,
int mb_x,
int mb_y,
int mb_width,
915 int simple,
int xchg)
917 uint8_t *top_border_m1 = top_border-32;
919 src_cb -= uvlinesize;
920 src_cr -= uvlinesize;
922 #define XCHG(a,b,xchg) do { \
923 if (xchg) AV_SWAP64(b,a); \
924 else AV_COPY64(b,a); \
927 XCHG(top_border_m1+8, src_y-8, xchg);
928 XCHG(top_border, src_y, xchg);
929 XCHG(top_border+8, src_y+8, 1);
930 if (mb_x < mb_width-1)
931 XCHG(top_border+32, src_y+16, 1);
935 if (!simple || !mb_y) {
936 XCHG(top_border_m1+16, src_cb-8, xchg);
937 XCHG(top_border_m1+24, src_cr-8, xchg);
938 XCHG(top_border+16, src_cb, 1);
939 XCHG(top_border+24, src_cr, 1);
1004 if (!mb_x && mb_y) {
1038 int x,
y,
mode, nnz;
1058 uint8_t tr_top[4] = { 127, 127, 127, 127 };
1068 tr = tr_right[-1]*0x01010101
u;
1075 for (y = 0; y < 4; y++) {
1077 for (x = 0; x < 4; x++) {
1085 topright = tr_right;
1090 dst = copy_dst + 12;
1094 AV_WN32A(copy_dst+4, 127
U * 0x01010101U);
1100 copy_dst[3] = ptr[4*x-s->
linesize-1];
1107 copy_dst[35] = 129
U;
1109 copy_dst[11] = ptr[4*x -1];
1110 copy_dst[19] = ptr[4*x+s->
linesize -1];
1111 copy_dst[27] = ptr[4*x+s->
linesize*2-1];
1112 copy_dst[35] = ptr[4*x+s->
linesize*3-1];
1156 { 0, 1, 2, 1, 2, 1, 2, 1 },
1158 { 0, 3, 5, 3, 5, 3, 5, 3 },
1159 { 0, 2, 3, 2, 3, 2, 3, 2 },
1181 int x_off,
int y_off,
int block_w,
int block_h,
1188 int src_linesize = linesize;
1189 int mx = (mv->
x << 1)&7, mx_idx =
subpel_idx[0][mx];
1190 int my = (mv->
y << 1)&7, my_idx =
subpel_idx[0][my];
1192 x_off += mv->
x >> 2;
1193 y_off += mv->
y >> 2;
1197 src += y_off * linesize + x_off;
1198 if (x_off < mx_idx || x_off >= width - block_w -
subpel_idx[2][mx] ||
1199 y_off < my_idx || y_off >= height - block_h -
subpel_idx[2][my]) {
1201 src - my_idx * linesize - mx_idx, linesize,
1204 x_off - mx_idx, y_off - my_idx, width, height);
1208 mc_func[my_idx][mx_idx](dst, linesize,
src, src_linesize, block_h, mx, my);
1211 mc_func[0][0](dst, linesize, src + y_off * linesize + x_off, linesize, block_h, 0, 0);
1235 int block_w,
int block_h,
int width,
int height, ptrdiff_t linesize,
1244 x_off += mv->
x >> 3;
1245 y_off += mv->
y >> 3;
1248 src1 += y_off * linesize + x_off;
1249 src2 += y_off * linesize + x_off;
1251 if (x_off < mx_idx || x_off >= width - block_w -
subpel_idx[2][mx] ||
1252 y_off < my_idx || y_off >= height - block_h -
subpel_idx[2][my]) {
1254 src1 - my_idx * linesize - mx_idx, linesize,
1257 x_off - mx_idx, y_off - my_idx, width, height);
1259 mc_func[my_idx][mx_idx](dst1, linesize, src1, 32, block_h, mx, my);
1262 src2 - my_idx * linesize - mx_idx, linesize,
1265 x_off - mx_idx, y_off - my_idx, width, height);
1267 mc_func[my_idx][mx_idx](dst2, linesize, src2, 32, block_h, mx, my);
1269 mc_func[my_idx][mx_idx](dst1, linesize, src1, linesize, block_h, mx, my);
1270 mc_func[my_idx][mx_idx](dst2, linesize, src2, linesize, block_h, mx, my);
1274 mc_func[0][0](dst1, linesize, src1 + y_off * linesize + x_off, linesize, block_h, 0, 0);
1275 mc_func[0][0](dst2, linesize, src2 + y_off * linesize + x_off, linesize, block_h, 0, 0);
1282 int bx_off,
int by_off,
1283 int block_w,
int block_h,
1290 ref_frame, mv, x_off + bx_off, y_off + by_off,
1291 block_w, block_h, width, height, s->
linesize,
1299 x_off >>= 1; y_off >>= 1;
1300 bx_off >>= 1; by_off >>= 1;
1301 width >>= 1; height >>= 1;
1302 block_w >>= 1; block_h >>= 1;
1304 dst[2] + by_off * s->
uvlinesize + bx_off, ref_frame,
1305 &uvmv, x_off + bx_off, y_off + by_off,
1306 block_w, block_h, width, height, s->
uvlinesize,
1315 if (s->
ref_count[ref-1] > (mb_xy >> 5)) {
1316 int x_off = mb_x << 4, y_off = mb_y << 4;
1317 int mx = (mb->
mv.
x>>2) + x_off + 8;
1318 int my = (mb->
mv.
y>>2) + y_off;
1325 off= (mx>>1) + ((my>>1) + (mb_x&7))*s->
uvlinesize + 64;
1337 int x_off = mb_x << 4, y_off = mb_y << 4;
1345 0, 0, 16, 16, width,
height, &mb->
mv);
1352 for (y = 0; y < 4; y++) {
1353 for (x = 0; x < 4; x++) {
1356 4*x + x_off, 4*y + y_off, 4, 4,
1363 x_off >>= 1; y_off >>= 1; width >>= 1;
height >>= 1;
1364 for (y = 0; y < 2; y++) {
1365 for (x = 0; x < 2; x++) {
1366 uvmv.
x = mb->
bmv[ 2*y * 4 + 2*x ].
x +
1367 mb->
bmv[ 2*y * 4 + 2*x+1].
x +
1368 mb->
bmv[(2*y+1) * 4 + 2*x ].x +
1369 mb->
bmv[(2*y+1) * 4 + 2*x+1].
x;
1370 uvmv.
y = mb->
bmv[ 2*y * 4 + 2*x ].
y +
1371 mb->
bmv[ 2*y * 4 + 2*x+1].
y +
1372 mb->
bmv[(2*y+1) * 4 + 2*x ].y +
1373 mb->
bmv[(2*y+1) * 4 + 2*x+1].
y;
1374 uvmv.
x = (uvmv.
x + 2 + (uvmv.
x >> (
INT_BIT-1))) >> 2;
1375 uvmv.
y = (uvmv.
y + 2 + (uvmv.
y >> (
INT_BIT-1))) >> 2;
1381 dst[2] + 4*y*s->
uvlinesize + x*4, ref, &uvmv,
1382 4*x + x_off, 4*y + y_off, 4, 4,
1391 0, 0, 16, 8, width,
height, &bmv[0]);
1393 0, 8, 16, 8, width,
height, &bmv[1]);
1397 0, 0, 8, 16, width,
height, &bmv[0]);
1399 8, 0, 8, 16, width,
height, &bmv[1]);
1403 0, 0, 8, 8, width,
height, &bmv[0]);
1405 8, 0, 8, 8, width,
height, &bmv[1]);
1407 0, 8, 8, 8, width,
height, &bmv[2]);
1409 8, 8, 8, 8, width,
height, &bmv[3]);
1421 for (y = 0; y < 4; y++) {
1424 if (nnz4&~0x01010101) {
1425 for (x = 0; x < 4; x++) {
1442 for (ch = 0; ch < 2; ch++) {
1446 if (nnz4&~0x01010101) {
1447 for (y = 0; y < 2; y++) {
1448 for (x = 0; x < 2; x++) {
1455 goto chroma_idct_end;
1469 int interior_limit, filter_level;
1483 filter_level = av_clip_uintp2(filter_level, 6);
1485 interior_limit = filter_level;
1490 interior_limit =
FFMAX(interior_limit, 1);
1499 int mbedge_lim, bedge_lim, hev_thresh;
1505 static const uint8_t hev_thresh_lut[2][64] = {
1506 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
1507 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1508 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1510 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
1511 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1512 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1519 bedge_lim = 2*filter_level + inner_limit;
1520 mbedge_lim = bedge_lim + 4;
1522 hev_thresh = hev_thresh_lut[s->
keyframe][filter_level];
1526 mbedge_lim, inner_limit, hev_thresh);
1528 mbedge_lim, inner_limit, hev_thresh);
1533 inner_limit, hev_thresh);
1535 inner_limit, hev_thresh);
1537 inner_limit, hev_thresh);
1539 uvlinesize, bedge_lim,
1540 inner_limit, hev_thresh);
1545 mbedge_lim, inner_limit, hev_thresh);
1547 mbedge_lim, inner_limit, hev_thresh);
1552 linesize, bedge_lim,
1553 inner_limit, hev_thresh);
1555 linesize, bedge_lim,
1556 inner_limit, hev_thresh);
1558 linesize, bedge_lim,
1559 inner_limit, hev_thresh);
1561 dst[2] + 4 * uvlinesize,
1562 uvlinesize, bedge_lim,
1563 inner_limit, hev_thresh);
1569 int mbedge_lim, bedge_lim;
1578 bedge_lim = 2*filter_level + inner_limit;
1579 mbedge_lim = bedge_lim + 4;
1598 #define MARGIN (16 << 2)
1607 for (mb_y = 0; mb_y < s->
mb_height; mb_y++) {
1615 for (mb_x = 0; mb_x < s->
mb_width; mb_x++, mb_xy++, mb++) {
1619 prev_frame && prev_frame->
seg_map ?
1630 #define check_thread_pos(td, otd, mb_x_check, mb_y_check)\
1632 int tmp = (mb_y_check << 16) | (mb_x_check & 0xFFFF);\
1633 if (otd->thread_mb_pos < tmp) {\
1634 pthread_mutex_lock(&otd->lock);\
1635 td->wait_mb_pos = tmp;\
1637 if (otd->thread_mb_pos >= tmp)\
1639 pthread_cond_wait(&otd->cond, &otd->lock);\
1641 td->wait_mb_pos = INT_MAX;\
1642 pthread_mutex_unlock(&otd->lock);\
1646 #define update_pos(td, mb_y, mb_x)\
1648 int pos = (mb_y << 16) | (mb_x & 0xFFFF);\
1649 int sliced_threading = (avctx->active_thread_type == FF_THREAD_SLICE) && (num_jobs > 1);\
1650 int is_null = (next_td == NULL) || (prev_td == NULL);\
1651 int pos_check = (is_null) ? 1 :\
1652 (next_td != td && pos >= next_td->wait_mb_pos) ||\
1653 (prev_td != td && pos >= prev_td->wait_mb_pos);\
1654 td->thread_mb_pos = pos;\
1655 if (sliced_threading && pos_check) {\
1656 pthread_mutex_lock(&td->lock);\
1657 pthread_cond_broadcast(&td->cond);\
1658 pthread_mutex_unlock(&td->lock);\
1662 #define check_thread_pos(td, otd, mb_x_check, mb_y_check)
1663 #define update_pos(td, mb_y, mb_x)
1667 int jobnr,
int threadnr)
1672 int i,
y, mb_x, mb_xy = mb_y*s->
mb_width;
1682 if (mb_y == 0) prev_td =
td;
1683 else prev_td = &s->
thread_data[(jobnr + num_jobs - 1)%num_jobs];
1685 else next_td = &s->
thread_data[(jobnr + 1)%num_jobs];
1695 memset(mb - 1, 0,
sizeof(*mb));
1702 for (i = 0; i < 3; i++)
1703 for (y = 0; y < 16>>!!i; y++)
1713 for (mb_x = 0; mb_x < s->
mb_width; mb_x++, mb_xy++, mb++) {
1715 if (prev_td != td) {
1716 if (threadnr != 0) {
1728 prev_frame && prev_frame->seg_map ?
1729 prev_frame->seg_map->data + 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];
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;
1890 for (i = 0; i < 5; i++)
1892 &s->
frames[i] != prev_frame &&
1899 for (i = 0; i < 5; i++)
1900 if (&s->
frames[i] != prev_frame &&
1911 if (curframe->tf.f->data[0])
1925 curframe->tf.f->key_frame = s->
keyframe;
1950 s->
linesize = curframe->tf.f->linesize[0];
2073 #define REBASE(pic) \
2074 pic ? pic - &s_src->frames[0] + &s->frames[0] : NULL
2088 s->
prob[0] = s_src->
prob[!s_src->update_probabilities];
2094 if (s_src->frames[i].tf.f->data[0]) {
2115 int buf_size = avpkt->
size;
2124 if (buf_size < 8 || riff_size < 8) {
2150 pkt.
size = buf_size;