Mercurial > mplayer.hg
comparison libmpdemux/demux_real.c @ 6369:63984a4cbbb6
export extra data for cook codec, some debug stuff
author | arpi |
---|---|
date | Mon, 10 Jun 2002 02:27:31 +0000 |
parents | ecb9d82d1b64 |
children | b2d5aeb72f95 |
comparison
equal
deleted
inserted
replaced
6368:9511fffdb8c6 | 6369:63984a4cbbb6 |
---|---|
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.14 2002/06/10 02:27:31 arpi | |
12 export extra data for cook codec, some debug stuff | |
13 | |
11 Revision 1.13 2002/06/09 01:07:22 arpi | 14 Revision 1.13 2002/06/09 01:07:22 arpi |
12 - multiple audio/video stream support fixed | 15 - multiple audio/video stream support fixed |
13 - aid/vid autodetection (asf style - use id of first packet received) | 16 - aid/vid autodetection (asf style - use id of first packet received) |
14 - rv20 sub-packets support | 17 - rv20 sub-packets support |
15 - exporting codec id and sub-id to the codec, in bitmapinfoheader | 18 - exporting codec id and sub-id to the codec, in bitmapinfoheader |
62 | 65 |
63 #include "stream.h" | 66 #include "stream.h" |
64 #include "demuxer.h" | 67 #include "demuxer.h" |
65 #include "stheader.h" | 68 #include "stheader.h" |
66 #include "bswap.h" | 69 #include "bswap.h" |
70 | |
71 //#define mp_dbg(mod,lev, args... ) mp_msg_c((mod<<8)|lev, ## args ) | |
67 | 72 |
68 #define MKTAG(a, b, c, d) (a | (b << 8) | (c << 16) | (d << 24)) | 73 #define MKTAG(a, b, c, d) (a | (b << 8) | (c << 16) | (d << 24)) |
69 | 74 |
70 #define MAX_STREAMS 32 | 75 #define MAX_STREAMS 32 |
71 | 76 |
436 | 441 |
437 /* if DNET, swap bytes! */ | 442 /* if DNET, swap bytes! */ |
438 if (sh_audio != NULL) { | 443 if (sh_audio != NULL) { |
439 dp = new_demux_packet(len); | 444 dp = new_demux_packet(len); |
440 stream_read(demuxer->stream, dp->buffer, len); | 445 stream_read(demuxer->stream, dp->buffer, len); |
446 fprintf(stderr,"audio block len=%d\n",len); | |
441 if (sh_audio->format == 0x2000) | 447 if (sh_audio->format == 0x2000) |
442 { | 448 { |
443 char *ptr = dp->buffer; | 449 char *ptr = dp->buffer; |
444 | 450 |
445 for (i = 0; i < len; i += 2) | 451 for (i = 0; i < len; i += 2) |
448 ptr[0] = ptr[1]; | 454 ptr[0] = ptr[1]; |
449 ptr[1] = tmp; | 455 ptr[1] = tmp; |
450 ptr += 2; | 456 ptr += 2; |
451 } | 457 } |
452 } | 458 } |
453 dp->pts = timestamp/90000.0f; | 459 dp->pts = timestamp/1000.0f; |
454 dp->pos = demuxer->filepos; | 460 dp->pos = demuxer->filepos; |
455 dp->flags = (flags & 0x2) ? 0x10 : 0; | 461 dp->flags = (flags & 0x2) ? 0x10 : 0; |
456 ds_add_packet(ds, dp); | 462 ds_add_packet(ds, dp); |
457 } | 463 } else |
458 if (sh_video != NULL) { | 464 if (sh_video != NULL) { |
459 if (sh_video->format==0x30335652 || | 465 if (sh_video->format==0x30335652 || |
460 sh_video->format==0x30325652 ) { | 466 sh_video->format==0x30325652 ) { |
461 // we need a more complicated demuxing | 467 // we need a more complicated demuxing |
462 // a block may contain multiple packets | 468 // a block may contain multiple packets |
528 if(ds->asf_packet){ | 534 if(ds->asf_packet){ |
529 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "we have an incomplete packet (oldseq=%d new=%d)\n",ds->asf_seq,vpkg_seqnum); | 535 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "we have an incomplete packet (oldseq=%d new=%d)\n",ds->asf_seq,vpkg_seqnum); |
530 // we have an incomplete packet: | 536 // we have an incomplete packet: |
531 if(ds->asf_seq!=vpkg_seqnum){ | 537 if(ds->asf_seq!=vpkg_seqnum){ |
532 // this fragment is for new packet, close the old one | 538 // this fragment is for new packet, close the old one |
539 mp_msg(MSGT_DEMUX,MSGL_DBG2, "closing probably incomplete packet, len: %d \n",ds->asf_packet->len); | |
533 ds_add_packet(ds,ds->asf_packet); | 540 ds_add_packet(ds,ds->asf_packet); |
534 ds->asf_packet=NULL; | 541 ds->asf_packet=NULL; |
535 } else { | 542 } else { |
536 // append data to it! | 543 // append data to it! |
537 demux_packet_t* dp=ds->asf_packet; | 544 demux_packet_t* dp=ds->asf_packet; |
762 codec_data_size = stream_read_dword(demuxer->stream); | 769 codec_data_size = stream_read_dword(demuxer->stream); |
763 codec_pos = stream_tell(demuxer->stream); | 770 codec_pos = stream_tell(demuxer->stream); |
764 | 771 |
765 tmp = stream_read_dword(demuxer->stream); | 772 tmp = stream_read_dword(demuxer->stream); |
766 | 773 |
774 //#define stream_skip(st,siz) { int i; for(i=0;i<siz;i++) mp_msg(MSGT_DEMUX,MSGL_V," %02X",stream_read_char(st)); mp_msg(MSGT_DEMUX,MSGL_V,"\n");} | |
775 | |
767 if (tmp == MKTAG(0xfd, 'a', 'r', '.')) | 776 if (tmp == MKTAG(0xfd, 'a', 'r', '.')) |
768 { | 777 { |
769 /* audio header */ | 778 /* audio header */ |
770 sh_audio_t *sh = new_sh_audio(demuxer, stream_id); | 779 sh_audio_t *sh = new_sh_audio(demuxer, stream_id); |
771 char buf[128]; /* for codec name */ | 780 char buf[128]; /* for codec name */ |
772 int frame_size; | 781 int frame_size; |
773 int version; | 782 int version; |
783 int flavor; | |
774 | 784 |
775 mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n"); | 785 mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n"); |
776 version = stream_read_word(demuxer->stream); | 786 version = stream_read_word(demuxer->stream); |
777 mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version); | 787 mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version); |
778 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */ | 788 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */ |
779 stream_skip(demuxer->stream, 2); | 789 stream_skip(demuxer->stream, 2); |
780 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */ | 790 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */ |
781 stream_skip(demuxer->stream, 4); | 791 stream_skip(demuxer->stream, 4); |
782 stream_skip(demuxer->stream, 2); /* version (4 or 5) */ | 792 stream_skip(demuxer->stream, 2); /* version (4 or 5) */ |
783 stream_skip(demuxer->stream, 4); /* header size */ | 793 stream_skip(demuxer->stream, 4); /* header size */ |
784 stream_skip(demuxer->stream, 2); /* add codec info */ | 794 flavor = stream_read_word(demuxer->stream);/* codec flavor id */ |
785 stream_skip(demuxer->stream, 4); /* coded frame size */ | 795 stream_skip(demuxer->stream, 4); /* coded frame size */ |
786 stream_skip(demuxer->stream, 4); | 796 stream_skip(demuxer->stream, 4); // big number |
787 stream_skip(demuxer->stream, 4); | 797 stream_skip(demuxer->stream, 4); // bigger number |
788 stream_skip(demuxer->stream, 4); | 798 stream_skip(demuxer->stream, 4); // 2 |
789 stream_skip(demuxer->stream, 2); /* 1 */ | 799 stream_skip(demuxer->stream, 2); // 10 |
790 // stream_skip(demuxer->stream, 2); /* coded frame size */ | 800 // stream_skip(demuxer->stream, 2); /* coded frame size */ |
791 frame_size = stream_read_word(demuxer->stream); | 801 frame_size = stream_read_word(demuxer->stream); |
792 mp_msg(MSGT_DEMUX,MSGL_V,"frame_size: %d\n", frame_size); | 802 mp_msg(MSGT_DEMUX,MSGL_V,"frame_size: %d\n", frame_size); |
793 stream_skip(demuxer->stream, 4); | 803 stream_skip(demuxer->stream, 4); // 60,0 |
794 | 804 |
795 if (version == 5) | 805 if (version == 5) |
796 stream_skip(demuxer->stream, 6); | 806 stream_skip(demuxer->stream, 6); //0,srate,0 |
797 | 807 |
798 sh->samplerate = stream_read_word(demuxer->stream); | 808 sh->samplerate = stream_read_word(demuxer->stream); |
799 stream_skip(demuxer->stream, 4); | 809 stream_skip(demuxer->stream, 2); // 0 |
810 sh->samplesize = stream_read_word(demuxer->stream)/8; | |
800 sh->channels = stream_read_word(demuxer->stream); | 811 sh->channels = stream_read_word(demuxer->stream); |
801 mp_msg(MSGT_DEMUX,MSGL_V,"samplerate: %d, channels: %d\n", | 812 mp_msg(MSGT_DEMUX,MSGL_V,"samplerate: %d, channels: %d\n", |
802 sh->samplerate, sh->channels); | 813 sh->samplerate, sh->channels); |
803 | 814 |
804 if (version == 5) | 815 if (version == 5) |
805 { | 816 { |
806 stream_skip(demuxer->stream, 4); | 817 stream_skip(demuxer->stream, 4); // "genr" |
807 stream_read(demuxer->stream, buf, 4); | 818 stream_read(demuxer->stream, buf, 4); // fourcc |
808 buf[4] = 0; | 819 buf[4] = 0; |
809 } | 820 } |
810 else | 821 else |
811 { | 822 { |
812 /* Desc #1 */ | 823 /* Desc #1 */ |
817 | 828 |
818 /* Emulate WAVEFORMATEX struct: */ | 829 /* Emulate WAVEFORMATEX struct: */ |
819 sh->wf = malloc(sizeof(WAVEFORMATEX)); | 830 sh->wf = malloc(sizeof(WAVEFORMATEX)); |
820 memset(sh->wf, 0, sizeof(WAVEFORMATEX)); | 831 memset(sh->wf, 0, sizeof(WAVEFORMATEX)); |
821 sh->wf->nChannels = sh->channels; | 832 sh->wf->nChannels = sh->channels; |
822 sh->wf->wBitsPerSample = 16; | 833 sh->wf->wBitsPerSample = sh->samplesize*8; |
823 sh->wf->nSamplesPerSec = sh->samplerate; | 834 sh->wf->nSamplesPerSec = sh->samplerate; |
824 sh->wf->nAvgBytesPerSec = bitrate; | 835 sh->wf->nAvgBytesPerSec = bitrate; |
825 sh->wf->nBlockAlign = frame_size; | 836 sh->wf->nBlockAlign = frame_size; |
826 sh->wf->cbSize = 0; | 837 sh->wf->cbSize = 0; |
827 | 838 |
852 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1; | 863 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1; |
853 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0; | 864 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0; |
854 break; | 865 break; |
855 case MKTAG('c', 'o', 'o', 'k'): | 866 case MKTAG('c', 'o', 'o', 'k'): |
856 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n"); | 867 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n"); |
857 tmp = 0; | 868 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+2+24); |
869 *((short*)(sh->wf+1))=flavor; | |
870 stream_read(demuxer->stream, ((char*)(sh->wf+1))+2, 24); // extras | |
871 // tmp = 0; | |
858 break; | 872 break; |
859 case MKTAG('a', 't', 'r', 'c'): | 873 case MKTAG('a', 't', 'r', 'c'): |
860 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n"); | 874 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n"); |
861 sh->format = 0x270; | 875 sh->format = 0x270; |
862 | 876 |
892 // priv->current_aid = stream_id; | 906 // priv->current_aid = stream_id; |
893 } | 907 } |
894 else | 908 else |
895 free(sh->wf); | 909 free(sh->wf); |
896 // break; | 910 // break; |
911 | |
912 #undef stream_skip | |
913 | |
897 } | 914 } |
898 else | 915 else |
899 // case MKTAG('V', 'I', 'D', 'O'): | 916 // case MKTAG('V', 'I', 'D', 'O'): |
900 { | 917 { |
901 /* video header */ | 918 /* video header */ |