comparison snow.c @ 3197:8f53630cd24e libavcodec

dont pass intra flag if its always 0
author michael
date Tue, 14 Mar 2006 00:22:05 +0000
parents c30e9bcbb716
children 6b9f0c4fbdbe
comparison
equal deleted inserted replaced
3196:15157293beea 3197:8f53630cd24e
3254 return 0; 3254 return 0;
3255 } 3255 }
3256 } 3256 }
3257 3257
3258 /* special case for int[2] args we discard afterward, fixes compilation prob with gcc 2.95 */ 3258 /* special case for int[2] args we discard afterward, fixes compilation prob with gcc 2.95 */
3259 static always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int intra, const uint8_t *obmc_edged, int *best_rd){ 3259 static always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, const uint8_t *obmc_edged, int *best_rd){
3260 int p[2] = {p0, p1}; 3260 int p[2] = {p0, p1};
3261 return check_block(s, mb_x, mb_y, p, intra, obmc_edged, best_rd); 3261 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd);
3262 } 3262 }
3263 3263
3264 static always_inline int check_4block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int *best_rd){ 3264 static always_inline int check_4block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int *best_rd){
3265 const int b_stride= s->b_width << s->block_max_depth; 3265 const int b_stride= s->b_width << s->block_max_depth;
3266 BlockNode *block= &s->block[mb_x + mb_y * b_stride]; 3266 BlockNode *block= &s->block[mb_x + mb_y * b_stride];
3404 // get previous score (cant be cached due to OBMC) 3404 // get previous score (cant be cached due to OBMC)
3405 if(pass > 0 && (block->type&BLOCK_INTRA)){ 3405 if(pass > 0 && (block->type&BLOCK_INTRA)){
3406 int color0[3]= {block->color[0], block->color[1], block->color[2]}; 3406 int color0[3]= {block->color[0], block->color[1], block->color[2]};
3407 check_block(s, mb_x, mb_y, color0, 1, *obmc_edged, &best_rd); 3407 check_block(s, mb_x, mb_y, color0, 1, *obmc_edged, &best_rd);
3408 }else 3408 }else
3409 check_block_inter(s, mb_x, mb_y, block->mx, block->my, 0, *obmc_edged, &best_rd); 3409 check_block_inter(s, mb_x, mb_y, block->mx, block->my, *obmc_edged, &best_rd);
3410 3410
3411 check_block_inter(s, mb_x, mb_y, 0, 0, 0, *obmc_edged, &best_rd); 3411 check_block_inter(s, mb_x, mb_y, 0, 0, *obmc_edged, &best_rd);
3412 check_block_inter(s, mb_x, mb_y, tb->mx, tb->my, 0, *obmc_edged, &best_rd); 3412 check_block_inter(s, mb_x, mb_y, tb->mx, tb->my, *obmc_edged, &best_rd);
3413 check_block_inter(s, mb_x, mb_y, lb->mx, lb->my, 0, *obmc_edged, &best_rd); 3413 check_block_inter(s, mb_x, mb_y, lb->mx, lb->my, *obmc_edged, &best_rd);
3414 check_block_inter(s, mb_x, mb_y, rb->mx, rb->my, 0, *obmc_edged, &best_rd); 3414 check_block_inter(s, mb_x, mb_y, rb->mx, rb->my, *obmc_edged, &best_rd);
3415 check_block_inter(s, mb_x, mb_y, bb->mx, bb->my, 0, *obmc_edged, &best_rd); 3415 check_block_inter(s, mb_x, mb_y, bb->mx, bb->my, *obmc_edged, &best_rd);
3416 3416
3417 /* fullpel ME */ 3417 /* fullpel ME */
3418 //FIXME avoid subpel interpol / round to nearest integer 3418 //FIXME avoid subpel interpol / round to nearest integer
3419 do{ 3419 do{
3420 dia_change=0; 3420 dia_change=0;
3421 for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){ 3421 for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){
3422 for(j=0; j<i; j++){ 3422 for(j=0; j<i; j++){
3423 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), 0, *obmc_edged, &best_rd); 3423 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), *obmc_edged, &best_rd);
3424 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), 0, *obmc_edged, &best_rd); 3424 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), *obmc_edged, &best_rd);
3425 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), 0, *obmc_edged, &best_rd); 3425 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), *obmc_edged, &best_rd);
3426 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), 0, *obmc_edged, &best_rd); 3426 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), *obmc_edged, &best_rd);
3427 } 3427 }
3428 } 3428 }
3429 }while(dia_change); 3429 }while(dia_change);
3430 /* subpel ME */ 3430 /* subpel ME */
3431 do{ 3431 do{
3432 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},}; 3432 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},};
3433 dia_change=0; 3433 dia_change=0;
3434 for(i=0; i<8; i++) 3434 for(i=0; i<8; i++)
3435 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], 0, *obmc_edged, &best_rd); 3435 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], *obmc_edged, &best_rd);
3436 }while(dia_change); 3436 }while(dia_change);
3437 //FIXME or try the standard 2 pass qpel or similar 3437 //FIXME or try the standard 2 pass qpel or similar
3438 #if 1 3438 #if 1
3439 check_block(s, mb_x, mb_y, color, 1, *obmc_edged, &best_rd); 3439 check_block(s, mb_x, mb_y, color, 1, *obmc_edged, &best_rd);
3440 //FIXME RD style color selection 3440 //FIXME RD style color selection