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

📄 mpegvideo_common.h

📁 播放H264文件的播放器
💻 H
📖 第 1 页 / 共 3 页
字号:
/* * The simplest mpeg encoder (well, it was the simplest!) * Copyright (c) 2000,2001 Fabrice Bellard * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> * * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at> * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *//** * @file libavcodec/mpegvideo_common.h * The simplest mpeg encoder (well, it was the simplest!). */#ifndef AVCODEC_MPEGVIDEO_COMMON_H#define AVCODEC_MPEGVIDEO_COMMON_H#include <string.h>#include "avcodec.h"#include "dsputil.h"#include "mpegvideo.h"#include "mjpegenc.h"#include "msmpeg4.h"#include "faandct.h"#include <limits.h>int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);void  denoise_dct_c(MpegEncContext *s, DCTELEM *block);/** * allocates a Picture * The pixels are allocated/set by calling get_buffer() if shared=0 */int alloc_picture(MpegEncContext *s, Picture *pic, int shared);/** * sets the given MpegEncContext to common defaults (same for encoding and decoding). * the changed fields will not depend upon the prior state of the MpegEncContext. */void MPV_common_defaults(MpegEncContext *s);static _inline void gmc1_motion(MpegEncContext *s,                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,                               uint8_t **ref_picture){    uint8_t *ptr;    int offset, src_x, src_y, linesize, uvlinesize;    int motion_x, motion_y;    int emu=0;    motion_x= s->sprite_offset[0][0];    motion_y= s->sprite_offset[0][1];    src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));    src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));    motion_x<<=(3-s->sprite_warping_accuracy);    motion_y<<=(3-s->sprite_warping_accuracy);    src_x = av_clip(src_x, -16, s->width);    if (src_x == s->width)        motion_x =0;    src_y = av_clip(src_y, -16, s->height);    if (src_y == s->height)        motion_y =0;    linesize = s->linesize;    uvlinesize = s->uvlinesize;    ptr = ref_picture[0] + (src_y * linesize) + src_x;    if(s->flags&CODEC_FLAG_EMU_EDGE){        if(   (unsigned)src_x >= s->h_edge_pos - 17           || (unsigned)src_y >= s->v_edge_pos - 17){            ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);            ptr= s->edge_emu_buffer;        }    }    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(CONFIG_GRAY && 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 = av_clip(src_x, -8, s->width>>1);    if (src_x == s->width>>1)        motion_x =0;    src_y = av_clip(src_y, -8, s->height>>1);    if (src_y == s->height>>1)        motion_y =0;    offset = (src_y * uvlinesize) + src_x;    ptr = ref_picture[1] + offset;    if(s->flags&CODEC_FLAG_EMU_EDGE){        if(   (unsigned)src_x >= (s->h_edge_pos>>1) - 9           || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){            ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);            ptr= s->edge_emu_buffer;            emu=1;        }    }    s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);    ptr = ref_picture[2] + offset;    if(emu){        ff_emulated_edge_mc(s->edge_emu_buffer, 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, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);    return;}static _inline void gmc_motion(MpegEncContext *s,                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,                               uint8_t **ref_picture){    uint8_t *ptr;    int linesize, uvlinesize;    const int a= s->sprite_warping_accuracy;    int ox, oy;    linesize = s->linesize;    uvlinesize = s->uvlinesize;    ptr = ref_picture[0];    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(CONFIG_GRAY && s->flags&CODEC_FLAG_GRAY) return;    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];    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];    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 _inline int hpel_motion(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, op_pixels_func *pix_op,                                  int motion_x, int motion_y){    int dxy;    int emu=0;    dxy = ((motion_y & 1) << 1) | (motion_x & 1);    src_x += motion_x >> 1;    src_y += motion_y >> 1;    /* WARNING: do no forget half pels */    src_x = av_clip(src_x, -16, width); //FIXME unneeded for emu?    if (src_x == width)        dxy &= ~1;    src_y = av_clip(src_y, -16, height);    if (src_y == height)        dxy &= ~2;    src += src_y * stride + src_x;    if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){        if(   (unsigned)src_x > h_edge_pos - (motion_x&1) - w           || (unsigned)src_y > v_edge_pos - (motion_y&1) - 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, s->v_edge_pos);            src= s->edge_emu_buffer;            emu=1;        }    }    if(field_select)        src += s->linesize;    pix_op[dxy](dest, src, stride, h);    return emu;}static av_always_inlinevoid mpeg_motion_internal(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, op_pixels_func (*pix_op)[4],                 int motion_x, int motion_y, int h, int is_mpeg12){    uint8_t *ptr_y, *ptr_cb, *ptr_cr;    int dxy, uvdxy, mx, my, src_x, src_y,        uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;#if 0if(s->quarter_sample){    motion_x>>=1;    motion_y>>=1;}#endif    v_edge_pos = s->v_edge_pos >> field_based;    linesize   = s->current_picture.linesize[0] << field_based;    uvlinesize = s->current_picture.linesize[1] << field_based;    dxy = ((motion_y & 1) << 1) | (motion_x & 1);    src_x = s->mb_x* 16               + (motion_x >> 1);    src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);    if (!is_mpeg12 && s->out_format == FMT_H263) {        if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){            mx = (motion_x>>1)|(motion_x&1);            my = motion_y >>1;            uvdxy = ((my & 1) << 1) | (mx & 1);            uvsrc_x = s->mb_x* 8               + (mx >> 1);            uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);        }else{            uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);            uvsrc_x = src_x>>1;            uvsrc_y = src_y>>1;        }    }else if(!is_mpeg12 && s->out_format == FMT_H261){//even chroma mv's are full pel in H261        mx = motion_x / 4;        my = motion_y / 4;        uvdxy = 0;        uvsrc_x = s->mb_x*8 + mx;        uvsrc_y = s->mb_y*8 + my;    } else {        if(s->chroma_y_shift){            mx = motion_x / 2;            my = motion_y / 2;            uvdxy = ((my & 1) << 1) | (mx & 1);            uvsrc_x = s->mb_x* 8               + (mx >> 1);            uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);        } else {            if(s->chroma_x_shift){            //Chroma422                mx = motion_x / 2;                uvdxy = ((motion_y & 1) << 1) | (mx & 1);                uvsrc_x = s->mb_x* 8           + (mx >> 1);                uvsrc_y = src_y;            } else {            //Chroma444

⌨️ 快捷键说明

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