comparison libmpdemux/demux_real.c @ 6340:7f612cf06ba5

sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net> (little cleanup and fprintf->mp_msg by me)
author arpi
date Sat, 08 Jun 2002 20:46:14 +0000
parents dca3016882cf
children ecb9d82d1b64
comparison
equal deleted inserted replaced
6339:637a29345340 6340:7f612cf06ba5
6 Based on FFmpeg's libav/rm.c. 6 Based on FFmpeg's libav/rm.c.
7 7
8 TODO: fix the whole syncing mechanism 8 TODO: fix the whole syncing mechanism
9 9
10 $Log$ 10 $Log$
11 Revision 1.12 2002/06/08 20:46:14 arpi
12 sub-packet demuxer for rv20/rv30, patch by Florian Schneider <flo-mplayer-dev@gmx.net>
13 (little cleanup and fprintf->mp_msg by me)
14
11 Revision 1.11 2002/04/30 23:29:38 alex 15 Revision 1.11 2002/04/30 23:29:38 alex
12 completed real seeking - working very well with audio only files 16 completed real seeking - working very well with audio only files
13 17
14 Revision 1.10 2002/04/24 15:36:06 albeu 18 Revision 1.10 2002/04/24 15:36:06 albeu
15 Added demuxer uninit 19 Added demuxer uninit
327 demuxer->priv = priv; 331 demuxer->priv = priv;
328 332
329 return 1; 333 return 1;
330 } 334 }
331 335
336 void hexdump(char *, unsigned long);
337
332 // return value: 338 // return value:
333 // 0 = EOF or no stream found 339 // 0 = EOF or no stream found
334 // 1 = successfully read a packet 340 // 1 = successfully read a packet
335 int demux_real_fill_buffer(demuxer_t *demuxer) 341 int demux_real_fill_buffer(demuxer_t *demuxer)
336 { 342 {
337 real_priv_t *priv = demuxer->priv; 343 real_priv_t *priv = demuxer->priv;
338 demux_stream_t *ds = NULL; 344 demux_stream_t *ds = NULL;
339 sh_audio_t *sh_audio = NULL; 345 sh_audio_t *sh_audio = NULL;
346 sh_video_t *sh_video = NULL;
340 int len; 347 int len;
341 int timestamp; 348 int timestamp;
342 int stream_id; 349 int stream_id;
343 int i; 350 int i;
344 int flags; 351 int flags;
365 flags = stream_read_char(demuxer->stream); 372 flags = stream_read_char(demuxer->stream);
366 /* flags: */ 373 /* flags: */
367 /* 0x1 - reliable */ 374 /* 0x1 - reliable */
368 /* 0x2 - keyframe */ 375 /* 0x2 - keyframe */
369 376
370 // printf("packet#%d: pos: %d, len: %d, stream_id: %d, timestamp: %d, flags: %x\n", 377 // debug re-enabled (FS)
371 // priv->current_packet, stream_tell(demuxer->stream)-12, len, stream_id, timestamp, flags); 378 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "len:%d\n", len);
379 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "packet#%d: pos: 0x%0x, len: %d, stream_id: %d, timestamp: %d, flags: %x\n",
380 priv->current_packet, (int)(stream_tell(demuxer->stream)-12), len, stream_id, timestamp, flags);
372 381
373 priv->current_packet++; 382 priv->current_packet++;
374 len -= 12; 383 len -= 12;
375 384
376 /* check if stream_id is audio stream */ 385 /* check if stream_id is audio stream */
377 for (i = 0; i < priv->last_a_stream; i++) 386 for (i = 0; i < priv->last_a_stream; i++)
378 { 387 {
379 if (priv->a_streams[i] == stream_id) 388 if (priv->a_streams[i] == stream_id)
380 { 389 {
381 // printf("packet is audio (id: %d)\n", stream_id); 390 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "packet is audio (id: %d)\n", stream_id);
382 ds = demuxer->audio; /* FIXME */ 391 ds = demuxer->audio; /* FIXME */
383 sh_audio = ds->sh; 392 sh_audio = ds->sh;
384 priv->current_apacket++; 393 priv->current_apacket++;
385 break; 394 break;
386 } 395 }
388 /* check if stream_id is video stream */ 397 /* check if stream_id is video stream */
389 for (i = 0; i < priv->last_v_stream; i++) 398 for (i = 0; i < priv->last_v_stream; i++)
390 { 399 {
391 if (priv->v_streams[i] == stream_id) 400 if (priv->v_streams[i] == stream_id)
392 { 401 {
393 // printf("packet is video (id: %d)\n", stream_id); 402 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "packet is video (id: %d)\n", stream_id);
394 ds = demuxer->video; /* FIXME */ 403 ds = demuxer->video; /* FIXME */
404 sh_video = ds->sh;
395 priv->current_vpacket++; 405 priv->current_vpacket++;
396 break; 406 break;
397 } 407 }
398 } 408 }
399 409
400 /* id not found */ 410 /* id not found */
401 if (ds == NULL) 411 if (ds == NULL)
402 { 412 {
403 printf("unknown stream id (%d)\n", stream_id); 413 mp_msg(MSGT_DEMUX,MSGL_DBG2, "unknown stream id (%d)\n", stream_id);
404 stream_skip(demuxer->stream, len); 414 stream_skip(demuxer->stream, len);
405 goto loop; 415 goto loop;
406 } 416 }
407 417
408 demuxer->filepos = stream_tell(demuxer->stream); 418 demuxer->filepos = stream_tell(demuxer->stream);
409 #if 0 419 #if 0
410 ds_read_packet(ds, demuxer->stream, len, timestamp/90000.0f, 420 ds_read_packet(ds, demuxer->stream, len, timestamp/90000.0f,
411 demuxer->filepos, (flags & 0x2) ? 0x10 : 0); 421 demuxer->filepos, (flags & 0x2) ? 0x10 : 0);
412 #else 422 #else
413 { 423 {
414 demux_packet_t *dp = new_demux_packet(len); 424 demux_packet_t *dp=NULL;
425 // = new_demux_packet(len);
415 426
416 stream_read(demuxer->stream, dp->buffer, len);
417 /* if DNET, swap bytes! */ 427 /* if DNET, swap bytes! */
418 if (sh_audio != NULL) 428 if (sh_audio != NULL) {
429 dp = new_demux_packet(len);
430 stream_read(demuxer->stream, dp->buffer, len);
419 if (sh_audio->format == 0x2000) 431 if (sh_audio->format == 0x2000)
420 { 432 {
421 char *ptr = dp->buffer; 433 char *ptr = dp->buffer;
422 434
423 for (i = 0; i < len; i += 2) 435 for (i = 0; i < len; i += 2)
426 ptr[0] = ptr[1]; 438 ptr[0] = ptr[1];
427 ptr[1] = tmp; 439 ptr[1] = tmp;
428 ptr += 2; 440 ptr += 2;
429 } 441 }
430 } 442 }
431 dp->pts = timestamp/90000.0f; 443 dp->pts = timestamp/90000.0f;
432 dp->pos = demuxer->filepos; 444 dp->pos = demuxer->filepos;
433 dp->flags = (flags & 0x2) ? 0x10 : 0; 445 dp->flags = (flags & 0x2) ? 0x10 : 0;
434 ds_add_packet(ds, dp); 446 ds_add_packet(ds, dp);
447 }
448 if (sh_video != NULL) {
449 if (sh_video->format==0x30335652 && 1) {
450 // we need a more complicated demuxing
451 // a block may contain multiple packets
452 // as well as a packet may be contained in multiple blocks
453 int vpkg_header, vpkg_blknum, vpkg_length, vpkg_offset;
454 int vpkg_seqnum=-1, vpkg_oldseqnum=0, vpkg_seqnumread=0;
455 int vpkg_ofs;
456 unsigned int* extra;
457
458
459 while(len>0){
460
461 // read packet header
462 // bit 7: 1=last block in block chain
463 // bit 6: 1=short header (only one block?)
464 vpkg_header=stream_read_char(demuxer->stream); --len;
465 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "hdr: %0.2X (len=%d) ",vpkg_header,len);
466
467 if (0x40==(vpkg_header&0xc0)) {
468 // seems to be a very short header
469 // 2 bytes, purpose of the second byte yet unknown
470 int bummer;
471 bummer=stream_read_char(demuxer->stream); --len;
472 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X",bummer);
473 vpkg_offset=0;
474 vpkg_length=len;
475 } else {
476
477 if (0==(vpkg_header&0x40)) {
478 // sub-seqnum (bits 0-6: number of fragment. bit 7: ???)
479 vpkg_seqnum=stream_read_char(demuxer->stream);
480 --len;
481 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "subseq: %0.2X ",vpkg_seqnum);
482 }
483
484 // size of the complete packet
485 // bit 14 is always one (same applies to the offset)
486 vpkg_length=stream_read_word(demuxer->stream);
487 len-=2;
488 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X %0.2X ",vpkg_length>>8,vpkg_length&0xff);
489 vpkg_length&=0x3fff;
490
491 // offset of the following data inside the complete packet
492 // Note: if (hdr&0xC0)==0x80 then offset is relative to the
493 // _end_ of the packet, so it's equal to fragment size!!!
494 vpkg_offset=stream_read_word(demuxer->stream);
495 len-=2;
496 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X %0.2X ",vpkg_offset>>8,vpkg_offset&0xff);
497 if (vpkg_offset==0) {
498 vpkg_offset=stream_read_word(demuxer->stream);
499 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X %0.2X ",vpkg_offset>>8,vpkg_offset&0xff);
500 len-=2;
501 }
502 vpkg_offset&=0x3fff;
503
504 vpkg_seqnum=stream_read_char(demuxer->stream); --len;
505 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "%0.2X ",vpkg_seqnum);
506 }
507 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "\n");
508 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "blklen=%d\n", len);
509 mp_msg(MSGT_DEMUX,MSGL_DBG2, "block: hdr=0x%0x, len=%d, offset=%d, seqnum=%d\n",
510 vpkg_header, vpkg_length, vpkg_offset, vpkg_seqnum);
511
512 if(ds->asf_packet){
513 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "we have an incomplete packet (oldseq=%d new=%d)\n",ds->asf_seq,vpkg_seqnum);
514 // we have an incomplete packet:
515 if(ds->asf_seq!=vpkg_seqnum){
516 // this fragment is for new packet, close the old one
517 ds_add_packet(ds,ds->asf_packet);
518 ds->asf_packet=NULL;
519 } else {
520 // append data to it!
521 demux_packet_t* dp=ds->asf_packet;
522 extra=(unsigned int*)(dp->buffer+vpkg_length);
523 ++extra[0];
524 if((extra[0]&3)==0){ // increase buffer size, if more than 4 subpackets
525 mp_msg(MSGT_DEMUX,MSGL_DBG2, "buffer too small!!!!!\n");
526 dp->buffer=realloc(dp->buffer,vpkg_length+(extra[0]+5)*8);
527 extra=(unsigned int*)(dp->buffer+vpkg_length);
528 }
529 extra[2+2*extra[0]]=1;
530 extra[3+2*extra[0]]=dp->len;
531 if(0x80==(vpkg_header&0xc0)){
532 // last fragment!
533 if(dp->len!=vpkg_length-vpkg_offset)
534 mp_msg(MSGT_DEMUX,MSGL_V,"warning! assembled.len=%d frag.len=%d total.len=%d \n",dp->len,vpkg_offset,vpkg_length-vpkg_offset);
535 stream_read(demuxer->stream, dp->buffer + dp->len, vpkg_offset);
536 dp->len+=vpkg_offset;
537 len-=vpkg_offset;
538 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "fragment (%d bytes) appended, %d bytes left\n",vpkg_offset,len);
539 // we know that this is the last fragment -> we can close the packet!
540 ds_add_packet(ds,dp);
541 ds->asf_packet=NULL;
542 // continue parsing
543 continue;
544 }
545 // non-last fragment:
546 if(dp->len!=vpkg_offset)
547 mp_msg(MSGT_DEMUX,MSGL_V,"warning! assembled.len=%d offset=%d frag.len=%d total.len=%d \n",dp->len,vpkg_offset,len,vpkg_length);
548 stream_read(demuxer->stream, dp->buffer + dp->len, len);
549 dp->len+=len;
550 break; // no more fragments in this chunk!
551 }
552 }
553 // create new packet!
554 dp = new_demux_packet(vpkg_length+8*5);
555 // the timestamp seems to be in milliseconds
556 dp->pts = timestamp/1000.0f; timestamp=0;
557 dp->pos = demuxer->filepos;
558 dp->flags = (flags & 0x2) ? 0x10 : 0;
559 ds->asf_seq = vpkg_seqnum;
560 extra=(unsigned int*)(dp->buffer+vpkg_length);
561 extra[0]=0; // blocks
562 extra[1]=timestamp;
563 extra[2]=1; // sub-1
564 extra[3]=0;
565 if(0x00==(vpkg_header&0xc0)){
566 // first fragment:
567 dp->len=len;
568 stream_read(demuxer->stream, dp->buffer, dp->len);
569 ds->asf_packet=dp;
570 break;
571 }
572 // whole packet (not fragmented):
573 dp->len=vpkg_length; len-=vpkg_length;
574 stream_read(demuxer->stream, dp->buffer, dp->len);
575 ds_add_packet(ds,dp);
576
577 } // while(len>0)
578
579 } else {
580 // old video stream type
581
582 dp = new_demux_packet(len);
583 stream_read(demuxer->stream, dp->buffer, len);
584 dp->pts = timestamp/90000.0f;
585 dp->pos = demuxer->filepos;
586 dp->flags = (flags & 0x2) ? 0x10 : 0;
587 ds_add_packet(ds, dp);
588 }
589
590 }
435 } 591 }
436 #endif 592 #endif
437 593
438 return 1; 594 return 1;
439 } 595 }
446 602
447 stream_skip(demuxer->stream, 4); /* header size */ 603 stream_skip(demuxer->stream, 4); /* header size */
448 stream_skip(demuxer->stream, 2); /* version */ 604 stream_skip(demuxer->stream, 2); /* version */
449 // stream_skip(demuxer->stream, 4); 605 // stream_skip(demuxer->stream, 4);
450 i = stream_read_dword(demuxer->stream); 606 i = stream_read_dword(demuxer->stream);
451 printf("File version: %d\n", i); 607 mp_msg(MSGT_DEMUX,MSGL_V, "real: File version: %d\n", i);
452 num_of_headers = stream_read_dword(demuxer->stream); 608 num_of_headers = stream_read_dword(demuxer->stream);
453 // stream_skip(demuxer->stream, 4); /* number of headers */ 609 // stream_skip(demuxer->stream, 4); /* number of headers */
454 610
455 priv->current_vid = priv->current_aid = -1; 611 priv->current_vid = priv->current_aid = -1;
456 612
466 stream_skip(demuxer->stream, 2); /* version */ 622 stream_skip(demuxer->stream, 2); /* version */
467 623
468 if (chunk_size < 10) 624 if (chunk_size < 10)
469 goto fail; 625 goto fail;
470 626
471 printf("Chunk: %.4s (%x) (size: 0x%x, offset: 0x%x)\n", 627 mp_msg(MSGT_DEMUX,MSGL_V, "Chunk: %.4s (%x) (size: 0x%x, offset: 0x%x)\n",
472 (char *)&chunk_id, chunk_id, chunk_size, chunk_pos); 628 (char *)&chunk_id, chunk_id, chunk_size, chunk_pos);
473 629
474 switch(chunk_id) 630 switch(chunk_id)
475 { 631 {
476 case MKTAG('P', 'R', 'O', 'P'): 632 case MKTAG('P', 'R', 'O', 'P'):
482 stream_skip(demuxer->stream, 4); /* avg packet size */ 638 stream_skip(demuxer->stream, 4); /* avg packet size */
483 stream_skip(demuxer->stream, 4); /* nb packets */ 639 stream_skip(demuxer->stream, 4); /* nb packets */
484 stream_skip(demuxer->stream, 4); /* duration */ 640 stream_skip(demuxer->stream, 4); /* duration */
485 stream_skip(demuxer->stream, 4); /* preroll */ 641 stream_skip(demuxer->stream, 4); /* preroll */
486 priv->index_chunk_offset = stream_read_dword(demuxer->stream); 642 priv->index_chunk_offset = stream_read_dword(demuxer->stream);
487 printf("First index chunk offset: 0x%x\n", priv->index_chunk_offset); 643 mp_msg(MSGT_DEMUX,MSGL_V,"First index chunk offset: 0x%x\n", priv->index_chunk_offset);
488 priv->data_chunk_offset = stream_read_dword(demuxer->stream)+10; 644 priv->data_chunk_offset = stream_read_dword(demuxer->stream)+10;
489 printf("First data chunk offset: 0x%x\n", priv->data_chunk_offset); 645 mp_msg(MSGT_DEMUX,MSGL_V,"First data chunk offset: 0x%x\n", priv->data_chunk_offset);
490 stream_skip(demuxer->stream, 2); /* nb streams */ 646 stream_skip(demuxer->stream, 2); /* nb streams */
491 #if 0 647 #if 0
492 stream_skip(demuxer->stream, 2); /* flags */ 648 stream_skip(demuxer->stream, 2); /* flags */
493 #else 649 #else
494 { 650 {
495 int flags = stream_read_word(demuxer->stream); 651 int flags = stream_read_word(demuxer->stream);
496 652
497 if (flags) 653 if (flags)
498 { 654 {
499 printf("Flags (%x): ", flags); 655 mp_msg(MSGT_DEMUX,MSGL_V,"Flags (%x): ", flags);
500 if (flags & 0x1) 656 if (flags & 0x1)
501 printf("[save allowed] "); 657 mp_msg(MSGT_DEMUX,MSGL_V,"[save allowed] ");
502 if (flags & 0x2) 658 if (flags & 0x2)
503 printf("[perfect play (more buffers)] "); 659 mp_msg(MSGT_DEMUX,MSGL_V,"[perfect play (more buffers)] ");
504 if (flags & 0x4) 660 if (flags & 0x4)
505 printf("[live broadcast] "); 661 mp_msg(MSGT_DEMUX,MSGL_V,"[live broadcast] ");
506 printf("\n"); 662 mp_msg(MSGT_DEMUX,MSGL_V,"\n");
507 } 663 }
508 } 664 }
509 #endif 665 #endif
510 break; 666 break;
511 case MKTAG('C', 'O', 'N', 'T'): 667 case MKTAG('C', 'O', 'N', 'T'):
563 int codec_data_size; 719 int codec_data_size;
564 int codec_pos; 720 int codec_pos;
565 int tmp; 721 int tmp;
566 722
567 stream_id = stream_read_word(demuxer->stream); 723 stream_id = stream_read_word(demuxer->stream);
568 printf("Found new stream (id: %d)\n", stream_id); 724 mp_msg(MSGT_DEMUX,MSGL_V,"Found new stream (id: %d)\n", stream_id);
569 725
570 stream_skip(demuxer->stream, 4); /* max bitrate */ 726 stream_skip(demuxer->stream, 4); /* max bitrate */
571 bitrate = stream_read_dword(demuxer->stream); /* avg bitrate */ 727 bitrate = stream_read_dword(demuxer->stream); /* avg bitrate */
572 stream_skip(demuxer->stream, 4); /* max packet size */ 728 stream_skip(demuxer->stream, 4); /* max packet size */
573 stream_skip(demuxer->stream, 4); /* avg packet size */ 729 stream_skip(demuxer->stream, 4); /* avg packet size */
590 sh_audio_t *sh = new_sh_audio(demuxer, stream_id); 746 sh_audio_t *sh = new_sh_audio(demuxer, stream_id);
591 char buf[128]; /* for codec name */ 747 char buf[128]; /* for codec name */
592 int frame_size; 748 int frame_size;
593 int version; 749 int version;
594 750
595 printf("Found audio stream!\n"); 751 mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n");
596 version = stream_read_word(demuxer->stream); 752 version = stream_read_word(demuxer->stream);
597 printf("version: %d\n", version); 753 mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version);
598 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */ 754 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */
599 stream_skip(demuxer->stream, 2); 755 stream_skip(demuxer->stream, 2);
600 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */ 756 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */
601 stream_skip(demuxer->stream, 4); 757 stream_skip(demuxer->stream, 4);
602 stream_skip(demuxer->stream, 2); /* version (4 or 5) */ 758 stream_skip(demuxer->stream, 2); /* version (4 or 5) */
607 stream_skip(demuxer->stream, 4); 763 stream_skip(demuxer->stream, 4);
608 stream_skip(demuxer->stream, 4); 764 stream_skip(demuxer->stream, 4);
609 stream_skip(demuxer->stream, 2); /* 1 */ 765 stream_skip(demuxer->stream, 2); /* 1 */
610 // stream_skip(demuxer->stream, 2); /* coded frame size */ 766 // stream_skip(demuxer->stream, 2); /* coded frame size */
611 frame_size = stream_read_word(demuxer->stream); 767 frame_size = stream_read_word(demuxer->stream);
612 printf("frame_size: %d\n", frame_size); 768 mp_msg(MSGT_DEMUX,MSGL_V,"frame_size: %d\n", frame_size);
613 stream_skip(demuxer->stream, 4); 769 stream_skip(demuxer->stream, 4);
614 770
615 if (version == 5) 771 if (version == 5)
616 stream_skip(demuxer->stream, 6); 772 stream_skip(demuxer->stream, 6);
617 773
618 sh->samplerate = stream_read_word(demuxer->stream); 774 sh->samplerate = stream_read_word(demuxer->stream);
619 stream_skip(demuxer->stream, 4); 775 stream_skip(demuxer->stream, 4);
620 sh->channels = stream_read_word(demuxer->stream); 776 sh->channels = stream_read_word(demuxer->stream);
621 printf("samplerate: %d, channels: %d\n", 777 mp_msg(MSGT_DEMUX,MSGL_V,"samplerate: %d, channels: %d\n",
622 sh->samplerate, sh->channels); 778 sh->samplerate, sh->channels);
623 779
624 if (version == 5) 780 if (version == 5)
625 { 781 {
626 stream_skip(demuxer->stream, 4); 782 stream_skip(demuxer->stream, 4);
647 803
648 tmp = 1; /* supported audio codec */ 804 tmp = 1; /* supported audio codec */
649 switch (MKTAG(buf[0], buf[1], buf[2], buf[3])) 805 switch (MKTAG(buf[0], buf[1], buf[2], buf[3]))
650 { 806 {
651 case MKTAG('d', 'n', 'e', 't'): 807 case MKTAG('d', 'n', 'e', 't'):
652 printf("Audio: DNET -> AC3\n"); 808 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n");
653 sh->format = 0x2000; 809 sh->format = 0x2000;
654 break; 810 break;
655 case MKTAG('s', 'i', 'p', 'r'): 811 case MKTAG('s', 'i', 'p', 'r'):
656 printf("Audio: SiproLab's ACELP.net\n"); 812 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: SiproLab's ACELP.net\n");
657 sh->format = 0x130; 813 sh->format = 0x130;
658 /* for buggy directshow loader */ 814 /* for buggy directshow loader */
659 sh->wf = realloc(sh->wf, 18+4); 815 sh->wf = realloc(sh->wf, 18+4);
660 sh->wf->wBitsPerSample = 0; 816 sh->wf->wBitsPerSample = 0;
661 sh->wf->nAvgBytesPerSec = 1055; 817 sh->wf->nAvgBytesPerSec = 1055;
671 // sh->wf[sizeof(WAVEFORMATEX)+2] = 1; 827 // sh->wf[sizeof(WAVEFORMATEX)+2] = 1;
672 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1; 828 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1;
673 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0; 829 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0;
674 break; 830 break;
675 case MKTAG('c', 'o', 'o', 'k'): 831 case MKTAG('c', 'o', 'o', 'k'):
676 printf("Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n"); 832 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n");
677 tmp = 0; 833 tmp = 0;
678 break; 834 break;
679 case MKTAG('a', 't', 'r', 'c'): 835 case MKTAG('a', 't', 'r', 'c'):
680 printf("Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n"); 836 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n");
681 sh->format = 0x270; 837 sh->format = 0x270;
682 838
683 sh->wf->nAvgBytesPerSec = 16537; // 8268 839 sh->wf->nAvgBytesPerSec = 16537; // 8268
684 sh->wf->nBlockAlign = 384; // 192 840 sh->wf->nBlockAlign = 384; // 192
685 sh->wf->wBitsPerSample = 0; /* from AVI created by VirtualDub */ 841 sh->wf->wBitsPerSample = 0; /* from AVI created by VirtualDub */
686 /* 14 bytes extra header needed ! */ 842 /* 14 bytes extra header needed ! */
687 sh->wf->cbSize = 14; 843 sh->wf->cbSize = 14;
688 sh->wf = realloc(sh->wf, 18+sh->wf->cbSize); 844 sh->wf = realloc(sh->wf, 18+sh->wf->cbSize);
689 break; 845 break;
690 default: 846 default:
691 printf("Audio: Unknown (%s)\n", buf); 847 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Unknown (%s)\n", buf);
692 tmp = 0; 848 tmp = 0;
693 sh->format = MKTAG(buf[0], buf[1], buf[2], buf[3]); 849 sh->format = MKTAG(buf[0], buf[1], buf[2], buf[3]);
694 } 850 }
695 851
696 sh->wf->wFormatTag = sh->format; 852 sh->wf->wFormatTag = sh->format;
720 { 876 {
721 /* video header */ 877 /* video header */
722 sh_video_t *sh = new_sh_video(demuxer, stream_id); 878 sh_video_t *sh = new_sh_video(demuxer, stream_id);
723 879
724 tmp = stream_read_dword_le(demuxer->stream); 880 tmp = stream_read_dword_le(demuxer->stream);
725 printf("video: %.4s (%x)\n", (char *)&tmp, tmp); 881 mp_msg(MSGT_DEMUX,MSGL_V,"video: %.4s (%x)\n", (char *)&tmp, tmp);
726 if (tmp != MKTAG('V', 'I', 'D', 'O')) 882 if (tmp != MKTAG('V', 'I', 'D', 'O'))
727 { 883 {
728 mp_msg(MSGT_DEMUX, MSGL_ERR, "Not audio/video stream or unsupported!\n"); 884 mp_msg(MSGT_DEMUX, MSGL_ERR, "Not audio/video stream or unsupported!\n");
729 goto skip_this_chunk; 885 goto skip_this_chunk;
730 } 886 }
731 887
732 sh->format = stream_read_dword_le(demuxer->stream); /* fourcc */ 888 sh->format = stream_read_dword_le(demuxer->stream); /* fourcc */
733 printf("video fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format); 889 mp_msg(MSGT_DEMUX,MSGL_V,"video fourcc: %.4s (%x)\n", (char *)&sh->format, sh->format);
734 890
735 /* emulate BITMAPINFOHEADER */ 891 /* emulate BITMAPINFOHEADER */
736 sh->bih = malloc(sizeof(BITMAPINFOHEADER)); 892 sh->bih = malloc(sizeof(BITMAPINFOHEADER));
737 memset(sh->bih, 0, sizeof(BITMAPINFOHEADER)); 893 memset(sh->bih, 0, sizeof(BITMAPINFOHEADER));
738 sh->bih->biSize = 40; 894 sh->bih->biSize = 40;
751 stream_skip(demuxer->stream, 4); 907 stream_skip(demuxer->stream, 4);
752 stream_skip(demuxer->stream, 2); 908 stream_skip(demuxer->stream, 2);
753 909
754 /* h263 hack */ 910 /* h263 hack */
755 tmp = stream_read_dword(demuxer->stream); 911 tmp = stream_read_dword(demuxer->stream);
756 printf("H.263 ID: %x\n", tmp); 912 mp_msg(MSGT_DEMUX,MSGL_V,"H.263 ID: %x\n", tmp);
757 switch (tmp) 913 switch (tmp)
758 { 914 {
759 case 0x10000000: 915 case 0x10000000:
760 /* sub id: 0 */ 916 /* sub id: 0 */
761 /* codec id: rv10 */ 917 /* codec id: rv10 */
768 break; 924 break;
769 case 0x20001000: 925 case 0x20001000:
770 case 0x20100001: 926 case 0x20100001:
771 /* codec id: rv20 */ 927 /* codec id: rv20 */
772 break; 928 break;
929 case 0x30202002:
930 /* codec id: rv30 */
931 break;
773 default: 932 default:
774 /* codec id: none */ 933 /* codec id: none */
775 printf("unknown id: %x\n", tmp); 934 mp_msg(MSGT_DEMUX,MSGL_V,"unknown id: %x\n", tmp);
776 } 935 }
777 936
778 /* insert as stream */ 937 /* insert as stream */
779 demuxer->video->sh = sh; 938 demuxer->video->sh = sh;
780 sh->ds = demuxer->video; 939 sh->ds = demuxer->video;
797 } 956 }
798 case MKTAG('D', 'A', 'T', 'A'): 957 case MKTAG('D', 'A', 'T', 'A'):
799 goto header_end; 958 goto header_end;
800 case MKTAG('I', 'N', 'D', 'X'): 959 case MKTAG('I', 'N', 'D', 'X'):
801 default: 960 default:
802 printf("Unknown chunk: %x\n", chunk_id); 961 mp_msg(MSGT_DEMUX,MSGL_V,"Unknown chunk: %x\n", chunk_id);
803 stream_skip(demuxer->stream, chunk_size - 10); 962 stream_skip(demuxer->stream, chunk_size - 10);
804 break; 963 break;
805 } 964 }
806 } 965 }
807 966
808 header_end: 967 header_end:
809 priv->num_of_packets = stream_read_dword(demuxer->stream); 968 priv->num_of_packets = stream_read_dword(demuxer->stream);
810 // stream_skip(demuxer->stream, 4); /* number of packets */ 969 // stream_skip(demuxer->stream, 4); /* number of packets */
811 stream_skip(demuxer->stream, 4); /* next data header */ 970 stream_skip(demuxer->stream, 4); /* next data header */
812 971
813 printf("Packets in file: %d\n", priv->num_of_packets); 972 mp_msg(MSGT_DEMUX,MSGL_V,"Packets in file: %d\n", priv->num_of_packets);
814 973
815 if (priv->num_of_packets == 0) 974 if (priv->num_of_packets == 0)
816 priv->num_of_packets = -10; 975 priv->num_of_packets = -10;
817 976
818 /* disable seeking */ 977 /* disable seeking */