MPEG2Dec.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:9k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #pragma once
  2. #include <windows.h>
  3. #include <winreg.h>
  4. #include <stdio.h>
  5. #include <io.h>
  6. #include <fcntl.h>
  7. /* code definition */
  8. #define PICTURE_START_CODE 0x100
  9. #define SLICE_START_CODE_MIN 0x101
  10. #define SLICE_START_CODE_MAX 0x1AF
  11. #define USER_DATA_START_CODE 0x1B2
  12. #define SEQUENCE_HEADER_CODE 0x1B3
  13. #define EXTENSION_START_CODE 0x1B5
  14. #define SEQUENCE_END_CODE 0x1B7
  15. #define GROUP_START_CODE 0x1B8
  16. #define SYSTEM_END_CODE 0x1B9
  17. #define PACK_START_CODE 0x1BA
  18. #define SYSTEM_START_CODE 0x1BB
  19. #define PRIVATE_STREAM_1 0x1BD
  20. #define VIDEO_ELEMENTARY_STREAM 0x1E0
  21. /* extension start code IDs */
  22. #define SEQUENCE_EXTENSION_ID 1
  23. #define SEQUENCE_DISPLAY_EXTENSION_ID 2
  24. #define QUANT_MATRIX_EXTENSION_ID 3
  25. #define COPYRIGHT_EXTENSION_ID 4
  26. #define PICTURE_DISPLAY_EXTENSION_ID 7
  27. #define PICTURE_CODING_EXTENSION_ID 8
  28. #define ZIG_ZAG 0
  29. #define MB_WEIGHT 32
  30. #define MB_CLASS4 64
  31. #define I_TYPE 1
  32. #define P_TYPE 2
  33. #define B_TYPE 3
  34. #define TOP_FIELD 1
  35. #define BOTTOM_FIELD 2
  36. #define FRAME_PICTURE 3
  37. #define MACROBLOCK_INTRA 1
  38. #define MACROBLOCK_PATTERN 2
  39. #define MACROBLOCK_MOTION_BACKWARD 4
  40. #define MACROBLOCK_MOTION_FORWARD 8
  41. #define MACROBLOCK_QUANT 16
  42. #define MC_FIELD 1
  43. #define MC_FRAME 2
  44. #define MC_16X8 2
  45. #define MC_DMV 3
  46. #define MV_FIELD 0
  47. #define MV_FRAME 1
  48. #define CHROMA420 1
  49. #define CHROMA422 2
  50. #define CHROMA444 3
  51. #define BUFFER_SIZE 2048
  52. #define MAX_FILE_NUMBER 256
  53. #define IDCT_MMX 1
  54. #define IDCT_SSEMMX 2
  55. #define IDCT_FPU 3
  56. #define IDCT_REF 4
  57. #define FO_NONE 0
  58. #define FO_FILM 1
  59. #define FO_SWAP 2
  60. typedef void (WINAPI *PBufferOp) (unsigned char*, int, int);
  61. #define MAX_FRAME_NUMBER 1000000
  62. #define MAX_GOP_SIZE 1024
  63. class CMPEG2Dec  
  64. {
  65. protected:
  66.   // getbit.cpp
  67.   void Initialize_Buffer();
  68.   void Fill_Buffer();
  69.   void Next_Packet();
  70.   void Flush_Buffer_All(unsigned int N);
  71.   unsigned int Get_Bits_All(unsigned int N);
  72.   void Next_File();
  73.   unsigned int Show_Bits(unsigned int N);
  74.   unsigned int Get_Bits(unsigned int N);
  75.   void Flush_Buffer(unsigned int N);
  76.   void Fill_Next();
  77.   unsigned int Get_Byte();
  78.   unsigned int Get_Short();
  79.   void next_start_code();
  80.   unsigned char Rdbfr[BUFFER_SIZE], *Rdptr, *Rdmax;
  81.   unsigned int CurrentBfr, NextBfr, BitsLeft, Val, Read;
  82.   // gethdr.cpp
  83.   int Get_Hdr();
  84.   void sequence_header();
  85.   int slice_header();
  86. private:
  87.   void group_of_pictures_header();
  88.   void picture_header();
  89.   void sequence_extension();
  90.   void sequence_display_extension();
  91.   void quant_matrix_extension();
  92.   void picture_display_extension();
  93.   void picture_coding_extension();
  94.   void copyright_extension();
  95.   int  extra_bit_information();
  96.   void extension_and_user_data();
  97. protected:
  98.   // getpic.cpp
  99.   void Decode_Picture(int ref, unsigned char *dst, int pitch);
  100. private:
  101.   void Update_Picture_Buffers();
  102.   void picture_data();
  103.   int slice(int MBAmax);
  104.   void macroblock_modes(int *pmacroblock_type, int *pmotion_type, 
  105.    int *pmotion_vector_count, int *pmv_format, int *pdmv, int *pmvscale, int *pdct_type);
  106.   void Clear_Block(int count);
  107.   void Add_Block(int count, int bx, int by, int dct_type, int addflag);
  108.   void motion_compensation(int MBA, int macroblock_type, int motion_type,
  109.   int PMV[2][2][2], int motion_vertical_field_select[2][2], int dmvector[2], int dct_type);
  110.   void skipped_macroblock(int dc_dct_pred[3], int PMV[2][2][2], 
  111.    int *motion_type, int motion_vertical_field_select[2][2], int *macroblock_type);
  112.   int start_of_slice(int *MBA, int *MBAinc, int dc_dct_pred[3], int PMV[2][2][2]);
  113.   int decode_macroblock(int *macroblock_type, int *motion_type, int *dct_type,
  114.   int PMV[2][2][2], int dc_dct_pred[3], int motion_vertical_field_select[2][2], int dmvector[2]);
  115.   void Decode_MPEG2_Intra_Block(int comp, int dc_dct_pred[]);
  116.   void Decode_MPEG2_Non_Intra_Block(int comp);
  117.   int Get_macroblock_type();
  118.   int Get_I_macroblock_type();
  119.   int Get_P_macroblock_type();
  120.   int Get_B_macroblock_type();
  121.   int Get_D_macroblock_type();
  122.   int Get_coded_block_pattern();
  123.   int Get_macroblock_address_increment();
  124.   int Get_Luma_DC_dct_diff();
  125.   int Get_Chroma_DC_dct_diff();
  126.   void form_predictions(int bx, int by, int macroblock_type, int motion_type, 
  127.   int PMV[2][2][2], int motion_vertical_field_select[2][2], int dmvector[2]);
  128.   void form_prediction(unsigned char *src[], int sfield, unsigned char *dst[], int dfield, 
  129.   int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag);
  130.   void form_component_prediction(unsigned char *src, unsigned char *dst,
  131.   int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag);
  132.   // motion.cpp
  133.   void motion_vectors(int PMV[2][2][2], int dmvector[2], int motion_vertical_field_select[2][2], 
  134.   int s, int motion_vector_count, int mv_format, 
  135.   int h_r_size, int v_r_size, int dmv, int mvscale);
  136.   void Dual_Prime_Arithmetic(int DMV[][2], int *dmvector, int mvx, int mvy);
  137. private:
  138.   void motion_vector(int *PMV, int *dmvector, int h_r_size, int v_r_size, 
  139.    int dmv, int mvscale, int full_pel_vector);
  140.   void decode_motion_vector(int *pred, int r_size, int motion_code,
  141.    int motion_residualesidual, int full_pel_vector);
  142.   int Get_motion_code();
  143.   int Get_dmvector();
  144. protected:
  145.   // store.cpp
  146.   void assembleFrame(unsigned char *src[], int pf, unsigned char *dst, int pitch);
  147. private:
  148.   void Luminance_Filter(unsigned char *src, unsigned char *dst);
  149.   void conv420to422(unsigned char *src, unsigned char *dst, int frame_type);
  150.   void conv422to444(unsigned char *src, unsigned char *dst);
  151.   void conv444toRGB24(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst, int pitch);
  152.   void conv422toYUY2(unsigned char *py, unsigned char *pu, unsigned char *pv, unsigned char *dst, int pitch);
  153. protected:
  154.   // decoder operation control flags
  155.   int Fault_Flag;
  156.   int File_Flag;
  157.   int File_Limit;
  158.   int FO_Flag;
  159.   int IDCT_Flag;
  160.   int SystemStream_Flag;
  161.   int Luminance_Flag;
  162.   int Resize_Flag;
  163.   int KeyOp_Flag;
  164.   int lfsr0, lfsr1;
  165.   PBufferOp BufferOp;
  166.   int Infile[MAX_FILE_NUMBER];
  167.   char *Infilename[MAX_FILE_NUMBER];
  168.   int intra_quantizer_matrix[64];
  169.   int non_intra_quantizer_matrix[64];
  170.   int chroma_intra_quantizer_matrix[64];
  171.   int chroma_non_intra_quantizer_matrix[64];
  172.   
  173.   int load_intra_quantizer_matrix;
  174.   int load_non_intra_quantizer_matrix;
  175.   int load_chroma_intra_quantizer_matrix;
  176.   int load_chroma_non_intra_quantizer_matrix;
  177.   int q_scale_type;
  178.   int alternate_scan;
  179.   int quantizer_scale;
  180.   void *fTempArray, *p_fTempArray;
  181.   short *block[8], *p_block[8];
  182.   int pf_backward, pf_forward, pf_current;
  183.   // global values
  184.   unsigned char *backward_reference_frame[3], *forward_reference_frame[3];
  185.   unsigned char *auxframe[3], *current_frame[3];
  186.   unsigned char *u422, *v422, *u444, *v444, /* *rgb24,*/ *lum;
  187.   unsigned char *dstFrame; // replaces rgb24
  188.   __int64 RGB_Scale, RGB_Offset, RGB_CRV, RGB_CBU, RGB_CGX, LumOffsetMask, LumGainMask;
  189.   int HALF_WIDTH, PROGRESSIVE_HEIGHT, INTERLACED_HEIGHT, DOUBLE_WIDTH;
  190.   int /*TWIDTH, SWIDTH,*/ HALF_WIDTH_D8, LUM_AREA, CLIP_AREA, HALF_CLIP_AREA, CLIP_STEP;
  191.   int DSTBYTES, DSTBYTES2; // these replace TWIDTH and SWIDTH
  192. public:
  193.   int Clip_Width, Clip_Height, Resize_Width, Resize_Height;
  194. protected:
  195.   int Coded_Picture_Width, Coded_Picture_Height, Chroma_Width, Chroma_Height;
  196.   int block_count, Second_Field;
  197.   int horizontal_size, vertical_size, mb_width, mb_height;
  198.   /* ISO/IEC 13818-2 section 6.2.2.3:  sequence_extension() */
  199.   int progressive_sequence;
  200.   int chroma_format;
  201.   /* ISO/IEC 13818-2 section 6.2.3: picture_header() */
  202.   int picture_coding_type;
  203.   int temporal_reference;
  204.   /* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
  205.   int f_code[2][2];
  206.   int picture_structure;
  207.   int frame_pred_frame_dct;
  208.   int progressive_frame;
  209.   int concealment_motion_vectors;
  210.   int intra_dc_precision;
  211.   int top_field_first;
  212.   int repeat_first_field;
  213.   int intra_vlc_format;
  214.   // interface
  215.   typedef struct {
  216. DWORD number;
  217. int file;
  218. __int64 position;
  219.   } GOPLIST;
  220.   GOPLIST *GOPList[MAX_FRAME_NUMBER];
  221.   typedef struct {
  222. DWORD top;
  223. DWORD bottom;
  224. char forward;
  225. char backward;
  226.   } FRAMELIST;
  227.   FRAMELIST *FrameList[MAX_FRAME_NUMBER];
  228.   unsigned char *GOPBuffer[MAX_GOP_SIZE];
  229. public:
  230.   BOOL Field_Order, Full_Frame;
  231. protected:
  232.   HINSTANCE hLibrary;
  233.   void Copyodd(unsigned char *src, unsigned char *dst, int pitch, int forward);
  234.   void Copyeven(unsigned char *src, unsigned char *dst, int pitch, int forward);
  235. public:
  236.   FILE *VF_File;
  237.   int VF_FrameRate;
  238.   DWORD VF_FrameLimit;
  239.   DWORD VF_FrameBound;
  240.   DWORD VF_GOPLimit;
  241.   DWORD VF_GOPNow;
  242.   DWORD VF_GOPSize;
  243.   int VF_FrameSize;
  244.   DWORD VF_OldFrame;
  245.   DWORD VF_OldRef;
  246.   enum DstFormat {
  247. RGB24, YUY2
  248.   };
  249.   DstFormat m_dstFormat;
  250.   CMPEG2Dec();
  251.   ~CMPEG2Dec() {Close();}
  252.   int Open(const char *path, DstFormat);
  253.   void Close();
  254.   void Decode(unsigned char *dst, DWORD frame, int pitch);
  255.   bool dstRGB24() const { return m_dstFormat == RGB24; }
  256.   bool dstYUY2() const { return m_dstFormat == YUY2; }
  257. };