Mercurial > libavcodec.hg
changeset 3458:9bb2734f65d7 libavcodec
simplify
author | michael |
---|---|
date | Sun, 09 Jul 2006 15:20:18 +0000 |
parents | ad66c11aeab4 |
children | 9ccc2eb20012 |
files | cavs.c cavsdata.h |
diffstat | 2 files changed, 58 insertions(+), 80 deletions(-) [+] |
line wrap: on
line diff
--- a/cavs.c Sun Jul 09 15:12:45 2006 +0000 +++ b/cavs.c Sun Jul 09 15:20:18 2006 +0000 @@ -104,26 +104,18 @@ * ****************************************************************************/ -static inline int get_bs_p(vector_t *mvP, vector_t *mvQ) { +static inline int get_bs(vector_t *mvP, vector_t *mvQ, int b) { if((mvP->ref == REF_INTRA) || (mvQ->ref == REF_INTRA)) return 2; - if(mvP->ref != mvQ->ref) - return 1; if( (abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4) ) return 1; - return 0; -} - -static inline int get_bs_b(vector_t *mvP, vector_t *mvQ) { - if((mvP->ref == REF_INTRA) || (mvQ->ref == REF_INTRA)) { - return 2; - } else { - vector_t *mvPbw = mvP + MV_BWD_OFFS; - vector_t *mvQbw = mvQ + MV_BWD_OFFS; - if( (abs( mvP->x - mvQ->x) >= 4) || - (abs( mvP->y - mvQ->y) >= 4) || - (abs(mvPbw->x - mvQbw->x) >= 4) || - (abs(mvPbw->y - mvQbw->y) >= 4) ) + if(b){ + mvP += MV_BWD_OFFS; + mvQ += MV_BWD_OFFS; + if( (abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4) ) + return 1; + }else{ + if(mvP->ref != mvQ->ref) return 1; } return 0; @@ -165,52 +157,23 @@ h->left_border_v[i+1] = *(h->cv + 7 + i*h->c_stride); } if(!h->loop_filter_disable) { - /* clear bs */ - *((uint64_t *)bs) = 0; /* determine bs */ - switch(mb_type) { - case I_8X8: + if(mb_type == I_8X8) *((uint64_t *)bs) = 0x0202020202020202ULL; - break; - case P_8X8: - case P_8X16: - bs[2] = get_bs_p(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1]); - bs[3] = get_bs_p(&h->mv[MV_FWD_X2], &h->mv[MV_FWD_X3]); - case P_16X8: - bs[6] = get_bs_p(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2]); - bs[7] = get_bs_p(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3]); - case P_16X16: - case P_SKIP: - bs[0] = get_bs_p(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0]); - bs[1] = get_bs_p(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2]); - bs[4] = get_bs_p(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0]); - bs[5] = get_bs_p(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1]); - break; - case B_SKIP: - case B_DIRECT: - case B_8X8: - bs[2] = get_bs_b(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1]); - bs[3] = get_bs_b(&h->mv[MV_FWD_X2], &h->mv[MV_FWD_X3]); - bs[6] = get_bs_b(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2]); - bs[7] = get_bs_b(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3]); - case B_FWD_16X16: - case B_BWD_16X16: - case B_SYM_16X16: - bs[0] = get_bs_b(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0]); - bs[1] = get_bs_b(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2]); - bs[4] = get_bs_b(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0]); - bs[5] = get_bs_b(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1]); - break; - default: - if(mb_type & 1) { //16X8 - bs[6] = bs[7] = get_bs_b(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2]); - } else { //8X16 - bs[2] = bs[3] = get_bs_b(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1]); + else{ + *((uint64_t *)bs) = 0; + if(partition_flags[mb_type] & SPLITV){ + bs[2] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1], mb_type > P_8X8); + bs[3] = get_bs(&h->mv[MV_FWD_X2], &h->mv[MV_FWD_X3], mb_type > P_8X8); } - bs[0] = get_bs_b(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0]); - bs[1] = get_bs_b(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2]); - bs[4] = get_bs_b(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0]); - bs[5] = get_bs_b(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1]); + if(partition_flags[mb_type] & SPLITH){ + bs[6] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2], mb_type > P_8X8); + bs[7] = get_bs(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3], mb_type > P_8X8); + } + bs[0] = get_bs(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0], mb_type > P_8X8); + bs[1] = get_bs(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2], mb_type > P_8X8); + bs[4] = get_bs(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0], mb_type > P_8X8); + bs[5] = get_bs(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1], mb_type > P_8X8); } if( *((uint64_t *)bs) ) { if(h->flags & A_AVAIL) { @@ -486,19 +449,13 @@ } static void inter_pred(AVSContext *h, enum mb_t mb_type) { - switch(mb_type) { - case P_SKIP: - case P_16X16: - case B_FWD_16X16: - case B_BWD_16X16: - case B_SYM_16X16: + if(partition_flags[mb_type] == 0){ // 16x16 mc_part_std(h, 1, 8, 0, h->cy, h->cu, h->cv, 0, 0, h->s.dsp.put_cavs_qpel_pixels_tab[0], h->s.dsp.put_h264_chroma_pixels_tab[0], h->s.dsp.avg_cavs_qpel_pixels_tab[0], h->s.dsp.avg_h264_chroma_pixels_tab[0],&h->mv[MV_FWD_X0]); - break; - default: + }else{ mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 0, 0, h->s.dsp.put_cavs_qpel_pixels_tab[1], h->s.dsp.put_h264_chroma_pixels_tab[1], @@ -519,7 +476,6 @@ h->s.dsp.put_h264_chroma_pixels_tab[1], h->s.dsp.avg_cavs_qpel_pixels_tab[1], h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X3]); - break; } /* set intra prediction modes to default values */ h->pred_mode_Y[3] = h->pred_mode_Y[6] = INTRA_L_LP; @@ -1102,7 +1058,7 @@ break; default: assert((mb_type > B_SYM_16X16) && (mb_type < B_8X8)); - flags = b_partition_flags[(mb_type-1)>>1]; + flags = partition_flags[mb_type]; if(mb_type & 1) { /* 16x8 macroblock types */ if(flags & FWD0) mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, 1);
--- a/cavsdata.h Sun Jul 09 15:12:45 2006 +0000 +++ b/cavsdata.h Sun Jul 09 15:20:18 2006 +0000 @@ -41,6 +41,8 @@ #define BWD1 0x08 #define SYM0 0x10 #define SYM1 0x20 +#define SPLITH 0x40 +#define SPLITV 0x80 #define MV_BWD_OFFS 12 #define MV_STRIDE 4 @@ -127,17 +129,37 @@ MV_BWD_X3 }; -static const uint8_t b_partition_flags[14] = { - 0,0,0,0,0, - FWD0|FWD1, - BWD0|BWD1, - FWD0|BWD1, - BWD0|FWD1, - FWD0|SYM1, - BWD0|SYM1, - SYM0|FWD1, - SYM0|BWD1, - SYM0|SYM1 +static const uint8_t partition_flags[30] = { + 0, //I_8X8 + 0, //P_SKIP + 0, //P_16X16 + SPLITH, //P_16X8 + SPLITV,//P_8X16 + SPLITH|SPLITV,//P_8X8 + SPLITH|SPLITV,//B_SKIP + SPLITH|SPLITV,//B_DIRECT + 0, //B_FWD_16X16 + 0, //B_BWD_16X16 + 0, //B_SYM_16X16 + FWD0|FWD1|SPLITH, + FWD0|FWD1 |SPLITV, + BWD0|BWD1|SPLITH, + BWD0|BWD1 |SPLITV, + FWD0|BWD1|SPLITH, + FWD0|BWD1 |SPLITV, + BWD0|FWD1|SPLITH, + BWD0|FWD1 |SPLITV, + FWD0|SYM1|SPLITH, + FWD0|SYM1 |SPLITV, + BWD0|SYM1|SPLITH, + BWD0|SYM1 |SPLITV, + SYM0|FWD1|SPLITH, + SYM0|FWD1 |SPLITV, + SYM0|BWD1|SPLITH, + SYM0|BWD1 |SPLITV, + SYM0|SYM1|SPLITH, + SYM0|SYM1 |SPLITV, + SPLITH|SPLITV,//B_8X8 = 29 }; static const uint8_t scan3x3[4] = {4,5,7,8};