avilib.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <sys/types.h>
00029 #include <sys/stat.h>
00030 #include <stdio.h>
00031 #include <fcntl.h>
00032
00033
00034 #ifdef __CYGWIN__
00035 #include <sys/types.h>
00036 #elif defined WIN32
00037 #if defined __GNUWIN32__
00038 #include <stdint.h>
00039 #else
00040 #define uint32_t unsigned __int32
00041 #define uint8_t unsigned __int8
00042 #define uint16_t unsigned __int16
00043 #define uint64_t unsigned __int64
00044 #endif
00045 #else
00046 #include <unistd.h>
00047 #include <inttypes.h>
00048 #endif
00049
00050
00051 #include <limits.h>
00052 #include <stdlib.h>
00053 #include <string.h>
00054 #include <errno.h>
00055
00056 #ifndef AVILIB_H
00057 #define AVILIB_H
00058
00059 #define AVI_MAX_TRACKS 8
00060
00061 typedef struct
00062 {
00063 off_t key;
00064 off_t pos;
00065 off_t len;
00066 } video_index_entry;
00067
00068 typedef struct
00069 {
00070 off_t pos;
00071 off_t len;
00072 off_t tot;
00073 } audio_index_entry;
00074
00075 typedef struct track_s
00076 {
00077
00078 long a_fmt;
00079 long a_chans;
00080 long a_rate;
00081 long a_bits;
00082 long mp3rate;
00083
00084 long audio_strn;
00085 off_t audio_bytes;
00086 long audio_chunks;
00087
00088 char audio_tag[4];
00089 long audio_posc;
00090 long audio_posb;
00091
00092 off_t a_codech_off;
00093 off_t a_codecf_off;
00094
00095 audio_index_entry *audio_index;
00096
00097 } track_t;
00098
00099 typedef struct
00100 {
00101 uint32_t bi_size;
00102 uint32_t bi_width;
00103 uint32_t bi_height;
00104 uint16_t bi_planes;
00105 uint16_t bi_bit_count;
00106 uint32_t bi_compression;
00107 uint32_t bi_size_image;
00108 uint32_t bi_x_pels_per_meter;
00109 uint32_t bi_y_pels_per_meter;
00110 uint32_t bi_clr_used;
00111 uint32_t bi_clr_important;
00112 } BITMAPINFOHEADER_avilib;
00113
00114 typedef struct
00115 {
00116 uint16_t w_format_tag;
00117 uint16_t n_channels;
00118 uint32_t n_samples_per_sec;
00119 uint32_t n_avg_bytes_per_sec;
00120 uint16_t n_block_align;
00121 uint16_t w_bits_per_sample;
00122 uint16_t cb_size;
00123 } WAVEFORMATEX_avilib;
00124
00125 typedef struct
00126 {
00127 uint32_t fcc_type;
00128 uint32_t fcc_handler;
00129 uint32_t dw_flags;
00130 uint32_t dw_caps;
00131 uint16_t w_priority;
00132 uint16_t w_language;
00133 uint32_t dw_scale;
00134 uint32_t dw_rate;
00135 uint32_t dw_start;
00136 uint32_t dw_length;
00137 uint32_t dw_initial_frames;
00138 uint32_t dw_suggested_buffer_size;
00139 uint32_t dw_quality;
00140 uint32_t dw_sample_size;
00141 uint32_t dw_left;
00142 uint32_t dw_top;
00143 uint32_t dw_right;
00144 uint32_t dw_bottom;
00145 uint32_t dw_edit_count;
00146 uint32_t dw_format_change_count;
00147 char sz_name[64];
00148 } AVISTREAMINFO;
00149
00150 typedef struct
00151 {
00152
00153 long fdes;
00154 long mode;
00155
00156 long width;
00157 long height;
00158 double fps;
00159 char compressor[8];
00160 char compressor2[8];
00161 long video_strn;
00162 long video_frames;
00163 char video_tag[4];
00164 long video_pos;
00165
00166
00167 unsigned long max_len;
00168
00169 track_t track[AVI_MAX_TRACKS];
00170
00171 off_t pos;
00172 long n_idx;
00173 long max_idx;
00174
00175 off_t v_codech_off;
00176 off_t v_codecf_off;
00177
00178 unsigned char (*idx)[16];
00179 video_index_entry *video_index;
00180
00181 off_t last_pos;
00182 unsigned long last_len;
00183 int must_use_index;
00184 off_t movi_start;
00185
00186 int anum;
00187 int aptr;
00188
00189 BITMAPINFOHEADER_avilib *bitmap_info_header;
00190 WAVEFORMATEX_avilib *wave_format_ex[AVI_MAX_TRACKS];
00191 } avi_t;
00192
00193 #define AVI_MODE_WRITE 0
00194 #define AVI_MODE_READ 1
00195
00196
00197
00198 #define AVI_ERR_SIZELIM 1
00199
00200
00201
00202
00203 #define AVI_ERR_OPEN 2
00204
00205
00206 #define AVI_ERR_READ 3
00207
00208 #define AVI_ERR_WRITE 4
00209
00210
00211 #define AVI_ERR_WRITE_INDEX 5
00212
00213
00214
00215 #define AVI_ERR_CLOSE 6
00216
00217
00218
00219 #define AVI_ERR_NOT_PERM 7
00220
00221
00222
00223 #define AVI_ERR_NO_MEM 8
00224
00225 #define AVI_ERR_NO_AVI 9
00226
00227 #define AVI_ERR_NO_HDRL 10
00228
00229
00230 #define AVI_ERR_NO_MOVI 11
00231
00232
00233 #define AVI_ERR_NO_VIDS 12
00234
00235 #define AVI_ERR_NO_IDX 13
00236
00237
00238
00239
00240
00241 #ifndef WAVE_FORMAT_PCM
00242 #define WAVE_FORMAT_UNKNOWN (0x0000)
00243 #define WAVE_FORMAT_PCM (0x0001)
00244 #define WAVE_FORMAT_ADPCM (0x0002)
00245 #define WAVE_FORMAT_IBM_CVSD (0x0005)
00246 #define WAVE_FORMAT_ALAW (0x0006)
00247 #define WAVE_FORMAT_MULAW (0x0007)
00248 #define WAVE_FORMAT_OKI_ADPCM (0x0010)
00249 #define WAVE_FORMAT_DVI_ADPCM (0x0011)
00250 #define WAVE_FORMAT_DIGISTD (0x0015)
00251 #define WAVE_FORMAT_DIGIFIX (0x0016)
00252 #define WAVE_FORMAT_YAMAHA_ADPCM (0x0020)
00253 #define WAVE_FORMAT_DSP_TRUESPEECH (0x0022)
00254 #define WAVE_FORMAT_GSM610 (0x0031)
00255 #define IBM_FORMAT_MULAW (0x0101)
00256 #define IBM_FORMAT_ALAW (0x0102)
00257 #define IBM_FORMAT_ADPCM (0x0103)
00258 #endif
00259
00260 avi_t* AVI_open_output_file(char * filename);
00261 void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compressor);
00262 void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format, long mp3rate);
00263 int AVI_write_frame(avi_t *AVI, char *data, long bytes, int keyframe);
00264 int AVI_dup_frame(avi_t *AVI);
00265 int AVI_write_audio(avi_t *AVI, char *data, long bytes);
00266 int AVI_append_audio(avi_t *AVI, char *data, long bytes);
00267 long AVI_bytes_remain(avi_t *AVI);
00268 int AVI_close(avi_t *AVI);
00269 long AVI_bytes_written(avi_t *AVI);
00270
00271 avi_t *AVI_open_input_file(const char *filename, int getIndex);
00272 avi_t *AVI_open_fd(int fd, int getIndex);
00273 int avi_parse_input_file(avi_t *AVI, int getIndex);
00274 long AVI_audio_mp3rate(avi_t *AVI);
00275 long AVI_video_frames(avi_t *AVI);
00276 int AVI_video_width(avi_t *AVI);
00277 int AVI_video_height(avi_t *AVI);
00278 double AVI_frame_rate(avi_t *AVI);
00279 char* AVI_video_compressor(avi_t *AVI);
00280
00281 int AVI_audio_channels(avi_t *AVI);
00282 int AVI_audio_bits(avi_t *AVI);
00283 int AVI_audio_format(avi_t *AVI);
00284 long AVI_audio_rate(avi_t *AVI);
00285 long AVI_audio_bytes(avi_t *AVI);
00286 long AVI_audio_chunks(avi_t *AVI);
00287
00288 long AVI_max_video_chunk(avi_t *AVI);
00289
00290 long AVI_frame_size(avi_t *AVI, long frame);
00291 long AVI_audio_size(avi_t *AVI, long frame);
00292 int AVI_seek_start(avi_t *AVI);
00293 int AVI_set_video_position(avi_t *AVI, long frame);
00294 long AVI_get_video_position(avi_t *AVI, long frame);
00295 long AVI_read_frame(avi_t *AVI, char *vidbuf, int *keyframe);
00296
00297 int AVI_set_audio_position(avi_t *AVI, long byte);
00298 int AVI_set_audio_bitrate(avi_t *AVI, long bitrate);
00299
00300 long AVI_read_audio(avi_t *AVI, char *audbuf, long bytes);
00301 long AVI_read_audio_chunk(avi_t *AVI, char *audbuf);
00302
00303 long AVI_audio_codech_offset(avi_t *AVI);
00304 long AVI_audio_codecf_offset(avi_t *AVI);
00305 long AVI_video_codech_offset(avi_t *AVI);
00306 long AVI_video_codecf_offset(avi_t *AVI);
00307
00308 int AVI_read_data(avi_t *AVI, char *vidbuf, long max_vidbuf,
00309 char *audbuf, long max_audbuf,
00310 long *len);
00311
00312 void AVI_print_error(char *str);
00313 char *AVI_strerror(void);
00314 char *AVI_syserror(void);
00315
00316 int AVI_scan(char *name);
00317 int AVI_dump(char *name, int mode);
00318
00319 char *AVI_codec2str(short cc);
00320 int AVI_file_check(char *import_file);
00321
00322 void AVI_info(avi_t *avifile);
00323 uint64_t AVI_max_size(void);
00324 int avi_update_header(avi_t *AVI);
00325
00326 int AVI_set_audio_track(avi_t *AVI, int track);
00327 int AVI_get_audio_track(avi_t *AVI);
00328 int AVI_audio_tracks(avi_t *AVI);
00329
00330
00331 struct riff_struct
00332 {
00333 unsigned char id[4];
00334 uint32_t len;
00335 unsigned char wave_id[4];
00336 };
00337
00338
00339 struct chunk_struct
00340 {
00341 unsigned char id[4];
00342 uint32_t len;
00343 };
00344
00345 struct common_struct
00346 {
00347 uint16_t wFormatTag;
00348 uint16_t wChannels;
00349 uint32_t dwSamplesPerSec;
00350 uint32_t dwAvgBytesPerSec;
00351 uint16_t wBlockAlign;
00352 uint16_t wBitsPerSample;
00353 };
00354
00355 struct wave_header
00356 {
00357 struct riff_struct riff;
00358 struct chunk_struct format;
00359 struct common_struct common;
00360 struct chunk_struct data;
00361 };
00362
00363
00364
00365 struct AVIStreamHeader {
00366 long fccType;
00367 long fccHandler;
00368 long dwFlags;
00369 long dwPriority;
00370 long dwInitialFrames;
00371 long dwScale;
00372 long dwRate;
00373 long dwStart;
00374 long dwLength;
00375 long dwSuggestedBufferSize;
00376 long dwQuality;
00377 long dwSampleSize;
00378 };
00379
00380 #endif