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 application function interfaces to the AVC encoder library
201cc31e629e8132df390ae692873c847d1c2f62c0James Dongand necessary type defitionitions and enumerations.
211cc31e629e8132df390ae692873c847d1c2f62c0James Dong@publishedAll
221cc31e629e8132df390ae692873c847d1c2f62c0James Dong*/
231cc31e629e8132df390ae692873c847d1c2f62c0James Dong
241cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifndef AVCENC_INT_H_INCLUDED
251cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define AVCENC_INT_H_INCLUDED
261cc31e629e8132df390ae692873c847d1c2f62c0James Dong
271cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifndef AVCINT_COMMON_H_INCLUDED
281cc31e629e8132df390ae692873c847d1c2f62c0James Dong#include "avcint_common.h"
291cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
301cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifndef AVCENC_API_H_INCLUDED
311cc31e629e8132df390ae692873c847d1c2f62c0James Dong#include "avcenc_api.h"
321cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
331cc31e629e8132df390ae692873c847d1c2f62c0James Dong
341cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef float OsclFloat;
351cc31e629e8132df390ae692873c847d1c2f62c0James Dong
361cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* Definition for the structures below */
371cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define DEFAULT_ATTR    0 /* default memory attribute */
381cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define MAX_INPUT_FRAME 30 /* some arbitrary number, it can be much higher than this. */
391cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define MAX_REF_FRAME  16 /* max size of the RefPicList0 and RefPicList1 */
401cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define MAX_REF_PIC_LIST 33
411cc31e629e8132df390ae692873c847d1c2f62c0James Dong
421cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define MIN_QP          0
431cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define MAX_QP          51
441cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define SHIFT_QP        12
451cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define  LAMBDA_ACCURACY_BITS         16
461cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define  LAMBDA_FACTOR(lambda)        ((int)((double)(1<<LAMBDA_ACCURACY_BITS)*lambda+0.5))
471cc31e629e8132df390ae692873c847d1c2f62c0James Dong
481cc31e629e8132df390ae692873c847d1c2f62c0James Dong
491cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define DISABLE_THRESHOLDING  0
501cc31e629e8132df390ae692873c847d1c2f62c0James Dong// for better R-D performance
511cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define _LUMA_COEFF_COST_       4 //!< threshold for luma coeffs
521cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define _CHROMA_COEFF_COST_     4 //!< threshold for chroma coeffs, used to be 7
531cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define _LUMA_MB_COEFF_COST_    5 //!< threshold for luma coeffs of inter Macroblocks
541cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define _LUMA_8x8_COEFF_COST_   5 //!< threshold for luma coeffs of 8x8 Inter Partition
551cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define MAX_VALUE       999999   //!< used for start value for some variables
561cc31e629e8132df390ae692873c847d1c2f62c0James Dong
571cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define  WEIGHTED_COST(factor,bits)   (((factor)*(bits))>>LAMBDA_ACCURACY_BITS)
581cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define  MV_COST(f,s,cx,cy,px,py)     (WEIGHTED_COST(f,mvbits[((cx)<<(s))-px]+mvbits[((cy)<<(s))-py]))
591cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define  MV_COST_S(f,cx,cy,px,py)     (WEIGHTED_COST(f,mvbits[cx-px]+mvbits[cy-py]))
601cc31e629e8132df390ae692873c847d1c2f62c0James Dong
611cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* for sub-pel search and interpolation */
621cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define SUBPEL_PRED_BLK_SIZE 576 // 24x24
631cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define REF_CENTER 75
641cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V2Q_H0Q 1
651cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V0Q_H2Q 2
661cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V2Q_H2Q 3
671cc31e629e8132df390ae692873c847d1c2f62c0James Dong
681cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*
691cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V3Q_H0Q 1
701cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V3Q_H1Q 2
711cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V0Q_H1Q 3
721cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V1Q_H1Q 4
731cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V1Q_H0Q 5
741cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V1Q_H3Q 6
751cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V0Q_H3Q 7
761cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V3Q_H3Q 8
771cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V2Q_H3Q 9
781cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V2Q_H0Q 10
791cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V2Q_H1Q 11
801cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V2Q_H2Q 12
811cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V3Q_H2Q 13
821cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V0Q_H2Q 14
831cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define V1Q_H2Q 15
841cc31e629e8132df390ae692873c847d1c2f62c0James Dong*/
851cc31e629e8132df390ae692873c847d1c2f62c0James Dong
861cc31e629e8132df390ae692873c847d1c2f62c0James Dong
871cc31e629e8132df390ae692873c847d1c2f62c0James Dong#define DEFAULT_OVERRUN_BUFFER_SIZE 1000
881cc31e629e8132df390ae692873c847d1c2f62c0James Dong
891cc31e629e8132df390ae692873c847d1c2f62c0James Dong// associated with the above cost model
901cc31e629e8132df390ae692873c847d1c2f62c0James Dongconst uint8 COEFF_COST[2][16] =
911cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}
941cc31e629e8132df390ae692873c847d1c2f62c0James Dong};
951cc31e629e8132df390ae692873c847d1c2f62c0James Dong
961cc31e629e8132df390ae692873c847d1c2f62c0James Dong
971cc31e629e8132df390ae692873c847d1c2f62c0James Dong
981cc31e629e8132df390ae692873c847d1c2f62c0James Dong//! convert from H.263 QP to H.264 quant given by: quant=pow(2,QP/6)
991cc31e629e8132df390ae692873c847d1c2f62c0James Dongconst int QP2QUANT[40] =
1001cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
1011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    1, 1, 1, 1, 2, 2, 2, 2,
1021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    3, 3, 3, 4, 4, 4, 5, 6,
1031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    6, 7, 8, 9, 10, 11, 13, 14,
1041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    16, 18, 20, 23, 25, 29, 32, 36,
1051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    40, 45, 51, 57, 64, 72, 81, 91
1061cc31e629e8132df390ae692873c847d1c2f62c0James Dong};
1071cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1081cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1091cc31e629e8132df390ae692873c847d1c2f62c0James Dong/**
1101cc31e629e8132df390ae692873c847d1c2f62c0James DongThis enumeration keeps track of the internal status of the encoder whether it is doing
1111cc31e629e8132df390ae692873c847d1c2f62c0James Dongsomething. The encoding flow follows the order in which these states are.
1121cc31e629e8132df390ae692873c847d1c2f62c0James Dong@publishedAll
1131cc31e629e8132df390ae692873c847d1c2f62c0James Dong*/
1141cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef enum
1151cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
1161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Initializing = 0,
1171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Encoding_SPS,
1181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Encoding_PPS,
1191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Analyzing_Frame,
1201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_WaitingForBuffer,  // pending state
1211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Encoding_Frame,
1221cc31e629e8132df390ae692873c847d1c2f62c0James Dong} AVCEnc_State ;
1231cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1241cc31e629e8132df390ae692873c847d1c2f62c0James Dong/**
1251cc31e629e8132df390ae692873c847d1c2f62c0James DongBitstream structure contains bitstream related parameters such as the pointer
1261cc31e629e8132df390ae692873c847d1c2f62c0James Dongto the buffer, the current byte position and bit position. The content of the
1271cc31e629e8132df390ae692873c847d1c2f62c0James DongbitstreamBuffer will be in EBSP format as the emulation prevention codes are
1281cc31e629e8132df390ae692873c847d1c2f62c0James Dongautomatically inserted as the RBSP is recorded.
1291cc31e629e8132df390ae692873c847d1c2f62c0James Dong@publishedAll
1301cc31e629e8132df390ae692873c847d1c2f62c0James Dong*/
1311cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagEncBitstream
1321cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
1331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8 *bitstreamBuffer; /* pointer to buffer memory   */
1341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int buf_size;       /* size of the buffer memory */
1351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int write_pos;      /* next position to write to bitstreamBuffer  */
1361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int count_zeros;   /* count number of consecutive zero */
1371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint current_word;  /* byte-swapped (MSB left) current word to write to buffer */
1381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int bit_left;      /* number of bit left in current_word */
1391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   *overrunBuffer;  /* extra output buffer to prevent current skip due to output buffer overrun*/
1401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     oBSize;     /* size of allocated overrun buffer */
1411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void   *encvid; /* pointer to the main object */
1421cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1431cc31e629e8132df390ae692873c847d1c2f62c0James Dong} AVCEncBitstream;
1441cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1451cc31e629e8132df390ae692873c847d1c2f62c0James Dong/**
1461cc31e629e8132df390ae692873c847d1c2f62c0James DongThis structure is used for rate control purpose and other performance related control
1471cc31e629e8132df390ae692873c847d1c2f62c0James Dongvariables such as, RD cost, statistics, motion search stuffs, etc.
1481cc31e629e8132df390ae692873c847d1c2f62c0James Dongshould be in this structure.
1491cc31e629e8132df390ae692873c847d1c2f62c0James Dong@publishedAll
1501cc31e629e8132df390ae692873c847d1c2f62c0James Dong*/
1511cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1521cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1531cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagRDInfo
1541cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
1551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int QP;
1561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int actual_bits;
1571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat mad;
1581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat R_D;
1591cc31e629e8132df390ae692873c847d1c2f62c0James Dong} RDInfo;
1601cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1611cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagMultiPass
1621cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
1631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* multipass rate control data */
1641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int target_bits;    /* target bits for current frame, = rc->T */
1651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int actual_bits;    /* actual bits for current frame obtained after encoding, = rc->Rc*/
1661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int QP;             /* quantization level for current frame, = rc->Qc*/
1671cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int prev_QP;        /* quantization level for previous frame */
1681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int prev_prev_QP;   /* quantization level for previous frame before last*/
1691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat mad;          /* mad for current frame, = video->avgMAD*/
1701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int bitrate;        /* bitrate for current frame */
1711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat framerate;    /* framerate for current frame*/
1721cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int nRe_Quantized;  /* control variable for multipass encoding, */
1741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* 0 : first pass */
1751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* 1 : intermediate pass(quantization and VLC loop only) */
1761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* 2 : final pass(de-quantization, idct, etc) */
1771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* 3 : macroblock level rate control */
1781cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int encoded_frames;     /* counter for all encoded frames */
1801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int re_encoded_frames;  /* counter for all multipass encoded frames*/
1811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int re_encoded_times;   /* counter for all times of multipass frame encoding */
1821cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* Multiple frame prediction*/
1841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    RDInfo **pRDSamples;        /* pRDSamples[30][32], 30->30fps, 32 -> 5 bit quantizer, 32 candidates*/
1851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int framePos;               /* specific position in previous multiple frames*/
1861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int frameRange;             /* number of overall previous multiple frames */
1871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int samplesPerFrame[30];    /* number of samples per frame, 30->30fps */
1881cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* Bit allocation for scene change frames and high motion frames */
1901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat sum_mad;
1911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int counter_BTsrc;  /* BT = Bit Transfer, bit transfer from low motion frames or less complicatedly compressed frames */
1921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int counter_BTdst;  /* BT = Bit Transfer, bit transfer to scene change frames or high motion frames or more complicatedly compressed frames */
1931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat sum_QP;
1941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int diff_counter;   /* diff_counter = -diff_counter_BTdst, or diff_counter_BTsrc */
1951cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* For target bitrate or framerate update */
1971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat target_bits_per_frame;        /* = C = bitrate/framerate */
1981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat target_bits_per_frame_prev;   /* previous C */
1991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat aver_mad;                     /* so-far average mad could replace sum_mad */
2001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat aver_mad_prev;                /* previous average mad */
2011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int   overlapped_win_size;          /* transition period of time */
2021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int   encoded_frames_prev;          /* previous encoded_frames */
2031cc31e629e8132df390ae692873c847d1c2f62c0James Dong} MultiPass;
2041cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2051cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2061cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagdataPointArray
2071cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
2081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Qp;
2091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Rp;
2101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat Mp;   /* for MB-based RC */
2111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    struct tagdataPointArray *next;
2121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    struct tagdataPointArray *prev;
2131cc31e629e8132df390ae692873c847d1c2f62c0James Dong} dataPointArray;
2141cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2151cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagAVCRateControl
2161cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
2171cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* these parameters are initialized by the users AVCEncParams */
2191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* bitrate-robustness tradeoff */
2201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint scdEnable; /* enable scene change detection */
2211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int idrPeriod;  /* IDR period in number of frames */
2221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int intraMBRate;   /* intra MB refresh rate per frame */
2231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint dpEnable;  /* enable data partitioning */
2241cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* quality-complexity tradeoff */
2261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint subPelEnable;  /* enable quarter pel search */
2271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int mvRange;    /* motion vector search range in +/- pixel */
2281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint subMBEnable;  /* enable sub MB prediction mode (4x4, 4x8, 8x4) */
2291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint rdOptEnable;  /* enable RD-opt mode selection */
2301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint twoPass; /* flag for 2 pass encoding ( for future )*/
2311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint bidirPred; /* bi-directional prediction for B-frame. */
2321cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint rcEnable;  /* enable rate control, '1' on, '0' const QP */
2341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int initQP; /* initial QP */
2351cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* note the following 3 params are for HRD, these triplets can be a series
2371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    of triplets as the generalized HRD allows. SEI message must be generated in this case. */
2381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* We no longer have to differentiate between CBR and VBR. The users to the
2391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVC encoder lib will do the mapping from CBR/VBR to these parameters. */
2401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int32 bitRate;  /* target bit rate for the overall clip in bits/second*/
2411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int32 cpbSize;  /* coded picture buffer size in bytes */
2421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int32 initDelayOffset; /* initial CBP removal delay in bits */
2431cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat frame_rate; /* frame rate */
2451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int srcInterval; /* source frame rate in msec */
2461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int basicUnit;  /* number of macroblocks per BU */
2471cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* Then internal parameters for the operation */
2491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint first_frame; /* a flag for the first frame */
2501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int lambda_mf; /* for example */
2511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int totalSAD;    /* SAD of current frame */
2521cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*******************************************/
2541cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* this part comes from MPEG4 rate control */
2551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int alpha;  /* weight for I frame */
2561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Rs;     /*bit rate for the sequence (or segment) e.g., 24000 bits/sec */
2571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Rc;     /*bits used for the current frame. It is the bit count obtained after encoding. */
2581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Rp;     /*bits to be removed from the buffer per picture. */
2591cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*? is this the average one, or just the bits coded for the previous frame */
2601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Rps;    /*bit to be removed from buffer per src frame */
2611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat Ts;   /*number of seconds for the sequence  (or segment). e.g., 10 sec */
2621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat Ep;
2631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat Ec;   /*mean absolute difference for the current frame after motion compensation.*/
2641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /*If the macroblock is intra coded, the original spatial pixel values are summed.*/
2651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Qc;     /*quantization level used for the current frame. */
2661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Nr;     /*number of P frames remaining for encoding.*/
2671cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Rr; /*number of bits remaining for encoding this sequence (or segment).*/
2681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Rr_Old;
2691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int T;      /*target bit to be used for the current frame.*/
2701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int S;      /*number of bits used for encoding the previous frame.*/
2711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Hc; /*header and motion vector bits used in the current frame. It includes all the  information except to the residual information.*/
2721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Hp; /*header and motion vector bits used in the previous frame. It includes all the     information except to the residual information.*/
2731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Ql; /*quantization level used in the previous frame */
2741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int Bs; /*buffer size e.g., R/2 */
2751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int B;      /*current buffer level e.g., R/4 - start from the middle of the buffer */
2761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat X1;
2771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat X2;
2781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat X11;
2791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat M;            /*safe margin for the buffer */
2801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OsclFloat smTick;    /*ratio of src versus enc frame rate */
2811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    double remnant;  /*remainder frame of src/enc frame for fine frame skipping */
2821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int timeIncRes; /* vol->timeIncrementResolution */
2831cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    dataPointArray   *end; /*quantization levels for the past (20) frames */
2851cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     frameNumber; /* ranging from 0 to 20 nodes*/
2871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     w;
2881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     Nr_Original;
2891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     Nr_Old, Nr_Old2;
2901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     skip_next_frame;
2911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     Qdep;       /* smooth Q adjustment */
2921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     VBR_Enabled;
2931cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int totalFrameNumber; /* total coded frames, for debugging!!*/
2951cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    char    oFirstTime;
2971cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int numFrameBits; /* keep track of number of bits of the current frame */
2991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int NumberofHeaderBits;
3001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int NumberofTextureBits;
3011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int numMBHeaderBits;
3021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int numMBTextureBits;
3031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    double *MADofMB;
3041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int32 bitsPerFrame;
3051cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* BX rate control, something like TMN8 rate control*/
3071cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    MultiPass *pMP;
3091cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     TMN_W;
3111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     TMN_TH;
3121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     VBV_fullness;
3131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     max_BitVariance_num; /* the number of the maximum bit variance within the given buffer with the unit of 10% of bitrate/framerate*/
3141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     encoded_frames; /* counter for all encoded frames */
3151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     low_bound;              /* bound for underflow detection, usually low_bound=-Bs/2, but could be changed in H.263 mode */
3161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     VBV_fullness_offset;    /* offset of VBV_fullness, usually is zero, but can be changed in H.263 mode*/
3171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* End BX */
3181cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3191cc31e629e8132df390ae692873c847d1c2f62c0James Dong} AVCRateControl;
3201cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3211cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3221cc31e629e8132df390ae692873c847d1c2f62c0James Dong/**
3231cc31e629e8132df390ae692873c847d1c2f62c0James DongThis structure is for the motion vector information. */
3241cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagMV
3251cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
3261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int x;
3271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int y;
3281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint sad;
3291cc31e629e8132df390ae692873c847d1c2f62c0James Dong} AVCMV;
3301cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3311cc31e629e8132df390ae692873c847d1c2f62c0James Dong/**
3321cc31e629e8132df390ae692873c847d1c2f62c0James DongThis structure contains function pointers for different platform dependent implementation of
3331cc31e629e8132df390ae692873c847d1c2f62c0James Dongfunctions. */
3341cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagAVCEncFuncPtr
3351cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
3361cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int (*SAD_MB_HalfPel[4])(uint8*, uint8*, int, void *);
3381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int (*SAD_Macroblock)(uint8 *ref, uint8 *blk, int dmin_lx, void *extra_info);
3391cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3401cc31e629e8132df390ae692873c847d1c2f62c0James Dong} AVCEncFuncPtr;
3411cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3421cc31e629e8132df390ae692873c847d1c2f62c0James Dong/**
3431cc31e629e8132df390ae692873c847d1c2f62c0James DongThis structure contains information necessary for correct padding.
3441cc31e629e8132df390ae692873c847d1c2f62c0James Dong*/
3451cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagPadInfo
3461cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
3471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int i;
3481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int width;
3491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int j;
3501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int height;
3511cc31e629e8132df390ae692873c847d1c2f62c0James Dong} AVCPadInfo;
3521cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3531cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3541cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifdef HTFM
3551cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagHTFM_Stat
3561cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
3571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int abs_dif_mad_avg;
3581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint countbreak;
3591cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int offsetArray[16];
3601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int offsetRef[16];
3611cc31e629e8132df390ae692873c847d1c2f62c0James Dong} HTFM_Stat;
3621cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
3631cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3641cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3651cc31e629e8132df390ae692873c847d1c2f62c0James Dong/**
3661cc31e629e8132df390ae692873c847d1c2f62c0James DongThis structure is the main object for AVC encoder library providing access to all
3671cc31e629e8132df390ae692873c847d1c2f62c0James Dongglobal variables. It is allocated at PVAVCInitEncoder and freed at PVAVCCleanUpEncoder.
3681cc31e629e8132df390ae692873c847d1c2f62c0James Dong@publishedAll
3691cc31e629e8132df390ae692873c847d1c2f62c0James Dong*/
3701cc31e629e8132df390ae692873c847d1c2f62c0James Dongtypedef struct tagEncObject
3711cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
3721cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCCommonObj *common;
3741cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncBitstream     *bitstream; /* for current NAL */
3761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   *overrunBuffer;  /* extra output buffer to prevent current skip due to output buffer overrun*/
3771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     oBSize;     /* size of allocated overrun buffer */
3781cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* rate control */
3801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCRateControl      *rateCtrl; /* pointer to the rate control structure */
3811cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* encoding operation */
3831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_State        enc_state; /* encoding state */
3841cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCFrameIO          *currInput; /* pointer to the current input frame */
3861cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int                 currSliceGroup; /* currently encoded slice group id */
3881cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     level[24][16], run[24][16]; /* scratch memory */
3901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     leveldc[16], rundc[16]; /* for DC component */
3911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     levelcdc[16], runcdc[16]; /* for chroma DC component */
3921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     numcoefcdc[2]; /* number of coefficient for chroma DC */
3931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     numcoefdc;      /* number of coefficients for DC component */
3941cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     qp_const;
3961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     qp_const_c;
3971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /********* intra prediction scratch memory **********************/
3981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   pred_i16[AVCNumI16PredMode][256]; /* save prediction for MB */
3991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   pred_i4[AVCNumI4PredMode][16];  /* save prediction for blk */
4001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   pred_ic[AVCNumIChromaMode][128];  /* for 2 chroma */
4011cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     mostProbableI4Mode[16]; /* in raster scan order */
4031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /********* motion compensation related variables ****************/
4041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCMV   *mot16x16;          /* Saved motion vectors for 16x16 block*/
4051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCMV(*mot16x8)[2];     /* Saved motion vectors for 16x8 block*/
4061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCMV(*mot8x16)[2];     /* Saved motion vectors for 8x16 block*/
4071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCMV(*mot8x8)[4];      /* Saved motion vectors for 8x8 block*/
4081cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /********* subpel position **************************************/
4101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint32  subpel_pred[SUBPEL_PRED_BLK_SIZE/*<<2*/]; /* all 16 sub-pel positions  */
4111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   *hpel_cand[9];      /* pointer to half-pel position */
4121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     best_hpel_pos;          /* best position */
4131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   qpel_cand[8][24*16];        /* pointer to quarter-pel position */
4141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     best_qpel_pos;
4151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   *bilin_base[9][4];    /* pointer to 4 position at top left of bilinear quarter-pel */
4161cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* need for intra refresh rate */
4181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   *intraSearch;       /* Intra Array for MBs to be intra searched */
4191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint    firstIntraRefreshMBIndx; /* keep track for intra refresh */
4201cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     i4_sad;             /* temporary for i4 mode SAD */
4221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     *min_cost;          /* Minimum cost for the all MBs */
4231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     lambda_mode;        /* Lagrange parameter for mode selection */
4241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int     lambda_motion;      /* Lagrange parameter for MV selection */
4251cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   *mvbits_array;      /* Table for bits spent in the cost funciton */
4271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8   *mvbits;            /* An offset to the above array. */
4281cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* to speedup the SAD calculation */
4301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    void *sad_extra_info;
4311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint8 currYMB[256];     /* interleaved current macroblock in HTFM order */
4321cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4331cc31e629e8132df390ae692873c847d1c2f62c0James Dong#ifdef HTFM
4341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int nrmlz_th[48];       /* Threshold for fast SAD calculation using HTFM */
4351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    HTFM_Stat htfm_stat;    /* For statistics collection */
4361cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif
4371cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* statistics */
4391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int numIntraMB;         /* keep track of number of intra MB */
4401cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* encoding complexity control */
4421cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint fullsearch_enable; /* flag to enable full-pel full-search */
4431cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* misc.*/
4451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    bool outOfBandParamSet; /* flag to enable out-of-band param set */
4461cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCSeqParamSet extSPS; /* for external SPS */
4481cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCPicParamSet extPPS; /* for external PPS */
4491cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* time control */
4511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint32  prevFrameNum;   /* previous frame number starting from modTimeRef */
4521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint32  modTimeRef;     /* Reference modTime update every I-Vop*/
4531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint32  wrapModTime;    /* Offset to modTime Ref, rarely used */
4541cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint    prevProcFrameNum;  /* previously processed frame number, could be skipped */
4561cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint    prevCodedFrameNum;  /* previously encoded frame number */
4571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* POC related variables */
4581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint32  dispOrdPOCRef;      /* reference POC is displayer order unit. */
4591cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* Function pointers */
4611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncFuncPtr *functionPointer; /* store pointers to platform specific functions */
4621cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* Application control data */
4641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCHandle *avcHandle;
4651cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4661cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4671cc31e629e8132df390ae692873c847d1c2f62c0James Dong} AVCEncObject;
4681cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4691cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4701cc31e629e8132df390ae692873c847d1c2f62c0James Dong#endif /*AVCENC_INT_H_INCLUDED*/
4711cc31e629e8132df390ae692873c847d1c2f62c0James Dong
472