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

📄 vdec_idct.h

📁 vlc stand 0.1.99 ist sehr einfach
💻 H
字号:
/***************************************************************************** * vdec_idct.h : types for the inverse discrete cosine transform ***************************************************************************** * Copyright (C) 1999, 2000 VideoLAN * * Authors: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *  * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA. *****************************************************************************//***************************************************************************** * Requires: *  "config.h" *  "common.h" *  "threads.h" *  "video_parser.h" *****************************************************************************//***************************************************************************** * Common declarations *****************************************************************************/#ifndef VDEC_DFTtypedef short dctelem_t;#elsetypedef int dctelem_t;#endifstruct vdec_thread_s;#define SPARSE_SCALE_FACTOR 8#define DCTSIZE 8 /* 8*8 DCT *//***************************************************************************** *  Macros *****************************************************************************//* We assume that right shift corresponds to signed division by 2 with * rounding towards minus infinity.  This is correct for typical "arithmetic * shift" instructions that shift in copies of the sign bit.  But some * C compilers implement >> with an unsigned shift.  For these machines you * must define RIGHT_SHIFT_IS_UNSIGNED. * RIGHT_SHIFT provides a proper signed right shift of an s32 quantity. * It is only applied with constant shift counts.  SHIFT_TEMPS must be * included in the variables of any routine using RIGHT_SHIFT. */#ifdef RIGHT_SHIFT_IS_UNSIGNED#define SHIFT_TEMPS s32 shift_temp;#define RIGHT_SHIFT(x,shft)  \    ((shift_temp = (x)) < 0 ? \     (shift_temp >> (shft)) | ((~((s32) 0)) << (32-(shft))) : \     (shift_temp >> (shft)))#else#define SHIFT_TEMPS#define RIGHT_SHIFT(x,shft) ((x) >> (shft))#endif/* * A 2-D IDCT can be done by 1-D IDCT on each row followed by 1-D IDCT * on each column.  Direct algorithms are also available, but they are * much more complex and seem not to be any faster when reduced to code. * * The poop on this scaling stuff is as follows: * * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) * larger than the true IDCT outputs.  The final outputs are therefore * a factor of N larger than desired; since N=8 this can be cured by * a simple right shift at the end of the algorithm.  The advantage of * this arrangement is that we save two multiplications per 1-D IDCT, * because the y0 and y4 inputs need not be divided by sqrt(N). * * We have to do addition and subtraction of the integer inputs, which * is no problem, and multiplication by fractional constants, which is * a problem to do in integer arithmetic.  We multiply all the constants * by CONST_SCALE and convert them to integer constants (thus retaining * CONST_BITS bits of precision in the constants).  After doing a * multiplication we have to divide the product by CONST_SCALE, with proper * rounding, to produce the correct output.  This division can be done * cheaply as a right shift of CONST_BITS bits.  We postpone shifting * as long as possible so that partial sums can be added together with * full fractional precision. * * The outputs of the first pass are scaled up by PASS1_BITS bits so that * they are represented to better-than-integral precision.  These outputs * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word * with the recommended scaling.  (To scale up 12-bit sample data further, an * intermediate s32 array would be needed.) * * To avoid overflow of the 32-bit intermediate results in pass 2, we must * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis * shows that the values given below are the most effective. */#define CONST_BITS 8                         /* Jimmy chose this constant :) */#ifdef EIGHT_BIT_SAMPLES#define PASS1_BITS  2#else#define PASS1_BITS  1           /* lose a little precision to avoid overflow */#endif#define ONE     ((s32) 1)#define CONST_SCALE (ONE << CONST_BITS)/* Convert a positive real constant to an integer scaled by CONST_SCALE. * IMPORTANT: if your compiler doesn't do this arithmetic at compile time, * you will pay a significant penalty in run time.  In that case, figure * the correct integer constant values and insert them by hand. */#define FIX(x)  ((s32) ((x) * CONST_SCALE + 0.5))/* When adding two opposite-signed fixes, the 0.5 cancels */#define FIX2(x) ((s32) ((x) * CONST_SCALE))/* Descale and correctly round an s32 value that's scaled by N bits. * We assume RIGHT_SHIFT rounds towards minus infinity, so adding * the fudge factor is correct for either sign of X. */#define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)/* Multiply an s32 variable by an s32 constant to yield an s32 result. * For 8-bit samples with the recommended scaling, all the variable * and constant values involved are no more than 16 bits wide, so a * 16x16->32 bit multiply can be used instead of a full 32x32 multiply; * this provides a useful speedup on many machines. * There is no way to specify a 16x16->32 multiply in portable C, but * some C compilers will do the right thing if you provide the correct * combination of casts. * NB: for 12-bit samples, a full 32-bit multiplication will be needed. */#ifdef EIGHT_BIT_SAMPLES#ifdef SHORTxSHORT_32                        /* may work if 'int' is 32 bits */#define MULTIPLY(var,const)  (((INT16) (var)) * ((INT16) (const)))#endif#ifdef SHORTxLCONST_32                 /* known to work with Microsoft C 6.0 */#define MULTIPLY(var,const)  (((INT16) (var)) * ((s32) (const)))#endif#endif#ifndef MULTIPLY                                       /* default definition */#define MULTIPLY(var,const)  ((var) * (const))#endif/***************************************************************************** * Function pointers *****************************************************************************/typedef void (*f_idct_t)( struct vdec_thread_s *, dctelem_t*, int );/***************************************************************************** * Prototypes *****************************************************************************/void vdec_InitIDCT (struct vdec_thread_s * p_vdec);void vdec_SparseIDCT( struct vdec_thread_s *, dctelem_t*, int );void vdec_IDCT( struct vdec_thread_s *, dctelem_t*, int );

⌨️ 快捷键说明

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