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

📄 mb_access.c

📁 H.264编码解码器源码(c语言).zip
💻 C
📖 第 1 页 / 共 2 页
字号:
                  (pix->mb_addr)++;                   yM = yN>> 1;                }              }            }          }          else          {            // bottom            pix->mb_addr  = currMb->mbAddrA;            pix->available = currMb->mbAvailA;            if (currMb->mbAvailA)            {              if(!img->mb_data[currMb->mbAddrA].mb_field)              {                (pix->mb_addr)++;                 yM = yN;              }              else              {                if (yN %2 == 0)                {                   yM = (yN + maxWH) >> 1;                }                else                {                  (pix->mb_addr)++;                   yM = (yN + maxWH) >> 1;                }              }            }          }        }        else        {          // field          if (curr_mb_nr % 2 == 0)          {            // top            pix->mb_addr  = currMb->mbAddrA;            pix->available = currMb->mbAvailA;            if (currMb->mbAvailA)            {              if(!img->mb_data[currMb->mbAddrA].mb_field)              {                if (yN < (maxWH / 2))                {                   yM = yN << 1;                }                else                {                  (pix->mb_addr)++;                   yM = (yN << 1 ) - maxWH;                }              }              else              {                 yM = yN;              }            }          }          else          {            // bottom            pix->mb_addr  = currMb->mbAddrA;            pix->available = currMb->mbAvailA;            if (currMb->mbAvailA)            {              if(!img->mb_data[currMb->mbAddrA].mb_field)              {                if (yN < (maxWH / 2))                {                   yM = (yN << 1) + 1;                }                else                {                  (pix->mb_addr)++;                   yM = (yN << 1 ) + 1 - maxWH;                }              }              else              {                 (pix->mb_addr)++;                 yM = yN;              }            }          }        }      }    }  }  else  {    // xN >= 0    if ((xN >= 0)&&(xN <maxWH))    {      if (yN<0)      {        if (!currMb->mb_field)        {          //frame          if (curr_mb_nr % 2 == 0)          {            //top            pix->mb_addr  = currMb->mbAddrB + 1;            pix->available = currMb->mbAvailB;             yM      = yN;          }          else          {            // bottom            pix->mb_addr  = curr_mb_nr - 1;            pix->available = 1;             yM      = yN;          }        }        else        {          // field          if (curr_mb_nr % 2 == 0)          {            // top            pix->mb_addr  = currMb->mbAddrB;            pix->available = currMb->mbAvailB;            if (currMb->mbAvailB)            {              if(!img->mb_data[currMb->mbAddrB].mb_field)              {                (pix->mb_addr)++;                 yM = 2* yN;              }              else              {                 yM = yN;              }            }          }          else          {            // bottom            pix->mb_addr  = currMb->mbAddrB + 1;            pix->available = currMb->mbAvailB;             yM      = yN;          }        }      }      else      {        // yN >=0        if ((yN >= 0) && (yN <maxWH))        {          pix->mb_addr  = curr_mb_nr;          pix->available = 1;           yM      = yN;        }      }    }    else    {      // xN >= maxWH      if(yN < 0)      {        if (!currMb->mb_field)        {          // frame          if (curr_mb_nr % 2 == 0)          {            // top            pix->mb_addr  = currMb->mbAddrC + 1;            pix->available = currMb->mbAvailC;             yM      = yN;          }          else          {            // bottom            pix->available = 0;          }        }        else        {          // field          if (curr_mb_nr % 2 == 0)          {            // top            pix->mb_addr  = currMb->mbAddrC;            pix->available = currMb->mbAvailC;            if (currMb->mbAvailC)            {              if(!img->mb_data[currMb->mbAddrC].mb_field)              {                (pix->mb_addr)++;                 yM = 2* yN;              }              else              {                 yM = yN;              }            }          }          else          {            // bottom            pix->mb_addr  = currMb->mbAddrC + 1;            pix->available = currMb->mbAvailC;             yM      = yN;          }        }      }    }  }  if (pix->available)  {    pix->x = (xN + maxWH) % maxWH;    pix->y = (yM + maxWH) % maxWH;    get_mb_pos(pix->mb_addr, &(pix->pos_x), &(pix->pos_y));    if (luma)    {      pix->pos_x += pix->x;      pix->pos_y += pix->y;    }    else    {      pix->pos_x = (pix->pos_x/2) + pix->x;      pix->pos_y = (pix->pos_y/2) + pix->y;    }  }}/*! ************************************************************************ * \brief *    get neighbouring positions. MB AFF is automatically used from img structure * \param curr_mb_nr *   current macroblock number (decoding order) * \param xN *    input x position * \param yN *    input y position * \param luma *    1 if luma coding, 0 for chroma * \param pix *    returns position informations ************************************************************************ */void getNeighbour(int curr_mb_nr, int xN, int yN, int luma, PixelPos *pix){  if (img->MbaffFrameFlag)    getAffNeighbour(curr_mb_nr, xN, yN, luma, pix);  else    getNonAffNeighbour(curr_mb_nr, xN, yN, luma, pix);}/*! ************************************************************************ * \brief *    get neighbouring  get neighbouring 4x4 luma block * \param curr_mb_nr *   current macroblock number (decoding order) * \param block_x *    input x block position * \param block_y *    input y block position * \param rel_x *    relative x position of neighbor * \param rel_y *    relative y position of neighbor * \param pix *    returns position informations ************************************************************************ */void getLuma4x4Neighbour (int curr_mb_nr, int block_x, int block_y, int rel_x, int rel_y, PixelPos *pix){  int x = 4* block_x + rel_x;  int y = 4* block_y + rel_y;  getNeighbour(curr_mb_nr, x, y, 1, pix);  if (pix->available)  {    pix->x /= 4;    pix->y /= 4;    pix->pos_x /= 4;    pix->pos_y /= 4;  }}/*! ************************************************************************ * \brief *    get neighbouring 4x4 chroma block * \param curr_mb_nr *   current macroblock number (decoding order) * \param block_x *    input x block position * \param block_y *    input y block position * \param rel_x *    relative x position of neighbor * \param rel_y *    relative y position of neighbor * \param pix *    returns position informations ************************************************************************ */void getChroma4x4Neighbour (int curr_mb_nr, int block_x, int block_y, int rel_x, int rel_y, PixelPos *pix){  int x = 4* block_x + rel_x;  int y = 4* block_y + rel_y;  getNeighbour(curr_mb_nr, x, y, 0, pix);  if (pix->available)  {    pix->x /= 4;    pix->y /= 4;    pix->pos_x /= 4;    pix->pos_y /= 4;  }}

⌨️ 快捷键说明

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