📄 mb_access.c
字号:
(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 + -