const int mb_xy= mb_x + mb_y*h->mb_stride;
const int mb_xy= mb_x + mb_y*s->mb_stride;
static void hl_decode_mb(H264Context *h){    MpegEncContext * const s = &h->s;    const int mb_x= s->mb_x;    const int mb_y= s->mb_y;    const int mb_xy= mb_x + mb_y*h->mb_stride;    const int mb_type= s->current_picture.mb_type[mb_xy];    uint8_t  *dest_y, *dest_cb, *dest_cr;    int linesize, uvlinesize /*dct_offset*/;    int i;    if(!s->decode)        return;    if(s->mb_skiped){    }    dest_y  = s->current_picture.data[0] + (mb_y * 16* s->linesize  ) + mb_x * 16;    dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;    dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;    if (h->mb_field_decoding_flag) {        linesize = s->linesize * 2;        uvlinesize = s->uvlinesize * 2;        if(mb_y&1){ //FIXME move out of this func?            dest_y -= s->linesize*15;            dest_cb-= s->linesize*7;            dest_cr-= s->linesize*7;        }    } else {        linesize = s->linesize;        uvlinesize = s->uvlinesize;//        dct_offset = s->linesize * 16;    }    if(IS_INTRA(mb_type)){        if(!(s->flags&CODEC_FLAG_GRAY)){            h->pred8x8[ h->chroma_pred_mode ](dest_cb, uvlinesize);            h->pred8x8[ h->chroma_pred_mode ](dest_cr, uvlinesize);        }        if(IS_INTRA4x4(mb_type)){            if(!s->encoding){                for(i=0; i<16; i++){                    uint8_t * const ptr= dest_y + h->block_offset[i];                    uint8_t *topright= ptr + 4 - linesize;                    const int topright_avail= (h->topright_samples_available<<i)&0x8000;                    const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];                    int tr;                    if(!topright_avail){                        tr= ptr[3 - linesize]*0x01010101;                        topright= (uint8_t*) &tr;                    }                    h->pred4x4[ dir ](ptr, topright, linesize);                    if(h->non_zero_count_cache[ scan8[i] ])                        h264_add_idct_c(ptr, h->mb + i*16, linesize);                }            }        }else{            h->pred16x16[ h->intra16x16_pred_mode ](dest_y , linesize);            h264_luma_dc_dequant_idct_c(h->mb, s->qscale);        }    }else{        hl_motion(h, dest_y, dest_cb, dest_cr,                  s->dsp.put_h264_qpel_pixels_tab, s->dsp.put_h264_chroma_pixels_tab,                   s->dsp.avg_h264_qpel_pixels_tab, s->dsp.avg_h264_chroma_pixels_tab);    }    if(!IS_INTRA4x4(mb_type)){        for(i=0; i<16; i++){            if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ //FIXME benchmark weird rule, & below                uint8_t * const ptr= dest_y + h->block_offset[i];                h264_add_idct_c(ptr, h->mb + i*16, linesize);            }        }    }    if(!(s->flags&CODEC_FLAG_GRAY)){        chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp);        chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp);        for(i=16; i<16+4; i++){            if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){                uint8_t * const ptr= dest_cb + h->block_offset[i];                h264_add_idct_c(ptr, h->mb + i*16, uvlinesize);            }        }        for(i=20; i<20+4; i++){            if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){                uint8_t * const ptr= dest_cr + h->block_offset[i];                h264_add_idct_c(ptr, h->mb + i*16, uvlinesize);            }        }    }}