48 return (buf[3]<<24)|(buf[2]<<16)|(buf[1]<<8)|buf[0];
53 return (buf[0]<<24)|(buf[1]<<16)|(buf[2]<<8)|buf[3];
58 LOG(VB_GENERAL, LOG_INFO,
"%c%c%c%c ", buf[0], buf[1], buf[2], buf[3]);
81 if (len < 12)
return -1;
83 if (tag != TAG_IT(
'R',
'I',
'F',
'F'))
return -1;
90 if (tag != TAG_IT(
'A',
'V',
'I',
' ') &&
91 tag != TAG_IT(
'A',
'V',
'I',
'X') )
return -1;
98 uint32_t fl, uint32_t
id)
103 uint32_t newnum = num + 1024;
106 idx = realloc(ac->
idx,
116 ac->
idx[num].
id = id;
128 cc = (
char *) &ac->
idx[num].
id;
129 LOG(VB_GENERAL, LOG_DEBUG,
130 "%d chunkid: %c%c%c%c chunkoff: 0x%04x chunksize: 0x%04x "
131 " chunkflags: 0x%04x", num, *cc,*(cc+1),*(cc+2),*(cc+3),
144 if (!(ac->
avih_flags & AVI_HASINDEX))
return -2;
145 LOG(VB_GENERAL, LOG_INFO,
"READING INDEX");
146 if ((start = lseek(fd, 0, SEEK_CUR)) < 0)
return -3;
152 if (tag != TAG_IT(
'i',
'd',
'x',
'1')){
154 LOG(VB_GENERAL, LOG_INFO,
" tag: %c%c%c%c\n ", *cc, *(cc+1),
157 if (lseek(fd, start, SEEK_SET) < 0 )
return -5;
177 case TAG_IT(
'0',
'1',
'w',
'b'):
182 case TAG_IT(
'0',
'0',
'd',
'c'):
196 LOG(VB_GENERAL, LOG_DEBUG,
"Found %d video (%d were empty) and %d "
197 "audio (%d were empty) chunks",
202 lseek(fd, start, SEEK_SET);
220 while ((c=read(fd, buf, 4))==4) {
226 LOG(VB_GENERAL, LOG_DEBUG,
"tag: %c%c%c%c",
227 *cc, *(cc+1), *(cc+2), *(cc+3));
230 case TAG_IT(
'L',
'I',
'S',
'T'):
235 case TAG_IT(
'm',
'o',
'v',
'i'):
240 LOG(VB_GENERAL, LOG_DEBUG,
" size: %d header done",
246 case TAG_IT(
'h',
'd',
'r',
'l'):
250 case TAG_IT(
's',
't',
'r',
'l'):
253 case TAG_IT(
'J',
'U',
'N',
'K'):
254 case TAG_IT(
's',
't',
'r',
'f'):
255 case TAG_IT(
's',
't',
'r',
'd'):
256 case TAG_IT(
's',
't',
'r',
'n'):
260 case TAG_IT(
'a',
'v',
'i',
'h'):
281 LOG(VB_GENERAL, LOG_DEBUG,
" size: %d", size);
282 LOG(VB_GENERAL, LOG_DEBUG,
" microsecs per frame %d",
285 LOG(VB_GENERAL, LOG_DEBUG,
" AVI has index");
287 LOG(VB_GENERAL, LOG_DEBUG,
288 " AVI must use index");
290 LOG(VB_GENERAL, LOG_DEBUG,
291 " AVI is interleaved");
293 LOG(VB_GENERAL, LOG_DEBUG,
296 LOG(VB_GENERAL, LOG_DEBUG,
" number of streams: %d",
298 LOG(VB_GENERAL, LOG_DEBUG,
" size: %dx%d",
303 case TAG_IT(
's',
't',
'r',
'h'):
306 LOG(VB_GENERAL, LOG_DEBUG,
" size: %d", size);
315 LOG(VB_GENERAL, LOG_DEBUG,
" tag: %c%c%c%c",
316 *cc, *(cc+1), *(cc+2), *(cc+3));
319 case TAG_IT(
'v',
'i',
'd',
's'):
324 LOG(VB_GENERAL, LOG_DEBUG,
325 " video handler: %c%c%c%c",
326 *cc, *(cc+1), *(cc+2), *(cc+3));
341 LOG(VB_GENERAL, LOG_INFO,
342 "AVI video info: dw_scale %d dw_rate %d "
343 "fps %0.3f ini_frames %d dw_start %d",
348 case TAG_IT(
'a',
'u',
'd',
's'):
353 LOG(VB_GENERAL, LOG_DEBUG,
354 " audio handler: %c%c%c%c",
355 *cc, *(cc+1), *(cc+2), *(cc+3));
359 if (ac->
ntracks == MAX_TRACK)
break;
375 LOG(VB_GENERAL, LOG_INFO,
376 "AVI audio%d info: dw_scale %d dw_rate "
377 "%d ini_frames %d dw_start %d fps %0.3f "
382 ac->
ai[n].
fps/1000.0,
390 case TAG_IT(
'I',
'N',
'F',
'O'):
394 LOG(VB_GENERAL, LOG_DEBUG,
" size: %d", size);
401 lseek(fd, size, SEEK_CUR);
411 #define MAX_BUF_SIZE 0xffff
413 void (*func)(
pes_in_t *p),
int insize)
418 uint8_t
buf[MAX_BUF_SIZE];
427 switch(idx[cidx].
id){
428 case TAG_IT(
'0',
'1',
'w',
'b'):
433 case TAG_IT(
'0',
'0',
'd',
'c'):
439 LOG(VB_GENERAL, LOG_ERR,
"strange chunk :");
440 show_buf((uint8_t *) &idx[cidx].
id,4);
441 LOG(VB_GENERAL, LOG_ERR,
"offset: 0x%04x length: 0x%04x",
442 (
int)idx[cidx].off, (
int)idx[cidx].
len);
450 pos=lseek (fd, idx[cidx].off+ac->
movi_start-4, SEEK_SET);
451 read(fd,
buf,idx[cidx].
len);
456 if (idx[cidx].len > insize)
return 0;
458 if (idx[cidx].len > MAX_BUF_SIZE){
459 LOG(VB_GENERAL, LOG_ERR,
460 "Buffer too small in get_avi_from_index");
469 if (cid != idx[cidx].
id){
471 cc = (
char *)&idx[cidx].
id;
472 LOG(VB_GENERAL, LOG_ERR,
"wrong chunk id: %c%c%c%c != %c%c%c%c",
474 *cc, *(cc+1), *(cc+2), *(cc+3));
479 if (p->
plength != idx[cidx].len){
480 LOG(VB_GENERAL, LOG_ERR,
"wrong chunk size: %d != %d",
481 (
int)p->
plength, idx[cidx].len);
489 if (per % 10 == 0 && per>
lastper)
490 LOG(VB_GENERAL, LOG_INFO,
"read %3d%%", per);
494 LOG(VB_GENERAL, LOG_ERR,
"ring buffer overflow %d 0x%02x",
516 while (c < count && p->found < 8
520 if (buf[c] ==
'0') p->
found++;
525 if (buf[c] ==
'0'|| buf[c] ==
'1'){
528 }
else if (buf[c] ==
'0'){
611 LOG(VB_GENERAL, LOG_ERR,
"audio 0x%x 0x%x",
613 LOG(VB_GENERAL, LOG_ERR,
"video 0x%x 0x%x",
624 while (c < count && p->found < p->plength+8){
629 LOG(VB_GENERAL, LOG_ERR,
630 "ring buffer overflow %d", p->
rbuf->
size);
645 get_avi(p, buf+c+a, count-c-a, func);