?? motion.h
字號:
/**************************************************************************
*
* XVID MPEG-4 VIDEO CODEC
* - Motion sad header -
*
* This program is an implementation of a part of one or more MPEG-4
* Video tools as specified in ISO/IEC 14496-2 standard. Those intending
* to use this software module in hardware or software products are
* advised that its use may infringe existing patents or copyrights, and
* any such use would be at such party's own risk. The original
* developer of this software module and his/her company, and subsequent
* editors and their companies, will have no liability for use of this
* software or modifications or derivatives thereof.
*
* 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-1307 USA
*
* $Id: motion.h,v 1.5 2002/06/14 13:26:47 Isibaar Exp $
*
***************************************************************************/
#ifndef _MOTION_SAD_H_
#define _MOTION_SAD_H_
#include "../portab.h"
#include "../global.h"
extern int first_P_seq;
extern int first_P_gop;
/*
* Calculate the min/max range (in halfpixels)
* relative to the _MACROBLOCK_ position
*/
static void __inline
get_range(int32_t * const min_dx,
int32_t * const max_dx,
int32_t * const min_dy,
int32_t * const max_dy,
const uint32_t x,
const uint32_t y,
const uint32_t block_sz, /* block dimension, 8 or 16 */
const uint32_t width,
const uint32_t height,
const uint32_t fcode)
{
/* fyh comment */
/*const int search_range = 32 << (fcode - 1);*/
const int search_range = 32;/* half pixel search range */
const int high = search_range - 1;
const int low = -search_range;
/* convert full-pixel measurements to half pixel */
const int hp_width = 2 * width;
const int hp_height = 2 * height;
const int hp_edge = 2 * block_sz;
/* we need _right end_ of block, not x-coordinate */
const int hp_x = 2 * (x) * block_sz;
/* same for _bottom end_ */
const int hp_y = 2 * (y) * block_sz;
*max_dx = min(high, hp_width - hp_x);
*max_dy = min(high, hp_height - hp_y);
*min_dx = max(low, -(hp_edge + hp_x));
*min_dy = max(low, -(hp_edge + hp_y));
}
/*
* getref: calculate reference image pointer
* the decision to use interpolation h/v/hv or the normal image is
* based on dx & dy.
*/
static __inline const uint8_t *
get_ref(const uint8_t * const refn,
const uint8_t * const refh,
const uint8_t * const refv,
const uint8_t * const refhv,
const uint32_t x,
const uint32_t y,
const uint32_t block, /* block dimension, 8 or 16 */
const int32_t dx,
const int32_t dy,
const uint32_t stride)
{
switch (((dx & 1) << 1) + (dy & 1)) { /* ((dx%2)?2:0)+((dy%2)?1:0) */
case 0:
return refn + (int) ((x * block + dx / 2) + (y * block + dy / 2) * stride);
case 1:
return refv + (int) ((x * block + dx / 2) + (y * block +
(dy - 1) / 2) * stride);
case 2:
return refh + (int) ((x * block + (dx - 1) / 2) + (y * block +
dy / 2) * stride);
default:
case 3:
return refhv + (int) ((x * block + (dx - 1) / 2) + (y * block +
(dy - 1) / 2) * stride);
}
}
#endif /* _MOTION_SAD_H_ */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -