comparison cavs.c @ 5401:cb5d5d2ee6fd libavcodec

have less functions as inline
author stefang
date Wed, 25 Jul 2007 05:09:54 +0000
parents 2a3d31a8c66f
children 07844149dfa9
comparison
equal deleted inserted replaced
5400:2433e0070455 5401:cb5d5d2ee6fd
141 * 141 *
142 * spatial intra prediction 142 * spatial intra prediction
143 * 143 *
144 ****************************************************************************/ 144 ****************************************************************************/
145 145
146 void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top,
147 uint8_t **left, int block) {
148 int i;
149
150 switch(block) {
151 case 0:
152 *left = h->left_border_y;
153 h->left_border_y[0] = h->left_border_y[1];
154 memset(&h->left_border_y[17],h->left_border_y[16],9);
155 memcpy(&top[1],&h->top_border_y[h->mbx*16],16);
156 top[17] = top[16];
157 top[0] = top[1];
158 if((h->flags & A_AVAIL) && (h->flags & B_AVAIL))
159 h->left_border_y[0] = top[0] = h->topleft_border_y;
160 break;
161 case 1:
162 *left = h->intern_border_y;
163 for(i=0;i<8;i++)
164 h->intern_border_y[i+1] = *(h->cy + 7 + i*h->l_stride);
165 memset(&h->intern_border_y[9],h->intern_border_y[8],9);
166 h->intern_border_y[0] = h->intern_border_y[1];
167 memcpy(&top[1],&h->top_border_y[h->mbx*16+8],8);
168 if(h->flags & C_AVAIL)
169 memcpy(&top[9],&h->top_border_y[(h->mbx + 1)*16],8);
170 else
171 memset(&top[9],top[8],9);
172 top[17] = top[16];
173 top[0] = top[1];
174 if(h->flags & B_AVAIL)
175 h->intern_border_y[0] = top[0] = h->top_border_y[h->mbx*16+7];
176 break;
177 case 2:
178 *left = &h->left_border_y[8];
179 memcpy(&top[1],h->cy + 7*h->l_stride,16);
180 top[17] = top[16];
181 top[0] = top[1];
182 if(h->flags & A_AVAIL)
183 top[0] = h->left_border_y[8];
184 break;
185 case 3:
186 *left = &h->intern_border_y[8];
187 for(i=0;i<8;i++)
188 h->intern_border_y[i+9] = *(h->cy + 7 + (i+8)*h->l_stride);
189 memset(&h->intern_border_y[17],h->intern_border_y[16],9);
190 memcpy(&top[0],h->cy + 7 + 7*h->l_stride,9);
191 memset(&top[9],top[8],9);
192 break;
193 }
194 }
195
196 void ff_cavs_load_intra_pred_chroma(AVSContext *h) {
197 /* extend borders by one pixel */
198 h->left_border_u[9] = h->left_border_u[8];
199 h->left_border_v[9] = h->left_border_v[8];
200 h->top_border_u[h->mbx*10+9] = h->top_border_u[h->mbx*10+8];
201 h->top_border_v[h->mbx*10+9] = h->top_border_v[h->mbx*10+8];
202 if(h->mbx && h->mby) {
203 h->top_border_u[h->mbx*10] = h->left_border_u[0] = h->topleft_border_u;
204 h->top_border_v[h->mbx*10] = h->left_border_v[0] = h->topleft_border_v;
205 } else {
206 h->left_border_u[0] = h->left_border_u[1];
207 h->left_border_v[0] = h->left_border_v[1];
208 h->top_border_u[h->mbx*10] = h->top_border_u[h->mbx*10+1];
209 h->top_border_v[h->mbx*10] = h->top_border_v[h->mbx*10+1];
210 }
211 }
212
146 static void intra_pred_vert(uint8_t *d,uint8_t *top,uint8_t *left,int stride) { 213 static void intra_pred_vert(uint8_t *d,uint8_t *top,uint8_t *left,int stride) {
147 int y; 214 int y;
148 uint64_t a = unaligned64(&top[1]); 215 uint64_t a = unaligned64(&top[1]);
149 for(y=0;y<8;y++) { 216 for(y=0;y<8;y++) {
150 *((uint64_t *)(d+y*stride)) = a; 217 *((uint64_t *)(d+y*stride)) = a;
227 for(x=0; x<8; x++) 294 for(x=0; x<8; x++)
228 d[y*stride+x] = LOWPASS(top,x+1); 295 d[y*stride+x] = LOWPASS(top,x+1);
229 } 296 }
230 297
231 #undef LOWPASS 298 #undef LOWPASS
299
300 void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv) {
301 /* save pred modes before they get modified */
302 h->pred_mode_Y[3] = h->pred_mode_Y[5];
303 h->pred_mode_Y[6] = h->pred_mode_Y[8];
304 h->top_pred_Y[h->mbx*2+0] = h->pred_mode_Y[7];
305 h->top_pred_Y[h->mbx*2+1] = h->pred_mode_Y[8];
306
307 /* modify pred modes according to availability of neighbour samples */
308 if(!(h->flags & A_AVAIL)) {
309 modify_pred(ff_left_modifier_l, &h->pred_mode_Y[4] );
310 modify_pred(ff_left_modifier_l, &h->pred_mode_Y[7] );
311 modify_pred(ff_left_modifier_c, pred_mode_uv );
312 }
313 if(!(h->flags & B_AVAIL)) {
314 modify_pred(ff_top_modifier_l, &h->pred_mode_Y[4] );
315 modify_pred(ff_top_modifier_l, &h->pred_mode_Y[5] );
316 modify_pred(ff_top_modifier_c, pred_mode_uv );
317 }
318 }
232 319
233 /***************************************************************************** 320 /*****************************************************************************
234 * 321 *
235 * motion compensation 322 * motion compensation
236 * 323 *
436 set_mvs(mvP,size); 523 set_mvs(mvP,size);
437 } 524 }
438 525
439 /***************************************************************************** 526 /*****************************************************************************
440 * 527 *
528 * macroblock level
529 *
530 ****************************************************************************/
531
532 /**
533 * initialise predictors for motion vectors and intra prediction
534 */
535 void ff_cavs_init_mb(AVSContext *h) {
536 int i;
537
538 /* copy predictors from top line (MB B and C) into cache */
539 for(i=0;i<3;i++) {
540 h->mv[MV_FWD_B2+i] = h->top_mv[0][h->mbx*2+i];
541 h->mv[MV_BWD_B2+i] = h->top_mv[1][h->mbx*2+i];
542 }
543 h->pred_mode_Y[1] = h->top_pred_Y[h->mbx*2+0];
544 h->pred_mode_Y[2] = h->top_pred_Y[h->mbx*2+1];
545 /* clear top predictors if MB B is not available */
546 if(!(h->flags & B_AVAIL)) {
547 h->mv[MV_FWD_B2] = ff_cavs_un_mv;
548 h->mv[MV_FWD_B3] = ff_cavs_un_mv;
549 h->mv[MV_BWD_B2] = ff_cavs_un_mv;
550 h->mv[MV_BWD_B3] = ff_cavs_un_mv;
551 h->pred_mode_Y[1] = h->pred_mode_Y[2] = NOT_AVAIL;
552 h->flags &= ~(C_AVAIL|D_AVAIL);
553 } else if(h->mbx) {
554 h->flags |= D_AVAIL;
555 }
556 if(h->mbx == h->mb_width-1) //MB C not available
557 h->flags &= ~C_AVAIL;
558 /* clear top-right predictors if MB C is not available */
559 if(!(h->flags & C_AVAIL)) {
560 h->mv[MV_FWD_C2] = ff_cavs_un_mv;
561 h->mv[MV_BWD_C2] = ff_cavs_un_mv;
562 }
563 /* clear top-left predictors if MB D is not available */
564 if(!(h->flags & D_AVAIL)) {
565 h->mv[MV_FWD_D3] = ff_cavs_un_mv;
566 h->mv[MV_BWD_D3] = ff_cavs_un_mv;
567 }
568 /* set pointer for co-located macroblock type */
569 h->col_type = &h->col_type_base[h->mby*h->mb_width + h->mbx];
570 }
571
572 /**
573 * save predictors for later macroblocks and increase
574 * macroblock address
575 * @returns 0 if end of frame is reached, 1 otherwise
576 */
577 int ff_cavs_next_mb(AVSContext *h) {
578 int i;
579
580 h->flags |= A_AVAIL;
581 h->cy += 16;
582 h->cu += 8;
583 h->cv += 8;
584 /* copy mvs as predictors to the left */
585 for(i=0;i<=20;i+=4)
586 h->mv[i] = h->mv[i+2];
587 /* copy bottom mvs from cache to top line */
588 h->top_mv[0][h->mbx*2+0] = h->mv[MV_FWD_X2];
589 h->top_mv[0][h->mbx*2+1] = h->mv[MV_FWD_X3];
590 h->top_mv[1][h->mbx*2+0] = h->mv[MV_BWD_X2];
591 h->top_mv[1][h->mbx*2+1] = h->mv[MV_BWD_X3];
592 /* next MB address */
593 h->mbx++;
594 if(h->mbx == h->mb_width) { //new mb line
595 h->flags = B_AVAIL|C_AVAIL;
596 /* clear left pred_modes */
597 h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL;
598 /* clear left mv predictors */
599 for(i=0;i<=20;i+=4)
600 h->mv[i] = ff_cavs_un_mv;
601 h->mbx = 0;
602 h->mby++;
603 /* re-calculate sample pointers */
604 h->cy = h->picture.data[0] + h->mby*16*h->l_stride;
605 h->cu = h->picture.data[1] + h->mby*8*h->c_stride;
606 h->cv = h->picture.data[2] + h->mby*8*h->c_stride;
607 if(h->mby == h->mb_height) { //frame end
608 return 0;
609 } else {
610 //check_for_slice(h);
611 }
612 }
613 return 1;
614 }
615
616 /*****************************************************************************
617 *
441 * frame level 618 * frame level
442 * 619 *
443 ****************************************************************************/ 620 ****************************************************************************/
444 621
445 void ff_cavs_init_pic(AVSContext *h) { 622 void ff_cavs_init_pic(AVSContext *h) {