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);