⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpegvideo.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 5 页
字号:
                        /*COLOR(240, 48)*/ u = 103; v = 86;                    }else if(!USES_LIST(mb_type, 0)){                        /*COLOR(0, 48)*/ u = 176; v = 128;                    }else{                        assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));                        /*COLOR(300, 48)*/ u = 151; v = 86;                    }#endif                    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_8X8(mb_type) && mv_sample_log2 >= 2){                        int dm= 1 << (mv_sample_log2-2);                        for(i=0; i<4; i++){                            int sx= mb_x*16 + 8*(i&1);                            int sy= mb_y*16 + 8*(i>>1);                            int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);                            //FIXME bidir                            int32_t *mv = (int32_t*)&pict->motion_val[0][xy];                            if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])                                for(y=0; y<8; y++)                                    pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;                            if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])                                *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;                        }                    }                    if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){                        // hmm                    }                }                s->mbskip_table[mb_index]=0;            }        }    }}/** * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples. * @param buf destination buffer * @param src source buffer * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers * @param block_w width of block * @param block_h height of block * @param src_x x coordinate of the top left sample of the block in the source buffer * @param src_y y coordinate of the top left sample of the block in the source buffer * @param w width of the source buffer * @param h height of the source buffer */void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,                                    int src_x, int src_y, int w, int h){    int x, y;    int start_y, start_x, end_y, end_x;    if(src_y>= h){        src+= (h-1-src_y)*linesize;        src_y=h-1;    }else if(src_y<=-block_h){        src+= (1-block_h-src_y)*linesize;        src_y=1-block_h;    }    if(src_x>= w){        src+= (w-1-src_x);        src_x=w-1;    }else if(src_x<=-block_w){        src+= (1-block_w-src_x);        src_x=1-block_w;    }    start_y= FFMAX(0, -src_y);    start_x= FFMAX(0, -src_x);    end_y= FFMIN(block_h, h-src_y);    end_x= FFMIN(block_w, w-src_x);    // copy existing part    for(y=start_y; y<end_y; y++){        for(x=start_x; x<end_x; x++){            buf[x + y*linesize]= src[x + y*linesize];        }    }    //top    for(y=0; y<start_y; y++){        for(x=start_x; x<end_x; x++){            buf[x + y*linesize]= buf[x + start_y*linesize];        }    }    //bottom    for(y=end_y; y<block_h; y++){        for(x=start_x; x<end_x; x++){            buf[x + y*linesize]= buf[x + (end_y-1)*linesize];        }    }    for(y=0; y<block_h; y++){       //left        for(x=0; x<start_x; x++){            buf[x + y*linesize]= buf[start_x + y*linesize];        }       //right        for(x=end_x; x<block_w; x++){            buf[x + y*linesize]= buf[end_x - 1 + y*linesize];        }    }}static inline int hpel_motion_lowres(MpegEncContext *s,                                  uint8_t *dest, uint8_t *src,                                  int field_based, int field_select,                                  int src_x, int src_y,                                  int width, int height, int stride,                                  int h_edge_pos, int v_edge_pos,                                  int w, int h, h264_chroma_mc_func *pix_op,                                  int motion_x, int motion_y){    const int lowres= s->avctx->lowres;    const int s_mask= (2<<lowres)-1;    int emu=0;    int sx, sy;    if(s->quarter_sample){        motion_x/=2;        motion_y/=2;    }    sx= motion_x & s_mask;    sy= motion_y & s_mask;    src_x += motion_x >> (lowres+1);    src_y += motion_y >> (lowres+1);    src += src_y * stride + src_x;    if(   (unsigned)src_x > h_edge_pos                 - (!!sx) - w       || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){        ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,                            src_x, src_y<<field_based, h_edge_pos, v_edge_pos);        src= s->edge_emu_buffer;        emu=1;    }    sx <<= 2 - lowres;    sy <<= 2 - lowres;    if(field_select)        src += s->linesize;    pix_op[lowres](dest, src, stride, h, sx, sy);    return emu;}/* apply one mpeg motion vector to the three components */static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,                               int field_based, int bottom_field, int field_select,                               uint8_t **ref_picture, h264_chroma_mc_func *pix_op,                               int motion_x, int motion_y, int h){    uint8_t *ptr_y, *ptr_cb, *ptr_cr;    int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;    const int lowres= s->avctx->lowres;    const int block_s= 8>>lowres;    const int s_mask= (2<<lowres)-1;    const int h_edge_pos = s->h_edge_pos >> lowres;    const int v_edge_pos = s->v_edge_pos >> lowres;    linesize   = s->current_picture.linesize[0] << field_based;    uvlinesize = s->current_picture.linesize[1] << field_based;    if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway        motion_x/=2;        motion_y/=2;    }    if(field_based){        motion_y += (bottom_field - field_select)*((1<<lowres)-1);    }    sx= motion_x & s_mask;    sy= motion_y & s_mask;    src_x = s->mb_x*2*block_s               + (motion_x >> (lowres+1));    src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));    if (s->out_format == FMT_H263) {        uvsx = ((motion_x>>1) & s_mask) | (sx&1);        uvsy = ((motion_y>>1) & s_mask) | (sy&1);        uvsrc_x = src_x>>1;        uvsrc_y = src_y>>1;    }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261        mx = motion_x / 4;        my = motion_y / 4;        uvsx = (2*mx) & s_mask;        uvsy = (2*my) & s_mask;        uvsrc_x = s->mb_x*block_s               + (mx >> lowres);        uvsrc_y = s->mb_y*block_s               + (my >> lowres);    } else {        mx = motion_x / 2;        my = motion_y / 2;        uvsx = mx & s_mask;        uvsy = my & s_mask;        uvsrc_x = s->mb_x*block_s               + (mx >> (lowres+1));        uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));    }    ptr_y  = ref_picture[0] + src_y * linesize + src_x;    ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;    ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;    if(   (unsigned)src_x > h_edge_pos                 - (!!sx) - 2*block_s       || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){            ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,                             src_x, src_y<<field_based, h_edge_pos, v_edge_pos);            ptr_y = s->edge_emu_buffer;            if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){                uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;                ff_emulated_edge_mc(uvbuf  , ptr_cb, s->uvlinesize, 9, 9+field_based,                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);                ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,                                 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);                ptr_cb= uvbuf;                ptr_cr= uvbuf+16;            }    }    if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data        dest_y += s->linesize;        dest_cb+= s->uvlinesize;        dest_cr+= s->uvlinesize;    }    if(field_select){        ptr_y += s->linesize;        ptr_cb+= s->uvlinesize;        ptr_cr+= s->uvlinesize;    }    sx <<= 2 - lowres;    sy <<= 2 - lowres;    pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);    if(!ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){        uvsx <<= 2 - lowres;        uvsy <<= 2 - lowres;        pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);        pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);    }    //FIXME h261 lowres loop filter}static inline void chroma_4mv_motion_lowres(MpegEncContext *s,                                     uint8_t *dest_cb, uint8_t *dest_cr,                                     uint8_t **ref_picture,                                     h264_chroma_mc_func *pix_op,                                     int mx, int my){    const int lowres= s->avctx->lowres;    const int block_s= 8>>lowres;    const int s_mask= (2<<lowres)-1;    const int h_edge_pos = s->h_edge_pos >> (lowres+1);    const int v_edge_pos = s->v_edge_pos >> (lowres+1);    int emu=0, src_x, src_y, offset, sx, sy;    uint8_t *ptr;    if(s->quarter_sample){        mx/=2;        my/=2;    }    /* In case of 8X8, we construct a single chroma motion vector       with a special rounding */    mx= ff_h263_round_chroma(mx);    my= ff_h263_round_chroma(my);    sx= mx & s_mask;    sy= my & s_mask;    src_x = s->mb_x*block_s + (mx >> (lowres+1));    src_y = s->mb_y*block_s + (my >> (lowres+1));    offset = src_y * s->uvlinesize + src_x;    ptr = ref_picture[1] + offset;    if(s->flags&CODEC_FLAG_EMU_EDGE){        if(   (unsigned)src_x > h_edge_pos - (!!sx) - block_s           || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){            ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);            ptr= s->edge_emu_buffer;            emu=1;        }    }    sx <<= 2 - lowres;    sy <<= 2 - lowres;    pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);    ptr = ref_picture[2] + offset;    if(emu){        ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);        ptr= s->edge_emu_buffer;    }    pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);}/** * motion compensation of a single macroblock * @param s context * @param dest_y luma destination pointer * @param dest_cb chroma cb/u destination pointer * @param dest_cr chroma cr/v destination pointer * @param dir direction (0->forward, 1->backward) * @param ref_picture array[3] of pointers to the 3 planes of the reference picture * @param pic_op halfpel motion compensation function (average or put normally) * the motion vectors are taken from s->mv and the MV type from s->mv_type */static inline void MPV_motion_lowres(MpegEncContext *s,                              uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,                              int dir, uint8_t **ref_picture,                              h264_chroma_mc_func *pix_op){    int mx, my;    int mb_x, mb_y, i;    const int lowres= s->avctx->lowres;    const int block_s= 8>>lowres;    mb_x = s->mb_x;    mb_y = s->mb_y;    switch(s->mv_type) {    case MV_TYPE_16X16:        mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,                    0, 0, 0,                    ref_picture, pix_op,                    s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);        break;    case MV_TYPE_8X8:        mx = 0;        my = 0;            for(i=0;i<4;i++) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -