diff options
Diffstat (limited to 'media/libstagefright/codecs/avc/enc/src/avcenc_lib.h')
-rw-r--r-- | media/libstagefright/codecs/avc/enc/src/avcenc_lib.h | 1020 |
1 files changed, 0 insertions, 1020 deletions
diff --git a/media/libstagefright/codecs/avc/enc/src/avcenc_lib.h b/media/libstagefright/codecs/avc/enc/src/avcenc_lib.h deleted file mode 100644 index 17e28ef..0000000 --- a/media/libstagefright/codecs/avc/enc/src/avcenc_lib.h +++ /dev/null @@ -1,1020 +0,0 @@ -/* ------------------------------------------------------------------ - * Copyright (C) 1998-2009 PacketVideo - * - * 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. - * ------------------------------------------------------------------- - */ -/** -This file contains declarations of internal functions for AVC decoder library. -@publishedAll -*/ -#ifndef AVCENC_LIB_H_INCLUDED -#define AVCENC_LIB_H_INCLUDED - -#ifndef AVCLIB_COMMON_H_INCLUDED -#include "avclib_common.h" -#endif -#ifndef AVCENC_INT_H_INCLUDED -#include "avcenc_int.h" -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - /*------------- block.c -------------------------*/ - - /** - This function perform residue calculation, transform, quantize, inverse quantize, - inverse transform and residue compensation on a 4x4 block. - \param "encvid" "Pointer to AVCEncObject." - \param "blkidx" "raster scan block index of the current 4x4 block." - \param "cur" "Pointer to the reconstructed block." - \param "org" "Pointer to the original block." - \param "coef_cost" "Pointer to the coefficient cost to be filled in and returned." - \return "Number of non-zero coefficients." - */ - int dct_luma(AVCEncObject *encvid, int blkidx, uint8 *cur, uint8 *org, int *coef_cost); - - /** - This function performs IDCT on an INTER macroblock. - \param "video" "Pointer to AVCCommonObj." - \param "curL" "Pointer to the origin of the macroblock on the current frame." - \param "currMB" "Pointer to the AVCMacroblock structure." - \param "picPitch" "Pitch of the current frame." - \return "void". - */ - void MBInterIdct(AVCCommonObj *video, uint8 *curL, AVCMacroblock *currMB, int picPitch); - - /** - This function perform residue calculation, transform, quantize, inverse quantize, - inverse transform and residue compensation on a macroblock. - \param "encvid" "Pointer to AVCEncObject." - \param "curL" "Pointer to the reconstructed MB." - \param "orgL" "Pointer to the original MB." - \return "void" - */ - void dct_luma_16x16(AVCEncObject *encvid, uint8 *curL, uint8 *orgL); - - /** - This function perform residue calculation, transform, quantize, inverse quantize, - inverse transform and residue compensation for chroma components of an MB. - \param "encvid" "Pointer to AVCEncObject." - \param "curC" "Pointer to the reconstructed MB." - \param "orgC" "Pointer to the original MB." - \param "cr" "Flag whether it is Cr or not." - \return "void" - */ - void dct_chroma(AVCEncObject *encvid, uint8 *curC, uint8 *orgC, int cr); - - /*----------- init.c ------------------*/ - /** - This function interprets the encoding parameters provided by users in encParam. - The results are kept in AVCEncObject, AVCSeqParamSet, AVCPicParamSet and AVCSliceHeader. - \param "encvid" "Pointer to AVCEncObject." - \param "encParam" "Pointer to AVCEncParam." - \param "extSPS" "External SPS template to be followed. NULL if not present." - \param "extPPS" "External PPS template to be followed. NULL if not present." - \return "see AVCEnc_Status." - */ - AVCEnc_Status SetEncodeParam(AVCHandle *avcHandle, AVCEncParams *encParam, - void *extSPS, void *extPPS); - - /** - This function verifies the encoding parameters whether they meet the set of supported - tool by a specific profile. If the profile is not set, it will just find the closest - profile instead of verifying it. - \param "video" "Pointer to AVCEncObject." - \param "seqParam" "Pointer to AVCSeqParamSet." - \param "picParam" "Pointer to AVCPicParamSet." - \return "AVCENC_SUCCESS if success, - AVCENC_PROFILE_NOT_SUPPORTED if the specified profile - is not supported by this version of the library, - AVCENC_TOOLS_NOT_SUPPORTED if any of the specified encoding tools are - not supported by the user-selected profile." - */ - AVCEnc_Status VerifyProfile(AVCEncObject *video, AVCSeqParamSet *seqParam, AVCPicParamSet *picParam); - - /** - This function verifies the encoding parameters whether they meet the requirement - for a specific level. If the level is not set, it will just find the closest - level instead of verifying it. - \param "video" "Pointer to AVCEncObject." - \param "seqParam" "Pointer to AVCSeqParamSet." - \param "picParam" "Pointer to AVCPicParamSet." - \return "AVCENC_SUCCESS if success, - AVCENC_LEVEL_NOT_SUPPORTED if the specified level - is not supported by this version of the library, - AVCENC_LEVEL_FAIL if any of the encoding parameters exceed - the range of the user-selected level." - */ - AVCEnc_Status VerifyLevel(AVCEncObject *video, AVCSeqParamSet *seqParam, AVCPicParamSet *picParam); - - /** - This funciton initializes the frame encoding by setting poc/frame_num related parameters. it - also performs motion estimation. - \param "encvid" "Pointer to the AVCEncObject." - \return "AVCENC_SUCCESS if success, AVCENC_NO_PICTURE if there is no input picture - in the queue to encode, AVCENC_POC_FAIL or AVCENC_CONSECUTIVE_NONREF for POC - related errors, AVCENC_NEW_IDR if new IDR is detected." - */ - AVCEnc_Status InitFrame(AVCEncObject *encvid); - - /** - This function initializes slice header related variables and other variables necessary - for decoding one slice. - \param "encvid" "Pointer to the AVCEncObject." - \return "AVCENC_SUCCESS if success." - */ - AVCEnc_Status InitSlice(AVCEncObject *encvid); - - /*----------- header.c ----------------*/ - /** - This function performs bitstream encoding of the sequence parameter set NAL. - \param "encvid" "Pointer to the AVCEncObject." - \param "stream" "Pointer to AVCEncBitstream." - \return "AVCENC_SUCCESS if success or AVCENC_SPS_FAIL or others for unexpected failure which - should not occur. The SPS parameters should all be verified before this function is called." - */ - AVCEnc_Status EncodeSPS(AVCEncObject *encvid, AVCEncBitstream *stream); - - /** - This function encodes the VUI parameters into the sequence parameter set bitstream. - \param "stream" "Pointer to AVCEncBitstream." - \param "vui" "Pointer to AVCVUIParams." - \return "nothing." - */ - void EncodeVUI(AVCEncBitstream* stream, AVCVUIParams* vui); - - /** - This function encodes HRD parameters into the sequence parameter set bitstream - \param "stream" "Pointer to AVCEncBitstream." - \param "hrd" "Pointer to AVCHRDParams." - \return "nothing." - */ - void EncodeHRD(AVCEncBitstream* stream, AVCHRDParams* hrd); - - - /** - This function performs bitstream encoding of the picture parameter set NAL. - \param "encvid" "Pointer to the AVCEncObject." - \param "stream" "Pointer to AVCEncBitstream." - \return "AVCENC_SUCCESS if success or AVCENC_PPS_FAIL or others for unexpected failure which - should not occur. The SPS parameters should all be verified before this function is called." - */ - AVCEnc_Status EncodePPS(AVCEncObject *encvid, AVCEncBitstream *stream); - - /** - This function encodes slice header information which has been initialized or fabricated - prior to entering this funciton. - \param "encvid" "Pointer to the AVCEncObject." - \param "stream" "Pointer to AVCEncBitstream." - \return "AVCENC_SUCCESS if success or bitstream fail statuses." - */ - AVCEnc_Status EncodeSliceHeader(AVCEncObject *encvid, AVCEncBitstream *stream); - - /** - This function encodes reference picture list reordering relted syntax. - \param "video" "Pointer to AVCCommonObj." - \param "stream" "Pointer to AVCEncBitstream." - \param "sliceHdr" "Pointer to AVCSliceHdr." - \param "slice_type" "Value of slice_type - 5 if greater than 5." - \return "AVCENC_SUCCESS for success and AVCENC_FAIL otherwise." - */ - AVCEnc_Status ref_pic_list_reordering(AVCCommonObj *video, AVCEncBitstream *stream, AVCSliceHeader *sliceHdr, int slice_type); - - /** - This function encodes dec_ref_pic_marking related syntax. - \param "video" "Pointer to AVCCommonObj." - \param "stream" "Pointer to AVCEncBitstream." - \param "sliceHdr" "Pointer to AVCSliceHdr." - \return "AVCENC_SUCCESS for success and AVCENC_FAIL otherwise." - */ - AVCEnc_Status dec_ref_pic_marking(AVCCommonObj *video, AVCEncBitstream *stream, AVCSliceHeader *sliceHdr); - - /** - This function initializes the POC related variables and the POC syntax to be encoded - to the slice header derived from the disp_order and is_reference flag of the original - input frame to be encoded. - \param "video" "Pointer to the AVCEncObject." - \return "AVCENC_SUCCESS if success, - AVCENC_POC_FAIL if the poc type is undefined or - AVCENC_CONSECUTIVE_NONREF if there are consecutive non-reference frame for POC type 2." - */ - AVCEnc_Status InitPOC(AVCEncObject *video); - - /** - This function performs POC related operation after a picture is decoded. - \param "video" "Pointer to AVCCommonObj." - \return "AVCENC_SUCCESS" - */ - AVCEnc_Status PostPOC(AVCCommonObj *video); - - /*----------- bitstream_io.c ----------------*/ - /** - This function initializes the bitstream structure with the information given by - the users. - \param "bitstream" "Pointer to the AVCEncBitstream structure." - \param "buffer" "Pointer to the unsigned char buffer for output." - \param "buf_size" "The size of the buffer in bytes." - \param "overrunBuffer" "Pointer to extra overrun buffer." - \param "oBSize" "Size of overrun buffer in bytes." - \return "AVCENC_SUCCESS if success, AVCENC_BITSTREAM_INIT_FAIL if fail" - */ - AVCEnc_Status BitstreamEncInit(AVCEncBitstream *bitstream, uint8 *buffer, int buf_size, - uint8 *overrunBuffer, int oBSize); - - /** - This function writes the data from the cache into the bitstream buffer. It also adds the - emulation prevention code if necessary. - \param "stream" "Pointer to the AVCEncBitstream structure." - \return "AVCENC_SUCCESS if success or AVCENC_BITSTREAM_BUFFER_FULL if fail." - */ - AVCEnc_Status AVCBitstreamSaveWord(AVCEncBitstream *stream); - - /** - This function writes the codeword into the cache which will eventually be written to - the bitstream buffer. - \param "stream" "Pointer to the AVCEncBitstream structure." - \param "nBits" "Number of bits in the codeword." - \param "code" "The codeword." - \return "AVCENC_SUCCESS if success or AVCENC_BITSTREAM_BUFFER_FULL if fail." - */ - AVCEnc_Status BitstreamWriteBits(AVCEncBitstream *stream, int nBits, uint code); - - /** - This function writes one bit of data into the cache which will eventually be written - to the bitstream buffer. - \param "stream" "Pointer to the AVCEncBitstream structure." - \param "code" "The codeword." - \return "AVCENC_SUCCESS if success or AVCENC_BITSTREAM_BUFFER_FULL if fail." - */ - AVCEnc_Status BitstreamWrite1Bit(AVCEncBitstream *stream, uint code); - - /** - This function adds trailing bits to the bitstream and reports back the final EBSP size. - \param "stream" "Pointer to the AVCEncBitstream structure." - \param "nal_size" "Output the final NAL size." - \return "AVCENC_SUCCESS if success or AVCENC_BITSTREAM_BUFFER_FULL if fail." - */ - AVCEnc_Status BitstreamTrailingBits(AVCEncBitstream *bitstream, uint *nal_size); - - /** - This function checks whether the current bit position is byte-aligned or not. - \param "stream" "Pointer to the bitstream structure." - \return "true if byte-aligned, false otherwise." - */ - bool byte_aligned(AVCEncBitstream *stream); - - - /** - This function checks the availability of overrun buffer and switches to use it when - normal bufffer is not big enough. - \param "stream" "Pointer to the bitstream structure." - \param "numExtraBytes" "Number of extra byte needed." - \return "AVCENC_SUCCESS or AVCENC_FAIL." - */ - AVCEnc_Status AVCBitstreamUseOverrunBuffer(AVCEncBitstream* stream, int numExtraBytes); - - - /*-------------- intra_est.c ---------------*/ - - /** This function performs intra/inter decision based on ABE. - \param "encvid" "Pointer to AVCEncObject." - \param "min_cost" "Best inter cost." - \param "curL" "Pointer to the current MB origin in reconstructed frame." - \param "picPitch" "Pitch of the reconstructed frame." - \return "Boolean for intra mode." - */ - -//bool IntraDecisionABE(AVCEncObject *encvid, int min_cost, uint8 *curL, int picPitch); - bool IntraDecision(int *min_cost, uint8 *cur, int pitch, bool ave); - - /** - This function performs intra prediction mode search. - \param "encvid" "Pointer to AVCEncObject." - \param "mbnum" "Current MB number." - \param "curL" "Pointer to the current MB origin in reconstructed frame." - \param "picPitch" "Pitch of the reconstructed frame." - \return "void." - */ - void MBIntraSearch(AVCEncObject *encvid, int mbnum, uint8 *curL, int picPitch); - - /** - This function generates all the I16 prediction modes for an MB and keep it in - encvid->pred_i16. - \param "encvid" "Pointer to AVCEncObject." - \return "void" - */ - void intrapred_luma_16x16(AVCEncObject *encvid); - - /** - This function calculate the cost of all I16 modes and compare them to get the minimum. - \param "encvid" "Pointer to AVCEncObject." - \param "orgY" "Pointer to the original luma MB." - \param "min_cost" "Pointer to the minimal cost so-far." - \return "void" - */ - void find_cost_16x16(AVCEncObject *encvid, uint8 *orgY, int *min_cost); - - /** - This function calculates the cost of each I16 mode. - \param "org" "Pointer to the original luma MB." - \param "org_pitch" "Stride size of the original frame." - \param "pred" "Pointer to the prediction values." - \param "min_cost" "Minimal cost so-far." - \return "Cost" - */ - - int cost_i16(uint8 *org, int org_pitch, uint8 *pred, int min_cost); - - /** - This function generates all the I4 prediction modes and select the best one - for all the blocks inside a macroblock.It also calls dct_luma to generate the reconstructed - MB, and transform coefficients to be encoded. - \param "encvid" "Pointer to AVCEncObject." - \param "min_cost" "Pointer to the minimal cost so-far." - \return "void" - */ - void mb_intra4x4_search(AVCEncObject *encvid, int *min_cost); - - /** - This function calculates the most probable I4 mode of a given 4x4 block - from neighboring informationaccording to AVC/H.264 standard. - \param "video" "Pointer to AVCCommonObj." - \param "blkidx" "The current block index." - \return "Most probable mode." - */ - int FindMostProbableI4Mode(AVCCommonObj *video, int blkidx); - - /** - This function is where a lot of actions take place in the 4x4 block level inside - mb_intra4x4_search. - \param "encvid" "Pointer to AVCEncObject." - \param "blkidx" "The current 4x4 block index." - \param "cur" "Pointer to the reconstructed block." - \param "org" "Pointer to the original block." - \return "Minimal cost, also set currMB->i4Mode" - */ - int blk_intra4x4_search(AVCEncObject *encvid, int blkidx, uint8 *cur, uint8 *org); - - /** - This function calculates the cost of a given I4 prediction mode. - \param "org" "Pointer to the original block." - \param "org_pitch" "Stride size of the original frame." - \param "pred" "Pointer to the prediction block. (encvid->pred_i4)" - \param "cost" "Pointer to the minimal cost (to be updated)." - \return "void" - */ - void cost_i4(uint8 *org, int org_pitch, uint8 *pred, uint16 *cost); - - /** - This function performs chroma intra search. Each mode is saved in encvid->pred_ic. - \param "encvid" "Pointer to AVCEncObject." - \return "void" - */ - void chroma_intra_search(AVCEncObject *encvid); - - /** - This function calculates the cost of a chroma prediction mode. - \param "orgCb" "Pointer to the original Cb block." - \param "orgCr" "Pointer to the original Cr block." - \param "org_pitch" "Stride size of the original frame." - \param "pred" "Pointer to the prediction block (encvid->pred_ic)" - \param "mincost" "Minimal cost so far." - \return "Cost." - */ - - int SATDChroma(uint8 *orgCb, uint8 *orgCr, int org_pitch, uint8 *pred, int mincost); - - /*-------------- motion_comp.c ---------------*/ - - /** - This is a main function to peform inter prediction. - \param "encvid" "Pointer to AVCEncObject." - \param "video" "Pointer to AVCCommonObj." - \return "void". - */ - void AVCMBMotionComp(AVCEncObject *encvid, AVCCommonObj *video); - - - /** - This function is called for luma motion compensation. - \param "ref" "Pointer to the origin of a reference luma." - \param "picwidth" "Width of the picture." - \param "picheight" "Height of the picture." - \param "x_pos" "X-coordinate of the predicted block in quarter pel resolution." - \param "y_pos" "Y-coordinate of the predicted block in quarter pel resolution." - \param "pred" "Pointer to the output predicted block." - \param "pred_pitch" "Width of pred." - \param "blkwidth" "Width of the current partition." - \param "blkheight" "Height of the current partition." - \return "void" - */ - void eLumaMotionComp(uint8 *ref, int picwidth, int picheight, - int x_pos, int y_pos, - uint8 *pred, int pred_pitch, - int blkwidth, int blkheight); - - void eFullPelMC(uint8 *in, int inwidth, uint8 *out, int outpitch, - int blkwidth, int blkheight); - - void eHorzInterp1MC(uint8 *in, int inpitch, uint8 *out, int outpitch, - int blkwidth, int blkheight, int dx); - - void eHorzInterp2MC(int *in, int inpitch, uint8 *out, int outpitch, - int blkwidth, int blkheight, int dx); - - void eHorzInterp3MC(uint8 *in, int inpitch, int *out, int outpitch, - int blkwidth, int blkheight); - - void eVertInterp1MC(uint8 *in, int inpitch, uint8 *out, int outpitch, - int blkwidth, int blkheight, int dy); - - void eVertInterp2MC(uint8 *in, int inpitch, int *out, int outpitch, - int blkwidth, int blkheight); - - void eVertInterp3MC(int *in, int inpitch, uint8 *out, int outpitch, - int blkwidth, int blkheight, int dy); - - void eDiagonalInterpMC(uint8 *in1, uint8 *in2, int inpitch, - uint8 *out, int outpitch, - int blkwidth, int blkheight); - - void eChromaMotionComp(uint8 *ref, int picwidth, int picheight, - int x_pos, int y_pos, uint8 *pred, int pred_pitch, - int blkwidth, int blkheight); - - void eChromaDiagonalMC_SIMD(uint8 *pRef, int srcPitch, int dx, int dy, - uint8 *pOut, int predPitch, int blkwidth, int blkheight); - - void eChromaHorizontalMC_SIMD(uint8 *pRef, int srcPitch, int dx, int dy, - uint8 *pOut, int predPitch, int blkwidth, int blkheight); - - void eChromaVerticalMC_SIMD(uint8 *pRef, int srcPitch, int dx, int dy, - uint8 *pOut, int predPitch, int blkwidth, int blkheight); - - void eChromaFullMC_SIMD(uint8 *pRef, int srcPitch, int dx, int dy, - uint8 *pOut, int predPitch, int blkwidth, int blkheight); - - void eChromaVerticalMC2_SIMD(uint8 *pRef, int srcPitch, int dx, int dy, - uint8 *pOut, int predPitch, int blkwidth, int blkheight); - - void eChromaHorizontalMC2_SIMD(uint8 *pRef, int srcPitch, int dx, int dy, - uint8 *pOut, int predPitch, int blkwidth, int blkheight); - - void eChromaDiagonalMC2_SIMD(uint8 *pRef, int srcPitch, int dx, int dy, - uint8 *pOut, int predPitch, int blkwidth, int blkheight); - - - /*-------------- motion_est.c ---------------*/ - - /** - Allocate and initialize arrays necessary for motion search algorithm. - \param "envid" "Pointer to AVCEncObject." - \return "AVC_SUCCESS or AVC_MEMORY_FAIL." - */ - AVCEnc_Status InitMotionSearchModule(AVCHandle *avcHandle); - - /** - Clean up memory allocated in InitMotionSearchModule. - \param "envid" "Pointer to AVCEncObject." - \return "void." - */ - void CleanMotionSearchModule(AVCHandle *avcHandle); - - - /** - This function performs motion estimation of all macroblocks in a frame during the InitFrame. - The goal is to find the best MB partition for inter and find out if intra search is needed for - any MBs. This intra MB tendency can be used for scene change detection. - \param "encvid" "Pointer to AVCEncObject." - \return "void" - */ - void AVCMotionEstimation(AVCEncObject *encvid); - - /** - This function performs repetitive edge padding to the reference picture by adding 16 pixels - around the luma and 8 pixels around the chromas. - \param "refPic" "Pointer to the reference picture." - \return "void" - */ - void AVCPaddingEdge(AVCPictureData *refPic); - - /** - This function keeps track of intra refresh macroblock locations. - \param "encvid" "Pointer to the global array structure AVCEncObject." - \param "mblock" "Pointer to the array of AVCMacroblock structures." - \param "totalMB" "Total number of MBs in a frame." - \param "numRefresh" "Number of MB to be intra refresh in a single frame." - \return "void" - */ - void AVCRasterIntraUpdate(AVCEncObject *encvid, AVCMacroblock *mblock, int totalMB, int numRefresh); - -#ifdef HTFM - void InitHTFM(VideoEncData *encvid, HTFM_Stat *htfm_stat, double *newvar, int *collect); - void UpdateHTFM(AVCEncObject *encvid, double *newvar, double *exp_lamda, HTFM_Stat *htfm_stat); - void CalcThreshold(double pf, double exp_lamda[], int nrmlz_th[]); - void HTFMPrepareCurMB_AVC(AVCEncObject *encvid, HTFM_Stat *htfm_stat, uint8 *cur, int pitch); -#endif - - /** - This function reads the input MB into a smaller faster memory space to minimize the cache miss. - \param "encvid" "Pointer to the global AVCEncObject." - \param "cur" "Pointer to the original input macroblock." - \param "pitch" "Stride size of the input frame (luma)." - \return "void" - */ - void AVCPrepareCurMB(AVCEncObject *encvid, uint8 *cur, int pitch); - - /** - Performs motion vector search for a macroblock. - \param "encvid" "Pointer to AVCEncObject structure." - \param "cur" "Pointer to the current macroblock in the input frame." - \param "best_cand" "Array of best candidates (to be filled in and returned)." - \param "i0" "X-coordinate of the macroblock." - \param "j0" "Y-coordinate of the macroblock." - \param "type_pred" "Indicates the type of operations." - \param "FS_en" "Flag for fullsearch enable." - \param "hp_guess" "Guess for half-pel search." - \return "void" - */ - void AVCMBMotionSearch(AVCEncObject *encvid, uint8 *cur, uint8 *best_cand[], - int i0, int j0, int type_pred, int FS_en, int *hp_guess); - -//AVCEnc_Status AVCMBMotionSearch(AVCEncObject *encvid, AVCMacroblock *currMB, int mbNum, -// int num_pass); - - /** - Perform full-pel exhaustive search around the predicted MV. - \param "encvid" "Pointer to AVCEncObject structure." - \param "prev" "Pointer to the reference frame." - \param "cur" "Pointer to the input macroblock." - \param "imin" "Pointer to minimal mv (x)." - \param "jmin" "Pointer to minimal mv (y)." - \param "ilow, ihigh, jlow, jhigh" "Lower bound on search range." - \param "cmvx, cmvy" "Predicted MV value." - - \return "The cost function of the best candidate." - */ - int AVCFullSearch(AVCEncObject *encvid, uint8 *prev, uint8 *cur, - int *imin, int *jmin, int ilow, int ihigh, int jlow, int jhigh, - int cmvx, int cmvy); - - /** - Select candidates from neighboring blocks according to the type of the - prediction selection. - \param "mvx" "Pointer to the candidate, x-coordinate." - \param "mvy" "Pointer to the candidate, y-coordinate." - \param "num_can" "Pointer to the number of candidates returned." - \param "imb" "The MB index x-coordinate." - \param "jmb" "The MB index y-coordinate." - \param "type_pred" "Type of the prediction." - \param "cmvx, cmvy" "Pointer to predicted MV (modified version)." - \return "void." - */ - void AVCCandidateSelection(int *mvx, int *mvy, int *num_can, int imb, int jmb, - AVCEncObject *encvid, int type_pred, int *cmvx, int *cmvy); - - /** - Utility function to move the values in the array dn according to the new - location to avoid redundant calculation. - \param "dn" "Array of integer of size 9." - \param "new_loc" "New location index." - \return "void." - */ - void AVCMoveNeighborSAD(int dn[], int new_loc); - - /** - Find minimum index of dn. - \param "dn" "Array of integer of size 9." - \return "The index of dn with the smallest dn[] value." - */ - int AVCFindMin(int dn[]); - - - /*------------- findhalfpel.c -------------------*/ - - /** - Search for the best half-pel resolution MV around the full-pel MV. - \param "encvid" "Pointer to the global AVCEncObject structure." - \param "cur" "Pointer to the current macroblock." - \param "mot" "Pointer to the AVCMV array of the frame." - \param "ncand" "Pointer to the origin of the fullsearch result." - \param "xpos" "The current MB position in x." - \param "ypos" "The current MB position in y." - \param "hp_guess" "Input to help speedup the search." - \param "cmvx, cmvy" "Predicted motion vector use for mvcost." - \return "Minimal cost (SATD) without MV cost. (for rate control purpose)" - */ - int AVCFindHalfPelMB(AVCEncObject *encvid, uint8 *cur, AVCMV *mot, uint8 *ncand, - int xpos, int ypos, int hp_guess, int cmvx, int cmvy); - - /** - This function generates sub-pel pixels required to do subpel MV search. - \param "subpel_pred" "Pointer to 2-D array, each array for each position." - \param "ncand" "Pointer to the full-pel center position in ref frame." - \param "lx" "Pitch of the ref frame." - \return "void" - */ - void GenerateHalfPelPred(uint8 *subpel_pred, uint8 *ncand, int lx); - - /** - This function calculate vertical interpolation at half-point of size 4x17. - \param "dst" "Pointer to destination." - \param "ref" "Pointer to the starting reference pixel." - \return "void." - */ - void VertInterpWClip(uint8 *dst, uint8 *ref); - - /** - This function generates quarter-pel pixels around the best half-pel result - during the sub-pel MV search. - \param "bilin_base" "Array of pointers to be used as basis for q-pel interp." - \param "qpel_pred" "Array of pointers pointing to quarter-pel candidates." - \param "hpel_pos" "Best half-pel position at the center." - \return "void" - */ - void GenerateQuartPelPred(uint8 **bilin_base, uint8 *qpel_pred, int hpel_pos); - - /** - This function calculates the SATD of a subpel candidate. - \param "cand" "Pointer to a candidate." - \param "cur" "Pointer to the current block." - \param "dmin" "Min-so-far SATD." - \return "Sum of Absolute Transformed Difference." - */ - int SATD_MB(uint8 *cand, uint8 *cur, int dmin); - - /*------------- rate_control.c -------------------*/ - - /** This function is a utility function. It returns average QP of the previously encoded frame. - \param "rateCtrl" "Pointer to AVCRateControl structure." - \return "Average QP." - */ - int GetAvgFrameQP(AVCRateControl *rateCtrl); - - /** - This function takes the timestamp of the input and determine whether it should be encoded - or skipped. - \param "encvid" "Pointer to the AVCEncObject structure." - \param "rateCtrl" "Pointer to the AVCRateControl structure." - \param "modTime" "The 32 bit timestamp of the input frame." - \param "frameNum" "Pointer to the frame number if to be encoded." - \return "AVC_SUCCESS or else." - */ - AVCEnc_Status RCDetermineFrameNum(AVCEncObject *encvid, AVCRateControl *rateCtrl, uint32 modTime, uint *frameNum); - - /** - This function updates the buffer fullness when frames are dropped either by the - rate control algorithm or by the users to make sure that target bit rate is still met. - \param "video" "Pointer to the common object structure." - \param "rateCtrl" "Pointer to rate control structure." - \param "frameInc" "Difference of the current frame number and previous frame number." - \return "void." - */ - void RCUpdateBuffer(AVCCommonObj *video, AVCRateControl *rateCtrl, int frameInc); - - /** - This function initializes rate control module and allocates necessary bufferes to do the job. - \param "avcHandle" "Pointer to the encoder handle." - \return "AVCENC_SUCCESS or AVCENC_MEMORY_FAIL." - */ - AVCEnc_Status InitRateControlModule(AVCHandle *avcHandle); - - /** - This function frees buffers allocated in InitRateControlModule. - \param "avcHandle" "Pointer to the encoder handle." - \return "void." - */ - void CleanupRateControlModule(AVCHandle *avcHandle); - - /** - This function is called at the beginning of each GOP or the first IDR frame. It calculates - target bits for a GOP. - \param "encvid" "Pointer to the encoder object." - \return "void." - */ - void RCInitGOP(AVCEncObject *encvid); - - /** - This function calculates target bits for a particular frame. - \param "video" "Pointer to the AVCEncObject structure." - \return "void" - */ - void RCInitFrameQP(AVCEncObject *video); - - /** - This function calculates QP for the upcoming frame or basic unit. - \param "encvid" "Pointer to the encoder object." - \param "rateCtrl" "Pointer to the rate control object." - \return "QP value ranging from 0-51." - */ - int RCCalculateQP(AVCEncObject *encvid, AVCRateControl *rateCtrl); - - /** - This function translates the luma QP to chroma QP and calculates lambda based on QP. - \param "video" "Pointer to the AVCEncObject structure." - \return "void" - */ - void RCInitChromaQP(AVCEncObject *encvid); - - /** - This function is called before encoding each macroblock. - \param "encvid" "Pointer to the encoder object." - \return "void." - */ - void RCInitMBQP(AVCEncObject *encvid); - - /** - This function updates bits usage stats after encoding an macroblock. - \param "video" "Pointer to AVCCommonObj." - \param "rateCtrl" "Pointer to AVCRateControl." - \param "num_header_bits" "Number of bits used for MB header." - \param "num_texture_bits" "Number of bits used for MB texture." - \return "void" - */ - void RCPostMB(AVCCommonObj *video, AVCRateControl *rateCtrl, int num_header_bits, int num_texture_bits); - - /** - This function calculates the difference between prediction and original MB. - \param "encvid" "Pointer to the encoder object." - \param "currMB" "Pointer to the current macroblock structure." - \param "orgL" "Pointer to the original MB." - \param "orgPitch" "Pointer to the original picture pitch." - \return "void." - */ - void RCCalculateMAD(AVCEncObject *encvid, AVCMacroblock *currMB, uint8 *orgL, int orgPitch); - - /** - Restore QP related parameters of previous MB when current MB is skipped. - \param "currMB" "Pointer to the current macroblock." - \param "video" "Pointer to the common video structure." - \param "encvid" "Pointer to the global encoding structure." - \return "void" - */ - void RCRestoreQP(AVCMacroblock *currMB, AVCCommonObj *video, AVCEncObject *encvid); - - /** - This function is called after done with a frame. - \param "encvid" "Pointer to the encoder object." - \return "AVCENC_SUCCESS or AVCENC_SKIPPED_PICTURE when bufer overflow (need to discard current frame)." - */ - AVCEnc_Status RCUpdateFrame(AVCEncObject *encvid); - - /*--------- residual.c -------------------*/ - - /** - This function encodes the intra pcm data and fill it in the corresponding location - on the current picture. - \param "video" "Pointer to AVCEncObject." - \return "AVCENC_SUCCESS if success, or else for bitstream errors." - */ - AVCEnc_Status EncodeIntraPCM(AVCEncObject *video); - - /** - This function performs CAVLC syntax encoding on the run and level information of the coefficients. - The level and run arrays are elements in AVCEncObject structure, populated by TransQuantZZ, - TransQuantIntraDC and TransQuantChromaDC functions. - \param "video" "Pointer to AVCEncObject." - \param "type" "One of AVCResidualType for a particular 4x4 block." - \param "bindx" "Block index or number of nonzero coefficients for AVC_Intra16DC and AVC_ChromaDC mode." - \param "currMB" "Pointer to the current macroblock structure." - \return "AVCENC_SUCCESS for success." - \Note "This function has 32-bit machine specific instruction!!!!" - */ - AVCEnc_Status enc_residual_block(AVCEncObject *encvid, AVCResidualType type, int bindx, AVCMacroblock *currMB); - - - /*------------- sad.c ---------------------------*/ - - - int AVCSAD_MB_HalfPel_Cxhyh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info); - int AVCSAD_MB_HalfPel_Cyh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info); - int AVCSAD_MB_HalfPel_Cxh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info); - int AVCSAD_Macroblock_C(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info); - -#ifdef HTFM /* 3/2/1, Hypothesis Testing Fast Matching */ - int AVCSAD_MB_HP_HTFM_Collectxhyh(uint8 *ref, uint8 *blk, int dmin_x, void *extra_info); - int AVCSAD_MB_HP_HTFM_Collectyh(uint8 *ref, uint8 *blk, int dmin_x, void *extra_info); - int AVCSAD_MB_HP_HTFM_Collectxh(uint8 *ref, uint8 *blk, int dmin_x, void *extra_info); - int AVCSAD_MB_HP_HTFMxhyh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info); - int AVCSAD_MB_HP_HTFMyh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info); - int AVCSAD_MB_HP_HTFMxh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info); - int AVCSAD_MB_HTFM_Collect(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info); - int AVCSAD_MB_HTFM(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info); -#endif - - - /*------------- slice.c -------------------------*/ - - /** - This function performs the main encoding loop for a slice. - \param "encvid" "Pointer to AVCEncObject." - \return "AVCENC_SUCCESS for success, AVCENC_PICTURE_READY for end-of-picture and - AVCENC_FAIL or AVCENC_SLICE_EMPTY otherwise." - */ - AVCEnc_Status AVCEncodeSlice(AVCEncObject *encvid); - - /** - This function performs the main encoding operation for one macroblock. - \param "video" "pointer to AVCEncObject." - \return "AVCENC_SUCCESS for success, or other bitstream related failure status." - */ - AVCEnc_Status EncodeMB(AVCEncObject *video); - - /** - This function calls prediction INTRA/INTER functions, transform, - quantization and zigzag scanning to get the run-level symbols. - \param "encvid" "pointer to AVCEncObject." - \param "curL" "pointer to Luma component of the current frame. - \param "curCb" "pointer to Cb component of the current frame. - \param "curCr" "pointer to Cr component of the current frame. - \return "void for now." - */ - void MBPredTransQuantZZ(AVCEncObject *encvid, uint8 *curL, uint8 *curCb, uint8 *curCr); - - /** - This function copies the content of the prediction MB into the reconstructed YUV - frame directly. - \param "curL" "Pointer to the destination Y component." - \param "curCb" "Pointer to the destination Cb component." - \param "curCr" "Pointer to the destination Cr component." - \param "predBlock" "Pointer to the prediction MB." - \param "picWidth" "The width of the frame." - \return "None." - */ - void Copy_MB(uint8 *curL, uint8 *curCb, uint8 *curCr, uint8 *predBlock, int picWidth); - - /** - This function encodes the mb_type, CBP, prediction mode, ref idx and MV. - \param "currMB" "Pointer to the current macroblock structure." - \param "video" "Pointer to the AVCEncObject structure." - \return "AVCENC_SUCCESS for success or else for fail." - */ - AVCEnc_Status EncodeMBHeader(AVCMacroblock *currMB, AVCEncObject *video); - - /** - This function finds the right mb_type for a macroblock given the mbMode, CBP, - NumPart, PredPartMode. - \param "currMB" "Pointer to the current macroblock structure." - \param "slice_type" "Value of the slice_type." - \return "mb_type." - */ - uint InterpretMBType(AVCMacroblock *currMB, int slice_type); - - /** - This function encodes the mb_pred part of the macroblock data. - \param "video" "Pointer to the AVCCommonObj structure." - \param "currMB" "Pointer to the current macroblock structure." - \param "stream" "Pointer to the AVCEncBitstream structure." - \return "AVCENC_SUCCESS for success or bitstream fail status." - */ - AVCEnc_Status mb_pred(AVCCommonObj *video, AVCMacroblock *currMB, AVCEncBitstream *stream); - - /** - This function encodes the sub_mb_pred part of the macroblock data. - \param "video" "Pointer to the AVCCommonObj structure." - \param "currMB" "Pointer to the current macroblock structure." - \param "stream" "Pointer to the AVCEncBitstream structure." - \return "AVCENC_SUCCESS for success or bitstream fail status." - */ - AVCEnc_Status sub_mb_pred(AVCCommonObj *video, AVCMacroblock *currMB, AVCEncBitstream *stream); - - /** - This function interprets the sub_mb_type and sets necessary information - when the slice type is AVC_P_SLICE. - in the macroblock structure. - \param "mblock" "Pointer to current AVCMacroblock." - \param "sub_mb_type" "From the syntax bitstream." - \return "void" - */ - void InterpretSubMBTypeP(AVCMacroblock *mblock, uint *sub_mb_type); - - /** - This function interprets the sub_mb_type and sets necessary information - when the slice type is AVC_B_SLICE. - in the macroblock structure. - \param "mblock" "Pointer to current AVCMacroblock." - \param "sub_mb_type" "From the syntax bitstream." - \return "void" - */ - void InterpretSubMBTypeB(AVCMacroblock *mblock, uint *sub_mb_type); - - /** - This function encodes intra 4x4 mode. It calculates the predicted I4x4 mode and the - remnant to be encoded. - \param "video" "Pointer to AVCEncObject structure." - \param "currMB" "Pointer to the AVCMacroblock structure." - \param "stream" "Pointer to AVCEncBitstream sructure." - \return "AVCENC_SUCCESS for success." - */ - AVCEnc_Status EncodeIntra4x4Mode(AVCCommonObj *video, AVCMacroblock *currMB, AVCEncBitstream *stream); - - /*------------- vlc_encode.c -----------------------*/ - /** - This function encodes and writes a value into an Exp-Golomb codeword. - \param "bitstream" "Pointer to AVCEncBitstream." - \param "codeNum" "Pointer to the value of the codeNum." - \return "AVCENC_SUCCESS for success or bitstream error messages for fail." - */ - AVCEnc_Status ue_v(AVCEncBitstream *bitstream, uint codeNum); - - /** - This function maps and encodes signed Exp-Golomb codes. - \param "bitstream" "Pointer to AVCEncBitstream." - \param "value" "Pointer to syntax element value." - \return "AVCENC_SUCCESS or AVCENC_FAIL." - */ - AVCEnc_Status se_v(AVCEncBitstream *bitstream, int value); - - /** - This function maps and encodes truncated Exp-Golomb codes. - \param "bitstream" "Pointer to AVCEncBitstream." - \param "value" "Pointer to syntax element value." - \param "range" "Range of the value as input to determine the algorithm." - \return "AVCENC_SUCCESS or AVCENC_FAIL." - */ - AVCEnc_Status te_v(AVCEncBitstream *bitstream, uint value, uint range); - - /** - This function creates Exp-Golomb codeword from codeNum. - \param "bitstream" "Pointer to AVCEncBitstream." - \param "codeNum" "Pointer to the codeNum value." - \return "AVCENC_SUCCESS for success or bitstream error messages for fail." - */ - AVCEnc_Status SetEGBitstring(AVCEncBitstream *bitstream, uint codeNum); - - /** - This function performs CAVLC encoding of the CBP (coded block pattern) of a macroblock - by calling ue_v() and then mapping the CBP to the corresponding VLC codeNum. - \param "currMB" "Pointer to the current AVCMacroblock structure." - \param "stream" "Pointer to the AVCEncBitstream." - \return "void" - */ - AVCEnc_Status EncodeCBP(AVCMacroblock *currMB, AVCEncBitstream *stream); - - /** - This function encodes trailing ones and total coefficient. - \param "stream" "Pointer to the AVCEncBitstream." - \param "TrailingOnes" "The trailing one variable output." - \param "TotalCoeff" "The total coefficient variable output." - \param "nC" "Context for number of nonzero coefficient (prediction context)." - \return "AVCENC_SUCCESS for success or else for bitstream failure." - */ - AVCEnc_Status ce_TotalCoeffTrailingOnes(AVCEncBitstream *stream, int TrailingOnes, int TotalCoeff, int nC); - - /** - This function encodes trailing ones and total coefficient for chroma DC block. - \param "stream" "Pointer to the AVCEncBitstream." - \param "TrailingOnes" "The trailing one variable output." - \param "TotalCoeff" "The total coefficient variable output." - \return "AVCENC_SUCCESS for success or else for bitstream failure." - */ - AVCEnc_Status ce_TotalCoeffTrailingOnesChromaDC(AVCEncBitstream *stream, int TrailingOnes, int TotalCoeff); - - /** - This function encodes total_zeros value as in Table 9-7 and 9-8. - \param "stream" "Pointer to the AVCEncBitstream." - \param "TotalZeros" "The total_zeros value." - \param "TotalCoeff" "The total coefficient variable output." - \return "AVCENC_SUCCESS for success or else for bitstream failure." - */ - AVCEnc_Status ce_TotalZeros(AVCEncBitstream *stream, int total_zeros, int TotalCoeff); - - /** - This function encodes total_zeros VLC syntax for chroma DC as in Table 9-9. - \param "stream" "Pointer to the AVCEncBitstream." - \param "TotalZeros" "The total_zeros value." - \param "TotalCoeff" "The total coefficient variable output." - \return "AVCENC_SUCCESS for success or else for bitstream failure." - */ - AVCEnc_Status ce_TotalZerosChromaDC(AVCEncBitstream *stream, int total_zeros, int TotalCoeff); - - /** - This function encodes run_before VLC syntax as in Table 9-10. - \param "stream" "Pointer to the AVCEncBitstream." - \param "run_before" "The run_before value." - \param "zerosLeft" "The context for number of zeros left." - \return "AVCENC_SUCCESS for success or else for bitstream failure." - */ - AVCEnc_Status ce_RunBefore(AVCEncBitstream *stream, int run_before, int zerosLeft); - -#ifdef __cplusplus -} -#endif - - -#endif /* _AVCENC_LIB_H_ */ - |