static av_always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int p[3], int intra, const uint8_t *obmc_edged, int *best_rd){

    const int b_stride= s->b_width << s->block_max_depth;

    BlockNode *block= &s->block[mb_x + mb_y * b_stride];

    BlockNode backup= *block;

    int rd, index, value;



    assert(mb_x>=0 && mb_y>=0);

    assert(mb_x<b_stride);



    if(intra){

        block->color[0] = p[0];

        block->color[1] = p[1];

        block->color[2] = p[2];

        block->type |= BLOCK_INTRA;

    }else{

        index= (p[0] + 31*p[1]) & (ME_CACHE_SIZE-1);

        value= s->me_cache_generation + (p[0]>>10) + (p[1]<<6) + (block->ref<<12);

        if(s->me_cache[index] == value)

            return 0;

        s->me_cache[index]= value;



        block->mx= p[0];

        block->my= p[1];

        block->type &= ~BLOCK_INTRA;

    }



    rd= get_block_rd(s, mb_x, mb_y, 0, obmc_edged);





    if(rd < *best_rd){

        *best_rd= rd;

        return 1;

    }else{

        *block= backup;

        return 0;

    }

}
