11cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ------------------------------------------------------------------
21cc31e629e8132df390ae692873c847d1c2f62c0James Dong * Copyright (C) 1998-2009 PacketVideo
31cc31e629e8132df390ae692873c847d1c2f62c0James Dong *
41cc31e629e8132df390ae692873c847d1c2f62c0James Dong * Licensed under the Apache License, Version 2.0 (the "License");
51cc31e629e8132df390ae692873c847d1c2f62c0James Dong * you may not use this file except in compliance with the License.
61cc31e629e8132df390ae692873c847d1c2f62c0James Dong * You may obtain a copy of the License at
71cc31e629e8132df390ae692873c847d1c2f62c0James Dong *
81cc31e629e8132df390ae692873c847d1c2f62c0James Dong *      http://www.apache.org/licenses/LICENSE-2.0
91cc31e629e8132df390ae692873c847d1c2f62c0James Dong *
101cc31e629e8132df390ae692873c847d1c2f62c0James Dong * Unless required by applicable law or agreed to in writing, software
111cc31e629e8132df390ae692873c847d1c2f62c0James Dong * distributed under the License is distributed on an "AS IS" BASIS,
121cc31e629e8132df390ae692873c847d1c2f62c0James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
131cc31e629e8132df390ae692873c847d1c2f62c0James Dong * express or implied.
141cc31e629e8132df390ae692873c847d1c2f62c0James Dong * See the License for the specific language governing permissions
151cc31e629e8132df390ae692873c847d1c2f62c0James Dong * and limitations under the License.
161cc31e629e8132df390ae692873c847d1c2f62c0James Dong * -------------------------------------------------------------------
171cc31e629e8132df390ae692873c847d1c2f62c0James Dong */
181cc31e629e8132df390ae692873c847d1c2f62c0James Dong/**
191cc31e629e8132df390ae692873c847d1c2f62c0James DongThis file contains declarations of internal functions for AVC decoder library.
201cc31e629e8132df390ae692873c847d1c2f62c0James Dong@publishedAll
211cc31e629e8132df390ae692873c847d1c2f62c0James Dong*/
221cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifndef AVCENC_LIB_H_INCLUDED
231cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define AVCENC_LIB_H_INCLUDED
241cc31e629e8132df390ae692873c847d1c2f62c0James Dong
251cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifndef AVCLIB_COMMON_H_INCLUDED
261cc31e629e8132df390ae692873c847d1c2f62c0James Dong#include "avclib_common.h"
271cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
281cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifndef AVCENC_INT_H_INCLUDED
291cc31e629e8132df390ae692873c847d1c2f62c0James Dong#include "avcenc_int.h"
301cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
311cc31e629e8132df390ae692873c847d1c2f62c0James Dong
321cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifdef __cplusplus
331cc31e629e8132df390ae692873c847d1c2f62c0James Dongextern "C"
341cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
351cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*------------- block.c -------------------------*/
371cc31e629e8132df390ae692873c847d1c2f62c0James Dong
381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function perform residue calculation, transform, quantize, inverse quantize,
401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    inverse transform and residue compensation on a 4x4 block.
411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "blkidx"  "raster scan block index of the current 4x4 block."
431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cur"    "Pointer to the reconstructed block."
441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "org"    "Pointer to the original block."
451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "coef_cost"  "Pointer to the coefficient cost to be filled in and returned."
461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "Number of non-zero coefficients."
471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int dct_luma(AVCEncObject *encvid, int blkidx, uint8 *cur, uint8 *org, int *coef_cost);
491cc31e629e8132df390ae692873c847d1c2f62c0James Dong
501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs IDCT on an INTER macroblock.
521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to AVCCommonObj."
531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curL"   "Pointer to the origin of the macroblock on the current frame."
541cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB" "Pointer to the AVCMacroblock structure."
551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "picPitch" "Pitch of the current frame."
561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void".
571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void MBInterIdct(AVCCommonObj *video, uint8 *curL, AVCMacroblock *currMB, int picPitch);
591cc31e629e8132df390ae692873c847d1c2f62c0James Dong
601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function perform residue calculation, transform, quantize, inverse quantize,
621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    inverse transform and residue compensation on a macroblock.
631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curL"   "Pointer to the reconstructed MB."
651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "orgL"    "Pointer to the original MB."
661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
671cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void dct_luma_16x16(AVCEncObject *encvid, uint8 *curL, uint8 *orgL);
691cc31e629e8132df390ae692873c847d1c2f62c0James Dong
701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function perform residue calculation, transform, quantize, inverse quantize,
721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    inverse transform and residue compensation for chroma components of an MB.
731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curC"   "Pointer to the reconstructed MB."
751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "orgC"    "Pointer to the original MB."
761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cr"     "Flag whether it is Cr or not."
771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void dct_chroma(AVCEncObject *encvid, uint8 *curC, uint8 *orgC, int cr);
801cc31e629e8132df390ae692873c847d1c2f62c0James Dong
811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*----------- init.c ------------------*/
821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function interprets the encoding parameters provided by users in encParam.
841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    The results are kept in AVCEncObject, AVCSeqParamSet, AVCPicParamSet and AVCSliceHeader.
851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid"     "Pointer to AVCEncObject."
861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encParam"   "Pointer to AVCEncParam."
871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "extSPS"     "External SPS template to be followed. NULL if not present."
881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "extPPS"     "External PPS template to be followed. NULL if not present."
891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "see AVCEnc_Status."
901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status  SetEncodeParam(AVCHandle *avcHandle, AVCEncParams *encParam,
921cc31e629e8132df390ae692873c847d1c2f62c0James Dong                                  void *extSPS, void *extPPS);
931cc31e629e8132df390ae692873c847d1c2f62c0James Dong
941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function verifies the encoding parameters whether they meet the set of supported
961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    tool by a specific profile. If the profile is not set, it will just find the closest
971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    profile instead of verifying it.
981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to AVCEncObject."
991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "seqParam"   "Pointer to AVCSeqParamSet."
1001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "picParam"   "Pointer to AVCPicParamSet."
1011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success,
1021cc31e629e8132df390ae692873c847d1c2f62c0James Dong            AVCENC_PROFILE_NOT_SUPPORTED if the specified profile
1031cc31e629e8132df390ae692873c847d1c2f62c0James Dong                is not supported by this version of the library,
1041cc31e629e8132df390ae692873c847d1c2f62c0James Dong            AVCENC_TOOLS_NOT_SUPPORTED if any of the specified encoding tools are
1051cc31e629e8132df390ae692873c847d1c2f62c0James Dong            not supported by the user-selected profile."
1061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status VerifyProfile(AVCEncObject *video, AVCSeqParamSet *seqParam, AVCPicParamSet *picParam);
1081cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function verifies the encoding parameters whether they meet the requirement
1111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    for a specific level. If the level is not set, it will just find the closest
1121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    level instead of verifying it.
1131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to AVCEncObject."
1141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "seqParam"   "Pointer to AVCSeqParamSet."
1151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "picParam"   "Pointer to AVCPicParamSet."
1161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success,
1171cc31e629e8132df390ae692873c847d1c2f62c0James Dong            AVCENC_LEVEL_NOT_SUPPORTED if the specified level
1181cc31e629e8132df390ae692873c847d1c2f62c0James Dong                is not supported by this version of the library,
1191cc31e629e8132df390ae692873c847d1c2f62c0James Dong            AVCENC_LEVEL_FAIL if any of the encoding parameters exceed
1201cc31e629e8132df390ae692873c847d1c2f62c0James Dong            the range of the user-selected level."
1211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status VerifyLevel(AVCEncObject *video, AVCSeqParamSet *seqParam, AVCPicParamSet *picParam);
1231cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This funciton initializes the frame encoding by setting poc/frame_num related parameters. it
1261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    also performs motion estimation.
1271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the AVCEncObject."
1281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success, AVCENC_NO_PICTURE if there is no input picture
1291cc31e629e8132df390ae692873c847d1c2f62c0James Dong            in the queue to encode, AVCENC_POC_FAIL or AVCENC_CONSECUTIVE_NONREF for POC
1301cc31e629e8132df390ae692873c847d1c2f62c0James Dong            related errors, AVCENC_NEW_IDR if new IDR is detected."
1311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status InitFrame(AVCEncObject *encvid);
1331cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function initializes slice header related variables and other variables necessary
1361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    for decoding one slice.
1371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the AVCEncObject."
1381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success."
1391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status InitSlice(AVCEncObject *encvid);
1411cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*----------- header.c ----------------*/
1431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs bitstream encoding of the sequence parameter set NAL.
1451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the AVCEncObject."
1461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to AVCEncBitstream."
1471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success or AVCENC_SPS_FAIL or others for unexpected failure which
1481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    should not occur. The SPS parameters should all be verified before this function is called."
1491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status EncodeSPS(AVCEncObject *encvid, AVCEncBitstream *stream);
1511cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes the VUI parameters into the sequence parameter set bitstream.
1541cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to AVCEncBitstream."
1551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "vui"    "Pointer to AVCVUIParams."
1561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "nothing."
1571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void EncodeVUI(AVCEncBitstream* stream, AVCVUIParams* vui);
1591cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes HRD parameters into the sequence parameter set bitstream
1621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to AVCEncBitstream."
1631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "hrd"    "Pointer to AVCHRDParams."
1641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "nothing."
1651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void EncodeHRD(AVCEncBitstream* stream, AVCHRDParams* hrd);
1671cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1681cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs bitstream encoding of the picture parameter set NAL.
1711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the AVCEncObject."
1721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to AVCEncBitstream."
1731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success or AVCENC_PPS_FAIL or others for unexpected failure which
1741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    should not occur. The SPS parameters should all be verified before this function is called."
1751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status EncodePPS(AVCEncObject *encvid, AVCEncBitstream *stream);
1771cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes slice header information which has been initialized or fabricated
1801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    prior to entering this funciton.
1811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the AVCEncObject."
1821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to AVCEncBitstream."
1831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success or bitstream fail statuses."
1841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status EncodeSliceHeader(AVCEncObject *encvid, AVCEncBitstream *stream);
1861cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes reference picture list reordering relted syntax.
1891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video" "Pointer to AVCCommonObj."
1901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to AVCEncBitstream."
1911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "sliceHdr" "Pointer to AVCSliceHdr."
1921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "slice_type" "Value of slice_type - 5 if greater than 5."
1931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success and AVCENC_FAIL otherwise."
1941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
1951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status ref_pic_list_reordering(AVCCommonObj *video, AVCEncBitstream *stream, AVCSliceHeader *sliceHdr, int slice_type);
1961cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
1981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes dec_ref_pic_marking related syntax.
1991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video" "Pointer to AVCCommonObj."
2001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to AVCEncBitstream."
2011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "sliceHdr" "Pointer to AVCSliceHdr."
2021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success and AVCENC_FAIL otherwise."
2031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status dec_ref_pic_marking(AVCCommonObj *video, AVCEncBitstream *stream, AVCSliceHeader *sliceHdr);
2051cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
2071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function initializes the POC related variables and the POC syntax to be encoded
2081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    to the slice header derived from the disp_order and is_reference flag of the original
2091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    input frame to be encoded.
2101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to the AVCEncObject."
2111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success,
2121cc31e629e8132df390ae692873c847d1c2f62c0James Dong            AVCENC_POC_FAIL if the poc type is undefined or
2131cc31e629e8132df390ae692873c847d1c2f62c0James Dong            AVCENC_CONSECUTIVE_NONREF if there are consecutive non-reference frame for POC type 2."
2141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status InitPOC(AVCEncObject *video);
2161cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
2181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs POC related operation after a picture is decoded.
2191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video" "Pointer to AVCCommonObj."
2201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS"
2211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status PostPOC(AVCCommonObj *video);
2231cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*----------- bitstream_io.c ----------------*/
2251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
2261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function initializes the bitstream structure with the information given by
2271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    the users.
2281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "bitstream"  "Pointer to the AVCEncBitstream structure."
2291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "buffer"     "Pointer to the unsigned char buffer for output."
2301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "buf_size"   "The size of the buffer in bytes."
2311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "overrunBuffer"  "Pointer to extra overrun buffer."
2321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "oBSize"     "Size of overrun buffer in bytes."
2331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success, AVCENC_BITSTREAM_INIT_FAIL if fail"
2341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status BitstreamEncInit(AVCEncBitstream *bitstream, uint8 *buffer, int buf_size,
2361cc31e629e8132df390ae692873c847d1c2f62c0James Dong                                   uint8 *overrunBuffer, int oBSize);
2371cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
2391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function writes the data from the cache into the bitstream buffer. It also adds the
2401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    emulation prevention code if necessary.
2411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream"     "Pointer to the AVCEncBitstream structure."
2421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success or AVCENC_BITSTREAM_BUFFER_FULL if fail."
2431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status AVCBitstreamSaveWord(AVCEncBitstream *stream);
2451cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
2471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function writes the codeword into the cache which will eventually be written to
2481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    the bitstream buffer.
2491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream"     "Pointer to the AVCEncBitstream structure."
2501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "nBits"      "Number of bits in the codeword."
2511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "code"       "The codeword."
2521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success or AVCENC_BITSTREAM_BUFFER_FULL if fail."
2531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2541cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status BitstreamWriteBits(AVCEncBitstream *stream, int nBits, uint code);
2551cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
2571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function writes one bit of data into the cache which will eventually be written
2581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    to the bitstream buffer.
2591cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream"     "Pointer to the AVCEncBitstream structure."
2601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "code"       "The codeword."
2611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success or AVCENC_BITSTREAM_BUFFER_FULL if fail."
2621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status BitstreamWrite1Bit(AVCEncBitstream *stream, uint code);
2641cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
2661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function adds trailing bits to the bitstream and reports back the final EBSP size.
2671cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream"     "Pointer to the AVCEncBitstream structure."
2681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "nal_size"   "Output the final NAL size."
2691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success or AVCENC_BITSTREAM_BUFFER_FULL if fail."
2701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status BitstreamTrailingBits(AVCEncBitstream *bitstream, uint *nal_size);
2721cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
2741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function checks whether the current bit position is byte-aligned or not.
2751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to the bitstream structure."
2761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "true if byte-aligned, false otherwise."
2771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    bool byte_aligned(AVCEncBitstream *stream);
2791cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2801cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
2821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function checks the availability of overrun buffer and switches to use it when
2831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    normal bufffer is not big enough.
2841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to the bitstream structure."
2851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "numExtraBytes" "Number of extra byte needed."
2861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS or AVCENC_FAIL."
2871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
2881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status AVCBitstreamUseOverrunBuffer(AVCEncBitstream* stream, int numExtraBytes);
2891cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2901cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*-------------- intra_est.c ---------------*/
2921cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /** This function performs intra/inter decision based on ABE.
2941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
2951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "min_cost"   "Best inter cost."
2961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curL"   "Pointer to the current MB origin in reconstructed frame."
2971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "picPitch" "Pitch of the reconstructed frame."
2981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "Boolean for intra mode."
2991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3001cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3011cc31e629e8132df390ae692873c847d1c2f62c0James Dong//bool IntraDecisionABE(AVCEncObject *encvid, int min_cost, uint8 *curL, int picPitch);
3021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    bool IntraDecision(int *min_cost, uint8 *cur, int pitch, bool ave);
3031cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs intra prediction mode search.
3061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
3071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "mbnum"  "Current MB number."
3081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curL"   "Pointer to the current MB origin in reconstructed frame."
3091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "picPitch" "Pitch of the reconstructed frame."
3101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
3111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void MBIntraSearch(AVCEncObject *encvid, int mbnum, uint8 *curL, int picPitch);
3131cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function generates all the I16 prediction modes for an MB and keep it in
3161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->pred_i16.
3171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
3181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
3191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void intrapred_luma_16x16(AVCEncObject *encvid);
3211cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculate the cost of all I16 modes and compare them to get the minimum.
3241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
3251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "orgY"   "Pointer to the original luma MB."
3261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "min_cost" "Pointer to the minimal cost so-far."
3271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
3281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void find_cost_16x16(AVCEncObject *encvid, uint8 *orgY, int *min_cost);
3301cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculates the cost of each I16 mode.
3331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "org"    "Pointer to the original luma MB."
3341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "org_pitch" "Stride size of the original frame."
3351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "pred"   "Pointer to the prediction values."
3361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "min_cost" "Minimal cost so-far."
3371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "Cost"
3381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3391cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int cost_i16(uint8 *org, int org_pitch, uint8 *pred, int min_cost);
3411cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function generates all the I4 prediction modes and select the best one
3441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    for all the blocks inside a macroblock.It also calls dct_luma to generate the reconstructed
3451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    MB, and transform coefficients to be encoded.
3461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
3471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "min_cost" "Pointer to the minimal cost so-far."
3481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
3491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void mb_intra4x4_search(AVCEncObject *encvid, int *min_cost);
3511cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculates the most probable I4 mode of a given 4x4 block
3541cc31e629e8132df390ae692873c847d1c2f62c0James Dong    from neighboring informationaccording to AVC/H.264 standard.
3551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to AVCCommonObj."
3561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "blkidx" "The current block index."
3571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "Most probable mode."
3581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3591cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int FindMostProbableI4Mode(AVCCommonObj *video, int blkidx);
3601cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function is where a lot of actions take place in the 4x4 block level inside
3631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    mb_intra4x4_search.
3641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
3651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "blkidx" "The current 4x4 block index."
3661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cur"    "Pointer to the reconstructed block."
3671cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "org"    "Pointer to the original block."
3681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "Minimal cost, also set currMB->i4Mode"
3691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int blk_intra4x4_search(AVCEncObject *encvid, int blkidx, uint8 *cur, uint8 *org);
3711cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculates the cost of a given I4 prediction mode.
3741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "org"    "Pointer to the original block."
3751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "org_pitch"  "Stride size of the original frame."
3761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "pred"   "Pointer to the prediction block. (encvid->pred_i4)"
3771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cost"   "Pointer to the minimal cost (to be updated)."
3781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
3791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void cost_i4(uint8 *org, int org_pitch, uint8 *pred, uint16 *cost);
3811cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs chroma intra search. Each mode is saved in encvid->pred_ic.
3841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
3851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
3861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void chroma_intra_search(AVCEncObject *encvid);
3881cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
3901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculates the cost of a chroma prediction mode.
3911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "orgCb"  "Pointer to the original Cb block."
3921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "orgCr"  "Pointer to the original Cr block."
3931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "org_pitch"  "Stride size of the original frame."
3941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "pred"   "Pointer to the prediction block (encvid->pred_ic)"
3951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "mincost"    "Minimal cost so far."
3961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "Cost."
3971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
3981cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int SATDChroma(uint8 *orgCb, uint8 *orgCr, int org_pitch, uint8 *pred, int mincost);
4001cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*-------------- motion_comp.c ---------------*/
4021cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
4041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This is a main function to peform inter prediction.
4051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid"     "Pointer to AVCEncObject."
4061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"      "Pointer to AVCCommonObj."
4071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void".
4081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
4091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void AVCMBMotionComp(AVCEncObject *encvid, AVCCommonObj *video);
4101cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4111cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
4131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function is called for luma motion compensation.
4141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "ref"    "Pointer to the origin of a reference luma."
4151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "picwidth"   "Width of the picture."
4161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "picheight"  "Height of the picture."
4171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "x_pos"  "X-coordinate of the predicted block in quarter pel resolution."
4181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "y_pos"  "Y-coordinate of the predicted block in quarter pel resolution."
4191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "pred"   "Pointer to the output predicted block."
4201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "pred_pitch" "Width of pred."
4211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "blkwidth"   "Width of the current partition."
4221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "blkheight"  "Height of the current partition."
4231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
4241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
4251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eLumaMotionComp(uint8 *ref, int picwidth, int picheight,
4261cc31e629e8132df390ae692873c847d1c2f62c0James Dong                         int x_pos, int y_pos,
4271cc31e629e8132df390ae692873c847d1c2f62c0James Dong                         uint8 *pred, int pred_pitch,
4281cc31e629e8132df390ae692873c847d1c2f62c0James Dong                         int blkwidth, int blkheight);
4291cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eFullPelMC(uint8 *in, int inwidth, uint8 *out, int outpitch,
4311cc31e629e8132df390ae692873c847d1c2f62c0James Dong                    int blkwidth, int blkheight);
4321cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eHorzInterp1MC(uint8 *in, int inpitch, uint8 *out, int outpitch,
4341cc31e629e8132df390ae692873c847d1c2f62c0James Dong                        int blkwidth, int blkheight, int dx);
4351cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eHorzInterp2MC(int *in, int inpitch, uint8 *out, int outpitch,
4371cc31e629e8132df390ae692873c847d1c2f62c0James Dong                        int blkwidth, int blkheight, int dx);
4381cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eHorzInterp3MC(uint8 *in, int inpitch, int *out, int outpitch,
4401cc31e629e8132df390ae692873c847d1c2f62c0James Dong                        int blkwidth, int blkheight);
4411cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eVertInterp1MC(uint8 *in, int inpitch, uint8 *out, int outpitch,
4431cc31e629e8132df390ae692873c847d1c2f62c0James Dong                        int blkwidth, int blkheight, int dy);
4441cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eVertInterp2MC(uint8 *in, int inpitch, int *out, int outpitch,
4461cc31e629e8132df390ae692873c847d1c2f62c0James Dong                        int blkwidth, int blkheight);
4471cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eVertInterp3MC(int *in, int inpitch, uint8 *out, int outpitch,
4491cc31e629e8132df390ae692873c847d1c2f62c0James Dong                        int blkwidth, int blkheight, int dy);
4501cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eDiagonalInterpMC(uint8 *in1, uint8 *in2, int inpitch,
4521cc31e629e8132df390ae692873c847d1c2f62c0James Dong                           uint8 *out, int outpitch,
4531cc31e629e8132df390ae692873c847d1c2f62c0James Dong                           int blkwidth, int blkheight);
4541cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eChromaMotionComp(uint8 *ref, int picwidth, int picheight,
4561cc31e629e8132df390ae692873c847d1c2f62c0James Dong                           int x_pos, int y_pos, uint8 *pred, int pred_pitch,
4571cc31e629e8132df390ae692873c847d1c2f62c0James Dong                           int blkwidth, int blkheight);
4581cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4591cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eChromaDiagonalMC_SIMD(uint8 *pRef, int srcPitch, int dx, int dy,
4601cc31e629e8132df390ae692873c847d1c2f62c0James Dong                                uint8 *pOut, int predPitch, int blkwidth, int blkheight);
4611cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eChromaHorizontalMC_SIMD(uint8 *pRef, int srcPitch, int dx, int dy,
4631cc31e629e8132df390ae692873c847d1c2f62c0James Dong                                  uint8 *pOut, int predPitch, int blkwidth, int blkheight);
4641cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eChromaVerticalMC_SIMD(uint8 *pRef, int srcPitch, int dx, int dy,
4661cc31e629e8132df390ae692873c847d1c2f62c0James Dong                                uint8 *pOut, int predPitch, int blkwidth, int blkheight);
4671cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eChromaFullMC_SIMD(uint8 *pRef, int srcPitch, int dx, int dy,
4691cc31e629e8132df390ae692873c847d1c2f62c0James Dong                            uint8 *pOut, int predPitch, int blkwidth, int blkheight);
4701cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eChromaVerticalMC2_SIMD(uint8 *pRef, int srcPitch, int dx, int dy,
4721cc31e629e8132df390ae692873c847d1c2f62c0James Dong                                 uint8 *pOut, int predPitch, int blkwidth, int blkheight);
4731cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eChromaHorizontalMC2_SIMD(uint8 *pRef, int srcPitch, int dx, int dy,
4751cc31e629e8132df390ae692873c847d1c2f62c0James Dong                                   uint8 *pOut, int predPitch, int blkwidth, int blkheight);
4761cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void eChromaDiagonalMC2_SIMD(uint8 *pRef, int srcPitch, int dx, int dy,
4781cc31e629e8132df390ae692873c847d1c2f62c0James Dong                                 uint8 *pOut, int predPitch, int blkwidth, int blkheight);
4791cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4801cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*-------------- motion_est.c ---------------*/
4821cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
4841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    Allocate and initialize arrays necessary for motion search algorithm.
4851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "envid" "Pointer to AVCEncObject."
4861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVC_SUCCESS or AVC_MEMORY_FAIL."
4871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
4881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status InitMotionSearchModule(AVCHandle *avcHandle);
4891cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
4911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    Clean up memory allocated in InitMotionSearchModule.
4921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "envid" "Pointer to AVCEncObject."
4931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
4941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
4951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void CleanMotionSearchModule(AVCHandle *avcHandle);
4961cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4971cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
4991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs motion estimation of all macroblocks in a frame during the InitFrame.
5001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    The goal is to find the best MB partition for inter and find out if intra search is needed for
5011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    any MBs. This intra MB tendency can be used for scene change detection.
5021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
5031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
5041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
5051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void AVCMotionEstimation(AVCEncObject *encvid);
5061cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
5081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs repetitive edge padding to the reference picture by adding 16 pixels
5091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    around the luma and 8 pixels around the chromas.
5101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "refPic" "Pointer to the reference picture."
5111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
5121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
5131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void  AVCPaddingEdge(AVCPictureData *refPic);
5141cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
5161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function keeps track of intra refresh macroblock locations.
5171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the global array structure AVCEncObject."
5181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "mblock" "Pointer to the array of AVCMacroblock structures."
5191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "totalMB" "Total number of MBs in a frame."
5201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "numRefresh" "Number of MB to be intra refresh in a single frame."
5211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
5221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
5231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void AVCRasterIntraUpdate(AVCEncObject *encvid, AVCMacroblock *mblock, int totalMB, int numRefresh);
5241cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5251cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifdef HTFM
5261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void InitHTFM(VideoEncData *encvid, HTFM_Stat *htfm_stat, double *newvar, int *collect);
5271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void UpdateHTFM(AVCEncObject *encvid, double *newvar, double *exp_lamda, HTFM_Stat *htfm_stat);
5281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void CalcThreshold(double pf, double exp_lamda[], int nrmlz_th[]);
5291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void    HTFMPrepareCurMB_AVC(AVCEncObject *encvid, HTFM_Stat *htfm_stat, uint8 *cur, int pitch);
5301cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
5311cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
5331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function reads the input MB into a smaller faster memory space to minimize the cache miss.
5341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the global AVCEncObject."
5351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cur"    "Pointer to the original input macroblock."
5361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "pitch"  "Stride size of the input frame (luma)."
5371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
5381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
5391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void    AVCPrepareCurMB(AVCEncObject *encvid, uint8 *cur, int pitch);
5401cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
5421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    Performs motion vector search for a macroblock.
5431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject structure."
5441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cur"    "Pointer to the current macroblock in the input frame."
5451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "best_cand" "Array of best candidates (to be filled in and returned)."
5461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "i0"     "X-coordinate of the macroblock."
5471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "j0"     "Y-coordinate of the macroblock."
5481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "type_pred" "Indicates the type of operations."
5491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "FS_en"      "Flag for fullsearch enable."
5501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "hp_guess"   "Guess for half-pel search."
5511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
5521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
5531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void AVCMBMotionSearch(AVCEncObject *encvid, uint8 *cur, uint8 *best_cand[],
5541cc31e629e8132df390ae692873c847d1c2f62c0James Dong                           int i0, int j0, int type_pred, int FS_en, int *hp_guess);
5551cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5561cc31e629e8132df390ae692873c847d1c2f62c0James Dong//AVCEnc_Status AVCMBMotionSearch(AVCEncObject *encvid, AVCMacroblock *currMB, int mbNum,
5571cc31e629e8132df390ae692873c847d1c2f62c0James Dong//                           int num_pass);
5581cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5591cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
5601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    Perform full-pel exhaustive search around the predicted MV.
5611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject structure."
5621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "prev"   "Pointer to the reference frame."
5631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cur"    "Pointer to the input macroblock."
5641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "imin"   "Pointer to minimal mv (x)."
5651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "jmin"   "Pointer to minimal mv (y)."
5661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "ilow, ihigh, jlow, jhigh"   "Lower bound on search range."
5671cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cmvx, cmvy" "Predicted MV value."
5681cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "The cost function of the best candidate."
5701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
5711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCFullSearch(AVCEncObject *encvid, uint8 *prev, uint8 *cur,
5721cc31e629e8132df390ae692873c847d1c2f62c0James Dong                      int *imin, int *jmin, int ilow, int ihigh, int jlow, int jhigh,
5731cc31e629e8132df390ae692873c847d1c2f62c0James Dong                      int cmvx, int cmvy);
5741cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
5761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    Select candidates from neighboring blocks according to the type of the
5771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    prediction selection.
5781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "mvx"    "Pointer to the candidate, x-coordinate."
5791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "mvy"    "Pointer to the candidate, y-coordinate."
5801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "num_can"    "Pointer to the number of candidates returned."
5811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "imb"    "The MB index x-coordinate."
5821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "jmb"    "The MB index y-coordinate."
5831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "type_pred"  "Type of the prediction."
5841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cmvx, cmvy" "Pointer to predicted MV (modified version)."
5851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
5861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
5871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void AVCCandidateSelection(int *mvx, int *mvy, int *num_can, int imb, int jmb,
5881cc31e629e8132df390ae692873c847d1c2f62c0James Dong                               AVCEncObject *encvid, int type_pred, int *cmvx, int *cmvy);
5891cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
5911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    Utility function to move the values in the array dn according to the new
5921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    location to avoid redundant calculation.
5931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "dn" "Array of integer of size 9."
5941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "new_loc"    "New location index."
5951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
5961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
5971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void AVCMoveNeighborSAD(int dn[], int new_loc);
5981cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    Find minimum index of dn.
6011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "dn" "Array of integer of size 9."
6021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "The index of dn with the smallest dn[] value."
6031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
6041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCFindMin(int dn[]);
6051cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6061cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*------------- findhalfpel.c -------------------*/
6081cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    Search for the best half-pel resolution MV around the full-pel MV.
6111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the global AVCEncObject structure."
6121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cur"    "Pointer to the current macroblock."
6131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "mot"    "Pointer to the AVCMV array of the frame."
6141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "ncand"  "Pointer to the origin of the fullsearch result."
6151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "xpos"   "The current MB position in x."
6161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "ypos"   "The current MB position in y."
6171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "hp_guess"   "Input to help speedup the search."
6181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cmvx, cmvy" "Predicted motion vector use for mvcost."
6191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "Minimal cost (SATD) without MV cost. (for rate control purpose)"
6201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
6211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCFindHalfPelMB(AVCEncObject *encvid, uint8 *cur, AVCMV *mot, uint8 *ncand,
6221cc31e629e8132df390ae692873c847d1c2f62c0James Dong                         int xpos, int ypos, int hp_guess, int cmvx, int cmvy);
6231cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function generates sub-pel pixels required to do subpel MV search.
6261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "subpel_pred" "Pointer to 2-D array, each array for each position."
6271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "ncand" "Pointer to the full-pel center position in ref frame."
6281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "lx" "Pitch of the ref frame."
6291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
6301cc31e629e8132df390ae692873c847d1c2f62c0James Dong     */
6311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void GenerateHalfPelPred(uint8 *subpel_pred, uint8 *ncand, int lx);
6321cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculate vertical interpolation at half-point of size 4x17.
6351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "dst" "Pointer to destination."
6361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "ref" "Pointer to the starting reference pixel."
6371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
6381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
6391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void VertInterpWClip(uint8 *dst, uint8 *ref);
6401cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function generates quarter-pel pixels around the best half-pel result
6431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    during the sub-pel MV search.
6441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "bilin_base"  "Array of pointers to be used as basis for q-pel interp."
6451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "qpel_pred"  "Array of pointers pointing to quarter-pel candidates."
6461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "hpel_pos" "Best half-pel position at the center."
6471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
6481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
6491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void GenerateQuartPelPred(uint8 **bilin_base, uint8 *qpel_pred, int hpel_pos);
6501cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculates the SATD of a subpel candidate.
6531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cand"   "Pointer to a candidate."
6541cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "cur"    "Pointer to the current block."
6551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "dmin"   "Min-so-far SATD."
6561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "Sum of Absolute Transformed Difference."
6571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
6581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int SATD_MB(uint8 *cand, uint8 *cur, int dmin);
6591cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*------------- rate_control.c -------------------*/
6611cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /** This function is a utility function. It returns average QP of the previously encoded frame.
6631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "rateCtrl" "Pointer to AVCRateControl structure."
6641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "Average QP."
6651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
6661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int GetAvgFrameQP(AVCRateControl *rateCtrl);
6671cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function takes the timestamp of the input and determine whether it should be encoded
6701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    or skipped.
6711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the AVCEncObject structure."
6721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "rateCtrl"   "Pointer to the AVCRateControl structure."
6731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "modTime"    "The 32 bit timestamp of the input frame."
6741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "frameNum"   "Pointer to the frame number if to be encoded."
6751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVC_SUCCESS or else."
6761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
6771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status RCDetermineFrameNum(AVCEncObject *encvid, AVCRateControl *rateCtrl, uint32 modTime, uint *frameNum);
6781cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function updates the buffer fullness when frames are dropped either by the
6811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    rate control algorithm or by the users to make sure that target bit rate is still met.
6821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video" "Pointer to the common object structure."
6831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "rateCtrl" "Pointer to rate control structure."
6841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "frameInc" "Difference of the current frame number and previous frame number."
6851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
6861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
6871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void RCUpdateBuffer(AVCCommonObj *video, AVCRateControl *rateCtrl, int frameInc);
6881cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function initializes rate control module and allocates necessary bufferes to do the job.
6911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "avcHandle" "Pointer to the encoder handle."
6921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS or AVCENC_MEMORY_FAIL."
6931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
6941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status InitRateControlModule(AVCHandle *avcHandle);
6951cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
6971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function frees buffers allocated in InitRateControlModule.
6981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "avcHandle" "Pointer to the encoder handle."
6991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
7001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void CleanupRateControlModule(AVCHandle *avcHandle);
7021cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function is called at the beginning of each GOP or the first IDR frame. It calculates
7051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    target bits for a GOP.
7061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the encoder object."
7071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
7081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void RCInitGOP(AVCEncObject *encvid);
7101cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculates target bits for a particular frame.
7131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to the AVCEncObject structure."
7141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
7151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void RCInitFrameQP(AVCEncObject *video);
7171cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculates QP for the upcoming frame or basic unit.
7201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the encoder object."
7211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "rateCtrl" "Pointer to the rate control object."
7221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "QP value ranging from 0-51."
7231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int  RCCalculateQP(AVCEncObject *encvid, AVCRateControl *rateCtrl);
7251cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function translates the luma QP to chroma QP and calculates lambda based on QP.
7281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to the AVCEncObject structure."
7291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
7301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void RCInitChromaQP(AVCEncObject *encvid);
7321cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function is called before encoding each macroblock.
7351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the encoder object."
7361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
7371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void RCInitMBQP(AVCEncObject *encvid);
7391cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function updates bits usage stats after encoding an macroblock.
7421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video" "Pointer to AVCCommonObj."
7431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "rateCtrl" "Pointer to AVCRateControl."
7441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "num_header_bits" "Number of bits used for MB header."
7451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "num_texture_bits" "Number of bits used for MB texture."
7461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
7471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void RCPostMB(AVCCommonObj *video, AVCRateControl *rateCtrl, int num_header_bits, int num_texture_bits);
7491cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calculates the difference between prediction and original MB.
7521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the encoder object."
7531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB" "Pointer to the current macroblock structure."
7541cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "orgL" "Pointer to the original MB."
7551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "orgPitch" "Pointer to the original picture pitch."
7561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void."
7571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void RCCalculateMAD(AVCEncObject *encvid, AVCMacroblock *currMB, uint8 *orgL, int orgPitch);
7591cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    Restore QP related parameters of previous MB when current MB is skipped.
7621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB" "Pointer to the current macroblock."
7631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to the common video structure."
7641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the global encoding structure."
7651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
7661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7671cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void RCRestoreQP(AVCMacroblock *currMB, AVCCommonObj *video, AVCEncObject *encvid);
7681cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function is called after done with a frame.
7711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to the encoder object."
7721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS or AVCENC_SKIPPED_PICTURE when bufer overflow (need to discard current frame)."
7731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status RCUpdateFrame(AVCEncObject *encvid);
7751cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*--------- residual.c -------------------*/
7771cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes the intra pcm data and fill it in the corresponding location
7801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    on the current picture.
7811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to AVCEncObject."
7821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS if success, or else for bitstream errors."
7831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status EncodeIntraPCM(AVCEncObject *video);
7851cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
7871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs CAVLC syntax encoding on the run and level information of the coefficients.
7881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    The level and run arrays are elements in AVCEncObject structure, populated by TransQuantZZ,
7891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    TransQuantIntraDC and TransQuantChromaDC functions.
7901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to AVCEncObject."
7911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "type"   "One of AVCResidualType for a particular 4x4 block."
7921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "bindx"  "Block index or number of nonzero coefficients for AVC_Intra16DC and AVC_ChromaDC mode."
7931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB" "Pointer to the current macroblock structure."
7941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success."
7951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \Note   "This function has 32-bit machine specific instruction!!!!"
7961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
7971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status enc_residual_block(AVCEncObject *encvid, AVCResidualType type, int bindx, AVCMacroblock *currMB);
7981cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7991cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*------------- sad.c ---------------------------*/
8011cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8021cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HalfPel_Cxhyh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
8041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HalfPel_Cyh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
8051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HalfPel_Cxh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
8061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_Macroblock_C(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
8071cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8081cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifdef HTFM /*  3/2/1, Hypothesis Testing Fast Matching */
8091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HP_HTFM_Collectxhyh(uint8 *ref, uint8 *blk, int dmin_x, void *extra_info);
8101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HP_HTFM_Collectyh(uint8 *ref, uint8 *blk, int dmin_x, void *extra_info);
8111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HP_HTFM_Collectxh(uint8 *ref, uint8 *blk, int dmin_x, void *extra_info);
8121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HP_HTFMxhyh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
8131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HP_HTFMyh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
8141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HP_HTFMxh(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
8151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HTFM_Collect(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
8161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int AVCSAD_MB_HTFM(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
8171cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
8181cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8191cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*------------- slice.c -------------------------*/
8211cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
8231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs the main encoding loop for a slice.
8241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "Pointer to AVCEncObject."
8251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success, AVCENC_PICTURE_READY for end-of-picture and
8261cc31e629e8132df390ae692873c847d1c2f62c0James Dong             AVCENC_FAIL or AVCENC_SLICE_EMPTY otherwise."
8271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
8281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status AVCEncodeSlice(AVCEncObject *encvid);
8291cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
8311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs the main encoding operation for one macroblock.
8321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video" "pointer to AVCEncObject."
8331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success, or other bitstream related failure status."
8341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
8351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status EncodeMB(AVCEncObject *video);
8361cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
8381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function calls prediction INTRA/INTER functions, transform,
8391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    quantization and zigzag scanning to get the run-level symbols.
8401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "encvid" "pointer to AVCEncObject."
8411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curL"   "pointer to Luma component of the current frame.
8421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curCb"  "pointer to Cb component of the current frame.
8431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curCr"  "pointer to Cr component of the current frame.
8441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void for now."
8451cc31e629e8132df390ae692873c847d1c2f62c0James Dong     */
8461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void MBPredTransQuantZZ(AVCEncObject *encvid, uint8 *curL, uint8 *curCb, uint8 *curCr);
8471cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
8491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function copies the content of the prediction MB into the reconstructed YUV
8501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    frame directly.
8511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curL"   "Pointer to the destination Y component."
8521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curCb"  "Pointer to the destination Cb component."
8531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "curCr"  "Pointer to the destination Cr component."
8541cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "predBlock"  "Pointer to the prediction MB."
8551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "picWidth"   "The width of the frame."
8561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "None."
8571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
8581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void Copy_MB(uint8 *curL, uint8 *curCb, uint8 *curCr, uint8 *predBlock, int picWidth);
8591cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
8611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes the mb_type, CBP, prediction mode, ref idx and MV.
8621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB" "Pointer to the current macroblock structure."
8631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video" "Pointer to the AVCEncObject structure."
8641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or else for fail."
8651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
8661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status EncodeMBHeader(AVCMacroblock *currMB, AVCEncObject *video);
8671cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
8691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function finds the right mb_type for a macroblock given the mbMode, CBP,
8701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    NumPart, PredPartMode.
8711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB" "Pointer to the current macroblock structure."
8721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "slice_type" "Value of the slice_type."
8731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "mb_type."
8741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
8751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint InterpretMBType(AVCMacroblock *currMB, int slice_type);
8761cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
8781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes the mb_pred part of the macroblock data.
8791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to the AVCCommonObj structure."
8801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB" "Pointer to the current macroblock structure."
8811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to the AVCEncBitstream structure."
8821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or bitstream fail status."
8831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
8841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status mb_pred(AVCCommonObj *video, AVCMacroblock *currMB, AVCEncBitstream *stream);
8851cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
8871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes the sub_mb_pred part of the macroblock data.
8881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to the AVCCommonObj structure."
8891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB" "Pointer to the current macroblock structure."
8901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to the AVCEncBitstream structure."
8911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or bitstream fail status."
8921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
8931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status sub_mb_pred(AVCCommonObj *video, AVCMacroblock *currMB, AVCEncBitstream *stream);
8941cc31e629e8132df390ae692873c847d1c2f62c0James Dong
8951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
8961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function interprets the sub_mb_type and sets necessary information
8971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    when the slice type is AVC_P_SLICE.
8981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    in the macroblock structure.
8991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "mblock" "Pointer to current AVCMacroblock."
9001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "sub_mb_type" "From the syntax bitstream."
9011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
9021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void InterpretSubMBTypeP(AVCMacroblock *mblock, uint *sub_mb_type);
9041cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function interprets the sub_mb_type and sets necessary information
9071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    when the slice type is AVC_B_SLICE.
9081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    in the macroblock structure.
9091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "mblock" "Pointer to current AVCMacroblock."
9101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "sub_mb_type" "From the syntax bitstream."
9111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
9121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void InterpretSubMBTypeB(AVCMacroblock *mblock, uint *sub_mb_type);
9141cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes intra 4x4 mode. It calculates the predicted I4x4 mode and the
9171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    remnant to be encoded.
9181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "video"  "Pointer to AVCEncObject structure."
9191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB" "Pointer to the AVCMacroblock structure."
9201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to AVCEncBitstream sructure."
9211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success."
9221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status EncodeIntra4x4Mode(AVCCommonObj *video, AVCMacroblock *currMB, AVCEncBitstream *stream);
9241cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*------------- vlc_encode.c -----------------------*/
9261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes and writes a value into an Exp-Golomb codeword.
9281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "bitstream" "Pointer to AVCEncBitstream."
9291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "codeNum" "Pointer to the value of the codeNum."
9301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or bitstream error messages for fail."
9311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status ue_v(AVCEncBitstream *bitstream, uint codeNum);
9331cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function maps and encodes signed Exp-Golomb codes.
9361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "bitstream" "Pointer to AVCEncBitstream."
9371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "value"  "Pointer to syntax element value."
9381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS or AVCENC_FAIL."
9391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status  se_v(AVCEncBitstream *bitstream, int value);
9411cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function maps and encodes truncated Exp-Golomb codes.
9441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "bitstream" "Pointer to AVCEncBitstream."
9451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "value"  "Pointer to syntax element value."
9461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "range"  "Range of the value as input to determine the algorithm."
9471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS or AVCENC_FAIL."
9481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status te_v(AVCEncBitstream *bitstream, uint value, uint range);
9501cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function creates Exp-Golomb codeword from codeNum.
9531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "bitstream" "Pointer to AVCEncBitstream."
9541cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "codeNum" "Pointer to the codeNum value."
9551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or bitstream error messages for fail."
9561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status SetEGBitstring(AVCEncBitstream *bitstream, uint codeNum);
9581cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9591cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function performs CAVLC encoding of the CBP (coded block pattern) of a macroblock
9611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    by calling ue_v() and then mapping the CBP to the corresponding VLC codeNum.
9621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "currMB"  "Pointer to the current AVCMacroblock structure."
9631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream"  "Pointer to the AVCEncBitstream."
9641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "void"
9651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status EncodeCBP(AVCMacroblock *currMB, AVCEncBitstream *stream);
9671cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes trailing ones and total coefficient.
9701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to the AVCEncBitstream."
9711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "TrailingOnes"   "The trailing one variable output."
9721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "TotalCoeff" "The total coefficient variable output."
9731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "nC" "Context for number of nonzero coefficient (prediction context)."
9741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or else for bitstream failure."
9751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status ce_TotalCoeffTrailingOnes(AVCEncBitstream *stream, int TrailingOnes, int TotalCoeff, int nC);
9771cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes trailing ones and total coefficient for chroma DC block.
9801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to the AVCEncBitstream."
9811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "TrailingOnes"   "The trailing one variable output."
9821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "TotalCoeff" "The total coefficient variable output."
9831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or else for bitstream failure."
9841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status ce_TotalCoeffTrailingOnesChromaDC(AVCEncBitstream *stream, int TrailingOnes, int TotalCoeff);
9861cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes total_zeros value as in Table 9-7 and 9-8.
9891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to the AVCEncBitstream."
9901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "TotalZeros" "The total_zeros value."
9911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "TotalCoeff" "The total coefficient variable output."
9921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or else for bitstream failure."
9931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
9941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status ce_TotalZeros(AVCEncBitstream *stream, int total_zeros, int TotalCoeff);
9951cc31e629e8132df390ae692873c847d1c2f62c0James Dong
9961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
9971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes total_zeros VLC syntax for chroma DC as in Table 9-9.
9981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to the AVCEncBitstream."
9991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "TotalZeros" "The total_zeros value."
10001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "TotalCoeff" "The total coefficient variable output."
10011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or else for bitstream failure."
10021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
10031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status ce_TotalZerosChromaDC(AVCEncBitstream *stream, int total_zeros, int TotalCoeff);
10041cc31e629e8132df390ae692873c847d1c2f62c0James Dong
10051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /**
10061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    This function encodes run_before VLC syntax as in Table 9-10.
10071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "stream" "Pointer to the AVCEncBitstream."
10081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "run_before" "The run_before value."
10091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \param "zerosLeft"  "The context for number of zeros left."
10101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    \return "AVCENC_SUCCESS for success or else for bitstream failure."
10111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    */
10121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status ce_RunBefore(AVCEncBitstream *stream, int run_before, int zerosLeft);
10131cc31e629e8132df390ae692873c847d1c2f62c0James Dong
10141cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifdef __cplusplus
10151cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
10161cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
10171cc31e629e8132df390ae692873c847d1c2f62c0James Dong
10181cc31e629e8132df390ae692873c847d1c2f62c0James Dong
10191cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif /* _AVCENC_LIB_H_ */
10201cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1021