28 #ifndef AVCODEC_H264_MVPRED_H
29 #define AVCODEC_H264_MVPRED_H
39 const int topright_ref= h->
ref_cache[list][ i - 8 + part_width ];
46 #define SET_DIAG_MV(MV_OP, REF_OP, XY, Y4)\
47 const int xy = XY, y4 = Y4;\
48 const int mb_type = mb_types[xy+(y4>>2)*s->mb_stride];\
49 if(!USES_LIST(mb_type,list))\
50 return LIST_NOT_USED;\
51 mv = s->current_picture_ptr->f.motion_val[list][h->mb2b_xy[xy] + 3 + y4*h->b_stride];\
52 h->mv_cache[list][scan8[0]-2][0] = mv[0];\
53 h->mv_cache[list][scan8[0]-2][1] = mv[1] MV_OP;\
54 return s->current_picture_ptr->f.ref_index[list][4*xy + 1 + (y4 & ~1)] REF_OP;
57 && i >=
scan8[0]+8 && (i&7)==4
78 *C= h->
mv_cache[list][ i - 8 + part_width ];
96 const int index8=
scan8[n];
97 const int top_ref= h->
ref_cache[list][ index8 - 8 ];
98 const int left_ref= h->
ref_cache[list][ index8 - 1 ];
99 const int16_t *
const A= h->
mv_cache[list][ index8 - 1 ];
100 const int16_t *
const B= h->
mv_cache[list][ index8 - 8 ];
102 int diagonal_ref, match_count;
104 assert(part_width==1 || part_width==2 || part_width==4);
115 match_count= (diagonal_ref==ref) + (top_ref==ref) + (left_ref==ref);
116 tprintf(h->
s.
avctx,
"pred_motion match_count=%d\n", match_count);
120 }
else if(match_count==1){
124 }
else if(top_ref==ref){
141 tprintf(h->
s.
avctx,
"pred_motion (%2d %2d %2d) (%2d %2d %2d) (%2d %2d %2d) -> (%2d %2d %2d) at %2d %2d %d list %d\n", top_ref, B[0], B[1], diagonal_ref, C[0], C[1], left_ref, A[0], A[1], ref, *mx, *my, h->
s.
mb_x, h->
s.
mb_y, n, list);
155 tprintf(h->
s.
avctx,
"pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", top_ref, B[0], B[1], h->
s.
mb_x, h->
s.
mb_y, n, list);
166 tprintf(h->
s.
avctx,
"pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", left_ref, A[0], A[1], h->
s.
mb_x, h->
s.
mb_y, n, list);
190 tprintf(h->
s.
avctx,
"pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", left_ref, A[0], A[1], h->
s.
mb_x, h->
s.
mb_y, n, list);
203 tprintf(h->
s.
avctx,
"pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", diagonal_ref, C[0], C[1], h->
s.
mb_x, h->
s.
mb_y, n, list);
205 if(diagonal_ref == ref){
216 #define FIX_MV_MBAFF(type, refn, mvn, idx)\
219 if(!IS_INTERLACED(type)){\
221 AV_COPY32(mvbuf[idx], mvn);\
226 if(IS_INTERLACED(type)){\
228 AV_COPY32(mvbuf[idx], mvn);\
229 mvbuf[idx][1] <<= 1;\
241 int top_ref, left_ref, diagonal_ref, match_count, mx, my;
242 const int16_t *
A, *
B, *C;
302 match_count= !diagonal_ref + !top_ref + !left_ref;
303 tprintf(h->
s.
avctx,
"pred_pskip_motion match_count=%d\n", match_count);
307 }
else if(match_count==1){
332 const int mb_xy= h->
mb_xy;
333 int topleft_xy, top_xy, topright_xy, left_xy[
LEFT_MBS];
334 static const uint8_t left_block_options[4][32]={
335 {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},
336 {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},
337 {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},
338 {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}
348 topleft_xy = top_xy - 1;
349 topright_xy= top_xy + 1;
350 left_xy[
LBOT] = left_xy[
LTOP] = mb_xy-1;
356 if (left_mb_field_flag != curr_mb_field_flag) {
358 if (curr_mb_field_flag) {
369 if(curr_mb_field_flag){
374 if (left_mb_field_flag != curr_mb_field_flag) {
375 if (curr_mb_field_flag) {
414 int topleft_xy, top_xy, topright_xy, left_xy[
LEFT_MBS];
415 int topleft_type, top_type, topright_type, left_type[
LEFT_MBS];
440 if(!(top_type & type_mask)){
447 if(!(left_type[LTOP] & type_mask)){
451 if(!(left_type[
LBOT] & type_mask)){
458 assert(left_xy[LTOP] == left_xy[
LBOT]);
459 if(!((left_typei & type_mask) && (left_type[LTOP] & type_mask))){
465 if(!(left_type[LTOP] & type_mask)){
471 if(!(topleft_type & type_mask))
474 if(!(topright_type & type_mask))
512 AV_COPY32(&nnz_cache[4+8* 0], &nnz[4*3]);
514 AV_COPY32(&nnz_cache[4+8* 5], &nnz[4* 7]);
515 AV_COPY32(&nnz_cache[4+8*10], &nnz[4*11]);
517 AV_COPY32(&nnz_cache[4+8* 5], &nnz[4* 5]);
518 AV_COPY32(&nnz_cache[4+8*10], &nnz[4* 9]);
521 uint32_t top_empty =
CABAC && !
IS_INTRA(mb_type) ? 0 : 0x40404040;
522 AV_WN32A(&nnz_cache[4+8* 0], top_empty);
523 AV_WN32A(&nnz_cache[4+8* 5], top_empty);
524 AV_WN32A(&nnz_cache[4+8*10], top_empty);
527 for (i=0; i<2; i++) {
528 if(left_type[
LEFT(i)]){
530 nnz_cache[3+8* 1 + 2*8*i]= nnz[left_block[8+0+2*i]];
531 nnz_cache[3+8* 2 + 2*8*i]= nnz[left_block[8+1+2*i]];
533 nnz_cache[3+8* 6 + 2*8*i]= nnz[left_block[8+0+2*i]+4*4];
534 nnz_cache[3+8* 7 + 2*8*i]= nnz[left_block[8+1+2*i]+4*4];
535 nnz_cache[3+8*11 + 2*8*i]= nnz[left_block[8+0+2*i]+8*4];
536 nnz_cache[3+8*12 + 2*8*i]= nnz[left_block[8+1+2*i]+8*4];
538 nnz_cache[3+8* 6 + 2*8*i]= nnz[left_block[8+0+2*i]-2+4*4];
539 nnz_cache[3+8* 7 + 2*8*i]= nnz[left_block[8+1+2*i]-2+4*4];
540 nnz_cache[3+8*11 + 2*8*i]= nnz[left_block[8+0+2*i]-2+8*4];
541 nnz_cache[3+8*12 + 2*8*i]= nnz[left_block[8+1+2*i]-2+8*4];
543 nnz_cache[3+8* 6 + 8*i]= nnz[left_block[8+4+2*i]];
544 nnz_cache[3+8*11 + 8*i]= nnz[left_block[8+5+2*i]];
547 nnz_cache[3+8* 1 + 2*8*i]=
548 nnz_cache[3+8* 2 + 2*8*i]=
549 nnz_cache[3+8* 6 + 2*8*i]=
550 nnz_cache[3+8* 7 + 2*8*i]=
551 nnz_cache[3+8*11 + 2*8*i]=
552 nnz_cache[3+8*12 + 2*8*i]=
CABAC && !
IS_INTRA(mb_type) ? 0 : 64;
564 if (left_type[
LTOP]) {
566 | ((h->
cbp_table[left_xy[LTOP]]>>(left_block[0]&(~1)))&2)
567 | (((h->
cbp_table[left_xy[
LBOT]]>>(left_block[2]&(~1)))&2) << 2);
588 const int b_xy= h->
mb2b_xy[top_xy] + 3*b_stride;
591 ref_cache[1 - 1*8]= ref[4*top_xy + 2];
593 ref_cache[3 - 1*8]= ref[4*top_xy + 3];
601 int cache_idx = -1 + i*2*8;
604 const int b8_xy= 4*left_xy[
LEFT(i)] + 1;
605 AV_COPY32(mv_cache[cache_idx ],
mv[b_xy + b_stride*left_block[0+i*2]]);
606 AV_COPY32(mv_cache[cache_idx+8],
mv[b_xy + b_stride*left_block[1+i*2]]);
607 ref_cache[cache_idx ]= ref[b8_xy + (left_block[0+i*2]&~1)];
608 ref_cache[cache_idx+8]= ref[b8_xy + (left_block[1+i*2]&~1)];
612 ref_cache[cache_idx ]=
619 const int b8_xy= 4*left_xy[
LTOP] + 1;
620 AV_COPY32(mv_cache[-1],
mv[b_xy + b_stride*left_block[0]]);
621 ref_cache[-1]= ref[b8_xy + (left_block[0]&~1)];
629 const int b_xy= h->
mb2b_xy[topright_xy] + 3*b_stride;
631 ref_cache[4 - 1*8]= ref[4*topright_xy + 2];
636 if(ref_cache[4 - 1*8] < 0){
641 ref_cache[-1 - 1*8]= ref[b8_xy];
661 const int b_xy= h->
mb2br_xy[top_xy];
662 AV_COPY64(mvd_cache[0 - 1*8], mvd[b_xy + 0]);
668 AV_COPY16(mvd_cache[-1 + 0*8], mvd[b_xy - left_block[0]]);
669 AV_COPY16(mvd_cache[-1 + 1*8], mvd[b_xy - left_block[1]]);
676 AV_COPY16(mvd_cache[-1 + 2*8], mvd[b_xy - left_block[2]]);
677 AV_COPY16(mvd_cache[-1 + 3*8], mvd[b_xy - left_block[3]]);
691 }
else if(
IS_8X8(top_type)){
692 int b8_xy = 4*top_xy;
693 direct_cache[0 - 1*8]= direct_table[b8_xy + 2];
694 direct_cache[2 - 1*8]= direct_table[b8_xy + 3];
701 else if(
IS_8X8(left_type[LTOP]))
702 direct_cache[-1 + 0*8]= direct_table[4*left_xy[
LTOP] + 1 + (left_block[0]&~1)];
708 else if(
IS_8X8(left_type[LBOT]))
709 direct_cache[-1 + 2*8]= direct_table[4*left_xy[LBOT] + 1 + (left_block[2]&~1)];
717 MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)\
718 MAP_F2F(scan8[0] + 0 - 1*8, top_type)\
719 MAP_F2F(scan8[0] + 1 - 1*8, top_type)\
720 MAP_F2F(scan8[0] + 2 - 1*8, top_type)\
721 MAP_F2F(scan8[0] + 3 - 1*8, top_type)\
722 MAP_F2F(scan8[0] + 4 - 1*8, topright_type)\
723 MAP_F2F(scan8[0] - 1 + 0*8, left_type[LTOP])\
724 MAP_F2F(scan8[0] - 1 + 1*8, left_type[LTOP])\
725 MAP_F2F(scan8[0] - 1 + 2*8, left_type[LBOT])\
726 MAP_F2F(scan8[0] - 1 + 3*8, left_type[LBOT])
728 #define MAP_F2F(idx, mb_type)\
729 if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
730 h->ref_cache[list][idx] <<= 1;\
731 h->mv_cache[list][idx][1] /= 2;\
732 h->mvd_cache[list][idx][1] >>=1;\
737 #define MAP_F2F(idx, mb_type)\
738 if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
739 h->ref_cache[list][idx] >>= 1;\
740 h->mv_cache[list][idx][1] <<= 1;\
741 h->mvd_cache[list][idx][1] <<= 1;\
758 const int mb_xy= h->
mb_xy;