73 const int mb_xy = sl->
mb_xy;
74 uint8_t *nnz =
h->non_zero_count[mb_xy];
77 AV_COPY32(&nnz[ 0], &nnz_cache[4 + 8 * 1]);
78 AV_COPY32(&nnz[ 4], &nnz_cache[4 + 8 * 2]);
79 AV_COPY32(&nnz[ 8], &nnz_cache[4 + 8 * 3]);
80 AV_COPY32(&nnz[12], &nnz_cache[4 + 8 * 4]);
81 AV_COPY32(&nnz[16], &nnz_cache[4 + 8 * 6]);
82 AV_COPY32(&nnz[20], &nnz_cache[4 + 8 * 7]);
83 AV_COPY32(&nnz[32], &nnz_cache[4 + 8 * 11]);
84 AV_COPY32(&nnz[36], &nnz_cache[4 + 8 * 12]);
86 if (!
h->chroma_y_shift) {
87 AV_COPY32(&nnz[24], &nnz_cache[4 + 8 * 8]);
88 AV_COPY32(&nnz[28], &nnz_cache[4 + 8 * 9]);
89 AV_COPY32(&nnz[40], &nnz_cache[4 + 8 * 13]);
90 AV_COPY32(&nnz[44], &nnz_cache[4 + 8 * 14]);
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++) {
675 nnz =
h->non_zero_count[top_xy];
676 AV_COPY32(&nnz_cache[4 + 8 * 0], &nnz[4 * 3]);
677 if (!
h->chroma_y_shift) {
678 AV_COPY32(&nnz_cache[4 + 8 * 5], &nnz[4 * 7]);
679 AV_COPY32(&nnz_cache[4 + 8 * 10], &nnz[4 * 11]);
681 AV_COPY32(&nnz_cache[4 + 8 * 5], &nnz[4 * 5]);
682 AV_COPY32(&nnz_cache[4 + 8 * 10], &nnz[4 * 9]);
685 uint32_t top_empty =
CABAC(
h) && !
IS_INTRA(mb_type) ? 0 : 0x40404040;
686 AV_WN32A(&nnz_cache[4 + 8 * 0], top_empty);
687 AV_WN32A(&nnz_cache[4 + 8 * 5], top_empty);
688 AV_WN32A(&nnz_cache[4 + 8 * 10], top_empty);
691 for (
i = 0;
i < 2;
i++) {
692 if (left_type[
LEFT(
i)]) {
693 nnz =
h->non_zero_count[left_xy[
LEFT(
i)]];
694 nnz_cache[3 + 8 * 1 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i]];
695 nnz_cache[3 + 8 * 2 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i]];
697 nnz_cache[3 + 8 * 6 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i] + 4 * 4];
698 nnz_cache[3 + 8 * 7 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i] + 4 * 4];
699 nnz_cache[3 + 8 * 11 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i] + 8 * 4];
700 nnz_cache[3 + 8 * 12 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i] + 8 * 4];
702 nnz_cache[3 + 8 * 6 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i] - 2 + 4 * 4];
703 nnz_cache[3 + 8 * 7 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i] - 2 + 4 * 4];
704 nnz_cache[3 + 8 * 11 + 2 * 8 *
i] = nnz[left_block[8 + 0 + 2 *
i] - 2 + 8 * 4];
705 nnz_cache[3 + 8 * 12 + 2 * 8 *
i] = nnz[left_block[8 + 1 + 2 *
i] - 2 + 8 * 4];
707 nnz_cache[3 + 8 * 6 + 8 *
i] = nnz[left_block[8 + 4 + 2 *
i]];
708 nnz_cache[3 + 8 * 11 + 8 *
i] = nnz[left_block[8 + 5 + 2 *
i]];
711 nnz_cache[3 + 8 * 1 + 2 * 8 *
i] =
712 nnz_cache[3 + 8 * 2 + 2 * 8 *
i] =
713 nnz_cache[3 + 8 * 6 + 2 * 8 *
i] =
714 nnz_cache[3 + 8 * 7 + 2 * 8 *
i] =
715 nnz_cache[3 + 8 * 11 + 2 * 8 *
i] =
716 nnz_cache[3 + 8 * 12 + 2 * 8 *
i] =
CABAC(
h) && !
IS_INTRA(mb_type) ? 0 : 64;
727 if (left_type[
LTOP]) {
729 ((
h->cbp_table[left_xy[
LTOP]] >> (left_block[0] & (~1))) & 2) |
730 (((
h->cbp_table[left_xy[
LBOT]] >> (left_block[2] & (~1))) & 2) << 2);
739 int b_stride =
h->b_stride;
740 for (list = 0; list < sl->
list_count; list++) {
742 int8_t *
ref =
h->cur_pic.ref_index[list];
744 int16_t(*
mv)[2] =
h->cur_pic.motion_val[list];
750 const int b_xy =
h->mb2b_xy[top_xy] + 3 * b_stride;
752 ref_cache[0 - 1 * 8] =
753 ref_cache[1 - 1 * 8] =
ref[4 * top_xy + 2];
754 ref_cache[2 - 1 * 8] =
755 ref_cache[3 - 1 * 8] =
ref[4 * top_xy + 3];
763 for (
i = 0;
i < 2;
i++) {
764 int cache_idx = -1 +
i * 2 * 8;
766 const int b_xy =
h->mb2b_xy[left_xy[
LEFT(
i)]] + 3;
767 const int b8_xy = 4 * left_xy[
LEFT(
i)] + 1;
769 mv[b_xy + b_stride * left_block[0 +
i * 2]]);
771 mv[b_xy + b_stride * left_block[1 +
i * 2]]);
772 ref_cache[cache_idx] =
ref[b8_xy + (left_block[0 +
i * 2] & ~1)];
773 ref_cache[cache_idx + 8] =
ref[b8_xy + (left_block[1 +
i * 2] & ~1)];
777 ref_cache[cache_idx] =
784 const int b_xy =
h->mb2b_xy[left_xy[
LTOP]] + 3;
785 const int b8_xy = 4 * left_xy[
LTOP] + 1;
786 AV_COPY32(mv_cache[-1],
mv[b_xy + b_stride * left_block[0]]);
787 ref_cache[-1] =
ref[b8_xy + (left_block[0] & ~1)];
796 const int b_xy =
h->mb2b_xy[topright_xy] + 3 * b_stride;
798 ref_cache[4 - 1 * 8] =
ref[4 * topright_xy + 2];
804 if(ref_cache[2 - 1*8] < 0 || ref_cache[4 - 1 * 8] < 0) {
806 const int b_xy =
h->mb2b_xy[topleft_xy] + 3 + b_stride +
810 ref_cache[-1 - 1 * 8] =
ref[b8_xy];
824 ref_cache[2 + 8 * 0] =
831 const int b_xy =
h->mb2br_xy[top_xy];
832 AV_COPY64(mvd_cache[0 - 1 * 8], mvd[b_xy + 0]);
837 const int b_xy =
h->mb2br_xy[left_xy[
LTOP]] + 6;
838 AV_COPY16(mvd_cache[-1 + 0 * 8], mvd[b_xy - left_block[0]]);
839 AV_COPY16(mvd_cache[-1 + 1 * 8], mvd[b_xy - left_block[1]]);
845 const int b_xy =
h->mb2br_xy[left_xy[
LBOT]] + 6;
846 AV_COPY16(mvd_cache[-1 + 2 * 8], mvd[b_xy - left_block[2]]);
847 AV_COPY16(mvd_cache[-1 + 3 * 8], mvd[b_xy - left_block[3]]);
856 uint8_t *direct_table =
h->direct_table;
862 }
else if (
IS_8X8(top_type)) {
863 int b8_xy = 4 * top_xy;
864 direct_cache[0 - 1 * 8] = direct_table[b8_xy + 2];
865 direct_cache[2 - 1 * 8] = direct_table[b8_xy + 3];
874 direct_cache[-1 + 0 * 8] = direct_table[4 * left_xy[
LTOP] + 1 + (left_block[0] & ~1)];
881 direct_cache[-1 + 2 * 8] = direct_table[4 * left_xy[
LBOT] + 1 + (left_block[2] & ~1)];
889 MAP_F2F(scan8[0] - 1 - 1 * 8, topleft_type) \
890 MAP_F2F(scan8[0] + 0 - 1 * 8, top_type) \
891 MAP_F2F(scan8[0] + 1 - 1 * 8, top_type) \
892 MAP_F2F(scan8[0] + 2 - 1 * 8, top_type) \
893 MAP_F2F(scan8[0] + 3 - 1 * 8, top_type) \
894 MAP_F2F(scan8[0] + 4 - 1 * 8, topright_type) \
895 MAP_F2F(scan8[0] - 1 + 0 * 8, left_type[LTOP]) \
896 MAP_F2F(scan8[0] - 1 + 1 * 8, left_type[LTOP]) \
897 MAP_F2F(scan8[0] - 1 + 2 * 8, left_type[LBOT]) \
898 MAP_F2F(scan8[0] - 1 + 3 * 8, left_type[LBOT])
903#define MAP_F2F(idx, mb_type) \
904 if (!IS_INTERLACED(mb_type) && sl->ref_cache[list][idx] >= 0) { \
905 sl->ref_cache[list][idx] *= 2; \
906 sl->mv_cache[list][idx][1] /= 2; \
907 sl->mvd_cache[list][idx][1] >>= 1; \
914#define MAP_F2F(idx, mb_type) \
915 if (IS_INTERLACED(mb_type) && sl->ref_cache[list][idx] >= 0) { \
916 sl->ref_cache[list][idx] >>= 1; \
917 sl->mv_cache[list][idx][1] *= 2; \
918 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