int xy= 1 + mb_x*2 + (i&1) + (mb_y*2 + 1 + (i>>1))*(s->mb_width*2 + 2);
int xy= mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*s->b8_stride;
void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){    if(!pict || !pict->mb_type) return;    if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){        int x,y;                av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");        switch (pict->pict_type) {            case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;            case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;            case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;            case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;            case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;            case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;                    }        for(y=0; y<s->mb_height; y++){            for(x=0; x<s->mb_width; x++){                if(s->avctx->debug&FF_DEBUG_SKIP){                    int count= s->mbskip_table[x + y*s->mb_stride];                    if(count>9) count=9;                    av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);                }                if(s->avctx->debug&FF_DEBUG_QP){                    av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);                }                if(s->avctx->debug&FF_DEBUG_MB_TYPE){                    int mb_type= pict->mb_type[x + y*s->mb_stride];                    //Type & MV direction                    if(IS_PCM(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "P");                    else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "A");                    else if(IS_INTRA4x4(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "i");                    else if(IS_INTRA16x16(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "I");                    else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "d");                    else if(IS_DIRECT(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "D");                    else if(IS_GMC(mb_type) && IS_SKIP(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "g");                    else if(IS_GMC(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "G");                    else if(IS_SKIP(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "S");                    else if(!USES_LIST(mb_type, 1))                        av_log(s->avctx, AV_LOG_DEBUG, ">");                    else if(!USES_LIST(mb_type, 0))                        av_log(s->avctx, AV_LOG_DEBUG, "<");                    else{                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));                        av_log(s->avctx, AV_LOG_DEBUG, "X");                    }                                        //segmentation                    if(IS_8X8(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "+");                    else if(IS_16X8(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "-");                    else if(IS_8X16(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, "");                    else if(IS_INTRA(mb_type) || IS_16X16(mb_type))                        av_log(s->avctx, AV_LOG_DEBUG, " ");                    else                        av_log(s->avctx, AV_LOG_DEBUG, "?");                                                                if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)                        av_log(s->avctx, AV_LOG_DEBUG, "=");                    else                        av_log(s->avctx, AV_LOG_DEBUG, " ");                }//                av_log(s->avctx, AV_LOG_DEBUG, " ");            }            av_log(s->avctx, AV_LOG_DEBUG, "\n");        }    }    if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){        const int shift= 1 + s->quarter_sample;        int mb_y;        uint8_t *ptr;        int i;        int h_chroma_shift, v_chroma_shift;        s->low_delay=0; //needed to see the vectors without trashing the buffers        avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);        for(i=0; i<3; i++){            memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*s->height:pict->linesize[i]*s->height >> v_chroma_shift);            pict->data[i]= s->visualization_buffer[i];        }        pict->type= FF_BUFFER_TYPE_COPY;        ptr= pict->data[0];        for(mb_y=0; mb_y<s->mb_height; mb_y++){            int mb_x;            for(mb_x=0; mb_x<s->mb_width; mb_x++){                const int mb_index= mb_x + mb_y*s->mb_stride;                if((s->avctx->debug_mv) && pict->motion_val){                  int type;                  for(type=0; type<3; type++){                    int direction;                    switch (type) {                      case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))                                continue;                              direction = 0;                              break;                      case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))                                continue;                              direction = 0;                              break;                      case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))                                continue;                              direction = 1;                              break;                    }                    if(!USES_LIST(pict->mb_type[mb_index], direction))                        continue;                    if(IS_8X8(pict->mb_type[mb_index])){                      int i;                      for(i=0; i<4; i++){                        int sx= mb_x*16 + 4 + 8*(i&1);                        int sy= mb_y*16 + 4 + 8*(i>>1);                        int xy= 1 + mb_x*2 + (i&1) + (mb_y*2 + 1 + (i>>1))*(s->mb_width*2 + 2);                        int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;                        int my= (pict->motion_val[direction][xy][1]>>shift) + sy;                        draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);                      }                    }else if(IS_16X8(pict->mb_type[mb_index])){                      int i;                      for(i=0; i<2; i++){                        int sx=mb_x*16 + 8;                        int sy=mb_y*16 + 4 + 8*i;                        int xy=1 + mb_x*2 + (mb_y*2 + 1 + i)*(s->mb_width*2 + 2);                        int mx=(pict->motion_val[direction][xy][0]>>shift) + sx;                        int my=(pict->motion_val[direction][xy][1]>>shift) + sy;                        draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);                      }                    }else{                      int sx= mb_x*16 + 8;                      int sy= mb_y*16 + 8;                      int xy= 1 + mb_x*2 + (mb_y*2 + 1)*(s->mb_width*2 + 2);                      int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;                      int my= (pict->motion_val[direction][xy][1]>>shift) + sy;                      draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);                    }                  }                                  }                if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){                    uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;                    int y;                    for(y=0; y<8; y++){                        *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;                        *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;                    }                }                if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){                    int mb_type= pict->mb_type[mb_index];                    uint64_t u,v;                    int y;#define COLOR(theta, r)\u= (int)(128 + r*cos(theta*3.141592/180));\v= (int)(128 + r*sin(theta*3.141592/180));                                        u=v=128;                    if(IS_PCM(mb_type)){                        COLOR(120,48)                    }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){                        COLOR(30,48)                    }else if(IS_INTRA4x4(mb_type)){                        COLOR(90,48)                    }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){//                        COLOR(120,48)                    }else if(IS_DIRECT(mb_type)){                        COLOR(150,48)                    }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){                        COLOR(170,48)                    }else if(IS_GMC(mb_type)){                        COLOR(190,48)                    }else if(IS_SKIP(mb_type)){//                        COLOR(180,48)                    }else if(!USES_LIST(mb_type, 1)){                        COLOR(240,48)                    }else if(!USES_LIST(mb_type, 0)){                        COLOR(0,48)                    }else{                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));                        COLOR(300,48)                    }                    u*= 0x0101010101010101ULL;                    v*= 0x0101010101010101ULL;                    for(y=0; y<8; y++){                        *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;                        *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;                    }                    //segmentation                    if(IS_8X8(mb_type) || IS_16X8(mb_type)){                        *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;                        *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;                    }                    if(IS_8X8(mb_type) || IS_8X16(mb_type)){                        for(y=0; y<16; y++)                            pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;                    }                                            if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){                        // hmm                    }                }                s->mbskip_table[mb_index]=0;            }        }    }}