www.pudn.com > lencod.rar > refbuf.c


/* 
*********************************************************************** 
* COPYRIGHT AND WARRANTY INFORMATION 
* 
* Copyright 2003, Advanced Audio Video Coding Standard, Part II 
* 
* DISCLAIMER OF WARRANTY 
* 
* These software programs are available to the users without any 
* license fee or royalty on an "as is" basis. The AVS disclaims 
* any and all warranties, whether express, implied, or statutory, 
* including any implied warranties of merchantability or of fitness 
* for a particular purpose. In no event shall the contributors or  
* the AVS be liable for any incidental, punitive, or consequential 
* damages of any kind whatsoever arising from the use of this program. 
* 
* This disclaimer of warranty extends to the user of this program 
* and user's customers, employees, agents, transferees, successors, 
* and assigns. 
* 
* The AVS does not represent or warrant that the program furnished 
* hereunder are free of infringement of any third-party patents. 
* Commercial implementations of AVS, including shareware, may be 
* subject to royalty fees to patent holders. Information regarding 
* the AVS patent policy is available from the AVS Web site at 
* http://www.avs.org.cn 
* 
* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE AVS PATENT POLICY. 
************************************************************************ 
*/ 
 
/* 
************************************************************************************* 
* File name:  
* Function:  
* 
************************************************************************************* 
*/ 
 
#include  
#include  
#include  
#include  
 
#include "refbuf.h" 
 
#define CACHELINESIZE 32 
 
static pel_t line[16]; 
 
/* 
************************************************************************* 
* Function:Reference buffer write routines 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
void PutPel_14 (pel_t **Pic, int y, int x, pel_t val) 
{ 
  Pic [IMG_PAD_SIZE*4+y][IMG_PAD_SIZE*4+x] = val; 
} 
 
/* 
************************************************************************* 
* Function:Reference buffer read, Full pel 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
pel_t *FastLineX (int dummy, pel_t* Pic, int y, int x) 
{ 
  return Pic + y*img->width + x; 
} 
 
/* 
************************************************************************* 
* Function: 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
pel_t *UMVLineX (int size, pel_t* Pic, int y, int x) 
{ 
  int i, maxx; 
  pel_t *Picy; 
 
  Picy = Pic + max(0,min(img->height-1,y)) * img->width; 
 
  if (x < 0)                            // Left edge 
  { 
    maxx = min(0,x+size); 
 
    for (i = x; i < maxx; i++) 
    { 
      line[i-x] = Picy [0];             // Replicate left edge pixel 
    } 
 
    maxx = x+size; 
 
    for (i = 0; i < maxx; i++)          // Copy non-edge pixels 
      line[i-x] = Picy [i]; 
  } 
  else if (x > img->width-size)         // Right edge 
  { 
    maxx = img->width; 
 
    for (i = x; i < maxx; i++) 
    { 
      line[i-x] = Picy [i];             // Copy non-edge pixels 
    } 
 
    maxx = x+size; 
 
    for (i = max(img->width,x); i < maxx; i++) 
    { 
      line[i-x] = Picy [img->width-1];  // Replicate right edge pixel 
    } 
  } 
  else                                  // No edge 
  { 
    return Picy + x; 
  } 
 
  return line; 
} 
 
/* 
************************************************************************* 
* Function:Reference buffer, 1/4 pel 
* Input: 
* Output: 
* Return:  
* Attention: 
************************************************************************* 
*/ 
 
pel_t UMVPelY_14 (pel_t **Pic, int y, int x) 
{ 
  int width4  = ((img->width+2*IMG_PAD_SIZE-1)<<2); 
  int height4 = ((img->height+2*IMG_PAD_SIZE-1)<<2); 
 
  x = x + IMG_PAD_SIZE*4; 
  y = y + IMG_PAD_SIZE*4; 
 
  if (x < 0) 
  { 
    if (y < 0) 
      return Pic [y&3][x&3]; 
    if (y > height4) 
      return Pic [height4+(y&3)][x&3]; 
    return Pic [y][x&3]; 
  } 
 
  if (x > width4) 
  { 
    if (y < 0) 
      return Pic [y&3][width4+(x&3)]; 
    if (y > height4) 
      return Pic [height4+(y&3)][width4+(x&3)]; 
    return Pic [y][width4+(x&3)]; 
  } 
 
  if (y < 0)    // note: corner pixels were already processed 
    return Pic [y&3][x]; 
  if (y > height4) 
    return Pic [height4+(y&3)][x]; 
 
  return Pic [y][x]; 
} 
 
pel_t FastPelY_14 (pel_t **Pic, int y, int x) 
{ 
  return Pic [IMG_PAD_SIZE*4+y][IMG_PAD_SIZE*4+x]; 
}