00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef MPEG2_H
00025 #define MPEG2_H
00026
00027 #define MPEG2_VERSION(a,b,c) (((a)<<16)|((b)<<8)|(c))
00028 #define MPEG2_RELEASE MPEG2_VERSION (0, 5, 0)
00029
00030 #define SEQ_FLAG_MPEG2 1
00031 #define SEQ_FLAG_CONSTRAINED_PARAMETERS 2
00032 #define SEQ_FLAG_PROGRESSIVE_SEQUENCE 4
00033 #define SEQ_FLAG_LOW_DELAY 8
00034 #define SEQ_FLAG_COLOUR_DESCRIPTION 16
00035
00036 #define SEQ_MASK_VIDEO_FORMAT 0xe0
00037 #define SEQ_VIDEO_FORMAT_COMPONENT 0
00038 #define SEQ_VIDEO_FORMAT_PAL 0x20
00039 #define SEQ_VIDEO_FORMAT_NTSC 0x40
00040 #define SEQ_VIDEO_FORMAT_SECAM 0x60
00041 #define SEQ_VIDEO_FORMAT_MAC 0x80
00042 #define SEQ_VIDEO_FORMAT_UNSPECIFIED 0xa0
00043
00044 typedef struct mpeg2_sequence_s {
00045 unsigned int width, height;
00046 unsigned int chroma_width, chroma_height;
00047 unsigned int byte_rate;
00048 unsigned int vbv_buffer_size;
00049 uint32_t flags;
00050
00051 unsigned int picture_width, picture_height;
00052 unsigned int display_width, display_height;
00053 unsigned int pixel_width, pixel_height;
00054 unsigned int frame_period;
00055
00056 uint8_t profile_level_id;
00057 uint8_t colour_primaries;
00058 uint8_t transfer_characteristics;
00059 uint8_t matrix_coefficients;
00060 } mpeg2_sequence_t;
00061
00062 #define GOP_FLAG_DROP_FRAME 1
00063 #define GOP_FLAG_BROKEN_LINK 2
00064 #define GOP_FLAG_CLOSED_GOP 4
00065
00066 typedef struct mpeg2_gop_s {
00067 uint8_t hours;
00068 uint8_t minutes;
00069 uint8_t seconds;
00070 uint8_t pictures;
00071 uint32_t flags;
00072 } mpeg2_gop_t;
00073
00074 #define PIC_MASK_CODING_TYPE 7
00075 #define PIC_FLAG_CODING_TYPE_I 1
00076 #define PIC_FLAG_CODING_TYPE_P 2
00077 #define PIC_FLAG_CODING_TYPE_B 3
00078 #define PIC_FLAG_CODING_TYPE_D 4
00079
00080 #define PIC_FLAG_TOP_FIELD_FIRST 8
00081 #define PIC_FLAG_PROGRESSIVE_FRAME 16
00082 #define PIC_FLAG_COMPOSITE_DISPLAY 32
00083 #define PIC_FLAG_SKIP 64
00084 #define PIC_FLAG_TAGS 128
00085 #define PIC_MASK_COMPOSITE_DISPLAY 0xfffff000
00086 #define PIC_FLAG_REPEAT_FIELD 256
00087
00088 typedef struct mpeg2_picture_s {
00089 unsigned int temporal_reference;
00090 unsigned int nb_fields;
00091 uint32_t tag, tag2;
00092 uint32_t flags;
00093 struct {
00094 int x, y;
00095 } display_offset[3];
00096 } mpeg2_picture_t;
00097
00098 typedef struct mpeg2_fbuf_s {
00099 uint8_t * buf[3];
00100 void * id;
00101 } mpeg2_fbuf_t;
00102
00103 typedef struct mpeg2_info_s {
00104 const mpeg2_sequence_t * sequence;
00105 const mpeg2_gop_t * gop;
00106 const mpeg2_picture_t * current_picture;
00107 const mpeg2_picture_t * current_picture_2nd;
00108 const mpeg2_fbuf_t * current_fbuf;
00109 const mpeg2_picture_t * display_picture;
00110 const mpeg2_picture_t * display_picture_2nd;
00111 const mpeg2_fbuf_t * display_fbuf;
00112 const mpeg2_fbuf_t * discard_fbuf;
00113 const uint8_t * user_data;
00114 unsigned int user_data_len;
00115 } mpeg2_info_t;
00116
00117 typedef struct mpeg2dec_s mpeg2dec_t;
00118 typedef struct mpeg2_decoder_s mpeg2_decoder_t;
00119
00120 typedef enum {
00121 STATE_BUFFER = 0,
00122 STATE_SEQUENCE = 1,
00123 STATE_SEQUENCE_REPEATED = 2,
00124 STATE_SEQUENCE_MODIFIED = 3,
00125 STATE_GOP = 4,
00126 STATE_PICTURE = 5,
00127 STATE_SLICE_1ST = 6,
00128 STATE_PICTURE_2ND = 7,
00129 STATE_SLICE = 8,
00130 STATE_END = 9,
00131 STATE_INVALID = 10,
00132 STATE_INVALID_END = 11
00133 } mpeg2_state_t;
00134
00135 typedef struct mpeg2_convert_init_s {
00136 unsigned int id_size;
00137 unsigned int buf_size[3];
00138 void (* start) (void * id, const mpeg2_fbuf_t * fbuf,
00139 const mpeg2_picture_t * picture, const mpeg2_gop_t * gop);
00140 void (* copy) (void * id, uint8_t * const * src, unsigned int v_offset);
00141 } mpeg2_convert_init_t;
00142 typedef enum {
00143 MPEG2_CONVERT_SET = 0,
00144 MPEG2_CONVERT_STRIDE = 1,
00145 MPEG2_CONVERT_START = 2
00146 } mpeg2_convert_stage_t;
00147 typedef int mpeg2_convert_t (int stage, void * id,
00148 const mpeg2_sequence_t * sequence, int stride,
00149 uint32_t accel, void * arg,
00150 mpeg2_convert_init_t * result);
00151 int mpeg2_convert (mpeg2dec_t * mpeg2dec, mpeg2_convert_t convert, void * arg);
00152 int mpeg2_stride (mpeg2dec_t * mpeg2dec, int stride);
00153 void mpeg2_set_buf (mpeg2dec_t * mpeg2dec, uint8_t * buf[3], void * id);
00154 void mpeg2_custom_fbuf (mpeg2dec_t * mpeg2dec, int custom_fbuf);
00155
00156 #define MPEG2_ACCEL_X86_MMX 1
00157 #define MPEG2_ACCEL_X86_3DNOW 2
00158 #define MPEG2_ACCEL_X86_MMXEXT 4
00159 #define MPEG2_ACCEL_X86_SSE2 8
00160 #define MPEG2_ACCEL_X86_SSE3 16
00161 #define MPEG2_ACCEL_PPC_ALTIVEC 1
00162 #define MPEG2_ACCEL_ALPHA 1
00163 #define MPEG2_ACCEL_ALPHA_MVI 2
00164 #define MPEG2_ACCEL_SPARC_VIS 1
00165 #define MPEG2_ACCEL_SPARC_VIS2 2
00166 #define MPEG2_ACCEL_DETECT 0x80000000
00167
00168 uint32_t mpeg2_accel (uint32_t accel);
00169 mpeg2dec_t * mpeg2_init (void);
00170 const mpeg2_info_t * mpeg2_info (mpeg2dec_t * mpeg2dec);
00171 void mpeg2_close (mpeg2dec_t * mpeg2dec);
00172
00173 void mpeg2_buffer (mpeg2dec_t * mpeg2dec, uint8_t * start, uint8_t * end);
00174 int mpeg2_getpos (mpeg2dec_t * mpeg2dec);
00175 mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec);
00176
00177 void mpeg2_reset (mpeg2dec_t * mpeg2dec, int full_reset);
00178 void mpeg2_skip (mpeg2dec_t * mpeg2dec, int skip);
00179 void mpeg2_slice_region (mpeg2dec_t * mpeg2dec, int start, int end);
00180
00181 void mpeg2_tag_picture (mpeg2dec_t * mpeg2dec, uint32_t tag, uint32_t tag2);
00182
00183 void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3],
00184 uint8_t * forward_fbuf[3], uint8_t * backward_fbuf[3]);
00185 void mpeg2_slice (mpeg2_decoder_t * decoder, int code, const uint8_t * buffer);
00186 int mpeg2_guess_aspect (const mpeg2_sequence_t * sequence,
00187 unsigned int * pixel_width,
00188 unsigned int * pixel_height);
00189
00190 typedef enum {
00191 MPEG2_ALLOC_MPEG2DEC = 0,
00192 MPEG2_ALLOC_CHUNK = 1,
00193 MPEG2_ALLOC_YUV = 2,
00194 MPEG2_ALLOC_CONVERT_ID = 3,
00195 MPEG2_ALLOC_CONVERTED = 4
00196 } mpeg2_alloc_t;
00197
00198 void * mpeg2_malloc (unsigned size, mpeg2_alloc_t reason);
00199 void mpeg2_free (void * buf);
00200 void mpeg2_malloc_hooks (void * malloc (unsigned, mpeg2_alloc_t),
00201 int free (void *));
00202
00203 #endif