2024年1月3日发(作者:)
71.
72.
int64_t _off_set;
73.
74.
75.
int _frist_serial;
76.
int _cur_serial;
77.
int64_t _frist_st;
78.
int64_t _cur_st;
79.
80.
private81.
82.
void:
83.
void avi_write_char( avi_write_uint16(uint16_t w);
char c);
84.
void avi_write_uint32(uint32_t dw );
85.
void avi_write_fourcc(char fcc[4] );
86.
int64_t avi_tell();
int avi_write_buff(void* buff,int size);
87.
int64_t avi_seek(int64_t offset);
88.
89.
90.
void
void avi_set_fourcc(
avi_set_dw( voidvoid *_p, char fcc[4]);
91.
92.
void avi_set_dw64( void *_p, uint32_t dw );
*_p, int64_t dw );
93.
94.
void avi_write_header();
95.
void96.
void avi_write_idx();
avi_write_idx_hwx();
97.
98.
99.
public
int#ifdef VIDEO_CLIPint avi_open( :
write_frame(constvoid char *data,
* filename);
int size, int b_key );
#endifint avi_write_clip(VideoClip * clip);
int64_t get_avi_file_size();
int64_t avi_close();
public
:
void
int get_frist_serial();
avi_fflush();
int64_t get_frist_st();
int get_cur_serial();
int64_t get_cur_st();
int get_cur_fream_num();
//获取当前已经存盘数据的索引区
int get_cur_idx_hwx(AVI_IDX_HWX* idx,int fream_num);
};
#endif
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
[cpp]
01.
02.
#ifndef AVI_UTILS_READER_H_03.
#define AVI_UTILS_READER_H_
04.
05.
typedef06.
typedef long long int64_t;
07.
typedef unsigned char uint8_t;
08.
typedef unsigned short uint16_t;
09.
unsigned uint32_t;
10.
#include "avi_writer.h"11.
12.
13.
typedef14.
{
struct
15.
16.
FILE *f;
17.
18.
char fcc[4];
19.
20.
float f_fps;
21.
22.
int i_width;
23.
int i_height;
24.
int64_t i_movi;
25.
int64_t i_movi_end;
26.
int64_t i_riff;
27.
28.
29.
int i_frame;
30.
uint32_t *idx;
int i_idx_max;
31.
uint32_t *idx_hwx;
32.
} avi_read_t;
33.
34.
35.
36.
typedef37.
struct avi_idx1_hwx{
38.
int39.
int is_key;
40.
int pos;
size;
41.
int64_t st;
int serial;
42.
}IDX_HWX;
43.
44.
45.
//46.
int读取avi标准索引区47.
avi_read_avi_idx1(avi_read_t* a,AVI_IDX**idx);
48.
49.
50.
int51.
int avi_read_idx_hwx(avi_read_t* a,IDX_HWX** idx);
52.
avi_read( avi_read_t *a, void *buf,IDX_HWX* idx);
53.
54.
55.
void56.
avi_rd_init( avi_read_t *a, FILE *f, float *f_fps,int *width,int *height);
57.
int58.
int avi_read( avi_read_t *a,
59.
void avi_read_frame(avi_read_t *a,
void *buf,
voidint *buf,
buf_size,
int buf_size,int64_t pos);
int* b_key );
60.
avi_rd_end( avi_read_t * a);
61.
62.
#endif /* AVI_READER_H_ */
[cpp]
01.
02.
/*03.
* avi_
04.
*
#include#include
05.
06.
#include
07.
#include "avi_writer.h"
08.
#include "avi_reader.h"
09.
10.
11.
12.
uint16_t avi_read_uint16( avi_read_t *a){
12.
13.
{14.
uint16_t dw;
15.
16.
dw=fgetc(a->f);17.
dw|=fgetc(a->f)<<8;
18.
19.
return dw;20.
}21.
22.
uint32_t avi_read_uint32( avi_read_t *a)23.
{
24.
uint32_t dw(0);
25.
26.
unsigned char c = 0; c= fgetc(a->f);
27.
28.
29.
dw |=(c&0x000000ff);
30.
c = 0;
31.
c= fgetc(a->f);
32.
dw |= (c&0x000000ff)<<8;
33.
34.
c = 0;35.
c= fgetc(a->f);
36.
dw |= (c&0x000000ff)<<16;
37.
c = 0;
38.
c= fgetc(a->f);
39.
dw |= (c&0x000000ff)<<24;
40.
c = 0;
41.
/*42.
dw = fgetc(a->f);
43.
dw |= (fgetc(a->f)&0xff)<<8;
44.
dw |= (fgetc(a->f)&0xff)<<16;
45.
dw |= (fgetc(a->f)&0xff)<<24;
46.
*/47.
48.
}
return dw;
49.
50.
int64_t avi_read_int64( avi_read_t *a)
51.
{
52.
int64_t dw;
53.
54.
dw = (int64_t) fgetc(a->f);
55.
dw |=(int64_t) (fgetc(a->f)&0xff)<<8;
56.
dw |=(int64_t) (fgetc(a->f)&0xff)<<16;
57.
dw |=(int64_t) (fgetc(a->f)&0xff)<<24;
58.
dw |=(int64_t) (fgetc(a->f)&0xff)<<32;
59.
dw |=(int64_t) (fgetc(a->f)&0xff)<<40;
60.
dw |=(int64_t) (fgetc(a->f)&0xff)<<48;
61.
dw |=(int64_t) (fgetc(a->f)&0xff)<<56;
62.
63.
64.
}
return dw;
65.
66.
void67.
{
avi_read_fourcc( avi_read_t *a, char fcc[4] )
68.
fcc[0]=fgetc(a->f);
69.
fcc[1]=fgetc(a->f);
70.
fcc[2]=fgetc(a->f);
71.
fcc[3]=fgetc(a->f);
72.
}
73.
74.
75.
static76.
{
void avi_red_dw( void *_p, uint32_t dw )
77.
uint8_t *p =(uint8_t *)_p;
78.
79.
p[0] = ( dw )&0xff;
80.
p[1] = ( dw >> 8 )&0xff;
81.
p[2] = ( dw >> 16)&0xff;
82.
p[3] = ( dw >> 24)&0xff;
83.
}
84.
85.
86.
static87.
{
void avi_read_header( avi_read_t *a )
88.
89.
unsigned
char buf[8];
90.
int uint32_data;
91.
avi_read_fourcc( a, buf );
a->i_riff = avi_read_uint32( a);
91.
92.
a->i_riff = avi_read_uint32( a);
93.
avi_read_fourcc( a, buf );
94.
95.
avi_read_fourcc( a, buf );
96.
uint32_data = avi_read_uint32( a );
97.
avi_read_fourcc( a, buf );
98.
avi_read_fourcc( a, buf );
100.
99. uint32_data = avi_read_uint32( a );
101.
uint32_data = avi_read_uint32( a );
102.
uint32_data = avi_read_uint32( a );
103.
uint32_data = avi_read_uint32( a );
104.
uint32_data = avi_read_uint32( a);
105.
a->i_frame = avi_read_uint32( a );
106.
uint32_data = avi_read_uint32( a );
107.
uint32_data = avi_read_uint32( a );
108.
uint32_data = avi_read_uint32( a );
109.
a->i_width = avi_read_uint32( a );
110.
a->i_height = avi_read_uint32( a );
111.
uint32_data = avi_read_uint32( a );
112.
uint32_data = avi_read_uint32( a );
113.
uint32_data = avi_read_uint32( a );
114.
uint32_data = avi_read_uint32( a );
115.
116.
avi_read_fourcc( a, buf );
117.
uint32_data = avi_read_uint32( a );
118.
avi_read_fourcc( a, buf );
119.
120.
avi_read_fourcc( a, buf );
121.
uint32_data = avi_read_uint32( a );
122.
avi_read_fourcc( a, buf );
123.
avi_read_fourcc( a, a->fcc );
124.
uint32_data = avi_read_uint32( a );
125.
uint32_data = avi_read_uint32( a );
126.
uint32_data = avi_read_uint32( a );
127.
uint32_data = avi_read_uint32( a );
128.
a->f_fps = (129.
uint32_data = avi_read_uint32( a );
float)(avi_read_uint32( a )/1000);
130.
a->i_frame = avi_read_uint32( a );
131.
uint32_data = avi_read_uint32( a );
132.
uint32_data = avi_read_uint32( a );
133.
uint32_data = avi_read_uint32( a );
134.
uint32_data = avi_read_uint32( a );
135.
a->i_width = avi_read_uint16( a );
136.
a->i_height = avi_read_uint16( a );
137.
138.
avi_read_fourcc( a, buf );
139.
uint32_data = avi_read_uint32( a );
140.
uint32_data = avi_read_uint32( a );
141.
uint32_data = avi_read_uint32( a );
142.
uint32_data = avi_read_uint32( a );
143.
avi_read_uint16( a );
144.
avi_read_uint16( a );
145.
avi_read_fourcc( a, a->fcc );
146.
uint32_data = avi_read_uint32( a );
147.
uint32_data = avi_read_uint32( a );
148.
uint32_data = avi_read_uint32( a );
149.
uint32_data = avi_read_uint32( a );
150.
uint32_data = avi_read_uint32( a );
151.
152.
avi_read_fourcc( a, buf );
153.
a->i_movi_end = avi_read_uint32( a ) -4;
154.
avi_read_fourcc( a, buf );
155.
156.
#if 0157.
158.
/* Append idx chunk */
159.
{
if( a->i_idx_max <= a->i_frame )
160.
a->i_idx_max += 1000;
161.
a->idx =(uint32_t*)realloc(a->idx, a->i_idx_max * 16 );
162.
}
163.
164.
memcpy( &a->idx[4*a->i_frame+0],
165.
avi_set_dw( &a->idx[4*a->i_frame+1], b_key ? AVIIF_KEYFRAME : 0 );
"00dc", 4 );
166.
avi_set_dw( &a->idx[4*a->i_frame+2], i_pos );
167.
avi_set_dw( &a->idx[4*a->i_frame+3], size );
168.
#endif169.
}
170.
/*171.
static void avi_read_idx( avi_read_t *a )
{
171.
172.
{173.
char buf[8];
174.
175.
avi_read_fourcc( a, buf );176.
a->i_frame = avi_read_uint32( a ) / 16;
177.
//fwrite( a->idx, a->i_frame * 16, 1, a->f );
178.
}*/
179.
180.
//181.
int读取avi标准索引区
182.
{
avi_read_avi_idx1(avi_read_t* a,AVI_IDX**idx)
183.
184.
char buf[8];
185.
char* idx_buff = NULL;
186.
187.
int i_movi_end = a->i_movi_end;
188.
189.
int idx_pos_start;
190.
int191.
int idx_pos_end;
192.
int64_t temp;
//int64_t riff = a->i_riff+(56*4-4); idx_len;
193.
194.
195.
int ret;
196.
int197.
int frame_num =0;
i=0;
198.
temp=fseek(a->f,i_movi_end,SEEK_SET);
199.
200.
memset(buf,0,8);
201.
avi_read_fourcc( a, buf );
202.
203.
{
if(strcmp(buf,"idx1"))
204.
printf(205.
"<<<<<<
>>>>read buf is %sn"206. }
return -1;
,buf);
207.
208.
frame_num = avi_read_uint32(a)/16;
209.
210.
211.
212.
{
if(frame_num <=0 )
213.
*idx = NULL;
214.
printf(215.
"<<<<<<
>>>>n"); 216.
}
return frame_num;
217.
218.
AVI_IDX* idx_tmp = (AVI_IDX*)calloc(frame_num,219.
sizeof(AVI_IDX));
220.
221.
222.
{
for(i=0;i
223.
memset(buf,0,8);
224.
avi_read_fourcc( a, buf );
225.
226.
{
if(strcasecmp(buf,"00dc"))
227.
printf(228.
"<<<<<<
>>>>n"); 229.
}
break;
230.
idx_tmp[i].is_key=avi_read_uint32(a);
231.
idx_tmp[i].pos = avi_read_uint32(a);
232.
idx_tmp[i].size = avi_read_uint32(a);
233.
}
234.
235.
236.
{
if(i!=frame_num)
237.
free(idx_tmp);
238.
idx_tmp = NULL;
239.
240.
}
return 0;
241.
242.
*idx = idx_tmp;
243.
244.
}
return frame_num;
245.
246.
247.
248.
int249.
{
avi_read_idx_hwx(avi_read_t* a,IDX_HWX** idx)
250.
charchar buf[8];
* idx_buff = NULL;
250.
251.
252.
char* idx_buff = NULL;
253.
254.
int riff = a->i_riff+8;
255.
int riff2 = a->i_riff;
256.
int idx_pos_start;
257.
int258.
int idx_pos_end;
259.
int64_t temp;
//int64_t riff = a->i_riff+(56*4-4); idx_len;
260.
261.
262.
int ret;
263.
int
int frame_num =0;
i=0;
264.
265.
temp=fseek(a->f,riff,SEEK_SET);
266.
267.
memset(buf,0,8);
268.
avi_read_fourcc( a, buf );
269.
270.
{
if(strcmp(buf,"ihwx"))
271.
<<<<<<
>>>>read buf is %sn",buf);// Ipnc_DbgPrintf2(_TraceError,"272.
273.
}
return -1;
274.
275.
276.
idx_pos_start = ftell( a->f );
277.
fseek(a->f,0,SEEK_END);
278.
idx_pos_end = ftell( a->f );
279.
280.
idx_len = idx_pos_end - idx_pos_start;
281.
fseek(a->f,0-idx_len,SEEK_END);
282.
283.
284.
frame_num = avi_read_uint32(a)/28;
285.
286.
287.
{
if(frame_num <=0 )
288.
*idx = NULL;
289.
290.
}
return frame_num;
291.
292.
IDX_HWX* idx_hwx = (IDX_HWX*)calloc(frame_num,293.
sizeof(IDX_HWX));
294.
295.
296.
{
for(i=0;i
297.
memset(buf,0,8);
298.
avi_read_fourcc( a, buf );
299.
300.
{
if(strcasecmp(buf,"hwx0"))
301.
302.
}
break;
303.
idx_hwx[i].is_key=avi_read_uint32(a);
304.
idx_hwx[i].pos = avi_read_uint32(a);
305.
idx_hwx[i].size = avi_read_uint32(a);
306.
idx_hwx[i].serial = avi_read_uint32(a);
307.
idx_hwx[i].st =(308.
}
long long)avi_read_int64(a);
309.
310.
311.
{
if(i!=frame_num)
312.
free(idx_hwx);
313.
idx_hwx = NULL;
314.
*idx = NULL;
315.
316.
}
return 0;
317.
318.
*idx = idx_hwx;
319.
320.
}
return frame_num;
321.
322.
323.
void324.
{
avi_rd_init( avi_read_t *a, FILE *f, float *f_fps,int *width,int *height)
325.
326.
a->f = f;
char hwx_fcc[8];
327.
a->f_fps = 0;
328.
a->i_width = 0;
329.
a->i_height = 0;
a->i_frame = 0;
329.
330.
a->i_frame = 0;
331.
a->i_movi = 0;
332.
a->i_riff = 0;
333.
a->i_movi_end = 0;
334.
a->i_idx_max = 0;
335.
a->idx = NULL;
336.
a->idx_hwx = NULL;
337.
avi_read_header( a );
338.
*f_fps=a->f_fps;
339.
*width=a->i_width;
340.
*height=a->i_height;
341.
342.
343.
}
344.
345.
int346.
{
avi_read( avi_read_t *a, void *buf, int buf_size, int* b_key )
347.
348.
int349.
int64_t i_pos = ftell( a->f );
int frame_size = 0;
read_size = 0;
350.
351.
char fcc[8];
352.
char c;
353.
354.
if (!a || !buf || (buf_size<16))
355.
return 0;
356.
357.
//avi_read_idx_hwx("ihwx",hwx_fcc);
358.
359.
if (b_key) *b_key = 0;
360.
{
while ((frame_size<=0) && (!feof(a->f)))
361.
avi_read_fourcc( a, fcc);362.
fcc[4] =
//
363.
364.
{
if (!strcmp(fcc,
'0';
"00dc"))
365.
frame_size = avi_read_uint32( a );
366.
367.
{
if ((frame_size>16) && (frame_size
368.
read_size = fread( buf, 1, frame_size, a->f );
369.
370.
{
if (read_size == frame_size)
371.
372.
c = fgetc( a->f );if (frame_size&0x01 )
373.
/* pad */
374.
a->i_frame++;
375.
}
376.
}
377.
}
378.
}
379.
380.
381.
}
return frame_size;
382.
383.
/*384.
* sucess return frame_size
385.
* faild return -1
386.
*/387.
int
388.
{
avi_read_frame(avi_read_t *a, void *buf, int buf_size,int64_t pos)
389.
390.
int frame_size = 0;
391.
int read_size = 0;
392.
char393.
int64_t i_pos = ftell( a->f );
char fcc[8];
c;
394.
395.
396.
if (!a || !buf || (buf_size<16))
397.
return -1;
398.
399.
400.
fseek(a->f,pos,SEEK_SET);
if(i_pos!=pos)
401.
402.
avi_read_fourcc( a, fcc);403.
fcc[4] =
//
404.
405.
{
if (!strcmp(fcc,
'0';
"00dc"))
406.
frame_size = avi_read_uint32( a );
407.
408.
{
if ((frame_size>16) && (frame_size
read_size = fread( buf, 1, frame_size, a->f );
408.
409.
read_size = fread( buf, 1, frame_size, a->f );
410.
411.
{
if (read_size == frame_size)
412.
413.
c = fgetc( a->f );if (frame_size&0x01 )
414.
}
/* pad */
415.
416.
{
else
417.
418.
}
return -1;
419.
}
420.
}
421.
422.
{
else
423.
424.
}
return -1;
425.
426.
427.
}
return frame_size;
428.
429.
void430.
{
avi_rd_end( avi_read_t * a)
431.
}
[cpp]
01.
02.
/*03.
* avi_
04.
*
05.
*/
06.
07.
#include
08. #include
09.
#include
10.
#include "avi_writer.h"
11.
12.
#ifdef WIN3213.
#include "......media_basemedia_dbg.h"
14.
#include "......media_basesync.h"15.
#else
16.
#include "sync.h"
17.
18.
#include
19. #include
20.
#include
21.
#include
22.
#endif
23.
24.
/* Flags in avih */25.
#define AVIF_HASINDEX 0x00000010 // Index at end of file?
26.
#define AVIF_ISINTERLEAVED 0x00000100
27.
#define AVIF_TRUSTCKTYPE 0x00000800 // Use CKType to find key frames?
28.
29.
#define AVIIF_KEYFRAME 0x00000010L /* this frame is a key frame.*/30.
31.
32.
33.
avi_writer::avi_writer(int64_t offset,34.
{
float fps,int width,int height)
35.
_i_width = width;
36.
_i_height = height;
37.
_f_fps = fps;
38.
39.
memcpy( _fcc,40.
_i_width = width;
"h264",4);
41.
_i_height = height;
42.
_i_frame = 0;
43.
_i_movi = 0;
44.
_i_riff = 0;
45.
_i_movi_end = 0;
46.
_i_idx_max = 0;
47.
_idx = NULL;
48.
_idx_hwx = NULL;
49.
50.
_io_mode = 0;
51.
_start_offset = offset;
// open write
52.
_off_set = 0;
53.
54.
_frist_serial=0;
_cur_serial=0;
54.
55.
_cur_serial=0;
56.
57.
_frist_st=0;
58.
_cur_st=0;
59.
}
60.
61.
avi_writer::avi_writer(62.
{
float fps,int width,int height)
63.
_i_width = width;
64.
_i_height = height;
65.
_f_fps = fps;
66.
67.
memcpy( _fcc,68.
_i_width = width;
"h264",4);
69.
_i_height = height;
70.
_i_frame = 0;
71.
_i_movi = 0;
72.
_i_riff = 0;
73.
_i_movi_end = 0;
74.
_i_idx_max = 0;
75.
_idx = NULL;
76.
_idx_hwx = NULL;
77.
78.
_io_mode = 1;
_start_offset = 0;
// fopen fwrite
79.
80.
_off_set = 0;
81.
82.
_frist_serial=0;
83.
_cur_serial=0;
84.
85.
_frist_st=0;
86.
_cur_st=0;
87.
}
88.
89.
avi_writer::~avi_writer()
90.
{
91.
92.
free(_idx);
if(_idx)
93.
_idx = NULL;
94.
95.
free(_idx_hwx);
if(_idx_hwx)
96.
_idx_hwx = NULL;
97.
}
98.
99.
void{
avi_writer::avi_write_char(char c)
{
if(_io_mode)
fputc( c, _f_);
}
{
else
write(_f_,&c,1);
}
_off_set += 1l;
}
void{
avi_writer::avi_write_uint16(uint16_t w)
{
if(_io_mode)
fputc( ( w ) & 0xff, _f_);
fputc( ( w >> 8 ) & 0xff, _f_ );
}
{
else
_buff[0] = ( w ) & 0xff;
_buff[1] = ( w >> 8 ) & 0xff;
_buff[2] =
write(_f_,_buff,2);
'0';
}
_off_set += 2l;
}
void{
avi_writer::avi_write_uint32(uint32_t dw )
{
if(_io_mode)
fputc( ( dw ) & 0xff,_f_ );
fputc( ( dw >> 8 ) & 0xff,_f_);
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
fputc( ( dw >> 8 ) & 0xff,_f_);
fputc( ( dw >> 16) & 0xff,_f_ );
fputc( ( dw >> 24) & 0xff,_f_);
}
else
{
_buff[0] = ( dw ) & 0xff;
_buff[1] = ( dw >> 8 ) & 0xff;
_buff[2] = ( dw >> 16 ) & 0xff;
_buff[3] = ( dw >> 24 ) & 0xff;
_buff[4] = '0';
write(_f_,_buff,4);
}
_off_set += 4l;
}
void avi_writer::avi_write_fourcc(char fcc[4] )
{
if(_io_mode)
{
fputc( fcc[0],_f_);
fputc( fcc[1],_f_);
fputc( fcc[2],_f_);
fputc( fcc[3],_f_);
}
else
{
write(_f_,fcc,4);
}
_off_set += 4l;
}
int avi_writer::avi_write_buff(void* buff,int size)
{
int ret=0;
if(_io_mode)
{
ret = fwrite(buff,1,size,_f_);
}
else
{
ret = write(_f_,buff,size);
}
if(ret!=size)
{
Ipnc_DbgPrintf2(_TraceInfo, "write errorn");
}
_off_set +=(int64_t)ret;
return ret;
}
void avi_writer::avi_write_header()
{
avi_write_fourcc("RIFF" );
avi_write_uint32(_i_riff > 0 ? _i_riff - 8 : 0xFFFFFFFF );
avi_write_fourcc("AVI " );
avi_write_fourcc("LIST" );
avi_write_uint32( 4 + 4*16 + 12 + 4*16 + 4*12 );
avi_write_fourcc("hdrl" );
avi_write_fourcc("avih" );
avi_write_uint32(4*16 - 8 );
avi_write_uint32(1000000 / _f_fps );
avi_write_uint32(0xffffffff );
avi_write_uint32(0 );
avi_write_uint32(AVIF_HASINDEX|AVIF_ISINTERLEAVED|AVIF_TRUSTCKTYPE);
avi_write_uint32(_i_frame );
avi_write_uint32(0 );
avi_write_uint32(1 );
avi_write_uint32(1000000 );
avi_write_uint32(_i_width );
avi_write_uint32(_i_height );
avi_write_uint32(0 );
avi_write_uint32(0 );
213.
214.
avi_write_uint32(0 );
215.
avi_write_uint32(0 );
216.
avi_write_uint32(0 );
217.
218.
avi_write_fourcc(219.
avi_write_uint32( 4 + 4*16 + 4*12 );
"LIST" );
220.
avi_write_fourcc(221.
"strl" );
222.
avi_write_fourcc(223.
avi_write_uint32( 4*16 - 8 );
"strh" );
224.
avi_write_fourcc(225.
avi_write_fourcc(_fcc );
"vids" );
226.
avi_write_uint32(0 );
227.
avi_write_uint32(0 );
228.
avi_write_uint32(0 );
229.
avi_write_uint32(1000 );
230.
avi_write_uint32(_f_fps * 1000 );
231.
avi_write_uint32(0 );
232.
avi_write_uint32(_i_frame );
233.
avi_write_uint32(1024*1024 );
234.
avi_write_uint32(-1 );
235.
avi_write_uint32(_i_width * _i_height );
236.
avi_write_uint32(0 );
237.
avi_write_uint16(_i_width );
238.
avi_write_uint16(_i_height );
239.
240.
avi_write_fourcc(241.
avi_write_uint32( 4*12 - 8 );
"strf" );
242.
avi_write_uint32( 4*12 - 8 );
243.
avi_write_uint32( _i_width );
244.
avi_write_uint32( _i_height );
245.
avi_write_uint16( 1 );
246.
avi_write_uint16( 24 );
247.
avi_write_fourcc( _fcc );
248.
avi_write_uint32(_i_width * _i_height );
249.
avi_write_uint32( 0 );
250.
avi_write_uint32( 0 );
251.
avi_write_uint32( 0 );
252.
avi_write_uint32( 0 );
253.
254.
avi_write_fourcc(255.
avi_write_uint32( _i_movi_end > 0 ? _i_movi_end - _i_movi + 4: 0xFFFFFFFF );
"LIST" );
256.
avi_write_fourcc(257.
}
"movi" );
258.
259.
void260.
{
avi_writer::avi_set_fourcc( void *_p, char fcc[4] )
261.
uint8_t *p =(uint8_t *)_p;
262.
p[0] = fcc[0];
263.
p[1] = fcc[1];
264.
p[2] = fcc[2];
265.
p[3] = fcc[3];
266.
}
267.
void268.
{
avi_writer::avi_set_dw( void *_p, uint32_t dw )
269.
uint8_t *p =(uint8_t *)_p;
270.
271.
p[0] = ( dw )&0xff;
272.
p[1] = ( dw >> 8 )&0xff;
273.
p[2] = ( dw >> 16)&0xff;
274.
p[3] = ( dw >> 24)&0xff;
275.
}
276.
void277.
{
avi_writer::avi_set_dw64( void *_p, int64_t dw )
278.
uint8_t *p =(uint8_t *)_p;
279.
280.
p[0] = ( dw )&0xff;
281.
p[1] = ( dw >> 8 )&0xff;
282.
p[2] = ( dw >> 16)&0xff;
283.
p[3] = ( dw >> 24)&0xff;
284.
p[4] = ( dw >> 32)&0xff;
285.
p[5] = ( dw >> 40)&0xff;
286.
p[6] = ( dw >> 48)&0xff;
287.
p[7] = ( dw >> 56)&0xff;
288.
}
289.
290.
int64_t avi_writer::avi_tell()
291.
{
292.
int64_t pos = 0;
293.
293.
294.
295.
296.
{
if(_io_mode)
297.
pos =(int64_t)ftell(_f_);
298.
}
299.
300.
{
else
301.
pos = _off_set;
302.
}
303.
304.
305.
}
return pos;
306.
307.
308.
int64_t avi_writer::avi_seek(int64_t offset )
309.
{
310.
311.
fseek(_f_, offset, SEEK_SET);
if(_io_mode)
312.
313.
lseek64(_f_,_start_offset+offset,SEEK_SET);
else
314.
}
315.
316.
void317.
{
avi_writer::avi_write_idx()
318.
319.
uint32_t* buff = NULL;
int i=0;
320.
321.
322.
avi_write_fourcc(323.
avi_write_uint32(_i_frame * 16 );
"idx1" );
324.
325.
buff = (uint32_t*)calloc(326.
327.
{
if(!buff)
sizeof(uint32_t),_i_frame*16);
328.
Ipnc_DbgPrintf2(_TraceInfo,
329.
330.
}
return ;
"");
331.
332.
333.
{
for(i=0;i<_i_frame;i++)
334.
avi_set_fourcc(&buff[4*i+0],335.
avi_set_dw(&buff[4*i+1], _idx[i].is_key);
"00dc");
336.
avi_set_dw(&buff[4*i+2], _idx[i].pos );
337.
avi_set_dw(&buff[4*i+3], _idx[i].size );
338.
}
339.
avi_write_buff(buff,340.
free(buff);
sizeof(uint32_t)*_i_frame * 16);
341.
free(_idx);
342.
_idx = NULL;
343.
}
344.
void345.
{
avi_writer::avi_write_idx_hwx()
346.
347.
uint32_t* buff = NULL;
int i=0;
348.
349.
350.
if(!_idx_hwx)
351.
return;
352.
avi_write_fourcc(353.
avi_write_uint32(_i_frame);
"ihwx");
354.
355.
buff = (uint32_t*)calloc(356.
357.
{
if(!buff)
sizeof(uint32_t),_i_frame*28);
358.
Ipnc_DbgPrintf2(_TraceInfo,
359.
360.
}
return ;
"");
361.
362.
Ipnc_DbgPrintf2(_TraceInfo,
363.
_frist_serial,_cur_serial,_frist_st,_cur_st);
"frist serial:%d end serial:%d frist st:%lld cur st:%lldn",
364.
365.
366.
{
for(i=0;i<_i_frame;i++)
367.
avi_set_fourcc(&buff[7*i+0],368.
avi_set_dw(&buff[7*i+1], _idx_hwx[i]._key);
"hwx0");
369.
avi_set_dw(&buff[7*i+2], _idx_hwx[i]. );
370.
avi_set_dw(&buff[7*i+3], _idx_hwx[i]. );
371.
avi_set_dw(&buff[7*i+4], _idx_hwx[i].serial);
372.
avi_set_dw64(&buff[7*i+5], _idx_hwx[i].st);
}
372.
373.
}
374.
avi_write_buff(buff,375.
sizeof(uint32_t)*_i_frame*28);
376.
free(buff);
377.
free(_idx_hwx);
378.
_idx_hwx = NULL;
379.
}
380.
381.
int382.
{
avi_writer::avi_open(const char* filename)
383.
384.
{
if(!filename)
385.
Ipnc_DbgPrintf2(_TraceError,
386.
"invalid filenamen");
387.
}
return -1;
388.
389.
{
if(_io_mode)
390.
391.
_f_ = fopen(filename,392.
393.
{
if(!_f_)
"wb+");
394.
Ipnc_DbgPrintf2(_TraceError,
395.
396.
errno, filename);
"create avi file failed 1: error=%d, file=%sn",
397.
398.
}
return -1;
399.
}
400.
401.
{
else
402.
_f_ = open(filename,O_CREAT|O_RDWR);
403.
404.
{
if(_f_ < 0 )
405.
Ipnc_DbgPrintf2(_TraceError,
406.
407.
errno, filename);
"create avi file failed 2: error=%d, file=%sn",
408.
409.
}
return -1;
410.
}
411.
412.
Ipnc_DbgPrintf2(_TraceError,
413.
414.
filename);
"create avi file success: %sn",
415.
avi_seek(0);
416.
avi_write_header();
417.
418.
}
return 0;
419.
int420.
{
avi_writer::write_frame(void *data, int size, int b_key )
421.
422.
int64_t i_pos = avi_tell();
int ret=0;
423.
424.
425.
avi_write_fourcc(/* chunk header */
426.
avi_write_uint32(size);
"00dc" );
427.
428.
ret = avi_write_buff(data,size);
429.
430.
431.
{
if(size&0x01 )
432.
433.
avi_write_char(0);
/* pad */
434.
}
435.
436.
437.
/* Append idx chunk */
438.
{
if( _i_idx_max <= _i_frame )
439.
_i_idx_max += 1000;
440.
_idx =(AVI_IDX*)realloc(_idx,_i_idx_max*441.
}
sizeof(AVI_IDX));
442.
_idx[_i_frame].is_key = b_key ? AVIIF_KEYFRAME : 0 ;
443.
_idx[_i_frame].pos = i_pos;
444.
_idx[_i_frame].size = size;
445.
446.
_i_frame++;
447.
448.
449.
}
return ret;
450.
#ifdef VIDEO_CLIP451.
int452.
{
avi_writer::avi_write_clip(VideoClip * clip)
int ret=0;
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
int ret=0;
int j=0,size=0,serial=0;
int64_t timest=0;
int is_key=0;
int64_t i_pos = avi_tell();
//Ipnc_DbgPrintf2(_TraceInfo, "write clip pos:%lld offset:%lldn",i_pos,_off_set);
/* chunk header */
ret = avi_write_buff( clip->get_buff_head(),clip->size());
/*
Ipnc_DbgPrintf2(_TraceInfo, "clip frame num:%d start: serial:%d st:%lld end serial:%d st:%lldn",465.
466.
clip->frame_count(),467.
clip->get_frame_serial(0),
468.
clip->get_frame_timest(0),
469.
clip->get_frame_serial(clip->frame_count()-1),
470.
clip->get_frame_timest(clip->frame_count()-1));
471.
Ipnc_DbgPrintf2(_TraceInfo, "avi file frame num :%dn",_i_frame);
472.
*/
473.
474.
{
for (j=0; j
frame_count(); j++) 475.
476.
/* Append idx chunk */477.
{
if( _i_idx_max <= _i_frame )
478.
_i_idx_max += 1000;
479.
_idx =(AVI_IDX*)realloc(_idx,_i_idx_max* _idx_hwx =sizeof(AVI_IDX));
480.
(AVI_IDX_HWX*)realloc(_idx_hwx, _i_idx_max *
481.
}
sizeof(AVI_IDX_HWX));
482.
483.
is_key = clip->get_frame_key(j);
484.
size = clip->get_frame_size(j);
485.
serial = clip->get_frame_serial(j);
486.
timest = clip->get_frame_timest(j);
487.
488.
489.
490.
_frist_serial=serial;
if(!_frist_serial)
491.
_cur_serial=serial;
492.
493.
_frist_st=timest;
if(!_frist_st)
494.
_cur_st=timest;
495.
496.
_idx[_i_frame].is_key = is_key ? AVIIF_KEYFRAME : 0 ;
497.
_idx[_i_frame].pos = i_pos;
498.
_idx[_i_frame].size = size;
499.
500.
_idx_hwx[_i_frame]._key = is_key ? AVIIF_KEYFRAME : 0 ;
501.
_idx_hwx[_i_frame]. = i_pos;
502.
_idx_hwx[_i_frame]. = size;
503.
_idx_hwx[_i_frame].serial = serial;
504.
_idx_hwx[_i_frame].st = timest;
505.
506.
i_pos += (size+8+(size&0x01));
507.
508.
_i_frame++;
509.
}
510.
511.
512.
}
return ret;
513.
#endif514.
int64_t avi_writer::avi_close()
515.
{
516.
int64_t file_size = 0;
517.
_i_movi_end = avi_tell();
518.
519.
520.
avi_write_idx();
/* write index */
521.
522.
_i_riff = avi_tell();
523.
524.
//Ipnc_DbgPrintf2(_TraceInfo, "avi end:%lld offset:%lldn",_i_riff,_off_set);525.
//idx hwx
526.
//avi_write_idx_hwx();
527.
file_size = avi_tell();
528.
529.
//Ipnc_DbgPrintf2(_TraceInfo, "avi file len :%lld offset:%lldn",file_size,_off_set);530.
avi_seek(0);
/* Fix header */
avi_write_header();
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
avi_write_header();
if(_io_mode)
{
fclose(_f_);
_f_ = NULL;
}
else
{
close(_f_);
_f_ = 0;
}
return file_size;
}
int64_t avi_writer::get_avi_file_size()
{
return _off_set;
}
void avi_writer::avi_fflush()
{
if(_io_mode)
{
fflush(_f_);
}
}
int avi_writer::get_frist_serial()
{
return _frist_serial;
}
int avi_writer::get_cur_serial()
{
return _cur_serial;
}
int64_t avi_writer::get_frist_st()
{
return _frist_st;
}
int64_t avi_writer::get_cur_st()
{
return _cur_st;
}
int avi_writer::get_cur_fream_num()
{
return _i_frame;
}
int avi_writer::get_cur_idx_hwx(AVI_IDX_HWX* idx,int fream_num)
{
if(fream_num <=0 || !idx)
{
Ipnc_DbgPrintf2(_TraceInfo,"invalid idx or ");
return -1;
}
if(!_idx_hwx)
{
Ipnc_DbgPrintf2(_TraceInfo,"invalid _");
return -1;
}
memcpy(idx,_idx_hwx,fream_num* sizeof(AVI_IDX_HWX));
return 0;
}


发布评论