123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594 |
- #include "global.h"
- #include "image.h"
- #include "mb_access.h"
- #include "loopfilter.h"
- void GetStrengthNormal_Vert(byte Strength[MB_BLOCK_SIZE], Macroblock *MbQ, int edge, int mvlimit, StorablePicture *p)
- {
- // dir == 0
- PixelPos pixP, pixMB;
- byte StrValue;
- Macroblock *MbP;
- if ((p->slice_type==SP_SLICE)||(p->slice_type==SI_SLICE) )
- {
- // Set strength to either 3 or 4 regardless of pixel position
- StrValue = (edge == 0) ? 4 : 3;
- memset(&Strength[0], (byte) StrValue, MB_BLOCK_SIZE * sizeof(byte));
- }
- else
- {
- VideoParameters *p_Vid = MbQ->p_Vid;
- int xQ = edge - 1;
- int yQ = 0;
- p_Vid->getNeighbourX0(MbQ, xQ, p_Vid->mb_size[IS_LUMA], &pixMB);
- pixP = pixMB;
- MbP = &(p_Vid->mb_data[pixP.mb_addr]);
- if (!(MbP->mb_type==I4MB||MbP->mb_type==I8MB||MbP->mb_type==I16MB||MbP->mb_type==IPCM||MbQ->mb_type==I4MB||MbQ->mb_type==I8MB||MbQ->mb_type==I16MB||MbQ->mb_type==IPCM))
- {
- PicMotionParams *motion = &p->motion;
- h264_ref_t ref_p0,ref_p1,ref_q0,ref_q1;
- int blkP, blkQ, idx;
- int blk_x, blk_x2, blk_y, blk_y2 ;
- PicMotion **motion0 = motion->motion[LIST_0];
- PicMotion **motion1 = motion->motion[LIST_1];
- short mb_x, mb_y;
- p_Vid->get_mb_block_pos (p_Vid->PicPos, MbQ->mbAddrX, &mb_x, &mb_y);
- mb_x <<= 2;
- mb_y <<= 2;
- xQ ++;
- for( idx = 0 ; idx < MB_BLOCK_SIZE ; idx += BLOCK_SIZE )
- {
- yQ = idx;
- blkQ = (yQ & 0xFFFC) + (xQ >> 2);
- blkP = (idx & 0xFFFC) + (pixP.x >> 2);
- if( ((MbQ->cbp_blk[0] & ((int64)1 << blkQ )) != 0) || ((MbP->cbp_blk[0] & ((int64)1 << blkP)) != 0) )
- StrValue = 2;
- else
- {
- // if no coefs, but vector difference >= 1 set Strength=1
- // if this is a mixed mode edge then one set of reference pictures will be frame and the
- // other will be field
- PicMotion *motion_p0, *motion_q0, *motion_p1, *motion_q1;
- blk_y = mb_y + (blkQ >> 2);
- blk_x = mb_x + (blkQ & 3);
- blk_y2 = (pixMB.pos_y + idx) >> 2;
- blk_x2 = pixMB.pos_x >> 2;
- motion_p0=&motion0[blk_y ][blk_x ];
- motion_q0=&motion0[blk_y2][blk_x2];
- motion_p1=&motion1[blk_y ][blk_x ];
- motion_q1=&motion1[blk_y2][blk_x2];
- ref_p0 = motion_p0->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_p0->ref_pic_id;
- ref_q0 = motion_q0->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_q0->ref_pic_id;
- ref_p1 = motion_p1->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_p1->ref_pic_id;
- ref_q1 = motion_q1->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_q1->ref_pic_id;
- if ( ((ref_p0==ref_q0) && (ref_p1==ref_q1)) || ((ref_p0==ref_q1) && (ref_p1==ref_q0)))
- {
- // L0 and L1 reference pictures of p0 are different; q0 as well
- if (ref_p0 != ref_p1)
- {
- // compare MV for the same reference picture
- if (ref_p0 == ref_q0)
- {
- if (ref_p0 == UNDEFINED_REFERENCE)
- {
- StrValue = (byte) (
- (abs( motion_p1->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q1->mv[1]) >= mvlimit));
- }
- else if (ref_p1 == UNDEFINED_REFERENCE)
- {
- StrValue = (byte) (
- (abs( motion_p0->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q0->mv[1]) >= mvlimit));
- }
- else
- {
- StrValue = (byte) (
- (abs( motion_p0->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q0->mv[1]) >= mvlimit) ||
- (abs( motion_p1->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q1->mv[1]) >= mvlimit));
- }
- }
- else
- {
- StrValue = (byte) (
- (abs( motion_p0->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q1->mv[1]) >= mvlimit) ||
- (abs( motion_p1->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q0->mv[1]) >= mvlimit));
- }
- }
- else
- { // L0 and L1 reference pictures of p0 are the same; q0 as well
- StrValue = (byte) (
- ((abs( motion_p0->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q0->mv[1]) >= mvlimit ) ||
- (abs( motion_p1->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q1->mv[1]) >= mvlimit))
- &&
- ((abs( motion_p0->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q1->mv[1]) >= mvlimit) ||
- (abs( motion_p1->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q0->mv[1]) >= mvlimit)));
- }
- }
- else
- {
- StrValue = 1;
- }
- }
- memset(&Strength[idx], (byte) StrValue, BLOCK_SIZE * sizeof(byte));
- }
- }
- else
- {
- // Start with Strength=3. or Strength=4 for Mb-edge
- StrValue = (edge == 0) ? 4 : 3;
- memset(&Strength[0], (byte) StrValue, MB_BLOCK_SIZE * sizeof(byte));
- }
- }
- }
- void GetStrength_Vert_YUV420(uint8_t Strength[4], Macroblock *MbQ, int edge, int mvlimit, StorablePicture *p, PixelPos pixMB, Macroblock *MbP)
- {
- // dir == 0
- int i;
- uint8_t StrValue;
- if ((p->slice_type==SP_SLICE)||(p->slice_type==SI_SLICE) )
- {
- // Set strength to either 3 or 4 regardless of pixel position
- StrValue = (edge == 0) ? 4 : 3;
- for (i=0;i<4;i++)
- {
- Strength[i]=StrValue;
- }
- }
- else
- {
- VideoParameters *p_Vid = MbQ->p_Vid;
- if (!(MbP->mb_type==I4MB||MbP->mb_type==I8MB||MbP->mb_type==I16MB||MbP->mb_type==IPCM||MbQ->mb_type==I4MB||MbQ->mb_type==I8MB||MbQ->mb_type==I16MB||MbQ->mb_type==IPCM))
- {
- PicMotionParams *motion = &p->motion;
- h264_ref_t ref_p0,ref_p1,ref_q0,ref_q1;
- int blkP, blkQ, idx;
- int blk_x2, blk_y, blk_y2 ;
- PicMotion **motion0 = motion->motion[LIST_0];
- PicMotion **motion1 = motion->motion[LIST_1];
- short mb_x, mb_y;
- const int cbp_p=(int)MbP->cbp_blk[0], cbp_q=(int)MbQ->cbp_blk[0];
- get_mb_block_pos_normal(p_Vid->PicPos, MbQ->mbAddrX, &mb_x, &mb_y);
- mb_x <<= 2;
- mb_y <<= 2;
- mb_x += edge;
- blkQ = edge;
- blkP = pixMB.x >> 2;
- blk_x2 = pixMB.pos_x >> 2;
- for( idx = 0 ; idx < BLOCK_SIZE ; idx++,blkQ+=BLOCK_SIZE, blkP+=BLOCK_SIZE)
- {
- if (_bittest(&cbp_p, blkP) || _bittest(&cbp_q, blkQ))
- StrValue = 2;
- else
- {
- // if no coefs, but vector difference >= 1 set Strength=1
- // if this is a mixed mode edge then one set of reference pictures will be frame and the
- // other will be field
- PicMotion *motion_p0, *motion_q0, *motion_p1, *motion_q1;
- blk_y = mb_y + idx;
- blk_y2 = (pixMB.pos_y >> 2) + idx;
- motion_p0=&motion0[blk_y ][mb_x ];
- motion_q0=&motion0[blk_y2][blk_x2];
- motion_p1=&motion1[blk_y ][mb_x ];
- motion_q1=&motion1[blk_y2][blk_x2];
- ref_p0 = motion_p0->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_p0->ref_pic_id;
- ref_q0 = motion_q0->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_q0->ref_pic_id;
- ref_p1 = motion_p1->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_p1->ref_pic_id;
- ref_q1 = motion_q1->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_q1->ref_pic_id;
- if ( ((ref_p0==ref_q0) && (ref_p1==ref_q1)) || ((ref_p0==ref_q1) && (ref_p1==ref_q0)))
- {
- // L0 and L1 reference pictures of p0 are different; q0 as well
- if (ref_p0 != ref_p1)
- {
- // compare MV for the same reference picture
- if (ref_p0 == ref_q0)
- {
- if (ref_p0 == UNDEFINED_REFERENCE)
- {
- StrValue = (byte) (
- (abs( motion_p1->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q1->mv[1]) >= mvlimit));
- }
- else if (ref_p1 == UNDEFINED_REFERENCE)
- {
- StrValue = (byte) (
- (abs( motion_p0->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q0->mv[1]) >= mvlimit));
- }
- else
- {
- StrValue = (byte) (
- (abs( motion_p0->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q0->mv[1]) >= mvlimit) ||
- (abs( motion_p1->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q1->mv[1]) >= mvlimit));
- }
- }
- else
- {
- StrValue = (byte) (
- (abs( motion_p0->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q1->mv[1]) >= mvlimit) ||
- (abs( motion_p1->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q0->mv[1]) >= mvlimit));
- }
- }
- else
- { // L0 and L1 reference pictures of p0 are the same; q0 as well
- StrValue = (byte) (
- ((abs( motion_p0->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q0->mv[1]) >= mvlimit ) ||
- (abs( motion_p1->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q1->mv[1]) >= mvlimit))
- &&
- ((abs( motion_p0->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q1->mv[1]) >= mvlimit) ||
- (abs( motion_p1->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q0->mv[1]) >= mvlimit)));
- }
- }
- else
- {
- StrValue = 1;
- }
- }
- Strength[idx] = StrValue;
- }
- }
- else
- {
- // Start with Strength=3. or Strength=4 for Mb-edge
- StrValue = (edge == 0) ? 4 : 3;
- for (i=0;i<4;i++)
- {
- Strength[i]=StrValue;
- }
- }
- }
- }
- // assumes YUV420, MB Aff
- void GetStrength_MBAff_Vert_YUV420(byte Strength[16], Macroblock *MbQ, int edge, int mvlimit, StorablePicture *p)
- {
- // dir == 0
- if ((p->slice_type==SP_SLICE)||(p->slice_type==SI_SLICE)
- || (MbQ->mb_type==I4MB || MbQ->mb_type==I16MB || MbQ->mb_type==I8MB || MbQ->mb_type==IPCM))
- {
- memset(Strength,(edge == 0) ? 4 : 3, 16);
- }
- else
- {
- short blkP, blkQ, idx;
- short blk_x, blk_x2, blk_y, blk_y2 ;
- h264_ref_t ref_p0,ref_p1,ref_q0,ref_q1;
- int xQ, yQ;
- short mb_x, mb_y;
- Macroblock *MbP;
- PixelPos pixP;
- PicMotionParams *motion = &p->motion;
- PicMotion **motion0 = motion->motion[LIST_0];
- PicMotion **motion1 = motion->motion[LIST_1];
- xQ = edge;
- for( idx = 0; idx < 16; ++idx )
- {
- VideoParameters *p_Vid = MbQ->p_Vid;
- yQ = idx;
- getAffNeighbourXPLuma(MbQ, xQ - 1, yQ, &pixP);
- blkQ = (short) ((yQ & 0xC) + (xQ >> 2)); // blkQ changes once every 4 loop iterations
- blkP = (short) ((pixP.y & 0xFFFC) + (pixP.x >> 2));
- MbP = &(p_Vid->mb_data[pixP.mb_addr]);
- p_Vid->mixedModeEdgeFlag = (byte) (MbQ->mb_field != MbP->mb_field);
- // Start with Strength=3. or Strength=4 for Mb-edge
- Strength[idx] = (edge == 0) ? 4 : 3;
- if( !(MbP->mb_type==I4MB || MbP->mb_type==I16MB || MbP->mb_type==I8MB || MbP->mb_type==IPCM))
- {
- if( ((MbQ->cbp_blk[0] & ((int64)1 << blkQ )) != 0) || ((MbP->cbp_blk[0] & ((int64)1 << blkP)) != 0) )
- Strength[idx] = 2 ;
- else
- {
- // if no coefs, but vector difference >= 1 set Strength=1
- // if this is a mixed mode edge then one set of reference pictures will be frame and the
- // other will be field
- if (p_Vid->mixedModeEdgeFlag)
- {
- (Strength[idx] = 1);
- }
- else
- {
- get_mb_block_pos_mbaff(p_Vid->PicPos, MbQ->mbAddrX, &mb_x, &mb_y);
- blk_y = (short) ((mb_y<<2) + (blkQ >> 2));
- blk_x = (short) ((mb_x<<2) + (blkQ & 3));
- blk_y2 = (short) (pixP.pos_y >> 2);
- blk_x2 = (short) (pixP.pos_x >> 2);
- {
- PicMotion *motion_p0, *motion_q0, *motion_p1, *motion_q1;
- motion_p0=&motion0[blk_y ][blk_x ];
- motion_q0=&motion0[blk_y2][blk_x2];
- motion_p1=&motion1[blk_y ][blk_x ];
- motion_q1=&motion1[blk_y2][blk_x2];
- ref_p0 = motion_p0->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_p0->ref_pic_id;
- ref_q0 = motion_q0->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_q0->ref_pic_id;
- ref_p1 = motion_p1->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_p1->ref_pic_id;
- ref_q1 = motion_q1->ref_idx < 0 ? UNDEFINED_REFERENCE : motion_q1->ref_pic_id;
- if ( ((ref_p0==ref_q0) && (ref_p1==ref_q1)) ||
- ((ref_p0==ref_q1) && (ref_p1==ref_q0)))
- {
- Strength[idx]=0;
- // L0 and L1 reference pictures of p0 are different; q0 as well
- if (ref_p0 != ref_p1)
- {
- // compare MV for the same reference picture
- if (ref_p0==ref_q0)
- {
- Strength[idx] = (byte) (
- (abs( motion_p0->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q0->mv[1]) >= mvlimit) ||
- (abs( motion_p1->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q1->mv[1]) >= mvlimit));
- }
- else
- {
- Strength[idx] = (byte) (
- (abs( motion_p0->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q1->mv[1]) >= mvlimit) ||
- (abs( motion_p1->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q0->mv[1]) >= mvlimit));
- }
- }
- else
- { // L0 and L1 reference pictures of p0 are the same; q0 as well
- Strength[idx] = (byte) (
- ((abs( motion_p0->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q0->mv[1]) >= mvlimit ) ||
- (abs( motion_p1->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q1->mv[1]) >= mvlimit))
- &&
- ((abs( motion_p0->mv[0] - motion_q1->mv[0]) >= 4) ||
- (abs( motion_p0->mv[1] - motion_q1->mv[1]) >= mvlimit) ||
- (abs( motion_p1->mv[0] - motion_q0->mv[0]) >= 4) ||
- (abs( motion_p1->mv[1] - motion_q0->mv[1]) >= mvlimit)));
- }
- }
- else
- {
- Strength[idx] = 1;
- }
- }
- }
- }
- }
- }
- }
- }
- static __forceinline uint8_t GetMotionStrength(PicMotion *motion0, PicMotion *motion1, int mvlimit)
- {
- uint8_t StrValue;
- h264_ref_t ref_p0,ref_p1,ref_q0,ref_q1;
- ref_p0 = motion0[0].ref_idx < 0 ? UNDEFINED_REFERENCE : motion0[0].ref_pic_id;
- ref_p1 = motion1[0].ref_idx < 0 ? UNDEFINED_REFERENCE : motion1[0].ref_pic_id;
- ref_q0 = motion0[1].ref_idx < 0 ? UNDEFINED_REFERENCE : motion0[1].ref_pic_id;
- ref_q1 = motion1[1].ref_idx < 0 ? UNDEFINED_REFERENCE : motion1[1].ref_pic_id;
- if (ref_p0==ref_q0 && ref_p1==ref_q1)
- {
- if (ref_p0 != ref_p1)
- {
- // compare MV for the same reference picture
- if (ref_p0 == UNDEFINED_REFERENCE)
- {
- StrValue = (byte) (
- (abs( motion1[0].mv[0] - motion1[1].mv[0]) >= 4) ||
- (abs( motion1[0].mv[1] - motion1[1].mv[1]) >= mvlimit));
- }
- else if (ref_p1 == UNDEFINED_REFERENCE)
- {
- StrValue = (byte) (
- (abs( motion0[0].mv[0] - motion0[1].mv[0]) >= 4) ||
- (abs( motion0[0].mv[1] - motion0[1].mv[1]) >= mvlimit));
- }
- else
- {
- StrValue = (byte) (
- (abs( motion0[0].mv[0] - motion0[1].mv[0]) >= 4) ||
- (abs( motion0[0].mv[1] - motion0[1].mv[1]) >= mvlimit) ||
- (abs( motion1[0].mv[0] - motion1[1].mv[0]) >= 4) ||
- (abs( motion1[0].mv[1] - motion1[1].mv[1]) >= mvlimit));
- }
- }
- else
- { // L0 and L1 reference pictures of p0 are the same; q0 as well
- StrValue = (byte) (
- ((abs( motion0[0].mv[0] - motion0[1].mv[0]) >= 4) ||
- (abs( motion0[0].mv[1] - motion0[1].mv[1]) >= mvlimit ) ||
- (abs( motion1[0].mv[0] - motion1[1].mv[0]) >= 4) ||
- (abs( motion1[0].mv[1] - motion1[1].mv[1]) >= mvlimit))
- &&
- ((abs( motion0[0].mv[0] - motion1[1].mv[0]) >= 4) ||
- (abs( motion0[0].mv[1] - motion1[1].mv[1]) >= mvlimit) ||
- (abs( motion1[0].mv[0] - motion0[1].mv[0]) >= 4) ||
- (abs( motion1[0].mv[1] - motion0[1].mv[1]) >= mvlimit)));
- }
- }
- else if (ref_p0==ref_q1 && ref_p1==ref_q0)
- {
- StrValue = (byte) (
- (abs( motion0[0].mv[0] - motion1[1].mv[0]) >= 4) ||
- (abs( motion0[0].mv[1] - motion1[1].mv[1]) >= mvlimit) ||
- (abs( motion1[0].mv[0] - motion0[1].mv[0]) >= 4) ||
- (abs( motion1[0].mv[1] - motion0[1].mv[1]) >= mvlimit));
- }
- else
- {
- StrValue = 1;
- }
- return StrValue;
- }
- void GetStrength_Vert_YUV420_All(uint8_t Strength[4][4], Macroblock *MbQ, int mvlimit, StorablePicture *p, int pos_x, int pos_y, Macroblock *MbP, int luma_transform_size_8x8_flag)
- {
- // dir == 0
- if ((p->slice_type>=SP_SLICE) //(p->slice_type==SP_SLICE)||(p->slice_type==SI_SLICE) )
- || ((1 << MbQ->mb_type) & 26112))
- {
- // Set strength to either 3 or 4 regardless of pixel position
- *(int32_t *)(Strength[0]) = MbP?0x04040404:0;
- *(int32_t *)(Strength[1]) = luma_transform_size_8x8_flag?0:0x03030303;
- *(int32_t *)(Strength[2]) = 0x03030303;
- *(int32_t *)(Strength[3]) = luma_transform_size_8x8_flag?0:0x03030303;
- }
- else
- {
- PicMotionParams *motion = &p->motion;
- int motion_stride = p->size_x >> 2;
- PicMotion *motion0 = &motion->motion[LIST_0][pos_y][pos_x];
- PicMotion *motion1 = &motion->motion[LIST_1][pos_y][pos_x];
- int cbp_q=(int)MbQ->cbp_blk[0];
- // edge 0
- if (!MbP)
- {
- *(int32_t *)(Strength[0]) = 0;
- }
- else if ((1 << MbP->mb_type) & 26112)
- {
- *(int32_t *)(Strength[0]) = 0x04040404;
- }
- else
- {
- int cbp_p = (int)MbP->cbp_blk[0];
- if( ((cbp_q & (1 << 0 )) != 0) || ((cbp_p & (1 << (3))) != 0) )
- Strength[0][0] = 2;
- else
- Strength[0][0] = GetMotionStrength(&motion0[0-1], &motion1[0-1], mvlimit);
- if( ((cbp_q & (1 << 4 )) != 0) || ((cbp_p & (1 << (4 + 3))) != 0) )
- Strength[0][1] = 2;
- else
- Strength[0][1] = GetMotionStrength(&motion0[motion_stride-1], &motion1[motion_stride-1], mvlimit);
- if( ((cbp_q & (1 << 8 )) != 0) || ((cbp_p & (1 << (8 + 3))) != 0) )
- Strength[0][2] = 2;
- else
- Strength[0][2] = GetMotionStrength(&motion0[2*motion_stride-1], &motion1[2*motion_stride-1], mvlimit);
- if( ((cbp_q & (1 << 12 )) != 0) || ((cbp_p & (1 << (12 + 3))) != 0) )
- Strength[0][3] = 2;
- else
- Strength[0][3] = GetMotionStrength(&motion0[3*motion_stride-1], &motion1[3*motion_stride-1], mvlimit);
- }
- // edge 1
- if (luma_transform_size_8x8_flag)
- {
- *(int32_t *)(Strength[1]) = 0;
- }
- else
- {
- if (cbp_q & (3 << 0))
- Strength[1][0] = 2;
- else
- Strength[1][0] = GetMotionStrength(&motion0[0], &motion1[0], mvlimit);
- if (cbp_q & (3 << 4))
- Strength[1][1] = 2;
- else
- Strength[1][1] = GetMotionStrength(&motion0[1*motion_stride], &motion1[1*motion_stride], mvlimit);
- if (cbp_q & (3 << 8))
- Strength[1][2] = 2;
- else
- Strength[1][2] = GetMotionStrength(&motion0[2*motion_stride], &motion1[2*motion_stride], mvlimit);
- if (cbp_q & (3 << 12))
- Strength[1][3] = 2;
- else
- Strength[1][3] = GetMotionStrength(&motion0[3*motion_stride], &motion1[3*motion_stride], mvlimit);
- }
- // edge 2
- if (cbp_q & (6 << 0))
- Strength[2][0] = 2;
- else
- Strength[2][0] = GetMotionStrength(&motion0[1], &motion1[1], mvlimit);
- if (cbp_q & (6 << 4))
- Strength[2][1] = 2;
- else
- Strength[2][1] = GetMotionStrength(&motion0[motion_stride+1], &motion1[motion_stride+1], mvlimit);
- if (cbp_q & (6 << 8))
- Strength[2][2] = 2;
- else
- Strength[2][2] = GetMotionStrength(&motion0[2*motion_stride+1], &motion1[2*motion_stride+1], mvlimit);
- if (cbp_q & (6 << 12))
- Strength[2][3] = 2;
- else
- Strength[2][3] = GetMotionStrength(&motion0[3*motion_stride+1], &motion1[3*motion_stride+1], mvlimit);
- // edge 3
- if (luma_transform_size_8x8_flag)
- {
- *(int32_t *)(Strength[3]) = 0;
- }
- else
- {
- if (cbp_q & (0xC << 0))
- Strength[3][0] = 2;
- else
- Strength[3][0] = GetMotionStrength(&motion0[2], &motion1[2], mvlimit);
- if (cbp_q & (0xC << 4))
- Strength[3][1] = 2;
- else
- Strength[3][1] = GetMotionStrength(&motion0[motion_stride+2], &motion1[motion_stride+2], mvlimit);
- if (cbp_q & (0xC << 8))
- Strength[3][2] = 2;
- else
- Strength[3][2] = GetMotionStrength(&motion0[2*motion_stride+2], &motion1[2*motion_stride+2], mvlimit);
- if (cbp_q & (0xC << 12))
- Strength[3][3] = 2;
- else
- Strength[3][3] = GetMotionStrength(&motion0[3*motion_stride+2], &motion1[3*motion_stride+2], mvlimit);
- }
- }
- }
|