mpeg3video.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #ifndef MPEGVIDEO_H
  2. #define MPEGVIDEO_H
  3. #ifdef _WIN32
  4. #define SDL_THREADS
  5. #endif
  6. #ifdef _WIN32
  7. #include "systems.h"
  8. #endif
  9. #include "../bitstream.h"
  10. #include "../mpeg3private.inc"
  11. #include "idct.h"
  12. #include "slice.h"
  13. #include "../timecode.h"
  14. /* Added 03/38/96 by Alex de Jong : avoid IRIX GNU warning */
  15. #ifdef ERROR
  16. #undef ERROR
  17. #endif
  18. /* zig-zag scan */
  19. extern unsigned char mpeg3_zig_zag_scan_nommx[64];
  20. extern unsigned char mpeg3_zig_zag_scan_mmx[64];
  21. /* alternate scan */
  22. extern unsigned char mpeg3_alternate_scan_nommx[64];
  23. extern unsigned char mpeg3_alternate_scan_mmx[64];
  24. /* default intra quantization matrix */
  25. extern unsigned char mpeg3_default_intra_quantizer_matrix[64];
  26. /* Frame rate table must agree with the one in the encoder */
  27. extern double mpeg3_frame_rate_table[16];
  28. /* non-linear quantization coefficient table */
  29. extern unsigned char mpeg3_non_linear_mquant_table[32];
  30. #define CHROMA420     1     /* chroma_format */
  31. #define CHROMA422     2
  32. #define CHROMA444     3
  33. #define TOP_FIELD     1     /* picture structure */
  34. #define BOTTOM_FIELD  2
  35. #define FRAME_PICTURE 3
  36. #define SEQ_ID        1     /* extension start code IDs */
  37. #define DISP_ID       2
  38. #define QUANT_ID      3
  39. #define SEQSCAL_ID    5
  40. #define PANSCAN_ID    7
  41. #define CODING_ID     8
  42. #define SPATSCAL_ID   9
  43. #define TEMPSCAL_ID  10
  44. #define ERROR (-1)
  45. #define SC_NONE       0   /* scalable_mode */
  46. #define SC_DP         1
  47. #define SC_SPAT       2
  48. #define SC_SNR        3
  49. #define SC_TEMP       4
  50. #define I_TYPE        1     /* picture coding type */
  51. #define P_TYPE        2
  52. #define B_TYPE        3
  53. #define D_TYPE        4
  54. #define MB_INTRA      1  /* macroblock type */
  55. #define MB_PATTERN    2
  56. #define MB_BACKWARD   4
  57. #define MB_FORWARD    8
  58. #define MB_QUANT      16
  59. #define MB_WEIGHT     32
  60. #define MB_CLASS4     64
  61. #define MC_FIELD      1     /* motion_type */
  62. #define MC_FRAME      2
  63. #define MC_16X8       2
  64. #define MC_DMV        3
  65. #define MV_FIELD      0     /* mv_format */
  66. #define MV_FRAME      1
  67. typedef struct
  68. {
  69.   int cpus;
  70. /* ================================= Seeking variables ========================= */
  71. mpeg3_bits_t *vstream;
  72. int decoder_initted;
  73. unsigned char **output_rows;     /* Output frame buffer supplied by user */
  74. int in_x, in_y, in_w, in_h, out_w, out_h; /* Output dimensions */
  75. int row_span;
  76. int *x_table, *y_table;          /* Location of every output pixel in the input */
  77. int color_model;
  78. int want_yvu;                    /* Want to return a YUV frame */
  79. char *y_output, *u_output, *v_output; /* Output pointers for a YUV frame */
  80. mpeg3_slice_t slice_decoders[MPEG3_MAX_CPUS];  /* One slice decoder for every CPU */
  81. int total_slice_decoders;                       /* Total slice decoders in use */
  82. mpeg3_slice_buffer_t slice_buffers[MPEG3_MAX_CPUS];   /* Buffers for holding the slice data */
  83. int total_slice_buffers;         /* Total buffers in the array to be decompressed */
  84. int slice_buffers_initialized;     /* Total buffers initialized in the array */
  85. #ifndef SDL_THREADS
  86. pthread_mutex_t slice_lock;      /* Lock slice array while getting the next buffer */
  87. pthread_mutex_t test_lock;
  88. #else
  89. SDL_mutex *slice_lock;
  90. SDL_mutex *test_lock;
  91. #endif
  92. int blockreadsize;
  93. long maxframe;         /* Max value of frame num to read */
  94. double percentage_seek;   /* Perform a percentage seek before the next frame is read */
  95. int frame_seek;        /* Perform a frame seek before the next frame is read */
  96. long framenum;         /* Number of the next frame to be decoded */
  97. long last_number;       /* Last framenum rendered */
  98. int found_seqhdr;
  99. long bitrate;
  100. mpeg3_timecode_t gop_timecode;     /* Timecode for the last GOP header read. */
  101. int has_gops; /* Some streams have no GOPs so try sequence start codes instead */
  102. /* These are only available from elementary streams. */
  103. long frames_per_gop;       /* Frames per GOP after the first GOP. */
  104. long first_gop_frames;     /* Frames in the first GOP. */
  105. long first_frame;     /* Number of first frame stored in timecode */
  106. long last_frame;      /* Last frame in file */
  107. /* ================================= Compression variables ===================== */
  108. /* Malloced frame buffers.  2 refframes are swapped in and out. */
  109. /* while only 1 auxframe is used. */
  110. unsigned char *yuv_buffer[5];  /* Make YVU buffers contiguous for all frames */
  111. unsigned char *oldrefframe[3], *refframe[3], *auxframe[3];
  112. unsigned char *llframe0[3], *llframe1[3];
  113. unsigned char *mpeg3_zigzag_scan_table;
  114. unsigned char *mpeg3_alternate_scan_table;
  115. // Source for the next frame presentation
  116. unsigned char **output_src;
  117. /* Pointers to frame buffers. */
  118. unsigned char *newframe[3];
  119. int horizontal_size, vertical_size, mb_width, mb_height;
  120. int coded_picture_width,  coded_picture_height;
  121. int chroma_format, chrom_width, chrom_height, blk_cnt;
  122. int pict_type;
  123. int forw_r_size, back_r_size, full_forw, full_back;
  124. int prog_seq, prog_frame;
  125. int h_forw_r_size, v_forw_r_size, h_back_r_size, v_back_r_size;
  126. int dc_prec, pict_struct, topfirst, frame_pred_dct, conceal_mv;
  127. int intravlc;
  128. int repeatfirst;
  129. int repeat_count;    /* Number of times to repeat the current frame * 100 since floating point is impossible in MMX */
  130. int current_repeat;  /* Number of times the current frame has been repeated * 100 */
  131. int secondfield;
  132. int skip_bframes;
  133. int stwc_table_index, llw, llh, hm, hn, vm, vn;
  134. int lltempref, llx0, lly0, llprog_frame, llfieldsel;
  135. int matrix_coefficients;
  136. int framerate_code;
  137. float frame_rate;
  138. long *cr_to_r, *cr_to_g, *cb_to_g, *cb_to_b;
  139. long *cr_to_r_ptr, *cr_to_g_ptr, *cb_to_g_ptr, *cb_to_b_ptr;
  140. int have_mmx;
  141. int intra_quantizer_matrix[64], non_intra_quantizer_matrix[64];
  142. int chroma_intra_quantizer_matrix[64], chroma_non_intra_quantizer_matrix[64];
  143. int mpeg2;
  144. int qscale_type, altscan;      /* picture coding extension */
  145. int pict_scal;                /* picture spatial scalable extension */
  146. int scalable_mode;            /* sequence scalable extension */
  147. } mpeg3video_t;
  148. /* VIDEO */
  149. mpeg3video_t* mpeg3video_new(int is_video_stream, int cpus);
  150. int mpeg3video_delete(mpeg3video_t *video);
  151. int mpeg3video_read_frame(mpeg3video_t *video, 
  152.   unsigned char *input,
  153.   long input_size,
  154.   unsigned char **output_rows,
  155.   int in_x, 
  156.   int in_y, 
  157.   int in_w, 
  158.   int in_h, 
  159.   int out_w, 
  160.   int out_h, 
  161.   int color_model);
  162. int mpeg3video_get_header(mpeg3video_t *video, int dont_repeat);
  163. int mpeg3video_initdecoder(mpeg3video_t *video);
  164. int mpeg3video_read_yuvframe_ptr(mpeg3video_t *video, 
  165.  unsigned char *input,
  166.  long input_size,
  167.  char **y_output,
  168.  char **u_output,
  169.  char **v_output);
  170. #endif