98 int mb_type,
int list)
100 int16_t(*mv_dst)[2] = &
h->cur_pic.motion_val[list][b_xy];
102 AV_COPY128(mv_dst + 0 * b_stride, mv_src + 8 * 0);
103 AV_COPY128(mv_dst + 1 * b_stride, mv_src + 8 * 1);
104 AV_COPY128(mv_dst + 2 * b_stride, mv_src + 8 * 2);
105 AV_COPY128(mv_dst + 3 * b_stride, mv_src + 8 * 3);
108 :
h->mb2br_xy[sl->
mb_xy]];
114 AV_COPY16(mvd_dst + 3 + 3, mvd_src + 3 + 8 * 0);
115 AV_COPY16(mvd_dst + 3 + 2, mvd_src + 3 + 8 * 1);
116 AV_COPY16(mvd_dst + 3 + 1, mvd_src + 3 + 8 * 2);
121 int8_t *ref_index = &
h->cur_pic.ref_index[list][b8_xy];
123 ref_index[0 + 0 * 2] = ref_cache[
scan8[0]];
124 ref_index[1 + 0 * 2] = ref_cache[
scan8[4]];
125 ref_index[0 + 1 * 2] = ref_cache[
scan8[8]];
126 ref_index[1 + 1 * 2] = ref_cache[
scan8[12]];
489 const int mb_xy = sl->
mb_xy;
490 int topleft_xy, top_xy, topright_xy, left_xy[
LEFT_MBS];
491 static const uint8_t left_block_options[4][32] = {
492 { 0, 1, 2, 3, 7, 10, 8, 11, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4, 3 + 3 * 4, 1 + 4 * 4, 1 + 8 * 4, 1 + 5 * 4, 1 + 9 * 4 },
493 { 2, 2, 3, 3, 8, 11, 8, 11, 3 + 2 * 4, 3 + 2 * 4, 3 + 3 * 4, 3 + 3 * 4, 1 + 5 * 4, 1 + 9 * 4, 1 + 5 * 4, 1 + 9 * 4 },
494 { 0, 0, 1, 1, 7, 10, 7, 10, 3 + 0 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 1 * 4, 1 + 4 * 4, 1 + 8 * 4, 1 + 4 * 4, 1 + 8 * 4 },
495 { 0, 2, 0, 2, 7, 10, 7, 10, 3 + 0 * 4, 3 + 2 * 4, 3 + 0 * 4, 3 + 2 * 4, 1 + 4 * 4, 1 + 8 * 4, 1 + 4 * 4, 1 + 8 * 4 }
500 top_xy = mb_xy - (
h->mb_stride <<
MB_FIELD(sl));
505 topleft_xy = top_xy - 1;
506 topright_xy = top_xy + 1;
507 left_xy[
LBOT] = left_xy[
LTOP] = mb_xy - 1;
510 const int left_mb_field_flag =
IS_INTERLACED(
h->cur_pic.mb_type[mb_xy - 1]);
513 if (left_mb_field_flag != curr_mb_field_flag) {
514 left_xy[
LBOT] = left_xy[
LTOP] = mb_xy -
h->mb_stride - 1;
515 if (curr_mb_field_flag) {
516 left_xy[
LBOT] +=
h->mb_stride;
519 topleft_xy +=
h->mb_stride;
527 if (curr_mb_field_flag) {
528 topleft_xy +=
h->mb_stride & (((
h->cur_pic.mb_type[top_xy - 1] >> 7) & 1) - 1);
529 topright_xy +=
h->mb_stride & (((
h->cur_pic.mb_type[top_xy + 1] >> 7) & 1) - 1);
530 top_xy +=
h->mb_stride & (((
h->cur_pic.mb_type[top_xy] >> 7) & 1) - 1);
532 if (left_mb_field_flag != curr_mb_field_flag) {
533 if (curr_mb_field_flag) {
534 left_xy[
LBOT] +=
h->mb_stride;
551 sl->
top_type =
h->cur_pic.mb_type[top_xy];
557 if (
h->slice_table[topleft_xy] != sl->
slice_num)
564 if (
h->slice_table[topleft_xy] != sl->
slice_num) {
572 if (
h->slice_table[topright_xy] != sl->
slice_num)
578 int topleft_xy, top_xy, topright_xy, left_xy[
LEFT_MBS];
579 int topleft_type, top_type, topright_type, left_type[
LEFT_MBS];
598 int type_mask =
h->ps.pps->constrained_intra_pred ?
IS_INTRA(-1) : -1;
604 if (!(top_type & type_mask)) {
611 if (!(left_type[
LTOP] & type_mask)) {
615 if (!(left_type[
LBOT] & type_mask)) {
620 int left_typei =
h->cur_pic.mb_type[left_xy[
LTOP] +
h->mb_stride];
623 if (!((left_typei & type_mask) && (left_type[
LTOP] & type_mask))) {
629 if (!(left_type[
LTOP] & type_mask)) {
635 if (!(topleft_type & type_mask))
638 if (!(topright_type & type_mask))
650 for (
i = 0;
i < 2;
i++) {
677 int nnz_excluded = 64;
687 if (top_type & nnz_mask) {
688 nnz =
h->non_zero_count[top_xy];
689 AV_COPY32(&nnz_cache[4 + 8 * 0], &nnz[4 * 3]);
690 if (!
h->chroma_y_shift) {
691 AV_COPY32(&nnz_cache[4 + 8 * 5], &nnz[4 * 7]);
692 AV_COPY32(&nnz_cache[4 + 8 * 10], &nnz[4 * 11]);
694 AV_COPY32(&nnz_cache[4 + 8 * 5], &nnz[4 * 5]);
695 AV_COPY32(&nnz_cache[4 + 8 * 10], &nnz[4 * 9]);
699 top_type ? nnz_excluded * 0x01010101u : 0x40404040;
700 AV_WN32A(&nnz_cache[4 + 8 * 0], top_empty);
701 AV_WN32A(&nnz_cache[4 + 8 * 5], top_empty);
702 AV_WN32A(&nnz_cache[4 + 8 * 10], top_empty);
705 for (
i = 0;
i < 2;
i++) {
706 if (left_type[
LEFT(
i)] & nnz_mask) {
707 nnz =
h->non_zero_count[left_xy[
LEFT(
i)]];
708 nnz_cache[3 + 8 * 1 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i]];
709 nnz_cache[3 + 8 * 2 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i]];
711 nnz_cache[3 + 8 * 6 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i] + 4 * 4];
712 nnz_cache[3 + 8 * 7 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i] + 4 * 4];
713 nnz_cache[3 + 8 * 11 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i] + 8 * 4];
714 nnz_cache[3 + 8 * 12 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i] + 8 * 4];
716 nnz_cache[3 + 8 * 6 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i] - 2 + 4 * 4];
717 nnz_cache[3 + 8 * 7 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i] - 2 + 4 * 4];
718 nnz_cache[3 + 8 * 11 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i] - 2 + 8 * 4];
719 nnz_cache[3 + 8 * 12 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i] - 2 + 8 * 4];
721 nnz_cache[3 + 8 * 6 + 8 *
i] = nnz[left_block[8 + 4 + 2 *
i]];
722 nnz_cache[3 + 8 * 11 + 8 *
i] = nnz[left_block[8 + 5 + 2 *
i]];
726 left_type[
LEFT(
i)] ? nnz_excluded : 64;
727 nnz_cache[3 + 8 * 1 + 2 * 8 *
i] =
728 nnz_cache[3 + 8 * 2 + 2 * 8 *
i] =
729 nnz_cache[3 + 8 * 6 + 2 * 8 *
i] =
730 nnz_cache[3 + 8 * 7 + 2 * 8 *
i] =
731 nnz_cache[3 + 8 * 11 + 2 * 8 *
i] =
732 nnz_cache[3 + 8 * 12 + 2 * 8 *
i] = empty;
743 if (left_type[
LTOP]) {
745 ((
h->cbp_table[left_xy[
LTOP]] >> (left_block[0] & (~1))) & 2) |
746 (((
h->cbp_table[left_xy[
LBOT]] >> (left_block[2] & (~1))) & 2) << 2);
755 int b_stride =
h->b_stride;
756 for (list = 0; list < sl->
list_count; list++) {
758 int8_t *
ref =
h->cur_pic.ref_index[list];
760 int16_t(*
mv)[2] =
h->cur_pic.motion_val[list];
766 const int b_xy =
h->mb2b_xy[top_xy] + 3 * b_stride;
768 ref_cache[0 - 1 * 8] =
769 ref_cache[1 - 1 * 8] =
ref[4 * top_xy + 2];
770 ref_cache[2 - 1 * 8] =
771 ref_cache[3 - 1 * 8] =
ref[4 * top_xy + 3];
779 for (
i = 0;
i < 2;
i++) {
780 int cache_idx = -1 +
i * 2 * 8;
782 const int b_xy =
h->mb2b_xy[left_xy[
LEFT(
i)]] + 3;
783 const int b8_xy = 4 * left_xy[
LEFT(
i)] + 1;
785 mv[b_xy + b_stride * left_block[0 +
i * 2]]);
787 mv[b_xy + b_stride * left_block[1 +
i * 2]]);
788 ref_cache[cache_idx] =
ref[b8_xy + (left_block[0 +
i * 2] & ~1)];
789 ref_cache[cache_idx + 8] =
ref[b8_xy + (left_block[1 +
i * 2] & ~1)];
793 ref_cache[cache_idx] =
800 const int b_xy =
h->mb2b_xy[left_xy[
LTOP]] + 3;
801 const int b8_xy = 4 * left_xy[
LTOP] + 1;
802 AV_COPY32(mv_cache[-1],
mv[b_xy + b_stride * left_block[0]]);
803 ref_cache[-1] =
ref[b8_xy + (left_block[0] & ~1)];
812 const int b_xy =
h->mb2b_xy[topright_xy] + 3 * b_stride;
814 ref_cache[4 - 1 * 8] =
ref[4 * topright_xy + 2];
820 if(ref_cache[2 - 1*8] < 0 || ref_cache[4 - 1 * 8] < 0) {
822 const int b_xy =
h->mb2b_xy[topleft_xy] + 3 + b_stride +
826 ref_cache[-1 - 1 * 8] =
ref[b8_xy];
840 ref_cache[2 + 8 * 0] =
847 const int b_xy =
h->mb2br_xy[top_xy];
848 AV_COPY64(mvd_cache[0 - 1 * 8], mvd[b_xy + 0]);
853 const int b_xy =
h->mb2br_xy[left_xy[
LTOP]] + 6;
854 AV_COPY16(mvd_cache[-1 + 0 * 8], mvd[b_xy - left_block[0]]);
855 AV_COPY16(mvd_cache[-1 + 1 * 8], mvd[b_xy - left_block[1]]);
861 const int b_xy =
h->mb2br_xy[left_xy[
LBOT]] + 6;
862 AV_COPY16(mvd_cache[-1 + 2 * 8], mvd[b_xy - left_block[2]]);
863 AV_COPY16(mvd_cache[-1 + 3 * 8], mvd[b_xy - left_block[3]]);
872 uint8_t *direct_table =
h->direct_table;
878 }
else if (
IS_8X8(top_type)) {
879 int b8_xy = 4 * top_xy;
880 direct_cache[0 - 1 * 8] = direct_table[b8_xy + 2];
881 direct_cache[2 - 1 * 8] = direct_table[b8_xy + 3];
890 direct_cache[-1 + 0 * 8] = direct_table[4 * left_xy[
LTOP] + 1 + (left_block[0] & ~1)];
897 direct_cache[-1 + 2 * 8] = direct_table[4 * left_xy[
LBOT] + 1 + (left_block[2] & ~1)];
905 MAP_F2F(scan8[0] - 1 - 1 * 8, topleft_type) \
906 MAP_F2F(scan8[0] + 0 - 1 * 8, top_type) \
907 MAP_F2F(scan8[0] + 1 - 1 * 8, top_type) \
908 MAP_F2F(scan8[0] + 2 - 1 * 8, top_type) \
909 MAP_F2F(scan8[0] + 3 - 1 * 8, top_type) \
910 MAP_F2F(scan8[0] + 4 - 1 * 8, topright_type) \
911 MAP_F2F(scan8[0] - 1 + 0 * 8, left_type[LTOP]) \
912 MAP_F2F(scan8[0] - 1 + 1 * 8, left_type[LTOP]) \
913 MAP_F2F(scan8[0] - 1 + 2 * 8, left_type[LBOT]) \
914 MAP_F2F(scan8[0] - 1 + 3 * 8, left_type[LBOT])
919#define MAP_F2F(idx, mb_type) \
920 if (!IS_INTERLACED(mb_type) && sl->ref_cache[list][idx] >= 0) { \
921 sl->ref_cache[list][idx] *= 2; \
922 sl->mv_cache[list][idx][1] /= 2; \
923 sl->mvd_cache[list][idx][1] >>= 1; \
930#define MAP_F2F(idx, mb_type) \
931 if (IS_INTERLACED(mb_type) && sl->ref_cache[list][idx] >= 0) { \
932 sl->ref_cache[list][idx] >>= 1; \
933 sl->mv_cache[list][idx][1] *= 2; \
934 sl->mvd_cache[list][idx][1] <<= 1; \
int slice_type_nos
S free slice type (SI/SP are remapped to I/P)
uint8_t non_zero_count_cache[15 *8]
non zero coeff count cache.
int neighbor_transform_size
number of neighbors (top and/or left) that used 8x8 dct