Mercurial > libavcodec.hg
comparison cavs.c @ 3458:9bb2734f65d7 libavcodec
simplify
author | michael |
---|---|
date | Sun, 09 Jul 2006 15:20:18 +0000 |
parents | b8faae2c5d0c |
children | 9ccc2eb20012 |
comparison
equal
deleted
inserted
replaced
3457:ad66c11aeab4 | 3458:9bb2734f65d7 |
---|---|
102 * | 102 * |
103 * in-loop deblocking filter | 103 * in-loop deblocking filter |
104 * | 104 * |
105 ****************************************************************************/ | 105 ****************************************************************************/ |
106 | 106 |
107 static inline int get_bs_p(vector_t *mvP, vector_t *mvQ) { | 107 static inline int get_bs(vector_t *mvP, vector_t *mvQ, int b) { |
108 if((mvP->ref == REF_INTRA) || (mvQ->ref == REF_INTRA)) | 108 if((mvP->ref == REF_INTRA) || (mvQ->ref == REF_INTRA)) |
109 return 2; | 109 return 2; |
110 if(mvP->ref != mvQ->ref) | |
111 return 1; | |
112 if( (abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4) ) | 110 if( (abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4) ) |
113 return 1; | 111 return 1; |
114 return 0; | 112 if(b){ |
115 } | 113 mvP += MV_BWD_OFFS; |
116 | 114 mvQ += MV_BWD_OFFS; |
117 static inline int get_bs_b(vector_t *mvP, vector_t *mvQ) { | 115 if( (abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4) ) |
118 if((mvP->ref == REF_INTRA) || (mvQ->ref == REF_INTRA)) { | 116 return 1; |
119 return 2; | 117 }else{ |
120 } else { | 118 if(mvP->ref != mvQ->ref) |
121 vector_t *mvPbw = mvP + MV_BWD_OFFS; | |
122 vector_t *mvQbw = mvQ + MV_BWD_OFFS; | |
123 if( (abs( mvP->x - mvQ->x) >= 4) || | |
124 (abs( mvP->y - mvQ->y) >= 4) || | |
125 (abs(mvPbw->x - mvQbw->x) >= 4) || | |
126 (abs(mvPbw->y - mvQbw->y) >= 4) ) | |
127 return 1; | 119 return 1; |
128 } | 120 } |
129 return 0; | 121 return 0; |
130 } | 122 } |
131 | 123 |
163 h->left_border_y[i*2+1] = *(h->cy + 15 + (i*2+1)*h->l_stride); | 155 h->left_border_y[i*2+1] = *(h->cy + 15 + (i*2+1)*h->l_stride); |
164 h->left_border_u[i+1] = *(h->cu + 7 + i*h->c_stride); | 156 h->left_border_u[i+1] = *(h->cu + 7 + i*h->c_stride); |
165 h->left_border_v[i+1] = *(h->cv + 7 + i*h->c_stride); | 157 h->left_border_v[i+1] = *(h->cv + 7 + i*h->c_stride); |
166 } | 158 } |
167 if(!h->loop_filter_disable) { | 159 if(!h->loop_filter_disable) { |
168 /* clear bs */ | |
169 *((uint64_t *)bs) = 0; | |
170 /* determine bs */ | 160 /* determine bs */ |
171 switch(mb_type) { | 161 if(mb_type == I_8X8) |
172 case I_8X8: | |
173 *((uint64_t *)bs) = 0x0202020202020202ULL; | 162 *((uint64_t *)bs) = 0x0202020202020202ULL; |
174 break; | 163 else{ |
175 case P_8X8: | 164 *((uint64_t *)bs) = 0; |
176 case P_8X16: | 165 if(partition_flags[mb_type] & SPLITV){ |
177 bs[2] = get_bs_p(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1]); | 166 bs[2] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1], mb_type > P_8X8); |
178 bs[3] = get_bs_p(&h->mv[MV_FWD_X2], &h->mv[MV_FWD_X3]); | 167 bs[3] = get_bs(&h->mv[MV_FWD_X2], &h->mv[MV_FWD_X3], mb_type > P_8X8); |
179 case P_16X8: | |
180 bs[6] = get_bs_p(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2]); | |
181 bs[7] = get_bs_p(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3]); | |
182 case P_16X16: | |
183 case P_SKIP: | |
184 bs[0] = get_bs_p(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0]); | |
185 bs[1] = get_bs_p(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2]); | |
186 bs[4] = get_bs_p(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0]); | |
187 bs[5] = get_bs_p(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1]); | |
188 break; | |
189 case B_SKIP: | |
190 case B_DIRECT: | |
191 case B_8X8: | |
192 bs[2] = get_bs_b(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1]); | |
193 bs[3] = get_bs_b(&h->mv[MV_FWD_X2], &h->mv[MV_FWD_X3]); | |
194 bs[6] = get_bs_b(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2]); | |
195 bs[7] = get_bs_b(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3]); | |
196 case B_FWD_16X16: | |
197 case B_BWD_16X16: | |
198 case B_SYM_16X16: | |
199 bs[0] = get_bs_b(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0]); | |
200 bs[1] = get_bs_b(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2]); | |
201 bs[4] = get_bs_b(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0]); | |
202 bs[5] = get_bs_b(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1]); | |
203 break; | |
204 default: | |
205 if(mb_type & 1) { //16X8 | |
206 bs[6] = bs[7] = get_bs_b(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2]); | |
207 } else { //8X16 | |
208 bs[2] = bs[3] = get_bs_b(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X1]); | |
209 } | 168 } |
210 bs[0] = get_bs_b(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0]); | 169 if(partition_flags[mb_type] & SPLITH){ |
211 bs[1] = get_bs_b(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2]); | 170 bs[6] = get_bs(&h->mv[MV_FWD_X0], &h->mv[MV_FWD_X2], mb_type > P_8X8); |
212 bs[4] = get_bs_b(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0]); | 171 bs[7] = get_bs(&h->mv[MV_FWD_X1], &h->mv[MV_FWD_X3], mb_type > P_8X8); |
213 bs[5] = get_bs_b(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1]); | 172 } |
173 bs[0] = get_bs(&h->mv[MV_FWD_A1], &h->mv[MV_FWD_X0], mb_type > P_8X8); | |
174 bs[1] = get_bs(&h->mv[MV_FWD_A3], &h->mv[MV_FWD_X2], mb_type > P_8X8); | |
175 bs[4] = get_bs(&h->mv[MV_FWD_B2], &h->mv[MV_FWD_X0], mb_type > P_8X8); | |
176 bs[5] = get_bs(&h->mv[MV_FWD_B3], &h->mv[MV_FWD_X1], mb_type > P_8X8); | |
214 } | 177 } |
215 if( *((uint64_t *)bs) ) { | 178 if( *((uint64_t *)bs) ) { |
216 if(h->flags & A_AVAIL) { | 179 if(h->flags & A_AVAIL) { |
217 qp_avg = (h->qp + h->left_qp + 1) >> 1; | 180 qp_avg = (h->qp + h->left_qp + 1) >> 1; |
218 SET_PARAMS; | 181 SET_PARAMS; |
484 qpix_op, chroma_op, mv+MV_BWD_OFFS); | 447 qpix_op, chroma_op, mv+MV_BWD_OFFS); |
485 } | 448 } |
486 } | 449 } |
487 | 450 |
488 static void inter_pred(AVSContext *h, enum mb_t mb_type) { | 451 static void inter_pred(AVSContext *h, enum mb_t mb_type) { |
489 switch(mb_type) { | 452 if(partition_flags[mb_type] == 0){ // 16x16 |
490 case P_SKIP: | |
491 case P_16X16: | |
492 case B_FWD_16X16: | |
493 case B_BWD_16X16: | |
494 case B_SYM_16X16: | |
495 mc_part_std(h, 1, 8, 0, h->cy, h->cu, h->cv, 0, 0, | 453 mc_part_std(h, 1, 8, 0, h->cy, h->cu, h->cv, 0, 0, |
496 h->s.dsp.put_cavs_qpel_pixels_tab[0], | 454 h->s.dsp.put_cavs_qpel_pixels_tab[0], |
497 h->s.dsp.put_h264_chroma_pixels_tab[0], | 455 h->s.dsp.put_h264_chroma_pixels_tab[0], |
498 h->s.dsp.avg_cavs_qpel_pixels_tab[0], | 456 h->s.dsp.avg_cavs_qpel_pixels_tab[0], |
499 h->s.dsp.avg_h264_chroma_pixels_tab[0],&h->mv[MV_FWD_X0]); | 457 h->s.dsp.avg_h264_chroma_pixels_tab[0],&h->mv[MV_FWD_X0]); |
500 break; | 458 }else{ |
501 default: | |
502 mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 0, 0, | 459 mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 0, 0, |
503 h->s.dsp.put_cavs_qpel_pixels_tab[1], | 460 h->s.dsp.put_cavs_qpel_pixels_tab[1], |
504 h->s.dsp.put_h264_chroma_pixels_tab[1], | 461 h->s.dsp.put_h264_chroma_pixels_tab[1], |
505 h->s.dsp.avg_cavs_qpel_pixels_tab[1], | 462 h->s.dsp.avg_cavs_qpel_pixels_tab[1], |
506 h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X0]); | 463 h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X0]); |
517 mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 4, 4, | 474 mc_part_std(h, 1, 4, 0, h->cy, h->cu, h->cv, 4, 4, |
518 h->s.dsp.put_cavs_qpel_pixels_tab[1], | 475 h->s.dsp.put_cavs_qpel_pixels_tab[1], |
519 h->s.dsp.put_h264_chroma_pixels_tab[1], | 476 h->s.dsp.put_h264_chroma_pixels_tab[1], |
520 h->s.dsp.avg_cavs_qpel_pixels_tab[1], | 477 h->s.dsp.avg_cavs_qpel_pixels_tab[1], |
521 h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X3]); | 478 h->s.dsp.avg_h264_chroma_pixels_tab[1],&h->mv[MV_FWD_X3]); |
522 break; | |
523 } | 479 } |
524 /* set intra prediction modes to default values */ | 480 /* set intra prediction modes to default values */ |
525 h->pred_mode_Y[3] = h->pred_mode_Y[6] = INTRA_L_LP; | 481 h->pred_mode_Y[3] = h->pred_mode_Y[6] = INTRA_L_LP; |
526 h->top_pred_Y[h->mbx*2+0] = h->top_pred_Y[h->mbx*2+1] = INTRA_L_LP; | 482 h->top_pred_Y[h->mbx*2+0] = h->top_pred_Y[h->mbx*2+1] = INTRA_L_LP; |
527 } | 483 } |
1100 MV_PRED_MEDIAN, BLK_8X8, 0); | 1056 MV_PRED_MEDIAN, BLK_8X8, 0); |
1101 } | 1057 } |
1102 break; | 1058 break; |
1103 default: | 1059 default: |
1104 assert((mb_type > B_SYM_16X16) && (mb_type < B_8X8)); | 1060 assert((mb_type > B_SYM_16X16) && (mb_type < B_8X8)); |
1105 flags = b_partition_flags[(mb_type-1)>>1]; | 1061 flags = partition_flags[mb_type]; |
1106 if(mb_type & 1) { /* 16x8 macroblock types */ | 1062 if(mb_type & 1) { /* 16x8 macroblock types */ |
1107 if(flags & FWD0) | 1063 if(flags & FWD0) |
1108 mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, 1); | 1064 mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, 1); |
1109 if(flags & SYM0) { | 1065 if(flags & SYM0) { |
1110 mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, 1); | 1066 mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, 1); |