diff options
Diffstat (limited to 'Src/f263/Decoder.h')
-rw-r--r-- | Src/f263/Decoder.h | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/Src/f263/Decoder.h b/Src/f263/Decoder.h new file mode 100644 index 00000000..4f4c6508 --- /dev/null +++ b/Src/f263/Decoder.h @@ -0,0 +1,139 @@ +#pragma once +#include <bfc/platform/types.h> +#include "BitReader.h" +#include "IDCT.h" +#include "IDCTRef.h" +#include "lib.h" + +/* this is necessary for the max resolution 16CIF */ +#define MBC 88 +#define MBR 72 + +#define PSC 1 +#define PSC_LENGTH 17 +#define SE_CODE 31 + +#define MODE_INTER 0 +#define MODE_INTER_Q 1 +#define MODE_INTER4V 2 +#define MODE_INTRA 3 +#define MODE_INTRA_Q 4 +#define MODE_INTER4V_Q 5 + +#define PBMODE_NORMAL 0 +#define PBMODE_MVDB 1 +#define PBMODE_CBPB_MVDB 2 + +#define ESCAPE 7167 +#define ESCAPE_INDEX 102 +#define EP_FORWARD_PREDICTION 0 +#define EI_EP_UPWARD_PREDICTION 1 +#define EP_BIDIRECTIONAL_PREDICTION 2 +#define EI_EP_INTRA_PREDICTION 3 +#define MAX_LAYERS 2 + +/* picture types */ +#define PCT_INTRA 0 +#define PCT_INTER 1 +#define PCT_DISPOSABLE_INTER 2 +//#define PCT_IPB 2 +#define PCT_B 3 + +#define ON 1 +#define OFF 0 +#define YES 1 +#define NO 0 + +#define B_EI_EP_STUFFING 5 +#define INVALID_MBTYPE 255 + +#define B_DIRECT_PREDICTION 0 +#define B_FORWARD_PREDICTION 1 +#define B_BACKWARD_PREDICTION 2 +#define B_BIDIRECTIONAL_PREDICTION 3 +#define B_INTRA_PREDICTION 4 + +#define SF_SQCIF 1 /* 001 */ +#define SF_QCIF 2 /* 010 */ +#define SF_CIF 3 /* 011 */ +#define SF_4CIF 4 /* 100 */ +#define SF_16CIF 5 /* 101 */ + + +/* this is necessary for the max resolution 16CIF */ +#define MBC 88 +#define MBR 72 + +#define NO_VEC 999 + +typedef unsigned char *Frame[3]; +class Decoder +{ +public: + Decoder(); + ~Decoder(); + int init(); + + void getpicture(Frame frame); + int getheader(); + + int DecodeFrame(YV12_PLANES *yv12, int *width, int *height, int *keyframe); + + + static unsigned char *clp; + + BitReader buffer; +private: + void reconstruct(int bx, int by, int mode); + + void get_I_P_MBs(); + void horiz_edge_filter(unsigned char *rec, int width, int height, int chr); + void vert_edge_filter(unsigned char *rec, int width, int height, int chr); + void edge_filter(unsigned char *lum, unsigned char *Cb, unsigned char *Cr, int width, int height); + void vert_post_filter(unsigned char *rec, int width, int height, int chr); + void horiz_post_filter(unsigned char *rec, int width, int height, int chr); + void PostFilter(unsigned char *lum, unsigned char *Cb, unsigned char *Cr,int width, int height); + void addblock(int comp, int bx, int by, int addflag); + int find_pmv(int x, int y, int block, int comp); + void getpicturehdr(); + + + void getblock(int comp, int mode); + void clearblock(int comp); + + void startcode(); + + /* vlc */ + int getTMNMV(void); + int getMCBPC(void); + int getMBTYPE (int *cbp_present, int *quant_present); + int getMCBPCintra(void); + int getCBPY(void); + +private: + Frame refframe, oldrefframe, newframe; + Frame edgeframe, edgeframeorig; + int MV[2][5][MBR+1][MBC+2]; + int modemap[MBR+1][MBC+2]; + int coded_map[MBR + 1][MBC + 1]; + int quant_map[MBR + 1][MBC + 1]; + unsigned int horizontal_size,vertical_size,mb_width,mb_height; + unsigned int coded_picture_width, coded_picture_height; + unsigned int chrom_width,chrom_height; + int pict_type; + int fault; + int deblock; + int refidct; + int quant; + int escapemode; + bool firstFrame; + + IDCT idct; + + /* block data */ + short block[12][64]; + static bool initted; + static unsigned char clp_table[1024]; + + +};
\ No newline at end of file |