--- encoder.h 2002/03/08 02:44:31 1.1 +++ encoder.h 2002/06/07 10:21:48 1.8 @@ -19,7 +19,7 @@ #include "portab.h" #include "global.h" #include "image/image.h" - +#include "utils/ratecontrol.h" #define H263_QUANT 0 #define MPEG4_QUANT 1 @@ -30,8 +30,9 @@ typedef enum { - I_VOP = 0, - P_VOP = 1 + I_VOP = 0, + P_VOP = 1, + B_VOP = 2 } VOP_TYPE; @@ -43,37 +44,70 @@ typedef struct { - uint32_t width; - uint32_t height; + uint32_t width; + uint32_t height; uint32_t edged_width; uint32_t edged_height; uint32_t mb_width; uint32_t mb_height; - VOP_TYPE coding_type; - - /* rounding type; alternate 0-1 after each interframe */ - - uint32_t rounding_type; + /* frame rate increment & base */ + uint32_t fincr; + uint32_t fbase; + +#ifdef BFRAMES + int max_bframes; +#endif + /* rounding type; alternate 0-1 after each interframe */ /* 1 <= fixed_code <= 4 automatically adjusted using motion vector statistics inside - */ + */ - uint32_t fixed_code; - uint32_t quant; - uint32_t quant_type; + /* vars that not "quite" frame independant */ + uint32_t m_quant_type; + uint32_t m_rounding_type; + uint32_t m_fcode; + + HINTINFO * hint; + +#ifdef BFRAMES + uint32_t m_seconds; + uint32_t m_ticks; +#endif + +} MBParam; + + +typedef struct +{ + uint32_t quant; uint32_t motion_flags; uint32_t global_flags; -} MBParam; + + VOP_TYPE coding_type; + uint32_t rounding_type; + uint32_t fcode; + uint32_t bcode; + +#ifdef BFRAMES + uint32_t seconds; + uint32_t ticks; +#endif + + IMAGE image; + + MACROBLOCK * mbs; + +} FRAMEINFO; typedef struct { - int iTextBits; - float fMvPrevSigma; - int iMvSum; - int iMvCount; + int iTextBits; + float fMvPrevSigma; + int iMvSum; + int iMvCount; int kblks; int mblks; int ublks; @@ -84,26 +118,41 @@ typedef struct { - MBParam mbParam; + MBParam mbParam; - int iFrameNum; - int iMaxKeyInterval; - int lum_masking; + int iFrameNum; + int iMaxKeyInterval; int bitrate; // images - IMAGE sCurrent; - IMAGE sReference; - IMAGE vInterH; - IMAGE vInterV; - IMAGE vInterHV; - - // macroblock - - MACROBLOCK * pMBs; + FRAMEINFO * current; + FRAMEINFO * reference; - Statistics sStat; +#ifdef _DEBUG + IMAGE sOriginal; +#endif + IMAGE vInterH; + IMAGE vInterV; + IMAGE vInterVf; + IMAGE vInterHV; + IMAGE vInterHVf; + +#ifdef BFRAMES + /* constants */ + int bquant_ratio; + /* vars */ + int bframenum_head; + int bframenum_tail; + int flush_bframes; + + FRAMEINFO ** bframes; + IMAGE f_refh; + IMAGE f_refv; + IMAGE f_refhv; +#endif + Statistics sStat; + RateControl rate_control; } Encoder; @@ -119,28 +168,28 @@ static __inline uint8_t get_fcode(uint16_t sr) { - if (sr <= 16) + if (sr <= 16) return 1; - else if (sr <= 32) + else if (sr <= 32) return 2; - else if (sr <= 64) + else if (sr <= 64) return 3; - else if (sr <= 128) + else if (sr <= 128) return 4; - else if (sr <= 256) + else if (sr <= 256) return 5; - else if (sr <= 512) + else if (sr <= 512) return 6; - else if (sr <= 1024) + else if (sr <= 1024) return 7; - else + else return 0; }