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

📄 mpegvideo.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
        motion_y =0;    linesize = s->linesize;    uvlinesize = s->uvlinesize;        ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;    dest_y+=dest_offset;    if(s->flags&CODEC_FLAG_EMU_EDGE){        if(src_x<0 || src_y<0 || src_x + (motion_x&15) + 16 > s->h_edge_pos                              || src_y + (motion_y&15) + 16 > s->v_edge_pos){            emulated_edge_mc(s, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);            ptr= s->edge_emu_buffer;            emu=1;        }    }        if((motion_x|motion_y)&7){        s->dsp.gmc1(dest_y  , ptr  , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);        s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);    }else{        int dxy;                dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);        if (s->no_rounding){	    s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);        }else{            s->dsp.put_pixels_tab       [0][dxy](dest_y, ptr, linesize, 16);        }    }        if(s->flags&CODEC_FLAG_GRAY) return;    motion_x= s->sprite_offset[1][0];    motion_y= s->sprite_offset[1][1];    src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));    src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));    motion_x<<=(3-s->sprite_warping_accuracy);    motion_y<<=(3-s->sprite_warping_accuracy);    src_x = clip(src_x, -8, s->width>>1);    if (src_x == s->width>>1)        motion_x =0;    src_y = clip(src_y, -8, s->height>>1);    if (src_y == s->height>>1)        motion_y =0;    offset = (src_y * uvlinesize) + src_x + (src_offset>>1);    ptr = ref_picture[1] + offset;    if(emu){        emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);        ptr= s->edge_emu_buffer;    }    s->dsp.gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);        ptr = ref_picture[2] + offset;    if(emu){        emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);        ptr= s->edge_emu_buffer;    }    s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);        return;}static inline void gmc_motion(MpegEncContext *s,                               UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,                               int dest_offset,                               UINT8 **ref_picture, int src_offset){    UINT8 *ptr;    int linesize, uvlinesize;    const int a= s->sprite_warping_accuracy;    int ox, oy;    linesize = s->linesize;    uvlinesize = s->uvlinesize;    ptr = ref_picture[0] + src_offset;    dest_y+=dest_offset;        ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;    oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;    s->dsp.gmc(dest_y, ptr, linesize, 16,           ox,            oy,            s->sprite_delta[0][0], s->sprite_delta[0][1],           s->sprite_delta[1][0], s->sprite_delta[1][1],            a+1, (1<<(2*a+1)) - s->no_rounding,           s->h_edge_pos, s->v_edge_pos);    s->dsp.gmc(dest_y+8, ptr, linesize, 16,           ox + s->sprite_delta[0][0]*8,            oy + s->sprite_delta[1][0]*8,            s->sprite_delta[0][0], s->sprite_delta[0][1],           s->sprite_delta[1][0], s->sprite_delta[1][1],            a+1, (1<<(2*a+1)) - s->no_rounding,           s->h_edge_pos, s->v_edge_pos);    if(s->flags&CODEC_FLAG_GRAY) return;    dest_cb+=dest_offset>>1;    dest_cr+=dest_offset>>1;        ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;    oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;    ptr = ref_picture[1] + (src_offset>>1);    s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,           ox,            oy,            s->sprite_delta[0][0], s->sprite_delta[0][1],           s->sprite_delta[1][0], s->sprite_delta[1][1],            a+1, (1<<(2*a+1)) - s->no_rounding,           s->h_edge_pos>>1, s->v_edge_pos>>1);        ptr = ref_picture[2] + (src_offset>>1);    s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,           ox,            oy,            s->sprite_delta[0][0], s->sprite_delta[0][1],           s->sprite_delta[1][0], s->sprite_delta[1][1],            a+1, (1<<(2*a+1)) - s->no_rounding,           s->h_edge_pos>>1, s->v_edge_pos>>1);}static void emulated_edge_mc(MpegEncContext *s, UINT8 *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;    UINT8 *buf= s->edge_emu_buffer;    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];        }    }}/* apply one mpeg motion vector to the three components */static inline void mpeg_motion(MpegEncContext *s,                               UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,                               int dest_offset,                               UINT8 **ref_picture, int src_offset,                               int field_based, op_pixels_func (*pix_op)[4],                               int motion_x, int motion_y, int h){    UINT8 *ptr;    int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;    int emu=0;#if 0    if(s->quarter_sample){    motion_x>>=1;    motion_y>>=1;}#endif    dxy = ((motion_y & 1) << 1) | (motion_x & 1);    src_x = s->mb_x * 16 + (motion_x >> 1);    src_y = s->mb_y * (16 >> field_based) + (motion_y >> 1);                    /* WARNING: do no forget half pels */    height = s->height >> field_based;    v_edge_pos = s->v_edge_pos >> field_based;    src_x = clip(src_x, -16, s->width);    if (src_x == s->width)        dxy &= ~1;    src_y = clip(src_y, -16, height);    if (src_y == height)        dxy &= ~2;    linesize   = s->linesize << field_based;    uvlinesize = s->uvlinesize << field_based;    ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset;    dest_y += dest_offset;    if(s->flags&CODEC_FLAG_EMU_EDGE){        if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos                              || src_y + (motion_y&1) + h  > v_edge_pos){            emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based,                              src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);            ptr= s->edge_emu_buffer + src_offset;            emu=1;        }    }    pix_op[0][dxy](dest_y, ptr, linesize, h);    if(s->flags&CODEC_FLAG_GRAY) return;    if (s->out_format == FMT_H263) {        dxy = 0;        if ((motion_x & 3) != 0)            dxy |= 1;        if ((motion_y & 3) != 0)            dxy |= 2;        mx = motion_x >> 2;        my = motion_y >> 2;    } else {        mx = motion_x / 2;        my = motion_y / 2;        dxy = ((my & 1) << 1) | (mx & 1);        mx >>= 1;        my >>= 1;    }        src_x = s->mb_x * 8 + mx;    src_y = s->mb_y * (8 >> field_based) + my;    src_x = clip(src_x, -8, s->width >> 1);    if (src_x == (s->width >> 1))        dxy &= ~1;    src_y = clip(src_y, -8, height >> 1);    if (src_y == (height >> 1))        dxy &= ~2;    offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);    ptr = ref_picture[1] + offset;    if(emu){        emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,                          src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);        ptr= s->edge_emu_buffer + (src_offset >> 1);    }    pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);    ptr = ref_picture[2] + offset;    if(emu){        emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,                          src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);        ptr= s->edge_emu_buffer + (src_offset >> 1);    }    pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);}static inline void qpel_motion(MpegEncContext *s,                               UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,                               int dest_offset,                               UINT8 **ref_picture, int src_offset,                               int field_based, op_pixels_func (*pix_op)[4],                               qpel_mc_func (*qpix_op)[16],                               int motion_x, int motion_y, int h){    UINT8 *ptr;    int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;    int emu=0;    dxy = ((motion_y & 3) << 2) | (motion_x & 3);    src_x = s->mb_x * 16 + (motion_x >> 2);    src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);    height = s->height >> field_based;    v_edge_pos = s->v_edge_pos >> field_based;    src_x = clip(src_x, -16, s->width);    if (src_x == s->width)        dxy &= ~3;    src_y = clip(src_y, -16, height);    if (src_y == height)        dxy &= ~12;    linesize = s->linesize << field_based;    uvlinesize = s->uvlinesize << field_based;    ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;    dest_y += dest_offset;//printf("%d %d %d\n", src_x, src_y, dxy);        if(s->flags&CODEC_FLAG_EMU_EDGE){        if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos                              || src_y + (motion_y&3) + h  > v_edge_pos){            emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based,                              src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);            ptr= s->edge_emu_buffer + src_offset;            emu=1;        }    }    if(!field_based)        qpix_op[0][dxy](dest_y, ptr, linesize);    else{        //damn interlaced mode        //FIXME boundary mirroring is not exactly correct here        qpix_op[1][dxy](dest_y  , ptr  , linesize);        qpix_op[1][dxy](dest_y+8, ptr+8, linesize);    }    if(s->flags&CODEC_FLAG_GRAY) return;    if(field_based){        mx= motion_x/2;        my= motion_y>>1;    }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){        mx= (motion_x>>1)|(motion_x&1);        my= (motion_y>>1)|(motion_y&1);    }else{        mx= motion_x/2;        my= motion_y/2;    }    mx= (mx>>1)|(mx&1);    my= (my>>1)|(my&1);    dxy= (mx&1) | ((my&1)<<1);    mx>>=1;    my>>=1;    src_x = s->mb_x * 8 + mx;    src_y = s->mb_y * (8 >> field_based) + my;    src_x = clip(src_x, -8, s->width >> 1);    if (src_x == (s->width >> 1))        dxy &= ~1;    src_y = clip(src_y, -8, height >> 1);    if (src_y == (height >> 1))        dxy &= ~2;    offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);    ptr = ref_picture[1] + offset;    if(emu){        emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,                          src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);        ptr= s->edge_emu_buffer + (src_offset >> 1);    }    pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr,  uvlinesize, h >> 1);        ptr = ref_picture[2] + offset;    if(emu){        emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,                          src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);        ptr= s->edge_emu_buffer + (src_offset >> 1);    }    pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr,  uvlinesize, h >> 1);}

⌨️ 快捷键说明

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