@@ -2,6 +2,7 @@ use super::def::*;
22use super :: picman:: * ;
33use super :: plane:: * ;
44use super :: region:: * ;
5+ use super :: tbl:: * ;
56use super :: util:: * ;
67use crate :: api:: frame:: Aligned ;
78
@@ -547,3 +548,173 @@ pub(crate) fn evc_mc(
547548 }
548549 }
549550}
551+
552+ pub ( crate ) fn evc_mc2 (
553+ x : i16 ,
554+ y : i16 ,
555+ pic_w : i16 ,
556+ pic_h : i16 ,
557+ cuw : i16 ,
558+ cuh : i16 ,
559+ refi : & [ i8 ] ,
560+ mv : & [ [ i16 ; MV_D ] ; REFP_NUM ] ,
561+ refp : & Vec < Vec < EvcRefP > > ,
562+ pred0 : & mut [ pel ] ,
563+ pred1 : & mut [ pel ] ,
564+ ) {
565+ let mut bidx = 0 ;
566+ let mut mv_t = [ [ 0i16 ; MV_D ] ; REFP_NUM ] ;
567+
568+ //store it to pass it to interpolation function for deriving correct interpolation filter
569+ let mv_before_clipping = [
570+ [ mv[ REFP_0 ] [ MV_X ] , mv[ REFP_0 ] [ MV_Y ] ] ,
571+ [ mv[ REFP_1 ] [ MV_X ] , mv[ REFP_1 ] [ MV_Y ] ] ,
572+ ] ;
573+
574+ mv_clip ( x, y, pic_w, pic_h, cuw, cuh, refi, mv, & mut mv_t) ;
575+
576+ if REFI_IS_VALID ( refi[ REFP_0 ] ) {
577+ /* forward */
578+ if let Some ( ref_pic) = & refp[ refi[ REFP_0 ] as usize ] [ REFP_0 ] . pic {
579+ let qpel_gmv_x = ( x << 2 ) + mv_t[ REFP_0 ] [ MV_X ] ;
580+ let qpel_gmv_y = ( y << 2 ) + mv_t[ REFP_0 ] [ MV_Y ] ;
581+ let pic = ref_pic. borrow ( ) ;
582+ let planes = & pic. frame . borrow ( ) . planes ;
583+
584+ evc_mc_l (
585+ mv_before_clipping[ REFP_0 ] [ MV_X ] ,
586+ mv_before_clipping[ REFP_0 ] [ MV_Y ] ,
587+ & planes[ Y_C ] ,
588+ qpel_gmv_x,
589+ qpel_gmv_y,
590+ & mut pred0[ tbl_cu_dim_offset[ Y_C ] ..] ,
591+ cuw,
592+ cuh,
593+ ) ;
594+ evc_mc_c (
595+ mv_before_clipping[ REFP_0 ] [ MV_X ] ,
596+ mv_before_clipping[ REFP_0 ] [ MV_Y ] ,
597+ & planes[ U_C ] ,
598+ qpel_gmv_x,
599+ qpel_gmv_y,
600+ & mut pred0[ tbl_cu_dim_offset[ U_C ] ..] ,
601+ cuw >> 1 ,
602+ cuh >> 1 ,
603+ ) ;
604+ evc_mc_c (
605+ mv_before_clipping[ REFP_0 ] [ MV_X ] ,
606+ mv_before_clipping[ REFP_0 ] [ MV_Y ] ,
607+ & planes[ V_C ] ,
608+ qpel_gmv_x,
609+ qpel_gmv_y,
610+ & mut pred0[ tbl_cu_dim_offset[ V_C ] ..] ,
611+ cuw >> 1 ,
612+ cuh >> 1 ,
613+ ) ;
614+
615+ bidx += 1 ;
616+ }
617+ }
618+
619+ /* check identical motion */
620+ if REFI_IS_VALID ( refi[ REFP_0 ] ) && REFI_IS_VALID ( refi[ REFP_1 ] ) {
621+ if let ( Some ( pic0) , Some ( pic1) ) = (
622+ & refp[ refi[ REFP_0 ] as usize ] [ REFP_0 ] . pic ,
623+ & refp[ refi[ REFP_1 ] as usize ] [ REFP_1 ] . pic ,
624+ ) {
625+ if pic0. borrow ( ) . poc == pic1. borrow ( ) . poc
626+ && mv_t[ REFP_0 ] [ MV_X ] == mv_t[ REFP_1 ] [ MV_X ]
627+ && mv_t[ REFP_0 ] [ MV_Y ] == mv_t[ REFP_1 ] [ MV_Y ]
628+ {
629+ return ;
630+ }
631+ }
632+ }
633+
634+ if REFI_IS_VALID ( refi[ REFP_1 ] ) {
635+ /* backward */
636+ if let Some ( ref_pic) = & refp[ refi[ REFP_1 ] as usize ] [ REFP_1 ] . pic {
637+ let qpel_gmv_x = ( x << 2 ) + mv_t[ REFP_1 ] [ MV_X ] ;
638+ let qpel_gmv_y = ( y << 2 ) + mv_t[ REFP_1 ] [ MV_Y ] ;
639+ let pic = ref_pic. borrow ( ) ;
640+ let planes = & pic. frame . borrow ( ) . planes ;
641+
642+ evc_mc_l (
643+ mv_before_clipping[ REFP_1 ] [ MV_X ] ,
644+ mv_before_clipping[ REFP_1 ] [ MV_Y ] ,
645+ & planes[ Y_C ] ,
646+ qpel_gmv_x,
647+ qpel_gmv_y,
648+ if bidx == 0 {
649+ & mut pred0[ tbl_cu_dim_offset[ Y_C ] ..]
650+ } else {
651+ & mut pred1[ tbl_cu_dim_offset[ Y_C ] ..]
652+ } ,
653+ cuw,
654+ cuh,
655+ ) ;
656+ evc_mc_c (
657+ mv_before_clipping[ REFP_1 ] [ MV_X ] ,
658+ mv_before_clipping[ REFP_1 ] [ MV_Y ] ,
659+ & planes[ U_C ] ,
660+ qpel_gmv_x,
661+ qpel_gmv_y,
662+ if bidx == 0 {
663+ & mut pred0[ tbl_cu_dim_offset[ U_C ] ..]
664+ } else {
665+ & mut pred1[ tbl_cu_dim_offset[ U_C ] ..]
666+ } ,
667+ cuw >> 1 ,
668+ cuh >> 1 ,
669+ ) ;
670+ evc_mc_c (
671+ mv_before_clipping[ REFP_1 ] [ MV_X ] ,
672+ mv_before_clipping[ REFP_1 ] [ MV_Y ] ,
673+ & planes[ V_C ] ,
674+ qpel_gmv_x,
675+ qpel_gmv_y,
676+ if bidx == 0 {
677+ & mut pred0[ tbl_cu_dim_offset[ V_C ] ..]
678+ } else {
679+ & mut pred1[ tbl_cu_dim_offset[ V_C ] ..]
680+ } ,
681+ cuw >> 1 ,
682+ cuh >> 1 ,
683+ ) ;
684+
685+ bidx += 1 ;
686+ }
687+ }
688+
689+ if bidx == 2 {
690+ let mut p0 = & mut pred0[ tbl_cu_dim_offset[ Y_C ] ..] ;
691+ let mut p1 = & pred1[ tbl_cu_dim_offset[ Y_C ] ..] ;
692+ for _ in 0 ..cuh {
693+ for x in 0 ..cuw as usize {
694+ p0[ x] = ( p0[ x] + p1[ x] + 1 ) >> 1 ;
695+ }
696+ p0 = & mut p0[ cuw as usize ..] ;
697+ p1 = & p1[ cuw as usize ..] ;
698+ }
699+
700+ let mut p0 = & mut pred0[ tbl_cu_dim_offset[ U_C ] ..] ;
701+ let mut p1 = & pred1[ tbl_cu_dim_offset[ U_C ] ..] ;
702+ for _ in 0 ..cuh >> 1 {
703+ for x in 0 ..cuw as usize >> 1 {
704+ p0[ x] = ( p0[ x] + p1[ x] + 1 ) >> 1 ;
705+ }
706+ p0 = & mut p0[ cuw as usize >> 1 ..] ;
707+ p1 = & p1[ cuw as usize >> 1 ..] ;
708+ }
709+
710+ let mut p0 = & mut pred0[ tbl_cu_dim_offset[ V_C ] ..] ;
711+ let mut p1 = & pred1[ tbl_cu_dim_offset[ V_C ] ..] ;
712+ for _ in 0 ..cuh >> 1 {
713+ for x in 0 ..cuw as usize >> 1 {
714+ p0[ x] = ( p0[ x] + p1[ x] + 1 ) >> 1 ;
715+ }
716+ p0 = & mut p0[ cuw as usize >> 1 ..] ;
717+ p1 = & p1[ cuw as usize >> 1 ..] ;
718+ }
719+ }
720+ }
0 commit comments