/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*------------------------------------------------------------------------------ Table of contents 1. Include headers 2. External compiler flags 3. Module defines 4. Local function prototypes 5. Functions h264bsdInitMbNeighbours h264bsdGetNeighbourMb h264bsdNeighbour4x4BlockA h264bsdNeighbour4x4BlockB h264bsdNeighbour4x4BlockC h264bsdNeighbour4x4BlockD ------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ 1. Include headers ------------------------------------------------------------------------------*/ #include "h264bsd_neighbour.h" #include "h264bsd_util.h" /*------------------------------------------------------------------------------ 2. External compiler flags -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- 3. Module defines ------------------------------------------------------------------------------*/ /* Following four tables indicate neighbours of each block of a macroblock. * First 16 values are for luma blocks, next 4 values for Cb and last 4 * values for Cr. Elements of the table indicate to which macroblock the * neighbour block belongs and the index of the neighbour block in question. * Indexing of the blocks goes as follows * * Y Cb Cr * 0 1 4 5 16 17 20 21 * 2 3 6 7 18 19 22 23 * 8 9 12 13 * 10 11 14 15 */ /* left neighbour for each block */ static const neighbour_t N_A_4x4B[24] = { {MB_A,5}, {MB_CURR,0}, {MB_A,7}, {MB_CURR,2}, {MB_CURR,1}, {MB_CURR,4}, {MB_CURR,3}, {MB_CURR,6}, {MB_A,13}, {MB_CURR,8}, {MB_A,15}, {MB_CURR,10}, {MB_CURR,9}, {MB_CURR,12},{MB_CURR,11},{MB_CURR,14}, {MB_A,17}, {MB_CURR,16},{MB_A,19}, {MB_CURR,18}, {MB_A,21}, {MB_CURR,20},{MB_A,23}, {MB_CURR,22} }; /* above neighbour for each block */ static const neighbour_t N_B_4x4B[24] = { {MB_B,10}, {MB_B,11}, {MB_CURR,0}, {MB_CURR,1}, {MB_B,14}, {MB_B,15}, {MB_CURR,4}, {MB_CURR,5}, {MB_CURR,2}, {MB_CURR,3}, {MB_CURR,8}, {MB_CURR,9}, {MB_CURR,6}, {MB_CURR,7}, {MB_CURR,12},{MB_CURR,13}, {MB_B,18}, {MB_B,19}, {MB_CURR,16},{MB_CURR,17}, {MB_B,22}, {MB_B,23}, {MB_CURR,20},{MB_CURR,21} }; /* above-right neighbour for each block */ static const neighbour_t N_C_4x4B[24] = { {MB_B,11}, {MB_B,14}, {MB_CURR,1}, {MB_NA,4}, {MB_B,15}, {MB_C,10}, {MB_CURR,5}, {MB_NA,0}, {MB_CURR,3}, {MB_CURR,6}, {MB_CURR,9}, {MB_NA,12}, {MB_CURR,7}, {MB_NA,2}, {MB_CURR,13},{MB_NA,8}, {MB_B,19}, {MB_C,18}, {MB_CURR,17},{MB_NA,16}, {MB_B,23}, {MB_C,22}, {MB_CURR,21},{MB_NA,20} }; /* above-left neighbour for each block */ static const neighbour_t N_D_4x4B[24] = { {MB_D,15}, {MB_B,10}, {MB_A,5}, {MB_CURR,0}, {MB_B,11}, {MB_B,14}, {MB_CURR,1}, {MB_CURR,4}, {MB_A,7}, {MB_CURR,2}, {MB_A,13}, {MB_CURR,8}, {MB_CURR,3}, {MB_CURR,6}, {MB_CURR,9}, {MB_CURR,12}, {MB_D,19}, {MB_B,18}, {MB_A,17}, {MB_CURR,16}, {MB_D,23}, {MB_B,22}, {MB_A,21}, {MB_CURR,20} }; /*------------------------------------------------------------------------------ 4. Local function prototypes ------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ Function: h264bsdInitMbNeighbours Functional description: Initialize macroblock neighbours. Function sets neighbour macroblock pointers in macroblock structures to point to macroblocks on the left, above, above-right and above-left. Pointers are set NULL if the neighbour does not fit into the picture. Inputs: picWidth width of the picture in macroblocks picSizeInMbs no need to clarify Outputs: pMbStorage neighbour pointers of each mbStorage structure stored here Returns: none ------------------------------------------------------------------------------*/ void h264bsdInitMbNeighbours(mbStorage_t *pMbStorage, u32 picWidth, u32 picSizeInMbs) { /* Variables */ u32 i, row, col; /* Code */ ASSERT(pMbStorage); ASSERT(picWidth); ASSERT(picWidth <= picSizeInMbs); ASSERT(((picSizeInMbs / picWidth) * picWidth) == picSizeInMbs); row = col = 0; for (i = 0; i < picSizeInMbs; i++) { if (col) pMbStorage[i].mbA = pMbStorage + i - 1; else pMbStorage[i].mbA = NULL; if (row) pMbStorage[i].mbB = pMbStorage + i - picWidth; else pMbStorage[i].mbB = NULL; if (row && (col < picWidth - 1)) pMbStorage[i].mbC = pMbStorage + i - (picWidth - 1); else pMbStorage[i].mbC = NULL; if (row && col) pMbStorage[i].mbD = pMbStorage + i - (picWidth + 1); else pMbStorage[i].mbD = NULL; col++; if (col == picWidth) { col = 0; row++; } } } /*------------------------------------------------------------------------------ Function: h264bsdGetNeighbourMb Functional description: Get pointer to neighbour macroblock. Inputs: pMb pointer to macroblock structure of the macroblock whose neighbour is wanted neighbour indicates which neighbour is wanted Outputs: none Returns: pointer to neighbour macroblock NULL if not available ------------------------------------------------------------------------------*/ mbStorage_t* h264bsdGetNeighbourMb(mbStorage_t *pMb, neighbourMb_e neighbour) { /* Variables */ /* Code */ ASSERT((neighbour <= MB_CURR) || (neighbour == MB_NA)); if (neighbour == MB_A) return(pMb->mbA); else if (neighbour == MB_B) return(pMb->mbB); else if (neighbour == MB_C) return(pMb->mbC); else if (neighbour == MB_D) return(pMb->mbD); else if (neighbour == MB_CURR) return(pMb); else return(NULL); } /*------------------------------------------------------------------------------ Function: h264bsdNeighbour4x4BlockA Functional description: Get left neighbour of the block. Function returns pointer to the table defined in the beginning of the file. Inputs: blockIndex indicates the block whose neighbours are wanted Outputs: Returns: pointer to neighbour structure ------------------------------------------------------------------------------*/ const neighbour_t* h264bsdNeighbour4x4BlockA(u32 blockIndex) { /* Variables */ /* Code */ ASSERT(blockIndex < 24); return(N_A_4x4B+blockIndex); } /*------------------------------------------------------------------------------ Function: h264bsdNeighbour4x4BlockB Functional description: Get above neighbour of the block. Function returns pointer to the table defined in the beginning of the file. Inputs: blockIndex indicates the block whose neighbours are wanted Outputs: Returns: pointer to neighbour structure ------------------------------------------------------------------------------*/ const neighbour_t* h264bsdNeighbour4x4BlockB(u32 blockIndex) { /* Variables */ /* Code */ ASSERT(blockIndex < 24); return(N_B_4x4B+blockIndex); } /*------------------------------------------------------------------------------ Function: h264bsdNeighbour4x4BlockC Functional description: Get above-right neighbour of the block. Function returns pointer to the table defined in the beginning of the file. Inputs: blockIndex indicates the block whose neighbours are wanted Outputs: Returns: pointer to neighbour structure ------------------------------------------------------------------------------*/ const neighbour_t* h264bsdNeighbour4x4BlockC(u32 blockIndex) { /* Variables */ /* Code */ ASSERT(blockIndex < 24); return(N_C_4x4B+blockIndex); } /*------------------------------------------------------------------------------ Function: h264bsdNeighbour4x4BlockD Functional description: Get above-left neighbour of the block. Function returns pointer to the table defined in the beginning of the file. Inputs: blockIndex indicates the block whose neighbours are wanted Outputs: Returns: pointer to neighbour structure ------------------------------------------------------------------------------*/ const neighbour_t* h264bsdNeighbour4x4BlockD(u32 blockIndex) { /* Variables */ /* Code */ ASSERT(blockIndex < 24); return(N_D_4x4B+blockIndex); } /*------------------------------------------------------------------------------ Function: h264bsdIsNeighbourAvailable Functional description: Check if neighbour macroblock is available. Neighbour macroblock is considered available if it is within the picture and belongs to the same slice as the current macroblock. Inputs: pMb pointer to the current macroblock pNeighbour pointer to the neighbour macroblock Outputs: none Returns: TRUE neighbour is available FALSE neighbour is not available ------------------------------------------------------------------------------*/ u32 h264bsdIsNeighbourAvailable(mbStorage_t *pMb, mbStorage_t *pNeighbour) { /* Variables */ /* Code */ if ( (pNeighbour == NULL) || (pMb->sliceId != pNeighbour->sliceId) ) return(HANTRO_FALSE); else return(HANTRO_TRUE); }