Mercurial > mplayer.hg
comparison libmpdemux/demux_real.c @ 6374:b2d5aeb72f95
export subpacket-size and matrix w*h to the codec (cook)
author | arpi |
---|---|
date | Mon, 10 Jun 2002 13:55:56 +0000 |
parents | 63984a4cbbb6 |
children | 83b3315c679b |
comparison
equal
deleted
inserted
replaced
6373:8d5d339f2944 | 6374:b2d5aeb72f95 |
---|---|
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.15 2002/06/10 13:55:56 arpi | |
12 export subpacket-size and matrix w*h to the codec (cook) | |
13 | |
11 Revision 1.14 2002/06/10 02:27:31 arpi | 14 Revision 1.14 2002/06/10 02:27:31 arpi |
12 export extra data for cook codec, some debug stuff | 15 export extra data for cook codec, some debug stuff |
13 | 16 |
14 Revision 1.13 2002/06/09 01:07:22 arpi | 17 Revision 1.13 2002/06/09 01:07:22 arpi |
15 - multiple audio/video stream support fixed | 18 - multiple audio/video stream support fixed |
769 codec_data_size = stream_read_dword(demuxer->stream); | 772 codec_data_size = stream_read_dword(demuxer->stream); |
770 codec_pos = stream_tell(demuxer->stream); | 773 codec_pos = stream_tell(demuxer->stream); |
771 | 774 |
772 tmp = stream_read_dword(demuxer->stream); | 775 tmp = stream_read_dword(demuxer->stream); |
773 | 776 |
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");} | 777 #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 | 778 |
776 if (tmp == MKTAG(0xfd, 'a', 'r', '.')) | 779 if (tmp == MKTAG(0xfd, 'a', 'r', '.')) |
777 { | 780 { |
778 /* audio header */ | 781 /* audio header */ |
779 sh_audio_t *sh = new_sh_audio(demuxer, stream_id); | 782 sh_audio_t *sh = new_sh_audio(demuxer, stream_id); |
780 char buf[128]; /* for codec name */ | 783 char buf[128]; /* for codec name */ |
781 int frame_size; | 784 int frame_size; |
785 int sub_packet_size; | |
786 int sub_packet_h; | |
782 int version; | 787 int version; |
783 int flavor; | 788 int flavor; |
784 | 789 |
785 mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n"); | 790 mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n"); |
786 version = stream_read_word(demuxer->stream); | 791 version = stream_read_word(demuxer->stream); |
787 mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version); | 792 mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version); |
788 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */ | 793 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */ |
789 stream_skip(demuxer->stream, 2); | 794 stream_skip(demuxer->stream, 2); // 00 00 |
790 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */ | 795 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */ |
791 stream_skip(demuxer->stream, 4); | 796 stream_skip(demuxer->stream, 4); // ??? |
792 stream_skip(demuxer->stream, 2); /* version (4 or 5) */ | 797 stream_skip(demuxer->stream, 2); /* version (4 or 5) */ |
793 stream_skip(demuxer->stream, 4); /* header size */ | 798 stream_skip(demuxer->stream, 4); // header size == 0x4E |
794 flavor = stream_read_word(demuxer->stream);/* codec flavor id */ | 799 flavor = stream_read_word(demuxer->stream);/* codec flavor id */ |
795 stream_skip(demuxer->stream, 4); /* coded frame size */ | 800 stream_skip(demuxer->stream, 4); /* coded frame size */ |
796 stream_skip(demuxer->stream, 4); // big number | 801 stream_skip(demuxer->stream, 4); // big number |
797 stream_skip(demuxer->stream, 4); // bigger number | 802 stream_skip(demuxer->stream, 4); // bigger number |
798 stream_skip(demuxer->stream, 4); // 2 | 803 stream_skip(demuxer->stream, 4); // 2 || -''- |
799 stream_skip(demuxer->stream, 2); // 10 | 804 // stream_skip(demuxer->stream, 2); // 0x10 |
805 sub_packet_h = stream_read_word(demuxer->stream); | |
800 // stream_skip(demuxer->stream, 2); /* coded frame size */ | 806 // stream_skip(demuxer->stream, 2); /* coded frame size */ |
801 frame_size = stream_read_word(demuxer->stream); | 807 frame_size = stream_read_word(demuxer->stream); |
802 mp_msg(MSGT_DEMUX,MSGL_V,"frame_size: %d\n", frame_size); | 808 mp_msg(MSGT_DEMUX,MSGL_V,"frame_size: %d\n", frame_size); |
803 stream_skip(demuxer->stream, 4); // 60,0 | 809 sub_packet_size = stream_read_word(demuxer->stream); |
810 mp_msg(MSGT_DEMUX,MSGL_V,"sub_packet_size: %d\n", sub_packet_size); | |
811 stream_skip(demuxer->stream, 2); // 0 | |
804 | 812 |
805 if (version == 5) | 813 if (version == 5) |
806 stream_skip(demuxer->stream, 6); //0,srate,0 | 814 stream_skip(demuxer->stream, 6); //0,srate,0 |
807 | 815 |
808 sh->samplerate = stream_read_word(demuxer->stream); | 816 sh->samplerate = stream_read_word(demuxer->stream); |
833 sh->wf->wBitsPerSample = sh->samplesize*8; | 841 sh->wf->wBitsPerSample = sh->samplesize*8; |
834 sh->wf->nSamplesPerSec = sh->samplerate; | 842 sh->wf->nSamplesPerSec = sh->samplerate; |
835 sh->wf->nAvgBytesPerSec = bitrate; | 843 sh->wf->nAvgBytesPerSec = bitrate; |
836 sh->wf->nBlockAlign = frame_size; | 844 sh->wf->nBlockAlign = frame_size; |
837 sh->wf->cbSize = 0; | 845 sh->wf->cbSize = 0; |
846 sh->format = MKTAG(buf[0], buf[1], buf[2], buf[3]); | |
838 | 847 |
839 tmp = 1; /* supported audio codec */ | 848 tmp = 1; /* supported audio codec */ |
840 switch (MKTAG(buf[0], buf[1], buf[2], buf[3])) | 849 switch (sh->format) |
841 { | 850 { |
842 case MKTAG('d', 'n', 'e', 't'): | 851 case MKTAG('d', 'n', 'e', 't'): |
843 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n"); | 852 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n"); |
844 sh->format = 0x2000; | 853 sh->format = 0x2000; |
845 break; | 854 break; |
846 case MKTAG('s', 'i', 'p', 'r'): | 855 case MKTAG('s', 'i', 'p', 'r'): |
847 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: SiproLab's ACELP.net\n"); | 856 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: SiproLab's ACELP.net\n"); |
848 sh->format = 0x130; | 857 sh->format = 0x130; |
849 /* for buggy directshow loader */ | 858 /* for buggy directshow loader */ |
850 sh->wf = realloc(sh->wf, 18+4); | 859 sh->wf->cbSize = 4; |
860 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize); | |
851 sh->wf->wBitsPerSample = 0; | 861 sh->wf->wBitsPerSample = 0; |
852 sh->wf->nAvgBytesPerSec = 1055; | 862 sh->wf->nAvgBytesPerSec = 1055; |
853 sh->wf->nBlockAlign = 19; | 863 sh->wf->nBlockAlign = 19; |
854 // sh->wf->nBlockAlign = frame_size / 288; | 864 // sh->wf->nBlockAlign = frame_size / 288; |
855 sh->wf->cbSize = 4; | |
856 buf[0] = 30; | 865 buf[0] = 30; |
857 buf[1] = 1; | 866 buf[1] = 1; |
858 buf[2] = 1; | 867 buf[2] = 1; |
859 buf[3] = 0; | 868 buf[3] = 0; |
860 memcpy((sh->wf+18), (char *)&buf[0], 4); | 869 memcpy((sh->wf+18), (char *)&buf[0], 4); |
863 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1; | 872 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1; |
864 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0; | 873 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0; |
865 break; | 874 break; |
866 case MKTAG('c', 'o', 'o', 'k'): | 875 case MKTAG('c', 'o', 'o', 'k'): |
867 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n"); | 876 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n"); |
868 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+2+24); | 877 sh->wf->cbSize = 4+2+24; |
869 *((short*)(sh->wf+1))=flavor; | 878 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize); |
870 stream_read(demuxer->stream, ((char*)(sh->wf+1))+2, 24); // extras | 879 ((short*)(sh->wf+1))[0]=sub_packet_size; |
871 // tmp = 0; | 880 ((short*)(sh->wf+1))[1]=sub_packet_h; |
881 ((short*)(sh->wf+1))[2]=flavor; | |
882 stream_read(demuxer->stream, ((char*)(sh->wf+1))+6, 24); // extras | |
872 break; | 883 break; |
873 case MKTAG('a', 't', 'r', 'c'): | 884 case MKTAG('a', 't', 'r', 'c'): |
874 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n"); | 885 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n"); |
875 sh->format = 0x270; | 886 sh->format = 0x270; |
887 /* 14 bytes extra header needed ! */ | |
888 sh->wf->cbSize = 14; | |
889 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize); | |
876 | 890 |
877 sh->wf->nAvgBytesPerSec = 16537; // 8268 | 891 sh->wf->nAvgBytesPerSec = 16537; // 8268 |
878 sh->wf->nBlockAlign = 384; // 192 | 892 sh->wf->nBlockAlign = 384; // 192 |
879 sh->wf->wBitsPerSample = 0; /* from AVI created by VirtualDub */ | 893 sh->wf->wBitsPerSample = 0; /* from AVI created by VirtualDub */ |
880 /* 14 bytes extra header needed ! */ | |
881 sh->wf->cbSize = 14; | |
882 sh->wf = realloc(sh->wf, 18+sh->wf->cbSize); | |
883 break; | 894 break; |
884 default: | 895 default: |
885 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Unknown (%s)\n", buf); | 896 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Unknown (%s)\n", buf); |
886 tmp = 0; | 897 tmp = 0; |
887 sh->format = MKTAG(buf[0], buf[1], buf[2], buf[3]); | |
888 } | 898 } |
889 | 899 |
890 sh->wf->wFormatTag = sh->format; | 900 sh->wf->wFormatTag = sh->format; |
891 | 901 |
892 print_wave_header(sh->wf); | 902 print_wave_header(sh->wf); |