#ifndef _GF_AVILIB_H_
#define _GF_AVILIB_H_
#include <gpac/tools.h>
#ifndef GPAC_DISABLE_AVILIB
#define AVI_MAX_TRACKS 8
typedef struct
{
u64 key;
u64 pos;
u64 len;
} video_index_entry;
typedef struct
{
u64 pos;
u64 len;
u64 tot;
} audio_index_entry;
#define AVI_INDEX_OF_INDEXES 0x00
#define AVI_INDEX_OF_CHUNKS 0x01
#define AVI_INDEX_IS_DATA 0x80
#define AVI_INDEX_2FIELD 0x01
typedef struct _avisuperindex_entry {
u64 qwOffset;
u32 dwSize;
u32 dwDuration;
} avisuperindex_entry;
typedef struct _avistdindex_entry {
u32 dwOffset;
u32 dwSize;
} avistdindex_entry;
typedef struct _avistdindex_chunk {
char fcc[4];
u32 dwSize;
u16 wLongsPerEntry;
u8 bIndexSubType;
u8 bIndexType;
u32 nEntriesInUse;
char dwChunkId[4];
u64 qwBaseOffset;
u32 dwReserved3;
avistdindex_entry *aIndex;
} avistdindex_chunk;
typedef struct _avisuperindex_chunk {
char fcc[4];
u32 dwSize;
u16 wLongsPerEntry;
u8 bIndexSubType;
u8 bIndexType;
u32 nEntriesInUse;
char dwChunkId[4];
u32 dwReserved[3];
avisuperindex_entry *aIndex;
avistdindex_chunk **stdindex;
} avisuperindex_chunk;
typedef struct track_s
{
int a_fmt;
int a_chans;
int a_rate;
int a_bits;
int mp3rate;
int a_vbr;
int padrate;
int audio_strn;
u64 audio_bytes;
int audio_chunks;
char audio_tag[4];
int audio_posc;
int audio_posb;
u64 a_codech_off;
u64 a_codecf_off;
audio_index_entry *audio_index;
avisuperindex_chunk *audio_superindex;
} track_t;
typedef struct
{
u32 bi_size;
u32 bi_width;
u32 bi_height;
u16 bi_planes;
u16 bi_bit_count;
u32 bi_compression;
u32 bi_size_image;
u32 bi_x_pels_per_meter;
u32 bi_y_pels_per_meter;
u32 bi_clr_used;
u32 bi_clr_important;
} alBITMAPINFOHEADER;
typedef struct
{
u16 w_format_tag;
u16 n_channels;
u32 n_samples_per_sec;
u32 n_avg_bytes_per_sec;
u16 n_block_align;
u16 w_bits_per_sample;
u16 cb_size;
} alWAVEFORMATEX;
typedef struct
{
u32 fcc_type;
u32 fcc_handler;
u32 dw_flags;
u32 dw_caps;
u16 w_priority;
u16 w_language;
u32 dw_scale;
u32 dw_rate;
u32 dw_start;
u32 dw_length;
u32 dw_initial_frames;
u32 dw_suggested_buffer_size;
u32 dw_quality;
u32 dw_sample_size;
u16 dw_left;
u16 dw_top;
u16 dw_right;
u16 dw_bottom;
} alAVISTREAMHEADER;
typedef struct
{
FILE *fdes;
int mode;
int width;
int height;
double fps;
char compressor[8];
char compressor2[8];
u32 video_strn;
int video_frames;
char video_tag[4];
int video_pos;
alAVISTREAMHEADER video_stream_header;
u32 max_len;
track_t track[AVI_MAX_TRACKS];
s64 pos;
int n_idx;
int max_idx;
s64 v_codech_off;
s64 v_codecf_off;
u8 (*idx)[16];
video_index_entry *video_index;
avisuperindex_chunk *video_superindex;
int is_opendml;
s64 last_pos;
u32 last_len;
int must_use_index;
s64 movi_start;
int total_frames;
u32 anum;
u32 aptr;
char *index_file;
alBITMAPINFOHEADER *bitmap_info_header;
alWAVEFORMATEX *wave_format_ex[AVI_MAX_TRACKS];
alAVISTREAMHEADER stream_headers[AVI_MAX_TRACKS];
void* extradata;
unsigned int extradata_size;
} avi_t;
#define AVI_MODE_WRITE 0
#define AVI_MODE_READ 1
#define AVI_ERR_SIZELIM 1
#define AVI_ERR_OPEN 2
#define AVI_ERR_READ 3
#define AVI_ERR_WRITE 4
#define AVI_ERR_WRITE_INDEX 5
#define AVI_ERR_CLOSE 6
#define AVI_ERR_NOT_PERM 7
#define AVI_ERR_NO_MEM 8
#define AVI_ERR_NO_AVI 9
#define AVI_ERR_NO_HDRL 10
#define AVI_ERR_NO_MOVI 11
#define AVI_ERR_NO_VIDS 12
#define AVI_ERR_NO_IDX 13
#ifndef WAVE_FORMAT_PCM
#define WAVE_FORMAT_UNKNOWN (0x0000)
#ifndef WAVE_FORMAT_PCM
#define WAVE_FORMAT_PCM (0x0001)
#endif
#define WAVE_FORMAT_ADPCM (0x0002)
#define WAVE_FORMAT_IBM_CVSD (0x0005)
#define WAVE_FORMAT_ALAW (0x0006)
#define WAVE_FORMAT_MULAW (0x0007)
#define WAVE_FORMAT_OKI_ADPCM (0x0010)
#define WAVE_FORMAT_DVI_ADPCM (0x0011)
#define WAVE_FORMAT_DIGISTD (0x0015)
#define WAVE_FORMAT_DIGIFIX (0x0016)
#define WAVE_FORMAT_YAMAHA_ADPCM (0x0020)
#define WAVE_FORMAT_DSP_TRUESPEECH (0x0022)
#define WAVE_FORMAT_GSM610 (0x0031)
#define IBM_FORMAT_MULAW (0x0101)
#define IBM_FORMAT_ALAW (0x0102)
#define IBM_FORMAT_ADPCM (0x0103)
#endif
avi_t* AVI_open_output_file(char * filename);
void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compressor);
void AVI_set_audio(avi_t *AVI, int channels, int rate, int bits, int format, int mp3rate);
int AVI_write_frame(avi_t *AVI, char *data, int bytes, int keyframe);
int AVI_dup_frame(avi_t *AVI);
int AVI_write_audio(avi_t *AVI, char *data, int bytes);
int AVI_append_audio(avi_t *AVI, char *data, int bytes);
u64 AVI_bytes_remain(avi_t *AVI);
int AVI_close(avi_t *AVI);
u64 AVI_bytes_written(avi_t *AVI);
avi_t *AVI_open_input_file(char *filename, int getIndex);
avi_t *AVI_open_input_indexfile(char *filename, int getIndex, char *indexfile);
avi_t *AVI_open_fd(FILE *fd, int getIndex);
avi_t *AVI_open_indexfd(FILE *fd, int getIndex, char *indexfile);
int avi_parse_input_file(avi_t *AVI, int getIndex);
int avi_parse_index_from_file(avi_t *AVI, char *filename);
int AVI_audio_mp3rate(avi_t *AVI);
int AVI_audio_padrate(avi_t *AVI);
int AVI_video_frames(avi_t *AVI);
int AVI_video_width(avi_t *AVI);
int AVI_video_height(avi_t *AVI);
double AVI_frame_rate(avi_t *AVI);
char* AVI_video_compressor(avi_t *AVI);
int AVI_audio_channels(avi_t *AVI);
int AVI_audio_bits(avi_t *AVI);
int AVI_audio_format(avi_t *AVI);
int AVI_audio_rate(avi_t *AVI);
u64 AVI_audio_bytes(avi_t *AVI);
int AVI_audio_chunks(avi_t *AVI);
int AVI_can_read_audio(avi_t *AVI);
int AVI_max_video_chunk(avi_t *AVI);
int AVI_frame_size(avi_t *AVI, int frame);
int AVI_audio_size(avi_t *AVI, int frame);
int AVI_seek_start(avi_t *AVI);
int AVI_set_video_position(avi_t *AVI, int frame);
u64 AVI_get_video_position(avi_t *AVI, int frame);
int AVI_read_frame(avi_t *AVI, char *vidbuf, int *keyframe);
int AVI_set_audio_position(avi_t *AVI, int byte);
int AVI_set_audio_bitrate(avi_t *AVI, int bitrate);
int AVI_get_audio_position_index(avi_t *AVI);
int AVI_set_audio_position_index(avi_t *AVI, int indexpos);
int AVI_read_audio(avi_t *AVI, char *audbuf, int bytes, int *continuous);
int AVI_read_data(avi_t *AVI, char *vidbuf, int max_vidbuf,
char *audbuf, int max_audbuf,
int *len);
int AVI_scan(char *name);
int AVI_dump(char *name, int mode);
char *AVI_codec2str(short cc);
int AVI_file_check(char *import_file);
void AVI_info(avi_t *avifile);
u64 AVI_max_size(void);
int avi_update_header(avi_t *AVI);
int AVI_set_audio_track(avi_t *AVI, u32 track);
int AVI_get_audio_track(avi_t *AVI);
int AVI_audio_tracks(avi_t *AVI);
void AVI_set_audio_vbr(avi_t *AVI, int is_vbr);
int AVI_get_audio_vbr(avi_t *AVI);
void AVI_set_comment_fd(avi_t *AVI, int fd);
int AVI_get_comment_fd(avi_t *AVI);
struct riff_struct
{
u8 id[4];
u32 len;
u8 wave_id[4];
};
struct chunk_struct
{
u8 id[4];
u32 len;
};
struct common_struct
{
u16 wFormatTag;
u16 wChannels;
u32 dwSamplesPerSec;
u32 dwAvgBytesPerSec;
u16 wBlockAlign;
u16 wBitsPerSample;
};
struct wave_header
{
struct riff_struct riff;
struct chunk_struct format;
struct common_struct common;
struct chunk_struct data;
};
int AVI_read_wave_header( int fd, struct wave_header * wave );
int AVI_write_wave_header( int fd, const struct wave_header * wave );
size_t AVI_read_wave_pcm_data( int fd, void * buffer, size_t buflen );
size_t AVI_write_wave_pcm_data( int fd, const void * buffer, size_t buflen );
struct AVIStreamHeader {
int fccType;
int fccHandler;
int dwFlags;
int dwPriority;
int dwInitialFrames;
int dwScale;
int dwRate;
int dwStart;
int dwLength;
int dwSuggestedBufferSize;
int dwQuality;
int dwSampleSize;
};
#endif
#endif