/*! ************************************************************************ * \brief * Checks the availability of neighboring macroblocks of * the current macroblock for prediction and context determination; ************************************************************************ */ void CheckAvailabilityOfNeighbors() { const int mb_nr = img->current_mb_nr; Macroblock *currMB = &img->mb_data[mb_nr]; // mark all neighbors as unavailable currMB->mb_available_up = NULL; currMB->mb_available_left = NULL; if (img->MbaffFrameFlag) { currMB->mbAddrA = 2 * (mb_nr/2 - 1); currMB->mbAddrB = 2 * (mb_nr/2 - img->PicWidthInMbs); currMB->mbAddrC = 2 * (mb_nr/2 - img->PicWidthInMbs + 1); currMB->mbAddrD = 2 * (mb_nr/2 - img->PicWidthInMbs - 1); currMB->mbAvailA = mb_is_available(currMB->mbAddrA, mb_nr) && ((mb_nr/2 % img->PicWidthInMbs)!=0); currMB->mbAvailB = mb_is_available(currMB->mbAddrB, mb_nr); currMB->mbAvailC = mb_is_available(currMB->mbAddrC, mb_nr) && (((mb_nr/2 +1) % img->PicWidthInMbs)!=0); currMB->mbAvailD = mb_is_available(currMB->mbAddrD, mb_nr) && ((mb_nr/2 % img->PicWidthInMbs)!=0); } else { currMB->mbAddrA = mb_nr - 1; currMB->mbAddrB = mb_nr - img->PicWidthInMbs; currMB->mbAddrC = mb_nr - img->PicWidthInMbs + 1; currMB->mbAddrD = mb_nr - img->PicWidthInMbs - 1; currMB->mbAvailA = mb_is_available(currMB->mbAddrA, mb_nr) && ((mb_nr % img->PicWidthInMbs)!=0); currMB->mbAvailB = mb_is_available(currMB->mbAddrB, mb_nr); currMB->mbAvailC = mb_is_available(currMB->mbAddrC, mb_nr) && (((mb_nr+1) % img->PicWidthInMbs)!=0); currMB->mbAvailD = mb_is_available(currMB->mbAddrD, mb_nr) && ((mb_nr % img->PicWidthInMbs)!=0); } }
/*! ************************************************************************ * \brief * Checks the availability of neighboring macroblocks of * the current macroblock for prediction and context determination; ************************************************************************ */ void CheckAvailabilityOfNeighbors(Macroblock *currMB) { //VideoParameters *p_Vid = currMB->p_Vid; StorablePicture *dec_picture = currMB->p_Slice->dec_picture; //p_Vid->dec_picture; const int mb_nr = currMB->mbAddrX; if (dec_picture->mb_aff_frame_flag) { int cur_mb_pair = mb_nr >> 1; currMB->mbAddrA = 2 * (cur_mb_pair - 1); currMB->mbAddrB = 2 * (cur_mb_pair - dec_picture->PicWidthInMbs); currMB->mbAddrC = 2 * (cur_mb_pair - dec_picture->PicWidthInMbs + 1); currMB->mbAddrD = 2 * (cur_mb_pair - dec_picture->PicWidthInMbs - 1); currMB->mbAvailA = (Boolean) (mb_is_available(currMB->mbAddrA, currMB) && ((PicPos[cur_mb_pair ].x)!=0)); currMB->mbAvailB = (Boolean) (mb_is_available(currMB->mbAddrB, currMB)); currMB->mbAvailC = (Boolean) (mb_is_available(currMB->mbAddrC, currMB) && ((PicPos[cur_mb_pair + 1].x)!=0)); currMB->mbAvailD = (Boolean) (mb_is_available(currMB->mbAddrD, currMB) && ((PicPos[cur_mb_pair ].x)!=0)); }
/*! ************************************************************************ * \brief * Checks the availability of neighboring macroblocks of * the current macroblock for prediction and context determination; ************************************************************************ */ void CheckAvailabilityOfNeighbors(Macroblock *currMB) { const int mb_nr = currMB->mbAddrX; // mark all neighbors as unavailable currMB->mb_available_up = NULL; currMB->mb_available_left = NULL; if (img->MbaffFrameFlag) { int cur_mb_pair = mb_nr >> 1; currMB->mbAddrA = 2 * (cur_mb_pair - 1); currMB->mbAddrB = 2 * (cur_mb_pair - img->PicWidthInMbs); currMB->mbAddrC = 2 * (cur_mb_pair - img->PicWidthInMbs + 1); currMB->mbAddrD = 2 * (cur_mb_pair - img->PicWidthInMbs - 1); currMB->mbAvailA = mb_is_available(currMB->mbAddrA, currMB) && ((PicPos[cur_mb_pair ][0])!=0); currMB->mbAvailB = mb_is_available(currMB->mbAddrB, currMB); currMB->mbAvailC = mb_is_available(currMB->mbAddrC, currMB) && ((PicPos[cur_mb_pair + 1][0])!=0); currMB->mbAvailD = mb_is_available(currMB->mbAddrD, currMB) && ((PicPos[cur_mb_pair ][0])!=0); }
/*! ************************************************************************ * \brief * Checks the availability of neighboring macroblocks of * the current macroblock for prediction and context determination; ************************************************************************ */ void CheckAvailabilityOfNeighbors(Macroblock *currMB) { VideoParameters *p_Vid = currMB->p_Vid; const int mb_nr = currMB->mbAddrX; // mark all neighbors as unavailable currMB->mb_up = NULL; currMB->mb_left = NULL; if (p_Vid->mb_aff_frame_flag) { int cur_mb_pair = mb_nr >> 1; currMB->mbAddrA = 2 * (cur_mb_pair - 1); currMB->mbAddrB = 2 * (cur_mb_pair - p_Vid->PicWidthInMbs); currMB->mbAddrC = 2 * (cur_mb_pair - p_Vid->PicWidthInMbs + 1); currMB->mbAddrD = 2 * (cur_mb_pair - p_Vid->PicWidthInMbs - 1); currMB->mbAvailA = (byte) (mb_is_available(currMB->mbAddrA, currMB) && ((PicPos[cur_mb_pair ][0])!=0)); currMB->mbAvailB = (byte) (mb_is_available(currMB->mbAddrB, currMB)); currMB->mbAvailC = (byte) (mb_is_available(currMB->mbAddrC, currMB) && ((PicPos[cur_mb_pair + 1][0])!=0)); currMB->mbAvailD = (byte) (mb_is_available(currMB->mbAddrD, currMB) && ((PicPos[cur_mb_pair ][0])!=0)); }