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 #ifndef _AVI_H_
00028 #define _AVI_H_
00029
00030 #include <stdint.h>
00031 #include "mpg_common.h"
00032 #include "pes.h"
00033
00034 #define TAG_IT(a,b,c,d) ((d<<24) | (c<<16) | (b<<8)|a)
00035 #define ALIGN(a) (((4-a)%3)%3)
00036
00037 #define AVI_HASINDEX 0x00000010
00038 #define AVI_USEINDEX 0x00000020
00039 #define AVI_INTERLEAVED 0x00000100
00040
00041 typedef struct avi_index_s {
00042 uint32_t id;
00043 uint32_t flags, len;
00044 uint32_t off;
00045 } avi_index;
00046
00047 typedef struct avi_audio_s
00048 {
00049 uint32_t dw_scale, dw_rate;
00050 uint32_t dw_sample_size;
00051 uint32_t fps;
00052 uint32_t type;
00053 uint32_t initial_frames;
00054 uint32_t dw_start;
00055 uint32_t dw_ssize;
00056 } avi_audio_info;
00057
00058 typedef struct avi_video_s
00059 {
00060 uint16_t width;
00061 uint16_t height;
00062 uint32_t dw_scale, dw_rate;
00063 uint32_t fps;
00064 uint32_t pos_off;
00065 uint32_t initial_frames;
00066 uint32_t dw_start;
00067 } avi_video_info;
00068
00069 #define MAX_TRACK 10
00070 typedef struct {
00071 int64_t riff_end;
00072 int64_t movi_start;
00073 int64_t movi_length;
00074 int last_size;
00075 int done;
00076
00077 uint64_t next_frame;
00078
00079 int ntracks;
00080 uint32_t num_idx_alloc;
00081 uint32_t num_idx_frames;
00082 uint32_t msec_per_frame;
00083 uint32_t avih_flags;
00084 uint32_t total_frames;
00085 uint32_t init_frames;
00086 uint32_t width;
00087 uint32_t height;
00088 uint32_t nstreams;
00089 uint32_t vhandler;
00090 uint32_t ahandler;
00091 uint32_t vchunks;
00092 uint32_t achunks;
00093 uint32_t zero_vchunks;
00094 uint32_t zero_achunks;
00095
00096 uint32_t current_idx;
00097
00098 avi_video_info vi;
00099 avi_audio_info ai[MAX_TRACK];
00100
00101 avi_index *idx;
00102 } avi_context;
00103
00104 int check_riff(avi_context *ac, uint8_t *buf, int len);
00105 int read_avi_header( avi_context *ac, int fd);
00106 void get_avi(pes_in_t *p, uint8_t *buf, int count, void (*func)(pes_in_t *p));
00107 int avi_read_index(avi_context *ac, int fd);
00108 int get_avi_from_index(pes_in_t *p, int fd, avi_context *ac,
00109 void (*func)(pes_in_t *p), int insize);
00110
00111
00112 #endif