Mercurial > mplayer.hg
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 */ |