gogo239b/ 40755 23421 144 0 7225622143 11234 5ustar shigeousersgogo239b/loop.h100644 23421 144 1247 7220537347 12465 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * modified by shigeo */ #ifndef _LOOP_H_ #define _LOOP_H_ #include "common.h" #define CBLIMIT 21 #define SFB_LMAX 22 #define SFB_SMAX 13 struct scalefac_struct { int l[23]; int s[14]; }; void iteration_loop( float pe[][2], float ms_ratio[2], float xr_org[2][2][576], ratio_t *ratio, III_side_info_t *l3_side, int l3_enc[2][2][576], III_scalefac_t *scalefac ); void VBR_iteration_loop( float pe[][2], float ms_ratio[2], float xr_org[2][2][576], ratio_t *ratio, III_side_info_t *l3_side, int l3_enc[2][2][576], III_scalefac_t *scalefac ); void InitLoop(void); #endif /* _LOOP_H_ */ gogo239b/align.nas100644 23421 144 1147 7220537347 13137 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; 99/09/12 とりあえず static のmfbufだけ確保(他はバグが取れてから) ; 99/09/15 バグはprivate_bitsの処理ミスだった %include "nasm.h" ; globaldef Axr ; globaldef Al3_enc globaldef Amfbuf ; globaldef AfrmBuffer globaldef l3_sb_sample segment_data %ifndef AOUT segment_bss align=32 ;delete `align=32' if linker puts err. %else segment_bss %endif align 32 l3_sb_sample resd 2*3*18*32 ;align32 for SSE Amfbuf resd 2*(1152+576+56) ;56=EXTRADELAY define in musenc.c ;Axr resd 2*2*576 ;Al3_enc resd 2*2*576 ;AfrmBuffer resw 2*1152 segment_code end gogo239b/bitstrem.c100644 23421 144 6337 7220537347 13345 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * modified by PEN@MarineCat, shigeo */ #define IOSTREAM_BUFFERING /* ファイル入出力のバッファリングを行う */ #ifdef WIN32 #include #include #endif #include "common.h" #include "bitstrem.h" #include "musenc.h" /* open_bit_stream_wで初期化される */ #if defined( WIN32 ) && defined( NDEBUG ) static char outfilename[ 1024 ]; #endif extern struct bit_stream_struc{ /* putbits.nasとの整合性注意 */ FILE *pt; /* pointer to bit stream device */ char *buf; /* bit stream buffer */ int buf_size; /* size of buffer (in number of bytes) */ long totbit; /* bit counter of bit stream */ int buf_bit_idx; /* pointer to top bit of top byte in buffer */ /* 追加 */ MPGE_USERFUNC storefunc; /* store function */ } bs_pt; /* バッファが一杯になった時点で出力デバイスに移す */ void empty_buffer(void) { unsigned int i; int sz = (bs_pt.totbit - bs_pt.buf_bit_idx) >> 3; if( bs_pt.storefunc == MPGE_NULL_FUNC ){ i = fwrite( bs_pt.buf, 1,sz , bs_pt.pt); } else { if( bs_pt.storefunc( bs_pt.buf, sz ) == ME_NOERR ) i = sz; else i = 0; } if( i < sz ){ TERM( ME_WRITEERROR ); } i = *(unsigned int *)(bs_pt.buf + sz); memset( bs_pt.buf , 0 , sz + 4); *(unsigned int *)(bs_pt.buf + 0) = i; bs_pt.buf_bit_idx += sz * 8; } /* bit stream に書き込むためのデバイスをopen */ int open_bit_stream_w(char *bs_filenam,int size) { if ((bs_pt.pt = fopen(bs_filenam, "wb")) == NULL){ fprintf(stderr,"Could not create `%s'.\n", bs_filenam); return FALSE; } #if defined( WIN32 ) && defined( NDEBUG ) strcpy( outfilename, bs_filenam ); SetFileAttributes( outfilename, FILE_ATTRIBUTE_HIDDEN ); #endif #if (defined(__HIGHC__)&&defined(IOSTREAM_BUFFERING)) { /* 出力のバッファを広げておく */ static char outBuf[4096*4]; if(setvbuf(bs_pt.pt, outBuf, _IOFBF, sizeof( outBuf ))!=0){ fprintf(stderr, "setvbuf failed in open_bit_stream_w\n"); return FALSE; } } #endif bs_pt.buf=mem_alloc(size + 64, ""); memset(bs_pt.buf,0,size + 64); bs_pt.buf_size=size; bs_pt.totbit = 0; bs_pt.buf_bit_idx = 0; bs_pt.storefunc = MPGE_NULL_FUNC; return TRUE; } /* bit stream に書き込むためのデバイスをopen */ int open_bit_stream_userfunc( MPGE_USERFUNC userfunc, int size) { bs_pt.buf = mem_alloc(size + 64, ""); memset(bs_pt.buf, 0, size + 64); bs_pt.buf_size = size; bs_pt.totbit = 0; bs_pt.buf_bit_idx = 0; bs_pt.storefunc = userfunc; return TRUE; } /* 書き込み処理を追えたあとbit streamのデバイスを閉じる */ void close_bit_stream_w(void) { putbits(0, 7); empty_buffer(); if( bs_pt.storefunc == MPGE_NULL_FUNC ){ if( nid3taglen && pid3tag ){ fwrite( pid3tag, 1, nid3taglen, bs_pt.pt ); } fclose( bs_pt.pt ); #if defined( WIN32 ) && defined( NDEBUG ) SetFileAttributes( outfilename, FILE_ATTRIBUTE_NORMAL ); SHChangeNotify( SHCNE_UPDATEDIR, SHCNF_PATH|SHCNF_FLUSHNOWAIT, outfilename, NULL); #endif } else { if( nid3taglen && pid3tag ){ //if( bs_pt.storefunc( pid3tag, nid3taglen ) != ME_NOERR ) //TERM( ME_WRITEERROR ); bs_pt.storefunc( pid3tag, nid3taglen ); // 返り値は調べない } bs_pt.storefunc( NULL, 0 ); // to Close } mem_free((void **)&bs_pt.buf); } /* 現在のstream の長さを bit数で返す */ unsigned long sstell(void){ return bs_pt.totbit; } gogo239b/bitstrem.h100644 23421 144 767 7220537347 13333 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 shigeo */ #ifndef _BITSTREM_H #define _BITSTREM_H #include "musenc.h" void empty_buffer(void); int open_bit_stream_w(char *bs_filenam,int size); /* bit stream に書き込むためのデバイスをopen */ int open_bit_stream_userfunc( MPGE_USERFUNC userfunc,int size); void close_bit_stream_w(void); void putbits(unsigned int val,unsigned int N); void putbits24(unsigned int val,unsigned int N); unsigned long sstell(void); #endif /* _BITSTREM_H */ gogo239b/clk.nas100644 23421 144 20477 7220537347 12645 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; clkbegin(), clkend()で挟んだ部分の実行時間を計測(musui.cの最後参照) ; rdtscが使えないと例外を起こす %include "nasm.h" ; for DOS, OS/2, Win-console ; by sava %ifdef WIN32 %define SHRINK_NULLCHAR %endif globaldef clkbegin globaldef clkend globaldef CLKcount globaldef CLKclock globaldef write_time externdef write segment_bss segment_data CLKsave dd 0 CLKcount dd 0 CLKclock dd 0 segment_code align 16 clkbegin: push eax push edx %ifdef __tos__ cli %endif rdtsc mov [CLKsave],eax pop edx pop eax ret align 16 clkend: push eax push edx rdtsc %ifdef __tos__ sti %endif sub [CLKsave],eax inc dword [CLKcount] fld dword [CLKclock] fisub dword [CLKsave] fstp dword [CLKclock] pop edx pop eax ret ; "[%02d:%02d:%02d.%02d]" ; min: [00:00:00.00] ; max: [99:59:59.99] ; sprint_time ; input: eax, esp, edi = 0FFFFFFFh ; output: esp -= 13 ; destroy: eax, edx, ecx %macro sprint_time 2 sub esp,13 mov cl,28 mov [esp+0],byte '[' mov edx,95217CAFh ; = (2^53)/(10*60*60*100) with rounding stc ; for rounding rcl eax,6 ; time *= 2^6 mul edx ; edx:eax is fxp5.59 shl eax,1 rcl edx,1 ; edx is fxp4.28 mov eax,edx shr eax,cl or al,30h mov [esp+1],al ; 10h and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or ax,'0:' mov [esp+2],ax ; 1h and edx,edi lea edx,[edx+edx*2] ; *= 3 add edx,edx ; *= 2 mov eax,edx shr eax,cl or al,30h mov [esp+4],al ; 10m and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or ax,'0:' mov [esp+5],ax ; 1m and edx,edi lea edx,[edx+edx*2] ; *= 3 add edx,edx ; *= 2 mov eax,edx shr eax,cl or al,30h mov [esp+7],al ; 10s and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or ax,'0.' mov [esp+8],ax ; 1s and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or al,30h mov [esp+10],al ; 100ms and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or ax,'0]' mov [esp+11],ax ; 10ms %endmacro ; "(%4d.%02dx) " ; min: "( 0.00x)" ; max: "(9999.99x)" ; sprint_speedup ; input: eax, esp, edi = 0FFFFFFFh ; output: esp -= 11 ; destroy: eax, edx, ecx %macro sprint_speedup 2 sub esp,11 mov cl,28 mov ch,20h mov [esp+0],byte '(' mov edx,0A7C5AC47h ; = (2^48)/100000 with rounding stc ; for rounding rcl eax,12 ; *= 2^12 mul edx ; edx:eax is fxp4.60 mov eax,edx shr eax,cl jz %%f0 mov ch,30h %%f0: or al,ch mov [esp+1],al ; 1000x and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl jz %%f1 mov ch,30h %%f1: or al,ch mov [esp+2],al ; 100x and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl jz %%f2 mov ch,30h %%f2: or al,ch mov [esp+3],al ; 10x and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or ax,'0.' mov [esp+4],ax ; 1x and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or al,30h mov [esp+6],al ; 0.1x and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or eax,'0x) ' mov [esp+7],eax ; 0.01x %endmacro ; "%3d.%1%%" ; min: " 0.0%" ; max: "100.0%" ; sprint_percentage ; input: eax, esp, edi = 0FFFFFFFh ; output: esp -= 11 ; destroy: eax, edx, ecx %macro sprint_percentage 2 sub esp,6 mov cl,28 mov ch,20h mov edx,83126E97h ; = (2^41)/1000 with rounding stc ; for rounding rcl eax,19 ; *= 2^19 mul edx ; edx:eax is fxp4.60 mov eax,edx shr eax,cl jz %%f0 mov ch,30h %%f0: or al,ch mov [esp+0],al ; 100% and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl jz %%f1 mov ch,30h %%f1: or al,ch mov [esp+1],al ; 10% and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or ax,'0.' mov [esp+2],ax ; 1% and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or ax,'0%' mov [esp+4],ax ; 0.1% %endmacro ; "%7d" ; min: " 0" ; max: "9999999" ; sprint_int ; input: eax, esp, edi = 0FFFFFFFh ; output: esp -= 11 ; destroy: eax, edx, ecx %macro sprint_int 2 sub esp,7 mov cl,28 mov ch,20h mov edx,08637BD02h ; = (2^51)/1000000 with rounding stc ; for rounding rcl eax,8 ; *= 2^8 mul edx ; edx:eax is fxp5.59 shl eax,1 rcl edx,1 ; edx is fxp4.28 mov eax,edx shr eax,cl jz %%f0 mov ch,30h %%f0: or al,ch mov [esp+0],al ; 1000000 and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl jz %%f1 mov ch,30h %%f1: or al,ch mov [esp+1],al ; 100000 and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl jz %%f2 mov ch,30h %%f2: or al,ch mov [esp+2],al ; 10000 and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl jz %%f3 mov ch,30h %%f3: or al,ch mov [esp+3],al ; 1000 and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl jz %%f4 mov ch,30h %%f4: or al,ch mov [esp+4],al ; 100 and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl jz %%f5 mov ch,30h %%f5: or al,ch mov [esp+5],al ; 10 and edx,edi lea edx,[edx+edx*4] ; *= 5 add edx,edx ; *= 2 mov eax,edx shr eax,cl or al,30h mov [esp+6],al ; 1 %endmacro ; ; void write_time(int fd, long elapsed_sec, long elapsed_usec, unsigned frameNum, ; unsigned total_frame, unsigned sps, unsigned spf); ; ; This routine print the progress report without floating point operation. ; This routine can be called from the signal handler. ; ; 2000/04/19 Initial version by K.SAKAI ; 2000/04/21 Don't use printf. ; align 16 write_time: push ebp push esi push ebx push edi mov ebp,esp ; ebp is a frame pointer %define stream [ebp+16+ 4] %define elapsed_sec [ebp+16+ 8] %define elapsed_usec [ebp+16+12] %define frameNum [ebp+16+16] %define total_frame [ebp+16+20] %define sps [ebp+16+24] %define spf [ebp+16+28] mov eax,frameNum test eax,eax jz near .exit mov edi,0FFFFFFFh .get_elapsed: mov eax,elapsed_usec cdq mov ecx,10000 ; 10ms idiv ecx imul esi,elapsed_sec,100 add esi,eax ; = elapsed time in 10ms unit js near .exit ; total = elapsed * total_frame / frameNum .get_total: mov eax,total_frame test eax,eax jz near .exit push byte 13 ; CR mul esi div dword frameNum mov ebx,eax ; eax = total time in 10ms unit sprint_time eax,edx push dword ' to:' ; rest = total - elapsed .get_rest: mov eax,ebx sub eax,esi ; eax = rest time in 10ms unit cmc sbb edx,edx and eax,edx sprint_time eax,edx push dword ' re:' ;speedup = (frameNum * spf) / (sps * elapsed) .get_speedup mov eax,sps mul esi bsr ecx,edx setnz ch neg ch inc cl and cl,ch shrd eax,edx,cl ; eax:mantissa, cl:exponent mov ebx,eax mov eax,100*100 mul dword spf mul dword frameNum div ebx shr eax,cl ; eax = speed up * 100 sprint_speedup eax,edx push byte ' ' ; percentage = 100.* frameNum / total_frame .get_percentage: mov eax,1000 mul dword frameNum mov ebx,total_frame div ebx ; eax = frame_per * 10 sprint_percentage eax,edx push byte ' ' push byte '}' mov eax,ebx sprint_int eax,edx push byte '/' mov eax,frameNum sprint_int eax,edx push byte '{' mov eax,ebp sub eax,esp ; length of strings mov edx,esp ; Thanks to sava 00/08/10 %ifdef SHRINK_NULLCHAR mov esi,esp mov edi,esp mov ecx,eax .shr_lp: dec ecx je short .shr_brk mov al,byte [esi] ; U'd like better loadsb? inc esi cmp al,0 je short .shr_lp mov byte [edi],al inc edi jmp short .shr_lp .shr_brk: mov eax,edi sub eax,esp %endif and esp,0FFFFFFFCh ; align 4 push eax push edx push dword stream call write .exit: mov esp,ebp pop edi pop ebx pop esi pop ebp ret end gogo239b/COPYING100644 23421 144 62256 7220537347 12425 0ustar shigeousers GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! gogo239b/encode.c100644 23421 144 7626 7220537347 12753 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 shigeo * special thanks to Keiichi SAKAI, URURI */ /* * 1999/08/04 * window_filter_subbandへの入れ替え * Cレベルで50%の高速化 & 3DN化 by shigeo * 1999/09/?? * 酒居さん、うるりさんによるasm最適化 * LAMEのfilter_subband(), window_subband()を参照しながら * full asm化 * 1999/09/15 * 3D Now!ルーチンも上に追従 * 2000/03/08 * window_filter_subband_C()復活! _P6FPUとたいして変わらないけど。 * mfbuf, sbd_xxx をもうちょっとましにできないものか... by K.SAKAI * 2000/04/17 * SMP最適化のための布石 by K.SAKAI */ #include "common.h" #include "haveunit.h" #include "subband.h" /* sband*.nas */ void window_filter_subband_3DN(float *win_buf, float *s, int mode_gr); void window_filter_subband_SSE(float *win_buf, float *s, int mode_gr); void window_filter_subband_FPU(float *win_buf, float *s, int mode_gr); #ifdef USE_E3DN void window_filter_subband_E3DN(float *win_buf, float *s,int mode_gr); #endif /* defined in sband*.nas */ extern float sbd_xxx[2][HAN_SIZE+1152]; extern float enwindow[16][8][4]; extern float idct_coefficient[16][32]; void sbd_shiftin_SSE(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr); void sbd_shiftin_SSE_MULTI(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr); void sbd_shiftin_3DN(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr); #ifdef USE_E3DN void sbd_shiftin_E3DN(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr); #endif static void sbd_shiftin_C(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr) { float *c; int ch, i, j, *win_buf; for(ch = 0; ch < stereo; ch++){ c = &sbd_xxx[ch][1152-18*32*mode_gr]; memcpy(&sbd_xxx[ch][1152+32], c+32, (512-32)*sizeof(float)); c = &sbd_xxx[ch][1152]; win_buf = mfbuf[ch]; for(j = 0; j < 18*mode_gr; j++){ for (i = 31;i >=0;i--){ c[i] = *win_buf++; } c -= 32; } } } static void sbd_shiftin_empty(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr) { } void frame_shiftin_multi_SSE(int (*int_buf)[1152+576+EXTRADELAY], short *frame_buf, float (*flt_buf)[1152+HAN_SIZE], int mode_gr, int stereo); #define NULL_FUNC (void (*)( int (*)[1784], int, int ) )NULL #define NULL_FUNC2 (void (*)(int (*)[1784], short *, float (*)[1664], int , int))NULL void setup_window_filter_subband(int useUNIT) { static int SCALEflag = 0; frame_shiftin_multi = NULL_FUNC2; #ifdef USE_E3DN if(useUNIT & tE3DN){ SETUP_DSP("use:window_filter_subband_E3DN\n"); window_filter_subband=window_filter_subband_E3DN; SETUP_DSP("use:sbd_shiftin_E3DN\n"); sbd_shiftin = sbd_shiftin_E3DN; }else #endif if(useUNIT & t3DN){ SETUP_DSP("use:window_filter_subband_3DN\n"); window_filter_subband=window_filter_subband_3DN; SETUP_DSP("use:sbd_shiftin_3DN\n"); sbd_shiftin = sbd_shiftin_3DN; }else if(useUNIT & tSSE){ SETUP_DSP("use:window_filter_subband_SSE\n"); window_filter_subband=window_filter_subband_SSE; if(useUNIT & tMULTI){ if(useUNIT & tSPC2){ SETUP_DSP("use:sbd_shiftin_SSE_MULTI\n"); sbd_shiftin = sbd_shiftin_SSE_MULTI; frame_shiftin_multi = NULL_FUNC2; }else{ SETUP_DSP("use:frame_shiftin_multi_SSE\n"); sbd_shiftin = sbd_shiftin_empty; frame_shiftin_multi = frame_shiftin_multi_SSE; } }else{ if(useUNIT & tSPC2){ SETUP_DSP("use:frame_shiftin_multi_SSE\n"); sbd_shiftin = sbd_shiftin_empty; frame_shiftin_multi = frame_shiftin_multi_SSE; }else{ SETUP_DSP("use:sbd_shiftin_SSE\n"); sbd_shiftin = sbd_shiftin_SSE; frame_shiftin_multi = NULL_FUNC2; } } }else { SETUP_DSP("use:window_filter_subband_FPU\n"); window_filter_subband=window_filter_subband_FPU; SETUP_DSP("use:sbd_shiftin_C\n"); sbd_shiftin = sbd_shiftin_C; } if(!SCALEflag){ int i,j; for(i=0; i<16; i++){ for(j=0; j<8; j++){ enwindow[i][j][0] *= SCALER; enwindow[i][j][1] *= SCALER; enwindow[i][j][2] *= SCALER; enwindow[i][j][3] *= SCALER; } } SCALEflag=1; } } gogo239b/english.msg100644 23421 144 6030 7220537347 13477 0ustar shigeousersstatic int isENGLISH( char *str ){ static char mes[][8] = { "C", "POSIX" }; int i; for( i = 0; i < sizeof(mes)/sizeof(mes[0]); i++ ){ if( !strcmp( str, mes[i] ) ) return 1; } return 0; } static char msg_ENGLISH[][MSG_LEN_MAX] = { "GOGO-no-coda", "Copyright (C) 1999, 2000 PEN@MarineCat and shigeo\n", " Special thanks to Keiichi SAKAI, URURI, Noisyu and Kei\n", " *** at bench in the early afternoon [benchmark mode] ***\n", // 4 "illegal -m option", "illegal -b[r] option", "illegal -s option\n", "illegal -emp option\n", "is rate zero?\n", "illegal -d option\n", "illegal -off option\n", "illegal -lpf option\n", "illegal -o option\n", "illegal -cpu option\n", "illegal -priority option\n", "illegal -readthread option\n", "not found\n", "illegal -riff option\n", "illegal -v option\n", "illegal -offset option\n", "illegal option\n", "illegal -vb option\n", "illegal -th option\n", // 19 "mono", "stereo", "j-stereo", "m/s stereo", "dual channel", "undefined", "inp sampling-freq", "out sampling-freq", "bitrate", "input file", "output file", "\nEnd of encoding\ntime", // 12 "This is based on LAME3.29beta and distributed under the LGPL\n", "usage\n", "gogo inputPCM [outputPCM] [options]\n\n", " inputPCM is input wav file\n", "if input.wav is `stdin' then stdin-mode\n", "outputPCM is output mp3 file (omissible)\n\n", "options\n", "-b kbps/-br bps bitrate [kpbs/bps]\n", "-silent dont' print progress report\n", "-m {s,m,j} output form s:stereo, m:mono, j:j-stereo\n", "-nopsy disable psycho-acoustics\n", "-off {3dn,mmx,kni(sse),e3dn}\n", "-v {0,..,9} VBR [0:high quality 9:high compression]\n", "for only RAW-PCM input\n", "-offset bytes skip header size\n", " -8bit 8bit-PCM [dflt 16bit-PCM]\n", " -mono mono-PCM [dflt stereo-PCM]\n", " -bswap low, high byte swapping for 16bitPCM\n", " -s kHz freq of PCM [dflt 44.1kHz]\n", " -tos for TownsOS\n", "-cpu n the number of CPU(auto detected if unspecified)\n", "-priority num Encode thread priority (10 if unspecified)\n", "-readthread num Read thread priority (No use if unspecified)\n", "-d kHz change sampling-rate of output MP3\n", "-emp {n,c,5} de-emphasis\n", "-lpf {on,off} 16kHz filter [dflt use if <= 128kbps; not use if >= 160kbps]\n", "-delete delete input file, after encoding\n", "-i verify and overwrite\n", "-o dir change output directory\n", "-riff {wave, rmp} wrapping format wave:RIFF/WAVE rmp:RIFF/RMP\n", "-test benchmark mode\n", "push return key.\n", "-lang {sjis,eucjp,eng,ger,esp} language\n", // 33 "Complete", "Complete. no error", "Internal error", "Illegal parameter", "FPU is not found", "Can't open input file", "Can't open output file", "Illegal input sampling frequency", "Illegal output bitrate", "Illegal wave type", "Can't seek", "Interrupted", "Fail to write", // 13 "check whether OS supports SSE.", "... yes.", "This OS doesn't support SSE instructions.", "The number of CPU is", "\noverwrite?(y/n)", "delete", // 5 }; gogo239b/fft.nas100644 23421 144 33522 7220537347 12646 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to Keiichi SAKAI, URURI %include "nasm.h" ; globaldef fht_3DN globaldef fft1k_FPU globaldef fft256_FPU globaldef fht externdef costab_fft externdef sintab_fft externdef gray_index segment_data align 16 D_MSB1_0 dd 0 ,0x80000000 D_SQRT2 dd 1.414213562,1.414213562 t_s0 dd 0 ;[ t_c:t_s] t_c0 dd 0 t_c1 dd 0 ;[-t_s:t_c] t_s1 dd 0 D_s1c1 dd 0, 0 D_Mc1s1 dd 0, 0 D_s2c2 dd 0, 0 D_Mc2s2 dd 0, 0 D_0_1 dd 1.0, 0.0 S_05 DD 0.5 S_00005 DD 0.0005 fht dd 0 ;関数ポインタ segment_code ;************************************************************************ ; by shigeo ; 99/08/16 ; 23000clk 辛かった〜 ; 18500clk bit reversal from gogo1 by URURI ;void fht(float *fz, int n); %if 0 align 16 fht_3DN: push ebx push esi push edi push ebp %assign _P 4*4 ;まず最初のループ... はfht()の外へ移動 mov esi,[esp+_P+4] ;esi=fz mov ecx,[esp+_P+8] ;ecx=n ;2つ目のループ femms mov eax,esi ;fi=fz shr ecx,2 ;ecx=n/4 movq mm7,[D_MSB1_0] ;mm7=[0x80000000:0] movq mm2,mm7 movq mm3,mm7 jmp .lp10 align 16 .lp10: movq mm0,[eax] ;mm0=[ fi1:fi0] movq mm1,[eax+8] ;mm1=[ fi3:fi2] movq mm2,mm0 pxor mm2,mm7 ;mm2=[-fi1:fi0] movq mm3,mm1 pxor mm3,mm7 ;mm3=[-fi3:fi2] pfacc mm0,mm2 ;mm0=[f1:f0]=[fi0-fi1:fi0+fi1] pfacc mm1,mm3 ;mm1=[f3:f2]=[fi2-fi3:fi2+fi3] movq mm3,mm0 ;mm3=[f1:f0] pfadd mm3,mm1 ;mm3=[fi1:fi0]=[f1+f3:f0+f2] pfsub mm0,mm1 ;mm0=[fi3:fi2]=[f1-f3:f0-f2] movq [eax],mm3 movq [eax+8],mm0 add eax,16 loop .lp10 ;メインループ movq mm7,[D_MSB1_0] ;mm7=[1<<31:0] %assign LOCAL_STACK 16 sub esp,LOCAL_STACK %assign _P (_P+LOCAL_STACK) xor eax,eax mov [esp],eax ;k=0 %define k dword [esp] %define kx dword [esp+4] %define fn dword [esp+8] .lp30: ;k=0; do{ mov ecx,k add ecx,2 mov k,ecx mov eax,1 shl eax,cl ;eax=k1 = 1<>1 mov kx,esi ;保存(後で使う) mov edi,[esp+_P+4] ;edi=fi=fz lea ebp,[edi+esi*4] ;ebp=gi=fz+kx mov esi,[esp+_P+8] ;esi=n lea esi,[edi+esi*4] ;esi=fn=fz+n movq mm6,[D_SQRT2] ;mm6=[√2:√2] .lp31: ;fn=fz+n; do{ FLOAT g0,f0,f1,... movd mm0,[edi] ;mm0=[0:fi[ 0]] movd mm1,[edi+eax*4] ;mm1=[0:fi[k1]] punpckldq mm0,mm0 ;mm0=[fi_0 :fi_0 ] punpckldq mm1,mm1 ;mm1=[fi_k1:fi_k1] movd mm2,[edi+ebx*4] movd mm3,[edi+ecx*4] punpckldq mm2,mm2 ;mm2=[fi_k2:fi_k2] punpckldq mm3,mm3 ;mm3=[fi_k3:fi_k3] pxor mm1,mm7 ;mm1=[-fi_k1:fi_k1] pxor mm3,mm7 ;mm3=[-fi_k3:fi_k3] pfadd mm0,mm1 ;mm0=[f1:f0]=[fi_0 -fi_k1 : fi_0 +fi_k1] pfadd mm2,mm3 ;mm2=[f3:f2]=[fi_k2-fi_k3 : fi_k2+fi_k3] movq mm3,mm0 ;mm3=[f1:f0] pfadd mm0,mm2 ;mm0=[f1+f3:f0+f2] movd [edi],mm0 ;fi[0]=f0+f2 psrlq mm0,32 ;mm0=[0:f1+f3] pfsub mm3,mm2 ;mm3=[f1-f3:f0-f2] movd [edi+eax*4],mm0 ;fi[k1]=f1+f3 movd [edi+ebx*4],mm3 ;fi[k2]=f0-f2 psrlq mm3,32 ;mm3=[0:f1-f3] movd [edi+ecx*4],mm3 ;fi[k3]=f1-f3 movd mm0,[ebp] ;mm0=[0:gi_0] movd mm1,[ebp+eax*4] ;mm1=[0:gi_k1] punpckldq mm0,mm0 ;mm0=[gi_0 :gi_0 ] punpckldq mm1,mm1 ;mm1=[gi_k1:gi_k1] movd mm2,[ebp+ebx*4] ;mm2=[0:gi_k2] pxor mm1,mm7 ;mm1=[-gi_k1:gi_k1] punpckldq mm2,[ebp+ecx*4] ;mm2=[gi_k3:gi_k2] pfadd mm0,mm1 ;mm0=[g1:g0]=[gi_0 -gi_k1:gi_0 +gi_k1] pfmul mm2,mm6 ;mm2=[g3:g2]=sqrt2 * [gi_k3:gi_k2] movq mm1,mm0 ;mm1=[g1:g0] pfadd mm0,mm2 ;mm0=[g1+g3:g0+g2] movd [ebp],mm0 ;gi[0]=g0+g2 psrlq mm0,32 ;mm0=[0:g1+g3] pfsub mm1,mm2 ;mm1=[g1-g3:g0-g2] movd [ebp+eax*4],mm0 ;gi[k1]=g1+g3 movd [ebp+ebx*4],mm1 ;gi[k2]=g0-g2 psrlq mm1,32 ;mm1=[0:g1-g3] movd [ebp+ecx*4],mm1 ;gi[k3]=g1-g3 lea edi,[edi+edx*4] ;fi += k4 lea ebp,[ebp+edx*4] ;gi += k4 cmp edi,esi jc near .lp31 ;}while(fi5.6kclk 作成。/* 注意 s = MSFREQ は4の倍数を仮定。作成時は20だった。*/ ; 99/10/29 微調整 ; * fft_side_E3DN * ; 99/09/20 3DNow!Extension対応版。USE_E3DNで使用を制御。Athlon向けコードになっている。 ; 99/10/29 微調整 %include "nasm.h" externdef fht externdef costab_fft externdef sintab_fft externdef gray_index externdef tbl_cos_fht externdef tbl_sin_fht externdef tbl_bitrev_fht segment_data align 32 D_1_41421 dd 1.41421356 , 1.41421356 D_1_0 dd 1.0 , 1.0 D_0_5 dd 0.5 , 0.5 D_0_25 dd 0.25 , 0.25 D_0_02236 dd 0.02236067 , 0.02236067 D_0_0005 dd 0.0005 , 0.0005 D_0_0 dd 0.0 , 0.0 D_1_0_D_0_0 dd 0.0 , 1.0 D_0_0_D_1_0 dd 1.0 , 0.0 D_MSB1_0 dd 0x00000000 , 0x80000000 D_MSB1_1 dd 0x80000000 , 0x80000000 D_MSB0_1 dd 0x80000000 , 0x00000000 D2_MSB1_0 dd 0x00000000, 0x80000000 F2_PR2_PR2 dd 0x3f3504f3, 0x3f3504f3 segment_code ;*********************************************************************** ;void fft1k_3DN(FLOAT *x_real, FLOAT *energy, FLOAT (*abx)[2], float *window, int *savebuf); %assign NB 10 proc fft1k_3DN %$x_real arg 4 %$energy arg 4 %$abx arg 4 %$window arg 4 %$savebuf arg 4 femms pushd ebp, ebx, esi, edi %if 0 mov r0, [sp(%$savebuf)] mov r1, [sp(%$window)] xor r2, r2 ; source index mov r3, [sp(%$x_real)] xor r4, r4 ; destination index mov r5, gray_index jmp .skip align 16 .lp0: btc r4, r6 .skip: pmov mm0, [r0+r2*fsize] pmov mm1, [r1+r2*fsize] pi2fd mm0, mm0 btc r2, 1 pfmul mm0, mm1 pmovd [r3+r4*fsize], mm0 puphdq mm0, mm0 pmovd [r3+r4*fsize+(fsize << (NB-1))], mm0 btc r4, (NB-2) pmov mm0, [r0+r2*fsize] pmov mm1, [r1+r2*fsize] pi2fd mm0, mm0 movzx r6, byte [r5] pfmul mm0, mm1 inc r5 pmovd [r3+r4*fsize], mm0 btc r2, r6 puphdq mm0, mm0 neg r6 pmovd [r3+r4*fsize+(fsize << (NB-1))], mm0 add r6, (NB-1) jns .lp0 %else %assign FFTN (1<= 0.0005) pand mm1, mm3 ; 求めた値 pandn mm2, mm7 ;else pandn mm3, mm6 ; 下限値 por mm0, mm2 por mm1, mm3 pmov [r1+r3*8], mm0 ;abx pmovd [r2+r3*4], mm1 ;energy inc r3 dec r4 cmp r3, 6 jb .lp1 .lp2: pmov mm0, [r0+r3*fsize] pmov mm1, [r0+r4*fsize] pupldq mm0, mm1 ;b | a pfmul mm0, mm0 ;b*b | a*a pfacc mm0, mm0 ;a*a+b*b pfmul mm0, mm5 ;(a*a+b*b)*0.5 ; pfmax mm0, mm6 pmovd [r2+r3*fsize], mm0 inc r3 dec r4 cmp r3, r4 jne .lp2 pmov mm0, [r0+r3*fsize] pfmul mm0, mm0 pmovd [r2+r3*fsize], mm0 .exit: femms popd ebp, ebx, esi, edi endproc ;*********************************************************************** ;void fft256_3DN(FLOAT *x_real, FLOAT *energy, FLOAT (*abx)[2], float *window, int *savebuf); %assign NB 8 proc fft256_3DN %$x_real arg 4 %$energy arg 4 %$abx arg 4 %$window arg 4 %$savebuf arg 4 femms pushd ebp, ebx, esi, edi %if 0 mov r0, [sp(%$savebuf)] mov r1, [sp(%$window)] xor r2, r2 ; source index mov r3, [sp(%$x_real)] xor r4, r4 ; destination index mov r5, gray_index jmp .skip align 16 .lp0: btc r4, r6 .skip: pmov mm0, [r0+r2*fsize] pmov mm1, [r1+r2*fsize] pi2fd mm0, mm0 btc r2, 1 pfmul mm0, mm1 pmovd [r3+r4*fsize], mm0 puphdq mm0, mm0 pmovd [r3+r4*fsize+(fsize << (NB-1))], mm0 btc r4, (NB-2) pmov mm0, [r0+r2*fsize] pmov mm1, [r1+r2*fsize] pi2fd mm0, mm0 movzx r6, byte [r5] pfmul mm0, mm1 inc r5 pmovd [r3+r4*fsize], mm0 btc r2, r6 puphdq mm0, mm0 neg r6 pmovd [r3+r4*fsize+(fsize << (NB-1))], mm0 add r6, (NB-1) jns .lp0 %else %assign FFTN (1<= 0.0005) pand mm1, mm3 ; 求めた値 pandn mm2, mm7 ;else pandn mm3, mm6 ; 下限値 por mm0, mm2 por mm1, mm3 pmov [r1+r3*8], mm0 ;abx pmovd [r2+r3*4], mm1 ;energy inc r3 dec r4 cmp r3, r4 jb .lp1 pmov mm0, [r0+r3*fsize] pmov mm1, mm0 pfmul mm0, mm0 pupldq mm1, mm1 pmovd [r2+r3*fsize], mm0 pmov [r1+r3*8], mm1 .exit: femms popd ebp, ebx, esi, edi endproc ;*********************************************************************** ;void fht_3DN(float *fz, int n); %if 1 proc fht_3DN %$fz arg 4 %$n arg 4 %$k local 4 %$Ps2_Pc2 local 8 %$Mc2_Ps2 local 8 %$t_s local 8 %$t_c local 8 alloc ; femms pushd ebp, ebx, esi, edi fht_3DN_1st_part: fht_3DN_2nd_part: .for_init: mov r0, [sp(%$fz)] ;r0 = fz mov r1, [sp(%$n)] ;r1 = n lea r6, [r0+r1*4] ;r6 = fn = &fz[n] mov r2, r0 ;r2 = fi = fz pmov mm7, [D_MSB1_0] ;MSB1_0 jmp .for align 16 .for: pmov mm0, [r2] ;fi[1] | fi[0] pmov mm1, mm7 pmov mm2, [r2+8] ;fi[3] | fi[2] pmov mm3, mm7 pxor mm1, mm0 ;-fi[1] | fi[0] pxor mm3, mm2 ;-fi[3] | fi[2] pfacc mm0, mm1 ;f1 | f0 pfacc mm2, mm3 ;f3 | f2 pmov mm4, [r2+16] ;fi[5] | fi[4] pmov mm1, mm7 pmov mm6, [r2+24] ;fi[7] | fi[6] pmov mm3, mm7 pxor mm1, mm4 ;-fi[5] | fi[4] pxor mm3, mm6 ;-fi[7] | fi[6] pfacc mm4, mm1 ;f5 | f4 pfacc mm6, mm3 ;f7 | f6 add r2, 32 ;fi+=8 pmov mm5, mm0 pmov mm1, mm4 pfadd mm0, mm2 ;f1+f3 | f0+f2 = fi[1] | fi[0] pfadd mm4, mm6 ;f5+f7 | f4+f6 = fi[5] | fi[4] pfsub mm5, mm2 ;f1-f3 | f0-f2 = fi[3] | fi[2] pfsub mm1, mm6 ;f5-f7 | f4-f6 = fi[7] | fi[6] pmov [r2-32], mm0 pmov [r2+16-32], mm4 pmov [r2+8-32], mm5 pmov [r2+24-32], mm1 cmp r2, r6 ;if (fi= 160kbps]\n", "-delete Eingabedatei nach Kodierung l chen[!]\n", "-i pren und erschreiben\n", "-o dir Ausgabeverzeichnis 舅dern\n", "-riff {wave, rmp} Wrapping-Format f Wave:RIFF/WAVE rmp:RIFF/RMP\n", "-test Benchmark-Mode\n", "Bet舩igen Sie die Enter-Taste.\n", "-lang {sjis,eucjp,eng,ger,esp} Sprache\n", // 33 "Fertig", "Fertig. Keine Fehler", "Interner Fehler", "Ungtiger Parameter", "x87 FPU nicht gefunden", "Kann Eingabedatei nicht fnen.", "Kann Ausgabedatei nicht fnen.", "Samplingfrequenz der Eingabe ist ungtig.", "Bitratenfehler", "Ungtiger Wave-Typ", "Kein Zugriff m lich.", "Unterbrechung!", "Schreiben in MP3-Datei nicht m lich.", // 13 "pre, ob das BS SSE unterstzt.", "... ja..", "Dieses BS unterstzt keine SSE-Befehle.", "Die Prozessor-Nummer ist", "\nerschreiben? (j/n)", "Gel chte Eingabedatei", // 5 }; gogo239b/global.h100644 23421 144 1146 7220537347 12752 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * modified by PEN@MarineCat */ /*********************************************************************** * * Global Variable External Declarations * ***********************************************************************/ extern int force_ms; extern int VBR; extern int VBR_q; extern int VBR_min_rate_idx; extern int VBR_max_rate_idx; extern int sfb21; extern int silent; extern int fast_mode; extern int bForceMono; /* stereo->mono */ extern int bBitConvert; /* 8bit->16bit */ extern int bSwapByte; /* low, high bit convert */ extern int bTownsSND; /* SND for TownsOS */ gogo239b/japanese.msg100644 23421 144 7520 7220537347 13641 0ustar shigeousers /* msg_JAPANESE[0] 、マ、ウ、ホ・ニ・ュ・ケ・ネ、ホSJIS/EUCネスト熙ヒサネ、ヲ、ホ、ヌハムケケノヤイト */ static int isJAPANESE_SJIS( char *str ){ char mes[][14] = { #if defined(__os2__) || defined(__dos__) "ja", "ja_JP", #endif "ja_JP.SJIS", "ja.SJIS", "ja_JP.mscode" }; int i; for( i = 0; i < sizeof(mes)/sizeof(mes[0]); i++ ){ if( !strcmp( str, mes[i] ) ) return 1; } return 0; } static int isJAPANESE_EUC( char *str ){ char mes[][12] = { #if !(defined(__os2__) || defined(__dos__)) "ja", "ja_JP", #endif "japanese", "ja_JP.euc", "ja_JP.eucjp", "ja_JP.ujis", "Jp_JP", "ja_JP.AJEC", "ja_JP.EUC", "ja_JP.eucJP", "eucJP" }; int i; for( i = 0; i < sizeof(mes)/sizeof(mes[0]); i++ ){ if( !strcmp( str, mes[i] ) ) return 1; } return 0; } static char msg_JAPANESE[][MSG_LEN_MAX] = { "ク盧螟ホ、ウ。チ、タ", "Copyright (C) 1999, 2000 PEN@ウ、ヌュ 、ネ 、リ、、゚\n", " シオキノー、オ、, 、ヲ、、熙オ、, Noisyu、オ、, キラ、オ、、ヒツソツ遉ハ、エカシユ\n", " *** ク盧螟ル、、チ [・ル・・チ・゙。シ・ッ] ***\n", // 4 "-m ・ェ・ラ・キ・逾、ホタ゚ト・゚・ケ", "-b[r] ・ェ・ラ・キ・逾・゚・ケ", "-s ・ェ・ラ・キ・逾・゚・ケ\n", "-emp ・ェ・ラ・キ・逾・゚・ケ\n", "ノヤタオ、ハ・。シ・ネ\n", "-d ・ェ・ラ・キ・逾・゚・ケ\n", "-off ・ェ・ラ・キ・逾・゚・ケ\n", "-lpf ・ェ・ラ・キ・逾・゚・ケ\n", "-o ・ェ・ラ・キ・逾・゚・ケ\n", "-cpu ・ェ・ラ・キ・逾・゚・ケ\n", "-priority ・ェ・ラ・キ・逾・゚・ケ\n", "-readthread ・ェ・ラ・キ・逾・゚・ケ\n", "、ャツクコ゚、キ、゙、サ、\n", "-riff ・ェ・ラ・キ・逾・゚・ケ\n", "-v ・ェ・ラ・キ・逾・゚・ケ\n", "-offset ・ェ・ラ・キ・逾・゚・ケ\n", "ノヤタオ、ハ・ェ・ラ・キ・逾、ヌ、ケ\n", "-vb ・ェ・ラ・キ・逾・゚・ケ\n", "-th ・ェ・ラ・キ・逾・゚・ケ\n", // 19 "・筵ホ・鬣", "・ケ・ニ・・ェ", "・ク・逾、・・ネ・ケ・ニ・・ェ", "・゚・テ・ノ・オ・、・ノ・ケ・ニ・・ェ", "・ヌ・螂「・・チ・罕ヘ・", "フ、トオチ、ホ", "ニホマシヌネソ", "スミホマシヌネソ", "・モ・テ・ネ・。シ・ネ", "ニホマ・ユ・。・、・", "スミホマ・ユ・。・、・", "\n・ィ・・ウ。シ・ノスェホサ\nキミイ盻エヨ ", // 12 "ク盧螟ホ、ウ。チ、タ、マLAME3.29beta、クオ、ヒLGPL、ヒエ、ナ、、、ニクウォ、オ、、ソ・ス・ユ・ネ、ヌ、ケ\n", "サネ、、ハ\n", "gogo inputPCM [outputPCM] [options]\n", " inputPCM 、マ wav・ユ・。・、・、サリト鷭n", "inputPCM、ヒ'stdin'、サリト熙ケ、、ネノクス猗ホマ・筍シ・ノ、ヒ、ハ、\n", "outputPCM 、マセハホャイトヌス\n\n", "サネヘムイトヌス、ハ・ェ・ラ・キ・逾ーヘ\n", "-b kbps/-br bps ・モ・テ・ネ・。シ・ネ[テアーフ kpbs/bps]\n", "-silent ナモテ豺ミイ睚ノスシィ[フ、サリトサ、マノスシィ]\n", "-m {s,m,j} スミホマキチシー s:・ケ・ニ・・ェ, m:・筵ホ・鬣, j:joint・ケ・ニ・・ェ\n", "-nopsy ソエヘイサカチ・筍シ・ノフオク(フ、サリトサ、マヘュク)\n", "-off {3dn,mmx,kni(sse),e3dn}\n", "-v {0,..,9} VBRニーコ [0:ケ箚サシチ 9:ケ箍オスフ]\n", "WAVE・リ・テ・タ、イタマ、キ、ハ、、、ヌシォハャ、ヌタ゚ト熙ケ、セケ軆n", "-offset bytes ニノ、゚ネ、ミ、ケ・リ・テ・タ・オ・、・コ\n", " -8bit 8bit-PCM [フ、サリトサ 16bit-PCM]\n", " -mono mono-PCM [フ、サリトサ stereo-PCM]\n", " -bswap 16bitPCM、ホlow, high byteクエケ\n", " -s kHz ニホマWAV、ホシヌネソハムエケサリト鷦テアーフ kHz]\n", " -tos TownsOSヘムSND・ユ・。・、・ニホマ\n", "-cpu n シツチ、オ、、ニ、、、CPU、ホソ(フ、サリトサ、マシォニーク。スミ)\n", "-priority num ・ィ・・ウ。シ・ノ・ケ・・テ・ノ、ホ・ラ・鬣、・ェ・・ニ・」(セハホャサ 10)\n", "-readthread num ・ヌ。シ・ソニノケ、゚・ケ・・テ・ノ、ホ・ラ・鬣、・ェ・・ニ・」(セハホャサ サネヘム、キ、ハ、、)\n", "-d kHz スミホマMP3、ホシヌネソハムエケサリト鷦テアーフ kHz]\n", "-emp {n,c,5} de-emphasisタ゚ト鷭n", "-lpf {on,off} 16kH・ユ・」・・ソタ゚ト(セハホャサ、マ128kbpsーハイシ、ハ、鯱ュク:160kbpsーハセ螟ハ、鯲オク)\n", "-delete ・ィ・・ウ。シ・ノスェホサク螂ユ・。・、・コス\n", "-i セ蠖、ュウホヌァ\n", "-o dir スミホマ・ヌ・」・・ッ・ネ・鷭n", "-riff {wave, rmp} RIFF/WAVE 、゙、ソ、マ RIFF/RMP キチシースミホマ\n", "-test ・ル・・チ・゙。シ・ッ・筍シ・ノ\n", "・・ソ。シ・・ュ。シ、イ。、キ、ニ、ッ、タ、オ、、\n", "-lang {sjis,eucjp,eng,ger,esp} クタク、ホチェツ\n", // 33 "タオセ、ヒスェホサ、キ、゙、キ、ソ", "・ケ・ネ・遙シ・爨ャコヌク螟゙、ヌテ」、キ、゙、キ、ソ。」・ィ・・ウ。シ・ノ、マタオセ、ヒスェホサ、キ、゙、キ、ソ", "ニ篷・ィ・鬘シ、ャネッタク、キ、゙、キ、ソ", "・ム・鬣癸シ・ソ。シ、ホタ゚トネマーマ、ャー网、、゙、ケ", "FPU、チテ螟キ、ニ、、、゙、サ、", "ニホマ・ユ・。・、・、ウォ、ッサ、ャスミヘ隍゙、サ、、ヌ、キ、ソ", "スミホマ・ユ・。・、・、ウォ、ッサ、ャスミヘ隍゙、サ、、ヌ、キ、ソ" , "ニスミホマシヌネソ、ャタオ、キ、ッ、「、熙゙、サ、", "・モ・テ・ネ・。シ・ネ、ホタ゚ト熙ャタオ、キ、ッ、「、熙゙、サ、", "・ヲ・ァ。シ・ヨ・ソ・、・ラ、ャタオ、キ、ッ、「、熙゙、サ、", "タオ、キ、ッ・キ。シ・ッスミヘ隍゙、サ、、ヌ、キ、ソ", "テ貪ヌ、キ、゙、キ、ソ", "ス、ュケ、゚、ヒシコヌヤ、キ、゙、キ、ソ", // 13 "SSEサネヘムイトヌス、ォトエ、ル、゙、ケ", "... イトヌス、ヌ、ケ", "、ウ、ホOS、マSSEネ・オ・ン。シ・ネ、ヌ、ケ", "CPU、ホクトソ", "セ蠖、ュ、キ、ニ、隍、キ、、、ヌ、ケ、ォ?(y/n)", "コス、キ、゙、ケ", // 6 }; gogo239b/gogo.spec100644 23421 144 2117 7220540572 13141 0ustar shigeousersSummary: Fast MP3 encoder optimized for 3DNow! and SSE. Name: gogo Version: 2.39b %define srcver 239b Release: 1 Group: Applications/Sound Source: gogo%{srcver}.tgz Copyright: Restricted BuildRoot: /var/tmp/gogo-root %description GOGO is a mp3 encoder based on lame3.29beta ( including a part of lame3.5x) and optimized by PEN@MarineCat, Keiichi SAKAI, URURI, kei and shigeo, modified by Noisyu for BeOS Intel, modified by Samuel Audet and sava for OS/2. This is distributed under the LGPL, but you may pay the patent for mp3 on using gogo outside Japan. GOGO can encode about TWICE as fast as original LAME can, and its quality is the about same as (old) LAME's. GOGO makes use of MMX, 3D Now! and SSE if your system supports these instructions. %prep rm -rf ${RPM_BUILD_ROOT} mkdir -p ${RPM_BUILD_ROOT}/usr/bin %setup -n gogo%{srcver} %build export USE_MT=yes USE_E3DN=yes make -j4 -f Makefile gogo %install install -s gogo $RPM_BUILD_ROOT/usr/bin %files %defattr(-,root,root) %attr(755,root,root) /usr/bin/gogo %doc contrib/* readme.txt readme_e.txt japandoc/{install.txt,faq.txt,faq.html} gogo239b/loop.c100644 23421 144 203704 7220537347 12522 0ustar shigeousers/* * for new GOGO-no-coda (1999, 2000) * based on lame3.28beta and optimized by shigeo */ #define PEN_LPF #define PEN_MS /* * 99/08/01 * count_bit()の4番目の引数が0でないかのチェックを関数を呼び出す前にする * x2.00程度 * 99/08/03 * 次のことを仮定して最適化する * ・quntizerStepSizeはintでよい * おそらくこれはバージョンが変わってもO.K. * ・次はC言語のルールだったっけ? * (int)(-1.4)=(int)(-1.5)=(int)(-1.6)=-1 * (int)( 1.4)=(int)( 1.5)=(int)( 1.6)= 1 * ・quantize_xrpow()のasm化(FPU,3DN) * x1.30程度 * 99/08/09 * calc_noise2()の最適化 & 一部asm化(FPU) * x1.10程度 * 99/08/10 * calc_noise{1,2}()の最適化続き * x1.05程度 * 99/08/11 * calc_pow4P3dual()の3DN化 * x0.93程度 * 99/08/14 * 次のことを仮定して最適化する * ・sfBandIndex[]の中身が全て偶数であること * ・subdivideの中で * bigvalues_region = 2 * cod_info->big_values;となってること * ・(上のことから)cod_info->address{1,2,3}は全て偶数 * ・よってnew_choose_table,ix_maxのbeginとendは偶数であるとしてよい * 99/08/27 * 久し振りに測定 * calc_pow075()の3DN化 * x0.65程度 * 99/10/11 * lame3.28を参考に大幅変更 & VBR 対応 * 99/10/30 * stereo以外では元に戻らない事が判明。そのため完全に移行する。 * 00/01/06 * lame3.55に追従してみようとしたけど、もう無理だわ。 * 00/01/11 ひとまず終了 */ #include #include #include #include #include "musenc.h" #include "global.h" #include "loop.h" #include "huffman.h" #include "l3bs.h" #include "haveunit.h" #include "l3psy.h" /* CPUに依って変更されうる関数へのポインタ */ static int (*quantize_xrpow)(float xr[576], int ix[576], gr_info *cod_info); static int (*count_bit)(int ix[576],unsigned int start,unsigned int end,unsigned int table); static void (*calc_pow4P3dual)(int *ix,float *xr,float *step,float *sum,int n,int next); static void (*calc_pow075)( float *xr, float *xrpow ); static void (*ms_convert)(float xr[2][576],float xr_org[2][576]); static int (*count_nz_xr)(float xr[]); static void (*set_l3_enc_sign)(float xr[], int l3_enc[]); static int (*new_choose_table)( int ix[576], unsigned int begin, unsigned int end, int *bits ); static int (*calc_runlen_count1)( int *ix, gr_info *cod_info); int (*ix_max)(int ix[576], unsigned int begin, unsigned int end); /* exported to huffmana.nas */ /* 初期化不要のstatic */ static int convert_mdct, convert_psy, reduce_sidechannel; static int count_bits(int *ix, gr_info *cod_info); /* 16, 24kHz のテーブル修正 00/01/20 from tables.c in lame3.60 */ static const struct scalefac_struct sfBandIndex[6] = { { /* Table B.2.b: 22.05 kHz */ {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, {0,4,8,12,18,24,32,42,56,74,100,132,174,192} }, { /* Table B.2.c: 24 kHz */ {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,332,394,464,540,576}, {0,4,8,12,18,26,36,48,62,80,104,136,180,192} }, { /* Table B.2.a: 16 kHz */ {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, {0,4,8,12,18,26,36,48,62,80,104,134,174,192} }, { /* Table B.8.b: 44.1 kHz */ {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576}, {0,4,8,12,16,22,30,40,52,66,84,106,136,192} }, { /* Table B.8.c: 48 kHz */ {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576}, {0,4,8,12,16,22,28,38,50,64,80,100,126,192} }, { /* Table B.8.a: 32 kHz */ {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576}, {0,4,8,12,16,22,30,42,58,78,104,138,180,192} } }; static const unsigned sfbBlkSub[2][2][4] = { {{6, 5, 5, 5}, {9, 9, 9, 9}}, {{11, 10, 0, 0}, {18, 18, 0, 0}} }; static struct{ int size; int max; } resv; const int *scalefac_long = &sfBandIndex[3].l[0]; const int *scalefac_short = &sfBandIndex[3].s[0]; /* 初期化必要な変数 */ static int OldValue = -30; /* guess it or so. */ static int firstcall = 1; static float scalefac_shortR[SFB_SMAX]; /* = 1 / ( scalefac[i+1] - scalefac[i] ) */ extern float scalefac_longR[SFB_LMAX]; /* defined in quantize.nas */ float masking_lower = 1; /* exported for quantize.nas */ static int ResvFrameBegin(int mean_bits, int frameLength){ int fullFrameBits; int limit; if(gl.mode_gr == 2){ limit = 4088; fullFrameBits = mean_bits * 2 + resv.size; }else{ limit = 2040; fullFrameBits = mean_bits + resv.size; } resv.max = 7680 - frameLength; if(resv.max > limit){ resv.max = limit; }else if(resv.max < 0){ resv.max = 0; } return fullFrameBits; } static void ResvMaxBits2(int mean_bits, int *targ_bits, int *extra_bits){ int adj, ext, targ; targ = mean_bits; adj = resv.size - ((resv.max * 9) / 10); if(adj > 0){ targ += adj; }else{ adj = 0; targ -= (int)(mean_bits / 15.2); } ext = (resv.max * 6) / 10; if(resv.size < ext){ ext = resv.size; } ext -= adj; if(ext < 0) ext = 0; // if(targ > 4095) targ = 4095; // if(targ + ext > 4095) ext = 4095 - targ; *targ_bits = targ; *extra_bits = ext; } static void ResvAdjust(int len, int mean_bits){ if(gl.stereo == 2){ resv.size += (mean_bits >> 1) - len; }else{ resv.size += mean_bits - len; } } static int ResvFrameEnd(int mean_bits){ int ret; int over; /* just in case mean_bits is odd, this is necessary... */ if(gl.stereo == 2 && (mean_bits & 1)) resv.size++; over = resv.size - resv.max; if( over > 0 ){ resv.size = resv.max; ret = over; }else{ ret = 0; } over = resv.size & 7; ret += over; resv.size -= over; return ret; } /* quantize.nasとの整合性注意(128で99%カバー) */ /* 8192+14=8206で全てをカバー */ #define PRECALC_SIZE 8206 extern float pow4P3_table[PRECALC_SIZE]; static void calc_noise_init(void){ int i; for( i = 0; i < PRECALC_SIZE; i++ ){ pow4P3_table[i] = pow(i, 4.0/3.0); } } typedef enum { BINSEARCH_NONE, BINSEARCH_UP, BINSEARCH_DOWN } binsearchDirection_t; /* input: xrpow, cod_info output:ix */ static int bin_search_StepSize2(int desired_rate, int *ix, float *xrpow, gr_info *cod_info){ int flag_GoneOver = 0; int CurrentStep = 4; /* 正の数にしかならないので割り算はシフト可 */ int nBits; int StepSize = OldValue; binsearchDirection_t Direction = BINSEARCH_NONE; for(;;){ cod_info->quantizerStepSize = StepSize; /* for avoiding overflow of FPU */ if( StepSize < -128 ){/* 数字は適当 pow(2,Size*3/16)〜2^32なので問題無いとは思う */ nBits = 100000; }else { nBits = quantize_xrpow(xrpow, ix, cod_info); nBits = ( nBits <= 8191 + 14 ) ? count_bits(ix,cod_info) : 100000; } if( CurrentStep == 1 ){ break; /* nothing to adjust anymore */ } if( flag_GoneOver ){ CurrentStep >>= 1; } if( nBits > desired_rate ){ /* increase Quantize_StepSize */ if( Direction == BINSEARCH_DOWN && !flag_GoneOver ){ flag_GoneOver = 1; CurrentStep >>= 1; } Direction = BINSEARCH_UP; StepSize += CurrentStep; }else{ if( nBits < desired_rate ){ if( Direction == BINSEARCH_UP && !flag_GoneOver ){ flag_GoneOver = 1; CurrentStep >>= 1; } Direction = BINSEARCH_DOWN; StepSize -= CurrentStep; }else{ break; /* nBits == desired_rate;; most unlikely to happen */ } } } OldValue = StepSize; return nBits; } /* convert from L/R <-> Mid/Side */ void ms_convert_3DN(float xr[2][576],float xr_org[2][576]); void ms_convert_FPU(float xr[2][576],float xr_org[2][576]); void ms_convert_SSE(float xr[2][576],float xr_org[2][576]); #ifdef USE_E3DN void ms_convert_E3DN(float xr[2][576],float xr_org[2][576]); #endif void setup_ms_convert(int useUNIT){ #ifdef USE_E3DN if( useUNIT & tE3DN ){ SETUP_DSP("use:ms_convert_E3DN:\n"); ms_convert = ms_convert_E3DN; }else #endif if( useUNIT & t3DN ){ SETUP_DSP("use:ms_convert_3DN:\n"); ms_convert = ms_convert_3DN; }else if( useUNIT & tSSE ){ SETUP_DSP("use:ms_convert_SSE:\n"); ms_convert = ms_convert_SSE; }else { SETUP_DSP("use:ms_convert_FPU:\n"); ms_convert = ms_convert_FPU; } } /* 99/09/21 おまけ */ static void pow2i025(int n, float *ret){ int m; /* table[i] = 2^(i/4) */ float table[4]={1,1.18920711498,1.41421356237,1.68179283048}; m = n >> 2; m = (m << 23) + 0x3F800000; /* = 2^m */ *ret = table[ n & 3 ] * *(float *)&m; } /* * 99/08/27 by shigeo * あっちゃ〜こんなのが残ってた */ void calc_pow075_3DN( float *xr, float *xrpow ); #ifdef USE_E3DN void calc_pow075_E3DN( float *xr, float *xrpow ); #endif void calc_pow075_SSE( float *xr, float *xrpow ); void calc_pow075_NONE( float *xr, float *xrpow ); void setup_calc_pow075(int useUNIT){ #ifdef USE_E3DN if( useUNIT & tE3DN ){ SETUP_DSP("use:calc_pow075_E3DN\n"); calc_pow075 = calc_pow075_E3DN; }else #endif if( useUNIT & t3DN ){ SETUP_DSP("use:calc_pow075_3DN\n"); calc_pow075 = calc_pow075_3DN; }else if( useUNIT & tSSE ){ SETUP_DSP("use:calc_pow075_SSE\n"); calc_pow075 = calc_pow075_SSE; }else { SETUP_DSP("use:calc_pow075_NONE\n"); calc_pow075 = calc_pow075_NONE; /* 40k clk */ } } /* flag = 1 if distort[ch][0][i] > 0 for i = 17,18,19,20 */ /* 全てのdistort[]=0の時何もしないで0を返す */ static int preemphasis(float xr[576], float xrpow[576], ratio_t *l3_xmin, int gr, int ch, III_side_info_t *l3_side, float distort[4][CBLIMIT] ) { gr_info *cod_info = &l3_side->gr[gr].ch[ch].tt; static const float pow_tbl1[21] = /* =sqr2 ^ pretab[i] */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, SQRT2, SQRT2, SQRT2, SQRT2, 2, 2, 2*SQRT2, 2*SQRT2, 2*SQRT2, 2 }; #define P 1.29683955463 /* = 2^(3/8) */ static const float pow_tbl2[21] = /* = pow_tbl1[i] ^ 0.75 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, P, P, P, P, P*P,P*P,P*P*P,P*P*P,P*P*P,P*P }; #undef P int i, sfb, start, end; float t,t34; /* * Preemphasis is switched on if in all the upper four scalefactor * bands the actual distortion exceeds the threshold after the * first call of the inner loop */ if( cod_info->block_type == SHORT_TYPE || cod_info->preflag || distort[0][17] <= 0 || distort[0][18] <= 0 || distort[0][19] <= 0 || distort[0][20] <= 0 ) return 0; cod_info->preflag = 1; /* t==1の時は既に除外 */ for( sfb = 11; sfb < cod_info->sfb_lmax; sfb++ ){ t = pow_tbl1[sfb]; t34 = pow_tbl2[sfb]; if( cod_info->scalefac_scale ){ t *= t; t34 *= t34; } l3_xmin->l[gr][ch][sfb] *= t*t; start = scalefac_long[ sfb ]; end = scalefac_long[ sfb+1 ]; for( i = start; i < end; i++ ) xr[i] *= t; for( i = start; i < end; i++ ) xrpow[i] *= t34; } return 1; } /* 全てのdistort[]=0の時何もしないで0を返す */ static int amp_scalefac_bands( float xr[576], float xrpow[576], ratio_t *l3_xmin, III_side_info_t *l3_side, III_scalefac_t *scalefac, int gr, int ch, int iteration, float distort[4][CBLIMIT]) { int sfb, i, over = 0; float ifqstep, ifqstep2, ifqstep34; D192_3 *xr_s; D192_3 *xrpow_s; gr_info *cod_info; float distort_thresh; cod_info = &l3_side->gr[gr].ch[ch].tt; xr_s = (D192_3 *) xr; xrpow_s = (D192_3 *) xrpow; if( cod_info->scalefac_scale ){ ifqstep = 2; ifqstep2 = 4; ifqstep34 = 1.68179283050743; /* = 2^(3/4) */ }else{ ifqstep = SQRT2; ifqstep2 = 2; ifqstep34 = 1.29683955465101; /* = 2^(3/8) */ } /* distort_thresh = 0, unless all bands have distortion * less than masking. In that case, just amplify bands with distortion * within 95% of largest distortion/masking ratio */ distort_thresh = -900 / 1.05; for( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ){ distort_thresh = Max( distort[0][sfb], distort_thresh ); } distort_thresh *= 1.05; distort_thresh = Min( distort_thresh, 0 ); for( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ){ int start, end; if( distort[0][sfb] <= distort_thresh ) continue; over++; l3_xmin->l[gr][ch][sfb] *= ifqstep2; scalefac->l[gr][ch][sfb]++; start = scalefac_long[sfb]; end = scalefac_long[sfb+1]; for( i = start; i < end; i++ ) xr[i] *= ifqstep; for( i = start; i < end; i++ ) xrpow[i] *= ifqstep34; } /* * Note that scfsi is not enabled for frames containing short blocks */ distort_thresh = -900 / 1.05; for( i = 0; i < 3; i++ ){ for( sfb = cod_info->sfb_smax; sfb < SFB_SMAX - 1; sfb++ ){ distort_thresh = Max( distort[i+1][sfb], distort_thresh ); } } distort_thresh *= 1.05; distort_thresh = Min( distort_thresh, 0 ); for( i = 0; i < 3; i++ ){ for( sfb = cod_info->sfb_smax; sfb < SFB_SMAX - 1; sfb++ ){ int start, end, j; if( distort[i+1][sfb] <= distort_thresh ) continue; over++; l3_xmin->s[gr][ch][sfb][i] *= ifqstep2; scalefac->s[gr][ch][sfb][i]++; start = scalefac_short[sfb]; end = scalefac_short[sfb+1]; for( j = start; j < end; j++ ) (*xr_s)[j][i] *= ifqstep; for( j = start; j < end; j++ ) (*xrpow_s)[j][i] *= ifqstep34; } } return over; } /* end of amp_scalefac_bands */ void calc_pow4P3mono(int *ix,float *xr,float *step,float *sum,int n,int next); /* xfsfは不要 */ static int calc_noise1( float xr[576], int ix[576], gr_info *cod_info, float distort[4][CBLIMIT], ratio_t *l3_xmin,int gr, int ch, float *over_noise, float *tot_noise, float *max_noise ) { int sfb, i, over = 0; float step; D192_3 *xr_s = (D192_3 *)xr; I192_3 *ix_s = (I192_3 *)ix; int count = 0; *over_noise = 0; *tot_noise = 0; *max_noise = -999; pow2i025( cod_info->quantizerStepSize, &step ); for( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ){ double temp; int start, bw; float sum; start = scalefac_long[ sfb ]; bw = scalefac_long[ sfb+1 ] - start; calc_pow4P3mono( &ix[start], &xr[start], &step, &sum, bw, 1 ); temp = sum / ( bw * l3_xmin->l[gr][ch][sfb] ); if( temp > 0.001 ){ temp = 10 * log10( temp ); }else{ temp = -30; } distort[0][sfb] = temp; if( temp > 0 ){ over++; *over_noise += temp; } *tot_noise += temp; *max_noise = Max( *max_noise, temp ); count++; } for( i = 0; i < 3; i++ ){ for( sfb = cod_info->sfb_smax; sfb < SFB_SMAX - 1; sfb++ ){ double temp; int start, bw; float sum; start = scalefac_short[ sfb ]; bw = scalefac_short[ sfb+1 ] - start; calc_pow4P3mono( &(*ix_s)[start][i], &(*xr_s)[start][i], &step, &sum, bw, 3 ); temp = sum / ( bw * l3_xmin->s[gr][ch][sfb][i] ); if( temp > 0.001 ){ temp = 10 * log10( temp ); }else{ temp = -30; } distort[i+1][sfb] = temp; if( temp > 0 ){ over++; *over_noise += temp; } *tot_noise += temp; *max_noise = Max( *max_noise, temp ); count++; } } if( count > 1 ) *tot_noise /= count; if( over > 1 ) *over_noise /= over; return over; } /* end of calc_noise1 */ /* * dualチャンネル用にcalc_noiseを改良 * L/Rのチャンネルからのしきい値(masking thresholds)を使って * midとsideチャンネルの量子化をするときに呼ぶ */ /* * 99/08/09 * 次の事を仮定して最適化する * stereo=2 */ void calc_pow4P3dual_3DN(int *ix,float *xr,float *step,float *sum,int n,int next); void calc_pow4P3dual_FPU(int *ix,float *xr,float *step,float *sum,int n,int next); void calc_pow4P3dual_SSE(int *ix,float *xr,float *step,float *sum,int n,int next); void setup_calc_pow4P3dual(int useUNIT){ if(useUNIT & t3DN){ SETUP_DSP("use:calc_pow4P3dual_3DN\n"); calc_pow4P3dual=calc_pow4P3dual_3DN; }else if(useUNIT & tSSE){ SETUP_DSP("use:calc_pow4P3dual_SSE\n"); calc_pow4P3dual=calc_pow4P3dual_SSE; }else{ SETUP_DSP("use:calc_pow4P3dual_FPU\n"); calc_pow4P3dual=calc_pow4P3dual_FPU; } } /* この関数は convert_psy == 1 の時のみ呼ばれるので stereo == 2 である */ /* * xfsfは不要, distort[0][i][j] = distort[1][i][j] */ static void calc_noise2( float xr[2][576], int ix[2][576], gr_info *cod_info[2], float distort[4][CBLIMIT], ratio_t *l3_xmin,int gr, int over[2], float over_noise[2], float tot_noise[2], float max_noise[2] ) { int start, sfb; float sum[2],step[2]; int bw; int ch; over_noise[0] = over_noise[1] = 0; /* lameでは block_type == SHORT_TYPE の時未初期化だけどわざと? */ tot_noise[0] = tot_noise[1] = 0; max_noise[0] = max_noise[1] = -999; pow2i025( cod_info[0]->quantizerStepSize, &step[0] ); pow2i025( cod_info[1]->quantizerStepSize, &step[1] ); over[0] = over[1] = 0; /* calc_noise2: 両方のチャンネルのblock typeは同じとする */ if( cod_info[0]->block_type != SHORT_TYPE ){ /* 殆どこっち */ for ( sfb = 0; sfb < SFB_LMAX-1; sfb++ ){ float dis_temp[2]; start = scalefac_long[ sfb ]; bw = scalefac_long[ sfb+1 ] - start; calc_pow4P3dual(&ix[0][start],&xr[0][start],step,sum,bw,1); for( ch = 0; ch < 2; ch++ ){ float temp; temp = sum[ch] / ( bw * l3_xmin->l[gr][ch][sfb] ); if( temp > 0.001 ){ temp = 10 * log10( temp ); }else{ temp = -30; } dis_temp[ch] = temp; if( temp > 0 ){ over[ch]++; over_noise[ch] += temp; } tot_noise[ch] += temp; max_noise[ch] = Max( max_noise[ch], temp ); } distort[0][sfb] = Max( dis_temp[0], dis_temp[1] ); } return; } { D192_3 *xr_s[2]; I192_3 *ix_s[2]; xr_s[0] = (D192_3 *) xr[0]; xr_s[1] = (D192_3 *) xr[1]; ix_s[0] = (I192_3 *) ix[0]; ix_s[1] = (I192_3 *) ix[1]; for( sfb = 0; sfb < SFB_SMAX - 1; sfb++ ){ float dis_temp[2]; int i; start = scalefac_short[ sfb ]; bw = scalefac_short[ sfb+1 ] - start; for( i = 0; i < 3; i++ ){ calc_pow4P3dual(&(*ix_s[0])[start][i],&(*xr_s[0])[start][i], step,sum,bw,3); for( ch = 0; ch < 2; ch ++ ){ float temp; temp = sum[ch] / ( bw * l3_xmin->s[gr][ch][sfb][i] ); if( temp > 0.001 ){ temp = 10 * log10( temp ); }else{ temp = -30; } dis_temp[ch] = temp > 0; if( temp > 0 ){ over[ch]++; over_noise[ch] += temp; } tot_noise[ch] += temp; max_noise[ch] = Max( max_noise[ch], temp); } distort[i+1][sfb] = Max( dis_temp[0], dis_temp[1] ); } } } } /* calc_noise2() */ /* compute the ATH for each scalefactor band cd range: 0..96db Input: 3.3kHz signal 32767 amplitude (3.3kHz is where ATH is smallest = -5db) longblocks: sfb=12 en0/bw=-11db max_en0 = 1.3db shortblocks: sfb=5 -9db 0db Input: 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 (repeated) longblocks: amp=1 sfb=12 en0/bw=-103 db max_en0 = -92db amp=32767 sfb=12 -12 db -1.4db Input: 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 (repeated) shortblocks: amp=1 sfb=5 en0/bw= -99 -86 amp=32767 sfb=5 -9 db 4db MAX energy of largest wave at 3.3kHz = 1db AVE energy of largest wave at 3.3kHz = -11db Let's take the average: -5db = maximum signal in sfb=12. Dynamic range of CD: 96db. Therefor energy of smallest audible wave in sfb=12 = -5 - 96 = -101db = ATH at 3.3kHz. ATH formula for this wave: -5db. To adjust to LAME scaling, we need ATH = ATH_formula - 96 (db) ATH = ATH * 2.5e-10 (ener) */ /* この関数はエンコードの最初に一度だけ呼ばれる */ float ATH_l[CBLIMIT]; /* exported for quantize.nas */ static float ATH_s[CBLIMIT]; static float ATHformula(float f) { float ath; f = Max(0.02, f); /* from Painter & Spanias, 1997 */ /* minimum: (i=77) 3.3kHz = -5db */ ath=(3.640 * pow(f,-0.8) - 6.500 * exp(-0.6*pow(f-3.3,2.0)) + 0.001 * pow(f,4.0)); /* convert to energy */ ath -= 114; ath = pow( 10, ath/10.0 ); return ath; } /* ATH_{s,l}の初期化 */ static void compute_ath(void) { int sfb,i,start,end; float ATH_f; float freqkHz = gl.enc_freqHz * 0.001; /* last sfb is not used */ for ( sfb = 0; sfb < SFB_LMAX-1; sfb++ ) { start = scalefac_long[ sfb ]; end = scalefac_long[ sfb+1 ]; ATH_l[sfb]=1e38;//1e99; for (i=start ; i < end; i++) { ATH_f = ATHformula(freqkHz*i/(2*576)); ATH_l[sfb]=Min(ATH_l[sfb],ATH_f); } } for ( sfb = 0; sfb < SFB_SMAX - 1; sfb++ ){ start = scalefac_short[ sfb ]; end = scalefac_short[ sfb+1 ]; ATH_s[sfb]=1e38; for (i=start ; i < end; i++) { ATH_f = ATHformula(freqkHz*i/(2*192)); ATH_s[sfb]=Min(ATH_s[sfb],ATH_f); } } } /* iteration_loopからのみ呼ばれる */ static void on_pe( float pe[2], III_side_info_t *l3_side, int targ_bits[2], int mean_bits, int gr ) { gr_info *cod_info; int extra_bits, tbits; int ch; ResvMaxBits2( mean_bits, &tbits, &extra_bits); if( gl.stereo == 2 ) tbits /= 2; for( ch = 0; ch < gl.stereo; ch ++){ int add_bits; cod_info = &l3_side->gr[gr].ch[ch].tt; add_bits= ( pe[ch] - 750 ) * 0.7142857143; /* = 1/1.4 */ if( cod_info->block_type == SHORT_TYPE && add_bits < 500 ){ add_bits = 500; } if( add_bits < 0) add_bits = 0; if( add_bits > extra_bits ) add_bits = extra_bits; if( add_bits > 4095 - tbits ) add_bits = 4095 - tbits; targ_bits[ch] = tbits + add_bits; extra_bits -= add_bits; } } static void reduce_side( int targ_bits[2], float ms_ener_ratio, int mean_bits ) { /* ms_ener_ratio = 0: allocate 66/33 mid/side fac=.33 * ms_ener_ratio =.5: allocate 50/50 mid/side fac= 0 * 75/25 split is fac=.5 * float fac = .50*(.5-ms_ener_ratio[gr])/.5; */ float fac; int max_bits; fac = 0.5 - ms_ener_ratio; if( fac > 0 && targ_bits[1] >= 125 ){ fac *= (0.33 * 2) * targ_bits[1]; if( targ_bits[1] - fac > 125 ){ targ_bits[0] += fac; targ_bits[1] -= fac; }else{ #ifdef PEN_MS if( targ_bits[1] >= 125 ){ targ_bits[0] += targ_bits[1] - 125; targ_bits[1] = 125; } #else targ_bits[0] += targ_bits[1] - 125; targ_bits[1] = 125; #endif } } max_bits = Min( 4095, mean_bits / 2 + 1200 ); if( targ_bits[0] > max_bits ) targ_bits[0] = max_bits; if( targ_bits[1] > max_bits ) targ_bits[1] = max_bits; } /* stereo == 2, convert_psy == TRUE */ static void quant_compare_dual( int better[2], int notdone[2], int best_over[2], float best_over_noise[2], int over[2], float over_noise[2] ) { /* * noise is given in decibals (db) relative to masking thesholds. * over_noise: sum of quantization noise > masking * tot_noise: sum of all quantization noise * max_noise: max quantization noise */ int overS = over[0] + over[1]; int bestS = best_over[0] + best_over[1]; int flag; flag = (over_noise[0]+over_noise[1]) < (best_over_noise[0]+best_over_noise[1]); if( overS != bestS ){ flag = overS < bestS; } better[0] = flag & notdone[0]; better[1] = flag & notdone[1]; } #ifdef USE_VBR /* best_*は全て0(lame3.59まではそうなってる ) */ #define VBR_compare( t0, t3, t2, t1, over, tot_n, over_n, max_n ) \ ( (over) <= 0 && (over_n) <= 0 && (tot_n) <= 0 && (max_n) <= 0 ) #endif /* USE_VBR */ /* まず最初に呼び出される */ static void iteration_init( float xr_org[2][2][576], III_side_info_t *l3_side ) { gr_info *cod_info; int ch, gr, i; extern float lowpass1, lowpass2; if( firstcall ){ firstcall = 0; l3_side->main_data_begin = 0; scalefac_long = &sfBandIndex[ gl.freq_idx + gl.version * 3 ].l[0]; scalefac_short = &sfBandIndex[ gl.freq_idx + gl.version * 3 ].s[0]; compute_ath(); } l3_side->resvDrain = 0; convert_mdct = 0; convert_psy = 0; reduce_sidechannel = 0; if( l3_side->mode_ext == MPG_MD_MS_LR ){ { convert_mdct = 1; convert_psy = 1; reduce_sidechannel=1; } } //QQQ lame3.55では無くなってる if( force_ms ){ convert_mdct = 0; convert_psy = 0; reduce_sidechannel = 1; } if( lowpass1 > 0 ){ float start,stop; for( gr = 0; gr < gl.mode_gr; gr++ ){ for( ch = 0; ch < gl.stereo; ch++ ){ if( l3_side->gr[gr].ch[ch].tt.block_type == SHORT_TYPE ){ int j, start, stop; start = lowpass1 * 192; stop = lowpass2 * 192; if( start > stop ) stop = start; if( stop == start ){ for( i = start * 3; i < 192 * 3; i++ ) xr_org[gr][ch][i] = 0; } else { for( j = 0; j < 3; j++ ){ for( i = start; i < 192; i++ ){ int i0 = 3*i+j; if (i<=stop) xr_org[gr][ch][i0]*=cos((PI/2)*(i-start)/(stop-start)); else xr_org[gr][ch][i0] = 0; } } } }else{ start = lowpass1 * 576; stop = lowpass2 * 576; if( start > stop ) stop = start; if( start == stop ){ for( i = start; i < 576; i++ ) xr_org[gr][ch][i] = 0; } else { for( i = start; i < 576; i++ ){ if (i<=stop) xr_org[gr][ch][i] *= cos((PI/2)*(i-start)/(stop-start)); else xr_org[gr][ch][i] = 0; } } } } } }else /* lowpass > 0 の時は sfb21 は不要 */ /* 16kHz以上をカット */ if( sfb21 ){ #ifndef PEN_LPF for ( gr = 0; gr < gl.mode_gr; gr++ ){ int start; if( l3_side->gr[gr].ch[0].tt.block_type == 2 ){ start = scalefac_short[ SFB_SMAX-1 ] * 3; }else{ start = scalefac_long[ SFB_LMAX-1 ]; } for( ch = 0; ch < 2; ch++ ){ for( i = start; i < 192 * 3; i++ ){ xr_org[gr][ch][i] = 0; } } } #else /* PEN@海猫 追加 2000/03/11 */ { int mask_bound; int bindex; if( VBR ){ static const char vbrtoIndex[] = { 12, 12, 11, 11, 10, 9, 8, 7, 6, 5 }; bindex = vbrtoIndex[ VBR_q ] ; } else { bindex = l3_side->rate_idx; } if( gl.version == 0 ){ // MPEG2 if( gl.mode == MPG_MD_MONO ){ const signed char fqtbl_mono[] = { 3,3,2,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; mask_bound = fqtbl_mono [ bindex ]; } else { const signed char fqtbl_st[] = { 5,5,5,4,4,3,2,1,0,-1,-1,-1,-1,-1,-1 }; mask_bound = fqtbl_st[ bindex ]; } } else { // MPEG1 if( gl.mode == MPG_MD_MONO ){ const signed char fqtbl_mono[] = { 3,3,3,2,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; mask_bound = fqtbl_mono [ bindex ]; } else { const signed char fqtbl_st[] = { 5,5,5,4,4,3,2,1,1,0,-1,-1,-1,-1,-1,-1 }; mask_bound = fqtbl_st[ bindex ]; } } if( mask_bound >= 0 ){ for ( gr = 0; gr < gl.mode_gr; gr++ ){ int start; if( l3_side->gr[gr].ch[0].tt.block_type == 2 ){ start = scalefac_short[ SFB_SMAX-1 - mask_bound ] * 3; }else{ start = scalefac_long[ SFB_LMAX-1 - mask_bound ]; } for( i = start; i < 192 * 3; i++ ){ xr_org[gr][0][i] = xr_org[gr][1][i] = 0; } } } } #endif } /* inline gr_deco */ for( gr = 0; gr < gl.mode_gr; gr++ ){ for( ch = 0; ch < gl.stereo; ch++ ){ cod_info = (gr_info *) &(l3_side->gr[gr].ch[ch]); if( cod_info->block_type == SHORT_TYPE ){ cod_info->sfb_lmax = 0; /* No sb*/ cod_info->sfb_smax = 0; }else{ /* MPEG 1 では最後のscalefactorは使わない */ cod_info->sfb_lmax = SFB_LMAX - 1; cod_info->sfb_smax = SFB_SMAX - 1; /* No sb */ } } } } /* endo fo iteration_init */ /* Calculate the allowed distortion for each scalefactor band, as determined by the psychoacoustic model. xmin(sb) = ratio(sb) * en(sb) / bw(sb) */ /* l3_xminはここで初期化される */ static void (*calc_xmin_long)( float *xr, float *l3_xmin, float *ratio ); /* 2300clk on K6-III 350 */ void calc_xmin_long_3DN( float *xr, float *l3_xmin, float *ratio ); //void calc_xmin_long_SSE( float *xr, float *l3_xmin, float *ratio ); /* 4300clk on K6-III 350 */ static void calc_xmin_long_C( float *xr, float *l3_xmin, float *ratio ){ int i, sfb; float en0; i = 0; /* = scalefac_long[0] */ for( sfb = 0; sfb < SFB_LMAX - 1; sfb++ ){ en0 = 0; for( ; i < scalefac_long[ sfb+1 ]; i += 2 ){ en0 += xr[i] * xr[i] + xr[i+1] * xr[i+1]; } en0 = en0 * masking_lower * scalefac_longR[sfb] * ratio[sfb]; l3_xmin[sfb] = Max( ATH_l[sfb], en0 ); } } void setup_calc_xmin_long( int useUNIT ){ if( useUNIT & t3DN ){ SETUP_DSP("use:calc_xmin_long_3DN\n"); calc_xmin_long = calc_xmin_long_3DN; }else { SETUP_DSP("use:calc_xmin_long_C\n"); calc_xmin_long = calc_xmin_long_C; } } static void calc_xmin( float xr[576], ratio_t *ratio, gr_info *cod_info, ratio_t *l3_xmin, int gr, int ch ) { int end, sfb, i; float en0, en1, en2, bw; D192_3 *xr_s = (D192_3 *) xr; i = scalefac_short[cod_info->sfb_smax]; for( sfb = cod_info->sfb_smax; sfb < SFB_SMAX - 1; sfb++ ){ end = scalefac_short[ sfb + 1 ]; bw = masking_lower * scalefac_shortR[sfb]; /* = masking_lower / ( end - i ) */ en0 = en1 = en2 = 0; for( ; i < end; i++ ){ /* こちらには殆んどこないのでコードサイズを増やす必要はない */ en0 += (*xr_s)[i][0] * (*xr_s)[i][0]; en1 += (*xr_s)[i][1] * (*xr_s)[i][1]; en2 += (*xr_s)[i][2] * (*xr_s)[i][2]; } l3_xmin->s[gr][ch][sfb][0] = Max( ATH_s[sfb], ratio->s[gr][ch][sfb][0] * en0 * bw ); l3_xmin->s[gr][ch][sfb][1] = Max( ATH_s[sfb], ratio->s[gr][ch][sfb][1] * en1 * bw ); l3_xmin->s[gr][ch][sfb][2] = Max( ATH_s[sfb], ratio->s[gr][ch][sfb][2] * en2 * bw ); } /* cod_info->sfb_lmax は 0 でなければ SFB_LMAX */ if( cod_info->sfb_lmax ) calc_xmin_long( xr, l3_xmin->l[gr][ch], ratio->l[gr][ch] ); } /* end of calc_min */ /* * lame3.28のinit_outer_loopとinit_outer_loop_dualを統合 * ここで初期化されるもの * l3_xmin, scalefac */ static void init_outer_loop( float xr[576], float xr_org[576], ratio_t *l3_xmin, III_scalefac_t *scalefac, int gr, III_side_info_t *l3_side, ratio_t *ratio, int ch, int flag) { gr_info *cod_info; cod_info = &l3_side->gr[gr].ch[ch].tt; /* flagはlame3.28の*_dualの時convert_psy,そうでないとき 0 */ if( flag ){ calc_xmin( xr_org, ratio, cod_info, l3_xmin, gr, ch ); }else{ calc_xmin( xr, ratio, cod_info, l3_xmin, gr, ch ); } memset( &scalefac->l[gr][ch][0], 0, sizeof(int) * SFB_LMAX ); memset( &scalefac->s[gr][ch][0][0], 0, sizeof(int) * SFB_SMAX * 3 ); cod_info->slen[0] = 0; cod_info->slen[1] = 0; cod_info->slen[2] = 0; cod_info->slen[3] = 0; cod_info->sfbTblSub = &sfbBlkSub[0][0][0]; cod_info->quantizerStepSize = 0; cod_info->count1table_select= 0; cod_info->count1 = 0; cod_info->big_values = 0; cod_info->part2_3_length = 0; cod_info->scalefac_compress = 0; cod_info->table_select[0] = 0; cod_info->table_select[1] = 0; cod_info->table_select[2] = 0; cod_info->region0_count = 0; cod_info->region1_count = 0; cod_info->preflag = 0; cod_info->scalefac_scale = 0; cod_info->part2_length = 0; cod_info->adr1 = 0; cod_info->adr2 = 0; cod_info->adr3 = 0; } /* end of init_outer_loop() */ static int inner_loop( float *xrpow, int *l3_enc, int max_bits, gr_info *cod_info ) { int bits; cod_info->quantizerStepSize--; do{ cod_info->quantizerStepSize++; bits = quantize_xrpow( xrpow, l3_enc, cod_info ); bits = ( bits <= 8191 + 14 ) ? count_bits( l3_enc, cod_info ) : 100000; }while( bits > max_bits ); return bits; } /* by kei */ static int count_nz_xr_C(float xr[]) { int i; int ct =0; int* p = (int*)xr; for( i = 0; i < 576; i++ ){ if( *p & 0x7FFFFFFF )ct++; /* fabs(*p) > 0 */ p++; } return ct; } int count_nz_xr_3DN(float xr[]); int count_nz_xr_MMX(float xr[]); #ifdef USE_E3DN int count_nz_xr_E3DN(float xr[]); #endif void setup_count_nz_xr(int useUNIT){ #ifdef USE_E3DN if( useUNIT & tE3DN ){ SETUP_DSP("use:count_nz_xr_E3DN\n"); count_nz_xr = count_nz_xr_E3DN; }else #endif if( useUNIT & t3DN ){ SETUP_DSP("use:count_nz_xr_3DN\n"); count_nz_xr = count_nz_xr_3DN; }else // if( useUNIT & tSSE ){ // SETUP_DSP("use:count_nz_xr_SSE\n"); // count_nz_xr = count_nz_xr_SSE; // }else if( useUNIT & tMMX ){ SETUP_DSP("use:count_nz_xr_MMX\n"); count_nz_xr = count_nz_xr_MMX; }else { SETUP_DSP("use:count_nz_xr_C\n"); count_nz_xr = count_nz_xr_C; } } static int scale_bitcount_hi( III_scalefac_t *scalefac, gr_info *cod_info, int gr, int ch ) { int k, max_slen1 = 0, max_slen2 = 0; int *tab; static int slen1_tab[16] = {0,18,36,54,54,36,54,72,54,72,90,72,90,108,108,126}; static int slen2_tab[16] = {0,10,20,30,33,21,31,41,32,42,52,43,53,63,64,74}; if( cod_info->block_type == SHORT_TYPE ){ int (*fac)[3] = scalefac->s[gr][ch]; tab = slen1_tab; for ( k = 0; k < 6; k++ ){ if( fac[k][0] > max_slen1 ) max_slen1 = fac[k][0]; if( fac[k][1] > max_slen1 ) max_slen1 = fac[k][1]; if( fac[k][2] > max_slen1 ) max_slen1 = fac[k][2]; } for( k = 6; k < SFB_SMAX - 1; k++ ){ if( fac[k][0] > max_slen2 ) max_slen2 = fac[k][0]; if( fac[k][1] > max_slen2 ) max_slen2 = fac[k][1]; if( fac[k][2] > max_slen2 ) max_slen2 = fac[k][2]; } }else{ int *fac = scalefac->l[gr][ch]; tab = slen2_tab; for( k = 0; k < 11; k++ ){ if( fac[k] > max_slen1 ) max_slen1 = fac[k]; } for( k = 11; k < 21; k++ ){ if( fac[k] > max_slen2 ) max_slen2 = fac[k]; } } /* from Takehiro TOMINAGA 10/99 * loop over *all* posible values of scalefac_compress to find the * one which uses the smallest number of bits. ISO would stop * at first valid index */ cod_info->part2_length = 10000; for( k = 0; k < 16; k++ ){ static const int slen1[16] = {1,1,1,1,8,2,2,2,4,4,4,8,8,8,16,16}; static const int slen2[16] = {1,2,4,8,1,2,4,8,2,4,8,2,4,8,4,8}; if( max_slen1 < slen1[k] && max_slen2 < slen2[k] && cod_info->part2_length > tab[k] ){ cod_info->part2_length = tab[k]; cod_info->scalefac_compress = k; return 0; } } return 2; } /* scale_bitcount */ static int scale_bitcount_lsf( III_scalefac_t *scalefac, gr_info *cod_info, int gr, int ch ) { int over; int i, k, sfb, max_sfac[4]; const unsigned *partition_table; if( cod_info->block_type == SHORT_TYPE ){ int (*fac)[3] = scalefac->s[gr][ch]; partition_table = &sfbBlkSub[cod_info->preflag][1][0]; for( sfb = 0, k = 0; k < 4; k++ ){ int max = 0; for( i = 0; i < partition_table[k] / 3; i++, sfb++ ){ if( fac[sfb][0] > max ) max = fac[sfb][0]; if( fac[sfb][1] > max ) max = fac[sfb][1]; if( fac[sfb][2] > max ) max = fac[sfb][2]; } max_sfac[k] = max; } }else{ int *fac = scalefac->l[gr][ch]; partition_table = &sfbBlkSub[cod_info->preflag][0][0]; for( sfb = 0, k = 0; k < 4; k++ ){ int max = 0; for( i = 0; i < partition_table[k]; i++, sfb++ ){ if( fac[sfb] > max ) max = fac[sfb]; } max_sfac[k] = max; } } for(over = 0, k = 0; k < 4; k++){ static const unsigned max_sfacTbl[2][4] = { {4, 4, 3, 3}, {3, 2, 0, 0}, }; if(max_sfac[k] > max_sfacTbl[cod_info->preflag][k]) over++; } if(!over){ /* Since no bands have been over-amplified, we can set scalefac_compress and slen[] for the formatter */ static const int log2tab[] = {0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 }; unsigned slen1, slen2, slen3, slen4; cod_info->sfbTblSub = partition_table; for( k = 0; k < 4; k++ ) cod_info->slen[k] = log2tab[max_sfac[k]]; /* set scalefac_compress */ slen1 = cod_info->slen[0]; slen2 = cod_info->slen[1]; slen3 = cod_info->slen[2]; slen4 = cod_info->slen[3]; if(cod_info->preflag){ /* == 0 or 1 */ cod_info->scalefac_compress = 500 + (slen1 * 3) + slen2; }else{ cod_info->scalefac_compress = (((slen1 * 5) + slen2) << 4) + (slen3 << 2) + slen4; } /* from Takehiro TOMINAGA 10/99 */ for( i = 0, k = 0; k < 4; k++ ){ i += cod_info->slen[k] * cod_info->sfbTblSub[k]; } cod_info->part2_length = i; } return over; } /* scale_bitcount_lsf */ static int (*scale_bitcount)(III_scalefac_t *scalefac, gr_info *cod_info, int gr, int ch); void InitLoop(void) { int i; firstcall = 1; OldValue = -30; /* bin_search_StepSize2 から */ masking_lower = 1; calc_noise_init(); for( i = 0; i < SFB_SMAX - 1; i++ ){ scalefac_shortR[i] = 1.0 / ( scalefac_short[i+1] - scalefac_short[i] ); } for( i = 0; i < SFB_LMAX - 1; i++ ){ scalefac_longR[i] = 1.0 / ( scalefac_long[i+1] - scalefac_long[i] ); } scale_bitcount = (gl.mode_gr == 2) ? scale_bitcount_hi : scale_bitcount_lsf; resv.size = 0; /* from old reserv.h */ resv.max = 0; } static int loop_break( III_scalefac_t *scalefac, gr_info *cod_info, int gr, int ch ) { int sfb; int *fac_l; int (*fac_s)[3]; fac_l = scalefac->l[gr][ch]; for( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ){ if( !*fac_l++ ) return 0; } fac_s = scalefac->s[gr][ch]; for( sfb = cod_info->sfb_smax; sfb < 12; sfb++ ){ if( !fac_s[sfb][0] || !fac_s[sfb][1] || !fac_s[sfb][2] ) return 0; } return 1; } /* loop_break */ /* * 旧outer_loopから stereo == 2, convert_psy == TRUE として独立 * この中で初期化されるもの * l3_enc,best_over,xr * * best_overは外部とのやりとりが無いのでこの中の変数とする */ static void outer_loop_dual( float xr[2][576], float xr_org[2][576], int mean_bits, ratio_t *l3_xmin, int l3_enc[2][576], III_scalefac_t *scalefac, int gr, III_side_info_t *l3_side, ratio_t *ratio, float pe[2], float ms_ener_ratio[2]) { int notdone[2]={0,0},count[2]; int targ_bits[2],real_bits[2]; int scalesave_l[2][CBLIMIT], scalesave_s[2][CBLIMIT][3]; int save_preflag[2], save_compress[2]; float distort[4][CBLIMIT]; /* fast_modeでは使わない */ char __xrpow[2*576*sizeof(float)+16]; float (*xrpow)[576] = (float (*)[576])( (int)(__xrpow+15) & -16 ); /* OK */ /* *_noiseはfast_mode時使わない */ float max_noise[2]; float over_noise[2]; float tot_noise[2]; float best_max_noise[2]; float best_over_noise[2]; float best_tot_noise[2]; int save_l3_enc[2][576]; int save_real_bits[2]; int iteration, ch; int best_over[2]; gr_info save_cod_info[2]; gr_info *cod_info[2]; cod_info[0] = &l3_side->gr[gr].ch[0].tt; cod_info[1] = &l3_side->gr[gr].ch[1].tt; if( convert_mdct ){ ms_convert( xr, xr_org ); }else{ memcpy(xr, xr_org, sizeof(float) * 2 * 576 ); } init_outer_loop(xr[0], xr_org[0], l3_xmin, scalefac, gr, l3_side, ratio, 0, 1 ); init_outer_loop(xr[1], xr_org[1], l3_xmin, scalefac, gr, l3_side, ratio, 1, 1 ); for( ch = 0; ch < 2; ch++ ){ int ct; ct = count_nz_xr(&xr[ch][0]); count[ch] = ct; if( ct ){ best_over[ch] = 100; notdone[ch] = 1; }else{ best_over[ch] = notdone[ch] = 0; /* notdone[ch]=0の時はここでl3_encの初期化 */ memset( l3_enc[ch], 0, sizeof(int) * 576 ); } } /* 各チャンネルにbitを集める */ { int add_bits[2], bits; int tbits, extra_bits; ResvMaxBits2(mean_bits, &tbits, &extra_bits); targ_bits[0] = targ_bits[1] = tbits / 2; bits = 0; { float temp; temp = Max( pe[0], pe[1] ); temp -= 750; if( temp < 0 ){ temp = 0; }else{ temp *= 0.7142857143; /* =1/1.4 */ } if( cod_info[0]->block_type == 2 && temp < 500 ){ add_bits[0] = 500; }else{ add_bits[0] = temp; } if( cod_info[1]->block_type == 2 && temp < 500 ){ add_bits[1] = 500; }else{ add_bits[1] = temp; } bits += add_bits[0] + add_bits[1]; } for( ch = 0; ch < 2; ch++ ){ if( bits > extra_bits ){ add_bits[ch] = (extra_bits*add_bits[ch])/bits; } targ_bits[ch] += add_bits[ch]; } extra_bits -= add_bits[0]; extra_bits -= add_bits[1]; } /* 両側チャンネルを125 bits以下には減らさない */ if( reduce_sidechannel ){ float fac; fac = 0.5 - ms_ener_ratio[gr]; if( fac > 0 ){ fac *= (0.33 * 2) * targ_bits[1]; if( targ_bits[1] - fac > 125 ){ targ_bits[0] += fac; targ_bits[1] -= fac; } } #ifdef PEN_MS else { if( targ_bits[1] >= 125 ){ targ_bits[0] += targ_bits[1] - 125; targ_bits[1] = 125; } } #endif } /* 1つのチャンネルに沢山のbitを割り当てない */ { int max_bits; max_bits = ( mean_bits > 5791 ) ? 4095 : ( mean_bits / 2 + 1200 ); if( targ_bits[0] > max_bits )targ_bits[0] = max_bits; if( targ_bits[1] > max_bits )targ_bits[1] = max_bits; } /* BEGIN MAIN LOOP */ iteration = 0; while( notdone[0] || notdone[1] ){ int bits_found[2]; int over[2]; int better[2]; /* fast_mode時は使わない */ iteration++; if( iteration == 1 ){ /* compute initial quantization step */ for( ch = 0; ch < 2; ch++ ){ if( !notdone[ch] ) continue; calc_pow075( xr[ch], xrpow[ch] ); /* l3_encはこの関数内で初期化 */ bits_found[ch] = bin_search_StepSize2( targ_bits[ch], l3_enc[ch], xrpow[ch], cod_info[ch] ); } } for( ch = 0; ch < 2; ch++ ){ int huff_bits; if( !notdone[ch] )continue; huff_bits = targ_bits[ch] - cod_info[ch]->part2_length; if( huff_bits < 0 ){ notdone[ch] = 0; }else{ if( iteration == 1 && bits_found[ch] <= huff_bits ){ real_bits[ch] = bits_found[ch]; }else{ if( iteration == 1 ){ cod_info[ch]->quantizerStepSize++; } real_bits[ch] = inner_loop( xrpow[ch], l3_enc[ch], huff_bits, cod_info[ch] ); } } } if( fast_mode ){ over[0] = over[1] = 0; }else{ /* mid/side coefficiets, l/r thresholds */ /* over, distortの一部, *_noiseはここで設定される */ calc_noise2( xr, l3_enc, cod_info, distort, l3_xmin,gr,over,over_noise,tot_noise,max_noise); if( iteration == 1 ){ better[0] = better[1] = 1; }else{ /* betterはここで設定される */ quant_compare_dual(better,notdone,best_over,best_over_noise,over,over_noise); } } /* save data so we can restore this quantization later */ for( ch = 0; ch < 2; ch++ ){ if( !fast_mode ){ if( !better[ch] )continue; best_over[ch] = over[ch]; best_over_noise[ch] = over_noise[ch]; best_tot_noise[ch] = tot_noise[ch]; best_max_noise[ch] = max_noise[ch]; } if( !notdone[ch] )continue; /* CBLIMIT は 配列の大きさより1小さいが間違いではないらしい(?) */ memcpy( scalesave_l[ch], scalefac->l[gr][ch], CBLIMIT * sizeof(int) ); memcpy( scalesave_s[ch], scalefac->s[gr][ch], SFB_SMAX * 3 * sizeof(int) ); save_preflag[ch] = cod_info[ch]->preflag; save_compress[ch] = cod_info[ch]->scalefac_compress; memcpy(save_l3_enc[ch],l3_enc[ch],sizeof(l3_enc[ch])); memcpy(&save_cod_info[ch],cod_info[ch],sizeof(save_cod_info[ch])); save_real_bits[ch] = real_bits[ch]; } notdone[0] &= over[0] || over[1]; /* notdone[i] ={0,1}を仮定 */ notdone[1] &= over[0] || over[1]; if( !fast_mode ){ for( ch = 0; ch < 2; ch ++ ){ if( !notdone[ch] )continue; if( !preemphasis( xr[ch], xrpow[ch], l3_xmin, gr, ch, l3_side, distort ) ){ amp_scalefac_bands( xr[ch], xrpow[ch], l3_xmin, l3_side, scalefac, gr, ch, iteration, distort ); } } } /* check to make sure we have not amplified too much */ for( ch = 0; ch < 2; ch++ ){ int stat; if( !notdone[ch] )continue; stat = loop_break(scalefac, cod_info[ch], gr, ch); if(!stat) stat = scale_bitcount(scalefac, cod_info[ch], gr, ch); notdone[ch] = !stat; } } /* done with main iteration */ /* restore some data */ for( ch = 0; ch < gl.stereo; ch++ ){ if( !count[ch] )continue; cod_info[ch]->preflag = save_preflag[ch]; cod_info[ch]->scalefac_compress = save_compress[ch]; memcpy( scalefac->l[gr][ch], scalesave_l[ch], CBLIMIT * sizeof(int) ); memcpy( scalefac->s[gr][ch], scalesave_s[ch], SFB_SMAX * 3 * sizeof(int) ); real_bits[ch] = save_real_bits[ch]; memcpy(l3_enc[ch],save_l3_enc[ch],sizeof(l3_enc[ch])); memcpy(cod_info[ch],&save_cod_info[ch],sizeof(save_cod_info[ch])); scale_bitcount(scalefac, cod_info[ch], gr, ch); cod_info[ch]->part2_3_length = cod_info[ch]->part2_length + real_bits[ch]; } /* finish up */ for( ch = 0; ch < gl.stereo; ch ++ ){ ResvAdjust(cod_info[ch]->part2_3_length, mean_bits); cod_info[ch]->global_gain = cod_info[ch]->quantizerStepSize + 210; } } /* end of outer_loop_dual() */ /* * l3_encはここで初期化 * 00/01/05 sloppy=0 とは限らない ( if VBR ) * 00/01/11 best_noiseは VBRの時のみ使用 */ static float outer_loop( float xr[576], int targ_bits, float best_noise[4], int sloppy, ratio_t *l3_xmin, int l3_enc[2][2][576], III_scalefac_t *scalefac,int gr, III_side_info_t *l3_side, ratio_t *ratio, float ms_ener_ratio, int ch ) { int iteration; int count = 0, bits_found = 0; int real_bits = 0; int scalesave_l[SFB_LMAX], scalesave_s[SFB_SMAX][3]; float unaligned_xrpow[576+4]; float (*xrpow) = (float *)(((int)unaligned_xrpow + 15) & ~15); float distort[4][CBLIMIT]; int save_l3_enc[576]; int save_real_bits = 0; int save_preflag = 0, save_compress = 0; int better; int over = 0; float max_noise = -999; float over_noise = 0; float tot_noise = 0; int best_over = 0; float best_over_noise = 0; float best_max_noise = 0; /* ext_malX=0の時は使われない */ float best_tot_noise = 0; /* ext_malX=0の時は使われない */ gr_info save_cod_info; gr_info *cod_info; int notdone=1; cod_info = &l3_side->gr[gr].ch[ch].tt; /* lame の init_outer_loop{"",dual}は最後の引き数を使って統合した */ init_outer_loop(xr, NULL, l3_xmin,scalefac,gr,l3_side,ratio,ch,0); best_over = 100; count = count_nz_xr(&xr[0]); if( count == 0 ){ best_over = 0; notdone = 0; /* notdone=0の時ここでl3_enc初期化 */ memset( l3_enc[gr][ch], 0, sizeof(int) * 576 ); } /* BEGIN MAIN LOOP */ iteration = 0; while( notdone ){ int huff_bits; iteration++; if( iteration == 1 ){ calc_pow075( xr, xrpow ); /* notdone!=0の時ここでl3_enc初期化 */ bits_found = bin_search_StepSize2( targ_bits, l3_enc[gr][ch], xrpow, cod_info ); } /* inner_loop starts with the initial quantization step computed above * and slowly increases until the bits < huff_bits. * Thus is it important not to start with too large of an inital * quantization step. Too small is ok, but inner_loop will take longer */ huff_bits = targ_bits - cod_info->part2_length; if( huff_bits < 0 ){ notdone = 0; }else{ /* if this is the first iteration, see if we can reuse the quantization * computed in bin_search_StepSize above */ if( iteration == 1 && bits_found <= huff_bits ){ real_bits = bits_found; }else{ if( iteration == 1 ){ cod_info->quantizerStepSize++; } real_bits = inner_loop( xrpow, l3_enc[gr][ch], huff_bits, cod_info ); } } if( notdone ){ if( fast_mode ){ over = 0; better = 1; }else{ over = calc_noise1( xr, l3_enc[gr][ch], cod_info, distort, l3_xmin,gr,ch, &over_noise, &tot_noise, &max_noise); if( iteration == 1 ){ better = 1; }else{ better = over < best_over || (over == best_over && over_noise < best_over_noise); } } /* save data so we can restore this quantization later */ if( better ){ if( !fast_mode ){ best_over = over; best_max_noise = max_noise; best_over_noise = over_noise; best_tot_noise = tot_noise; } if( !sloppy ){ memcpy( scalesave_l, scalefac->l[gr][ch], CBLIMIT * sizeof(int) ); memcpy( scalesave_s, scalefac->s[gr][ch], SFB_SMAX * 3 * sizeof(int) ); save_preflag = cod_info->preflag; save_compress = cod_info->scalefac_compress; memcpy(save_l3_enc,l3_enc[gr][ch],sizeof(l3_enc[gr][ch])); memcpy(&save_cod_info,cod_info,sizeof(save_cod_info)); save_real_bits = real_bits; } } } if(!over) notdone = 0; /* in sloppy mode, as soon as we know we can do better than targ_noise, * quit. This is used for the inital VBR bin search. Turn it off for * final (optimal) quantization */ #ifdef USE_VBR if( sloppy && notdone ){ notdone = !VBR_compare((int)targ_noise[0],targ_noise[3],targ_noise[2], targ_noise[1],over,tot_noise,over_noise,max_noise); } #endif /* USE_VBR */ if( notdone && !fast_mode ){ if( !preemphasis(xr,xrpow,l3_xmin,gr,ch,l3_side,distort) ){ notdone = amp_scalefac_bands( xr, xrpow, l3_xmin, l3_side, scalefac, gr, ch, iteration,distort); } } if( notdone ){ int status; status = loop_break( scalefac, cod_info, gr, ch ); if(!status) status = scale_bitcount(scalefac, cod_info, gr, ch); notdone = !status; } } /* done with main iteration */ if( count && !sloppy ){ cod_info->preflag = save_preflag; cod_info->scalefac_compress = save_compress; memcpy( scalefac->l[gr][ch], scalesave_l, sizeof(int) * CBLIMIT ); memcpy( scalefac->s[gr][ch][0], scalesave_s[0], sizeof(int) * 3 * SFB_SMAX ); real_bits = save_real_bits; memcpy( l3_enc[gr][ch], save_l3_enc, sizeof(l3_enc[gr][ch]) ); memcpy( cod_info, &save_cod_info, sizeof(save_cod_info) ); scale_bitcount(scalefac, cod_info, gr, ch); cod_info->part2_3_length = cod_info->part2_length + real_bits; } cod_info->global_gain = cod_info->quantizerStepSize + 210; #if defined(USE_VBR) if( VBR ){ best_noise[0] = best_over; best_noise[1] = best_max_noise; best_noise[2] = best_over_noise; best_noise[3] = best_tot_noise; } #endif return best_over; } /* endof outer_loop() */ static void set_l3_enc_sign_C(float xr[], int l3_enc[]) { int *pi = l3_enc; int *p = (int *)xr; int i; for( i = 0; i < 576; i++ ){ if( (*p & 0x80000000) && (*pi > 0) )*pi = -*pi; p++; pi++; } } void set_l3_enc_sign_3DN(float xr[], int l3_enc[]); void set_l3_enc_sign_MMX(float xr[], int l3_enc[]); //void set_l3_enc_sign_SSE(float xr[], int l3_enc[]); //void set_l3_enc_sign_NONE(float xr[], int l3_enc[]); #ifdef USE_E3DN void set_l3_enc_sign_E3DN(float xr[], int l3_enc[]); #endif void setup_set_l3_enc_sign(int useUNIT){ #ifdef USE_E3DN if( useUNIT & tE3DN ){ SETUP_DSP("use:set_l3_enc_sign_E3DN\n"); set_l3_enc_sign = set_l3_enc_sign_E3DN; }else #endif if( useUNIT & t3DN ){ SETUP_DSP("use:set_l3_enc_sign_3DN\n"); set_l3_enc_sign = set_l3_enc_sign_3DN; }else // if( useUNIT & tSSE ){ // SETUP_DSP("use:set_l3_enc_sign_SSE\n"); // set_l3_enc_sign = set_l3_enc_sign_SSE; // }else if( useUNIT & tMMX ){ SETUP_DSP("use:set_l3_enc_sign_MMX\n"); set_l3_enc_sign = set_l3_enc_sign_MMX; }else { SETUP_DSP("use:set_l3_enc_sign_C\n"); set_l3_enc_sign = set_l3_enc_sign_C; // SETUP_DSP("use:set_l3_enc_sign_NONE\n"); // set_l3_enc_sign = set_l3_enc_sign_NONE; } } /* ここではVBRは使われない */ /* * ここで初期化される変数 * l3_enc, l3_xmin, l3_sideの一部, scalefac */ void iteration_loop( float pe[][2], float ms_ener_ratio[2], float xr_org[2][2][576], ratio_t *ratio, III_side_info_t *l3_side, int l3_enc[2][2][576], III_scalefac_t *scalefac ) { ratio_t l3_xmin; int bitsPerFrame; int mean_bits; int ch, gr; float unaligned_xr[2*2*576+4]; float (*xr)[2][576] = (float (*)[2][576])(((int)unaligned_xr + 15) & ~15); iteration_init( xr_org, l3_side ); getframebits(&bitsPerFrame,&mean_bits,l3_side->rate_idx,l3_side->padding); ResvFrameBegin( mean_bits, bitsPerFrame ); for( gr = 0; gr < gl.mode_gr; gr++ ){ /* convert_psyのときはstereo=2 */ if( convert_psy ){ /* dual channel version can quantize Mid/Side channels with L/R * maskings (by constantly reconstructing L/R data). Used before we * we had proper mid/side maskings. */ outer_loop_dual( xr[gr], xr_org[gr], mean_bits, &l3_xmin,l3_enc[gr], scalefac,gr, l3_side, ratio, pe[gr], ms_ener_ratio); }else{ int targ_bits[2]; /* copy data to be quantized into xr */ if( convert_mdct ){ ms_convert( xr[gr], xr_org[gr] ); }else{ // memcpy( xr[gr], xr_org[gr], sizeof(float)*2*576 ); // コピーせんでも良いと思う。 xr = xr_org; // そうだね。 xr = xr_org; } on_pe( pe[gr], l3_side, targ_bits, mean_bits, gr ); if( reduce_sidechannel ){ reduce_side( targ_bits, ms_ener_ratio[gr], mean_bits ); } for( ch = 0; ch < gl.stereo; ch++ ){ gr_info *cod_info; outer_loop( xr[gr][ch], targ_bits[ch], NULL, 0, &l3_xmin,l3_enc, scalefac,gr, l3_side, ratio, ms_ener_ratio[gr],ch); cod_info = &l3_side->gr[gr].ch[ch].tt; ResvAdjust(cod_info->part2_3_length, mean_bits); } } } /* set the sign of l3_enc */ for( gr = 0; gr < gl.mode_gr; gr++ ){ for( ch = 0; ch < gl.stereo; ch++ ){ set_l3_enc_sign(&xr[gr][ch][0], &l3_enc[gr][ch][0]); } } l3_side->resvDrain = ResvFrameEnd(mean_bits); } /* end of iteration_loop */ #ifdef USE_VBR void VBR_iteration_loop( float pe[2][2], float ms_ener_ratio[2], float xr_org[2][2][576], ratio_t *ratio, III_side_info_t *l3_side, int l3_enc[2][2][576], III_scalefac_t *scalefac ) { ratio_t l3_xmin; int mean_bits; int ch, gr; int frameBits[15]; int min_mean_bits = 0; float noise[4]; float __xr_save[576+4]; float *xr_save = (float *)(( (int)__xr_save + 15 ) & -16 ); float masking_lower_db; int save_bits[2][2], used_bits=0, bits; int idx; float unaligned_xr[2*2*576+4]; float (*xr)[2][576] = (float (*)[2][576])(( (int)unaligned_xr + 15) & -16); iteration_init( xr_org, l3_side ); /******************************************************************* * how many bits are available for each bitrate? *******************************************************************/ for( idx = VBR_min_rate_idx; idx <= VBR_max_rate_idx; idx++ ){ mean_bits = mean_bits_table[idx][l3_side->padding]; if( idx == VBR_min_rate_idx && gl.stereo == 2 ){ min_mean_bits = mean_bits >>1; } frameBits[idx]= ResvFrameBegin( mean_bits, bitsPerFrame_table[idx][l3_side->padding]); } l3_side->rate_idx = VBR_max_rate_idx; /******************************************************************* * how many bits would we use of it? *******************************************************************/ for( gr = 0; gr < gl.mode_gr; gr++){ int num_chan = gl.stereo; /* determine quality based on mid channel only */ if( reduce_sidechannel ) num_chan = 1; /* copy data to be quantized into xr */ if( convert_mdct ){ ms_convert(xr[gr],xr_org[gr]); }else{ memcpy(xr[gr],xr_org[gr],sizeof(float)*2*576); } for( ch = 0; ch < num_chan; ch++){ gr_info *cod_info; int dbits, this_bits, min_bits, max_bits; /****************************************************************** * find smallest number of bits for an allowable quantization ******************************************************************/ memcpy(xr_save,xr[gr][ch],sizeof(float)*576); cod_info = &l3_side->gr[gr].ch[ch].tt; min_bits = Max(125,min_mean_bits); if( cod_info->block_type == SHORT_TYPE ){ min_bits += Max(1100,pe[gr][ch]); min_bits = Min(min_bits,1800); } max_bits = 1200 + frameBits[VBR_max_rate_idx]/(gl.stereo*gl.mode_gr); max_bits = Min(max_bits, 2500); max_bits = Max(max_bits, min_bits); /* in the case we will not find any better, we allocate max_bits */ save_bits[gr][ch] = max_bits; dbits = ( max_bits - min_bits ) >>2; this_bits = ( max_bits + min_bits ) >>1; /* bin search to within +/- 10 bits of optimal */ do{ int better; float fac; masking_lower_db = -10 + 2 * VBR_q; fac = 2.526315789e-3 * this_bits - 6.315789474; masking_lower_db += fac; masking_lower = pow(10.0, masking_lower_db * 0.1); /* VBR will look for a quantization which has better values * then those specified below.*/ memcpy(xr[gr][ch],xr_save,sizeof(float)*576); outer_loop( xr[gr][ch], this_bits, noise, 1,&l3_xmin, l3_enc, scalefac,gr, l3_side, ratio, ms_ener_ratio[gr], ch); better=VBR_compare((int)targ_noise[0],targ_noise[3],targ_noise[2], targ_noise[1],(int)noise[0],noise[3],noise[2],noise[1]); if( better ){ save_bits[gr][ch] = this_bits; this_bits -= dbits; }else{ this_bits += dbits; } dbits >>=1; }while( dbits > 10 ); used_bits += save_bits[gr][ch]; } /* ch */ } /* gr */ if( reduce_sidechannel ){ /* number of bits needed was found for MID channel above. Use formula * (fixed bitrate code) to set the side channel bits */ for( gr = 0; gr < gl.mode_gr; gr++ ){ float fac = 0.33 - 0.66 * ms_ener_ratio[gr]; save_bits[gr][1] = ( 1 - fac ) / ( 1 + fac ) * save_bits[gr][0]; used_bits += save_bits[gr][1]; } } /****************************************************************** * find lowest bitrate able to hold used bits ******************************************************************/ idx = VBR_min_rate_idx; for( ; idx < VBR_max_rate_idx; idx++ ){ if( used_bits <= frameBits[idx] ) break; } l3_side->rate_idx = idx; assert( idx <= VBR_max_rate_idx ); /******************************************************************* * calculate quantization for this bitrate *******************************************************************/ mean_bits = mean_bits_table[l3_side->rate_idx][l3_side->padding]; bits = ResvFrameBegin( mean_bits, bitsPerFrame_table[l3_side->rate_idx][l3_side->padding]); /* repartion available bits in same proportion */ if( used_bits > bits ){ for( gr = 0; gr < gl.mode_gr; gr++ ){ for( ch = 0; ch < gl.stereo; ch++){ save_bits[gr][ch]=(save_bits[gr][ch]*frameBits[l3_side->rate_idx])/used_bits; } } } assert(used_bits <= bits); for( gr = 0; gr < gl.mode_gr; gr++ ){ /* copy data to be quantized into xr */ if( convert_mdct ){ ms_convert(xr[gr],xr_org[gr]); }else{ memcpy(xr[gr],xr_org[gr],sizeof(float)*2*576); } for( ch = 0; ch < gl.stereo; ch++ ){ outer_loop( xr[gr][ch], save_bits[gr][ch], noise, 0, &l3_xmin,l3_enc, scalefac,gr, l3_side, ratio, ms_ener_ratio[gr], ch); } } /* update reservoir status after FINAL quantization/bitrate */ for(gr = 0; gr < gl.mode_gr; gr++){ ResvAdjust(l3_side->gr[gr].ch[0].tt.part2_3_length, mean_bits); if(gl.stereo == 2) ResvAdjust(l3_side->gr[gr].ch[1].tt.part2_3_length, mean_bits); } /* set the sign of l3_enc */ for( gr = 0; gr < gl.mode_gr; gr++ ){ set_l3_enc_sign(&xr[gr][0][0], &l3_enc[gr][0][0]); if( gl.stereo == 2 ) set_l3_enc_sign(&xr[gr][1][0], &l3_enc[gr][1][0]); } l3_side->resvDrain = ResvFrameEnd(mean_bits); } /* end of VBR_iteration_loop */ #endif /* USE_VBR */ /* * 00/01/08 * ret = ix_max()も同時に呼び出す * if( ret > 8191 + 14 ) return 100000; else return 0; */ int quantize_xrpow_FPU(float xr[576],int ix[576],gr_info *cod_info); int quantize_xrpow_3DN(float xr[576],int ix[576],gr_info *cod_info); int quantize_xrpow_SSE(float xr[576],int ix[576],gr_info *cod_info); #ifdef USE_E3DN int quantize_xrpow_E3DN(float xr[576],int ix[576],gr_info *cod_info); #endif void setup_quantize_xrpow(int useUNIT){ #ifdef USE_E3DN if(useUNIT & tE3DN){ SETUP_DSP("use:quantize_xrpow_E3DN\n"); quantize_xrpow=quantize_xrpow_E3DN; }else #endif if(useUNIT & t3DN){ SETUP_DSP("use:quantize_xrpow_3DN\n"); quantize_xrpow=quantize_xrpow_3DN; }else if(useUNIT & tSSE){ SETUP_DSP("use:quantize_xrpow_SSE\n"); quantize_xrpow=quantize_xrpow_SSE; }else{ SETUP_DSP("use:quantize_xrpow_FPU\n"); quantize_xrpow=quantize_xrpow_FPU; } } int ix_max_3DN( int ix[576], unsigned int begin, unsigned int end ); int ix_max_MMX( int ix[576], unsigned int begin, unsigned int end ); int ix_max_SSE( int ix[576], unsigned int begin, unsigned int end ); int ix_max_NONE( int ix[576], unsigned int begin, unsigned int end ); #ifdef USE_E3DN int ix_max_E3DN( int ix[576], unsigned int begin, unsigned int end ); #endif int ix_max_C( int ix[576], unsigned int begin, unsigned int end ){ int i, x, max = 0; for ( i = begin; i < end; i++ ){ x = ix[i]; if( x > max ) max = x; } return max; } void setup_ix_max(int useUNIT) { #ifdef USE_E3DN if(useUNIT & tE3DN){ SETUP_DSP("use:ix_max_E3DN\n"); ix_max=ix_max_E3DN; }else #endif if(useUNIT & t3DN){ SETUP_DSP("use:ix_max_3DN\n"); ix_max=ix_max_3DN; }else if(useUNIT & tSSE){ SETUP_DSP("use:ix_max_SSE\n"); ix_max=ix_max_SSE; }else if(useUNIT & tMMX){ SETUP_DSP("use:ix_max_MMX\n"); ix_max=ix_max_MMX; }else{ SETUP_DSP("use:ix_max_NONE\n"); ix_max=ix_max_NONE; } } /* 以下は count_bits()のための関数群 */ /* exported to huffmana.nas */ static const int choose_table_ptn[]={ /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ 0, 1, 2, 5, 7, 7,10,10,13,13,13,13,13,13,13,13, 16,17,17,18,18,18,18,19,19,19,19,19,19,19,19,20}; static int choose_tableH( int max ) { int i; { max -= 15; for (i = 15; i < 32; i++ ){ if( ht[i].linmax >= max ) return i; } } return 0; /* here if max >= 8192 (ht[24].linmax) cf. huffcode.tbl */ } #define choose_table( max ) ( max < 32 ) ? choose_table_ptn[max] : choose_tableH( max ) /* * 99/08/01 * count_bit()の置き換え * 99/08/14 * begin= 1 for( i = 16; i < 24; i++ ){ if( ht[i].linmax >= max ){ choice[0] = i; break; } } for( i = 24; i < 32; i++ ){ if( ht[i].linmax >= max ){ choice[1] = i; break; } } if( choice[0] ){ sum[0] = count_bit( ix, begin, end, choice[0] ); }else{ sum[0] = 0; } if( choice[1] ){ sum[1] = count_bit( ix, begin, end, choice[1] ); }else{ sum[1] = 0; } if( sum[1] < sum[0] ){ sum[0] = sum[1]; choice[0] = choice[1]; } if( choice[0] ){ *bits += sum[0]; } return choice[0]; } } static int bigv_bitcount( int ix[576], gr_info *cod_info ){ /* こっちには殆どこない 24000clk */ /* Within each scalefactor band, data is given for successive time windows, beginning with window 0 and ending with window 2. Within each window, the quantized values are then arranged in order of increasing frequency... */ int bits = 0; int sfb, window, line, start, end, max1, max2, x, y; int region1Start; int *pmax; I192_3 *ix_s; cod_info->table_select[0] = 0; cod_info->table_select[1] = 0; cod_info->table_select[2] = 0; region1Start = 12; max1 = max2 = 0; for( sfb = 0; sfb < 13; sfb++ ){ start = scalefac_short[ sfb ]; end = scalefac_short[ sfb+1 ]; if( start < region1Start ){ pmax = &max1; }else{ pmax = &max2; } for( window = 0; window < 3; window++ ){ for( line = start; line < end; line += 2 ){ x = ix[ (line * 3) + window ]; y = ix[ ((line + 1) * 3) + window ]; *pmax = *pmax > x ? *pmax : x; *pmax = *pmax > y ? *pmax : y; } } } cod_info->table_select[0] = choose_table(max1); cod_info->table_select[1] = choose_table(max2); /* Within each scalefactor band, data is given for successive time windows, beginning with window 0 and ending with window 2. Within each window, the quantized values are then arranged in order of increasing frequency... */ sfb = 0; ix_s = (I192_3 *) &ix[0]; for( ; sfb < 13; sfb++ ){ unsigned tableindex = 100; start = scalefac_short[ sfb ]; end = scalefac_short[ sfb+1 ]; if( start < 12 ){ tableindex = cod_info->table_select[0]; }else{ tableindex = cod_info->table_select[1]; } if( !tableindex ) continue; for( window = 0; window < 3; window++ ){ for( line = start; line < end; line += 2 ){ unsigned int code, ext; int cbits, xbits; int x = (*ix_s)[line][window]; int y = (*ix_s)[line + 1][window]; bits += HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits ); } } } return bits; } int count_bit_NONE(int ix[576],unsigned int start,unsigned int end,unsigned int table); int count_bit_MMX(int ix[576],unsigned int start,unsigned int end,unsigned int table); void setup_count_bit(int useUNIT){ if(useUNIT & tAMD && useUNIT & tFAMILY6 && useUNIT & tSPC1){ SETUP_DSP("use:count_bit_NONE\n"); count_bit = count_bit_NONE; } else if(useUNIT & tMMX){ SETUP_DSP("use:count_bit_MMX\n"); count_bit = count_bit_MMX; } else{ SETUP_DSP("use:count_bit_NONE\n"); count_bit=count_bit_NONE; } } int new_choose_table_MMX( int ix[576], unsigned int begin, unsigned int end, int *bits ); static int new_choose_table_NONE( int ix[576], unsigned int begin, unsigned int end, int *bits ); void setup_new_choose_table(int useUNIT) { /* * ベンチモードでは NONE の方が速いが 実際のエンコードでは MMX の方が速い on K7 * 分岐予測精度のなせる技か? */ if(useUNIT & tAMD && useUNIT & tFAMILY6 && useUNIT & tSPC1){ SETUP_DSP("use:new_choose_table_NONE\n"); new_choose_table = new_choose_table_NONE; } else if(useUNIT & tMMX){ SETUP_DSP("use:new_choose_table_MMX\n"); new_choose_table = new_choose_table_MMX; } else{ SETUP_DSP("use:new_choose_table_NONE\n"); new_choose_table = new_choose_table_NONE; } } /* * lame3.55に倣ってcalc_runlen と count1_bitcount を統合 00/01/16 * 速度的は全然変わらない */ int calc_runlen_count1_NONE( int *ix, gr_info *cod_info ); int calc_runlen_count1_CMOV( int *ix, gr_info *cod_info ); void setup_calc_runlen_count1(int useUNIT) { if(useUNIT & tCMOV){ SETUP_DSP("use:calc_runlen_count1_CMOV\n"); calc_runlen_count1 = calc_runlen_count1_CMOV; } else{ SETUP_DSP("use:calc_runlen_count1_NONE\n"); calc_runlen_count1 = calc_runlen_count1_NONE; } } /* * max=ix_max();を大きすぎるかどうかだけのために使うのなら * 途中で止めたって問題ない, 省略したっていいような気もする * 98/08/09 PENさんのところで調べたら駄目らしい * total 11000clk * 8191 + 14 は変更不可 * 00/01/05 分岐を分ける * MMXを使わないなら Takehiro ルーチンの方が速かった * 00/01/18 non MMXでかなりの高速化 * 00/03/03 subdivide のバグ取り & 高速化 */ static int count_bits( int *ix, gr_info *cod_info) { if( cod_info->block_type == SHORT_TYPE ){ cod_info->count1 = 0; cod_info->big_values = 288; cod_info->count1table_select = 1; /* from subdivide */ cod_info->region0_count = 8; cod_info->region1_count = 36; cod_info->adr1 = 36; cod_info->adr2 = 576; cod_info->adr3 = 0; return bigv_bitcount(ix,cod_info); }else{ int bits; int adr; int bigv; /* 99%こちら */ bits = calc_runlen_count1( ix, cod_info ); bigv = cod_info->big_values * 2; if( !cod_info->big_values ){ cod_info->region0_count = 0; cod_info->region1_count = 0; /* adr?は0とは限らない */ }else if( cod_info->window_switching_flag ){ cod_info->region0_count = 7; cod_info->region1_count = 13; cod_info->adr1 = scalefac_long[8]; cod_info->adr2 = bigv; cod_info->adr3 = 0; }else{ static const int region0[23]={0,0,0,0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6}; static const int region1[23]={0,0,0,0,0,1,1,1,2,2,3,3,4,4,4,5,5,6,6,6,7,7,7}; int i = 1; while( scalefac_long[i] < bigv ) i++; cod_info->region0_count = region0[i]; cod_info->adr1 = scalefac_long[ region0[i] + 1 ]; cod_info->region1_count = region1[i]; cod_info->adr2 = scalefac_long[ region0[i] + region1[i] + 2 ]; cod_info->adr3 = bigv; } cod_info->table_select[0] = cod_info->table_select[1] = cod_info->table_select[2] = 0; adr = Min( cod_info->adr1, cod_info->adr2 ); if( adr > 0 ){ cod_info->table_select[0] = new_choose_table( ix, 0, adr, &bits ); } if( cod_info->adr2 > cod_info->adr1 ){ cod_info->table_select[1] = new_choose_table( ix, cod_info->adr1, cod_info->adr2, &bits ); } if( bigv > cod_info->adr2 ){ cod_info->table_select[2] = new_choose_table( ix, cod_info->adr2, bigv, &bits ); } return bits; } } gogo239b/gogo_dll.rc100644 23421 144 6440 7220537347 13457 0ustar shigeousers//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // 日本語 resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) #ifdef _WIN32 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT #pragma code_page(932) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 2,3,9,0 PRODUCTVERSION 2,3,9,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x2bL #else FILEFLAGS 0x2aL #endif FILEOS 0x4L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "000004b0" BEGIN VALUE "Comments", "gogo-no-coda Dynamic Link Library\0" VALUE "CompanyName", "MarineCat\0" VALUE "FileDescription", "GOGO DLL(for only benchmark)\0" VALUE "FileVersion", "2, 3, 9, 0\0" VALUE "InternalName", "GOGO DLL\0" VALUE "LegalCopyright", "Copyright (C) 1999,2000 PEN@MarineCat / Herr.Mie\0" VALUE "LegalTrademarks", " \0" VALUE "OriginalFilename", "GOGO.DLL\0" VALUE "PrivateBuild", " \0" VALUE "ProductName", "MarineCat GOGO DLL\0" VALUE "ProductVersion", "2, 3, 9, 0\0" VALUE "SpecialBuild", " \0" END BLOCK "041104b0" BEGIN VALUE "Comments", "ク盧螟ホ、ウ。チ、タ ニーナェ・・・ッ・鬣、・ヨ・鬣鷭0\0" VALUE "CompanyName", "MarineCat\0" VALUE "FileDescription", "GOGO DLL\0" VALUE "FileVersion", "2, 3, 9, 0\0" VALUE "InternalName", "GOGO DLL\0" VALUE "LegalCopyright", "Copyright (C) 1999,2000 」ミ」ナ」ホ。・゙・・・ュ・罕テ・ネ 。・、リ、・゚\0" VALUE "LegalTrademarks", "。。。。\0" VALUE "OriginalFilename", "GOGO.DLL\0" VALUE "PrivateBuild", "。。\0" VALUE "ProductName", "MarineCat GOGO DLL\0" VALUE "ProductVersion", "2, 3, 9, 0\0" VALUE "SpecialBuild", "。。\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0, 1200, 0x411, 1200 END END #endif // !_MAC #endif // 日本語 resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED gogo239b/gogo_con.dsp100644 23421 144 52022 7220537347 13662 0ustar shigeousers# Microsoft Developer Studio Project File - Name="GOGO_CON" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** 編集しないでください ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=GOGO_CON - Win32 Debug !MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 !MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください !MESSAGE !MESSAGE NMAKE /f "gogo_con.mak". !MESSAGE !MESSAGE NMAKE の実行時に構成を指定できます !MESSAGE コマンド ライン上でマクロの設定を定義します。例: !MESSAGE !MESSAGE NMAKE /f "gogo_con.mak" CFG="GOGO_CON - Win32 Debug" !MESSAGE !MESSAGE 選択可能なビルド モード: !MESSAGE !MESSAGE "GOGO_CON - Win32 Release" ("Win32 (x86) Console Application" 用) !MESSAGE "GOGO_CON - Win32 Debug" ("Win32 (x86) Console Application" 用) !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName ""$/GOGO/GOGO_CON", WTAAAAAA" # PROP Scc_LocalPath "." CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "GOGO_CON - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "C:\temp\vctmp\gogo\ReleaseCON" # PROP Intermediate_Dir "C:\temp\vctmp\gogo\ReleaseCON" # PROP Ignore_Export_Lib 1 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /Ob2 /D "_CONSOLE" /D "RAW_INPUT" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "USE_E3DN" /D "LAME355" /D "USE_VBR" /D "USE_WINTHREAD" /FR /YX /FD /c # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x411 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /map /debug /machine:I386 /out:"C:\temp\vctmp\gogo\ReleaseCON/GOGO.EXE" !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "C:\temp\vctmp\gogo\DebugCON" # PROP Intermediate_Dir "C:\temp\vctmp\gogo\DebugCON" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_CONSOLE" /D "_DEBUG" /D "USE_E3DN" /D "WIN32" /D "_MBCS" /D "USE_WINTHREAD" /D "RAW_INPUT" /D "USE_VBR" /D "LAME355" /YX /FD /GZ /c # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"C:\temp\vctmp\gogo\DebugCON/GOGO.EXE" /pdbtype:sept !ENDIF # Begin Target # Name "GOGO_CON - Win32 Release" # Name "GOGO_CON - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Group "NASM" # PROP Default_Filter ".NAS" # Begin Source File SOURCE=.\align.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\align.nas InputName=align "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\align.nas InputName=align "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\clk.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\clk.nas InputName=clk "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\clk.nas InputName=clk "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fft.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\fft.nas InputName=fft "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\fft.nas InputName=fft "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fft3dn.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\fft3dn.nas InputName=fft3dn "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\fft3dn.nas InputName=fft3dn "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fftfpu.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\fftfpu.nas InputName=fftfpu "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\fftfpu.nas InputName=fftfpu "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fftsse.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\fftsse.nas InputName=fftsse "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\fftsse.nas InputName=fftsse "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\ffttbl.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\ffttbl.nas InputName=ffttbl "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\ffttbl.nas InputName=ffttbl "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\haveunit.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\haveunit.nas InputName=haveunit "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\haveunit.nas InputName=haveunit "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\huffmana.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\huffmana.nas InputName=huffmana "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\huffmana.nas InputName=huffmana "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\l3psya.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\l3psya.nas InputName=l3psya "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\l3psya.nas InputName=l3psya "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\mdct3dn.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\mdct3dn.nas InputName=mdct3dn "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\mdct3dn.nas InputName=mdct3dn "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\mdctfpu.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\mdctfpu.nas InputName=mdctfpu "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\mdctfpu.nas InputName=mdctfpu "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\mdcttbl.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\mdcttbl.nas InputName=mdcttbl "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\mdcttbl.nas InputName=mdcttbl "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msub3dn.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\msub3dn.nas InputName=msub3dn "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\msub3dn.nas InputName=msub3dn "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msubfpu.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\msubfpu.nas InputName=msubfpu "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\msubfpu.nas InputName=msubfpu "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msubsse.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\msubsse.nas InputName=msubsse "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\msubsse.nas InputName=msubsse "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msubtbl.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\msubtbl.nas InputName=msubtbl "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\msubtbl.nas InputName=msubtbl "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\putbits.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\putbits.nas InputName=putbits "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\putbits.nas InputName=putbits "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\quantize.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\quantize.nas InputName=quantize "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\quantize.nas InputName=quantize "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sband3dn.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\sband3dn.nas InputName=sband3dn "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\sband3dn.nas InputName=sband3dn "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sbandfpu.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\sbandfpu.nas InputName=sbandfpu "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\sbandfpu.nas InputName=sbandfpu "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sbandsse.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\sbandsse.nas InputName=sbandsse "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\sbandsse.nas InputName=sbandsse "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sbandtbl.nas !IF "$(CFG)" == "GOGO_CON - Win32 Release" # Begin Custom Build InputPath=.\sbandtbl.nas InputName=sbandtbl "ReleaseCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o ReleaseCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ELSEIF "$(CFG)" == "GOGO_CON - Win32 Debug" # Begin Custom Build InputPath=.\sbandtbl.nas InputName=sbandtbl "DebugCON/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -DWIN32 -f win32 -o DebugCON/$(InputName).obj $(InputPath) -DUSE_E3DN # End Custom Build !ENDIF # End Source File # End Group # Begin Source File SOURCE=.\bitstrem.c # End Source File # Begin Source File SOURCE=.\common.c # End Source File # Begin Source File SOURCE=.\encode.c # End Source File # Begin Source File SOURCE=.\huffman.c # End Source File # Begin Source File SOURCE=.\l3bs.c # End Source File # Begin Source File SOURCE=.\l3psy.c # End Source File # Begin Source File SOURCE=.\loop.c # End Source File # Begin Source File SOURCE=.\mdct.c # End Source File # Begin Source File SOURCE=.\message.c # End Source File # Begin Source File SOURCE=.\musenc.c # End Source File # Begin Source File SOURCE=.\musui.c # End Source File # Begin Source File SOURCE=.\read4win.c # End Source File # Begin Source File SOURCE=.\setup.c # End Source File # Begin Source File SOURCE=.\subs.c # End Source File # Begin Source File SOURCE=.\tables.c # End Source File # Begin Source File SOURCE=.\vbrtag.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\bitstrem.h # End Source File # Begin Source File SOURCE=.\common.h # End Source File # Begin Source File SOURCE=.\global.h # End Source File # Begin Source File SOURCE=.\haveunit.h # End Source File # Begin Source File SOURCE=.\huffcode.tbl # End Source File # Begin Source File SOURCE=.\huffman.h # End Source File # Begin Source File SOURCE=.\l3bs.h # End Source File # Begin Source File SOURCE=.\l3psy.h # End Source File # Begin Source File SOURCE=.\l3side.h # End Source File # Begin Source File SOURCE=.\loop.h # End Source File # Begin Source File SOURCE=.\mdct.h # End Source File # Begin Source File SOURCE=.\message.h # End Source File # Begin Source File SOURCE=.\musenc.h # End Source File # Begin Source File SOURCE=.\readsmpl.h # End Source File # Begin Source File SOURCE=.\subband.h # End Source File # Begin Source File SOURCE=.\vbrtag.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project gogo239b/gogo_dll.cpp100644 23421 144 3400 7220537347 13626 0ustar shigeousers#if defined(__BORLANDC__) /* by Miquel */ #include USEUNIT("..\Bitstrem.c"); USEUNIT("..\Common.c"); USEUNIT("..\Encode.c"); USEUNIT("..\formatbs.c"); USEUNIT("..\Huffman.c"); USEUNIT("..\L3bitstm.c"); USEUNIT("..\L3psy.c"); USEUNIT("..\Loop.c"); USEUNIT("..\Mdct.c"); USEUNIT("..\Musenc.c"); USEUNIT("..\READSMPL.C"); USEUNIT("..\Reserv.c"); USEUNIT("..\Setup.c"); USEUNIT("StdAfx.cpp"); USEUNIT("..\Subs.c"); USEUNIT("..\Tables.c"); USEUNIT("..\Vbrtag.c"); USERC("GOGO_DLL.rc"); USEDEF("GOGO_DLL.def"); USEFILE("vctobpr.log"); USEOBJ("DebugBuider\putbits.obj"); USEOBJ("DebugBuider\haveunit.obj"); USEOBJ("DebugBuider\quantize.obj"); USEOBJ("DebugBuider\huffmana.obj"); USEOBJ("DebugBuider\sbandtbl.obj"); USEOBJ("DebugBuider\sbandsse.obj"); USEOBJ("DebugBuider\sbandfpu.obj"); USEDEF("DebugBuider\sbandtbl.def"); USEOBJ("DebugBuider\sband3dn.obj"); USEOBJ("DebugBuider\mdcttbl.obj"); USEOBJ("DebugBuider\mdctfpu.obj"); USEOBJ("DebugBuider\mdct3dn.obj"); USEOBJ("DebugBuider\msubtbl.obj"); USEOBJ("DebugBuider\msubfpu.obj"); USEOBJ("DebugBuider\msub3dn.obj"); USEOBJ("DebugBuider\msubsse.obj"); USEOBJ("DebugBuider\ffttbl.obj"); USEOBJ("DebugBuider\fft3dn.obj"); USEOBJ("DebugBuider\fftfpu.obj"); USEOBJ("DebugBuider\fftsse.obj"); USEOBJ("DebugBuider\fft.obj"); USEOBJ("DebugBuider\l3psya.obj"); USEOBJ("DebugBuider\align.obj"); //--------------------------------------------------------------------------- #endif // defined(__BORLANDC__) // GOGO2DLL.cpp : DLL ・「・ラ・・ア。シ・キ・逾ヘム、ホ・ィ・・ネ・ ・ン・、・・ネ、トオチ、キ、゙、ケ。」 // #include "stdafx.h" extern "C" HINSTANCE hDLLInstance = NULL; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { hDLLInstance = (HINSTANCE)hModule; return TRUE; } gogo239b/gogo_dll.def100644 23421 144 1175 7220537347 13611 0ustar shigeousers; GOGO2DLL.def : DLL ヘム、ホ・筵ク・蝪シ・ ・ム・鬣癸シ・ソタクタ LIBRARY "GOGO" DESCRIPTION 'GOGO Dynamic Link Library' EXPORTS ; フタシィナェ、ハ・ィ・ッ・ケ・ン。シ・ネ、マ、ウ、ウ、リオュスメ、ヌ、ュ、゙、ケ MPGE_initializeWork @100 MPGE_setConfigure @101 MPGE_getConfigure @102 MPGE_detectConfigure @103 MPGE_processFrame @104 MPGE_closeCoder @108 MPGE_endCoder @105 MPGE_getVersion @106 MPGE_getUnitStates @107 MPGE_initializeWorkVB @200 MPGE_setConfigureVB @201 MPGE_getConfigureVB @202 MPGE_detectConfigureVB @203 MPGE_processFrameVB @204 MPGE_closeCoderVB @208 MPGE_endCoderVB @205 MPGE_getVersionVB @206 MPGE_getUnitStatesVB @207 gogo239b/gogo_dll.dsp100644 23421 144 53644 7220537347 13671 0ustar shigeousers# Microsoft Developer Studio Project File - Name="GOGO_DLL" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** 編集しないでください ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=GOGO_DLL - Win32 Release !MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 !MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください !MESSAGE !MESSAGE NMAKE /f "gogo_dll.mak". !MESSAGE !MESSAGE NMAKE の実行時に構成を指定できます !MESSAGE コマンド ライン上でマクロの設定を定義します。例: !MESSAGE !MESSAGE NMAKE /f "gogo_dll.mak" CFG="GOGO_DLL - Win32 Release" !MESSAGE !MESSAGE 選択可能なビルド モード: !MESSAGE !MESSAGE "GOGO_DLL - Win32 Release" ("Win32 (x86) Dynamic-Link Library" 用) !MESSAGE "GOGO_DLL - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" 用) !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName ""$/GOGO_DLL/DLL", GKAAAAAA" # PROP Scc_LocalPath "." CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "C:\temp\vctmp\gogo\ReleaseDLL" # PROP Intermediate_Dir "C:\temp\vctmp\gogo\ReleaseDLL" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GOGO_DLL_EXPORTS" /Yu"stdafx.h" /FD /c # ADD CPP /nologo /MD /W3 /GX /Zd /O2 /Ob2 /D "_WINDOWS" /D "_USRDLL" /D "GOGO_DLL_EXPORTS" /D "USE_REGISTRY" /D "RAW_INPUT" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "USE_E3DN" /D "LAME355" /D "USE_WINTHREAD" /D "USE_VBR" /FD /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x411 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"C:\temp\vctmp\gogo\ReleaseDLL/GOGO.DLL" !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "C:\temp\vctmp\gogo\DebugDLL" # PROP Intermediate_Dir "C:\temp\vctmp\gogo\DebugDLL" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GOGO_DLL_EXPORTS" /Yu"stdafx.h" /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GOGO_DLL_EXPORTS" /D "USE_E3DN" /D "USE_VBR" /D "LAME355" /D "USE_REGISTRY" /D "USE_WINTHREAD" /D "RAW_INPUT" /FR /FD /GZ /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"C:\temp\vctmp\gogo\DebugDLL/GOGO.DLL" /pdbtype:sept # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Cmds=copy C:\temp\vctmp\gogo\debugdll\gogo.dll C:\temp\vctmp\gogo\Debug8HZ copy C:\temp\vctmp\gogo\debugdll\gogo.dll C:\temp\vctmp\Wing\debug\gogo.dll copy C:\temp\vctmp\gogo\debugdll\gogo.dll C:\temp\vctmp\streamin\Debug\ # End Special Build Tool !ENDIF # Begin Target # Name "GOGO_DLL - Win32 Release" # Name "GOGO_DLL - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Group "nasM" # PROP Default_Filter ".nas" # Begin Source File SOURCE=.\align.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\align.nas InputName=align "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\align.nas InputName=align "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\clk.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\clk.nas InputName=clk "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\clk.nas InputName=clk "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fft.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\fft.nas InputName=fft "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\fft.nas InputName=fft "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fft3dn.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\fft3dn.nas InputName=fft3dn "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\fft3dn.nas InputName=fft3dn "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fftfpu.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\fftfpu.nas InputName=fftfpu "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\fftfpu.nas InputName=fftfpu "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fftsse.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\fftsse.nas InputName=fftsse "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\fftsse.nas InputName=fftsse "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\ffttbl.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\ffttbl.nas InputName=ffttbl "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\ffttbl.nas InputName=ffttbl "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\Haveunit.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\Haveunit.nas InputName=Haveunit "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\Haveunit.nas InputName=Haveunit "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\huffmana.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\huffmana.nas InputName=huffmana "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\huffmana.nas InputName=huffmana "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\l3psya.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\l3psya.nas InputName=l3psya "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\l3psya.nas InputName=l3psya "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\mdct3dn.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\mdct3dn.nas InputName=mdct3dn "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\mdct3dn.nas InputName=mdct3dn "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\mdctfpu.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\mdctfpu.nas InputName=mdctfpu "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\mdctfpu.nas InputName=mdctfpu "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\mdcttbl.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\mdcttbl.nas InputName=mdcttbl "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\mdcttbl.nas InputName=mdcttbl "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msub3dn.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\msub3dn.nas InputName=msub3dn "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\msub3dn.nas InputName=msub3dn "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msubfpu.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\msubfpu.nas InputName=msubfpu "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\msubfpu.nas InputName=msubfpu "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msubsse.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\msubsse.nas InputName=msubsse "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\msubsse.nas InputName=msubsse "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msubtbl.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\msubtbl.nas InputName=msubtbl "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\msubtbl.nas InputName=msubtbl "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\PUTBITS.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\PUTBITS.nas InputName=PUTBITS "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\PUTBITS.nas InputName=PUTBITS "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\Quantize.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\Quantize.nas InputName=Quantize "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\Quantize.nas InputName=Quantize "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sband3dn.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\sband3dn.nas InputName=sband3dn "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\sband3dn.nas InputName=sband3dn "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sbandfpu.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\sbandfpu.nas InputName=sbandfpu "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\sbandfpu.nas InputName=sbandfpu "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sbandsse.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\sbandsse.nas InputName=sbandsse "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\sbandsse.nas InputName=sbandsse "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sbandtbl.nas !IF "$(CFG)" == "GOGO_DLL - Win32 Release" # Begin Custom Build InputPath=.\sbandtbl.nas InputName=sbandtbl "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "GOGO_DLL - Win32 Debug" # Begin Custom Build InputPath=.\sbandtbl.nas InputName=sbandtbl "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # End Group # Begin Source File SOURCE=.\bitstrem.c # End Source File # Begin Source File SOURCE=.\common.c # End Source File # Begin Source File SOURCE=.\encode.c # End Source File # Begin Source File SOURCE=.\gogo_dll.cpp # End Source File # Begin Source File SOURCE=.\gogo_dll.def # End Source File # Begin Source File SOURCE=.\huffman.c # End Source File # Begin Source File SOURCE=.\l3bs.c # End Source File # Begin Source File SOURCE=.\l3psy.c # End Source File # Begin Source File SOURCE=.\loop.c # End Source File # Begin Source File SOURCE=.\mdct.c # End Source File # Begin Source File SOURCE=.\message.c # End Source File # Begin Source File SOURCE=.\musenc.c # End Source File # Begin Source File SOURCE=.\read4win.c # End Source File # Begin Source File SOURCE=.\setup.c # End Source File # Begin Source File SOURCE=.\stdafx.cpp # ADD CPP /Yc"stdafx.h" # End Source File # Begin Source File SOURCE=.\subs.c # End Source File # Begin Source File SOURCE=.\tables.c # End Source File # Begin Source File SOURCE=.\vbrtag.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\bitstrem.h # End Source File # Begin Source File SOURCE=.\common.h # End Source File # Begin Source File SOURCE=.\global.h # End Source File # Begin Source File SOURCE=.\grinfo.inc # End Source File # Begin Source File SOURCE=.\haveunit.h # End Source File # Begin Source File SOURCE=.\huffcode.tbl # End Source File # Begin Source File SOURCE=.\huffman.h # End Source File # Begin Source File SOURCE=.\l3bs.h # End Source File # Begin Source File SOURCE=.\l3psy.h # End Source File # Begin Source File SOURCE=.\l3side.h # End Source File # Begin Source File SOURCE=.\loop.h # End Source File # Begin Source File SOURCE=.\mdct.h # End Source File # Begin Source File SOURCE=.\message.h # End Source File # Begin Source File SOURCE=.\musenc.h # End Source File # Begin Source File SOURCE=.\readsmpl.h # End Source File # Begin Source File SOURCE=.\stdafx.h # End Source File # Begin Source File SOURCE=.\subband.h # End Source File # Begin Source File SOURCE=.\vbrtag.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File SOURCE=.\english.msg # End Source File # Begin Source File SOURCE=.\german.msg # End Source File # Begin Source File SOURCE=.\gogo_dll.rc # End Source File # Begin Source File SOURCE=.\japanese.msg # End Source File # Begin Source File SOURCE=.\spanish.msg # End Source File # End Group # Begin Source File SOURCE=.\readme.txt # End Source File # End Target # End Project gogo239b/mmx/ 40755 23421 144 0 7220537254 12040 5ustar shigeousersgogo239b/mmx/encode.c100644 23421 144 11063 7220537254 13557 0ustar shigeousers#include "mydef.h" #include "parser.h" #include #include "getnum.h" #include "encode.h" /* modR/Mのためのマクロ */ #define CAT(flag,reg1,reg2) (((flag)<<6)|((reg1)<<3)|(reg2)) int getEncode(ENCODE *enc,char *src){ CODE code; CODE_MAP *m; OPERAND *op1,*op2; ADDRESSING *adr2; int32 dispNum; int isExistBase; int adj; /* SIBが存在する時の位置補正 */ int len; if(analyzeCode(&code,src)==ERR)return ERR; if(code.icode.group==NO_MATCH)return ERR; /* 変数の初期化 */ op1=&code.ope1; op2=&code.ope2; enc->seg=0; enc->prev[0]=enc->prev[1]=0; enc->tail=0; enc->disp[0]=NUL; m=getCodeProperty(code.icode); switch(code.icode.group){ case MMX_CODE: /* prefixが0Fhでその後code,modで2byte */ enc->prev[0]=0x0F; enc->code[0]=m->code; if(code.icode.num==0 || code.icode.num==1){ /* emms,femms だけ例外 */ enc->codeLen=1; return NOERR; } len=1; if(m->mod){ enc->code[1]=m->mod; len++; } break; case _3DNOW_CODE: /* prefixが0Fh,0Fhで最後にcodeが1byte */ enc->prev[0]=0x0F; enc->prev[1]=0x0F; enc->tail=m->code; len=0; break; case PREFETCH_CODE: /* prefixが0Fhでcodeが1byte */ enc->prev[0]=0x0F; enc->code[0]=m->code; /* enc->code[1]=m->mod これは下で例外的に処理する */ len=1; break; default: fprintf(stderr,"This code can't be run in getEncode!\n"); exit(1); } /* まずは簡単なmodR/Mを決定する */ if(op1->type==tMMX){ if(op2->type==tMMX || op2->type==tR32){ enc->code[len]=CAT(3,op1->ope.reg,op2->ope.reg); len++; enc->codeLen=len; return NOERR; } if(op2->type==tIMM8){ enc->code[len-1] |=op1->ope.reg; enc->code[len]=op2->ope.imm; len++; enc->codeLen=len; return NOERR; } }else if(op1->type==tR32){ enc->code[len]=CAT(3,op2->ope.reg,op1->ope.reg); len++; enc->codeLen=len; return NOERR; }else{ OPERAND *forswap; forswap=op1; op1=op2; op2=forswap; } adr2=&op2->ope.adr; /* 次はいよいよアドレッシング(何てややこいんや 責任者出てこんか) */ /* prefetch命令は1つしかoperandをとらない */ if(code.icode.group==PREFETCH_CODE){ if(code.icode.num==1){ /* prefetchwの例外 */ op1->ope.reg=1; }else{ op1->ope.reg=0; } } /* セグメントプレフィクスがあるか? */ if(adr2->seg!=-1){ enc->seg=adr2->seg; } if(adr2->base==-1 && adr2->index==-1){ /* displacementだけの時は */ enc->code[len]=CAT(0,op1->ope.reg,EBP_CODE); len++; if(getNumber(&dispNum,adr2->disp)==NOERR){ *(int32 *)&enc->code[len]=dispNum; len+=4; }else{ strcpy(enc->disp,adr2->disp); } enc->codeLen=len; return NOERR; } adj=0; /* SIBが存在すれば1 */ isExistBase=1; /* baseが無ければ0 */ if(adr2->index !=-1 || adr2->base==ESP_CODE){ /* SIB があるモード */ enc->code[len]=CAT(0,op1->ope.reg,ESP_CODE); len++; if(adr2->index==-1){ /* index がない */ adr2->index=ESP_CODE; adr2->scale=0; } if(adr2->base==-1){ /* baseがない */ isExistBase=0; adr2->base=EBP_CODE; } enc->code[len]=CAT(adr2->scale,adr2->index,adr2->base); len++; adj=1; /* 上の分だけずらす */ }else{ /* SIBがないモード */ enc->code[len]=CAT(0,op1->ope.reg,adr2->base); len++; } if(!*adr2->disp){ /* dispが無い */ if( adr2->base != EBP_CODE ){/* ebpがbaseの時例外処理失念(99/10/26) */ enc->codeLen=len; return NOERR; } }else if(getNumber(&dispNum,adr2->disp)==ERR){/* labelを含んでいるので計算不可 */ if(isExistBase){ enc->code[len-1-adj] |=(2<<6); } strcpy(enc->disp,adr2->disp); enc->codeLen=len; return NOERR; } /* dispを計算できた時は */ if(!dispNum && adr2->base!=EBP_CODE){ /* それが0なら */ enc->codeLen=len; return NOERR; } if(dispNum<128 && dispNum>=-128 && isExistBase){/* |disp|<256のとき */ enc->code[len-1-adj] |=(1<<6); enc->code[len]=(byte)dispNum; len++; enc->codeLen=len; return NOERR; } /* |disp|>=256のとき */ if(isExistBase){ enc->code[len-1-adj] |=(2<<6); } *((int32 *)&enc->code[len])=dispNum; len+=4; enc->codeLen=len; return NOERR; } void putEncode(ENCODE *enc,FILE *fp){ int i; fprintf(fp,"db "); if(enc->seg)fprintf(fp,"0%02Xh,",enc->seg); if(enc->prev[0])fprintf(fp,"%02Xh,",enc->prev[0]); if(enc->prev[1])fprintf(fp,"%02Xh,",enc->prev[1]); fprintf(fp,"0%02Xh",enc->code[0]); for(i=1;icodeLen;i++){ fprintf(fp,",0%02Xh",enc->code[i]); } if(enc->disp[0]){ fprintf(fp,"\ndd %s",enc->disp); if(enc->tail)fprintf(fp,"\ndb 0%02Xh",enc->tail); }else if(enc->tail)fprintf(fp,",0%02Xh",enc->tail); fprintf(fp," ;"); } gogo239b/mmx/readme.txt100644 23421 144 5001 7220537254 14127 0ustar shigeousers MMXと3D Now!命令をdb 形式に変換するプログラム ver 1.8 programmed by Herr Mie 98/12/05 1年振りのリニューアル 98/12/06 prefetch[w]のバグ取り(が〜ん、K6-2はprefetchwに非対応) 98/12/08 [q|d]word ptr に暫定的に対応 98/12/10 少しバグ取り 99/09/28 Enhanced 3D Now!に(一部)対応 99/11/03 ebpアドレッシングのバグ修正とgetnum.cの改良(by 計さん) 99/12/21 getnumが空白を考慮していなかったのを修正 【使い方】 コマンドラインでmmx filename.mmxとしてください。 VC++で使うならカスタムビルドで設定しておけば良いでしょう。 filenameに含まれたMMX, 3D Now!命令を16進数に変換し、db,dd命令に置き換えて filename.asmに出力します。 入力ファイル名の拡張子を省略した場合は".mmx"が追加されます。 ロングネーム非対応です。 Phar Lap社の386|ASM TOOK KIT 2.2dでアセンブル出来る形式で出力をしますが、 db,dd命令が使えるアセンブラなら問題なく動作すると思います。 簡単に試した限りではtasm(3.0), lasm(2.071:体験版)でアセンブル出来ました。 【仕様】 ・命令とレジスタは大文字と小文字を区別しません。 ・即値は10進定数しか指定できません。(計算式やマクロ定義は不可) ・ちょっとした四則演算に対応しました。(計さんのおかげです) ・アドレッシングは (d|q)word ptr sreg:[base+index*scale+disp] という形が使えます。 dword ptr, qword ptr, ptrは省略可能です。記述すると'[',']'を省略出来ます。 ただし、現在オペランドサイズのチェックはしません。 sregはセレクタ(cs,ds,ss,es,fs,gs)を指定可能です。 base,index,dispの順序は任意です。 indexはreg*?という形で書いてください。?*regはエラーになります。 左にあるレジスタを優先的にbaseレジスタとして処理します。 x86CPUにはindexレジスタにはespを使えないという仕様があるため movq mm0,[eax+esp] はエラーになります。 movq mm0,[esp+eax] としてください。 例) movq mm0,qword ptr PI ;ptr演算子を書いたので[]は省略できる。 psrlq mm3,SHIFT_PT ;即値には計算式/マクロは使えないのでエラー。 pfmul mm3,[edi*8+DATA] ;dispにラベルを使うことは可能。 pfadd mm2,buffer ;[]で括っていないのでエラー。 【もろもろ】 ・出来立てほやほやなのでどんなバグがあるか分かりません。 何か変だと思ったらメールを下さると嬉しいです。 あと、インラインアセンブラやgasに対応させるにはencode.c内のputEncodeを いじればすぐ出来ると思います。 と思ったけどVC++にはdd命令が無い?困った。 【謝辞】 友達に借りた『K6 PERFECT BOOK』(SOFT BANK)を参照しました。 #が、一部命令コードが変。packsswb MMX,MEMのopecodeは0x63が正しい気がする... エル・エス・アイ ジャパンのLSI C-86 Ver 3.30c 試食版でコンパイルしました。 どうもありがとうございます。 光成滋生 shigeo@kurims.kyoto-u.ac.jp gogo239b/mmx/encode.h100644 23421 144 602 7220537254 13521 0ustar shigeousers#ifndef _ENCODE_H #define _ENCODE_H #include "parser.h" typedef struct{ byte seg; /* segment(0なら無し) */ byte prev[2]; /* 0なら無し */ byte code[16]; /* codeLenの長さだけ */ byte tail; /* 0なら無し */ char disp[40]; /* ラベルを使ったdisplacement */ int codeLen; }ENCODE; int getEncode(ENCODE *enc,char *src); void putEncode(ENCODE *enc,FILE *fp); #endif gogo239b/mmx/errmes.c100644 23421 144 1353 7220537254 13600 0ustar shigeousers#include "errmes.h" static char fname[14]=""; static int line=1; void setErrMes(char *src){ strcpy(fname,src); } void incErrLine(void){ line++; } /* * エラーを表示する * 常にERRを返す */ int errMes(ERR_MES num){ static char mes[][40]={ "文字列がない" ,"segmentレジスタが変" ,"'['が変" ,"indexレジスタが2個以上ある" ,"scale指定が変" ,"レジスタの次の文字が変" ,"レジスタの前の文字が'+'でない" ,"文字列が長すぎる" ,"']'が変" ,"文字列が連続している" ,"不正なoperand" ,"operandとopecodeの組み合わせが変" ,"espはindexに使えない" ,"ptr演算子のエラー" ,"現在未実装です" ,"その他のエラー" }; fprintf(stderr,"%s %d:%s [No.=%d]\n",fname,line,mes[num],num); return ERR; } gogo239b/mmx/errmes.h100644 23421 144 1064 7220537254 13604 0ustar shigeousers#ifndef _ERRMES_H #define _ERRMES_H #include "mydef.h" typedef enum{ ERR_NOTHING, ERR_SEG, ERR_OPEN, ERR_DOUBLE_INDEX, ERR_SCALE, ERR_REG_NEXT, ERR_REG_PREV, ERR_TOO_LONG, ERR_CLOSE, ERR_STR, ERR_OPERAND, ERR_OPERAND_OPECODE, ERR_ESP_INDEX, ERR_PTR, ERR_NOT_IMPLEMENT, ERR_ETC }ERR_MES; /* * エラーを表示する * 常にERRを返す */ int errMes(ERR_MES num); /* * エラー表示時のファイル名を与える */ void setErrMes(char *src); /* * エラー表示行のインクリメント */ void incErrLine(void); #endif gogo239b/mmx/getnum.c100644 23421 144 11217 7220537254 13622 0ustar shigeousers/* * 計さんありがとう(99/10/26) */ #include "mydef.h" #include "parser.h" #include "errmes.h" /* 数式評価に使うスタック */ #define STACK_DEPTH (40) int32 stack[STACK_DEPTH]; int sp=0; /* 数式を評価する * input * src 評価する数式へのポインタ * output * num 評価した結果を入れる変数へのポインタ * return * 評価した式の次の文字へのポインタ * エラー時は NULL を返し、num の中身は不定 */ static char* expression(int32 *num,char* src); /* 項を評価する * 3*4 みたいな '*' または '/' で繋がれた一連の数字または式を評価する * 評価結果は stack に積む * input * src 評価する項へのポインタ * return * 評価した項の次の文字へのポインタ * エラー時は NULL を返す */ static char* term(char* src); /* 要素(?数学でなんていいましたっけ?^^;;)を評価する * 項を構成する要素を評価する(苦しい日本語じゃ^^;;) * 評価結果は stack に積む * input * src 評価する要素へのポインタ * return * 評価した要素の次の文字へのポインタ * エラー時は NULL を返す */ static char* factor(char* src); /* スタックに積んである数字を計算する * stack から数字を取り出して計算する * 評価結果は stack に積む * input * ope 計算方法を指定する演算子 '+','-','*','/' のいずれか * return * 正常に計算できれば NOERR * エラー時は ERR を返す */ static int calc(char ope); /* スタックに積む * input * num 積む数字 * return * 正常に積めれば NOERR * エラー時は ERR を返す */ static int push(int32 num); /* スタックから卸す * input * num 卸す数字を入れる変数へのポインタ * return * 正常に卸せれば NOERR * エラー時は ERR を返す */ static int pull(int32 *num); int push(int32 num){ if(sp >= STACK_DEPTH)return ERR; stack[sp++]=num; return NOERR; } int pull(int32 *num){ if(sp <= 0)return ERR; *num=stack[--sp]; return NOERR; } char* expression(int32 *num,char* src) { char ope; src=term(src); if(!src)return NULL; while(*src){ if (*src=='+' || *src=='-'){ ope=*src; src++; src=term(src); if(!src)return NULL; if(calc(ope)!=NOERR)return NULL; } else break; } if(pull(num)!=NOERR)return NULL; return src; } char* term(char* src){ char ope; src=factor(src); if(!src)return NULL; while(*src){ if (*src=='*' || *src=='/'){ ope=*src; src++; src=factor(src); if(!src)return NULL; if(calc(ope)!=NOERR)return NULL; } else break; } return src; } char* factor(char* src){ int32 a=0; int sign=1; switch(*src){ case '+': src++; break; case '-': sign=-1; src++; break; } switch(*src){ case '(': src++; src=expression(&a,src); if(!src)return NULL; if(*src!=')')return NULL; src++; break; default: if(*src<'0' || *src>'9')return NULL; do{ if(*src<'0' || *src>'9')break; a=a*10; a+=*src-'0'; src++; }while(*src); } if(push(a*sign)!=NOERR)return NULL; return src; } int calc(char ope){ int32 para1,para2; if(pull(¶2)!=NOERR||pull(¶1)!=NOERR)return ERR; switch(ope){ case '+': return push(para1+para2); case '-': return push(para1-para2); case '*': return push(para1*para2); case '/': return push(para1/para2); default: return ERR; } } /* スペースまたはタブを削除 srcを壊さない */ static char *deleteSpace(char *src){ static char buf[strLenMax]; char *dist = buf; if( !src )return NULL; do{ while( *src ==' ' || *src == '\t' )src++; }while( ( *dist++ = *src++ ) ); return buf; } /* * 数値を返す(今はたんなるatoi()) * 最終的には電卓程度にまでしたい */ int getNumber(int32 *num,char *src){ TOKEN tok; #if 1 /* スペースが入ってると解析に失敗するので by shigeo 99/12/21 */ src = deleteSpace( src ); #endif src=expression(num,src); if(!src)return ERR; src=nextToken(&tok,src); if(tok.type!=TOKEN_NONE)return ERR; /* 数式評価不能な文字列が残っている */ if(sp)return ERR; /* スタックが合っていない */ return NOERR; #if 0 char *p; int32 a=0; int sign=0; src=nextToken(&tok,src); if(tok.type==TOKEN_NONE)return ERR; if(tok.type==TOKEN_ADD){ src=nextToken(&tok,src); sign=0; }else if(tok.type==TOKEN_SUB){ src=nextToken(&tok,src); sign=1; } if(tok.type!=TOKEN_STR)return ERR; p=tok.str; do{ a=a*10; if(*p<'0' || *p>'9')return ERR; a+=*p-'0'; p++; }while(*p); if(sign){ *num=-a; }else{ *num=a; } src=nextToken(&tok,src); if(tok.type!=TOKEN_NONE)return ERR;/* 現在計算式不可 */ return NOERR; #endif } gogo239b/mmx/getnum.h100644 23421 144 253 7220537254 13565 0ustar shigeousers#ifndef _GETNUM_H #define _GETNUM_H #include "mydef.h" /* * 数値を返す * 最終的には電卓程度にまでしたい */ int getNumber(int32 *num,char *src); #endif gogo239b/mmx/main.c100644 23421 144 5241 7220537254 13227 0ustar shigeousers/* * MMX & 3D Now! assembler ver 1.8 * programmed by Herr Mie. * 98/12/05 renewal * 98/12/06 bug fix of prefetchw * 98/12/08 can use [q|d]word ptr temporarily * 98/12/10 bug fix * 99/09/28 Enhanced 3D Now! * 99/10/26 bug fix of ebp-adressing * getnum.c by kei-i * 99/12/21 consider space in getnum.c */ #include "mydef.h" #include "encode.h" #include "errmes.h" /* * ファイルから LF(0x0A) または EOF になるまでのn-1文字を読む * LFの1つ前がCR(0x0D)の場合、それを捨てる * sは char s[n];であること nは正の数であること * 読み込んだ文字列の長さがn未満の時は0を返す * n文字以上ある場合は残りを読み捨てて1を返す * EOFに当たった場合は-1を返す */ static int get1line(char *s, int n, FILE *fp){ int i,c; for( i = 0; i < n-1; i++ ){ c = fgetc(fp); if( c == EOF || c == 0x0A )break; *s++ = c; } if( i > 0 && s[-1] == 0x0D ){ s[-1] = NUL; }else{ *s = NUL; } if( c == EOF )return -1; if( c == 0x0A )return 0; do{ c=fgetc(fp); /* 読み捨て */ }while( c != EOF && c != 0x0a ); return 1; } int main(int argc,char *argv[]){ char orgName[128]; char outName[128]; char buf[strLenMax]; FILE *fp1,*fp2; ENCODE enc; fprintf(stderr,"*** MMX & 3D Now! assembler ver 1.8 ***\n"); argc--;argv++; if(argc<1){ fprintf(stderr,"use: mmx file[.mmx]\n"); return ERR; } /* 入力ファイル名の生成 */ if(strlen(*argv)>=sizeof(orgName)-4){/* 4=sizeof(".mmx") */ fprintf(stderr,"file name is too long.\n"); return ERR; } strcpy(orgName,*argv); fp1 = fopen( orgName, "rb" ); if( !fp1 ){ /* 拡張子を省略したか? */ strcat( orgName, ".mmx" ); fp1 = fopen( orgName, "rb" ); if( !fp1 ){ fprintf(stderr,"Can't open %s.\n",orgName); return ERR; } } fprintf(stderr,"input file:%s\n",orgName); /* 出力ファイル名の生成 */ { int i, len, found = 0; strcpy( outName, orgName ); len = strlen( outName ); for( i = len - 1; i > 0 && i >= len - 4; i-- ){ if( outName[i] == '.' ){ found++; break; } } if( found ){ strcpy( &outName[i+1], "asm" ); }else{ strcat( outName, ".asm" ); } } fp2=fopen(outName,"w"); if(!fp2){ fprintf(stderr,"Can't open %s!\n",outName); return ERR; } fprintf(stderr,"output file:%s\n",outName); /* エラー関数のための準備 */ setErrMes(orgName); /* 変換開始 */ for(;;){ int ret; ret = get1line(buf,sizeof(buf),fp1); if( ret == -1 )break; if( ret == 1 )fprintf(stderr,"too long!\n"); if(getEncode(&enc,buf)==NOERR){ putEncode(&enc,fp2); } fprintf(fp2,"%s\n",buf); incErrLine(); } fprintf(stderr,"complete.\n"); fclose(fp1); fclose(fp2); return NOERR; } gogo239b/mmx/makefile100644 23421 144 203 7220537254 13610 0ustar shigeousersTARGET=mmx.exe OBJS=main.obj parser.obj errmes.obj encode.obj getnum.obj $(TARGET) :$(OBJS) makefile lcc -o $(TARGET) $(OBJS)gogo239b/mmx/mydef.h100644 23421 144 770 7220537254 13376 0ustar shigeousers#ifndef _MYDEF_H #define _MYDEF_H #include #include #include #include typedef unsigned long dword; typedef unsigned short word; typedef unsigned char byte; typedef long int32; /* LSI-Cのため */ #define DBGout(x,y) printf(#x "=%" #y "\n",x) #define NUL 0 #define NOERR 0 #define ERR 1 #define TRUE 1 #define FALSE 0 #define DWORD(x) *( (dword *)(x) ) #define WORD(x) *( (word *)(x) ) #define BYTE(x) *( (byte *)(x) ) #endif gogo239b/mmx/parser.c100644 23421 144 37401 7220537254 13622 0ustar shigeousers#if 0 /* Enhanced 3D Now!命令のみアセンブルする場合 */ #define ONLY_E3DN #endif #include "mydef.h" #include "parser.h" #include "errmes.h" #include "getnum.h" #include #ifdef __unix__ #define stricmp strcmp #endif /* * ANSI非標準のstricmpを使う。(これは大文字小文字を区別せずに比較する) */ /* * MMX,3D Now!命令のコード一覧 * 3D Now!命令でありながらprefixが0x0Fのみのfemms命令はMMXのところにする * 同様にprefetch,prefetchwも別扱いにする */ static CODE_MAP MMXcode[]={ {"emms" ,tNONE ,tNONE ,0x77,0}, /* emmsとfemmsはここに */ {"femms" ,tNONE ,tNONE ,0x0E,0}, /* 移動不可! */ #ifndef ONLY_E3DN {"movd" ,tMMX ,tR32|tMEM ,0x6E,0}, {"movd" ,tR32|tMEM ,tMMX ,0x7E,0}, {"movq" ,tMMX ,tMMX|tMEM ,0x6F,0}, {"movq" ,tMMX|tMEM ,tMMX ,0x7F,0}, {"packssdw" ,tMMX ,tMMX|tMEM ,0x6B,0}, {"packsswb" ,tMMX ,tMMX|tMEM ,0x63,0}, {"packuswb" ,tMMX ,tMMX|tMEM ,0x67,0}, {"paddb" ,tMMX ,tMMX|tMEM ,0xFC,0}, {"paddd" ,tMMX ,tMMX|tMEM ,0xFE,0}, {"paddsb" ,tMMX ,tMMX|tMEM ,0xEC,0}, {"paddsw" ,tMMX ,tMMX|tMEM ,0xED,0}, {"paddusb" ,tMMX ,tMMX|tMEM ,0xDC,0}, {"paddusw" ,tMMX ,tMMX|tMEM ,0xDD,0}, {"paddw" ,tMMX ,tMMX|tMEM ,0xFD,0}, {"pand" ,tMMX ,tMMX|tMEM ,0xDB,0}, {"pandn" ,tMMX ,tMMX|tMEM ,0xDF,0}, {"pcmpeqb" ,tMMX ,tMMX|tMEM ,0x74,0}, {"pcmpeqd" ,tMMX ,tMMX|tMEM ,0x76,0}, {"pcmpeqw" ,tMMX ,tMMX|tMEM ,0x75,0}, {"pcmpgtb" ,tMMX ,tMMX|tMEM ,0x64,0}, {"pcmpgtd" ,tMMX ,tMMX|tMEM ,0x66,0}, {"pcmpgtw" ,tMMX ,tMMX|tMEM ,0x65,0}, {"pmaddwd" ,tMMX ,tMMX|tMEM ,0xF5,0}, {"pmulhw" ,tMMX ,tMMX|tMEM ,0xE5,0}, {"pmullw" ,tMMX ,tMMX|tMEM ,0xD5,0}, {"por" ,tMMX ,tMMX|tMEM ,0xEB,0}, {"psllw" ,tMMX ,tMMX|tMEM ,0xF1,0}, {"psllw" ,tMMX ,tIMM8 ,0x71,0xF0}, {"pslld" ,tMMX ,tMMX|tMEM ,0xF2,0}, {"pslld" ,tMMX ,tIMM8 ,0x72,0xF0}, {"psllq" ,tMMX ,tMMX|tMEM ,0xF3,0}, {"psllq" ,tMMX ,tIMM8 ,0x73,0xF0}, {"psraw" ,tMMX ,tMMX|tMEM ,0xE1,0}, {"psraw" ,tMMX ,tIMM8 ,0x71,0xE0}, {"psrad" ,tMMX ,tMMX|tMEM ,0xE2,0}, {"psrad" ,tMMX ,tIMM8 ,0x72,0xE0}, {"psraq" ,tMMX ,tMMX|tMEM ,0xE3,0}, {"psraq" ,tMMX ,tIMM8 ,0x73,0xE0}, {"psrlw" ,tMMX ,tMMX|tMEM ,0xD1,0}, {"psrlw" ,tMMX ,tIMM8 ,0x71,0xD0}, {"psrld" ,tMMX ,tMMX|tMEM ,0xD2,0}, {"psrld" ,tMMX ,tIMM8 ,0x72,0xD0}, {"psrlq" ,tMMX ,tMMX|tMEM ,0xD3,0}, {"psrlq" ,tMMX ,tIMM8 ,0x73,0xD0}, {"psubb" ,tMMX ,tMMX|tMEM ,0xF8,0}, {"psubd" ,tMMX ,tMMX|tMEM ,0xFA,0}, {"psubsb" ,tMMX ,tMMX|tMEM ,0xE8,0}, {"psubsw" ,tMMX ,tMMX|tMEM ,0xE9,0}, {"psubusb" ,tMMX ,tMMX|tMEM ,0xD8,0}, {"psubusw" ,tMMX ,tMMX|tMEM ,0xD9,0}, {"psubw" ,tMMX ,tMMX|tMEM ,0xF9,0}, {"punpckhbw",tMMX ,tMMX|tMEM ,0x68,0}, {"punpckhwd",tMMX ,tMMX|tMEM ,0x69,0}, {"punpckhdq",tMMX ,tMMX|tMEM ,0x6A,0}, {"punpcklbw",tMMX ,tMMX|tMEM ,0x60,0}, {"punpcklwd",tMMX ,tMMX|tMEM ,0x61,0}, {"punpckldq",tMMX ,tMMX|tMEM ,0x62,0}, {"pxor" ,tMMX ,tMMX|tMEM ,0xEF,0}, #endif {"" ,tNONE ,tNONE ,0 ,0}, }, _3DNOWcode[]={ #ifndef ONLY_E3DN {"pavgusb" ,tMMX ,tMMX|tMEM ,0xBF,0}, {"pfadd" ,tMMX ,tMMX|tMEM ,0x9E,0}, {"pfsub" ,tMMX ,tMMX|tMEM ,0x9A,0}, {"pfsubr" ,tMMX ,tMMX|tMEM ,0xAA,0}, {"pfacc" ,tMMX ,tMMX|tMEM ,0xAE,0}, {"pfmul" ,tMMX ,tMMX|tMEM ,0xB4,0}, {"pfcmpge" ,tMMX ,tMMX|tMEM ,0x90,0}, {"pfcmpgt" ,tMMX ,tMMX|tMEM ,0xA0,0}, {"pfcmpeq" ,tMMX ,tMMX|tMEM ,0xB0,0}, {"pfmin" ,tMMX ,tMMX|tMEM ,0x94,0}, {"pfmax" ,tMMX ,tMMX|tMEM ,0xA4,0}, {"pi2fd" ,tMMX ,tMMX|tMEM ,0x0D,0}, {"pf2id" ,tMMX ,tMMX|tMEM ,0x1D,0}, {"pfrcp" ,tMMX ,tMMX|tMEM ,0x96,0}, {"pfrsqrt" ,tMMX ,tMMX|tMEM ,0x97,0}, {"pfrcpit1" ,tMMX ,tMMX|tMEM ,0xA6,0}, {"pfrsqit1" ,tMMX ,tMMX|tMEM ,0xA7,0}, {"pfrcpit2" ,tMMX ,tMMX|tMEM ,0xB6,0}, {"pmulhrw" ,tMMX ,tMMX|tMEM ,0xB7,0}, #endif /* 99/09/28 Enhanced 3D Now! */ {"pfnacc" ,tMMX ,tMMX|tMEM ,0x8A,0}, {"pfpnacc" ,tMMX ,tMMX|tMEM ,0x8E,0}, {"pi2fw" ,tMMX ,tMMX|tMEM ,0x0C,0}, {"pf2iw" ,tMMX ,tMMX|tMEM ,0x1C,0}, {"pswapd" ,tMMX ,tMMX|tMEM ,0xBB,0}, {"" ,tNONE ,tNONE ,0 ,0}, }, PREFETCHcode[]={ #ifndef ONLY_E3DN {"prefetch" ,tMEM ,tNONE ,0x0D,0}, {"prefetchw",tMEM ,tNONE ,0x0D,8}, #endif {"" ,tNONE ,tNONE ,0 ,0}, }; /* * 解析したオペランドの情報を得る * opeは正しい値でないといけない */ CODE_MAP *getCodeProperty(OPECODE ope){ switch(ope.group){ case MMX_CODE: return &MMXcode[ope.num]; case _3DNOW_CODE: return &_3DNOWcode[ope.num]; case PREFETCH_CODE: return &PREFETCHcode[ope.num]; default: fprintf(stderr,"code err in getCodeProperty\n"); exit(1); } } /* * TOKEN_TYPEに対応する次の文字を取ってくる * 取り出した文字列の最後の文字があったポインタ+1を返す * *src==NULの場合はsrcを返す */ char *nextToken(TOKEN *tok,char *src){ char *p=tok->str; while(*src==' ' || *src=='\t')src++; /* 空白をスキップ */ tok->begin=src; switch(*src){ case NUL: tok->type=TOKEN_NONE; *p=NUL; return src; case ':': tok->type=TOKEN_COLON; break; case ',': tok->type=TOKEN_COMMA; break; case '+': tok->type=TOKEN_ADD; break; case '-': tok->type=TOKEN_SUB; break; case '*': tok->type=TOKEN_MUL; break; case '[': tok->type=TOKEN_OPEN; break; case ']': tok->type=TOKEN_CLOSE; break; case '=': tok->type=TOKEN_EQU; break; default: tok->type=TOKEN_STR; while(*src && *src!=':' && *src!=',' && *src!='+' && *src!='-' && *src!='*' && *src!='[' && *src!=']' && *src!='=' && *src!=' ' && *src!='\t')*p++=*src++; *p=NUL; return src; } /* NONE,STR以外の1文字区切り文字の場合 */ *p++=*src++; *p=NUL; return src; } /* * 汎用レジスタのコードを返す * 無い場合は-1を返す */ static int get32bitRegCode(char *src){ static char reg[8][4]={ "eax","ecx","edx","ebx","esp","ebp","esi","edi" }; int i; char buf[4]; if(src[3])return -1; buf[0]=tolower(src[0]); buf[1]=tolower(src[1]); buf[2]=tolower(src[2]); for(i=0;i<8;i++){ if(!strncmp(reg[i],buf,3))return i; } return -1; } /* * mmxレジスタのコードを返す * 無い場合は-1を返す */ static int getMMXRegCode(char *src){ int i; char buf[3]; if(src[3])return -1; buf[0]=tolower(src[0]); buf[1]=tolower(src[1]); buf[2]=tolower(src[2]); if(buf[0]!='m' || buf[1]!='m')return -1; for(i=0;i<8;i++){ if(buf[2]==(char)('0'+i))return i; } return -1; } /* * sregのコードを返す * 無い場合は-1を返す */ static int getSegRegCode(char *src){ char buf[2]; buf[0]=tolower(src[0]); buf[1]=tolower(src[1]); if(buf[1]!='s')return -1; switch(buf[0]){ case 'c': return 0x2E; case 'd': return 0x3E; case 'e': return 0x26; case 'f': return 0x64; case 'g': return 0x65; case 's': return 0x36; default: return -1; } } /* * アドレッシングを解析する * src=sreg:[base+index*scale+disp] * どの項も省略されている可能性がある * dispはいつくかの和や差になっていてもいい * []内の順番も分からない * sreg,base,indexを除いた部分の文法的正当性は見ない * adrの中身 * ERRが返った場合は不明 * NOERRの場合は' ','\t'を含まない文字列が返る */ static int analyzeAddressing(ADDRESSING *adr,char *src){ TOKEN tok; int baseFlag=0; int indexFlag=0; int prevFlag=0; /*前回が 0:STR以外 1:STR */ int canOmitKakko=0; /* []を省略出来るか */ int code,len; char *buf=adr->disp; if(src==NULL)return errMes(ERR_NOTHING); /* 変数の初期化 */ adr->seg =-1; adr->base =-1; adr->index=-1; adr->scale=-1; adr->disp[0]=NUL; src=nextToken(&tok,src); if(tok.type==TOKEN_STR){ /* [d|q]word ptr演算子の無効化(暫定的) */ if(!stricmp(tok.str,"dword")||!stricmp(tok.str,"qword")){ src=nextToken(&tok,src); #if 1 /* 99/09/28 ptr 演算子があれば飛ばす(NASM対応) */ if(tok.type==TOKEN_STR && !stricmp(tok.str,"ptr")){ src=nextToken(&tok,src); } #else if(tok.type!=TOKEN_STR || stricmp(tok.str,"ptr")){ return errMes(ERR_PTR); } src=nextToken(&tok,src); #endif canOmitKakko++; /* '[',']'を省略してもよい */ } /* sregがあるかどうかの解析 */ code=getSegRegCode(tok.str); if(code!=-1){ /* sregであった */ adr->seg=code; src=nextToken(&tok,src); if(tok.type!=TOKEN_COLON){ /* sregの次は':'でないといけない */ return errMes(ERR_SEG); } src=nextToken(&tok,src); } } if(canOmitKakko){ if(tok.type==TOKEN_OPEN){ canOmitKakko=0; /* もし'['があるのなら']'は省略不可になる */ src=nextToken(&tok,src); } }else{ if(tok.type!=TOKEN_OPEN){ /* '['で始まるはず */ return errMes(ERR_OPEN); } src=nextToken(&tok,src); } /* [base+index+disp]の解析 */ for(;;){ if(tok.type==TOKEN_STR){ code=get32bitRegCode(tok.str); if(code!=-1){ /* レジスタをみっけた */ src=nextToken(&tok,src); if(tok.type==TOKEN_MUL){ /* indexレジスタか? */ if(indexFlag)return errMes(ERR_DOUBLE_INDEX); if(code==ESP_CODE)return errMes(ERR_ESP_INDEX); indexFlag++; adr->index=code; /* "reg * ?"の?を求める */ src=nextToken(&tok,src); if(tok.str[1]!=NUL)return errMes(ERR_SCALE); switch(tok.str[0]){ case '1': adr->scale=0; break; case '2': adr->scale=1; break; case '4': adr->scale=2; break; case '8': adr->scale=3; break; default: return errMes(ERR_SCALE); } src=nextToken(&tok,src); /* 次のを取り出す */ }else{ /* 今度はbaseレジスタ解析 */ if(baseFlag){ /* 既にbaseが使われているならindexとして */ if(indexFlag)return errMes(ERR_DOUBLE_INDEX); if(code==ESP_CODE)return errMes(ERR_ESP_INDEX); indexFlag++; adr->scale=0; adr->index=code; }else{ baseFlag++; adr->base=code; } } /* レジスタ解析終わり */ /* レジスタの次は'+'または'-'または']'でないと駄目 */ if( tok.type!=TOKEN_ADD && tok.type!=TOKEN_SUB && (!canOmitKakko && tok.type!=TOKEN_CLOSE)){ return errMes(ERR_REG_NEXT); } /* レジスタの前は'+'でないといけない */ len=strlen(buf); if(len>0){ if(buf[len-1]!='+')return errMes(ERR_REG_PREV); buf[len-1]=NUL;/* displacementからregを除くため */ } } } if(tok.type==TOKEN_NONE)break; /* bufにくっつける */ if(tok.type==TOKEN_STR){ if(prevFlag)return errMes(ERR_STR); prevFlag=1; }else{ prevFlag=0; } len=strlen(buf)+strlen(tok.str); if(len>=sizeof(adr->disp))return errMes(ERR_TOO_LONG); strcat(buf,tok.str); src=nextToken(&tok,src); } len=strlen(buf); if(adr->base==-1 && adr->index==-1 && len<=1)return errMes(ERR_NOTHING); /* 最後は']'で終わるはず */ if(buf[len-1]==']'){ if(canOmitKakko)return errMes(ERR_OPEN); /* '['はないんだから */ buf[len-1]=NUL; }else{ if(!canOmitKakko)return errMes(ERR_CLOSE); } return NOERR; } /* * オペランド解析 * 汎用レジスタ->そのコード * MMXレジスタ ->そのコード * 即値 ->その値 * アドレッシングモード->その形 */ static int analyzeOperand(OPERAND *ope,char *src){ int ret; int32 num; TOKEN tok; nextToken(&tok,src); if(tok.type==TOKEN_NONE){ ope->type=tNONE; return NOERR; } ret=get32bitRegCode(tok.str); if(ret!=-1){ ope->type=tR32; ope->ope.reg=ret; return NOERR; } ret=getMMXRegCode(tok.str); if(ret!=-1){ ope->type=tMMX; ope->ope.reg=ret; return NOERR; } /* 以下2つの関数へはtokenに区切らないで渡す */ if(getNumber(&num,src)==NOERR){ ope->type=tIMM8; ope->ope.imm=num; return NOERR; } if(analyzeAddressing(&ope->ope.adr,src)==ERR)return ERR; ope->type=tMEM; return NOERR; } /* * srcはnextToken()で区切られた文字列 * 適合する命令の番号を返す */ static int searchCode(OPECODE *code,char *src){ char buf[12]; char *p; int i; if(strlen(src)>=sizeof(buf)){ code->group=NO_MATCH; code->num=0; return NOERR; } p=buf; for(p=buf;*src;src++){ *p++=tolower(*src); } *p=NUL; for(i=0;igroup=MMX_CODE; code->num=i; return NOERR; } } for(i=0;igroup=_3DNOW_CODE; code->num=i; return NOERR; } } for(i=0;igroup=PREFETCH_CODE; code->num=i; return NOERR; } } code->group=NO_MATCH; code->num=0; return NOERR; } /* * コメント削除及び'\n'の削除 */ static void deleteComment(char *dst,char *src){ char *p; int len; p=strchr(src,';'); if(p){ strncpy(dst,src,p-src); dst[p-src]=NUL; }else{ strcpy(dst,src); } len=strlen(dst); #if 0 if(len>0 && dst[len-1]=='\n')dst[len-1]=NUL; /* '\n' の削除 */ #endif } /* * 1行のデータからラベル、オペコード、オペランドを解析する */ int analyzeCode(CODE *code,char *src){ char buf[strLenMax]; TOKEN prevTok; TOKEN nowTok; CODE_MAP *map; char *p,*q; /* 変数初期化 */ code->label[0]=NUL; code->icode.group=NO_MATCH; /* コメント削除 */ deleteComment(buf,src); /* ラベル検出 */ p=nextToken(&prevTok,buf); if(prevTok.type!=TOKEN_STR)return NOERR; p=nextToken(&nowTok,p); if(nowTok.type==TOKEN_COLON){ /* prevはラベルであった */ if(strlen(prevTok.str)>=sizeof(code->label)){ return errMes(ERR_TOO_LONG); } strcpy(code->label,prevTok.str); p=nextToken(&prevTok,p); /* もう一度取り直す */ p=nextToken(&nowTok,p); } /* prevは命令であるはず */ if(prevTok.type==TOKEN_NONE)return NOERR; if(prevTok.type!=TOKEN_STR)return errMes(ERR_OPERAND); if(searchCode(&code->icode,prevTok.str)==ERR)return ERR; if(code->icode.group==NO_MATCH)return NOERR; /* 2つ目のオペランドがあるか? */ q=strchr(p,','); if(q){ *q=NUL; /* 1つ目と2つ目を区切る */ if(analyzeOperand(&code->ope2,q+1)==ERR)return ERR; }else{ code->ope2.type=tNONE; } /* 1つ目のオペランド解析(空かもしれない) */ if(analyzeOperand(&code->ope1,nowTok.begin)==ERR)return ERR; map=getCodeProperty(code->icode); if((map->ope1 & code->ope1.type) && (map->ope2 & code->ope2.type)){ return NOERR; } /* ここはかなり苦しい オペランドによってmodR/Mが変わるもののため */ if(!strcmp(map->name,map[1].name) && (map[1].ope1 & code->ope1.type) && (map[1].ope2 & code->ope2.type)){ code->icode.num++; return NOERR; } return errMes(ERR_OPERAND_OPECODE); } #if 0 static char regR32[8][4]={ "eax","ecx","edx","ebx","esp","ebp","esi","edi" }; void putAdr(ADDRESSING adr){ printf("seg=%x\n",adr.seg); printf("base=%s\n" ,(adr.base!=-1) ?regR32[adr.base] :"none"); printf("index=%s\n",(adr.index!=-1)?regR32[adr.index]:"none"); if(adr.index!=-1){ printf("scale=%d\n",1<group==NO_MATCH){ puts("code none"); return; } m=getCodeProperty(*c); printf("kind of code is %s:" ,(c->group==MMX_CODE)?"MMX" :(c->group==_3DNOW_CODE)?"3D Now!" :(c->group==PREFETCH_CODE)?"prefetch":"err"); printf("%s [%x][%x]\n",m->name,m->code,m->mod); if(code.ope1.type==tNONE){ puts("ope1=none");return; } putOPERAND(code.ope1); if(code.ope2.type==tNONE){ puts("ope2=none");return; } putOPERAND(code.ope2); } int main(int argc,char *argv[]){ CODE code; argc--,argv++; printf("cmd=%s\n",*argv); if(analyzeCode(&code,*argv)==ERR)return ERR; putCODE(code); return NOERR; } #endif gogo239b/mmx/parser.h100644 23421 144 4123 7220537254 13602 0ustar shigeousers#ifndef _PARSER_H #define _PARSER_H #define strLenMax 200 /* 文字の最大の長さ */ #define ESP_CODE 4 #define EBP_CODE 5 /* コードの情報 */ typedef struct{ char name[12]; int ope1,ope2; byte code,mod; }CODE_MAP; /* オペコードの種類 */ typedef enum{ NO_MATCH,MMX_CODE,_3DNOW_CODE,PREFETCH_CODE }OPECODE_GROUP; typedef struct{ OPECODE_GROUP group; int num; /* 命令の内部番号 */ }OPECODE; /* アドレッシング */ typedef struct{ char seg; /* セグメント (無しなら-1) */ char base; /* ベース (同様) */ char index; /* インデックス (同様) */ char scale; /* *1,*2,*4,*8 それぞれに対し 0, 1, 2, 3 */ char disp[40]; /* '['と']'を含まない定数を表す文字列 */ }ADDRESSING; /* オペランドの種類 */ enum{ tNONE=1 ,tMMX =2 ,tR32 =4 ,tMEM =8 ,tIMM8 =16 }; typedef struct{ int type; /* or を使いたいのでenumを使わない */ union{ int reg; /* レジスタコード */ int32 imm; /* 即値 */ ADDRESSING adr; /* メモリ */ }ope; }OPERAND; /* "label:opecode operand1,operan2" をまとめた構造体 */ typedef struct{ char label[40]; /* ラベル */ OPECODE icode; /* mnemonicの内部番号(-1は該当無し) */ OPERAND ope1,ope2; }CODE; /* 文字解析用 */ typedef enum{ TOKEN_NONE, /* 何も無い */ TOKEN_COLON, /* ':' */ TOKEN_COMMA, /* ',' */ TOKEN_ADD, /* '+' */ TOKEN_SUB, /* '-' */ TOKEN_MUL, /* '*' */ TOKEN_OPEN, /* '[' */ TOKEN_CLOSE, /* ']' */ TOKEN_EQU, /* '=' */ TOKEN_STR /* ' ','\t' と上の文字を含まない文字列 */ }TOKEN_TYPE; typedef struct{ TOKEN_TYPE type; char str[strLenMax]; char *begin; /* 取り出した文字列があった位置 */ }TOKEN; /* * TOKEN_TYPEに対応する次の文字を取ってくる * tok->begin=取り出した文字列があったポインタ * 取り出した文字列の最後の文字があったポインタ+1を返す * *src==NULの場合はsrcを返す */ char *nextToken(TOKEN *tok,char *src); /* * 解析したオペランドの情報を得る * opeは正しい値でないといけない */ CODE_MAP *getCodeProperty(OPECODE ope); /* * 1行のデータからラベル、オペコード、オペランドを解析する */ int analyzeCode(CODE *code,char *src); #endif gogo239b/mmx/readme_e.txt100644 23421 144 144 7220537254 14416 0ustar shigeousers pre-processor for Enhanced 3D Now! by shigeo This source is not GPL but free-software. gogo239b/gogo_con.dsw100644 23421 144 1043 7220537347 13646 0ustar shigeousersMicrosoft Developer Studio Workspace File, Format Version 6.00 # 警告: このワークスペース ファイル を編集または削除しないでください! ############################################################################### Project: "GOGO_CON"=".\gogo_con.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### gogo239b/grinfo.inc100644 23421 144 607 7220537347 13301 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; l3side.hのgrinfoとの整合性注意 ; 構造体を使ってないのは-f objでなんか変になるから quantizerStepSize equ 0 window_switching_flag equ 4 block_type equ 8 count1 equ 12 big_values equ 16 sfb_lmax equ 20 sfb_smax equ 24 count1table_select equ 28 ;sizeof(gr_info) = 28 * 4 %define Size_gr_info dwsizen(28) gogo239b/haveunit.h100644 23421 144 2534 7220537347 13337 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 shigeo */ #ifndef _CHKCPU_H #define _CHKCPU_H #define tFPU (1<<0) #define tMMX (1<<1) #define t3DN (1<<2) #define tSSE (1<<3) #define tCMOV (1<<4) #define tE3DN (1<<5) /* Athlon用(Externd 3D Now!) */ #define tEMMX (1<<6) /* EMMX=E3DNow!_INT=SSE_INT */ #define tINTEL (1<<8) #define tAMD (1<<9) #define tCYRIX (1<<10) #define tIDT (1<<11) #define tMULTI (1<<12) /* for Multi-threaded encoder. */ /* Never set on UP or in the binary linked w/o multithread lib. */ #define tUNKNOWN (1<<15) /* ベンダー不明 */ #define tSPC1 (1<<16) /* 特別なスイッチ */ #define tSPC2 (1<<17) /* 用途は決まってない */ #define tFAMILY4 (1<<20) /* 486 この時ベンダー判定は当てにならない */ #define tFAMILY5 (1<<21) /* 586 (P5, P5-MMX, K6, K6-2, K6-III) */ #define tFAMILY6 (1<<22) /* 686以降 P-Pro, P-II, P-III, Athlon */ /* * 搭載しているユニットに従って上の値の論理和を返す * chkcpu.asmとの整合性注意 */ int haveUNIT(void); /* * useUNITに従って関数の使用を変更する */ void setupUNIT(int useUNIT); /* * SSEを四捨五入モードにする */ void setPIII_round(void); /* * 使用関数の表示(デバッグ用) */ void SETUP_DSP(char *mes); #ifdef WIN32 void maskFPU_exception( void ); #endif #if 0 #define SETUP_DEBUG #ifdef SETUP_DEBUG #define SETUP_DSP(x) fprintf(stderr,x) #else #define SETUP_DSP(x) #endif #endif #endif gogo239b/haveunit.nas100644 23421 144 11152 7220537347 13705 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; modified by Keiichi SAKAI, URURI, Hash ; 99/07/29 ; 99/09/06 フラグ追加 ; 99/09/07 SSEの処理を別にする ; 99/09/29 Cx586対策 ; 99/11/10 Cxrix対策 ; int haveUNIT(void); ; 486未満のCPUまたはFPUを搭載していなければ0 ; それ以外は次の値の論理和 ; PIIIでは丸め誤差を四捨五入モードにする(らしい) ; haveunit.hとの整合性注意 %include "nasm.h" tFPU equ (1<<0) tMMX equ (1<<1) t3DN equ (1<<2) tSSE equ (1<<3) tCMOV equ (1<<4) tE3DN equ (1<<5) ;/* Athlon用 (extend 3D Now!)*/ tEMMX equ (1<<6) ;/* EMMX=E3DNow!_INT=SSE_INT */ tSPC1 equ (1<<16) ;/* 特別なスイッチ */ tSPC2 equ (1<<17) ;/* 用途は決まってない */ tINTEL equ (1<<8) tAMD equ (1<<9) tCYRIX equ (1<<10) tIDT equ (1<<11) tUNKNOWN equ (1<<15) ;ベンダーが分からない tFAMILY4 equ (1<<20) ;/* 486 この時ベンダー判定は当てにならない */ tFAMILY5 equ (1<<21) ;/* 586 (P5, P5-MMX, K6, K6-2, K6-III) */ tFAMILY6 equ (1<<22) ;/* 686以降 P-Pro, P-II, P-III, Athlon */ globaldef haveUNIT globaldef setPIII_round globaldef maskFPU_exception segment_data segment_code ACflag equ (1<<18) IDflag equ (1<<21) align 16 haveUNIT: push ebx push esi xor esi,esi call near haveFPU jnz near .Lexit or esi,tFPU pushfd ;flag保存 pushfd pop eax ;eax=flag or eax,ACflag ;eax=flag|ACflag push eax popfd ;flag=eax pushfd pop eax ;eax=flag popfd ;flag復元 test eax,ACflag ;ACflagは変化したか? jz near .Lexit ;486以降 pushfd ;flag保存 pushfd pop eax ;eax=flag or eax,IDflag ;eax=flag|IDflag push eax popfd ;flag=eax pushfd pop eax ;eax=flag popfd ;flag復元 test eax,IDflag ; jz short .Lexit jnz .L586 %if 1 ;Cyrix 486CPU check Cyrix の HP にあったやつ by Hash xor ax, ax ; clear ax sahf ; clear flags, bit 1 is always 1 in flags mov ax, 5 mov bx, 2 div bl ; do an operation that does not change flags lahf ; get flags cmp ah, 2 ; check for change in flags jne .L486intel ; flags changed not Cyrix or esi,tCYRIX ; TRUE Cyrix CPU jmp .L486 .L486intel: or esi,tINTEL .L486: or esi,tFAMILY4 jmp .Lexit %else ; check for Cyrix 486DLC -- based on check routine ; documented in "Cx486SLC/e SMM Programmer's Guide" xor dx,dx cmp dx,dx pushf pop cx mov ax,0FFFFh mov bx,4 div bx pushf pop ax and ax,8D5h and cx,8D5h cmp ax,cx jnz .L486intel or esi,tCYRIX jmp .L486 .L486intel: or esi,tINTEL .L486: or esi,tFAMILY4 jmp .Lexit %endif .L586: ;cpuid は eax,ebx,ecx,edxを破壊するので注意!!! xor eax,eax cpuid ; cmp ecx,"letn" cmp ecx,"ntel" ;うわ〜NASMと反対に配置するんだ jne .F00 or esi,tINTEL jmp .F09 .F00: ; cmp ecx,"DMAc" cmp ecx,"cAMD" jne .F01 or esi,tAMD jmp .F09 .F01: ; cmp ecx,"daet" cmp ecx,"tead" jne .F02 or esi,tCYRIX jmp .F09 .F02: ; cmp ecx,"slua" cmp ecx,"auls" jne .F03 or esi,tIDT jmp .F09 .F03: or esi,tUNKNOWN jmp .F09 .F09: mov eax,1 cpuid cmp ah,4 jne .F10 or esi,tFAMILY4 jmp .Lexit .F10: cmp ah,5 jne .F11 or esi,tFAMILY5 jmp .F19 .F11: cmp ah,6 jne .F12 or esi,tFAMILY6 jmp .F19 .F12: or esi,tFAMILY6 ; 7以上は6と見なす .F19: ;for AMD, IDT mov eax,80000001h cpuid test edx,(1 << 31) jz .F20 or esi,t3DN .F20: test edx,(1 << 15) ;CMOVcc jz .F21 ; test edx,(1 << 16) ;FCMOVcc ;K7から変更 by URURI ; jz .F21 or esi,tCMOV .F21: test edx,(1 << 30) ;拡張 3D Now! jz .F22 %ifdef USE_E3DN or esi,tE3DN %endif .F22: test edx,(1 << 22) ;AMD MMX Ext jz .F23 or esi,tEMMX .F23: ;Intel系 mov eax,1 cpuid test edx,(1 << 23) jz .F30 or esi,tMMX .F30: test edx,(1 << 15) ;CMOVcc and FCMOV if FPU=1 jz .F31 or esi,tCMOV .F31: test edx,(1 << 25) jz short .Lexit or esi,tEMMX %ifndef UNAVAILABLE_SSE or esi,tSSE %endif .Lexit: mov eax,esi pop esi pop ebx ret ; in:none ; out:ZF FPUあり=1, なし=0 ; dest:eax align 16 haveFPU: mov al,1 fninit fnstsw ax cmp al,0 jne short .LhF_exit sub esp,4 fnstcw word [esp] mov ax,[esp] add esp,4 and ax,103Fh cmp ax,3Fh .LhF_exit: ret setPIII_round: ;P-IIIのSSEを確実に四捨五入モードに ; mov eax,0x1f80 ; default mode mov eax,0x9f80 ; flush to ZERO mode push eax ldmxcsr [esp] ; setup MXCSR pop eax ret ; for Win32 Delphi maskFPU_exception: push eax fnstcw word [esp] and word [esp],0xFFF2 fldcw word [esp] pop eax ret end gogo239b/history100644 23421 144 12076 7220537347 13011 0ustar shigeousersver. 2.22 priority of the encoding threads was lowered only for BeOS MT ( Freeze countermeasure of Media_add_on_server ) Bug report from Scot Hacker.Thanks! ( by Noisyu ) correction of a bug of '-test' only for MT ( by sakai ) ver. 2.22c NASM fails to assemble pushf and popf ( nasm.h, haveunit.nas ) bug of using rdtsc ( l3bitstm.c ) inconsistent bit_stream_struc ( putbit.nas, bitstream.c ) bring thread-priority down for BeOS ( musenc.c ) bug fix of analisys of bswap option ( musui.c ) addition of delete-option ( musui.c by Steve ) ver. 2.22d how to detective Cyrix CPU ( haveunit.nas by Hash ) frame_shiftin_MMX ( l3psya.nas by sakai ) fft_side_SSE ( fftsse.nas by sakai ) calc_pow4P3dual_SSE ( quantize.nas by sakai ) optimize fft{1k,255}_SSE ( fftsse.nas by sakai ) ver. 2.22e correction of a bug of sampling-converter for 32kHz ( readsmpl.c by PEN ) encode-priority was made possible for BeOS MT ( musenc.c musen.c by Noisyu ) read-priority was made possible for BeOS MT ( musenc.c readsmpl.c by Noisyu ) optimize window_filter_subband_SSE ( sbandsse.nas by sakai ) ver. 2.22f remove movups ( quantize.nas by sakai ) optimize mdctsse.nas ( by sakai ) support stdin-mode for WinNT ( by shigeo. Thanks to Tomoya Tokairin ) ver. 2.22g rename mdctsse.nas as msubsse.nas and optimize this ( by sakai ) optimize calc_pow4P3dual_3DN ( by kei ) ver. 2.22h calc_phase_SSE ( by sakai ) make table for getframebits ( by kei ) count_nz_xr_{3DN, MMX} ( by kei ) set_l3_enc_sign_{3DN, MMX} ( by kei ) ver. 2.23 bug fix of WAV_checkFMT ( by shigeo ) ver. 2.23a calc_phase_3DN ( by shigeo ) ver. 2.23b starting to follow LAME3.55 ( by shigeo ) ver. 2.23c optimization of count_bits ( by shigeo ) SMP for OS/2 ( by Samuel Audet ) ver. 2.23d including VBR routines in LAME3.55 partially ( by shigeo ) ver. 2.23e combinig calc_runlen with count1_bitcount ( by shigeo ) ( cf. takehiro.c, speed is same ) addition of bOutputVBR_userfunc ( by PEN ) ver. 2.24 optimization of count_bits_NONE ( by shigeo ) ver. 2.24a modification of 16kHz table.c ( by shigeo ) modification of makefile.beos ( by Noisyu ) ver. 2.24b optimization of quantize_xrpow_SSE ( by sakai ) optimization of count_nz_xr_E3DN, ms_convert_E3DN, set_l3_enc_sign_E3DN, window_filter_subband_E3DN ( by kei ) bug fix of miss alignment of l3_sb_sample ( by PEN ) bug fix of HuffmanCode ( by shigeo ) ver. 2.24c modification in sband3dn.nas for my pri-processor ( by shigeo ) setting file attribute in bitstem.c ( by PEN ) makefile.wc for Watcom-C/C++ ( by sava ) ver. 2.24d uninitialized variables are found ( by PEN ) ver. 2.24e unreleased memory are found ( by shigeo ) patch for cdda2mp3.bsd ( by taoka@infonets.hiroshima-u.ac.jp ) ver. 2.24f bug fix of bigv_bitcount ( by shigeo ) inline HuffmanCode ( by sakai ) ver. 2.25 putting global variables in order ( by shigeo ) modification for MT ( by sakai ) ver. 2.25a GREAT! l3bs.c maked ( by sakai ) (combinating l3bitstm.c with formatbs.c ) a little optimization ( by shigeo ) ver. 2.25b further high optimization of l3bs.c ( by sakai and shigeo ) ver. 2.25c supporting mp3 wrapped by WAV-RIFF ( by kei ) addition verify, output directory options ( by shigeo ) ver. 2.25d wait for realtime-encoding in readsmpl.c ( by zin ) bug fix of subdivide ( by shigeo ) wrapped mp3 option ( by kei ) ver. 2.26 bug fix of wrapped mp3 ( by kei ) check length of name of file ( by shigeo ) ver. 2.26a bug fix of subdivide again ( by shigeo ) calc_pe_3DN ( by shigeo ) calc_pow075_E3DN ( by kei ) ver. 2.26b calc_runlen_count1_CMOV ( by kei ) makefile.cygwin ( by kei ) ver. 2.26c bug fix of WAV-RIFF ( by kei ) modification of window_subband ( by sakai ) ver. 2.26d low-pass filter ( by PEN ) optimized msubsse.nas ( by sakai ) ver. 2.26e optimized window_filter_subband ( by sakai ) ver. 2.27 restraion pre-echo in low-bitrate encoding ( by PEN ) filter for VBR ( by PEN ) high optimization for SMP and SSE ( by sakai ) separete messages from main program ( by shigeo ) Thanks R. Demmer for german.msg ver. 2.28 a little bug fix support -lpf, -br, -th options ( by PEN & shigeo ) support LC_MESSAGES, LC_ALL, LANG ( by shigeo ) ver. 2.29 new window_filter_subband_{3DN, E3DN} ( by kei-i ) ver. 2.30fi new Makefile ( by sakai ) calc_xmin_long_3DN ( by shigeo ) bug fix of VBR ( by PEN ) ver. 2.31 bug fix of readsmp.c ( by PEN ) change how to count the number of CPUs ( by sakai ) ver. 2.32 spanish.msg ( by Vicente Aguilar ) ver. 2.33 Windows Version ST/MT performance increased ( by PEN ) ver. 2.34 make sprint_* as a joke ( by sakai ) frame_shiftin_EMMX_MULTI ( by sakai ) ver. 2.35 translate readme_e.txt into German ( by R. Demmer ) translate resource of Windows-GUI into German ( by R. Schmitz ) make fft faster ( by URURI ) gogo239b/huffcode.tbl100644 23421 144 41572 7220537347 13656 0ustar shigeousers/* * for new GOGO-no-coda (2000/01) * modified by shigeo */ /* from tables.c and takehiro.c in lame3.60 */ static unsigned int htbl1[] = { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}; static unsigned int htbl2[] = { 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0}; static unsigned int htbl3[] = { 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0}; static unsigned int htbl5[] = { 1, 2, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 1, 0}; static unsigned int htbl6[] = { 7, 3, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 2, 0}; static unsigned int htbl7[] = { 1, 2,10,19,16,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 7,10, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 4,13,17, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,11,18,15,11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 9,14, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 5, 3, 2, 0}; static unsigned int htbl8[] = { 3, 4, 6, 18,12, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2, 16, 9, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 5, 14, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19,17,15, 13,10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 5, 8, 11, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 4, 4, 1, 1, 0}; static unsigned int htbl9[] = { 7, 5, 9, 14, 15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 5, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 8, 8, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 6, 9, 10, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 7, 9, 6, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 4, 6, 2, 6, 0}; static unsigned int htbl10[] = { 1, 2, 10, 23, 35, 30, 12, 17, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 8, 12, 18, 21, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 11, 9, 15, 21, 32, 40, 19, 6, 0, 0, 0, 0, 0, 0, 0, 0, 14,13, 22, 34, 46, 23, 18, 7, 0, 0, 0, 0, 0, 0, 0, 0, 20,19, 33, 47, 27, 22, 9, 3, 0, 0, 0, 0, 0, 0, 0, 0, 31,22, 41, 26, 21, 20, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 14,13, 10, 11, 16, 6, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7, 8, 4, 4, 2, 0}; static unsigned int htbl11[] = { 3, 4, 10, 24, 34, 33, 21, 15, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 4, 10, 32, 17, 11, 10, 0, 0, 0, 0, 0, 0, 0, 0, 11, 7, 13, 18, 30, 31, 20, 5, 0, 0, 0, 0, 0, 0, 0, 0, 25,11, 19, 59, 27, 18, 12, 5, 0, 0, 0, 0, 0, 0, 0, 0, 35,33, 31, 58, 30, 16, 7, 5, 0, 0, 0, 0, 0, 0, 0, 0, 28,26, 32, 19, 17, 15, 8, 14, 0, 0, 0, 0, 0, 0, 0, 0, 14,12, 9, 13, 14, 9, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 11, 4, 6, 6, 6, 3, 2, 0}; static unsigned int htbl12[] = { 9, 6, 16, 33, 41, 39, 38,26, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5, 6, 9, 23, 16, 26,11, 0, 0, 0, 0, 0, 0, 0, 0, 17, 7, 11, 14, 21, 30, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 17, 10, 15, 12, 18, 28, 14, 5, 0, 0, 0, 0, 0, 0, 0, 0, 32, 13, 22, 19, 18, 16, 9, 5, 0, 0, 0, 0, 0, 0, 0, 0, 40, 17, 31, 29, 17, 13, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 27, 12, 11, 15, 10, 7, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 27, 12, 8, 12, 6, 3, 1, 0}; static unsigned int htbl13[] = { 1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, 3, 4, 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, 15, 13, 23, 36, 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, 22, 20, 37, 61, 56, 79, 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, 35, 16, 60, 57, 97, 75,114, 91, 54, 73, 55, 41, 48, 53, 23, 24, 58, 27, 50, 96, 76, 70, 93, 84, 77, 58, 79, 29, 74, 49, 41, 17, 47, 45, 78, 74,115, 94, 90, 79, 69, 83, 71, 50, 59, 38, 36, 15, 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44, 43, 42, 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16, 53, 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, 35, 33, 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, 53, 25, 23, 38, 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, 34, 32, 28, 39, 49, 75, 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, 45, 21, 34, 64, 56, 50, 49, 45, 31, 19, 12, 15, 10, 7, 6, 3, 48, 23, 20, 39, 36, 35, 53, 21, 16, 23, 13, 10, 6, 1, 4, 2, 16, 15, 17, 27, 25, 20, 29, 11, 17, 12, 16, 8, 1, 1, 0, 1}; static unsigned int htbl15[] = { 7, 12, 18, 53, 47, 76,124,108, 89,123,108,119,107, 81,122, 63, 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36, 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56, 33, 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29, 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27, 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38, 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30, 109, 53, 49, 94, 88, 75, 66,122, 91, 73, 56, 42, 64, 44, 21, 25, 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20, 71, 34, 67, 60, 58, 49, 88, 76, 67,106, 71, 54, 38, 39, 23, 15, 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9, 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11, 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7, 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3, 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1, 71, 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0}; static unsigned int htbl16[] = { 1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195, 376, 17, 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119, 201, 107, 207, 9, 15, 13, 23, 38, 67, 58, 103, 90, 161, 72, 127, 117, 110, 209, 206, 16, 45, 21, 39, 69, 64,114, 99, 87, 158, 140, 252, 212, 199, 387, 365, 26, 75, 36, 68, 65,115,101, 179,164, 155, 264, 246, 226, 395, 382, 362, 9, 66, 30, 59, 56,102,185, 173,265, 142, 253, 232, 400, 388, 378, 445, 16, 111, 54, 52,100,184,178, 160,133, 257, 244, 228, 217, 385, 366, 715, 10, 98, 48, 91, 88,165,157, 148,261, 248, 407, 397, 372, 380, 889, 884, 8, 85, 84, 81,159,156,143, 260,249, 427, 401, 392, 383, 727, 713, 708, 7, 154, 76, 73,141,131,256, 245,426, 406, 394, 384, 735, 359, 710, 352, 11, 139, 129, 67,125,247,233, 229,219, 393, 743, 737, 720, 885, 882, 439, 4, 243, 120,118,115,227,223, 396,746, 742, 736, 721, 712, 706, 223, 436, 6, 202, 224,222,218,216,389, 386,381, 364, 888, 443, 707, 440, 437,1728, 4, 747, 211,210,208,370, 379,734,723, 714,1735, 883, 877, 876,3459, 865, 2, 377, 369,102,187, 726,722,358,711, 709, 866,1734, 871,3458, 870, 434, 0, 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7, 5, 3, 1, 3}; static unsigned int htbl24[] = { 15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032, 88, 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297, 279, 42, 47, 22, 41, 74, 68, 128, 120, 221, 207, 194, 182, 340, 315, 295, 541, 18, 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325, 311, 293, 271, 16, 147, 72, 69,135, 127, 118, 112, 210, 200, 188, 352, 323, 306, 285, 540, 14, 263, 66,129,126, 119, 114, 214, 202, 192, 180, 341, 317, 301, 281, 262, 12, 249,123,121,117, 113, 215, 206, 195, 185, 347, 330, 308, 291, 272, 520, 10, 435,115,111,109, 211, 203, 196, 187, 353, 332, 313, 298, 283, 531, 381, 17, 427,212,208,205, 201, 193, 186, 177, 169, 320, 303, 286, 268, 514, 377, 16, 335,199,197,191, 189, 181, 174, 333, 321, 305, 289, 275, 521, 379, 371, 11, 668,184,183,179, 175, 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, 652,346,171,168, 164, 318, 309, 299, 287, 276, 263, 513, 375, 368, 362, 6, 648,322,316,312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, 620,300,296,294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, 1033,280,278,274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0, 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1, 3}; static unsigned int htbl32[] = { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1}; static unsigned int htbl33[] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen1[] = { 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen2[] = { 1, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 6}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen3[] = { 2, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 6}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen5[] = { 1, 3, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 8}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen6[] = { 3, 3, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 6, 7}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen7[] = { 1, 3, 6, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 6, 7, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 7, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 8, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 8, 9, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 9,10,10,10}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen8[] = { 2, 3, 6, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 4, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 6, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 9, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 7, 8, 9,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 9, 9,11,11}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen9[] = { 3, 3, 5, 6, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 4, 5, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 6, 7, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 7, 8, 8, 9, 9}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen10[] = { 1, 3, 6, 8, 9, 9, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 6, 7, 8, 9, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 7, 8, 9,10, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 8, 9,10,10, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 9,10,10,10,10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,10,10,11,11,10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 9,10,10,10,11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 9,10,10,11,11, 11}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen11[] = { 2, 3, 5, 7, 8, 9, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 4, 6, 8, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 6, 7, 8, 9, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 9, 8, 10, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 9, 9, 10, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 9,10,10, 11, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 8, 7, 7, 8, 9, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 8, 7, 8, 9,10, 10, 10, 10}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen12[] = { 4, 3, 5, 7, 8, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 4, 5, 7, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 5, 6, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 6, 6, 7, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 7, 7, 8, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 7, 8, 8, 8, 9, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 7, 7, 8, 8, 9, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 8, 9, 9, 9, 9,10}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen13[] = { 1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6, 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12, 6, 6, 7, 8, 9, 9, 10, 10, 9, 10, 10, 11, 11, 12, 13, 13, 7, 7, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13, 8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12, 12, 13, 13, 14, 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14, 14, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16, 9, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15, 10, 9, 10, 10, 11, 11, 11, 13, 12, 13, 13, 14, 14, 14, 16, 15, 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14, 13, 14, 15, 16, 17, 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15, 15, 16, 11, 11, 11, 12, 12, 13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 12, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16, 13, 12, 12, 13, 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16, 12, 12, 13, 14, 14, 14, 15, 14, 15, 15, 16, 16, 19, 18, 19, 16}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen15[] = { 3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13, 4, 3, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 5, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12, 9, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 12, 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13, 11, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 12, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13, 12, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen16[] = { 1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9, 3, 4, 6, 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8, 6, 6, 7, 8, 9, 9, 10, 10, 11, 10, 11, 11, 11, 12, 12, 9, 8, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 10, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 9, 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14, 10, 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10, 10, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10, 11, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 13, 14, 13, 11, 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 15, 14, 10, 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 14, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11, 14, 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11, 13, 13, 11, 12, 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11, 9, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8}; /* huffmana.nas 、ヌサイセネ、ケ、 */ unsigned int hlen24[] = { 4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8, 6, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 7, 7, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 7, 8, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 7, 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 7, 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7, 10, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 8, 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8, 12, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 4}; /* static quantize.nas 、ヌサイセネ、ケ、 */ unsigned int hlen32[] = { 1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6, }; /* static quantize.nas 、ヌサイセネ、ケ、(、ウ、テ、チ、マチエノ4、タ) */ unsigned int hlen33[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; /* sizeof(ht)=16 、マクヌト(huffmana.nas、ヌサネ、テ、ニ、。ェ) */ /* xlen, ylen、マノヤヘラ */ struct huffcodetab ht[] = { { 0, 0, NULL , NULL }, // 0 { 0, 0, htbl1 , hlen1 }, // 1 { 0, 0, htbl2 , hlen2 }, // 2 { 0, 0, htbl3 , hlen3 }, // 3 { 0, 0, NULL , NULL }, // 4 { 0, 0, htbl5 , hlen5 }, // 5 { 0, 0, htbl6 , hlen6 }, // 6 { 0, 0, htbl7 , hlen7 }, // 7 { 0, 0, htbl8 , hlen8 }, // 8 { 0, 0, htbl9 , hlen9 }, // 9 { 0, 0, htbl10, hlen10}, //10 { 0, 0, htbl11, hlen11}, //11 { 0, 0, htbl12, hlen12}, //12 { 0, 0, htbl13, hlen13}, //13 { 0, 0, NULL , NULL }, //14 { 0, 0, htbl15, hlen15}, //15 { 1, 1, htbl16, hlen16}, //16 { 2, 3, htbl16, hlen16}, //17 { 3, 7, htbl16, hlen16}, //18 { 4, 15, htbl16, hlen16}, //19 { 6, 63, htbl16, hlen16}, //20 { 8, 255, htbl16, hlen16}, //21 {10, 1023, htbl16, hlen16}, //22 {13, 8191, htbl16, hlen16}, //23 { 4, 15, htbl24, hlen24}, //24 { 5, 31, htbl24, hlen24}, //25 { 6, 63, htbl24, hlen24}, //26 { 7, 127, htbl24, hlen24}, //27 { 8, 255, htbl24, hlen24}, //28 { 9, 511, htbl24, hlen24}, //29 {11, 2047, htbl24, hlen24}, //30 {13, 8191, htbl24, hlen24}, //31 { 0, 0, htbl32, hlen32}, //32 { 0, 0, htbl33, hlen33}, //33 }; gogo239b/huffman.c100644 23421 144 211 7220537347 13101 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 shigeo */ #include #include "huffman.h" #include "huffcode.tbl" gogo239b/huffman.h100644 23421 144 1102 7220537347 13126 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 PEN@MarineCat, shigeo */ #ifndef _HUFFMAN_H #define _HUFFMAN_H /* huffmana.nasで使うので変更要注意( 特にsizeof(ht) ) */ struct huffcodetab { unsigned int linbits; /* number of linbits */ unsigned int linmax; /* max number to be stored in linbits */ unsigned int *table; unsigned int *hlen; /* char -> int by shigeo (00/02/01) */ }; extern struct huffcodetab ht[34]; int HuffmanCode( int table_select, int x, int y, unsigned *code, unsigned int *extword, int *codebits, int *extbits ); #endif /* _HUFFMAN_H */ gogo239b/huffmana.nas100644 23421 144 50555 7220537347 13661 0ustar shigeousers ; for new GOGO-no-coda (1999, 2000) ; Copyright (C) 1999 shigeo ; modified by Keiichi SAKAI ; programmed by shigeo ; 98/07/09 ; 59sec-> 55.6sec ; 98/07/11 ; HuffmanCode{H,L}に関してx,y>=0を仮定する ; 98/07/20 ; count_bitのasm化etc ; 98/12/24 ; HuffmanCodeのbuf fix ; 50.0sec ; 99/08/01 ; NASM用に書き換え ; 99/08/08 ; 酒居さんのcount_bit_MMXを統合 ; 00/01/16 ; huffcode.tblをlame3.60のtables.cに変更 ; これにより常にylen=16となる ; 00/02/01 ; hlenをcharからintにすることで若干の高速化 ; 00/02/14 ; new_choose_table_MMXを作成 by K.SAKAI %include "nasm.h" globaldef HuffmanCode globaldef count_bit_NONE globaldef count_bit_MMX globaldef new_choose_table_MMX externdef ix_max ; pointer to the function externdef ht ; .L_single externdef hlen1 ; .L_dual externdef hlen2 externdef hlen3 ; .L_dual externdef hlen5 externdef hlen6 ; .L_triple externdef hlen7 externdef hlen8 externdef hlen9 ; .L_triple externdef hlen10 externdef hlen11 externdef hlen12 ; .L_dual externdef hlen13 externdef hlen15 ; .H_dual externdef hlen16 externdef hlen24 ; 変更要注意!!! huffman.h ; sizeof(ht)=16を使っている! linbits equ 0 linmax equ 4 table equ 8 hlen equ 12 sizeof_ht equ 16 segment_data D14_14 dd 0x000E000E, 0x000E000E Dfff0_fff0 dd 0xFFF0FFF0, 0xFFF0FFF0 mul_add dd 0x00010010, 0x00010010 ; 関数名を使うと windows での `_'つき処理でうまくいかなかったので変更した choose_jump_table_L: dd table_MMX.L_case_0 dd table_MMX.L_case_1 dd table_MMX.L_case_2 dd table_MMX.L_case_5 dd table_MMX.L_case_7 dd table_MMX.L_case_7 dd table_MMX.L_case_10 dd table_MMX.L_case_10 dd table_MMX.L_case_13 dd table_MMX.L_case_13 dd table_MMX.L_case_13 dd table_MMX.L_case_13 dd table_MMX.L_case_13 dd table_MMX.L_case_13 dd table_MMX.L_case_13 dd table_MMX.L_case_13 choose_table_H: db 16, 24, 0, 0 ; 1 //16, 15 //24 db 17, 24, 0, 0 ; 3 //17, 15 //24 db 18, 24, 0, 0 ; 7 //18, 15 //24 db 19, 24, 0, 0 ; 15 //19, 15 //24 db 20, 25, 0, 0 ; 63 //20, 31 //25 db 20, 26, 0, 0 ; 63 //20, 63 //26 db 21, 27, 0, 0 ; 255 //21, 127 //27 db 21, 28, 0, 0 ; 255 //21, 255 //28 db 22, 29, 0, 0 ; 1023 //22, 511 //29 db 22, 30, 0, 0 ; 1023 //22, 2047 //30 db 23, 30, 0, 0 ; 8191 //23, 2047 //30 db 23, 31, 0, 0 ; 8191 //23, 8191 //31 db 23, 31, 0, 0 ; 8191 //23, 8191 //31 segment_code ;int HuffmanCode(table_select,x,y,uint *code,uint *ext,int *cbits,int *xbits); align 16 HuffmanCode: %assign _P 4*0 mov eax,[esp+_P+4] xor edx,edx ;xbits=edx=0 push ebx push esi push edi push ebp %assign _P 4*4 mov ecx,15 lea esi,[eax*4] cmp eax,ecx mov edi,edx ;idx=edi=0 lea esi,[esi*4+ht] ;esi=&ht[table_slect], sizeof(ht)=16 jbe near .table_be_15 mov eax,[esp+_P+8] and eax,eax jz short .next_y0 mov ebx,eax ;eax=x inc edx ;xbits=edx=1 sar ebx,31 xor eax,ebx neg ebx ;ext=ebx=(x<0)?1:0 add eax,ebx ;eax=abs(x) cmp eax,ecx jb short .F00 ;if(x>14){ lea eax,[eax+eax-30] ; eax=(x-15)<<1 add edx,[esi+linbits] ; xbits+=h->linbits or ebx,eax ; ext|=(x-15)<<1 mov eax,ecx ; eax=15 .F00: ;}else ; mul byte [esi+ylen] ;eax=h->ylen * (x>14)?15:x shl eax,4 ;ylenはいつも16 .next_y0: mov ebp,[esp+_P+12] ;ebp=y and ebp,ebp mov edi,eax ;edi=idx jz short .exit0 mov eax,ebp sar ebp,31 inc edx ;xbits++ xor eax,ebp neg ebp ;sign=ebp=(y<0)?1:0 add ebx,ebx ;ext<<=1 add eax,ebp ;eax=abs(y) cmp eax,ecx jb short .F01 ;if(y>14){ mov cl,byte [esi+linbits] lea eax,[eax+eax-30] ; eax=(y-15)<<1 shl ebx,cl ; ext<<=h->linbits add edx,ecx ; xbits+=h->linbits or ebp,eax ; sign|=(y-15)<<1 mov eax,15 .F01: ;}else or ebx,ebp ;ext|=sign add edi,eax ;idx+=(y>14)?15:y .exit0: mov ecx,[esp+_P+20] mov eax,[esi+table] mov [ecx],ebx ;*ext=_ext mov ecx,[esp+_P+16] mov eax,[eax+edi*4] ;eax=h->table[idx] mov ebx,[esi+hlen] mov [ecx],eax ;*code=h->table[idx] mov ecx,[esp+_P+24] ; movzx ebx,byte [ebx+edi] ;ebx=h->hlen[idx] mov ebx,[ebx+edi*4] ;ebx=h->hlen[idx] mov eax,[esp+_P+28] mov [ecx],ebx ;*cbits=h->hlen[idx] mov [eax],edx ;*xbits=_xbits lea eax,[ebx+edx] ;eax=*cbits+*xbits pop ebp pop edi pop esi pop ebx ret .table_be_15: mov eax,[esp+_P+8] mov ecx,edx ;cbits=ecx=0 and eax,eax mov ebp,edx ;sign=ebp=0 jz short .next_y1 mov ebp,eax inc ecx sar ebp,31 xor eax,ebp neg ebp ;sign=(x<0)?1:0 add eax,ebp ;eax=abs(x) shl eax,4 ;mul byte [esi+ylen] .next_y1: mov ebx,[esp+_P+12] mov edi,eax ;edi=idx and ebx,ebx jz short .exit1 mov eax,ebx sar ebx,31 ;ebx=(y<0)?-1:0 inc ecx ;cbits++ xor eax,ebx add ebp,ebp ;sign<<=1 sub eax,ebx ;eax=abs(y) sub ebp,ebx ;sign++ add edi,eax ;edx+=y .exit1: mov eax,[esi+table] mov edx,[esp+_P+20] mov eax,[eax+edi*4] mov dword [edx],0 shl eax,cl mov edx,[esp+_P+28] or eax,ebp ;eax=(h->table[idx]<997clk (H:Lの呼び出し回数の比=13:22) ; 99/02/05 huffcode.tblを見ながら最適化 平均919clk ; 00/01/16 huffcode.tblの変更(ylen=16)に伴い全面書き直し(630clk) ;int count_bit(int ix[576],uint start, uint end, uint table ); align 16 count_bit_NONE: %assign _P 0 mov eax,[esp+_P+16] push ebx push esi push edi push ebp %assign _P 4*4 mov edi,[esp+_P+4] mov ecx,[esp+_P+12] lea esi,[eax*4] xor ebp,ebp ;sum=0 lea edi,[edi+ecx*4] ;edi=ix+end*4 sub ecx,[esp+_P+8] ;ecx=end-start jz near .exit shl ecx,2 lea esi,[esi*4+ht] ;esi=&ht[table] ;sizeof(ht)=16 neg ecx ;ecx=4*(start-end) cmp eax,15 jb short .CodeL ;CodeLの方が遅いのでjbeではない mov ebx,[esi+linbits] ;ebx=linbits mov esi,[esi+hlen] ;esi=hlen .CodeH: ;---------------------------------------- mov eax,[edi+ecx] mov edx,[edi+ecx+4] and eax,eax jz short .nextyH inc ebp ;xbits++ cmp eax,15 jb short .F0H mov eax,15 add ebp,ebx .F0H: shl eax,4 .nextyH: and edx,edx jz short .exitH inc ebp ;.cbits++ cmp edx,15 jb short .F1H mov edx,15 add ebp,ebx .F1H: add eax,edx ;eax=idx=x* h->ylen+y .exitH: ; movzx eax,byte [eax+esi] ; add ebp,eax add ebp,[esi+eax*4] add ecx,8 jnz short .CodeH jmp short .exit ;---------------------------------------- .CodeL: mov ebx,[esi+hlen] jmp .CodeLlp align 16 .CodeLlp: mov eax,[edi+ecx] mov edx,[edi+ecx+4] cmp eax,1 ; CF = (eax) ? 0 : 1 sbb ebp,-1 ; ebp += (eax) ? 1 : 0 shl eax,4 add eax,edx ;eax=x * h->ylen + y neg edx ; CF = (y) ? 1 : 0 adc ebp,0 ;cbits += (y) ? 1 : 0 ; movzx eax,byte [ebx+eax] ; add ebp,eax add ebp,[ebx+eax*4] add ecx,8 jnz short .CodeLlp ;---------------------------------------- .exit: mov eax,ebp pop ebp pop edi pop esi pop ebx ret ;---------------------------------------- ; by sakai ; 630clk ; 99/08/10 ほ〜んの少しの最適化 by shigeo 566clk ; 00/01/16 リニューアル by shigeo ( end-start は正の偶数 ) ; むうK7ではcount_bit_NONEの方が速い... ; 00/02/01 ちょっと最適化 380clk -> 377clk by K.SAKAI ;int count_bit_mmx(int ix[576],uint start, uint end, uint table ); align 16 count_bit_MMX: %assign _P 0 mov edx,[esp+_P+16] push esi push edi push ebx %assign _P 3*4 mov edi,[esp+_P+4] mov ecx,[esp+_P+12] lea esi,[edx*4] xor eax,eax ; return lea edi,[edi+ecx*4] ;edi=ix+end*4 sub ecx,[esp+_P+8] ;ecx=end-start pxor mm7,mm7 ;sum=0 shl ecx,2 lea esi,[ht+esi*4] ;esi=&ht[table], sizeof(ht)=16 neg ecx ;ecx=4*(start-end) cmp edx,15 jbe near .CodeL ;CodeLの方が速いのでjbe ;---------------------------------------- .CodeH: movd mm6,[esi+linbits] movq mm5,[mul_add] movq mm4,[Dfff0_fff0] punpcklwd mm6,mm6 movq mm3,[D14_14] mov esi,[esi+hlen] punpckldq mm6,mm6 test cl,8 jz .CodeH_lp1 .CodeH_lp0: movq mm0,[edi+ecx] packssdw mm0,mm7 movq mm2,mm0 paddusw mm0,mm4 pcmpgtw mm2,mm3 ; 14より大きいか? movq mm1,mm0 psubw mm0,mm4 ; 14より大きいときは15をセット pcmpgtw mm1,mm4 ; 0よりおおきいか? pand mm2,mm6 psubw mm7,mm1 ; 0よりおおきいときは_xbits++ paddw mm7,mm2 ; 14より大きいとき _xbits += h->linbits pmaddwd mm0,mm5 ; {y, x, y, x}*{1, h->ylen, 1, h->ylen} movd edx,mm0 ; movzx edx,byte [esi+edx] ; add eax,edx add eax,[esi+edx*4] add ecx,8 jz near .Code_exit jmp short .CodeH_lp1 align 16 .CodeH_lp1: movq mm0,[edi+ecx] movq mm1,[edi+ecx+8] packssdw mm0,mm1 movq mm2,mm0 paddusw mm0,mm4 pcmpgtw mm2,mm3 ; 14より大きいか? movq mm1,mm0 psubw mm0,mm4 ; 14より大きいときは15をセット pcmpgtw mm1,mm4 ; 0よりおおきいか? pand mm2,mm6 psubw mm7,mm1 ; 0よりおおきいときは_xbits++ paddw mm7,mm2 ; 14より大きいとき _xbits += h->linbits pmaddwd mm0,mm5 ; {y, x, y, x}*{1, h->ylen, 1, h->ylen} movd edx,mm0 punpckhdq mm0,mm0 add eax,[esi+edx*4] movd ebx,mm0 ; movzx edx,byte [esi+edx] ; add eax,edx ; movzx ebx,byte [esi+ebx] ; add eax,ebx add eax,[esi+ebx*4] add ecx,16 jnz .CodeH_lp1 jmp near .Code_exit ;---------------------------------------- align 16 .CodeL: pxor mm4,mm4 ;mm4=zero movq mm5,[mul_add] mov esi,[esi+hlen] test ecx,8 jz .CodeL_lp1 .CodeL_lp0: movq mm0,[edi+ecx] packssdw mm0,mm4 movq mm2,mm0 pcmpgtw mm2,mm4 ; 0より大きいか? pmaddwd mm0,mm5 psubw mm7,mm2 ; 0より大きいときは_cbits++ movd edx,mm0 ; movzx edx,byte [esi+edx] ; add eax,edx add eax,[esi+edx*4] add ecx,8 jz .Code_exit jmp short .CodeL_lp1 align 16 .CodeL_lp1: movq mm0,[edi+ecx] movq mm1,[edi+ecx+8] packssdw mm0,mm1 movq mm2,mm0 pmaddwd mm0,mm5 pcmpgtw mm2,mm4 ; 0より大きいか? movd edx,mm0 psubw mm7,mm2 ; 0より大きいときは_cbits++ ; movzx edx,byte [esi+edx] punpckhdq mm0,mm0 ; add eax,edx add eax,[esi+edx*4] movd ebx,mm0 ; movzx ebx,byte [esi+ebx] ; add eax,ebx add eax,[esi+ebx*4] add ecx,16 jnz .CodeL_lp1 .Code_exit: punpckldq mm0,mm7 paddw mm7,mm0 movq mm0,mm7 psllq mm0,16 paddw mm0,mm7 psrlq mm0,48 movd edx,mm0 add eax,edx emms ;---------------------------------------- .exit: pop ebx pop edi pop esi ret ;---------------------------------------- ; 2000/02/14 Initial version by K.SAKAI align 16 ;int ;new_choose_table( int ix[576], unsigned int begin, unsigned int end, int *bits ) new_choose_table_MMX: table_MMX: push ebx push esi push edi push ebp %define _P 4*4 mov edx,[esp+_P+12] ; = end mov ecx,[esp+_P+8] ; = begin mov eax,[esp+_P+4] ; = ix push edx push ecx push eax call [ix_max] ; eax = max = ix_max( ix, begin, end ); add esp,12 cmp eax,15 ja near .a15 .be15: ; 必ず choice は、0, 1, 2, 5, 7, 13 のいずれかなので jump table で分岐 */ ; switch(choise) jmp [choose_jump_table_L+eax*4] align 16 .L_case_0: add esp,_P ; xor eax,eax ret align 16 .L_case_1: mov edi,0x01 mov esi,hlen1 ; = [ht+sizeof_ht*1+hlen] jmp near .L_single align 16 .L_case_2: mov edx,0x0302 mov esi,hlen2 ; = [ht+sizeof_ht*2+hlen] mov edi,hlen3 ; = [ht+sizeof_ht*3+hlen] jmp near .L_dual align 16 .L_case_5: mov edx,0x0605 mov esi,hlen5 ; = [ht+sizeof_ht*5+hlen] mov edi,hlen6 ; = [ht+sizeof_ht*6+hlen] jmp near .L_dual align 16 .L_case_7: mov edx,0x090807 mov esi,hlen7 ; = [ht+sizeof_ht*7+hlen] mov edi,hlen8 ; = [ht+sizeof_ht*8+hlen] mov ebx,hlen9 ; = [ht+sizeof_ht*9+hlen] jmp near .L_triple align 16 .L_case_10: mov edx,0x0C0B0A mov esi,hlen10 ; = [ht+sizeof_ht*10+hlen] mov edi,hlen11 ; = [ht+sizeof_ht*11+hlen] mov ebx,hlen12 ; = [ht+sizeof_ht*12+hlen] jmp near .L_triple align 16 .L_case_13: mov edx,0x0F0D mov esi,hlen13 ; = [ht+sizeof_ht*13+hlen] mov edi,hlen15 ; = [ht+sizeof_ht*15+hlen] jmp near .L_dual align 16 .L_single: mov ebp,[esp+_P+4] ; = ix mov ecx,[esp+_P+12] ; = end lea ebp,[ebp+ecx*4] ; = &ix[end] sub ecx,[esp+_P+8] ; = end - begin pxor mm7,mm7 ; cbits=0 xor edx,edx ; sum=0 shl ecx,2 ; (end - begin)*sizeof(int) neg ecx pxor mm4,mm4 ;mm4=zero movq mm5,[mul_add] test ecx,8 jz .L_single_lp1 .L_single_lp0: movq mm0,[ebp+ecx] packssdw mm0,mm4 movq mm2,mm0 pcmpgtw mm2,mm4 ; 0より大きいか? pmaddwd mm0,mm5 psubw mm7,mm2 ; 0より大きいときは_cbits++ movd eax,mm0 ; = idx add ecx,8 mov edx,[esi+eax*4] jz .L_single_exit jmp short .L_single_lp1 align 16 .L_single_lp1: movq mm0,[ebp+ecx] packssdw mm0,[ebp+ecx+8] movq mm2,mm0 pmaddwd mm0,mm5 pcmpgtw mm2,mm4 ; 0より大きいか? movd eax,mm0 ; = idx psubw mm7,mm2 ; 0より大きいときは_cbits++ punpckhdq mm0,mm0 add edx,[esi+eax*4] movd eax,mm0 ; = idx add edx,[esi+eax*4] add ecx,16 jnz .L_single_lp1 .L_single_exit: mov ebp,[esp+_P+16] ; = bits punpckldq mm0,mm7 paddw mm7,mm0 movq mm0,mm7 psllq mm0,16 paddw mm0,mm7 psrlq mm0,48 movd esi,mm0 add esi,edx emms add [ebp],esi ; *bits += sum mov eax,edi pop ebp pop edi pop esi pop ebx ret align 16 .L_dual: mov ebp,[esp+_P+4] ; = ix mov ecx,[esp+_P+12] ; = end lea ebp,[ebp+ecx*4] ; = &ix[end] sub ecx,[esp+_P+8] ; = end - begin pxor mm7,mm7 ; cbits=0 pxor mm6,mm6 ; sum=0 shl ecx,2 ; (end - begin)*sizeof(int) neg ecx pxor mm4,mm4 ;mm4=zero movq mm5,[mul_add] test ecx,8 jz .L_dual_lp1 .L_dual_lp0: movq mm0,[ebp+ecx] packssdw mm0,mm4 movq mm2,mm0 pcmpgtw mm2,mm4 ; 0より大きいか? pmaddwd mm0,mm5 psubw mm7,mm2 ; 0より大きいときは_cbits++ movd eax,mm0 ; = idx add ecx,8 movd mm6,[esi+eax*4] movd mm3,[edi+eax*4] punpckldq mm6,mm3 jz .L_dual_exit jmp short .L_dual_lp1 align 16 .L_dual_lp1: movq mm0,[ebp+ecx] packssdw mm0,[ebp+ecx+8] movq mm2,mm0 pmaddwd mm0,mm5 pcmpgtw mm2,mm4 ; 0より大きいか? movd eax,mm0 ; = idx psubw mm7,mm2 ; 0より大きいときは_cbits++ punpckhdq mm0,mm0 movd mm1,[esi+eax*4] movd mm3,[edi+eax*4] movd eax,mm0 ; = idx punpckldq mm1,mm3 add ecx,16 paddd mm6,mm1 movd mm1,[esi+eax*4] movd mm3,[edi+eax*4] punpckldq mm1,mm3 paddd mm6,mm1 jnz .L_dual_lp1 .L_dual_exit: punpckldq mm0,mm7 paddw mm7,mm0 movq mm0,mm7 psllq mm0,16 paddw mm0,mm7 psrlq mm0,48 punpckldq mm0,mm0 paddd mm0,mm6 movd eax,mm0 punpckhdq mm0,mm0 movd ecx,mm0 emms cmp eax,ecx mov ebp,[esp+_P+16] ; = bits jae .L_dual_2nd .L_dual_1st: add [ebp],eax ; *bits += sum movzx eax,dl ; return choise pop ebp pop edi pop esi pop ebx ret .L_dual_2nd: add [ebp],ecx ; *bits += sum movzx eax,dh ; return choise pop ebp pop edi pop esi pop ebx ret align 16 .L_triple: mov ebp,[esp+_P+4] ; = ix mov ecx,[esp+_P+12] ; = end lea ebp,[ebp+ecx*4] sub ecx,[esp+_P+8] ; = end - begin push edx ; 足らんぞ。 pxor mm7,mm7 ; cbits=0 pxor mm6,mm6 ; sum=0 xor edx,edx ; sum=0 shl ecx,2 ; (end - begin)*sizeof(int) neg ecx pxor mm4,mm4 ;mm4=zero movq mm5,[mul_add] test ecx,8 jz .L_triple_lp1 .L_triple_lp0: movq mm0,[ebp+ecx] packssdw mm0,mm4 movq mm2,mm0 pcmpgtw mm2,mm4 ; 0より大きいか? pmaddwd mm0,mm5 psubw mm7,mm2 ; 0より大きいときは_cbits++ movd eax,mm0 ; = idx add ecx,8 movd mm6,[esi+eax*4] movd mm3,[edi+eax*4] mov edx,[ebx+eax*4] punpckldq mm6,mm3 jz .L_triple_exit jmp short .L_triple_lp1 align 16 .L_triple_lp1: movq mm0,[ebp+ecx] packssdw mm0,[ebp+ecx+8] movq mm2,mm0 pmaddwd mm0,mm5 pcmpgtw mm2,mm4 ; 0より大きいか? movd eax,mm0 ; = idx psubw mm7,mm2 ; 0より大きいときは_cbits++ punpckhdq mm0,mm0 add edx,[ebx+eax*4] movd mm1,[esi+eax*4] movd mm3,[edi+eax*4] movd eax,mm0 ; = idx punpckldq mm1,mm3 paddd mm6,mm1 add edx,[ebx+eax*4] add ecx,16 movd mm1,[esi+eax*4] movd mm3,[edi+eax*4] punpckldq mm1,mm3 paddd mm6,mm1 jnz .L_triple_lp1 .L_triple_exit: punpckldq mm0,mm7 paddw mm7,mm0 movq mm0,mm7 psllq mm0,16 paddw mm0,mm7 psrlq mm0,48 movd esi,mm0 punpckldq mm0,mm0 add edx,esi paddd mm0,mm6 movd eax,mm0 punpckhdq mm0,mm0 movd ecx,mm0 emms cmp eax,ecx pop ebx ; 引数のedx mov ebp,[esp+_P+16] ; = bits jae .L_triple_2nd .L_triple_1st: cmp eax,edx jae .L_triple_3rd add [ebp],eax ; *bits += sum movzx eax,bl ; return choise pop ebp pop edi pop esi pop ebx ret .L_triple_2nd: cmp ecx,edx jae .L_triple_3rd add [ebp],ecx ; *bits += sum movzx eax,bh ; return choise pop ebp pop edi pop esi pop ebx ret .L_triple_3rd: add [ebp],edx ; *bits += sum shr ebx,16 mov eax,ebx ; return choise pop ebp pop edi pop esi pop ebx ret ; try tables with linbits ; I assume `max' is greater than or equal to 16(not 15). ; If `max' is greater than 8191(is equal to ht[23].linmax or ht[31].linmax), ; this function return zero according to the C source. ; `hlen*' and `htbl*' are fixed by this assumption. ; I don't use indirect addressing to these tables. align 16 .a15: lea eax,[eax-15] ; max -= 15 cmp eax,8191 jbe .H_dual add esp,_P xor eax,eax ret align 16 .H_dual: bsr ecx,eax mov edx,[choose_table_H+ecx*4] ; = {0, 0, choise[1], choise[0]} movzx esi,dl movzx edi,dh shl esi,4 shl edi,4 pxor mm7,mm7 ; cbits=0 pxor mm6,mm6 ; cbits=0 movd mm5,[ht+edi+linbits] punpcklwd mm5,mm5 punpckldq mm5,mm5 movd mm4,[ht+esi+linbits] punpcklwd mm4,mm4 punpckldq mm4,mm4 movq mm3,[Dfff0_fff0] mov ebp,[esp+_P+4] ; = ix mov ecx,[esp+_P+12] ; = end lea ebp,[ebp+ecx*4] sub ecx,[esp+_P+8] ; = end - begin xor esi,esi ; sum=0 xor edi,edi ; sum=0 shl ecx,2 ; (end - begin)*sizeof(int) neg ecx test cl,8 jz .H_dual_lp1 .H_dual_lp0: movq mm0,[ebp+ecx] packssdw mm0,mm7 movq mm2,mm0 paddusw mm0,mm3 pcmpgtw mm2,[D14_14] ; 14より大きいか? movq mm1,mm0 psubw mm0,mm3 ; 14より大きいときは15をセット pmaddwd mm0,[mul_add] ; {y, x, y, x}*{1, h->ylen, 1, h->ylen} movd ebx,mm0 add esi,[hlen16+ebx*4] add edi,[hlen24+ebx*4] pcmpgtw mm1,mm3 ; 0よりおおきいか? movq mm0,mm2 pand mm0,mm4 pand mm2,mm5 psubw mm6,mm1 ; 0よりおおきいときは_xbits++ psubw mm7,mm1 ; 0よりおおきいときは_xbits++ paddw mm6,mm0 ; 14より大きいとき _xbits += h->linbits paddw mm7,mm2 ; 14より大きいとき _xbits += h->linbits add ecx,8 jz .H_dual_exit jmp short .H_dual_lp1 align 16 .H_dual_lp1: movq mm0,[ebp+ecx] movq mm1,[ebp+ecx+8] packssdw mm0,mm1 movq mm2,mm0 paddusw mm0,mm3 pcmpgtw mm2,[D14_14] ; 14より大きいか? movq mm1,mm0 psubw mm0,mm3 ; 14より大きいときは15をセット pmaddwd mm0,[mul_add] ; {y, x, y, x}*{1, h->ylen, 1, h->ylen} movd ebx,mm0 add esi,[hlen16+ebx*4] add edi,[hlen24+ebx*4] punpckhdq mm0,mm0 movd eax,mm0 add esi,[hlen16+eax*4] add edi,[hlen24+eax*4] pcmpgtw mm1,mm3 ; 0よりおおきいか? movq mm0,mm2 pand mm0,mm4 pand mm2,mm5 psubw mm6,mm1 ; 0よりおおきいときは_xbits++ psubw mm7,mm1 ; 0よりおおきいときは_xbits++ paddw mm6,mm0 ; 14より大きいとき _xbits += h->linbits paddw mm7,mm2 ; 14より大きいとき _xbits += h->linbits add ecx,16 jnz .H_dual_lp1 .H_dual_exit: punpckldq mm5,mm7 paddw mm7,mm5 movq mm5,mm7 psllq mm5,16 paddw mm5,mm7 psrlq mm5,48 movd ecx,mm5 add ecx,edi punpckldq mm4,mm6 paddw mm6,mm4 movq mm4,mm6 psllq mm4,16 paddw mm4,mm6 psrlq mm4,48 movd eax,mm4 add eax,esi emms cmp eax,ecx mov ebp,[esp+_P+16] ; = bits ja .H_dual_2nd .H_dual_1st: add [ebp],eax ; *bits += sum movzx eax,dl ; return choise pop ebp pop edi pop esi pop ebx ret .H_dual_2nd: add [ebp],ecx ; *bits += sum movzx eax,dh ; return choise pop ebp pop edi pop esi pop ebx ret end gogo239b/message.c100644 23421 144 10257 7220537347 13154 0ustar shigeousers/* * for new GOGO-no-coda ( 2000/4/1 ) * Copyright (C)2000 shigeo */ /* * How to add the language you want * * 1. make ???.msg * make the function is???() in its file. * 2. add #include "???.msg" * 3. add tLANG_??? in t_lang * 4. add how to detective location in checkLang() * 5. setup msg in setLang() * 6 add the option in the top of main() in musui.c */ #include "message.h" #include "japanese.msg" #include "english.msg" #include "german.msg" #include "spanish.msg" #ifdef WIN32 #include #endif static t_lang lang = tLANG_ENGLISH; /* 選択された言語 */ static char (*msg)[MSG_LEN_MAX] = msg_ENGLISH; static t_lang checkLang( void ){ #if defined( WIN32 ) t_lang tmp = DFLT_LANG; char type; LCID ID = GetUserDefaultLCID(); if( !ID ){ ID = GetSystemDefaultLCID(); } type = ID; if( type == (char)LANG_JAPANESE ){ tmp = tLANG_JAPANESE_SJIS; }else if( type == (char)LANG_GERMAN ){ tmp = tLANG_GERMAN; } else if( type == (char)LANG_ENGLISH ){ tmp = tLANG_ENGLISH; } else if( type == (char)LANG_SPANISH ){ tmp = tLANG_SPANISH; } #elif defined( BeOS ) /* Noisyuさん書いてね(^^; */ t_lang tmp = DFLT_LANG; #elif (defined( __os2__ ) && 0) t_lang tmp = DFLT_LANG; #else static char env[][12] = { "LC_MESSAGES", "LC_ALL", "LANG" }; int i; t_lang tmp = DFLT_LANG; char *LANG; for( i = 0; i < sizeof(env)/sizeof(env[0]); i++ ){ LANG = getenv( env[i] ); if( !LANG ) continue; if( isENGLISH( LANG ) ){ tmp = tLANG_ENGLISH; break; }else if( isGERMAN( LANG ) ){ tmp = tLANG_GERMAN; break; }else if( isSPANISH( LANG ) ){ tmp = tLANG_SPANISH; break; }else if( isJAPANESE_SJIS( LANG ) ){ tmp = tLANG_JAPANESE_SJIS; break; }else if( isJAPANESE_EUC( LANG ) ){ tmp = tLANG_JAPANESE_EUC; break; } #if 0 /* if you want */ /* for JAPANESE */ if( tmp == tLANG_JAPANESE_EUC || tmp == tLANG_JAPANESE_SJIS ){ char *TERM; TERM = getenv("TERM"); if( TERM && strcmp( TERM, "kterm" ) && strcmp( TERM, "kon" ) && strcmp( TERM, "rxvt" ) ){ tmp = tLANG_ENGLISH; } } #endif } #endif return tmp; } static short euc2sjis( short a ){ unsigned char H, L; H = ( a >> 8 ) & 0x7F; L = a & 0x7F; H += 0x1F; if( !( L & 1 ) ){ L -= 2; H += 0x5E; } L >>= 1; if( H >= 0x7F ) H++; L += ( L <= 0x2E ) ? 0x71 : 0xB1; return ( H << 8 ) + L; } static short sjis2euc( short a ){ unsigned char H, L; L = a >> 8; H = a; if( L > 0x7F ) L--; H -= ( H <= 0x9F ) ? 0x70 : 0xB0; H <<= 1; if( L >= 0x9E ){ L -= 0x5E + 0x1F; }else{ L -= 0x1F; H--; } L |= 0x80; H |= 0x80; return ( L << 8 ) + H; } /* 無条件に上書きする */ static void str_euc2sjis( char *s ){ while( *s ){ if( *s & 0x80 ){ short a; a = *( short *)s; *( short *)s = euc2sjis( a ); s += 2; }else{ s++; } } } #define isKANJI1(x) ((unsigned char)((x^0x20)-0xA1)<=0x3B) static void str_sjis2euc( char *s ){ while( *s ){ if( isKANJI1(*s) ){ short a; a = *( short *)s; *( short *)s = sjis2euc( a ); s += 2; }else{ s++; } } } t_lang getLangType( void ){ return lang; } /* setup `msg' here */ t_lang setLang( t_lang n ){ if( n == tLANG_UNKNOWN ){ n = checkLang(); } lang = n; if( lang == tLANG_ENGLISH ){ msg = msg_ENGLISH; }else if( lang == tLANG_GERMAN ){ msg = msg_GERMAN; }else if( lang == tLANG_SPANISH ){ msg = msg_SPANISH; }else if( lang == tLANG_JAPANESE_EUC || lang == tLANG_JAPANESE_SJIS ){ t_lang data; void (*func)(char *) = (void (*)(char *) )NULL; if( (unsigned char)(*msg_JAPANESE[MSG_GOGO]) == 0xB8UL ){ /* `午'のEUCでの1byte目 */ data = tLANG_JAPANESE_EUC; }else{ data = tLANG_JAPANESE_SJIS; } if( data == tLANG_JAPANESE_SJIS && lang == tLANG_JAPANESE_EUC ){ func = str_sjis2euc; }else if( data == tLANG_JAPANESE_EUC && lang == tLANG_JAPANESE_SJIS ){ func = str_euc2sjis; } if( func ){ int i; for( i = 0; i < sizeof(msg_JAPANESE)/sizeof(msg_JAPANESE[0]); i++){ func(msg_JAPANESE[i]); } } msg = msg_JAPANESE; } return n; } char *getMsg( int n ){ return (char *)msg[n]; } #if 0 int main( int argc, char *argv[] ){ /* 午後 SJIS 8C:DF, 8C:E3 */ /* EUC B8:E1, B8:E5 */ setLang( tLANG_UNKNOWN ); printf( "msg=%s\n", getMsg(MSG_GOGO) ); } #endif gogo239b/l3side.h100644 23421 144 3036 7220537347 12675 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * modified by shigeo */ /* * 99/08/03 * gr_info構造体をasmで扱いやすいように順序を変更している * 要注意 * grinfo.inc(quantize.nas) */ #ifndef _L3SIDE_H #define _L3SIDE_H typedef float D192_3[192][3]; typedef int I192_3[192][3]; typedef struct { float l[2][2][21]; float s[2][2][12][3]; } ratio_t; typedef struct { int l[2][2][22]; /* [cb] */ int s[2][2][13][3]; /* [window][cb] */ } III_scalefac_t; /* [gr][ch] */ /* grinfo.incとの整合性要注意(gr_infoのサイズも) */ typedef struct { int quantizerStepSize; unsigned window_switching_flag; unsigned block_type; unsigned count1; unsigned big_values; unsigned sfb_lmax; unsigned sfb_smax; unsigned count1table_select; /* ↑ここまでgrinfo.defで定義されてるので変更要注意 */ unsigned part2_3_length; unsigned global_gain; unsigned scalefac_compress; unsigned mixed_block_flag;/* 使われないけど削除するにはmsub*.nasの修正が必要 */ unsigned table_select[3]; unsigned region0_count; unsigned region1_count; unsigned preflag; /* only 0 or 1 */ unsigned scalefac_scale; unsigned part2_length; unsigned adr1; unsigned adr2; unsigned adr3; /* added for LSF */ const unsigned *sfbTblSub; unsigned slen[4]; } gr_info; /* msub*.nas で使われるので変更要注意 */ typedef struct { int main_data_begin; int resvDrain; struct { struct gr_info_s { gr_info tt; } ch[2]; } gr[2]; /* frame related parameters are moved from common.h */ int mode_ext; int rate_idx; /* index for table */ int padding; } III_side_info_t; #endif /* _L3SIDE_H */ gogo239b/l3bs.h100644 23421 144 511 7220537347 12330 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * modified by shigeo */ #ifndef _L3_BS_H_ #define _L3_BS_H_ #include "common.h" void III_format_bitstream(int bitsPerFrame, int l3_enc[2][2][576], III_side_info_t *l3_side, III_scalefac_t *scalefac); void InitFormatBitStream(void); void III_FlushBitstream(void); #endif /* _L3_BS_H_ */ gogo239b/l3psy.c100644 23421 144 71464 7220537347 12611 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * optimized by shigeo */ #include "common.h" #include "global.h" #include "l3psy.h" #include "l3side.h" #include "haveunit.h" #include "musenc.h" /* * 次の事を仮定して処理した * ・マクロ HAVEGTK は定義されていない * * 以下の数値は元の値と違う意味になっているので要注意 * minval[i] は pow( 10, -0.1 * minval[i]) に * SNR_s[i] は exp( SNR_s[i] * LN_TO_LOG10 ) * norm_s[i] に * 同時に norm_s の削除 * tmn 等不要な変数の削除 * 99/10/07 lame3.30betaの修正を一部取り込む */ #define MSFREQ 20 /* 0にする場合, 4の倍数以外にする場合はfft_side()の修正必要 */ #define LN_TO_LOG10 0.2302585093 /* = log(10)/10 */ #define sync_flush 752 /* vdb dBだけ音量を下げるために必要な係数 */ #define decibel_lower 0.31622776602 /* = pow(10.0,-vdb/10.0), vdb=5 */ /* 以下を定義すると局所的にうなりがあれば short block モードになる */ #define AWS /* from Gabriel Bouvigne */ #define ENER_AWS /* align 及び再初期化のために外に出す(*.nasにする予定) */ /* 本当は static が不要なもの */ //static float ectb[CBANDS][2]; extern float wsamp_rs[256]; /* defined in l3psya.nas */ /* staticは必要なもの */ static int new = 0, old = 1; static int switch_pe=1800; static int savebuffer[2][1344]; extern float wsamp_r_int[2][BLKSIZE]; /* defined in l3psya.nas */ extern float window_s[BLKSIZE_s]; /* defined in l3psya.nas */ extern float window[BLKSIZE]; /* defined in l3psya.nas */ extern float s3_l[CBANDS][CBANDS]; /* defined in l3psya.nas */ static float s3_s[CBANDS][CBANDS]; static float SNR_s[CBANDS_s]; static float minval[CBANDS],qthr_l[CBANDS],norm_l[CBANDS]; static float qthr_s[CBANDS_s]; static float nb_1[2][CBANDS], nb_2[2][CBANDS]; static int bu_l[SBMAX_l],bo_l[SBMAX_l] ; static int bu_s[SBMAX_s],bo_s[SBMAX_s] ; static float w1_l[SBMAX_l], w2_l[SBMAX_l]; static float w1_s[SBMAX_s], w2_s[SBMAX_s]; static int numlines[CBANDS]; static float abx_sav[2][2][6][2]; /* 6までで十分 */ static float rx_sav[2][2][6]; static float mld_l[SBMAX_l],mld_s[SBMAX_s]; static int partition_l[HBLKSIZE],partition_s[HBLKSIZE_s]; static int numCBANDS,numCBANDS_s; static int num_part,num_part_s; /* 初期化関連プロトタイプ */ void L3psy_init(int sfreqHz); static void L3para_read( int sfreqHz ); /* 各ルーチンへのポインタ */ extern void (*fft_side)( float in[2][1024], int s, float *ret); extern void (*fft1k)(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); extern void (*fft256)(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); void (*sprdngf)( float dest[CBANDS][2], float src[CBANDS][2] ); void (*calc_phase)(float abx_s[3][HBLKSIZE_s][2], float energy_s[3][HBLKSIZE_s],float *cw); static void L3psycho_energy( int *buffer, float energy[HBLKSIZE], float abx[HBLKSIZE][2], float energy_s[3][HBLKSIZE_s], float abx_s[3][HBLKSIZE_s][2], int chn,int check_ms_stereo, float *ms_ener_ratio) { int *savebuf; int i,j,k; float *wsamp_r; wsamp_r = wsamp_r_int[chn]; savebuf = &savebuffer[chn][0]; /* sync_flush 個の標本だけ信号を遅らせる */ for ( i = 0; i < sync_flush; i++ ){ savebuf[i] = savebuf[i+576]; } for ( i = sync_flush; i < sync_flush+576; i++ ){ savebuf[i] = buffer[i-sync_flush]; } fft1k( wsamp_r, energy, abx, window, savebuf); #define shlen 192 #define shoff 1 for ( i = 0; i < 3; i++ ){ k = shlen * (shoff + i); fft256( wsamp_rs, &energy_s[i][0], abx_s[i], window_s, savebuf+k); } #undef shlen #undef shoff /* 両側 / 全体 エネルギーの計算 */ *ms_ener_ratio=0; if( check_ms_stereo || force_ms ){ static float ms_ener[2]; /* 初期化不要のstatic */ for(ms_ener[chn]=0, j=MSFREQ; j 0; num-- ){ if( *thr < *ebc ){ /* almost true */ tmp -= *numlines * log( (*thr + 1) / (*ebc + 1) ); } thr++; ebc += 2; numlines++; } *pe = tmp; } static void (*calc_pe)( float *pe, int num, float *thr, float *ebc, int *numlines ); void calc_pe_3DN( float *pe, int num, float *thr, float *ebc, int *numlines ); void setup_calc_pe(int useUNIT){ if( useUNIT & t3DN ){ SETUP_DSP("use:calc_pe_3DN\n"); calc_pe = calc_pe_3DN; }else { SETUP_DSP("use:calc_pe_C\n"); calc_pe = calc_pe_C; } } /* * 99/08/24 by shigeo * tbb = min(1, max(0,-0.299-0.43*cbb))なので * cbb>-0.299/0.43=-0.6953488372ならtbb=0 * cbb<-1.299/0.43=-3.0209302325ならtbb=1 * よって次の範囲だけ計算すればよい * e^(-1.299/0.43)=0.04875584301 < cbb < e^(-0.299/0.43)=0.4989003827 * 更に次のループの計算 * nb[b] = ecb[b] * norm_l[b] * exp( -SNR_l[b] * LN_TO_LOG10 ); * も取り込む * そのためにminvalをexp(minval * -LN_TO_LOG10)=pow(10,-minval*0.1)に置き換え * * tbb=-0.299-0.43 x, x=log(cbb) より * e^( ( 29 tbb + 6 (1-tbb) ) * -LN_TO_LOG10 ) * =e^( (-0.877 -9.89 x) * -LN_TO_LOG10 ) * =10^0.0877 * e^( 9.89 * LN_TO_LOG10 * x ) * =10^0.0877 * 10^(0.989 log(cbb)) * =10^0.0877 * x^(0.989 log 10) * =1.22377055646 * x^2.27725665736 */ #define SP_POW_TABLE_N 512 static float sp_pow_table[SP_POW_TABLE_N*2]; #define a 0.04875584301 /* 区間(a,b) */ #define b (0.4989003827 + 0.0001) /* +0.0001はx=bの付近で連続にするため */ /* あまり意味はないかも */ #define c 1.22377055646 /* 係数その1 */ #define d 2.27725665736 /* 巾乗係数 */ #define h ( (b - a) / SP_POW_TABLE_N ) #define rev_h ( 1 / h ) /* * y= c*x^d を1次補完で求める(但し a< x = 0.4989003827 ){ /* tbb==1 */ temp1 = Min( minval[i], 0.251188643153 ); /* =10^-0.6 */ }else if( temp1 <= 0.04875584301 ){ /* tbb==0 */ temp1 = Min( minval[i], 0.0012589254118 ); /* =10^-2.9 */ }else { special_pow( &temp1 ); temp1 = Min( minval[i], temp1 ); } temp1 *= ectb[i][0] * norm_l[i]; temp2 = Min( temp1, Min( 2*nb_1[chn][i], 16*nb_2[chn][i] ) ); thr[i] = Max( qthr_l[i], temp2 ); nb_2[chn][i] = nb_1[chn][i]; nb_1[chn][i] = temp1; } } /* 再初期化のため外に出す */ static float pe[2]={0,0}; static float ms_ratio_s_old=0,ms_ratio_l_old=0; static float ratio[2][SBMAX_l]; static float ratio_s[2][SBMAX_s][3]; static float thm_save[2][SBMAX_l]; static float en_save[2][SBMAX_l]; static float thm_s_save[2][SBMAX_s][3]; static float en_s_save[2][SBMAX_s][3]; static int blocktype_old[2] ; void L3psycho_anal( int *buffer[2], int check_ms_stereo, float *ms_ener_ratio, float ratio_d[2][21], float ratio_ds[2][12][3], float percep_energy[2], int blocktype_d[2]) { int blocktype[2],uselongblock[2],chn; unsigned int b, i, j, k; float ms_ratio_l=0,ms_ratio_s=0; float thr[CBANDS]; float abx[6][2]; float unaligned_energy[HBLKSIZE+4]; float *energy = (float *)(((int)unaligned_energy + 15) & -16); float energy_s[3][HBLKSIZE_s]; float abx_s[3][HBLKSIZE_s][2]; /* * `r', 'phi_sav', 'new', 'old'は不確かな測定のために保存しておく * `r'と'phi_sav'は[チャンネル][データの`年齢']という形の配列 */ float cw[HBLKSIZE];//, eb[CBANDS]; float ebc[CBANDS][2]; int sb,sblock; #ifdef AWS /* reduce switch_pe if there where preecho events in previous granules */ { int prev_granule_used_shortblock = 0; for( chn = 0; chn < gl.stereo; chn++ ){ if( blocktype_old[chn] == SHORT_TYPE ) prev_granule_used_shortblock = 1; } if( prev_granule_used_shortblock ){ switch_pe = Max(switch_pe-700,900); }else{ switch_pe = Min(switch_pe+200,1800); } } #endif for (chn = 0; chn < gl.stereo; chn++){ for ( j = 0; j < 21; j++ ){ ratio_d[chn][j] = ratio[chn][j]; } for ( j = 0; j < 12; j++ ){ for ( i = 0; i < 3; i++ ){ ratio_ds[chn][j][i] = ratio_s[chn][j][i]; } } percep_energy[chn] = pe[chn]; /* 常にoldest==newでなのでoldestの削除 */ /* new/oldは0, 1のトグル */ new ^= 1; old = 1 - new; L3psycho_energy( buffer[chn], energy, abx, energy_s, abx_s, chn,check_ms_stereo,&ms_ratio_l); ms_ratio_s=ms_ratio_l; /* 旧午後と同じ最適化してるし 考えることは皆一緒? */ for ( j = 0; j < 6; j++ ){ /* calculate unpredictability measure cw */ float an, a1, a2; float bn, b1, b2; float rn, r1, r2; float numre, numim, den; a2 = abx_sav[chn][new][j][0]; b2 = abx_sav[chn][new][j][1]; r2 = rx_sav[chn][new][j]; a1 = abx_sav[chn][new][j][0] = abx_sav[chn][old][j][0]; b1 = abx_sav[chn][new][j][1] = abx_sav[chn][old][j][1]; r1 = rx_sav[chn][new][j] = rx_sav[chn][old][j]; an = abx_sav[chn][old][j][0] = abx[j][0]; bn = abx_sav[chn][old][j][1] = abx[j][1]; rn = rx_sav[chn][old][j] = sqrt(energy[j]); { /* square (x1,y1) */ if( r1 != 0.0 ){ numre = a1*b1; numim = (a1*a1-b1*b1)*0.5; den = r1*r1; }else{ numre = 1.0; numim = 0.0; den = 1.0; } } { /* multiply by (x2,-y2) */ if( r2 != 0.0 ){ float tmp2 = (numim+numre)*(a2+b2)*0.5; float tmp1 = -a2*numre+tmp2; numre = -b2*numim+tmp2; numim = tmp1; den *= r2; }else{ /* do nothing */ } } { /* r-prime factor */ float tmp = (r1 + r1 - r2)/den; numre *= tmp; numim *= tmp; } if( (den=rn+fabs(r1 + r1 - r2)) != 0.0 ){ numre = (an+bn)*0.5 - numre; numim = (an-bn)*0.5 - numim; cw[j] = sqrt(numre*numre+numim*numim)/den; }else{ cw[j] = 0.0; } } calc_phase(abx_s,energy_s,cw); for ( b = 0; b < CBANDS; b++ ){ ebc[b][0] = 0; ebc[b][1] = 0; } /* partition_l[j]は常に0以上 */ for ( j = 0; j < HBLKSIZE; j++ ){ int tp = partition_l[j]; ebc[tp][0] += energy[j]; ebc[tp][1] += cw[j] * energy[j]; } /* * 拡散関数(s3_l[b][k])を用いて 分割エネルギーと不確かさ(unpredictability) * を畳み込み * s3_lは44.1kHzのためのsparse(希薄な)行列 */ { static float __ectb[CBANDS*2+16]; float (*ectb)[2]; ectb = (float (*)[2])( (int)(__ectb+15) & -16 ); if(gl.enc_freqHz == 44100 ){ sprdngf( ectb, ebc ); }else{ for ( b = 0;b < numCBANDS; b++ ){ ectb[b][0] = 0; ectb[b][1] = 0; for ( k = 0; k < num_part; k++ ){ ectb[b][0] += s3_l[b][k] * ebc[k][0]; ectb[b][1] += s3_l[b][k] * ebc[k][1]; } } } /* しきい値計算分割の調子(tonality)の計算??? */ calc_nb(ectb, thr, chn, numCBANDS); } /* * 注意: PE内の全てのうねりはtempについての上述のpre-echo公式が * 原因。 もしこれが使われていなければPEは常に約600 */ /* 知覚(perceptual)エントロピーの計算 */ calc_pe( &pe[chn], numCBANDS, thr, ebc[0], numlines ); /*************************************************************** * Check to see if we also need to compute long block thresholds ***************************************************************/ uselongblock[chn] = (pe[chn] < switch_pe); { float mn,mx; float estot[3]; estot[0] = 0; estot[1] = 0; estot[2] = 0; for ( j = HBLKSIZE_s/2; j < HBLKSIZE_s; j ++){ estot[0]+=energy_s[0][j]; estot[1]+=energy_s[1][j]; estot[2]+=energy_s[2][j]; } mn = Min( Min(estot[0],estot[1]), estot[2] ); mx = Max( Max(estot[0],estot[1]), estot[2] ); #ifdef ENER_AWS if( (pe[chn] <= 3000 && mx <= 2.5 * mn) || (pe[chn] <= 1800 && mx <= 10 * mn) || /* 1800=switch_pe */ (pe[chn] <= 1000 && mx <= 30 * mn) ){ uselongblock[chn] = 1; }else{ uselongblock[chn] = 0; } #endif } if(chn == 1 && force_ms){ /* 強制 ms_stereo モード */ /* ch=0 (mid) blocktype determines ch=1 (side) blocktype */ uselongblock[1] = uselongblock[0]; } /* * マスクされたしきい値を求める * granule(粒子?)が後のshort blockで変更されると分からないので * 常にshort blockのマスクされたしきい値を求める必要がある */ if( uselongblock[chn] ){ /* アタック無しならlong blockを使う */ for( j = 0; j < SBMAX_l; j++ ){ float thm, en; en = w1_l[j] * ebc[bu_l[j]][0] + w2_l[j] * ebc[bo_l[j]][0]; thm = w1_l[j] *thr[bu_l[j]] + w2_l[j] * thr[bo_l[j]]; for( k = bu_l[j]+1; k < bo_l[j]; k++ ){ en += ebc[k][0]; thm += thr[k]; } if( en ){ ratio[chn][j] = thm/en; }else{ ratio[chn][j] = 0; } thm_save[chn][j]=thm; en_save[chn][j]=en; } } /* in some cases, when computing the next granule, we may switch this * granule to a short block. compute short block thresholds just in case */ /* threshold calculation for short blocks */ for ( i = 0; i < 3; i++ ){ float eb[CBANDS_s]; for ( j = 0; j < CBANDS_s; j++ ){ eb[j] = 0; } for ( j = 0; j < HBLKSIZE_s; j++ ){ eb[partition_s[j]] += energy_s[i][j]; } for( j = 0; j < numCBANDS_s; j++ ){ float temp = 0; for( k = 0; k < num_part_s; k++ ){ temp += s3_s[j][k] * eb[k]; } temp *= SNR_s[j]; thr[j] = Max( qthr_s[j],temp ); } for( j = 0; j < SBMAX_s; j++ ){ float thm, en; en = w1_s[j] * eb[bu_s[j]] + w2_s[j] * eb[bo_s[j]]; thm = w1_s[j] *thr[bu_s[j]] + w2_s[j] * thr[bo_s[j]]; for( k = bu_s[j]+1; k < bo_s[j]; k++ ){ en += eb[k]; thm += thr[k]; } if( en ){ ratio_s[chn][j][i] = thm/en; }else{ ratio_s[chn][j][i] = 0; } thm_s_save[chn][j][i]=thm; en_s_save[chn][j][i]=en; } } /* compute M/S thresholds from Johnston & Ferreira 1992 ICASSP paper */ #define JOHNSTON #ifdef JOHNSTON if( force_ms && chn == 1 ){ float rside,rmid,mld; for ( sb = 0; sb < SBMAX_l; sb++ ){ mld = mld_l[sb]; rmid = Max(ratio[0][sb],Min(ratio[1][sb],mld)); rside = Max(ratio[1][sb],Min(ratio[0][sb],mld)); ratio[0][sb]=rmid; ratio[1][sb]=rside; } /* alwasy compute these - we may need them later */ for ( sblock = 0; sblock < 3; sblock++ ){ for ( sb = 0; sb < SBMAX_s; sb++ ){ mld = mld_s[sb]; rmid = Max(ratio_s[0][sb][sblock],Min(ratio_s[1][sb][sblock],mld)); rside = Max(ratio_s[1][sb][sblock],Min(ratio_s[0][sb][sblock],mld)); ratio_s[0][sb][sblock]=rmid; ratio_s[1][sb][sblock]=rside; } } } #endif /* JOHNSTON */ } /* end loop over chn */ if( check_ms_stereo ){ /* マスクされたしきい値から ms_ratio を決定 */ /* 平均しきい値の差が 5dB 未満なら ms_stereo(ms_ratio < .35)を使う */ float db,xmin,xmax,sidetot=0,tot=0; for (sb= SBMAX_l/4 ; sb< SBMAX_l; sb ++ ){ if( thm_save[0][sb] > thm_save[1][sb] ){ xmin = thm_save[1][sb]; xmax = thm_save[0][sb]; }else{ xmin = thm_save[0][sb]; xmax = thm_save[1][sb]; } if(xmax >= 1000*xmin){ db = 30; }else{ db = 10*log10(xmax/xmin); } sidetot += db; tot++; } ms_ratio_l= 0.07 * sidetot / tot; sidetot=0; tot=0; for ( sblock = 0; sblock < 3; sblock++ ){ for ( sb = SBMAX_s/4; sb < SBMAX_s; sb++ ){ if( thm_s_save[0][sb][sblock] > thm_s_save[1][sb][sblock] ){ xmin = thm_s_save[1][sb][sblock]; xmax = thm_s_save[0][sb][sblock]; }else{ xmin = thm_s_save[0][sb][sblock]; xmax = thm_s_save[1][sb][sblock]; } if(xmax >= 1000*xmin){ db = 30; }else{ db = 10*log10(xmax/xmin); } sidetot += db; tot++; } } ms_ratio_s = 0.07 * sidetot / tot; } /* if( check_ms_stereo ) */ /* 最後の block type の決定 */ if( force_ms ){ /* Forced ms_stereo mode. */ /* ch=0 (mid) blocktype determines ch=1 (side) blocktype */ uselongblock[1] = uselongblock[0]; } for (chn=0; chn=i) tempx = (bval_l[i] - bval_l[j])*3.0; else tempx = (bval_l[i] - bval_l[j])*1.5; if(tempx>=0.5 && tempx<=2.5){ temp = tempx - 0.5; x = 8.0 * (temp*temp - 2.0 * temp); }else x = 0.0; tempx += 0.474; tempy = 15.811389 + 7.5*tempx - 17.5*sqrt(1.0+tempx*tempx); if (tempy <= -60.0) s3_l[i][j] = 0.0; else s3_l[i][j] = exp( (x + tempy)*LN_TO_LOG10 ); } } /* Read short block data */ for(loop=0;loop<6;loop++){ freq_tp = *p++; cbmax_tp = (int) *p++; cbmax_tp++; if (sfreqHz == freq_tp ){ float temp; cbmax = cbmax_tp; for(i=0,k2=0;i=i) tempx = (bval_s[i] - bval_s[j])*3.0; else tempx = (bval_s[i] - bval_s[j])*1.5; if(tempx>=0.5 && tempx<=2.5){ temp = tempx - 0.5; x = 8.0 * (temp*temp - 2.0 * temp); }else x = 0.0; tempx += 0.474; tempy = 15.811389 + 7.5*tempx - 17.5*sqrt(1.0+tempx*tempx); if (tempy <= -60.0) s3_s[i][j] = 0.0; else s3_s[i][j] = exp( (x + tempy)*LN_TO_LOG10 ); } } /* Read long block data for converting threshold calculation partitions to scale factor bands */ for(loop=0;loop<6;loop++){ freq_tp = *p++; sbmax = (int) *p++; sbmax++; if (sfreqHz == freq_tp){ for(i=0;i 0.01 ) ) { printf("31l: please check \"psy_data.\"\n"); TERM(ME_INTERNALERROR); // exit(-1); } } }else p += sbmax * 6; } /* Read short block data for converting threshold calculation partitions to scale factor bands */ for(loop = 0; loop < 6; loop++){ freq_tp = *p++; sbmax = (int)*p++; sbmax++; if(sfreqHz == freq_tp){ for(i = 0; i < sbmax; i++){ j = (int)*p++; p++; bu_s[i] = (int)*p++; bo_s[i] = (int)*p++; w1_s[i] = *p++; w2_s[i] = *p++; if(j != i){ printf("30:please check \"psy_data\"\n"); TERM(ME_INTERNALERROR); } if(i && fabs(1.0 - w1_s[i] - w2_s[i-1]) > 0.01){ printf("31s: please check \"psy_data.\"\n"); TERM(ME_INTERNALERROR); } } }else p += sbmax * 6; } } void L3psy_init( int sfreqHz ) { int i,j,sb; float bval_lo; float fthr[HBLKSIZE]; int partition[HBLKSIZE]; float crit_band[27] = {0, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270,1480,1720,2000,2320, 2700,3150, 3700, 4400, 5300,6400,7700,9500,12000,15500,25000,30000 }; new = 0; old = 1; switch_pe = 1800; memset( savebuffer, 0, sizeof( savebuffer ) ); memset( wsamp_r_int, 0, sizeof( wsamp_r_int ) ); { float scalefac; scalefac = force_ms ? SQRT2 : 1; /* scalefac 込みの HANN 窓係数の計算 */ for( i = 0; i < BLKSIZE; i++ ){ window[i] = 0.5*(1-cos(2.0*PI*(i-0.5)/BLKSIZE)) * scalefac; } for( i = 0; i < BLKSIZE_s ;i++ ){ window_s[i]= 0.5*(1-cos(2.0*PI*(i-0.5)/BLKSIZE_s)) * scalefac; } } memset( s3_l, 0, sizeof( s3_l ) ); memset( s3_s, 0, sizeof( s3_s ) ); memset( SNR_s, 0, sizeof( SNR_s ) ); memset( minval, 0, sizeof( minval ) ); memset( qthr_l, 0, sizeof( qthr_l ) ); memset( norm_l, 0, sizeof( norm_l ) ); memset( qthr_s, 0, sizeof( qthr_s ) ); memset( nb_1, 0, sizeof( nb_1 ) ); memset( nb_2, 0, sizeof( nb_2 ) ); memset( bu_l, 0, sizeof( bu_l ) ); memset( bo_l, 0, sizeof( bo_l ) ); memset( bu_s, 0, sizeof( bu_s ) ); memset( bo_s, 0, sizeof( bo_s ) ); memset( w1_l, 0, sizeof( w1_l ) ); memset( w2_l, 0, sizeof( w2_l ) ); memset( w1_s, 0, sizeof( w1_s ) ); memset( w2_s, 0, sizeof( w2_s ) ); memset( numlines, 0, sizeof( numlines ) ); memset( abx_sav, 0, sizeof( abx_sav ) ); memset( rx_sav, 0, sizeof( rx_sav ) ); /* setup stereo demasking thresholds */ /* formula reverse enginerred from plot in paper */ for ( sb = 0; sb < SBMAX_s; sb++ ){ mld_s[sb] = pow(10.0, 1.25*(1-cos(3.14159*sb/SBMAX_s))-2.5); } for ( sb = 0; sb < SBMAX_l; sb++ ){ mld_l[sb] = pow(10.0, 1.25*(1-cos(3.14159*sb/SBMAX_l))-2.5); } memset( partition_l, 0, sizeof( partition_l ) ); memset( partition_s, 0, sizeof( partition_s ) ); for( i = 0; i < HBLKSIZE; i++ ){ float freq_mult = (float)sfreqHz/BLKSIZE; float temp; temp = i * freq_mult; j = 1; while( temp > crit_band[j] ) j++; fthr[i]=j-1+(temp-crit_band[j-1])/(crit_band[j]-crit_band[j-1]); } partition[0] = 0; { float temp; temp = 1; bval_lo = fthr[0]; for( i = 1; i < HBLKSIZE; i++ ){ if( fthr[i] - bval_lo > 0.33 ){ partition[i] = partition[i-1] + 1; bval_lo = fthr[i]; numlines[partition[i-1]] = temp; temp = 1; }else{ partition[i] = partition[i-1]; temp++; } } numlines[partition[i-1]] = temp; } L3para_read( sfreqHz ); sp_pow_init(); num_part=0; num_part_s=0; for(i = 0; i < HBLKSIZE; i++) if(partition_l[i] > num_part) num_part = partition_l[i]; for(i = 0; i < HBLKSIZE_s; i++) if(partition_s[i] > num_part_s) num_part_s = partition_s[i]; num_part++; num_part_s++; numCBANDS = bo_l[SBMAX_l-1] + 1; numCBANDS_s = bo_s[SBMAX_s-1] + 1; /* reset for L3psycho_anal */ memset( pe, 0, sizeof( pe ) ); ms_ratio_s_old = 0; ms_ratio_l_old = 0; memset( ratio, 0, sizeof( ratio ) ); memset( ratio_s, 0, sizeof( ratio_s ) ); memset( thm_save, 0, sizeof( thm_save ) ); memset( en_save, 0, sizeof( en_save ) ); memset( thm_s_save, 0, sizeof( thm_s_save ) ); memset( en_s_save, 0, sizeof( en_s_save ) ); memset( blocktype_old, 0, sizeof( blocktype_old ) ); } gogo239b/l3psy.h100644 23421 144 1403 7220537347 12560 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * modified by shigeo */ #ifndef _L3PSY_H_ #define _L3PSY_H_ #define CBANDS_s 46 #define BLKSIZE_s 256 #define HBLKSIZE_s 129 #define SBMAX_l 21 #define SBMAX_s 12 #define BLKSIZE 1024 #define HBLKSIZE 513 #define CBANDS 63 #define NORM_TYPE 0 #define START_TYPE 1 #define SHORT_TYPE 2 #define STOP_TYPE 3 /* l3psy.c */ #include "l3side.h" void L3psycho_anal( int *buffer[2], int check_ms, float *ms_ener_ratio, float ratio_d[2][21], float ratio_ds[2][12][3], float pe[2], int blocktype_d[2]); void L3psy_init(int sfreqHz); #undef EXT #ifdef _MAIN_C #define EXT #else #define EXT extern #endif EXT void (*frame_shiftin)(int *mfbuf, short *frmBuffer, int samplesPerFrame, int stereo); #endif /* _L3PSY_H_ */ gogo239b/l3psya.nas100644 23421 144 74507 7220537347 13312 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to Keiichi SAKAI, URURI ; l3psy.h との整合性注意 %define CBANDS 63 %define HBLKSIZE_s 129 %define HBLKSIZE 513 %define BLKSIZE 1024 %define BLKSIZE_s 256 EXTRADELAY equ 56 ; defined in musenc.c %include "nasm.h" globaldef s3_l globaldef wsamp_r_int globaldef wsamp_rs globaldef window globaldef window_s globaldef sprdngf_3DN globaldef sprdngf_FPU globaldef sprdngf_SSE globaldef frame_shiftin_NONE globaldef frame_shiftin_MMX globaldef frame_shiftin_EMMX_MULTI globaldef calc_phase_SSE globaldef calc_phase_3DN globaldef calc_pe_3DN segment_bss align 16 wsamp_rs resd 256 ; exported to l3psy.c wsamp_r_int resd 2*BLKSIZE ; exported to l3psy.c window resd BLKSIZE ; exported to l3psy.c window_s resd BLKSIZE_s ; exported to l3psy.c align 16 s3_l: resd (CBANDS*CBANDS) ; exported to l3psy.c segment_data ; *** 注意 *** l3psy.c内のs3indとは異なっている!!! ; 2項目は回数にするため ind[i][1] = ind[i][1] - ind[i][0]+1; としている align 16 s3ind: dd 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9 dd 0,10, 0,11, 0,12, 0,13, 1,14, 1,14, 2,14 dd 3,13, 5,12, 6,12, 7,13, 9,12, 10,12, 11,12 dd 12,12, 14,11, 15,11, 15,13, 16,13, 16,13, 17,13 dd 18,13, 19,13, 19,14, 20,15, 21,15, 22,15, 22,15 dd 23,15, 24,15, 25,15, 26,16, 27,16, 28,16, 29,16 dd 30,16, 31,16, 32,16, 33,16, 34,16, 35,16, 36,16 dd 37,16, 37,17, 38,17, 39,17, 40,17, 41,17, 42,17 dd 43,17, 44,17, 45,17, 46,17, 47,16, 48,15, 48,15 ; l3psy.c内のs3indと同じ s3ind_C dd 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9 dd 0,10, 0,11, 0,12, 1,14, 1,14, 2,15, 3,15, 5,16 dd 6,17, 7,19, 9,20, 10,21, 11,22, 12,23, 14,24, 15,25 dd 15,27, 16,28, 16,28, 17,29, 18,30, 19,31, 19,32, 20,34 dd 21,35, 22,36, 22,36, 23,37, 24,38, 25,39, 26,41, 27,42 dd 28,43, 29,44, 30,45, 31,46, 32,47, 33,48, 34,49, 35,50 dd 36,51, 37,52, 37,53, 38,54, 39,55, 40,56, 41,57, 42,58 dd 43,59, 44,60, 45,61, 46,62, 47,62, 48,62, 48,62 s3ind_C_end: align 16 Q_not dd 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff Q_1: D_1_1 dd 1.0, 1.0, 1.0, 1.0 Q_05: D_05_05 dd 0.5, 0.5, 0.5, 0.5 Q_abs: D_ABS dd 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF Q_04: D_04_04 dd 0.4, 0.4, 0.4, 0.4 D_M05_05 dd 0.5, -0.5 align 16 log_data1 dd 1.4142135623,-1.4142135623 log_data2 dd 1.4000000000,0 ;=7/5 log_data3 dd 0.1428571428,0 ;=1/7 log_data4 dd 0.3333333333,0 ;=1/3 log_data5 dd 0.3465735903,0 ;=log2/2 segment_code ;************************************************************************ ; 99/08/28 ; by shigeo ;void sprdngf_3DN( float dest[CBANDS][2], float src[CBANDS][2] ); align 16 sprdngf_3DN: push ebx push esi push edi push ebp %assign _P 4*4 mov edi,[esp+_P+4] ;edi = dest mov edx,[esp+_P+8] ;edx = src mov ebx,s3_l ;ebx = offset of s3_l mov esi,s3ind ;esi = offset of s3ind mov ebp,CBANDS ;ebp = CBANDS femms jmp .lp0 align 16 .lp0: ;for(b = 0; b< CBANDS; b++){ mov eax,[esi] ;eax=k mov ecx,[esi+4] ;ecx=count=ind[b][1]-ind[b][0] pxor mm0,mm0 ;mm0=[0:0] align 4 .lp1: movd mm1,[ebx+eax*4] ;s3_l[b][k] punpckldq mm1,mm1 ;mm1=[s3] pfmul mm1,[edx+eax*8] ;mm1=[s3 * src] inc eax pfadd mm0,mm1 loop .lp1 movq [edi],mm0 ;[dest]=mm0 add edi,8 ;next dest add esi,8 ;next s3ind add ebx,4 * CBANDS dec ebp ;} jnz .lp0 femms pop ebp pop edi pop esi pop ebx ret ;------------------------------------------------------------------------ ; 99/11/09 8k[clk]@PIII ; by K.SAKAI ;void sprdngf_SSE( float dest[CBANDS][2], float src[CBANDS][2] ); align 16 sprdngf_SSE: push ebx push esi push edi %assign _P 3*4 mov edi,[esp+_P+4] ;edi = dest mov edx,[esp+_P+8] ;edx = src mov ebx,s3_l ;ebx = offset of s3_l ; s3ind_C[0][0] = {0, 3} fld dword [edx+0*8] ;src[0][0] fld dword [ebx+0*4] ;s3_l[0][0] fmul st1,st0 fmul dword [edx+0*8+4] ;src[0][1] fld dword [edx+1*8] ;src[1][0] fld dword [ebx+1*4] ;s3_l[0][1] fmul st1,st0 fmul dword [edx+1*8+4] ;src[1][1] fxch faddp st3,st0 faddp st1,st0 fld dword [edx+2*8] ;src[2][0] fld dword [ebx+2*4] ;s3_l[0][2] fmul st1,st0 fmul dword [edx+2*8+4] ;src[2][1] fxch faddp st3,st0 faddp st1,st0 fxch fstp dword [edi ] fstp dword [edi+4] mov esi,s3ind_C+8 ;esi = s3ind_C[1] add edi,8 ;next dest add ebx,4 * CBANDS jmp short .f0 align 16 ; for(b = 0; b< CBANDS; b++){ .f0: .lp0: mov eax,[esi] ; eax = k = ind[b][0] mov ecx,[esi+12] ; ecx = ind[b][1] add esi,16 ; next s3ind movlps xmm1,[edx+eax*8] ; {src[k][1], src[k][0]} movlhps xmm1,xmm1 movss xmm0,[ebx +eax*4] ;s3_l[b ][k] movss xmm7,[ebx+4*CBANDS+eax*4] ;s3_l[b+1][k] shufps xmm0,xmm7,0 mulps xmm0,xmm1 inc eax jmp short .f1 align 16 .f1: .lp1: movlps xmm1,[edx+eax*8] ; {src[k][1], src[k][0]} movlhps xmm1,xmm1 movss xmm6,[ebx +eax*4] ;s3_l[b ][k] movss xmm7,[ebx+4*CBANDS+eax*4] ;s3_l[b+1][k] shufps xmm6,xmm7,0 mulps xmm6,xmm1 inc eax cmp eax,ecx addps xmm0,xmm6 jbe .lp1 movups [edi],xmm0 add edi,16 ;next dest add ebx,8*CBANDS cmp esi,s3ind_C_end jb .lp0 ; } pop edi pop esi pop ebx ret ;------------------------------------------------------------------------ ; 99/09/03 9k[clk]@PII/PIII ; by K.SAKAI ;void sprdngf_FPU( float dest[CBANDS][2], float src[CBANDS][2] ); align 16 sprdngf_FPU: push ebx push esi push edi push ebp %assign _P 4*4 mov edi,[esp+_P+4] ;edi = dest mov edx,[esp+_P+8] ;edx = src mov ebx,s3_l ;ebx = offset of s3_l mov esi,s3ind ;esi = offset of s3ind mov ebp,CBANDS ;ebp = CBANDS jmp .lp0 align 16 .lp0: ;for(b = 0; b< CBANDS; b++){ mov eax,[esi] ;eax=k mov ecx,[esi+4] ;ecx=count=ind[b][1]-ind[b][0] fldz fldz align 4 .lp1: fld dword [ebx+eax*4] ;s3_l[b][k] fld dword [edx+eax*8] ;src[k][0] fld dword [edx+eax*8+4] ;src[k][1] inc eax dec ecx fxch st2 fmul st1,st0 fmulp st2,st0 faddp st3,st0 faddp st1,st0 jnz .lp1 fstp dword [edi+4] fstp dword [edi] add edi,8 ;next dest add esi,8 ;next s3ind add ebx,4 * CBANDS dec ebp ;} jnz .lp0 pop ebp pop edi pop esi pop ebx ret ;************************************************************************ ; 2000/03/30 get_audio()変更に伴う変更。by K.Sakai ;void frame_shiftin_NONE(int *mfbuf, short *frmBuffer, int samplesPerFrame, int stereo); align 16 frame_shiftin_NONE: push esi push edi push ebx push ebp %define _P 4*4 mov edi,[esp+_P+ 4] ; = mfbuf mov ebx,[esp+_P+12] ; = samplesPerFrame mov ecx,(576 + EXTRADELAY)/4 cmp byte [esp+_P+16],2 ; = stereo je near .stereo .mono: jmp short .f00 align 16 .f00: .lp00: mov esi,[edi+ebx*4+ 0] mov eax,[edi+ebx*4+ 4] mov ebp,[edi+ebx*4+ 8] mov edx,[edi+ebx*4+12] mov [edi+ 0],esi mov [edi+ 4],eax mov [edi+ 8],ebp mov [edi+12],edx add edi,16 loop .lp00 ; edi is &mfbuf[ch][576+EXTRADELAY] at here mov esi,[esp+_P+8] ; = frmBuffer jmp short .f01 align 16 .f01: .lp01: mov eax,[esi+ebx*2-8] mov edx,[esi+ebx*2-4] movsx ebp,ax movsx ecx,dx sar eax,16 sar edx,16 mov [edi+ebx*4-16],ebp mov [edi+ebx*4-12],eax mov [edi+ebx*4- 8],ecx mov [edi+ebx*4- 4],edx sub ebx,4 jnz .lp01 pop ebp pop ebx pop edi pop esi ret align 16 .stereo: .f10: .lp10: mov eax,[edi+ebx*4+ 0] mov ebp,[edi+ebx*4+ 4] mov edx,[edi+ebx*4+ 8] mov esi,[edi+ebx*4+12] mov [edi+ 0],eax mov [edi+ 4],ebp mov [edi+ 8],edx mov [edi+12],esi mov eax,[edi+(1152+576+EXTRADELAY)*4+ebx*4+ 0] mov ebp,[edi+(1152+576+EXTRADELAY)*4+ebx*4+ 4] mov edx,[edi+(1152+576+EXTRADELAY)*4+ebx*4+ 8] mov esi,[edi+(1152+576+EXTRADELAY)*4+ebx*4+12] mov [edi+(1152+576+EXTRADELAY)*4+ 0],eax mov [edi+(1152+576+EXTRADELAY)*4+ 4],ebp mov [edi+(1152+576+EXTRADELAY)*4+ 8],edx mov [edi+(1152+576+EXTRADELAY)*4+12],esi add edi,16 loop .lp10 ; edi is &mfbuf[0][576+EXTRADELAY] at here mov esi,[esp+_P+ 8] ; = frmBuffer jmp short .f11 align 16 .f11: .lp11: mov eax,[esi+ebx*4-16] mov edx,[esi+ebx*4-12] movsx ebp,ax movsx ecx,dx sar eax,16 sar edx,16 mov [edi+ebx*4-16],ebp mov [edi+ebx*4-12],ecx mov [edi+(1152+576+EXTRADELAY)*4+ebx*4-16],eax mov [edi+(1152+576+EXTRADELAY)*4+ebx*4-12],edx mov eax,[esi+ebx*4- 8] mov edx,[esi+ebx*4- 4] movsx ebp,ax movsx ecx,dx sar eax,16 sar edx,16 mov [edi+ebx*4- 8],ebp mov [edi+ebx*4- 4],ecx mov [edi+(1152+576+EXTRADELAY)*4+ebx*4- 8],eax mov [edi+(1152+576+EXTRADELAY)*4+ebx*4- 4],edx sub ebx,4 jnz .lp11 pop ebp pop ebx pop edi pop esi ret %if 0 ;************************************************************************ ; * frame_shiftin_NONE * ; 99/10/10 作成 EXTRADELAYは8の倍数を仮定(うるり) ; 99/10/29 微調整 ;void frame_shiftin_NONE(int *mfbuf, short *frmBuffer, int samplesPerFrame, int stereo); proc frame_shiftin_NONE %$mfbuf arg 4 %$frmBuffer arg 4 %$samplesPerFrame arg 4 %$stereo arg 4 pushd ebp, ebx, esi, edi .lp_ch: mov r1, [sp(%$mfbuf)] ;r1=mfbuf[ch][0] mov r0, [sp(%$samplesPerFrame)] lea r0, [r1+r0*dwsize] ;r0=mfbuf[ch][samplesPerFrame] mov r2, (576 + EXTRADELAY)/8 jmp .lp1 align 16 .lp1: mov r3, [r0+dwsizen(0)] mov r4, [r0+dwsizen(1)] mov [r1+dwsizen(0)], r3 mov r5, [r0+dwsizen(2)] mov [r1+dwsizen(1)], r4 mov r6, [r0+dwsizen(3)] mov [r1+dwsizen(2)], r5 mov r3, [r0+dwsizen(4)] mov [r1+dwsizen(3)], r6 mov r4, [r0+dwsizen(5)] mov [r1+dwsizen(4)], r3 mov r5, [r0+dwsizen(6)] mov [r1+dwsizen(5)], r4 mov r6, [r0+dwsizen(7)] mov [r1+dwsizen(6)], r5 add r0, dwsizen(8) mov [r1+dwsizen(7)], r6 add r1, dwsizen(8) dec r2 jnz .lp1 mov r0, [sp(%$frmBuffer)] ;r0=frmBuffer[ch][0] ;r1=mfbuf[ch][576+EXTRADELAY] mov r2, [sp(%$samplesPerFrame)] shr r2, 3 jmp .lp2 align 16 .lp2: movsx r3, word [r0+wsizen(0)] movsx r4, word [r0+wsizen(1)] mov [r1+dwsizen(0)], r3 movsx r5, word [r0+wsizen(2)] mov [r1+dwsizen(1)], r4 movsx r6, word [r0+wsizen(3)] mov [r1+dwsizen(2)], r5 movsx r3, word [r0+wsizen(4)] mov [r1+dwsizen(3)], r6 movsx r4, word [r0+wsizen(5)] mov [r1+dwsizen(4)], r3 movsx r5, word [r0+wsizen(6)] mov [r1+dwsizen(5)], r4 movsx r6, word [r0+wsizen(7)] mov [r1+dwsizen(6)], r5 add r0, wsizen(8) mov [r1+dwsizen(7)], r6 add r1, dwsizen(8) dec r2 jnz .lp2 dec dword [sp(%$stereo)] jz .exit add dword [sp(%$mfbuf)], dwsizen(1152+576+EXTRADELAY) add dword [sp(%$frmBuffer)], wsizen(1152) jmp .lp_ch .exit: popd ebp, ebx, esi, edi endproc %endif ;------------------------------------------------------------------------ ; * frame_shiftin_3DN * ; 99/10/10 3DNow!化 EXTRADELAYは8の倍数を仮定(うるり) ; 99/10/29 微調整 ;void frame_shiftin_3DN(int *mfbuf, short *frmBuffer, int samplesPerFrame, int stereo); proc frame_shiftin_3DN %$mfbuf arg 4 %$frmBuffer arg 4 %$samplesPerFrame arg 4 %$stereo arg 4 femms pushd ebp, ebx, esi, edi .lp_ch: mov r1, [sp(%$mfbuf)] ;r1=mfbuf[ch][0] mov r0, [sp(%$samplesPerFrame)] lea r0, [r1+r0*dwsize] ;r0=mfbuf[ch][samplesPerFrame] mov r2, (576 + EXTRADELAY)/8 jmp .lp1 align 16 .lp1: pmov mm0, [r0+dwsizen(0)] pmov mm1, [r0+dwsizen(2)] pmov [r1+dwsizen(0)], mm0 pmov mm2, [r0+dwsizen(4)] pmov [r1+dwsizen(2)], mm1 pmov mm3, [r0+dwsizen(6)] pmov [r1+dwsizen(4)], mm2 add r0, dwsizen(8) pmov [r1+dwsizen(6)], mm3 add r1, dwsizen(8) dec r2 jnz .lp1 mov r0, [sp(%$frmBuffer)] ;r0=frmBuffer[ch][0] ;r1=mfbuf[ch][576+EXTRADELAY] mov r2, [sp(%$samplesPerFrame)] shr r2, 3 pxor mm2, mm2 pxor mm3, mm3 jmp .lp2 align 16 .lp2: pmov mm0, [r0+wsizen(0)] pmov mm1, [r0+wsizen(4)] pxor mm4, mm4 pxor mm5, mm5 puplwd mm2, mm0 puphwd mm3, mm0 puplwd mm4, mm1 puphwd mm5, mm1 psrad mm2, 16 psrad mm3, 16 psrad mm4, 16 psrad mm5, 16 pmov [r1+dwsizen(0)], mm2 pmov [r1+dwsizen(2)], mm3 pmov [r1+dwsizen(4)], mm4 pmov [r1+dwsizen(6)], mm5 add r0, wsizen(8) add r1, dwsizen(8) dec r2 pxor mm2, mm2 pxor mm3, mm3 jnz .lp2 dec dword [sp(%$stereo)] jz .exit add dword [sp(%$mfbuf)], dwsizen(1152+576+EXTRADELAY) add dword [sp(%$frmBuffer)], wsizen(1152) jmp .lp_ch .exit: popd ebp, ebx, esi, edi femms endproc ;------------------------------------------------------------------------ ; 99/11/10 とりあえず。17.4k[clk] by K.SAKAI ; 00/03/23 とりあえず。C版8.8kが5.9[clk]@河童 by K.SAKAI ; マルチスレッド実行時は猛烈に遅いぞ。 ; EXTRADELAY は8の倍数を仮定 ; samplesPerFrame は 1152 か 576 である。 ;void frame_shiftin_MMX(int (*mfbuf)[1152+576+EXTRADELAY], short *frmBuffer, int samplesPerFrame, int stereo); align 16 frame_shiftin_MMX: mov eax,[esp+ 4] ; = mfbuf mov edx,[esp+12] ; = samplesPerFrame mov ecx,(576 + EXTRADELAY)/8 cmp byte [esp+16],2 ; = stereo je near .stereo .mono: jmp short .f00 align 16 .f00: .lp00: movq mm0,[eax+edx*4+ 0] movq mm1,[eax+edx*4+ 8] movq mm2,[eax+edx*4+16] movq mm3,[eax+edx*4+24] movq [eax+ 0],mm0 movq [eax+ 8],mm1 movq [eax+16],mm2 movq [eax+24],mm3 add eax,32 loop .lp00 ; eax is &mfbuf[ch][576+EXTRADELAY] at here mov ecx,[esp+ 8] ; = frmBuffer jmp short .f01 align 16 .f01: .lp01: movq mm1,[ecx+edx*2-16] movq mm3,[ecx+edx*2- 8] punpcklwd mm0,mm1 punpckhwd mm1,mm1 punpcklwd mm2,mm3 punpckhwd mm3,mm3 psrad mm0,16 psrad mm1,16 psrad mm2,16 psrad mm3,16 movq [eax+edx*4-32],mm0 movq [eax+edx*4-24],mm1 movq [eax+edx*4-16],mm2 movq [eax+edx*4- 8],mm3 sub edx,8 jnz .lp01 emms ret align 16 .stereo: .f10: .lp10: movq mm0,[eax+edx*4+ 0] movq mm1,[eax+edx*4+ 8] movq mm2,[eax+edx*4+16] movq mm3,[eax+edx*4+24] movq mm4,[eax+(1152+576+EXTRADELAY)*4+edx*4+ 0] movq mm5,[eax+(1152+576+EXTRADELAY)*4+edx*4+ 8] movq mm6,[eax+(1152+576+EXTRADELAY)*4+edx*4+16] movq mm7,[eax+(1152+576+EXTRADELAY)*4+edx*4+24] movq [eax+ 0],mm0 movq [eax+ 8],mm1 movq [eax+16],mm2 movq [eax+24],mm3 movq [eax+(1152+576+EXTRADELAY)*4+ 0],mm4 movq [eax+(1152+576+EXTRADELAY)*4+ 8],mm5 movq [eax+(1152+576+EXTRADELAY)*4+16],mm6 movq [eax+(1152+576+EXTRADELAY)*4+24],mm7 add eax,32 loop .lp10 ; eax is &mfbuf[0][576+EXTRADELAY] at here mov ecx,[esp+ 8] ; = frmBuffer jmp short .f11 align 16 .f11: .lp11: movq mm1,[ecx+edx*4-32] movq mm0,mm1 pslld mm0,16 movq mm3,[ecx+edx*4-24] movq mm2,mm3 pslld mm2,16 movq mm5,[ecx+edx*4-16] movq mm4,mm5 pslld mm4,16 movq mm7,[ecx+edx*4- 8] movq mm6,mm7 pslld mm6,16 psrad mm0,16 psrad mm2,16 psrad mm4,16 psrad mm6,16 movq [eax+edx*4-32],mm0 movq [eax+edx*4-24],mm2 movq [eax+edx*4-16],mm4 movq [eax+edx*4- 8],mm6 psrad mm1,16 psrad mm3,16 psrad mm5,16 psrad mm7,16 movq [eax+(1152+576+EXTRADELAY)*4+edx*4-32],mm1 movq [eax+(1152+576+EXTRADELAY)*4+edx*4-24],mm3 movq [eax+(1152+576+EXTRADELAY)*4+edx*4-16],mm5 movq [eax+(1152+576+EXTRADELAY)*4+edx*4- 8],mm7 sub edx,8 jnz near .lp11 emms ret ;------------------------------------------------------------------------ ; 00/03/24 MT対応版 ; EXTRADELAY は8の倍数を仮定 ; samplesPerFrame は 1152 か 576 である。 ;void frame_shiftin_EMMX_MULTI(int (*mfbuf)[1152+576+EXTRADELAY], short *frmBuffer, int samplesPerFrame, int stereo); align 16 frame_shiftin_EMMX_MULTI: mov eax,[esp+ 4] ; = mfbuf mov edx,[esp+12] ; = samplesPerFrame mov ecx,(576 + EXTRADELAY)/8 cmp byte [esp+16],2 ; = stereo je near .stereo .mono: jmp short .f00 align 16 .f00: .lp00: movq mm0,[eax+edx*4+ 0] movq mm1,[eax+edx*4+ 8] movq mm2,[eax+edx*4+16] movq mm3,[eax+edx*4+24] movntq [eax+ 0],mm0 movntq [eax+ 8],mm1 movntq [eax+16],mm2 movntq [eax+24],mm3 add eax,32 loop .lp00 ; eax is &mfbuf[ch][576+EXTRADELAY] at here mov ecx,[esp+ 8] ; = frmBuffer jmp short .f01 align 16 .f01: .lp01: movq mm1,[ecx+edx*2-16] movq mm3,[ecx+edx*2- 8] punpcklwd mm0,mm1 punpckhwd mm1,mm1 punpcklwd mm2,mm3 punpckhwd mm3,mm3 psrad mm0,16 psrad mm1,16 psrad mm2,16 psrad mm3,16 movntq [eax+edx*4-32],mm0 movntq [eax+edx*4-24],mm1 movntq [eax+edx*4-16],mm2 movntq [eax+edx*4- 8],mm3 sub edx,8 jnz .lp01 emms ret align 16 .stereo: .f10: .lp10: movq mm0,[eax+edx*4+ 0] movq mm1,[eax+edx*4+ 8] movq mm2,[eax+edx*4+16] movq mm3,[eax+edx*4+24] movq mm4,[eax+(1152+576+EXTRADELAY)*4+edx*4+ 0] movq mm5,[eax+(1152+576+EXTRADELAY)*4+edx*4+ 8] movq mm6,[eax+(1152+576+EXTRADELAY)*4+edx*4+16] movq mm7,[eax+(1152+576+EXTRADELAY)*4+edx*4+24] movntq [eax+ 0],mm0 movntq [eax+ 8],mm1 movntq [eax+16],mm2 movntq [eax+24],mm3 movntq [eax+(1152+576+EXTRADELAY)*4+ 0],mm4 movntq [eax+(1152+576+EXTRADELAY)*4+ 8],mm5 movntq [eax+(1152+576+EXTRADELAY)*4+16],mm6 movntq [eax+(1152+576+EXTRADELAY)*4+24],mm7 add eax,32 loop .lp10 ; eax is &mfbuf[0][576+EXTRADELAY] at here mov ecx,[esp+ 8] ; = frmBuffer jmp short .f11 align 16 .f11: .lp11: movq mm1,[ecx+edx*4-32] movq mm0,mm1 pslld mm0,16 movq mm3,[ecx+edx*4-24] movq mm2,mm3 pslld mm2,16 movq mm5,[ecx+edx*4-16] movq mm4,mm5 pslld mm4,16 movq mm7,[ecx+edx*4- 8] movq mm6,mm7 pslld mm6,16 psrad mm0,16 psrad mm2,16 psrad mm4,16 psrad mm6,16 movntq [eax+edx*4-32],mm0 movntq [eax+edx*4-24],mm2 movntq [eax+edx*4-16],mm4 movntq [eax+edx*4- 8],mm6 psrad mm1,16 psrad mm3,16 psrad mm5,16 psrad mm7,16 movntq [eax+(1152+576+EXTRADELAY)*4+edx*4-32],mm1 movntq [eax+(1152+576+EXTRADELAY)*4+edx*4-24],mm3 movntq [eax+(1152+576+EXTRADELAY)*4+edx*4-16],mm5 movntq [eax+(1152+576+EXTRADELAY)*4+edx*4- 8],mm7 sub edx,8 jnz near .lp11 emms ret ;************************************************************************ ; 99/12/23 by shigeo ; やっと動作した(34k clk -> 8.7k clk) ;void calc_phase_3DN( ; float abx_s[3][HBLKSIZE_s][2], float energy_s[3][HBLKSIZE_s],float *cw); align 16 calc_phase_3DN: push ebx push edi push esi push ebp %assign _P 4*4 femms mov ecx,50 mov edi,[esp+_P+4] ;edi=&abx_s[0][0][0] mov edx,[esp+_P+8] ;edx=&energy_s[0][0] mov ebp,[esp+_P+12] ;ebp=cw mov esi,HBLKSIZE_s * 4 add ebp,6*4 ;ebp=&cw[j=6] add edi,2*2*4 ;edi=&abx_s[0][k=2][0] add edx, 2*4 ;edx=&energy_s[0][k=2] movq mm6, [D_05_05] ;mm6=[0.5:0.5] ;abx_s[0], [1], [2] <=> edi, edi+esi*2, edi+esi*4 ;energy_s[0], [1], [2] <=> edx, edx+esi, edx+esi*2 jmp .lp align 16 .lp: mov eax,[edx] ;eax=en0 test eax,eax jz .F0 movq mm4,[edi] ;[b1:a1] movd mm1,eax ;mm1=[0:en0]=[0:den] pfrsqrt mm2,mm1 movq mm0,mm4 ;mm0=[b1:a1] movq mm3,mm2 pfmul mm2,mm2 psrlq mm0,32 ;mm0=[0:b1] pfrsqit1 mm2,mm1 pfmul mm0,mm4 ;mm0=[0:a1*b1] pfrcpit2 mm2,mm3 ;mm2=[*:1/√en0] pfmul mm4,mm4 ;mm4=[b1^2:a1^2] pfmul mm2,mm1 ;mm2=[0:√en0] pfmul mm4,[D_M05_05] ;mm4=[-b1^2/2:a1^2/2] pfadd mm2,mm2 ;mm2=[0:2√en0]=[0:tmp3] pfacc mm4,mm4 ;mm4=[*:(a1^2-b1^2)/2] punpckldq mm0,mm4 ;mm0=[numim:numre] jmp .F1 .F0: movd mm1,[D_1_1] ;mm1=[0:den=1] ;not movq! pxor mm2,mm2 ;mm2=[0:tmp3=0] movq mm0,mm1 ;mm0=[numim=0:numre=1] .F1: mov eax,[edx+esi*2] ;eax=en2 test eax,eax jnz .F3 punpckldq mm3,mm0 punpckhdq mm0,mm3 ;mm0=[numre:numim] jmp .F4 .F3: movd mm3,eax ;mm3=[0:en2] pfrsqrt mm4,mm3 movq mm5,mm4 pfmul mm4,mm4 pfrsqit1 mm4,mm3 pfrcpit2 mm4,mm5 pfmul mm3,mm4 ;mm3=[0:r2=√en2] pfsub mm2,mm3 ;mm2=[0:tmp3] pfmul mm1,mm3 ;mm1=[0:den] movq mm3,[edi+esi*4] ;mm3=[b2:a2] movq mm4,mm3 movq mm5,mm0 ;mm5=[numim:numre] pfacc mm4,mm4 ;mm4=[*:a2+b2] pfmul mm0,mm3 ;mm0=[b2*numim:a2*numre] pfacc mm5,mm5 ;mm5=[*:numre+numim] pfmul mm4,mm6 ;mm4=[*:(a2+b2)/2] pfmul mm4,mm5 ;mm4=[*:tmp2] punpckldq mm4,mm4 ;mm4=[tmp2:tmp2] pfsubr mm0,mm4 ;mm0=[numre':numim'] .F4: ;mm0=[numre:numim], mm1=[0:den], mm2=[0:tmp3] pfrcp mm3,mm1 pfrcpit1 mm1,mm3 pfrcpit2 mm1,mm3 ;mm1=[*:1/den] pfmul mm1,mm2 ;mm1=[0:tmp3/den] punpckldq mm1,mm1 ;mm1=[tmp:tmp] pfmul mm0,mm1 ;mm1=[numre:numim]*tmp movd mm3,[edx+esi] ;mm3=[0:en1] pfrsqrt mm4,mm3 movq mm5,mm4 pfmul mm4,mm4 pand mm2,[D_ABS] ;mm2=[0:|tmp3|] pfrsqit1 mm4,mm3 pfrcpit2 mm4,mm5 pfmul mm3,mm4 ;mm3=[0:rn=√en1] pfadd mm2,mm3 ;mm2=[0:den] movd eax,mm2 test eax,eax jnz .F5 pxor mm1,mm1 jmp .F6 .F5: movq mm1,[edi+esi*2] ;mm1=[bn:an] movq mm4,mm1 psrlq mm4,32 ;mm4=[0:bn] movq mm3,mm1 ;mm3=[bn:an] pfsub mm3,mm4 ;mm3=[*:an-bn] pfacc mm1,mm1 ;mm1=[*:an+bn] punpckldq mm3,mm1 ;mm3=[an+bn:an-bn] pfmul mm3,mm6 ;mm3=[(an+bn)/2:(an-bn)/2] pfsub mm3,mm0 ;mm3=[numre'':numim''] pfmul mm3,mm3 pfacc mm3,mm3 ;mm3=[*:re^2+im^2] pfrsqrt mm1,mm3 movq mm4,mm1 pfmul mm1,mm1 pfrsqit1 mm1,mm3 pfrcpit2 mm1,mm4 ;mm1=[*:1/√(re^2+im^2)] pfmul mm1,mm2 ;mm1=[*:1/cw[j]] pfrcp mm0,mm1 pfrcpit1 mm1,mm0 pfrcpit2 mm1,mm0 punpckldq mm1,mm1 ;mm1=[cw[j]] .F6: movq [ebp],mm1 movq [ebp+8],mm1 add edi,8 add edx,4 add ebp,16 dec ecx jnz near .lp mov ecx,76 ;=[(HBLKSIZE-206)/4] HBLKSIZE=513 rem=3 movq mm0,[D_04_04] jmp .F7 align 16 .F7: movq [ebp],mm0 movq [ebp+8],mm0 add ebp,16 loop .F7 movq [ebp],mm0 movd [ebp+8],mm0 pop ebp pop esi pop edi pop ebx femms ret ;************************************************************************ ; 99/11/22 Initial version by K.SAKAI ; use_reciprocalを定義すると3.5k(ST)/4.3k(MT)だけど出力ファイルが変わる。 ; 未定義では5.7k(ST)/6.2k(MT)だけど出力ファイルは変わらない。 ;void calc_phase_SSE(float abx_s[3][HBLKSIZE_s][2], float energy_s[3][HBLKSIZE_s],float *cw) ;{ ;%define use_reciprocal align 16 calc_phase_SSE: push ebx mov ebx,[esp+ 8] ; = abx_s mov eax,[esp+12] ; = energy_s mov edx,[esp+16] ; = cw mov ecx,esp sub esp,20 and esp,~15 mov [esp+16],ecx mov ecx,6 jmp short .f0 ; for ( j = 6; j < 206; j += 4 ){ ; k = (j+2) / 4; align 16 .lp0: movlps [edx+ecx*4-64+32],xmm7 movlps [edx+ecx*4-64+40],xmm7 movhps [edx+ecx*4-64+48],xmm7 movhps [edx+ecx*4-64+56],xmm7 .f0: ; /* square (x1,y1) */ ; den = energy_s[0][k]; ; a1 = abx_s[0][k][0]; ; b1 = abx_s[0][k][1]; movlps xmm0,[eax+ecx+ 2] movhps xmm0,[eax+ecx+10] ; = energy_s[0][k+3:k] movlps xmm4,[ebx+ecx*2+4+24] movlps xmm3,[ebx+ecx*2+4+16] movlps xmm2,[ebx+ecx*2+4+ 8] movlps xmm1,[ebx+ecx*2+4] unpcklps xmm3,xmm4 unpcklps xmm1,xmm2 movaps xmm2,xmm3 movhlps xmm2,xmm1 ; = abx_s[0][k+3:k][1] movlhps xmm1,xmm3 ; = abx_s[0][k+3:k][0] movaps xmm4,xmm1 mulps xmm1,xmm1 mulps xmm4,xmm2 ; = a1*b1 mulps xmm2,xmm2 subps xmm1,xmm2 mulps xmm1,[Q_05] ; = (a1*a1-b1*b1)*0.5 ; r1 = (den) ? sqrt( den ) : 0.0; ; numim = (den) ? (a1*a1-b1*b1)*0.5 : 0.0; ; numre = (den) ? a1*b1 : 1.0; ; den = (den) ? den : 1.0; %ifdef use_reciprocal rsqrtps xmm3,xmm0 movaps xmm2,xmm3 cmpordps xmm2,xmm2 ; = (den)? all one: all zero andps xmm3,xmm2 mulps xmm3,xmm0 ; = r1 %else xorps xmm2,xmm2 cmpneqps xmm2,xmm0 ; = (den)? all one: all zero sqrtps xmm3,xmm0 andps xmm3,xmm2 ; = r1 %endif movaps [esp],xmm3 andps xmm1,xmm2 ; = numim andps xmm4,xmm2 andps xmm0,xmm2 andnps xmm2,[Q_1] orps xmm4,xmm2 ; = numre orps xmm0,xmm2 ; = den ; /* multiply by (x2,-y2) */ ; r2 = energy_s[2][k]; ; a2 = abx_s[2][k][0]; ; b2 = abx_s[2][k][1]; ; xmm1 = numim, xmm4 = numre, xmm0 = den movlps xmm2,[eax+2*HBLKSIZE_s*4+ecx+ 2] movhps xmm2,[eax+2*HBLKSIZE_s*4+ecx+10] ; = energy_s[2][k+3:k] movlps xmm5,[ebx+2*HBLKSIZE_s*8+ecx*2+4] movlps xmm6,[ebx+2*HBLKSIZE_s*8+ecx*2+4+ 8] movhps xmm6,[ebx+2*HBLKSIZE_s*8+ecx*2+4+16] movhps xmm7,[ebx+2*HBLKSIZE_s*8+ecx*2+4+24] unpcklps xmm5,xmm6 unpckhps xmm6,xmm7 movaps xmm3,xmm5 movlhps xmm5,xmm6 ; = abx_s[2][k+3:k][0] movhlps xmm6,xmm3 ; = abx_s[2][k+3:k][1] ; tmp2 = (numim+numre)*(a2+b2)*0.5; ; tmp1 = -a2*numre+tmp2; ; tmp2 = -b2*numim+tmp2 movaps xmm7,xmm5 addps xmm7,xmm6 mulps xmm7,[Q_05] movaps xmm3,xmm1 addps xmm3,xmm4 mulps xmm7,xmm3 ; = tmp2 movaps xmm3,xmm7 mulps xmm5,xmm4 subps xmm3,xmm5 ; = tmp1 mulps xmm6,xmm1 subps xmm7,xmm6 ; = tmp2 ; r2 = (energy_s[2][k]) ? sqrt( energy_s[2][k] ) : 0.0; ; numim = (energy_s[2][k]) ? tmp1 : numim; ; numre = (energy_s[2][k]) ? tmp2 : numre; ; den = (energy_s[2][k]) ? den*r2 : den; ; xmm0 = den, xmm1 = numim, xmm2 = r2, xmm3 = tmp1, xmm4 = numre, xmm7 = tmp2 %ifdef use_reciprocal rsqrtps xmm5,xmm2 movaps xmm6,xmm5 cmpordps xmm6,xmm6 ; = (den)? all one: all zero andps xmm5,xmm6 mulps xmm2,xmm5 ; = r2 %else xorps xmm6,xmm6 cmpneqps xmm6,xmm2 ; = (den)? all one: all zero sqrtps xmm2,xmm2 andps xmm2,xmm6 ; = r2 %endif movaps xmm5,xmm2 mulps xmm5,xmm0 andps xmm3,xmm6 andps xmm7,xmm6 andps xmm5,xmm6 xorps xmm6,[Q_not] andps xmm1,xmm6 andps xmm4,xmm6 andps xmm0,xmm6 orps xmm1,xmm3 ; = numim orps xmm4,xmm7 ; = numre orps xmm0,xmm5 ; = den ; tmp3 = r1 + r1 - r2; ; tmp = tmp3 / den; ; numre *= tmp; ; numim *= tmp; ; xmm0 = den, xmm1 = numim, xmm2 = r2, xmm4 = numre %ifdef use_reciprocal rcpps xmm0,xmm0 ; = 1.0/den movaps xmm3,[esp] addps xmm3,xmm3 subps xmm3,xmm2 ; = tmp3 mulps xmm0,xmm3 ; = tmp andps xmm3,[Q_abs] ; = tmp3 = fabs(tmp3) mulps xmm4,xmm0 ; = numre mulps xmm1,xmm0 ; = numim %else movaps xmm3,[esp] addps xmm3,xmm3 subps xmm3,xmm2 ; = tmp3 movaps xmm2,xmm3 divps xmm2,xmm0 ; = tmp andps xmm3,[Q_abs] ; = tmp3 = fabs(tmp3) mulps xmm4,xmm2 ; = numre mulps xmm1,xmm2 ; = numim %endif ; rn = sqrt( energy_s[1][k] ); movlps xmm2,[eax+1*HBLKSIZE_s*4+ecx+ 2] movhps xmm2,[eax+1*HBLKSIZE_s*4+ecx+10] ; = energy_s[1][k+3:k] %ifdef use_reciprocal rsqrtps xmm0,xmm2 mulps xmm2,xmm0 ; = rn %else sqrtps xmm2,xmm2 %endif ; den = rn + fabs( tmp3 ); ; an = abx_s[1][k][0]; ; bn = abx_s[1][k][1]; ; xmm1 = numim, xmm2 = rn, xmm3 = tmp3, xmm4 = numre addps xmm3,xmm2 ; = den movlps xmm5,[ebx+1*HBLKSIZE_s*8+ecx*2+4] movlps xmm6,[ebx+1*HBLKSIZE_s*8+ecx*2+4+ 8] movhps xmm6,[ebx+1*HBLKSIZE_s*8+ecx*2+4+16] movhps xmm7,[ebx+1*HBLKSIZE_s*8+ecx*2+4+24] unpcklps xmm5,xmm6 unpckhps xmm6,xmm7 movaps xmm2,xmm5 movlhps xmm5,xmm6 ; = abx_s[1][k+3:k][0] movhlps xmm6,xmm2 ; = abx_s[1][k+3:k][1] movaps xmm2,[Q_05] movaps xmm7,xmm5 addps xmm5,xmm6 subps xmm7,xmm6 mulps xmm5,xmm2 mulps xmm7,xmm2 subps xmm5,xmm4 subps xmm7,xmm1 mulps xmm5,xmm5 mulps xmm7,xmm7 addps xmm5,xmm7 %ifdef use_reciprocal rsqrtps xmm0,xmm5 mulps xmm5,xmm0 %else sqrtps xmm5,xmm5 %endif ; numre = (den) ? ( an + bn ) * 0.5 - numre : numre; ; numim = (den) ? ( an - bn ) * 0.5 - numim : numim; ; cw[j] = (den) ? sqrt(numre*numre+numim*numim)/den : 0.0; ; cw[j+1] = cw[j+2] = cw[j+3] = cw[j]; %ifdef use_reciprocal rcpps xmm3,xmm3 ; = 1/den movaps xmm2,xmm3 cmpordps xmm2,xmm2 andps xmm3,xmm2 mulps xmm5,xmm3 %else xorps xmm2,xmm2 cmpneqps xmm2,xmm3 andps xmm5,xmm2 divps xmm5,xmm3 %endif movaps xmm7,xmm5 unpcklps xmm5,xmm5 unpckhps xmm7,xmm7 movlps [edx+ecx*4 ],xmm5 movlps [edx+ecx*4+ 8],xmm5 movhps [edx+ecx*4+16],xmm5 movhps [edx+ecx*4+24],xmm5 add ecx,16 cmp ecx,206 jl near .lp0 ; } movaps xmm0,[Q_04] mov ecx,208 movlps [edx+206*4],xmm0 jmp short .f1 align 16 ; for( j = 208; j < HBLKSIZE - 1; j++ ){ .lp1: .f1: ; cw[j] = 0.4; %if 1 movlps [edx+ecx*4],xmm0 movlps [edx+ecx*4+ 8],xmm0 movlps [edx+ecx*4+16],xmm0 movlps [edx+ecx*4+24],xmm0 %else movaps [edx+ecx*4 ],xmm0 movaps [edx+ecx*4+16],xmm0 %endif add ecx,8 cmp ecx,HBLKSIZE-3 jl .lp1 ; } ; movss [edx+ecx*4+8],xmm0 movss [edx+ecx*4+0],xmm0 ;bug fix by PEN ( 00/01/13 ) mov esp,[esp+16] pop ebx ret ;} ;************************************************************************ ;void calc_pe_3DN( float *pe, int num, float *thr, float *ebc, int *numlines ); ; by shigeo ; 00/03/02 4000 clk on K6-2 ; 99/02/11 femmsを除くと約38clock, 1<=x<2の範囲で最大誤差1.25e-7 ; (AMDLOG.ASMより速くて正確) ; 計算方法 ; x=2^b*a, 1<=a<2, b:整数 ; x=[s:b:a] s:1bit, b:8bit, a:23bit ; z=(a-√2)/(a+√2) ; logx=(2b+1)*log2/2+2{z+z^3/3+z^5/5+z^7/7} ; 00/04/24 {}内は{(1+1.42606e-6)z+z^3*(1/3-0.000262124)+z^5*(1/5+0.0117245)} ; にすると若干の誤差と引き替えにちょっと速いかも by Tominaga (但し未実装) ; 00/04/25 作ってみたけど殆んど変わらなかったので保留(多分ちゃんと考えないと駄目?) ; input :x=mm0 ; output ;mm0=log(|x|) ; destroy:mm0,mm1,mm2,mm3 proc calc_pe_3DN push ebx push esi push edi %assign _P 4*3 mov ecx,[esp+_P+8] ;ecx=num mov ebx,[esp+_P+12] ;ebx=thr mov edx,[esp+_P+16] ;edx=ebc mov edi,[esp+_P+20] ;edi=numlines femms movq mm5,[D_1_1] ;mm5=[*:1] pxor mm7,mm7 ;mm7=tmp movq mm4,[log_data5] jmp short .lp align 16 .lp: movd mm0,[ebx] add ebx,4 movd mm6,[edx] add edx,8 pfadd mm0,mm5 pfadd mm6,mm5 movq mm2,mm6 pfcmpgt mm6,mm0 ;mm6 = (ebc>thr)?1:0 ;後で使う! pfrcp mm3,mm2 pfrcpit1 mm2,mm3 pfrcpit2 mm2,mm3 ;mm2= 1 / (ebc + 1) pfmul mm0,mm2 movd eax,mm0 mov esi,eax movq mm1,[log_data1] ;mm1=[-√2:√2] and esi,7F800000h ;指数部 or eax,3F800000h ;eax=a shr esi,22 ;esi=2*(b+127) movd mm0,eax punpckldq mm0,mm0 ;mm0=[a:a] movq mm3,[log_data2] ;mm3=[0:7/5] pfadd mm1,mm0 ;mm1=[a-√2:a+√2] sub esi,253 ;esi=2*b+1 movq mm0,mm1 movq mm2,mm1 pfrcp mm1,mm0 psrlq mm2,32 ;mm2=[0:a-√2] pfrcpit1 mm0,mm1 pfrcpit2 mm0,mm1 ;mm0=[?:1/(a+√2)] pfmul mm0,mm2 ;mm0=[0:z] movq mm2,[log_data3] ;m2=1/7 movq mm1,mm0 ;m1=z pfmul mm0,mm0 ;m0=zz pfmul mm2,mm0 ;m2=zz/7 pfadd mm3,mm0 ;m3=7/5+zz pfmul mm2,mm3 ;m2=zz(1/5+zz/7) pfadd mm2,[log_data4] ;m2=1/3+zz(1/5+zz/7) pfmul mm0,mm1 ;m0=z^3 movd mm3,esi ;m3=(int)2b+1 pfmul mm0,mm2 ;m0=z^3/3+z^5/5+z^7/7 pi2fd mm3,mm3 ;m3=(float)2b+1 pfadd mm0,mm1 ;m0=X:=z+z^3/3+z^5/5+z^7/7 pfmul mm3,mm4;=[log_data5] ;m3=(2b+1)*log2/2 movd mm2,[edi] ;mm2=numlines pfadd mm0,mm0 ;m0=2X pi2fd mm2,mm2 pfadd mm0,mm3 ;m0=log(x) pand mm0,mm6 ;if()のときのみ pfmul mm0,mm2 add edi,4 dec ecx pfsub mm7,mm0 jnz near .lp movd eax,mm7 femms mov edx,[esp+_P+4] pop edi mov [edx],eax pop esi pop ebx ret ;************************************************************************ end gogo239b/message.h100644 23421 144 3340 7220537347 13134 0ustar shigeousers#ifndef _MESSAGE_H_ #define _MESSAGE_H_ #include "common.h" #define MSG_LEN_MAX 100 #ifdef __HIGHC__ #define DFLT_LANG tLANG_JAPANESE_SJIS #else #define DFLT_LANG tLANG_ENGLISH #endif #if defined(__os2__) || defined(__dos__) #define strcmp stricmp #endif typedef enum{ tLANG_UNKNOWN, tLANG_JAPANESE_SJIS, tLANG_JAPANESE_EUC, tLANG_ENGLISH, tLANG_GERMAN, tLANG_SPANISH, } t_lang; t_lang setLang( t_lang n ); t_lang getLangType( void ); char *getMsg( int n ); enum{ MSG_GOGO, MSG_TITLE1, MSG_TITLE2, MSG_BENCH, MSG_err_opt_m, MSG_err_opt_b, MSG_err_opt_s, MSG_err_opt_emp, MSG_err_rate, MSG_err_opt_d, MSG_err_opt_off, MSG_err_opt_lpf, MSG_err_opt_outputdir, MSG_err_opt_cpu, MSG_err_opt_priority, MSG_err_opt_readpriority, MSG_err_inp, MSG_err_riff_opt, MSG_err_opt_v, MSG_err_opt_offset, MSG_err_else, MSG_err_opt_vb, MSG_err_opt_th, MSG_mono, MSG_stereo, MSG_j_stereo, MSG_ms_stereo, MSG_dual, MSG_undefined, MSG_in_freq, MSG_out_freq, MSG_bitrate, MSG_in_name, MSG_out_name, MSG_finish, MSG_help1, MSG_help2, MSG_help3, MSG_help4, MSG_help5, MSG_help6, MSG_help7, MSG_help8, MSG_help9, MSG_help10, MSG_help11, MSG_help12, MSG_help13, MSG_help14, MSG_help15, MSG_help16, MSG_help17, MSG_help18, MSG_help19, MSG_help20, MSG_help21, MSG_help22, MSG_help23, MSG_help24, MSG_help25, MSG_help26, MSG_help27, MSG_help28, MSG_help29, MSG_help30, MSG_help31, MSG_help32, MSG_help33, MSG_ME_NOERR, MSG_ME_EMPTYSTREAM, MSG_ME_INTERNALERROR, MSG_ME_PARAMERROR, MSG_ME_NOFPU, MSG_ME_INFILE_NOFOUND, MSG_ME_OUTFILE_NOFOUND, MSG_ME_FREQERROR, MSG_ME_BITRATEERROR, MSG_ME_WAVETYPE_ERR, MSG_ME_CANNOT_SEEK, MSG_ME_HALTED, MSG_ME_WRITEERROR, MSG_CHECK_SSE, MSG_SUPPORT_SSE, MSG_NOT_SUPPORT_SSE, MSG_NUM_OF_CPU, MSG_VERIFY, MSG_DELETE, }; #endif /* _MESSAGE_H_ */ gogo239b/mdct.c100644 23421 144 10131 7220537347 12446 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 shigeo * special thanks to Keiichi SAKAI, URURI */ /* * 99/05/13 3D Now!対応 by shigeo * mdctルーチンの2.3倍の高速化(640000clk -> 288000clk) * 全体では約7%の高速化 * 99/05/17 PENさんとのソースの統合 * まだ改良の余地有り(1割は余裕で出来ると思う) * * tableInitForMDCT()を最初に呼ぶことを忘れないこと!!! * 99/08/10 * LAMEのソースと統合 * LAMEのmdctがかなり速いので驚き * 99/09/02 酒居 * mdct_SSE, mdct_FPU作成 * 99/09/02(うるり) * mdct_CのASM化のためmdct_Cのテーブルを外に出す。 * テーブル初期化をinit_mdct()に移動。 * mdct_FPU作成 * 99/09/03(うるり) * mdct_3DN作成 * 99/09/29(sakai) * arb_SSE作成 * 99/10/03(shigeo) * arb_3DN作成 * 99/10/17(うるり) * mdct_sub_{3DN,FPU}のfull asm化(3DN 110k clk) */ #include "common.h" #include "mdct.h" #include "haveunit.h" void mdct_sub_SSE(L3SBS (*sb_sample), float (*mdct_freq)[2][576], int stereo, III_side_info_t *l3_side, int mode_gr); void mdct_sub_3DN(L3SBS (*sb_sample), float (*mdct_freq)[2][576], int stereo, III_side_info_t *l3_side, int mode_gr); void mdct_sub_FPU(L3SBS (*sb_sample), float (*mdct_freq)[2][576], int stereo, III_side_info_t *l3_side, int mode_gr); /* defined in msubtbl.nas */ extern void (*mdct)( float *in, float *out, int block_type ); void mdct_3DN(float *in, float *out, int block_type);/*avg550clk*/ #ifdef USE_E3DN void mdct_E3DN(float *in, float *out, int block_type); #endif extern float ca_arb[8], cs_arb[8]; extern float csa_arb_3DN[8*4]; /* * csa[1:0]=s[0:1] * csa[3:2]=a[0:1] * csa[5:4]=s[1:0] * csa[7:6]=a[1:0] * csa[9:8]=s[2:3],... */ extern float win_mdct[4][36]; extern float cos_s_mdct[6][12]; extern float cos_l_mdct[18][18]; /* aliasing reduction butterfly */ /* 4500[clk]@PIII */ void setup_mdct(int useUNIT) { if(useUNIT & t3DN){ SETUP_DSP("use:mdct_sub_3DN\n"); mdct_sub = mdct_sub_3DN; #ifdef USE_E3DN if( useUNIT & tE3DN ){ SETUP_DSP("use:mdct_E3DN\n"); mdct = mdct_E3DN; }else #endif { SETUP_DSP("use:mdct_3DN\n"); mdct = mdct_3DN; } }else if(useUNIT & tSSE){ SETUP_DSP("use:mdct_sub_SSE\n"); // 77k[clk] mdct_sub = mdct_sub_SSE; }else { SETUP_DSP("use:mdct_sub_FPU\n"); mdct_sub = mdct_sub_FPU; } } /* * mdctで使うためのテーブル作成 */ void init_mdct_3DN(void){ int k,i,m,N; /* type 0 */ for ( i = 0; i < 36; i++ ) win_mdct[0][i] = sin( PI/36 * (i + 0.5) ); /* type 1*/ for ( i = 0; i < 18; i++ ) win_mdct[1][i] = sin( PI/36 * (i + 0.5) ); for ( i = 18; i < 24; i++ ) win_mdct[1][i] = 1.0; for ( i = 24; i < 30; i++ ) win_mdct[1][i] = sin( PI/12 * ( i + 0.5 - 18) ); for ( i = 30; i < 36; i++ ) win_mdct[1][i] = 0.0; /* type 3*/ for ( i = 0; i < 6; i++ ) win_mdct[3][i] = 0.0; for ( i = 6; i < 12; i++ ) win_mdct[3][i] = sin( PI/12 * (i + 0.5 - 6) ); for ( i = 12; i < 18; i++ ) win_mdct[3][i] = 1.0; for ( i = 18; i < 36; i++ ) win_mdct[3][i] = sin( PI/36 * (i + 0.5) ); N = 12; for ( m = 0; m < N / 2; m++ ) for ( k = 0; k < N; k++ ) cos_s_mdct[m][k] = cos( (PI /(2 * N)) * (2 * k + 1 + N / 2) * (2 * m + 1) ) / (N / 4) * sin( PI/12 * (k + 0.5) ); N = 36; for ( m = 0; m < N / 2; m++ ){ for ( k = 0; k < 9; k++ ){ cos_l_mdct[m][k] = cos( (PI / (2 * N)) * (2 * k + 1 + N / 2) * (2 * m + 1) ) / (N / 4); cos_l_mdct[m][9+k] = cos( (PI / (2 * N)) * (2 * (18 + k) + 1 + N / 2) * (2 * m + 1) ) / (N / 4); } } } /* * 実行前にこの関数を呼ぶことを忘れないこと!!! */ void tableInitForMDCT(void){ int k; float c[8] = { -0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142, -0.0037 }; for ( k = 0; k < 8; k++ ){ double sq; sq = sqrt( 1.0 + c[k] * c[k] ); ca_arb[k] = c[k] / sq; cs_arb[k] = 1.0 / sq; } for( k = 0; k < 4; k++ ){ float s_l,s_h,a_l,a_h; s_l = cs_arb[k*2+0]; s_h = cs_arb[k*2+1]; a_l = ca_arb[k*2+0]; a_h = ca_arb[k*2+1]; csa_arb_3DN[0+k*8] = s_h; csa_arb_3DN[1+k*8] = s_l; csa_arb_3DN[2+k*8] = a_h; csa_arb_3DN[3+k*8] = a_l; csa_arb_3DN[4+k*8] = s_l; csa_arb_3DN[5+k*8] = s_h; csa_arb_3DN[6+k*8] = a_l; csa_arb_3DN[7+k*8] = a_h; } init_mdct_3DN(); } gogo239b/Makefile100644 23421 144 11026 7225617506 13020 0ustar shigeousers# # Copyright (C) 1999,2000 shigeo # modified by Keiichi SAKAI, Noisyu and harada # #use Enhanced 3D Now! #you need modified NASM to use this option #USE_E3DN=yes #use VBR USE_VBR =yes #use multi-thread #OS must be Linux with libc6, FreeBSD-4.0R with linuxthreads or BeOS USE_MT=yes #define if OS is BeOS #OS=BeOS #define if OS is Windows #OS=Windows ifndef OS OS:=$(shell uname -s) endif ifeq ($(USE_E3DN),yes) E3DN=-DUSE_E3DN endif ifeq ($(USE_VBR),yes) VBR=-DLAME355 -DUSE_VBR endif # common definition LD=gcc #LD=gcc -Wl,-Map,gogo.map LIBS=-lm CC=gcc -c -m486 -O3 -finline-functions -fomit-frame-pointer -funroll-loops # This option is available for gcc-2.8.x #CC=gcc -c -mcpu=pentiumpro -malign-double -O6 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops # This option is available for gcc-2.95.1, gcc-2.95.2, gcc-2.95.3,... on P6 or later #CC=gcc -c -mcpu=pentiumpro -march=pentiumpro -O9 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops -ffast-math -foptimize-register-move -fdefer-pop -mfancy-math-387 CFLAGS=-Wall $(PROF) -DNDEBUG $(E3DN) $(VBR) -DRAW_INPUT # OS specific definition ifeq ($(OS),BeOS) LIBS= CFLAGS+= -DDISPLAY_REALTIME -D__unix__ -DBeOS ifeq ($(USE_MT),yes) CFLAGS+= -DUSE_BTHREAD endif endif ifeq ($(OS),Linux) CFLAGS+= -DDISPLAY_REALTIME ifeq ($(USE_MT),yes) LIBS+= -lpthread CFLAGS+= -DUSE_PTHREAD endif ifdef RPM_OPT_FLAGS CC=gcc -c $(RPM_OPT_FLAGS) endif endif ifeq ($(OS),FreeBSD) CFLAGS+= -DDISPLAY_REALTIME ifeq ($(USE_MT),yes) LIBS+= -L/usr/local/lib -llthread -llgcc_r CFLAGS+= -DUSE_PTHREAD -D_THREAD_SAFE -I/usr/local/include/pthread/linuxthreads endif endif ifeq ($(OS),OpenBSD) CFLAGS+= -D__unix__ -DDISPLAY_REALTIME endif ifeq ($(OS),NetBSD) CFLAGS+= -D__unix__ -DDISPLAY_REALTIME endif ifeq ($(OS),Windows) ifeq ($(USE_MT),yes) CFLAGS+= -DUSE_WINTHREAD endif endif AS=nasm #if Borland C++ then add -D__BORLANDC__ to ASFLAGS ASFLAGS=-f elf -D__unix__ $(E3DN) #if FreeBSD 2.x then #ASFLAGS = -f aoutb -D__unix__ -DAOUT LDFLAGS=$(PROF) #PROF=-g -pg OBJS = message.o bitstrem.o common.o encode.o huffman.o l3bs.o l3psy.o loop.o mdct.o subs.o tables.o vbrtag.o setup.o readsmpl.o musui.o musenc.o AOBJS = clk.o haveunit.o huffmana.o quantize.o mdct3dn.o msubsse.o mdctfpu.o mdcttbl.o fft.o fftsse.o fft3dn.o ffttbl.o fftfpu.o l3psya.o putbits.o align.o sbandtbl.o sbandsse.o sbandfpu.o sband3dn.o msubtbl.o msubfpu.o msub3dn.o .SUFFIXES: .nas .c all: gogo install : gogo cp gogo /usr/local/bin strip /usr/local/bin/gogo gogo :$(OBJS) $(AOBJS) $(LD) $(OBJS) $(AOBJS) $(LDFLAGS) -o gogo $(LIBS) .nas.o: $(AS) $(ASFLAGS) $< #if FreeBSD 2.x then # $(AS) $(ASFLAGS) $< -o $@ .c.o: $(CC) $(CFLAGS) $< clean: \rm -f *.o gogo *~ common.h : l3side.h l3bs.h : common.h l3psy.h : l3side.h loop.h : common.h readsmpl.h : common.h vbrtag.h : l3bs.h bitstrem.o : bitstrem.c common.h bitstrem.h common.o : common.c common.h musenc.h encode.o : encode.c common.h haveunit.h subband.h huffman.o : huffman.c common.h huffman.h huffcode.tbl l3bs.o : l3bs.c l3bs.h l3psy.h mdct.h loop.h huffman.h bitstrem.h l3psy.o : l3psy.c common.h global.h l3psy.h l3side.h haveunit.h loop.o : loop.c musenc.h global.h loop.h huffman.h l3bs.h haveunit.h l3psy.h mdct.o : mdct.c common.h mdct.h haveunit.h musenc.o : musenc.c common.h global.h musenc.h subband.h readsmpl.h bitstrem.h l3psy.h mdct.h loop.h l3bs.h vbrtag.h haveunit.h musui.o : musui.c common.h musenc.h haveunit.h readsmpl.o : readsmpl.c common.h global.h readsmpl.h musenc.h setup.o : setup.c haveunit.h subs.o : subs.c common.h haveunit.h table.o : table.c vbrtag.o : vbrtag.c vbrtag.h musenc.h bitstrem.h haveunit.o : haveunit.nas nasm.h huffmana.o : huffmana.nas nasm.h clk.o : clk.nas nasm.h quantize.o : quantize.nas grinfo.inc nasm.h sbandtbl.o : sbandtbl.nas nasm.h sbandsse.o : sbandsse.nas nasm.h sband3dn.o : sband3dn.nas nasm.h sbandfpu.o : sbandfpu.nas nasm.h mdcttbl.o : mdcttbl.nas nasm.h mdctfpu.o : mdctfpu.nas nasm.h msubsse.o : msubsse.nas nasm.h mdct3dn.o : mdct3dn.nas nasm.h fft.o : fft.nas nasm.h ffttbl.o : ffttbl.nas nasm.h fftsse.o : fftsse.nas nasm.h fftfpu.o : fftfpu.nas nasm.h fft3dn.o : fft3dn.nas nasm.h l3psya.o : l3psya.nas nasm.h putbits.o : putbits.nas nasm.h align.o : align.nas nasm.h msubtbl.o : msubtbl.nas nasm.h msub3dn.o : msub3dn.nas nasm.h msubfpu.o : msubfpu.nas nasm.h message.o : message.c message.h japanese.msg english.msg german.msg spanish.msg gogo239b/mdct.h100644 23421 144 627 7220537347 12424 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 shigeo */ #ifndef _MDCT_H #define _MDCT_H #define SBLIMIT 32 typedef float L3SBS[2][3][18][SBLIMIT]; void tableInitForMDCT(void); #undef EXT #ifdef _MAIN_C #define EXT #else #define EXT extern #endif EXT void (*mdct_sub)(L3SBS (*sb_sample), float (*mdct_freq)[2][576], int stereo, III_side_info_t *l3_side, int mode_gr); #endif /* _MDCT_H */ gogo239b/mdct3dn.nas100644 23421 144 73026 7220537347 13426 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to URURI ; * mdct_3DN * ; 99/09/03 550clk mdct_FPUを3DNow!化 ; 99/09/11 統合のため若干修正 ; 99/10/29 微調整 ; * mdct_E3DN * ; 99/09/15(うるり) 3DNow!Extension対応版。-DUSE_E3DN時のみ使用 ; 99/10/29 微調整 ; * arb_3DN * ; 99/10/03(shigeo) %include "nasm.h" ; globaldef arb_3DN globaldef win_mdct globaldef cos_s_mdct globaldef cos_l_mdct globaldef csa_arb_3DN segment_data align 16 D_MSB1_0 dd 0x00000000 , 0x80000000 D_MSB1_1 dd 0x80000000 , 0x80000000 D_MSB0_1 dd 0x80000000 , 0x00000000 align 16 win_mdct times 4*36 dd 0 cos_s_mdct times 6*12 dd 0 cos_l_mdct times 18*18 dd 0 align 16 csa_arb_3DN times 8*4 dd 0 %if 1 ;うるりさんコード(0はshigeo) segment_code ;void mdct_3DN( float *in, float *out, int block_type ); proc mdct_3DN %$in arg 4 %$out arg 4 %$type arg 4 %$fin local fsizen(18) alloc femms pushd ebp, ebx, esi, edi ; if ( block_type == 2){ ; N = 12; ; for ( l = 0; l < 3; l++ ){ ; for ( m = 0; m < N / 2; m++ ){ ; for ( sum = 0.0, k = 0; k < N; k++ ) ; sum += in[k + 6 * l + 6] * cos_s[m][k]; ; out[ 3 * m + l] = sum; ; } ; } mdct_3DN_type2: mov r0, [sp(%$type)] cmp r0, 2 jne near mdct_3DN_type013 .for_init: mov r0, [sp(%$in)] add r0, fsizen(6) ;&in[6] mov r1, 3 mov r3, cos_s_mdct ;&cos_s[0] mov r5, [sp(%$out)] ;&out[0] .for: .for2_init: mov r4, 6 .for2: pmov mm0, [r0+fsizen(0)] pfmul mm0, [r3+fsizen(0)] pmov mm1, [r0+fsizen(2)] pfmul mm1, [r3+fsizen(2)] pmov mm2, [r0+fsizen(4)] pfmul mm2, [r3+fsizen(4)] pfadd mm0, mm1 pmov mm3, [r0+fsizen(6)] pfmul mm3, [r3+fsizen(6)] pfadd mm0, mm2 pmov mm4, [r0+fsizen(8)] pfmul mm4, [r3+fsizen(8)] pfadd mm0, mm3 pmov mm5, [r0+fsizen(10)] pfmul mm5, [r3+fsizen(10)] pfadd mm0, mm4 pfadd mm0, mm5 pfacc mm0, mm0 pmovd [r5], mm0 .for2_next: add r3, fsizen(12) add r5, fsizen(3) dec r4 jnz .for2 .for_next: add r0, fsizen(6) add r3, 0 -fsizen(12)*6 add r5, fsize -fsizen(3)*6 dec r1 jnz near .for nop jmp mdct_3DN_exit ; for (k=0;k<9;k++){ ; fin[k] = win[block_type][k] * in[k] - win[block_type][17-k] * in[17-k]; ; fin[9+k] = win[block_type][18+k] * in[18+k] + win[block_type][35-k] * in[35-k]; ; } ; mdct_3DN_type013: imul r0, fsizen(36) add r0, win_mdct+fsizen(32) ;&win[block_type][32] lea r1, [sp(%$fin)] ;&fin[0] mov r2, [sp(%$in)] add r2, fsizen(32) ;&in[32] ;0 ;1 ;2 ;3 pmov mm0, [r0+fsizen(16-32)] pfmul mm0, [r2+fsizen(16-32)] pmov mm1, [r0+fsizen(14-32)] pfmul mm1, [r2+fsizen(14-32)] pupldq mm4, mm0 pmov mm2, [r0+fsizen(0-32)] pupldq mm5, mm1 pfmul mm2, [r2+fsizen(0-32)] puphdq mm0, mm4 pmov mm3, [r0+fsizen(2-32)] puphdq mm1, mm5 pfmul mm3, [r2+fsizen(2-32)] pfsub mm2, mm0 pfsub mm3, mm1 pmov [r1+fsizen(0)], mm2 pmov [r1+fsizen(2)], mm3 ;4 ;5 ;6 ;7 ;8 pmov mm0, [r0+fsizen(12-32)] pfmul mm0, [r2+fsizen(12-32)] pmov mm1, [r0+fsizen(10-32)] pfmul mm1, [r2+fsizen(10-32)] pupldq mm5, mm0 pmov mm2, [r0+fsizen(4-32)] pupldq mm6, mm1 pfmul mm2, [r2+fsizen(4-32)] pmov mm4, [r0+fsizen(8-32)] puphdq mm0, mm5 pfmul mm4, [r2+fsizen(8-32)] pmov mm3, [r0+fsizen(6-32)] puphdq mm1, mm6 pfmul mm3, [r2+fsizen(6-32)] pxor mm4, [D_MSB1_0] pfsub mm2, mm0 pfsub mm3, mm1 pfacc mm4, mm4 pmov [r1+fsizen(4)], mm2 pmov [r1+fsizen(6)], mm3 pmovd [r1+fsizen(8)], mm4 ;9 ;10 ;11 ;12 pmov mm0, [r0+fsizen(34-32)] pfmul mm0, [r2+fsizen(34-32)] pmov mm1, [r0+fsizen(32-32)] pfmul mm1, [r2+fsizen(32-32)] pupldq mm4, mm0 pmov mm2, [r0+fsizen(18-32)] pupldq mm5, mm1 pfmul mm2, [r2+fsizen(18-32)] puphdq mm0, mm4 pmov mm3, [r0+fsizen(20-32)] puphdq mm1, mm5 pfmul mm3, [r2+fsizen(20-32)] pfadd mm2, mm0 pfadd mm3, mm1 pmov [r1+fsizen(9)], mm2 pmov [r1+fsizen(11)], mm3 ;13 ;14 ;15 ;16 ;17 pmov mm0, [r0+fsizen(30-32)] pfmul mm0, [r2+fsizen(30-32)] pmov mm1, [r0+fsizen(28-32)] pfmul mm1, [r2+fsizen(28-32)] pupldq mm5, mm0 pmov mm2, [r0+fsizen(22-32)] pupldq mm6, mm1 pfmul mm2, [r2+fsizen(22-32)] puphdq mm0, mm5 pmov mm3, [r0+fsizen(24-32)] puphdq mm1, mm6 pfmul mm3, [r2+fsizen(24-32)] pmov mm4, [r0+fsizen(26-32)] pfadd mm2, mm0 pfmul mm4, [r2+fsizen(26-32)] pfadd mm3, mm1 pfacc mm4, mm4 pmov [r1+fsizen(13)], mm2 pmov [r1+fsizen(15)], mm3 pmovd [r1+fsizen(17)], mm4 ; /* 0 */ ; cos_l0= &cos_l[0][0]; ; sum = ( fin[0] ) * *cos_l0; /* 17 */ ; sum += ( fin[1] ) * *++cos_l0; /* 15 */ ; sum += ( fin[2] ) * *++cos_l0; /* 13 */ ; sum += ( fin[3] ) * *++cos_l0; /* 11 */ ; sum += ( fin[4] ) * *++cos_l0; /* 9 */ ; sum += ( fin[5] ) * *++cos_l0; /* 7 */ ; sum += ( fin[6] ) * *++cos_l0; /* 5 */ ; sum += ( fin[7] ) * *++cos_l0; /* 3 */ ; sum += ( fin[8] ) * *++cos_l0; /* 1 */ ; sum += ( fin[9] ) * *++cos_l0; /* 19*/ ; sum += ( fin[10] ) * *++cos_l0; /* 21 */ ; sum += ( fin[11] ) * *++cos_l0; /* 23 */ ; sum += ( fin[12] ) * *++cos_l0; /*25 */ ; sum += ( fin[13] ) * *++cos_l0; /* 27 */ ; sum += ( fin[14] ) * *++cos_l0; /* 29 */ ; sum += ( fin[15] ) * *++cos_l0; /* 31*/ ; sum += ( fin[16] ) * *++cos_l0; /* 33 */ ; sum += ( fin[17] ) * *++cos_l0; /* 35 */ ; out[0]=sum; ; ; /* 2 */ ; cos_l0= &cos_l[2][0]; ; sum = ( fin[0] ) * *cos_l0; /* mfc 23 */ ; sum += ( fin[1] ) * *++cos_l0; /* mfc 33 */ ; sum += ( fin[2] ) * *++cos_l0; /* mfc 29 */ ; sum += ( fin[3] ) * *++cos_l0; /* mfc 19 */ ; sum += ( fin[4] ) * *++cos_l0; /* mfc 9 */ ; sum += ( fin[5] ) * *++cos_l0; /* mfc 1 */ ; sum += ( fin[6] ) * *++cos_l0; /* mfc 11 */ ; sum += ( fin[7] ) * *++cos_l0; /* mfc 21 */ ; sum += ( fin[8] ) * *++cos_l0; /* mfc 31 */ ; sum += ( fin[9] ) * *++cos_l0; /* mfc 13 */ ; sum += ( fin[10] ) * *++cos_l0; /* mfc 3 */ ; sum += ( fin[11] ) * *++cos_l0; /* mfc 7 */ ; sum += ( fin[12] ) * *++cos_l0; /* mfc 17 */ ; sum += ( fin[13] ) * *++cos_l0; /* mfc 27 */ ; sum += ( fin[14] ) * *++cos_l0; /* mfc 35 */ ; sum += ( fin[15] ) * *++cos_l0; /* mfc 25 */ ; sum += ( fin[16] ) * *++cos_l0; /* mfc 15 */ ; sum += ( fin[17] ) * *++cos_l0; /* mfc 5 */ ; out[2]=sum; ; ; /* 3 */; ; sum = ( fin[0] ) * *++cos_l0; /* mfc 11 */ ; sum += ( fin[1] ) * *++cos_l0; /* mfc 3 */ ; sum += ( fin[2] ) * *++cos_l0; /* 17 */ ; sum += ( fin[3] ) * *++cos_l0; /* 31 */ ; sum += ( fin[4] ) * *++cos_l0; /* 27 */ ; sum += ( fin[5] ) * *++cos_l0; /* 13 */ ; sum += ( fin[6] ) * *++cos_l0; /* 1 */ ; sum += ( fin[7] ) * *++cos_l0; /* 15 */ ; sum += ( fin[8] ) * *++cos_l0; /* 29 */ ; sum += ( fin[9] ) * *++cos_l0; /* 25 */ ; sum += ( fin[10] ) * *++cos_l0; /* 33 */ ; sum += ( fin[11] ) * *++cos_l0; /* 19 */ ; sum += ( fin[12] ) * *++cos_l0; /* 5 */ ; sum += ( fin[13] ) * *++cos_l0; /* 9 */ ; sum += ( fin[14] ) * *++cos_l0; /* 23 */ ; sum += ( fin[15] ) * *++cos_l0; /* 35 */ ; sum += ( fin[16] ) * *++cos_l0; /* 21 */ ; sum += ( fin[17] ) * *++cos_l0; /* 7 */ ; out[3]=sum; ; ; /* 5 */ ; cos_l0= &cos_l[5][0]; ; sum = ( fin[0] ) * *cos_l0; /* 7 */ ; sum += ( fin[1] ) * *++cos_l0; /* 15 */ ; sum += ( fin[2] ) * *++cos_l0; /* 35 */ ; sum += ( fin[3] ) * *++cos_l0; /* 13 */ ; sum += ( fin[4] ) * *++cos_l0; /* 9 */ ; sum += ( fin[5] ) * *++cos_l0; /* 31 */ ; sum += ( fin[6] ) * *++cos_l0; /* 19 */ ; sum += ( fin[7] ) * *++cos_l0; /* 3 */ ; sum += ( fin[8] ) * *++cos_l0; /* 8 */ ; sum += ( fin[9] ) * *++cos_l0; /* 29 */ ; sum += ( fin[10] ) * *++cos_l0; /* 21 */ ; sum += ( fin[11] ) * *++cos_l0; /* 1 */ ; sum += ( fin[12] ) * *++cos_l0; /* 23 */ ; sum += ( fin[13] ) * *++cos_l0; /* 27 */ ; sum += ( fin[14] ) * *++cos_l0; /* 5 */ ; sum += ( fin[15] ) * *++cos_l0; /* 17 */ ; sum += ( fin[16] ) * *++cos_l0; /* 33 */ ; sum += ( fin[17] ) * *++cos_l0; /* 11 */ ; out[5]=sum; %macro sum 1 pmov mm3, [r1+fsizen(0)] pmov mm0, [r0+fsizen(0-32)] pmov mm1, [r0+fsizen(0-32+36)] pmov mm2, [r3+fsizen(0-32)] pfmul mm0, mm3 pfmul mm1, mm3 pfmul mm2, mm3 pfmul mm3, [r3+fsizen(0-32+36)] pmov mm7, [r1+fsizen(2)] pmov mm4, [r0+fsizen(2-32)] pmov mm5, [r0+fsizen(2-32+36)] pmov mm6, [r3+fsizen(2-32)] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [r3+fsizen(2-32+36)] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pmov mm7, [r1+fsizen(4)] pmov mm4, [r0+fsizen(4-32)] pmov mm5, [r0+fsizen(4-32+36)] pmov mm6, [r3+fsizen(4-32)] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [r3+fsizen(4-32+36)] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pmov mm7, [r1+fsizen(6)] pmov mm4, [r0+fsizen(6-32)] pmov mm5, [r0+fsizen(6-32+36)] pmov mm6, [r3+fsizen(6-32)] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [r3+fsizen(6-32+36)] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pmov mm7, [r1+fsizen(8)] pmov mm4, [r0+fsizen(8-32)] pmov mm5, [r0+fsizen(8-32+36)] pmov mm6, [r3+fsizen(8-32)] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [r3+fsizen(8-32+36)] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pmov mm7, [r1+fsizen(10)] pmov mm4, [r0+fsizen(10-32)] pmov mm5, [r0+fsizen(10-32+36)] pmov mm6, [r3+fsizen(10-32)] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [r3+fsizen(10-32+36)] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pmov mm7, [r1+fsizen(12)] pmov mm4, [r0+fsizen(12-32)] pmov mm5, [r0+fsizen(12-32+36)] pmov mm6, [r3+fsizen(12-32)] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [r3+fsizen(12-32+36)] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pmov mm7, [r1+fsizen(14)] pmov mm4, [r0+fsizen(14-32)] pmov mm5, [r0+fsizen(14-32+36)] pmov mm6, [r3+fsizen(14-32)] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [r3+fsizen(14-32+36)] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pmov mm7, [r1+fsizen(16)] pmov mm4, [r0+fsizen(16-32)] pmov mm5, [r0+fsizen(16-32+36)] pmov mm6, [r3+fsizen(16-32)] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [r3+fsizen(16-32+36)] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pfacc mm0, mm0 pfacc mm1, mm2 pfacc mm3, mm3 pmovd [r2+fsizen(%1 +0)], mm0 pmov [r2+fsizen(%1 +2)], mm1 pmovd [r2+fsizen(%1 +5)], mm3 %endmacro ;r1 = &fin[0] mov r2, [sp(%$out)] ;&out[0] mov r0, cos_l_mdct+fsizen(32) ;&cos_l[0][32] mov r3, cos_l_mdct+fsizen(18*3+32) ;&cos_l[3][32] sum 0 ; /* 6 */ ; sum = ( fin[0] ) * *++cos_l0; /* 31 */ ; sum += ( fin[1] ) * *++cos_l0; /* 15 */ ; sum += ( fin[2] ) * *++cos_l0; /* 11 */ ; sum += ( fin[3] ) * *++cos_l0; /* 35 */ ; sum += ( fin[4] ) * *++cos_l0; /* 9 */ ; sum += ( fin[5] ) * *++cos_l0; /* 17 */ ; sum += ( fin[6] ) * *++cos_l0; /* 29 */ ; sum += ( fin[7] ) * *++cos_l0; /* 3 */ ; sum += ( fin[8] ) * *++cos_l0; /* 23 */ ; sum += ( fin[9] ) * *++cos_l0; /* 5 */ ; sum += ( fin[10] ) * *++cos_l0; /* 21 */ ; sum += ( fin[11] ) * *++cos_l0; /* 25 */ ; sum += ( fin[12] ) * *++cos_l0; /* 1 */ ; sum += ( fin[13] ) * *++cos_l0; /* 27 */ ; sum += ( fin[14] ) * *++cos_l0; /* 19 */ ; sum += ( fin[15] ) * *++cos_l0; /* 7 */ ; sum += ( fin[16] ) * *++cos_l0; /* 33 */ ; sum += ( fin[17] ) * *++cos_l0; /* 13 */ ; out[6]=sum; ; ; /* 8 */ ; cos_l0= &cos_l[8][0]; ; sum = ( fin[0] ) * *cos_l0; /* 35 */ ; sum += ( fin[1] ) * *++cos_l0; /* 3 */ ; sum += ( fin[2] ) * *++cos_l0; /* 31 */ ; sum += ( fin[3] ) * *++cos_l0; /* 7 */ ; sum += ( fin[4] ) * *++cos_l0; /* 27*/ ; sum += ( fin[5] ) * *++cos_l0; /* 11 */ ; sum += ( fin[6] ) * *++cos_l0; /* 23 */ ; sum += ( fin[7] ) * *++cos_l0; /* 15*/ ; sum += ( fin[8] ) * *++cos_l0; /* 19 */ ; sum += ( fin[9] ) * *++cos_l0; /* 1 */ ; sum += ( fin[10] ) * *++cos_l0; /* 33 */ ; sum += ( fin[11] ) * *++cos_l0; /* 5 */ ; sum += ( fin[12] ) * *++cos_l0; /* 29*/ ; sum += ( fin[13] ) * *++cos_l0; /* 9 */ ; sum += ( fin[14] ) * *++cos_l0; /* 25 */ ; sum += ( fin[15] ) * *++cos_l0; /* 13*/ ; sum += ( fin[16] ) * *++cos_l0; /* 21 */ ; sum += ( fin[17] ) * *++cos_l0; /* 17 */ ; out[8]=sum; ; ; /* 9 */ ; sum = ( fin[0] ) * *++cos_l0; /* 1 */ ; sum += ( fin[1] ) * *++cos_l0; /* 33 */ ; sum += ( fin[2] ) * *++cos_l0; /* 5 */ ; sum += ( fin[3] ) * *++cos_l0; /* 29*/ ; sum += ( fin[4] ) * *++cos_l0; /* 9 */ ; sum += ( fin[5] ) * *++cos_l0; /* 25 */ ; sum += ( fin[6] ) * *++cos_l0; /* 13 */ ; sum += ( fin[7] ) * *++cos_l0; /* 21*/ ; sum += ( fin[8] ) * *++cos_l0; /* 17 */ ; sum += ( fin[9] ) * *++cos_l0; /* 35*/ ; sum += ( fin[10] ) * *++cos_l0; /* 3 */ ; sum += ( fin[11] ) * *++cos_l0; /* 31 */ ; sum += ( fin[12] ) * *++cos_l0; /* 7 */ ; sum += ( fin[13] ) * *++cos_l0; /* 27 */ ; sum += ( fin[14] ) * *++cos_l0; /* 11 */ ; sum += ( fin[15] ) * *++cos_l0; /* 23*/ ; sum += ( fin[16] ) * *++cos_l0; /* 15 */ ; sum += ( fin[17] ) * *++cos_l0; /* 19 */ ; out[9]=sum; ; ; /* 11 */ ; cos_l0= &cos_l[11][0]; ; sum = ( fin[0] ) * *cos_l0; /* 5 */ ; sum += ( fin[1] ) * *++cos_l0; /* 21 */ ; sum += ( fin[2] ) * *++cos_l0; /* 25 */ ; sum += ( fin[3] ) * *++cos_l0; /* 1 */ ; sum += ( fin[4] ) * *++cos_l0; /*27 */ ; sum += ( fin[5] ) * *++cos_l0; /* 19 */ ; sum += ( fin[6] ) * *++cos_l0; /* 7 */ ; sum += ( fin[7] ) * *++cos_l0; /* 33*/ ; sum += ( fin[8] ) * *++cos_l0; /* 13 */ ; sum += ( fin[9] ) * *++cos_l0; /* 31*/ ; sum += ( fin[10] ) * *++cos_l0; /* 15 */ ; sum += ( fin[11] ) * *++cos_l0; /* 11 */ ; sum += ( fin[12] ) * *++cos_l0; /*35 */ ; sum += ( fin[13] ) * *++cos_l0; /* 9 */ ; sum += ( fin[14] ) * *++cos_l0; /* 17 */ ; sum += ( fin[15] ) * *++cos_l0; /* 29*/ ; sum += ( fin[16] ) * *++cos_l0; /* 3 */ ; sum += ( fin[17] ) * *++cos_l0; /* 23 */ ; out[11]=sum; mov r0, cos_l_mdct+fsizen(18*6+32) ;&cos_l[6][32] mov r3, cos_l_mdct+fsizen(18*9+32) ;&cos_l[9][32] sum 6 ; /* 12 */ ; sum = ( fin[0] ) * *++cos_l0; /* 29 */ ; sum += ( fin[1] ) * *++cos_l0; /* 21 */ ; sum += ( fin[2] ) * *++cos_l0; /* 1 */ ; sum += ( fin[3] ) * *++cos_l0; /* 23 */ ; sum += ( fin[4] ) * *++cos_l0; /*27 */ ; sum += ( fin[5] ) * *++cos_l0; /* 5 */ ; sum += ( fin[6] ) * *++cos_l0; /* 17 */ ; sum += ( fin[7] ) * *++cos_l0; /* 33*/ ; sum += ( fin[8] ) * *++cos_l0; /* 11 */ ; sum += ( fin[9] ) * *++cos_l0; /* 7 */ ; sum += ( fin[10] ) * *++cos_l0; /* 15 */ ; sum += ( fin[11] ) * *++cos_l0; /* 35 */ ; sum += ( fin[12] ) * *++cos_l0; /*13 */ ; sum += ( fin[13] ) * *++cos_l0; /* 9 */ ; sum += ( fin[14] ) * *++cos_l0; /* 31 */ ; sum += ( fin[15] ) * *++cos_l0; /* 19*/ ; sum += ( fin[16] ) * *++cos_l0; /* 3 */ ; sum += ( fin[17] ) * *++cos_l0; /* 25 */ ; out[12]=sum; ; ; /* 14 */ ; cos_l0= &cos_l[14][0]; ; sum = ( fin[0] ) * *cos_l0; /* 25 */ ; sum += ( fin[1] ) * *++cos_l0; /* 33 */ ; sum += ( fin[2] ) * *++cos_l0; /* 19 */ ; sum += ( fin[3] ) * *++cos_l0; /* 5 */ ; sum += ( fin[4] ) * *++cos_l0; /* 9 */ ; sum += ( fin[5] ) * *++cos_l0; /* 23 */ ; sum += ( fin[6] ) * *++cos_l0; /* 35 */ ; sum += ( fin[7] ) * *++cos_l0; /* 21*/ ; sum += ( fin[8] ) * *++cos_l0; /* 7 */ ; sum += ( fin[9] ) * *++cos_l0; /* 11*/ ; sum += ( fin[10] ) * *++cos_l0; /* 3 */ ; sum += ( fin[11] ) * *++cos_l0; /* 17 */ ; sum += ( fin[12] ) * *++cos_l0; /*31 */ ; sum += ( fin[13] ) * *++cos_l0; /* 27 */ ; sum += ( fin[14] ) * *++cos_l0; /* 13 */ ; sum += ( fin[15] ) * *++cos_l0; /* 1 */ ; sum += ( fin[16] ) * *++cos_l0; /* 15 */ ; sum += ( fin[17] ) * *++cos_l0; /* 29 */ ; out[14]=sum; ; ; /* 15 */ ; sum = ( fin[0] ) * *++cos_l0; /* 13 */ ; sum += ( fin[1] ) * *++cos_l0; /* 3 */ ; sum += ( fin[2] ) * *++cos_l0; /* 7 */ ; sum += ( fin[3] ) * *++cos_l0; /* 17 */ ; sum += ( fin[4] ) * *++cos_l0; /* 27*/ ; sum += ( fin[5] ) * *++cos_l0; /* 35 */ ; sum += ( fin[6] ) * *++cos_l0; /* 25 */ ; sum += ( fin[7] ) * *++cos_l0; /* 15*/ ; sum += ( fin[8] ) * *++cos_l0; /* 5 */ ; sum += ( fin[9] ) * *++cos_l0; /* 23*/ ; sum += ( fin[10] ) * *++cos_l0; /* 33 */ ; sum += ( fin[11] ) * *++cos_l0; /* 29 */ ; sum += ( fin[12] ) * *++cos_l0; /*19 */ ; sum += ( fin[13] ) * *++cos_l0; /* 9 */ ; sum += ( fin[14] ) * *++cos_l0; /* 1 */ ; sum += ( fin[15] ) * *++cos_l0; /* 11*/ ; sum += ( fin[16] ) * *++cos_l0; /* 21 */ ; sum += ( fin[17] ) * *++cos_l0; /* 31 */ ; out[15]=sum; ; ; /* 17 */ ; cos_l0= &cos_l[17][0]; ; sum = ( fin[0] ) * *cos_l0; /* 17 */ ; sum += ( fin[1] ) * *++cos_l0; /* 15 */ ; sum += ( fin[2] ) * *++cos_l0; /* 13 */ ; sum += ( fin[3] ) * *++cos_l0; /* 11 */ ; sum += ( fin[4] ) * *++cos_l0; /* 9 */ ; sum += ( fin[5] ) * *++cos_l0; /* 7 */ ; sum += ( fin[6] ) * *++cos_l0; /* 5 */ ; sum += ( fin[7] ) * *++cos_l0; /* 3 */ ; sum += ( fin[8] ) * *++cos_l0; /* 1 */ ; sum += ( fin[9] ) * *++cos_l0; /* 19*/ ; sum += ( fin[10] ) * *++cos_l0; /* 21 */ ; sum += ( fin[11] ) * *++cos_l0; /* 23 */ ; sum += ( fin[12] ) * *++cos_l0; /*25 */ ; sum += ( fin[13] ) * *++cos_l0; /* 27 */ ; sum += ( fin[14] ) * *++cos_l0; /* 29 */ ; sum += ( fin[15] ) * *++cos_l0; /* 31*/ ; sum += ( fin[16] ) * *++cos_l0; /* 33 */ ; sum += ( fin[17] ) * *++cos_l0; /* 35 */ ; out[17]=sum; ; } mov r0, cos_l_mdct+fsizen(18*12+32) ;&cos_l[12][32] mov r3, cos_l_mdct+fsizen(18*15+32) ;&cos_l[15][32] sum 12 ; /* 1 */ ; sum = ( fin[0]+fin[5]+fin[15] ) * *++cos_l0; /* mfc=15 0*/ ; sum += ( fin[1]+fin[4]+fin[16] ) * *++cos_l0; /* mfc=9 1*/ ; sum += ( fin[2]+fin[3]+fin[17] ) * *++cos_l0; /* mfc=3 2*/ ; sum += ( fin[6]-fin[9]+fin[14] ) * *(cos_l0+=4); /* mfc=21 6*/ ; sum += ( fin[7]-fin[10]+fin[13] ) * *++cos_l0; /* mfc=27 7*/ ; sum += ( fin[8]-fin[11]+fin[12] ) * *++cos_l0; /* mfc = 28 8*/ ; out[1]=sum; mov r0, cos_l_mdct+fsizen(18*1+32) ;&cos_l[1][32] pmov mm0, [r1+fsizen(4)] pmov mm1, [r1+fsizen(13)] pmov mm2, [r1+fsizen(0)] pmov mm3, [r1+fsizen(15)] pmov mm4, [r1+fsizen(6)] pmov mm5, [r1+fsizen(9)] pupldq mm6, mm0 pupldq mm7, mm1 pfadd mm2, mm3 pfsub mm4, mm5 puphdq mm0, mm6 puphdq mm1, mm7 pfadd mm0, mm2 ;fin[1]+fin[4]+fin[16] | fin[0]+fin[5]+fin[15] pfadd mm1, mm4 ;fin[7]-fin[10]+fin[13] | fin[6]-fin[9]+fin[14] pmov mm2, [r1+fsizen(2)] pmov mm3, [r1+fsizen(8)] pmov mm4, [r1+fsizen(11)] pmov mm5, [r1+fsizen(17)] pmov mm6, [r1+fsizen(12)] pfacc mm2, mm2 pfsub mm3, mm4 pfadd mm2, mm5 ;fin[2]+fin[3]+fin[17] pfadd mm3, mm6 ;fin[8]-fin[11]+fin[12] %macro sum2 1 pmov mm4, [r0+fsizen(0-32)] pmov mm5, [r0+fsizen(6-32)] pmov mm6, [r0+fsizen(2-32)] pmov mm7, [r0+fsizen(8-32)] pfmul mm4, mm0 pfmul mm5, mm1 pfmul mm6, mm2 pfmul mm7, mm3 pfadd mm4, mm5 pfadd mm6, mm7 pfacc mm4, mm4 pfadd mm4, mm6 pmovd [r2+fsizen(%1)], mm4 %endmacro sum2 1 ; /* 7 */ ; sum = ( fin[0]+fin[5]+fin[15] ) * *++cos_l0; /* 3 */ ; sum += ( fin[1]+fin[4]+fin[16] ) * *++cos_l0; /* 27*/ ; sum += ( fin[2]+fin[3]+fin[17] ) * *++cos_l0; /* 15 */ ; sum += ( fin[6]-fin[9]+fin[14] ) * *(cos_l0+=4); /* 33 */ ; sum += ( fin[7]-fin[10]+fin[13] ) * *++cos_l0; /* 9 */ ; sum += ( fin[8]-fin[11]+fin[12] ) * *++cos_l0; /* 21 */ ; out[7]=sum; mov r0, cos_l_mdct+fsizen(18*7+32) ;&cos_l[7][32] sum2 7 ; /* 10 */ ; sum = ( fin[0]+fin[5]+fin[15] ) * *++cos_l0; /* 33 */ ; sum += ( fin[1]+fin[4]+fin[16] ) * *++cos_l0; /* 9 */ ; sum += ( fin[2]+fin[3]+fin[17] ) * *++cos_l0; /* 21 */ ; sum += ( fin[6]-fin[9]+fin[14] ) * *(cos_l0+=4); /* 3 */ ; sum += ( fin[7]-fin[10]+fin[13] ) * *++cos_l0; /* 27 */ ; sum += ( fin[8]-fin[11]+fin[12] ) * *++cos_l0; /* 15 */ ; out[10]=sum; mov r0, cos_l_mdct+fsizen(18*10+32) ;&cos_l[10][32] sum2 10 ; /* 16 */ ; sum = ( fin[0]+fin[5]+fin[15] ) * *++cos_l0; /* 21 */ ; sum += ( fin[1]+fin[4]+fin[16] ) * *++cos_l0; /* 27 */ ; sum += ( fin[2]+fin[3]+fin[17] ) * *++cos_l0; /* 33 */ ; sum += ( fin[6]-fin[9]+fin[14] ) * *(cos_l0+=4); /* 15 */ ; sum += ( fin[7]-fin[10]+fin[13] ) * *++cos_l0; /* 9 */ ; sum += ( fin[8]-fin[11]+fin[12] ) * *++cos_l0; /* 3 */ ; out[16]=sum; mov r0, cos_l_mdct+fsizen(18*16+32) ;&cos_l[16][32] sum2 16 ; /* 4 */ ; /* mfc 27 */ ; sum = ( (fin[0]+fin[5]+fin[15])-(fin[1]+fin[4]+fin[16])+(fin[8]-fin[11]+fin[12]) ) * *++cos_l0; ; /* mfc 9 */ ; sum -= ( (fin[2]+fin[3]+fin[17])-(fin[6]-fin[9]+fin[14])-(fin[7]-fin[10]+fin[13]) ) * cos_l[4][6]; ; out[4]=sum; ; ; /* 13 */ ; sum = ( fin[0]-fin[1]-fin[4]+fin[5]+fin[8]-fin[11]+fin[12]+fin[15]-fin[16] ) * *++cos_l0; /* 9 */ ; sum += ( fin[2]+fin[3]-fin[6]-fin[7]+fin[9]+fin[10]-fin[13]-fin[14]+fin[17] ) * cos_l[13][2]; /* 27 */ ; out[13]=sum; mov r0, cos_l_mdct+fsizen(18*4+32) ;&cos_l[4][32] mov r3, cos_l_mdct+fsizen(18*13+32) ;&cos_l[13][32] pxor mm0, [D_MSB1_0] pfacc mm1, mm1 pfacc mm0, mm0 pfsubr mm1, mm2 ;(fin[2]+fin[3]+fin[17])-((fin[6]-fin[9]+fin[14])+(fin[7]-fin[10]+fin[13])) pfadd mm0, mm3 ;((fin[0]+fin[5]+fin[15])-(fin[1]+fin[4]+fin[16]))+(fin[8]-fin[11]+fin[12]) pmov mm2, [r0+fsizen(0-32)] pmov mm3, [r0+fsizen(6-32)] pmov mm4, [r3+fsizen(0-32)] pmov mm5, [r3+fsizen(2-32)] pfmul mm2, mm0 pfmul mm3, mm1 pfmul mm4, mm0 pfmul mm5, mm1 pfsub mm2, mm3 pfadd mm4, mm5 pmovd [r2+fsizen(4)], mm2 pmovd [r2+fsizen(13)], mm4 mdct_3DN_exit: femms popd ebp, ebx, esi, edi endproc %else ;-------------------------------------------------------------- ; もはや用なしだけど置かせてね(^^; ; mdct最適化ルーチン ; 99/05/13 1040clk(3D Now!を使わない時より2.3倍高速化) ; 99/05/23 若干の最適化(nopは有効なようだ) ; 99/08/22 若干うるりさんの方が速いので交換 %ifndef WIN32 global mdct_sub_3DN %else global _mdct_sub_3DN %define win0_3DN _win0_3DN %define win1_3DN _win1_3DN %define win3_3DN _win3_3DN %endif global win0_3DN,win1_3DN,win3_3DN N equ 36 ;N=36を固定したコードになっている 要注意 %define F_PTR dword F_SIZE equ 4 segment_data win0_3DN resd 18*N win1_3DN resd 18*N win3_3DN resd 18*N segment_code ;void mdct_sub_3DN(float *in, float *out,float *table); align 16 mdct_sub_3DN: _mdct_sub_3DN: push ebx %assign _P 4*1 mov eax,[esp+_P+4] ;eax=in femms add eax,72 movq mm3,[eax-72] ;使わなもったいないね movq mm4,[eax-64] movq mm5,[eax-56] mov ebx,[esp+_P+8] ;ebx=out movq mm6,[eax-48] movq mm7,[eax-40] mov edx,[esp+_P+12] mov ecx,N/2 ;ecx=N/2 add edx,72 ;半分ずらしてるので注意(72=N/2*F_SIZE) ;コードサイズ縮小のため .3DNlp: movq mm0,mm3 ;mv0 pfmul mm0,[edx-72] ; ml0 movq mm1,mm4 ;mv1 movq mm2,[edx-56] ;mv2 nop pfmul mm1,[edx-64] ; ml1 pfadd mm0,mm1 ; ad1 pfmul mm2,mm5;[eax-56] ; ml2 movq mm1,mm6 ;mv3 pfadd mm0,mm2 ; ad2 pfmul mm1,[edx-48] ; ml3 movq mm2,mm7 ;mv4 pfadd mm0,mm1 ; ad3 pfmul mm2,[edx-40] ; ml4 movq mm1,[edx-32] ;mv5 pfadd mm0,mm2 ; ad4 pfmul mm1,[eax-32] ; ml5 movq mm2,[edx-24] ;mv6 pfadd mm0,mm1 ; ad5 pfmul mm2,[eax-24] ; ml6 nop movq mm1,[edx-16] ;mv7 pfadd mm0,mm2 ; ad6 pfmul mm1,[eax-16] ; ml7 movq mm2,[edx-8] ;mv8 pfadd mm0,mm1 ; ad7 pfmul mm2,[eax-8] ; ml8 movq mm1,[edx] ;mv9 pfadd mm0,mm2 ; ad8 pfmul mm1,[eax] ; ml9 movq mm2,[edx+8] ;mv10 pfadd mm0,mm1 ; ad9 pfmul mm2,[eax+8] ; ml10 movq mm1,[edx+16] ;mv11 pfadd mm0,mm2 ; ad10 pfmul mm1,[eax+16] ; ml11 nop movq mm2,[edx+24] ;mv12 pfadd mm0,mm1 ; ad11 pfmul mm2,[eax+24] ; ml12 movq mm1,[edx+32] ;mv13 pfadd mm0,mm2 ; ad12 pfmul mm1,[eax+32] ; ml13 movq mm2,[edx+40] ;mv14 pfadd mm0,mm1 ; ad13 pfmul mm2,[eax+40] ; ml14 movq mm1,[edx+48] ;mv15 pfadd mm0,mm2 ; ad14 nop pfmul mm1,[eax+48] ; ml15 movq mm2,[edx+56] ;mv16 pfadd mm0,mm1 ; ad15 pfmul mm2,[eax+56] ; ml16 movq mm1,[edx+64] ;mv17 pfadd mm0,mm2 ; ad16 pfmul mm1,[eax+64] ; ml17 add edx,N*F_SIZE pfadd mm0,mm1 ; ad17 pfacc mm0,mm0 movd [ebx],mm0 ;out add ebx,4 dec ecx jnz near .3DNlp pop ebx femms ret end %endif ;-------------------------------------------------------------- %ifdef USE_E3DN ;void mdct_E3DN( float *in, float *out, int block_type ); proc mdct_E3DN %$in arg 4 %$out arg 4 %$type arg 4 %$fin local fsizen(18) alloc femms pushd ebp, ebx, esi, edi mdct_E3DN_type2: mov r0, [sp(%$type)] cmp r0, 2 jne near mdct_E3DN_type013 .for_init: mov r0, [sp(%$in)] add r0, fsizen(6) ;&in[6] mov r1, 3 mov r3, cos_s_mdct ;&cos_s[0] mov r5, [sp(%$out)] ;&out[0] .for: .for2_init: mov r4, 6 .for2: pmov mm0, [r0+fsizen(0)] pfmul mm0, [r3+fsizen(0)] pmov mm1, [r0+fsizen(2)] pfmul mm1, [r3+fsizen(2)] pmov mm2, [r0+fsizen(4)] pfmul mm2, [r3+fsizen(4)] pfadd mm0, mm1 pmov mm3, [r0+fsizen(6)] pfmul mm3, [r3+fsizen(6)] pfadd mm0, mm2 pmov mm4, [r0+fsizen(8)] pfmul mm4, [r3+fsizen(8)] pfadd mm0, mm3 pmov mm5, [r0+fsizen(10)] pfmul mm5, [r3+fsizen(10)] pfadd mm0, mm4 pfadd mm0, mm5 pfacc mm0, mm0 pmovd [r5], mm0 .for2_next: add r3, fsizen(12) add r5, fsizen(3) dec r4 jnz .for2 .for_next: add r0, fsizen(6) add r3, 0 -fsizen(12)*6 add r5, fsize -fsizen(3)*6 dec r1 jnz near .for nop jmp mdct_E3DN_exit mdct_E3DN_type013: imul r0, fsizen(36) add r0, win_mdct+fsizen(32) ;&win[block_type][32] lea r1, [sp(%$fin)] ;&fin[0] mov r2, [sp(%$in)] add r2, fsizen(32) ;&in[32] ;0 ;1 ;2 ;3 pmov mm0, [r0+fsizen(16-32)] pfmul mm0, [r2+fsizen(16-32)] pmov mm1, [r0+fsizen(14-32)] pfmul mm1, [r2+fsizen(14-32)] pswapd mm0, mm0 pmov mm2, [r0+fsizen(0-32)] pfmul mm2, [r2+fsizen(0-32)] pswapd mm1, mm1 pmov mm3, [r0+fsizen(2-32)] pfmul mm3, [r2+fsizen(2-32)] pfsub mm2, mm0 pfsub mm3, mm1 pmov [r1+fsizen(0)], mm2 pmov [r1+fsizen(2)], mm3 ;4 ;5 ;6 ;7 ;8 pmov mm0, [r0+fsizen(12-32)] pfmul mm0, [r2+fsizen(12-32)] pmov mm1, [r0+fsizen(10-32)] pfmul mm1, [r2+fsizen(10-32)] pswapd mm0, mm0 pmov mm2, [r0+fsizen(4-32)] pfmul mm2, [r2+fsizen(4-32)] pswapd mm1, mm1 pmov mm3, [r0+fsizen(6-32)] pfmul mm3, [r2+fsizen(6-32)] pmov mm4, [r0+fsizen(8-32)] pfmul mm4, [r2+fsizen(8-32)] pfsub mm2, mm0 pfsub mm3, mm1 pfnacc mm4, mm4 pmov [r1+fsizen(4)], mm2 pmov [r1+fsizen(6)], mm3 pmovd [r1+fsizen(8)], mm4 ;9 ;10 ;11 ;12 pmov mm0, [r0+fsizen(34-32)] pfmul mm0, [r2+fsizen(34-32)] pmov mm1, [r0+fsizen(32-32)] pfmul mm1, [r2+fsizen(32-32)] pswapd mm0, mm0 pmov mm2, [r0+fsizen(18-32)] pfmul mm2, [r2+fsizen(18-32)] pswapd mm1, mm1 pmov mm3, [r0+fsizen(20-32)] pfmul mm3, [r2+fsizen(20-32)] pfadd mm2, mm0 pfadd mm3, mm1 pmov [r1+fsizen(9)], mm2 pmov [r1+fsizen(11)], mm3 ;13 ;14 ;15 ;16 ;17 pmov mm0, [r0+fsizen(30-32)] pfmul mm0, [r2+fsizen(30-32)] pmov mm1, [r0+fsizen(28-32)] pfmul mm1, [r2+fsizen(28-32)] pswapd mm0, mm0 pmov mm2, [r0+fsizen(22-32)] pfmul mm2, [r2+fsizen(22-32)] pswapd mm1, mm1 pmov mm3, [r0+fsizen(24-32)] pfmul mm3, [r2+fsizen(24-32)] pmov mm4, [r0+fsizen(26-32)] pfmul mm4, [r2+fsizen(26-32)] pfadd mm2, mm0 pfadd mm3, mm1 pfacc mm4, mm4 pmov [r1+fsizen(13)], mm2 pmov [r1+fsizen(15)], mm3 pmovd [r1+fsizen(17)], mm4 ;r1 = &fin[0] mov r2, [sp(%$out)] ;&out[0] mov r0, cos_l_mdct+fsizen(32) ;&cos_l[0][32] mov r3, cos_l_mdct+fsizen(18*3+32) ;&cos_l[3][32] sum 0 mov r0, cos_l_mdct+fsizen(18*6+32) ;&cos_l[6][32] mov r3, cos_l_mdct+fsizen(18*9+32) ;&cos_l[9][32] sum 6 mov r0, cos_l_mdct+fsizen(18*12+32) ;&cos_l[12][32] mov r3, cos_l_mdct+fsizen(18*15+32) ;&cos_l[15][32] sum 12 mov r0, cos_l_mdct+fsizen(18*1+32) ;&cos_l[1][32] pmov mm0, [r1+fsizen(4)] pmov mm1, [r1+fsizen(13)] pmov mm2, [r1+fsizen(0)] pmov mm3, [r1+fsizen(15)] pmov mm4, [r1+fsizen(6)] pmov mm5, [r1+fsizen(9)] pswapd mm0, mm0 pswapd mm1, mm1 pfadd mm2, mm3 pfsub mm4, mm5 pfadd mm0, mm2 pfadd mm1, mm4 pmov mm2, [r1+fsizen(2)] pmov mm3, [r1+fsizen(8)] pmov mm4, [r1+fsizen(11)] pmov mm5, [r1+fsizen(17)] pmov mm6, [r1+fsizen(12)] pfacc mm2, mm2 pfsub mm3, mm4 pfadd mm2, mm5 pfadd mm3, mm6 sum2 1 mov r0, cos_l_mdct+fsizen(18*7+32) ;&cos_l[7][32] sum2 7 mov r0, cos_l_mdct+fsizen(18*10+32) ;&cos_l[10][32] sum2 10 mov r0, cos_l_mdct+fsizen(18*16+32) ;&cos_l[16][32] sum2 16 mov r0, cos_l_mdct+fsizen(18*4+32) ;&cos_l[4][32] mov r3, cos_l_mdct+fsizen(18*13+32) ;&cos_l[13][32] pfacc mm1, mm1 pfnacc mm0, mm0 pfsubr mm1, mm2 pfadd mm0, mm3 pmov mm2, [r0+fsizen(0-32)] pmov mm3, [r0+fsizen(6-32)] pmov mm4, [r3+fsizen(0-32)] pmov mm5, [r3+fsizen(2-32)] pfmul mm2, mm0 pfmul mm3, mm1 pfmul mm4, mm0 pfmul mm5, mm1 pfsub mm2, mm3 pfadd mm4, mm5 pmovd [r2+fsizen(4)], mm2 pmovd [r2+fsizen(13)], mm4 mdct_E3DN_exit: femms popd ebp, ebx, esi, edi endproc %endif ;*********************************************************************** %if 0 ; 99/10/03 shigeo ; 2100clk ; 99/10/17 不要になってしまった(T_T) ;void arb_3DN(float (*enc)[18]) ;for( band = 0; band < 31; band++ ){ ; e=enc[band], e'=enc[band+1], s=cs_arb, a=ca_arb ; e [17:16] <- e [17:16] * s[ 0: 1] + e'[ 0: 1] * a[ 0: 1] ; e'[ 1: 0] <- e'[ 1: 0] * s[ 1: 0] - e [16:17] * a[ 1: 0] ; e [15:14] <- e [15:14] * s[ 2: 3] + e'[ 2: 3] * a[ 2: 3] ; e'[ 3: 2] <- e'[ 3: 2] * s[ 3: 2] - e [14:15] * a[ 3: 2] ; e [13:12] <- e [13:12] * s[ 4: 5] + e'[ 4: 5] * a[ 4: 5] ; e'[ 5: 4] <- e'[ 5: 4] * s[ 5: 4] - e [12:13] * a[ 5: 4] ; e [11:10] <- e [11:10] * s[ 6: 7] + e'[ 6: 7] * a[ 6: 7] ; e'[ 7: 6] <- e'[ 7: 6] * s[ 7: 6] - e [10:11] * a[ 7: 6] ; } align 16 arb_3DN: push ebx push esi %assign _P 4*2 femms mov eax,[esp+_P+4] ;eax=e=enc[0] mov esi,18*4 xor ecx,ecx lea edx,[eax+esi] ;edx=e'=enc[1] mov ebx,csa_arb_3DN ;ebx=sa mov cl,31 jmp .lp align 16 .lp: %macro sub_arb_3DN 1 movq mm0,[eax+(16-%1*2)*4] ;mm0=e [17:16] movq mm1,[edx+ %1*2 *4] ;mm1=e'[ 1: 0] movq mm2,mm0 movq mm3,mm1 punpckldq mm4,mm2 punpckldq mm5,mm3 punpckhdq mm2,mm4 ;mm2=e [16:17] punpckhdq mm3,mm5 ;mm3=e'[ 0: 1] pfmul mm0,[ebx+(0+ %1*4)*8] ;s[0:1] pfmul mm3,[ebx+(1+ %1*4)*8] ;a[0:1] pfmul mm1,[ebx+(2+ %1*4)*8] ;s[1:0] pfmul mm2,[ebx+(3+ %1*4)*8] ;a[1:0] pfadd mm0,mm3 pfsub mm1,mm2 movq [eax+(16-%1*2)*4],mm0 movq [edx+ %1*2 *4],mm1 %endmacro sub_arb_3DN 0 sub_arb_3DN 1 sub_arb_3DN 2 sub_arb_3DN 3 add eax,esi add edx,esi dec ecx jnz near .lp .exit: femms pop esi pop ebx ret %endif ;*********************************************************************** end gogo239b/mdctfpu.nas100644 23421 144 24330 7220537347 13526 0ustar shigeousers ; optimized mdct() for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to Keiichi SAKAI ; 99/09/01 lameのmdct.cベースに書き換え %include "nasm.h" globaldef mdct_FPU externdef win_mdct externdef cos_s_mdct externdef cos_l_017_2_3 externdef cos_l_5_6_8_9 externdef cos_l11121415 externdef cos_l_1_71016 externdef cos_l_4_0 externdef cos_l_4_6 segment_data segment_code ; mdct最適化ルーチン for P55C FPU ; by K.SAKAI ; 99/09/01 850clk@PII, 1700clk@P55C ; 99/09/02 850clk@PII, 1370clk@P55C ; ;void mdct_FPU( float *in, float *out, int block_type ) align 16 mdct_FPU: xor edx,edx mov dl,[esp+12] ; block_type and dl,3 cmp dl,2 mov eax,[esp+4] ; in je near .block_type2 imul edx,4*36 add edx,win_mdct push ebx sub esp,18*4 %assign _P 18*4+4 ; for (k=0;k<9;k++){ ; fin[k] = winp[k] * in[k] - winp[17-k] * in[17-k]; ; fin[9+k] = winp[18+k] * in[18+k] + winp[35-k] * in[35-k]; ; } ; winp is edx ; fin is esp xor ecx,ecx ; k xor ebx,ebx ; -k jmp short .lp0 align 16 .lp0: fld dword [edx+ecx*4] ; = win[k] fmul dword [eax+ecx*4] ; *= in[k] fld dword [edx+17*4+ebx*4] ; = win[17-k] fmul dword [eax+17*4+ebx*4] ; *= in[17-k] fld dword [edx+18*4+ecx*4] ; = win[18+k] fmul dword [eax+18*4+ecx*4] ; *= in[18+k] fld dword [edx+35*4+ebx*4] ; = win[35-k] fmul dword [eax+35*4+ebx*4] ; *= in[35-k] faddp st1,st0 fstp dword [esp+ecx*4+9*4] fsubp st1,st0 fstp dword [esp+ecx*4] inc ecx dec ebx cmp cl,9 jl .lp0 ; m = 0, 17, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15 ; sum = ( fin[ 0] ) * cos_l[m][ 0]; /* 17 */ ; sum += ( fin[ 1] ) * cos_l[m][ 1]; /* 15 */ ; sum += ( fin[ 2] ) * cos_l[m][ 2]; /* 13 */ ; sum += ( fin[ 3] ) * cos_l[m][ 3]; /* 11 */ ; sum += ( fin[ 4] ) * cos_l[m][ 4]; /* 9 */ ; sum += ( fin[ 5] ) * cos_l[m][ 5]; /* 7 */ ; sum += ( fin[ 6] ) * cos_l[m][ 6]; /* 5 */ ; sum += ( fin[ 7] ) * cos_l[m][ 7]; /* 3 */ ; sum += ( fin[ 8] ) * cos_l[m][ 8]; /* 1 */ ; sum += ( fin[ 9] ) * cos_l[m][ 9]; /* 19*/ ; sum += ( fin[10] ) * cos_l[m][10]; /* 21 */ ; sum += ( fin[11] ) * cos_l[m][11]; /* 23 */ ; sum += ( fin[12] ) * cos_l[m][12]; /* 25 */ ; sum += ( fin[13] ) * cos_l[m][13]; /* 27 */ ; sum += ( fin[14] ) * cos_l[m][14]; /* 29 */ ; sum += ( fin[15] ) * cos_l[m][15]; /* 31*/ ; sum += ( fin[16] ) * cos_l[m][16]; /* 33 */ ; sum += ( fin[17] ) * cos_l[m][17]; /* 35 */ ; out[m]=sum; mov ebx,[esp+_P+8] ; = out ; m = 0, 17, 2, 3 mov edx,cos_l_017_2_3+4*4 mov ecx,17 lea eax,[esp+1*4] fld dword [edx- 4*4] ; cos_l[ 0][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 3*4] ; cos_l[17][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 2*4] ; cos_l[ 2][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 1*4] ; cos_l[ 3][0] fmul dword [esp+ 0*4] ; fin[0] jmp short .lp1 align 16 .lp1: fld dword [edx+ 0*4] ; cos_l[ 0][k] fmul dword [eax] ; fin[k] fld dword [edx+ 1*4] ; cos_l[17][k] fmul dword [eax] ; fin[k] fld dword [edx+ 2*4] ; cos_l[ 2][k] fmul dword [eax] ; fin[k] fld dword [edx+ 3*4] ; cos_l[ 3][k] fmul dword [eax] ; fin[k] add edx,4*4 add eax,1*4 faddp st4,st0 faddp st4,st0 faddp st4,st0 faddp st4,st0 dec ecx jnz .lp1 fstp dword [ebx+ 3*4] fstp dword [ebx+ 2*4] fstp dword [ebx+17*4] fstp dword [ebx+ 0*4] ; m = 5, 6, 8, 9 mov edx,cos_l_5_6_8_9+4*4 mov ecx,17 lea eax,[esp+1*4] fld dword [edx- 4*4] ; cos_l[ 5][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 3*4] ; cos_l[ 6][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 2*4] ; cos_l[ 8][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 1*4] ; cos_l[ 9][0] fmul dword [esp+ 0*4] ; fin[0] jmp short .lp2 align 16 .lp2: fld dword [edx+ 0*4] ; cos_l[ 5][k] fmul dword [eax] ; fin[k] fld dword [edx+ 1*4] ; cos_l[ 6][k] fmul dword [eax] ; fin[k] fld dword [edx+ 2*4] ; cos_l[ 8][k] fmul dword [eax] ; fin[k] fld dword [edx+ 3*4] ; cos_l[ 9][k] fmul dword [eax] ; fin[k] add edx,4*4 add eax,1*4 faddp st4,st0 faddp st4,st0 faddp st4,st0 faddp st4,st0 dec ecx jnz .lp2 fstp dword [ebx+ 9*4] fstp dword [ebx+ 8*4] fstp dword [ebx+ 6*4] fstp dword [ebx+ 5*4] ; m = 11, 12, 14, 15 mov edx,cos_l11121415+4*4 mov ecx,17 lea eax,[esp+1*4] fld dword [edx- 4*4] ; cos_l[11][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 3*4] ; cos_l[12][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 2*4] ; cos_l[14][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 1*4] ; cos_l[15][0] fmul dword [esp+ 0*4] ; fin[0] jmp short .lp3 align 16 .lp3: fld dword [edx+ 0*4] ; cos_l[11][k] fmul dword [eax] ; fin[k] fld dword [edx+ 1*4] ; cos_l[12][k] fmul dword [eax] ; fin[k] fld dword [edx+ 2*4] ; cos_l[14][k] fmul dword [eax] ; fin[k] fld dword [edx+ 3*4] ; cos_l[15][k] fmul dword [eax] ; fin[k] add edx,4*4 add eax,1*4 faddp st4,st0 faddp st4,st0 faddp st4,st0 faddp st4,st0 dec ecx jnz .lp3 fstp dword [ebx+15*4] fstp dword [ebx+14*4] fstp dword [ebx+12*4] fstp dword [ebx+11*4] ; fin[ 0] = fin[ 0] + fin[ 5] + fin[15] ; fin[ 1] = fin[ 1] + fin[ 4] + fin[16] ; fin[ 2] = fin[ 2] + fin[ 3] + fin[17] fld dword [esp+0*4] fld dword [esp+1*4] fld dword [esp+2*4] fxch st2 ; fin[ 2], fin[ 1], fin[ 0] fadd dword [esp+5*4] fxch st1 ; fin[ 2], fin[ 0], fin[ 1] fadd dword [esp+4*4] fxch st2 ; fin[ 1], fin[ 0], fin[ 2] fadd dword [esp+3*4] fxch st1 ; fin[ 1], fin[ 2], fin[ 0] fadd dword [esp+15*4] fxch st2 ; fin[ 0], fin[ 2], fin[ 1] fadd dword [esp+16*4] fxch st1 ; fin[ 0], fin[ 1], fin[ 2] fadd dword [esp+17*4] fxch st2 ; fin[ 2], fin[ 1], fin[ 0] fstp dword [esp+ 0*4] fstp dword [esp+ 1*4] fstp dword [esp+ 2*4] ; fin[ 3] = fin[ 6] - fin[ 9] + fin[14] ; fin[ 4] = fin[ 7] - fin[10] + fin[13] ; fin[ 5] = fin[ 8] - fin[11] + fin[12] fld dword [esp+ 6*4] fld dword [esp+ 7*4] fld dword [esp+ 8*4] fxch st2 ; fin[ 8], fin[ 7], fin[ 6] fsub dword [esp+ 9*4] fxch st1 ; fin[ 8], fin[ 6], fin[ 7] fsub dword [esp+10*4] fxch st2 ; fin[ 7], fin[ 6], fin[ 8] fsub dword [esp+11*4] fxch st1 ; fin[ 7], fin[ 8], fin[ 6] fadd dword [esp+14*4] fxch st2 ; fin[ 6], fin[ 8], fin[ 7] fadd dword [esp+13*4] fxch st1 ; fin[ 6], fin[ 7], fin[ 8] fadd dword [esp+12*4] fxch st2 ; fin[ 8], fin[ 7], fin[ 6] fstp dword [esp+ 3*4] fstp dword [esp+ 4*4] fstp dword [esp+ 5*4] ; m = 1, 7, 10, 16 ; sum = ( fin[ 0]+fin[ 5]+fin[15] ) * cos_l[m][0]; /* mfc=15 0*/ ; sum += ( fin[ 1]+fin[ 4]+fin[16] ) * cos_l[m][1]; /* mfc=9 1*/ ; sum += ( fin[ 2]+fin[ 3]+fin[17] ) * cos_l[m][2]; /* mfc=3 2*/ ; sum += ( fin[ 6]-fin[ 9]+fin[14] ) * cos_l[m][6]; /* mfc=21 6*/ ; sum += ( fin[ 7]-fin[10]+fin[13] ) * cos_l[m][7]; /* mfc=27 7*/ ; sum += ( fin[ 8]-fin[11]+fin[12] ) * cos_l[m][8]; /* mfc = 28 8*/ ; out[m]=sum; mov edx,cos_l_1_71016+4*4 mov ecx,5 lea eax,[esp+1*4] fld dword [edx- 4*4] ; cos_l[ 0][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 3*4] ; cos_l[17][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 2*4] ; cos_l[ 2][0] fmul dword [esp+ 0*4] ; fin[0] fld dword [edx- 1*4] ; cos_l[ 3][0] fmul dword [esp+ 0*4] ; fin[0] jmp short .lp4 align 16 .lp4: fld dword [edx+ 0*4] ; cos_l[ 0][k] fmul dword [eax] ; fin[k] fld dword [edx+ 1*4] ; cos_l[17][k] fmul dword [eax] ; fin[k] fld dword [edx+ 2*4] ; cos_l[ 2][k] fmul dword [eax] ; fin[k] fld dword [edx+ 3*4] ; cos_l[ 3][k] fmul dword [eax] ; fin[k] add edx,4*4 add eax,1*4 faddp st4,st0 faddp st4,st0 faddp st4,st0 faddp st4,st0 dec ecx jnz .lp4 fstp dword [ebx+16*4] fstp dword [ebx+10*4] fstp dword [ebx+ 7*4] fstp dword [ebx+ 1*4] ; fin[0] = (fin[0]+fin[5]+fin[15])-(fin[1]+fin[4]+fin[16])+(fin[8]-fin[11]+fin[12]); ; fin[6] = (fin[6]-fin[9]+fin[14])-(fin[2]+fin[3]+fin[17])+(fin[7]-fin[10]+fin[13]); fld dword [esp+0*4] fld dword [esp+3*4] fxch fsub dword [esp+1*4] fxch fsub dword [esp+2*4] fxch fadd dword [esp+5*4] fxch fadd dword [esp+4*4] ; fin[0], fin[6] fld dword [cos_l_4_0] fld dword [cos_l_4_6] ; fin[0], fin[6], cos_l_4_0, cos_l_4_6 ; /* 4 */ ; sum = ((fin[0]+fin[5]+fin[15])-(fin[1]+fin[4]+fin[16])+(fin[8]-fin[11]+fin[12]))*cos_l[4][0]; ; sum += ((fin[6]-fin[9]+fin[14])-(fin[2]+fin[3]+fin[17])+(fin[7]-fin[10]+fin[13]))*cos_l[4][6]; fld st3 ; fin[0], fin[6], cos_l_4_0, cos_l_4_6, fin[0] fmul st0,st2 fld st3 fmul st0,st2 faddp st1,st0 ; out[4]=sum; fstp dword [ebx+4*4] ; fin[0], fin[6], cos_l_4_0, cos_l_4_6 ; /* 13 */ ; cos_l13_0 = -cos_l_4_6 ; cos_l13_6 = +cos_l_4_0 ; sum = ((fin[0]+fin[5]+fin[15])-(fin[1]+fin[4]+fin[16])+(fin[8]-fin[11]+fin[12]))*cos_l[13][0]; ; sum += ((fin[6]-fin[9]+fin[14])-(fin[2]+fin[3]+fin[17])+(fin[7]-fin[10]+fin[13]))*cos_l[13][6]; fmulp st3,st0 fmulp st1,st0 fsubrp st1,st0 ; out[13]=sum; fstp dword [ebx+13*4] add esp,18*4 pop ebx ret ; block_type == 2 ; for ( m = 0; m < 6; m++ ){ ; for ( k = 0; k < 12; k++ ){ ; sum += in[k + 6] * cos_s_mdct[m][k]; ; } ; out[ 3 * m + 0] = sum; ; ; for ( k = 0; k < 12; k++ ){ ; sum += in[k + 12] * cos_s_mdct[m][k]; ; } ; out[ 3 * m + 1] = sum; ; ; for ( k = 0; k < 12; k++ ){ ; sum += in[k + 18] * cos_s_mdct[m][k]; ; } ; out[ 3 * m + 2] = sum; align 16 .block_type2: push ebx mov ebx,[esp+4+8] ; = out mov ecx,cos_s_mdct ; = cos_s_mdct[m] .lp8: xor edx,edx ; k fld dword [eax+ 6*4] fmul dword [ecx] ; = cos_s_mdct[m][0] fld dword [eax+12*4] fmul dword [ecx] ; = cos_s_mdct[m][0] fld dword [eax+18*4] ; out[3*m+0], out[3*m+1], out[3*m+2] fmul dword [ecx] ; = cos_s_mdct[m][0] inc edx jmp short .lp9 align 16 .lp9: fld dword [eax+edx*4+ 6*4] ; = in[k+ 6] fmul dword [ecx+edx*4] ; = cos_s_mdct[m][k] fld dword [eax+edx*4+12*4] ; = in[k+12] fmul dword [ecx+edx*4] ; = cos_s_mdct[m][k] fld dword [eax+edx*4+18*4] ; = in[k+18] fmul dword [ecx+edx*4] ; = cos_s_mdct[m][k] faddp st3,st0 faddp st3,st0 faddp st3,st0 inc edx cmp edx,12 jl .lp9 fstp dword [ebx+2*4] fstp dword [ebx+1*4] fstp dword [ebx+0*4] add ecx,12*4 add ebx,3*4 cmp ecx,cos_s_mdct+12*6*4 jl .lp8 pop ebx ret end gogo239b/mdcttbl.nas100644 23421 144 16360 7220537347 13521 0ustar shigeousers ; optimized mdct() for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to Keiichi SAKAI ; 99/09/01 lameのmdct.cベースに書き換え %include "nasm.h" globaldef cs_arb globaldef ca_arb globaldef cos_l_017_2_3 globaldef cos_l_5_6_8_9 globaldef cos_l11121415 globaldef cos_l_1_71016 globaldef cos_l_4_0 globaldef cos_l_4_6 %if 0 globaldef win_mdct globaldef cos_s_mdct %endif segment_data cs_arb: dd 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ca_arb: dd 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 %if 0 ; win_mdct[4][36] は、mdct.c と mdct3dn.nas で使われるのと全く同じ ; 初期化後にダンプしただけ align 16 win_mdct: ; win_mdct[0][] dd 0x3D32AA3E, 0x3E05A8A8, 0x3E5DA259, 0x3E99F61C dd 0x3EC3EF15, 0x3EEC6A50, 0x3F098C78, 0x3F1BD7CA dd 0x3F2CF37B, 0x3F3CBE35, 0x3F4B1934, 0x3F57E880 dd 0x3F631324, 0x3F6C835E, 0x3F7426CB, 0x3F79EE89 dd 0x3F7DCF55, 0x3F7FC1A0, 0x3F7FC1A0, 0x3F7DCF55 dd 0x3F79EE89, 0x3F7426CB, 0x3F6C835E, 0x3F631324 dd 0x3F57E880, 0x3F4B1934, 0x3F3CBE35, 0x3F2CF37B dd 0x3F1BD7CA, 0x3F098C78, 0x3EEC6A50, 0x3EC3EF15 dd 0x3E99F61C, 0x3E5DA259, 0x3E05A8A8, 0x3D32AA3E ; win_mdct[1][] dd 0x3D32AA3E, 0x3E05A8A8, 0x3E5DA259, 0x3E99F61C dd 0x3EC3EF15, 0x3EEC6A50, 0x3F098C78, 0x3F1BD7CA dd 0x3F2CF37B, 0x3F3CBE35, 0x3F4B1934, 0x3F57E880 dd 0x3F631324, 0x3F6C835E, 0x3F7426CB, 0x3F79EE89 dd 0x3F7DCF55, 0x3F7FC1A0, 0x3F800000, 0x3F800000 dd 0x3F800000, 0x3F800000, 0x3F800000, 0x3F800000 dd 0x3F7DCF55, 0x3F6C835E, 0x3F4B1934, 0x3F1BD7CA dd 0x3EC3EF15, 0x3E05A8A8, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 ; win_mdct[2][] dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 ; win_mdct[3][] dd 0x00000000, 0x00000000, 0x00000000, 0x00000000 dd 0x00000000, 0x00000000, 0x3E05A8A8, 0x3EC3EF15 dd 0x3F1BD7CA, 0x3F4B1934, 0x3F6C835E, 0x3F7DCF55 dd 0x3F800000, 0x3F800000, 0x3F800000, 0x3F800000 dd 0x3F800000, 0x3F800000, 0x3F7FC1A0, 0x3F7DCF55 dd 0x3F79EE89, 0x3F7426CB, 0x3F6C835E, 0x3F631324 dd 0x3F57E880, 0x3F4B1934, 0x3F3CBE35, 0x3F2CF37B dd 0x3F1BD7CA, 0x3F098C78, 0x3EEC6A50, 0x3EC3EF15 dd 0x3E99F61C, 0x3E5DA259, 0x3E05A8A8, 0x3D32AA3E ; cos_s_mdct[6][12] は、mdct.c と mdct3dn.nas で使われるのと全く同じ ; 初期化後にダンプしただけ align 16 cos_s_mdct: ; cos_s[0][] dd 0x3CD8FA16, 0x3D47F2CD, 0x3CD8FA16, 0xBD0D6289 dd 0xBDF15BEF, 0xBE4E034D, 0xBE863D99, 0xBE91AC51 dd 0xBE863D99, 0xBE4E034D, 0xBDF15BEF, 0xBD0D6289 ; cos_s[1][] dd 0xBD24A56D, 0xBDF15BEF, 0xBD9F0938, 0x3DCF4280 dd 0x3E91AC51, 0x3E9C5396, 0x3E01814F, 0xBDF15BEF dd 0xBE7A2F47, 0xBE3FF934, 0xBD47F2CD, 0x3C8865BA ; cos_s[2][] dd 0xBBBA1726, 0x3DF15BEF, 0x3DFCFD61, 0xBE24D9F1 dd 0xBE91AC51, 0x3D30AFE8, 0x3EA7C24E, 0x3DF15BEF dd 0xBE56D6A5, 0xBE24D9F1, 0x3D47F2CD, 0x3D30AFE8 ; cos_s[3][] dd 0x3D30AFE8, 0xBD47F2CD, 0xBE24D9F1, 0x3E56D6A5 dd 0x3DF15BEF, 0xBEA7C24E, 0x3D30AFE8, 0x3E91AC51 dd 0xBE24D9F1, 0xBDFCFD61, 0x3DF15BEF, 0x3BBA1726 ; cos_s[4][] dd 0xBC8865BA, 0xBD47F2CD, 0x3E3FF934, 0xBE7A2F47 dd 0x3DF15BEF, 0x3E01814F, 0xBE9C5396, 0x3E91AC51 dd 0xBDCF4280, 0xBD9F0938, 0x3DF15BEF, 0xBD24A56D ; cos_s[5][] dd 0xBD0D6289, 0x3DF15BEF, 0xBE4E034D, 0x3E863D99 dd 0xBE91AC51, 0x3E863D99, 0xBE4E034D, 0x3DF15BEF dd 0xBD0D6289, 0xBCD8FA16, 0x3D47F2CD, 0xBCD8FA16 %endif ; 係数テーブルは計算後の値をダンプしてSSE/FPU向きに整列 align 16 cos_l_017_2_3: ; cos_l[ 0], cos_l[17], cos_l[ 2], cos_l[ 3] dd 0x3D99BBFB, 0xBDA7C585, 0xBD7487F1, 0x3DC9D820 dd 0x3D8A86EC, 0x3DB4882F, 0xBC6D9D9D, 0x3DE19BD9 dd 0x3D7487F1, 0xBDBFEB1D, 0x3D08DAC4, 0x3DA7C585 dd 0x3D52259D, 0x3DC9D820, 0x3D99BBFB, 0x3CC50216 dd 0x3D2E29DA, 0xBDD23BE2, 0x3DD23BE2, 0xBD2E29DA dd 0x3D08DAC4, 0x3DD9060A, 0x3DE356C7, 0xBDBFEB1D dd 0x3CC50216, 0xBDDE295D, 0x3DC9D820, 0xBDE356C7 dd 0x3C6D9D9D, 0x3DE19BD9, 0x3D8A86EC, 0xBDB4882F dd 0x3B9ED037, 0xBDE356C7, 0x3CC50216, 0xBD08DAC4 dd 0xBDA7C585, 0xBD99BBFB, 0x3DBFEB1D, 0xBD52259D dd 0xBDB4882F, 0x3D8A86EC, 0x3DE19BD9, 0x3C6D9D9D dd 0xBDBFEB1D, 0xBD7487F1, 0x3DD9060A, 0x3D99BBFB dd 0xBDC9D820, 0x3D52259D, 0x3DA7C585, 0x3DDE295D dd 0xBDD23BE2, 0xBD2E29DA, 0x3D2E29DA, 0x3DD23BE2 dd 0xBDD9060A, 0x3D08DAC4, 0xBB9ED037, 0x3D7487F1 dd 0xBDDE295D, 0xBCC50216, 0xBD52259D, 0xBB9ED037 dd 0xBDE19BD9, 0x3C6D9D9D, 0xBDB4882F, 0xBD8A86EC dd 0xBDE356C7, 0xBB9ED037, 0xBDDE295D, 0xBDD9060A cos_l_5_6_8_9: ; cos_l[ 5], cos_l[ 6], cos_l[ 8], cos_l[ 9] dd 0xBDD9060A, 0xBCC50216, 0x3B9ED037, 0xBDE356C7 dd 0xBDB4882F, 0x3DB4882F, 0xBDE19BD9, 0x3C6D9D9D dd 0x3B9ED037, 0x3DC9D820, 0xBCC50216, 0x3DDE295D dd 0x3DBFEB1D, 0xBB9ED037, 0x3DD9060A, 0xBD08DAC4 dd 0x3DD23BE2, 0xBDD23BE2, 0x3D2E29DA, 0xBDD23BE2 dd 0x3CC50216, 0xBDA7C585, 0xBDC9D820, 0x3D52259D dd 0xBD99BBFB, 0x3D08DAC4, 0xBD7487F1, 0x3DBFEB1D dd 0xBDE19BD9, 0x3DE19BD9, 0x3DB4882F, 0xBD8A86EC dd 0xBD52259D, 0x3D7487F1, 0x3D99BBFB, 0xBDA7C585 dd 0x3D08DAC4, 0x3DDE295D, 0xBDE356C7, 0xBB9ED037 dd 0xBD8A86EC, 0x3D8A86EC, 0xBC6D9D9D, 0xBDE19BD9 dd 0xBDE356C7, 0xBD52259D, 0x3DDE295D, 0x3CC50216 dd 0xBD7487F1, 0xBDE356C7, 0x3D08DAC4, 0x3DD9060A dd 0x3D2E29DA, 0xBD2E29DA, 0xBDD23BE2, 0xBD2E29DA dd 0x3DDE295D, 0x3D99BBFB, 0xBD52259D, 0xBDC9D820 dd 0x3DA7C585, 0x3DD9060A, 0x3DBFEB1D, 0x3D7487F1 dd 0xBC6D9D9D, 0x3C6D9D9D, 0x3D8A86EC, 0x3DB4882F dd 0xBDC9D820, 0xBDBFEB1D, 0xBDA7C585, 0xBD99BBFB cos_l11121415: ; cos_l[11], cos_l[12], cos_l[14], cos_l[15] dd 0x3DDE295D, 0xBD08DAC4, 0x3D52259D, 0x3DBFEB1D dd 0xBD8A86EC, 0xBD8A86EC, 0x3C6D9D9D, 0xBDE19BD9 dd 0xBD52259D, 0x3DE356C7, 0xBD99BBFB, 0x3DD9060A dd 0x3DE356C7, 0xBD7487F1, 0x3DDE295D, 0xBDA7C585 dd 0xBD2E29DA, 0xBD2E29DA, 0xBDD23BE2, 0x3D2E29DA dd 0xBD99BBFB, 0x3DDE295D, 0x3D7487F1, 0x3B9ED037 dd 0x3DD9060A, 0xBDA7C585, 0x3B9ED037, 0xBD52259D dd 0xBC6D9D9D, 0xBC6D9D9D, 0xBD8A86EC, 0x3DB4882F dd 0xBDBFEB1D, 0x3DC9D820, 0x3DD9060A, 0xBDDE295D dd 0x3CC50216, 0xBDD9060A, 0x3DC9D820, 0x3D7487F1 dd 0x3DB4882F, 0x3DB4882F, 0xBDE19BD9, 0xBC6D9D9D dd 0xBDC9D820, 0x3B9ED037, 0x3DA7C585, 0xBD08DAC4 dd 0xBB9ED037, 0xBDBFEB1D, 0xBCC50216, 0x3D99BBFB dd 0x3DD23BE2, 0x3DD23BE2, 0xBD2E29DA, 0xBDD23BE2 dd 0xBDA7C585, 0xBCC50216, 0x3DBFEB1D, 0x3DE356C7 dd 0xBD08DAC4, 0xBD99BBFB, 0xBDE356C7, 0xBDC9D820 dd 0x3DE19BD9, 0x3DE19BD9, 0x3DB4882F, 0x3D8A86EC dd 0xBD7487F1, 0xBD52259D, 0xBD08DAC4, 0xBCC50216 cos_l_1_71016: ; cos_l[ 1], cos_l[ 7], cos_l[10], cos_l[16] dd 0xBDB4882F, 0x3DE19BD9, 0x3C6D9D9D, 0xBD8A86EC ; [0] dd 0xBDD23BE2, 0x3D2E29DA, 0x3DD23BE2, 0x3D2E29DA ; [1] dd 0xBDE19BD9, 0xBDB4882F, 0xBD8A86EC, 0xBC6D9D9D ; [2] dd 0xBD8A86EC, 0x3C6D9D9D, 0xBDE19BD9, 0x3DB4882F ; [6] dd 0xBD2E29DA, 0xBDD23BE2, 0x3D2E29DA, 0xBDD23BE2 ; [7] dd 0xBC6D9D9D, 0xBD8A86EC, 0x3DB4882F, 0x3DE19BD9 ; [8] ; cos_l[ 4](cos_l[13]) cos_l_4_0: ; -cos_l13_6 dd 0x3D2E29DA cos_l_4_6: ; cos_l13_0 dd 0x3DD23BE2 segment_code end gogo239b/msub3dn.nas100644 23421 144 22370 7220537350 13433 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to URURI ; * mdct_sub_3DN * ; 99/10/10 3DNow!化 ; 99/10/30 微調整 %include "nasm.h" %include "grinfo.inc" externdef mdct externdef ca_mdct externdef cs_mdct ; externdef csa_arb_3DN ; l3side.hとの整合性注意 ;&III_side_info_t.gr[0].ch[0].block_type = 12*4 ;%define Offset_block_type dwsizen(12) %define Offset_block_type dwsizen(4) ; by shigeo 00/01/30 ;sizeof(gr_info) = 28*4 ;%define Size_gr_info dwsizen(28) segment_data align 16 D_MSB1_0 dd 0x00000000 , 0x80000000 D_MSB1_1 dd 0x80000000 , 0x80000000 D_MSB0_1 dd 0x80000000 , 0x00000000 align 16 mdct_in times 36 dd 0 align 16 mdct2_in times 36 dd 0 segment_code ;*********************************************************************** ;void mdct_sub_3DN(L3SBS (*sb_sample), float (*mdct_freq)[2][576], int stereo, III_side_info_t *l3_side, int mode_gr); proc mdct_sub_3DN %$sb_sample arg 4 %$mdct_freq arg 4 %$stereo arg 4 %$l3_side arg 4 %$mode_gr arg 4 %$l_stereo local 4 %$l_mode_gr local 4 %$block_type local 4 %$pblock_gr local 4 %$psample_gr local 4 %$penc_gr local 4 %$penc_gr_ch local 4 %$band local 4 alloc femms pushd ebp, ebx, esi, edi .for_gr_init: mov r0, [sp(%$mode_gr)] mov r1, [sp(%$l3_side)] mov r2, [sp(%$sb_sample)] mov r3, [sp(%$mdct_freq)] add r1, Offset_block_type mov [sp(%$l_mode_gr)], r0 .for_gr: mov [sp(%$pblock_gr)], r1 mov [sp(%$psample_gr)], r2 mov [sp(%$penc_gr)], r3 mov r0, [r1] .for_ch_init: mov r4, [sp(%$stereo)] mov [sp(%$l_stereo)], r4 .for_ch: mov [sp(%$block_type)], r0 mov [sp(%$penc_gr_ch)], r3 .for_band_init: mov r4, r2 ;&sample[ gr ][0][band] mov r6, r3 ;&enc[band][0] lea r5, [mdct_in+fsizen(32)] ;&mdct_in[0]+128 mov dword [sp(%$band)], 32/2 jmp .for_band align 16 .for_band: lea r0, [r4+fsizen(32)] ;&sample[ gr ][1][band] lea r1, [r4+fsizen(576+32)] ;&sample[gr+1][1][band] pmov mm7, [D_MSB1_0] lea r3, [mdct2_in+fsizen(32)] pmov mm2, [r0+fsizen(0)] pmov mm3, [r1+fsizen(0)] pmovd [r5+fsizen(-32+ 1)], mm2 pmov mm0, [r0+fsizen(-32)] pmovd [r5+fsizen(-32+19)], mm3 pmov mm1, [r1+fsizen(-32)] pxor mm2, mm7 pmovd [r5+fsizen(-32+ 0)], mm0 pxor mm3, mm7 pmovd [r5+fsizen(-32+18)], mm1 puphdq mm0, mm2 pmov mm2, [r0+fsizen(0+64)] puphdq mm1, mm3 pmov mm3, [r1+fsizen(0+64)] pmov [r3+fsizen(-32+ 0)], mm0 pmov [r3+fsizen(-32+18)], mm1 pmovd [r5+fsizen(-32+ 3)], mm2 pmov mm0, [r0+fsizen(-32+64)] pmovd [r5+fsizen(-32+21)], mm3 pmov mm1, [r1+fsizen(-32+64)] pxor mm2, mm7 pmovd [r5+fsizen(-32+ 2)], mm0 pxor mm3, mm7 pmovd [r5+fsizen(-32+20)], mm1 puphdq mm0, mm2 pmov mm2, [r0+fsizen(0+64*2)] puphdq mm1, mm3 pmov mm3, [r1+fsizen(0+64*2)] pmov [r3+fsizen(-32+ 2)], mm0 pmov [r3+fsizen(-32+20)], mm1 pmovd [r5+fsizen(-32+ 5)], mm2 pmov mm0, [r0+fsizen(-32+64*2)] pmovd [r5+fsizen(-32+23)], mm3 pmov mm1, [r1+fsizen(-32+64*2)] pxor mm2, mm7 pmovd [r5+fsizen(-32+ 4)], mm0 pxor mm3, mm7 pmovd [r5+fsizen(-32+22)], mm1 puphdq mm0, mm2 pmov mm2, [r0+fsizen(0+64*3)] puphdq mm1, mm3 pmov mm3, [r1+fsizen(0+64*3)] pmov [r3+fsizen(-32+ 4)], mm0 pmov [r3+fsizen(-32+22)], mm1 pmovd [r5+fsizen(-32+ 7)], mm2 pmov mm0, [r0+fsizen(-32+64*3)] pmovd [r5+fsizen(-32+25)], mm3 pmov mm1, [r1+fsizen(-32+64*3)] pxor mm2, mm7 pmovd [r5+fsizen(-32+ 6)], mm0 pxor mm3, mm7 pmovd [r5+fsizen(-32+24)], mm1 puphdq mm0, mm2 pmov mm2, [r0+fsizen(0+64*4)] puphdq mm1, mm3 pmov mm3, [r1+fsizen(0+64*4)] pmov [r3+fsizen(-32+ 6)], mm0 pmov [r3+fsizen(-32+24)], mm1 pmovd [r5+fsizen(-32+ 9)], mm2 pmov mm0, [r0+fsizen(-32+64*4)] pmovd [r5+fsizen(-32+27)], mm3 pmov mm1, [r1+fsizen(-32+64*4)] pxor mm2, mm7 pmovd [r5+fsizen(-32+ 8)], mm0 pxor mm3, mm7 pmovd [r5+fsizen(-32+26)], mm1 puphdq mm0, mm2 pmov mm2, [r0+fsizen(0+64*5)] puphdq mm1, mm3 pmov mm3, [r1+fsizen(0+64*5)] pmov [r3+fsizen(-32+ 8)], mm0 pmov [r3+fsizen(-32+26)], mm1 pmovd [r5+fsizen(-32+11)], mm2 pmov mm0, [r0+fsizen(-32+64*5)] pmovd [r5+fsizen(-32+29)], mm3 pmov mm1, [r1+fsizen(-32+64*5)] pxor mm2, mm7 pmovd [r5+fsizen(-32+10)], mm0 pxor mm3, mm7 pmovd [r5+fsizen(-32+28)], mm1 puphdq mm0, mm2 pmov mm2, [r0+fsizen(0+64*6)] puphdq mm1, mm3 pmov mm3, [r1+fsizen(0+64*6)] pmov [r3+fsizen(-32+10)], mm0 pmov [r3+fsizen(-32+28)], mm1 pmovd [r5+fsizen(-32+13)], mm2 pmov mm0, [r0+fsizen(-32+64*6)] pmovd [r5+fsizen(-32+31)], mm3 pmov mm1, [r1+fsizen(-32+64*6)] pxor mm2, mm7 pmovd [r5+fsizen(-32+12)], mm0 pxor mm3, mm7 pmovd [r5+fsizen(-32+30)], mm1 puphdq mm0, mm2 pmov mm2, [r0+fsizen(0+64*7)] puphdq mm1, mm3 pmov mm3, [r1+fsizen(0+64*7)] pmov [r3+fsizen(-32+12)], mm0 pmov [r3+fsizen(-32+30)], mm1 pmovd [r5+fsizen(-32+15)], mm2 pmov mm0, [r0+fsizen(-32+64*7)] pmovd [r5+fsizen(-32+33)], mm3 pmov mm1, [r1+fsizen(-32+64*7)] pxor mm2, mm7 pmovd [r5+fsizen(-32+14)], mm0 pxor mm3, mm7 pmovd [r5+fsizen(-32+32)], mm1 puphdq mm0, mm2 pmov mm2, [r0+fsizen(0+64*8)] puphdq mm1, mm3 pmov mm3, [r1+fsizen(0+64*8)] pmov [r3+fsizen(-32+14)], mm0 pmov [r3+fsizen(-32+32)], mm1 pmovd [r5+fsizen(-32+17)], mm2 pmov mm0, [r0+fsizen(-32+64*8)] pmovd [r5+fsizen(-32+35)], mm3 pmov mm1, [r1+fsizen(-32+64*8)] pxor mm2, mm7 pmovd [r5+fsizen(-32+16)], mm0 pxor mm3, mm7 pmovd [r5+fsizen(-32+34)], mm1 puphdq mm0, mm2 puphdq mm1, mm3 pmov [r3+fsizen(-32+16)], mm0 pmov [r3+fsizen(-32+34)], mm1 ;mdct( mdct_in, &enc[band][0], block_type ); femms mov r1, [sp(%$block_type)] mov r0, [mdct] push r1 push r6 push dword mdct_in call r0 add r6, fsizen(18) ;mdct( mdct_in, &enc[band][0], block_type ); mov r0, [mdct] push r1 push r6 push dword mdct2_in call r0 add esp, 24 femms .for_band_next: add r4, fsizen(2) add r6, fsizen(18) dec dword [sp(%$band)] jnz near .for_band cmp r1, 2 ;r1 = [sp(%$block_type)] je near .for_alias_exit .for_alias_init: mov r0, [sp(%$penc_gr_ch)] ;&enc[band][0] add r0, fsizen(32) mov r1, ca_mdct mov r2, 31 jmp .for_alias align 16 .for_alias: pmov mm0, [r0+fsizen(-32+16-0)] pmov mm1, [r0+fsizen(-32+16-2)] pmov mm2, [r0+fsizen(-32+18+0)] pupldq mm4, mm0 pmov mm3, [r0+fsizen(-32+18+2)] pupldq mm5, mm1 pmov mm6, mm2 puphdq mm0, mm4 pfmul mm2, [r1+fsizen(0)] puphdq mm1, mm5 pmov mm4, mm0 pfmul mm0, [r1+fsizen(8+0)] pmov mm7, mm3 pfmul mm3, [r1+fsizen(2)] pmov mm5, mm1 pfmul mm1, [r1+fsizen(8+2)] pfadd mm0, mm2 pfmul mm6, [r1+fsizen(8+0)] pfadd mm1, mm3 pfmul mm4, [r1+fsizen(0)] pmovd [r0+fsizen(-32+17)], mm0 pfmul mm7, [r1+fsizen(8+2)] pmovd [r0+fsizen(-32+15)], mm1 pfmul mm5, [r1+fsizen(2)] puphdq mm0, mm0 pfsub mm6, mm4 puphdq mm1, mm1 pfsub mm7, mm5 pmovd [r0+fsizen(-32+16)], mm0 pmovd [r0+fsizen(-32+14)], mm1 ; pmov mm0, [r0+fsizen(-32+16-4)] pmov [r0+fsizen(-32+18)], mm6 pmov mm1, [r0+fsizen(-32+16-6)] pmov [r0+fsizen(-32+20)], mm7 pmov mm2, [r0+fsizen(-32+18+4)] pupldq mm4, mm0 pmov mm3, [r0+fsizen(-32+18+6)] pupldq mm5, mm1 pmov mm6, mm2 puphdq mm0, mm4 pfmul mm2, [r1+fsizen(4)] puphdq mm1, mm5 pmov mm4, mm0 pfmul mm0, [r1+fsizen(8+4)] pmov mm7, mm3 pfmul mm3, [r1+fsizen(6)] pmov mm5, mm1 pfmul mm1, [r1+fsizen(8+6)] pfadd mm0, mm2 pfmul mm6, [r1+fsizen(8+4)] pfadd mm1, mm3 pfmul mm4, [r1+fsizen(4)] pmovd [r0+fsizen(-32+13)], mm0 pfmul mm7, [r1+fsizen(8+6)] pmovd [r0+fsizen(-32+11)], mm1 pfmul mm5, [r1+fsizen(6)] puphdq mm0, mm0 pfsub mm6, mm4 puphdq mm1, mm1 pfsub mm7, mm5 pmovd [r0+fsizen(-32+12)], mm0 pmovd [r0+fsizen(-32+10)], mm1 pmov [r0+fsizen(-32+22)], mm6 pmov [r0+fsizen(-32+24)], mm7 .for_alias_next: add r0, fsizen(18) dec r2 jnz near .for_alias .for_alias_exit: .for_ch_next: mov r1, [sp(%$pblock_gr)] mov r2, [sp(%$psample_gr)] mov r3, [sp(%$penc_gr)] add r1, Size_gr_info add r2, fsizen(576)*3 add r3, fsizen(576) dec dword [sp(%$l_stereo)] mov r0, [r1] jnz near .for_ch .for_gr_next: mov r1, [sp(%$pblock_gr)] mov r2, [sp(%$psample_gr)] mov r3, [sp(%$penc_gr)] add r1, Size_gr_info*2 add r2, fsizen(576) add r3, fsizen(576)*2 dec dword [sp(%$l_mode_gr)] jnz near .for_gr .for_save_init: mov r0, [sp(%$sb_sample)] mov r1, r2 ;r2 = [sp(%$psample_gr)] mov r2, 18 jmp .for_save align 16 .for_save: pmov mm0, [r1+fsizen(0)] pmov mm1, [r1+fsizen(2)] pmov [r0+fsizen(0)], mm0 pmov mm2, [r1+fsizen(4)] pmov [r0+fsizen(2)], mm1 pmov mm3, [r1+fsizen(6)] pmov [r0+fsizen(4)], mm2 pmov mm4, [r1+fsizen(8)] pmov [r0+fsizen(6)], mm3 pmov mm5, [r1+fsizen(10)] pmov [r0+fsizen(8)], mm4 pmov mm6, [r1+fsizen(12)] pmov [r0+fsizen(10)], mm5 pmov mm7, [r1+fsizen(14)] pmov [r0+fsizen(12)], mm6 pmov mm0, [r1+fsizen(16)] pmov [r0+fsizen(14)], mm7 pmov mm1, [r1+fsizen(18)] pmov [r0+fsizen(16)], mm0 pmov mm2, [r1+fsizen(20)] pmov [r0+fsizen(18)], mm1 pmov mm3, [r1+fsizen(22)] pmov [r0+fsizen(20)], mm2 pmov mm4, [r1+fsizen(24)] pmov [r0+fsizen(22)], mm3 pmov mm5, [r1+fsizen(26)] pmov [r0+fsizen(24)], mm4 pmov mm6, [r1+fsizen(28)] pmov [r0+fsizen(26)], mm5 pmov mm7, [r1+fsizen(30)] pmov [r0+fsizen(28)], mm6 add r1, fsizen(32) pmov [r0+fsizen(30)], mm7 add r0, fsizen(32) dec r2 jnz near .for_save add r1, fsizen(576*3-32*18) add r0, fsizen(576*3-32*18) dec dword [sp(%$stereo)] mov r2, 18 jnz near .for_save .exit: femms popd ebp, ebx, esi, edi endproc ;*********************************************************************** gogo239b/msubfpu.nas100644 23421 144 30676 7220537350 13551 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to URURI ; * mdct_sub_FPU * ; 99/10/10 作成 ; 99/10/17 mdct_FPUを直に呼ぶように変更 ; 99/10/30 mode_gr=1の時にsaveに失敗するバグを修正、微調整 %include "nasm.h" %include "grinfo.inc" externdef mdct_FPU ;直接呼ぶよう変更 ; externdef mdct externdef ca_mdct externdef cs_mdct ; l3side.hとの整合性注意 ;&III_side_info_t.gr[0].ch[0].block_type = 12*4 ;%define Offset_block_type dwsizen(12) %define Offset_block_type dwsizen(4) ; by shigeo 00/01/30 ;sizeof(gr_info) = 28*4 ;%define Size_gr_info dwsizen(28) segment_data align 16 mdct_in times 36 dd 0 segment_code ;*********************************************************************** ;void mdct_sub_FPU(L3SBS (*sb_sample), float (*mdct_freq)[2][576], int stereo, III_side_info_t *l3_side, int mode_gr); proc mdct_sub_FPU %$sb_sample arg 4 %$mdct_freq arg 4 %$stereo arg 4 %$l3_side arg 4 %$mode_gr arg 4 %$l_stereo local 4 %$l_mode_gr local 4 %$block_type local 4 %$pblock_gr local 4 %$pblock_gr_ch local 4 %$psample_gr local 4 %$psample_gr_ch local 4 %$psample_band local 4 %$penc_gr local 4 %$penc_gr_ch local 4 %$penc_band local 4 alloc pushd ebp, ebx, esi, edi .for_gr_init: mov r0, [sp(%$mode_gr)] mov r1, [sp(%$l3_side)] mov r2, [sp(%$sb_sample)] mov r3, [sp(%$mdct_freq)] add r1, Offset_block_type mov [sp(%$l_mode_gr)], r0 mov [sp(%$pblock_gr)], r1 mov [sp(%$penc_gr)], r3 .for_gr: mov [sp(%$psample_gr)], r2 .for_ch_init: mov r0, [sp(%$stereo)] mov [sp(%$pblock_gr_ch)], r1 mov [sp(%$l_stereo)], r0 .for_ch: mov r0, [r1] mov [sp(%$psample_gr_ch)], r2 mov [sp(%$penc_gr_ch)], r3 mov [sp(%$block_type)], r0 .for_band_init: mov r4, r2 ;&sample[ gr ][0][band] mov [sp(%$penc_band)], r3 ;&enc[band][0] lea r5, [mdct_in+fsizen(32)] ;&mdct_in[0]+128 mov r6, fsizen(64) jmp .for_band align 16 .for_band: lea r0, [r4+fsizen(32)] ;&sample[ gr ][1][band] lea r1, [r4+fsizen(576+32)] ;&sample[gr+1][1][band] mov r2, [r0+fsizen(-32)] mov r3, [r1+fsizen(-32)] mov [r5+fsizen(-32+ 0)], r2 mov r2, [r0] mov [r5+fsizen(-32+18)], r3 mov r3, [r1] mov [r5+fsizen(-32+ 1)], r2 mov r2, [r0+r6+fsizen(-32)] mov [r5+fsizen(-32+19)], r3 mov r3, [r1+r6+fsizen(-32)] mov [r5+fsizen(-32+ 2)], r2 mov r2, [r0+r6] mov [r5+fsizen(-32+20)], r3 mov r3, [r1+r6] mov [r5+fsizen(-32+ 3)], r2 mov r2, [r0+r6*2+fsizen(-32)] mov [r5+fsizen(-32+21)], r3 mov r3, [r1+r6*2+fsizen(-32)] mov [r5+fsizen(-32+ 4)], r2 mov r2, [r0+r6*2] mov [r5+fsizen(-32+22)], r3 mov r3, [r1+r6*2] add r0, fsizen(64)*3 mov [r5+fsizen(-32+ 5)], r2 add r1, fsizen(64)*3 mov [r5+fsizen(-32+23)], r3 mov r2, [r0+fsizen(-32)] mov r3, [r1+fsizen(-32)] mov [r5+fsizen(-32+ 6)], r2 mov r2, [r0] mov [r5+fsizen(-32+24)], r3 mov r3, [r1] mov [r5+fsizen(-32+ 7)], r2 mov r2, [r0+r6+fsizen(-32)] mov [r5+fsizen(-32+25)], r3 mov r3, [r1+r6+fsizen(-32)] mov [r5+fsizen(-32+ 8)], r2 mov r2, [r0+r6] mov [r5+fsizen(-32+26)], r3 mov r3, [r1+r6] mov [r5+fsizen(-32+ 9)], r2 mov r2, [r0+r6*2+fsizen(-32)] mov [r5+fsizen(-32+27)], r3 mov r3, [r1+r6*2+fsizen(-32)] mov [r5+fsizen(-32+10)], r2 mov r2, [r0+r6*2] mov [r5+fsizen(-32+28)], r3 mov r3, [r1+r6*2] add r0, fsizen(64)*3 mov [r5+fsizen(-32+11)], r2 add r1, fsizen(64)*3 mov [r5+fsizen(-32+29)], r3 mov r2, [r0+fsizen(-32)] mov r3, [r1+fsizen(-32)] mov [r5+fsizen(-32+12)], r2 mov r2, [r0] mov [r5+fsizen(-32+30)], r3 mov r3, [r1] mov [r5+fsizen(-32+13)], r2 mov r2, [r0+r6+fsizen(-32)] mov [r5+fsizen(-32+31)], r3 mov r3, [r1+r6+fsizen(-32)] mov [r5+fsizen(-32+14)], r2 mov r2, [r0+r6] mov [r5+fsizen(-32+32)], r3 mov r3, [r1+r6] mov [r5+fsizen(-32+15)], r2 mov r2, [r0+r6*2+fsizen(-32)] mov [r5+fsizen(-32+33)], r3 mov r3, [r1+r6*2+fsizen(-32)] mov [r5+fsizen(-32+16)], r2 mov r2, [r0+r6*2] mov [r5+fsizen(-32+34)], r3 mov r3, [r1+r6*2] mov [r5+fsizen(-32+17)], r2 mov [r5+fsizen(-32+35)], r3 ;mdct( mdct_in, &enc[band][0], block_type ); mov r2, [sp(%$block_type)] mov r1, [sp(%$penc_band)] ; mov r0, [mdct] push r2 push r1 push dword mdct_in ; call r0 call mdct_FPU add esp, 12 add r4, fsizen(1) add dword [sp(%$penc_band)], fsizen(18) lea r0, [r4+fsizen(32)] ;&sample[ gr ][1][band] lea r1, [r4+fsizen(576+32)] ;&sample[gr+1][1][band] mov [sp(%$psample_band)], r4 mov r4, 0x80000000 mov r2, [r0+fsizen(-32)] mov r3, [r1+fsizen(-32)] mov [r5+fsizen(-32+ 0)], r2 mov [r5+fsizen(-32+18)], r3 mov r2, [r0] mov r3, [r1] xor r2, r4 xor r3, r4 mov [r5+fsizen(-32+ 1)], r2 mov [r5+fsizen(-32+19)], r3 mov r2, [r0+r6+fsizen(-32)] mov r3, [r1+r6+fsizen(-32)] mov [r5+fsizen(-32+ 2)], r2 mov [r5+fsizen(-32+20)], r3 mov r2, [r0+r6] mov r3, [r1+r6] xor r2, r4 xor r3, r4 mov [r5+fsizen(-32+ 3)], r2 mov [r5+fsizen(-32+21)], r3 mov r2, [r0+r6*2+fsizen(-32)] mov r3, [r1+r6*2+fsizen(-32)] mov [r5+fsizen(-32+ 4)], r2 mov [r5+fsizen(-32+22)], r3 mov r2, [r0+r6*2] mov r3, [r1+r6*2] add r0, fsizen(64)*3 add r1, fsizen(64)*3 xor r2, r4 xor r3, r4 mov [r5+fsizen(-32+ 5)], r2 mov [r5+fsizen(-32+23)], r3 mov r2, [r0+fsizen(-32)] mov r3, [r1+fsizen(-32)] mov [r5+fsizen(-32+ 6)], r2 mov [r5+fsizen(-32+24)], r3 mov r2, [r0] mov r3, [r1] xor r2, r4 xor r3, r4 mov [r5+fsizen(-32+ 7)], r2 mov [r5+fsizen(-32+25)], r3 mov r2, [r0+r6+fsizen(-32)] mov r3, [r1+r6+fsizen(-32)] mov [r5+fsizen(-32+ 8)], r2 mov [r5+fsizen(-32+26)], r3 mov r2, [r0+r6] mov r3, [r1+r6] xor r2, r4 xor r3, r4 mov [r5+fsizen(-32+ 9)], r2 mov [r5+fsizen(-32+27)], r3 mov r2, [r0+r6*2+fsizen(-32)] mov r3, [r1+r6*2+fsizen(-32)] mov [r5+fsizen(-32+10)], r2 mov [r5+fsizen(-32+28)], r3 mov r2, [r0+r6*2] mov r3, [r1+r6*2] add r0, fsizen(64)*3 add r1, fsizen(64)*3 xor r2, r4 xor r3, r4 mov [r5+fsizen(-32+11)], r2 mov [r5+fsizen(-32+29)], r3 mov r2, [r0+fsizen(-32)] mov r3, [r1+fsizen(-32)] mov [r5+fsizen(-32+12)], r2 mov [r5+fsizen(-32+30)], r3 mov r2, [r0] mov r3, [r1] xor r2, r4 xor r3, r4 mov [r5+fsizen(-32+13)], r2 mov [r5+fsizen(-32+31)], r3 mov r2, [r0+r6+fsizen(-32)] mov r3, [r1+r6+fsizen(-32)] mov [r5+fsizen(-32+14)], r2 mov [r5+fsizen(-32+32)], r3 mov r2, [r0+r6] mov r3, [r1+r6] xor r2, r4 xor r3, r4 mov [r5+fsizen(-32+15)], r2 mov [r5+fsizen(-32+33)], r3 mov r2, [r0+r6*2+fsizen(-32)] mov r3, [r1+r6*2+fsizen(-32)] mov [r5+fsizen(-32+16)], r2 mov [r5+fsizen(-32+34)], r3 mov r2, [r0+r6*2] mov r3, [r1+r6*2] xor r2, r4 xor r3, r4 mov [r5+fsizen(-32+17)], r2 mov [r5+fsizen(-32+35)], r3 ;mdct( mdct_in, &enc[band][0], block_type ); mov r1, [sp(%$block_type)] mov r2, [sp(%$penc_band)] ; mov r0, [mdct] push r1 push r2 push dword mdct_in ; call r0 call mdct_FPU add esp, 12 .for_band_next: mov r0, [sp(%$psample_gr_ch)] mov r4, [sp(%$psample_band)] add r0, fsizen(32) add r4, fsizen(1) add dword [sp(%$penc_band)], fsizen(18) cmp r4, r0 jb near .for_band cmp r1, 2 ;r1 = [sp(%$block_type)] je near .for_alias_exit .for_alias_init: mov r0, [sp(%$penc_gr_ch)] ;&enc[band][0] add r0, fsizen(32) mov r1, ca_mdct mov r2, 31 .for_alias: fld dword [r0+fsizen(-32+17-0)] fmul dword [r1+fsizen(8+0)] fld dword [r0+fsizen(-32+18+0)] fmul dword [r1+fsizen(0)] fld dword [r0+fsizen(-32+18+0)] fmul dword [r1+fsizen(8+0)] fld dword [r0+fsizen(-32+17-0)] fmul dword [r1+fsizen(0)] fsubp st1, st0 fstp dword [r0+fsizen(-32+18+0)] faddp st1, st0 fstp dword [r0+fsizen(-32+17-0)] fld dword [r0+fsizen(-32+17-1)] fmul dword [r1+fsizen(8+1)] fld dword [r0+fsizen(-32+18+1)] fmul dword [r1+fsizen(1)] fld dword [r0+fsizen(-32+18+1)] fmul dword [r1+fsizen(8+1)] fld dword [r0+fsizen(-32+17-1)] fmul dword [r1+fsizen(1)] fsubp st1, st0 fstp dword [r0+fsizen(-32+18+1)] faddp st1, st0 fstp dword [r0+fsizen(-32+17-1)] fld dword [r0+fsizen(-32+17-2)] fmul dword [r1+fsizen(8+2)] fld dword [r0+fsizen(-32+18+2)] fmul dword [r1+fsizen(2)] fld dword [r0+fsizen(-32+18+2)] fmul dword [r1+fsizen(8+2)] fld dword [r0+fsizen(-32+17-2)] fmul dword [r1+fsizen(2)] fsubp st1, st0 fstp dword [r0+fsizen(-32+18+2)] faddp st1, st0 fstp dword [r0+fsizen(-32+17-2)] fld dword [r0+fsizen(-32+17-3)] fmul dword [r1+fsizen(8+3)] fld dword [r0+fsizen(-32+18+3)] fmul dword [r1+fsizen(3)] fld dword [r0+fsizen(-32+18+3)] fmul dword [r1+fsizen(8+3)] fld dword [r0+fsizen(-32+17-3)] fmul dword [r1+fsizen(3)] fsubp st1, st0 fstp dword [r0+fsizen(-32+18+3)] faddp st1, st0 fstp dword [r0+fsizen(-32+17-3)] fld dword [r0+fsizen(-32+17-4)] fmul dword [r1+fsizen(8+4)] fld dword [r0+fsizen(-32+18+4)] fmul dword [r1+fsizen(4)] fld dword [r0+fsizen(-32+18+4)] fmul dword [r1+fsizen(8+4)] fld dword [r0+fsizen(-32+17-4)] fmul dword [r1+fsizen(4)] fsubp st1, st0 fstp dword [r0+fsizen(-32+18+4)] faddp st1, st0 fstp dword [r0+fsizen(-32+17-4)] fld dword [r0+fsizen(-32+17-5)] fmul dword [r1+fsizen(8+5)] fld dword [r0+fsizen(-32+18+5)] fmul dword [r1+fsizen(5)] fld dword [r0+fsizen(-32+18+5)] fmul dword [r1+fsizen(8+5)] fld dword [r0+fsizen(-32+17-5)] fmul dword [r1+fsizen(5)] fsubp st1, st0 fstp dword [r0+fsizen(-32+18+5)] faddp st1, st0 fstp dword [r0+fsizen(-32+17-5)] fld dword [r0+fsizen(-32+17-6)] fmul dword [r1+fsizen(8+6)] fld dword [r0+fsizen(-32+18+6)] fmul dword [r1+fsizen(6)] fld dword [r0+fsizen(-32+18+6)] fmul dword [r1+fsizen(8+6)] fld dword [r0+fsizen(-32+17-6)] fmul dword [r1+fsizen(6)] fsubp st1, st0 fstp dword [r0+fsizen(-32+18+6)] faddp st1, st0 fstp dword [r0+fsizen(-32+17-6)] fld dword [r0+fsizen(-32+17-7)] fmul dword [r1+fsizen(8+7)] fld dword [r0+fsizen(-32+18+7)] fmul dword [r1+fsizen(7)] fld dword [r0+fsizen(-32+18+7)] fmul dword [r1+fsizen(8+7)] fld dword [r0+fsizen(-32+17-7)] fmul dword [r1+fsizen(7)] fsubp st1, st0 fstp dword [r0+fsizen(-32+18+7)] faddp st1, st0 fstp dword [r0+fsizen(-32+17-7)] .for_alias_next: add r0, fsizen(18) dec r2 jnz near .for_alias .for_alias_exit: .for_ch_next: mov r1, [sp(%$pblock_gr_ch)] mov r2, [sp(%$psample_gr_ch)] mov r3, [sp(%$penc_gr_ch)] add r1, Size_gr_info add r2, fsizen(576)*3 add r3, fsizen(576) dec dword [sp(%$l_stereo)] jnz near .for_ch .for_gr_next: mov r1, [sp(%$pblock_gr)] mov r2, [sp(%$psample_gr)] mov r3, [sp(%$penc_gr)] add r1, Size_gr_info*2 add r2, fsizen(576) add r3, fsizen(576)*2 dec dword [sp(%$l_mode_gr)] jnz near .for_gr .for_save_init: mov r0, [sp(%$sb_sample)] mov r1, r2 ;r2 = [sp(%$psample_gr)] mov r2, 18 .for_save: mov r3, [r1+fsizen(0)] mov r4, [r1+fsizen(1)] mov [r0+fsizen(0)], r3 mov r5, [r1+fsizen(2)] mov [r0+fsizen(1)], r4 mov r6, [r1+fsizen(3)] mov [r0+fsizen(2)], r5 mov r3, [r1+fsizen(4)] mov [r0+fsizen(3)], r6 mov r4, [r1+fsizen(5)] mov [r0+fsizen(4)], r3 mov r5, [r1+fsizen(6)] mov [r0+fsizen(5)], r4 mov r6, [r1+fsizen(7)] mov [r0+fsizen(6)], r5 mov r3, [r1+fsizen(8)] mov [r0+fsizen(7)], r6 mov r4, [r1+fsizen(9)] mov [r0+fsizen(8)], r3 mov r5, [r1+fsizen(10)] mov [r0+fsizen(9)], r4 mov r6, [r1+fsizen(11)] mov [r0+fsizen(10)], r5 mov r3, [r1+fsizen(12)] mov [r0+fsizen(11)], r6 mov r4, [r1+fsizen(13)] mov [r0+fsizen(12)], r3 mov r5, [r1+fsizen(14)] mov [r0+fsizen(13)], r4 mov r6, [r1+fsizen(15)] mov [r0+fsizen(14)], r5 mov r3, [r1+fsizen(16)] mov [r0+fsizen(15)], r6 mov r4, [r1+fsizen(17)] mov [r0+fsizen(16)], r3 mov r5, [r1+fsizen(18)] mov [r0+fsizen(17)], r4 mov r6, [r1+fsizen(19)] mov [r0+fsizen(18)], r5 mov r3, [r1+fsizen(20)] mov [r0+fsizen(19)], r6 mov r4, [r1+fsizen(21)] mov [r0+fsizen(20)], r3 mov r5, [r1+fsizen(22)] mov [r0+fsizen(21)], r4 mov r6, [r1+fsizen(23)] mov [r0+fsizen(22)], r5 mov r3, [r1+fsizen(24)] mov [r0+fsizen(23)], r6 mov r4, [r1+fsizen(25)] mov [r0+fsizen(24)], r3 mov r5, [r1+fsizen(26)] mov [r0+fsizen(25)], r4 mov r6, [r1+fsizen(27)] mov [r0+fsizen(26)], r5 mov r3, [r1+fsizen(28)] mov [r0+fsizen(27)], r6 mov r4, [r1+fsizen(29)] mov [r0+fsizen(28)], r3 mov r5, [r1+fsizen(30)] mov [r0+fsizen(29)], r4 mov r6, [r1+fsizen(31)] mov [r0+fsizen(30)], r5 mov [r0+fsizen(31)], r6 add r1, fsizen(32) add r0, fsizen(32) dec r2 jnz near .for_save add r1, fsizen(576*3-32*18) add r0, fsizen(576*3-32*18) dec dword [sp(%$stereo)] mov r2, 18 jnz near .for_save .exit: popd ebp, ebx, esi, edi endproc ;*********************************************************************** gogo239b/msubsse.nas100644 23421 144 53725 7220537350 13551 0ustar shigeousers ; optimized mdct() for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to Keiichi SAKAI ; 99/09/01 lameのmdct.cベースに書き換え %include "nasm.h" %include "grinfo.inc" globaldef mdct_sub_SSE externdef ca_arb externdef cs_arb externdef win_mdct externdef cos_s_mdct externdef cos_l_017_2_3 externdef cos_l_5_6_8_9 externdef cos_l11121415 externdef cos_l_1_71016 externdef cos_l_4_0 externdef cos_l_4_6 %define SBLIMIT 32 ;&III_side_info_t.gr[0].ch[0].block_type = 12*4 %define Offset_block_type dwsizen(4) ; by shigeo 00/01/30 ;sizeof(gr_info) = 28*4 ;%define Size_gr_info dwsizen(28) segment_data align 16 _MPMP dd 0,0x80000000,0,0x80000000 segment_code ;--------------------------------------------------------------------- ; 99/11/01 とりあえず作ってみた 77k[clk](cf. 94k[clk] by C func.) ; 99/11/02 mdct_SSE, arb_SSE もろとも最適化。でも遅い!76k[clk] ; 99/11/18 movupsを無くした(74k(MT), 68k(ST) ; typedef float L3SBS[2][3][18][SBLIMIT] ; static void mdct_sub_SSE(L3SBS (*sb_sample), float (*mdct_freq)[2][576], int stereo, III_side_info_t *l3_side, int mode_gr ) ;{ align 16 mdct_sub_SSE: push esi push edi push ebx push ebp ; register gr_info *cod_info; ; register float (*sample)[18][32], (*enc)[18]; ; int block_type; %define local_area 12+(18*4+4)*4 ; esp = fin = alloca(sizeof fin) sub esp,local_area lea edx,[esp+15] and dl,0xf0 ; arg %define mode_gr esp+16+local_area+20 %define l3_side esp+16+local_area+16 %define stereo esp+16+local_area+12 %define mdct_freq esp+16+local_area+8 %define sb_sample esp+16+local_area+4 ; local %define _gr esp+4+(18*4+4)*4 %define _ch esp+0+(18*4+4)*4 %define fin edx ; for ( gr = 0; gr < mode_gr; gr++ ){ xor eax,eax mov [_gr],eax jmp short .f0 align 16 .f0: .lp0: ; for ( ch = 0; ch < stereo; ch++ ){ xor eax,eax mov [_ch],eax jmp short .f1 align 16 .f1: .lp1: ; cod_info = (gr_info *) &(l3_side->gr[gr].ch[ch]) ; mov esi,[l3_side] mov ebx,[_gr] shl ebx,1 add ebx,[_ch] imul ebx,Size_gr_info ;28*4 ; 28*4 = sizeof(gr_info) ; block_type = cod_info->block_type; ; mov ecx,[esi+10*4+ebx+2*4] ; = block_type mov ecx,[esi+ebx+Offset_block_type] ; = block_type and ecx,3 ; float (*sb_sample)[2][3][18][SBLIMIT] ; sample=(*sb_sample)[ch]; imul esi,[_ch],3*18*SBLIMIT*4 add esi,[sb_sample] ; = sample imul eax,[_gr],18*SBLIMIT*4 add esi,eax ; = sample[gr] = sb_sample[0][ch][gr] ; float (*mdct_freq)[2][576] ; enc=((float (*)[2][32][18])mdct_freq)[gr][ch][0]; imul eax,[_ch],32*18*4 imul ebx,[_gr],2*32*18*4 add ebx,eax add ebx,[mdct_freq] cmp cl,2 je near .short_mdct ; esi = sample[gr], ebx = enc[0] call _long_mdct ; esi = sample[gr], ebx = enc[32] sub ebx,18*4 ; = enc[31] ; aliasing reduction butterfly ; enc=((float (*)[2][32][18])mdct_freq)[gr][ch]; movaps xmm4,[cs_arb+ 0] movaps xmm5,[cs_arb+16] movaps xmm6,[ca_arb+ 0] movaps xmm7,[ca_arb+16] mov eax,-31*18*4 jmp .f12 align 16 .lp12: movaps xmm0,[ebx+eax +14*4] shufps xmm0,xmm0,0x1B movaps xmm2,xmm0 mulps xmm0,xmm4 mulps xmm2,xmm6 movaps xmm1,[ebx+eax+18*4+ 0*4] movaps xmm3,xmm1 mulps xmm1,xmm4 mulps xmm3,xmm6 addps xmm0,xmm3 subps xmm1,xmm2 shufps xmm0,xmm0,0x1B movaps [ebx+eax +14*4],xmm0 movaps [ebx+eax+18*4+ 0*4],xmm1 movaps xmm2,[ebx+eax +10*4] shufps xmm2,xmm2,0x1B movaps xmm0,xmm2 mulps xmm2,xmm5 mulps xmm0,xmm7 movaps xmm3,[ebx+eax+18*4+ 4*4] add eax,18*4 movaps xmm1,xmm3 mulps xmm3,xmm5 mulps xmm1,xmm7 addps xmm2,xmm1 subps xmm3,xmm0 shufps xmm2,xmm2,0x1B movaps [ebx+eax-18*4+10*4],xmm2 movaps [ebx+eax + 4*4],xmm3 .f12: movlps xmm0,[ebx+eax +14*4] movhps xmm0,[ebx+eax +16*4] shufps xmm0,xmm0,0x1B movaps xmm2,xmm0 mulps xmm0,xmm4 mulps xmm2,xmm6 movlps xmm1,[ebx+eax+18*4+ 0*4] movhps xmm1,[ebx+eax+18*4+ 2*4] movaps xmm3,xmm1 mulps xmm1,xmm4 mulps xmm3,xmm6 addps xmm0,xmm3 subps xmm1,xmm2 shufps xmm0,xmm0,0x1B movlps [ebx+eax +14*4],xmm0 movhps [ebx+eax +16*4],xmm0 movlps [ebx+eax+18*4+ 0*4],xmm1 movhps [ebx+eax+18*4+ 2*4],xmm1 movlps xmm2,[ebx+eax +10*4] movhps xmm2,[ebx+eax +12*4] shufps xmm2,xmm2,0x1B movaps xmm0,xmm2 mulps xmm2,xmm5 mulps xmm0,xmm7 movlps xmm3,[ebx+eax+18*4+ 4*4] movhps xmm3,[ebx+eax+18*4+ 6*4] add eax,18*4 movaps xmm1,xmm3 mulps xmm3,xmm5 mulps xmm1,xmm7 addps xmm2,xmm1 subps xmm3,xmm0 shufps xmm2,xmm2,0x1B movlps [ebx+eax-18*4+10*4],xmm2 movhps [ebx+eax-18*4+12*4],xmm2 movlps [ebx+eax + 4*4],xmm3 movhps [ebx+eax + 6*4],xmm3 jnz near .lp12 jmp short .cont1 .short_mdct: call _short_mdct .cont1: mov eax,[_ch] inc eax cmp eax,[stereo] mov [_ch],eax jb near .lp1 ; } mov eax,[_gr] inc eax cmp eax,[mode_gr] mov [_gr],eax jb near .lp0 ; } ; Save latest granule's subband samples to be used in ; the next mdct call ; float (*sb_sample)[2][3][18][SBLIMIT] mov edi,[sb_sample] ; sample=(*sb_sample)[0]; imul eax,[mode_gr],18*SBLIMIT*4 lea esi,[edi+eax] ; = sample[mode_gr] ; for ( ch = 0; ch < stereo; ch++ ){ mov eax,[stereo] .lp3: ; for ( k = 0; k < 18; k++ ){ ; for ( band = 0; band < SBLIMIT; band++ ){ ; sample[0][k][band] = sample[mode_gr][k][band]; mov ecx,18*SBLIMIT rep movsd ; さほど悪くない ; } ; } add esi,2*18*SBLIMIT*4 ; advance pointer to the next channel add edi,2*18*SBLIMIT*4 ; advance pointer to the next channel dec eax jnz .lp3 ; } add esp,local_area pop ebp pop ebx pop edi pop esi ret ;} ; 99/07/19 SSEを使ってみた。全然速くないぅ(;_;) by K.SAKAI ; 99/07/21 思いっきり書き換えてみた。806[clk] ; 99/09/01 さらに思いっきり書き換えてみた。600[clk] ; 99/09/04 アライメントを合わせた、FPU命令最適化 530[clk] ; 99/09/07 ちょっとunrollと命令順序変更してみた。490[clk] ; 99/09/08 命令変更してみた。475[clk] ; 99/09/13 バグ修正, *ss系命令で最適化 430[clk](Thanks! URURI) ; 99/09/14 やっぱりunroll all loopした。400[clk] ; 99/09/29 register allocation を変更するも時間同じ ; 99/11/02 calling sequence 変更, mdct_subの一部を取り込む ; 99/11/18 short mdct全部書き換え、long mdctは前半を書き換え ; 99/11/20 bandに関してloop unrollingのため、全部書き換え align 16 ; while(band < 32){ _long_mdct: xor ebp,ebp ; band = 0; imul eax,ecx,4*36 add eax,win_mdct jmp short .f0 align 16 .lp0: .f0: movaps xmm7,[_MPMP] ; block_type != 2 ; even ; for ( k = 0; k < 18; k ++ ){ ; mdct_in[k ] = sample[ gr ][k][band]; ; mdct_in[k+18] = sample[gr+1][k][band]; ; } ; odd ; for ( k = 0; k < 18; k += 2 ){ ; mdct_in[k ] = sample[gr][k ][band]; ; mdct_in[k+ 1] = -sample[gr][k+ 1][band]; ; mdct_in[k+18] = sample[gr][k+18][band]; ; mdct_in[k+19] = -sample[gr][k+19][band]; ; } ; for (k=0;k<9;k++){ ; fin[k] = winp[k] * in[k] - winp[17-k] * in[17-k]; ; fin[9+k] = winp[18+k] * in[18+k] + winp[35-k] * in[35-k]; ; } ; fin[17] = winp[27] * in[27] + winp[26] * in[26]; movaps xmm0,[esi + 32*27*4 + ebp*4] xorps xmm0,xmm7 movaps xmm1,[esi + 32*26*4 + ebp*4] movaps xmm6,[eax+24*4] ; = win[27:24] movaps xmm3,xmm6 movaps xmm4,xmm6 shufps xmm3,xmm3,0xFF shufps xmm4,xmm4,0xAA mulps xmm0,xmm3 mulps xmm1,xmm4 addps xmm0,xmm1 movaps [fin+17*16],xmm0 ; fin[16] = winp[28] * in[28] + winp[25] * in[25]; movaps xmm1,[esi + 32*25*4 + ebp*4] xorps xmm1,xmm7 movaps xmm0,[esi + 32*28*4 + ebp*4] movaps xmm5,[eax+28*4] ; = win[31:28] movaps xmm3,xmm5 movaps xmm4,xmm6 shufps xmm3,xmm3,0x00 shufps xmm4,xmm4,0x55 mulps xmm0,xmm3 mulps xmm1,xmm4 addps xmm0,xmm1 movaps [fin+16*16],xmm0 ; fin[15] = winp[29] * in[29] + winp[24] * in[24]; movaps xmm0,[esi + 32*29*4 + ebp*4] xorps xmm0,xmm7 movaps xmm1,[esi + 32*24*4 + ebp*4] movaps xmm3,xmm5 shufps xmm3,xmm3,0x55 shufps xmm6,xmm6,0x00 mulps xmm0,xmm3 mulps xmm1,xmm6 addps xmm0,xmm1 movaps [fin+15*16],xmm0 ; fin[14] = winp[30] * in[30] + winp[23] * in[23]; movaps xmm1,[esi + 32*23*4 + ebp*4] xorps xmm1,xmm7 movaps xmm0,[esi + 32*30*4 + ebp*4] movaps xmm6,[eax+20*4] ; = win[23:20] movaps xmm3,xmm5 movaps xmm4,xmm6 shufps xmm3,xmm3,0xAA shufps xmm4,xmm4,0xFF mulps xmm0,xmm3 mulps xmm1,xmm4 addps xmm0,xmm1 movaps [fin+14*16],xmm0 ; fin[13] = winp[31] * in[31] + winp[22] * in[22]; movaps xmm0,[esi + 32*31*4 + ebp*4] xorps xmm0,xmm7 movaps xmm1,[esi + 32*22*4 + ebp*4] movaps xmm4,xmm6 shufps xmm5,xmm5,0xFF shufps xmm4,xmm4,0xAA mulps xmm0,xmm5 mulps xmm1,xmm4 addps xmm0,xmm1 movaps [fin+13*16],xmm0 ; fin[12] = winp[32] * in[32] + winp[21] * in[21]; movaps xmm1,[esi + 32*21*4 + ebp*4] xorps xmm1,xmm7 movaps xmm0,[esi + 32*32*4 + ebp*4] movaps xmm5,[eax+32*4] ; = win[35:32] movaps xmm3,xmm5 movaps xmm4,xmm6 shufps xmm3,xmm3,0x00 shufps xmm4,xmm4,0x55 mulps xmm0,xmm3 mulps xmm1,xmm4 addps xmm0,xmm1 movaps [fin+12*16],xmm0 ; fin[11] = winp[33] * in[33] + winp[20] * in[20]; movaps xmm0,[esi + 32*33*4 + ebp*4] xorps xmm0,xmm7 movaps xmm1,[esi + 32*20*4 + ebp*4] movaps xmm3,xmm5 shufps xmm3,xmm3,0x55 shufps xmm6,xmm6,0x00 mulps xmm0,xmm3 mulps xmm1,xmm6 addps xmm0,xmm1 movaps [fin+11*16],xmm0 ; fin[10] = winp[34] * in[34] + winp[19] * in[19]; movaps xmm1,[esi + 32*19*4 + ebp*4] xorps xmm1,xmm7 movaps xmm0,[esi + 32*34*4 + ebp*4] movaps xmm6,[eax+16*4] ; = win[19:16] movaps xmm3,xmm5 movaps xmm4,xmm6 shufps xmm3,xmm3,0xAA shufps xmm4,xmm4,0xFF mulps xmm0,xmm3 mulps xmm1,xmm4 addps xmm0,xmm1 movaps [fin+10*16],xmm0 ; fin[ 9] = winp[35] * in[35] + winp[18] * in[18]; movaps xmm0,[esi + 32*35*4 + ebp*4] xorps xmm0,xmm7 movaps xmm1,[esi + 32*18*4 + ebp*4] movaps xmm4,xmm6 shufps xmm5,xmm5,0xFF shufps xmm4,xmm4,0xAA mulps xmm0,xmm5 mulps xmm1,xmm4 addps xmm0,xmm1 movaps [fin+ 9*16],xmm0 ; fin[ 0] = winp[ 0] * in[ 0] - winp[17] * in[17]; movaps xmm1,[esi + 32*17*4 + ebp*4] xorps xmm1,xmm7 movaps xmm0,[esi + 32* 0*4 + ebp*4] movaps xmm5,[eax+ 0*4] ; = win[ 3: 0] movaps xmm3,xmm5 movaps xmm4,xmm6 shufps xmm3,xmm3,0x00 shufps xmm4,xmm4,0x55 mulps xmm0,xmm3 mulps xmm1,xmm4 subps xmm0,xmm1 movaps [fin+ 0*16],xmm0 ; fin[ 1] = winp[ 1] * in[ 1] - winp[16] * in[16]; movaps xmm0,[esi + 32* 1*4 + ebp*4] xorps xmm0,xmm7 movaps xmm1,[esi + 32*16*4 + ebp*4] movaps xmm3,xmm5 shufps xmm3,xmm3,0x55 shufps xmm6,xmm6,0x00 mulps xmm0,xmm3 mulps xmm1,xmm6 subps xmm0,xmm1 movaps [fin+ 1*16],xmm0 ; fin[ 2] = winp[ 2] * in[ 2] - winp[15] * in[15]; movaps xmm1,[esi + 32*15*4 + ebp*4] xorps xmm1,xmm7 movaps xmm0,[esi + 32* 2*4 + ebp*4] movaps xmm6,[eax+12*4] ; = win[15:12] movaps xmm3,xmm5 movaps xmm4,xmm6 shufps xmm3,xmm3,0xAA shufps xmm4,xmm4,0xFF mulps xmm0,xmm3 mulps xmm1,xmm4 subps xmm0,xmm1 movaps [fin+ 2*16],xmm0 ; fin[ 3] = winp[ 3] * in[ 3] - winp[14] * in[14]; movaps xmm0,[esi + 32* 3*4 + ebp*4] xorps xmm0,xmm7 movaps xmm1,[esi + 32*14*4 + ebp*4] movaps xmm4,xmm6 shufps xmm5,xmm5,0xFF shufps xmm4,xmm4,0xAA mulps xmm0,xmm5 mulps xmm1,xmm4 subps xmm0,xmm1 movaps [fin+ 3*16],xmm0 ; fin[ 4] = winp[ 4] * in[ 4] - winp[13] * in[13]; movaps xmm1,[esi + 32*13*4 + ebp*4] xorps xmm1,xmm7 movaps xmm0,[esi + 32* 4*4 + ebp*4] movaps xmm5,[eax+ 4*4] ; = win[ 7: 4] movaps xmm3,xmm5 movaps xmm4,xmm6 shufps xmm3,xmm3,0x00 shufps xmm4,xmm4,0x55 mulps xmm0,xmm3 mulps xmm1,xmm4 subps xmm0,xmm1 movaps [fin+ 4*16],xmm0 ; fin[ 5] = winp[ 5] * in[ 5] - winp[12] * in[12]; movaps xmm0,[esi + 32* 5*4 + ebp*4] xorps xmm0,xmm7 movaps xmm1,[esi + 32*12*4 + ebp*4] movaps xmm3,xmm5 shufps xmm3,xmm3,0x55 shufps xmm6,xmm6,0x00 mulps xmm0,xmm3 mulps xmm1,xmm6 subps xmm0,xmm1 movaps [fin+ 5*16],xmm0 ; fin[ 6] = winp[ 6] * in[ 6] - winp[11] * in[11]; movaps xmm1,[esi + 32*11*4 + ebp*4] xorps xmm1,xmm7 movaps xmm0,[esi + 32* 6*4 + ebp*4] movaps xmm6,[eax+ 8*4] ; = win[11: 8] movaps xmm3,xmm5 movaps xmm4,xmm6 shufps xmm3,xmm3,0xAA shufps xmm4,xmm4,0xFF mulps xmm0,xmm3 mulps xmm1,xmm4 subps xmm0,xmm1 movaps [fin+ 6*16],xmm0 ; fin[ 7] = winp[ 7] * in[ 7] - winp[10] * in[10]; movaps xmm0,[esi + 32* 7*4 + ebp*4] xorps xmm0,xmm7 movaps xmm1,[esi + 32*10*4 + ebp*4] movaps xmm4,xmm6 shufps xmm5,xmm5,0xFF shufps xmm4,xmm4,0xAA mulps xmm0,xmm5 mulps xmm1,xmm4 subps xmm0,xmm1 movaps [fin+ 7*16],xmm0 ; fin[ 8] = winp[ 8] * in[ 8] - winp[ 9] * in[ 9]; movaps xmm1,[esi + 32* 9*4 + ebp*4] xorps xmm1,xmm7 movaps xmm0,[esi + 32* 8*4 + ebp*4] movaps xmm3,xmm6 shufps xmm3,xmm3,0x00 shufps xmm6,xmm6,0x55 mulps xmm0,xmm3 mulps xmm1,xmm6 subps xmm0,xmm1 movaps [fin+ 8*16],xmm0 ; edx = fin, esi = sample[gr], ebp = band, eax = win, ebx = out .lp1: ; 4 data parallel x 3 ; m = 0, 17, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15 ; sum = ( fin[ 0] ) * cos_l[m][ 0]; /* 17 */ ; sum += ( fin[ 1] ) * cos_l[m][ 1]; /* 15 */ ; sum += ( fin[ 2] ) * cos_l[m][ 2]; /* 13 */ ; sum += ( fin[ 3] ) * cos_l[m][ 3]; /* 11 */ ; sum += ( fin[ 4] ) * cos_l[m][ 4]; /* 9 */ ; sum += ( fin[ 5] ) * cos_l[m][ 5]; /* 7 */ ; sum += ( fin[ 6] ) * cos_l[m][ 6]; /* 5 */ ; sum += ( fin[ 7] ) * cos_l[m][ 7]; /* 3 */ ; sum += ( fin[ 8] ) * cos_l[m][ 8]; /* 1 */ ; sum += ( fin[ 9] ) * cos_l[m][ 9]; /* 19*/ ; sum += ( fin[10] ) * cos_l[m][10]; /* 21 */ ; sum += ( fin[11] ) * cos_l[m][11]; /* 23 */ ; sum += ( fin[12] ) * cos_l[m][12]; /* 25 */ ; sum += ( fin[13] ) * cos_l[m][13]; /* 27 */ ; sum += ( fin[14] ) * cos_l[m][14]; /* 29 */ ; sum += ( fin[15] ) * cos_l[m][15]; /* 31*/ ; sum += ( fin[16] ) * cos_l[m][16]; /* 33 */ ; sum += ( fin[17] ) * cos_l[m][17]; /* 35 */ ; out[m]=sum; movss xmm2,[fin+ 0*4] movss xmm5,[fin+ 4*4] shufps xmm2,xmm2,0 shufps xmm5,xmm5,0 movaps xmm0,[cos_l_017_2_3+ 0*4] mulps xmm0,xmm2 ; = {out[ 3],out[ 2],out[17],out[ 0]} movaps xmm1,[cos_l_5_6_8_9+ 0*4] mulps xmm1,xmm2 ; = {out[ 9],out[ 8],out[ 6],out[ 5]} mulps xmm2,[cos_l11121415+ 0*4] ; = {out[15],out[14],out[12],out[11]} movaps xmm3,[cos_l_017_2_3+(0+4)*4] mulps xmm3,xmm5 movaps xmm4,[cos_l_5_6_8_9+(0+4)*4] mulps xmm4,xmm5 mulps xmm5,[cos_l11121415+(0+4)*4] addps xmm0,xmm3 ; = {out[ 3],out[ 2],out[17],out[ 0]} addps xmm1,xmm4 ; = {out[ 9],out[ 8],out[ 6],out[ 5]} addps xmm2,xmm5 ; = {out[15],out[14],out[12],out[11]} ; iteration n xmm3 xmm4 xmm5 xmm6 xmm7 %macro iteration 6 movss %2,[fin+(%1+0)*4] movss %3,[fin+(%1+4)*4] shufps %2,%2,0 shufps %3,%3,0 movaps %4,[cos_l_017_2_3+%1*4] mulps %4,%2 movaps %5,[cos_l_5_6_8_9+%1*4] mulps %5,%2 mulps %2,[cos_l11121415+%1*4] addps xmm0,%4 ; = {out[ 3],out[ 2],out[17],out[ 0]} addps xmm1,%5 ; = {out[ 9],out[ 8],out[ 6],out[ 5]} addps xmm2,%2 ; = {out[15],out[14],out[12],out[11]} movaps %6,[cos_l_017_2_3+(%1+4)*4] mulps %6,%3 movaps %4,[cos_l_5_6_8_9+(%1+4)*4] mulps %4,%3 mulps %3,[cos_l11121415+(%1+4)*4] addps xmm0,%6 ; = {out[ 3],out[ 2],out[17],out[ 0]} addps xmm1,%4 ; = {out[ 9],out[ 8],out[ 6],out[ 5]} addps xmm2,%3 ; = {out[15],out[14],out[12],out[11]} %endmacro ; 使用順 %2,%3,%4,%5,%6 ; 使用可能になる順 %5,%2,%6,%4,%3 iteration 8,xmm6,xmm7,xmm3,xmm4,xmm5 iteration 16,xmm4,xmm6,xmm5,xmm3,xmm7 iteration 24,xmm3,xmm4,xmm7,xmm5,xmm6 iteration 32,xmm5,xmm3,xmm6,xmm7,xmm4 iteration 40,xmm7,xmm5,xmm4,xmm6,xmm3 iteration 48,xmm6,xmm7,xmm3,xmm4,xmm5 iteration 56,xmm4,xmm6,xmm5,xmm3,xmm7 iteration 64,xmm3,xmm4,xmm7,xmm5,xmm6 movss [ebx+ 0*4],xmm0 movhps [ebx+ 2*4],xmm0 movlps [ebx+ 5*4],xmm1 movhps [ebx+ 8*4],xmm1 shufps xmm0,xmm0,0x55 movlps [ebx+11*4],xmm2 movhps [ebx+14*4],xmm2 movss [ebx+17*4],xmm0 add fin,4 add ebx,18*4 ; mdct_out test fin,12 jnz near .lp1 sub fin,16 add ebp,4 ; fin[ 0] = fin[ 0] + fin[ 5] + fin[15] ; fin[ 1] = fin[ 1] + fin[ 4] + fin[16] ; fin[ 2] = fin[ 2] + fin[ 3] + fin[17] movaps xmm6,[fin+ 0*16] movaps xmm1,[fin+ 1*16] movaps xmm2,[fin+ 2*16] addps xmm6,[fin+ 5*16] addps xmm1,[fin+ 4*16] addps xmm2,[fin+ 3*16] addps xmm6,[fin+15*16] addps xmm1,[fin+16*16] addps xmm2,[fin+17*16] movaps [fin+ 0*16],xmm6 movaps [fin+ 1*16],xmm1 movaps [fin+ 2*16],xmm2 ; fin[ 3] = fin[ 6] - fin[ 9] + fin[14] ; fin[ 4] = fin[ 7] - fin[10] + fin[13] ; fin[ 5] = fin[ 8] - fin[11] + fin[12] movaps xmm7,[fin+ 6*16] movaps xmm4,[fin+ 7*16] movaps xmm5,[fin+ 8*16] subps xmm7,[fin+ 9*16] subps xmm4,[fin+10*16] subps xmm5,[fin+11*16] addps xmm7,[fin+14*16] addps xmm4,[fin+13*16] addps xmm5,[fin+12*16] movaps [fin+ 3*16],xmm7 movaps [fin+ 4*16],xmm4 movaps [fin+ 5*16],xmm5 ; fin[0] = (fin[0]+fin[5]+fin[15])-(fin[1]+fin[4]+fin[16])+(fin[8]-fin[11]+fin[12]); ; fin[6] = (fin[6]-fin[9]+fin[14])-(fin[2]+fin[3]+fin[17])+(fin[7]-fin[10]+fin[13]); subps xmm6,xmm1 subps xmm7,xmm2 addps xmm6,xmm5 addps xmm7,xmm4 ; cos_l13_0 = -cos_l_4_6 ; cos_l13_6 = +cos_l_4_0 movss xmm2,[cos_l_4_0] movss xmm3,[cos_l_4_6] shufps xmm2,xmm2,0x00 shufps xmm3,xmm3,0x00 movaps xmm0,xmm2 movaps xmm1,xmm3 ; /* 4 */ ; sum = ((fin[0]+fin[5]+fin[15])-(fin[1]+fin[4]+fin[16])+(fin[8]-fin[11]+fin[12]))*cos_l[4][0]; ; sum += ((fin[6]-fin[9]+fin[14])-(fin[2]+fin[3]+fin[17])+(fin[7]-fin[10]+fin[13]))*cos_l[4][6]; ; out[4]=sum; mulps xmm2,xmm6 mulps xmm3,xmm7 addps xmm2,xmm3 movhlps xmm3,xmm2 movss [ebx-18*16+( 4+ 0)*4],xmm2 shufps xmm2,xmm2,0x55 movss [ebx-18*16+( 4+36)*4],xmm3 shufps xmm3,xmm3,0x55 movss [ebx-18*16+( 4+18)*4],xmm2 movss [ebx-18*16+( 4+54)*4],xmm3 ; /* 13 */ ; sum = ((fin[0]+fin[5]+fin[15])-(fin[1]+fin[4]+fin[16])+(fin[8]-fin[11]+fin[12]))*cos_l[13][0]; ; sum += ((fin[6]-fin[9]+fin[14])-(fin[2]+fin[3]+fin[17])+(fin[7]-fin[10]+fin[13]))*cos_l[13][6]; ; out[13]=sum; mulps xmm1,xmm6 mulps xmm0,xmm7 subps xmm0,xmm1 movhlps xmm1,xmm0 movss [ebx-18*16+(13+ 0)*4],xmm0 shufps xmm0,xmm0,0x55 movss [ebx-18*16+(13+36)*4],xmm1 shufps xmm1,xmm1,0x55 movss [ebx-18*16+(13+18)*4],xmm0 movss [ebx-18*16+(13+54)*4],xmm1 sub ebx,18*4*4 ; rewind mdct_out jmp short .lp2 align 16 .lp2: movss xmm0,[fin+ 0*16] movss xmm1,[fin+ 1*16] movss xmm2,[fin+ 2*16] movss xmm3,[fin+ 3*16] movss xmm4,[fin+ 4*16] movss xmm5,[fin+ 5*16] shufps xmm0,xmm0,0x00 shufps xmm1,xmm1,0x00 shufps xmm2,xmm2,0x00 shufps xmm3,xmm3,0x00 shufps xmm4,xmm4,0x00 shufps xmm5,xmm5,0x00 ; m = 1, 7, 10, 16 ; sum = ( fin[ 0]+fin[ 5]+fin[15] ) * cos_l[m][0]; /* mfc=15 0 */ ; sum += ( fin[ 1]+fin[ 4]+fin[16] ) * cos_l[m][1]; /* mfc= 9 1 */ ; sum += ( fin[ 2]+fin[ 3]+fin[17] ) * cos_l[m][2]; /* mfc= 3 2 */ ; sum += ( fin[ 6]-fin[ 9]+fin[14] ) * cos_l[m][6]; /* mfc=21 6 */ ; sum += ( fin[ 7]-fin[10]+fin[13] ) * cos_l[m][7]; /* mfc=27 7 */ ; sum += ( fin[ 8]-fin[11]+fin[12] ) * cos_l[m][8]; /* mfc=28 8 */ ; out[m]=sum; mulps xmm0,[cos_l_1_71016+ 0*4] mulps xmm1,[cos_l_1_71016+ 4*4] addps xmm1,xmm0 mulps xmm2,[cos_l_1_71016+ 8*4] addps xmm2,xmm1 mulps xmm3,[cos_l_1_71016+12*4] addps xmm3,xmm2 mulps xmm4,[cos_l_1_71016+16*4] addps xmm4,xmm3 mulps xmm5,[cos_l_1_71016+20*4] addps xmm5,xmm4 ; = {out[16], out[10], out[ 7], out[ 1]} movhlps xmm3,xmm5 movss [ebx+ 1*4],xmm5 shufps xmm5,xmm5,0x55 movss [ebx+10*4],xmm3 shufps xmm3,xmm3,0x55 movss [ebx+ 7*4],xmm5 movss [ebx+16*4],xmm3 add fin,4 add ebx,18*4 ; mdct_out test fin,12 jnz near .lp2 sub fin,16 cmp ebp,32 jb near .lp0 ; } ; end of while(band < 32) ret ; block_type == 2 ; esi = sample[gr], ebp = band, ebx = out, eax = cos_s_mdct ; eax, ebp, xmm: destoy ; ebx: advanced to the last band ; ecx, edx, esi, edi: unchanged ; even ; for ( k = 0; k < 18; k ++ ){ ; mdct_in[k ] = sample[ gr ][k][band]; ; mdct_in[k+18] = sample[gr+1][k][band]; ; } ; for ( m = 0; m < 6; m++ ){ ; for ( k = 0; k < 12; k++ ){ ; sum += {in[k+18],in[k+12],in[k+ 6]} * {3{cos_s_mdct[m][k]}}; ; } ; out[3*m+2:3*m+0] = sum; ; } ; odd ; for ( k = 0; k < 18; k += 2 ){ ; mdct_in[k ] = sample[ gr ][k][band]; ; mdct_in[k+18] = sample[gr+1][k][band]; ; mdct_in[k+ 1] = -sample[ gr ][k+1][band]; ; mdct_in[k+19] = -sample[gr+1][k+1][band]; ; } ; for ( m = 0; m < 6; m++ ){ ; for ( k = 0; k < 12; k++ ){ ; sum += {in[k+18],in[k+12],in[k+ 6]} * {3{cos_s_mdct[m][k]}}; ; } ; out[3*m+2:3*m+0] = sum; ; } ; bandに関してloop unrolling ; for ( band = 0; band < 32; band+=4 ) { align 16 _short_mdct: xor ebp,ebp .lp0: mov eax,cos_s_mdct jmp short .lp1 align 16 .lp1: movss xmm0,[eax + 0*4] ; cos_s_mdct[m][ 0] shufps xmm0,xmm0,0 movss xmm3,[eax + 6*4] ; cos_s_mdct[m][ 6] shufps xmm3,xmm3,0 movaps xmm5,[esi + 32*12*4 + ebp*4] movaps xmm6,xmm5 mulps xmm6,xmm0 mulps xmm5,xmm3 movaps xmm2,[esi + 32*18*4 + ebp*4] movaps xmm7,xmm2 mulps xmm7,xmm0 mulps xmm2,xmm3 addps xmm6,xmm2 mulps xmm0,[esi + 32* 6*4 + ebp*4] addps xmm5,xmm0 mulps xmm3,[esi + 32*24*4 + ebp*4] addps xmm7,xmm3 %macro short_mdct_quad_body 1 %if (%1 % 2) movaps xmm4,[_MPMP] %endif movss xmm0,[eax + %1*4] ; cos_s_mdct[m][ %1] shufps xmm0,xmm0,0 %if (%1 % 2) xorps xmm0,xmm4 %endif movss xmm3,[eax + (%1+ 6)*4] ; cos_s_mdct[m][(%1+ 6)] shufps xmm3,xmm3,0 %if (%1 % 2) xorps xmm3,xmm4 %endif movaps xmm1,[esi + 32*(%1+12)*4 + ebp*4] movaps xmm4,xmm1 mulps xmm4,xmm0 addps xmm6,xmm4 mulps xmm1,xmm3 addps xmm5,xmm1 movaps xmm2,[esi + 32*(%1+18)*4 + ebp*4] movaps xmm4,xmm2 mulps xmm4,xmm0 addps xmm7,xmm4 mulps xmm2,xmm3 addps xmm6,xmm2 mulps xmm0,[esi + 32*(%1+ 6)*4 + ebp*4] addps xmm5,xmm0 mulps xmm3,[esi + 32*(%1+24)*4 + ebp*4] addps xmm7,xmm3 %endmacro short_mdct_quad_body 1 short_mdct_quad_body 2 short_mdct_quad_body 3 short_mdct_quad_body 4 short_mdct_quad_body 5 movaps xmm4,xmm5 unpcklps xmm4,xmm6 unpckhps xmm5,xmm6 movlps [ebx+ 0*4],xmm4 movhps [ebx+18*4+0*4],xmm4 movhlps xmm2,xmm7 movss [ebx+ 2*4],xmm7 movss [ebx+36*4+2*4],xmm2 movlps [ebx+36*4+0*4],xmm5 movhps [ebx+54*4+0*4],xmm5 shufps xmm7,xmm7,00111001B movhlps xmm3,xmm7 movss [ebx+18*4+2*4],xmm7 movss [ebx+54*4+2*4],xmm3 add eax,12*4 add ebx,3*4 cmp eax,cos_s_mdct+12*6*4 jl near .lp1 add ebp,4 ; band += 4 add ebx,54*4 cmp ebp,32 jb near .lp0 ; } ; end of while(band < 32) ret end gogo239b/msubtbl.nas100644 23421 144 733 7220537350 13467 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to URURI ; 99/10/10 作成 %include "nasm.h" globaldef mdct globaldef ca_mdct globaldef cs_mdct segment_data align 16 ca_mdct dd 0xbf03b5ff, 0xbef186db, 0xbea07303, 0xbe3a4774 dd 0xbdc1b01d, 0xbd27cb87, 0xbc68a11d, 0xbb727b46 cs_mdct dd 0x3f5b84a8, 0x3f61b9d8, 0x3f731add, 0x3f7bba81 dd 0x3f7eda41, 0x3f7fc8fd, 0x3f7ff965, 0x3f7fff8d mdct dd 0 ;関数ポインタ segment_code end gogo239b/common.c100644 23421 144 11036 7220537347 13014 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * modified by PEN@MarineCat */ #include #include #include #include #include "common.h" #include "musenc.h" static const int freq_table[][3] = { {22050, 24000, 16000}, {44100, 48000, 32000} }; static const int bitrate_table[2][15] = { {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160}, {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; /* getframebits のテーブル化 */ /* 最初に呼ばれるので freq_kHz を gl.enc_freqHz に変更することなどは出来ない */ int bitsPerFrame_table[15][2]; //初期化不要 int mean_bits_table[15][2]; //初期化不要 static void old_getframebits(int *bitsPerFrame, int *mean_bits, int rate_idx, int padding){ static const float freqHzTbl[][3] = { {22.05, 24, 16}, {44.1, 48, 32} }; /* かっこわるい */ int whole_SpF; float bit_rate, freq_kHz; int sideinfo_len; /* DON'T CHANGE this `freq_kHz' to gl.enc_freqHz */ freq_kHz = freqHzTbl[gl.version][gl.freq_idx]; bit_rate = bitrate_table[gl.version][rate_idx]; /* determine the mean bitrate for main data */ sideinfo_len = 32; if( gl.version == 1 ){ /* MPEG 1 */ sideinfo_len += ( gl.stereo == 1 ) ? 136 : 256; }else{ /* MPEG 2 */ sideinfo_len += ( gl.stereo == 1 ) ? 72 : 136; } whole_SpF = (gl.frameSize / freq_kHz) * (bit_rate / 8.0); *bitsPerFrame = 8 * (whole_SpF + padding); *mean_bits = (*bitsPerFrame - sideinfo_len) / gl.mode_gr; } void framebitstable_init(void){ struct GLOBAL_VAR keep_gl; int br; int padding; keep_gl = gl; for( br = 0; br < 15; br++ ){ for( padding = 0; padding < 2; padding++ ){ old_getframebits( &bitsPerFrame_table[br][padding], &mean_bits_table[br][padding], br, padding); } } gl = keep_gl; } int get_rate_idx(int rate_kbps,int version){ int i; for(i = 0; i < 15; i++){ if(bitrate_table[version][i] == rate_kbps) return i; } fprintf(stderr, "bitrate err:rate=%d, ver=%d\n", rate_kbps, version); return -1; } int get_freq_idx(int freqHz, int *version){ int idx, id; for(id = 0; id < 2; id++){ for(idx = 0; idx < 3; idx++){ if(freqHz == freq_table[id][idx]){ *version = id;/* = (LSF) ? 0 : 1 */ return idx; } } } return -1; } int NormalizeSmpFreq(long freqHz) { int nDist = 0x7fff; int nIndex = -1; int i, ld; int *tbl = (int *)freq_table; for(i = 0; i < sizeof(freq_table) / sizeof(freq_table[0][0]); i++){ ld = abs(tbl[i] - freqHz); if(nDist > ld){ nDist = ld; nIndex = i; } } return tbl[nIndex]; } /* * メモリをsize byteだけ確保してそのポインタを返す * 0で埋めない * 確保に失敗した時はexit(1)を実行する */ void *mem_alloc(unsigned long size, char *item){ void *ptr; ptr = (void *)calloc(size, 1); if( ptr == NULL ){ fprintf(stderr,"malloc err [%d]byte.\n",(int)size); TERM( ME_NOMEMORY ); } return ptr; } /* *ptrで確保されたメモリを開放する *ptrはNULLになる */ void mem_free(void **ptr){ free( *ptr ); *ptr = NULL; } /* 開放し忘れのメモリが無いか調べる */ void memFreeChk(void){ } /* RIFF_DATA_CHUNK */ struct CK_RIFF { long chunk; /* "RIFF" */ long size; /* sizeof "RIFF" */ } ; struct CK_FMT { long chunk; /* "WAVE" */ long form; /* "fmt " */ long size; /* 16 */ short formatID; /* 1 = RAW WAVE */ short num_of_channel; /* 1 or 2 */ long srate; /* 44100 etc. */ long avg_bytes_par_sec; /* freq * elementsize */ short block_size; /* byte per element */ short bits_par_sample; /* 16 */ } ; struct CK_DATA { long chunk; /* "DATA" */ long size; /* sizeof "DATA" */ } ; struct CK_WAVE { struct CK_RIFF riff; struct CK_FMT fmt; } ; int WAV_checkFMT(FILE *fp, int *size, int *bit, int *freq, int *channel) { struct CK_WAVE wav; char prevbuf[8]; int i, c; *size = *freq = *channel = 0; if( fp == NULL ) return FALSE; /* because we can't use fread() in stdin-mode */ for( i = 0; i < sizeof( wav ); i++ ){ c = fgetc( fp ); if( c == EOF )return FALSE; *( ((char *)&wav) + i ) = c; } if( memcmp( &wav.riff.chunk, "RIFF", 4) ) return FALSE; if( memcmp( &wav.fmt.chunk, "WAVEfmt ", 8) ) return FALSE; if( wav.fmt.formatID != 1 ) return FALSE; memset( prevbuf, 0, sizeof(prevbuf) ); do{ memcpy( prevbuf, prevbuf+1, sizeof(prevbuf) - 1); c = fgetc( fp ); if( c == EOF ) return FALSE; prevbuf[sizeof(prevbuf)-1] = c; }while( memcmp( prevbuf, "data", 4 ) ); /* ↑ここでprevbuf='data...'(...はDWORDでdataチャンクのサイズ)となる */ *size = *(unsigned int *)( prevbuf + 4 ); *freq = wav.fmt.srate; *bit = wav.fmt.bits_par_sample; *channel = wav.fmt.num_of_channel; return TRUE; } gogo239b/musenc.h100644 23421 144 33334 7220537350 13022 0ustar shigeousers/* -*- TABSIZE = 4 -*- */ /* * for new GOGO-no-coda ( 2000/1/15 ) * Copyright (C)1999,2000 PEN@MarineCat */ #ifndef __MUSUI_H__ #define __MUSUI_H__ #include typedef signed int MERET; #ifndef __os2__ typedef unsigned long MPARAM; #else typedef unsigned long MUPARAM; #endif typedef unsigned long UPARAM; #ifdef GOGO_DLL_EXPORTS #define EXPORT __declspec(dllexport) __cdecl #define EXPORT_VB __declspec(dllexport) __stdcall #else #define EXPORT #define EXPORT_VB #endif #define ME_NOERR (0) // return normally;正常終了 #define ME_EMPTYSTREAM (1) // stream becomes empty;ストリームが最後に達した #define ME_HALTED (2) // stopped by user;(ユーザーの手により)中断された #define ME_MOREDATA (3) #define ME_INTERNALERROR (10) // internal error; 内部エラー #define ME_PARAMERROR (11) // parameters error;設定でパラメーターエラー #define ME_NOFPU (12) // no FPU;FPUを装着していない!! #define ME_INFILE_NOFOUND (13) // can't open input file;入力ファイルを正しく開けない #define ME_OUTFILE_NOFOUND (14) // can't open output file;出力ファイルを正しく開けない #define ME_FREQERROR (15) // frequency is not good;入出力周波数が正しくない #define ME_BITRATEERROR (16) // bitrate is not good;出力ビットレートが正しくない #define ME_WAVETYPE_ERR (17) // WAV format is not good;ウェーブタイプが正しくない #define ME_CANNOT_SEEK (18) // can't seek;正しくシーク出来ない #define ME_BITRATE_ERR (19) // only for compatibility;ビットレート設定が正しくない #define ME_BADMODEORLAYER (20) // mode/layer not good;モード・レイヤの設定異常 #define ME_NOMEMORY (21) // fail to allocate memory;メモリアローケーション失敗 #define ME_CANNOT_SET_SCOPE (22) // thread error;スレッド属性エラー(pthread only) #define ME_CANNOT_CREATE_THREAD (23) // fail to create thear;スレッド生成エラー #define ME_WRITEERROR (24) // lock of capacity of disk;記憶媒体の容量不足 // definition of call-back function for user;ユーザーのコールバック関数定義 typedef MERET (*MPGE_USERFUNC)(void *buf, unsigned long nLength ); #define MPGE_NULL_FUNC (MPGE_USERFUNC)NULL // for HighC /////////////////////////////////////////////////////////////////////////// // Configuration /////////////////////////////////////////////////////////////////////////// // for INPUT #define MC_INPUTFILE (1) // para1 choice of input device #define MC_INPDEV_FILE (0) // input device is file;入力デバイスはファイル #define MC_INPDEV_STDIO (1) // stdin;入力デバイスは標準入力 #define MC_INPDEV_USERFUNC (2) // defined by user;入力デバイスはユーザー定義 // para2 (必要であれば)ファイル名。ポインタを指定する // メモリよりエンコードの時は以下の構造体のポインタを指定する. struct MCP_INPDEV_USERFUNC { MPGE_USERFUNC pUserFunc; // pointer to user-function for call-back or MPGE_NULL_FUNC if none // コールバック対象のユーザー関数。未定義時MPGE_NULL_FUNCを代入 unsigned int nSize; // size of file or MC_INPDEV_MEMORY_NOSIZE if unknown // ファイルサイズ。不定の時は MC_INPDEV_MEMORY_NOSIZEを指定 int nBit; // nBit = 8 or 16 ; PCMビット深度を指定 int nFreq; // input frequency ; 入力周波数の指定 int nChn; // number of channel(1 or 2) ; チャネル数 }; #define MC_INPDEV_MEMORY_NOSIZE (0xffffffff) /* Using userfunction input; ユーザー関数利用時の挙動 ^^^^^^^^^^^^^^^^^^^^^^^^ ユーザーが登録した関数 UsefFuncに対して、DLLより読み込み要求が行われる。 MERET UserFunc_input(void *buf, unsigned long nLength ); 要求を処理する際に ・void *buf には nLength バイト分のデータを格納、 return ME_NOERRで抜ける ・ファイルの最後に達して、nLength分読み込めない(かつ少なくとも1バイト以上読み込める)場合、 memset( buf + 読み込んだデータbyte, 0, nLength - 読み込んだデータサイズ) ; として return ME_NOERR する。 ・1バイトも読めない場合は、何もせず return ME_EMPTYSTREAM; で抜ける */ /////////////////////////////////////////////////////////////////////////// // for OUTPUT ( now stdout is not support ) #define MC_OUTPUTFILE (2) // para1 choice of output device #define MC_OUTDEV_FILE (0) // output device is file;出力デバイスはファイル #define MC_OUTDEV_STDOUT (1) // stdout; 出力デバイスは標準出力 #define MC_OUTDEV_USERFUNC (2) // defined by user;出力デバイスはユーザー定義 #define MC_OUTDEV_USERFUNC_WITHVBRTAG (3) // defined by user;入力デバイスはユーザー定義/VBRタグ書き出し // para2 pointer to file if necessary ;(必要であれば)ファイル名。ポインタ指定 /* Using userfunction output ユーザー関数利用時の挙動 ^^^^^^^^^^^^^^^^^^^^^^^^ ユーザーが登録した関数 UsefFuncに対して、DLLより書込み要求が行われる。 MERET UserFunc_output(void *buf, unsigned long nLength ); 要求を処理する際に ・void *buf には nLength バイト分のデータが格納されているので fwrite( buf, 1, nLength, fp );の様にして書き出しreturn ME_NOERRで抜ける. 書き出しに失敗した時は、return ME_WRITEERROR;で抜ける. ・最後に buf == NULLで1度呼び出される. return 値は何でも良い。 (MC_OUTDEV_USERFUNC_WITHVBRTAGで登録した際には、以下の挙動が追加される) ・もう一度buf == NULLで呼び出される.この際にファイルの先頭へシークし、 ファイル全体のサイズを returnの値とする。filesize<=0の時は終了。 (誤って return ME_NOERR; で抜けない様に注意!! ) ・XING-VBRタグデータが bufに、XINGVBRタグのサイズが nLengthに格納されて呼び出される. ・最後にもう一度buf == NULLで呼び出される. */ /////////////////////////////////////////////////////////////////////////// // mode of encoding ;エンコードタイプ #define MC_ENCODEMODE (3) // para1 mode;モード設定 #define MC_MODE_MONO (0) // mono;モノラル #define MC_MODE_STEREO (1) // stereo;ステレオ #define MC_MODE_JOINT (2) // joint-stereo;ジョイント #define MC_MODE_MSSTEREO (3) // mid/side stereo;ミッドサイド #define MC_MODE_DUALCHANNEL (4) // dual channel;デュアルチャネル /////////////////////////////////////////////////////////////////////////// // bitrate;ビットレート設定 #define MC_BITRATE (4) // para1 bitrate;ビットレート 即値指定 /////////////////////////////////////////////////////////////////////////// // frequency of input file (force);入力で用いるサンプル周波数の強制指定 #define MC_INPFREQ (5) // para1 frequency;入出力で用いるデータ /////////////////////////////////////////////////////////////////////////// // frequency of output mp3 (force);出力で用いるサンプル周波数の強制指定 #define MC_OUTFREQ (6) // para1 frequency;入出力で用いるデータ /////////////////////////////////////////////////////////////////////////// // size ofheader if you ignore WAV-header (for example cda);エンコード開始位置の強制指定(ヘッダを無視する時) #define MC_STARTOFFSET (7) /////////////////////////////////////////////////////////////////////////// // psycho-acoustics ON/OFF;心理解析 ON/OFF #define MC_USEPSY (8) // PARA1 boolean(TRUE/FALSE) /////////////////////////////////////////////////////////////////////////// // 16kHz low-pass filter ON/OFF;16KHz低帯域フィルタ ON/OFF #define MC_USELPF16 (9) // PARA1 boolean(TRUE/FALSE) /////////////////////////////////////////////////////////////////////////// // use special UNIT, para1:boolean; ユニット指定 para1:BOOL値 #define MC_USEMMX (10) // MMX #define MC_USE3DNOW (11) // 3DNow! #define MC_USEKNI (12) // SSE(KNI) #define MC_USEE3DNOW (13) // Enhanced 3D Now! #define MC_USESPC1 (14) // special switch for debug #define MC_USESPC2 (15) // special switch for debug /////////////////////////////////////////////////////////////////////////// // addition of TAG; ファイルタグ情報付加 #define MC_ADDTAG (16) // dwPara1 length of TAG;タグ長 // dwPara2 pointer to TAG;タグデータのポインタ /////////////////////////////////////////////////////////////////////////// // emphasis;エンファシスタイプの設定 #define MC_EMPHASIS (17) // para1 type of emphasis;エンファシスタイプの設定 #define MC_EMP_NONE (0) // no empahsis;エンファシスなし(dflt) #define MC_EMP_5015MS (1) // 50/15ms ;エンファシス50/15ms #define MC_EMP_CCITT (3) // CCITT ;エンファシスCCITT /////////////////////////////////////////////////////////////////////////// // use VBR;VBRタイプの設定 #define MC_VBR (18) /////////////////////////////////////////////////////////////////////////// // SMP support para1: interger #define MC_CPU (19) /////////////////////////////////////////////////////////////////////////// // for RAW-PCM; 以下4つはRAW-PCMの設定のため // byte swapping for 16bitPCM; PCM入力時のlow, high bit 変換 #define MC_BYTE_SWAP (20) /////////////////////////////////////////////////////////////////////////// // for 8bit PCM #define MC_8BIT_PCM (21) /////////////////////////////////////////////////////////////////////////// // for mono PCM #define MC_MONO_PCM (22) /////////////////////////////////////////////////////////////////////////// // for Towns SND #define MC_TOWNS_SND (23) /////////////////////////////////////////////////////////////////////////// // BeOS & Win32 Encode thread priority #define MC_THREAD_PRIORITY (24) // (WIN32) dwPara1 MULTITHREAD Priority (THREAD_PRIORITY_**** at WinBASE.h ) /////////////////////////////////////////////////////////////////////////// // BeOS Read thread priority //#if defined(USE_BTHREAD) #define MC_READTHREAD_PRIORITY (25) //#endif /////////////////////////////////////////////////////////////////////////// // output format #define MC_OUTPUT_FORMAT (26) // para1 #define MC_OUTPUT_NORMAL (0) // mp3+TAG(see MC_ADDTAG) #define MC_OUTPUT_RIFF_WAVE (1) // RIFF/WAVE #define MC_OUTPUT_RIFF_RMP (2) // RIFF/RMP /////////////////////////////////////////////////////////////////////////// // LIST/INFO chunk of RIFF/WAVE or RIFF/RMP #define MC_RIFF_INFO (27) // para1 size of info(include info name) // para2 pointer to info // byte offset contents // 0..3 info name // 4..size of info-1 info /////////////////////////////////////////////////////////////////////////// // verify and overwrite #define MC_VERIFY (28) /////////////////////////////////////////////////////////////////////////// // output directory #define MC_OUTPUTDIR (29) /////////////////////////////////////////////////////////////////////////// // VBRの最低/最高ビットレートの設定 #define MC_VBRBITRATE (30) // para1 最低ビットレート (kbps) // para2 最高ビットレート (kbps) /////////////////////////////////////////////////////////////////////////// // 拡張フィルタの使用 LPF1, LPF2 #define MC_ENHANCEDFILTER (31) // para1 LPF1 (0-100) , dflt=auto setting by outfreq // para2 LPF2 (0-100) , dflt=auto setting by outfreq /////////////////////////////////////////////////////////////////////////// // Joint-stereoにおける、ステレオ/MSステレオの切り替えの閾値 #define MC_MSTHRESHOLD (32) // para1 threshold (0-100) , dflt=auto setting by outfreq // para2 mspower (0-100) , dflt=auto setting by outfreq /////////////////////////////////////////////////////////////////////////// // Language #define MC_LANG (33) // t_lang defined in message.h /////////////////////////////////////////////////////////////////////////// // 読み込みデータの最大サイズ設定 / max data length ( byte ) #define MC_MAXFILELENGTH (34) // para1 maxfilesize (PCM body length, not include wave heaher size.) // (0-0xfffffffd) // as byte #define MC_MAXFLEN_IGNORE (ULONG_MAX) // DEFAULT #define MC_MAXFLEN_WAVEHEADER (ULONG_MAX-1) // WAVEヘッダの値を使用 /////////////////////////////////////////////////////////////////////////// // 出力ストリームのバッファリングフラグ #define MC_OUTSTREAM_BUFFERD (35) // para1 enable(=1) or disable(=0), dflt=enable #define MC_OBUFFER_ENABLE 1 // DEFAULT #define MC_OBUFFER_DISABLE 0 MERET EXPORT MPGE_initializeWork(); #ifndef __os2__ MERET EXPORT MPGE_setConfigure(MPARAM mode, UPARAM dwPara1, UPARAM dwPara2 ); MERET EXPORT MPGE_getConfigure(MPARAM mode, void *para1 ); #else MERET EXPORT MPGE_setConfigure(MUPARAM mode, UPARAM dwPara1, UPARAM dwPara2 ); MERET EXPORT MPGE_getConfigure(MUPARAM mode, void *para1 ); #endif MERET EXPORT MPGE_detectConfigure(); #ifdef USE_BETHREAD MERET EXPORT MPGE_processFrame(int *frameNum); #else MERET EXPORT MPGE_processFrame(); #endif MERET EXPORT MPGE_closeCoder(); MERET EXPORT MPGE_endCoder(); MERET EXPORT MPGE_getUnitStates( unsigned long *unit ); MERET EXPORT MPGE_processTrack(int *frameNum); // This function is effective for gogo.dll;このファンクションはDLLバージョンのみ有効 MERET EXPORT MPGE_getVersion( unsigned long *vercode, char *verstring ); // vercode = 0x125 -> version 1.25 // verstring -> "ver 1.25 1999/09/25" (allocate abobe 260bytes buffer) //////////////////////////////////////////////////////////////////////////// // for getting configuration //////////////////////////////////////////////////////////////////////////// #define MG_INPUTFILE (1) // name of input file ;入力ファイル名取得 #define MG_OUTPUTFILE (2) // name of output file;出力ファイル名取得 #define MG_ENCODEMODE (3) // type of encoding ;エンコードモード #define MG_BITRATE (4) // bitrate ;ビットレート #define MG_INPFREQ (5) // input frequency ;入力周波数 #define MG_OUTFREQ (6) // output frequency ;出力周波数 #define MG_STARTOFFSET (7) // offset of input PCM;スタートオフセット #define MG_USEPSY (8) // psycho-acoustics ;心理解析を使用する/しない #define MG_USEMMX (9) // MMX #define MG_USE3DNOW (10) // 3DNow! #define MG_USEKNI (11) // SSE(KNI) #define MG_USEE3DNOW (12) // Enhanced 3DNow! #define MG_USESPC1 (13) // special switch for debug #define MG_USESPC2 (14) // special switch for debug #define MG_COUNT_FRAME (15) // amount of frame #define MG_NUM_OF_SAMPLES (16) // number of sample for 1 frame;1フレームあたりのサンプル数 #define MG_MPEG_VERSION (17) // MPEG VERSION #define MG_READTHREAD_PRIORITY (18) // thread priority to read for BeOS #endif /* __MUSUI_H__ */ gogo239b/musui.c100644 23421 144 63031 7220537350 12662 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999, 2000 PEN@MarineCat, shigeo, sakai * * 99/01/18 Linuxで標準入力対応 * 99/03/02 ロングファイル名対応 * 99/03/18 インターフェイス分離 * 99/09/07 -skipオプションを廃止し、WAV_checkFMT()で自動判別 * 99/09/11 正式公開 & ソース公開 * 99/09/26 公開やり直しのためもろもろ修正 * 99/10/03 -e {n,c,5} エンファシスオプション追加 * 99/10/07 MT化beta, VBR-beta * 99/11/04 RAW-PCM対応のためoffsetとbswapオプション追加 * 99/11/09 detele option by Steve * 99/11/20 stdin for WinNT * 00/01/18 lame3.55 VBR partially * 00/03/23 MPGE_processTrack新設 */ #include "common.h" #include "musenc.h" #include "haveunit.h" #include "message.h" #ifdef WIN32 #include #include #include #ifdef USE_8HZ #error "Can't use USE_8HZ" #endif /* USE_8HZ */ #endif /* WIN32 */ #include #include #if defined(DISPLAY_REALTIME) #include #include #else #include #endif #include #include #ifndef __unix__ #include #endif #if defined(__linux__) || defined(__FreeBSD__) #include #include #endif #ifndef _WINDOWS /* Win GUI以外ではdebug変数を使う */ extern int debug; #else static int debug = 0; #endif /* 実時間表示に変更するときは定義する */ //#define DISPLAY_REALTIME static int silentFlag = 0; static int deleteFlag = 0; static int testmodeFlag = 0; static int enc_testtime = 0; static char szInName[MAX_FILE_LEN], szOutName[MAX_FILE_LEN]; /* * エラー表示 */ void disp_err( const char *mesg, ... ) { char bufs[1024]; va_list vlist; va_start( vlist, mesg ); vsprintf( bufs, mesg, vlist ); fputs( bufs, stderr ); va_end( vlist ); } static void usage(void){ fprintf(stderr, getMsg( MSG_help1 ) ); fprintf(stderr, getMsg( MSG_help2 ) ); fprintf(stderr, getMsg( MSG_help3 ) ); fprintf(stderr, getMsg( MSG_help4 ) ); fprintf(stderr, getMsg( MSG_help5 ) ); fprintf(stderr, getMsg( MSG_help6 ) ); fprintf(stderr, getMsg( MSG_help7 ) ); fprintf(stderr, getMsg( MSG_help8 ) ); fprintf(stderr, getMsg( MSG_help9 ) ); fprintf(stderr, getMsg( MSG_help10 ) ); fprintf(stderr, getMsg( MSG_help11 ) ); fprintf(stderr, getMsg( MSG_help12 ) ); #ifdef USE_VBR fprintf(stderr, getMsg( MSG_help13 ) ); #endif #ifdef RAW_INPUT fprintf(stderr, getMsg( MSG_help14 ) ); fprintf(stderr, getMsg( MSG_help15 ) ); fprintf(stderr, getMsg( MSG_help16 ) ); fprintf(stderr, getMsg( MSG_help17 ) ); fprintf(stderr, getMsg( MSG_help18 ) ); fprintf(stderr, getMsg( MSG_help19 ) ); #ifdef __HIGHC__ fprintf(stderr, getMsg( MSG_help20 ) ); #endif #endif #if defined(USE_PTHREAD) || defined(USE_BTHREAD) || defined(USE_WINTHREAD) || defined(USE_OS2THREAD) fprintf(stderr, getMsg( MSG_help21 ) ); #endif #ifdef BeOS fprintf(stderr, getMsg( MSG_help22 ) ); #if defined(USE_BTHREAD) fprintf(stderr, getMsg( MSG_help23 ) ); #endif #endif fprintf(stderr, getMsg( MSG_help24 ) ); fprintf(stderr, getMsg( MSG_help25 ) ); fprintf(stderr, getMsg( MSG_help26 ) ); fprintf(stderr, getMsg( MSG_help27 ) ); fprintf(stderr, getMsg( MSG_help28 ) ); fprintf(stderr, getMsg( MSG_help29 ) ); fprintf(stderr, getMsg( MSG_help30 ) ); fprintf(stderr, getMsg( MSG_help31 ) ); fprintf(stderr, getMsg( MSG_help33 ) ); /* lang */ #ifdef WIN32 fprintf(stderr, getMsg( MSG_help32 ) ); #endif } /* * MS-DOSファイル名をロングファイル名に * もとファイルが存在しない場合は ERR を返す * WIN32が定義されていなければ何もしない */ #define isKANJI1(x) ((unsigned char)((x^0x20)-0xA1)<=0x3B) static int convertToLongFileName(char *fname, const int max_len ) { #ifndef WIN32 return NOERR; #else LPHANDLE hdl; WIN32_FIND_DATA info; int i,j; hdl = FindFirstFile( fname, &info ); if( hdl == INVALID_HANDLE_VALUE ) return ERR; if( !*info.cFileName ){ FindClose( hdl ); return ERR; } i = ( fname[1] == ':' ) ? 2 : 0; /* ドライブの分 */ j = i - 1; while( i < strlen( fname ) ){ #ifdef JAPANESE_SPC if( isKANJI1( fname[i] ) ){ i++; }else #endif { if( fname[i] == '\\' ) j = i; } i++; } fname[j+1] = NUL; /* path名を取り出す */ if( strlen( fname ) + strlen( info.cFileName ) >= max_len ) return ERR; strcat( fname, info.cFileName ); /* フルパスにする */ if( debug ) fprintf( stderr, "long file name : %s\n", fname ); FindClose( hdl ); return NOERR; #endif /* WIN32 */ } //#undef isKANJI1 /* * CPU情報表示 */ static void put_statUNIT(void){ unsigned long statUNIT; MPGE_getUnitStates( &statUNIT );// statUNIT = haveUNIT(); if( statUNIT & tFAMILY4 )fprintf(stderr,"familiy 4:"); if( statUNIT & tFAMILY5 )fprintf(stderr,"familiy 5:"); if( statUNIT & tFAMILY6 )fprintf(stderr,"familiy 6(or over):"); fprintf(stderr,"vendor "); if( statUNIT & tINTEL )fprintf(stderr,"Intel\n"); else if( statUNIT & tAMD )fprintf(stderr,"AMD\n"); else if( statUNIT & tCYRIX )fprintf(stderr,"Cyrix\n"); else if( statUNIT & tIDT )fprintf(stderr,"IDT\n"); else fprintf(stderr,"unkown\n"); fprintf(stderr,"extended instruction - "); if( statUNIT & tMMX )fprintf(stderr,"MMX "); if( statUNIT & tCMOV )fprintf(stderr,"CMOV "); if( statUNIT & t3DN )fprintf(stderr,"3D Now! "); if( statUNIT & tE3DN)fprintf(stderr,"Ext. 3D Now! "); if( statUNIT & tSSE )fprintf(stderr,"SSE"); fprintf(stderr,"\n"); } /* * オプション解析 */ static int getOpt(int argc,char **argv) { // char *inPath, *outPath; char bInPath, bOutPath; bInPath = bOutPath = FALSE; /*** analize options ***/ argc--,argv++; while(argc){ if(!strcmp(*argv,"-m")){ /* mono/stereo */ argc--,argv++; if(argc){ if(!strcmp(*argv,"m")){ argc--,argv++; MPGE_setConfigure( MC_ENCODEMODE, MC_MODE_MONO, 0); continue; }else if(!strcmp(*argv,"s")){ argc--,argv++; MPGE_setConfigure( MC_ENCODEMODE, MC_MODE_STEREO, 0); continue; }else if(!strcmp(*argv,"j")){ argc--,argv++; MPGE_setConfigure( MC_ENCODEMODE, MC_MODE_JOINT, 0); continue; }else if(!strcmp(*argv,"f")){ argc--,argv++; MPGE_setConfigure( MC_ENCODEMODE, MC_MODE_MSSTEREO, 0); continue; }else if(!strcmp(*argv,"d")){ argc--,argv++; MPGE_setConfigure( MC_ENCODEMODE, MC_MODE_DUALCHANNEL, 0); continue; } } disp_err( "%s[%s]\n", getMsg( MSG_err_opt_m ), *argv ); return ERR; }else #ifdef RAW_INPUT /* Thanks to Gonn 99/11/09 */ if( !strcmp( *argv, "-bswap") ){ argc--,argv++; MPGE_setConfigure( MC_BYTE_SWAP, TRUE, 0 ); }else #endif /* RAW_INPUT */ if(!strncmp(*argv,"-b",2)){ /* bitrate */ int unit=-1; if((*argv)[2]==NUL){ unit=1; /* bps */ }else if((*argv)[2]=='r' && (*argv)[3]==NUL){ unit=1000; /* kbps */ } if(unit==-1 || argc<=1){ disp_err( "%s[%s]\n", getMsg( MSG_err_opt_b ), *argv ); return ERR; } argc--,argv++; MPGE_setConfigure( MC_BITRATE, atoi(*argv)/unit, 0); argc--,argv++; }else if(!strcmp(*argv,"-s")){ /* INPUT sampling rate */ int freqHz; argc--,argv++; if(!argc){ disp_err( getMsg( MSG_err_opt_s ) ); return ERR; } freqHz=(int)(atof(*argv)*1000.0+0.5); if( freqHz == 0 ){ disp_err( getMsg( MSG_err_rate ) ); return ERR; } argc--,argv++; MPGE_setConfigure( MC_INPFREQ, freqHz, 0); }else if(!strcmp(*argv,"-d")){ /* OUTPUT sampling rate */ int freqHz; argc--,argv++; if(!argc){ disp_err( getMsg( MSG_err_opt_d ) ); return ERR; } freqHz=(int)(atof(*argv)*1000.0+0.5); argc--,argv++; MPGE_setConfigure( MC_OUTFREQ, freqHz, 0); }else if( !strcmp(*argv, "-emp") ){ /* emphasis */ argc--,argv++; if( argc && !strcmp(*argv, "n") ){ MPGE_setConfigure( MC_EMPHASIS, 0, 0); }else if( argc && !strcmp(*argv, "5") ){ MPGE_setConfigure( MC_EMPHASIS, 1, 0); }else if( argc && !strcmp(*argv, "c") ){ MPGE_setConfigure( MC_EMPHASIS, 3, 0); }else { disp_err( getMsg( MSG_err_opt_emp ) ); return ERR; } argc--,argv++; }else /* special units */ if( !strcmp(*argv,"-off") ){ argc--,argv++; if( argc && !strcmp(*argv,"mmx") ){ MPGE_setConfigure( MC_USEMMX, FALSE, 0); }else if( argc && !strcmp(*argv,"3dn") ){ MPGE_setConfigure( MC_USE3DNOW, FALSE, 0); }else if( argc && ( !strcmp(*argv,"kni") || !strcmp(*argv,"sse") ) ){ MPGE_setConfigure( MC_USEKNI, FALSE, 0); }else if( argc && !strcmp(*argv,"e3dn") ){ MPGE_setConfigure( MC_USEE3DNOW, FALSE, 0); }else { disp_err( getMsg( MSG_err_opt_off ) ); return ERR; } argc--,argv++; }else if( !strcmp(*argv, "-lpf") ){ argc--,argv++; if( argc && !strcmp(*argv, "on") ){ MPGE_setConfigure( MC_USELPF16, TRUE, 0 ); }else if( argc && !strcmp(*argv, "off") ){ MPGE_setConfigure( MC_USELPF16, FALSE, 0 ); }else if( argc >= 2 && MPGE_setConfigure( MC_ENHANCEDFILTER, atoi( *argv ), atoi( *(argv+1) ) ) == ME_NOERR ){ argc --,argv++; }else { disp_err( getMsg( MSG_err_opt_lpf ) ); return ERR; } argc--,argv++; }else if( !strcmp( *argv, "-th" ) ){ /* ThresHold for j-stereo */ argc--,argv++; if( argc >= 2 && MPGE_setConfigure( MC_MSTHRESHOLD, atoi( *argv ), atoi( *(argv+1) ) ) == ME_NOERR ){ argc -= 2,argv += 2; }else { disp_err( getMsg( MSG_err_opt_th ) ); return ERR; } }else if( !strcmp( *argv, "-i") ){ /* verify and overwirte */ argc--,argv++; MPGE_setConfigure( MC_VERIFY, TRUE, 0 ); }else #if defined(USE_PTHREAD) || defined(USE_BTHREAD) || defined(USE_WINTHREAD) || defined(USE_OS2THREAD) /* SMP */ if( !strcmp(*argv,"-cpu") ){ int cpu; argc--,argv++; if(!argc){ disp_err( getMsg( MSG_err_opt_cpu ) ); return ERR; } cpu=atoi(*argv); argc--,argv++; MPGE_setConfigure( MC_CPU, cpu, 0); }else #endif #if defined(BeOS) /* Priority */ if( !strcmp(*argv,"-priority") ){ int priority; argc--,argv++; if(!argc){ disp_err( getMsg( MSG_err_opt_priority ) ); return ERR; } priority=atoi(*argv); argc--,argv++; MPGE_setConfigure( MC_THREAD_PRIORITY, priority, 0); }else #endif #if defined(WIN32) /* Priority */ if( !strcmp(*argv,"-priority") ){ argc--,argv++; if(!argc){ disp_err( getMsg( MSG_err_opt_priority ) ); return ERR; } { static const char *prio[] = { "highest", "high", "normal", "low", "lowest" }; int prio_id[] = { THREAD_PRIORITY_TIME_CRITICAL, THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_IDLE }; int n; const int nMax = sizeof(prio) / sizeof( prio[0]); for( n = 0; n < nMax; n++){ if( stricmp( *argv, prio[n]) == 0 ){ break; } } if( n == nMax ) { disp_err( getMsg( MSG_err_opt_priority ) ); return ERR; } MPGE_setConfigure( MC_THREAD_PRIORITY, (UPARAM)prio_id[n], 0); } argc--,argv++; }else #endif #if defined(USE_BTHREAD) /* ReadThreadPriority */ if( !strcmp(*argv,"-readthread") ){ int priority; argc--,argv++; if(!argc){ disp_err( getMsg( MSG_err_opt_readpriority ) ); return ERR; } priority=atoi(*argv); argc--,argv++; MPGE_setConfigure( MC_READTHREAD_PRIORITY, priority, 0); }else #endif if( !strcmp(*argv,"-spc1") ){ argc--,argv++; MPGE_setConfigure( MC_USESPC1, TRUE, 0); }else if( !strcmp(*argv,"-spc2") ){ argc--,argv++; MPGE_setConfigure( MC_USESPC2, TRUE, 0); }else if( !strcmp(*argv,"-debug") ){ argc--,argv++; debug = 1; }else #ifdef USE_VBR if( !strcmp(*argv,"-v") ){ argc--,argv++; if( argc && isdigit(**argv) && (*argv)[1]=='\0' ){ MPGE_setConfigure( MC_VBR, **argv - '0', 0); }else{ disp_err( getMsg( MSG_err_opt_v ) ); return ERR; } argc--,argv++; }else if( !strcmp( *argv, "-vb" ) ){ int minrate = 0, maxrate = 0; argc--,argv++; if( argc >= 2 ){ minrate = atoi( *argv ); argv++; maxrate = atoi( *argv ); argv++; argc -= 2; } if( MPGE_setConfigure( MC_VBRBITRATE, minrate, maxrate ) == ME_PARAMERROR ){ disp_err( getMsg( MSG_err_opt_vb ) ); } }else #endif /* USE_VBR */ #ifdef RAW_INPUT if( !strcmp( *argv, "-offset") ){ argc--,argv++; if( !argc ){ disp_err( getMsg( MSG_err_opt_offset ) ); return ERR; } MPGE_setConfigure( MC_STARTOFFSET, atoi( *argv ), 0); argc--,argv++; }else if( !strcmp( *argv, "-8bit") ){ argc--,argv++; MPGE_setConfigure( MC_8BIT_PCM, TRUE, 0 ); }else if( !strcmp( *argv, "-mono") ){ argc--,argv++; MPGE_setConfigure( MC_MONO_PCM, TRUE, 0 ); }else if( !strcmp( *argv, "-tos") ){ argc--,argv++; MPGE_setConfigure( MC_TOWNS_SND, TRUE, 0 ); }else #endif /* RAW_INPUT */ if( !strcmp(*argv,"-o") ){ /* output directory */ argc--,argv++; if( !argc ){ disp_err( getMsg( MSG_err_opt_outputdir ) ); return ERR; } MPGE_setConfigure( MC_OUTPUTDIR, (UPARAM)*argv, 0 ); argc--,argv++; }else if(!strcmp(*argv,"-silent")){ /* 経過非表示 */ argc--,argv++; silentFlag++; }else if(!strncmp(*argv,"-test", 5)){ /* benchmark mode */ testmodeFlag++; enc_testtime = atoi( *argv + 5 ); if( !enc_testtime ) enc_testtime = 60 * 10; /* sec */ fprintf( stderr, "test time %dsec\n", enc_testtime ); argc--,argv++; }else if(!strcmp(*argv,"-nopsy")){ /* 音響心理無効 */ MPGE_setConfigure( MC_USEPSY, FALSE, 0); argc--,argv++; }else if(!strcmp(*argv,"-delete")){ deleteFlag++; argc--,argv++; }else if(!strcmp(*argv,"-lang")){ argc--,argv++; argc--,argv++; /* already checked in the top of main() */ }else if( !strcmp(*argv,"-riff") ){ /* RIFF/WAVE or RIFF/RMP3 */ argc--; argv++; if( !argc ){ disp_err( getMsg( MSG_err_riff_opt ) ); return ERR; } if (!strcmp(*argv,"wave")) { MPGE_setConfigure( MC_OUTPUT_FORMAT, MC_OUTPUT_RIFF_WAVE, 0 ); } else if (!strcmp(*argv,"rmp")) { MPGE_setConfigure( MC_OUTPUT_FORMAT, MC_OUTPUT_RIFF_RMP, 0 ); } else { disp_err( getMsg( MSG_err_riff_opt ) ); return ERR; } argc--; argv++; }else { if(bInPath==FALSE){ /* input file name */ if( !strcmp( *argv, "stdin" ) ){ MPGE_setConfigure( MC_INPUTFILE, MC_INPDEV_STDIO, (UPARAM)0 ); } else{ char inPath[ MAX_FILE_LEN ]; if( strlen( *argv ) >= MAX_FILE_LEN ){ fprintf( stderr, "Sorry, this file name is too long.[%s]\n", *argv ); return ERR; } strcpy( inPath, *argv ); if( convertToLongFileName( inPath, MAX_FILE_LEN ) == ERR ){ disp_err( getMsg( MSG_err_inp ), inPath ); *inPath = NUL; return ERR; } MPGE_setConfigure( MC_INPUTFILE, MC_INPDEV_FILE, (UPARAM)inPath ); } bInPath++; argc--,argv++; }else if(bOutPath==FALSE){ /* output file name */ MPGE_setConfigure( MC_OUTPUTFILE, MC_OUTDEV_FILE, (UPARAM)*argv ); bOutPath++; argc--,argv++; }else{ disp_err( "%s[%s]\n", getMsg( MSG_err_else ), *argv ); argc--,argv++; /* オプション解析続行 */ } } } return NOERR; } static void putConfig(void) { int nParam; char *strBuf; fprintf(stderr,"MPEG 1, layer 3 "); if( !MPGE_getConfigure( MG_ENCODEMODE, &nParam ) ){ switch( nParam ){ case MC_MODE_MONO: strBuf = getMsg( MSG_mono ); break; case MC_MODE_STEREO: strBuf = getMsg( MSG_stereo ); break; case MC_MODE_JOINT: strBuf = getMsg( MSG_j_stereo ); break; case MC_MODE_MSSTEREO: strBuf = getMsg( MSG_ms_stereo ); break; case MC_MODE_DUALCHANNEL: strBuf = getMsg( MSG_dual ); break; default: strBuf = getMsg( MSG_undefined ); } fprintf(stderr,"%s\n", strBuf ); } if( !MPGE_getConfigure( MG_INPFREQ, &nParam ) ){ fprintf(stderr, "%s=%.1fkHz ", getMsg( MSG_in_freq ), nParam / 1000.0 ); } if( !MPGE_getConfigure( MG_OUTFREQ, &nParam ) ){ fprintf(stderr, "%s=%.1fkHz ", getMsg( MSG_out_freq ), nParam / 1000.0 ); } if( !MPGE_getConfigure( MG_BITRATE, &nParam ) ){ fprintf(stderr,"%s=%dkbps\n", getMsg( MSG_bitrate ), nParam ); } if( !MPGE_getConfigure( MG_INPUTFILE, szInName ) && !MPGE_getConfigure( MG_OUTPUTFILE, szOutName ) ){ fprintf(stderr, "%s `%s'\n%s `%s'\n", getMsg( MSG_in_name ), (*szInName)?szInName:"stdin", getMsg( MSG_out_name ), szOutName); } } static char * GetErrorMesg( int nErrorCode ) { switch( nErrorCode ){ case ME_NOERR: return getMsg( MSG_ME_NOERR ); case ME_EMPTYSTREAM: return getMsg( MSG_ME_EMPTYSTREAM ); case ME_PARAMERROR: return getMsg( MSG_ME_INTERNALERROR ); case ME_NOFPU: return getMsg( MSG_ME_NOFPU ); case ME_INFILE_NOFOUND: return getMsg( MSG_ME_INFILE_NOFOUND ); case ME_OUTFILE_NOFOUND: return getMsg( MSG_ME_OUTFILE_NOFOUND ); case ME_FREQERROR: return getMsg( MSG_ME_FREQERROR ); case ME_BITRATEERROR: case ME_BITRATE_ERR: return getMsg( MSG_ME_BITRATEERROR ); case ME_WAVETYPE_ERR: return getMsg( MSG_ME_WAVETYPE_ERR ); case ME_CANNOT_SEEK: return getMsg( MSG_ME_CANNOT_SEEK ); case ME_HALTED: return getMsg( MSG_ME_HALTED ); default: return "undefined error"; } } #ifdef WIN32 static void clock_to_hms( double sec, int *h, int *m, int *s, int *ms) { int t = (int)(sec * 100.); *ms = t % 100; t /= 100; *s = t % 60 ; t /= 60; *m = t % 60 ; t /= 60; *h = t; } #endif static int GENRAND() { static unsigned int seed = 0; seed = seed * 0x32842851 + 12398321; return seed & INT_MAX; } /* ----------------------------------------------------------------------- */ #define MAX_CHANNEL 16 static short test_sample[MAX_CHANNEL][2304]; static MERET enctest_inputfunc(void *buf, unsigned long nLength ) { static int firstcall = 1; static int nRestFrame; if( firstcall ){ int i, j, nMax; firstcall = 0; for(i = 0;i < MAX_CHANNEL; i ++ ){ nMax = 0x4000 + 0x6000 * i / MAX_CHANNEL; for(j = 0;j < 2304;j++){ test_sample[i][j] = (GENRAND() % nMax) - nMax/2 ; } } nRestFrame = (int)((double)enc_testtime*(44100.*2*2/4608.)); // 残りフレーム数 } if( 0 < nRestFrame-- ){ memcpy( buf, test_sample[ GENRAND() % MAX_CHANNEL ], nLength ); return ME_NOERR; } return ME_EMPTYSTREAM; } static MERET enctest_outputfunc(void *buf, unsigned long nLength ) { return ME_NOERR; } /* ----------------------------------------------------------------------- */ #if defined(WIN32) /* * CTRL+C停止時 不可視状態になっているファイルを元に戻す */ BOOL WINAPI CTRL_C_HANDLER(DWORD CtrlType) { fprintf( stderr, "\n\nApplication was terminated.\n"); MPGE_closeCoder(); exit(-1); } #endif /* ----------------------------------------------------------------------- */ /* Why does this run on Windows? */ void write_time(int, long elapsed_sec, long elapsed_usec, unsigned frameNum, unsigned total_frame, unsigned sps, unsigned spf);/* defined in clk.nas */ #if defined(__linux__) || defined(__FreeBSD__) static struct timeval ElapsedTime; static int total_frame, frameNum, samplesPerFrame, freqHz; static struct itimerval itimer; /* 表示用スレッド */ /* 一定時間毎にカーネルによって起動される */ static void display_time(int n) { ElapsedTime.tv_sec += itimer.it_interval.tv_sec; ElapsedTime.tv_usec += itimer.it_interval.tv_usec; ElapsedTime.tv_sec += ElapsedTime.tv_usec/1000000; ElapsedTime.tv_usec = ElapsedTime.tv_usec%1000000; write_time(fileno(stdout), ElapsedTime.tv_sec, ElapsedTime.tv_usec, frameNum, total_frame, freqHz, samplesPerFrame); } #endif int main(int argc,char **argv) { #if !defined(__linux__) && !defined(__FreeBSD__) int total_frame, frameNum, samplesPerFrame, freqHz; #endif #if defined(DISPLAY_REALTIME) struct timeval startTime, curTime; #else clock_t startTime, curTime, beforeTime; #endif float dclock; int mpegversion; int nEncMode; MERET rval; /* initialize */ if( MPGE_initializeWork() == ME_NOFPU ){ fprintf(stderr, "%s\n", getMsg( MSG_ME_NOFPU ) ); return ERR; } /* detect LANG(special case) */ { t_lang lang = tLANG_UNKNOWN; int ac; char **av; ac = argc, av = argv; ac--, av++; while( ac ){ if( !strcmp( *av, "-lang" ) ){ ac--, av++; if( ac && !strcmp( *av, "sjis" ) ){ lang = tLANG_JAPANESE_SJIS; }else if( ac && !strcmp( *av, "eucjp" ) ){ lang = tLANG_JAPANESE_EUC; }else if( ac && !strcmp( *av, "eng" ) ){ lang = tLANG_ENGLISH; }else if( ac && !strcmp( *av, "ger" ) ){ lang = tLANG_GERMAN; }else if( ac && !strcmp( *av, "esp" ) ){ lang = tLANG_SPANISH; }else { fprintf( stderr, getMsg( MSG_help33 ) ); return ERR; } } ac--, av++; } /* 呼び出す前にInitializeしている必要アリ */ MPGE_setConfigure( MC_LANG, lang, 0 ); } /* opening */ fprintf( stderr, "%s " VERSION "\n", getMsg( MSG_GOGO ) ); fprintf( stderr, getMsg( MSG_TITLE1 ) ); fprintf( stderr, getMsg( MSG_TITLE2 ) ); /* print help */ if( argc == 1 ){ usage(); return ERR; } /* analize options */ #if defined(WIN32) MPGE_setConfigure( MC_THREAD_PRIORITY, THREAD_PRIORITY_HIGHEST, 0); #endif if( getOpt(argc, argv) ){ usage(); MPGE_endCoder(); return ERR; } /* if bench mark mode */ if( testmodeFlag ){ /* TEST : measure the time to encode 10 minutes PCM */ struct MCP_INPDEV_USERFUNC userfunc; memset( &userfunc, 0, sizeof userfunc ); userfunc.pUserFunc = enctest_inputfunc; userfunc.nSize = 44100 * 2 * 2 * enc_testtime; userfunc.nChn = 2; // stereo userfunc.nFreq = 44100; // 44100Hz userfunc.nBit = 16; // 16bit PCM MPGE_setConfigure( MC_INPUTFILE, MC_INPDEV_USERFUNC, (UPARAM)&userfunc ); MPGE_setConfigure( MC_OUTPUTFILE, MC_OUTDEV_USERFUNC, (UPARAM)enctest_outputfunc ); fprintf( stderr, getMsg( MSG_BENCH ) ); } /* ここからは1つのwavを処理するごとに必要 */ rval = MPGE_detectConfigure(); if( rval != ME_NOERR ){ disp_err( "%s\n", GetErrorMesg( rval ) ); return ERR; } /* 設定の表示 */ putConfig(); MPGE_getConfigure( MG_COUNT_FRAME, &total_frame ); MPGE_getConfigure( MG_NUM_OF_SAMPLES, &samplesPerFrame ); MPGE_getConfigure( MG_OUTFREQ, &freqHz ); if( debug )put_statUNIT(); frameNum = 0; #if defined(DISPLAY_REALTIME) gettimeofday(&startTime, NULL); #else startTime = clock(); beforeTime = startTime; #endif MPGE_getConfigure( MG_MPEG_VERSION, (UPARAM *)&mpegversion ); MPGE_getConfigure( MG_ENCODEMODE, (UPARAM *)&nEncMode ); #if defined(__linux__) || defined(__FreeBSD__) if(silentFlag){ MPGE_processTrack(&frameNum); }else{ /* 表示のためだけにCPUを使うのはもったいない。 カーネルのスケジューラに0.1秒ごとに起こしてもらう。*/ struct sigaction new_sig, old_sig; ElapsedTime.tv_sec = ElapsedTime.tv_usec = 0; itimer.it_interval.tv_sec = 0; itimer.it_interval.tv_usec = 100000; /* 更新周期 = 100ミリ秒 */ itimer.it_value = itimer.it_interval; memset(&new_sig, 0, sizeof(struct sigaction)); new_sig.sa_handler = display_time; new_sig.sa_flags = SA_RESTART; #ifdef DISPLAY_REALTIME sigaction(SIGALRM, &new_sig, &old_sig); setitimer(ITIMER_REAL, &itimer, NULL); #else sigaction(SIGVTALRM, &new_sig, &old_sig); setitimer(ITIMER_VIRTUAL, &itimer, NULL); #endif MPGE_processTrack(&frameNum); itimer.it_interval.tv_sec = 0; itimer.it_interval.tv_usec = 0; /* stop */ itimer.it_value = itimer.it_interval; #ifdef DISPLAY_REALTIME setitimer(ITIMER_REAL, &itimer, NULL); sigaction(SIGALRM, &old_sig, NULL); #else setitimer(ITIMER_VIRTUAL, &itimer, NULL); sigaction(SIGVTALRM, &old_sig, NULL); #endif } #else /* defined(__linux__) || defined(__FreeBSD__) */ #if defined ( WIN32 ) //signal( SIGINT, CTRL_C_HANDLER); SetConsoleCtrlHandler( CTRL_C_HANDLER, TRUE ); #endif for(;;){ if( !silentFlag ){ while( (frameNum & 31) == 31 ){ /* ココで更新頻度を調整する */ #if defined(DISPLAY_REALTIME) gettimeofday(&curTime, NULL); write_time(fileno(stdout), curTime.tv_sec - startTime.tv_sec, curTime.tv_usec - startTime.tv_usec, frameNum, total_frame, freqHz, samplesPerFrame); #else curTime = clock(); if( curTime - beforeTime < CLOCKS_PER_SEC / 5 ) break; beforeTime = curTime; curTime -= startTime; write_time(fileno(stdout), curTime/CLOCKS_PER_SEC, (curTime%CLOCKS_PER_SEC)*(1000000L/CLOCKS_PER_SEC), frameNum, total_frame, freqHz, samplesPerFrame); #endif break; } frameNum++; } #ifdef USE_BTHREAD /* BeOSの場合、エンコードスレッドと表示スレッドの同期を取ると勿体ないので エンコードスレッドからある瞬間の実行しているframeNumをスレッド間通信でもらう */ rval = MPGE_processFrame(&frameNum); /* マルチスレッド時は内部でframeNumが書き変わるが1スレッド時はスルー */ #else rval = MPGE_processFrame(); #endif if( rval == ME_EMPTYSTREAM ) break; #ifdef USE_8HZ if( m_bCancel == TRUE ){ break; } #endif if( rval != ME_NOERR ){ disp_err( GetErrorMesg( rval ) ); break; } } /* main loop */ #endif /* defined(__linux__) || defined(__FreeBSD__) */ MPGE_endCoder(); /* finish */ if( deleteFlag && *szInName ){ remove( szInName ); if( debug ) fprintf( stderr, "%s[%s]\n", getMsg( MSG_DELETE ), szInName ); } #if defined(DISPLAY_REALTIME) gettimeofday(&curTime, NULL); curTime.tv_sec -= startTime.tv_sec; curTime.tv_usec -= startTime.tv_usec; if( !silentFlag ){ write_time(fileno(stdout), curTime.tv_sec, curTime.tv_usec, frameNum, total_frame, freqHz, samplesPerFrame); } dclock = (double)curTime.tv_sec + (double)curTime.tv_usec/1000000.0; #else curTime = clock(); curTime -= startTime; if( !silentFlag ){ write_time(fileno(stdout), curTime/CLOCKS_PER_SEC, (curTime%CLOCKS_PER_SEC)*(1000000L/CLOCKS_PER_SEC), frameNum, total_frame, freqHz, samplesPerFrame); } dclock = (double)curTime / (double)CLOCKS_PER_SEC; #endif fprintf( stderr, "%s=%8.3fsec ", getMsg( MSG_finish ), dclock ); if( testmodeFlag ){ fprintf( stderr, "(%6.2fx)\n", enc_testtime / dclock ); }else{ fprintf( stderr, "\n" ); } if( debug ){ extern int CLKcount;extern float CLKclock; printf("call %dtimes:ave %fclk\n",CLKcount,CLKclock/CLKcount); memFreeChk(); } return NOERR; } gogo239b/nasm.h100644 23421 144 5702 7220537350 12444 0ustar shigeousers ; Copyright (C) 1999 URURI ; nasm用マクロ ; 1999/08/21 作成 ; 1999/10/10 幾つか追加 ; 1999/10/27 aout対応 ; 1999/11/07 pushf, popf のNASMのバグ対応 ; 1999/12/02 for BCC ( Thanks to Miquel ) ; for Windows Visual C++ -> define WIN32 ; Borland or cygwin -> WIN32 and COFF ; for FreeBSD 2.x -> AOUT ; for TownsOS -> __tos__ ; otherwise -> none ;名前の付け方 BITS 32 %ifdef WIN32 %define _NAMING %define segment_code segment .text align=16 class=CODE use32 %define segment_data segment .data align=16 class=DATA use32 %ifdef __BORLANDC__ %define segment_bss segment .data align=16 class=DATA use32 %else %define segment_bss segment .bss align=16 class=DATA use32 %endif %elifdef AOUT %define _NAMING %define segment_code segment .text %define segment_data segment .data %define segment_bss segment .bss %else %define segment_code segment .text align=16 class=CODE use32 %define segment_data segment .data align=16 class=DATA use32 %define segment_bss segment .bss align=16 class=DATA use32 %endif %ifdef __tos__ group CGROUP text group DGROUP data %endif ;単精度浮動小数点形式 %idefine float dword %idefine fsize 4 %idefine fsizen(a) (fsize*(a)) ;ワード形式 %idefine wsize 2 %idefine wsizen(a) (wsize*(a)) %idefine dwsize 4 %idefine dwsizen(a) (dwsize*(a)) ;REG %define r0 eax %define r1 ebx %define r2 ecx %define r3 edx %define r4 esi %define r5 edi %define r6 ebp %define r7 esp ;MMX,3DNow!,SSE %define pmov movq %define pmovd movd %define pupldq punpckldq %define puphdq punpckhdq %define puplwd punpcklwd %define puphwd punpckhwd %define xm0 xmm0 %define xm1 xmm1 %define xm2 xmm2 %define xm3 xmm3 %define xm4 xmm4 %define xm5 xmm5 %define xm6 xmm6 %define xm7 xmm7 ;シャッフル用の4進マクロ %define R4(a,b,c,d) (a*64+b*16+c*4+d) ;Cライクな簡易マクロ %imacro globaldef 1 %ifdef _NAMING %define %1 _%1 %endif global %1 %endmacro %imacro externdef 1 %ifdef _NAMING %define %1 _%1 %endif extern %1 %endmacro %imacro proc 1 %push proc %ifdef _NAMING global _%1 %else global %1 %endif align 32 %1: _%1: %assign %$STACK 0 %assign %$STACKN 0 %assign %$ARG 4 %endmacro %imacro endproc 0 %ifnctx proc %error expected 'proc' before 'endproc'. %else %if %$STACK > 0 add esp, %$STACK %endif %if %$STACK <> (-%$STACKN) %error STACKLEVEL mismatch check 'local', 'alloc', 'pushd', 'popd' %endif ret %pop %endif %endmacro %idefine sp(a) esp+%$STACK+a %imacro arg 1 %00 equ %$ARG %assign %$ARG %$ARG+%1 %endmacro %imacro local 1 %assign %$STACKN %$STACKN-%1 %00 equ %$STACKN %endmacro %imacro alloc 0 sub esp, (-%$STACKN)-%$STACK %assign %$STACK (-%$STACKN) %endmacro %imacro pushd 1-* %rep %0 push %1 %assign %$STACK %$STACK+4 %rotate 1 %endrep %endmacro %imacro popd 1-* %rep %0 %rotate -1 pop %1 %assign %$STACK %$STACK-4 %endrep %endmacro ; bug of NASM-0.98 %define pushf db 0x66, 0x9C %define popf db 0x66, 0x9D gogo239b/putbits.nas100644 23421 144 16740 7220537350 13556 0ustar shigeousers ; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; modified by K. SAKAI ; 99/04/12 殆どかわんないんやけど ; 99/09/27 callを無くした(せこい...) ; 99/11/06 addition of member(storefunc) ; 00/02/07 HuffmanCode と putbits を融合 ; bitstrem.cとの整合性注意!!! %include "nasm.h" ; へぼくてすまん %define pt 0 %define buf 4 %define buf_size 8 %define totbit 12 %define buf_bit_idx 16 %define storefunc 20 %define sizeOf_bit_stream_struc 24 globaldef putbits globaldef putbits24 globaldef HuffmanCodePutBits globaldef bs_pt externdef empty_buffer externdef ht externdef BitCount ; defined in l3bs.c externdef BitsRemaining ; defined in l3bs.c externdef write_main_data_with_side_info ; defined in l3bs.c segment_data segment_bss global bs_pt bs_pt: resb sizeOf_bit_stream_struc segment_code ;void putbits(uint32 val,uint32 N); align 16 putbits: mov eax,[esp+4] ;eax=val mov ecx,[esp+8] ;ecx=N push ebx mov ebx,[bs_pt+totbit] push edi sub ebx,[bs_pt+buf_bit_idx] ;ebx=bitstm push esi xor edx,edx mov dl,7 mov edi,ebx mov esi,ecx and edx,ebx ;edx=bt shr edi,3 ;edi=pt neg ecx add edi,[bs_pt+buf] shl eax,cl mov ecx,edx mov dh,al ; N>=24のときのため shr eax,cl ;val>>=bt neg ecx bswap eax add ecx,8 shl dh,cl mov dl,[edi] or al,dl mov [edi],eax mov [edi+4],dh add ebx,esi add [bs_pt+totbit],esi shr ebx,3 cmp ebx,[bs_pt+buf_size] pop esi pop edi pop ebx jae near empty_buffer ; void empty_buffer(void)やからこれでええと思う。 ret ; N<=24であるときはこちらを呼ぶほうがよい ;void putbits24(uint24 val,uint32 N); ; 00/03/11 ちょっち最適化(44clk -> 33 clk for K7 ) by shigeo align 16 putbits24: push ebx push esi %assign _P 4*2 mov eax,[esp+_P+4] ;eax=val mov edx,[bs_pt+totbit] mov ecx,[esp+_P+8] ;ecx=N sub edx,[bs_pt+buf_bit_idx] mov esi,ecx ;esi = N mov ebx,edx ;ebx=edx=bitstm shr edx,3 ; edx = pt neg ecx add edx,[bs_pt+buf] shl eax,cl mov ecx,7 and ecx,ebx add ebx,esi shr eax,cl ;val >>= bt bswap eax or al,[edx] add [bs_pt+totbit],esi pop esi shr ebx,3 mov [edx],eax cmp ebx,[bs_pt+buf_size] pop ebx jae near empty_buffer ; void empty_buffer(void)やからこれでええ ret ; 変更要注意!!! huffman.h ; sizeof(ht)=16を使っている! linbits equ 0 linmax equ 4 table equ 8 hlen equ 12 ;--------------------------------------------------------------------- ; 2000/02/07 Initial version by K.SAKAI ; 2000/03/11 a little optimization by shigeo ;int HuffmanCodePutBits(table_select,x,y) align 16 HuffmanCodePutBits: %assign _P 4*0 mov edx,[esp+_P+4] mov ecx,15 push ebx push esi push ebp %assign _P 4*3 lea esi,[edx*4] cmp edx,ecx mov eax,[esp+_P+8] ;eax=x mov ebx,[esp+_P+12] ;ebx=y lea esi,[esi*4+ht] ;esi=&ht[table_slect], sizeof(ht)=16 jbe near .be15 .a15: push edi %assign _P 4*4 xor edi,edi ;xbits=edi=0 test eax,eax jz .a15_z_x .a15_nz_x: mov ebp,eax ;eax=x inc edi ;xbits=edi=1 sar ebp,31 xor eax,ebp neg ebp ;ext=ebp=(x<0)?1:0 add eax,ebp ;eax=abs(x) cmp eax,ecx jb short .F00 ;if(x>14){ lea eax,[eax*2-30] ; eax=(x-15)<<1 add edi,[esi+linbits] ; xbits+=h->linbits or ebp,eax ; ext|=(x-15)<<1 mov eax,ecx ; eax=15 .F00: ;}else shl eax,4 ;ylenはいつも16 .a15_z_x: test ebx,ebx mov edx,eax ;edx=idx jz .a15_z_y .a15_nz_y: mov eax,ebx sar ebx,31 inc edi ;xbits++ xor eax,ebx neg ebx ;sign=ebx=(y<0)?1:0 add ebp,ebp ;ext<<=1 add eax,ebx ;eax=abs(y) cmp eax,ecx jb short .F01 ;if(y>14){ mov cl,byte [esi+linbits] lea eax,[eax*2-30] ; eax=(y-15)<<1 shl ebp,cl ; ext<<=h->linbits add edi,ecx ; xbits+=h->linbits or ebx,eax ; sign|=(y-15)<<1 mov eax,15 .F01: ;}else or ebp,ebx ;ext|=sign add edx,eax ;idx+=(y>14)?15:y .a15_z_y: mov eax,[esi+table] mov esi,[esi+hlen] mov eax,[eax+edx*4] ; = code = h->table[idx] mov esi,[esi+edx*4] ; = cbits = h->hlen[idx] ; ebp is ext, edi is xbits, eax is code, esi is cbits test esi,esi jz .a15_z_cbits .a15_nz_cbits: mov edx,[BitsRemaining] cmp esi,edx jbe .a15_putbits24 push esi push eax call write_main_data_with_side_info ; add esp,8 jmp .a15_z_cbits align 16 .a15_putbits24: sub edx,esi mov ecx,esi mov [BitsRemaining],edx add [BitCount],esi ; putbits24( eax = val, ecx = nbits ); mov ebx,[bs_pt+totbit] sub ebx,[bs_pt+buf_bit_idx] ;ebx=bitstm mov edx,ebx shr edx,3 ; edx = pt add edx,[bs_pt+buf] mov ch,cl ; ch = N neg cl ; add cl,32 ;cl=32-N shl eax,cl mov cl,7 and cl,bl ; = bt shr eax,cl ;val >>= bt movzx ecx,ch ;ecx=N (ch=Nであった) bswap eax or al,[edx] add ebx,ecx mov [edx],eax shr ebx,3 add [bs_pt+totbit],ecx cmp ebx,[bs_pt+buf_size] jb .a15_z_cbits call empty_buffer ; empty_buffer(void) .a15_z_cbits: test edi,edi jz near .a15_return .a15_nz_xbits: mov edx,[BitsRemaining] cmp edi,edx jbe .a15_putbits push edi push ebp call write_main_data_with_side_info ; add esp,8 add esi,edi jmp .a15_return align 16 .a15_putbits: mov eax,ebp sub edx,edi mov ecx,edi mov [BitsRemaining],edx add [BitCount],edi mov ebx,[bs_pt+totbit] add esi,edi ;esi=cbits+xbits ; putbits( eax = val, ecx = nbits ); sub ebx,[bs_pt+buf_bit_idx] ;ebx=bitstm mov edx,7 mov ebp,ebx neg cl ;neg ecxでなくてもいい? and edx,ebx ;edx=bt shr ebp,3 ;ebp=pt shl eax,cl mov cl,dl ;val<<=32-N add ebp,[bs_pt+buf] mov dh,al ; N>=24のときのため shr eax,cl ;val>>=bt neg cl bswap eax add cl,8 or al,[ebp] shl dh,cl mov [ebp],eax mov [ebp+4],dh add ebx,edi add [bs_pt+totbit],edi shr ebx,3 cmp ebx,[bs_pt+buf_size] jb .a15_return call empty_buffer ; empty_buffer(void) .a15_return: mov eax,esi ;eax = cbits + xbits pop edi pop ebp pop esi pop ebx ret align 16 %assign _P 4*3 .be15: push edi xor ecx,ecx ;cbits=ecx=0 cmp eax,1 mov ebp,eax sbb ecx,-1 sar ebp,31 xor eax,ebp neg ebp ;sign=ebp=(x<0)?1:0 add eax,ebp ;eax=abs(x) shl eax,4 ;mul byte [esi+ylen] .be15_z_x: test ebx,ebx mov edx,eax ;edx=idx jz .be15_z_y .be15_nz_y: mov eax,ebx sar ebx,31 ;ebx=(y<0)?-1:0 inc ecx ;cbits++ xor eax,ebx add ebp,ebp ;sign<<=1 sub eax,ebx ;eax=abs(y) sub ebp,ebx ;sign++ add edx,eax ;edx+=y .be15_z_y: mov eax,[esi+table] mov esi,[esi+hlen] mov eax,[eax+edx*4] mov esi,[esi+edx*4] shl eax,cl or eax,ebp ; = code add esi,ecx ; = cbits jz .be15_return .be15_nz_cbits: mov edx,[BitsRemaining] cmp esi,edx jbe .be15_putbits24 push esi push eax call write_main_data_with_side_info ; add esp,8 jmp .be15_return align 16 .be15_putbits24: sub edx,esi add [BitCount],esi mov [BitsRemaining],edx ; putbits24( eax = val, ecx = nbits ); mov edx,[bs_pt+totbit] mov ecx,esi sub edx,[bs_pt+buf_bit_idx] ;ebx=bitstm mov ebx,edx mov edi,ecx shr edx,3 ; edx = pt neg ecx add edx,[bs_pt+buf] shl eax,cl mov ecx,7 and ecx,ebx add ebx,edi shr eax,cl ;val >>= bt bswap eax shr ebx,3 or al,[edx] add [bs_pt+totbit],edi cmp ebx,[bs_pt+buf_size] mov [edx],eax jb .be15_return call empty_buffer ; empty_buffer(void) .be15_return: mov eax,esi pop edi pop ebp pop esi pop ebx ret end gogo239b/quantize.nas100644 23421 144 144331 7220537350 13742 0ustar shigeousers ; optimized mdct() for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to Keiichi SAKAI ; loop.cとの整合性注意 ;この大きさまでとるとはみだしチェックが不要になる PRECALC_SIZE equ 8206 %include "nasm.h" %include "grinfo.inc" globaldef quantize_xrpow_FPU globaldef quantize_xrpow_3DN globaldef quantize_xrpow_SSE %ifdef USE_E3DN globaldef quantize_xrpow_E3DN %endif globaldef calc_pow4P3mono globaldef calc_pow4P3dual_FPU globaldef calc_pow4P3dual_3DN globaldef calc_pow4P3dual_SSE globaldef pow4P3_table ; globaldef calc_runlen globaldef ix_max_NONE globaldef ix_max_MMX globaldef ix_max_3DN globaldef ix_max_SSE globaldef calc_pow075_3DN globaldef calc_pow075_SSE globaldef calc_pow075_FPU globaldef calc_pow075_NONE %ifdef USE_E3DN globaldef calc_pow075_E3DN %endif globaldef ms_convert_FPU globaldef ms_convert_3DN globaldef ms_convert_SSE %ifdef USE_E3DN globaldef ms_convert_E3DN %endif ; globaldef count1_bitcount globaldef calc_xmin_long_3DN externdef ix_max externdef ATH_l externdef masking_lower externdef scalefac_long globaldef scalefac_longR %define SFB_LMAX 22 ; defined in loop.h F_SIZE equ 4 %define F_PTR dword segment_data align 16 _M01875 dd -0.1875 _05 dd 0.5 _1 dd 1.0 _00946 dd 0.0946 D_04054 dd 0.4054,0.4054 ;=1-0.0946 _4P3 dd 1.33333333333 ;=4/3 align 16 D_MSB1_1 dd 0x80000000,0x80000000 ;私は左に書いたほうを上位としてる D_MSB0_1 dd 0x80000000,0 ;D_MSB1_1とD_MSB0_1の順序変更不可 D_05 dd 0.5,0.5 D_ABS dd 0x7FFFFFFF,0x7FFFFFFF ;andで絶対値 align 8 _M025 dd -0.25 ; for pow(2, i/4); powiP4table dd 1.000000000, 1.18920711498, 1.41421356237, 1.68179283048 ; for pow(2, i/16); powiP16table dd 1.0000000000000000,1.0442737824274138,1.0905077326652577,1.1387886347566916 dd 1.1892071150027210,1.2418578120734840,1.2968395546510096,1.3542555469368927 dd 1.4142135623730951,1.4768261459394993,1.5422108254079407,1.6104903319492543 dd 1.6817928305074290,1.7562521603732995,1.8340080864093424,1.9152065613971474 align 8 D_0.4999 dd 0.499996011,0.499996011 D_1Psqr2 dd 0.70710678118,0.70710678118 ;1/sqr2 ; calc_pow075_NONE 用のテーブルをこっちに持ってきた ; 6.26形式の補正値 ; (16/9)^.75, (32/9)^.75, (64/9)^.75, (128/9)^.75 pow075_table0 dd 0x06288D17, 0x0A5B6EB1, 0x116B28F5, 0x1D4B6220 ; (16/11)^.75, (32/11)^.75, (64/11)^.75, (128/11)^.75 dd 0x054C448A, 0x08E8F61B, 0x0EFC1ABC, 0x1933886F ; (16/14)^.75, (32/14)^.75, (64/14)^.75, (128/14)^.75 dd 0x046BDCF6, 0x076F8F2F, 0x0C816474, 0x1508142B pow075_table1 db 9, 11, 14, 0 align 8 ; 0から15までの数字を2進数で表した時の1の数 count1_table: dd 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 ; huffcode.tblのhlen32[]の部分 hlen32_table: dd 1,4,4,5,4,6,5,6,4,5,5,6,5,6,6,6 segment_bss pow4P3_table: resd PRECALC_SIZE scalefac_longR: resd SFB_LMAX segment_code ;************************************************************************ ; 98/07/12 ; in : st0 ; out: st0=2^st0 ; dst: none align 16 pow2x: sub esp,F_SIZE fld st0 ;x ;x fsub F_PTR [_05] ;x-0.5 ;x fistp F_PTR [esp] ;x fild F_PTR [esp] ;y=[x] ;x fxch ;x ;y fsub st0,st1 ;x-y ;y f2xm1 ;2^(x-y)-1 ;y fadd F_PTR [_1] ;2^(x-y) ;y fscale ;2^(x-y)*2^y;y fstp st1 ;2^x add esp,F_SIZE ret ;************************************************************************ ; 98/11/26 ; in :eax ; out:st0=eax^(4/3) align 16 pow4P3: push eax fld dword [_4P3] ;4/3 fild dword [esp] ;eax ,4/3 fyl2x ;4/3*log_2(eax) ,--- call pow2x ;eax^(4/3) ret 4 ;************************************************************************ ;void quantize_xrpow( float xr[576], int ix[576], gr_info *cod_info ); ; 99/08/03 ; 約11kclk align 16 quantize_xrpow_FPU: mov eax,[esp+12] ;eax=cod_info fld dword [_00946] ;0.0946 mov eax,[eax+quantizerStepSize] neg eax lea eax,[eax+eax*2] ;eax=-step call pow2iP16 ;step' mov eax,[esp+8] ;eax=ix mov ecx,576/2 mov edx,[esp+ 4] ;edx=xr align 4 .lp: fld st0 ;step, step, 0.0946 fmul dword [edx] ;step * *xr, step, 0.0946 fsub st0,st2 ;step * *xr - 0.0946, step fistp dword [eax] ;step (これは四捨五入) fld st0 ;step, step, 0.0946 fmul dword [edx+4] ;step * *xr, step, 0.0946 add edx,8 fsub st0,st2 ;step * *xr - 0.0946, step fistp dword [eax+4] ;step (これは四捨五入) add eax,8 dec ecx jnz short .lp fcompp ;- push dword 576 push dword 0 push dword [esp+8+8] call [ix_max] add esp,12 ret ;------------------------------------------------------------------------ ; 99/08/03 by shigeo ; 約3500clk ; 99/08/11 ; 約2300clk ; 99/08/13(うるり) ; 00/01/09 by shigeo ; ix_max(830clk)との統合 2800clk align 16 quantize_xrpow_3DN: mov eax,[esp+12] ;eax=cod_info mov edx,[esp+ 4] ;edx=xr femms mov eax,[eax+quantizerStepSize] neg eax lea ecx,[eax+eax*2] ;-Size*3 mov eax,ecx and ecx,15 shr eax,4 shl eax,23 add eax,0x3F800000 movd mm0,eax mov eax,[esp+8] ;eax=ix pfmul mm0,[powiP16table+ecx*4] movq mm1,qword [D_04054] ;mm1=[0.4054:0.4054] punpckldq mm0,mm0 ;mm0=[step:step] pxor mm7,mm7 ;mm7=max mov ecx,576/8 jmp short .lp align 16 .lp: movq mm2,[edx] ;*xr movq mm3,[edx+8] pfmul mm2,mm0 ;*xr * step movq mm4,[edx+16] pfadd mm2,mm1 ;*xr * step + 0.4054 pfmul mm3,mm0 movq mm5,[edx+24] pfmax mm7,mm2 pf2id mm2,mm2 ;切捨て pfadd mm3,mm1 pfmul mm4,mm0 movq [eax],mm2 pfmax mm7,mm3 pf2id mm3,mm3 pfadd mm4,mm1 pfmul mm5,mm0 movq [eax+8],mm3 pfmax mm7,mm4 pf2id mm4,mm4 pfadd mm5,mm1 movq [eax+16],mm4 pfmax mm7,mm5 pf2id mm5,mm5 movq [eax+24],mm5 add eax,32 add edx,32 loop .lp movq mm1,mm7 psrlq mm7,32 pfmax mm7,mm1 pf2id mm7,mm7 movd eax,mm7 femms ret ;------------------------------------------------------------------------ ; 00/01/09 by shigeo ;  なむ〜全然速くならない(T_T) 1270clk ; E3DN命令は使ってないけど一応Athlon向けな命令並び(のはず...) %ifdef USE_E3DN align 16 quantize_xrpow_E3DN: mov eax,[esp+12] ;eax=cod_info mov edx,[esp+ 4] ;edx=xr femms mov eax,[eax+quantizerStepSize] neg eax lea ecx,[eax+eax*2] ;-Size*3 mov eax,ecx and ecx,15 shr eax,4 shl eax,23 add eax,0x3F800000 movd mm0,eax mov eax,[esp+8] ;eax=ix pfmul mm0,[powiP16table+ecx*4] mov ecx,-576*4 movq mm1,qword [D_04054] ;mm1=[0.4054:0.4054] punpckldq mm0,mm0 ;mm0=[step:step] pxor mm7,mm7 ;mm7=max sub eax,ecx sub edx,ecx jmp short .lp align 16 .lp: prefetch [edx+ecx+32] prefetchw [eax+ecx+32] movq mm2,[edx+ecx] ;*xr movq mm3,[edx+ecx+8] movq mm4,[edx+ecx+16] movq mm5,[edx+ecx+24] pfmul mm2,mm0 ;*xr * step pfmul mm3,mm0 pfmul mm4,mm0 pfmul mm5,mm0 pfadd mm2,mm1 ;*xr * step + 0.4054 pfadd mm3,mm1 pfadd mm4,mm1 pfadd mm5,mm1 pfmax mm7,mm2 pf2id mm2,mm2 ;切捨て pfmax mm7,mm3 pf2id mm3,mm3 movq [eax+ecx],mm2 movq [eax+ecx+8],mm3 pfmax mm7,mm4 pf2id mm4,mm4 pfmax mm7,mm5 pf2id mm5,mm5 movq [eax+ecx+16],mm4 movq [eax+ecx+24],mm5 add ecx,32 jnz .lp movq mm1,mm7 psrlq mm7,32 pfmax mm7,mm1 pf2id mm7,mm7 movd eax,mm7 femms ret %endif ;------------------------------------------------------------------------ ; by K. SAKAI ; 99/08/18 2.3k[clk], latency が大きくて速くならない(;_;) ; 99/11/15 s/movups/movaps/ by K.SAKAI ; 00/01/21 1690[clk], ix_max を統合 by K.SAKAI align 16 quantize_xrpow_SSE: mov edx,[esp+ 4] ;edx=xr mov eax,[esp+12] ;eax=cod_info fild F_PTR [eax+quantizerStepSize] fmul F_PTR [_M01875] ;size * -0.1875 mov eax,[esp+8] ;eax=ix call pow2x ;step sub esp,F_SIZE fstp F_PTR [esp] ;- mov ecx,576*4 movss xmm0,[esp] add esp,F_SIZE movss xmm1,[_00946] shufps xmm0,xmm0,0x00 ;xmm0={step, step, step, step} shufps xmm1,xmm1,0x00 ;xmm1={0.4054, 0.4054, 0.4054, 0.4054} movaps xmm2,[edx+ecx-16] ;*xr xorps xmm7,xmm7 jmp .f0 align 16 .lp0: movaps xmm2,[edx+ecx-16] ;*xr movq [eax+ecx-48+48],mm6 movq [eax+ecx-40+48],mm7 .f0: movaps xmm4,[edx+ecx-32] ;*xr mulps xmm2,xmm0 ;*xr * step subps xmm2,xmm1 ;step * *xr - 0.0946 movaps xmm6,[edx+ecx-48] ;*xr sub ecx,48 mulps xmm4,xmm0 ;*xr * step subps xmm4,xmm1 ;step * *xr - 0.0946 cvtps2pi mm2,xmm2 ; 四捨五入(haveunit.nasで設定されてる) movhlps xmm3,xmm2 maxps xmm7,xmm2 movq [eax+ecx-16+48],mm2 mulps xmm6,xmm0 ;*xr * step subps xmm6,xmm1 ;step * *xr - 0.0946 cvtps2pi mm3,xmm3 cvtps2pi mm4,xmm4 ; 四捨五入(haveunit.nasで設定されてる) movhlps xmm5,xmm4 maxps xmm7,xmm4 movq [eax+ecx-8+48],mm3 movq [eax+ecx-32+48],mm4 cvtps2pi mm5,xmm5 movhlps xmm2,xmm6 cvtps2pi mm6,xmm6 ; 四捨五入(haveunit.nasで設定されてる) maxps xmm7,xmm6 movq [eax+ecx-24+48],mm5 cvtps2pi mm7,xmm2 jnz .lp0 movq [eax-48+48],mm6 movq [eax-40+48],mm7 movhlps xmm1,xmm7 maxps xmm7,xmm1 movss xmm1,xmm7 shufps xmm7,xmm7,0xB1 maxss xmm7,xmm1 cvtss2si eax,xmm7 emms ret ;************************************************************************ ; 99/08/10 ; by shigeo ; 約500clk ;void calc_pow4P3mono(int *ix,float *xr,float *step,float *sum,int n,int next); align 16 calc_pow4P3mono: push ebx push esi push edi %assign _P 4*3 fldz ;st0=s=0 mov ebx,[esp+_P+4] ;ebx=ix mov edx,[esp+_P+8] ;edx=xr mov eax,[esp+_P+12] ;eax=step fld dword [eax] ;st0=*step,s mov ecx,[esp+_P+20] ;ecx=n mov esi,[esp+_P+24] ;esi=next mov edi,pow4P3_table ;ptr to table shl esi,2 ;esi=next*sizeof(int) align 4 .lp: mov eax,[ebx] ;eax=*ix ; cmp eax,PRECALC_SIZE ; jae short .real_pow4P3 fld dword [edi+eax*4] ;temp=ix^(4/3),step,s .B0: fmul st0,st1 ;temp*step,step,s fld dword [edx] ;xr,temp*step,step,s add edx,esi fabs fsubrp st1,st0 ;temp:=|xr|-temp*step,step,s add ebx,esi fmul st0,st0 ;temp*temp,step,s faddp st2,st0 ;step,sum+=temp*temp dec ecx jnz short .lp fstp st0 ;s mov eax,[esp+_P+16] ;eax=sum fstp dword [eax] ;*sum=s,- pop edi pop esi pop ebx ret ;************************************************************************ ; 99/08/10 ; by shigeo ; st0〜st7を使いつくすのでこの関数を呼ぶ前は全てfreeでないといけない ; 1250clk ; どうしてもpowを使う可能性があるので3D Now!化はちょっと辛いか ; 99/10/17 ; 配列を大きくしたのでpowを使う可能性は無くなる ;void ;calc_pow4P3dual_FPU(int *ix,float *xr,float *step,float *sum,int n,int next); align 16 calc_pow4P3dual_FPU: %assign ADJ 576*4 ;2つ目のix/xrへのoffset push ebx push esi push edi %assign _P 4*3 fldz ;s0=0 fld st0 ;st0=s1=0,s0 mov ebx,[esp+_P+4] ;ebx=ix mov edx,[esp+_P+8] ;edx=xr mov eax,[esp+_P+12] ;eax=step fld dword [eax] ;step0,s1,s0 fld dword [eax+4] ;step1,step0,s1,s0 mov ecx,[esp+_P+20] ;ecx=n mov esi,[esp+_P+24] ;esi=next mov edi,pow4P3_table ;ptr to table shl esi,2 ;esi=next*sizeof(int) align 4 .lp: ;1つ目のpow4P3 mov eax,[ebx] ;eax=*ix ; cmp eax,PRECALC_SIZE ; jae .real_calc0 fld dword [edi+eax*4] ;temp:=*ix^(4/3),stp1,stp0,s1,s0 .B0: fmul st0,st2 ;temp*=stp0,stp1,stp0,s1,s0 test dword [edx],0x80000000 jz short .F0 fchs ;temp=-temp .F0: fsubr dword [edx] ;df0:=xr-temp,stp1,stp0,s1,s0 ;2つ目のpow4P3 mov eax,[ebx+ADJ] ;eax=*(ix+576) ; cmp eax,PRECALC_SIZE ; jae .real_calc1 fld dword [edi+eax*4] ;temp=*ix^(4/3),df0,stp1,stp0,s1,s0 .B1: fmul st0,st2 ;temp*=stp1,df0,stp1,stp0,s1,s0 test dword [edx+ADJ],0x80000000 jz short .F1 fchs ;temp=-temp .F1: fsubr dword [edx+ADJ] ;df1=xr-temp,df0,stp1,stp0,s1,s0 add ebx,esi add edx,esi fld st0 ;df1,df1,df0,stp1,stp0,s1,s0 fadd st0,st2 ;temp=df1+df0,df1,df0,stp1,stp0,s1,s0 fmul st0,st0 ;temp*=temp,df1,df0,stp1,stp0,s1,s0 faddp st6,st0 ;df1,df0,stp1,stp0,s1,s0+=temp fsubp st1,st0 ;temp=df0-df1,stp1,stp0,s1,s0 fmul st0,st0 faddp st3,st0 ;stp1,stp0,s1+=temp,s0 dec ecx jnz .lp fcompp ;s1,s0 fmul dword [_05] ;s1*0.5,s0 mov eax,[esp+_P+16] fstp dword [eax+4] ;s0 fmul dword [_05] ;s0*0.5 fstp dword [eax] ;- pop edi pop esi pop ebx ret ;------------------------------------------------------------------------ ; 99/08/11 ; でも取り合えず3D Now!化をやってみる ; 577clk ; 99/11/01 ; 若干の最適化 457clk by shigeo ; 99/11/23 ; 若干の最適化 435clk by kei ;void ;calc_pow4P3dual_3DN(int *ix,float *xr,float *step,float *sum,int n,int next); align 16 %if 1 calc_pow4P3dual_3DN: %assign ADJ 576*4 ;2つ目のix/xrへのoffset push ebx push esi push edi push ebp ;対応するpopは2箇所ある!!! %assign _P 4*4 femms pxor mm7,mm7 ;mm7=[s1:s0] ;私がこう書いた時は32〜63bitがs1の意味 mov ebx,[esp+_P+4] ;ebx=ix mov edx,[esp+_P+8] ;edx=xr mov eax,[esp+_P+12] ;eax=step movq mm6,[eax] ;mm6=[step1:step0] mov ecx,[esp+_P+20] ;ecx=n shr ecx,1 ;nはloop.cのsfBandIndex内の連続する数字の ;差でこれは常に偶数 mov esi,[esp+_P+24] ;esi=next shl esi,2 ;esi=next*sizeof(int) mov edi,pow4P3_table ;ptr to table mov ebp,D_MSB0_1 ;byte数省略のため(相変わらずセコイ) ;D_MSB1_1と共用するので要注意 align 4 .lp: ;う〜んここかなり辛い(うまい方法がないかなあ) mov eax,[ebx] ;eax=*ix ; cmp eax,PRECALC_SIZE ; jae dual_overflow movd mm0,[edi+eax*4] ;mm0=[0: temp0=*ix^(4/3)] mov eax,[ebx+ADJ] ;eax=*(ix+576) ; cmp eax,PRECALC_SIZE ; jae dual_overflow punpckldq mm0,[edi+eax*4] ;mm0=[tmp1:tmp0] add ebx,esi mov eax,[ebx] ;eax=*ix ; cmp eax,PRECALC_SIZE ; jae dual_overflow movd mm3,[edi+eax*4] ;mm3=[0: temp0=*ix^(4/3)] mov eax,[ebx+ADJ] ;eax=*(ix+576) ; cmp eax,PRECALC_SIZE ; jae near dual_overflow punpckldq mm3,[edi+eax*4] ;mm3=[tmp1:tmp0] movd mm1,[edx] ;mm1=[0:xr0] punpckldq mm1,[edx+ADJ] ;mm1=[xr1:xr0] add edx,esi movd mm4,[edx] ;mm4=[0:xr0] punpckldq mm4,[edx+ADJ] ;mm4=[xr1:xr0] movq mm2,[ebp-8];=[D_MSB1_1] ;mm2=[0x8000_0000:0x8000_0000] movq mm5,mm2 pfmul mm0,mm6 ;mm0=[tmp1*stp1:tmp0*stp0] pand mm2,mm1 ;mm2=[sign(xr1):sign(xr0)] pfmul mm3,mm6 pand mm5,mm4 pxor mm0,mm2 ;mm0=if( xr < 0)temp=-temp; pfsub mm1,mm0 ;mm1=diff:=[xr1-tmp1:xr0-tmp0] pxor mm3,mm5 pfsub mm4,mm3 add ebx,esi ;ix += next; add edx,esi ;xr += next; movq mm0,mm1 ;mm0=[dif1:dif0] movq mm3,mm4 punpckldq mm2,mm0 ;mm2=[dif0:*] punpckldq mm5,mm3 pxor mm1,[ebp];=[D_MSB0_1] ;mm1=[dif1:-dif0] punpckhdq mm0,mm2 ;mm0=[dif0:dif1] pxor mm4,[ebp];=[D_MSB0_1] punpckhdq mm3,mm5 pfsub mm0,mm1 ;mm0=tmp:=[dif0-dif1:dif0+dif1] pfsub mm3,mm4 pfmul mm0,mm0 ;mm0=tmp*tmp pfmul mm3,mm3 pfadd mm7,mm0 ;mm7=[s1:s0] pfadd mm7,mm3 dec ecx jnz near .lp pfmul mm7,[D_05] ;mm7=[s1*0.5:s0*0.5] mov eax,[esp+_P+16] movq qword [eax],mm7 femms pop ebp pop edi pop esi pop ebx ret %else ; 並列実行しやすい(と思われる^^;;)順番に変えたバージョン calc_pow4P3dual_3DN: %assign ADJ 576*4 ;2つ目のix/xrへのoffset push ebx push esi push edi push ebp %assign _P 4*4 femms mov eax,[esp+_P+12] ;eax=step pxor mm7,mm7 ;mm7=[s1:s0] ;私がこう書いた時は32〜63bitがs1の意味 mov ebx,[esp+_P+4] ;ebx=ix movq mm6,[eax] ;mm6=[step1:step0] mov edx,[esp+_P+8] ;edx=xr movq mm5,mm6 ;mm5=[step1:step0] mov ecx,[esp+_P+20] ;ecx=n punpckhdq mm6,[eax] ;mm6=[step1:step1] shr ecx,1 ;nはloop.cのsfBandIndex内の連続する数字の ;差でこれは常に偶数 mov esi,[esp+_P+24] ;esi=next punpckldq mm5,[eax] ;mm5=[step0:step0] mov edi,pow4P3_table ;ptr to table mov ebp,D_MSB1_1 shl esi,2 ;esi=next*sizeof(int) align 4 .lp: mov eax,[ebx] ;eax=*ix0 movd mm1,[edx] ;mm1=[0:xr0] movd mm0,[edi+eax*4] ;mm0=[0:pow(*ix0)] mov eax,[ebx+esi] ;eax=*(ix0+next) punpckldq mm0,[edi+eax*4] ;mm0=[pow(*(ix0+next)):pow(*ix0)] mov eax,[ebx+ADJ] ;eax=*(ix1) movd mm4,[edx+ADJ] ;mm4=[0:xr1] punpckldq mm1,[edx+esi] ;mm1=[xr0+next:xr0] movd mm3,[edi+eax*4] ;mm3=[0:pow(*(ix1)] mov eax,[ebx+esi+ADJ] ;eax=*(ix1+next) punpckldq mm4,[edx+esi+ADJ] ;mm4=[xr1+next:xr1] movq mm2,[ebp] ;mm2=[0x8000_0000:0x8000_0000] punpckldq mm3,[edi+eax*4] ;mm3=[pow(*(ix1+next):pow(*(ix1)] pfmul mm0,mm5 pand mm2,mm1 pfmul mm3,mm6 pxor mm0,mm2 lea ebx,[ebx+esi*2] ;ix += next*2; movq mm2,[ebp] ;mm2=[0x8000_0000:0x8000_0000] pfsub mm1,mm0 ;mm1 = [dif0(next):dif0] pand mm2,mm4 lea edx,[edx+esi*2] ;xr += next*2; pxor mm3,mm2 movq mm0,mm1 ;mm0=[dif0(next):dif0] pfsub mm4,mm3 ;mm4 = [dif1(next):dif1] pfadd mm0,mm4 ;mm0=[dif0(next)+dif1(next):dif0+dif1] pfsub mm1,mm4 ;mm3=[dif0(next)-dif1(next):dif0-dif1] pfmul mm0,mm0 pfmul mm1,mm1 pfacc mm0,mm0 pfacc mm1,mm1 punpckldq mm1,mm0 pfadd mm7,mm1 ;mm7=[s1:s0] dec ecx jnz near .lp mov eax,[esp+_P+16] pop ebp pfmul mm7,[D_05] ;mm7=[s1*0.5:s0*0.5] pop edi pop esi pop ebx movq qword [eax],mm7 femms ret %endif ;************************************************************************ ; 99/11/12 Initial version for SSE by K.Sakai ; pow を使わないと仮定:-) ; 790clk ;void ;calc_pow4P3dual_SSE(int *ix,float *xr,float *step,float *sum,int n,int next); align 16 calc_pow4P3dual_SSE: %assign ADJ 576*4 ;2つ目のix/xrへのoffset push ebx push esi push edi %assign _P 4*3 xorps xmm0,xmm0 ; = s0 = 0.0 xorps xmm1,xmm1 ; = s1 = 0.0 mov ebx,[esp+_P+4] ;ebx=ix mov edx,[esp+_P+8] ;edx=xr mov eax,[esp+_P+12] ;eax=step movss xmm6,[eax ] ; = step0 movss xmm7,[eax+4] ; = step1 mov ecx,[esp+_P+20] ;ecx=n mov esi,[esp+_P+24] ;esi=next mov edi,pow4P3_table ;ptr to table shl esi,2 ;esi=next*sizeof(int) jmp short .lp align 16 .lp: movss xmm4,[edx] movss xmm5,[edx+ADJ] ;1つ目のpow4P3 mov eax,[ebx] ;eax=*ix movss xmm2,[edi+eax*4] ; =* ix^(4/3) mulss xmm2,xmm6 ; *= stp0 movmskps eax,xmm4 test al,1 mov eax,[ebx+ADJ] ;eax=*(ix+576) movss xmm3,[edi+eax*4] ; = *ix^(4/3) jz short .f00 ; diff = (*xr >= 0)? (*xr - tmp): (*xr - (-tmp)); addss xmm4,xmm2 jmp short .f01 .f00: subss xmm4,xmm2 .f01: movss xmm2,xmm4 mulss xmm3,xmm7 ; *= stp1 movmskps eax,xmm5 test al,1 jz short .f10 ; diff = (*xr >= 0)? (*xr - tmp): (*xr - (-tmp)); addss xmm5,xmm3 jmp short .f11 .f10: subss xmm5,xmm3 .f11: add ebx,esi add edx,esi dec ecx addss xmm2,xmm5 subss xmm4,xmm5 mulss xmm2,xmm2 mulss xmm4,xmm4 addss xmm0,xmm2 addss xmm1,xmm4 jnz .lp mov eax,[esp+_P+16] movss xmm3,[_05] mulss xmm0,xmm3 ; s0*0.5 mulss xmm1,xmm3 ; s1*0.5 movss [eax],xmm0 movss [eax+4],xmm1 pop edi pop esi pop ebx ret ;************************************************************************ %if 0 ;00/01/16 ; 98/07/12 shigeo ; 00/01/05 ; 不要な分岐を削除(必ず !cod_info->window_switching_flag || cod_info->block_type != SHORT_TYPE である) ;void calc_runlen( int ix[576], gr_info *cod_info ); ; あちゃ〜これ全然速くないやん ; せめてMMXでも使わないと align 16 calc_runlen: push ebx %assign _P 4*1 mov ecx,[esp+_P+4] mov ebx,[esp+_P+8] .start: sub ecx,4 push esi mov edx,576*4 ;edx=i*4 mov eax,[ecx+edx-4] mov esi,[ecx+edx-0] .lp1: or eax,esi jne short .next mov eax,[ecx+edx-4-8] mov esi,[ecx+edx-0-8] sub edx,2*4 jnz short .lp1 .next: mov esi,0 ;esi=count1=0 cmp edx,3*4 jle short .exit %if 0 align 4 .lp2: mov eax,[ecx+edx-12] or eax,[ecx+edx- 8] or eax,[ecx+edx- 4] or eax,[ecx+edx- 0] cmp eax,1 jg short .exit2 inc esi sub edx,4*4 cmp edx,4*3 jg short .lp2 .exit2: %else ;こっちの方がちょこっと速いみたい(669 v.s. 653) push ebp .lp2: mov eax,[ecx+edx-12] mov ebp,[ecx+edx- 8] or eax,ebp mov ebp,[ecx+edx- 4] or eax,ebp mov ebp,[ecx+edx- 0] or eax,ebp inc esi cmp eax,1 jg short .exit2 sub edx,4*4 cmp edx,4*3 jg short .lp2 .exit2: dec esi pop ebp %endif .exit: mov [ebx+count1],esi pop esi shr edx,3 mov [ebx+big_values],edx pop ebx ret %endif ;************************************************************************ ;int ix_max( int ix[576], unsigned int begin, unsigned int end ); ; 99/08/14 ; 1840clk ; begin begin already align 16 ix_max_MMX: mov edx,[esp+8] ;edx = begin mov ecx,[esp+12] xor eax,eax sub ecx,edx ;ecx = end-begin ; jz .zero shl edx,2 add edx,[esp+4] shr ecx,1 ;ecx=ecx/2 pxor mm0,mm0 ;mm0=[0:0] pxor mm1,mm1 ;mm1=[0:0] ; jc .odd .even: test cl,1 jz .lp .two: movq mm1,[edx] and ecx,0xFFFFFFFE jz .exit add edx,8 align 16 .lp: movq mm4,[edx+ecx*8-16] movq mm5,[edx+ecx*8- 8] sub ecx,2 movq mm2,mm0 movq mm3,mm1 pcmpgtd mm2,mm4 pcmpgtd mm3,mm5 pand mm0,mm2 pand mm1,mm3 pandn mm2,mm4 pandn mm3,mm5 por mm0,mm2 por mm1,mm3 jnz .lp .exit: movq mm2,mm0 pcmpgtd mm2,mm1 pand mm0,mm2 pandn mm2,mm1 por mm0,mm2 movq mm4,mm0 punpckhdq mm4,mm4 movq mm2,mm0 pcmpgtd mm2,mm4 pand mm0,mm2 pandn mm2,mm4 por mm0,mm2 movd eax,mm0 emms .zero: ret ;------------------------------------------------------------------------ ;int ix_max_3DN( int ix[576], unsigned int begin, unsigned int end ); ; pi2fdを使っているので正確な値を返すためには ; ix[i]は2^24以内でなければならない ; このルーチンが使われる部分ではそんなに大きい値を取ることはない ; 99/08/14 ; 1040clk ; begin,end共に偶数であることを仮定する ; 800clk ; 00/01/05 ; bug fix if end == begin+2 計さんどうも align 16 ix_max_3DN: mov eax,[esp+4] ;eax=ix mov edx,[esp+8] ;edx=begin mov ecx,[esp+12] ;ecx=end sub ecx,edx ;ecx=end-begin lea edx,[eax+edx*4] ;edx=&ix[begin] xor eax,eax femms pxor mm0,mm0 ;mm0=[0:0] shr ecx,2 ;ecx=ecx/4(元のecxは偶数) jc short .two jmp .lp align 16 .lp: pi2fd mm1,[edx] ;4byteアラインしかされてない時もあるが pi2fd mm2,[edx+8] ;気にしないでおこう(^^; add edx,16 pfmax mm0,mm1 ;pfmaxはFPUの比較なのでpi2fdは必要 pfmax mm0,mm2 loop .lp .nokori: movq mm1,mm0 psrlq mm0,32 pfmax mm0,mm1 pf2id mm0,mm0 movd ecx,mm0 cmp eax,ecx ;eaxは一番最初か0 jae short .exit mov eax,ecx .exit: femms ret .two: pi2fd mm0,[edx] jz short .nokori ;上のZFを使う ecx==2だった add edx,8 jmp short .lp ;------------------------------------------------------------------------ ; 99/12/30 Initial version by kei-i ;int ix_max_E3DN( int ix[576], unsigned int begin, unsigned int end ); %ifdef USE_E3DN proc ix_max_E3DN mov eax,[esp+4] ;eax=ix mov edx,[esp+8] ;edx=begin mov ecx,[esp+12] ;ecx=end sub ecx,edx ;ecx=end-begin lea edx,[eax+edx*4] ;edx=&ix[begin] femms pxor mm6,mm6 ;mm6=[0:0] pxor mm7,mm7 ;mm7=[0:0] shr ecx,2 ;ecx=ecx/4(元のecxは偶数) jnc short .check.lp4 pi2fd mm7,[edx] jz near .nokori add edx,8 .check.lp4: mov eax, ecx and ecx, 3 jz short .check.lp16 jmp .lp4 align 16 .lp4: pi2fd mm1,[edx] pi2fd mm2,[edx+8] add edx,16 pfmax mm6,mm1 pfmax mm7,mm2 loop .lp4 .check.lp16: shr eax, 2 jz .nokori jmp short .lp16 align 16 .lp16: prefetch [edx+64] pi2fd mm0,[edx] pi2fd mm1,[edx+8] pi2fd mm2,[edx+16] pi2fd mm3,[edx+24] pfmax mm6, mm0 pfmax mm7, mm1 pi2fd mm0,[edx+32] pi2fd mm1,[edx+40] pfmax mm6, mm2 pfmax mm7, mm3 pi2fd mm2,[edx+48] pi2fd mm3,[edx+56] pfmax mm6, mm0 pfmax mm7, mm1 add edx,64 pfmax mm6, mm2 pfmax mm7, mm3 dec eax jnz near .lp16 .nokori: pfmax mm7, mm6 pswapd mm0, mm7 pfmax mm7,mm0 pf2id mm7,mm7 movd eax,mm7 .exit: femms ret %endif ;------------------------------------------------------------------------ ; 99/08/05 Initial version by K.Sakai 400clk ; 99/11/12 ちょっと変更 ; ;int ix_max_SSE( int ix[576], unsigned int begin, unsigned int end ); align 16 ix_max_SSE: mov edx,[esp+8] ;edx = begin mov ecx,[esp+12] xor eax,eax sub ecx,edx ;ecx = end-begin jbe .exit shl edx,2 add edx,[esp+4] shr ecx,1 ;ecx=ecx/2 xorps xmm0,xmm0 ;xmm0=[0:0] xorps xmm1,xmm1 ;xmm1=[0:0] ; jc .odd .even: test cl,1 jnz .two jmp short .lp align 16 .lp: cvtpi2ps xmm1,[edx+ecx*8-16] cvtpi2ps xmm2,[edx+ecx*8-8] sub ecx,2 movlhps xmm1,xmm2 maxps xmm0,xmm1 jnz .lp .two_exit: movhlps xmm1,xmm0 maxps xmm0,xmm1 movss xmm1,xmm0 shufps xmm0,xmm0,0xB1 maxss xmm0,xmm1 cvtss2si eax,xmm0 .exit: ret .two: movlhps xmm0,xmm0 cvtpi2ps xmm0,[edx] and ecx,0xFFFFFFFE jz .two_exit add edx,8 jmp .lp ;*********************************************************************** ; by shigeo ; 99/08/27 ; 5分で作る(^^; ; しもた。こんなの残ってたとは。quantize_xrpowとくっつけられんかな ; 若干の最適化(13000clk) ; 00/04/09 keiさんのに置き換え ;void calc_pow075_3DN( float *xr, float *xrpow ); align 16 %if 1 calc_pow075_3DN: mov eax,[esp+4] ;eax=xr mov edx,[esp+8] ;edx=xrpow mov ecx,-576*4 add eax, 576*4 add edx, 576*4 femms jmp .lp align 16 .lp: %assign i 0 %rep 8 movq mm0, [eax+ecx+fsizen(i)] pand mm0, [D_ABS] movq mm4,mm0 punpckhdq mm4,mm4 pfrsqrt mm1, mm0 pfrsqrt mm5, mm4 movq mm2, mm1 movq mm6, mm5 pfmul mm1, mm1 pfmul mm5, mm5 pfrsqit1 mm1, mm0 pfrsqit1 mm5, mm4 pfrcpit2 mm1, mm2 pfrcpit2 mm5, mm6 pfrsqrt mm3, mm1 pfrsqrt mm7, mm5 movq mm2, mm3 movq mm6, mm7 pfmul mm3, mm3 pfmul mm7, mm7 pfrsqit1 mm3, mm1 pfrsqit1 mm7, mm5 pfrcpit2 mm3, mm2 pfrcpit2 mm7, mm6 punpckldq mm3,mm7 movq mm7, mm3 pfmul mm3, mm3 pfmul mm3, mm7 movq [edx+ecx+fsizen(i)], mm3 %assign i i+2 %endrep add ecx, 64 jnz near .lp .owari femms ret %else calc_pow075_3DN: mov eax,[esp+4] ;eax=xr mov edx,[esp+8] ;edx=xrpow mov ecx,576/2 femms movq mm7,[D_ABS] jmp .lp align 16 .lp: movq mm0,[eax] add eax,8 pand mm0,mm7 pfrsqrt mm1,mm0 movq mm3,mm0 movq mm2,mm1 psrlq mm3,32 ;mm3=|xr[i+1]| pfmul mm1,mm1 pfrsqrt mm4,mm3 pfrsqit1 mm1,mm0 movq mm5,mm4 pfmul mm4,mm4 pfrcpit2 mm1,mm2 ;mm1=1/√|xr[i]| pfrsqit1 mm4,mm3 pfrsqrt mm0,mm1 pfrcpit2 mm4,mm5 ;mm4=1/√|xr[i+1]| movq mm2,mm0 pfrsqrt mm3,mm4 pfmul mm0,mm0 movq mm5,mm3 pfmul mm3,mm3 pfrsqit1 mm0,mm1 pfrsqit1 mm3,mm4 pfrcpit2 mm0,mm2 ;mm0=√√|xr[i]| pfrcpit2 mm3,mm5 ;mm3=√√|xr[i+1]| punpckldq mm0,mm3 ;mm0=[√√|xr[i+1]|:√√|xr[i]|] movq mm1,mm0 pfmul mm0,mm0 pfmul mm0,mm1 ;mm0=[|xr|^(3/4)] movq [edx],mm0 add edx,8 loop .lp femms ret %endif ;*********************************************************************** ; by kei ; 00/03/02 %ifdef USE_E3DN ;void calc_pow075_E3DN( float *xr, float *xrpow ); align 16 calc_pow075_E3DN: ; extern _clkbegin ; extern _clkend ; call _clkbegin mov eax,[esp+4] ;eax=xr mov edx,[esp+8] ;edx=xrpow mov ecx,-576*4 add eax, 576*4 add edx, 576*4 femms jmp .lp align 16 .lp: prefetch [eax+ecx+64] prefetchw [edx+ecx+64] %assign i 0 %rep 8 movq mm0, [eax+ecx+fsizen(i)] pand mm0, [D_ABS] pswapd mm4, mm0 pfrsqrt mm1, mm0 pfrsqrt mm5, mm4 movq mm2, mm1 movq mm6, mm5 pfmul mm1, mm1 pfmul mm5, mm5 pfrsqit1 mm1, mm0 pfrsqit1 mm5, mm4 pfrcpit2 mm1, mm2 pfrcpit2 mm5, mm6 pfrsqrt mm3, mm1 pfrsqrt mm7, mm5 movq mm2, mm3 movq mm6, mm7 pfmul mm3, mm3 pfmul mm7, mm7 pfrsqit1 mm3, mm1 pfrsqit1 mm7, mm5 pfrcpit2 mm3, mm2 pfrcpit2 mm7, mm6 punpckldq mm3,mm7 movq mm7, mm3 pfmul mm3, mm3 pfmul mm3, mm7 movq [edx+ecx+fsizen(i)], mm3 %if 0 ; まっとうな命令順バージョン movq mm0, [eax+ecx+fsizen(i)] pand mm0, [D_ABS] pswapd mm4, mm0 pfrsqrt mm1, mm0 movq mm2, mm1 pfmul mm1, mm1 pfrsqit1 mm1, mm0 pfrcpit2 mm1, mm2 pfrsqrt mm3, mm1 movq mm2, mm3 pfmul mm3, mm3 pfrsqit1 mm3, mm1 pfrcpit2 mm3, mm2 pfrsqrt mm5, mm4 movq mm6, mm5 pfmul mm5, mm5 pfrsqit1 mm5, mm4 pfrcpit2 mm5, mm6 pfrsqrt mm7, mm5 movq mm6, mm7 pfmul mm7, mm7 pfrsqit1 mm7, mm5 pfrcpit2 mm7, mm6 punpckldq mm3,mm7 movq mm7, mm3 pfmul mm3, mm3 pfmul mm3, mm7 movq [edx+ecx+fsizen(i)], mm3 %endif %assign i i+2 %endrep add ecx, 64 jnz near .lp .owari femms ; call _clkend ret %endif ;************************************************************************ ; 99/08/27 Initial version by K.SAKAI, 2700clk ←ホンマかいな... ; 99/11/15 s/movups/movaps/ by K.SAKAI ;void calc_pow075_SSE( float *xr, float *xrpow ); align 16 calc_pow075_SSE: movlps xmm7,[D_ABS] mov eax,[esp+4] ;eax=xr mov edx,[esp+8] ;edx=xrpow mov ecx,576/8 movlhps xmm7,xmm7 jmp short .lp0 ; 4並列処理×2 align 16 .lp0: movaps xmm0,[eax+ 0] movaps xmm1,[eax+16] add eax,32 andps xmm0,xmm7 ; abs() 符号ビットを0にする andps xmm1,xmm7 ; abs() 符号ビットを0にする rsqrtps xmm2,xmm0 ; 1/√a rsqrtps xmm3,xmm1 ; 1/√a mulps xmm0,xmm2 ; √a mulps xmm1,xmm3 ; √a rsqrtps xmm2,xmm2 ; √√a rsqrtps xmm3,xmm3 ; √√a mulps xmm2,xmm0 mulps xmm3,xmm1 movaps xmm0,xmm2 movaps xmm1,xmm3 cmpps xmm0,xmm0,0 ; NaNかどうか cmpps xmm1,xmm1,0 ; NaNかどうか andps xmm2,xmm0 ; 演算途中でNaNになってたら零にする andps xmm3,xmm1 ; 演算途中でNaNになってたら零にする movaps [edx+ 0],xmm2 movaps [edx+16],xmm3 add edx,32 dec ecx jnz .lp0 ret ; by K.SAKAI ; 99/08/27 ;************************************************************************ ;void calc_pow075_FPU( float *xr, float *xrpow ); ; 正直にsqrtすると60k[clk]@PII, 68k[clk]@P55C align 16 calc_pow075_FPU: mov eax,[esp+4] ;eax=xr mov edx,[esp+8] ;edx=xrpow mov ecx,576 jmp short .lp0 align 16 .lp0: fld dword [eax] add eax,4 fabs fld st0 fsqrt fmulp st1,st0 fsqrt fstp dword [edx] add edx,4 dec ecx jnz .lp0 ret ; by K.SAKAI ; 99/08/30 2項定理による級数近似 38k[clk]〜55k[clk] ; ; y = x^0.75 ; ; b = x - 1, 0 < x < 2 ; y = 1 ; + b*3/(4) ; - b*b*3/(4*4*2) ; + b*b*b*3*5/(4*4*4*2*3) ; - b*b*b*b*3*5*9/(4*4*4*4*2*3*4) ; + b*b*b*b*b*3*5*9*13/(4*4*4*4*4*2*3*4*5) ; - b*b*b*b*b*b*3*5*9*13*17/(4*4*4*4*4*4*2*3*4*5*6) ; + b*b*b*b*b*b*b*3*5*9*13*17*21/(4*4*4*4*4*4*4*2*3*4*5*6*7) ; - b*b*b*b*b*b*b*b*3*5*9*13*17*21*25/(4*4*4*4*4*4*4*4*2*3*4*5*6*7*8) ; ; mantissa, exponent に分離して級数近似をmantissaに適用。 ; exponentは単に3/4することにして、端数はmantissaに乗算する。 ; ; 案1) -0.25 <= b <= 0.25 に収める ; 1.0 <= mantissa <= 1.25 そのまま ; 1.2 <= mantissa < 2.0 x0.625する、結果に1.6^0.75をかける? ; ; 案2) -0.125 <= b <= 0.125 に収める ; 1.0 <= mantissa <= 1.28125(1.01001b) ; x0.875(14/16) ; 1.272727 < mantissa <= 1.625(1.101b) ; x0.6875(11/16) ; 1.555555 < mantissa < 2.0 ; x0.5625(9/16) align 16 calc_pow075_NONE: push ebp push ebx push esi push edi %assign _P 4*4 mov ebx,576 jmp short .lp0 align 16 .lp0: ; ecx = *xr++ mov esi,[esp+_P+4] mov ecx,[esi+ebx*4-4] xor edx,edx rol ecx,9 test cl,cl jz near .store ; de-normalized number cmp cl,255 je near .store ; not a number mov edi,ecx stc rcr edi,1 shr edi,8 ; mantissa, fixed point 9.23 xor ebp,ebp cmp edi,0x00A40000 ; 1.28125, fixed point 9.23 adc ebp,edx cmp edi,0x00D00000 ; 1.625, fixed point 9.23 adc ebp,edx movzx eax,byte [pow075_table1 + ebp] shl ebp,4 mul edi ; edx:eax = 37.27形式 %if 0 mov edi,eax sub edi,(1<<27) ; edi - 1.0, 5.27形式 %else lea edi,[eax-(1<<27)] %endif ; start approximation ; y = 1 mov esi,(1<<29) ; esi = 1.0, 3.29形式 ; + b*3/(4) mov eax,edi shl eax,1 add eax,edi ; eax = 3.29形式 add esi,eax ; esi = 3.29形式 ; - b*b*3/(4*4*2) imul edi ; edx:eax = 5.59形式 %if 0 shld edx,eax,2 %else shl edx,2 %endif sub esi,edx ; 第3項↑までで1万分の1以下, 28k[clk]@PII, 46k[clk]@P55C ; ここで精度はSSEの逆平方根より良いかも ; + b*b*b*3*5/(4*4*4*2*3) mov eax,0x6AAAAAAA ; 5/(4*3), 0.32形式 imul edx ; edx:eax = 3.61形式 mov eax,edx imul edi ; edx:eax = 8.56形式 %if 0 shld edx,eax,5 %else shl edx,5 %endif add esi,edx ; 第4項↑までで10万分の1以下, 33k[clk]@PII, 55k[clk]@P55C %if 0 ; - b*b*b*b*3*5*9/(4*4*4*4*2*3*4) mov eax,0x48000000 ; 9/(4*4), 1.31形式 imul edx ; edx:eax = 4.60形式 mov eax,edx imul edi ; edx:eax = 9.55形式 shld edx,eax,6 sub esi,edx ; 第5項↑までで10万分の1以下(mantissaの下数ビットがずれる程度), 40k[clk]@PII ; + b*b*b*b*b*3*5*9*13/(4*4*4*4*4*2*3*4*5) mov eax,0x53333333 ; 13/(4*5), 1.31形式 imul edx ; edx:eax = 4.60形式 mov eax,edx imul edi ; edx:eax = 9.55形式 shld edx,eax,6 add esi,edx ; 第6項↑まででは近似区間の両端でmantissaのLSBがずれる程度だとおもう。 ; LSB程度のずれということは、rounding の違いかも。 %endif ; ; at here, ; esi is mantissa(3.29 fixed point) ; cl is exponent(offset binary) ; calculate exponent sub cl,127 xor eax,eax mov al,cl and al,3 sar cl,2 mov eax,[pow075_table0+ebp+eax*4] imul esi ; edx:eax = 9.55形式, 1.0 <= edx:eax < 8.0 ; edx に 9.23形式の仮数が入ってる。 ; normalize xor eax,eax ; 符号ビットは正(=0) mov al,cl add cl,cl add al,cl ; al = 正規化前の指数部(2's comp.) bsr ecx,edx sub cl,23 add al,cl add al,127 ; al = 正規化後の指数部(offset bin.) %if 0 neg cl add cl,9 shl edx,cl ; normalize the mantissa shrd edx,eax,9 %else %if 0 neg cl add cl,9 shl edx,cl ; normalize the mantissa mov dl,al ror edx,8 clc rcr edx,1 %else shr edx,cl ; normalize the mantissa and edx,0x007fffff shl eax,23 or edx,eax %endif %endif ; *xrpow++ = edx .store: mov edi,[esp+_P+8] mov [edi+ebx*4-4],edx dec ebx jnz near .lp0 .return: pop edi pop esi pop ebx pop ebp ret ;************************************************************************ ; input eax ; output st0=pow(2,eax/4) ; dest eax,edx align 16 pow2iP4: mov edx,eax and edx,3 shr eax,2 fld dword [powiP4table+edx*4] ;2^(edx/4) shl eax,23 add eax,0x3F800000 ;eax=2^m push eax fld dword [esp] ;*(float *)&m,ret fmulp st1,st0 pop eax ret ;------------------------------------------------------------------------ ; input eax ; output st0=pow(2,eax/16) ; dest eax,edx align 16 pow2iP16: mov edx,eax and edx,15 shr eax,4 fld dword [powiP16table+edx*4] ;2^(edx/16) shl eax,23 add eax,0x3F800000 ;eax=2^m push eax fld dword [esp] ;*(float *)&m,ret fmulp st1,st0 pop eax ret ;************************************************************************ ; 99/09/04 by shigeo ; なんかせこいのばかり作ってる(^^; ;void ms_convert(float xr[2][576],float xr_org[2][576]); align 16 ms_convert_FPU: push ebx %assign _P 4*1 fld dword [D_1Psqr2] ;1/√2 mov eax,[esp+_P+4] ;eax=xr[0] mov edx,[esp+_P+8] ;edx=xr_org[0] mov ecx,576 mov ebx,4*576 jmp .lp align 16 .lp: fld dword [edx] ;org0,1/√2 fld st0 ;org0,org0,1/√2 fld dword [edx+ebx] ;org1,org0,org0,1/√2 add edx,4 fadd st1,st0 ;org1,org0+org1,org0,1/√2 fsubp st2,st0 ;org0+org1,org0-org1,1/√2 fmul st0,st2 ;(org0+org1)/√2,org0-org1,1/√2 fstp dword [eax] ;org0-org1,1/√2,1/√2 fmul st0,st1 ;(org0-org1)/√2,1/√2 fstp dword [eax+ebx] ;1/√2 add eax,4 dec ecx jnz .lp .exit: fstp st0 ;- pop ebx ret ;------------------------------------------------------------------------ align 16 ms_convert_3DN: push ebx femms %assign _P 4*1 movq mm7,[D_1Psqr2] ;mm7=[1/√2:1/√2] mov eax,[esp+_P+4] ;eax=xr[0] mov edx,[esp+_P+8] ;edx=xr_org[0] mov ecx,576/2 mov ebx,4*576 jmp .lp align 16 .lp: movq mm0,[edx] ;mm0=org0 movq mm1,[edx+ebx] ;mm1=org1 movq mm2,mm0 ;mm2=org0 add edx,8 pfadd mm0,mm1 ;mm0=org0+org1 pfmul mm0,mm7 pfsub mm2,mm1 ;mm2=org0-org1 pfmul mm2,mm7 movq [eax],mm0 movq [eax+ebx],mm2 add eax,8 loop .lp .exit: femms pop ebx ret ;------------------------------------------------------------------------ ; 00/01/21 by Kei %ifdef USE_E3DN align 16 ms_convert_E3DN: ; extern _clkbegin ; extern _clkend ; call _clkbegin femms %assign _P 4*1 movq mm7,[D_1Psqr2] ;mm7=[1/√2:1/√2] mov ecx,-576*4 mov eax,[esp+_P] ;eax=xr[0] mov edx,[esp+_P+4] ;edx=xr_org[0] sub eax, ecx sub edx, ecx jmp .lp align 16 .lp: prefetch [edx+ecx+64] ; prefetchw [eax+ecx+64] %assign i 0 %rep 4 movq mm0,[edx+ecx+fsizen(i)] ;mm0=org0 movq mm3,[edx+ecx+fsizen(i+2)] ;mm3=org0 movq mm1,[edx+ecx+fsizen(576+i)] ;mm1=org1 movq mm4,[edx+ecx+fsizen(576+i+2)] ;mm4=org1 movq mm2,mm0 ;mm2=org0 movq mm5,mm3 ;mm5=org0 pfadd mm0,mm1 ;mm0=org0+org1 pfadd mm3,mm4 ;mm3=org0+org1 pfsub mm2,mm1 ;mm2=org0-org1 pfsub mm5,mm4 ;mm5=org0-org1 pfmul mm0,mm7 pfmul mm3,mm7 movq [eax+ecx+fsizen(i)],mm0 movq [eax+ecx+fsizen(i+2)],mm3 pfmul mm2,mm7 pfmul mm5,mm7 movq [eax+ecx+fsizen(576+i)],mm2 movq [eax+ecx+fsizen(576+i+2)],mm5 %assign i i+4 %endrep add ecx, 64 jnz near .lp .exit: femms ; call _clkend ret %endif ;------------------------------------------------------------------------ ; 99/11/?? Initial version by K.SAKAI ; 99/11/15 s/movups/movaps/ by K.SAKAI align 16 ms_convert_SSE: movss xmm7,[D_1Psqr2] ;1/√2 shufps xmm7,xmm7,0x00 mov eax,[esp+4] ;eax=xr[0] mov edx,[esp+8] ;edx=xr_org[0] mov ecx,(576-4)*4 jmp short .lp0 align 16 .lp0: movaps xmm0,[edx+ecx] ;xmm0=org0 movaps xmm2,xmm0 movaps xmm1,[edx+ecx+4*576] ;xmm1=org1 addps xmm0,xmm1 mulps xmm0,xmm7 subps xmm2,xmm1 mulps xmm2,xmm7 movaps [eax+ecx ],xmm0 movaps [eax+ecx+4*576],xmm2 sub ecx,4*4 jae .lp0 .exit: ret ;************************************************************************ ; 00/01/16 by shigeo ;int calc_runlen_count1_NONE( int *ix, gr_info *cod_info ); ; 1190clk (calc_runlen + count1_bitcountと殆ど変わらず) ; 970clk a little optimization proc calc_runlen_count1_NONE push ebx push esi push edi push ebp %assign _P 4*4 xor esi,esi ;esi=sum00 mov ecx,576-2 mov ebx,[esp+_P+4] ;ebx=ix xor edi,edi ;edi=sum01 add ebx,(576-2)*4 ;ebx=ix[576-2]; align 4 .lp1: mov eax,[ebx] or eax,[ebx+4] jnz .F0 sub ebx,8 sub ecx,2 jg .lp1 xor ebp,ebp ;count1=0 jmp short .exit1 .F0: sub ecx,2 ;ecx=i-4 sub ebx,8 push ecx align 4 .lp2: mov ebp,[ebx] ;v mov edx,[ebx+4] ;w lea eax,[edx+ebp*2] ;w+(v<<1) or edx,ebp mov ebp,[ebx+8] ;x lea eax,[ebp+eax*2] ;x+(w<<1)+(v<<2) or edx,ebp mov ebp,[ebx+12] ;y or edx,ebp cmp edx,1 ja .exit2 lea eax,[ebp+eax*2] ;y+(x<<1)+(w<<2)+(v<<3) sub ebx,16 add esi,[count1_table+eax*4] ;sum00 += v + w + x + y; add edi,[hlen32_table+eax*4] ;sum01 += hlen32[p]; sub ecx,4 jge .lp2 .exit2: pop ebp sub ebp,ecx shr ebp,2 ;count1 .exit1: add ecx,4 ;ecx=i mov edx,[esp+_P+8] shr ecx,1 lea eax,[esi+edi] ;eax=sum0 mov [edx+big_values],ecx ;big_values=i/2; mov [edx+count1],ebp lea ecx,[esi+ebp*4] ;ecx=sum1 pop ebp sub eax,ecx ;eax = eax-ecx pop edi sbb ebx,ebx ;ebx = (eax 0 */ ; p++; ; } ; return ct; ;} %ifdef USE_E3DN proc count_nz_xr_E3DN ; extern _clkbegin ; extern _clkend ; call _clkbegin %$xr arg 4 femms mov r0, [sp(%$xr)] .for_init: mov r2, 576/16 pxor mm7, mm7 pmov mm6, [D_ABS] pxor mm5, mm5 jmp near .for align 16 .for: ; AMD のドキュメント通りだと、700bytes 先くらいを prefetch せよってことに ; なるのだけど・・・64bytes 先が一番速かった(^^;; ; prefetch するデータは大抵 2nd キャッシュにはあるはずやしねえ prefetch [r0+64] pmov mm0, [r0+fsizen(0)] pmov mm1, [r0+fsizen(2)] pmov mm2, [r0+fsizen(4)] pand mm0, mm6 pmov mm3, [r0+fsizen(6)] pand mm1, mm6 pand mm2, mm6 pcmpgtd mm0, mm5 pand mm3, mm6 pcmpgtd mm1, mm5 pcmpgtd mm2, mm5 psubd mm7, mm0 pcmpgtd mm3, mm5 pmov mm0, [r0+fsizen(8)] psubd mm7, mm1 pmov mm1, [r0+fsizen(10)] psubd mm7, mm2 pmov mm2, [r0+fsizen(12)] psubd mm7, mm3 pmov mm3, [r0+fsizen(14)] pand mm0, mm6 pand mm1, mm6 pand mm2, mm6 pcmpgtd mm0, mm5 pand mm3, mm6 pcmpgtd mm1, mm5 pcmpgtd mm2, mm5 psubd mm7, mm0 pcmpgtd mm3, mm5 psubd mm7, mm1 add r0, fsizen(16) psubd mm7, mm2 .for_next: dec r2 psubd mm7, mm3 jnz near .for pswapd mm6, mm7 pmovd r0, mm7 pmovd r2, mm6 femms add r0, r2 ; call _clkend endproc %endif %macro count_nz_xr_MMX_macro 2 ; in ; %1 : xr ; work ; %2 : loop counter ; out ; %1 : result .for_init: mov %2, 576/8 pxor mm7, mm7 pmov mm6, [D_ABS] pxor mm5, mm5 jmp near .for align 16 .for: pmov mm0, [%1+fsizen(0)] pmov mm1, [%1+fsizen(2)] pmov mm2, [%1+fsizen(4)] add %1, fsizen(8) pand mm0, mm6 pmov mm3, [%1+fsizen(6-8)] pand mm1, mm6 pand mm2, mm6 pcmpgtd mm0, mm5 pand mm3, mm6 pcmpgtd mm1, mm5 pcmpgtd mm2, mm5 psubd mm7, mm0 pcmpgtd mm3, mm5 psubd mm7, mm1 psubd mm7, mm2 .for_next: dec %2 psubd mm7, mm3 jnz near .for pmovd %1, mm7 psrlq mm7, 32 pmovd %2, mm7 add %1, %2 %endmacro proc count_nz_xr_3DN ; extern _clkbegin ; extern _clkend ; call _clkbegin %$xr arg 4 femms mov r0, [sp(%$xr)] count_nz_xr_MMX_macro r0, r2 femms ; call _clkend endproc proc count_nz_xr_MMX ; call _clkbegin %$xr arg 4 emms mov r0, [sp(%$xr)] count_nz_xr_MMX_macro r0, r2 emms ; call _clkend endproc ;************************************************************************ ; 99/11/22 set_l3_enc_sign_3DN, set_l3_enc_sign_MMX by Kei ; 00/01/21 set_l3_enc_sign_E3DN by Kei ;void ;set_l3_enc_sign_C(float xr[], int l3_enc[]) ;{ ; int *pi = l3_enc; ; int *p = (int *)xr; ; int i; ; for( i = 0; i < 576; i++ ){ ; if( (*p & 0x80000000) && (*pi > 0) )*pi = -*pi; ; p++; ; pi++; ; } ;} %ifdef USE_E3DN proc set_l3_enc_sign_E3DN ; extern _clkbegin ; extern _clkend ; call _clkbegin %$xr arg 4 %$l3_enc arg 4 femms mov r0, [sp(%$xr)] mov r3, [sp(%$l3_enc)] .for_init: mov r2, -fsizen(576) pxor mm7, mm7 sub r0, r2 sub r3, r2 jmp near .for align 16 .for: prefetch [r0+r2+64] prefetchw [r3+r2+64] %assign i 0 %rep 4 pmov mm0, [r3+r2+fsizen(i+0)] ; mm0=[l3_enc[i]] pmov mm3, [r3+r2+fsizen(i+2)] ; mm3=[l3_enc[i+1]] pmov mm1, mm0 ; mm1=[l3_enc[i]] pmov mm4, mm3 ; mm4=[l3_enc[i+1]] pcmpgtd mm0, mm7 ; mm0=iif(l3_enc[i]>0,-1,0) pcmpgtd mm3, mm7 ; mm3=iif(l3_enc[i+1]>0,-1,0) pand mm0, [r0+r2+fsizen(i+0)] ; pand mm3, [r0+r2+fsizen(i+2)] ; psrad mm0, 31 ; mm0=iif(l3_enc[i]>0 && xr[i]<0,-1,0) psrad mm3, 31 ; mm3=iif(l3_enc[i+1]>0 && xr[i+1]<0,-1,0) pmov mm2, mm0 pmov mm5, mm3 pcmpeqd mm2, mm7 ; mm2=iif(同上,0,-1) pcmpeqd mm5, mm7 ; mm5=iif(同上,0,-1) pand mm0, mm1 ; mm0=iif(同上,l3_enc[i],0) pand mm3, mm4 ; mm3=iif(同上,l3_enc[i+1],0) pand mm2, mm1 ; mm2=iif(同上,0,l3_enc[i]) pand mm5, mm4 ; mm5=iif(同上,0,l3_enc[i+1]) psubd mm2, mm0 ; mm2=iif(同上,-l3_enc[i],l3_enc[i]) psubd mm5, mm3 ; mm5=iif(同上,-l3_enc[i+1],l3_enc[i+1]) pmov [r3+r2+fsizen(i+0)], mm2 pmov [r3+r2+fsizen(i+2)], mm5 %assign i i+4 %endrep .for_next: add r2, fsizen(16) jnz near .for femms ; call _clkend endproc %endif %macro set_l3_enc_sign_MMX_macro 3 ; in ; %1 : xr ; %2 : l3_enc ; work ; %3 : loop counter .for_init: mov %3, 576/4 pxor mm7, mm7 jmp near .for align 16 .for: pmov mm0, [%2+fsizen(0)] ; mm0=[l3_enc[i]] pmov mm3, [%2+fsizen(2)] ; mm3=[l3_enc[i+1]] pmov mm1, mm0 ; mm1=[l3_enc[i]] pmov mm4, mm3 ; mm4=[l3_enc[i+1]] pcmpgtd mm0, mm7 ; mm0=iif(l3_enc[i]>0,-1,0) pcmpgtd mm3, mm7 ; mm3=iif(l3_enc[i+1]>0,-1,0) pand mm0, [%1+fsizen(0)] ; pand mm3, [%1+fsizen(2)] ; add %1, fsizen(4) psrad mm0, 31 ; mm0=iif(l3_enc[i]>0 && xr[i]<0,-1,0) psrad mm3, 31 ; mm3=iif(l3_enc[i+1]>0 && xr[i+1]<0,-1,0) pmov mm2, mm0 pmov mm5, mm3 pcmpeqd mm2, mm7 ; mm2=iif(同上,0,-1) pcmpeqd mm5, mm7 ; mm5=iif(同上,0,-1) pand mm0, mm1 ; mm0=iif(同上,l3_enc[i],0) add %2, fsizen(4) pand mm3, mm4 ; mm3=iif(同上,l3_enc[i+1],0) pand mm2, mm1 ; mm2=iif(同上,0,l3_enc[i]) pand mm5, mm4 ; mm5=iif(同上,0,l3_enc[i+1]) psubd mm2, mm0 ; mm2=iif(同上,-l3_enc[i],l3_enc[i]) psubd mm5, mm3 ; mm5=iif(同上,-l3_enc[i+1],l3_enc[i+1]) pmov [%2+fsizen(0-4)], mm2 .for_next: dec %3 pmov [%2+fsizen(2-4)], mm5 jnz near .for %endmacro proc set_l3_enc_sign_3DN %$xr arg 4 %$l3_enc arg 4 femms mov r0, [sp(%$xr)] mov r3, [sp(%$l3_enc)] set_l3_enc_sign_MMX_macro r0, r3, r2 femms endproc proc set_l3_enc_sign_MMX %$xr arg 4 %$l3_enc arg 4 emms mov r0, [sp(%$xr)] mov r3, [sp(%$l3_enc)] set_l3_enc_sign_MMX_macro r0, r3, r2 emms endproc ;void calc_xmin_long( float *xr, float *l3_xmin, float *ratio ); ; 00/04/10 by shigeo ; 2300clk on K6-III 350 proc calc_xmin_long_3DN push ebx push esi push edi push ebp femms %assign _P 4*4 mov eax,[esp+_P+4] ;eax=xr xor ecx,ecx ;ecx=sfb=0 xor esi,esi ;esi=i=0 mov ebx,[esp+_P+8] ;ebx=l3_xmin mov edx,[esp+_P+12] ;edx=ratio mov ebp,ATH_l ;ebp=ATH_l pmov mm7,[masking_lower] .lp_sfb: mov edi,[scalefac_long] pxor mm0,mm0 ;en0=0 mov edi,[edi+ecx*4+4] .lp: movq mm1,[eax] add eax,8 add esi,2 pfmul mm1,mm1 cmp esi,edi pfadd mm0,mm1 jnz short .lp pfacc mm0,mm0 ;mm0=en0 pfmul mm0,mm7 pfmul mm0,[scalefac_longR+ecx*4] movd mm1,[ebp+ecx*4] pfmul mm0,[edx+ecx*4] pfmax mm0,mm1 movd [ebx+ecx*4],mm0 inc ecx cmp ecx,SFB_LMAX-1 jnz short .lp_sfb .exit: femms pop ebp pop edi pop esi pop ebx ret ;************************************************************************ end gogo239b/readme.txt100644 23421 144 21245 7225622127 13355 0ustar shigeousers 午後のこ〜だ ver. 2.39b for x86-CPUを搭載した殆んどのOS updated 2001/1/6 ◆ 概要 wavデータを[ISO/IEC 11172]MPEG規格にて定められた音声データに変換します。 いわゆるmp3エンコーダです。 LAME 3.29β(一部3.55β)を元にx86-CPU向けに高度に最適化されています。 3D Now!, SSE等最新のCPU命令やマルチCPUに対応していて、高速なエンコードが 可能です。(SSE, SMPはOSが対応している必要があります) ◆ 特許と配布 mp3の生成アルゴリズムのうち根幹の部分は、いくつかの企業によって特許 がとられています。 それらのうちFhGとThomson Multimediaはその特許使用料を要求しています。 しかし現在、日本ではプログラムは「物」として扱われないので、「方法」 の特許発明については、ソース、バイナリともに「日本国内のユーザに向け てネット上で配布」する行為は特許権侵害にはならないと考えます (将来の法改正等によりプログラムの特許発明の「実施」について明定された 場合には、その限りではありません)。 また、午後のこ〜だは、独自に開発したものであり、著作権侵害にもならない と考えます。 このような判断に基づき、ソースの配布を再開することにしました。 (2000/12/8現在) 出版社で雑誌付録のCD-ROMへ収録する場合や、企業で午後のこ〜だを使う 場合は、これらの行為が特許権侵害や著作権侵害になるか否かについて、 各社でご判断ください。私達はそれに関して何もコメントしません。 海外での配布については、各国での特許について調査の上、各自の責任に おいて行ってください。 ◆ LGPL2 (GNU Library General Public License Ver.2) このプログラムはフリーソフトであり、無保証です。 LGPL2に基づいてこのプログラムを変更して配布することが出来ます。 LGPL2に基づいてこのプログラムを商業利用することが出来ます。 但し、各自の責任において特許使用の契約を行う必要があります。 商業利用の場合、次のことに注意して下さい。 1. gogo.dll(またはそれに準ずるもの)を添加することが出来る。 2. gogo.dll以外には musenc.h 等のインタフェース部分を記述する目的 以外のgogoに関連するソースを使うことは出来ない。 3. gogoに関するどんな修正もLGPL2に基づいて公開されなければならない。 4. プログラムの中で次のことを表記して下さい。 gogoを使っていることと、gogoのバージョン。 gogoがLGPL2に従っていること。 LGPL2のコピー。 gogoのソースか、ソース配布元のURL。 ◆ サポート 掲示版によるサポートは行っておりません。 質問のある方は gogo-support@marinecat.forum.ne.jp までメールを下さい。 ただし、FAQ的な質問などの場合お返事を差し上げないことがあります。 ◆ 使い方 コンソール上で使用します。 gogo [options] input [output] `[]'は省略可能の意味 `input'は入力ファイル名、`output'は出力ファイル名を指定して下さい。 出力ファイル名を省略した場合は、入力ファイル名の拡張子を`mp3'に変更した 名前が指定されたものとして処理されます。 (拡張子が4文字以上の場合は入力ファイル名に`.mp3'が加えられます) オプションはファイル名の後ろにつけることも可能です。 オプション無しで起動すると使い方が表示されます。 入力ファイル名を`stdin'にすることで標準入力モードになります。 この時は出力ファイル名を明記する必要があります。 ◆ 主なオプション解説 -b kbps kbps単位でのビットレート指定 省略時は128[kbps]です。 値が大きいほど高音質になりますが、圧縮率は下がります。 -m {m,s,j,f} mp3の圧縮形式 m : モノラル(ステレオPCMを強制的にモノラルにしたい時) s : ステレオ j : ジョイントステレオ(省略時) f : M/Sステレオ -nopsy 心理解析を行いません。その分速くなります(2〜3倍の高速化)。 (例) gogo eki.wav -br 112000 eki.wav を 112kbps j-stereo 心理解析有効でエンコードし eki.mp3 に保存。 gogo eki.wav -m s -nopsy 128kbps stereo 心理解析無効でエンコード。 cat sample.wav | gogo stdin a.mp3 sample.wav を標準入力モードでエンコードし a.mp3 に保存。 ◆主な設定 128kbps以下でエンコードするときは-lpfは有効にしておくべきです。 単に波形解析で16kHz以上が現れるからという理由で-lpf offとするのは 勧められません。 faq.txtも参照してください。 ◆ より細かいオプション解説 -b で使える数値は以下の通りです。 入力PCMが32KHz,44.1KHz,48KHzの場合、 [ 32,40,48,56,64,80,96,112,128,160,192,224,256,320 ] 入力PCMが16KHz,22.05KHz,24KHzの場合、 [ 8,16,24,32,40,48,56,64,80,96,112,128,144,160 ] bps単位の -brオプションも使えます。 -silent 途中経過を表示しません。 -test ベンチマークを行います。 44.1kHz, 16bit stereo PCMエンコードを想定したモードです。 空白をつけずに数字を書くとその秒数で処理します。 benchディレクトリに様々な環境での結果報告があります。 (例) gogo -test20 -nopsy nopsyモードで20秒のデータをエンコードする時間を測定 -off {3dn,mmx,sse,kni,e3dn} それぞれ 3D Now!, MMX, SSE(KNI),Enhanced 3D Now!の使用を止めます。 M2やK6等MMXがパイプライン化されていないCPUでは -off mmxとした方が速いことがあるようです。 -off 3dnをつけるとEnhanced 3D Now!の使用も止めます。 -debug CPU情報などを出力します。 バグ報告の時等書いてくださるとありがたいです。 -emp {n,c,5} de-emphasis設定 -cpu num 実装しているCPUの数の強制指定 (通常自動判別されます) -v {0,1,..,9} VBRを使用します。値が小さい方が高音質、大きいと高圧縮です。 -vbオプションで最低/最大ビットレートを指定します。 適切なパラメータは各自お試しください。-nopsyとの併用は出来ません。 -d freq 出力MP3のkHz単位の周波数の指定 (例) gogo test.wav -d 22.05 test.wavが44.1kHzの時でも22.05kHzに変換しながらmp3を生成 但し、単なる線形補完のため音質は下がります。 以下は通常のWAV以外のデータを入力する時に使います。 -offset byte byte数だけデータの先頭を飛ばします。 -mono 入力データをモノラルとして処理します。(省略時ステレオ) -8bit 入力データを8bitPCMとして処理します。(省略時16bit) -s freq 入力PCMのkHz単位の周波数を指定します。 -bswap 16bitPCMの上位、下位バイトを入れ換えます。 -tos TownsOS用SNDファイルとして8bit->16bit変換を行います。 (例) gogo test.wav a.mp3 -offset 0 -mono -s 16 test.wavをヘッダ無しモノラル16kHz PCMとしてmp3を生成 gogo yume.snd a.mp3 -offset 32 -mono -8bit -s 19.2 -tos TownsOS用SNDファイルの標準的な設定です。 -delete エンコード終了後 wav ファイルを削除します。 -i 出力ファイルが既に存在するとき上書きするかを確認します。 -o path 出力ディレクトリを path に変更します。 出力ファイル名も同時に指定した場合は -o の path を使います。 (例1) gogo wav/test.wav -o sample ./wav/test.wav ファイルから ./sample/test.mp3 ファイルを生成します。 (例2) gogo wav/test.wav data/qqq.mp3 -o sample ./wav/test.wav ファイルから ./sample/qqq.mp3 ファイルを生成します。 gogo wav/test.wav sample/qqq.mp3 と等価です。 -riff {wave, rmp} RIFF/{WAVE,RMP}形式出力 -lang {sjis, eucjp, eng, ger} それぞれ SJIS, 日本語EUC, 英語, ドイツ語でメッセージを出力します。 Windowsでは地域で設定された値を参照します。 UNIX系OSではLC_MESSAGES, LC_ALL, LANGの順でlocaleを参照します。 以下はBeOS MT時のみ有効です。 -priority num エンコードスレッドの優先順位指定 (省略時 10 Normal Priority) 100を指定するとOSごと落ちることがあるようです(^^; -readthread num データ読込みスレッドの優先順位指定 (省略時はreadthreadを使用しません) -br min max (min と max の間にコンマを書いてはいけません) VBR使用時の 最小, 最大 bitrate を指定します。 以下は上級者向けのオプションです。 para1, para2は100以下の整数で、間にはコンマを書いてはいけません。 パラメータの内容はソースを解読して下さい。 m(__)m #Win版helpでは多少解説されています。 -lpf {on,off} 16kHzのフィルタ設定 またはより詳しく -lpf para1 para2 値が小さい程フィルタが強い -th para1 para2 j-stereoでの stereo/ MS-stereo の切替え制御 ◆謝辞 午後の元となっているLAMEを作っている方々に感謝します。 音質、速度共に素晴らしいソフトウェアです。 NASMを使用することでアセンブリ言語を使いながらも様々なOS間での 同時開発が可能になりました。NASMを作られた方々に感謝します。 ◆ 参考 LAMEのソース( ver. 3.23〜3.5x beta ) http://www.sulaco.org/mp3/ ISO規格書(ISO/IEC 11172-3 Part3 : Audio) "ISO MPEG Audio Subgroup Software Simulation Group" sources 大浦拓哉氏が作られた『実離散Fourier変換/逆変換ルーチン』のソース Linux-2.2.9カーネルでPIIIのSSE命令を使用可能にするパッチ その他 Intel, AMDのCPU関連リファレンス ---- (C)1992 ISO MPEG Audio Subgroup Software Simulation Group (C)1999 LAME に携わっている人達 (C)1999, 2000 PEN@海猫, へるみ shigeo@kurims.kyoto-u.ac.jp, http://homepage1.nifty.com/herumi/ pen@marinecat.forum.ne.jp, http://member.nifty.ne.jp/~pen/mct_top.htm gogo239b/readsmpl.c100644 23421 144 33203 7220537350 13325 0ustar shigeousers#ifdef WIN32 #include "read4win.c" #else /* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 PEN@MarineCat, shigeo, Noisyu */ #include #include #include #include #ifdef USE_BTHREAD #include #include #include "haveunit.h" #endif #include "common.h" #include "global.h" #include "readsmpl.h" #include "musenc.h" #define SAMPLE_LENGTH 2304 struct _SAMPLE_CONVERTER { unsigned long pitch_lo, pitch_hi; unsigned long pos_lo, pos_hi; unsigned long pcmreadpos; unsigned long fill_len; int bFirstAttach; int bHitEof; short sample_org[ SAMPLE_LENGTH + 4]; char bPausedRead; unsigned long pcmdecodepos; short sample_decode[ SAMPLE_LENGTH ]; } samplecnverter; extern struct MCP_INPDEV_USERFUNC mc_userfunc; // extern/ユーザー関数設定 extern unsigned long read_limitsize; int InitializeSampleConverter( int freq_in, int freq_out ) { double pitch_tmp; if( freq_in <= 0 || freq_out <= 0){ return FALSE; } memset( &samplecnverter, 0, sizeof( samplecnverter ) ); if(freq_in == freq_out ){ /* freqin == freqoutのときはコンバーターを通さないけど一応計算しておく */ samplecnverter.pitch_hi = 1; samplecnverter.pitch_lo = 0; } else { samplecnverter.pitch_hi = freq_in / freq_out; if( freq_in >= freq_out ) freq_in %= freq_out; pitch_tmp = (double)freq_in * 4294967296. / (double)freq_out; samplecnverter.pitch_lo = (unsigned long)pitch_tmp; } samplecnverter.pcmreadpos = -4 - SAMPLE_LENGTH; samplecnverter.bFirstAttach = TRUE; return TRUE; } /* wait for realtime-encoding by zin@jaist.ac.jp (00/02/22) */ static INLINE size_t fread_nitems( void *buf, size_t size, size_t nitems, FILE *stream) { size_t nread; nitems *= size; if( read_limitsize == ULONG_MAX ) { return fread( buf, 1, nitems, stream) / size; } else { nread = 0; if( read_limitsize < nitems ) nitems = read_limitsize; if( nitems > 0 ){ nread = fread( buf, 1, nitems , stream); if( nread > 0 ) read_limitsize -= nread; } else { nread = 0; } return nread / size; } } static unsigned long read_samples_sub( FILE *musicin, short *sample_buffer, unsigned long frame_size) { unsigned long samples_read; samples_read = frame_size; if( mc_userfunc.pUserFunc == MPGE_NULL_FUNC ){ if( !bBitConvert ){ // 16BIT PCM samples_read = fread_nitems(sample_buffer, sizeof(short), (int)samples_read, musicin); #ifdef RAW_INPUT if( bSwapByte == TRUE ){ int i; char low, high; for( i = 0; i < samples_read; i++ ){ low = sample_buffer[i] & 0xFF; high = (unsigned)sample_buffer[i] >> 8; sample_buffer[i] = high + ( low << 8 ); } } #endif /* RAW_INPUT */ } else { // 8BIT PCM int i; unsigned char org_buffer[4096]; if ((samples_read = fread_nitems(org_buffer, sizeof(char), (int)samples_read, musicin)) == 0){ // HIT END OF DATA // } // 8BIT to 16BIT #ifdef RAW_INPUT if( bTownsSND ){ for( i = 0; i < samples_read; i++ ){ char data; data = org_buffer[i]; if( data & 0x80 ){ sample_buffer[i] = ((short)( data - 128 )) << 8; }else{ sample_buffer[i] = ((short)( - data )) << 8; } } }else #endif /* RAW_INPUT */ for(i = 0;i < (signed)samples_read;i++){ sample_buffer[i] = (org_buffer[i] - 128) << 8; } } } else { // ユーザー関数ベース if( !bBitConvert ){ // 16BIT PCM memset( sample_buffer, 0, (int)samples_read * 2 ); if ( mc_userfunc.pUserFunc( sample_buffer, (int)samples_read * 2) == ME_NOERR ){ /* samples_read = samples_read * 2; */ } else { samples_read = 0; } } else { // 8BIT PCM int i; unsigned char org_buffer[4096]; memset( org_buffer, 0, (int)samples_read ); if ( mc_userfunc.pUserFunc( org_buffer, (int)samples_read ) == ME_NOERR ){ } else { samples_read = 0; } // 8BIT to 16BIT for(i = 0;i < (signed)samples_read;i++) sample_buffer[i] = (org_buffer[i] - 128) << 8; } } if( samples_read < frame_size ){ int clr = samples_read; for (; clr < (signed)frame_size; sample_buffer[clr++] = 0); } return(samples_read); } static int getsample(unsigned long pos, FILE *musicin ) { if( (int)pos >= (int)(samplecnverter.pcmreadpos + samplecnverter.fill_len) ){ int readsamplenum; if( samplecnverter.bHitEof ) return 0; // これ以降データが無い *(long *)(&samplecnverter.sample_org[0]) = *(long *)(&samplecnverter.sample_org[SAMPLE_LENGTH ]); *(long *)(&samplecnverter.sample_org[2]) = *(long *)(&samplecnverter.sample_org[SAMPLE_LENGTH + 2]); readsamplenum = read_samples_sub( musicin, samplecnverter.sample_org + 4, SAMPLE_LENGTH); if( readsamplenum != SAMPLE_LENGTH ){ samplecnverter.bHitEof = TRUE; } samplecnverter.pcmreadpos += readsamplenum; samplecnverter.fill_len = 4 + readsamplenum; return getsample( pos, musicin ); // 再帰 } return samplecnverter.sample_org[ pos - samplecnverter.pcmreadpos]; } static unsigned long read_samples( FILE *musicin, short sample_buffer[2304], unsigned long frame_size, int chn) { int i; if( gl.enc_freqHz == gl.inp_freqHz ){ // そのままスルーする return read_samples_sub( musicin, sample_buffer, frame_size ); } else { if( samplecnverter.bHitEof && (samplecnverter.pos_hi * 2) >= samplecnverter.pcmreadpos + samplecnverter.fill_len ){ memset( sample_buffer, 0, frame_size ); return 0; // 読み込みできない状態 } if( chn == 1 ){ // MONO for(i = 0;i < (signed)frame_size;i++){ int s1, s2; int pts; s1 = getsample( samplecnverter.pos_hi, musicin ); if( samplecnverter.pos_lo == 0 ){ sample_buffer[ i ] = s1 ; } else { pts = samplecnverter.pos_lo >> 17; s2 = getsample( samplecnverter.pos_hi + 1, musicin ); sample_buffer[ i ] = (s1 * ( 0x8000 - pts ) + s2 * pts) >> 15; } { unsigned long org_low; org_low = samplecnverter.pos_lo; samplecnverter.pos_lo += samplecnverter.pitch_lo; if( samplecnverter.pos_lo < org_low ){ samplecnverter.pos_hi += samplecnverter.pitch_hi + 1; } else { samplecnverter.pos_hi +=samplecnverter.pitch_hi; } } } } else { // STEREO for(i = 0;i < (signed)frame_size;i += 2){ int s1, s2, sa; int pts; // LEFT s1 = getsample( samplecnverter.pos_hi * 2, musicin ); if( samplecnverter.pos_lo == 0 ){ sample_buffer[ i ] = s1; } else { pts = samplecnverter.pos_lo >> 17; s2 = getsample( samplecnverter.pos_hi * 2 + 2, musicin ); sa = s1 * ( 0x8000 - pts ) + s2 * pts; sample_buffer[ i ] = sa >> 15; } // RIGHT s1 = getsample( samplecnverter.pos_hi * 2 + 1, musicin ); if( samplecnverter.pos_lo == 0 ){ sample_buffer[ i + 1 ] = s1; } else { pts = samplecnverter.pos_lo >> 17; s2 = getsample( samplecnverter.pos_hi * 2 + 3, musicin ); sa = s1 * ( 0x8000 - pts ) + s2 * pts; sample_buffer[ i + 1 ] = sa >> 15; } { unsigned long org_low; org_low = samplecnverter.pos_lo; samplecnverter.pos_lo += samplecnverter.pitch_lo ; if( samplecnverter.pos_lo < org_low ){ samplecnverter.pos_hi += samplecnverter.pitch_hi + 1; } else { samplecnverter.pos_hi +=samplecnverter.pitch_hi; } } } } } return frame_size; } #if defined(USE_BTHREAD) static int maxthread_read = 0; static int curthread_read = 0; #endif #if defined(USE_BTHREAD) #define MAX_BUFFSIZE 30 /* 30以上はたまらないみたい */ #define READ_BLOCKSIZE 2304UL #define MAX_READBUFF READ_BLOCKSIZE * MAX_BUFFSIZE static sem_id mutex_read_audio; static port_id port_buf; static port_id empty_buf; static short *pread = NULL; static short *pwrite = NULL; static short *plast = NULL; static short *preadbuf = NULL; static long bufremain = 0; static thread_id ptid_read; FILE *cur_musicin; static void *read_samples_thread(void *); #endif #if defined(USE_BTHREAD) static void * read_samples_thread(void *arg) /* 先読みバッファ書き込みスレッド */ #endif #if defined(USE_BTHREAD) { unsigned long samples_read = 1; curthread_read = 1; do { /* サンプリングコンバーターも含めてマルチスレッド化 */ if(bufremain < MAX_READBUFF) { /* bufremainは不用意に増えると困るが、メインスレッド側では減る可能性しかないので セマフォで保護する必要なし? */ /* 30個もバッファがいっぱいになることも(実測ではなかったので)このif文が空ループで 動くことはないでしょう(ほんとか?) */ samples_read = read_samples(cur_musicin, pwrite, READ_BLOCKSIZE, 2); pwrite += samples_read; if((preadbuf + MAX_READBUFF) <= pwrite) pwrite = preadbuf; atomic_add(&bufremain,samples_read); /* 割り禁で足し算を行う(POSIXではセマフォで保護しなくてはならない) */ write_port_etc(port_buf,0,0,0,B_TIMEOUT,0); /* 読込みがされたのを伝える。 */ } else { /* バッファが空になって親に起こされるのを待つ */ int32 j; read_port(empty_buf,&j,(void *)&j,0); } } while(samples_read > 0); curthread_read = 0; plast = pwrite; write_port(port_buf,0,0,0); /* 終了を伝える */ return 0; } #endif #if defined(USE_BTHREAD) /* 先読みバッファ読込み部 */ static unsigned long read_samples_mt(FILE *musicin, short *buffer, unsigned long frame_size, int chn) { int32 readlast,j; /* 初期化 */ if(!curthread_read && !maxthread_read) { /* Initilize semaphore / port */ mutex_read_audio = create_sem(1,"read_audio"); /* 大本で(mutex_frameで)保護されているからいらない? */ port_buf = create_port(1,"port_buf"); /* 書き込みスレッドとの通信ポートを開く */ empty_buf = create_port(1,"empty_buf"); } /* エンコードスレッドに対するロックはここで行う */ acquire_sem(mutex_read_audio); if(!curthread_read && !maxthread_read) { int intpriority; /* create read buffer */ preadbuf = (short *)malloc(MAX_READBUFF * 2); pread = preadbuf; pwrite = preadbuf; plast = NULL; bufremain = 0; /* セマフォ必要なし?(POSIX系は必要) */ cur_musicin = musicin; /* create read thread */ MPGE_getConfigure(MG_READTHREAD_PRIORITY,&intpriority); if((ptid_read = spawn_thread((thread_func)read_samples_thread,"gogoReadthread",intpriority,(void *)NULL)) > 0) { resume_thread(ptid_read); maxthread_read = 1; } } /* ファイルバッファが満たされるのを待つ */ while(bufremain < frame_size && plast == NULL) { /* 最後以外で必要量の読んでいないものがある? */ write_port_etc(empty_buf,0,0,0,B_TIMEOUT,0); /* 無くなったことを伝える。(この辺は改善の余地有り) */ /* まあ、無くなるのはよっぽど読込み元が遅い場合ぐらいですけど */ read_port(port_buf,&j,(void *)&j,0); /* 最低1回読み込まれるのをまつ */ } /* posix系ではpthread_cond_wait系を使ってまっとうに書き直してください(..; */ if(bufremain >= frame_size) { /* Get 1 block from the current buffer */ readlast = (((unsigned long)pread - (unsigned long)preadbuf)) / 2 + frame_size; if(readlast <= MAX_READBUFF) { memcpy(buffer, pread, frame_size*sizeof(short)); pread += frame_size; if(readlast == MAX_READBUFF) pread = preadbuf; } else { /* 前半 */ for ( j = 0; j < frame_size - (readlast - MAX_READBUFF); j++ ){ buffer[j] = *pread++; } /* 後半 */ pread = preadbuf; for (; j < frame_size ; j++ ){ buffer[j] = *pread++; } } atomic_add(&bufremain,-frame_size); /* 割り禁で足し算を行う(POSIXではセマフォで保護しなくてはならない) */ release_sem(mutex_read_audio); return(frame_size); } else { /* ここに来た時点で(なんかしらの原因で)読込みスレッドはなくなっている */ if(curthread_read && maxthread_read){ /* 一応スレッドを殺しておく */ kill_thread(ptid_read); curthread_read = 0; } if(bufremain > 0) { /* 現在の読み取りバッファから1ブロック取り出す */ readlast = (((unsigned long)pread - (unsigned long)preadbuf)) / 2 + bufremain; if(readlast <= MAX_READBUFF) { for ( j = 0; j < bufremain; j++ ){ *buffer++ = *pread++; } } else { /* 前半 */ for ( j = 0; j < bufremain - (readlast - MAX_READBUFF); j++ ){ *buffer++ = *pread++; } /* 後半 */ pread = preadbuf; for (; j < bufremain; j++ ){ *buffer++ = *pread++; } } for(;j < frame_size;j++) { *buffer++ = 0; } } j = atomic_add(&bufremain,-bufremain); /* あとしまつ */ if(preadbuf != NULL) free(preadbuf); preadbuf = NULL; if(port_buf != 0) delete_port(port_buf); port_buf = 0; if(empty_buf != 0) delete_port(empty_buf); empty_buf = 0; if(mutex_read_audio != 0) delete_sem(mutex_read_audio); /* これを開放するのは他に待ちスレッドがいるかも知れないので最後 */ mutex_read_audio = 0; return( j ); } return(0); } #endif unsigned long get_audio(FILE *musicin, short *buffer) { unsigned long j, num, readNum; short insamp[1152*2]; num = gl.frameSize; if( gl.stereo == 2 ){ /* stereo -> stereo */ /* No conversion needed, fall through... */ return read_samples( musicin, buffer, num * 2, 2 ); } if( bForceMono == FALSE ){ /* mono -> mono */ /* No conversion needed, fall through... */ return read_samples( musicin, buffer, num, 1 ); } /* stereo -> mono */ readNum = read_samples( musicin, insamp, num * 2, 2 ); for( j = 0; j < num; j++ ){ buffer[j] = ( (int)insamp[j*2] + (int)insamp[j*2 + 1] ) / 2; } return readNum; } #if defined(USE_BTHREAD) unsigned long get_audio_thread(FILE *musicin, short *buffer) { unsigned long j, num, readNum; short insamp[1152*2]; num = gl.frameSize; if( gl.stereo == 2 ){ /* stereo -> stereo */ /* No conversion needed, fall through... */ return read_samples_mt(musicin, buffer, num * 2, 2); } if( bForceMono == FALSE ){ /* mono -> mono */ /* No conversion needed, fall through... */ return read_samples_mt( musicin, buffer, num, 1 ); } /* stereo -> mono */ readNum = read_samples_mt(musicin, insamp, num * 2, 2); for( j = 0; j < num; j++ ){ buffer[j] = ( (int)insamp[j*2] + (int)insamp[j*2 + 1] ) / 2; } return readNum; } #endif #endif /* WIN32 */ gogo239b/readsmpl.h100644 23421 144 1054 7220537350 13311 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 PEN@MarineCat */ #ifndef __READSMPL_H__ #define __READSMPL_H__ #include "common.h" typedef enum { SAMPLES_FAIL, SAMPLES_READ, SAMPLES_PAUSED, SAMPLES_HITEND, } SAMPLES_T; int InitializeSampleConverter( int freq_in, int freq_out ); #if defined(USE_BTHREAD) unsigned long get_audio_thread(FILE *musicin, short *buffer); #endif #ifdef WIN32 SAMPLES_T get_audio(FILE *musicin, short *buffer); #else unsigned long get_audio(FILE *musicin, short *buffer); #endif #endif /* __READSMPL_H__ */ gogo239b/setup.c100644 23421 144 3356 7220537350 12644 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 shigeo */ #include #include "haveunit.h" /* defined in loop.c */ void setup_quantize_xrpow(int useUNIT); void setup_count_bit(int useUNIT); void setup_calc_pow4P3dual(int useUNIT); void setup_ix_max(int useUNIT); void setup_calc_pow075(int useUNIT); //void setup_quantize_xrpow075(int useUNIT); void setup_ms_convert(int useUNIT); void setup_count_nz_xr(int useUNIT); void setup_set_l3_enc_sign(int useUNIT); void setup_new_choose_table(int useUNIT); void setup_calc_runlen_count1(int useUNIT); void setup_calc_xmin_long(int useUNIT); /* defined in encode.c */ void setup_window_filter_subband(int useUNIT); /* defined in mdct.c */ void setup_mdct(int useUNIT); /* defined in subs.c */ void setup_fht(int useUNIT); void setup_fft(int useUNIT); void setup_fft_side(int useUNIT); /* defined in l3psy.c */ void setup_sprdngf(int useUNIT); void setup_frame_shiftin(int useUNIT); void setup_calc_phase(int useUNIT); void setup_calc_pe(int useUNIT); void setupUNIT(int useUNIT){ SETUP_DSP("selecting functions for special units.\n"); setup_quantize_xrpow(useUNIT); setup_count_bit(useUNIT); setup_calc_pow4P3dual(useUNIT); setup_ix_max(useUNIT); setup_calc_pow075(useUNIT); setup_window_filter_subband(useUNIT); setup_mdct(useUNIT); setup_fht(useUNIT); setup_fft(useUNIT); setup_fft_side(useUNIT); setup_sprdngf(useUNIT); setup_ms_convert(useUNIT); setup_frame_shiftin(useUNIT); setup_count_nz_xr(useUNIT); setup_set_l3_enc_sign(useUNIT); setup_calc_phase(useUNIT); setup_new_choose_table(useUNIT); setup_calc_runlen_count1(useUNIT); setup_calc_pe(useUNIT); setup_calc_xmin_long(useUNIT); } void SETUP_DSP(char *mes){ extern int debug; if(debug){ fprintf(stderr,"%s",mes); } } gogo239b/resource.h100644 23421 144 1155 7220537350 13333 0ustar shigeousers//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by GOGO_DLL.rc // #define IDD_ENCODING 101 #define IDC_PROGRESS 1000 #define IDC_TXT_FILENAME 1001 #define IDC_RESV_TIME 1002 #define IDC_TXT_ENCODESTATUS 1003 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1004 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif gogo239b/sband3dn.nas100644 23421 144 105011 7220537350 13566 0ustar shigeousers; for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; 99/09/15 ; 酒居さんのソースを元に3D Now!化(39kclk->18kclk) ; ちょっち最適化 15kclk->14kclk by URURI %include "nasm.h" globaldef window_filter_subband_3DN globaldef window_filter_subband_E3DN externdef enwindow externdef idct_coefficient %if 0 externdef sbd_off %endif externdef sbd_xxx HAN_SIZE equ 512 ;defined in common.h SBLIMIT equ 32 EXTRADELAY equ 56 ;defined in musenc.c F_SIZE equ 4 %define F_PTR dword segment_data align 16 D_SCALER dd 38000000h,38000000h ;1.0/32768 define in common.h D_PLUS_MINUS dd -1.0, 1.0 ; align 16 ;s_ptr dd 0 ;saveOff dd 0 segment_code ; ; 2000/04/02 締切すぎてるぞ・・・ by kei ; sbd_xxx[] の中の順番は sbt_shiftin_C と同じ ; 2000/04/04 sbd_xxx[] の中の順番を sbt_shiftin_SSE と同じに変更 ; 2000/04/08 memcpy 部分のバグ修正とか ; 2000/04/17 SMP最適化のための布石 by K.SAKAI ; ;void sbd_shiftin_3DN(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr); proc sbd_shiftin_3DN %$mfbuf arg 4 %$stereo arg 4 %$mode_gr arg 4 femms pushd ebx, edi, ebp mov edx, [sp(%$mode_gr)] imul edx, 18*32*F_SIZE mov eax, [sp(%$mfbuf)] mov ebp, sbd_xxx+1152*4 .for.ch: .for.memcpy.init: mov ebx, ebp add ebx, (512-32+16)*4 mov edi, ebx sub ebx, edx mov ecx, (512-32+16)/16 jmp short .for.memcpy align 16 .for.memcpy: pmov mm0,[ebx + 0*F_SIZE] pmov mm1,[ebx + 2*F_SIZE] pmov mm2,[ebx + 4*F_SIZE] pmov mm3,[ebx + 6*F_SIZE] pmov [edi + 0*F_SIZE],mm0 pmov [edi + 2*F_SIZE],mm1 pmov [edi + 4*F_SIZE],mm2 pmov [edi + 6*F_SIZE],mm3 pmov mm4,[ebx + 8*F_SIZE] pmov mm5,[ebx + 10*F_SIZE] pmov mm6,[ebx + 12*F_SIZE] pmov mm7,[ebx + 14*F_SIZE] sub ebx, 16*4 pmov [edi + 8*F_SIZE],mm4 pmov [edi + 10*F_SIZE],mm5 pmov [edi + 12*F_SIZE],mm6 pmov [edi + 14*F_SIZE],mm7 sub edi, 16*4 .for.memcpy.next: dec ecx jnz .for.memcpy .for.memcpy.end: .for.win_buf.init: mov edi, ebp mov ebx, eax ;win_buf mov ecx, edx jmp short .for.win_buf align 16 .for.win_buf: %assign i 32 %assign j 0 pmovd mm0, [ebx +fsizen(j+15)] ;= [ *:15] pi2fd mm1, [ebx +fsizen(j+ 1)] ;= [ 2: 1] punpckldq mm0, [ebx +fsizen(j+0)] ;= [ 0:15] pi2fd mm2, [ebx +fsizen(j+ 3)] ;= [ 4: 3] pi2fd mm3, [ebx +fsizen(j+ 5)] ;= [ 6: 5] pi2fd mm0, mm0 pmov [edi+fsizen(i-14)], mm1 pmov [edi+fsizen(i-12)], mm2 pmov [edi+fsizen(i-10)], mm3 pmov [edi+fsizen(i-16)], mm0 pi2fd mm4, [ebx +fsizen(j+ 7)] ;= [ 8: 7] pi2fd mm5, [ebx +fsizen(j+ 9)] ;= [10: 9] pi2fd mm6, [ebx +fsizen(j+11)] ;= [12:11] pi2fd mm7, [ebx +fsizen(j+13)] ;= [14:13] pmov [edi+fsizen(i- 8)], mm4 pmov [edi+fsizen(i- 6)], mm5 pmov [edi+fsizen(i- 4)], mm6 pmov [edi+fsizen(i- 2)], mm7 %assign i 16 %assign j 16 pi2fd mm0, [ebx +fsizen(j+0)] pi2fd mm1, [ebx +fsizen(j+2)] pi2fd mm2, [ebx +fsizen(j+4)] pi2fd mm3, [ebx +fsizen(j+6)] punpckldq mm4, mm0 punpckldq mm5, mm1 punpckldq mm6, mm2 punpckldq mm7, mm3 punpckhdq mm0, mm4 punpckhdq mm1, mm5 punpckhdq mm2, mm6 punpckhdq mm3, mm7 pmov [edi+fsizen(i-2)], mm0 pmov [edi+fsizen(i-4)], mm1 pmov [edi+fsizen(i-6)], mm2 pmov [edi+fsizen(i-8)], mm3 pi2fd mm4, [ebx +fsizen(j+ 8)] pi2fd mm5, [ebx +fsizen(j+10)] pi2fd mm6, [ebx +fsizen(j+12)] pi2fd mm7, [ebx +fsizen(j+14)] punpckldq mm0, mm4 punpckldq mm1, mm5 punpckldq mm2, mm6 punpckldq mm3, mm7 add ebx, fsizen(32) punpckhdq mm4, mm0 punpckhdq mm5, mm1 punpckhdq mm6, mm2 punpckhdq mm7, mm3 pmov [edi+fsizen(i-10)], mm4 pmov [edi+fsizen(i-12)], mm5 pmov [edi+fsizen(i-14)], mm6 pmov [edi+fsizen(i-16)], mm7 sub edi, fsizen(32) .for.win_buf.next: sub ecx, fsizen(32) jnz near .for.win_buf .for.win_buf.end: .for.ch.next: cmp byte [sp(%$stereo)], 2 jne .exit add eax,(1152+576+EXTRADELAY)*F_SIZE add ebp,(1152+HAN_SIZE)*F_SIZE cmp ebp,sbd_xxx+(1152+HAN_SIZE)*F_SIZE*2 jb near .for.ch .for.ch.end: .exit: femms popd ebx, edi, ebp endproc ;*************************************************************************** %ifdef USE_E3DN ; ; 2000/04/03 sbd_xxx[] の中の順番は sbt_shiftin_C と同じ by kei ; 2000/04/04 sbd_xxx[] の中の順番を sbt_shiftin_SSE と同じに変更 ; 2000/04/08 memcpy 部分のバグ修正とか ; ;void sbd_shiftin_E3DN(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr); proc sbd_shiftin_E3DN %$mfbuf arg 4 %$stereo arg 4 %$mode_gr arg 4 ; extern _clkbegin ; extern _clkend ; call _clkbegin femms pushd ebx, edi, ebp mov edx, [sp(%$mode_gr)] imul edx, 18*32*F_SIZE mov eax, [sp(%$mfbuf)] mov ebp, sbd_xxx+1152*4 .for.ch: .for.memcpy.init: mov ebx, ebp add ebx, (512-32+16)*4 mov edi, ebx sub ebx, edx mov ecx, (512-32+16)/16 jmp short .for.memcpy align 16 .for.memcpy: prefetch [ebx-64] prefetchw [edi-64] pmov mm0,[ebx + 0*F_SIZE] pmov mm1,[ebx + 2*F_SIZE] pmov mm2,[ebx + 4*F_SIZE] pmov mm3,[ebx + 6*F_SIZE] pmov [edi + 0*F_SIZE],mm0 pmov [edi + 2*F_SIZE],mm1 pmov [edi + 4*F_SIZE],mm2 pmov [edi + 6*F_SIZE],mm3 pmov mm4,[ebx + 8*F_SIZE] pmov mm5,[ebx + 10*F_SIZE] pmov mm6,[ebx + 12*F_SIZE] pmov mm7,[ebx + 14*F_SIZE] sub ebx, 16*4 pmov [edi + 8*F_SIZE],mm4 pmov [edi + 10*F_SIZE],mm5 pmov [edi + 12*F_SIZE],mm6 pmov [edi + 14*F_SIZE],mm7 sub edi, 16*4 .for.memcpy.next: dec ecx jnz .for.memcpy .for.memcpy.end: .for.win_buf.init: mov edi, ebp mov ebx, eax ;win_buf mov ecx, edx jmp short .for.win_buf align 16 .for.win_buf: prefetch [ebx+128] prefetch [ebx+196] prefetchw [edi-64] prefetchw [edi-128] %assign i 32 %assign j 0 pmovd mm0, [ebx +fsizen(j+15)] ;= [ *:15] pi2fd mm1, [ebx +fsizen(j+ 1)] ;= [ 2: 1] punpckldq mm0, [ebx +fsizen(j+0)] ;= [ 0:15] pi2fd mm2, [ebx +fsizen(j+ 3)] ;= [ 4: 3] pi2fd mm3, [ebx +fsizen(j+ 5)] ;= [ 6: 5] pi2fd mm0, mm0 pmov [edi+fsizen(i-14)], mm1 pmov [edi+fsizen(i-12)], mm2 pmov [edi+fsizen(i-10)], mm3 pmov [edi+fsizen(i-16)], mm0 pi2fd mm4, [ebx +fsizen(j+ 7)] ;= [ 8: 7] pi2fd mm5, [ebx +fsizen(j+ 9)] ;= [10: 9] pi2fd mm6, [ebx +fsizen(j+11)] ;= [12:11] pi2fd mm7, [ebx +fsizen(j+13)] ;= [14:13] pmov [edi+fsizen(i- 8)], mm4 pmov [edi+fsizen(i- 6)], mm5 pmov [edi+fsizen(i- 4)], mm6 pmov [edi+fsizen(i- 2)], mm7 %assign i 16 %assign j 16 pi2fd mm0, [ebx +fsizen(j+0)] pi2fd mm1, [ebx +fsizen(j+2)] pi2fd mm2, [ebx +fsizen(j+4)] pi2fd mm3, [ebx +fsizen(j+6)] pswapd mm0, mm0 pswapd mm1, mm1 pswapd mm2, mm2 pswapd mm3, mm3 pmov [edi+fsizen(i-2)], mm0 pmov [edi+fsizen(i-4)], mm1 pmov [edi+fsizen(i-6)], mm2 pmov [edi+fsizen(i-8)], mm3 pi2fd mm4, [ebx +fsizen(j+ 8)] pi2fd mm5, [ebx +fsizen(j+10)] pi2fd mm6, [ebx +fsizen(j+12)] pi2fd mm7, [ebx +fsizen(j+14)] add ebx, fsizen(32) pswapd mm4, mm4 pswapd mm5, mm5 pswapd mm6, mm6 pswapd mm7, mm7 pmov [edi+fsizen(i-10)], mm4 pmov [edi+fsizen(i-12)], mm5 pmov [edi+fsizen(i-14)], mm6 pmov [edi+fsizen(i-16)], mm7 sub edi, fsizen(32) .for.win_buf.next: sub ecx, fsizen(32) jnz near .for.win_buf .for.win_buf.end: .for.ch.next: cmp byte [sp(%$stereo)], 2 jne .exit add eax,(1152+576+EXTRADELAY)*F_SIZE add ebp,(1152+HAN_SIZE)*F_SIZE cmp ebp,sbd_xxx+(1152+HAN_SIZE)*F_SIZE*2 jb near .for.ch .for.ch.end: .exit: femms popd ebx, edi, ebp ; call _clkend endproc %endif ;*************************************************************************** ; ; 2000/04/06 締切すぎまくり・・・ by kei ; 2000/04/07 unroll しすぎを修正 ; 2000/04/08 yprime[16] をループの外に ; ; void window_filter_subband_3DN(float *win_buf, float *s, int mode_gr) %if 0 3DN, E3DN 版での実装 static void window_filter_subband_3DN(float *win_buf, float *xout, int mode_gr) { float *c, yprime[32]; int i,j,k; c = &win_buf[1152]; for(j = 0; j < 18*mode_gr; j++){ yprime[ 0] = c[64*0+16]*enwindow[4][0][0] + c[64*1+16]*enwindow[4][1][0] + c[64*2+16]*enwindow[4][2][0] + c[64*3+16]*enwindow[4][3][0] + c[64*4+16]*enwindow[4][4][0] + c[64*5+16]*enwindow[4][5][0] + c[64*6+16]*enwindow[4][6][0] + c[64*7+16]*enwindow[4][7][0]; for(i = 0; i < 16; i++){ register float a, b; a =c[64*0 + i ]*enwindow[i/4 ][0][i%4]; a -=c[64*7 + i+16]*enwindow[i/4+8][0][i%4]; // 符号逆転 b =c[64*0 + i+32]*enwindow[i/4+8][0][i%4]; b +=c[64*7 + i+48]*enwindow[i/4 ][0][i%4]; // 符号逆転 a +=c[64*1 + i ]*enwindow[i/4 ][1][i%4]; a -=c[64*6 + i+16]*enwindow[i/4+8][1][i%4]; // 符号逆転 b +=c[64*1 + i+32]*enwindow[i/4+8][1][i%4]; b +=c[64*6 + i+48]*enwindow[i/4 ][1][i%4]; // 符号逆転 a +=c[64*2 + i ]*enwindow[i/4 ][2][i%4]; a -=c[64*5 + i+16]*enwindow[i/4+8][2][i%4]; // 符号逆転 b +=c[64*2 + i+32]*enwindow[i/4+8][2][i%4]; b +=c[64*5 + i+48]*enwindow[i/4 ][2][i%4]; // 符号逆転 a +=c[64*3 + i ]*enwindow[i/4 ][3][i%4]; a -=c[64*4 + i+16]*enwindow[i/4+8][3][i%4]; // 符号逆転 b +=c[64*3 + i+32]*enwindow[i/4+8][3][i%4]; b +=c[64*4 + i+48]*enwindow[i/4 ][3][i%4]; // 符号逆転 a +=c[64*4 + i ]*enwindow[i/4 ][4][i%4]; a -=c[64*3 + i+16]*enwindow[i/4+8][4][i%4]; // 符号逆転 b +=c[64*4 + i+32]*enwindow[i/4+8][4][i%4]; b +=c[64*3 + i+48]*enwindow[i/4 ][4][i%4]; // 符号逆転 a +=c[64*5 + i ]*enwindow[i/4 ][5][i%4]; a -=c[64*2 + i+16]*enwindow[i/4+8][5][i%4]; // 符号逆転 b +=c[64*5 + i+32]*enwindow[i/4+8][5][i%4]; b +=c[64*2 + i+48]*enwindow[i/4 ][5][i%4]; // 符号逆転 a +=c[64*6 + i ]*enwindow[i/4 ][6][i%4]; a -=c[64*1 + i+16]*enwindow[i/4+8][6][i%4]; // 符号逆転 b +=c[64*6 + i+32]*enwindow[i/4+8][6][i%4]; b +=c[64*1 + i+48]*enwindow[i/4 ][6][i%4]; // 符号逆転 a +=c[64*7 + i ]*enwindow[i/4 ][7][i%4]; a -=c[64*0 + i+16]*enwindow[i/4+8][7][i%4]; // 符号逆転 b +=c[64*7 + i+32]*enwindow[i/4+8][7][i%4]; b +=c[64*0 + i+48]*enwindow[i/4 ][7][i%4]; // 符号逆転 yprime[16-i] = a; yprime[i+16] = b; } c -= 32; for( i=0; i<16; i++ ){ register float s0, s1; s0 = s1 = 0.0; for( k=0; k<32; k+=4 ){ s0 += idct_coefficient[i][k ]*yprime[k+0]; s1 += idct_coefficient[i][k+1]*yprime[k+1]; s0 += idct_coefficient[i][k+2]*yprime[k+2]; s1 += idct_coefficient[i][k+3]*yprime[k+3]; } xout[i+ 0] = s0+s1; xout[31-i] = s0-s1; } xout += 32; } } %endif %idefine enw(x,y,z) (eax+(x)*8*4*4+(y)*4*4+(z)*4-8*8*4*4) %idefine c(x,y) (edi+(x)*64*4+(y)*4-4*64*4) %idefine yprime(x) (esp+(x)*4) %idefine enwoff(x,y,z) ((x)*8*4*4+(y)*4*4+(z)*4) %idefine coff(x,y) ((x)*64*4+(y)*4) proc window_filter_subband_3DN %$win_buf arg 4 %$s arg 4 %$mode_gr arg 4 ; extern _clkbegin ; extern _clkend ; call _clkbegin femms pushd ebx, esi, edi, ebp mov edi,[sp(%$win_buf)] mov ebp,[sp(%$s)] mov esi,[sp(%$mode_gr)] ; 1 or 2 add edi,1152*F_SIZE ; = c = &win_buf[1152] add esi,esi lea esi,[esi+esi*8] ; = j = 18*mode_gr add edi, coff(4,0) ; allocate yprime[32] mov edx,esp sub esp,32*4+4 and esp,~31 ; align to 32 byte boundary mov [esp+32*4],edx ; save the original ESP jmp short .f1 align 16 .lp1: .f1: mov eax, enwindow+enwoff(8,0,0) ; yprime[0] pmovd mm0, [c(0,16)] pmovd mm1, [c(1,16)] pmovd mm2, [c(2,16)] pmovd mm3, [c(3,16)] pmovd mm4, [enw(4,0,0)] pmovd mm5, [enw(4,1,0)] pmovd mm6, [enw(4,2,0)] pmovd mm7, [enw(4,3,0)] punpckldq mm0, [c(4,16)] punpckldq mm1, [c(5,16)] punpckldq mm2, [c(6,16)] punpckldq mm3, [c(7,16)] punpckldq mm4, [enw(4,4,0)] punpckldq mm5, [enw(4,5,0)] punpckldq mm6, [enw(4,6,0)] punpckldq mm7, [enw(4,7,0)] pfmul mm0, mm4 pfmul mm1, mm5 pfmul mm2, mm6 pfmul mm3, mm7 pfadd mm0, mm1 pfadd mm2, mm3 pfadd mm0, mm2 pfacc mm0, mm0 pmovd [yprime(0)], mm0 ; yprime[16] pmovd mm1, [c(3,0)] pmovd mm0, [c(1,0)] pmovd mm2, [c(7,0)] pmovd mm3, [c(5,0)] punpckldq mm1, [c(4,0)] punpckldq mm0, [c(2,0)] punpckldq mm2, [c(6,0)] pfadd mm1, mm3 pfadd mm0, mm2 pmovd mm4, [c(0,32)] pmovd mm5, [c(2,32)] pmovd mm6, [c(7,32)] pmovd mm7, [c(5,32)] punpckldq mm4, [c(1,32)] punpckldq mm5, [c(3,32)] punpckldq mm6, [c(6,32)] punpckldq mm7, [c(4,32)] pfsub mm4, mm6 pfsub mm5, mm7 pmovd mm2, [enw(0,1,0)] pmovd mm3, [enw(0,3,0)] pmovd mm6, [enw(8,0,0)] pmovd mm7, [enw(8,2,0)] punpckldq mm2, [enw(0,2,0)] punpckldq mm3, [enw(0,4,0)] punpckldq mm6, [enw(8,1,0)] punpckldq mm7, [enw(8,3,0)] pfmul mm0, mm2 pfmul mm1, mm3 pfmul mm4, mm6 pfmul mm5, mm7 pfadd mm0, mm1 pfadd mm4, mm5 pfadd mm0, mm4 pfacc mm0, mm0 pmovd [yprime(16)], mm0 %macro window_filter_3dn_yprime_first_type1 0 ; a =c[64*0 + i ]*enwindow[i/4 ][0][i%4]; ; a -=c[64*7 + i+16]*enwindow[i/4+8][0][i%4]; // 符号逆転 ; b =c[64*0 + i+32]*enwindow[i/4+8][0][i%4]; ; b +=c[64*7 + i+48]*enwindow[i/4 ][0][i%4]; // 符号逆転 ; output ; mm0 b:a[i+1:i+1] ; mm1 a[i+3:i+2] ; mm3 b[i+3:i+2] pmovd mm0, [c(0,1)] pmov mm1, [c(0,2)] pmovd mm2, [enw(0,0,1)] punpckldq mm0, [c(7,49)] pmov mm3, [enw(0,0,2)] pfacc mm2, mm2 pmovd mm4, [c(7,17)] pfmul mm1, mm3 pmov mm5, [c(7,18)] pfmul mm0, mm2 pfmul mm3, [c(7,50)] pmov mm2, [D_PLUS_MINUS] punpckldq mm4, [c(0,33)] pmovd mm6, [enw(8,0,1)] pmov mm7, [enw(8,0,2)] pfacc mm6, mm6 pfmul mm5, mm7 pfmul mm6, mm2 pfsub mm1, mm5 pfmul mm4, mm6 pfmul mm7, [c(0,34)] pfadd mm0, mm4 pfadd mm3, mm7 %endmacro %macro window_filter_3dn_yprime_other_type1 2 ; a +=c[64*%1 + i ]*enwindow[i/4 ][%1][i%4]; ; a -=c[64*%2 + i+16]*enwindow[i/4+8][%1][i%4]; // 符号逆転 ; b +=c[64*%1 + i+32]*enwindow[i/4+8][%1][i%4]; ; b +=c[64*%2 + i+48]*enwindow[i/4 ][%1][i%4]; // 符号逆転 ; output ; mm0 b:a[i+1:i+1] ; mm1 a[i+3:i+2] ; mm3 b[i+3:i+2] pmovd mm4, [c(%1, 1)] pmov mm5, [c(%1, 2)] pmovd mm6, [enw(0,%1,1)] punpckldq mm4, [c(%2,49)] pmov mm7, [enw(0,%1,2)] pfacc mm6, mm6 pfmul mm5, mm7 pfmul mm4, mm6 pfadd mm1, mm5 pfmul mm7, [c(%2,50)] pfadd mm0, mm4 pmovd mm4, [c(%2,17)] pfadd mm3, mm7 pmov mm5, [c(%2,18)] punpckldq mm4, [c(%1,33)] pmovd mm6, [enw(8,%1,1)] pmov mm7, [enw(8,%1,2)] pfacc mm6, mm6 pfmul mm5, mm7 pfmul mm6, mm2 pfsub mm1, mm5 pfmul mm4, mm6 pfmul mm7, [c(%1,34)] pfadd mm0, mm4 pfadd mm3, mm7 %endmacro %macro window_filter_3dn_yprime_first_type2 0 ; a =c[64*0 + i ]*enwindow[i/4 ][0][i%4]; ; a -=c[64*7 + i+16]*enwindow[i/4+8][0][i%4]; // 符号逆転 ; b =c[64*0 + i+32]*enwindow[i/4+8][0][i%4]; ; b +=c[64*7 + i+48]*enwindow[i/4 ][0][i%4]; // 符号逆転 ; output ; mm0 a[i+1:i+0] ; mm1 a[i+3:i+2] ; mm2 b[i+1:i+0] ; mm3 b[i+3:i+2] pmov mm0, [c(0,0)] pmov mm1, [c(0,2)] pmov mm2, [enw(0,0,0)] pmov mm3, [enw(0,0,2)] pfmul mm0, mm2 pfmul mm1, mm3 pfmul mm2, [c(7,48)] pfmul mm3, [c(7,50)] pmov mm4, [c(7,16)] pmov mm5, [c(7,18)] pmov mm6, [enw(8,0,0)] pmov mm7, [enw(8,0,2)] pfmul mm4, mm6 pfmul mm5, mm7 pfsub mm0, mm4 pfsub mm1, mm5 pfmul mm6, [c(0,32)] pfmul mm7, [c(0,34)] pfadd mm2, mm6 pfadd mm3, mm7 %endmacro %macro window_filter_3dn_yprime_other_type2 2 ; a +=c[64*%1 + i ]*enwindow[i/4 ][%1][i%4]; ; a -=c[64*%2 + i+16]*enwindow[i/4+8][%1][i%4]; // 符号逆転 ; b +=c[64*%1 + i+32]*enwindow[i/4+8][%1][i%4]; ; b +=c[64*%2 + i+48]*enwindow[i/4 ][%1][i%4]; // 符号逆転 ; output ; mm0 a[i+1:i+0] ; mm1 a[i+3:i+2] ; mm2 b[i+1:i+0] ; mm3 b[i+3:i+2] pmov mm4, [c(%1,0)] pmov mm5, [c(%1,2)] pmov mm6, [enw(0,%1,0)] pmov mm7, [enw(0,%1,2)] pfmul mm4, mm6 pfmul mm5, mm7 pfadd mm0, mm4 pfadd mm1, mm5 pfmul mm6, [c(%2,48)] pfmul mm7, [c(%2,50)] pfadd mm2, mm6 pfadd mm3, mm7 pmov mm4, [c(%2,16)] pmov mm5, [c(%2,18)] pmov mm6, [enw(8,%1,0)] pmov mm7, [enw(8,%1,2)] pfmul mm4, mm6 pfmul mm5, mm7 pfsub mm0, mm4 pfsub mm1, mm5 pfmul mm6, [c(%1,32)] pfmul mm7, [c(%1,34)] pfadd mm2, mm6 pfadd mm3, mm7 %endmacro ; i = 1, 2, 3 window_filter_3dn_yprime_first_type1 window_filter_3dn_yprime_other_type1 1,6 window_filter_3dn_yprime_other_type1 2,5 window_filter_3dn_yprime_other_type1 3,4 window_filter_3dn_yprime_other_type1 4,3 window_filter_3dn_yprime_other_type1 5,2 window_filter_3dn_yprime_other_type1 6,1 window_filter_3dn_yprime_other_type1 7,0 add edi, 4*4 add eax, 8*4*4 pmovd [yprime(15)], mm0 punpckldq mm5, mm1 psrlq mm0, 32 pmov [yprime(18)], mm3 punpckhdq mm1, mm5 pmovd [yprime(17)], mm0 pmov [yprime(13)], mm1 ; i = 4..15 lea ebx, [yprime(20)] lea edx, [yprime(11)] mov ecx, 3 jmp short .lp4 .lp4: window_filter_3dn_yprime_first_type2 window_filter_3dn_yprime_other_type2 1,6 window_filter_3dn_yprime_other_type2 2,5 window_filter_3dn_yprime_other_type2 3,4 window_filter_3dn_yprime_other_type2 4,3 window_filter_3dn_yprime_other_type2 5,2 window_filter_3dn_yprime_other_type2 6,1 window_filter_3dn_yprime_other_type2 7,0 add edi, 4*4 add eax, 8*4*4 punpckldq mm4, mm0 punpckldq mm5, mm1 punpckhdq mm0, mm4 punpckhdq mm1, mm5 pmov [ebx+ 0], mm2 pmov [ebx+ 8], mm3 add ebx, 4*4 pmov [edx- 0], mm0 pmov [edx- 8], mm1 sub edx, 4*4 dec ecx jnz near .lp4 sub edi,48*4 ; c -= 32 mov ecx, 32 mov edx, idct_coefficient+184 jmp short .lp2 align 16 .lp2: ; mm0 = s1:s0[i+0] ; mm1 = s1:s0[i+1] ; mm2 = s1:s0[i+2] ; mm3 = s1:s0[i+3] pmov mm3, [yprime(0)] pmov mm0, [edx+32*4*0-184] pmov mm1, [edx+32*4*1-184] pmov mm2, [edx+32*4*2-184] pfmul mm0, mm3 pfmul mm1, mm3 pfmul mm2, mm3 pfmul mm3, [edx+32*4*3-184] pmov mm7, [yprime(2)] pmov mm4, [edx+32*4*0+8-184] pmov mm5, [edx+32*4*1+8-184] pmov mm6, [edx+32*4*2+8-184] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [edx+32*4*3+8-184] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 mov eax, 4 mov ebx, 7 jmp short .lp3 align 16 .lp3: pmov mm7, [yprime(eax)] pmov mm4, [edx+32*4*0+eax*4-184] pmov mm5, [edx+32*4*1+eax*4-184] pmov mm6, [edx+32*4*2+eax*4-184] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [edx+32*4*3+eax*4-184] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pmov mm7, [yprime(eax)+8] pmov mm4, [edx+32*4*0+eax*4+8-184] pmov mm5, [edx+32*4*1+eax*4+8-184] pmov mm6, [edx+32*4*2+eax*4+8-184] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [edx+32*4*3+eax*4+8-184] add eax, 4 pfadd mm0, mm4 pfadd mm1, mm5 dec ebx pfadd mm2, mm6 pfadd mm3, mm7 jnz .lp3 pfacc mm4, mm0 pfacc mm5, mm1 pfacc mm6, mm2 pfacc mm7, mm3 punpckhdq mm4, mm5 punpckhdq mm6, mm7 punpckldq mm0, mm1 punpckldq mm2, mm3 pmov [ebp+4*0], mm4 pmov [ebp+4*2], mm6 add edx, 32*4*4 add ebp, 16 sub ecx, 8 pfsub mm4, mm0 pfsub mm6, mm2 pfsub mm0, mm4 pfsub mm2, mm6 punpckldq mm1, mm0 punpckldq mm3, mm2 punpckhdq mm0, mm1 punpckhdq mm2, mm3 pmov [ebp+ecx*4+ 8], mm0 pmov [ebp+ecx*4+ 0], mm2 jnz near .lp2 add ebp,16*4 dec esi jnz near .lp1 ; free area for yprime[32] mov esp,[esp+32*4] .exit: femms popd ebx, esi, edi, ebp ; call _clkend endproc ;*************************************************************************** %ifdef USE_E3DN ; 2000/04/06 スタブ的に window_filter_subband_3DN に jmp するだけ by kei ; 2000/04/07 まっとうに E3DN 対応 ; 2000/04/08 yprime[16] をループの外に proc window_filter_subband_E3DN %$win_buf arg 4 %$s arg 4 %$mode_gr arg 4 ; extern _clkbegin ; extern _clkend ; call _clkbegin femms pushd ebx, esi, edi, ebp mov edi,[sp(%$win_buf)] mov ebp,[sp(%$s)] mov esi,[sp(%$mode_gr)] ; 1 or 2 add edi,1152*F_SIZE ; = c = &win_buf[1152] add esi,esi lea esi,[esi+esi*8] ; = j = 18*mode_gr add edi, coff(4,0) ; allocate yprime[32] mov edx,esp sub esp,32*4+4 and esp,~63 ; align to 64 byte boundary mov [esp+32*4],edx ; save the original ESP prefetchw [yprime(0)] prefetchw [yprime(16)] jmp short .f1 align 16 .lp1: .f1: mov eax, enwindow+enwoff(8,0,0) ; yprime[0] pmovd mm0, [c(0,16)] pmovd mm1, [c(1,16)] pmovd mm2, [c(2,16)] pmovd mm3, [c(3,16)] pmovd mm4, [enw(4,0,0)] pmovd mm5, [enw(4,1,0)] pmovd mm6, [enw(4,2,0)] pmovd mm7, [enw(4,3,0)] punpckldq mm0, [c(4,16)] punpckldq mm1, [c(5,16)] punpckldq mm2, [c(6,16)] punpckldq mm3, [c(7,16)] punpckldq mm4, [enw(4,4,0)] punpckldq mm5, [enw(4,5,0)] punpckldq mm6, [enw(4,6,0)] punpckldq mm7, [enw(4,7,0)] pfmul mm0, mm4 pfmul mm1, mm5 pfmul mm2, mm6 pfmul mm3, mm7 pfadd mm0, mm1 pfadd mm2, mm3 pfadd mm0, mm2 pfacc mm0, mm0 pmovd [yprime(0)], mm0 ; yprime[16] pmovd mm1, [c(3,0)] pmovd mm0, [c(1,0)] pmovd mm2, [c(7,0)] pmovd mm3, [c(5,0)] punpckldq mm1, [c(4,0)] punpckldq mm0, [c(2,0)] punpckldq mm2, [c(6,0)] pfadd mm1, mm3 pfadd mm0, mm2 pmovd mm4, [c(0,32)] pmovd mm5, [c(2,32)] pmovd mm6, [c(7,32)] pmovd mm7, [c(5,32)] punpckldq mm4, [c(1,32)] punpckldq mm5, [c(3,32)] punpckldq mm6, [c(6,32)] punpckldq mm7, [c(4,32)] pfsub mm4, mm6 pfsub mm5, mm7 pmovd mm2, [enw(0,1,0)] pmovd mm3, [enw(0,3,0)] pmovd mm6, [enw(8,0,0)] pmovd mm7, [enw(8,2,0)] punpckldq mm2, [enw(0,2,0)] punpckldq mm3, [enw(0,4,0)] punpckldq mm6, [enw(8,1,0)] punpckldq mm7, [enw(8,3,0)] pfmul mm0, mm2 pfmul mm1, mm3 pfmul mm4, mm6 pfmul mm5, mm7 pfadd mm0, mm1 pfadd mm4, mm5 pfadd mm0, mm4 pfacc mm0, mm0 pmovd [yprime(16)], mm0 ; i = 1, 2, 3 window_filter_3dn_yprime_first_type1 window_filter_3dn_yprime_other_type1 1,6 window_filter_3dn_yprime_other_type1 2,5 window_filter_3dn_yprime_other_type1 3,4 window_filter_3dn_yprime_other_type1 4,3 window_filter_3dn_yprime_other_type1 5,2 window_filter_3dn_yprime_other_type1 6,1 window_filter_3dn_yprime_other_type1 7,0 add edi, 4*4 add eax, 8*4*4 pmovd [yprime(15)], mm0 psrlq mm0, 32 pswapd mm1, mm1 pmov [yprime(18)], mm3 pmovd [yprime(17)], mm0 pmov [yprime(13)], mm1 ; i = 4..15 lea ebx, [yprime(20)] lea edx, [yprime(11)] mov ecx, 3 jmp short .lp4 .lp4: window_filter_3dn_yprime_first_type2 window_filter_3dn_yprime_other_type2 1,6 window_filter_3dn_yprime_other_type2 2,5 window_filter_3dn_yprime_other_type2 3,4 window_filter_3dn_yprime_other_type2 4,3 window_filter_3dn_yprime_other_type2 5,2 window_filter_3dn_yprime_other_type2 6,1 window_filter_3dn_yprime_other_type2 7,0 add edi, 4*4 add eax, 8*4*4 pswapd mm0, mm0 pswapd mm1, mm1 pmov [ebx+ 0], mm2 pmov [ebx+ 8], mm3 add ebx, 4*4 pmov [edx- 0], mm0 pmov [edx- 8], mm1 sub edx, 4*4 dec ecx jnz near .lp4 sub edi,48*4 ; c -= 32 prefetchw [ebp] prefetchw [ebp+64] mov ecx, 32 mov edx, idct_coefficient+184 jmp short .lp2 align 16 .lp2: ; mm0 = s1:s0[i+0] ; mm1 = s1:s0[i+1] ; mm2 = s1:s0[i+2] ; mm3 = s1:s0[i+3] pmov mm3, [yprime(0)] pmov mm0, [edx+32*4*0-184] pmov mm1, [edx+32*4*1-184] pmov mm2, [edx+32*4*2-184] pfmul mm0, mm3 pfmul mm1, mm3 pfmul mm2, mm3 pfmul mm3, [edx+32*4*3-184] pmov mm7, [yprime(2)] pmov mm4, [edx+32*4*0+8-184] pmov mm5, [edx+32*4*1+8-184] pmov mm6, [edx+32*4*2+8-184] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [edx+32*4*3+8-184] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 mov eax, 4 mov ebx, 7 prefetch [c(0,0)] prefetch [c(1,0)] jmp short .lp3 align 16 .lp3: pmov mm7, [yprime(eax)] pmov mm4, [edx+32*4*0+eax*4-184] pmov mm5, [edx+32*4*1+eax*4-184] pmov mm6, [edx+32*4*2+eax*4-184] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [edx+32*4*3+eax*4-184] pfadd mm0, mm4 pfadd mm1, mm5 pfadd mm2, mm6 pfadd mm3, mm7 pmov mm7, [yprime(eax)+8] pmov mm4, [edx+32*4*0+eax*4+8-184] pmov mm5, [edx+32*4*1+eax*4+8-184] pmov mm6, [edx+32*4*2+eax*4+8-184] pfmul mm4, mm7 pfmul mm5, mm7 pfmul mm6, mm7 pfmul mm7, [edx+32*4*3+eax*4+8-184] add eax, 4 pfadd mm0, mm4 pfadd mm1, mm5 dec ebx pfadd mm2, mm6 pfadd mm3, mm7 jnz .lp3 pfacc mm4, mm0 pfacc mm5, mm1 pfacc mm6, mm2 pfacc mm7, mm3 punpckhdq mm4, mm5 punpckhdq mm6, mm7 add edx, 32*4*4 pmov [ebp+4*0], mm4 pmov [ebp+4*2], mm6 add ebp, 16 sub ecx, 8 pfnacc mm0, mm0 pfnacc mm1, mm1 pfnacc mm2, mm2 pfnacc mm3, mm3 punpckldq mm1, mm0 punpckldq mm3, mm2 pmov [ebp+ecx*4+ 8], mm1 pmov [ebp+ecx*4+ 0], mm3 jnz near .lp2 add ebp,16*4 dec esi jnz near .lp1 ; free area for yprime[32] mov esp,[esp+32*4] .exit: femms popd ebx, esi, edi, ebp ; call _clkend endproc ;*************************************************************************** %endif %if 0 ; 以前の実装 ; void window_filter_subband_3DN(int *win_buf,int ch ,float *s,int mode_gr) ;*************************************************************************** window_filter_subband_3DN: push ebx push esi push edi push ebp femms %assign _P 4*4 mov esi,[esp+_P+8] ;esi=ch mov edi,sbd_xxx ;edi=c=&sbd_xxx[0][0] mov ebx,[esp+_P+4] ;ebx=win_buf mov ebp,[sbd_off+esi*4] ;ebp=offset and esi,esi jz short .F00 add edi,HAN_SIZE*F_SIZE ;c=&sbd_xxx[1][0] .F00: ; ebx=win_buf, esi=j=18*2, edi=c(fix), ebp=offset=sbd_off[ch] mov [saveOff],ebx mov eax,[esp+_P+12] mov esi,[esp+_P+16] ;esi=mode_gr(=1 or 2) add esi,esi lea esi,[esi+esi*8] ;=esi *= 18 mov [s_ptr],eax ;保存 ; allocate yyy[64] %assign LOCAL_STACK 64*4 mov edx,esp sub esp,LOCAL_STACK+4 and esp,~15 ; align to 16 byte boundary mov [esp+LOCAL_STACK],edx ; save the original ESP jmp short .LOOP %define yyy esp align 16 .LOOP: ; for(i=31;i>=0;i--) c[i+offset] = (double)(*(*win_buf)++) * SCALER; mov ebx,[saveOff] lea edx,[edi+ebp*4] ; movq mm7,[D_SCALER] ;mm7=[SCALER:SCALER] pi2fd mm0,[ebx + 0*4] ;mm0=[wb1:wb0] pi2fd mm1,[ebx + 0*4+8] ;mm1=[wb3:wb2] pi2fd mm2,[ebx + 4*4] ;mm2=[wb5:wb4] pi2fd mm3,[ebx + 4*4+8] ;mm3=[wb7:wb6] ; pfmul mm0,mm7 ; pfmul mm1,mm7 ; pfmul mm2,mm7 ; pfmul mm3,mm7 punpckldq mm4,mm0 punpckldq mm5,mm1 punpckldq mm6,mm2 punpckldq mm7,mm3 punpckhdq mm0,mm4 ;mm0=[wb0*R:wb1*R] punpckhdq mm1,mm5 ;mm1=[wb2*R:wb3*R] punpckhdq mm2,mm6 ;mm2=[wb4*R:wb5*R] punpckhdq mm3,mm7 ;mm3=[wb6*R:wb7*R] movq [edx+28*4-0*4+8],mm0 movq [edx+28*4-0*4],mm1 movq [edx+28*4-4*4+8],mm2 movq [edx+28*4-4*4],mm3 ; movq mm7,[D_SCALER] ;mm7=[SCALER:SCALER] pi2fd mm0,[ebx + 8*4] ;mm0=[wb9:wb8] pi2fd mm1,[ebx + 8*4+8] ;mm1=[wb11:wb10] pi2fd mm2,[ebx + 12*4] ;mm2=[wb13:wb12] pi2fd mm3,[ebx + 12*4+8] ;mm3=[wb15:wb14] ; pfmul mm0,mm7 ; pfmul mm1,mm7 ; pfmul mm2,mm7 ; pfmul mm3,mm7 punpckldq mm4,mm0 punpckldq mm5,mm1 punpckldq mm6,mm2 punpckldq mm7,mm3 punpckhdq mm0,mm4 ;mm0=[wb8*R:wb9*R] punpckhdq mm1,mm5 ;mm1=[wb10*R:wb11*R] punpckhdq mm2,mm6 ;mm2=[wb12*R:wb13*R] punpckhdq mm3,mm7 ;mm3=[wb14*R:wb15*R] movq [edx+28*4-8*4+8],mm0 movq [edx+28*4-8*4],mm1 movq [edx+28*4-12*4+8],mm2 movq [edx+28*4-12*4],mm3 ; movq mm7,[D_SCALER] ;mm7=[SCALER:SCALER] pi2fd mm0,[ebx + 16*4] ;mm0=[wb17:wb16] pi2fd mm1,[ebx + 16*4+8] ;mm1=[wb19:wb18] pi2fd mm2,[ebx + 20*4] ;mm2=[wb21:wb20] pi2fd mm3,[ebx + 20*4+8] ;mm3=[wb23:wb22] ; pfmul mm0,mm7 ; pfmul mm1,mm7 ; pfmul mm2,mm7 ; pfmul mm3,mm7 punpckldq mm4,mm0 punpckldq mm5,mm1 punpckldq mm6,mm2 punpckldq mm7,mm3 punpckhdq mm0,mm4 ;mm0=[wb16*R:wb17*R] punpckhdq mm1,mm5 ;mm1=[wb18*R:wb19*R] punpckhdq mm2,mm6 ;mm2=[wb20*R:wb21*R] punpckhdq mm3,mm7 ;mm3=[wb22*R:wb23*R] movq [edx+28*4-16*4+8],mm0 movq [edx+28*4-16*4],mm1 movq [edx+28*4-20*4+8],mm2 movq [edx+28*4-20*4],mm3 ; movq mm7,[D_SCALER] ;mm7=[SCALER:SCALER] pi2fd mm0,[ebx + 24*4] ;mm0=[wb25:wb24] pi2fd mm1,[ebx + 24*4+8] ;mm1=[wb27:wb26] pi2fd mm2,[ebx + 28*4] ;mm2=[wb29:wb28] pi2fd mm3,[ebx + 28*4+8] ;mm3=[wb31:wb30] ; pfmul mm0,mm7 ; pfmul mm1,mm7 ; pfmul mm2,mm7 ; pfmul mm3,mm7 punpckldq mm4,mm0 punpckldq mm5,mm1 punpckldq mm6,mm2 punpckldq mm7,mm3 punpckhdq mm0,mm4 ;mm0=[wb24*R:wb25*R] punpckhdq mm1,mm5 ;mm1=[wb26*R:wb27*R] punpckhdq mm2,mm6 ;mm2=[wb28*R:wb29R] punpckhdq mm3,mm7 ;mm3=[wb30*R:wb31*R] movq [edx+28*4-24*4+8],mm0 movq [edx+28*4-24*4],mm1 movq [edx+28*4-28*4+8],mm2 movq [edx+28*4-28*4],mm3 add ebx,32*F_SIZE mov [saveOff],ebx ;; xor ecx,ecx mov ebx,HAN_SIZE-1 ;code size 縮小のため mov edx,enwindow jmp short .lp1 align 16 .lp1: ;{ lea eax,[ecx+ebp] ;eax=i+offset and eax,ebx movq mm0,[edx+ 0*4] movq mm1,[edx+ 0*4+8] movq mm2,[edx+ 4*4] movq mm3,[edx+ 4*4+8] pfmul mm0,[edi+eax*4] pfmul mm1,[edi+eax*4+8] add eax,64 and eax,ebx pfmul mm2,[edi+eax*4] pfmul mm3,[edi+eax*4+8] add eax,64 and eax,ebx movq mm4,[edx+ 8*4] movq mm5,[edx+ 8*4+8] pfadd mm0,mm2 pfadd mm1,mm3 movq mm6,[edx+ 12*4] movq mm7,[edx+ 12*4+8] pfmul mm4,[edi+eax*4] pfmul mm5,[edi+eax*4+8] add eax,64 and eax,ebx pfadd mm0,mm4 pfadd mm1,mm5 pfmul mm6,[edi+eax*4] pfmul mm7,[edi+eax*4+8] add eax,64 and eax,ebx movq mm2,[edx+ 16*4] movq mm3,[edx+ 16*4+8] pfadd mm0,mm6 pfadd mm1,mm7 movq mm4,[edx+ 20*4] movq mm5,[edx+ 20*4+8] pfmul mm2,[edi+eax*4] pfmul mm3,[edi+eax*4+8] add eax,64 and eax,ebx pfadd mm0,mm2 pfadd mm1,mm3 pfmul mm4,[edi+eax*4] pfmul mm5,[edi+eax*4+8] add eax,64 and eax,ebx movq mm6,[edx+ 24*4] movq mm7,[edx+ 24*4+8] pfadd mm0,mm4 pfadd mm1,mm5 movq mm2,[edx+ 28*4] movq mm3,[edx+ 28*4+8] pfmul mm6,[edi+eax*4] pfmul mm7,[edi+eax*4+8] add eax,64 and eax,ebx pfadd mm0,mm6 pfadd mm1,mm7 pfmul mm2,[edi+eax*4] pfmul mm3,[edi+eax*4+8] add edx,32*F_SIZE pfadd mm0,mm2 pfadd mm1,mm3 add ecx,4 movq [yyy+ecx*4-4*4],mm0 movq [yyy+ecx*4-2*4],mm1 cmp ecx,HAN_SIZE/8 jb near .lp1 ;} add ebp,480 and ebp,ebx ; yprime[0] = yprime[16] ; for( i=1; i<=16; i++ ) yprime[i] = y[i+16]+y[16-i]; ; ; アラインミス連発だけど仕方ないよなあ lea eax,[yyy+0x80] ; コードサイズ縮小 ;%define Y eax-0x80 ;for my priprocessor movq mm0,[eax-128+ 0*4] movq mm1,[eax-128+ 2*4] movq mm2,[eax-128+ 4*4] movq mm3,[eax-128+ 6*4] punpckldq mm4,mm0 punpckldq mm5,mm1 punpckldq mm6,mm2 punpckldq mm7,mm3 punpckhdq mm0,mm4 ;mm0=[ 0: 1] punpckhdq mm1,mm5 ;mm1=[ 2: 3] punpckhdq mm2,mm6 ;mm2=[ 4: 5] punpckhdq mm3,mm7 ;mm3=[ 6: 7] movq mm4,[eax-128+ 8*4] movq mm5,[eax-128+10*4] movq mm6,[eax-128+12*4] movq mm7,[eax-128+14*4] mov ebx,[eax-128+16*4] ;ebx=[16] pfadd mm0,[eax-128+31*4] ;mm0+=[32:31] pfadd mm1,[eax-128+29*4] ;mm1+=[30:29] pfadd mm2,[eax-128+27*4] ;mm2+=[28:27] pfadd mm3,[eax-128+25*4] ;mm3+=[26:25] movq [eax-128+15*4],mm0 movq [eax-128+13*4],mm1 movq [eax-128+11*4],mm2 movq [eax-128+ 9*4],mm3 punpckldq mm0,mm4 punpckldq mm1,mm5 punpckldq mm2,mm6 punpckldq mm3,mm7 punpckhdq mm4,mm0 ;mm4=[ 8: 9] punpckhdq mm5,mm1 ;mm5=[10:11] punpckhdq mm6,mm2 ;mm6=[12:13] punpckhdq mm7,mm3 ;mm7=[14:15] pfadd mm4,[eax-128+23*4] ;mm4+=[24:23] pfadd mm5,[eax-128+21*4] ;mm5+=[22:21] pfadd mm6,[eax-128+19*4] ;mm6+=[20:19] pfadd mm7,[eax-128+17*4] ;mm7+=[18:17] movq [eax-128+ 7*4],mm4 movq [eax-128+ 5*4],mm5 movq [eax-128+ 3*4],mm6 movq [eax-128+ 1*4],mm7 mov [eax-128+ 0*4],ebx movq mm0,[eax-128+49*4] movq mm1,[eax-128+51*4] movq mm2,[eax-128+53*4] movq mm3,[eax-128+55*4] punpckldq mm4,mm0 punpckldq mm5,mm1 punpckldq mm6,mm2 punpckldq mm7,mm3 punpckhdq mm0,mm4 ;mm0=[49:50] punpckhdq mm1,mm5 ;mm1=[51:52] punpckhdq mm2,mm6 ;mm2=[53:54] punpckhdq mm3,mm7 ;mm3=[55:56] pfsubr mm0,[eax-128+46*4] ;mm0=[47:46]-mm0 pfsubr mm1,[eax-128+44*4] ;mm1=[45:44]-mm1 pfsubr mm2,[eax-128+42*4] ;mm2=[43:42]-mm2 pfsubr mm3,[eax-128+40*4] ;mm3=[41:40]-mm3 movq mm4,[eax-128+57*4] movq mm5,[eax-128+59*4] movq mm6,[eax-128+61*4] movq mm7,[eax-128+63*4] movq [eax-128+30*4],mm0 movq [eax-128+28*4],mm1 movq [eax-128+26*4],mm2 movq [eax-128+24*4],mm3 punpckldq mm0,mm4 punpckldq mm1,mm5 punpckldq mm2,mm6 punpckhdq mm4,mm0 ;mm4=[57:58] punpckhdq mm5,mm1 ;mm5=[59:60] punpckhdq mm6,mm2 ;mm6=[61:62] ;mm7=[63] pfsubr mm4,[eax-128+38*4] ;mm4=[39:38]-mm4 pfsubr mm5,[eax-128+36*4] ;mm5=[37:36]-mm5 pfsubr mm6,[eax-128+34*4] ;mm6=[35:34]-mm6 pfsubr mm7,[eax-128+33*4] ;mm7=[33]-mm7 movq [eax-128+22*4],mm4 movq [eax-128+20*4],mm5 movq [eax-128+18*4],mm6 movd [eax-128+17*4],mm7 ;----------------------------------------------- ;%undef Y ; for( i=0; i<16; i++ ){ ; s0 = s1 = 0.0; ; for( j=0; j<32; j+=2 ){ ; s0 += (*m)[i+0][j ]*yprime[j+0]; ; s1 += (*m)[i+0][j+1]*yprime[j+1]; ; } ; xout[i+ 0] = s0+s1; ; xout[31-i] = s0-s1; ; } mov ebx,[s_ptr] mov ecx,16 lea edx,[idct_coefficient+128] ;+128はコードサイズ縮小のため lea eax,[yyy+128] jmp .lp2 align 16 .lp2: ;{ movq mm0,[edx-128+ 0*4] movq mm2,[eax-128+ 0*4] movq mm1,[edx-128+ 2*4] movq mm3,[eax-128+ 2*4] pfmul mm0,mm2 pfmul mm1,mm3 pfmul mm2,[edx+ 0*4] pfmul mm3,[edx+ 2*4] movq mm4,[edx-128+ 4*4] movq mm6,[eax-128+ 4*4] movq mm5,[edx-128+ 6*4] movq mm7,[eax-128+ 6*4] pfmul mm4,mm6 pfmul mm5,mm7 pfmul mm6,[edx+ 4*4] pfmul mm7,[edx+ 6*4] pfadd mm0,mm4 pfadd mm1,mm5 pfadd mm2,mm6 pfadd mm3,mm7 movq mm4,[edx-128+ 8*4] movq mm6,[eax-128+ 8*4] movq mm5,[edx-128+10*4] movq mm7,[eax-128+10*4] pfmul mm4,mm6 pfmul mm5,mm7 pfmul mm6,[edx+ 8*4] pfmul mm7,[edx+10*4] pfadd mm0,mm4 pfadd mm1,mm5 pfadd mm2,mm6 pfadd mm3,mm7 movq mm4,[edx-128+12*4] movq mm6,[eax-128+12*4] movq mm5,[edx-128+14*4] movq mm7,[eax-128+14*4] pfmul mm4,mm6 pfmul mm5,mm7 pfmul mm6,[edx+12*4] pfmul mm7,[edx+14*4] pfadd mm0,mm4 pfadd mm1,mm5 pfadd mm2,mm6 pfadd mm3,mm7 movq mm4,[edx-128+16*4] movq mm6,[eax-128+16*4] movq mm5,[edx-128+18*4] movq mm7,[eax-128+18*4] pfmul mm4,mm6 pfmul mm5,mm7 pfmul mm6,[edx+16*4] pfmul mm7,[edx+18*4] pfadd mm0,mm4 pfadd mm1,mm5 pfadd mm2,mm6 pfadd mm3,mm7 movq mm4,[edx-128+20*4] movq mm6,[eax-128+20*4] movq mm5,[edx-128+22*4] movq mm7,[eax-128+22*4] pfmul mm4,mm6 pfmul mm5,mm7 pfmul mm6,[edx+20*4] pfmul mm7,[edx+22*4] pfadd mm0,mm4 pfadd mm1,mm5 pfadd mm2,mm6 pfadd mm3,mm7 movq mm4,[edx-128+24*4] movq mm6,[eax-128+24*4] movq mm5,[edx-128+26*4] movq mm7,[eax-128+26*4] pfmul mm4,mm6 pfmul mm5,mm7 pfmul mm6,[edx+24*4] pfmul mm7,[edx+26*4] pfadd mm0,mm4 pfadd mm1,mm5 pfadd mm2,mm6 pfadd mm3,mm7 movq mm4,[edx-128+28*4] movq mm6,[eax-128+28*4] movq mm5,[edx-128+30*4] movq mm7,[eax-128+30*4] pfmul mm4,mm6 pfmul mm5,mm7 pfmul mm6,[edx+28*4] pfmul mm7,[edx+30*4] pfadd mm0,mm4 pfadd mm1,mm5 pfadd mm2,mm6 pfadd mm3,mm7 pfadd mm0, mm1 pfadd mm2, mm3 add edx,256 ; xout[i+ 0] = s0+s1; ; xout[31-i] = s0-s1; movq mm4,mm0 ;[s1:s0] movq mm5,mm0 ;[s1:s0] pfacc mm0,mm2 ;[s0+s1] movq mm6,mm2 movq mm7,mm2 add ebx,8 sub ecx,2 punpckhdq mm4,mm4 ;[s1] punpckhdq mm6,mm6 movq [ebx-8],mm0 ;s0+s1 pfsub mm5,mm4 ;[s0-s1] pfsub mm7,mm6 movd [ebx+ecx*8+4],mm5 movd [ebx+ecx*8],mm7 jnz near .lp2 ;} add ebx,16*4 dec esi mov [s_ptr],ebx jnz near .LOOP ; free area for yyy[64] mov esp,[esp+LOCAL_STACK] %undef yyy ; test dword [esp+_P+8],1 mov edx,sbd_off jz short .F2 add edx,4 .F2: mov [edx],ebp .exit: femms pop ebp pop edi pop esi pop ebx ret %endif gogo239b/sbandfpu.nas100644 23421 144 15446 7220537350 13670 0ustar shigeousers ; optimized mdct() for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to Keiichi SAKAI ; 99/09/15 subband.nasの分割 ; 変数名の変更 ; xxx -> sbd_xxx ; enwindow_sse -> enwindow %include "nasm.h" globaldef window_filter_subband_FPU externdef enwindow externdef idct_coefficient externdef sbd_xxx HAN_SIZE equ 512 ;defined in common.h SBLIMIT equ 32 segment_data segment_bss segment_code ;******** FPU専用ルーチン ******** ; by K.SAKAI ; sbd_shiftin()と組み合わせて使用する。 ; 2000/03/29 C版は122k[clk]@河童, 114k[clk]@河童 ; 2000/04/17 SMP最適化のための布石 by K.SAKAI ; void window_filter_subband_FPU(float *win_buf, float *s, int mode_gr) align 16 window_filter_subband_FPU: push ebx push esi push edi push ebp ; allocate yyy[32] sub esp,32*4 %define yyy esp %assign _P (4+32)*4 mov edi,[esp+_P+4] ; = win_buf mov ebp,[esp+_P+8] ; = s mov esi,[esp+_P+12] ; = mode_gr(=1 or 2) add edi,1152*4 ; = c = &win_buf[1152] add esi,esi lea esi,[esi+esi*8] ; = j = 18*mode_gr jmp short .f1 align 16 .lp1: .f1: ; yprime[16] = (c[64*1]+c[64*7])*enwindow[0][1][0] ; + (c[64*2]+c[64*6])*enwindow[0][2][0] ; + (c[64*3]+c[64*5])*enwindow[0][3][0] ; + c[64*4]*enwindow[0][4][0] ; + (c[64*0+32]-c[64*7+32])*enwindow[8][0][0] ; + (c[64*1+32]-c[64*6+32])*enwindow[8][1][0] ; + (c[64*2+32]-c[64*5+32])*enwindow[8][2][0] ; + (c[64*3+32]-c[64*4+32])*enwindow[8][3][0]; fld dword [edi + (64*1 + 0)*4] fadd dword [edi + (64*7 + 0)*4] fmul dword [enwindow + (0*8*4 + 1*4)*4] ; *= enwindow[0][1][0] fld dword [edi + (64*2 + 0)*4] fadd dword [edi + (64*6 + 0)*4] fmul dword [enwindow + (0*8*4 + 2*4)*4] ; *= enwindow[0][2][0] faddp st1,st0 fld dword [edi + (64*3 + 0)*4] fadd dword [edi + (64*5 + 0)*4] fmul dword [enwindow + (0*8*4 + 3*4)*4] ; *= enwindow[0][3][0] faddp st1,st0 fld dword [edi + (64*4 + 0)*4] fmul dword [enwindow + (0*8*4 + 4*4)*4] ; *= enwindow[0][4][0] faddp st1,st0 fld dword [edi + (64*0 + 32)*4] fsub dword [edi + (64*7 + 32)*4] fmul dword [enwindow + (8*8*4 + 0*4)*4] ; *= enwindow[8][0][0] faddp st1,st0 fld dword [edi + (64*1 + 32)*4] fsub dword [edi + (64*6 + 32)*4] fmul dword [enwindow + (8*8*4 + 1*4)*4] ; *= enwindow[8][1][0] faddp st1,st0 fld dword [edi + (64*2 + 32)*4] fsub dword [edi + (64*5 + 32)*4] fmul dword [enwindow + (8*8*4 + 2*4)*4] ; *= enwindow[8][2][0] faddp st1,st0 fld dword [edi + (64*3 + 32)*4] fsub dword [edi + (64*4 + 32)*4] fmul dword [enwindow + (8*8*4 + 3*4)*4] ; *= enwindow[8][3][0] faddp st1,st0 fstp dword [yyy + 16*4] ; yprime[ 0] = c[64*0+16]*enwindow[4][0][0] ; + c[64*1+16]*enwindow[4][1][0] ; + c[64*2+16]*enwindow[4][2][0] ; + c[64*3+16]*enwindow[4][3][0] ; + c[64*4+16]*enwindow[4][4][0] ; + c[64*5+16]*enwindow[4][5][0] ; + c[64*6+16]*enwindow[4][6][0] ; + c[64*7+16]*enwindow[4][7][0]; fld dword [edi + (64*0 + 16)*4] fmul dword [enwindow + (4*8*4 + 0*4)*4] ; *= enwindow[4][0][0] fld dword [edi + (64*1 + 16)*4] fmul dword [enwindow + (4*8*4 + 1*4)*4] ; *= enwindow[4][1][0] faddp st1,st0 fld dword [edi + (64*2 + 16)*4] fmul dword [enwindow + (4*8*4 + 2*4)*4] ; *= enwindow[4][2][0] faddp st1,st0 fld dword [edi + (64*3 + 16)*4] fmul dword [enwindow + (4*8*4 + 3*4)*4] ; *= enwindow[4][3][0] faddp st1,st0 fld dword [edi + (64*4 + 16)*4] fmul dword [enwindow + (4*8*4 + 4*4)*4] ; *= enwindow[4][4][0] faddp st1,st0 fld dword [edi + (64*5 + 16)*4] fmul dword [enwindow + (4*8*4 + 5*4)*4] ; *= enwindow[4][5][0] faddp st1,st0 fld dword [edi + (64*6 + 16)*4] fmul dword [enwindow + (4*8*4 + 6*4)*4] ; *= enwindow[4][6][0] faddp st1,st0 fld dword [edi + (64*7 + 16)*4] fmul dword [enwindow + (4*8*4 + 7*4)*4] ; *= enwindow[4][7][0] faddp st1,st0 fstp dword [yyy + 0*4] mov ecx,15 ; = i mov edx,-15 ; = -i jmp short .f2 ; for(i = 1; i < 16; i++){ ; register float *cp, *cm; ; cp = &c[i]; cm = &c[-i]; align 16 .f2: .lp2: mov eax,ecx shl eax,1 btr eax,2 rcl eax,1 btr eax,2 rcl eax,1 lea eax,[eax*4 + enwindow] ; = &enwindow[i/4 ][0][i%4] ; a =cp[64*0 ]*enwindow[i/4 ][0][i%4]; ; b =cm[64*7 + 64]*enwindow[i/4 ][0][i%4]; // 符号逆転 ; a -=cm[64*7 + 32]*enwindow[i/4+8][0][i%4]; // 符号逆転 ; b +=cp[64*0 + 32]*enwindow[i/4+8][0][i%4]; fld dword [edi + ecx*4 + (64*0 + 0)*4] fld dword [eax + (0*8*4 + 0*4)*4] fmul st1,st0 fmul dword [edi + edx*4 + (64*7 + 64)*4] fld dword [edi + edx*4 + (64*7 + 32)*4] fld dword [eax + (8*8*4 + 0*4)*4] fmul st1,st0 fmul dword [edi + ecx*4 + (64*0 + 32)*4] fxch fsubp st3,st0 faddp st1,st0 %macro window_filter 2 fld dword [edi + ecx*4 + (64*%1 + 0)*4] fld dword [eax + (0*8*4 + %1*4)*4] fmul st1,st0 fmul dword [edi + edx*4 + (64*%2 + 64)*4] fxch faddp st3,st0 faddp st1,st0 fld dword [edi + edx*4 + (64*%2 + 32)*4] fld dword [eax + (8*8*4 + %1*4)*4] fmul st1,st0 fmul dword [edi + ecx*4 + (64*%1 + 32)*4] fxch fsubp st3,st0 faddp st1,st0 %endmacro window_filter 7,0 window_filter 1,6 window_filter 6,1 window_filter 2,5 window_filter 5,2 window_filter 3,4 window_filter 4,3 fxch fstp dword [yyy + 16*4 + edx*4] ; yprime[16-i] = a; fstp dword [yyy + 16*4 + ecx*4] ; yprime[i+16] = b; inc edx dec ecx jnz near .lp2 ; } sub edi,32*4 ; c -= 32 ; for( i=0; i<16; i++ ){ ; s0 = s1 = 0.0; ; for( j=0; j<32; j+=2 ){ ; s0 += (*m)[i+0][j ]*yprime[j+0]; ; s1 += (*m)[i+0][j+1]*yprime[j+1]; ; } ; xout[i+ 0] = s0+s1; ; xout[31-i] = s0-s1; ; } xor ecx,ecx mov cl,16 mov edx,idct_coefficient jmp short .lp14 align 16 .lp14: fld dword [edx+ 0*4] fmul dword [yyy+ 0*4] xor eax,eax fld dword [edx+ 1*4] fmul dword [yyy+ 1*4] mov al,1 jmp short .lp140 align 16 .lp140: fld dword [edx+eax*8+ 0*4] fmul dword [yyy+eax*8+ 0*4] fld dword [edx+eax*8+ 1*4] fmul dword [yyy+eax*8+ 1*4] inc eax cmp al,16 fxch faddp st3,st0 faddp st1,st0 jl short .lp140 add edx,32*4 fld st1 fxch fadd st2,st0 fsubp st1,st0 fxch fstp dword [ebp] add ebp,4 dec ecx fstp dword [ebp+ecx*8] jnz near .lp14 add ebp,16*4 dec esi jnz near .lp1 ; free area for yyy[32] add esp,32*4 %undef yyy pop ebp pop edi pop esi pop ebx ret end gogo239b/sbandsse.nas100644 23421 144 120133 7220537350 13676 0ustar shigeousers ; optimized mdct() for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to Keiichi SAKAI ; 1999/09/15 subband.nasの分割 ; 変数名の変更 ; xxx -> sbd_xxx ; enwindow_sse -> enwindow ; 2000/03/27 sbd_shiftinの分離 %include "nasm.h" globaldef window_filter_subband_SSE globaldef frame_shiftin_multi_SSE globaldef sbd_shiftin_SSE globaldef sbd_shiftin_SSE_MULTI externdef enwindow externdef idct_coefficient externdef sbd_xxx HAN_SIZE equ 512 ;defined in common.h SBLIMIT equ 32 EXTRADELAY equ 56 ;defined in musenc.c F_SIZE equ 4 segment_data segment_code ;void frame_shiftin_multi_SSE(int (*int_buf)[1152+576+EXTRADELAY], short *frame_buf, float (*flt_buf)[1152+HAN_SIZE], int mode_gr, int stereo) align 16 frame_shiftin_multi_SSE: cmp byte [esp+20],2 je near frame_shiftin_stereo_SSE jmp frame_shiftin_mono_SSE ;void frame_shiftin_stereo(int (*int_buf)[1152+576+EXTRADELAY], short *frame_buf, float (*flt_buf)[1152+HAN_SIZE], int mode_gr) ;void frame_shiftin_mono(int (*int_buf)[1152+576+EXTRADELAY], short *frame_buf, float (*flt_buf)[1152+HAN_SIZE], int mode_gr) ; %if 0 ; ひたすら型変換しながらコピーするだけなんだが... ; 心理解析on時、int_bufの先頭576要素と最後56要素は使わない。 ; 心理解析off時、int_bufは不要。 ; static short saved_frame[(HAN_SIZE - 32)+(576+EXTRADELAY)][2]; /* EXTRADELAY は、56を仮定。 */ /* fast mode */ ; こっちも実装すると速くなるはず。 if(mode_gr == 2){ /* source, destination,... */ saved_frame[ 479: 0] flt_buf[ 552:1663] 480+576+56 samples frame_buf[ 39: 0] flt_buf[ 512: 551] 40(96-56)samples frame_buf[ 519: 40] flt_buf[ 32: 511] saved_frame[ 479: 0] 480 samples frame_buf[1151: 520] saved_frame[1111: 480] 56+576 samples }else{ /* source, destination,... */ saved_frame[ 575: 0] flt_buf[1088:1663] 480+96 samples saved_frame[1055: 576] flt_buf[ 608:1087] saved_frame[ 479: 0] 480 samples saved_frame[1111:1056] saved_frame[ 535: 480] 56 samples frame_buf[ 576: 0] saved_frame[1111: 536] 576 samples } /* psycho acoustic anlysis mode */ ; 今のとここっちだけ実装。 if(mode_gr == 2){ /* source, destination,... */ saved_frame[1055: 0] flt_buf[ 608:1663] 480+576 samples saved_frame[1111:1056] flt_buf[ 552: 607] int_buf[ 631: 576] 56 samples frame_buf[ 39: 0] flt_buf[ 512: 551] int_buf[ 671: 632] 40(96-56)samples frame_buf[ 519: 40] flt_buf[ 32: 511] int_buf[1151: 672] saved_frame[ 479: 0] 480 samples frame_buf[1151: 520] int_buf[1783:1152] saved_frame[1111: 480] 56+576 samples }else{ /* source, destination,... */ saved_frame[ 575: 0] flt_buf[1088:1663] 480+96 samples saved_frame[1055: 576] flt_buf[ 608:1087] saved_frame[ 479: 0] 480 samples saved_frame[1111:1056] int_buf[ 631: 576] saved_frame[ 535: 480] 56 samples frame_buf[ 576: 0] int_buf[1207: 632] saved_frame[1111: 536] 576 samples } %endif ; ; macros ; ; stereo4 source_adr,int_adr,short_adr,xmm_reg,xmm_reg,xmm_reg,xmm_reg ; mm0, mm1, mm2, mm3, mm7 = 16 %macro stereo4 1-7 none,none,none,none,none,none movq mm0,[%1] movq mm1,mm0 %ifnidni %3,none movq [%3],mm0 %endif pslld mm0,mm7 psrad mm0,mm7 %ifnidni %4,none cvtpi2ps %4,mm0 ; L %endif psrad mm1,mm7 %ifnidni %2,none movq [%2],mm0 %endif %ifnidni %5,none cvtpi2ps %5,mm1 ; R %endif %ifnidni %2,none movq [%2+sizeof_int_buf],mm1 %endif movq mm2,[%1+8] movq mm3,mm2 %ifnidni %3,none movq [%3+8],mm2 %endif pslld mm2,mm7 psrad mm2,mm7 %ifnidni %6,none cvtpi2ps %6,mm2 ; L %endif psrad mm3,mm7 %ifnidni %2,none movq [%2+8],mm2 %endif %ifnidni %7,none cvtpi2ps %7,mm3 ; R %endif %ifnidni %2,none movq [%2+8+sizeof_int_buf],mm3 %endif %endmacro ; ; mono4 source_adr,int_adr,short_adr,xmm_reg,xmm_reg ; mm0, mm1, mm7 = 16 %macro mono4 1-5 none,none,none,none,none,none movq mm0,[%1] movq mm1,mm0 %ifnidni %3,none movq [%3],mm0 %endif punpcklwd mm0,mm0 psrad mm0,mm7 %ifnidni %4,none cvtpi2ps %4,mm0 %endif %ifnidni %2,none movq [%2],mm0 %endif punpckhwd mm1,mm1 psrad mm1,mm7 %ifnidni %5,none cvtpi2ps %5,mm1 %endif %ifnidni %2,none movq [%2+8],mm1 %endif %endmacro ; ; compose2type1 xmm_reg,xmm_reg,xmm_reg ; ; input ; %1 = [xx, xx, L2, L1] ; %2 = [xx, xx, L4, L3] ; %3 = [L7, L6, L5, L8] ; output ; %1 = [L3, L2, L1, L4] ; %3 = [L7, L6, L5, L4] %macro compose2type1 3 movlhps %1,%2 shufps %1,%1,10010011B movss %3,%1 %endmacro ; ; compose2type2 xmm_reg,xmm_reg ; ; input ; %1 = [xx, xx, L1, L0] ; %2 = [xx, xx, L3, L2] ; output ; %2 = [L0, L1, L2, L3] %macro compose2type2 2 shufps %2,%1,00010001B %endmacro ; ; 2000/04/17 SMP向けframe_shiftin_stereo ; ; EDX is simply incremented. Source(=ESI) is changed accrding to EDX. ; This routine is split into 4 parts. %define omit576 ; ;void frame_shiftin_stereo_SSE(int (*int_buf)[1152+576+EXTRADELAY], short *frame_buf, float (*flt_buf)[1152+HAN_SIZE], int mode_gr) %define saved_frame sbd_xxx %define sizeof_flt_buf (1152+HAN_SIZE)*4 %define sizeof_int_buf (1152+576+EXTRADELAY)*4 align 16 frame_shiftin_stereo_SSE: push esi push edi push ebx push ebp %define _P 4*4 mov eax,16 movd mm7,eax ; mm7 is used in stereo4 macro xor edx,edx ;; %ifndef omit576 ; saved_frame[ 479: 0] flt_buf[1184:1663] 480 samples. .part1: mov ebx,[esp+_P+12] ; = flt_buf mov ecx,480 add ebx,(1663-31-480)*4 ; = &flt_buf[1663-31-480] mov esi,saved_frame jmp short .part1.f0 %else .part1: mov eax,[esp+_P+16] ; = mode_gr mov ebx,[esp+_P+12] ; = flt_buf cmp al,2 mov esi,saved_frame je .part1.gr2 ; saved_frame[ 479: 0] flt_buf[1184:1663] 480 samples. .part1.gr1: mov ecx,480 add ebx,(1663-31-480)*4 ; = &flt_buf[1663-31-480] jmp short .part1.f0 ; saved_frame[ 479: 0] flt_buf[1184:1663] 480 samples. ; saved_frame[1055: 480] flt_buf[ 608:1183] 576 samples .part1.gr2: mov ecx,480+576 add ebx,(1663-31-480-576)*4 ; = &flt_buf[1663-31-480-576] jmp short .part1.f0 %endif ;saved_frame[ 479: 0] flt_buf[1184:1663] 480 samples ; 1st part: ; index for flt_buf is decremented. ; input: ; ecx = 480 ; edx = 0 ; ebx = &flt_buf[1663-31-480] ; esi = &saved_frame[0] ; output: ; ecx = 0 ; edx = 480 align 16 .part1.lp0: .part1.f0: stereo4 esi+edx*4+12*4,none,none,xmm0,xmm1,xmm2,xmm3 compose2type1 xmm0,xmm2,xmm6 ; get L[31,30,29,16],L[xx,xx,xx,16] compose2type1 xmm1,xmm3,xmm7 ; get R[31,30,29,16],R[xx,xx,xx,16] stereo4 esi+edx*4+ 8*4,none,none,xmm4,xmm5,xmm2,xmm3 compose2type1 xmm4,xmm2,xmm0 ; get L[27,26,25,28],L[31,30,29,28] movaps [ebx+ecx*4+28*4],xmm0 compose2type1 xmm5,xmm3,xmm1 ; get R[27,26,25,28],R[31,30,29,28] movaps [ebx+ecx*4+28*4+sizeof_flt_buf],xmm1 stereo4 esi+edx*4+ 4*4,none,none,xmm0,xmm1,xmm2,xmm3 compose2type1 xmm0,xmm2,xmm4 ; get L[23,22,21,24],L[27,26,25,24] movaps [ebx+ecx*4+24*4],xmm4 compose2type1 xmm1,xmm3,xmm5 ; get R[23,22,21,24],R[27,26,25,24] movaps [ebx+ecx*4+24*4+sizeof_flt_buf],xmm5 stereo4 esi+edx*4+ 0*4,none,none,xmm4,xmm5,xmm2,xmm3 compose2type1 xmm4,xmm2,xmm0 ; get L[19,18,17,20],L[23,22,21,20] movaps [ebx+ecx*4+20*4],xmm0 compose2type1 xmm5,xmm3,xmm1 ; get R[19,18,17,20],R[23,22,21,20] movaps [ebx+ecx*4+20*4+sizeof_flt_buf],xmm1 movss xmm4,xmm6 ; get L[19,18,17,16] movaps [ebx+ecx*4+16*4],xmm4 movss xmm5,xmm7 ; get R[19,18,17,16] movaps [ebx+ecx*4+16*4+sizeof_flt_buf],xmm5 stereo4 esi+edx*4+16*4,none,none,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+12*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+12*4+sizeof_flt_buf],xmm3 stereo4 esi+edx*4+20*4,none,none,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+8*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+8*4+sizeof_flt_buf],xmm3 stereo4 esi+edx*4+24*4,none,none,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+4*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+4*4+sizeof_flt_buf],xmm3 stereo4 esi+edx*4+28*4,none,none,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+0*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+0*4+sizeof_flt_buf],xmm3 add edx,32 sub ecx,32 jnz near .part1.lp0 ;; %ifndef omit576 .part2: mov ebp,[esp+_P+8] ; = frame_buf mov edi,[esp+_P+4] ; = int_buf mov eax,[esp+_P+16] ; = mode_gr sub ebp,1112*4 ; = &frame_buf[-1112] sub edi,480*4 ; = &int_buf[-480] cmp al,2 jne .part2.gr1 ; granule 2 ;saved_frame[1055: 480] flt_buf[ 608:1183] int_buf[ 575: 0] 576 samples ;saved_frame[1111:1056] flt_buf[ 552: 607] int_buf[ 631: 576] 56 samples ; frame_buf[ 39: 0] flt_buf[ 512: 551] int_buf[ 671: 632] 40(96-56)samples .part2.gr2: sub ebx,672*4 ; = &flt_buf[1152-672] mov ecx,672 jmp short .part2.f0 ; granule 1 ;saved_frame[ 575: 480] flt_buf[1088:1183] int_buf[ 95: 0] 96 samples .part2.gr1 sub ebx,96*4 ; = &flt_buf[1152-96] mov ecx,96 jmp short .part2.f0 %else .part2: mov ebp,[esp+_P+8] ; = frame_buf mov edi,[esp+_P+4] ; = int_buf sub ebp,1112*4 ; = &frame_buf[-1112] sub edi,480*4 ; = &int_buf[-480] sub ebx,96*4 ; = &flt_buf[1152-576-96] or &flt_buf[1152-96] mov ecx,96 jmp short .part2.f0 ; granule 2 ;saved_frame[1111:1056] flt_buf[ 552: 607] int_buf[ 631: 576] 56 samples ; frame_buf[ 39: 0] flt_buf[ 512: 551] int_buf[ 671: 632] 40(96-56)samples ; granule 1 ;saved_frame[ 575: 480] flt_buf[1088:1183] int_buf[ 95: 0] 96 samples %endif ; 2nd part: ; input: (mode_gr == 1) (mode_gr == 2) ; ecx = 96 672(576+96) ; edx = 480 480 ; ebx = &flt_buf[1152-96] &flt_buf[1152-672] ; edi = &int_buf[-480] &int_buf[-480] ; esi = &saved_frame[0] &saved_frame[0] ; ebp = &frame_buf[-1112] ; output: ; ecx = 0 0 ; edx = 480+96 480+672 align 16 .part2.lp0: .part2.f0: stereo4 esi+edx*4+12*4,edi+edx*4+12*4,none,xmm0,xmm1,xmm2,xmm3 compose2type1 xmm0,xmm2,xmm6 ; get L[31,30,29,16],L[xx,xx,xx,16] compose2type1 xmm1,xmm3,xmm7 ; get R[31,30,29,16],R[xx,xx,xx,16] stereo4 esi+edx*4+ 8*4,edi+edx*4+ 8*4,none,xmm4,xmm5,xmm2,xmm3 compose2type1 xmm4,xmm2,xmm0 ; get L[27,26,25,28],L[31,30,29,28] movaps [ebx+ecx*4+28*4],xmm0 compose2type1 xmm5,xmm3,xmm1 ; get R[27,26,25,28],R[31,30,29,28] movaps [ebx+ecx*4+28*4+sizeof_flt_buf],xmm1 stereo4 esi+edx*4+ 4*4,edi+edx*4+ 4*4,none,xmm0,xmm1,xmm2,xmm3 compose2type1 xmm0,xmm2,xmm4 ; get L[23,22,21,24],L[27,26,25,24] movaps [ebx+ecx*4+24*4],xmm4 compose2type1 xmm1,xmm3,xmm5 ; get R[23,22,21,24],R[27,26,25,24] movaps [ebx+ecx*4+24*4+sizeof_flt_buf],xmm5 stereo4 esi+edx*4+ 0*4,edi+edx*4+ 0*4,none,xmm4,xmm5,xmm2,xmm3 compose2type1 xmm4,xmm2,xmm0 ; get L[19,18,17,20],L[23,22,21,20] movaps [ebx+ecx*4+20*4],xmm0 compose2type1 xmm5,xmm3,xmm1 ; get R[19,18,17,20],R[23,22,21,20] movaps [ebx+ecx*4+20*4+sizeof_flt_buf],xmm1 movss xmm4,xmm6 ; get L[19,18,17,16] movaps [ebx+ecx*4+16*4],xmm4 movss xmm5,xmm7 ; get R[19,18,17,16] movaps [ebx+ecx*4+16*4+sizeof_flt_buf],xmm5 stereo4 esi+edx*4+16*4,edi+edx*4+16*4,none,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+12*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+12*4+sizeof_flt_buf],xmm3 stereo4 esi+edx*4+20*4,edi+edx*4+20*4,none,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+8*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+8*4+sizeof_flt_buf],xmm3 cmp edx,480+576+32 cmovae esi,ebp stereo4 esi+edx*4+24*4,edi+edx*4+24*4,none,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+4*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+4*4+sizeof_flt_buf],xmm3 stereo4 esi+edx*4+28*4,edi+edx*4+28*4,none,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+0*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+0*4+sizeof_flt_buf],xmm3 add edx,32 sub ecx,32 jnz near .part2.lp0 ;; .part3: mov ecx,480 mov ebp,saved_frame shl edx,2 sub ebp,edx ; = &saved_frame[-480-96] or &saved_frame[-480-672] sub ebx,480*4 ; = &flt_buf[1152-96-480] or &flt_buf[1152-672-480] shr edx,2 jmp short .part3.f0 ; granule 2 ; frame_buf[ 519: 40] flt_buf[ 32: 511] int_buf[1151: 672] saved_frame[ 479: 0] 480 samples ; granule 1 ; saved_frame[1055: 576] flt_buf[ 608:1087] int_buf[ 575: 96] saved_frame[ 479: 0] 480 samples ; 3rd part: ; input: (mode_gr == 1) (mode_gr == 2) ; ecx = 480 480 ; edx = 480+96 480+672 ; ebx = &flt_buf[1152-96-480] &flt_buf[1152-672-480] ; edi = &int_buf[-480] &int_buf[-480] ; esi = &saved_frame[0] &frame_buf[-1112] ; ebp = &saved_frame[-480-96] &saved_frame[-480-672] ; output: ; ecx = 0 0 ; edx = 480+96+480 480+672+480 ; align 16 .part3.lp0: .part3.f0: stereo4 esi+edx*4+12*4,edi+edx*4+12*4,ebp+edx*4+12*4,xmm0,xmm1,xmm2,xmm3 compose2type1 xmm0,xmm2,xmm6 ; get L[31,30,29,16],L[xx,xx,xx,16] compose2type1 xmm1,xmm3,xmm7 ; get R[31,30,29,16],R[xx,xx,xx,16] stereo4 esi+edx*4+ 8*4,edi+edx*4+ 8*4,ebp+edx*4+ 8*4,xmm4,xmm5,xmm2,xmm3 compose2type1 xmm4,xmm2,xmm0 ; get L[27,26,25,28],L[31,30,29,28] movaps [ebx+ecx*4+28*4],xmm0 compose2type1 xmm5,xmm3,xmm1 ; get R[27,26,25,28],R[31,30,29,28] movaps [ebx+ecx*4+28*4+sizeof_flt_buf],xmm1 stereo4 esi+edx*4+ 4*4,edi+edx*4+ 4*4,ebp+edx*4+ 4*4,xmm0,xmm1,xmm2,xmm3 compose2type1 xmm0,xmm2,xmm4 ; get L[23,22,21,24],L[27,26,25,24] movaps [ebx+ecx*4+24*4],xmm4 compose2type1 xmm1,xmm3,xmm5 ; get R[23,22,21,24],R[27,26,25,24] movaps [ebx+ecx*4+24*4+sizeof_flt_buf],xmm5 stereo4 esi+edx*4+ 0*4,edi+edx*4+ 0*4,ebp+edx*4+ 0*4,xmm4,xmm5,xmm2,xmm3 compose2type1 xmm4,xmm2,xmm0 ; get L[19,18,17,20],L[23,22,21,20] movaps [ebx+ecx*4+20*4],xmm0 compose2type1 xmm5,xmm3,xmm1 ; get R[19,18,17,20],R[23,22,21,20] movaps [ebx+ecx*4+20*4+sizeof_flt_buf],xmm1 movss xmm4,xmm6 ; get L[19,18,17,16] movaps [ebx+ecx*4+16*4],xmm4 movss xmm5,xmm7 ; get R[19,18,17,16] movaps [ebx+ecx*4+16*4+sizeof_flt_buf],xmm5 stereo4 esi+edx*4+16*4,edi+edx*4+16*4,ebp+edx*4+16*4,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+12*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+12*4+sizeof_flt_buf],xmm3 stereo4 esi+edx*4+20*4,edi+edx*4+20*4,ebp+edx*4+20*4,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+8*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+8*4+sizeof_flt_buf],xmm3 stereo4 esi+edx*4+24*4,edi+edx*4+24*4,ebp+edx*4+24*4,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+4*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+4*4+sizeof_flt_buf],xmm3 stereo4 esi+edx*4+28*4,edi+edx*4+28*4,ebp+edx*4+28*4,xmm0,xmm1,xmm2,xmm3 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+0*4],xmm2 compose2type2 xmm1,xmm3 movaps [ebx+ecx*4+0*4+sizeof_flt_buf],xmm3 add edx,32 sub ecx,32 jnz near .part3.lp0 ;; .part4: mov eax,[esp+_P+16] ; = mode_gr cmp al,2 je .part4.gr2 .part4.gr1: ; granule 1 ; saved_frame[1111:1056] int_buf[ 631: 576] saved_frame[ 535: 480] 56 samples ; 4th part: ; input: (mode_gr == 1) ; ecx = 56 ; edx = 480+96+480 ; edi = &int_buf[-480] ; esi = &saved_frame[0] ; ebp = &saved_frame[-480-96] ; output: ; ecx = 0 ; edx = 480+96+480+56 mov ecx,56/4 jmp short .part4.gr1.f0 align 16 .part4.gr1.lp0: .part4.gr1.f0: stereo4 esi+edx*4+0,edi+edx*4+0,ebp+edx*4+0 ; saved_frame, int_buf, saved_frame add edx,4 loop .part4.gr1.lp0 ;; mov esi,[esp+_P+8] ; frame_buf sub esi,1112*4 mov ecx,576/4 jmp short .part4.f0 .part4.gr2: mov ecx,632/4 jmp short .part4.f0 ; granule 1 ; frame_buf[ 576: 0] int_buf[1207: 632] saved_frame[1111: 536] 576 samples ; granule 2 ; frame_buf[1151: 520] int_buf[1783:1152] saved_frame[1111: 480] 576+56 samples ; 4th part: ; input: (mode_gr == 1) (mode_gr == 2) ; ecx = 576 632(576+56) ; edx = 480+96+480+56 480+672+480 ; edi = &int_buf[-480] &int_buf[-480] ; esi = &frame_buf[-1112] &frame_buf[-1112] ; ebp = &saved_frame[-480-96] &saved_frame[-480-672] ; output: ; ecx = 0 0 ; edx = 480+96+480+56+576 480+672+480+632 align 16 .part4.lp0: .part4.f0: stereo4 esi+edx*4+0,edi+edx*4+0,ebp+edx*4+0 add edx,4 %if 1 dec ecx jnz .part4.lp0 %else loop .part4.lp0 %endif ;; pop ebp pop ebx pop edi pop esi emms ret %undef saved_frame ; ; 2000/04/18 SMP向けframe_shiftin_mono ; ; EDX is simply incremented. Source(=ESI) is changed accrding to EDX. ; This routine is split into 4 parts. %define omit576 ; ;void frame_shiftin_mono_SSE(int (*int_buf)[1152+576+EXTRADELAY], short *frame_buf, float (*flt_buf)[1152+HAN_SIZE], int mode_gr) %define saved_frame sbd_xxx %define sizeof_flt_buf (1152+HAN_SIZE)*4 %define sizeof_int_buf (1152+576+EXTRADELAY)*4 align 16 frame_shiftin_mono_SSE: push esi push edi push ebx push ebp %define _P 4*4 mov eax,16 movd mm7,eax ; mm7 is used in mono4 macro xor edx,edx ;; %ifndef omit576 ; saved_frame[ 479: 0] flt_buf[1184:1663] 480 samples. .part1: mov ebx,[esp+_P+12] ; = flt_buf mov ecx,480 add ebx,(1663-31-480)*4 ; = &flt_buf[1663-31-480] mov esi,saved_frame jmp short .part1.f0 %else .part1: mov eax,[esp+_P+16] ; = mode_gr mov ebx,[esp+_P+12] ; = flt_buf cmp al,2 mov esi,saved_frame je .part1.gr2 ; saved_frame[ 479: 0] flt_buf[1184:1663] 480 samples. .part1.gr1: mov ecx,480 add ebx,(1663-31-480)*4 ; = &flt_buf[1663-31-480] jmp short .part1.f0 ; saved_frame[ 479: 0] flt_buf[1184:1663] 480 samples. ; saved_frame[1055: 480] flt_buf[ 608:1183] 576 samples .part1.gr2: mov ecx,480+576 add ebx,(1663-31-480-576)*4 ; = &flt_buf[1663-31-480-576] jmp short .part1.f0 %endif ;saved_frame[ 479: 0] flt_buf[1184:1663] 480 samples ; 1st part: ; index for flt_buf is decremented. ; input: ; ecx = 480 ; edx = 0 ; ebx = &flt_buf[1663-31-480] ; esi = &saved_frame[0] ; output: ; ecx = 0 ; edx = 480 align 16 .part1.lp0: .part1.f0: mono4 esi+edx*2+12*2,none,none,xmm0,xmm2 compose2type1 xmm0,xmm2,xmm6 ; get L[31,30,29,16],L[xx,xx,xx,16] mono4 esi+edx*2+ 8*2,none,none,xmm4,xmm2 compose2type1 xmm4,xmm2,xmm0 ; get L[27,26,25,28],L[31,30,29,28] movaps [ebx+ecx*4+28*4],xmm0 mono4 esi+edx*2+ 4*2,none,none,xmm0,xmm2 compose2type1 xmm0,xmm2,xmm4 ; get L[23,22,21,24],L[27,26,25,24] movaps [ebx+ecx*4+24*4],xmm4 mono4 esi+edx*2+ 0*2,none,none,xmm4,xmm2 compose2type1 xmm4,xmm2,xmm0 ; get L[19,18,17,20],L[23,22,21,20] movaps [ebx+ecx*4+20*4],xmm0 movss xmm4,xmm6 ; get L[19,18,17,16] movaps [ebx+ecx*4+16*4],xmm4 mono4 esi+edx*2+16*2,none,none,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+12*4],xmm2 mono4 esi+edx*2+20*2,none,none,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+8*4],xmm2 mono4 esi+edx*2+24*2,none,none,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+4*4],xmm2 mono4 esi+edx*2+28*2,none,none,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+0*4],xmm2 add edx,32 sub ecx,32 jnz near .part1.lp0 ;; %ifndef omit576 .part2: mov ebp,[esp+_P+8] ; = frame_buf mov edi,[esp+_P+4] ; = int_buf mov eax,[esp+_P+16] ; = mode_gr sub ebp,1112*2 ; = &frame_buf[-1112] sub edi,480*4 ; = &int_buf[-480] cmp al,2 jne .part2.gr1 ; granule 2 ;saved_frame[1055: 480] flt_buf[ 608:1183] int_buf[ 575: 0] 576 samples ;saved_frame[1111:1056] flt_buf[ 552: 607] int_buf[ 631: 576] 56 samples ; frame_buf[ 39: 0] flt_buf[ 512: 551] int_buf[ 671: 632] 40(96-56)samples .part2.gr2: sub ebx,672*4 ; = &flt_buf[1152-672] mov ecx,672 jmp short .part2.f0 ; granule 1 ;saved_frame[ 575: 480] flt_buf[1088:1183] int_buf[ 95: 0] 96 samples .part2.gr1 sub ebx,96*4 ; = &flt_buf[1152-96] mov ecx,96 jmp short .part2.f0 %else .part2: mov ebp,[esp+_P+8] ; = frame_buf mov edi,[esp+_P+4] ; = int_buf sub ebp,1112*2 ; = &frame_buf[-1112] sub edi,480*4 ; = &int_buf[-480] sub ebx,96*4 ; = &flt_buf[1152-576-96] or &flt_buf[1152-96] mov ecx,96 jmp short .part2.f0 ; granule 2 ;saved_frame[1111:1056] flt_buf[ 552: 607] int_buf[ 631: 576] 56 samples ; frame_buf[ 39: 0] flt_buf[ 512: 551] int_buf[ 671: 632] 40(96-56)samples ; granule 1 ;saved_frame[ 575: 480] flt_buf[1088:1183] int_buf[ 95: 0] 96 samples %endif ; 2nd part: ; input: (mode_gr == 1) (mode_gr == 2) ; ecx = 96 672(576+96) ; edx = 480 480 ; ebx = &flt_buf[1152-96] &flt_buf[1152-672] ; edi = &int_buf[-480] &int_buf[-480] ; esi = &saved_frame[0] &saved_frame[0] ; ebp = &frame_buf[-1112] ; output: ; ecx = 0 0 ; edx = 480+96 480+672 align 16 .part2.lp0: .part2.f0: mono4 esi+edx*2+12*2,edi+edx*4+12*4,none,xmm0,xmm2 compose2type1 xmm0,xmm2,xmm6 ; get L[31,30,29,16],L[xx,xx,xx,16] mono4 esi+edx*2+ 8*2,edi+edx*4+ 8*4,none,xmm4,xmm2 compose2type1 xmm4,xmm2,xmm0 ; get L[27,26,25,28],L[31,30,29,28] movaps [ebx+ecx*4+28*4],xmm0 mono4 esi+edx*2+ 4*2,edi+edx*4+ 4*4,none,xmm0,xmm2 compose2type1 xmm0,xmm2,xmm4 ; get L[23,22,21,24],L[27,26,25,24] movaps [ebx+ecx*4+24*4],xmm4 mono4 esi+edx*2+ 0*2,edi+edx*4+ 0*4,none,xmm4,xmm2 compose2type1 xmm4,xmm2,xmm0 ; get L[19,18,17,20],L[23,22,21,20] movaps [ebx+ecx*4+20*4],xmm0 movss xmm4,xmm6 ; get L[19,18,17,16] movaps [ebx+ecx*4+16*4],xmm4 mono4 esi+edx*2+16*2,edi+edx*4+16*4,none,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+12*4],xmm2 mono4 esi+edx*2+20*2,edi+edx*4+20*4,none,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+8*4],xmm2 cmp edx,480+576+32 cmovae esi,ebp mono4 esi+edx*2+24*2,edi+edx*4+24*4,none,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+4*4],xmm2 mono4 esi+edx*2+28*2,edi+edx*4+28*4,none,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+0*4],xmm2 add edx,32 sub ecx,32 jnz near .part2.lp0 ;; .part3: mov ecx,480 mov ebp,saved_frame shl edx,1 sub ebp,edx ; = &saved_frame[-480-96] or &saved_frame[-480-672] sub ebx,480*4 ; = &flt_buf[1152-96-480] or &flt_buf[1152-672-480] shr edx,1 jmp short .part3.f0 ; granule 2 ; frame_buf[ 519: 40] flt_buf[ 32: 511] int_buf[1151: 672] saved_frame[ 479: 0] 480 samples ; granule 1 ; saved_frame[1055: 576] flt_buf[ 608:1087] int_buf[ 575: 96] saved_frame[ 479: 0] 480 samples ; 3rd part: ; input: (mode_gr == 1) (mode_gr == 2) ; ecx = 480 480 ; edx = 480+96 480+672 ; ebx = &flt_buf[1152-96-480] &flt_buf[1152-672-480] ; edi = &int_buf[-480] &int_buf[-480] ; esi = &saved_frame[0] &frame_buf[-1112] ; ebp = &saved_frame[-480-96] &saved_frame[-480-672] ; output: ; ecx = 0 0 ; edx = 480+96+480 480+672+480 ; align 16 .part3.lp0: .part3.f0: mono4 esi+edx*2+12*2,edi+edx*4+12*4,ebp+edx*2+12*2,xmm0,xmm2 compose2type1 xmm0,xmm2,xmm6 ; get L[31,30,29,16],L[xx,xx,xx,16] mono4 esi+edx*2+ 8*2,edi+edx*4+ 8*4,ebp+edx*2+ 8*2,xmm4,xmm2 compose2type1 xmm4,xmm2,xmm0 ; get L[27,26,25,28],L[31,30,29,28] movaps [ebx+ecx*4+28*4],xmm0 mono4 esi+edx*2+ 4*2,edi+edx*4+ 4*4,ebp+edx*2+ 4*2,xmm0,xmm2 compose2type1 xmm0,xmm2,xmm4 ; get L[23,22,21,24],L[27,26,25,24] movaps [ebx+ecx*4+24*4],xmm4 mono4 esi+edx*2+ 0*2,edi+edx*4+ 0*4,ebp+edx*2+ 0*2,xmm4,xmm2 compose2type1 xmm4,xmm2,xmm0 ; get L[19,18,17,20],L[23,22,21,20] movaps [ebx+ecx*4+20*4],xmm0 movss xmm4,xmm6 ; get L[19,18,17,16] movaps [ebx+ecx*4+16*4],xmm4 mono4 esi+edx*2+16*2,edi+edx*4+16*4,ebp+edx*2+16*2,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+12*4],xmm2 mono4 esi+edx*2+20*2,edi+edx*4+20*4,ebp+edx*2+20*2,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+8*4],xmm2 mono4 esi+edx*2+24*2,edi+edx*4+24*4,ebp+edx*2+24*2,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+4*4],xmm2 mono4 esi+edx*2+28*2,edi+edx*4+28*4,ebp+edx*2+28*2,xmm0,xmm2 compose2type2 xmm0,xmm2 movaps [ebx+ecx*4+0*4],xmm2 add edx,32 sub ecx,32 jnz near .part3.lp0 ;; .part4: mov eax,[esp+_P+16] ; = mode_gr cmp al,2 je .part4.gr2 .part4.gr1: ; granule 1 ; saved_frame[1111:1056] int_buf[ 631: 576] saved_frame[ 535: 480] 56 samples ; 4th part: ; input: (mode_gr == 1) ; ecx = 56 ; edx = 480+96+480 ; edi = &int_buf[-480] ; esi = &saved_frame[0] ; ebp = &saved_frame[-480-96] ; output: ; ecx = 0 ; edx = 480+96+480+56 mov ecx,56/4 jmp short .part4.gr1.f0 align 16 .part4.gr1.lp0: .part4.gr1.f0: mono4 esi+edx*2,edi+edx*4,ebp+edx*2 ; saved_frame, int_buf, saved_frame add edx,4 loop .part4.gr1.lp0 ;; mov esi,[esp+_P+8] ; frame_buf sub esi,1112*2 mov ecx,576/4 jmp short .part4.f0 .part4.gr2: mov ecx,632/4 jmp short .part4.f0 ; granule 1 ; frame_buf[ 576: 0] int_buf[1207: 632] saved_frame[1111: 536] 576 samples ; granule 2 ; frame_buf[1151: 520] int_buf[1783:1152] saved_frame[1111: 480] 576+56 samples ; 4th part: ; input: (mode_gr == 1) (mode_gr == 2) ; ecx = 576 632(576+56) ; edx = 480+96+480+56 480+672+480 ; edi = &int_buf[-480] &int_buf[-480] ; esi = &frame_buf[-1112] &frame_buf[-1112] ; ebp = &saved_frame[-480-96] &saved_frame[-480-672] ; output: ; ecx = 0 0 ; edx = 480+96+480+56+576 480+672+480+632 align 16 .part4.lp0: .part4.f0: mono4 esi+edx*2,edi+edx*4,ebp+edx*2 add edx,4 %if 1 dec ecx jnz .part4.lp0 %else loop .part4.lp0 %endif ;; pop ebp pop ebx pop edi pop esi emms ret %undef saved_frame ; ; 2000/03/27 分離しただけ ; ;void sbd_shiftin_SSE(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr); align 16 sbd_shiftin_SSE: push esi push edi %assign _P 2*4 mov edx,[esp+_P+12] ; = mode_gr imul edx,18*32*F_SIZE mov eax,[esp+_P+4] ; = mfbuf mov edi,sbd_xxx+1152*4 ; = &sbd_xxx[0][1152] .lp0: ; memcpy(&sbd_xxx[ch][1152+32], &sbd_xxx[ch][1152+32-18*32*mode_gr], (512-32)*sizeof(float)); mov esi,edi sub esi,edx mov ecx,(512-32) jmp short .f1 align 16 .f1: .lp1: movaps xmm0,[esi + ecx*4 + 0*F_SIZE] movaps [edi + ecx*4 + 0*F_SIZE],xmm0 movaps xmm7,[esi + ecx*4 + 4*F_SIZE] movaps [edi + ecx*4 + 4*F_SIZE],xmm7 movaps xmm6,[esi + ecx*4 + 8*F_SIZE] movaps [edi + ecx*4 + 8*F_SIZE],xmm6 movaps xmm5,[esi + ecx*4 + 12*F_SIZE] movaps [edi + ecx*4 + 12*F_SIZE],xmm5 movaps xmm4,[esi + ecx*4 + 16*F_SIZE] movaps [edi + ecx*4 + 16*F_SIZE],xmm4 movaps xmm3,[esi + ecx*4 + 20*F_SIZE] movaps [edi + ecx*4 + 20*F_SIZE],xmm3 movaps xmm2,[esi + ecx*4 + 24*F_SIZE] movaps [edi + ecx*4 + 24*F_SIZE],xmm2 movaps xmm1,[esi + ecx*4 + 28*F_SIZE] movaps [edi + ecx*4 + 28*F_SIZE],xmm1 sub ecx,32 jnz .lp1 mov esi,eax mov ecx,edx sub edi,edx jmp short .f2 align 16 .f2: .lp2: ; sbd_xxx[31:28] = c[17:20] = win_buf[14:11]; ; sbd_xxx[27:24] = c[21:24] = win_buf[10: 7]; ; sbd_xxx[23:20] = c[25:28] = win_buf[ 6: 3]; ; sbd_xxx[19:16] = {c[29:31],c[16]} = {win_buf[ 2: 0],win_buf[ 15]}; ; sbd_xxx[12:15] = c[12:15] = win_buf[19:16]; ; sbd_xxx[ 8:11] = c[ 8:11] = win_buf[23:20]; ; sbd_xxx[ 4: 7] = c[ 4: 7] = win_buf[27:24]; ; sbd_xxx[ 0: 3] = c[ 0: 3] = win_buf[31:28]; cvtpi2ps xmm0,[esi + 1*4] cvtsi2ss xmm1,[esi + 0*4] shufps xmm1,xmm0,01000000B cvtsi2ss xmm1,[esi + 15*4] movaps [edi+ecx+16*F_SIZE],xmm1 cvtpi2ps xmm2,[esi + 5*4] cvtpi2ps xmm3,[esi + 3*4] movlhps xmm3,xmm2 movaps [edi+ecx+20*F_SIZE],xmm3 cvtpi2ps xmm4,[esi + 9*4] cvtpi2ps xmm5,[esi + 7*4] movlhps xmm5,xmm4 movaps [edi+ecx+24*F_SIZE],xmm5 cvtpi2ps xmm6,[esi + 13*4] cvtpi2ps xmm7,[esi + 11*4] movlhps xmm7,xmm6 movaps [edi+ecx+28*F_SIZE],xmm7 cvtpi2ps xmm0,[esi + 16*4] cvtpi2ps xmm1,[esi + 18*4] shufps xmm1,xmm0,0x11 movaps [edi+ecx+12*F_SIZE],xmm1 cvtpi2ps xmm2,[esi + 20*4] cvtpi2ps xmm3,[esi + 22*4] shufps xmm3,xmm2,0x11 movaps [edi+ecx+ 8*F_SIZE],xmm3 cvtpi2ps xmm4,[esi + 24*4] cvtpi2ps xmm5,[esi + 26*4] shufps xmm5,xmm4,0x11 movaps [edi+ecx+ 4*F_SIZE],xmm5 cvtpi2ps xmm6,[esi + 28*4] cvtpi2ps xmm7,[esi + 30*4] shufps xmm7,xmm6,0x11 movaps [edi+ecx+ 0*F_SIZE],xmm7 add esi,32*4 sub ecx,32*4 jnz near .lp2 cmp byte [esp+_P+8],2 jne .exit add edi,edx add eax,(1152+576+EXTRADELAY)*F_SIZE add edi,(1152+HAN_SIZE)*F_SIZE cmp edi,sbd_xxx+(1152+HAN_SIZE)*F_SIZE*2 jb near .lp0 .exit: pop edi pop esi ret ; ; 2000/03/27 実行時間の1割を消費する... ; ;void sbd_shiftin_SSE_MULTI(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr); sbd_shiftin_SSE_MULTI: push esi push edi %assign _P 2*4 mov edx,[esp+_P+12] ; = mode_gr imul edx,18*32*F_SIZE mov eax,[esp+_P+4] ; = mfbuf mov edi,sbd_xxx+1152*4 ; = &sbd_xxx[0][1152] .lp0: ; memcpy(&sbd_xxx[ch][1152+32], &sbd_xxx[ch][1152+32-18*32*mode_gr], (512-32)*sizeof(float)); mov esi,edi sub esi,edx ; = &sbd_xxx[ch][1152-18*32*mode_gr] mov ecx,(512-32) jmp short .f1 align 16 .f1: .lp1: prefetchnta [esi + ecx*4 + 24*F_SIZE] movaps xmm0,[esi + ecx*4 + 0*F_SIZE] movntps [edi + ecx*4 + 0*F_SIZE],xmm0 movaps xmm7,[esi + ecx*4 + 4*F_SIZE] movntps [edi + ecx*4 + 4*F_SIZE],xmm7 prefetchnta [esi + ecx*4 - 32*F_SIZE] movaps xmm6,[esi + ecx*4 + 8*F_SIZE] movntps [edi + ecx*4 + 8*F_SIZE],xmm6 movaps xmm5,[esi + ecx*4 + 12*F_SIZE] movntps [edi + ecx*4 + 12*F_SIZE],xmm5 prefetchnta [esi + ecx*4 - 24*F_SIZE] movaps xmm4,[esi + ecx*4 + 16*F_SIZE] movntps [edi + ecx*4 + 16*F_SIZE],xmm4 movaps xmm3,[esi + ecx*4 + 20*F_SIZE] movntps [edi + ecx*4 + 20*F_SIZE],xmm3 prefetchnta [esi + ecx*4 - 16*F_SIZE] movaps xmm2,[esi + ecx*4 + 24*F_SIZE] movntps [edi + ecx*4 + 24*F_SIZE],xmm2 movaps xmm1,[esi + ecx*4 + 28*F_SIZE] movntps [edi + ecx*4 + 28*F_SIZE],xmm1 sub ecx,32 jnz .lp1 mov esi,eax mov ecx,edx sub edi,edx jmp short .f2 align 16 .f2: .lp2: ; sbd_xxx[31:28] = c[17:20] = win_buf[14:11]; ; sbd_xxx[27:24] = c[21:24] = win_buf[10: 7]; ; sbd_xxx[23:20] = c[25:28] = win_buf[ 6: 3]; ; sbd_xxx[19:16] = {c[29:31],c[16]} = {win_buf[ 2: 0],win_buf[ 15]}; ; sbd_xxx[12:15] = c[12:15] = win_buf[19:16]; ; sbd_xxx[ 8:11] = c[ 8:11] = win_buf[23:20]; ; sbd_xxx[ 4: 7] = c[ 4: 7] = win_buf[27:24]; ; sbd_xxx[ 0: 3] = c[ 0: 3] = win_buf[31:28]; prefetchnta [esi + 0*4] cvtpi2ps xmm0,[esi + 28*4] cvtpi2ps xmm1,[esi + 30*4] shufps xmm1,xmm0,0x11 cvtpi2ps xmm2,[esi + 24*4] cvtpi2ps xmm3,[esi + 26*4] shufps xmm3,xmm2,0x11 prefetchnta [esi + 8*4] cvtpi2ps xmm4,[esi + 20*4] cvtpi2ps xmm5,[esi + 22*4] shufps xmm5,xmm4,0x11 cvtpi2ps xmm6,[esi + 16*4] cvtpi2ps xmm7,[esi + 18*4] shufps xmm7,xmm6,0x11 movntps [edi+ecx+ 0*F_SIZE],xmm1 movntps [edi+ecx+ 4*F_SIZE],xmm3 movntps [edi+ecx+ 8*F_SIZE],xmm5 movntps [edi+ecx+12*F_SIZE],xmm7 prefetchnta [esi + 48*4] cvtsi2ss xmm1,[esi + 0*4] cvtpi2ps xmm0,[esi + 1*4] shufps xmm1,xmm0,01000000B cvtpi2ps xmm3,[esi + 3*4] cvtpi2ps xmm2,[esi + 5*4] movlhps xmm3,xmm2 prefetchnta [esi + 56*4] cvtpi2ps xmm5,[esi + 7*4] cvtsi2ss xmm1,[esi + 15*4] cvtpi2ps xmm4,[esi + 9*4] movlhps xmm5,xmm4 cvtpi2ps xmm7,[esi + 11*4] cvtpi2ps xmm6,[esi + 13*4] movlhps xmm7,xmm6 movntps [edi+ecx+16*F_SIZE],xmm1 movntps [edi+ecx+20*F_SIZE],xmm3 movntps [edi+ecx+24*F_SIZE],xmm5 movntps [edi+ecx+28*F_SIZE],xmm7 add esi,32*4 sub ecx,32*4 jnz near .lp2 cmp byte [esp+_P+8],2 jne .exit add edi,edx add eax,(1152+576+EXTRADELAY)*F_SIZE add edi,(1152+HAN_SIZE)*F_SIZE cmp edi,sbd_xxx+(1152+HAN_SIZE)*F_SIZE*2 jb near .lp0 .exit: pop edi pop esi ret ;; ; 1999/07/19 SSE対応 window_filter_subbandKNI() ; 1999/07/21 117k[clk]@PIII ; 1999/07/22 loop unrolling, 102k[clk]@PIII ; 1999/07/23 係数行列4並列処理向けに並べ変え、90k〜85k[clk] ; 1999/09/01 LSF(22.05kHz)帯のエンコード対応のため mode_gr を引数に取るよう変更 ; 1999/09/03 improved iDCT routine, 68k[clk]@PIII ; 1999/09/04 register allocation を変えた, 62k[clk]@PIII ; 1999/09/29 load/storeを減らしたが、時間は変わらず ; 1999/11/14 movupsを無くした。59k[clk]@PIII ; 2000/03/07 &演算を省く。55.4k[clk]@河童->53.8k[clk]@河童 ; 2000/03/15 あぅ(;_;。バグ修正。 ; 2000/03/16 enwindowのロード回数半減 ->45.3k[clk]@河童 ; 2000/03/17 もうちょっと最適化 ->44.9k[clk]@河童 ; 2000/03/21 SCALERをenwindowにあらかじめ掛けておいた ->44.6k[clk]@河童 ; 2000/03/24 sbd_shiftinを分離 41k[clk]@河童 ; 2000/03/29 eaxが余ってる(爆) ; 2000/04/17 SMP最適化のための布石 by K.SAKAI ; void window_filter_subband_SSE(float *win_buf, float *s, int mode_gr) align 16 window_filter_subband_SSE: push esi push edi push ebp %assign _P 3*4 mov edi,[esp+_P+4] ; = win_buf mov ebp,[esp+_P+8] ; = s mov esi,[esp+_P+12] ; = mode_gr(=1 or 2) add edi,1152*F_SIZE ; = c = &win_buf[1152] add esi,esi lea esi,[esi+esi*8] ; = j = 18*mode_gr ; allocate yyy[32] mov edx,esp sub esp,32*4+4 and esp,~31 ; align to 32 byte boundary mov [esp+32*4],edx ; save the original ESP jmp short .lp0 %define yyy esp align 16 .lp0: ; a =c[64*0 + i ]*enwindow[i/4 ][0][3:1]; ; y[16] = c[64*0]*enwindow[0][0][0] ; ; b =c[64*7 + 64-i]*enwindow[i/4 ][0][3:1]; // 符号逆転 ; ; d =c[64*0 + i+32]*enwindow[i/4+8][0][3:1]; ; y[16] += c[64*0+32]*enwindow[8][0][0] ; ; c -=c[64*7 + 32-i]*enwindow[i/4+8][0][3:1]; // 符号逆転 ; y[ 0] = c[64*7+16]*enwindow[4][7][0]; movaps xmm0,[enwindow + 0*4*4] movaps xmm3,[enwindow + 8*8*4*4 + 0*4*4] movaps xmm4,[edi + (64*0 + 0)*4] movaps xmm5,[edi + (64*7 + 48)*4] mulps xmm4,xmm0 mulps xmm5,xmm0 movss xmm0,[enwindow + 4*8*4*4 + 7*4*4] ; = enwindow[4][7][0] movaps xmm7,[edi + (64*0 + 32)*4] movaps xmm6,[edi + (64*7 + 16)*4] ; lowest scaler is c[64*%2+16] mulps xmm7,xmm3 movss xmm3,xmm0 ; replace lowest coeficient with enwindow[4][%2][0] mulps xmm6,xmm3 movaps xmm2,[enwindow + 8*8*4*4 + 7*4*4] movaps xmm3,[edi + (64*7 + 32)*4] mulps xmm3,xmm2 movss xmm0,[enwindow + 4*8*4*4 + 0*4*4] ; = enwindow[4][0][0] movss xmm2,xmm0 ; replace lowest coeficient with enwindow[4][0][0] mulps xmm2,[edi + (64*0 + 16)*4] ; lowest scaler is c[64*0+16] addps xmm7,xmm3 addps xmm6,xmm2 movaps xmm1,[enwindow + 7*4*4] movaps xmm0,[edi + (64*7 + 0)*4] mulps xmm0,xmm1 mulps xmm1,[edi + (64*0 + 48)*4] addps xmm4,xmm0 addps xmm5,xmm1 ; a +=c[64*%1 + i ]*enwindow[0 ][%1][3:1]; ; y[16] += c[64*%1]*enwindow[0][%1][0] ; ; b +=c[64*%2 + 64-i]*enwindow[0 ][%1][3:1]; // 符号逆転 ; ; d +=c[64*%1 + i+32]*enwindow[8][%1][3:1]; ; y[16] += c[64*%1+32]*enwindow[8][%1][0] ; ; c +=c[64*%2 + 32-i]*enwindow[8][%1][3:1]; // 符号逆転 ; y[ 0] += c[64*%2+16]*enwindow[4][%2][0] %macro window_filter_type1 2 movaps xmm1,[enwindow + %1*4*4] movaps xmm0,[edi + (64*%1 + 0)*4] mulps xmm0,xmm1 mulps xmm1,[edi + (64*%2 + 48)*4] addps xmm4,xmm0 addps xmm5,xmm1 movaps xmm2,[enwindow + 8*8*4*4 + %1*4*4] movaps xmm3,[edi + (64*%1 + 32)*4] mulps xmm3,xmm2 movss xmm0,[enwindow + 4*8*4*4 + %2*4*4] ; = enwindow[4][%2][0] movss xmm2,xmm0 ; replace lowest coeficient with enwindow[4][%2][0] mulps xmm2,[edi + (64*%2 + 16)*4] ; lowest scaler is c[64*%2+16] addps xmm7,xmm3 addps xmm6,xmm2 %endmacro ; window_filter_type1 7,0 window_filter_type1 1,6 window_filter_type1 6,1 window_filter_type1 2,5 window_filter_type1 5,2 window_filter_type1 3,4 window_filter_type1 4,3 movss [yyy+12*4],xmm6 addps xmm5,xmm7 ; b = xmm5 = {yyy[19],yyy[18],yyy[17],---} addss xmm7,xmm4 ; = yyy[16] subps xmm4,xmm6 ; a = xmm4 = {yyy[13],yyy[14],yyy[15],---} movss xmm5,xmm7 movaps [yyy+16*4],xmm5 movaps xmm1,xmm4 ; it is stored in later mov ecx,4*4 jmp short .f1 ; for(i = 4; i < 16; i++){ ; register float a, b; align 16 .lp1: .f1: ; { 4, 5, 6, 7}, { 8, 9, 10, 11}, {12, 13, 14, 15} ; {28, 27, 26, 25}, {24, 23, 22, 21}, {20, 19, 18, 17} ; a =c[64*0 + i ]*enwindow[i/4 ][0][i%4]; ; b =c[64*7 + 64-i]*enwindow[i/4 ][0][i%4]; // 符号逆転 ; a -=c[64*7 + 32-i]*enwindow[i/4+8][0][i%4]; // 符号逆転 ; b +=c[64*0 + i+32]*enwindow[i/4+8][0][i%4]; movaps xmm6,[edi + ecx + (64*0 + 0)*4] ; = a movaps xmm7,[edi + ecx + (64*7 + 48)*4] ; = b movaps xmm0,[enwindow + ecx*8 + 0*4*4] mulps xmm6,xmm0 mulps xmm7,xmm0 movaps xmm4,[edi + ecx + (64*7 + 16)*4] movaps xmm5,[edi + ecx + (64*0 + 32)*4] movaps xmm0,[enwindow + ecx*8 + 8*8*4*4 + 0*4*4] mulps xmm4,xmm0 mulps xmm5,xmm0 subps xmm6,xmm4 addps xmm7,xmm5 ; a +=c[64*%1 + i ]*enwindow[i/4 ][%1][3:0]; ; b +=c[64*%2 + 64-i]*enwindow[i/4 ][%1][3:0]; // 符号逆転 ; a -=c[64*%2 + 32-i]*enwindow[i/4+8][%1][3:0]; // 符号逆転 ; b +=c[64*%1 + i+32]*enwindow[i/4+8][%1][3:0]; %macro window_filter_type2 2 movaps xmm2,[edi + ecx + (64*%1 + 0)*4] movaps xmm3,[enwindow + ecx*8 + %1*4*4] mulps xmm2,xmm3 mulps xmm3,[edi + ecx + (64*%2 + 48)*4] addps xmm6,xmm2 addps xmm7,xmm3 movaps xmm4,[edi + ecx + (64*%2 + 16)*4] movaps xmm5,[enwindow + ecx*8 + 8*8*4*4 + %1*4*4] mulps xmm4,xmm5 mulps xmm5,[edi + ecx + (64*%1 + 32)*4] subps xmm6,xmm4 addps xmm7,xmm5 %endmacro window_filter_type2 7,0 window_filter_type2 1,6 window_filter_type2 6,1 window_filter_type2 2,5 window_filter_type2 5,2 window_filter_type2 3,4 window_filter_type2 4,3 ; y[16-i] = a; // 格納順は4要素ごとに逆順 ; y[i+16] = b; movaps [yyy + ecx + 16*4],xmm7 movss xmm1,xmm6 shufps xmm1,xmm1,01101100B movaps [yyy + ecx - 4*4],xmm1 movaps xmm1,xmm6 add ecx,4*4 cmp ecx,16*4 jb near .lp1 movss xmm0,[yyy+12*4] movss xmm1,xmm0 shufps xmm1,xmm1,01101100B movaps [yyy+12*4],xmm1 ;; ; for( i=0; i<16; i++ ){ ; s0 = s1 = 0.0; ; for( j=0; j<32; j+=4 ){ ; s0 += (*m)[i+0][j ]*yprime[j+0]; ; s1 += (*m)[i+0][j+1]*yprime[j+1]; ; s0 += (*m)[i+0][j+2]*yprime[j+2]; ; s1 += (*m)[i+0][j+3]*yprime[j+3]; ; } ; xout[i+ 0] = s0+s1; ; xout[31-i] = s0-s1; ; } movaps xmm3,[yyy+ 0*4] ; = yprime[15:12] movaps xmm4,[yyy+16*4] movaps xmm5,[yyy+20*4] movaps xmm6,[yyy+24*4] movaps xmm7,[yyy+28*4] sub edi,32*4 ; c -= 32 mov ecx,16 mov edx,idct_coefficient+16*F_SIZE jmp short .lp5 align 16 .lp5: movaps xmm0,[edx-64] mulps xmm0,[yyy+12*4] ; = yprime[ 3: 0] movaps xmm1,[edx-48] mulps xmm1,[yyy+ 8*4] ; = yprime[ 7: 4] addps xmm1,xmm0 movaps xmm2,[edx-32] mulps xmm2,[yyy+ 4*4] ; = yprime[11: 8] addps xmm2,xmm1 movaps xmm0,[edx-16] mulps xmm0,xmm3 addps xmm0,xmm2 movaps xmm1,[edx+ 0] mulps xmm1,xmm4 addps xmm0,xmm1 movaps xmm2,[edx+16] mulps xmm2,xmm5 addps xmm0,xmm2 movaps xmm1,[edx+32] mulps xmm1,xmm6 addps xmm0,xmm1 movaps xmm2,[edx+48] mulps xmm2,xmm7 addps xmm0,xmm2 add edx,32*F_SIZE movhlps xmm1,xmm0 addps xmm0,xmm1 movaps xmm1,xmm0 shufps xmm1,xmm0,0x01 movaps xmm2,xmm0 addss xmm0,xmm1 subss xmm2,xmm1 movss [ebp],xmm0 add ebp,4 dec ecx movss [ebp+ecx*8],xmm2 jnz near .lp5 add ebp,16*4 dec esi jnz near .lp0 ; free area for yyy[32] mov esp,[esp+32*4] %undef yyy pop ebp pop edi pop esi ret end gogo239b/sbandtbl.nas100644 23421 144 36732 7220537350 13660 0ustar shigeousers ; optimized mdct() for new GOGO-no-coda (1999/09) ; Copyright (C) 1999 shigeo ; special thanks to Keiichi SAKAI ; 99/09/15 subband.nasの分割 ; 変数名の変更 ; off -> sbd_off ; xxx -> sbd_xxx ; enwindow_sse -> enwindow ; 00/03/07 &演算を省くためsbd_xxxの領域を大きくした %include "nasm.h" globaldef window_subband_init globaldef enwindow globaldef idct_coefficient globaldef sbd_off globaldef sbd_xxx HAN_SIZE equ 512 ;defined in common.h SBLIMIT equ 32 F_SIZE equ 4 %define F_PTR dword segment_bss align 16 sbd_xxx resd 2*(HAN_SIZE+1152) ; &演算を省くため segment_data align 16 sbd_off dd 0,0 align 32 idct_coefficient: ; _P5FPU, _P6FPU, _SSE で使用 ; filter[0] dd 0x3F800000, 0x3F7FB10F, 0x3F7EC46D, 0x3F7D3AAC dd 0x3F7B14BE, 0x3F7853F8, 0x3F74FA0B, 0x3F710908 dd 0x3F6C835E, 0x3F676BD8, 0x3F61C598, 0x3F5B941A dd 0x3F54DB31, 0x3F4D9F02, 0x3F45E404, 0x3F3DAEF9 dd 0x3F3504F3, 0x3F2BEB4A, 0x3F226799, 0x3F187FC0 dd 0x3F0E39DA, 0x3F039C3E, 0x3EF15AEB, 0x3EDAE881 dd 0x3EC3EF15, 0x3EAC7CD3, 0x3E94A030, 0x3E78CFD0 dd 0x3E47C5C4, 0x3E164085, 0x3DC8BD35, 0x3D48FB29 ; filter[1] dd 0x3F800000, 0x3F7D3AAC, 0x3F74FA0B, 0x3F676BD8 dd 0x3F54DB31, 0x3F3DAEF9, 0x3F226799, 0x3F039C3E dd 0x3EC3EF15, 0x3E78CFD0, 0x3DC8BD35, 0xBD48FB21 dd 0xBE47C5C2, 0xBEAC7CD2, 0xBEF15AE6, 0xBF187FC1 dd 0xBF3504F3, 0xBF4D9F02, 0xBF61C597, 0xBF710909 dd 0xBF7B14BF, 0xBF7FB10F, 0xBF7EC46D, 0xBF7853F8 dd 0xBF6C835E, 0xBF5B941B, 0xBF45E405, 0xBF2BEB49 dd 0xBF0E39DD, 0xBEDAE87B, 0xBE94A02D, 0xBE16407F ; filter[2] dd 0x3F800000, 0x3F7853F8, 0x3F61C598, 0x3F3DAEF9 dd 0x3F0E39DA, 0x3EAC7CD3, 0x3DC8BD35, 0xBE164082 dd 0xBEC3EF14, 0xBF187FC1, 0xBF45E404, 0xBF676BD8 dd 0xBF7B14BF, 0xBF7FB10F, 0xBF74FA0B, 0xBF5B941B dd 0xBF3504F4, 0xBF039C3E, 0xBE94A02D, 0xBD48FB52 dd 0x3E47C5C8, 0x3EDAE87B, 0x3F22679A, 0x3F4D9F00 dd 0x3F6C835F, 0x3F7D3AAD, 0x3F7EC46D, 0x3F710907 dd 0x3F54DB32, 0x3F2BEB48, 0x3EF15AED, 0x3E78CFC4 ; filter[3] dd 0x3F800000, 0x3F710908, 0x3F45E404, 0x3F039C3E dd 0x3E47C5C4, 0xBE164082, 0xBEF15AE6, 0xBF3DAEF8 dd 0xBF6C835E, 0xBF7FB10F, 0xBF74FA0B, 0xBF4D9F02 dd 0xBF0E39DD, 0xBE78CFD9, 0x3DC8BD1D, 0x3EDAE87B dd 0x3F3504F1, 0x3F676BD7, 0x3F7EC46D, 0x3F7853F8 dd 0x3F54DB32, 0x3F187FC0, 0x3E94A032, 0xBD48FB30 dd 0xBEC3EF07, 0xBF2BEB44, 0xBF61C594, 0xBF7D3AAB dd 0xBF7B14C0, 0xBF5B941D, 0xBF22679D, 0xBEAC7CDD ; filter[4] dd 0x3F800000, 0x3F676BD8, 0x3F226799, 0x3E78CFD0 dd 0xBE47C5C2, 0xBF187FC1, 0xBF61C597, 0xBF7FB10F dd 0xBF6C835E, 0xBF2BEB49, 0xBE94A02D, 0x3E164080 dd 0x3F0E39D7, 0x3F5B941B, 0x3F7EC46D, 0x3F710907 dd 0x3F3504F3, 0x3EAC7CD9, 0xBDC8BD48, 0xBF039C3C dd 0xBF54DB34, 0xBF7D3AAB, 0xBF74FA0B, 0xBF3DAEF7 dd 0xBEC3EF23, 0x3D48FB07, 0x3EF15AEE, 0x3F4D9F07 dd 0x3F7B14BE, 0x3F7853F7, 0x3F45E3FF, 0x3EDAE888 ; filter[5] dd 0x3F800000, 0x3F5B941A, 0x3EF15AEB, 0xBD48FB21 dd 0xBF0E39D9, 0xBF676BD8, 0xBF7EC46D, 0xBF4D9F02 dd 0xBEC3EF1A, 0x3E164080, 0x3F22679A, 0x3F710909 dd 0x3F7B14BF, 0x3F3DAEFA, 0x3E94A032, 0xBE78CFD1 dd 0xBF3504F0, 0xBF7853F9, 0xBF74FA0B, 0xBF2BEB4F dd 0xBE47C5BB, 0x3EAC7CCB, 0x3F45E407, 0x3F7D3AAC dd 0x3F6C8361, 0x3F187FBE, 0x3DC8BD56, 0xBEDAE88A dd 0xBF54DB31, 0xBF7FB10F, 0xBF61C596, 0xBF039C40 ; filter[6] dd 0x3F800000, 0x3F4D9F02, 0x3E94A030, 0xBEAC7CD2 dd 0xBF54DB32, 0xBF7FB10F, 0xBF45E405, 0xBE78CFD9 dd 0x3EC3EF1B, 0x3F5B941B, 0x3F7EC46D, 0x3F3DAEFA dd 0x3E47C5D0, 0xBEDAE877, 0xBF61C594, 0xBF7D3AAB dd 0xBF3504EF, 0xBE164073, 0x3EF15AEE, 0x3F676BD8 dd 0x3F7B14BF, 0x3F2BEB4B, 0x3DC8BD56, 0xBF039C38 dd 0xBF6C835C, 0xBF7853F6, 0xBF2267A1, 0xBD48FBF4 dd 0x3F0E39CE, 0x3F710903, 0x3F74FA06, 0x3F187FB5 ; filter[7] dd 0x3F800000, 0x3F3DAEF9, 0x3DC8BD35, 0xBF187FC1 dd 0xBF7B14BF, 0xBF5B941B, 0xBE94A02D, 0x3EDAE87B dd 0x3F6C835F, 0x3F710907, 0x3EF15AED, 0xBE78CFD1 dd 0xBF54DB34, 0xBF7D3AAB, 0xBF22679D, 0x3D48FB07 dd 0x3F3504F4, 0x3F7FB10F, 0x3F45E3FF, 0x3E16409D dd 0xBF0E39D7, 0xBF7853F8, 0xBF61C596, 0xBEAC7CC9 dd 0x3EC3EF25, 0x3F676BDD, 0x3F74FA06, 0x3F039C49 dd 0xBE47C596, 0xBF4D9EFD, 0xBF7EC46E, 0xBF2BEB4B ; filter[8] dd 0x3F800000, 0x3F2BEB4A, 0xBDC8BD31, 0xBF4D9F02 dd 0xBF7B14BF, 0xBF039C3E, 0x3E94A02E, 0x3F676BD7 dd 0x3F6C835F, 0x3EAC7CD9, 0xBEF15AE4, 0xBF7853F9 dd 0xBF54DB33, 0xBE164073, 0x3F226796, 0x3F7FB10F dd 0x3F3504F7, 0xBD48FB5E, 0xBF45E400, 0xBF7D3AAC dd 0xBF0E39DF, 0x3E78CFD3, 0x3F61C59C, 0x3F71090D dd 0x3EC3EF22, 0xBEDAE881, 0xBF74FA0D, 0xBF5B9412 dd 0xBE47C5E3, 0x3F187FBF, 0x3F7EC46E, 0x3F3DAEEF ; filter[9] dd 0x3F800000, 0x3F187FC0, 0xBE94A033, 0xBF710909 dd 0xBF54DB30, 0xBD48FB52, 0x3F45E405, 0x3F7853F8 dd 0x3EC3EF10, 0xBF039C3C, 0xBF7EC46D, 0xBF2BEB4F dd 0x3E47C5D3, 0x3F676BD8, 0x3F61C599, 0x3E16409D dd 0xBF3504F7, 0xBF7D3AAC, 0xBEF15AEC, 0x3EDAE894 dd 0x3F7B14BD, 0x3F3DAEF7, 0xBDC8BCB8, 0xBF5B9418 dd 0xBF6C835B, 0xBE78CFF5, 0x3F22679A, 0x3F7FB10E dd 0x3F0E39DE, 0xBEAC7CE1, 0xBF74FA07, 0xBF4D9F03 ; filter[10] dd 0x3F800000, 0x3F039C3E, 0xBEF15AE6, 0xBF7FB10F dd 0xBF0E39DD, 0x3EDAE87B, 0x3F7EC46D, 0x3F187FC0 dd 0xBEC3EF07, 0xBF7D3AAB, 0xBF22679D, 0x3EAC7CCB dd 0x3F7B14BE, 0x3F2BEB4B, 0xBE94A02F, 0xBF7853F8 dd 0xBF3504FE, 0x3E78CFD3, 0x3F74FA07, 0x3F3DAEF7 dd 0xBE47C596, 0xBF71090A, 0xBF45E409, 0x3E1640A3 dd 0x3F6C835C, 0x3F4D9EFC, 0xBDC8BD0F, 0xBF676BDD dd 0xBF54DB33, 0x3D48FC14, 0x3F61C597, 0x3F5B9422 ; filter[11] dd 0x3F800000, 0x3EDAE881, 0xBF226799, 0xBF7853F8 dd 0xBE47C5C6, 0x3F4D9F00, 0x3F61C596, 0xBD48FB30 dd 0xBF6C835E, 0xBF3DAEF7, 0x3E94A024, 0x3F7D3AAC dd 0x3F0E39D6, 0xBF039C38, 0xBF7EC46D, 0xBEAC7CC9 dd 0x3F3504F0, 0x3F71090D, 0x3DC8BCFF, 0xBF5B9418 dd 0xBF54DB39, 0x3E1640A3, 0x3F74FA0A, 0x3F2BEB53 dd 0xBEC3EF26, 0xBF7FB10F, 0xBEF15AFE, 0x3F187FC8 dd 0x3F7B14BE, 0x3E78CF78, 0xBF45E40B, 0xBF676BD7 ; filter[12] dd 0x3F800000, 0x3EAC7CD3, 0xBF45E404, 0xBF5B941B dd 0x3E47C5C8, 0x3F7D3AAD, 0x3EF15AED, 0xBF2BEB44 dd 0xBF6C835D, 0x3D48FB07, 0x3F74FA0D, 0x3F187FBE dd 0xBF0E39D7, 0xBF7853F6, 0xBDC8BDAA, 0x3F676BDD dd 0x3F3504EF, 0xBEDAE881, 0xBF7EC46E, 0xBE78CFF5 dd 0x3F54DB3A, 0x3F4D9EFC, 0xBE94A03A, 0xBF7FB10F dd 0xBEC3EF22, 0x3F3DAEF1, 0x3F61C591, 0xBE164026 dd 0xBF7B14B9, 0xBF039C24, 0x3F2267AB, 0x3F710902 ; filter[13] dd 0x3F800000, 0x3E78CFD0, 0xBF61C597, 0xBF2BEB49 dd 0x3F0E39D7, 0x3F710907, 0xBDC8BD48, 0xBF7D3AAB dd 0xBEC3EF23, 0x3F4D9F07, 0x3F45E3FF, 0xBEDAE88A dd 0xBF7B14BE, 0xBD48FBF4, 0x3F74FA07, 0x3F039C49 dd 0xBF3504E9, 0xBF5B9412, 0x3E94A04E, 0x3F7FB10E dd 0x3E47C58E, 0xBF676BDD, 0xBF226790, 0x3F187FC8 dd 0x3F6C835B, 0xBE164026, 0xBF7EC46B, 0xBEAC7D04 dd 0x3F54DB23, 0x3F3DAF0B, 0xBEF15AB8, 0xBF7853FF ; filter[14] dd 0x3F800000, 0x3E164085, 0xBF74FA0B, 0xBEDAE87B dd 0x3F54DB31, 0x3F2BEB48, 0xBF22679E, 0xBF5B941D dd 0x3EC3EF11, 0x3F7853F7, 0xBDC8BD60, 0xBF7FB10F dd 0xBE47C590, 0x3F710903, 0x3EF15AFF, 0xBF4D9EFD dd 0xBF3504F6, 0x3F187FBF, 0x3F61C596, 0xBEAC7CE1 dd 0xBF7B14BC, 0x3D48FC14, 0x3F7EC46C, 0x3E78CF78 dd 0xBF6C8368, 0xBF039C24, 0x3F45E3F0, 0x3F3DAF0B dd 0xBF0E39C6, 0xBF676BE0, 0x3E94A012, 0x3F7D3AAE ; filter[15] dd 0x3F800000, 0x3D48FB29, 0xBF7EC46D, 0xBE16407F dd 0x3F7B14BF, 0x3E78CFC4, 0xBF74FA0B, 0xBEAC7CDD dd 0x3F6C8360, 0x3EDAE888, 0xBF61C599, 0xBF039C40 dd 0x3F54DB34, 0x3F187FB5, 0xBF45E3FD, 0xBF2BEB4B dd 0x3F3504F8, 0x3F3DAEEF, 0xBF226792, 0xBF4D9F03 dd 0x3F0E39E0, 0x3F5B9422, 0xBEF15ADD, 0xBF676BD7 dd 0x3EC3EF27, 0x3F710902, 0xBE94A064, 0xBF7853FF dd 0x3E47C570, 0x3F7D3AAE, 0xBDC8BD16, 0xBF7FB10F ; table.cのenwindow[]の要素を4個ずつ64個ごとにインターリーブ enwindow: ; _P5FPU, _P6FPU, _SSE で使用 DD 0.000000000, -0.000000477, -0.000000477, -0.000000477 ; enwindow[ 3: 0] DD 0.000101566, 0.000103951, 0.000105858, 0.000107288 ; enwindow[ 67: 64] DD 0.000971317, 0.000953674, 0.000930786, 0.000902653 ; enwindow[131:128] DD 0.003134727, 0.002841473, 0.002521515, 0.002174854 ; enwindow[195:192] DD 0.035780907, 0.035758972, 0.035694122, 0.035586357 ; enwindow[259:256] DD 0.003134727, 0.003401756, 0.003643036, 0.003858566 ; enwindow[323:320] DD 0.000971317, 0.000983715, 0.000991821, 0.000995159 ; enwindow[387:384] DD 0.000101566, 0.000099182, 0.000096321, 0.000093460 ; enwindow[451:448] DD -0.000000477, -0.000000477, -0.000000477, -0.000000954 ; enwindow[ 7: 4] DD 0.000108242, 0.000108719, 0.000108719, 0.000108242 ; enwindow[ 71: 68] DD 0.000868797, 0.000829220, 0.000783920, 0.000731945 ; enwindow[135:132] DD 0.001800537, 0.001399517, 0.000971317, 0.000515938 ; enwindow[199:196] DD 0.035435200, 0.035242081, 0.035007000, 0.034730434 ; enwindow[264:260] DD 0.004049301, 0.004215240, 0.004357815, 0.004477024 ; enwindow[327:324] DD 0.000994205, 0.000989437, 0.000980854, 0.000968933 ; enwindow[391:388] DD 0.000090599, 0.000087261, 0.000083923, 0.000080585 ; enwindow[456:452] DD -0.000000954, -0.000000954, -0.000000954, -0.000001431 ; [ 11: 8] DD 0.000106812, 0.000105381, 0.000102520, 0.000099182 DD 0.000674248, 0.000610352, 0.000539303, 0.000462532 DD 0.000033379, -0.000475883, -0.001011848, -0.001573563 DD 0.034412861, 0.034055710, 0.033659935, 0.033225536 DD 0.004573822, 0.004649162, 0.004703045, 0.004737377 DD 0.000954151, 0.000935555, 0.000915051, 0.000891685 DD 0.000076771, 0.000073433, 0.000070095, 0.000066280 DD -0.000001431, -0.000001907, -0.000001907, -0.000002384 ; [ 15: 12] DD 0.000095367, 0.000090122, 0.000084400, 0.000077724 DD 0.000378609, 0.000288486, 0.000191689, 0.000088215 DD -0.002161503, -0.002774239, -0.003411293, -0.004072189 DD 0.032754898, 0.032248020, 0.031706810, 0.031132698 DD 0.004752159, 0.004748821, 0.004728317, 0.004691124 DD 0.000866413, 0.000838757, 0.000809669, 0.000779152 DD 0.000062943, 0.000059605, 0.000055790, 0.000052929 DD -0.000002384, -0.000002861, -0.000003338, -0.000003338 ; [ 19: 16] DD 0.000069618, 0.000060558, 0.000050545, 0.000039577 DD -0.000021458, -0.000137329, -0.000259876, -0.000388145 DD -0.004756451, -0.005462170, -0.006189346, -0.006937027 DD 0.030526638, 0.029890060, 0.029224873, 0.028532982 DD 0.004638195, 0.004570484, 0.004489899, 0.004395962 DD 0.000747204, 0.000714302, 0.000680923, 0.000646591 DD 0.000049591, 0.000046253, 0.000043392, 0.000040531 DD -0.000003815, -0.000004292, -0.000004768, -0.000005245 ; [ 23: 20] DD 0.000027180, 0.000013828, -0.000000954, -0.000017166 DD -0.000522137, -0.000661850, -0.000806808, -0.000956535 DD -0.007703304, -0.008487225, -0.009287834, -0.010103703 DD 0.027815342, 0.027073860, 0.026310921, 0.025527000 DD 0.004290581, 0.004174709, 0.004048824, 0.003914356 DD 0.000611782, 0.000576973, 0.000542164, 0.000507355 DD 0.000037670, 0.000034809, 0.000032425, 0.000030041 DD -0.000006199, -0.000006676, -0.000007629, -0.000008106 ; [ 27: 24] DD -0.000034332, -0.000052929, -0.000072956, -0.000093937 DD -0.001111031, -0.001269817, -0.001432419, -0.001597881 DD -0.010933399, -0.011775017, -0.012627602, -0.013489246 DD 0.024725437, 0.023907185, 0.023074150, 0.022228718 DD 0.003771782, 0.003622532, 0.003467083, 0.003306866 DD 0.000472546, 0.000438213, 0.000404358, 0.000371456 DD 0.000027657, 0.000025272, 0.000023365, 0.000021458 DD -0.000009060, -0.000010014, -0.000011444, -0.000012398 ; [ 31: 28] DD -0.000116348, -0.000140190, -0.000165462, -0.000191212 DD -0.001766682, -0.001937389, -0.002110004, -0.002283096 DD -0.014358521, -0.015233517, -0.016112804, -0.016994476 DD 0.021372318, 0.020506859, 0.019634247, 0.018756866 DD 0.003141880, 0.002974033, 0.002803326, 0.002630711 DD 0.000339031, 0.000307560, 0.000277042, 0.000247478 DD 0.000019550, 0.000018120, 0.000016689, 0.000014782 DD -0.000013828, -0.000014782, -0.000016689, -0.000018120 ; [ 35: 32] DD -0.000218868, -0.000247478, -0.000277042, -0.000307560 DD -0.002457142, -0.002630711, -0.002803326, -0.002974033 DD -0.017876148, -0.018756866, -0.019634247, -0.020506859 DD 0.017876148, 0.016994476, 0.016112804, 0.015233517 DD 0.002457142, 0.002283096, 0.002110004, 0.001937389 DD 0.000218868, 0.000191212, 0.000165462, 0.000140190 DD 0.000013828, 0.000012398, 0.000011444, 0.000010014 DD -0.000019550, -0.000021458, -0.000023365, -0.000025272 ; [ 39: 36] DD -0.000339031, -0.000371456, -0.000404358, -0.000438213 DD -0.003141880, -0.003306866, -0.003467083, -0.003622532 DD -0.021372318, -0.022228718, -0.023074150, -0.023907185 DD 0.014358521, 0.013489246, 0.012627602, 0.011775017 DD 0.001766682, 0.001597881, 0.001432419, 0.001269817 DD 0.000116348, 0.000093937, 0.000072956, 0.000052929 DD 0.000009060, 0.000008106, 0.000007629, 0.000006676 DD -0.000027657, -0.000030041, -0.000032425, -0.000034809 ; [ 43: 40] DD -0.000472546, -0.000507355, -0.000542164, -0.000576973 DD -0.003771782, -0.003914356, -0.004048824, -0.004174709 DD -0.024725437, -0.025527000, -0.026310921, -0.027073860 DD 0.010933399, 0.010103703, 0.009287834, 0.008487225 DD 0.001111031, 0.000956535, 0.000806808, 0.000661850 DD 0.000034332, 0.000017166, 0.000000954, -0.000013828 DD 0.000006199, 0.000005245, 0.000004768, 0.000004292 DD -0.000037670, -0.000040531, -0.000043392, -0.000046253 ; [ 47: 44] DD -0.000611782, -0.000646591, -0.000680923, -0.000714302 DD -0.004290581, -0.004395962, -0.004489899, -0.004570484 DD -0.027815342, -0.028532982, -0.029224873, -0.029890060 DD 0.007703304, 0.006937027, 0.006189346, 0.005462170 DD 0.000522137, 0.000388145, 0.000259876, 0.000137329 DD -0.000027180, -0.000039577, -0.000050545, -0.000060558 DD 0.000003815, 0.000003338, 0.000003338, 0.000002861 DD -0.000049591, -0.000052929, -0.000055790, -0.000059605 ; [ 51: 48] DD -0.000747204, -0.000779152, -0.000809669, -0.000838757 DD -0.004638195, -0.004691124, -0.004728317, -0.004748821 DD -0.030526638, -0.031132698, -0.031706810, -0.032248020 DD 0.004756451, 0.004072189, 0.003411293, 0.002774239 DD 0.000021458, -0.000088215, -0.000191689, -0.000288486 DD -0.000069618, -0.000077724, -0.000084400, -0.000090122 DD 0.000002384, 0.000002384, 0.000001907, 0.000001907 DD -0.000062943, -0.000066280, -0.000070095, -0.000073433 ; [ 55: 52] DD -0.000866413, -0.000891685, -0.000915051, -0.000935555 DD -0.004752159, -0.004737377, -0.004703045, -0.004649162 DD -0.032754898, -0.033225536, -0.033659935, -0.034055710 DD 0.002161503, 0.001573563, 0.001011848, 0.000475883 DD -0.000378609, -0.000462532, -0.000539303, -0.000610352 DD -0.000095367, -0.000099182, -0.000102520, -0.000105381 DD 0.000001431, 0.000001431, 0.000000954, 0.000000954 DD -0.000076771, -0.000080585, -0.000083923, -0.000087261 ; [ 59: 56] DD -0.000954151, -0.000968933, -0.000980854, -0.000989437 DD -0.004573822, -0.004477024, -0.004357815, -0.004215240 DD -0.034412861, -0.034730434, -0.035007000, -0.035242081 DD -0.000033379, -0.000515938, -0.000971317, -0.001399517 DD -0.000674248, -0.000731945, -0.000783920, -0.000829220 DD -0.000106812, -0.000108242, -0.000108719, -0.000108719 DD 0.000000954, 0.000000954, 0.000000477, 0.000000477 DD -0.000090599, -0.000093460, -0.000096321, -0.000099182 ; [ 63: 60] DD -0.000994205, -0.000995159, -0.000991821, -0.000983715 DD -0.004049301, -0.003858566, -0.003643036, -0.003401756 DD -0.035435200, -0.035586357, -0.035694122, -0.035758972 DD -0.001800537, -0.002174854, -0.002521515, -0.002841473 DD -0.000868797, -0.000902653, -0.000930786, -0.000953674 DD -0.000108242, -0.000107288, -0.000105858, -0.000103951 DD 0.000000477, 0.000000477, 0.000000477, 0.000000477 segment_code align 16 proc window_subband_init xor eax, eax mov [sbd_off], eax mov [sbd_off+4], eax mov edx, sbd_xxx mov ecx, 2*(HAN_SIZE+1152) ; &演算を省くため .sblp: mov [edx], eax add edx, 4 dec ecx jnz .sblp ret end gogo239b/spanish.msg100644 23421 144 7107 7220537350 13513 0ustar shigeousersstatic int isSPANISH( char *str ){ static char mes[][20] = { "es", "es_ES", "es_AR", "es_DO", "es_GT", "es_HN", "es_MX", "es_PA", "es_PE", "es_SV" }; char aux[20]; int i; for( i = 0; i < sizeof(mes)/sizeof(mes[0]); i++ ){ if( !strcmp( str, mes[i] ) ) return 1; sprintf(aux,"%s.ISO-8859-1",mes[i]); if( !strcmp( str, aux ) ) return 1; } return 0; } static char msg_SPANISH[][MSG_LEN_MAX] = { "GOGO-no-coda", "Copyright (C) 1999, 2000 PEN@MarineCat y shigeo\n", " Agradecimiento especial a Keiichi SAKAI, URURI, Noisyu y Kei\n", "*** sentados en un banco a primera hora de la tarde [modo banco de pruebas] ***\n", // 4 "opcin -m incorrecta", "opcin -b[r] incorrecta", "opcin -s incorrecta\n", "opcin -emp incorrecta\n", "ソEl bitrate es cero?\n", "opcin -d incorrecta\n", "opcin -off incorrecta\n", "opcin -lpf incorrecta\n", "opcin -o incorrecta\n", "opcin -cpu incorrecta\n", "opcin -priority incorrecta\n", "opcin -readthread incorrecta\n", "no encontrado\n", "opcin -riff incorrecta\n", "opcin -v incorrecta\n", "opcin -offset incorrecta\n", "opcin incorrecta\n", "opcin -vb incorrecta\n", "opcin -th incorrecta\n", // 19 "mono", "stereo", "j-stereo", "m/s stereo", "dual channel", "indefinido", "frec. muestreo entrada", "frec. muestreo salida", "bitrate", "fichero entrada", "fichero salida ", "\nFin de la codificacin\nTiempo", // 12 "Este programa est basado en el LAME3.29beta y se distribuye bajo la LGPL\n", "uso\n", "gogo PCMentrada [PCMsalida] [opciones]\n\n", "PCMentrada es el fichero wav de entrada\n", "si input.wav es `stdin' se lee de la entrada estandard\n", "PCMsalida es el fichero mp3 de salida (se puede omitir)\n\n", "opciones\n", "-b kbps/-br bps bitrate [kpbs/bps]\n", "-silent no mostrar informacin de proceso\n", "-m {s,m,j} formato salida s:stereo, m:mono, j:j-stereo\n", "-nopsy desactivar modelo psyco-acustico\n", "-off {3dn,mmx,kni(sse),e3dn}\n", "-v {0,..,9} VBR [0:alta calidad 9:alta compresin]\n", "slo para entradas en formato RAW-PCM\n", "-offset bytes saltar tamao cabecera\n", " -8bit 8bit-PCM [p.def. 16bit-PCM]\n", " -mono mono-PCM [p.def. stereo-PCM]\n", " -bswap intercambiar bytes alto y bajo en 16bitPCM\n", " -s kHz frecuencia del PCM [p.def. 44.1kHz]\n", " -tos para TownsOS\n", "-cpu n nmero de CPUs (si no se indica, se autodetecta)\n", "-priority num Prioridad del hilo de codificacin (10 si no se indica)\n", "-readthread num Prioridad del hilo de lectura (Ninguna si no se indica)\n", "-d kHz cambiar frecuencia del MP3 de salida\n", "-emp {n,c,5} desenfatizar\n", "-lpf {on,off} filtro 16kHz [p.df. se usa si <= 128kbps; no se usa si >= 160kbps]\n", "-delete borrar fichero de entrada tras la codificacin\n", "-i verificar y sobreescribir\n", "-o dir cambiar directorio de salida\n", "-riff {wave, rmp} formato de empaquetado wave:RIFF/WAVE rmp:RIFF/RMP\n", "-test modo banco de pruebas\n", "pulse return.\n", "-lang {sjis,eucjp,eng,ger,esp} idioma\n", // 33 "Finalizado", "Finalizado. Sin errores.", "Error interno", "Par疥etro ilegal", "No se encuentra unidad FPU", "No se puede abrir el fichero de entrada", "No se puede abrir el fichero de salida", "Frecuencia de muestreo de entrada incorrecta", "Bitrate de salida incorrecto", "Tipo de onda incorrecto", "No se puede buscar", "Interrumpido", "No se pudo escribir", // 13 "comprobando si el SO soporta SSE.", "... si.", "Este SO no soporta las instrucciones SSE.", "El nmero de CPUs es", "\nソsobreescribir?(s/n)", "borrar", // 5 }; gogo239b/stab.c100644 23421 144 5562 7220537350 12436 0ustar shigeousers/* #include #include #include #include */ #include "stdafx.h" #include "common.h" #include "resource.h" #include "musenc.h" static HINSTANCE hModule = NULL; typedef MERET (*me_init)(void); typedef MERET (*me_setconf)(MPARAM mode, UPARAM dwPara1, UPARAM dwPara2 ); typedef MERET (*me_getconf)(MPARAM mode, void *para1 ); typedef MERET (*me_detect)(); typedef MERET (*me_procframe)(); typedef MERET (*me_close)(); typedef MERET (*me_end)(); typedef MERET (*me_getver)( unsigned long *vercode, char *verstring ); typedef MERET (*me_haveunit)( unsigned long *unit ); static me_init mpge_init; static me_setconf mpge_setconf; static me_getconf mpge_getconf; static me_detect mpge_detector; static me_procframe mpge_processframe; static me_close mpge_close; static me_end mpge_end; static me_getver mpge_getver; static me_haveunit mpge_haveunit; MERET MPGE_initializeWork() { if( hModule == NULL ){ hModule = LoadLibrary("gogo.dll"); if( !hModule ){ disp_err( "GOGO.DLLの読み込みを失敗しました。\n" "DLLをEXEファイルと同じディレクトリへ複写してください\n" ); exit( -1 ); } mpge_init = (me_init )GetProcAddress( hModule, "MPGE_initializeWork" ); mpge_setconf = (me_setconf )GetProcAddress( hModule, "MPGE_setConfigure" ); mpge_getconf = (me_getconf )GetProcAddress( hModule, "MPGE_getConfigure" ); mpge_detector = (me_detect )GetProcAddress( hModule, "MPGE_detectConfigure" ); mpge_processframe = (me_procframe )GetProcAddress( hModule, "MPGE_processFrame" ); mpge_close = (me_close )GetProcAddress( hModule, "MPGE_closeCoder" ); mpge_end = (me_end )GetProcAddress( hModule, "MPGE_endCoder" ); mpge_getver = (me_getver )GetProcAddress( hModule, "MPGE_getVersion" ); mpge_haveunit= (me_haveunit )GetProcAddress( hModule, "MPGE_getUnitStates" ); } if( mpge_init && mpge_setconf && mpge_getconf && mpge_detector && mpge_processframe && mpge_end && mpge_getver && mpge_haveunit) return (mpge_init)(); fprintf( stderr, "DLLの内容を正しく識別することが出来ませんでした\n"); FreeLibrary( hModule ); hModule = NULL; exit( -1 ); return ME_NOERR; } MERET MPGE_setConfigure(MPARAM mode, UPARAM dwPara1, UPARAM dwPara2 ) { return (mpge_setconf)( mode, dwPara1, dwPara2 ); } MERET MPGE_getConfigure(MPARAM mode, void *para1 ) { return (mpge_getconf)( mode, para1 ); } MERET MPGE_detectConfigure() { return (mpge_detector)(); } MERET MPGE_processFrame() { return (mpge_processframe)(); } MERET MPGE_closeCoder() { return (mpge_close)(); } MERET MPGE_endCoder() { MERET val = (mpge_end)(); if( val == ME_NOERR ){ FreeLibrary( hModule ); // DLL開放 hModule = NULL; } return val; } MERET MPGE_getVersion( unsigned long *vercode, char *verstring ) { MERET val = (mpge_getver)( vercode, verstring ); return val; } MERET MPGE_getUnitStates( unsigned long *unit) { MERET val = (mpge_haveunit)( unit ); return val; } gogo239b/stdafx.cpp100644 23421 144 475 7220537350 13314 0ustar shigeousers// stdafx.cpp : ノクス爭、・・ッ・。シ・ノ・ユ・。・、・、エ゙、爭ス。シ・ケ ・ユ・。・、・ // GOGO2DLL.pch タクタョ、オ、、・ラ・・ウ・・ム・、・コム・リ・テ・タ。シ // stdafx.obj タクタョ、オ、、・ラ・・ウ・・ム・、・コム・ソ・、・ラセハ #include "stdafx.h" // TODO: STDAFX.H 、ヒエ゙、゙、、ニ、、、ニ。「、ウ、ホ・ユ・。・、・、ヒオュスメ、オ、、ニ、、、ハ、、 // ・リ・テ・タ。シ・ユ・。・、・、トノイテ、キ、ニ、ッ、タ、オ、、。」 gogo239b/stdafx.h100644 23421 144 1411 7220537350 12770 0ustar shigeousers// stdafx.h : 標準のシステム インクルード ファイル、 // または参照回数が多く、かつあまり変更されない // プロジェクト専用のインクルード ファイルを記述します。 // #if !defined(AFX_STDAFX_H__40A21943_55D0_11D3_8575_00605204BB25__INCLUDED_) #define AFX_STDAFX_H__40A21943_55D0_11D3_8575_00605204BB25__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // この位置にヘッダーを挿入してください #define WIN32_LEAN_AND_MEAN // Windows ヘッダーから殆ど使用されないスタッフを除外します #include // TODO: プログラムで必要なヘッダー参照を追加してください。 //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。 #endif // !defined(AFX_STDAFX_H__40A21943_55D0_11D3_8575_00605204BB25__INCLUDED_) gogo239b/subband.h100644 23421 144 1124 7220537350 13116 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 shigeo */ #ifndef __SUBBAND_H__ #define __SUBBAND_H__ #define EXTRADELAY 56 #define HAN_SIZE 512 void window_subband_init(void); #ifdef _MAIN_C #define EXT #else #define EXT extern #endif EXT void (*window_filter_subband)(float *win_buf, float *s, int mode_gr); EXT void (*sbd_shiftin)(int (*mfbuf)[1152+576+EXTRADELAY], int stereo, int mode_gr); EXT void (*frame_shiftin_multi)(int (*int_buf)[1152+576+EXTRADELAY], short *frame_buf, float (*flt_buf)[1152+HAN_SIZE], int mode_gr, int stereo); #undef EXT #endif /* __SUBBAND_H__ */ gogo239b/subs.c100644 23421 144 5625 7220537350 12461 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999 shigeo * special thanks to Keiichi SAKAI, URURI */ #include #include "common.h" #include "haveunit.h" extern void (*fht)(float *fz, int n); void (*fft1k)(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); void (*fft256)(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); void fht_3DN(float *fz,int n); void fht_SSE(float *fz,int n); void fht_FPU(float *fz,int n); /* by うるり */ #ifdef USE_E3DN void fht_E3DN(float *fz,int n); #endif void setup_fht(int useUNIT){ #ifdef USE_E3DN if(useUNIT & tE3DN){ SETUP_DSP("use:fht_E3DN\n"); fht=fht_E3DN; }else #endif if(useUNIT & t3DN){ SETUP_DSP("use:fht_3DN\n"); fht=fht_3DN; }else if(useUNIT & tSSE){ SETUP_DSP("use:fht_SSE\n"); fht=fht_SSE; }else { SETUP_DSP("use:fht_FPU\n"); fht=fht_FPU; } } void fft1k_FPU(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); void fft256_FPU(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); void fft1k_SSE(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); void fft256_SSE(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); void fft1k_3DN(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); void fft256_3DN(float *x_real, float *energy, float (*abx)[2], float *window, int *savebuf); void setup_fft(int useUNIT) { if(useUNIT & t3DN){ SETUP_DSP("use:fft1k_3DN\n"); fft1k = fft1k_3DN; SETUP_DSP("use:fft256_3DN\n"); fft256 = fft256_3DN; }else if(useUNIT & tSSE){ SETUP_DSP("use:fft1k_SSE\n"); fft1k = fft1k_SSE; SETUP_DSP("use:fft256_SSE\n"); fft256 = fft256_SSE; }else{ SETUP_DSP("use:fft1k_FPU\n"); fft1k = fft1k_FPU; SETUP_DSP("use:fft256_FPU\n"); fft256 = fft256_FPU; } } /* * s != 0 を仮定する * s & 3 == 0 を仮定する */ void fft_side_C( float in[2][1024], int s, float *ret) { float energy; float a,b; int i,j; /* energyはかなり大きな値の話なので補正は省略しても(多分)大丈夫 */ energy = 0; for (i=s,j=1024-s;i<512;i++,j--){ a = in[0][i] - in[1][i]; b = in[0][j] - in[1][j]; energy += a*a + b*b; } a = in[0][512] - in[1][512]; *ret = energy * 0.25 + a * a * 0.5; } void (*fft_side)( float in[2][1024], int s, float *ret); void fft_side_3DN( float in[2][1024], int s, float *ret ); void fft_side_SSE( float in[2][1024], int s, float *ret ); #ifdef USE_E3DN void fft_side_E3DN( float in[2][1024], int s, float *ret ); #endif void setup_fft_side(int useUNIT){ #ifdef USE_E3DN if( useUNIT & tE3DN ){ SETUP_DSP("use:fft_side_E3DN\n"); fft_side = fft_side_E3DN; }else #endif if( useUNIT & t3DN ){ SETUP_DSP("use:fft_side_3DN\n"); fft_side = fft_side_3DN; }else if( useUNIT & tSSE ){ SETUP_DSP("use:fft_side_SSE\n"); fft_side = fft_side_SSE; }else { SETUP_DSP("use:fft_side_C\n"); fft_side = fft_side_C; } } gogo239b/tables.c100644 23421 144 103714 7220537350 13015 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * modified by PEN@MarineCat */ #ifdef WIN32 #ifdef _MSC_VER #pragma warning( disable : 4305 ) /* const double->float 変換 */ #endif #endif float psy_data[] = {48000.0, 61, 0, 1, 24.5, 4.532, 0.970, 0.000, 1, 1, 24.5, 4.532, 0.755, 0.469, 2, 1, 24.5, 4.532, 0.738, 0.938, 3, 1, 24.5, 0.904, 0.730, 1.406, 4, 1, 24.5, 0.904, 0.724, 1.875, 5, 1, 20.0, 0.090, 0.723, 2.344, 6, 1, 20.0, 0.090, 0.723, 2.813, 7, 1, 20.0, 0.029, 0.723, 3.281, 8, 1, 20.0, 0.029, 0.718, 3.750, 9, 1, 20.0, 0.009, 0.690, 4.199, 10, 1, 20.0, 0.009, 0.660, 4.625, 11, 1, 18.0, 0.009, 0.641, 5.047, 12, 1, 18.0, 0.009, 0.600, 5.438, 13, 1, 18.0, 0.009, 0.584, 5.828, 14, 1, 12.0, 0.009, 0.532, 6.188, 15, 1, 12.0, 0.009, 0.537, 6.522, 16, 2, 6.0, 0.018, 0.857, 7.174, 17, 2, 6.0, 0.018, 0.858, 7.801, 18, 2, 3.0, 0.018, 0.853, 8.402, 19, 2, 3.0, 0.018, 0.824, 8.966, 20, 2, 3.0, 0.018, 0.778, 9.484, 21, 2, 3.0, 0.018, 0.740, 9.966, 22, 2, 0.0, 0.018, 0.709, 10.426, 23, 2, 0.0, 0.018, 0.676, 10.866, 24, 2, 0.0, 0.018, 0.632, 11.279, 25, 2, 0.0, 0.018, 0.592, 11.669, 26, 2, 0.0, 0.018, 0.553, 12.042, 27, 2, 0.0, 0.018, 0.510, 12.386, 28, 2, 0.0, 0.018, 0.513, 12.721, 29, 3, 0.0, 0.027, 0.608, 13.115, 30, 3, 0.0, 0.027, 0.673, 13.562, 31, 3, 0.0, 0.027, 0.637, 13.984, 32, 3, 0.0, 0.027, 0.586, 14.371, 33, 3, 0.0, 0.027, 0.571, 14.741, 34, 4, 0.0, 0.036, 0.616, 15.140, 35, 4, 0.0, 0.036, 0.640, 15.563, 36, 4, 0.0, 0.036, 0.598, 15.962, 37, 4, 0.0, 0.036, 0.538, 16.324, 38, 4, 0.0, 0.036, 0.512, 16.665, 39, 5, 0.0, 0.045, 0.528, 17.020, 40, 5, 0.0, 0.045, 0.517, 17.373, 41, 5, 0.0, 0.045, 0.493, 17.708, 42, 6, 0.0, 0.054, 0.499, 18.045, 43, 7, 0.0, 0.063, 0.525, 18.398, 44, 7, 0.0, 0.063, 0.541, 18.762, 45, 8, 0.0, 0.072, 0.528, 19.120, 46, 8, 0.0, 0.072, 0.510, 19.466, 47, 8, 0.0, 0.072, 0.506, 19.807, 48, 10, 0.0, 0.180, 0.525, 20.159, 49, 10, 0.0, 0.180, 0.536, 20.522, 50, 10, 0.0, 0.180, 0.518, 20.874, 51, 13, 0.0, 0.372, 0.501, 21.214, 52, 13, 0.0, 0.372, 0.497, 21.553, 53, 14, 0.0, 0.400, 0.497, 21.892, 54, 18, 0.0, 1.627, 0.495, 22.231, 55, 18, 0.0, 1.627, 0.494, 22.569, 56, 20, 0.0, 1.808, 0.497, 22.909, 57, 25, 0.0, 22.607, 0.494, 23.248, 58, 25, 0.0, 22.607, 0.487, 23.583, 59, 35, 0.0, 31.650, 0.483, 23.915, 60, 67, 0.0, 605.867, 0.482, 24.246, 61, 67, 0.0, 605.867, 0.524, 24.576, 44100.0, 62, 0, 1, 24.5, 4.532, 0.951, 0.000, 1, 1, 24.5, 4.532, 0.700, 0.431, 2, 1, 24.5, 4.532, 0.681, 0.861, 3, 1, 24.5, 0.904, 0.675, 1.292, 4, 1, 24.5, 0.904, 0.667, 1.723, 5, 1, 20.0, 0.090, 0.665, 2.153, 6, 1, 20.0, 0.090, 0.664, 2.584, 7, 1, 20.0, 0.029, 0.664, 3.015, 8, 1, 20.0, 0.029, 0.664, 3.445, 9, 1, 20.0, 0.029, 0.655, 3.876, 10, 1, 20.0, 0.009, 0.616, 4.279, 11, 1, 20.0, 0.009, 0.597, 4.670, 12, 1, 18.0, 0.009, 0.578, 5.057, 13, 1, 18.0, 0.009, 0.541, 5.416, 14, 1, 18.0, 0.009, 0.575, 5.774, 15, 2, 12.0, 0.018, 0.856, 6.422, 16, 2, 6.0, 0.018, 0.846, 7.026, 17, 2, 6.0, 0.018, 0.840, 7.609, 18, 2, 3.0, 0.018, 0.822, 8.168, 19, 2, 3.0, 0.018, 0.800, 8.710, 20, 2, 3.0, 0.018, 0.753, 9.207, 21, 2, 3.0, 0.018, 0.704, 9.662, 22, 2, 0.0, 0.018, 0.674, 10.099, 23, 2, 0.0, 0.018, 0.640, 10.515, 24, 2, 0.0, 0.018, 0.609, 10.917, 25, 2, 0.0, 0.018, 0.566, 11.293, 26, 2, 0.0, 0.018, 0.535, 11.652, 27, 2, 0.0, 0.018, 0.531, 11.997, 28, 3, 0.0, 0.027, 0.615, 12.394, 29, 3, 0.0, 0.027, 0.686, 12.850, 30, 3, 0.0, 0.027, 0.650, 13.277, 31, 3, 0.0, 0.027, 0.612, 13.681, 32, 3, 0.0, 0.027, 0.567, 14.062, 33, 3, 0.0, 0.027, 0.520, 14.411, 34, 3, 0.0, 0.027, 0.513, 14.751, 35, 4, 0.0, 0.036, 0.557, 15.119, 36, 4, 0.0, 0.036, 0.584, 15.508, 37, 4, 0.0, 0.036, 0.570, 15.883, 38, 5, 0.0, 0.045, 0.579, 16.263, 39, 5, 0.0, 0.045, 0.585, 16.654, 40, 5, 0.0, 0.045, 0.548, 17.020, 41, 6, 0.0, 0.054, 0.536, 17.374, 42, 6, 0.0, 0.054, 0.550, 17.744, 43, 7, 0.0, 0.063, 0.532, 18.104, 44, 7, 0.0, 0.063, 0.504, 18.447, 45, 7, 0.0, 0.063, 0.496, 18.782, 46, 9, 0.0, 0.081, 0.517, 19.130, 47, 9, 0.0, 0.081, 0.527, 19.487, 48, 9, 0.0, 0.081, 0.516, 19.838, 49, 10, 0.0, 0.180, 0.497, 20.179, 50, 10, 0.0, 0.180, 0.489, 20.510, 51, 11, 0.0, 0.198, 0.502, 20.852, 52, 14, 0.0, 0.400, 0.501, 21.196, 53, 14, 0.0, 0.400, 0.491, 21.531, 54, 15, 0.0, 0.429, 0.497, 21.870, 55, 20, 0.0, 1.808, 0.504, 22.214, 56, 20, 0.0, 1.808, 0.504, 22.558, 57, 21, 0.0, 1.898, 0.495, 22.898, 58, 27, 0.0, 24.416, 0.486, 23.232, 59, 27, 0.0, 24.416, 0.484, 23.564, 60, 36, 0.0, 32.554, 0.483, 23.897, 61, 73, 0.0, 660.124, 0.475, 24.229, 62, 18, 0.0, 162.770, 0.515, 24.442, 32000.0, 58, 0, 2, 24.5, 4.532, 0.997, 0.313, 1, 2, 24.5, 4.532, 0.893, 0.938, 2, 2, 24.5, 1.809, 0.881, 1.563, 3, 2, 20.0, 0.181, 0.873, 2.188, 4, 2, 20.0, 0.181, 0.872, 2.813, 5, 2, 20.0, 0.057, 0.871, 3.438, 6, 2, 20.0, 0.018, 0.860, 4.045, 7, 2, 20.0, 0.018, 0.839, 4.625, 8, 2, 18.0, 0.018, 0.812, 5.173, 9, 2, 18.0, 0.018, 0.784, 5.698, 10, 2, 12.0, 0.018, 0.741, 6.185, 11, 2, 12.0, 0.018, 0.697, 6.634, 12, 2, 6.0, 0.018, 0.674, 7.070, 13, 2, 6.0, 0.018, 0.651, 7.492, 14, 2, 6.0, 0.018, 0.633, 7.905, 15, 2, 3.0, 0.018, 0.611, 8.305, 16, 2, 3.0, 0.018, 0.589, 8.695, 17, 2, 3.0, 0.018, 0.575, 9.064, 18, 3, 3.0, 0.027, 0.654, 9.484, 19, 3, 3.0, 0.027, 0.724, 9.966, 20, 3, 0.0, 0.027, 0.701, 10.426, 21, 3, 0.0, 0.027, 0.673, 10.866, 22, 3, 0.0, 0.027, 0.631, 11.279, 23, 3, 0.0, 0.027, 0.592, 11.669, 24, 3, 0.0, 0.027, 0.553, 12.042, 25, 3, 0.0, 0.027, 0.510, 12.386, 26, 3, 0.0, 0.027, 0.506, 12.721, 27, 4, 0.0, 0.036, 0.562, 13.091, 28, 4, 0.0, 0.036, 0.598, 13.488, 29, 4, 0.0, 0.036, 0.589, 13.873, 30, 5, 0.0, 0.045, 0.607, 14.268, 31, 5, 0.0, 0.045, 0.620, 14.679, 32, 5, 0.0, 0.045, 0.580, 15.067, 33, 5, 0.0, 0.045, 0.532, 15.424, 34, 5, 0.0, 0.045, 0.517, 15.771, 35, 6, 0.0, 0.054, 0.517, 16.120, 36, 6, 0.0, 0.054, 0.509, 16.466, 37, 6, 0.0, 0.054, 0.506, 16.807, 38, 8, 0.0, 0.072, 0.522, 17.158, 39, 8, 0.0, 0.072, 0.531, 17.518, 40, 8, 0.0, 0.072, 0.519, 17.869, 41, 10, 0.0, 0.090, 0.512, 18.215, 42, 10, 0.0, 0.090, 0.509, 18.563, 43, 10, 0.0, 0.090, 0.498, 18.902, 44, 12, 0.0, 0.109, 0.494, 19.239, 45, 12, 0.0, 0.109, 0.501, 19.580, 46, 13, 0.0, 0.118, 0.508, 19.925, 47, 14, 0.0, 0.252, 0.502, 20.269, 48, 14, 0.0, 0.252, 0.493, 20.606, 49, 16, 0.0, 0.288, 0.497, 20.944, 50, 20, 0.0, 0.572, 0.506, 21.288, 51, 20, 0.0, 0.572, 0.510, 21.635, 52, 23, 0.0, 0.658, 0.504, 21.980, 53, 27, 0.0, 2.441, 0.496, 22.319, 54, 27, 0.0, 2.441, 0.493, 22.656, 55, 32, 0.0, 2.893, 0.490, 22.993, 56, 37, 0.0, 33.458, 0.482, 23.326, 57, 37, 0.0, 33.458, 0.458, 23.656, 58, 12, 0.0, 10.851, 0.500, 23.937, 24000, 59, 0, 2, 15, 17.8250179, 0.697374165, 0.236874461, 1, 2, 15, 17.8250179, 0.455024809, 0.71016103, 2, 2, 15, 1.78250182, 0.431440443, 1.18193281, 3, 2, 15, 1.78250182, 0.42391625, 1.65102732, 4, 2, 13, 0.178250194, 0.418206781, 2.11632562, 5, 2, 13, 0.178250194, 0.41158545, 2.57676744, 6, 2, 13, 0.0563676581, 0.405409157, 3.03136396, 7, 2, 13, 0.0563676581, 0.399695486, 3.47920918, 8, 2, 13, 0.0563676581, 0.393753231, 3.91948748, 9, 2, 12, 0.0178250186, 0.387357473, 4.35147953, 10, 2, 12, 0.0178250186, 0.38045457, 4.77456427, 11, 2, 10, 0.0178250186, 0.373053908, 5.18822002, 12, 2, 10, 0.0178250186, 0.365188122, 5.59202194, 13, 2, 10, 0.0178250186, 0.356897771, 5.98564005, 14, 2, 9, 0.0178250186, 0.348700613, 6.36883163, 15, 2, 9, 0.0178250186, 0.340260029, 6.74143791, 16, 2, 6, 0.0178250186, 0.332341045, 7.10337448, 17, 2, 6, 0.0178250186, 0.330462843, 7.45462418, 18, 2, 6, 0.0178250186, 0.345568359, 7.79523182, 19, 3, 3, 0.0267375279, 0.377859652, 8.20455742, 20, 3, 3, 0.0267375279, 0.396689415, 8.67640114, 21, 3, 3, 0.0267375279, 0.391237885, 9.12561035, 22, 3, 3, 0.0267375279, 0.37761277, 9.55298138, 23, 3, 3, 0.0267375279, 0.362836808, 9.95940971, 24, 3, 0, 0.0267375279, 0.349010617, 10.3458519, 25, 3, 0, 0.0267375279, 0.339673489, 10.7132998, 26, 3, 0, 0.0267375279, 0.343845725, 11.0627575, 27, 4, 0, 0.0356500372, 0.355822682, 11.447506, 28, 4, 0, 0.0356500372, 0.358104348, 11.8627586, 29, 4, 0, 0.0356500372, 0.34745428, 12.2520256, 30, 4, 0, 0.0356500372, 0.334927917, 12.6173973, 31, 4, 0, 0.0356500372, 0.331643254, 12.9608269, 32, 5, 0, 0.0445625484, 0.333368897, 13.3219252, 33, 5, 0, 0.0445625484, 0.332313001, 13.6976833, 34, 5, 0, 0.0445625484, 0.3314417, 14.047802, 35, 6, 0, 0.0534750558, 0.330947191, 14.405302, 36, 6, 0, 0.0534750558, 0.332477689, 14.7684803, 37, 7, 0, 0.062387567, 0.332647532, 15.1315956, 38, 7, 0, 0.062387567, 0.330841452, 15.4940481, 39, 8, 0, 0.0713000745, 0.327769846, 15.8516159, 40, 8, 0, 0.0713000745, 0.324572712, 16.204628, 41, 9, 0, 0.0802125856, 0.323825002, 16.5502281, 42, 10, 0, 0.0891250968, 0.321414798, 16.9067478, 43, 10, 0, 0.0891250968, 0.318189293, 17.2537231, 44, 11, 0, 0.0980376005, 0.315934151, 17.5901108, 45, 12, 0, 0.106950112, 0.315639287, 17.931406, 46, 13, 0, 0.115862623, 0.316569835, 18.2750721, 47, 14, 0, 0.124775134, 0.31656, 18.6191597, 48, 15, 0, 0.133687645, 0.315465957, 18.9621754, 49, 16, 0, 0.142600149, 0.313576341, 19.3029613, 50, 17, 0, 0.151512653, 0.311635971, 19.6405869, 51, 18, 0, 0.160425171, 0.311066717, 19.9742699, 52, 20, 0, 0.355655879, 0.311465651, 20.3115921, 53, 21, 0, 0.373438686, 0.311872005, 20.6507797, 54, 23, 0, 0.409004271, 0.311015964, 20.9890823, 55, 24, 0, 0.676411927, 0.309207708, 21.3251152, 56, 26, 0, 0.732779562, 0.3081128, 21.6565971, 57, 28, 0, 0.789147198, 0.310006589, 21.9881554, 58, 31, 0, 2.76287794, 0.327113092, 22.3222847, 59, 34, 0, 3.03025317, 0.416082352, 22.6605186, 22050, 59, 0, 2, 15, 17.8250179, 0.658683598, 0.217637643, 1, 2, 15, 17.8250179, 0.432554901, 0.652563453, 2, 2, 15, 1.78250182, 0.405113578, 1.08633137, 3, 2, 15, 1.78250182, 0.397231787, 1.51803517, 4, 2, 15, 1.78250182, 0.392088681, 1.94679713, 5, 2, 13, 0.178250194, 0.386788279, 2.37177849, 6, 2, 13, 0.178250194, 0.380574644, 2.79218864, 7, 2, 13, 0.0563676581, 0.375309765, 3.20729256, 8, 2, 13, 0.0563676581, 0.370087624, 3.61641645, 9, 2, 12, 0.0178250186, 0.364568561, 4.01895428, 10, 2, 12, 0.0178250186, 0.358959526, 4.4143672, 11, 2, 12, 0.0178250186, 0.352938265, 4.80218887, 12, 2, 10, 0.0178250186, 0.3465029, 5.18202305, 13, 2, 10, 0.0178250186, 0.33968094, 5.55354261, 14, 2, 10, 0.0178250186, 0.332571507, 5.91648674, 15, 2, 9, 0.0178250186, 0.326015651, 6.27065945, 16, 2, 9, 0.0178250186, 0.325442046, 6.61592293, 17, 2, 9, 0.0178250186, 0.341315031, 6.95219517, 18, 3, 6, 0.0267375279, 0.374984443, 7.3584404, 19, 3, 6, 0.0267375279, 0.396138102, 7.8290925, 20, 3, 3, 0.0267375279, 0.39271906, 8.27975655, 21, 3, 3, 0.0267375279, 0.380755007, 8.71083069, 22, 3, 3, 0.0267375279, 0.367386311, 9.12284088, 23, 3, 3, 0.0267375279, 0.354351997, 9.51640987, 24, 3, 3, 0.0267375279, 0.341508389, 9.89222908, 25, 3, 0, 0.0267375279, 0.333577901, 10.2510386, 26, 3, 0, 0.0267375279, 0.338108748, 10.5936022, 27, 4, 0, 0.0356500372, 0.350744486, 10.9723492, 28, 4, 0, 0.0356500372, 0.354519457, 11.38272, 29, 4, 0, 0.0356500372, 0.345274031, 11.7689981, 30, 4, 0, 0.0356500372, 0.333828837, 12.1329184, 31, 4, 0, 0.0356500372, 0.331436664, 12.4761295, 32, 5, 0, 0.0445625484, 0.334172577, 12.8381901, 33, 5, 0, 0.0445625484, 0.334024847, 13.2160273, 34, 5, 0, 0.0445625484, 0.33392629, 13.5690479, 35, 6, 0, 0.0534750558, 0.334218502, 13.9303951, 36, 6, 0, 0.0534750558, 0.336405039, 14.298193, 37, 7, 0, 0.062387567, 0.337080389, 14.666563, 38, 7, 0, 0.062387567, 0.335603535, 15.0346909, 39, 8, 0, 0.0713000745, 0.332515866, 15.398139, 40, 8, 0, 0.0713000745, 0.327727586, 15.7570457, 41, 9, 0, 0.0802125856, 0.322346836, 16.1083431, 42, 9, 0, 0.0802125856, 0.317575186, 16.4528522, 43, 10, 0, 0.0891250968, 0.31632933, 16.7886105, 44, 11, 0, 0.0980376005, 0.317602783, 17.132, 45, 12, 0, 0.106950112, 0.319945186, 17.4796028, 46, 13, 0, 0.115862623, 0.320881754, 17.8287659, 47, 14, 0, 0.124775134, 0.320346534, 18.1774921, 48, 15, 0, 0.133687645, 0.318628669, 18.5243168, 49, 16, 0, 0.142600149, 0.316125751, 18.8681736, 50, 17, 0, 0.151512653, 0.313746184, 19.2082729, 51, 18, 0, 0.160425171, 0.312971771, 19.5440025, 52, 20, 0, 0.178250194, 0.313278913, 19.8831882, 53, 21, 0, 0.373438686, 0.313735574, 20.224247, 54, 23, 0, 0.409004271, 0.31308493, 20.5646286, 55, 24, 0, 0.426787049, 0.31156227, 20.903141, 56, 26, 0, 0.732779562, 0.310435742, 21.2376747, 57, 28, 0, 0.789147198, 0.31132248, 21.5730591, 58, 30, 0, 0.845514894, 0.32730341, 21.9066811, 59, 33, 0, 2.94112802, 0.414659739, 22.2411156, 16000, 55, 0, 3, 15, 26.7375278, 0.697374165, 0.236874461, 1, 3, 15, 26.7375278, 0.455024809, 0.71016103, 2, 3, 15, 2.67375278, 0.431440443, 1.18193281, 3, 3, 15, 2.67375278, 0.42391625, 1.65102732, 4, 3, 13, 0.26737529, 0.418206781, 2.11632562, 5, 3, 13, 0.26737529, 0.41158545, 2.57676744, 6, 3, 13, 0.0845514908, 0.405409157, 3.03136396, 7, 3, 13, 0.0845514908, 0.399695486, 3.47920918, 8, 3, 13, 0.0845514908, 0.393753231, 3.91948748, 9, 3, 12, 0.0267375279, 0.387357473, 4.35147953, 10, 3, 12, 0.0267375279, 0.38045457, 4.77456427, 11, 3, 10, 0.0267375279, 0.373053908, 5.18822002, 12, 3, 10, 0.0267375279, 0.365188122, 5.59202194, 13, 3, 10, 0.0267375279, 0.356897742, 5.98564005, 14, 3, 9, 0.0267375279, 0.34869957, 6.36883163, 15, 3, 9, 0.0267375279, 0.340241522, 6.74143791, 16, 3, 6, 0.0267375279, 0.332089454, 7.10337448, 17, 3, 6, 0.0267375279, 0.328292668, 7.45462418, 18, 3, 6, 0.0267375279, 0.336574793, 7.79523182, 19, 4, 3, 0.0356500372, 0.354600489, 8.17827797, 20, 4, 3, 0.0356500372, 0.364343345, 8.59994984, 21, 4, 3, 0.0356500372, 0.359369367, 9.00363636, 22, 4, 3, 0.0356500372, 0.347775847, 9.38988018, 23, 4, 3, 0.0356500372, 0.335562587, 9.7592926, 24, 4, 0, 0.0356500372, 0.326988578, 10.1125278, 25, 4, 0, 0.0356500372, 0.327966213, 10.4502735, 26, 5, 0, 0.0445625484, 0.334450752, 10.811614, 27, 5, 0, 0.0445625484, 0.335228145, 11.1935263, 28, 5, 0, 0.0445625484, 0.329595625, 11.5549288, 29, 5, 0, 0.0445625484, 0.326683223, 11.8971443, 30, 6, 0, 0.0534750558, 0.326986551, 12.2520256, 31, 6, 0, 0.0534750558, 0.325072199, 12.6173973, 32, 6, 0, 0.0534750558, 0.323560268, 12.9608269, 33, 7, 0, 0.062387567, 0.322494298, 13.3093863, 34, 7, 0, 0.062387567, 0.323403448, 13.6617231, 35, 8, 0, 0.0713000745, 0.323232353, 14.0134668, 36, 8, 0, 0.0713000745, 0.322662383, 14.3639784, 37, 9, 0, 0.0802125856, 0.324054241, 14.7098465, 38, 10, 0, 0.0891250968, 0.323228806, 15.0686541, 39, 10, 0, 0.0891250968, 0.320751846, 15.4191036, 40, 11, 0, 0.0980376005, 0.318823338, 15.7594051, 41, 12, 0, 0.106950112, 0.318418682, 16.104557, 42, 13, 0, 0.115862623, 0.318762124, 16.451416, 43, 14, 0, 0.124775134, 0.317806393, 16.7975388, 44, 15, 0, 0.133687645, 0.315653771, 17.1411018, 45, 16, 0, 0.142600149, 0.313369036, 17.4808159, 46, 17, 0, 0.151512653, 0.312513858, 17.8158207, 47, 19, 0, 0.169337675, 0.312785119, 18.1543369, 48, 20, 0, 0.178250194, 0.31343773, 18.4948578, 49, 22, 0, 0.196075201, 0.313258767, 18.8350143, 50, 23, 0, 0.20498772, 0.312570423, 19.1740704, 51, 25, 0, 0.222812727, 0.312572777, 19.5104179, 52, 27, 0, 0.240637749, 0.313047856, 19.8497677, 53, 29, 0, 0.515701056, 0.315029174, 20.1900635, 54, 31, 0, 0.551266611, 0.330613613, 20.5294952, 55, 33, 0, 0.586832225, 0.41819948, 20.8664398, 48000.0, 37, 0, 1, 4.532, 1.000, -8.240, 0.000, 1, 1, 0.904, 0.989, -8.240, 1.875, 2, 1, 0.029, 0.989, -8.240, 3.750, 3, 1, 0.009, 0.981, -8.240, 5.438, 4, 1, 0.009, 0.985, -8.240, 6.857, 5, 1, 0.009, 0.984, -8.240, 8.109, 6, 1, 0.009, 0.980, -8.240, 9.237, 7, 1, 0.009, 0.968, -8.240, 10.202, 8, 1, 0.009, 0.954, -8.240, 11.083, 9, 1, 0.009, 0.929, -8.240, 11.865, 10, 1, 0.009, 0.906, -7.447, 12.554, 11, 1, 0.009, 0.883, -7.447, 13.195, 12, 1, 0.009, 0.844, -7.447, 13.781, 13, 1, 0.009, 0.792, -7.447, 14.309, 14, 1, 0.009, 0.747, -7.447, 14.803, 15, 1, 0.009, 0.689, -7.447, 15.250, 16, 1, 0.009, 0.644, -7.447, 15.667, 17, 1, 0.009, 0.592, -7.447, 16.068, 18, 1, 0.009, 0.553, -7.447, 16.409, 19, 2, 0.018, 0.850, -7.447, 17.045, 20, 2, 0.018, 0.811, -6.990, 17.607, 21, 2, 0.018, 0.736, -6.990, 18.097, 22, 2, 0.018, 0.665, -6.990, 18.528, 23, 2, 0.018, 0.610, -6.990, 18.931, 24, 2, 0.018, 0.544, -6.990, 19.295, 25, 2, 0.018, 0.528, -6.990, 19.636, 26, 3, 0.054, 0.621, -6.990, 20.038, 27, 3, 0.054, 0.673, -6.990, 20.486, 28, 3, 0.054, 0.635, -6.990, 20.900, 29, 4, 0.114, 0.626, -6.990, 21.306, 30, 4, 0.114, 0.636, -6.020, 21.722, 31, 5, 0.452, 0.615, -6.020, 22.128, 32, 5, 0.452, 0.579, -6.020, 22.513, 33, 5, 0.452, 0.551, -6.020, 22.877, 34, 7, 6.330, 0.552, -5.229, 23.241, 35, 7, 6.330, 0.559, -5.229, 23.616, 36, 11, 9.947, 0.528, -5.229, 23.974, 37, 17, 153.727, 0.479, -5.229, 24.313, 44100.0, 38, 0, 1, 4.532, 1.000, -8.240, 0.000, 1, 1, 0.904, 0.983, -8.240, 1.723, 2, 1, 0.029, 0.983, -8.240, 3.445, 3, 1, 0.009, 0.982, -8.240, 5.057, 4, 1, 0.009, 0.985, -8.240, 6.422, 5, 1, 0.009, 0.983, -8.240, 7.609, 6, 1, 0.009, 0.978, -8.240, 8.710, 7, 1, 0.009, 0.967, -8.240, 9.662, 8, 1, 0.009, 0.948, -8.240, 10.515, 9, 1, 0.009, 0.930, -8.240, 11.293, 10, 1, 0.009, 0.914, -7.447, 12.009, 11, 1, 0.009, 0.870, -7.447, 12.625, 12, 1, 0.009, 0.845, -7.447, 13.210, 13, 1, 0.009, 0.800, -7.447, 13.748, 14, 1, 0.009, 0.749, -7.447, 14.241, 15, 1, 0.009, 0.701, -7.447, 14.695, 16, 1, 0.009, 0.653, -7.447, 15.125, 17, 1, 0.009, 0.590, -7.447, 15.508, 18, 1, 0.009, 0.616, -7.447, 15.891, 19, 2, 0.018, 0.860, -7.447, 16.537, 20, 2, 0.018, 0.823, -6.990, 17.112, 21, 2, 0.018, 0.762, -6.990, 17.621, 22, 2, 0.018, 0.688, -6.990, 18.073, 23, 2, 0.018, 0.612, -6.990, 18.470, 24, 2, 0.018, 0.594, -6.990, 18.849, 25, 3, 0.027, 0.658, -6.990, 19.271, 26, 3, 0.027, 0.706, -6.990, 19.741, 27, 3, 0.054, 0.660, -6.990, 20.177, 28, 3, 0.054, 0.606, -6.990, 20.576, 29, 3, 0.054, 0.565, -6.990, 20.950, 30, 4, 0.114, 0.560, -6.020, 21.316, 31, 4, 0.114, 0.579, -6.020, 21.699, 32, 5, 0.452, 0.567, -6.020, 22.078, 33, 5, 0.452, 0.534, -6.020, 22.438, 34, 5, 0.452, 0.514, -5.229, 22.782, 35, 7, 6.330, 0.520, -5.229, 23.133, 36, 7, 6.330, 0.518, -5.229, 23.484, 37, 7, 6.330, 0.507, -5.229, 23.828, 38, 19, 171.813, 0.447, -4.559, 24.173, 32000.0, 41, 0, 1, 4.532, 1.000, -8.240, 0.000, 1, 1, 0.904, 0.985, -8.240, 1.250, 2, 1, 0.090, 0.983, -8.240, 2.500, 3, 1, 0.029, 0.983, -8.240, 3.750, 4, 1, 0.009, 0.981, -8.240, 4.909, 5, 1, 0.009, 0.975, -8.240, 5.958, 6, 1, 0.009, 0.959, -8.240, 6.857, 7, 1, 0.009, 0.944, -8.240, 7.700, 8, 1, 0.009, 0.933, -8.240, 8.500, 9, 1, 0.009, 0.920, -8.240, 9.237, 10, 1, 0.009, 0.892, -7.447, 9.895, 11, 1, 0.009, 0.863, -7.447, 10.500, 12, 1, 0.009, 0.839, -7.447, 11.083, 13, 1, 0.009, 0.786, -7.447, 11.604, 14, 1, 0.009, 0.755, -7.447, 12.107, 15, 1, 0.009, 0.698, -7.447, 12.554, 16, 1, 0.009, 0.673, -7.447, 13.000, 17, 1, 0.009, 0.605, -7.447, 13.391, 18, 1, 0.009, 0.629, -7.447, 13.781, 19, 2, 0.018, 0.883, -7.447, 14.474, 20, 2, 0.018, 0.858, -6.990, 15.096, 21, 2, 0.018, 0.829, -6.990, 15.667, 22, 2, 0.018, 0.767, -6.990, 16.177, 23, 2, 0.018, 0.705, -6.990, 16.636, 24, 2, 0.018, 0.637, -6.990, 17.057, 25, 2, 0.018, 0.564, -6.990, 17.429, 26, 2, 0.018, 0.550, -6.990, 17.786, 27, 3, 0.027, 0.603, -6.990, 18.177, 28, 3, 0.027, 0.635, -6.990, 18.597, 29, 3, 0.027, 0.592, -6.990, 18.994, 30, 3, 0.027, 0.533, -6.020, 19.352, 31, 3, 0.027, 0.518, -6.020, 19.693, 32, 4, 0.072, 0.568, -6.020, 20.066, 33, 4, 0.072, 0.594, -6.020, 20.462, 34, 4, 0.072, 0.568, -5.229, 20.841, 35, 5, 0.143, 0.536, -5.229, 21.201, 36, 5, 0.143, 0.522, -5.229, 21.549, 37, 6, 0.172, 0.542, -5.229, 21.911, 38, 7, 0.633, 0.539, -4.559, 22.275, 39, 7, 0.633, 0.519, -4.559, 22.625, 40, 8, 0.723, 0.514, -3.980, 22.971, 41, 10, 9.043, 0.518, -3.980, 23.321, 24000, 44, 0, 1, 8.91250896, 0.971850038, 0.150000006, 0, 1, 1, 8.91250896, 0.874727964, 0.150000006, 0.946573138, 2, 1, 0.891250908, 0.85779953, 0.150000006, 1.88476217, 3, 1, 0.0891250968, 0.839743853, 0.150000006, 2.8056457, 4, 1, 0.028183829, 0.82260257, 0.150000006, 3.70133615, 5, 1, 0.00891250931, 0.80018574, 0.150000006, 4.56532001, 6, 1, 0.00891250931, 0.771475196, 0.150000006, 5.39263105, 7, 1, 0.00891250931, 0.737389982, 0.150000006, 6.17986727, 8, 1, 0.00891250931, 0.701111019, 0.150000006, 6.92507982, 9, 1, 0.00891250931, 0.65977633, 0.150000006, 7.62757969, 10, 1, 0.00891250931, 0.615037441, 0.150000006, 8.28770351, 11, 1, 0.00891250931, 0.568658054, 0.150000006, 8.90657234, 12, 1, 0.00891250931, 0.522260666, 0.180000007, 9.48587132, 13, 1, 0.00891250931, 0.478903115, 0.180000007, 10.0276566, 14, 1, 0.00891250931, 0.43808648, 0.180000007, 10.5341988, 15, 1, 0.00891250931, 0.412505627, 0.180000007, 11.0078659, 16, 1, 0.00891250931, 0.39070797, 0.180000007, 11.4510288, 17, 1, 0.00891250931, 0.371887118, 0.180000007, 11.866004, 18, 1, 0.00891250931, 0.367617637, 0.180000007, 12.2550087, 19, 1, 0.00891250931, 0.422220588, 0.180000007, 12.6201363, 20, 2, 0.0178250186, 0.564990044, 0.180000007, 13.2772083, 21, 2, 0.0178250186, 0.519700944, 0.180000007, 13.871047, 22, 2, 0.0178250186, 0.455360681, 0.200000003, 14.4024391, 23, 2, 0.0178250186, 0.408867925, 0.200000003, 14.8811684, 24, 2, 0.0178250186, 0.381538749, 0.200000003, 15.3153324, 25, 2, 0.0178250186, 0.362357527, 0.200000003, 15.7116165, 26, 2, 0.0178250186, 0.365735918, 0.200000003, 16.0755405, 27, 3, 0.0267375279, 0.38064, 0.200000003, 16.4882088, 28, 3, 0.0267375279, 0.379183382, 0.200000003, 16.9410992, 29, 3, 0.0267375279, 0.360672712, 0.200000003, 17.3513336, 30, 3, 0.0267375279, 0.343065977, 0.200000003, 17.7264423, 31, 3, 0.0267375279, 0.339290261, 0.200000003, 18.0722466, 32, 4, 0.0356500372, 0.342963994, 0.200000003, 18.4426575, 33, 4, 0.0356500372, 0.343128443, 0.200000003, 18.8344078, 34, 4, 0.0356500372, 0.343988508, 0.25, 19.1955795, 35, 5, 0.0445625484, 0.343928397, 0.25, 19.5697021, 36, 5, 0.0445625484, 0.339527696, 0.25, 19.9551182, 37, 5, 0.0889139697, 0.336541563, 0.280000001, 20.3115921, 38, 6, 0.106696762, 0.334955156, 0.280000001, 20.6737747, 39, 6, 0.169102982, 0.335601568, 0.300000012, 21.0404968, 40, 7, 0.1972868, 0.334716886, 0.300000012, 21.4060211, 41, 7, 0.1972868, 0.331676662, 0.300000012, 21.7696877, 42, 8, 0.713000774, 0.328550965, 0.400000006, 22.1267223, 43, 8, 0.713000774, 0.339241952, 0.400000006, 22.4769249, 44, 9, 0.802125871, 0.425207615, 0.400000006, 22.8164864, 22050, 44, 0, 1, 8.91250896, 0.954045713, 0.150000006, 0, 1, 1, 8.91250896, 0.833381653, 0.150000006, 0.869851649, 2, 1, 0.891250908, 0.815945923, 0.150000006, 1.73325908, 3, 1, 0.0891250968, 0.794244766, 0.150000006, 2.58322191, 4, 1, 0.028183829, 0.776486695, 0.150000006, 3.4134295, 5, 1, 0.00891250931, 0.755260408, 0.150000006, 4.21850443, 6, 1, 0.00891250931, 0.731070817, 0.150000006, 4.99414825, 7, 1, 0.00891250931, 0.701775849, 0.150000006, 5.73718691, 8, 1, 0.00891250931, 0.667876124, 0.150000006, 6.44553185, 9, 1, 0.00891250931, 0.630284071, 0.150000006, 7.11807632, 10, 1, 0.00891250931, 0.590170324, 0.150000006, 7.75455618, 11, 1, 0.00891250931, 0.548788548, 0.150000006, 8.3553915, 12, 1, 0.00891250931, 0.507795513, 0.150000006, 8.92152882, 13, 1, 0.00891250931, 0.469515711, 0.180000007, 9.45430183, 14, 1, 0.00891250931, 0.432291716, 0.180000007, 9.95530319, 15, 1, 0.00891250931, 0.411131173, 0.180000007, 10.4262848, 16, 1, 0.00891250931, 0.390771538, 0.180000007, 10.8690758, 17, 1, 0.00891250931, 0.373318017, 0.180000007, 11.2855215, 18, 1, 0.00891250931, 0.36956048, 0.180000007, 11.6774378, 19, 1, 0.00891250931, 0.42595759, 0.180000007, 12.0465794, 20, 2, 0.0178250186, 0.576900065, 0.180000007, 12.7141209, 21, 2, 0.0178250186, 0.533114731, 0.180000007, 13.3197365, 22, 2, 0.0178250186, 0.469967514, 0.180000007, 13.8634901, 23, 2, 0.0178250186, 0.417268544, 0.200000003, 14.3544445, 24, 2, 0.0178250186, 0.389299124, 0.200000003, 14.8002586, 25, 2, 0.0178250186, 0.362824857, 0.200000003, 15.2073727, 26, 2, 0.0178250186, 0.346801281, 0.200000003, 15.5811834, 27, 2, 0.0178250186, 0.349400043, 0.200000003, 15.926218, 28, 3, 0.0267375279, 0.364026934, 0.200000003, 16.3194923, 29, 3, 0.0267375279, 0.36560446, 0.200000003, 16.752903, 30, 3, 0.0267375279, 0.354275256, 0.200000003, 17.1470814, 31, 3, 0.0267375279, 0.351219416, 0.200000003, 17.5086212, 32, 4, 0.0356500372, 0.354364097, 0.200000003, 17.8938141, 33, 4, 0.0356500372, 0.348915905, 0.200000003, 18.2992878, 34, 4, 0.0356500372, 0.337649345, 0.200000003, 18.6713982, 35, 4, 0.0356500372, 0.332076877, 0.25, 19.015646, 36, 5, 0.0445625484, 0.330793113, 0.25, 19.3734016, 37, 5, 0.0445625484, 0.327528268, 0.25, 19.7430382, 38, 5, 0.0889139697, 0.32551071, 0.280000001, 20.0859604, 39, 6, 0.106696762, 0.324436843, 0.280000001, 20.4354992, 40, 6, 0.106696762, 0.325835049, 0.280000001, 20.7905579, 41, 7, 0.1972868, 0.326221824, 0.300000012, 21.1458054, 42, 7, 0.1972868, 0.325960994, 0.300000012, 21.5005951, 43, 8, 0.225470632, 0.339019388, 0.300000012, 21.8504524, 44, 8, 0.713000774, 0.426850349, 0.400000006, 22.1951065, 16000, 45, 0, 1, 8.91250896, 0.834739447, 0.150000006, 0, 1, 1, 8.91250896, 0.623757005, 0.150000006, 0.631518543, 2, 1, 0.891250908, 0.60420388, 0.150000006, 1.2606914, 3, 1, 0.891250908, 0.591974258, 0.150000006, 1.88476217, 4, 1, 0.0891250968, 0.575301588, 0.150000006, 2.50111985, 5, 1, 0.028183829, 0.561547697, 0.150000006, 3.1073606, 6, 1, 0.028183829, 0.546665847, 0.150000006, 3.70133615, 7, 1, 0.00891250931, 0.52986443, 0.150000006, 4.28118753, 8, 1, 0.00891250931, 0.511183441, 0.150000006, 4.84536505, 9, 1, 0.00891250931, 0.490902334, 0.150000006, 5.39263105, 10, 1, 0.00891250931, 0.46938166, 0.150000006, 5.92205667, 11, 1, 0.00891250931, 0.447003782, 0.150000006, 6.43299866, 12, 1, 0.00891250931, 0.428170592, 0.150000006, 6.92507982, 13, 1, 0.00891250931, 0.414536625, 0.150000006, 7.39815664, 14, 1, 0.00891250931, 0.401033074, 0.150000006, 7.85228777, 15, 1, 0.00891250931, 0.38779071, 0.150000006, 8.28770351, 16, 1, 0.00891250931, 0.374230444, 0.150000006, 8.704772, 17, 1, 0.00891250931, 0.360547513, 0.180000007, 9.10397339, 18, 1, 0.00891250931, 0.348256677, 0.180000007, 9.48587132, 19, 1, 0.00891250931, 0.350327015, 0.180000007, 9.85109234, 20, 1, 0.00891250931, 0.406330824, 0.180000007, 10.200304, 21, 2, 0.0178250186, 0.554098248, 0.180000007, 10.846529, 22, 2, 0.0178250186, 0.528312504, 0.180000007, 11.4447651, 23, 2, 0.0178250186, 0.476527005, 0.180000007, 11.9928398, 24, 2, 0.0178250186, 0.428205669, 0.180000007, 12.495945, 25, 2, 0.0178250186, 0.402271926, 0.180000007, 12.9588718, 26, 2, 0.0178250186, 0.378024429, 0.180000007, 13.3859692, 27, 2, 0.0178250186, 0.36254698, 0.180000007, 13.7811394, 28, 2, 0.0178250186, 0.368058592, 0.200000003, 14.1478529, 29, 3, 0.0267375279, 0.385963261, 0.200000003, 14.5674343, 30, 3, 0.0267375279, 0.38640517, 0.200000003, 15.0304852, 31, 3, 0.0267375279, 0.367834061, 0.200000003, 15.4513416, 32, 3, 0.0267375279, 0.349686563, 0.200000003, 15.836277, 33, 3, 0.0267375279, 0.345709383, 0.200000003, 16.1904697, 34, 4, 0.0356500372, 0.34871915, 0.200000003, 16.5683517, 35, 4, 0.0356500372, 0.347054332, 0.200000003, 16.9660263, 36, 4, 0.0356500372, 0.346329987, 0.200000003, 17.3304482, 37, 5, 0.0445625484, 0.344658494, 0.200000003, 17.7055588, 38, 5, 0.0445625484, 0.338779271, 0.200000003, 18.0899811, 39, 5, 0.0445625484, 0.334878683, 0.200000003, 18.4440536, 40, 6, 0.0534750558, 0.332811534, 0.200000003, 18.8030052, 41, 6, 0.0534750558, 0.333717585, 0.25, 19.1665268, 42, 7, 0.062387567, 0.333986402, 0.25, 19.5299358, 43, 7, 0.062387567, 0.334142625, 0.25, 19.8934898, 44, 8, 0.142262354, 0.34677428, 0.280000001, 20.2535706, 45, 8, 0.142262354, 0.436254472, 0.280000001, 20.610569, 48000.0, 20, 0, 3, 0, 4, 1.000, 0.056, 1, 3, 4, 7, 0.944, 0.611, 2, 4, 7, 11, 0.389, 0.167, 3, 3, 11, 14, 0.833, 0.722, 4, 3, 14, 17, 0.278, 0.639, 5, 2, 17, 19, 0.361, 0.417, 6, 3, 19, 22, 0.583, 0.083, 7, 2, 22, 24, 0.917, 0.750, 8, 3, 24, 27, 0.250, 0.417, 9, 3, 27, 30, 0.583, 0.648, 10, 3, 30, 33, 0.352, 0.611, 11, 3, 33, 36, 0.389, 0.625, 12, 4, 36, 40, 0.375, 0.144, 13, 3, 40, 43, 0.856, 0.389, 14, 3, 43, 46, 0.611, 0.160, 15, 3, 46, 49, 0.840, 0.217, 16, 3, 49, 52, 0.783, 0.184, 17, 2, 52, 54, 0.816, 0.886, 18, 3, 54, 57, 0.114, 0.313, 19, 2, 57, 59, 0.687, 0.452, 20, 1, 59, 60, 0.548, 0.908, 44100.0, 20, 0, 3, 0, 4, 1.000, 0.056, 1, 3, 4, 7, 0.944, 0.611, 2, 4, 7, 11, 0.389, 0.167, 3, 3, 11, 14, 0.833, 0.722, 4, 3, 14, 17, 0.278, 0.139, 5, 1, 17, 18, 0.861, 0.917, 6, 3, 18, 21, 0.083, 0.583, 7, 3, 21, 24, 0.417, 0.250, 8, 3, 24, 27, 0.750, 0.805, 9, 3, 27, 30, 0.194, 0.574, 10, 3, 30, 33, 0.426, 0.537, 11, 3, 33, 36, 0.463, 0.819, 12, 4, 36, 40, 0.180, 0.100, 13, 3, 40, 43, 0.900, 0.468, 14, 3, 43, 46, 0.532, 0.623, 15, 3, 46, 49, 0.376, 0.450, 16, 3, 49, 52, 0.550, 0.552, 17, 3, 52, 55, 0.448, 0.403, 18, 2, 55, 57, 0.597, 0.643, 19, 2, 57, 59, 0.357, 0.722, 20, 2, 59, 61, 0.278, 0.960, 32000, 20, 0, 1, 0, 2, 1.000, 0.528, 1, 2, 2, 4, 0.472, 0.305, 2, 2, 4, 6, 0.694, 0.083, 3, 1, 6, 7, 0.917, 0.861, 4, 2, 7, 9, 0.139, 0.639, 5, 2, 9, 11, 0.361, 0.417, 6, 3, 11, 14, 0.583, 0.083, 7, 2, 14, 16, 0.917, 0.750, 8, 3, 16, 19, 0.250, 0.870, 9, 3, 19, 22, 0.130, 0.833, 10, 4, 22, 26, 0.167, 0.389, 11, 4, 26, 30, 0.611, 0.478, 12, 4, 30, 34, 0.522, 0.033, 13, 3, 34, 37, 0.967, 0.917, 14, 4, 37, 41, 0.083, 0.617, 15, 3, 41, 44, 0.383, 0.995, 16, 4, 44, 48, 0.005, 0.274, 17, 3, 48, 51, 0.726, 0.480, 18, 3, 51, 54, 0.519, 0.261, 19, 2, 54, 56, 0.739, 0.884, 20, 2, 56, 58, 0.116, 1.000, 24000, 20, 0, 2, 0, 3, 1, 0.916666746, 1, 3, 3, 6, 0.0833332539, 0.583333492, 2, 3, 6, 9, 0.416666508, 0.25, 3, 2, 9, 11, 0.75, 0.916666985, 4, 3, 11, 14, 0.0833330154, 0.583333969, 5, 3, 14, 17, 0.416666031, 0.25, 6, 3, 17, 20, 0.75, 0.537036896, 7, 3, 20, 23, 0.462963104, 0.5, 8, 4, 23, 27, 0.5, 0.0555559993, 9, 3, 27, 30, 0.944444001, 0.402778625, 10, 3, 30, 33, 0.597221375, 0.766667187, 11, 3, 33, 36, 0.233332828, 0.805555999, 12, 3, 36, 39, 0.194444016, 0.769841909, 13, 3, 39, 42, 0.23015812, 0.611111104, 14, 3, 42, 45, 0.388888896, 0.449494779, 15, 3, 45, 48, 0.550505221, 0.194444954, 16, 2, 48, 50, 0.805555046, 0.913194656, 17, 3, 50, 53, 0.0868053436, 0.580555737, 18, 3, 53, 56, 0.419444263, 0.113426208, 19, 2, 56, 58, 0.886573792, 0.533730626, 20, 2, 58, 60, 0.466269344, 0.691176474, 22050, 20, 0, 2, 0, 3, 1, 0.916666746, 1, 3, 3, 6, 0.0833332539, 0.583333492, 2, 3, 6, 9, 0.416666508, 0.25, 3, 2, 9, 11, 0.75, 0.916666985, 4, 3, 11, 14, 0.0833330154, 0.583333969, 5, 3, 14, 17, 0.416666031, 0.25, 6, 3, 17, 20, 0.75, 0.203703582, 7, 3, 20, 23, 0.796296418, 0.166666687, 8, 3, 23, 26, 0.833333313, 0.722222686, 9, 4, 26, 30, 0.277777344, 0.152778625, 10, 3, 30, 33, 0.847221375, 0.566667199, 11, 3, 33, 36, 0.433332831, 0.93518573, 12, 4, 36, 40, 0.0648142472, 0.118056297, 13, 3, 40, 43, 0.881943703, 0.0925937295, 14, 2, 43, 45, 0.907406271, 0.934344172, 15, 3, 45, 48, 0.0656557977, 0.575398028, 16, 3, 48, 51, 0.424601972, 0.232026935, 17, 2, 51, 53, 0.767973065, 0.758334339, 18, 3, 53, 56, 0.241665646, 0.187501252, 19, 2, 56, 58, 0.812498748, 0.533731699, 20, 2, 58, 60, 0.466268271, 0.257577598, 16000, 20, 0, 1, 0, 2, 1, 0.944444478, 1, 2, 2, 4, 0.0555555038, 0.722222328, 2, 2, 4, 6, 0.277777672, 0.5, 3, 2, 6, 8, 0.5, 0.27777797, 4, 2, 8, 10, 0.72222203, 0.0555559993, 5, 1, 10, 11, 0.944444001, 0.833333313, 6, 3, 11, 14, 0.166666672, 0.203703582, 7, 3, 14, 17, 0.796296418, 0.166666687, 8, 3, 17, 20, 0.833333313, 0.54166698, 9, 3, 20, 23, 0.458333015, 0.652778625, 10, 4, 23, 27, 0.347221375, 0.166667163, 11, 3, 27, 30, 0.833332837, 0.722222924, 12, 4, 30, 34, 0.277777106, 0.277778625, 13, 3, 34, 37, 0.722221375, 0.604167938, 14, 3, 37, 40, 0.395832062, 0.627778649, 15, 3, 40, 43, 0.37222138, 0.542736351, 16, 3, 43, 46, 0.457263649, 0.371528625, 17, 3, 46, 49, 0.628471375, 0.00833433867, 18, 2, 49, 51, 0.991665661, 0.500001311, 19, 2, 51, 53, 0.499998659, 0.886832893, 20, 2, 53, 55, 0.113167092, 0.629034221, 48000.0, 11, 0, 2, 0, 2, 1.000, 0.167, 1, 2, 3, 5, 0.833, 0.833, 2, 3, 5, 8, 0.167, 0.500, 3, 3, 8, 11, 0.500, 0.167, 4, 4, 11, 15, 0.833, 0.167, 5, 4, 15, 19, 0.833, 0.583, 6, 3, 19, 22, 0.417, 0.917, 7, 4, 22, 26, 0.083, 0.944, 8, 4, 26, 30, 0.055, 0.042, 9, 2, 30, 32, 0.958, 0.567, 10, 3, 32, 35, 0.433, 0.167, 11, 2, 35, 37, 0.833, 0.618, 44100.0, 11, 0, 2, 0, 2, 1.000, 0.167, 1, 2, 3, 5, 0.833, 0.833, 2, 3, 5, 8, 0.167, 0.500, 3, 3, 8, 11, 0.500, 0.167, 4, 4, 11, 15, 0.833, 0.167, 5, 5, 15, 20, 0.833, 0.250, 6, 3, 20, 23, 0.750, 0.583, 7, 4, 23, 27, 0.417, 0.055, 8, 3, 27, 30, 0.944, 0.375, 9, 3, 30, 33, 0.625, 0.300, 10, 3, 33, 36, 0.700, 0.167, 11, 2, 36, 38, 0.833, 1.000, 32000, 11, 0, 2, 0, 2, 1.000, 0.167, 1, 2, 3, 5, 0.833, 0.833, 2, 3, 5, 8, 0.167, 0.500, 3, 3, 8, 11, 0.500, 0.167, 4, 4, 11, 15, 0.833, 0.167, 5, 5, 15, 20, 0.833, 0.250, 6, 4, 20, 24, 0.750, 0.250, 7, 5, 24, 29, 0.750, 0.055, 8, 4, 29, 33, 0.944, 0.375, 9, 4, 33, 37, 0.625, 0.472, 10, 3, 37, 40, 0.528, 0.937, 11, 1, 40, 41, 0.062, 1.000, 24000, 11, 0, 3, 0, 4, 1, 0.166666746, 1, 2, 4, 6, 0.833333254, 0.833333492, 2, 3, 6, 9, 0.166666508, 0.5, 3, 4, 9, 13, 0.5, 0.5, 4, 5, 13, 18, 0.5, 0.833333969, 5, 5, 18, 23, 0.166666031, 0.25, 6, 4, 23, 27, 0.75, 0.25, 7, 3, 27, 30, 0.75, 0.611111999, 8, 4, 30, 34, 0.388888031, 0.208333969, 9, 3, 34, 37, 0.791666031, 0.766667187, 10, 4, 37, 41, 0.233332828, 0.45238167, 11, 4, 41, 45, 0.54761833, 0.277778625, 22050, 11, 0, 3, 0, 4, 1, 0.166666746, 1, 2, 4, 6, 0.833333254, 0.833333492, 2, 3, 6, 9, 0.166666508, 0.5, 3, 4, 9, 13, 0.5, 0.5, 4, 4, 13, 17, 0.5, 0.5, 5, 4, 17, 21, 0.5, 0.916666985, 6, 4, 21, 25, 0.0833330154, 0.25, 7, 4, 25, 29, 0.75, 0.611111999, 8, 4, 29, 33, 0.388888031, 0.458333969, 9, 4, 33, 37, 0.541666031, 0.633334339, 10, 4, 37, 41, 0.366665661, 0.583334565, 11, 4, 41, 45, 0.416665405, 0.437500954, 16000, 11, 0, 0, 0, 4, 1, 0.166666746, 1, 0, 4, 6, 0.833333254, 0.833333492, 2, 0, 6, 9, 0.166666508, 0.5, 3, 0, 9, 13, 0.5, 0.5, 4, 0, 13, 18, 0.5, 0.833333969, 5, 0, 18, 23, 0.166666031, 0.75, 6, 0, 23, 27, 0.25, 0.75, 7, 0, 27, 31, 0.25, 0.611111999, 8, 0, 31, 35, 0.388888031, 0.458333969, 9, 0, 35, 39, 0.541666031, 0.166667163, 10, 0, 39, 42, 0.833332837, 0.805555999, 11, 0, 42, 46, 0.194444016, 0.4375}; gogo239b/vbrtag.c100644 23421 144 25662 7220537347 13023 0ustar shigeousers/* * for new GOGO-no-coda (1999/10/7) * modified by shigeo */ /* * Version numbering for LAME. * * Copyright (c) 1999 A.L. Faber * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include "vbrtag.h" #include "musenc.h" #include "bitstrem.h" static int SizeOfEmptyFrame[2][2]= { {32,17}, {17,9}, }; static BYTE pbtStreamBuffer[216]; static long g_Position[NUMTOCENTRIES]; static int nZeroStreamSize=0; static int TotalFrameSize=0; static char VBRTag[]={"Xing"}; static int* pVbrFrames=NULL; static int nVbrNumFrames=0; static int nVbrFrameBufferSize=0; /**************************************************************************** * AddVbrFrame: Add VBR entry, used to fill the VBR the TOC entries * Paramters: * nStreamPos: how many bytes did we write to the bitstream so far * (in Bytes NOT Bits) **************************************************************************** */ void AddVbrFrame(int nStreamPos) { // Simple exponential growing buffer if (pVbrFrames==NULL || nVbrFrameBufferSize==0) { // Start with 100 frames nVbrFrameBufferSize=100; // Allocate them pVbrFrames=(int*)malloc(nVbrFrameBufferSize*sizeof(int)); } // Is buffer big enough to store this new frame if (nVbrNumFrames==nVbrFrameBufferSize) { // Guess not, double th e buffer size nVbrFrameBufferSize*=2; // Allocate new buffer pVbrFrames=(int*)realloc(pVbrFrames,nVbrFrameBufferSize*sizeof(int)); } // Store values pVbrFrames[nVbrNumFrames++]=nStreamPos; } /*-------------------------------------------------------------*/ static int ExtractI4(unsigned char *buf) { int x; // big endian extract x = buf[0]; x <<= 8; x |= buf[1]; x <<= 8; x |= buf[2]; x <<= 8; x |= buf[3]; return x; } static void CreateI4(unsigned char *buf, int nValue) { // big endian create buf[0]=(nValue>>24)&0xff; buf[1]=(nValue>>16)&0xff; buf[2]=(nValue>> 8)&0xff; buf[3]=(nValue )&0xff; } /**************************************************************************** * InitVbrTag: Initializes the header, and write empty frame to stream * Paramters: * fpStream: pointer to output file stream * nVersion: 0= MPEG1 1=MPEG2 * nMode : Channel Mode: 0=STEREO 1=JS 2=DS 3=MONO **************************************************************************** */ int InitVbrTag(int nVersion, int nMode, int SampIndex) { int i; // Clear Frame position array variables pVbrFrames=NULL; nVbrNumFrames=0; nVbrFrameBufferSize=0; // Clear struct memset(g_Position,0x00,sizeof(g_Position)); // Clear stream buffer memset(pbtStreamBuffer,0x00,sizeof(pbtStreamBuffer)); // Set TOC values to 255 for (i=0;i=NUMTOCENTRIES ) nPercent=NUMTOCENTRIES-1; if (fRelStreamPos>255) fRelStreamPos=255; // Assign toc entry value btToc[nPercent]=(BYTE)fRelStreamPos; } // Fix up empty fields (if we have less than 100 frames) for (i=1;i=NUMTOCENTRIES ) nPercent=NUMTOCENTRIES-1; if (fRelStreamPos>255) fRelStreamPos=255; // Assign toc entry value btToc[nPercent]=(BYTE)fRelStreamPos; } // Fix up empty fields (if we have less than 100 frames) for (i=1;i #include #include #include #include "common.h" #include "global.h" #include "readsmpl.h" #include "musenc.h" /* #define _1SHL32 ( (double)(1UL<<31) * 2.0 ) */ #define _1SHL32 4294967296.0 #define SAMPLE_LENGTH 2304 #define SAMPLE_TAKEBACK 8 #define USE_FLOATING struct _SAMPLE_CONVERTER { unsigned long pitch_lo, pitch_hi; unsigned long pos_lo, pos_hi; unsigned long pcmreadpos; unsigned long fill_len; int bFirstAttach; int bHitEof; short sample_org[ SAMPLE_LENGTH + SAMPLE_TAKEBACK]; char bPausedRead; unsigned long pcmdecodepos; short sample_decode[ SAMPLE_LENGTH ]; } samplecnverter; extern struct MCP_INPDEV_USERFUNC mc_userfunc; // extern/ユーザー関数設定 extern unsigned long read_limitsize; int InitializeSampleConverter( int freq_in, int freq_out ) { double pitch_tmp; if( freq_in <= 0 || freq_out <= 0){ return FALSE; } memset( &samplecnverter, 0, sizeof( samplecnverter ) ); if(freq_in == freq_out ){ /* freqin == freqoutのときはコンバーターを通さないけど一応計算しておく */ samplecnverter.pitch_hi = 1; samplecnverter.pitch_lo = 0; } else { samplecnverter.pitch_hi = freq_in / freq_out; if( freq_in >= freq_out ) freq_in %= freq_out; pitch_tmp = (double)freq_in * _1SHL32 / (double)freq_out; samplecnverter.pitch_lo = (unsigned long)pitch_tmp; } samplecnverter.pcmreadpos = - SAMPLE_TAKEBACK - SAMPLE_LENGTH; samplecnverter.bFirstAttach = TRUE; samplecnverter.bPausedRead = FALSE; return TRUE; } /* wait for realtime-encoding by zin@jaist.ac.jp (00/02/22) */ static INLINE size_t fread_nitems( void *buf, size_t size, size_t nitems, FILE *stream) { size_t nread; nitems *= size; if( read_limitsize == ULONG_MAX ) { return fread( buf, 1, nitems, stream) / size; } else { nread = 0; if( read_limitsize < nitems ) nitems = read_limitsize; if( nitems > 0 ){ nread = fread( buf, 1, nitems , stream); if( nread > 0 ) read_limitsize -= nread; } else { nread = 0; } return nread / size; } } #ifdef BENCH_ONLY int initBenchFlag; /* exported to musenc.c */ static int enc_testtime = 10; static unsigned int seed = 0; static int GENRAND() { seed = seed * 0x32842851 + 12398321; return seed & INT_MAX; } /* ----------------------------------------------------------------------- */ #define MAX_CHANNEL 16 static short test_sample[MAX_CHANNEL][2304]; static MERET enctest_inputfunc(void *buf, unsigned long nLength ) { // static int firstcall = 1; static int nRestFrame; if(initBenchFlag){ int i, j, nMax; // firstcall = 0; initBenchFlag = 0; seed = 0; for(i = 0;i < MAX_CHANNEL; i ++ ){ nMax = 0x4000 + 0x6000 * i / MAX_CHANNEL; for(j = 0;j < 2304;j++){ test_sample[i][j] = (GENRAND() % nMax) - nMax/2 ; } } nRestFrame = (int)(mc_userfunc.nSize / 4608.0); // 残りフレーム数 } if( 0 < nRestFrame-- ){ memcpy( buf, test_sample[ GENRAND() % MAX_CHANNEL ], nLength ); return ME_NOERR; } return ME_EMPTYSTREAM; } #endif /* BENCH_ONLY */ static SAMPLES_T read_samples_sub( FILE *musicin, short *sample_buffer, unsigned long *frame_size) { unsigned long samples_read; samples_read = *frame_size; #ifdef BENCH_ONLY mc_userfunc.pUserFunc = enctest_inputfunc; #endif /* BENCH_ONLY */ if( mc_userfunc.pUserFunc == MPGE_NULL_FUNC ){ if( !bBitConvert ){ // 16BIT PCM samples_read = fread_nitems(sample_buffer, sizeof(short), (int)samples_read, musicin); #ifdef RAW_INPUT if( bSwapByte == TRUE ){ int i; char low, high; for( i = 0; i < samples_read; i++ ){ low = sample_buffer[i] & 0xFF; high = (unsigned)sample_buffer[i] >> 8; sample_buffer[i] = high + ( low << 8 ); } } #endif /* RAW_INPUT */ } else { // 8BIT PCM int i; unsigned char org_buffer[4096]; if ((samples_read = fread_nitems(org_buffer, sizeof(char), (int)samples_read, musicin)) == 0){ // HIT END OF DATA // } // 8BIT to 16BIT #ifdef RAW_INPUT if( bTownsSND ){ for( i = 0; i < samples_read; i++ ){ char data; data = org_buffer[i]; if( data & 0x80 ){ sample_buffer[i] = ((short)( data - 128 )) << 8; }else{ sample_buffer[i] = ((short)( - data )) << 8; } } }else #endif /* RAW_INPUT */ for(i = 0;i < (signed)samples_read;i++){ sample_buffer[i] = (org_buffer[i] - 128) << 8; } } } else { // ユーザー関数ベース // ここで特殊なエラーコードを処理する必要有り if( !bBitConvert ){ // 16BIT PCM MERET rval; memset( sample_buffer, 0, (int)samples_read * 2 ); rval = mc_userfunc.pUserFunc( sample_buffer, (int)samples_read * 2); if ( rval == ME_NOERR ){ /// 読み込み成功の場合には何もしない } else if( rval == ME_MOREDATA ){ /// 次回に読み込みをたくす return SAMPLES_PAUSED; } else { samples_read = 0; } } else { // 8BIT PCM int i; MERET rval; unsigned char org_buffer[4096]; memset( org_buffer, 0, (int)samples_read ); rval = mc_userfunc.pUserFunc( org_buffer, (int)samples_read ); if ( rval == ME_NOERR ){ /// 読み込み成功の場合には何もしない } else if( rval == ME_MOREDATA ) { /// 次回に読み込みをたくす return SAMPLES_PAUSED; } else { samples_read = 0; } // 8BIT to 16BIT for(i = 0;i < (signed)samples_read;i++) sample_buffer[i] = (org_buffer[i] - 128) << 8; } } if( samples_read < *frame_size ){ int clr = samples_read; for (; clr < (signed)*frame_size; sample_buffer[clr++] = 0); } *frame_size = samples_read; return (samples_read == 0) ? SAMPLES_FAIL : SAMPLES_READ; } static SAMPLES_T getsample(unsigned long pos, FILE *musicin, int *sample ) { assert( pos - samplecnverter.pcmreadpos >= 0 ); if( (int)pos >= (int)(samplecnverter.pcmreadpos + samplecnverter.fill_len) ){ unsigned long readsamplenum; SAMPLES_T rval; // もうデータの末端に到達している場合 if( samplecnverter.bHitEof ) { *sample = 0; return SAMPLES_HITEND; // これ以降データが無い } // バッファの最後の部分を頭に持ってくる memcpy( &samplecnverter.sample_org[0], &samplecnverter.sample_org[SAMPLE_LENGTH ], sizeof( short ) * SAMPLE_TAKEBACK ); // それ以降のデータをfillする readsamplenum = SAMPLE_LENGTH; rval = read_samples_sub( musicin, &samplecnverter.sample_org[SAMPLE_TAKEBACK], &readsamplenum ); if( rval == SAMPLES_PAUSED ) return rval; // assert( readsamplenum == SAMPLE_LENGTH ); if( readsamplenum != SAMPLE_LENGTH ){ samplecnverter.bHitEof = TRUE; } // データ要求位置のリセット samplecnverter.pcmreadpos += readsamplenum; samplecnverter.fill_len = SAMPLE_TAKEBACK + readsamplenum; return getsample( pos, musicin, sample ); // 再帰 } assert( pos < samplecnverter.pcmreadpos + samplecnverter.fill_len ); *sample = (signed int )(samplecnverter.sample_org[ pos - samplecnverter.pcmreadpos]); return SAMPLES_READ; } static SAMPLES_T read_samples( FILE *musicin, short sample_buffer[2304], unsigned long frame_size, int chn ) { int i; if( gl.enc_freqHz == gl.inp_freqHz ){ // そのままスルーする return read_samples_sub( musicin, sample_buffer, &frame_size ); } else { if( samplecnverter.bHitEof && (samplecnverter.pos_hi * 2) >= samplecnverter.pcmreadpos + samplecnverter.fill_len ){ memset( sample_buffer, 0, frame_size ); return SAMPLES_HITEND; // 読み込みできない状態 } if( chn == 1 ){ // MONO SAMPLES_T rval = SAMPLES_READ; i = 0; if( samplecnverter.bPausedRead ){ int n; i = samplecnverter.pcmdecodepos; for(n = 0;n < i;n ++){ sample_buffer[n] = samplecnverter.sample_decode[n]; } samplecnverter.bPausedRead = FALSE; } for(;i < (signed)frame_size;i++){ int s1, s2; int pts; rval = getsample( samplecnverter.pos_hi, musicin, &s1 ); if( SAMPLES_READ != rval ) break; if( samplecnverter.pos_lo == 0 ){ sample_buffer[ i ] = s1 ; } else { pts = samplecnverter.pos_lo >> 17; rval = getsample( samplecnverter.pos_hi + 1, musicin, &s2 ); if( SAMPLES_READ != rval ) break; assert( pts >= 0 && pts < 0x8000 ); sample_buffer[ i ] = (s1 * ( 0x8000 - pts ) + s2 * pts) >> 15; } { unsigned long org_lo; org_lo = samplecnverter.pos_lo; samplecnverter.pos_lo += samplecnverter.pitch_lo; if( samplecnverter.pos_lo < org_lo ){ samplecnverter.pos_hi += samplecnverter.pitch_hi + 1; } else { samplecnverter.pos_hi +=samplecnverter.pitch_hi; } } } if( rval != SAMPLES_READ ){ int n; if( rval == SAMPLES_PAUSED ){ samplecnverter.bPausedRead = TRUE; samplecnverter.pcmdecodepos = i; for(n = 0;n < i;n++){ samplecnverter.sample_decode[n] = sample_buffer[n]; } } else { for(n = i;n < frame_size;n++){ samplecnverter.sample_decode[n] = 0; } } } return rval; } else { // STEREO SAMPLES_T rval = SAMPLES_READ; i = 0; if( samplecnverter.bPausedRead ){ int n; i = samplecnverter.pcmdecodepos; for(n = 0;n < i;n ++){ sample_buffer[n] = samplecnverter.sample_decode[n]; } samplecnverter.bPausedRead = FALSE; } for(;i < (signed)frame_size;i += 2){ int s1, s2, sa; // int pts; // LEFT rval = getsample( samplecnverter.pos_hi * 2, musicin, &s1 ); if( SAMPLES_READ != rval ) break; if( samplecnverter.pos_lo == 0 ){ sample_buffer[ i ] = s1; } else { #ifdef USE_FLOATING double pts; rval = getsample( samplecnverter.pos_hi * 2 + 2, musicin, &s2 ); if( SAMPLES_READ != rval ) break; pts = (double)samplecnverter.pos_lo / _1SHL32; sa = (int)((double)s1 * ( 1.0 - pts ) + (double)s2 * pts); assert( sa >= -0x8000 && sa <= 0x7fff ); sample_buffer[ i ] = sa ; #else pts = samplecnverter.pos_lo >> 17; rval = getsample( samplecnverter.pos_hi * 2 + 2, musicin, &s2 ); if( SAMPLES_READ != rval ) break; assert( pts >= 0 && pts < 0x8000 ); sa = s1 * ( 0x8000 - pts ) + s2 * pts; sample_buffer[ i ] = sa >> 15; #endif } // RIGHT rval = getsample( samplecnverter.pos_hi * 2 + 1, musicin, &s1 ); if( SAMPLES_READ != rval ) break; if( samplecnverter.pos_lo == 0 ){ sample_buffer[ i + 1 ] = s1; } else { #ifdef USE_FLOATING double pts; rval = getsample( samplecnverter.pos_hi * 2 + 3, musicin, &s2 ); if( SAMPLES_READ != rval ) break; pts = (double)samplecnverter.pos_lo / _1SHL32; sa = (int)((double)s1 * ( 1.0 - pts ) + (double)s2 * pts); assert( sa >= -0x8000 && sa <= 0x7fff ); sample_buffer[ i + 1 ] = sa ; #else pts = samplecnverter.pos_lo >> 17; rval = getsample( samplecnverter.pos_hi * 2 + 3, musicin, &s2 ); if( SAMPLES_READ != rval ) break; assert( pts >= 0 && pts < 0x8000 ); sa = s1 * ( 0x8000 - pts ) + s2 * pts; sample_buffer[ i + 1 ] = sa >> 15; #endif } { unsigned long org_low; org_low = samplecnverter.pos_lo; samplecnverter.pos_lo += samplecnverter.pitch_lo ; if( samplecnverter.pos_lo < org_low ){ samplecnverter.pos_hi += samplecnverter.pitch_hi + 1; } else { samplecnverter.pos_hi += samplecnverter.pitch_hi; } } } if( rval != SAMPLES_READ ){ int n; if( rval == SAMPLES_PAUSED ){ samplecnverter.bPausedRead = TRUE; samplecnverter.pcmdecodepos = i; for(n = 0;n < i;n++){ samplecnverter.sample_decode[n] = sample_buffer[n]; } } else { for(n = i;n < frame_size;n++){ samplecnverter.sample_decode[n] = 0; } } } return rval; } } } SAMPLES_T get_audio(FILE *musicin, short *buffer) { unsigned long j, num; short insamp[1152*2]; SAMPLES_T rval; num = gl.frameSize; if( gl.stereo == 2 ){ /* stereo -> stereo */ /* No conversion needed, fall through... */ return read_samples( musicin, buffer, num * 2, 2 ); } else if( bForceMono == FALSE ){ /* mono -> mono */ /* No conversion needed, fall through... */ return read_samples( musicin, buffer, num, 1 ); } else { /* stereo -> mono */ rval = read_samples( musicin, insamp, num * 2, 2 ); if( rval != SAMPLES_READ ) return rval; for( j = 0; j < num; j++ ){ buffer[j] = ( (int)insamp[j*2] + (int)insamp[j*2 + 1] ) / 2; } return rval; } } gogo239b/athlon.sh100755 23421 144 1773 7220537347 13173 0ustar shigeousers#!/bin/sh # Easy to use Athlon addition as described in the original readme_g.txt. # Now Athlon users should only run this script to get a ready to run # 3D-NOW/MMX/Athlon-enhanced gogo. # # Send comments to: Thomas Juerges # echo -e "\nBuilding 3D-Now!/MMX/Athlon extensions compiler...\n\n" if [ ! -x mmx/mmx_builder ]; then cd mmx gcc -DONLY_E3DN -DNO_KANJI -o mmx_builder *.c cd .. fi echo -e "Build of compiler complete.\n\nBuilding .asm-files...\n\n" for i in *.nas; do mmx/mmx_builder $i tmp=`echo $i | sed -e 's/\.nas/\.asm/'` if [ ! -f $i.bak ]; then mv -f $i $i.bak fi mv -f $tmp $i done echo -e "\n\nO.K.\nExtensions are now built.\nYou can find the old style assembler files moved to *.nas.bak" echo -e "i\nNow we go on with a simple make:\n" make echo -e "\n\nO.K. Everything seems to be ready for take off now.\n" echo -e "Please check the output of each process we ran through.\n" echo -e "If everything seems to be fine, well, have fun!\n\n" exit gogo239b/mkfiles/ 40755 23421 144 0 7220537254 12671 5ustar shigeousersgogo239b/mkfiles/makefile.cygwin100644 23421 144 7312 7220537254 15770 0ustar shigeousers# --------------------------------------------- # for cygwin32 version egcs-2.91.57 19980901 # (egcs-1.1 release) # --------------------------------------------- # Copyright (C) 1999 shigeo # modified by PEN@MarineCat # modified by kei-i #print messages in English DONT_USE_KANJI=-DNO_KANJI #use Enhanced 3D Now! #you need modify NASM to use this option E3DN=-DUSE_E3DN #use VBR VBR=-DUSE_VBR -DLAME355 #if OS is win and use MT #PTHREAD=$(USE_MT) -DUSE_WINTHREAD #CC=gcc -c -m486 -O3 -finline-functions -fomit-frame-pointer -funroll-loops #CC=gcc -c -mcpu=pentium -O6 -finline-functions -fomit-frame-pointer -funroll-loops CC=gcc -c -mcpu=pentiumpro -O6 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops #CC=gcc -c -mcpu=pentiumpro -g -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops AS = nasmw LD = gcc CFLAGS = -Wall $(PROF) -DNDEBUG $(DONT_USE_KANJI) $(E3DN) $(VBR) $(PTHREAD) -D__unix__ -DRAW_INPUT ASFLAGS = -f win32 -DWIN32 $(E3DN) -D__BORLANDC__ LDFLAGS = $(PROF) -Wl,-X LIBS = -lm TARGET = gogo.exe OBJS = bitstrem.o common.o encode.o huffman.o l3bs.o l3psy.o loop.o mdct.o subs.o tables.o vbrtag.o setup.o readsmpl.o musui.o musenc.o message.o AOBJS = clk.obj haveunit.obj huffmana.obj quantize.obj mdct3dn.obj msubsse.obj mdctfpu.obj mdcttbl.obj fft.obj fftsse.obj fft3dn.obj ffttbl.obj fftfpu.obj l3psya.obj putbits.obj align.obj sbandtbl.obj sbandsse.obj sbandfpu.obj sband3dn.obj msubtbl.obj msubfpu.obj msub3dn.obj #default: all all : $(TARGET) $(TARGET) :$(OBJS) $(AOBJS) $(LD) $(OBJS) $(AOBJS) $(LDFLAGS) -o $(TARGET) $(LIBS) strip $(TARGET) .SUFFIXES: .nas .c .o .obj .nas.obj: $(AS) $(ASFLAGS) $< .c.o: $(CC) $(CFLAGS) $< clean: \rm -f *.o *.obj $(TARGET) *~ common.h : l3side.h l3bs.h : common.h l3psy.h : l3side.h loop.h : common.h readsmpl.h : common.h vbrtag.h : l3bs.h bitstrem.o : bitstrem.c common.h bitstrem.h common.o : common.c common.h musenc.h encode.o : encode.c common.h haveunit.h subband.h huffman.o : huffman.c common.h huffman.h huffcode.tbl l3bs.o : l3bs.c l3bs.h l3psy.h mdct.h loop.h huffman.h bitstrem.h l3psy.o : l3psy.c common.h global.h l3psy.h l3side.h haveunit.h loop.o : loop.c musenc.h global.h loop.h huffman.h l3bs.h haveunit.h l3psy.h mdct.o : mdct.c common.h mdct.h haveunit.h musenc.o : musenc.c common.h global.h musenc.h subband.h readsmpl.h bitstrem.h l3psy.h mdct.h loop.h l3bs.h vbrtag.h haveunit.h musui.o : musui.c common.h musenc.h haveunit.h readsmpl.o : readsmpl.c common.h global.h readsmpl.h musenc.h setup.o : setup.c haveunit.h subs.o : subs.c common.h haveunit.h table.o : table.c vbrtag.o : vbrtag.c vbrtag.h musenc.h bitstrem.h message.o : message.c message.h japanese.msg english.msg german.msg spanish.msg haveunit.obj : haveunit.nas nasm.h huffmana.obj : huffmana.nas nasm.h clk.obj : clk.nas nasm.h quantize.obj : quantize.nas grinfo.inc nasm.h sbandtbl.obj : sbandtbl.nas nasm.h sbandsse.obj : sbandsse.nas nasm.h sband3dn.obj : sband3dn.nas nasm.h sbandfpu.obj : sbandfpu.nas nasm.h mdcttbl.obj : mdcttbl.nas nasm.h mdctfpu.obj : mdctfpu.nas nasm.h msubsse.obj : msubsse.nas nasm.h mdct3dn.obj : mdct3dn.nas nasm.h fft.obj : fft.nas nasm.h ffttbl.obj : ffttbl.nas nasm.h fftsse.obj : fftsse.nas nasm.h fftfpu.obj : fftfpu.nas nasm.h fft3dn.obj : fft3dn.nas nasm.h l3psya.obj : l3psya.nas nasm.h putbits.obj : putbits.nas nasm.h align.obj : align.nas nasm.h msubtbl.obj : msubtbl.nas nasm.h msub3dn.obj : msub3dn.nas nasm.h msubfpu.obj : msubfpu.nas nasm.h gogo239b/mkfiles/makefile.os2100644 23421 144 7674 7220537254 15206 0ustar shigeousers# # Copyright (C) 1999 shigeo # modified by Keiichi SAKAI # #print messages in English DONT_USE_KANJI=-DNO_KANJI #use Enhanced 3D Now! #you need modify NASM to use this option #E3DN=-DUSE_E3DN #use VBR VBR=-DUSE_VBR -DLAME355 #use multi-thread #OS must be Linux libc6 or BeOS USE_MT= -DDISPLAY_REALTIME #define if OS is BeOS #isBe=-DBeOS ifdef USE_MT ifdef isBe PTHREAD=$(USE_MT) -DUSE_BTHREAD else PTHREAD=$(USE_MT) -DUSE_PTHREAD endif endif #if Windows and use MT #PTHREAD=$(USE_MT) -DUSE_WINTHREAD #if OS/2 and use MT PTHREAD=$(USE_MT) -DUSE_OS2THREAD ifdef RPM_OPT_FLAGS CC=gcc -c $(RPM_OPT_FLAGS) else CC=gcc -c -m486 -O3 -finline-functions -fomit-frame-pointer -funroll-loops #CC=gcc -c -mcpu=pentium -O6 -finline-functions -fomit-frame-pointer -funroll-loops #CC=gcc -c -mcpu=pentiumpro -O6 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops endif AS=nasm LD=gcc #if FreeBSD 2.x then add __unix__ to CC ifdef isBe CFLAGS=-Wall $(PROF) -DNDEBUG $(DONT_USE_KANJI) $(E3DN) $(VBR) $(PTHREAD) -D__unix__ $(isBe) -DRAW_INPUT else CFLAGS=-Zexe -Zmtd -Wall -D__os2__ $(PROF) -DNDEBUG $(DONT_USE_KANJI) $(E3DN) $(VBR) $(PTHREAD) -DRAW_INPUT endif ASFLAGS=-f aout -D__unix__ $(E3DN) -DAOUT #if FreeBSD then #ASFLAGS = -f aoutb -D__unix__ -DAOUT LDFLAGS=$(PROF) -Zexe #PROF=-g -pg ifdef PTHREAD ifdef isBe LIBS= else LIBS=-Zmtd endif else LIBS=-lm endif OBJS = bitstrem.o common.o encode.o huffman.o l3bs.o l3psy.o loop.o mdct.o subs.o tables.o vbrtag.o setup.o readsmpl.o musui.o musenc.o message.o AOBJS = clk.o haveunit.o huffmana.o quantize.o mdct3dn.o msubsse.o mdctfpu.o mdcttbl.o fft.o fftsse.o fft3dn.o ffttbl.o fftfpu.o l3psya.o putbits.o align.o sbandtbl.o sbandsse.o sbandfpu.o sband3dn.o msubtbl.o msubfpu.o msub3dn.o .SUFFIXES: .nas .c #default: all all: gogo # strip gogo gogo :$(OBJS) $(AOBJS) $(LD) $(OBJS) $(AOBJS) $(LDFLAGS) -o gogo $(LIBS) .nas.o: $(AS) $(ASFLAGS) $< #if FreeBSD 2.x then # $(AS) $(ASFLAGS) $< -o $@ .c.o: $(CC) $(CFLAGS) $< clean: \rm -f *.o gogo *~ common.h : l3side.h l3bs.h : common.h l3psy.h : l3side.h loop.h : common.h readsmpl.h : common.h vbrtag.h : l3bs.h bitstrem.o : bitstrem.c common.h bitstrem.h common.o : common.c common.h musenc.h encode.o : encode.c common.h haveunit.h subband.h huffman.o : huffman.c common.h huffman.h huffcode.tbl l3bs.o : l3bs.c l3bs.h l3psy.h mdct.h loop.h huffman.h bitstrem.h l3psy.o : l3psy.c common.h global.h l3psy.h l3side.h haveunit.h loop.o : loop.c musenc.h global.h loop.h huffman.h l3bs.h haveunit.h mdct.o : mdct.c common.h mdct.h haveunit.h musenc.o : musenc.c common.h global.h musenc.h subband.h readsmpl.h bitstrem.h l3psy.h mdct.h loop.h l3bs.h vbrtag.h haveunit.h musui.o : musui.c common.h musenc.h haveunit.h readsmpl.o : readsmpl.c common.h global.h readsmpl.h musenc.h setup.o : setup.c haveunit.h subs.o : subs.c common.h haveunit.h table.o : table.c vbrtag.o : vbrtag.c vbrtag.h musenc.h bitstrem.h message.o : message.c message.h japanese.msg english.msg german.msg spanish.msg haveunit.o : haveunit.nas nasm.h huffmana.o : huffmana.nas nasm.h clk.o : clk.nas nasm.h quantize.o : quantize.nas grinfo.inc nasm.h sbandtbl.o : sbandtbl.nas nasm.h sbandsse.o : sbandsse.nas nasm.h sband3dn.o : sband3dn.nas nasm.h sbandfpu.o : sbandfpu.nas nasm.h mdcttbl.o : mdcttbl.nas nasm.h mdctfpu.o : mdctfpu.nas nasm.h msubsse.o : msubsse.nas nasm.h mdct3dn.o : mdct3dn.nas nasm.h fft.o : fft.nas nasm.h ffttbl.o : ffttbl.nas nasm.h fftsse.o : fftsse.nas nasm.h fftfpu.o : fftfpu.nas nasm.h fft3dn.o : fft3dn.nas nasm.h l3psya.o : l3psya.nas nasm.h putbits.o : putbits.nas nasm.h align.o : align.nas nasm.h msubtbl.o : msubtbl.nas nasm.h msub3dn.o : msub3dn.nas nasm.h msubfpu.o : msubfpu.nas nasm.h gogo239b/mkfiles/makefile.tos100644 23421 144 6241 7220537254 15275 0ustar shigeousers# # for new GOGO-no-coda (1999/09) # Copyright (C) 1999 shigeo # This is a Makefile for TownsOS # TARGET=gogo.exp COPT=-on 486 -on 387 -def NDEBUG -def USE_VBR -def LAME355 -def RAW_INPUT NASMOPT=-f pharlap -g -D__tos__ #もしmamiyaさん仕様のNASMでないなら-f obj CC = d:\run386 -nocrt e:\hc386\bin\hcd386p.exp LINK =d:\run386 -nocrt e:\386asm\exe\386linkp LIBD=-lib e:\hc386\lib LIB=$(LIBD)\hcc $(LIBD)\tbios $(LIBD)\fmcfrb $(LIBD)\t_os $(LIBD)\na LINKOPT=-tc -stack 200000 -pack -warn -sym .suffixes: .nas .c .mmx .asm .nas.obj: run386 -nocrt e:\hc386\bin\nasm $(NASMOPT) $< .c.obj: $(CC) $< $(COPT) default: all all: $(TARGET) clean: rm -f *.obj *.exp make.i *.err *.lst *.map OBJS = huffman.obj l3bs.obj l3psy.obj loop.obj mdct.obj subs.obj tables.obj bitstrem.obj musenc.obj musui.obj encode.obj bj vbrtag.obj setup.obj readsmpl.obj common.obj message.obj AOBJS= sbandsse.obj fftsse.obj msubsse.obj clk.obj haveunit.obj huffmana.obj quantize.obj mdcttbl.obj mdctfpu.obj mdct3dn.obj fft.obj ffttbl.obj fftfpu.obj fft3dn.obj l3psya.obj putbits.obj align.obj sbandtbl.obj sbandfpu.obj sband3dn.obj msubtbl.obj msub3dn.obj msubfpu.obj $(TARGET) :$(OBJS) $(AOBJS) makefile $(LINK) @${ $(AOBJS) $(OBJS) $(LIB) $(LINKOPT) -exe $(TARGET) } common.h : l3side.h l3bs.h : common.h l3psy.h : l3side.h loop.h : common.h readsmpl.h : common.h vbrtag.h : l3bs.h bitstrem.obj : bitstrem.c common.h bitstrem.h common.obj : common.c common.h musenc.h encode.obj : encode.c common.h haveunit.h subband.h huffman.obj : huffman.c common.h huffman.h huffcode.tbl l3bs.obj : l3bs.c l3bs.h l3psy.h mdct.h loop.h huffman.h bitstrem.h l3psy.obj : l3psy.c common.h global.h l3psy.h l3side.h haveunit.h loop.obj : loop.c musenc.h global.h loop.h huffman.h l3bs.h haveunit.h mdct.obj : mdct.c common.h mdct.h haveunit.h musenc.obj : musenc.c common.h global.h musenc.h subband.h readsmpl.h bitstrem.h l3psy.h mdct.h loop.h l3bs.h vbrtag.h haveunit.h musui.obj : musui.c common.h musenc.h haveunit.h readsmpl.obj : readsmpl.c common.h global.h readsmpl.h musenc.h setup.obj : setup.c haveunit.h subs.obj : subs.c common.h haveunit.h table.obj : table.c vbrtag.obj : vbrtag.c vbrtag.h musenc.h bitstrem.h message.obj : message.c message.h japanese.msg english.msg german.msg spanish.msg haveunit.obj : haveunit.nas nasm.h huffmana.obj : huffmana.nas nasm.h clk.obj : clk.nas nasm.h quantize.obj : quantize.nas grinfo.inc nasm.h sbandtbl.obj : sbandtbl.nas nasm.h sbandsse.obj : sbandsse.nas nasm.h sband3dn.obj : sband3dn.nas nasm.h sbandfpu.obj : sbandfpu.nas nasm.h mdcttbl.obj : mdcttbl.nas nasm.h mdctfpu.obj : mdctfpu.nas nasm.h msubsse.obj : msubsse.nas nasm.h mdct3dn.obj : mdct3dn.nas nasm.h fft.obj : fft.nas nasm.h ffttbl.obj : ffttbl.nas nasm.h fftfpu.obj : fftfpu.nas nasm.h fft3dn.obj : fft3dn.nas nasm.h fftsse.obj : fftsse.nas nasm.h l3psya.obj : l3psya.nas nasm.h putbits.obj : putbits.nas nasm.h align.obj : align.nas nasm.h msubtbl.obj : msubtbl.nas nasm.h msub3dn.obj : msub3dn.nas nasm.h msubfpu.obj : msubfpu.nas nasm.h gogo239b/mkfiles/makefile.dj100644 23421 144 12513 7220537254 15104 0ustar shigeousers# # This is a Makefile for djgpp 2.x # # Copyright (C) 1999,2000 shigeo # modified by Keiichi SAKAI, Noisyu and harada # modified by sava #use Enhanced 3D Now! #you need modified NASM to use this option #USE_E3DN=yes #use VBR USE_VBR =yes #use multi-thread #OS must be Linux with libc6, FreeBSD-4.0R with linuxthreads ,BeOS or OS/2 #USE_MT=yes #define if OS is BeOS #OS=BeOS #define if OS is Windows #OS=Windows #define if OS is MS-DOS (djgpp 2.x) OS=DOS #define if OS is OS/2 v2 or warp (emx + gcc) #OS=OS2 ifndef OS OS:=$(shell uname -s) endif ifeq ($(USE_E3DN),yes) E3DN=-DUSE_E3DN endif ifeq ($(USE_VBR),yes) VBR=-DLAME355 -DUSE_VBR endif # common definition LD=gcc #LD=gcc -Wl,-Map,gogo.map LIBS=-lm CC=gcc -c -m486 -O3 -finline-functions -fomit-frame-pointer -funroll-loops # This option is available for gcc-2.8.x #CC=gcc -c -mcpu=pentiumpro -malign-double -O6 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops # This option is available for gcc-2.95.1, gcc-2.95.2, gcc-2.95.3,... #CC=gcc -c -mcpu=pentiumpro -march=pentiumpro -O9 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops -ffast-math -foptimize-register-move -fdefer-pop -mfancy-math-387 CFLAGS=-Wall $(PROF) -DNDEBUG $(E3DN) $(VBR) -DRAW_INPUT AS=nasm ASFLAGS=$(E3DN) # OS specific definition ifeq ($(OS),DOS) LIBS= CFLAGS+= -D__dos__ ASFLAGS+= -f coff -DAOUT -DSHRINK_NULLCHAR -D__dos__ BINEXT= .exe endif ifeq ($(OS),OS2) LIBS= CFLAGS+= -DDISPLAY_REALTIME -D__os2__ ASFLAGS+= -f aout -DAOUT -DSHRINK_NULLCHAR -D__os2__ BINEXT= .exe ifeq ($(USE_MT),yes) CFLAGS+= -DUSE_OS2THREAD -Zmt LIBS+= -Zmt endif endif ifeq ($(OS),BeOS) LIBS= CFLAGS+= -DDISPLAY_REALTIME -D__unix__ -DBeOS ASFLAGS+= -f elf -D__unix__ ifeq ($(USE_MT),yes) CFLAGS+= -DUSE_BTHREAD endif endif ifeq ($(OS),Linux) CFLAGS+= -DDISPLAY_REALTIME ASFLAGS+= -f elf -D__unix__ ifeq ($(USE_MT),yes) LIBS+= -lpthread CFLAGS+= -DUSE_PTHREAD endif ifdef RPM_OPT_FLAGS CC=gcc -c $(RPM_OPT_FLAGS) endif endif ifeq ($(OS),FreeBSD) CFLAGS+= -DDISPLAY_REALTIME ASFLAGS+= -f elf -D__unix__ #if FreeBSD 2.x then # ASFLAGS = -f aoutb -D__unix__ -DAOUT ifeq ($(USE_MT),yes) LIBS+= -L/usr/local/lib -llthread -llgcc_r CFLAGS+= -DUSE_PTHREAD -D_THREAD_SAFE -I/usr/local/include/pthread/linuxthreads endif endif ifeq ($(OS),OpenBSD) CFLAGS+= -D__unix__ -DDISPLAY_REALTIME ASFLAGS+= -D__unix__ endif ifeq ($(OS),NetBSD) CFLAGS+= -D__unix__ -DDISPLAY_REALTIME ASFLAGS+= -D__unix__ endif ifeq ($(OS),Windows) ASFLAGS+= -f win32 -DWIN32 -DCOFF #if Borland C++ then add -D__BORLANDC__ to ASFLAGS ifeq ($(USE_MT),yes) CFLAGS+= -DUSE_WINTHREAD endif endif LDFLAGS=$(PROF) #PROF=-g -pg OBJS = message.o bitstrem.o common.o encode.o huffman.o l3bs.o l3psy.o loop.o mdct.o subs.o tables.o vbrtag.o setup.o readsmpl.o musui.o musenc.o AOBJS = clk.o haveunit.o huffmana.o quantize.o mdct3dn.o msubsse.o mdctfpu.o mdcttbl.o fft.o fftsse.o fft3dn.o ffttbl.o fftfpu.o l3psya.o putbits.o align.o sbandtbl.o sbandsse.o sbandfpu.o sband3dn.o msubtbl.o msubfpu.o msub3dn.o .SUFFIXES: .nas .c all: gogo$(BINEXT) install : gogo$(BINEXT) cp gogo /usr/local/bin strip /usr/local/bin/gogo gogo$(BINEXT) : $(OBJS) $(AOBJS) $(LD) $(OBJS) $(AOBJS) $(LDFLAGS) -o gogo$(BINEXT) $(LIBS) .nas.o: $(AS) $(ASFLAGS) $< -o $@ .c.o: $(CC) $(CFLAGS) $< -o $@ clean: rm -f *.o gogo$(BINEXT) core common.h : l3side.h l3bs.h : common.h l3psy.h : l3side.h loop.h : common.h readsmpl.h : common.h vbrtag.h : l3bs.h bitstrem.o : bitstrem.c common.h bitstrem.h common.o : common.c common.h musenc.h encode.o : encode.c common.h haveunit.h subband.h huffman.o : huffman.c common.h huffman.h huffcode.tbl l3bs.o : l3bs.c l3bs.h l3psy.h mdct.h loop.h huffman.h bitstrem.h l3psy.o : l3psy.c common.h global.h l3psy.h l3side.h haveunit.h loop.o : loop.c musenc.h global.h loop.h huffman.h l3bs.h haveunit.h l3psy.h mdct.o : mdct.c common.h mdct.h haveunit.h musenc.o : musenc.c common.h global.h musenc.h subband.h readsmpl.h bitstrem.h l3psy.h mdct.h loop.h l3bs.h vbrtag.h haveunit.h musui.o : musui.c common.h musenc.h haveunit.h readsmpl.o : readsmpl.c common.h global.h readsmpl.h musenc.h setup.o : setup.c haveunit.h subs.o : subs.c common.h haveunit.h table.o : table.c vbrtag.o : vbrtag.c vbrtag.h musenc.h bitstrem.h haveunit.o : haveunit.nas nasm.h huffmana.o : huffmana.nas nasm.h clk.o : clk.nas nasm.h quantize.o : quantize.nas grinfo.inc nasm.h sbandtbl.o : sbandtbl.nas nasm.h sbandsse.o : sbandsse.nas nasm.h sband3dn.o : sband3dn.nas nasm.h sbandfpu.o : sbandfpu.nas nasm.h mdcttbl.o : mdcttbl.nas nasm.h mdctfpu.o : mdctfpu.nas nasm.h msubsse.o : msubsse.nas nasm.h mdct3dn.o : mdct3dn.nas nasm.h fft.o : fft.nas nasm.h ffttbl.o : ffttbl.nas nasm.h fftsse.o : fftsse.nas nasm.h fftfpu.o : fftfpu.nas nasm.h fft3dn.o : fft3dn.nas nasm.h l3psya.o : l3psya.nas nasm.h putbits.o : putbits.nas nasm.h align.o : align.nas nasm.h msubtbl.o : msubtbl.nas nasm.h msub3dn.o : msub3dn.nas nasm.h msubfpu.o : msubfpu.nas nasm.h message.o : message.c message.h japanese.msg english.msg german.msg spanish.msg gogo239b/mkfiles/makefile.emx100644 23421 144 12556 7220537254 15307 0ustar shigeousers# # This is a Makefie for OS/2 v2 or warp (emx + gcc) # # Copyright (C) 1999,2000 shigeo # modified by Keiichi SAKAI, Noisyu and harada # modifyed by sava #use Enhanced 3D Now! #you need modified NASM to use this option #USE_E3DN=yes #use VBR USE_VBR =yes #use multi-thread #OS must be Linux with libc6, FreeBSD-4.0R with linuxthreads ,BeOS or OS/2 #USE_MT=yes #define if OS is BeOS #OS=BeOS #define if OS is Windows #OS=Windows #define if OS is MS-DOS (djgpp 2.x) #OS=DOS #define if OS is OS/2 v2 or warp (emx + gcc) OS=OS2 ifndef OS OS:=$(shell uname -s) endif ifeq ($(USE_E3DN),yes) E3DN=-DUSE_E3DN endif ifeq ($(USE_VBR),yes) VBR=-DLAME355 -DUSE_VBR endif # common definition LD=gcc #LD=gcc -Wl,-Map,gogo.map LIBS=-lm CC=gcc -c -m486 -O3 -finline-functions -fomit-frame-pointer -funroll-loops # This option is available for gcc-2.8.x CC=gcc -c -mcpu=pentiumpro -malign-double -O6 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops # This option is available for gcc-2.95.1, gcc-2.95.2, gcc-2.95.3,... #CC=gcc -c -mcpu=pentiumpro -march=pentiumpro -O9 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops -ffast-math -foptimize-register-move -fdefer-pop -mfancy-math-387 CFLAGS=-Wall $(PROF) -DNDEBUG $(E3DN) $(VBR) -DRAW_INPUT AS=nasm ASFLAGS=$(E3DN) # OS specific definition ifeq ($(OS),DOS) LIBS= CFLAGS+= -DDISPLAY_REALTIME -D__dos__ ASFLAGS+= -f coff -DAOUT -DSHRINK_NULLCHAR -D__dos__ BINEXT= .exe endif ifeq ($(OS),OS2) LIBS= CFLAGS+= -DDISPLAY_REALTIME -D__os2__ ASFLAGS+= -f aout -DAOUT -DSHRINK_NULLCHAR -D__os2__ BINEXT= .exe ifeq ($(USE_MT),yes) CFLAGS+= -DUSE_OS2THREAD -Zmt LIBS+= -Zmt endif endif ifeq ($(OS),BeOS) LIBS= CFLAGS+= -DDISPLAY_REALTIME -D__unix__ -DBeOS ASFLAGS+= -f elf -D__unix__ ifeq ($(USE_MT),yes) CFLAGS+= -DUSE_BTHREAD endif endif ifeq ($(OS),Linux) CFLAGS+= -DDISPLAY_REALTIME ASFLAGS+= -f elf -D__unix__ ifeq ($(USE_MT),yes) LIBS+= -lpthread CFLAGS+= -DUSE_PTHREAD endif ifdef RPM_OPT_FLAGS CC=gcc -c $(RPM_OPT_FLAGS) endif endif ifeq ($(OS),FreeBSD) CFLAGS+= -DDISPLAY_REALTIME ASFLAGS+= -f elf -D__unix__ #if FreeBSD 2.x then # ASFLAGS = -f aoutb -D__unix__ -DAOUT ifeq ($(USE_MT),yes) LIBS+= -L/usr/local/lib -llthread -llgcc_r CFLAGS+= -DUSE_PTHREAD -D_THREAD_SAFE -I/usr/local/include/pthread/linuxthreads endif endif ifeq ($(OS),OpenBSD) CFLAGS+= -D__unix__ -DDISPLAY_REALTIME ASFLAGS+= -D__unix__ endif ifeq ($(OS),NetBSD) CFLAGS+= -D__unix__ -DDISPLAY_REALTIME ASFLAGS+= -D__unix__ endif ifeq ($(OS),Windows) ASFLAGS+= -f win32 -DWIN32 -DCOFF #if Borland C++ then add -D__BORLANDC__ to ASFLAGS ifeq ($(USE_MT),yes) CFLAGS+= -DUSE_WINTHREAD endif endif LDFLAGS=$(PROF) #PROF=-g -pg OBJS = message.o bitstrem.o common.o encode.o huffman.o l3bs.o l3psy.o loop.o mdct.o subs.o tables.o vbrtag.o setup.o readsmpl.o musui.o musenc.o AOBJS = clk.o haveunit.o huffmana.o quantize.o mdct3dn.o msubsse.o mdctfpu.o mdcttbl.o fft.o fftsse.o fft3dn.o ffttbl.o fftfpu.o l3psya.o putbits.o align.o sbandtbl.o sbandsse.o sbandfpu.o sband3dn.o msubtbl.o msubfpu.o msub3dn.o .SUFFIXES: .nas .c all: gogo$(BINEXT) install : gogo$(BINEXT) cp gogo /usr/local/bin strip /usr/local/bin/gogo gogo$(BINEXT) : $(OBJS) $(AOBJS) $(LD) $(OBJS) $(AOBJS) $(LDFLAGS) -o gogo$(BINEXT) $(LIBS) .nas.o: $(AS) $(ASFLAGS) $< -o $@ .c.o: $(CC) $(CFLAGS) $< -o $@ clean: rm -f *.o gogo$(BINEXT) core common.h : l3side.h l3bs.h : common.h l3psy.h : l3side.h loop.h : common.h readsmpl.h : common.h vbrtag.h : l3bs.h bitstrem.o : bitstrem.c common.h bitstrem.h common.o : common.c common.h musenc.h encode.o : encode.c common.h haveunit.h subband.h huffman.o : huffman.c common.h huffman.h huffcode.tbl l3bs.o : l3bs.c l3bs.h l3psy.h mdct.h loop.h huffman.h bitstrem.h l3psy.o : l3psy.c common.h global.h l3psy.h l3side.h haveunit.h loop.o : loop.c musenc.h global.h loop.h huffman.h l3bs.h haveunit.h l3psy.h mdct.o : mdct.c common.h mdct.h haveunit.h musenc.o : musenc.c common.h global.h musenc.h subband.h readsmpl.h bitstrem.h l3psy.h mdct.h loop.h l3bs.h vbrtag.h haveunit.h musui.o : musui.c common.h musenc.h haveunit.h readsmpl.o : readsmpl.c common.h global.h readsmpl.h musenc.h setup.o : setup.c haveunit.h subs.o : subs.c common.h haveunit.h table.o : table.c vbrtag.o : vbrtag.c vbrtag.h musenc.h bitstrem.h haveunit.o : haveunit.nas nasm.h huffmana.o : huffmana.nas nasm.h clk.o : clk.nas nasm.h quantize.o : quantize.nas grinfo.inc nasm.h sbandtbl.o : sbandtbl.nas nasm.h sbandsse.o : sbandsse.nas nasm.h sband3dn.o : sband3dn.nas nasm.h sbandfpu.o : sbandfpu.nas nasm.h mdcttbl.o : mdcttbl.nas nasm.h mdctfpu.o : mdctfpu.nas nasm.h msubsse.o : msubsse.nas nasm.h mdct3dn.o : mdct3dn.nas nasm.h fft.o : fft.nas nasm.h ffttbl.o : ffttbl.nas nasm.h fftsse.o : fftsse.nas nasm.h fftfpu.o : fftfpu.nas nasm.h fft3dn.o : fft3dn.nas nasm.h l3psya.o : l3psya.nas nasm.h putbits.o : putbits.nas nasm.h align.o : align.nas nasm.h msubtbl.o : msubtbl.nas nasm.h msub3dn.o : msub3dn.nas nasm.h msubfpu.o : msubfpu.nas nasm.h message.o : message.c message.h japanese.msg english.msg german.msg spanish.msg gogo239b/mkfiles/makefile.wc100644 23421 144 10767 7220537254 15131 0ustar shigeousers# quick and dirty makefile # for Watcom C/C++ 10.5j, wmake and nasm (0.98 or later) # by sava TARGET = gogo.exe CC = wcc386 LD = wlink AS = nasm .EXTENSIONS: .EXTENSIONS: .exe .obj .nas .c .h # # selecting target env. # # win32 Windows console # win32_mt Windows console with Multi-Threading (*cannot build*) # os2 OS/2 32bit console # os2_mt OS/2 32bit console with Multi-Threading (*cannot build*) # dos MS-DOS 32bit console (DOS/4GW) # TGT_ENV = win32 #TGT_ENV = win32_mt #TGT_ENV = os2 #TGT_ENV = os2_mt #TGT_ENV = dos DONT_USE_KANJI=-DNO_KANJI VBR=-DUSE_VBR -DLAME355 USE_MT= -DDISPLAY_REALTIME #USE_E3DN=yes !ifeq TGT_ENV win32 TGT_INC=nt TGT_CC=nt TGT_CFLAGS=-dWIN32 -d_CONSOLE TGT_LD=nt TGT_NASM=-f win32 -DSHRINK_NULLCHAR READ4WIN=read4win.c !else ifeq TGT_ENV win32_mt TGT_INC=nt TGT_CC=nt TGT_CFLAGS=-bm -dWIN32 -d_CONSOLE $(USE_MT) -DUSE_WINTHREAD TGT_LD=nt TGT_NASM=-f win32 -DSHRINK_NULLCHAR READ4WIN=read4win.c !else ifeq TGT_ENV os2 TGT_INC=os2 TGT_CC=os2 TGT_CFLAGS=-d__os2__ TGT_LD=os2v2 TGT_NASM=-f obj -D__os2__ -DSHRINK_NULLCHAR !else ifeq TGT_ENV os2_mt TGT_INC=os2 TGT_CC=os2 TGT_CFLAGS=-bm -sg -d__os2__ $(USE_MT) -DUSE_OS2THREAD TGT_LD=os2v2 TGT_NASM=-f obj -D__os2__ -DSHRINK_NULLCHAR !else ifeq TGT_ENV dos TGT_INC=dos TGT_CC=dos TGT_CFLAGS=-d__dos__ TGT_LD=dos4g TGT_NASM=-f obj -DSHRINK_NULLCHAR !endif !ifndef DONT_USE_KANJI DONT_USE_KANJI = -zk0 !endif !ifdef USE_E3DN E3DN_AFLAG = -DUSE_E3DN E3DN_CFLAG = -dUSE_E3DN !endif CFLAGS = -zq & -5s -fp5 -oneatx & -i$(%WATCOM)\H -i$(%WATCOM)\H\$(TGT_INC) & $(TGT_CFLAGS) & $(E3DN_CFLAG) & -dRAW_INPUT & -dNDEBUG & $(VBR) & $(PTHREAD) & $(DONT_USE_KANJI) AFLAGS = $(TGT_NASM) $(E3DN_AFLAG) .c.obj : *$(CC) $[@ -bt=$(TGT_CC) $(CFLAGS) -fo=$^@ .nas.obj : $(AS) $(AFLAGS) $[@ -o $^@ .DEFAULT @wtouch $^@ OBJS = bitstrem.obj common.obj encode.obj huffman.obj l3bs.obj l3psy.obj loop.obj mdct.obj bj subs.obj tables.obj vbrtag.obj setup.obj readsmpl.obj musui.obj musenc.obj message.obj AOBJS = clk.obj haveunit.obj huffmana.obj quantize.obj mdct3dn.obj msubsse.obj mdctfpu.obj mdcttbl.obj fft.obj fftsse.obj fft3dn.obj ffttbl.obj fftfpu.obj l3psya.obj putbits.obj align.obj sbandtbl.obj sbandsse.obj sbandfpu.obj sband3dn.obj msubtbl.obj msubfpu.obj msub3dn.obj all : $(TARGET) .SYMBOLIC @echo $(TARGET) ($TGT_ENV) is ready. clean : .SYMBOLIC -del *.obj >nul -del *.err >nul -del $(TARGET) >nul $(TARGET) : $(OBJS) $(AOBJS) *wlink sys $(TGT_LD) name $^@ op caseexact op stack=1024k file { $(OBJS) $(AOBJS) } common.h : l3side.h l3bs.h : common.h l3psy.h : l3side.h loop.h : common.h readsmpl.h : common.h vbrtag.h : l3bs.h bitstrem.obj : bitstrem.c common.h bitstrem.h common.obj : common.c common.h musenc.h encode.obj : encode.c common.h haveunit.h subband.h huffman.obj : huffman.c common.h huffman.h huffcode.tbl l3bs.obj : l3bs.c l3bs.h l3psy.h mdct.h loop.h huffman.h bitstrem.h l3psy.obj : l3psy.c common.h global.h l3psy.h l3side.h haveunit.h loop.obj : loop.c musenc.h global.h loop.h huffman.h l3bs.h haveunit.h mdct.obj : mdct.c common.h mdct.h haveunit.h musenc.obj : musenc.c common.h global.h musenc.h subband.h readsmpl.h bitstrem.h l3psy.h mdct.h loop.h l3bs.h vbrtag.h haveunit.h musui.obj : musui.c common.h musenc.h haveunit.h readsmpl.obj : readsmpl.c common.h global.h readsmpl.h musenc.h $(READ4WIN) setup.obj : setup.c haveunit.h subs.obj : subs.c common.h haveunit.h table.obj : table.c vbrtag.obj : vbrtag.c vbrtag.h musenc.h bitstrem.h haveunit.obj : haveunit.nas nasm.h huffmana.obj : huffmana.nas nasm.h clk.obj : clk.nas nasm.h message.obj : message.c message.h japanese.msg english.msg german.msg spanish.msg quantize.obj : quantize.nas grinfo.inc nasm.h sbandtbl.obj : sbandtbl.nas nasm.h sbandsse.obj : sbandsse.nas nasm.h sband3dn.obj : sband3dn.nas nasm.h sbandfpu.obj : sbandfpu.nas nasm.h mdcttbl.obj : mdcttbl.nas nasm.h mdctfpu.obj : mdctfpu.nas nasm.h msubsse.obj : msubsse.nas nasm.h mdct3dn.obj : mdct3dn.nas nasm.h fft.obj : fft.nas nasm.h ffttbl.obj : ffttbl.nas nasm.h fftsse.obj : fftsse.nas nasm.h fftfpu.obj : fftfpu.nas nasm.h fft3dn.obj : fft3dn.nas nasm.h l3psya.obj : l3psya.nas nasm.h putbits.obj : putbits.nas nasm.h align.obj : align.nas nasm.h msubtbl.obj : msubtbl.nas nasm.h msub3dn.obj : msub3dn.nas nasm.h msubfpu.obj : msubfpu.nas nasm.h gogo239b/japandoc/ 40755 23421 144 0 7225622161 13013 5ustar shigeousersgogo239b/japandoc/faq.html100644 23421 144 21742 7220537254 14576 0ustar shigeousersfaq
ク盧螟ホ、ウ。チ、タ、ホオシツコョケ蹤AQ

updated '00/4/9

1. エヒワナェ、ハシチフ
1.1 stereo、ネM/S-stereo, j-stereo、ホー网、、マ?
1.2 j-stereo、ヌ・ィ・・ウ。シ・ノ、キ、ソ、ホ、ヒM/S-stereo、ネノスシィ、オ、、゙、ケ。」
1.3 P-III、ヌ-nopsy、サネ、テ、ニ、゙、ケ、ャ。「テル、、、ヌ、ケ。」
1.4 1サエヨト・ィ・・ウ。シ・ノ、キ、ニ、、、、ネ・マ・・ー、キ、゙、ケ。」
1.5 3D Now!ヘュクサ、ネフオクサ、ヌタクタョ、オ、、mp3・ユ・。・、・、ャー网、、゙、ケ。」
1.6 Enhanced 3D Now!、テ、ニク、、、ニ、゙、ケ?
1.7 コヌソキ、ホlame、ヒトノスセ、キ、ハ、、、ホ、ヌ、ケ、ォ?
1.8 VBRツミア、マ?

2. ・ェ・ラ・キ・逾、ヒ、ト、、、ニ、ホシチフ
2.1 、ノ、ホ・ェ・ラ・キ・逾、ヌ・ィ・・ウ。シ・ノ、ケ、、ホ、ャホノ、、、ホ、ヌ、ケ、ォ?
2.2 stereo・筍シ・ノ、ヌ・ィ・・ウ。シ・ノ、キ、ソ、、。」
2.3 サ荀ホ・゙・キ・、ヌ、マ・ル・・チ、ヒサエヨ、ャウン、ォ、テ、ニツヤ、ニ、゙、サ、。」

3. Windowsクヌヘュ、ホシチフ
3.1 CD、ォ、鯑セタワmp3、コ、熙ソ、、。」
3.2 サ荀稟ogo.dll、クニ、モスミ、ケ・「・ラ・熙コ、熙゙、キ、ソ。」
3.3 イマニクテマヘ、ヌニー、ォ、キ、ニ、、ホ、ヌ、ケ、ャ -cpu 1、ネ、「、、゙、ハム、、熙゙、サ、。」

4. UNIXキマOSクヌヘュ、ホシチフ
4.1 ノスシィ・皈テ・サ。シ・ク、ニヒワク、ヒ、キ、ソ、、。」
4.2 ・ム・、・ラ、サネ、テ、ソCD、ォ、鬢ホトセタワ・ィ・・ウ。シ・ノ、、荀熙ソ、、。」
4.3 SMPセ螟ヌ cdparanoia、サネ、テ、ニ、、、、ホ、ヌ、ケ、ャテル、、、ヌ、ケ。」

5. 、ス、ホツセ
5.1 Win GUIネヌオッニーサ、ホス、ホサメ、テ、ニイソシヤ。」
5.2 フセセホ、ホヘウヘ隍マ。」
5.3 ク盧螟ホ・ル・・チ、テ、ニイソ?
5.4 ク盧螟ホ・ェ・ユイ、マ、ノ、ヲ、ヌ、キ、ソ?
5.5 ク盧螟ホ・ウ。シ・タ。シ。「ク盧螟ホ、ウ。シ、タ、ヒ、ト、、、ニ、ホシチフ荀マ?


1.1 stereo、ネM/S-stereo, j-stereo、ホー网、、マ?
A. stereo、マコクアヲ、ホ・チ・罕・ヘ・、ニネホゥ、ヒス靉、ケ、ハシー、ヌ、ケ。」
M/S-stereo、マ・ヌ。シ・ソ、テ豎、ネコクアヲ、ホー网、、ヒハャ、ア、ニス靉、キ、゙、ケ。」
コクアヲ、ホ・ヌ。シ・ソ、ャ、隍ッサ、ニ、、、サ、マ、ヲ、゙、ッーオスフ、ヌ、ュ、゙、ケ、ャ。「・ケ・ニ・・ェエカ、ャクコ、、ォ、筅キ、、゙、サ、。」
j-stereo・筍シ・ノ、マウニ・ユ・。シ・猴隍ヒstereo、ネM/S-stereo、ホ、ノ、チ、鬢ォ、ャチェツ、オ、、ソコョケ逾筍シ・ノ、ヌ、ケ。」

1.2 j-stereo、ヌ・ィ・・ウ。シ・ノ、キ、ソ、ホ、ヒM/S-stereo、ネノスシィ、オ、、゙、ケ。」
A. ク盧螟ホj-stereo・ィ・・ウ。シ・ノ、ヌ、マM/S-stereo、ネstereo、ホタレツリ、ィ、ホノムナル、ャネセ、ヒセッ、ハ、、、ソ、皃ヌ、ケ。」
、ネ、ッ、ヒウイ、ャ、「、、、ア、ヌ、マ、ハ、、、ホ、ヌフオサ、キ、ニ、ッ、タ、オ、、。」

1.3 P-III、ヌ-nopsy、サネ、テ、ニ、゙、ケ、ャ。「テル、、、ヌ、ケ。」
A. OS、ャSSE、ヒツミア、キ、ニ、、、ハ、、、ホ、ォ、筅キ、、゙、サ、。」
Linux、ホセケ遑「kernel、ヒPIII.patch、ナ、ニ、ノャヘラ、ャ、「、熙゙、ケ。」
シオ、オ、、ホpage、ヒネクシー・ォ。シ・ヘ・・ム・テ・チ、ャ、「、熙゙、ケ。」
>http://www.aial.hiroshima-u.ac.jp/~sakai/Linux/
ニノ、、ヌーユフ」、ャハャ、ォ、鬢ハ、、ハ、マサ゚、皃ソ、ロ、ヲ、ャ、隍、、ヌ、キ、遉ヲ。」
FreeBSD、ヌ、筵ム・テ・チ、ャスミヘ隍ト、ト、「、、隍ヲ、ヌ、ケ。」
Windows、ハ、鬣ミ。シ・ク・逾・「・テ・ラ、ケ、、ミフ萃熙ハ、、、ヌ、ケ。」
BeOS、マツミア、キ、ニ、、、、隍ヲ、ヌ、ケ。」

1.4 1サエヨト・ィ・・ウ。シ・ノ、キ、ニ、、、、ネ・マ・・ー、キ、゙、ケ。」
A. ヌョヒスチ、ホイトヌスタュ、ャ、「、熙゙、ケ。」
、筅キ。「・ェ。シ・ミ。シ・ッ・・テ・ッ、、キ、ニ、、、、ホ、ハ、鯑フセ、ホ・ッ・・テ・ッ、ヒフ皃ケ。「ヌョツミコ、、キ、テ、ォ、熙ケ、ナ、ホス霤ヨ、、キ、ニ、ッ、タ、オ、、。」
、ス、ヲ、キ、ソセケ遉ヌ、筵マ・・ー、ケ、セケ遉マ・ミ・ー、ォ、筅キ、、ハ、、、ホ、ヌ、エマ「ヘイシ、オ、、。」

1.5 3D Now!ヘュクサ、ネフオクサ、ヌタクタョ、オ、、mp3・ユ・。・、・、ャー网、、゙、ケ。」
A. 3D Now!、膣SE、ネFPU、ネ、ヌ、マニ篷タコナル、ヒー网、、ャ、「、、ソ、皃ヌ、ケ。」
フオサ、ヌ、ュ、クコケ、ヌ、ケ、ホ、ヌオ、、ヒ、キ、ハ、、、ヌイシ、オ、、。」

1.6 Enhanced 3D Now!、テ、ニク、、、ニ、゙、ケ?
A. 、チ、网、ネヘヘム、キ、ニ、、、゙、ケ。」クイ、オ、、ニ、、、ハ、ャツソ、、、隍ヲ、ヌ、ケ、ャ。「Athlon、ヌウネト・、オ、、ソ3D Now!フソホ皃マソクト、キ、ォ、「、熙゙、サ、。」
、、、、讀Athlonコヌナャイス、ネ、、、ヲ、ホ、マ、ス、、鬢ホフソホ皃サネ、ヲ、ウ、ネ。「、ヌ、マ、ハ、ッK6-2, K6-III、ネ、マー网テ、ソフソホ眇鄂、ヌコヌナャイス、ケ、、ウ、ネ、ネ、ネ、鬢ィ、ソ、ロ、ヲ、ャホノ、、、ネサラ、、、゙、ケ。」

、ハ、ェ。「、、、、讀・゙・・チ・皈ヌ・」・「キマフソホ皃ヒ、マMMX、ホツセ、ヒ
3D Now!
SSE
Enhanced 3D Now! = 3D Now! + ソフソホ
MMX Extension = MMX + ツサウ、ホフソホ
、ャ、「、遙「PIII、ヌ、マSSE、ネMMX Ext., Athlon、ヌ、マEnh. 3D Now!、ネMMX Ext.、ャサネヘムイトヌス、ヌ、ケ。」

1.7 コヌソキ、ホlame、ヒトノスセ、キ、ハ、、、ホ、ヌ、ケ、ォ?
A. lame3.28、ホサ、ォ、鯢ノタク、キ、ソク盧螟マ、筅マ、萢ワイネ、ネ、マチエチウー网ヲ、筅ホ、ヒ、ハ、テ、ニ、、、゙、ケ。」
、ス、ホ、ソ、眛ノスセ、ケ、、ホ、マカヒ、皃ニコ、ニ、ヌ、ケ。」
コヌソキ、ホlame、サネ、、、ソ、、ハ、マチヌトセ、ヒ、ス、チ、鬢サネ、テ、ニ、ッ、タ、オ、、。」

1.8 VBRツミア、マ?
A. 2.22、ー、鬢、、ォ、鯆ミア、マ、キ、ニ、、、゙、ケ。」、ソ、タ、「、、゙、セ隍オ、、ヌ、マ、ハ、、、ホ、ヌVBR、テ豼エ、ヒ
サネ、ヲ、ホ、ハ、鯆セ、ホ・ィ・・ウ。シ・タ、、エヘヘム、ハ、オ、テ、ソ、ロ、ヲ、ャ、隍、、ヌ、キ、遉ヲ。」

2.1 、ノ、ホ・ェ・ラ・キ・逾、ヌ・ィ・・ウ。シ・ノ、ケ、、ホ、ャホノ、、、ホ、ヌ、ケ、ォ?
A. 、ウ、、マサネ、ヲソヘ、ホエカウミ、莽ムナモ、ヒ、隍テ、ニーロ、ハ、熙゙、ケ。」
ツセソヘヌ、、サ、ヌ、マ、ハ、ッ、エシォソネ、ヌネステヌ、キ、ニ、ッ、タ、オ、、。」
、隍ッキヌシィネヌ、ヌ。ヨ。。、ホ・ィ・・ウ。シ・タ、サネ、テ、ニ、゙、ケ、ャ。「、ウ、ホ・ィ・・ウ。シ・タ、ホノセネス、マ、ノ、ヲ、ハ、、ヌ、キ、遉ヲ。ラ
、ネクタ、テ、ソホ爨ホシチフ荀ャクォシ、ア、鬢、゙、ケ、ャチエ、ッ・ハ・・サ・・ケ、ヌ、ケ。」エユゼ、ケ、、ホ、マツセソヘ、ヌ、ハ、ッシォハャ、ハ、ホ、ヌ、ケ、ォ、鬘」

ク盧螟サネ、ヲセケ遉マシ隍ケ遉ィ、コ-nopsy、、ト、ア、、ォ。「、ト、ア、ハ、、、ォ、ヌ、ノ、ホトナルイサシチ、ャハム、、、ホ、ォ、・チ・ァ・テ・ッ、キ、ニ、゚、ニイシ、オ、、。」
ー网、、ャハャ、ォ、鬢ハ、、、ホ、ヌ、キ、ソ、-nopsy、、ト、ア、、ホ、ャ、隍、、ヌ、キ、遉ヲ。」ケ篦ョ、ヒ・ィ・・ウ。シ・ノスミヘ隍゙、ケ。」
シ。、ヒネステヌ、ケ、、ホ、マ・モ・テ・ネ・。シ・ネ、タ、ネサラ、、、゙、ケ。」
・ケ・ニ・・ェ44.1kHz、ホセケ112。チ160kbps、ヌ・ィ・・ウ。シ・ノ、ケ、、ホ、ャーネフナェ、ヌ、ケ。」
サィサオュサ、ホイサシチノセイチ、ヌ。ヨ・キ・・ミ・、ホイサ、ャ、隍、。ラナ、ネス、ォ、、ニ、、、、ネ、ュ、マ・。シ・ム・ケ・ユ・」・・ソ、ャタレ、鬢、ニ、、、イトヌスタュ、ャケ筅、、ヌ、ケ。」
ニテシ、ハサセ、ャフオ、、クツ、128kbpsーハイシ、ヌ・ィ・・ウ。シ・ノ、ケ、セケ遉マ・。シ・ム・ケ・ユ・」・・ソ、サネ、ヲ(-lpf on)、ヒ、キ、ニ、ッ、タ、オ、、。」

コ」・ミ。シ・ク・逾、ヌ、マ -lpf, -th ・ェ・ラ・キ・逾、ヒ、隍コル、ォ、ッ・ユ・」・・ソス靉、 j-stereo サネヘムサ、ホ i-stereo, M/S-stereo タレツリ、ィ、ホネトエター、ャスミヘ隍、隍ヲ、ヒ、ハ、熙゙、キ、ソ。」、、、、、、、、、ク、テ、ニ、゚、、ネ、隍、、ォ、筅キ、、゙、サ、。」

2.2 stereo・筍シ・ノ、ヌ・ィ・・ウ。シ・ノ、キ、ソ、、。」
A. -m s・ェ・ラ・キ・逾、サネ、テ、ニ、ッ、タ、オ、、。」

2.3 サ荀ホ・゙・キ・、ヌ、マ・ル・・チ、ヒサエヨ、ャウン、ォ、テ、ニツヤ、ニ、゙、サ、。」
A. -test、ヌ、マ600ノテ、ホカ・ィ・・ウ。シ・ノ、ケ、、ホ、ヌサエヨ、ャウン、ォ、熙゙、ケ。」
-test20、ネ、ケ、、ネ20ノテ、タ、アツャト熙キ、゙、ケ。」-silent、ネハサヘム、ケ、、ウ、ネ、箚トヌス、ヌ、ケ。」

3.1 CD、ォ、鯑セタワmp3、コ、熙ソ、、。」
A. 、筅、ワ、キ。、鬢爨オ、コ、ホcd2wav、ャgogo.dll、ヒツミア、キ、ニ、、、゙、ケ。」
>http://www2s.biglobe.ne.jp/~elfin/
・ウ・゙・・ノ・鬣、・・゙・ヒ・「(セミ)、ホハ、マ
ナウ、ホモ、オ、、ホ。リイ、キ、、ク盧螟ホイ皃エ、キハ。ル
>http://isw.main.eng.hokudai.ac.jp/~tokai/COMP/ayagogo.html
、サイセネ、キ、ニ、ッ、タ、オ、、。」

3.2 サ荀稟ogo.dll、クニ、モスミ、ケ・「・ラ・熙コ、熙゙、キ、ソ。」
A. 、「、熙ャ、ネ、ヲ、エ、カ、、、゙、ケ。」
ーナルク盧螟ホヌロノユキチシー、ヌ、「、LGPL、ヒフワ、トフ、オ、、ニ、ォ、鮑盧螟ホキヌシィネト
>http://www.infoaomori.ne.jp/~fuge/ken/bbs2.html
、ヌナャサタナチ、キ、ニ、ッ、タ、オ、、。」

3.3 イマニクテマヘ、ヌニー、ォ、キ、ニ、、ホ、ヌ、ケ、ャ -cpu 1、ネ、「、、゙、ハム、、熙゙、サ、。」
A. WindowsヘムSMP・。シ・チ・、マ DLL 、・オ・ン。シ・ネ、キ、ハ、ア、、ミ、ハ、鬢ハ、、、ソ、皈ケ・・テ・ノエヨ、ホ・皈筵ナセチ、ヒフオツフ、ャ、「、、ソ、皃ヌ、ケ。」
、゙、ソLinux、ヌ、筅ス、、ロ、ノ・ム・ユ・ゥ。シ・゙・・ケ、ャチ、ィ、ハ、、、ホ、マ・゙・カ。シ、ホサナヘヘセ薛2・ュ・罕テ・キ・蠡ーケ鄲ュ、ホ、ソ、皃ヒシツ・皈筵熙サイセネ、ケ、ノャヘラ、ャ、「、、ォ、鬢タ、ス、ヲ、ヌ、ケ。」

4.1 ノスシィ・皈テ・サ。シ・ク、ニヒワク、ヒ、キ、ソ、、。」
A. setenv LC_MESSAGES ja_JP.SJIS 、ハ、ノ、ネ、キ、ニタ゚ト熙キ、ニイシ、オ、、。」

4.2 ・ム・、・ラ、サネ、テ、ソCD、ォ、鬢ホトセタワ・ィ・・ウ。シ・ノ、、荀熙ソ、、。」
A. シオ、オ、、ホweb page
>http://www.aial.hiroshima-u.ac.jp/~sakai/Linux/
、ヌセワ、キ、ッタ篶タ、オ、、ニ、、、゙、ケ。」

4.3 SMPセ螟ヌ cdparanoia、サネ、テ、ニ、、、、ホ、ヌ、ケ、ャテル、、、ヌ、ケ。」
A. cdparanoia、マ・キ・・ー・・ケ・・テ・ノ、ヌニーコ、ケ、、ソ、皃ヌ、ケ。」・゙・・チ・ケ・・テ・ノ、ヌニーコ、ケ、cdda2wav、サネヘム、キ、ニ、ッ、タ、オ、、。」

5.1 Win GUIネヌオッニーサ、ホス、ホサメ、テ、ニイソシヤ。」
A. サ荀筅隍ッテホ、熙゙、サ、。」、ノ、ウ、ォ、ホpage、ヌイタ筅オ、、ニ、、、ソ、隍ヲ、ハ。」
ノスシィ、キ、ソ、ッ、ハ、、セケ遉マタ゚ト熙ヌハムケケスミヘ隍゙、ケ。」コヌソキネヌ、ホウィ、マ、゙、ソー网ヲハ、ャス、、、ニイシ、オ、テ、ソ、ス、ヲ、ヌ、ケ。」

5.2 フセセホ、ホヘウヘ隍マ。」
A. 。リク盧螟ホ。テ罍ル、・ム・ッ、テ、ソ、ネ、、、ヲ、ホ、マツッタ筅ヌソソシツ、マノヤフタ。」

5.3 ク盧螟ホ・ル・・チ、テ、ニイソ?
A. ・ル・・チ・゙。シ・ッ・筍シ・ノ、ヌ、ケ。」、゚、、ハサイタ、キ、ニ、ッ、タ、オ、、。」

5.4 ク盧螟ホ・ェ・ユイ、マ、ノ、ヲ、ヌ、キ、ソ?
A. スクケ鄒ス熙サリト熙キ、ソサ荀タ、ア、ャエヨー网テ、ソセス熙ヌ、ト、テ、ソ、テ、ニ、、、ニ。「テル、、゙、キ、ソ。」、ケ、、゙、サ、。」
・ェ・ユイシォツホ、マ。「トチ、キ、、、ウ、ネ、ヒ6ソヘ、ホテッーソヘ・ホ。シ・ネPC、スヘュ、サ、コ。「、ネ、ニ、箙チエ、ハハ筅ウ、ヲイ、ヌ、キ、ソ。」

5.5 ク盧螟ホ・ウ。シ・タ。シ。「ク盧螟ホ、ウ。シ、タ、ヒ、ト、、、ニ、ホシチフ荀マ?
A. ータレシ、アノユ、ア、ニ、゙、サ、。」、マ、、。」


ク豌ユクォ、マクタョシ「タク、゙、ヌ、ェエ熙、、キ、゙、ケ
gogo239b/japandoc/faq.txt100644 23421 144 14620 7220537254 14446 0ustar shigeousers ク盧螟ホ、ウ。チ、タ、ホオシツコョケ蹤AQ updated '00/4/9 1. エヒワナェ、ハシチフ 1.1 stereo、ネM/S-stereo, j-stereo、ホー网、、マ? 1.2 j-stereo、ヌ・ィ・・ウ。シ・ノ、キ、ソ、ホ、ヒM/S-stereo、ネノスシィ、オ、、゙、ケ。」 1.3 P-III、ヌ-nopsy、サネ、テ、ニ、゙、ケ、ャ。「テル、、、ヌ、ケ。」 1.4 1サエヨト・ィ・・ウ。シ・ノ、キ、ニ、、、、ネ・マ・・ー、キ、゙、ケ。」 1.5 3D Now!ヘュクサ、ネフオクサ、ヌタクタョ、オ、、mp3・ユ・。・、・、ャー网、、゙、ケ。」 1.6 Enhanced 3D Now!、テ、ニク、、、ニ、゙、ケ? 1.7 コヌソキ、ホlame、ヒトノスセ、キ、ハ、、、ホ、ヌ、ケ、ォ? 1.8 VBRツミア、マ? 2. ・ェ・ラ・キ・逾、ヒ、ト、、、ニ、ホシチフ 2.1 、ノ、ホ・ェ・ラ・キ・逾、ヌ・ィ・・ウ。シ・ノ、ケ、、ホ、ャホノ、、、ホ、ヌ、ケ、ォ? 2.2 stereo・筍シ・ノ、ヌ・ィ・・ウ。シ・ノ、キ、ソ、、。」 2.3 サ荀ホ・゙・キ・、ヌ、マ・ル・・チ、ヒサエヨ、ャウン、ォ、テ、ニツヤ、ニ、゙、サ、。」 3. Windowsクヌヘュ、ホシチフ 3.1 CD、ォ、鯑セタワmp3、コ、熙ソ、、。」 3.2 サ荀稟ogo.dll、クニ、モスミ、ケ・「・ラ・熙コ、熙゙、キ、ソ。」 3.3 イマニクテマヘ、ヌニー、ォ、キ、ニ、、ホ、ヌ、ケ、ャ -cpu 1、ネ、「、、゙、ハム、、熙゙、サ、。」 4. UNIXキマOSクヌヘュ、ホシチフ 4.1 ノスシィ・皈テ・サ。シ・ク、ニヒワク、ヒ、キ、ソ、、。」 4.2 ・ム・、・ラ、サネ、テ、ソCD、ォ、鬢ホトセタワ・ィ・・ウ。シ・ノ、、荀熙ソ、、。」 4.3 SMPセ螟ヌ cdparanoia、サネ、テ、ニ、、、、ホ、ヌ、ケ、ャテル、、、ヌ、ケ。」 5. 、ス、ホツセ 5.1 Win GUIネヌオッニーサ、ホス、ホサメ、テ、ニイソシヤ。」 5.2 フセセホ、ホヘウヘ隍マ。」 5.3 ク盧螟ホ・ル・・チ、テ、ニイソ? 5.4 ク盧螟ホ・ェ・ユイ、マ、ノ、ヲ、ヌ、キ、ソ? 5.5 ク盧螟ホ・ウ。シ・タ。シ。「ク盧螟ホ、ウ。シ、タ、ヒ、ト、、、ニ、ホシチフ荀マ? ------------------------------------------------------------------------ 1.1 stereo、ネM/S-stereo, j-stereo、ホー网、、マ? A. stereo、マコクアヲ、ホ・チ・罕・ヘ・、ニネホゥ、ヒス靉、ケ、ハシー、ヌ、ケ。」 M/S-stereo、マ・ヌ。シ・ソ、テ豎、ネコクアヲ、ホー网、、ヒハャ、ア、ニス靉、キ、゙、ケ。」 コクアヲ、ホ・ヌ。シ・ソ、ャ、隍ッサ、ニ、、、サ、マ、ヲ、゙、ッーオスフ、ヌ、ュ、゙、ケ、ャ。「・ケ・ニ・・ェエカ、ャクコ、、ォ、筅キ、、゙、サ、。」 j-stereo・筍シ・ノ、マウニ・ユ・。シ・猴隍ヒstereo、ネM/S-stereo、ホ、ノ、チ、鬢ォ、ャチェツ、オ、、ソコョケ逾筍シ・ノ、ヌ、ケ。」 1.2 j-stereo、ヌ・ィ・・ウ。シ・ノ、キ、ソ、ホ、ヒM/S-stereo、ネノスシィ、オ、、゙、ケ。」 A. ク盧螟ホj-stereo・ィ・・ウ。シ・ノ、ヌ、マM/S-stereo、ネstereo、ホタレツリ、ィ、ホノムナル、ャネセ、ヒセッ、ハ、、、ソ、皃ヌ、ケ。」 、ネ、ッ、ヒウイ、ャ、「、、、ア、ヌ、マ、ハ、、、ホ、ヌフオサ、キ、ニ、ッ、タ、オ、、。」 1.3 P-III、ヌ-nopsy、サネ、テ、ニ、゙、ケ、ャ。「テル、、、ヌ、ケ。」 A. OS、ャSSE、ヒツミア、キ、ニ、、、ハ、、、ホ、ォ、筅キ、、゙、サ、。」 Linux、ホセケ遑「kernel、ヒPIII.patch、ナ、ニ、ノャヘラ、ャ、「、熙゙、ケ。」 シオ、オ、、ホpage、ヒネクシー・ォ。シ・ヘ・・ム・テ・チ、ャ、「、熙゙、ケ。」 >http://www.aial.hiroshima-u.ac.jp/~sakai/Linux/ ニノ、、ヌーユフ」、ャハャ、ォ、鬢ハ、、ハ、マサ゚、皃ソ、ロ、ヲ、ャ、隍、、ヌ、キ、遉ヲ。」 FreeBSD、ヌ、筵ム・テ・チ、ャスミヘ隍ト、ト、「、、隍ヲ、ヌ、ケ。」 Windows、ハ、鬣ミ。シ・ク・逾・「・テ・ラ、ケ、、ミフ萃熙ハ、、、ヌ、ケ。」 BeOS、マツミア、キ、ニ、、、、隍ヲ、ヌ、ケ。」 1.4 1サエヨト・ィ・・ウ。シ・ノ、キ、ニ、、、、ネ・マ・・ー、キ、゙、ケ。」 A. ヌョヒスチ、ホイトヌスタュ、ャ、「、熙゙、ケ。」 、筅キ。「・ェ。シ・ミ。シ・ッ・・テ・ッ、、キ、ニ、、、、ホ、ハ、鯑フセ、ホ・ッ・・テ・ッ、ヒフ皃ケ。「ヌョツミコ、、キ、テ、ォ、熙ケ、ナ、ホス霤ヨ、、キ、ニ、ッ、タ、オ、、。」 、ス、ヲ、キ、ソセケ遉ヌ、筵マ・・ー、ケ、セケ遉マ・ミ・ー、ォ、筅キ、、ハ、、、ホ、ヌ、エマ「ヘイシ、オ、、。」 1.5 3D Now!ヘュクサ、ネフオクサ、ヌタクタョ、オ、、mp3・ユ・。・、・、ャー网、、゙、ケ。」 A. 3D Now!、膣SE、ネFPU、ネ、ヌ、マニ篷タコナル、ヒー网、、ャ、「、、ソ、皃ヌ、ケ。」 フオサ、ヌ、ュ、クコケ、ヌ、ケ、ホ、ヌオ、、ヒ、キ、ハ、、、ヌイシ、オ、、。」 1.6 Enhanced 3D Now!、テ、ニク、、、ニ、゙、ケ? A. 、チ、网、ネヘヘム、キ、ニ、、、゙、ケ。」クイ、オ、、ニ、、、ハ、ャツソ、、、隍ヲ、ヌ、ケ、ャ。「Athlon、ヌウネト・、オ、、ソ3D Now!フソホ皃マソクト、キ、ォ、「、熙゙、サ、。」 、、、、讀Athlonコヌナャイス、ネ、、、ヲ、ホ、マ、ス、、鬢ホフソホ皃サネ、ヲ、ウ、ネ。「、ヌ、マ、ハ、ッK6-2, K6-III、ネ、マー网テ、ソフソホ眇鄂、ヌコヌナャイス、ケ、、ウ、ネ、ネ、ネ、鬢ィ、ソ、ロ、ヲ、ャホノ、、、ネサラ、、、゙、ケ。」 、ハ、ェ。「、、、、讀・゙・・チ・皈ヌ・」・「キマフソホ皃ヒ、マMMX、ホツセ、ヒ 3D Now! SSE Enhanced 3D Now! = 3D Now! + ソフソホ MMX Extension = MMX + ツサウ、ホフソホ 、ャ、「、遙「PIII、ヌ、マSSE、ネMMX Ext., Athlon、ヌ、マEnh. 3D Now!、ネMMX Ext.、ャサネヘムイトヌス、ヌ、ケ。」 1.7 コヌソキ、ホlame、ヒトノスセ、キ、ハ、、、ホ、ヌ、ケ、ォ? A. lame3.28、ホサ、ォ、鯢ノタク、キ、ソク盧螟マ、筅マ、萢ワイネ、ネ、マチエチウー网ヲ、筅ホ、ヒ、ハ、テ、ニ、、、゙、ケ。」 、ス、ホ、ソ、眛ノスセ、ケ、、ホ、マカヒ、皃ニコ、ニ、ヌ、ケ。」 コヌソキ、ホlame、サネ、、、ソ、、ハ、マチヌトセ、ヒ、ス、チ、鬢サネ、テ、ニ、ッ、タ、オ、、。」 1.8 VBRツミア、マ? A. 2.22、ー、鬢、、ォ、鯆ミア、マ、キ、ニ、、、゙、ケ。」、ソ、タ、「、、゙、セ隍オ、、ヌ、マ、ハ、、、ホ、ヌVBR、テ豼エ、ヒ サネ、ヲ、ホ、ハ、鯆セ、ホ・ィ・・ウ。シ・タ、、エヘヘム、ハ、オ、テ、ソ、ロ、ヲ、ャ、隍、、ヌ、キ、遉ヲ。」 2.1 、ノ、ホ・ェ・ラ・キ・逾、ヌ・ィ・・ウ。シ・ノ、ケ、、ホ、ャホノ、、、ホ、ヌ、ケ、ォ? A. 、ウ、、マサネ、ヲソヘ、ホエカウミ、莽ムナモ、ヒ、隍テ、ニーロ、ハ、熙゙、ケ。」 ツセソヘヌ、、サ、ヌ、マ、ハ、ッ、エシォソネ、ヌネステヌ、キ、ニ、ッ、タ、オ、、。」 、隍ッキヌシィネヌ、ヌ。ヨ。。、ホ・ィ・・ウ。シ・タ、サネ、テ、ニ、゙、ケ、ャ。「、ウ、ホ・ィ・・ウ。シ・タ、ホノセネス、マ、ノ、ヲ、ハ、、ヌ、キ、遉ヲ。ラ 、ネクタ、テ、ソホ爨ホシチフ荀ャクォシ、ア、鬢、゙、ケ、ャチエ、ッ・ハ・・サ・・ケ、ヌ、ケ。」エユゼ、ケ、、ホ、マツセソヘ、ヌ、ハ、ッシォハャ、ハ、ホ、ヌ、ケ、ォ、鬘」 ク盧螟サネ、ヲセケ遉マシ隍ケ遉ィ、コ-nopsy、、ト、ア、、ォ。「、ト、ア、ハ、、、ォ、ヌ、ノ、ホトナルイサシチ、ャハム、、、ホ、ォ、・チ・ァ・テ・ッ、キ、ニ、゚、ニイシ、オ、、。」 ー网、、ャハャ、ォ、鬢ハ、、、ホ、ヌ、キ、ソ、-nopsy、、ト、ア、、ホ、ャ、隍、、ヌ、キ、遉ヲ。」ケ篦ョ、ヒ・ィ・・ウ。シ・ノスミヘ隍゙、ケ。」 シ。、ヒネステヌ、ケ、、ホ、マ・モ・テ・ネ・。シ・ネ、タ、ネサラ、、、゙、ケ。」 ・ケ・ニ・・ェ44.1kHz、ホセケ112。チ160kbps、ヌ・ィ・・ウ。シ・ノ、ケ、、ホ、ャーネフナェ、ヌ、ケ。」 サィサオュサ、ホイサシチノセイチ、ヌ。ヨ・キ・・ミ・、ホイサ、ャ、隍、。ラナ、ネス、ォ、、ニ、、、、ネ、ュ、マ・。シ・ム・ケ・ユ・」・・ソ、ャタレ、鬢、ニ、、、イトヌスタュ、ャケ筅、、ヌ、ケ。」 ニテシ、ハサセ、ャフオ、、クツ、128kbpsーハイシ、ヌ・ィ・・ウ。シ・ノ、ケ、セケ遉マ・。シ・ム・ケ・ユ・」・・ソ、サネ、ヲ(-lpf on)、ヒ、キ、ニ、ッ、タ、オ、、。」 コ」・ミ。シ・ク・逾、ヌ、マ -lpf, -th ・ェ・ラ・キ・逾、ヒ、隍コル、ォ、ッ・ユ・」・・ソス靉、 j-stereo サネヘムサ、ホ i-stereo, M/S-stereo タレツリ、ィ、ホネトエター、ャスミヘ隍、隍ヲ、ヒ、ハ、熙゙、キ、ソ。」、、、、、、、、、ク、テ、ニ、゚、、ネ、隍、、ォ、筅キ、、゙、サ、。」 2.2 stereo・筍シ・ノ、ヌ・ィ・・ウ。シ・ノ、キ、ソ、、。」 A. -m s・ェ・ラ・キ・逾、サネ、テ、ニ、ッ、タ、オ、、。」 2.3 サ荀ホ・゙・キ・、ヌ、マ・ル・・チ、ヒサエヨ、ャウン、ォ、テ、ニツヤ、ニ、゙、サ、。」 A. -test、ヌ、マ600ノテ、ホカ・ィ・・ウ。シ・ノ、ケ、、ホ、ヌサエヨ、ャウン、ォ、熙゙、ケ。」 -test20、ネ、ケ、、ネ20ノテ、タ、アツャト熙キ、゙、ケ。」-silent、ネハサヘム、ケ、、ウ、ネ、箚トヌス、ヌ、ケ。」 3.1 CD、ォ、鯑セタワmp3、コ、熙ソ、、。」 A. 、筅、ワ、キ。、鬢爨オ、コ、ホcd2wav、ャgogo.dll、ヒツミア、キ、ニ、、、゙、ケ。」 >http://www2s.biglobe.ne.jp/~elfin/ ・ウ・゙・・ノ・鬣、・・゙・ヒ・「(セミ)、ホハ、マ ナウ、ホモ、オ、、ホ。リイ、キ、、ク盧螟ホイ皃エ、キハ。ル >http://isw.main.eng.hokudai.ac.jp/~tokai/COMP/ayagogo.html 、サイセネ、キ、ニ、ッ、タ、オ、、。」 3.2 サ荀稟ogo.dll、クニ、モスミ、ケ・「・ラ・熙コ、熙゙、キ、ソ。」 A. 、「、熙ャ、ネ、ヲ、エ、カ、、、゙、ケ。」 ーナルク盧螟ホヌロノユキチシー、ヌ、「、LGPL、ヒフワ、トフ、オ、、ニ、ォ、鮑盧螟ホキヌシィネト >http://www.infoaomori.ne.jp/~fuge/ken/bbs2.html 、ヌナャサタナチ、キ、ニ、ッ、タ、オ、、。」 3.3 イマニクテマヘ、ヌニー、ォ、キ、ニ、、ホ、ヌ、ケ、ャ -cpu 1、ネ、「、、゙、ハム、、熙゙、サ、。」 A. WindowsヘムSMP・。シ・チ・、マ DLL 、・オ・ン。シ・ネ、キ、ハ、ア、、ミ、ハ、鬢ハ、、、ソ、皈ケ・・テ・ノエヨ、ホ・皈筵ナセチ、ヒフオツフ、ャ、「、、ソ、皃ヌ、ケ。」 、゙、ソLinux、ヌ、筅ス、、ロ、ノ・ム・ユ・ゥ。シ・゙・・ケ、ャチ、ィ、ハ、、、ホ、マ・゙・カ。シ、ホサナヘヘセ薛2・ュ・罕テ・キ・蠡ーケ鄲ュ、ホ、ソ、皃ヒシツ・皈筵熙サイセネ、ケ、ノャヘラ、ャ、「、、ォ、鬢タ、ス、ヲ、ヌ、ケ。」 4.1 ノスシィ・皈テ・サ。シ・ク、ニヒワク、ヒ、キ、ソ、、。」 A. setenv LC_MESSAGES ja_JP.SJIS 、ハ、ノ、ネ、キ、ニタ゚ト熙キ、ニイシ、オ、、。」 4.2 ・ム・、・ラ、サネ、テ、ソCD、ォ、鬢ホトセタワ・ィ・・ウ。シ・ノ、、荀熙ソ、、。」 A. シオ、オ、、ホweb page >http://www.aial.hiroshima-u.ac.jp/~sakai/Linux/ 、ヌセワ、キ、ッタ篶タ、オ、、ニ、、、゙、ケ。」 4.3 SMPセ螟ヌ cdparanoia、サネ、テ、ニ、、、、ホ、ヌ、ケ、ャテル、、、ヌ、ケ。」 A. cdparanoia、マ・キ・・ー・・ケ・・テ・ノ、ヌニーコ、ケ、、ソ、皃ヌ、ケ。」・゙・・チ・ケ・・テ・ノ、ヌニーコ、ケ、cdda2wav、サネヘム、キ、ニ、ッ、タ、オ、、。」 5.1 Win GUIネヌオッニーサ、ホス、ホサメ、テ、ニイソシヤ。」 A. サ荀筅隍ッテホ、熙゙、サ、。」、ノ、ウ、ォ、ホpage、ヌイタ筅オ、、ニ、、、ソ、隍ヲ、ハ。」 ノスシィ、キ、ソ、ッ、ハ、、セケ遉マタ゚ト熙ヌハムケケスミヘ隍゙、ケ。」コヌソキネヌ、ホウィ、マ、゙、ソー网ヲハ、ャス、、、ニイシ、オ、テ、ソ、ス、ヲ、ヌ、ケ。」 5.2 フセセホ、ホヘウヘ隍マ。」 A. 。リク盧螟ホ。テ罍ル、・ム・ッ、テ、ソ、ネ、、、ヲ、ホ、マツッタ筅ヌソソシツ、マノヤフタ。」 5.3 ク盧螟ホ・ル・・チ、テ、ニイソ? A. ・ル・・チ・゙。シ・ッ・筍シ・ノ、ヌ、ケ。」、゚、、ハサイタ、キ、ニ、ッ、タ、オ、、。」 5.4 ク盧螟ホ・ェ・ユイ、マ、ノ、ヲ、ヌ、キ、ソ? A. スクケ鄒ス熙サリト熙キ、ソサ荀タ、ア、ャエヨー网テ、ソセス熙ヌ、ト、テ、ソ、テ、ニ、、、ニ。「テル、、゙、キ、ソ。」、ケ、、゙、サ、。」 ・ェ・ユイシォツホ、マ。「トチ、キ、、、ウ、ネ、ヒ6ソヘ、ホテッーソヘ・ホ。シ・ネPC、スヘュ、サ、コ。「、ネ、ニ、箙チエ、ハハ筅ウ、ヲイ、ヌ、キ、ソ。」 5.5 ク盧螟ホ・ウ。シ・タ。シ。「ク盧螟ホ、ウ。シ、タ、ヒ、ト、、、ニ、ホシチフ荀マ? A. ータレシ、アノユ、ア、ニ、゙、サ、。」、マ、、。」 ------------------------------------------------------------------------ gogo239b/japandoc/install.txt100644 23421 144 15436 7225621757 15362 0ustar shigeousers 各種OSでの午後のこ〜だの作り方 updated 2001/1/6 ◆ 概要 ここではTownsOS, Linux, FreeBSD, Windows-console/DLL, BeOS, OS/2 などの各種OS上での午後のこ〜だの作り方や注意点を説明します。 Solaris for x86でも作れたそうです。cygwinでも出来ます。 マルチスレッド版で動作報告があるのは現在Linux + libc6, WinNT/2000, BeOS, Solarisだけです。FreeBSDは4.0R+Linux emu上でなら動作 するかもしれません。 また、東海林さんによる `怪しい午後の過ごし方' (VC++で午後をbuildする) >http://isw.main.eng.hokudai.ac.jp/~tokai/new/comp/ayagogo.html もとさんによる `gccでgogo.dllを作る方法!' (Mingw32-gccで午後をmakeする) >http://homepage2.nifty.com/moto-h/junk/gogo_gcc.html なども参考にして下さい(お二人にこの場を借りて感謝します)。 ◆ 必要なもの NASM-0.98以降が必要です。各自入手してください。 >http://www.web-sites.co.uk/nasm/ MASM系アセンブラ(386asm, tasm, lasm等)では文法が違うためアセンブル 出来ません。また、UNIX系のgasでもアセンブル出来ません。 ◆ グローバルな定義 (1) ファイル名に日本語SJISを使う方は common.h に JAPANESE_SPC を 定義して下さい(デフォルト)。 pathの中に`\'を含む2byte文字の処理が追加されます。 多言語に対応するために分離させた german.msg をnkf等に通すと コンパイル出来なくなる可能性があります。改行コード以外は変更 しないで下さい。 japan.msg は内部で自動判別するので SJIS, EUCどちらでも大丈夫です。 (2) USE_E3DN=yesとするとAthlon用Enhanced 3D Now!命令を使います。 但し、NASMにパッチを当てる必要があります。(後述) あるいは http://homepage1.nifty.com/herumi/soft/3dnow18.lzh を取ってきて % lha x 3dnow18.lzh % gcc -DONLY_E3DN *.c % ./a.out mdct3dn.nas % mv -f mdct3dn.asm mdct3dn.nas の様にしてEnhanced 3D Now!命令のみを事前にアセンブルして下さい。 前処理が必要なソースは % grep -l pswapd *.nas です。 (3) USE_VBR=yesとするとVBRを使えるようになります。 使わなくてもoffにする必要はありません。 -v 7 -b 80 で -b 112 程度のファイルサイズです。 (4) RAW_INPUTを定義するとwavファイル以外のPCMデータ対応オプションが 使えるようになります。 使わなくてもoffにする必要はありません。 (5) Linux + libc6, BeOS, WindowsNT/2k, (Solarisも?)で USE_MT=yesとすると並列CPU対応になります。 古いFreeBSDやLinux libc5, Win 95/98では使えません。 (6) loop.c, musenc.c の先頭の方にある PEN** オプションは新設されたフィルタ 処理です。未定義にすれば今までのアルゴリズムに戻り処理が若干速くなります。 ◆ 各OSについて (1) Windows-console ソースの漢字コードをEUCからSJISに変更して下さい。変換が必要なファイルは *.{c,h}とjapanese.msgです。 Win2000上でbuildする場合は`地域'を英語にすれば無修正で出来ます。 VC++の場合、添加のgogo.dswをプロジェクトを選んでから [アクティプな構成の設定]で{console,DLL}-Releaseを選択してください。 他のCコンパイラでは *.nasに対して [コマンド] nasm -f win32 -DWIN32 $(InputName).nas [出力] $(InputName).obj に相当する設定をしてください。その後普通にビルドするだけです。 Cで定義されていると仮定するマクロはWIN32, _CONSOLEです。 VC++以外でのDLLの作り方はどなたかお願いします。 Borland C++を使うときは nasm -f obj -DWIN32 -D__BORLANDC__ *.nas として下さい。ASFLAGSを修正するだけで良いはずです。 cygwin-gccには専用のmakefile.cygwinを用意しました。 Watcom-C/C++ 10.5J, djgpp 2.x の場合 ( savaさんに感謝! ) TGT_ENV のうちどれかひとつを有効にして、コマンドライン上から wmake -f makefile.wc を実行。環境変数 WATCOM を正しく設定しておく必要がある。 現状での制限 マルチスレッド版は作成できない。 (Watcom-C/C++ 10.5J のライブラリが、gettimeofday をサポートしていないため。 11.0 については未確認) その他適当にmkfilesを参照して下さい(^^; (2) Linux, FreeBSD 3.x, FreeBSD 2.x, NetBSD コンパイラのバージョンによってCCのオプションを適宜修正して下さい。 USE_MT=yesでマルチプロセッサに対応しますが、OSの制限があります。 Cで定義されていると仮定するマクロは__unix__です。 FreeBSD 2.x系、NetBSD/i386でもmake出来るそうです。 CC に -D__unix__ を追加する(FreeBSDでは不要かも)。 ASFLAGS = -f aoutb -D__unix__ -DAOUT .nas.o: $(AS) $(ASFLAGS) $< -o $@ と変更する(原田さん情報ありがとうございます)。 またgogo.specを使って % rpm -ta --clean gogo235.tgz で RPM ファイルを作成できます。 (3) TownsOSの場合 makefile.tosをmakefileという名前でコピーしてから、 makefileの先頭のpathの設定を各自の環境に合うよう変えて下さい。 makeはLSI-C試食版のを想定しています。 MamiyaさんがPharLap簡易OMF-386objフォーマットに対応したEXP版を 作ってくださっています (http://www.proc.org.tohoku.ac.jp/befis/) そのNASMを使う時は-f objではなく-f pharlapとしてください。 Cで定義されていると仮定するマクロは__HIGHC__です。 一部High-Cを黙らすためにcast演算子を追加する必要があります。 (4) BeOS ソースのBeOSディレクトリの中のMakeGOGO.shをシェル上から実行してください。 実行ファイル`gogo'が出来ますのでシンボリックリンク`drop gogo here'に コピーしてください。 (5) OS/2 make -f makefile.os2 で多分いけると思います。多分SMP非対応です。Samuel Audet, savaさんに感謝。 (6) cygwin Windows上でLinuxライクにgccを使う方は make -f makefile.cygwin ◆ NASMをEnhanced 3D Now!命令に対応させる --- x8 --- x8 --- x8 --- この行は含まない --- x8 --- x8 --- x8 --- x8 --- x8 --- PI2FD mmxreg,mem \301\2\x0F\x0F\110\01\x0D PENT,3DNOW,SM PI2FD mmxreg,mmxreg \2\x0F\x0F\110\01\x0D PENT,3DNOW PFNACC mmxreg,mem \301\2\x0F\x0F\110\01\x8A PENT,3DNOW,SM PFNACC mmxreg,mmxreg \2\x0F\x0F\110\01\x8A PENT,3DNOW PFPNACC mmxreg,mem \301\2\x0F\x0F\110\01\x8E PENT,3DNOW,SM PFPNACC mmxreg,mmxreg \2\x0F\x0F\110\01\x8E PENT,3DNOW PI2FW mmxreg,mem \301\2\x0F\x0F\110\01\x0C PENT,3DNOW,SM PI2FW mmxreg,mmxreg \2\x0F\x0F\110\01\x0C PENT,3DNOW PF2IW mmxreg,mem \301\2\x0F\x0F\110\01\x1C PENT,3DNOW,SM PF2IW mmxreg,mmxreg \2\x0F\x0F\110\01\x1C PENT,3DNOW PSWAPD mmxreg,mem \301\2\x0F\x0F\110\01\xBB PENT,3DNOW,SM PSWAPD mmxreg,mmxreg \2\x0F\x0F\110\01\xBB PENT,3DNOW,SM FFREEP fpureg \1\xDF\10\xC0 PENT,3DNOW,FPU --- x8 --- x8 --- x8 --- この行は含まない --- x8 --- x8 --- x8 --- x8 --- x8 --- をNASMソースのinsns.datに追加してmakeしなおして下さい。 * PSWAPD mmxreg,mmxreg にのみ`SM'がついてるのは不思議だ 但し、その場合perlが必要になります。Windowsユーザは各自インストール して下さい。 ◆その他 ソースに関する質問や改良方法、バグ報告などありましたら、 gogo-support@marinecat.forum.ne.jp までメールを下さい。 ただし、FAQ的な質問などの場合お返事を差し上げないことがあります。 gogo239b/japandoc/makefaq.awk100644 23421 144 1625 7220537254 15230 0ustar shigeousers# # awk -f makefaq.awk faq.html # BEGIN{ printf("faq<\/title><meta http-equiv=\"Content-Type\" content=\"text\/html; charset=EUC-JP\"><\/head><body>\n") flag=0 } { if($1 ~/^[1-9]\.[1-9]/){ if( flag == 0){ printf("<a href=\"#_%2d\">%s<\/a><br>\n",$1*10,$0) }else { printf("<a name=\"_%2d\"><font color=\"#1010F0\">%s<\/font><\/a><br>\n",$1*10,$0) } }else if($1 ~/------/){ flag=1 printf("<hr>\n") }else if($1 ~/^>/){ $1 = substr ($1,2) printf("><a href=\"%s\">%s</a><br>",$1,$1) }else{ printf("%s\n<br>",$0) } } END{ printf("<div align=right><a href=\"http:\/\/www.kurims.kyoto-u.ac.jp\/~shigeo\/soft.html\">[back]<\/a><\/div><p><center><address>ク豌ユクォ、マ<a href=\"mailto:shigeo@kurims.kyoto-u.ac.jp\">クタョシ「タク<\/a>、゙、ヌ、ェエ熙、、キ、゙、ケ<\/address><\/center><\/body><\/html>") } �����������������������������������������������������������������������������������������������������������gogo239b/contrib/����������������������������������������������������������������������������������� 40755 � 23421 � 144 � 0 7220537254 12677� 5����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/contrib/cdda2mp3.bsd�����������������������������������������������������������������������100644 � 23421 � 144 � 2311 7220537254 15060� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # usage: cdda2mp3 [-psy] [-dev devicename:scsibus,target,lun] [name_prefix_for_all_mp3_files [1 2 3...]] # export CDDA_DEVICE=${CDDA_DEVICE:-/dev/cd0a:0,0,0} encode() { $CDDA2WAV $CDDA2WAV_OPTS -t$TRACK - 2> /dev/null | $MP_CODER $MP_OPTIONS stdin $FILEPREFIX$TRACK.mp3 # check result code RES=$? if [ $RES = 0 ] ; then echo File $FILEPREFIX$TRACK.mp3 finished successfully. else echo File $FILEPREFIX$TRACK.mp3 failed \(result $RES\). >&2 mv -f $FILEPREFIX$TRACK.mp3 $FILEPREFIX$TRACK.failed fi } # specify the audio track listing program and its options LAT=list_audio_tracks LAT_OPTIONS='' CDDA2WAV=cdda2wav CDDA2WAV_OPTS='-Owav -H -P0 -q' MP_CODER='gogo' MP_OPTIONS='' while [ $# -gt 0 ]; do if [ x"$1" = x"-psy" ] ; then PSY=DO elif [ x"$1" = x"-dev" ] ; then shift export CDDA_DEVICE=$1 fi shift done if [ x"$PSY" != x"DO" ] ; then MP_OPTIONS="$MP_OPTIONS -nopsy" fi if [ $# = 0 ];then FILEPREFIX=audiotrack else FILEPREFIX=$1 shift fi if [ $# = 0 ];then # feed track numbers and start sectors into loop $LAT $LAT_OPTIONS 2> /dev/null | while read TRACK STARTSECTOR; do encode done else for TRACK in $@ do encode done fi �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/contrib/cdda2mp3.c�������������������������������������������������������������������������100644 � 23421 � 144 � 12711 7220537254 14557� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 1999 Keiichi SAKAI. This is wrapper for gogo with cdda2wav. Gogo and cdda2wav process are connected with pair of socket for performance reason. cdda2mp3 [-silent] [-psy|-nopsy] [-D device_spec] [-I interface_spec] [-v VB R_rate] [-b bitrate] [prefix [track_number,...]] */ #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> /* for socket */ #include <sys/types.h> #include <sys/socket.h> char opt_sgdev[32] = "0,0,0"; char opt_if[32] = "generic_scsi"; char opt_track[32] = "00"; const char *opt_nopsy = "-nopsy"; const char *opt_silent = NULL /* "-silent" */; const char *opt_vbr = NULL; const char *opt_b = NULL; char const *gogo[32] = { "gogo", }; char * const cdda2wav[] = { "cdda2wav", "-D", opt_sgdev, "-I", opt_if, "-H", "-q", "-Owav", "-P0", "-t", opt_track, "-", NULL }; char * const list_audio[] = { "list_audio_tracks", "-D", opt_sgdev, "-I", opt_if, NULL }; static int dev_null; static int cdda2mp3(const char *prefix, char *track) { int pipe_fd[2]; int status; char *mp3file; #if 1 if(socketpair(AF_UNIX, SOCK_STREAM, PF_UNIX, pipe_fd)){ fprintf(stderr, "socketpair() failed.\n"); return 1; } #else if(pipe(pipe_fd)){ fprintf(stderr, "pipe() failed.\n"); return 1; } #endif if(fork() == 0){ /* ripper process */ close(pipe_fd[0]); dup2(dev_null, 2); dup2(pipe_fd[1], 1); close(dev_null); close(pipe_fd[1]); strncpy(opt_track, track, (sizeof opt_track) - 1); execvp(cdda2wav[0], cdda2wav); fprintf(stderr, "execvp(\"cdda2wav\") failed.\n"); return 1; } if(fork() == 0){ int argc = 1; /* encoder process */ close(pipe_fd[1]); dup2(pipe_fd[0], 0); close(pipe_fd[0]); mp3file = alloca(strlen(prefix)+strlen(track)+5); strcpy(mp3file, prefix); strcat(mp3file, track); strcat(mp3file, ".mp3"); if(opt_silent != NULL){ gogo[argc++] = opt_silent; } if(opt_nopsy != NULL){ gogo[argc++] = opt_nopsy; } if(opt_b != NULL){ gogo[argc++] = "-b"; gogo[argc++] = opt_b; } if(opt_vbr != NULL){ gogo[argc++] = "-v"; gogo[argc++] = opt_vbr; } gogo[argc++] = "stdin"; gogo[argc++] = mp3file; gogo[argc++] = NULL; execvp(gogo[0], gogo); fprintf(stderr, "execvp(\"gogo\") failed.\n"); return 1; } close(pipe_fd[0]); close(pipe_fd[1]); wait(&status); wait(&status); return status; } int main(int argc, char *argv[]) { int pipe_fd[2]; int status; char buffer[4096]; int length; char *track, *sector; const char *prefix = "audiotrack"; int i; if((dev_null = open("/dev/null", O_WRONLY)) < 0){ fprintf(stderr, "open(\"/dev/null\") failed.\n"); return 1; } i = 1; while(i < argc){ if(argv[i][0] == '-'){ if(strcmp(argv[i], "-silent") == 0){ opt_silent = "-silent"; }else if(strcmp(argv[i], "-nopsy") == 0){ opt_nopsy = "-nopsy"; }else if(strcmp(argv[i], "-psy") == 0){ opt_nopsy = NULL; }else if(strcmp(argv[i], "-D") == 0){ i++; strncpy(opt_sgdev, argv[i], (sizeof opt_sgdev) - 1); }else if(strcmp(argv[i], "-I") == 0){ i++; strncpy(opt_if, argv[i], (sizeof opt_if) - 1); }else if(strcmp(argv[i], "-b") == 0){ opt_b = argv[++i]; }else if(strcmp(argv[i], "-v") == 0){ opt_vbr = argv[++i]; }else if(strncmp(argv[i], "-D", 2) == 0){ strncpy(opt_sgdev, argv[i] + 2, (sizeof opt_sgdev) - 1); }else if(strncmp(argv[i], "-I", 2) == 0){ strncpy(opt_if, argv[i] + 2, (sizeof opt_if) - 1); }else if(strncmp(argv[i], "-b", 2) == 0){ opt_b = argv[i] + 2; }else if(strncmp(argv[i], "-v", 2) == 0){ opt_vbr = argv[i] + 2; } }else{ prefix = argv[i]; i++; break; } i++; } if(i < argc){ /* encode specified tracks */ while(i < argc){ if(cdda2mp3(prefix, argv[i])){ return 1; } i++; } return 0; } /* encode all tracks */ if(pipe(pipe_fd)){ fprintf(stderr, "pipe() failed.\n"); return 1; } if(fork() == 0){ /* child */ close(pipe_fd[0]); dup2(dev_null, 2); dup2(pipe_fd[1], 1); close(dev_null); close(pipe_fd[1]); execvp(cdda2wav[0], list_audio); fprintf(stderr, "execvp(\"list_audio_tracks\") failed.\n"); return 1; } close(pipe_fd[1]); wait(&status); if(status){ fprintf(stderr, "can't get audio track list.\n"); return status; } length = read(pipe_fd[0], buffer, sizeof(buffer) - 1); close(pipe_fd[0]); if(length <= 0){ fprintf(stderr, "can't get audio track list.\n"); return 1; } buffer[length] = 0; track = strtok(buffer, " \t\r\n"); while((sector = strtok(NULL, " \t\r\n")) != NULL){ if(cdda2mp3(prefix, track)){ return 1; } track = strtok(NULL, " \t\r\n"); if(track == NULL){ break; } } return 0; } �������������������������������������������������������gogo239b/contrib/cdda2mp3.euc�����������������������������������������������������������������������100644 � 23421 � 144 � 4670 7220537254 15076� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mp3 、コタョ、ケ、・ケ・ッ・・ラ・ネ cdda2mp3 cdda2mp3 [-psy] [name_prefix_for_all_mp3_files [1 2 3...]] Linux SCSI generic I/F ヘム cdda2mp3.lnx FreeBSD ヘム cdda2mp3.bsd 。。、ウ、ホ・ケ・ッ・・ラ・ネ、マ。「cdda2wav-1.0c 、ホ cdda2wav 、ネチネ、゚ケ遉、サ、ニサネヘム、キ、゙、ケ。」 cdda2wav、ホ・、・・ケ・ネ。シ・ク蝪「cdda2wav 、ォ、 list_audio_tracks 、ネ、、、ヲフセチー、ホ ・キ・・ワ・・テ・ッ・・・ッ、cdda2wav、ネニア、ク・ヌ・」・・ッ・ネ・熙ヒコタョ、キ、ニ、ッ、タ、オ、、。」 サネヘムホ: 1) サリト熙ホ・ネ・鬣テ・ッ、タ、ア、mp3イス、ケ、。」 、ウ、ホホ网ヌ、マ。「z1.mp3, z2.mp3 z3.mp3 、ャコタョ、オ、、。」 cdda2mp3 z 1 2 3 2) ホ网ィ、ミ。「zz、ヌサマ、゙、スミホマ・ユ・。・、・フセ、ヌチエ・ネ・鬣テ・ッ、mp3イス、ケ、。」 ・「・・ミ・猯セ、サリト熙ケ、、ミrename、キ、ハ、ッ、ニ、筵、・、、ネ、、、ヲヘナタ、ャ、「、。」 CD、ヒ1、ォ、10、゙、ヌニ、テ、ニ、、ネ。「zz01.mp3, zz02.mp3, zz03.mp3,。ト, zz10.mp3、ヒ、ハ、。」 cdda2mp3 zz 3) ーソ、ハ、キ、ヌ。「、ネ、熙「、ィ、コチエ・ネ・鬣テ・ッ、mp3イス、ケ、。」 、ノ、ヲ、サrename、ケ、、ハ、鬢ウ、、ヌ・、・、、ネサラ、ヲ。」 CD、ヒ1、ォ、10、゙、ヌニ、テ、ニ、、ネ。「audiotrack01.mp3, audiotrack02.mp3, audiotrack03.mp3,。ト, audiotrack10.mp3、ヒ、ハ、。」 cdda2mp3 ソエヘイサカチイタマ: 。。・ヌ・ユ・ゥ・・ネ、マ -nopsy 、ヌ、ケ、ホ、ヌ・ィ・・ウ。シ・ノ、ャトカケ篦ョ、ヌ、ケ。」、筅キ。「ソエヘイサカチイタマ on、ホ、ロ、ヲ、ャケ・、ュ、ハイサ、ヒ、ハ、セケ遉マ。「-psy ・ェ・ラ・キ・逾、トノイテ、キ、ニ、ッ、タ、オ、、。」 ・ヌ・ミ・、・ケサリト: 。。、ウ、、鬢ホ・ケ・ッ・・ラ・ネ、マCD-ROM・ヌ・ミ・、・ケ、ホSCSI ID=0ヘム、ヒ、ハ、テ、ニ、、、゙、ケ、ホ、ヌ。「、エ シォハャ、ホエトカュ、ヒケ遉、サ、ニ。「ヒワ・ケ・ッ・・ラ・ネcdda2mp3、ホハムケケ、、ェエ熙、、キ、゙、ケ。」、ハ、ェ。「 cdda2mp3.bsd、ヌ、マ。「エトカュハムソCDDA_DEVICE、タオ、キ、ッタ゚ト熙キ、ニ、ェ、ア、ミ。「ハムケケ、マノヤヘラ 、ヌ、ケ。」、゙、ソ。「cdda2mp3.bsd、マ。「-dev ・ェ・ラ・キ・逾、サネ、テ、ニ。「シツケヤサ、ヒ、篏リト熙ャイト ヌス、ヌ、ケ。」 cddda2mp2 -dev 0,2,0 、ハ、ノ、ネ、キ、゙、ケ。ハコヌカ皃ホFreeBSDヘムcdda2wav、マ。ヨ0,2,0。ラ、タ、ア、ヌホノ、ッ、ハ、熙キ、゙、キ、ソ。ゥ。ヒ。」 。。ATAPI、ホCD-ROM・ノ・鬣、・ヨ、ヌ、マ。「・ヌ・ミ・、・ケフセ、ホハムケケ、ホ、ロ、ォ・ケ・ッ・・ラ・ネテ讀ホ-P0・ェ・ラ ・キ・逾、ウー、キ、ソ、ロ、ヲ、ャホノ、、、ヌ、キ、遉ヲ。」セワ、キ、、、ウ、ネ、マcdda2wav、ホ・゙・ヒ・螂「・、サイセネ 、キ、ニ、ッ、タ、オ、、。」 。。TEAC CD532S 、ホ・ユ・。。シ・爭ヲ・ァ・「・ミ。シ・ク・逾3.0A、ヌWindowsセ螟ヌcddaニノ、゚、タ、キ、 32ヌワツョ、ヒタ゚ト熙キ、ソ・ノ・鬣、・ヨ、。「Linux、腱reeBSD、・、・・ケ・ネ。シ・、キ、ソSMP・゙・キ・ セ螟ヌサネヘム、ケ、、ネ。「gogo、ャノスシィ、ケ、サエヨ、ヌニノ、゚、タ、キ、ネ・ィ・・ウ。シ・ノ、ャスェホサ、キ、゙、ケ。」 TEAC CD532S 、ネ cdda2wav-1.0c 、ネ gogo-2.x 、ホチネ、゚ケ遉、サ、マ、ハ、ォ、ハ、ォホノ、、、ヌ、ケ。」 、ェ、゙、ア Linux ・゙・キ・、ヌ、マセ蠏ュ・キ・ァ・・ケ・ッ・・ラ・ネ、ネ、ロ、ワニア、クオ。ヌス、ホ cdda2mp3 ・ミ・、・ハ・熙 コタョ、ヌ、ュ、゙、ケ。」cdda2mp3.c 、ナャタレ、ヒハムケケ、キ、ニ make 、ヌ cdda2mp3.c 、・ウ・・ム・、・、キ、゙、ケ。」 gogo ・ラ・・サ・ケ、ネ cdda2wav ・ラ・・サ・ケ、・ス・ア・テ・ネ、ヌタワツウ、ケ、、ソ、皈ム・、・ラタワツウ、ネ ネ豕モ、キ、ニ・ウ・・ニ・ュ・ケ・ネ・ケ・、・テ・チ、クコ、鬢ケ、ウ、ネ、ヌCPU、、隍ヘュク、ヒサネ、ィ、、隍ヲ、ヒ、ハ、 、ォ、筅キ、、゙、サ、。」cdda2mp3.c、・ウ・・ム・、・、キ、ニコ、テ、ソcdda2mp3、ホ、ロ、ヲ、ャgogo、ヒ ナマ、オ、、・ェ・ラ・キ・逾、ャツソ、、、ォ、筅キ、、゙、サ、。」 ・ケ・ネ・遙シ・爭ス・ア・テ・ネ、・ム・、・ラ、ホ、ォ、、熙ヒサネ、ヲ、ネ、、、ヲヤツ、、キ、ニ、、、゙、ケ、ホ、ヌ。「 、ス、、ヒ、隍アニカチ、ャ、「、、ォ、ノ、ヲ、ォ。「サ荀ヒ、マ、、ォ、熙゙、サ、(^^) ������������������������������������������������������������������������gogo239b/contrib/cdda2mp3.lnx�����������������������������������������������������������������������100644 � 23421 � 144 � 2045 7220537254 15115� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash # # usage: cdda2mp3 [-psy] [name_prefix_for_all_mp3_files [1 2 3...]] # encode() { $CDDA2WAV $CDDA2WAV_OPTS -t$TRACK - 2> /dev/null | $MP_CODER $MP_OPTIONS stdin $FILEPREFIX$TRACK.mp3 # check result code RES=$? if [ $RES = 0 ] ; then echo File $FILEPREFIX$TRACK.mp3 finished successfully. else echo File $FILEPREFIX$TRACK.mp3 failed \(result $RES\). >&2 mv -f $FILEPREFIX$TRACK.mp3 $FILEPREFIX$TRACK.failed fi } # specify the audio track listing program and its options LAT=list_audio_tracks LAT_OPTIONS='-D0,0,0 -A/dev/sr0 -Igeneric_scsi' CDDA2WAV=cdda2wav CDDA2WAV_OPTS='-D0,0,0 -A/dev/sr0 -Igeneric_scsi -H -q -Owav -P0' MP_CODER='gogo' MP_OPTIONS='' if [ x"$1" = x"-psy" ] ; then shift else MP_OPTIONS="$MP_OPTIONS -nopsy" fi if [ $# = 0 ];then FILEPREFIX=audiotrack else FILEPREFIX=$1 shift fi if [ $# = 0 ];then # feed track numbers and start sectors into loop $LAT $LAT_OPTIONS 2> /dev/null | while read TRACK STARTSECTOR; do encode done else for TRACK in $@ do encode done fi �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/contrib/cdda2mp3.txt�����������������������������������������������������������������������100644 � 23421 � 144 � 1445 7220537254 15136� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������script to make mp3; cdda2mp3 cdda2mp3 [-psy] [name_prefix_for_all_mp3_files [1 2 3...]] cdda2mp3.lnx for Linux SCSI generic I/F cdda2mp3.bsd for FreeBSD This script is used with cdda2wav ( cdda2wav-1.0c ). After installing cdda2wav, make a symbolic link named as list_audio_tracks from cdda2wav in the same directory as cdda2wav. You may have to modify this script according to your environment since this is for only SCSI ID=0 on CD-ROM. usage: 1) convert the specified tracks to mp3-file % cdda2mp3 z 1 2 3 ;making z1.mp3, z2.mp3, z3.mp3 2) convert the all tracks to mp3-file named as zz???.mp3 % cdda2mp3 zz ;making zz01.mp3, zz02.mp3, ... 3)% cdda2mp3 ;making autiotrack01.mp3, autiotrack02.mp3, ... default is -nopsy, so you may add -psy if you like. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/contrib/Makefile���������������������������������������������������������������������������100644 � 23421 � 144 � 74 7220537254 14375� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ cdda2mp3: cdda2mp3.c gcc -O2 -m486 -o cdda2mp3 cdda2mp3.c ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/BeOS/�������������������������������������������������������������������������������������� 40755 � 23421 � 144 � 0 7220537254 12027� 5����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/BeOS/makefile.beos�������������������������������������������������������������������������100644 � 23421 � 144 � 10262 7220537254 14574� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (C) 1999 shigeo # modified by Keiichi SAKAI, Noisyu and harada # #print messages in English DONT_USE_KANJI=-DNO_KANJI #use Enhanced 3D Now! #you need modify NASM to use this option E3DN=-DUSE_E3DN #use VBR VBR=-DLAME355 -DUSE_VBR #use multi-thread #OS must be Linux libc6 or BeOS USE_MT= -DDISPLAY_REALTIME #define if OS is BeOS isBe=-DBeOS ifdef USE_MT ifdef isBe PTHREAD=$(USE_MT) -DUSE_BTHREAD else PTHREAD=$(USE_MT) -DUSE_PTHREAD endif endif #if Windows and use MT #PTHREAD=$(USE_MT) -DUSE_WINTHREAD ifdef RPM_OPT_FLAGS CC=gcc -c $(RPM_OPT_FLAGS) else CC=gcc -c -m486 -O3 -finline-functions -fomit-frame-pointer -funroll-loops # -fno-strength-reduce -ffast-math -malign-double -mfancy-math-387 -pipe #CC=gcc -c -mcpu=pentium -O6 -finline-functions -fomit-frame-pointer -funroll-loops #CC=gcc -c -mcpu=pentiumpro -march=pentiumpro -O9 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops -ffast-math -foptimize-register-move -fdefer-pop -mfancy-math-387 # NetBSD/i386 1.4.1 #CC=gcc -D__unix__ -c -mcpu=pentiumpro -malign-double -O6 -fstrength-reduce -fexpensive-optimizations -finline-functions -fomit-frame-pointer -funroll-loops endif AS=nasm LD=gcc ifdef isBe CFLAGS=-Wall $(PROF) -DNDEBUG $(DONT_USE_KANJI) $(E3DN) $(VBR) $(PTHREAD) -D__unix__ $(isBe) -DRAW_INPUT else CFLAGS=-Wall $(PROF) -DNDEBUG $(DONT_USE_KANJI) $(E3DN) $(VBR) $(PTHREAD) -DRAW_INPUT endif #if Borland C++ then add -D__BORLANDC__ to ASFLAGS ASFLAGS=-f elf -D__unix__ $(E3DN) #if FreeBSD 2.x then #ASFLAGS = -f aoutb -D__unix__ -DAOUT LDFLAGS=$(PROF) #PROF=-g -pg ifdef PTHREAD ifdef isBe LIBS= else LIBS=-lm -lpthread endif else LIBS=-lm endif OBJS = bitstrem.o common.o encode.o huffman.o l3bs.o l3psy.o loop.o mdct.o reserv.o subs.o tables.o vbrtag.o setup.o readsmpl.o musui.o musenc.o message.o AOBJS = clk.o haveunit.o huffmana.o quantize.o mdct3dn.o msubsse.o mdctfpu.o mdcttbl.o fft.o fftsse.o fft3dn.o ffttbl.o fftfpu.o l3psya.o putbits.o align.o sbandtbl.o sbandsse.o sbandfpu.o sband3dn.o msubtbl.o msubfpu.o msub3dn.o .SUFFIXES: .nas .c #default: all all: gogo # strip gogo gogo :$(OBJS) $(AOBJS) $(LD) $(OBJS) $(AOBJS) $(LDFLAGS) -o gogo $(LIBS) .nas.o: $(AS) $(ASFLAGS) $< #if FreeBSD 2.x then # $(AS) $(ASFLAGS) $< -o $@ .c.o: $(CC) $(CFLAGS) $< clean: \rm -f *.o gogo *~ common.h : l3side.h l3bs.h : common.h encoder.h l3psy.h : l3side.h loop.h : common.h readsmpl.h : common.h vbrtag.h : l3bs.h bitstrem.o : bitstrem.c common.h bitstrem.h common.o : common.c common.h musenc.h encode.o : encode.c common.h encoder.h haveunit.h subband.h huffman.o : huffman.c common.h huffman.h huffcode.tbl l3bs.o : l3bs.c l3bs.h l3psy.h mdct.h loop.h huffman.h bitstrem.h l3psy.o : l3psy.c common.h global.h encoder.h l3psy.h l3side.h haveunit.h loop.o : loop.c musenc.h global.h loop.h huffman.h l3bs.h reserv.h haveunit.h l3psy.h mdct.o : mdct.c common.h mdct.h haveunit.h musenc.o : musenc.c common.h global.h musenc.h subband.h reserv.h readsmpl.h bitstrem.h l3psy.h mdct.h loop.h l3bs.h vbrtag.h haveunit.h musui.o : musui.c common.h musenc.h haveunit.h readsmpl.o : readsmpl.c common.h global.h readsmpl.h musenc.h reserv.o : reserv.c l3side.h loop.h huffman.h l3bs.h reserv.h setup.o : setup.c haveunit.h subs.o : subs.c common.h haveunit.h table.o : table.c vbrtag.o : vbrtag.c vbrtag.h musenc.h bitstrem.h haveunit.o : haveunit.nas nasm.h huffmana.o : huffmana.nas nasm.h clk.o : clk.nas nasm.h quantize.o : quantize.nas grinfo.inc nasm.h sbandtbl.o : sbandtbl.nas nasm.h sbandsse.o : sbandsse.nas nasm.h sband3dn.o : sband3dn.nas nasm.h sbandfpu.o : sbandfpu.nas nasm.h mdcttbl.o : mdcttbl.nas nasm.h mdctfpu.o : mdctfpu.nas nasm.h msubsse.o : msubsse.nas nasm.h mdct3dn.o : mdct3dn.nas nasm.h fft.o : fft.nas nasm.h ffttbl.o : ffttbl.nas nasm.h fftsse.o : fftsse.nas nasm.h fftfpu.o : fftfpu.nas nasm.h fft3dn.o : fft3dn.nas nasm.h l3psya.o : l3psya.nas nasm.h putbits.o : putbits.nas nasm.h align.o : align.nas nasm.h msubtbl.o : msubtbl.nas nasm.h msub3dn.o : msub3dn.nas nasm.h msubfpu.o : msubfpu.nas nasm.h message.o : message.c message.h japanese.msg english.msg german.msg ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/BeOS/MakeGOGO.sh���������������������������������������������������������������������������100644 � 23421 � 144 � 1340 7220537254 14007� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh cp makefile.beos ../makefile ln /boot/home/config/bin ../drop\ gogo\ here -d -s cp ./3DNOW17/MMX ../MMX cd .. if [ ! -f fft3dn.nas.org ]; then mv fft3dn.nas fft3dn.nas.org fi MMX fft3dn.nas.org mv fft3dn.nas.asm fft3dn.nas if [ ! -f mdct3dn.nas.org ]; then mv mdct3dn.nas mdct3dn.nas.org fi MMX mdct3dn.nas.org mv mdct3dn.nas.asm mdct3dn.nas if [ ! -f msub3dn.nas.org ]; then mv msub3dn.nas msub3dn.nas.org fi MMX msub3dn.nas.org mv msub3dn.nas.asm msub3dn.nas if [ ! -f sband3dn.nas.org ]; then mv sband3dn.nas sband3dn.nas.org fi MMX sband3dn.nas.org mv sband3dn.nas.asm sband3dn.nas if [ ! -f quantize.nas.org ]; then mv quantize.nas quantize.nas.org fi MMX quantize.nas.org mv quantize.nas.asm quantize.nas make ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/BeOS/3DNOW17/������������������������������������������������������������������������������ 40755 � 23421 � 144 � 0 7225626360 13033� 5����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/BeOS/3DNOW17/MMX���������������������������������������������������������������������������100644 � 23421 � 144 � 50245 7220537254 13540� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ELF�������������� ��4���ヤ?������4� ��(������������������ン4��ン4�����������4��潺��潺��\ �� �����������ャ=��ャM��ャM��������������%���/���'���!������������������"���������������������&���������������� ���,���������� ��� �����������������%���#������ ���.����������)�����������������-������������������������������������������������������������������������������������ ���+�������������������� ���(�������������������$�������������������������*�������������������������ャM������� ���4M������� �����������&���3������� �,�������ヲ������D�������������Z��� ��・���� �a�������������k�������������s�����������������������������������������・�������������ク�������D������ノ�������ケ������゙��� ��ョ��� ��������]�������������ナ������������x������ ������������������(������������サ������!������������(���������"���.������ェ�����5�����7���� �D��@�� ��� �[��`����� �z��8��!���� ����������"�����/��セ��� �ァ�� ��ソ���� �テ�� ������ �ヤ��\��m���� ���G������ ���`N���������`!����� �������������������������������=������$������チ�����+������������H��3�������O��<N�������V��<N�������b���O��������_DYNAMIC�_GLOBAL_OFFSET_TABLE_�_init�_fini�__deregister_frame_info�__register_frame_info�_start�argv_save�environ�find_thread�__main_thread_id�_kget_thread_stacks_�_data_offset_main_�_init_c_library_�_call_init_routines_�main�_thread_do_exit_notification�exit�fgetc�stderr�fprintf�strlen�strcpy�fopen�strcat�setErrMes__FPc�getEncode__FP6ENCODEPc�putEncode__FP6ENCODEP8_IO_FILE�incErrLine__Fv�fclose�analyzeCode__FP4CODEPc�getCodeProperty__FG7OPECODE�getNumber__FPlPc�errMes__F7ERR_MES�sp�stack�nextToken__FP5TOKENPc�__ctype_tolower�strncmp�strcmp�strchr�strncpy�libnet.so�libroot.so�_etext�_edata�__bss_start�_end�t潺�����錺�����I�����@I�����、I�����ヤI�����J�����0J�����LJ�����J�����、J�����トJ�����腴�����K�����,K�����PK�����К�����ィK�����ネK�����鍖�����L�����$L�����|L�����、L�����フL�����L�����弄�� ��熱�� ��、M�����信�� ��勲����廴����M�����ィM��&��@M����DM�� ��HM����LM����PM�� ��TM����XM����\M����`M��'��dM��*��hM����lM����pM����tM��(��xM����|M����M����М��)��M����U牙S����[テ?D��霤��霄)��[餓]テ ウ���」�������」 ���h����鰲」���h���鰔」���h���鯊」���h���魏」���h ���鬆」 ���h(���髏」$���h0���騾」(���h8���駱」,���h@���饒」0���hH���餘」4���hP���顱」8���hX���0」<���h`��� 」@���hh���」D���hp����」H���hx���鴪」L���h���鰲」P���h���鰔」T���h���鯊limpU牙S����[テロB��サー�u;錐t&�泣ャ恒遠ャ�ミ泣ャ8�u竝ξP頸ヌΣ���犠餓]テ振牙S����[テB��犠餓]テ振牙S����[テgB��鴻 ��P鴻フP鏘犠餓]テ怪U牙S����[テ;B��犠餓]テ振牙��WVS����[テB��泣X���急 丘8泣\���0u豪エj�挙`���泣 右泣右劫PP霄牛泣d���)驩VW貴Q/霄VW貴Q韵���ζ$家阨V鐇瑞振牙VS����[テwA��ヌE����錐t&�畿 H9E|7錐t&�畿Pζ佳右マt マ t尖丘界EEセマ�~畿H8 u畿Hニ�� 左����畿ニ��マuク=マ u1タ3貢�遂EP陲ζ佳右マtマ u�ンク���錐e[^餓]テ貢�U牙��S����[テ僉��酷,禍P泣h���R雉ζMウ マ�'酷U禍P泣h���R闌ζク���颪��貢�畿 R!ζ佳{v+酷j禍P泣h���R鎹ζク�����唆&����畿 R孔P鞏ζ酷よ禍P孔P閂ζ佳怨4ス4�uh酷禍P孔Pζ酷よ禍P孔P=ζ佳怨4ス4�u-孔P酷頑禍P泣h���R隶ζ ク���馥��錐t&�孔P酷壽禍P泣h���R閨ζ ヌ����孔P劫�Pζ劫�Pζ怨牛I燕貢�ス�~球β9}衡&�&劫�虚<.u 衡&�作クス�t#酷ゥ禍P劫�虚BミP閘ζ酷ュ禍P劫�P霤ζ酷イ禍P劫�P顯ζ佳怨0ス0�u+劫�P酷エ禍P泣h���R鑛ζ ク��� ��劫�P酷ト禍P泣h���R>ζ 孔P霹 ��ζ貢�球4Phネ���劫8P鏐ζ 佳怨スu���スu酷ヤ禍P泣h���R鞆ζ劫8P劫P陌���ζ佳タu球0P劫P陜 ��ζ劫8P酷゚禍P球0P闃ζ 鎭 ��餡錐薙禍P泣h���R鐺ζ球4P霹ζ球0P霍ζ1タ1タ�享餓]テ瑞瑞瑞U牙フ���WVS����[テ<��畿 P劫pP阡��ζ佳uク���鰆��衡&�マ�u ク���鯊��劫p工0燕h劫p膏`卸d畿ニ��畿偽ニB�ニ@�畿ニ@�畿ニ@�畿偽彝P霤��ζ佳怨l畿��� t鴪���┿���鰾���畿ニ@畿虚l開垢轄CHマ�tマt畿ヌ@<���1タ��ヌP���球lx�t!畿虚l開垢轄CHP驩���怪畿ニ@畿ニ@畿虚l開垢轄CHヌP����R畿ニ@畿虚l開垢轄CHヌP���$酷 禍P泣h���R鐫ζj顏ζ球h8@��球d8t球d8tr怪偽坑虚P況h卸<況<劾タ幸轄Kノタ<況d卸4轄<況4 N P畿虚P臼<1タ鬆��球d8「���偽球PHδ急何4牛PI燕<況4θ卸4郷h何8況4郷< 7況8 N 偽坑虚P郷d何<牛<蟹巷轄J P畿虚P臼<1タ鴆��鬘���球h8ur偽坑虚P況d卸<況<劾タ巧轄Iノタ<況h卸4轄<況4 N P畿虚P臼<1タ駮��$球h怨L球d怨h球L怨d郷dι何`マu"マu球hヌ@��� 球hヌ@����球`8t畿虚` <轄<球`xセ���球`xョ���偽坑虚P況h卸<況<劾タ工轄Hノ P球`βP劫\P< ��ζ佳タu#球P偽ミ恒球\ュP衡&�球`βP畿βPζ畿虚P臼<1タ$��衡&�ヌT����ヌX���球`xu球`xt��偽坑虚P況h卸<況<劾タ宏轄Gノ P球`xu球`ニ@球`ニ@�球`xuヌX����球`ニ@偽坑虚P況`卸4況4劾タ<郷`何4況4劾タ孝轄< 孝<況`卸4轄<況4 N PヌT���N偽坑虚P郷h何<況<劾タ孔郷`何<轄E況< N P球`β8�u$球`xt畿虚P臼<1タ駭��鯔���球`βP劫\P ��ζ佳・���スX�tk偽郷TG何<球P+<δ貴燕<況TF卸4郷P+ス4何8牛<γ燕<況<郷8 7ノ 球`βP畿βP閾ζ畿虚P臼<1タ鬣��錐t&�ス\�u球`xt畿虚P臼<1タ騙��ス\樵���ス\鹸���スX�├���偽牛TA燕<球P+<δ丘卸<郷TG何4牛P+4燕8況<θ卸<況<郷8 7ノ@ 偽坑虚P轄\<轄< P畿虚P臼<1タ鬯���スX�tk偽況TF卸<球P+<δ急何<牛TA燕4況P+オ4卸8郷<ι何<況<郷8 7ノ 球P偽ミ恒球\ュP畿虚P臼<1タ 唆&����婚([^_餓]テ貢�U牙S����[テネ3��酷2禍P畿 P韈ζ畿8�t畿1メR酷6禍P畿 P霙ζ 畿x�t畿1メ咳R酷>禍P畿 P陋ζ 畿x�t畿1メ咳R酷>禍P畿 P鑼ζ 畿1メ咳R酷E禍P畿 P鏃ζ ヌE���畿偽;P<|3貢�畿恒畿≫���R酷L禍P畿 Pζ Eテ貢�畿x�tG畿βP酷T禍P畿 P韭ζ 畿x�t畿1メ咳R酷[禍P畿 P霤ζ )怪畿x�t畿1メ咳R酷L禍P畿 P陂ζ 酷f禍P畿 P閭ζ�犠餓]テ瑞瑞瑞瑞振牙S����[テ+2��畿P酷フ禍P顫ζ 唆&����犠餓]テ振牙S����[テ1��ワ�犠餓]テ貢�U牙S����[テマ1��畿P偽禍チミナ����鴻加P泣ワP酷フ禍P酷i禍P泣h���R雕ζク����犠餓]テ瑞瑞瑞振牙WVS����[テY1��泣l���8'~ク���,泣p���給l���4����急<1タ 唆&����稿[^_餓]テ怪U牙VS����[テ0��泣l���8�ク���(遂E給p���教l���4���� 1タ�稿[^餓]テU牙S����[ティ0��畿 P隍���ζ佳右 マ �u1タ驢���遂E 8�uZ衡&�畿 8+t 畿 8-t@畿 UE 畿 P鏤���ζ佳右 マ �u1タ?セEP��ζ佳タt1タ(尖恚EP ζ佳タt1タ 衡&�偽 禍�犠餓]テ怪U牙S����[テ/��畿P闌���ζ佳右マ�u1タr怪遂E8�u[錐t&�畿8*t 畿8/t@畿UE畿P錚���ζ佳右マ�u1タ(セEP鎭��ζ佳タt1タ尖寞U禍貢�犠餓]テ振牙VS����[テ?/��ヌE����ヌE���偽<+t <-t唆&����E ヌEE�畿(tC貢�E畿P孔P0ζ佳右マ�u1タ鬚���畿8)t1タ體���Ek唆&����畿8/~ 畿891タq遂E8/~畿89 唆&����2偽禍チミ可ツ蔚畿βミ偽セ 4疫E畿8�uウ畿ッEP鞜ζ佳タt1タ 怪偽禍�稿[^餓]テU牙 VS����[テ.��畿E孔P顋ζ佳タu孔P韈ζ佳タuク���鬪���左����セE可禍*���迦+エキメ謳m-��-��<-��-��<-��T-��畿偽ミP*ζ可禍U遂E偽)ミPζ可禍=畿ッEP顰ζ可禍'貢�貴科咸}P鞦ζ可禍 ク���尖�稿[^餓]テ貢�U牙ミ���S����[テ-��畿 P畿P鎬ζ佳右 マ �uク���H畿 P劫0P��ζ佳右 ス0�tク��� 泣l���8�tク���1タ 左����享,餓]テ瑞瑞瑞U牙S����[テ,��畿t8tltGe錐t&�偽 禍タミナ����豪厚科ツ禍j怪偽 禍タミナ����豪科ツ禍J怪偽 禍タミナ����豪|科ツ禍*怪酷|禍P泣h���R%ζj霆ζ�犠餓]テ振牙WV偽δ蔚畿 8 t 畿 8 tE 驪E偽 蔚偽艶フ���偽 蔚偽<-���<-<+t{<+hタt9<*щ���鯣���左����<=┴���<= <:t3鬮���<[tw<]���髫���畿ヌ�����畿ニ��偽 蔚畿?��畿ヌ������畿ヌ������遂Eヌ����鴣���怪畿ヌ����鱚���怪畿ヌ����鰌���怪畿ヌ����鯏���怪畿ヌ����魑���怪畿ヌ����鬟���怪畿ヌ� ���唆&����畿 8�tX畿 8:tP畿 8,tH畿 8+t@畿 8-t8畿 8*t0畿 8[t(畿 8]t 畿 8=t畿 8 t畿 8 u 左����偽蔚芫M 偽艾E E左����畿ニ��偽 蔚畿!丘急 E E畿ニ��偽 蔚闍E齏�稿ワ^_餓]テ振牙S����[テフ)��畿β8�t ク鬯���畿セ����給t���E畿@セ����給t���E畿βセ����給t���EヌE����マ~=j孔P畿可����豪ャ果ミP闥ζ 佳タu 偽禍左����Eサク衡&�犠餓]テ振牙S����[テ(��畿β8�t ク鬆���畿セ����給t���E畿@セ����給t���E畿βセ����給t���E}mu}mu ク6左����ヌE����マ~衰E08Eu偽禍E盧貢�犠餓]テ振牙VS����[テ(��畿セ����給t���E畿@セ����給t���E}st ク魍���セE可禍鐵���迦+エソリ謐エ&����詐'����`'��T'��M'��D'��='��-'��-'��-'��-'��-'��-'��-'��-'��-'��-'��-'��4'��ク.���9錐t&�ク>���-ク&���&怪クd���クe���怪ク6��� ク怪�稿[^餓]テ貢�U牙���VS����[テ'��ヌ,����ヌ(����ヌ$����ヌ ����貴γ燕マ �uj�鞴ζ可禍鴟��畿ニ�畿ニ@畿ニ@畿ニ@畿ニ@�畿 P劫0P隱ζ佳右 ス0 ��酷咏禍P劫0恒R ζ佳タt$酷溽禍P劫0恒R韋ζ佳タuc遂E P劫0P錙ζ佳右 ス0 u9酷・禍P劫0恒R陬ζ佳タu畿 P劫0Pζ佳右 劫0恒R濶ζ佳怨スtW畿兜畿 P劫0P雋ζ佳右 ス0tj阮ζ可禍鬥��畿 P劫0P閙ζ佳右 ス �t-ス0u"ヌ ����畿 P劫0P鍮ζ佳右 8ス0tj,ζ可禍<��衡&�畿 P劫0Pζ佳右 ス0 ��劫0恒R韋ζ佳怨スo��畿 P劫0P霪ζ佳右 ス0?��ス(�tj陋ζ可禍鬮��貢�スuj 閖ζ可禍骭��衡&�(畿兜P畿 P劫0P鎭ζ佳右 ス5�tj2ζ可禍顳��セ4可禍1ww菓+激,ワ瘢カ����坐����エ#��、#��t#��#��t#��t#��t#��#��畿ニ@�J唆&����畿ニ@:唆&����畿ニ@*唆&����畿ニ@唆&����j阨ζ可禍鬣��畿 P劫0P閘ζ佳右 u貢�ス,�tWス(�tj鏨ζ可禍馗��スuj 7ζ可禍飄��(畿ニ@�畿兜P衡&�,畿兜Pス0t5ス0t,ス �u#ス0tj靠ζ可禍鱇��唆&����球P鑵゚ζ怨ス�~=球虚ミ恒:+tj閨ζ可禍髑��球虚ミ恒ニ�ス0�u 鯢���唆&����ス0 u(ス$�tj 3ζ可禍颪��ヌ$��� ヌ$����球P霰゙ζ家劫0恒R雎゙ζ佳 0燕ス'vj勒ζ可禍鱚���劫0恒R球P靦ンζ畿 P劫0P陲ζ佳右 骰錐t&�球P錙゙ζ怨畿xu"畿xuスj�鏘ζ可禍h球虚ミ恒:]u0ス �tj&ζ可禍9遂虚ミ恒ニ�ス �uj頽ζ可禍 1タ�婚 [^餓]テU牙リ���S����[テ。 ��畿 P劫(P雜ζス(�u畿ヌ����1タ鯲���劫(恒R閾ζ佳右マt畿ヌ����畿偽臼1タ髢���衡&�劫(恒R)ζ佳右マt畿ヌ����畿偽臼1タ_畿 P孔P靤ζ佳タu畿ヌ����畿偽臼1タ3遂E P畿βP隹ζ佳uク���畿ヌ����1タ�享$餓]テU牙WVS����[テ��畿 P鐫ワζ佳 v畿ヌ�����畿ヌ@����1タ髓��怪閤厭閤厭衡&�畿 8�u+左����丘畿 セ����給t���EE ヒ畿ニ��ヌE����マvV左����孔P偽禍タミナ����鴻厚加P閾ロζ佳タu畿ヌ����畿偽臼1タ鳬���Eヲ衡&�ヌE����マvQ錐EP偽禍タミナ����鴻加P'ロζ佳タu畿ヌ����畿偽臼1タ驩���Eォ衡&�ヌE����W唆&����孔P偽禍タミナ����鴻|加P霽レζ佳タu畿ヌ����畿偽臼1タ,Eョ唆&����畿ヌ�����畿ヌ@����1タ 錐t&�稿濕^_餓]テ怪U牙S����[テャ��j;畿 P闥レζ佳右マ�t*畿偽 )ミP畿 P畿P韶ルζ 畿偽 )ミ偽ニ�畿 P畿P=ルζ畿P1レζ右�犠餓]テU牙t��S����[テ)��畿ニ��畿ヌ@(����畿 P劫8P鍮ζ劫8P劫hPζ佳怨スh t1タ餉��球P劫P韭ζ佳怨スu~劫h恒R閭ルζ佳'vj雋ζ可禍鴾��劫h恒R畿P鏨リζ球P劫hP閨ζ佳怨球P劫P鐵ζ佳怨スh�u1タ髦��スh tj 4ζ可禍驂��劫h恒R畿β(P鏗ζ佳u ク���餝��怪畿ベ(�u1タ顱��j,球P隶リζ佳怨ス�t3球ニ��球@P畿β`P靱ζ佳u ク���鳫��� 畿ヌ@`���球dP畿β0P陲ζ佳u ク���鮗���貴γ(飢RP陂ζ佳怨球偽機 #B0タt球偽機#B`タt1タs貢�球βP球P阮ラζ佳タu6球β偽機 #B0タt 球β偽機#B`タt 畿@,1タj 霏ζ可禍 唆&����享餓]テ瑞瑞瑞U牙VS����[テj��叉サt ミθ>u稿[^餓]テ貢�U牙S����[テ3��犠餓]テ振牙S����[テ��+ラ[餓]テevelop/headers/posix/s!DT!���NO_ENVIRON=true���������*** MMX & 3D Now! assembler ver 1.7 *** �use: mmx file[.mmx] �file name is too long. �rb�.mmx�Can't open %s. �input file:%s �asm�.asm�w�Can't open %s! �output file:%s �too long! �%s �complete. �������������������������������This code can't be run in getEncode! �db �0%02Xh,�%02Xh,�0%02Xh�,0%02Xh� dd %s� db 0%02Xh� ;�%s %d:%s [No.=%d] �code err in getCodeProperty �dword�qword�ptr� 0M������H3�����������������������������������������������������文字列がない����������������������������segmentレジスタが変���������������������'['が変���������������������������������indexレジスタが2個以上ある��������������scale指定が変���������������������������レジスタの次の文字が変������������������レジスタの前の文字が'+'でない�����������文字列が長すぎる������������������������']'が変���������������������������������文字列が連続している��������������������不正なoperand���������������������������operandとopecodeの組み合わせが変��������espはindexに使えない��������������������ptr演算子のエラー�����������������������現在未実装です��������������������������その他のエラー����������������������������������������������������������emms��������������w���femms��������������������������������������������������������������pfnacc��������� ������pfpnacc�������� ������pi2fw���������� ��� ���pf2iw���������� ������pswapd��������� ���サ�����������������������������������������������������������������������eax�ecx�edx�ebx�esp�ebp�esi�edi���������| �� ������ー ��ル���AB DAl.���L���<��� ��ョ��AB Gリ^.B.a.「. J.O..d. w.^. y.Q. H.�].O.���������| ��,������@�� ��AB G6A7A8W.ャ.タ.��$���H���`����AB DY.e. ?.����������| �����������7���AB AY.�����8���8��!���AB A����T���\��m���AB AO.���������| �� ������ミ��Z���AB AAA������<���,��T���AB AA�����\�����セ���AB DP.�����|���@��ァ���AB DP.��$��������(��AB DA[.。.�� ���ト��������AB DAV.��������� �����AB G7T.����������| �� ������ ��ソ���AB A.J.�����<���`!����AB D A �����\���\#��ロ���AB D「. ����|���8$��マ���AB D�������%����AB DA��T���ク��� &��d��AB G>A?H.~.ノ.o.X.\.N.`.d.h.e.Q.X.ケ.f.「.q.$�����,����AB G9W.k.k.���$���8��-��゙��AB DA A P.ォ.$���`��|/�����AB DR.d. a.L.�0�����/��セ��AB GΒg.g.p._.b.R.��������������ャM����������" ��2 ��B ��R ��b ��r �� �� ��「 ��イ ��ツ ��メ �� �� �� �� ��" ��2 ��B ����������������������G��`N���������3�����=��������� ����� ���3�����������ワ������� ���g�� ���������4M�����������������T�����D���������������������ino_�GCC: (GNU) 2.9-beos-980929��GCC: (GNU) 2.9-beos-980929��GCC: (GNU) 2.9-beos-980929��GCC: (GNU) 2.9-beos-980929��GCC: (GNU) 2.9-beos-980929��GCC: (GNU) 2.9-beos-980929��GCC: (GNU) 2.9-beos-980929��GCC: (GNU) 2.9-beos-980929��.symtab�.strtab�.shstrtab�.hash�.dynsym�.dynstr�.rel.data�.rel.eh_frame�.rel.got�.rel.plt�.init�.plt�.text�.fini�.rodata�.data�.eh_frame�.ctors�.dtors�.got�.dynamic�.bss�.comment��������������������������������������������������������X���������������!��� ������������������������)���������ワ��ワ��g�����������������1��� ������D��D�������� ���������;��� ������T��T��タ���������������I��� ����������@���������������R��� ������T��T�������� ���������[�������������������������������a��������� �� ��@����������������f���������P ��P ��タ(�����������������l���������3��3��������������������r���������@3��@3������������ �������z���������潺��4�� ���������� �����������������I���9��$��������������������������$M��$=�����������������������������,M��,=�����������������������������4M��4=��x��������������������������ャM��ャ=������������������ヲ���������@N��@>��タ����������� �������ォ��������������@>���������������������������������� ?��エ��������������������������������任��0�����U��������� ��������������トK����������������������������������������������������������������ワ������������D������������T������������������������T������������������������ ������� �����P ������� �����3������� �����@3������� �����潺������� ������I������������$M������������,M������������4M������������ャM������������@N�������������������������������������������������������������������������������3�������� ����P �������� ����潺������� �"���,M��������0���腑������� �<���P ������� �R����I��������e���ャ ������� �p���@N�������y���ト ������� ���� ������� ����錺������� ����$M�����������タ2�������� �ャ���タ2������� �ツ���(M�����������2������� �����I������� �マ���0M��������ワ��� M����������������������� �������� ����@3������ ���錺������ ���������������ー �������� ���ー ��ル���� �5���I���������E��������������@�������� �5��I���������N����������������������� �W���E������ �]��E������ �b�� E����� �5��I���������i��������������ミ�������� �r��ミ��Z���� �{��,��T���� �����セ���� ���@��ァ���� �。�������� �ェ����(��� �5��dJ���������カ�������������� �������� �ソ��タG��H���� �ヌ�� H������ �メ��ーH������ �゚��潯�� ���� ���\#��ロ���� ���8$��マ���� ���%����� �!�� &��d��� �E��,����� �b��-��゙��� �{��|/������ �5��hK�����������������������/��セ��� �ョ������������チ�������������ヨ��@�� ��� ���ャM���������3�������������������������]������+������ケ������@��`!����� �V��`N�������\����������b�������������n������������v������(������~������ェ�����������ヲ��������8��!���� �ャ�� ��・���� �ウ������������ス��\��m���� �マ������������ラ������������゚�� ��ソ���� �������D������ ���������"�����<N��������� ��ョ��� �#���������"���*������=������1��3������� �7������x������=������������D��G������ �G�� ������ �X��<N�������_��`����� �~��4M����������O�������������ナ�����������7���� �ュ������サ������エ������チ�����サ������������ヒ�������������._init�._fini�gcc2_compiled.�p.2�__DTOR_LIST__�completed.3�__do_global_dtors_aux�__EH_FRAME_BEGIN__�fini_dummy�object.8�frame_dummy�init_dummy�force_to_data�__CTOR_LIST__�__do_global_ctors_aux�__CTOR_END__�__DTOR_END__�__FRAME_END__�start_dyn.c�magic_template�default_environ�MAIN.C�get1line__FPciP8_IO_FILE�__FRAME_BEGIN__�ENCODE.C�ERRMES.C�fname�line�mes.26�GETNUM.C�push__Fl�pull__FPl�expression__FPlPc�term__FPc�calc__Fc�factor__FPc�PARSER.C�MMXcode�_3DNOWcode�PREFETCHcode�reg.26�get32bitRegCode__FPc�getMMXRegCode__FPc�getSegRegCode__FPc�analyzeAddressing__FP10ADDRESSINGPc�analyzeOperand__FP7OPERANDPc�searchCode__FP7OPECODEPc�deleteComment__FPcT0�strcpy�analyzeCode__FP4CODEPc�_data_offset_main_�_kget_thread_stacks_�getEncode__FP6ENCODEPc�_DYNAMIC�_etext�__main_thread_id�_thread_do_exit_notification�_call_init_routines_�nextToken__FP5TOKENPc�stack�_init�find_thread�environ�fprintf�strcat�__deregister_frame_info�incErrLine__Fv�_start�argv_save�errMes__F7ERR_MES�strncmp�strncpy�getCodeProperty__FG7OPECODE�_init_c_library_�fopen�__bss_start�main�fclose�strcmp�_fini�fgetc�stderr�sp�getNumber__FPlPc�_edata�putEncode__FP6ENCODEP8_IO_FILE�_GLOBAL_OFFSET_TABLE_�_end�exit�setErrMes__FPc�strlen�strchr�__ctype_tolower�__register_frame_info������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/bench/������������������������������������������������������������������������������������� 40755 � 23421 � 144 � 0 7220537254 12316� 5����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/bench/bench.txt����������������������������������������������������������������������������100644 � 23421 � 144 � 24254 7220537254 14262� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������; ク盧螟ホ、ル、、チ(at bench in the early afternoon) ; result (-test, -test -nopsy) ; CPU ; clock(ext * rate) ; OS ; compiler and option ; name ; etc 5.06, 20.45, K6-III 333, 70 x 5, TownsLinux-2.0.33, gcc-2.72, 、゚, TOWNS-HC 13.01, 43.86, Athlon, 200 x 3, Win2k, -, 、゚, - 9.23, 32.8, PIIIE, 100 x 4.5, Win98, -, 、゚, - 26.46, 93.15, PIIIE x 2, 100 x 7, RedHat-5.2 Linux, gcc-2.95.3, シオ, - 14.66, 54.19, PIIIE x 2, 100 x 7, RedHat-5.2 Linux, gcc-2.95.3, シオ, ST 16.24, 52.69, PIII x 2, 100 x 4.5, RedHat-5.2 Linux, gcc-2.95.3, シオ, - 5.46, 18.60, K6-2AFR, 100 x 4, WinNT4.0SP5, -, OJI3, L2 2MB 3.37, 9.71, Mobile-Celeron, 66 x 4.5, FreeBSD3.3R, -, gm, TP240 3.31, 8.55, PII, 66 x 4, Kondara MNU/Linux1.0, gcc-2.95.3, シオ, - 29.98, 102.39, PIIIE 600 x 2, 800, Win2k, -, 、ュ、网テ、ネ, SuperMicroP3DME 35.89, 120.75, PIIIE x 2, 931(133 x 7), Win2kSP1, -, 、ュ、网テ、ネ, SuperMicroP3DRE PC800 14.92, 50.30, Athlon, 200 x 3.5, Kondara MNU/Linux1.0, gcc-2.95.3, 、オ, - 4.96, 15.85, K6-2, 100 x 3.5, Linux-2.0.39pre3 libc-5.2.18, pgcc-2.95.3, 、「、、ノ、ヲ, -silent -, 61.3, Athlon 550, 965.25(128.7 x 7.5), FreeBSD 5.0-Current #, gcc-2.95.2 199910, sec, 10%slower than 2.26 -, 71.34, Athlon 950, 1050(105 x 10), Win98SE, -, 、ユ、, ASUS K7V 17.53, 57.53, Athlon750, 105 x 4.5, Win98, -, 、ト、テ、ッ、, - 7.34, 18.01, Celeron 333 x 2, 66 x 5, Win2k, -, 、隍テ、キ。チ, TekramP6B40D-A5 3.91, 10.56, Celeron 333 x 2, 66 x 5, Win2k, -, 、隍テ、キ。チ, ST -, 110.66, PIII x 2, 866, Win2k, -, 、ユ、, SuperMicroP3DME -, 77.31, Athlon(TB), 1000(100 x 10), Win2k, -, tomy, MSI K7T Pro -, 43.51, PIIIE 600, 100 x 6, Win98SE, -, OJI3, P2B-F -, 57.80, PIIIE 600, 800(133 x 6), Win98SE, -, OJI3, P2B-F -, 66.23, Athlon(TB)700, 885(118 x 7.5), Win98, -, 、、、キ、ォ、, K7Pro SB on -, 49.42, Celeron 566, 100 x 8.5, Win98, -, 、、、キ、ォ、, ASUS P3BF -, 61.04, Duron 600, 100 x 8.5, Win98, -, 、、、キ、ォ、, ASUS A7V 15.34, 50.67, Athlon, 100 x 7.5, Linux 2.4.0-2 Slackware 7.0, egcs-2.91.66, Azzie, VIA KX133 -, 76.34, PIIIE, 1000(133 x 7.5), WinNT4.0SP6a, -, Kenrow, RIOWORKS PDVIA 23.05, 91.05, Pentium4, 1400(100 x 14), Win98SE, -, MCP, ES 9.21, 33.59, PIIIE, 100 x 4.5, plamo Linux 2.2.13, egcs-2.91.66, Mie, use enableSSE.o 21.95, 68.57, PIII Xeon x 4, 550, Win2k Server, -, Q-prj, effective # of CPU is 2? 4.72, 11.50, PentiumPro x 4, 200, Win2k Server, -, Q-prj, effective # of CPU is 2? 4.48, 11.72, PII, 100 x 4, Win98, -, ・ケ・ア・・ネ・ケ, - -, 73.80, Athlon(TB), 100 x 9.5, Win98SE, -, 、ユ、, K7V-T -, 26.19, PentiumIII, 450, Win95OSR2, -, 、ヲ、、, use SSECTL -, 50.86, Duron, 700, Linux2.4.0test7, -, 、ネ、゚、ハ、ャ, K7TPro -, 79.16, Athlon, 1100(100 x 11), Win98SE, -, ケセクヘタ, KT7-100 3.48, 9.11, Crusoe TM5600, 533?, Win2kSP1, -, MCP, ES -, 66.15, Athlon(TB), 100 x 9, FreeBSD5.0-Current, gcc2.95.2, thomas, - 4.09, 13.64, K6-II, 83 x 4.5, WinME, VisualStudio6.0, Oleg, - 25.55, 104.17, Pentium4 1.5G, 1600(100 x 16), Win98SE, -, MCP, ES(Engineering Sample) -, 107.87, PIIIE x 2, 800(133 x 6), Suse 6.4 Linux, gcc-2.95.3, Dara Hazeghi, - -, 26.37, PII x 2, 100 x 4.5, RedHat 7.0 Linux, gcc-2.95.3, Dara Hazeghi, - 8.57, 31.04, PIIIE, 447.8, Win2kSP1, GWB, PEN, - 17.95, 66.11, PIIIE, 935.4, WinME, GWB, タ豢ン, - 15.78, 57.51, PIIIE, 858.4, Win2kSP1, GWB, H.NAKAMURA, - 13.96, 45.44, Athlon, 698.6, Win98SE, GWB, Atushi, - 10.27, 33.52, Athlon, 503.5, Win98SE, GWB, キラ, - 17.27, 63.18, PIIIE, 869.8, Win2k, GWB, Syu, - 15.58, 57.86, PIIIE, 801.8, Win98SE, GWB, 、゚、、ュ, - 15.09, 55.95, PIII, 801.8, WinME, GWB, 、キ、イ、チ, - 3.69, 9.74, PII, 334.1, WinME, GWB, 、キ、イ、チ, - 12.66, 47.87, PIIIE, 720.4, Win98SE, GWB, 、爨鬢ェ, - 11.51, 28.14, Celeron x 2, 506.0, Win2kSP1, GWB, zunta, - 4.45, 11.62, PII, 400.9, WinME, GWB, ・ケ・ア・・ネ・ケ筍ノ簣キホ, - 1.48, 4.43, WinChip2, 199.4, Win95, GWB, Mimora, - 0.0025, 0.0063, 486SLC, 50, Win95, GWB, PEN, FPU emu 3.26, 8.21, TM5600, 595.5, WinME, GWB, Mimora, - 18.57, 63.80, Athlon, 110 x 8, Win98SE, GWB, T arai, K7V-T 7.68, 28.59, PIIIE, 398.3, WinME, GWB, 、、、ア、荀, - 18.82, 71.44, PIIIE, 1002.3, Win98SE, GWB, 、ソ、ル, - 16.56, 60.27, PIIIE, 851.9, Win2kSP1, GWB, pikokun, - 11.77, 42.71, PIIIE, 602.2, Win2kSP1, GWB, Takuomi Kagaya, - 16.30, 59.67, PIIIE 600, 799.7, Win98, GWB, skawato, 440BX 13.70, 29.12, Xeon-1M-Quad(Katmai), 100 x 5, VineLinux2.0(ker2.2.17), egcs-2.91.66, 、ヲ、、, no SSE 21.57, 74.29, Athlon(TB), 1016.6, Win2kSP1, GWB, Carol, - 14.08, 51.22, Celeron(Coppermine) 566, 106.5 x 8.5, Win2kSP1, GWB, syo, - 6.21, 16.53, Celeron, 551.2, Win98SE, GWB, ・゙・テ・ネ, - -, 56.18, Duron 600, 807.9, Win98, GWB, takeyan, - -, 24.18, K6-III, 451.0, Win98, GWB, yuh, - 7.91, 28.22, K6-2+, 105 x 5.5, WinME, GWB, 、ト、テ、ッ、, ASUS P5A 8.76, 31.76, Celeron(Coppermine), 534.5, Win98, GWB, kaz_mark, - 5.69, 15.46, Celeron, 534.5, Win98SE, GWB, kaz_mark, - 13.38, 48.37, PIIIE, 668.2, Win98, GWB, kaz_mark, - 12.57, 46.05, Celeron(Coppermine), 807.9, Win98, GWB, kaz_mark, - 0.4516, 1.20, Pentium, 75, Win98, GWB, kaz_mark, - 1.00, 2.62, Pentium, 200, Win98, GWB, kaz_mark, - 14.75, 49.37, Athlon, 750, Win98, GWB, 、ヒ、爍シ, - 0.009138, 0.226, 486DX2, 66, Win95, GWB, kaz_mark, - -, 31.29, PIII, 550, Win2kSP1, GWB, 、ソ、ア、ケ、」, - 0.687, 2.34, MMX P5, 200, Win98, GWB, BLUE, - -, 10.29, PII, 350, Win2kSP1, GWB, X, - -, 42.06, PIIIE, 600, Win98, GWB, ・ケ・テ・ュ。チ「, - -, 48.98, PIII, 700, Win98SE, GWB, Hyou, - 6.65, 25.18, K6-2+, 550, Win98, GWB, ・ケ・テ・ュ。チ「, - 8.17, 31.69, Celeron(Coppermine), 500, Win98SE, GWB, 、ネ、, - 12.78, 45.23, PIIIE, 666, Win2kSP1, GWB, frontier, - 16.19, 60.58, PIIIE, 850, Win98SE, GWB, 、ン、ッ, ケ篶レサコカネnote 0.00338, 0.00651, i486SX, 33, Win98, GWB, 、エ、゙, - 0.0922, 0.212, 486DX2, 50, Win98, GWB, 、エ、゙, - 0.182, 0.402, 486DX4, 100, Win95, GWB, 、エ、゙, - 1.66, 5.53, IDT WinChip2, 200, Win98, GWB, 、エ、゙, - 14.03, 54.98, Duron, 780.8, Win2kSP1, GWB, 、隍ヲ、リ、、, - 11.37, 37.69, Athlon, 548.9, Win98, GWB, Yama-Soft, - 10.02, 24.92, Celeron x 2, 450, Win2kSP1, GWB, kzh, abit bp6 1.0 16.26, 54.71, Athlon, 805.6, WinME, GWB, miku3492, asus K7M 6.90, 24.85, K6-III+, 451.0, Win98, GWB, miku3492, ax59pro 4.70, 19.31, K6-III, 100 x 4.5, Win95OSR2, GWB, 、ー、テ、ヤ。チ, PC9821 18.81, 62.56, Athlon 750, 954(106 x 9), WinME, GWB, 、ト、テ、ッ、, asus K7M -, 73.35, Athlon(TB) 800, 1000(100 x 10), Win98, GWB, yas, - -, 87.12, Athlon(TB), 1200, WinME, GWB, 、ケ、キ。チ, - 25.81, 88.03, Athlon(TB), 1200, WinME, GWB, 、ケ、キ。チ, off MMX 12.48, 46.97, Celeron(Coppermine), 101 x 8, WinME, GWB, シ, - 0.00539, 0.1787, K6-2+, 66.8 x 4.5, Win98, GWB, 、ヲ、、, BIOS not support 3.71, 12.77, K6-2+, 66.8 x 4.5, Win98, GWB, 、ヲ、、, BIOS support 22.80, 78.88, Athlon(TB) 750, 1050(105 x 10), Win2kSP1, GWB, 」セネ, K7M 7.37, 29.98, K6-III+, 530.5, Win98, GWB, 、ミ、。シ、, VTOWNS SH20 15.53, 58.89, PIIIE 650, 819(78 x 10.5), WinME, GWB, SIN, - 30.01, 101.53, Xeon/256KB x 2, 800, Win2k, GWB, D-NA, Iwill DCA200-N PC800 128 x 2 15.31, 56.12, PIIIE, 800(100 x 8), Win2k, GWB, Takakun, - 21.01, 68.69, PIIIE x 2, 600, Win2kSP1, GWB, 、ハ、ゥ, PDVIA-LS -, 51.70, PIIIE, 731.5, Win2k, GWB, 「ヲ。ヲ」。ヲ「ヲ, - 21.22, 78.18, Athlon(TB) 25week, 1045(110 x 9.5), Win2kSP1, GWB, aperitif, K7V-T 8.48, 27.71, PIII(katmai), 100 x 5, Win98, GWB, shu, - -, 51.29, Athlon, 800, Win2kSP1, GWB, MAI, - 14.54, 53.12, PIIIE, 750, Win98SE, GWB, TKSII, - -, 36.05, Celeron, 667, Win98SE, GWB, mako, PC98-NX + PK-P2A667NX 19.25, 70.49, PIIIE, 976(122 x 8), WinME, GWB, maamaa, CUSL2P FAN;Retail(SANYO) 36.76, 123.90, PIIIE x 2, 1001(143 x 7), Win2kSP1, GWB, Shunk, MSI-694Dpro 9.59, 23.96, Celeron300 x 2, 450, GWB, Win2kSP1, 、ヒ、, - 14.87, 58.27, Celeron(Coppermine), 891.8, Win2kSP1, GWB, junchi, AX3Spro 15.63, 61.94, Celeron(Coppermine) 566, 935, Win2kSP1, GWB, bou, - -, 33.00, PIII, 600, Win98SE, GWB, konoyo, - 16.17, 66.52, Duron 600, 1000, Win2kSP1, GWB, Ryen, off MMX 27.03, 89.69, PIIIE x 2, 800, Win2kSP1, GWB, 、ク、遉ィ, GA-6BXD 35.45, 122.49, PIIIE 700 x 2, 1000, Win2kSP1, GWB, 、ャ、、チ、网, - 4.43, 12.49, K6-2, 100 x 5.5, Win98SE, GWB, saru, - -, 54.62, SpeedStep PIII, 750, Win2kSP1, GWB, tomy, PCG-Z505CR/K(VAIO) 18.38, 67.18, PIIIE, 938(134 x 7), WinME, GWB, ニノ, - 39.46, 134.18, PIIIE 700(?) x 2, 1091.9, Win2k, GWB, 、ェ、ク, ASUS P3CD SL45Y 0.525, 1.38, Pentium, 133, Win95, GWB, ヌ」, - 40.94, 138.80, PIIIE 700 x 2, 1134(162 x 7), Win2kSP1, GWB, badboys, PC3-D 36.14, 123.09, PIIIE x 2, 1003.5(133.8 x 7.5), Win2k, GWB, 」ツ」オ、キ、、ラ、, SDVIA 18.40, 63.25, Athlon, 998, Win98SE, GWB, lunatic, Gateway Select1000 8.00, 28.09, K6-2+ 533, 600(100 x 6), Win98SE, GWB, K6user, AX59Pro 6.60, 16.37, PII266 x 2, 300, Win2k, GWB, PII user, - 8.73, 33.31, Celeron(Coppermine), 498.6(55.4 x 9), Win2kSP1, GWB, 、ヨ、, ThinkPad i Series1200 11.37, 42.32, PIIIE, 600(100 x 6), Win2k, GWB, ソ蠡・、熙熙「, VAIO PCG-F65/BP 33.30, 113.28, PIII x 2, 925.7(132.2 x 7), Win2kSP1, GWB, monaco, MSI-694DPro(AI) 4.64, 19.68, K6-III, 400(66.8 x 6), WinME, GWB, タア、シ鬢熙キシヤ, FMV-DESKPOWER/SIII167 -, 60.06, PIIIE, 803.4, Win2k, GWB, 、ク、ァ、、。イ、ィ、, - 10.35, 34.06, PIII, 100 x 6, Win98, GWB, Yoshi, AOpenAX6BC-Pro 18.69, 64.82, Athlon(TB), 900, Win2k, GWB, 、キ、遉キ、ォ, ASUS A7V 32.74, 111.99, PIIIE x 2, 930.7(143.2 x 6.5), Win2kSP1, GWB, 、゙、, MSI-694DPro 26.13, 89.72, PIII x 2, 728.6(132.5 x 5.5), Win2kSP1, GWB, fut., MSI-694DPro -, 64.57, PIIIE, 936(117 x 8), WinME, GWB, 、チ、网, AX6BC PRO II 20.06, 66.58, Athlon 700, 1050(105 x 10), WinME, GWB, 、ト、テ、ッ、, FWD-K7KX -, 64.14, Athlon(TB), 900, Win2kSP1, GWB, GEN, - 7.90, 32.77, Celeron(Coppermine), 500(100 x 5), Win2kSP1, GWB, シックカス゚, Let's note CF-M2C 32.17, 106.36, PIIIE x 2, 931(133 x 7), Win2k, GWB, 、ォ、テ、ム、ッ、, P2B-D (MPS) 16.85, 61.50, PIIIE, 850(100 x 8.5), Win2kSP1, GWB, hidepin, - 16.52, 56.76, Athlon(TB) 700, 800, Win98SE, GWB, ・ン・、ホサ, K7TPro2 21.10, 76.85, Athlon(TB) 850, 1035(115 x 9), WinME, GWB, wachan, A7V (MSB 152CL2) 0.00189, 0.00381, 486SX, 20, Win95, GWB, シックカス゚, FM-TOWNSII HR20 15.27, 60.59, Duron, 908.1, WinME, GWB, 、ク、, K7T pro2A -, 69.58, PIIIE, 1000(133 x 7.5), WinME, GWB, sino, - 4.47, 12.27, K6-2, 500(83.3 x 6), Win98SE, GWB, Cheerio!, TX430 -, 64.90, PIIIE, 897(112.2 x 8), WinME, GWB, kagura, - -, 74.03, PIIIE 933, 1000(143 x 7), WinME, GWB, 、熙遉ヲ、゙, - 3.00, 8.59, K6-2, 400(66 x 6), WinME, GWB, ・「・ェ・ィ・陦シ・ー・・ネ, PC98-NX 8.04, 28.44, Celeron(Coppermine), 501(55.7 x 9), Win98SE, GWB, 、ヲ、゚、网「, - -, 71.89, PIIIE, 1005(134 x 7.5), Win98SE, GWB, Great_Tera, - 12.86, 49.57, PIIIE, 700, WinME, GWB, BLUE, SOTEC enoteH370TDX4 15.44, 56.83, PIIIE 600, 800(133 x 6), Win2kSP1, GWB, フトフ, - ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/bench/bench225.txt�������������������������������������������������������������������������100644 � 23421 � 144 � 3145 7220537254 14467� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������; ク盧螟ホ、ル、、チ(at bench in the early afternoon) ; result (-test, -test -nopsy) ; CPU ; clock(ext * rate) ; OS ; compiler and option ; name ; etc 13.63, 38.49, PIII x 2, 100 x 4.5, Linux-2.2.13+PIII.patch RedHat-5.2, gcc-2.95.1 -mcpu=pentiumpro, シオ, - 7.37, 22.25, PIII x 2, 100 x 4.5, Linux-2.2.13+PIII.patch RedHat-5.2, gcc-2.95.1 -mcpu=pentiumpro, シオ, ST 10.98, 35.19, Athlon, 100 x 6, Kondara MNU/Linux, -, シオ, - 14.09, 45.34, PIII 600E, 134 x 6, Kondara MNU/Linux ker 2.2.14, -, 、ム、ェ。シ, - 8.03, 26.37, Athlon, 100 x 5, Win95, cygwin-egcs-2.91 -mcpu=pentium-pro, キラ, - 0.95, 2.47, mobile MMX, 150, Win2k RC2, VC++6.0, ナウ、ホモ, - 3.11, 7.95, mobile Celeron, 66 x 5, Vine Linux 1.1 ker 2.2.13ac2, gcc-2.7.2.2, yosshy, - -, 43.04, Athlon 500, 100 x 7.5, Slackware7 Linux ker 2.2.14, egcs-2.91.66, KMF, - 10.34, 24.95, Celeron x 2, 100 x 5, Vine Linux 1.1CRW ker 2.2.14, egcs-2.09.29, yosshy, - 1.42, 3.54, K6-2, 66 x 4, Linux 2.2.13, egcs 2.91.66, Willi, - 16.32, 45.51, PIII Xeon x 2, 550, Linux 2.2.13 + PIII.patch, egcs 2.91.60, 、ホ、ワ、, - 9.40, 23.11, PIII x 2, 100 x 4.5, Kondara MNU/Linux ker 2.2.14, gcc-2.95.2-pgcc-2.95.3,、゙。シ, off SSE 13.16, 38.76, PIII x 2, 100 x 4.5, Kondara MNU/Linux ker 2.2.14 + PII.patch, gcc-2.95.2-pgcc-2.95.3,、゙。シ,- 4.13, 12.45, K6-2, 100 x 3.5, Linux-2.0.38, pgcc-2.95.3, 、「、、ノ、ヲ, - 3.23, 12.42, K6-2, 100 x 3.5, Win95OSR2.5, -, 、「、、ノ、ヲ, - 3.80, 12.76, K6-2, 100 x 3.5, Linux-2.0.38, djcrx-2.02, 、「、、ノ、ヲ, dosemu + PC-DOS7.0 17.09, 56.62, Athlon 550, 125.7 x 7.5, FreeBSD 4.0-CURRENT #0, gcc-2.95.2 19991024R, sec, 52スオ・「・ケ・・ L2 2/5 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gogo239b/bench/gogo_bench.html����������������������������������������������������������������������100644 � 23421 � 144 � 51762 7220537254 15426� 0����������������������������������������������������������������������������������������������������ustar �shigeo��������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html lang="ja"><head><title>gogo bench

ク盧螟ホ、ル、、チ、マフオツフ、ル、、チ
benchmark (top 30)

、ノ、、ノ、サイイテ、キ、ニ、ヘ
join us!

all list for ver. 2.26a is here


last up date: 11/30.2000

gogo236 -test -nopsy -silent (ST;Single, MT:Multi)
rankresult (psy)CPUclockOSnameetc
1 138.80 (40.94) PIIIE 700 x 2 1134(162 x 7) Win2kSP1 badboys PC3-D
2 134.18 (39.46) PIIIE 700(?) x 2 1091.9 Win2k 、ェ、ク ASUS P3CD SL45Y
3 123.90 (36.76) PIIIE x 2 1001(143 x 7) Win2kSP1 Shunk MSI-694Dpro
4 123.09 (36.14) PIIIE x 2 1003.5(133.8 x 7.5) Win2k 」ツ」オ、キ、、ラ、 SDVIA
5 122.49 (35.45) PIIIE 700 x 2 1000 Win2kSP1 、ャ、、チ、网 -
6 120.75 (35.89) PIIIE x 2 931(133 x 7) Win2kSP1 、ュ、网テ、ネ SuperMicroP3DRE PC800
7 113.28 (33.30) PIII x 2 925.7(132.2 x 7) Win2kSP1 monaco MSI-694DPro(AI)
8 111.99 (32.74) PIIIE x 2 930.7(143.2 x 6.5) Win2kSP1 、゙、 MSI-694DPro
9 110.66 (-) PIII x 2 866 Win2k 、ユ、 SuperMicroP3DME
10 107.87 (-) PIIIE x 2 800(133 x 6) Suse 6.4 Linux Dara Hazeghi -
11 106.36 (32.17) PIIIE x 2 931(133 x 7) Win2k 、ォ、テ、ム、ッ、 P2B-D (MPS)
12 104.17 (25.55) Pentium4 1.5G 1600(100 x 16) Win98SE MCP ES(Engineering Sample)
13 102.39 (29.98) PIIIE 600 x 2 800 Win2k 、ュ、网テ、ネ SuperMicroP3DME
14 101.53 (30.01) Xeon/256KB x 2 800 Win2k D-NA Iwill DCA200-N PC800 128 x 2
15 93.15 (26.46) PIIIE x 2 100 x 7 RedHat-5.2 Linux シオ -
16 91.05 (23.05) Pentium4 1400(100 x 14) Win98SE MCP ES
17 89.72 (26.13) PIII x 2 728.6(132.5 x 5.5) Win2kSP1 fut. MSI-694DPro
18 89.69 (27.03) PIIIE x 2 800 Win2kSP1 、ク、遉ィ GA-6BXD
19 88.03 (25.81) Athlon(TB) 1200 WinME 、ケ、キ。チ off MMX
20 87.12 (-) Athlon(TB) 1200 WinME 、ケ、キ。チ -
21 79.16 (-) Athlon 1100(100 x 11) Win98SE ケセクヘタ KT7-100
22 78.88 (22.80) Athlon(TB) 750 1050(105 x 10) Win2kSP1 」セネ K7M
23 78.18 (21.22) Athlon(TB) 25week 1045(110 x 9.5) Win2kSP1 aperitif K7V-T
24 77.31 (-) Athlon(TB) 1000(100 x 10) Win2k tomy MSI K7T Pro
25 76.85 (21.10) Athlon(TB) 850 1035(115 x 9) WinME wachan A7V (MSB 152CL2)
26 76.34 (-) PIIIE 1000(133 x 7.5) WinNT4.0SP6a Kenrow RIOWORKS PDVIA
27 74.29 (21.57) Athlon(TB) 1016.6 Win2kSP1 Carol -
28 74.03 (-) PIIIE 933 1000(143 x 7) WinME 、熙遉ヲ、゙ -
29 73.80 (-) Athlon(TB) 100 x 9.5 Win98SE 、ユ、 K7V-T
30 73.35 (-) Athlon(TB) 800 1000(100 x 10) Win98 yas -
31 71.89 (-) PIIIE 1005(134 x 7.5) Win98SE Great_Tera -
32 71.44 (18.82) PIIIE 1002.3 Win98SE 、ソ、ル -
33 71.34 (-) Athlon 950 1050(105 x 10) Win98SE 、ユ、 ASUS K7V
34 70.49 (19.25) PIIIE 976(122 x 8) WinME maamaa CUSL2P FAN;Retail(SANYO)
35 69.58 (-) PIIIE 1000(133 x 7.5) WinME sino -
36 68.69 (21.01) PIIIE x 2 600 Win2kSP1 、ハ、ゥ PDVIA-LS
37 68.57 (21.95) PIII Xeon x 4 550 Win2k Server Q-prj effective # of CPU is 2?
38 67.18 (18.38) PIIIE 938(134 x 7) WinME ニノ -
39 66.58 (20.06) Athlon 700 1050(105 x 10) WinME 、ト、テ、ッ、 FWD-K7KX
40 66.52 (16.17) Duron 600 1000 Win2kSP1 Ryen off MMX
41 66.23 (-) Athlon(TB)700 885(118 x 7.5) Win98 、、、キ、ォ、 K7Pro SB on
42 66.15 (-) Athlon(TB) 100 x 9 FreeBSD5.0-Current thomas -
43 66.11 (17.95) PIIIE 935.4 WinME タ豢ン -
44 64.90 (-) PIIIE 897(112.2 x 8) WinME kagura -
45 64.82 (18.69) Athlon(TB) 900 Win2k 、キ、遉キ、ォ ASUS A7V
46 64.57 (-) PIIIE 936(117 x 8) WinME 、チ、网 AX6BC PRO II
47 64.14 (-) Athlon(TB) 900 Win2kSP1 GEN -
48 63.80 (18.57) Athlon 110 x 8 Win98SE T arai K7V-T
49 63.25 (18.40) Athlon 998 Win98SE lunatic Gateway Select1000
50 63.18 (17.27) PIIIE 869.8 Win2k Syu -
51 62.56 (18.81) Athlon 750 954(106 x 9) WinME 、ト、テ、ッ、 asus K7M
52 61.94 (15.63) Celeron(Coppermine) 566 935 Win2kSP1 bou -
53 61.50 (16.85) PIIIE 850(100 x 8.5) Win2kSP1 hidepin -
54 61.3 (-) Athlon 550 965.25(128.7 x 7.5) FreeBSD 5.0-Current # sec 10%slower than 2.26
55 61.04 (-) Duron 600 100 x 8.5 Win98 、、、キ、ォ、 ASUS A7V
56 60.59 (15.27) Duron 908.1 WinME 、ク、 K7T pro2A
57 60.58 (16.19) PIIIE 850 Win98SE 、ン、ッ ケ篶レサコカネnote
58 60.27 (16.56) PIIIE 851.9 Win2kSP1 pikokun -
59 60.06 (-) PIIIE 803.4 Win2k 、ク、ァ、、。イ、ィ、 -
60 59.67 (16.30) PIIIE 600 799.7 Win98 skawato 440BX
61 58.89 (15.53) PIIIE 650 819(78 x 10.5) WinME SIN -
62 58.27 (14.87) Celeron(Coppermine) 891.8 Win2kSP1 junchi AX3Spro
63 57.86 (15.58) PIIIE 801.8 Win98SE 、゚、、ュ -
64 57.80 (-) PIIIE 600 800(133 x 6) Win98SE OJI3 P2B-F
65 57.53 (17.53) Athlon750 105 x 4.5 Win98 、ト、テ、ッ、 -
66 57.51 (15.78) PIIIE 858.4 Win2kSP1 H.NAKAMURA -
67 56.83 (15.44) PIIIE 600 800(133 x 6) Win2kSP1 フトフ -
68 56.76 (16.52) Athlon(TB) 700 800 Win98SE ・ン・、ホサ K7TPro2
69 56.18 (-) Duron 600 807.9 Win98 takeyan -
70 56.12 (15.31) PIIIE 800(100 x 8) Win2k Takakun -
71 55.95 (15.09) PIII 801.8 WinME 、キ、イ、チ -
72 54.98 (14.03) Duron 780.8 Win2kSP1 、隍ヲ、リ、、 -
73 54.71 (16.26) Athlon 805.6 WinME miku3492 asus K7M
74 54.62 (-) SpeedStep PIII 750 Win2kSP1 tomy PCG-Z505CR/K(VAIO)
75 54.19 (14.66) PIIIE x 2 100 x 7 RedHat-5.2 Linux シオ ST
76 53.12 (14.54) PIIIE 750 Win98SE TKSII -
77 52.69 (16.24) PIII x 2 100 x 4.5 RedHat-5.2 Linux シオ -
78 51.70 (-) PIIIE 731.5 Win2k 「ヲ。ヲ」。ヲ「ヲ -
79 51.29 (-) Athlon 800 Win2kSP1 MAI -
80 51.22 (14.08) Celeron(Coppermine) 566 106.5 x 8.5 Win2kSP1 syo -
81 50.86 (-) Duron 700 Linux2.4.0test7 、ネ、゚、ハ、ャ K7TPro
82 50.67 (15.34) Athlon 100 x 7.5 Linux 2.4.0-2 Slackware Azzie VIA KX133
83 50.30 (14.92) Athlon 200 x 3.5 Kondara MNU/Linux1.0 、オ -
84 49.57 (12.86) PIIIE 700 WinME BLUE SOTEC enoteH370TDX4
85 49.42 (-) Celeron 566 100 x 8.5 Win98 、、、キ、ォ、 ASUS P3BF
86 49.37 (14.75) Athlon 750 Win98 、ヒ、爍シ -
87 48.98 (-) PIII 700 Win98SE Hyou -
88 48.37 (13.38) PIIIE 668.2 Win98 kaz_mark -
89 47.87 (12.66) PIIIE 720.4 Win98SE 、爨鬢ェ -
90 46.97 (12.48) Celeron(Coppermine) 101 x 8 WinME -
91 46.05 (12.57) Celeron(Coppermine) 807.9 Win98 kaz_mark -
92 45.44 (13.96) Athlon 698.6 Win98SE Atushi -
93 45.23 (12.78) PIIIE 666 Win2kSP1 frontier -
94 43.86 (13.01) Athlon 200 x 3 Win2k 、゚ -
95 43.51 (-) PIIIE 600 100 x 6 Win98SE OJI3 P2B-F
96 42.71 (11.77) PIIIE 602.2 Win2kSP1 Takuomi Kagaya -
97 42.32 (11.37) PIIIE 600(100 x 6) Win2k ソ蠡・、熙熙「 VAIO PCG-F65/BP
98 42.06 (-) PIIIE 600 Win98 ・ケ・テ・ュ。チ「 -
99 37.69 (11.37) Athlon 548.9 Win98 Yama-Soft -
100 36.05 (-) Celeron 667 Win98SE mako PC98-NX + PK-P2A667NX
101 34.06 (10.35) PIII 100 x 6 Win98 Yoshi AOpenAX6BC-Pro
102 33.59 (9.21) PIIIE 100 x 4.5 plamo Linux 2.2.13 Mie use enableSSE.o
103 33.52 (10.27) Athlon 503.5 Win98SE キラ -
104 33.31 (8.73) Celeron(Coppermine) 498.6(55.4 x 9) Win2kSP1 、ヨ、 ThinkPad i Series1200
105 33.00 (-) PIII 600 Win98SE konoyo -
106 32.8 (9.23) PIIIE 100 x 4.5 Win98 、゚ -
107 32.77 (7.90) Celeron(Coppermine) 500(100 x 5) Win2kSP1 シックカス゚ Let's note CF-M2C
108 31.76 (8.76) Celeron(Coppermine) 534.5 Win98 kaz_mark -
109 31.69 (8.17) Celeron(Coppermine) 500 Win98SE 、ネ、 -
110 31.29 (-) PIII 550 Win2kSP1 、ソ、ア、ケ、」 -
111 31.04 (8.57) PIIIE 447.8 Win2kSP1 PEN -
112 29.98 (7.37) K6-III+ 530.5 Win98 、ミ、。シ、 VTOWNS SH20
113 29.12 (13.70) Xeon-1M-Quad(Katmai) 100 x 5 VineLinux2.0(ker2.2.17) 、ヲ、、 no SSE
114 28.59 (7.68) PIIIE 398.3 WinME 、、、ア、荀 -
115 28.44 (8.04) Celeron(Coppermine) 501(55.7 x 9) Win98SE 、ヲ、゚、网「 -
116 28.22 (7.91) K6-2+ 105 x 5.5 WinME 、ト、テ、ッ、 ASUS P5A
117 28.14 (11.51) Celeron x 2 506.0 Win2kSP1 zunta -
118 28.09 (8.00) K6-2+ 533 600(100 x 6) Win98SE K6user AX59Pro
119 27.71 (8.48) PIII(katmai) 100 x 5 Win98 shu -
120 26.37 (-) PII x 2 100 x 4.5 RedHat 7.0 Linux Dara Hazeghi -
121 26.19 (-) PentiumIII 450 Win95OSR2 、ヲ、、 use SSECTL
122 25.18 (6.65) K6-2+ 550 Win98 ・ケ・テ・ュ。チ「 -
123 24.92 (10.02) Celeron x 2 450 Win2kSP1 kzh abit bp6 1.0
124 24.85 (6.90) K6-III+ 451.0 Win98 miku3492 ax59pro
125 24.18 (-) K6-III 451.0 Win98 yuh -
126 23.96 (9.59) Celeron300 x 2 450 GWB 、ヒ、 -
127 20.45 (5.06) K6-III 333 70 x 5 TownsLinux-2.0.33 、゚ TOWNS-HC
128 19.68 (4.64) K6-III 400(66.8 x 6) WinME タア、シ鬢熙キシヤ FMV-DESKPOWER/SIII167
129 19.31 (4.70) K6-III 100 x 4.5 Win95OSR2 、ー、テ、ヤ。チ PC9821
130 18.60 (5.46) K6-2AFR 100 x 4 WinNT4.0SP5 OJI3 L2 2MB
131 18.01 (7.34) Celeron 333 x 2 66 x 5 Win2k 、隍テ、キ。チ TekramP6B40D-A5
132 16.53 (6.21) Celeron 551.2 Win98SE ・゙・テ・ネ -
133 16.37 (6.60) PII266 x 2 300 Win2k PII user -
134 15.85 (4.96) K6-2 100 x 3.5 Linux-2.0.39pre3 libc-5. 、「、、ノ、ヲ -silent
135 15.46 (5.69) Celeron 534.5 Win98SE kaz_mark -
136 13.64 (4.09) K6-II 83 x 4.5 WinME Oleg -
137 12.77 (3.71) K6-2+ 66.8 x 4.5 Win98 、ヲ、、 BIOS support
138 12.49 (4.43) K6-2 100 x 5.5 Win98SE saru -
139 12.27 (4.47) K6-2 500(83.3 x 6) Win98SE Cheerio! TX430
140 11.72 (4.48) PII 100 x 4 Win98 ・ケ・ア・・ネ・ケ -
141 11.62 (4.45) PII 400.9 WinME ・ケ・ア・・ネ・ケ筍ノ簣キホ -
142 11.50 (4.72) PentiumPro x 4 200 Win2k Server Q-prj effective # of CPU is 2?
143 10.56 (3.91) Celeron 333 x 2 66 x 5 Win2k 、隍テ、キ。チ ST
144 10.29 (-) PII 350 Win2kSP1 X -
145 9.74 (3.69) PII 334.1 WinME 、キ、イ、チ -
146 9.71 (3.37) Mobile-Celeron 66 x 4.5 FreeBSD3.3R gm TP240
147 9.11 (3.48) Crusoe TM5600 533? Win2kSP1 MCP ES
148 8.59 (3.00) K6-2 400(66 x 6) WinME ・「・ェ・ィ・陦シ・ー・・ネ PC98-NX
149 8.55 (3.31) PII 66 x 4 Kondara MNU/Linux1.0 シオ -
150 8.21 (3.26) TM5600 595.5 WinME Mimora -
151 5.53 (1.66) IDT WinChip2 200 Win98 、エ、゙ -
152 4.43 (1.48) WinChip2 199.4 Win95 Mimora -
153 2.62 (1.00) Pentium 200 Win98 kaz_mark -
154 2.34 (0.687) MMX P5 200 Win98 BLUE -
155 1.38 (0.525) Pentium 133 Win95 ヌ」 -
156 1.20 (0.4516) Pentium 75 Win98 kaz_mark -
157 0.402 (0.182) 486DX4 100 Win95 、エ、゙ -
158 0.226 (0.009138) 486DX2 66 Win95 kaz_mark -
159 0.212 (0.0922) 486DX2 50 Win98 、エ、゙ -
160 0.1787 (0.00539) K6-2+ 66.8 x 4.5 Win98 、ヲ、、 BIOS not support
161 0.00651 (0.00338) i486SX 33 Win98 、エ、゙ -
162 0.0063 (0.0025) 486SLC 50 Win95 PEN FPU emu
163 0.00381 (0.00189) 486SX 20 Win95 シックカス゚ FM-TOWNSII HR20

Please mail to shigeo
gogo239b/bench/gogo_bench_all.html100644 23421 144 75167 7220537254 16263 0ustar shigeousersgogo bench

ク盧螟ホ、ル、、チ、マフオツフ、ル、、チ
benchmark (all)

back


gogo -test -nopsy
rankresultCPUclockstatusOScompilernameetc
1 51.56 PIII Xeon x 4500- WinNT4.0SP5 - MCP-
2 38.20 PIII x 2 100 x 6- Linux-Mandrake 6.0 ke gcc-2.95.2 -mcpu= aoy -
3 37.68 PIII coppermine 103 x 8- Win2000RC2 2.22cMT-bin MCP -
4 33.26 PIII coppermine 115 x 7- Win98SE - ooura-
5 31.67 PIII x 2 100 x 4.5- Linux-2.2.13+PIII.pat egcs-2.91.57 -mcpシオ -
6 31.40 PIII x 2 450- RedHat-Linux6.1 kerne gcc-2.95.2 -mpent、゙。シ-
7 31.26 PIII x 2 112 x 4.5- WinNT4.0SP5 - 」ミ」ナ」ホ。ウ、ヌュ -
8 31.01 PIII x 2 112 x 4.5- Win2000RC2 - MCP -
9 30.39 PIII coppermine700- Win98SE - MCP -
10 29.65 Athlon 700- Win98SE - MCP -
11 29.51 PIII x 2 100 x 4.5- WinNT4.0SP5 - 」ミ」ナ」ホ。ウ、ヌュ -
12 26.21 Athlon 600- Linux-2.2.13 - ハ。テマ -
13 25.37 Athlon500 100 x 6- Win98 MT-bin 、、、キ、ォ、 -
14 24.33 PIII 600- WinNT4.0SP5 - Paper -
15 24.26 Celeron366 x 2 103 x 5.5- Win2000beta3 2.22c-bin 、熙螟ヲ -
16 24.15 Athlon 600- Win98SE - 、ハ、ハ、キ、ホ VTOWNS ATmode
17 23.42 Athlon500 600- Win98SE - T arai -
18 22.95 Celeron 333 x 2 112 x 5- WinNT4.0SP5- ohtani -
19 22.77 Celeron300A x 2 110 x 4.5- VineLinux1.1 kernel2. - 、ォ、、、フ、゙。、ヒ、、、ャ、ソ -
20 22.45 PIII 585- Win98 - 、ソ、ハ、ア、 -
21 22.28 PII x 2 112 x 4.5- BeOS R4.5.1 Intel gcc 2.9-beos-9809 Noisyu Linuxネヌ、隍テル、、(^^;
22 21.04 Celeron300A x 2 110 x 4.5- WinNT4.0SP5 MT-bin koyama-
23 20.62 PII x 2 100 x 4.5- Linux-2.2.12 RedHat-5 egcs-2.91.57 -mcp シオ -
24 20.48 Celeron300A x 2 110 x 4.5- BeOS R4.5.2 - mutuki -
25 20.45 Athlon 600- TownsOSV2.1L40 - 、ハ、ハ、キ、ホ VTOWNS TOSmode
26 20.30 Celeron300A x 2 100 x 4.5- Linux2.2.9 - 、ン、、ケ、ア -
27 19.92 Celeron300A x 2 100 x 4.5- Win2000Pro - holonic -
28 19.84 K6-III 100 x 5- WinNT5.0 - tak4 -
29 19.70 Celeron300A x 2 100 x 4.5- Win2000 - 、ソ、、ー、ケ、ニ、 Build2167(International)
30 19.45 Athlon 700 off 3DN Win98SE - MCP-
31 18.71 Athlon 500- Win98 - 、爨テ、チ、、 -
32 18.67 K6-III 100 x 4.5- WinNT4.0SP5 - ROG -
33 18.25 PIII coppermine700 off SSE Win98SE - MCP-
34 17.95 PIII 100 x 4.5- Win98 - 、マ、コ -
35 17.68 PIII 100 x 5- Win98 - ・陦シ・ケ・ア FM-V
36 17.63 PIII 100 x 4.5- Win98 - OJIOJI -
37 17.28 K6-III 450- Win95 for TOWNS - ナエヒ、カフ」アケ フオーVTOWNS
38 16.88 K6-III 100 x 4.5 off MMX WinNT4.0SP5 - ROG-
39 16.56 PIII 100 x 4.5- Win95SE - sekiguchi -
40 16.41 K6-III 400 100 x 4.5- Win98 MT-bin 、、、キ、ォ、 -
41 15.89 PIII 100 x 4.5- BeOS R4.5.2 - 、マ、コ -
42 15.71 Celeron333PPGA x 2 68.5 x 5- Plamo Linux 1.4.1 kern MT-bin 、隍テ、キ。チ -
43 15.28 K6-2 500- Win95OSR2.1 - 、ミ、荀キ -
44 14.55 K6-III 66 x 6- NetBSD/pc98 egcs-2.91.60 1998 クカナト PC-9821Xv20
45 14.51 PIII 117 x 5- Win95OSR2.1 - 、ソ、ハ、ア、 -
46 14.51 PIII 585 off SSE Win95 - 、ソ、ハ、ア、-
47 14.48 K6-III 450- TownsOSV2.1L51 - ナエヒ、カフ」アケ フオーVTOWNS
48 13.47 K6-III 70 x 5.5- TownsOSV2.1L51 - 、ウ、テ、ッ、 FM-TOWNS HBイ
49 13.36 K6-III 66 x 6- Win95 - キラ -
50 13.23 Celeron 366 100 x 5.5- Win98 MT-bin 、、、キ、ォ、 -
51 12.95 Celeron300A x 2 110 x 4.5 ST WinNT4.0SP5 ST-bin koyama-
52 12.90 K6-2 115 x 3.5- Win98 - Hash -
53 12.71 PIII x 2 100 x 5 ST and off SSE FreeBSD3.2R gcc-2.7.2.1 -O3 - シオ-
54 12.57 Celeron300A x 2 110 x 4.5 ST Solaris7 for x86 gcc-2.7.2.3 koyama-
55 12.52 Celeron300A x 2 110 x 4.5 ST FreeBSD3.2 gcc-2.7.2.1 koyama-
56 12.47 Celeron333 100 x 5- WinNT4.0SP5 - KatoSTOWNS・ォ。シ・ノナコワAT
57 12.28 K6-2 350 400- Linux? - 、ォ、ソ、荀゙ヒソ -
58 12.16 PII 400 124 x 4- Win98 - OJIケ篦ョハヤ コニナルHMD、ヒーオセ。、ヌ、ケ
59 11.81 Celeron300A 129 x 4.5- ? ? 、、 -
60 11.77 K6-2 115 x 3.5- Win98 High-C Hash -
61 11.72 Celeron300A 100 x 4.5- Win2000Pro - HMD OJI、ヒセ。、テ、ソ
62 11.67 Celeron366 83 x 5.5- Win2000Pro - 、ォ、ア、 -
63 11.56 K6-III 400 60 x 6- Win95OSR2.1 - コエニ」 FMV-TOWNS GS
64 11.54 K6-2 66 x 6- WinNT4.0 SP5 ST-binary OJI3 -
65 11.41 K6-2 66 x 6- WinNT4.0 SP5 MT-binary OJI3 -
66 11.28 Celeron300A 100 x 4.5- Win98 - HMDチエイ靂フ・筍シ・ノ
67 10.84 Celeron333 100 x 5- TownsOSV2.1L51 - KatoSTOWNS・ォ。シ・ノナコワAT
68 10.6 Celeron300A 100 x 4.5- Win98 - ナオホョ、シヤ -
69 10.48 K6-2 66 x 6- Win95OSR2.1 - 、隍キ、ヒ、遉 -
70 9.95 K6-2 100 x 3- FreeBSD3.3-STABLE gcc ・ケ・ョ・ヲ・ -
71 9.92 PII 100 x 4- Win98 - 、ソ、。シ -
72 9.21 K6-2 66 x 4.5- Debian /Linux potato gcc 2.95.2 199911 ROOK FMV-5150DPS
73 9.12 Celeron 400- Win98 - Yamao -
74 8.90 PII 100 x 3.5- FreeBSD2.2.8R gcc-2.7.2.1 、ヲ、、 -
75 8.79 Celeron 66 x 6.5- Win98SE MT-bin 、、、キ、ォ、 -
76 8.77 Celeron266 100 x 4- Win98 - TER -
77 8.55 Celeron333PPGA x 2 68.5 x 5 ST Plamo Linux 1.4.1 kern ST-bin 、隍テ、キ。チ-
78 7.71 K6-2 300 70 x 4.5- Linux 2.0.33 gcc 2.7.2 -m486 - 、リ、、゚ FM-TOWNSIIHC
79 6.94 K6-III 100 x 4.5 off 3DN WinNT4.0SP5 - ROG-
80 6.81 PII 266- FreeBSD2.2.8R gcc version 2.7.2 ツフヌマノラ -
81 6.63 K6-III 100 x 4.5 off MMX & 3DN WinNT4.0SP5 - ROG-
82 6.18 MMXP5 x 2 66 x 3.5- WinNT4.0SP4 - 、皃ヘ、キ、ケ -
83 5.88 PII 233- Linux-2.2.10 - HIRO -
84 5.36 MMXP5 x 2 200- WinNT4.0SP5 - mmm -
85 4.70 PPro 66 x 3- WinNT4.0SP5 - 、ソ、。シ -
86 4.53 WinChip2 266 66 x 3.5- WinNTSP5 - I-walker PC-98(Xt13/K12)
87 4.12 WinChip2-240 66 x 4- Win98 - 」モ」ヘ」ノ」フ」ル PC-9821Cx2(イ)
88 3.84 K6 300- Win2000 - Yamao -
89 3.57 MMXP5 x 2 66 x 3.5 ST WinNT4.0SP4 - 、皃ヘ、キ、ケ-
90 3.50 K6 300- TurboLinux4.0 - Yamao -
91 3.40 K6 66 x 4- FreeBSD2.2.8R gcc version 2.7.2 ツフヌマノラ -
92 3.38 Cyrix MII 95 x 4- Win2000Pro beta3 - 、ユ、ネ、゙、 ツフフワツフフワ、ヌ、ケ(オ)
93 3.17 K6 300- BeOS R4.5.2 - Yamao -
94 3.13 MMXP5 66 x 3- Win98SP1 - 、「、テ、ラ、、ユ、ァ、ホ、 -
95 2.80 mp6-266 66 x 3- Win95OSR2.1 - 、隍キ、ヒ、遉 -
96 2.80 Cyrix MII-400 112 x 2.5 off MMX Win98SE- Kazz.-
97 2.78 Cyrix MII-400 112 x 2.5- Win98SE- Kazz. -
98 2.67 Cyrix MII 75 x 3.5- Win95OSR2.1 - Paper -
99 2.44 MMXPentium 66 x 2.5- Win9x - 、ヲ、、 -
100 2.07 P5 60 x 2.5- Win95OSR2.5 - 、ソ、。シ -
101 1.69 P5 60 x 2- Win95OSR2 - t.derringer FMV-5120
102 1.35 Cx6x86-PR200 75 x 2- FreeBSD3.2R - 、荀、鬢ョ -
103 1.25 P5 66 x 1.5- Linux-2.2.13 - HIRO -
104 0.71 Cx5x86 37.5 x 3- TownsOSV2.1L51 High-C Hash -
105 0.57 Cx5x86-120GP 20 x 2 x 3- Win95 - 、、、キ、ォ、 PC-9801DA+Melco EUB=HOM
106 0.52 Cx5x86 100- MSDOS6.2+EXE3861.0m TOWNS-bin 、荀、鬢ョ PC-9821As
107 0.50 5x86-P75 35 x 4- FreeBSD(98)2.28R rev0 gcc 2.7.2.1 、ユ、ハ、ン、 PC9821As
108 0.45 i486DX4 33 x 3- Win95OSR2.1 - 、隍キ、ヒ、遉 -
109 0.45 5x86P75 133- TownsOSV2.1L51 - Kyozy FM-TOWNSIIFresh
110 0.40 AM486DX4-75 33 x 3- Win95OSR2.1 - 、隍キ、ヒ、遉 -
111 0.29 i486DX4 25 x 3- Win95 - キラ ・・ヨ・・テ・ネ20
112 0.29 i486ODP-DX4 25 x 3- MSDOS5.0A-H+EXE386 1. TOWNS-bin 、ソ、。シPC-9821Ae
113 0.24 Cx486Dx2 33 x 2- Win95 - HMD EPSON VM466R
114 0.23 i486DX-ODP 40 27 x 2- TownsOSV2.1L20 - 、リ、、゚ FM-TOWNSIIHR(^^;
115 0.0581 IBM486BL3+i387DX 33- NetBSD/pc98(base1.41)gcc -mcpu=i386クカナト PC-H98model70
116 0.0095 486SX (no FPU) 25 x 2- Win95 - I-walkter EPSON PC-486SE
117 0.00537 486SX (no FPU) 25- Win95 - 、「、テ、ラ、、ユ、ァ、ホ、 EPSON PC-486SE




gogo -test
rankresultCPUclockstatusOScompilernameetc
1 16.49 PIII Xeon x 4500- WinNT4.0SP5 - MCP-
2 14.14 PIII x 2 100 x 6- Linux-Mandrake 6.0 ke gcc-2.95.2 -mcpu= aoy -
3 12.53 PIII x 2 112 x 4.5- Win2000RC2 - MCP -
4 12.37 PIII x 2 112 x 4.5- WinNT4.0SP5 - 」ミ」ナ」ホ。ウ、ヌュ -
5 12.22 PIII coppermine 103 x 8- Win2000RC2 2.22cMT-bin MCP -
6 11.59 PIII x 2 100 x 4.5- Linux-2.2.13+PIII.pat egcs-2.91.57 -mcpシオ -
7 11.58 PIII x 2 450- RedHat-Linux6.1 kerne gcc-2.95.2 -mpent、゙。シ-
8 11.21 PIII coppermine 115 x 7- Win98SE - ooura-
9 11.20 PIII x 2 100 x 4.5- WinNT4.0SP5 - 」ミ」ナ」ホ。ウ、ヌュ -
10 11.01 Celeron366 x 2 103 x 5.5- Win2000beta3 2.22c-bin 、熙螟ヲ -
11 10.45 Celeron 333 x 2 112 x 5- WinNT4.0SP5- ohtani -
12 10.15 PIII coppermine700- Win98SE - MCP -
13 10.12 Athlon 700- Win98SE - MCP -
14 9.63 Celeron300A x 2 110 x 4.5- WinNT4.0SP5 MT-bin koyama-
15 9.63 Celeron300A x 2 110 x 4.5- VineLinux1.1 kernel2. - 、ォ、、、フ、゙。、ヒ、、、ャ、ソ -
16 9.49 PII x 2 112 x 4.5- BeOS R4.5.1 Intel gcc 2.9-beos-9809 Noisyu Linuxネヌ、隍テル、、(^^;
17 8.96 Celeron300A x 2 100 x 4.5- Win2000Pro - holonic -
18 8.85 PII x 2 100 x 4.5- Linux-2.2.12 RedHat-5 egcs-2.91.57 -mcp シオ -
19 8.83 Celeron300A x 2 100 x 4.5- Win2000 - 、ソ、、ー、ケ、ニ、 Build2167(International)
20 8.80 Celeron300A x 2 110 x 4.5- BeOS R4.5.2 - mutuki -
21 8.76 Athlon 600- Linux-2.2.13 - ハ。テマ -
22 8.66 Celeron300A x 2 100 x 4.5- Linux2.2.9 - 、ン、、ケ、ア -
23 8.59 Athlon500 100 x 6- Win98 MT-bin 、、、キ、ォ、 -
24 8.40 Athlon500 600- Win98SE - T arai -
25 8.38 Athlon 600- Win98SE - 、ハ、ハ、キ、ホ VTOWNS ATmode
26 8.20 PIII 600- WinNT4.0SP5 - Paper -
27 7.83 PIII 585- Win98 - 、ソ、ハ、ア、 -
28 7.00 Athlon 500- Win98 - 、爨テ、チ、、 -
29 6.63 Celeron333PPGA x 2 68.5 x 5- Plamo Linux 1.4.1 kern MT-bin 、隍テ、キ。チ -
30 6.63 PIII 100 x 5- Win98 - ・陦シ・ケ・ア FM-V
31 6.63 Athlon 600- TownsOSV2.1L40 - 、ハ、ハ、キ、ホ VTOWNS TOSmode
32 6.15 PIII 100 x 4.5- Win98 - 、マ、コ -
33 6.14 PIII 100 x 4.5- Win98 - OJIOJI -
34 6.08 PIII 117 x 5- Win95OSR2.1 - 、ソ、ハ、ア、 -
35 6.08 PIII 585 off SSE Win95 - 、ソ、ハ、ア、-
36 5.97 K6-III 100 x 5- WinNT5.0 - tak4 -
37 5.62 PIII 100 x 4.5- Win95SE - sekiguchi -
38 5.62 K6-III 100 x 4.5- WinNT4.0SP5 - ROG -
39 5.56 PIII 100 x 4.5- BeOS R4.5.2 - 、マ、コ -
40 5.49 Celeron 366 100 x 5.5- Win98 MT-bin 、、、キ、ォ、 -
41 5.19 Celeron300A x 2 110 x 4.5 ST WinNT4.0SP5 ST-bin koyama-
42 5.13 PII 400 124 x 4- Win98 - OJIケ篦ョハヤ コニナルHMD、ヒーオセ。、ヌ、ケ
43 5.13 Celeron300A x 2 110 x 4.5 ST Solaris7 for x86 gcc-2.7.2.3 koyama-
44 5.13 K6-III 450- Win95 for TOWNS - ナエヒ、カフ」アケ フオーVTOWNS
45 5.11 K6-III 400 100 x 4.5- Win98 MT-bin 、、、キ、ォ、 -
46 5.09 K6-2 500- Win95OSR2.1 - 、ミ、荀キ -
47 5.06 Celeron300A 129 x 4.5- ? ? 、、 -
48 5.06 PIII x 2 100 x 5 ST and off SSE FreeBSD3.2R gcc-2.7.2.1 -O3 - シオ-
49 5.03 K6-III 100 x 4.5 off MMX WinNT4.0SP5 - ROG-
50 4.98 Celeron300A x 2 110 x 4.5 ST FreeBSD3.2 gcc-2.7.2.1 koyama-
51 4.97 Celeron333 100 x 5- WinNT4.0SP5 - KatoSTOWNS・ォ。シ・ノナコワAT
52 4.74 Celeron300A 100 x 4.5- Win2000Pro - HMD OJI、ヒセ。、テ、ソ
53 4.63 Celeron300A 100 x 4.5- Win98 - HMDチエイ靂フ・筍シ・ノ
54 4.4 Celeron300A 100 x 4.5- Win98 - ナオホョ、シヤ -
55 4.28 K6-III 66 x 6- Win95 - キラ -
56 4.24 Celeron333 100 x 5- TownsOSV2.1L51 - KatoSTOWNS・ォ。シ・ノナコワAT
57 4.24 K6-2 115 x 3.5- Win98 - Hash -
58 4.18 PII 100 x 4- Win98 - 、ソ、。シ -
59 4.10 K6-III 450- TownsOSV2.1L51 - ナエヒ、カフ」アケ フオーVTOWNS
60 3.92 K6-2 66 x 6- WinNT4.0 SP5 ST-binary OJI3 -
61 3.84 K6-2 350 400- Linux? - 、ォ、ソ、荀゙ヒソ -
62 3.83 Celeron 400- Win98 - Yamao -
63 3.79 K6-2 66 x 6- WinNT4.0 SP5 MT-binary OJI3 -
64 3.61 K6-2 66 x 6- Win95OSR2.1 - 、隍キ、ヒ、遉 -
65 3.61 Celeron 66 x 6.5- Win98SE MT-bin 、、、キ、ォ、 -
66 3.59 PII 100 x 3.5- FreeBSD2.2.8R gcc-2.7.2.1 、ヲ、、 -
67 3.58 K6-III 70 x 5.5- TownsOSV2.1L51 - 、ウ、テ、ッ、 FM-TOWNS HBイ
68 3.55 Celeron266 100 x 4- Win98 - TER -
69 3.54 K6-III 400 60 x 6- Win95OSR2.1 - コエニ」 FMV-TOWNS GS
70 3.52 K6-2 115 x 3.5- Win98 High-C Hash -
71 3.48 Celeron333PPGA x 2 68.5 x 5 ST Plamo Linux 1.4.1 kern ST-bin 、隍テ、キ。チ-
72 2.88 K6-III 66 x 6- NetBSD/pc98 egcs-2.91.60 1998 クカナト PC-9821Xv20
73 2.81 K6-2 100 x 3- FreeBSD3.3-STABLE gcc ・ケ・ョ・ヲ・ -
74 2.75 PII 266- FreeBSD2.2.8R gcc version 2.7.2 ツフヌマノラ -
75 2.72 K6-III 100 x 4.5 off 3DN WinNT4.0SP5 - ROG-
76 2.60 MMXP5 x 2 66 x 3.5- WinNT4.0SP4 - 、皃ヘ、キ、ケ -
77 2.57 K6-III 100 x 4.5 off MMX & 3DN WinNT4.0SP5 - ROG-
78 2.53 K6-2 66 x 4.5- Debian /Linux potato gcc 2.95.2 199911 ROOK FMV-5150DPS
79 2.45 K6-2 300 70 x 4.5- Linux 2.0.33 gcc 2.7.2 -m486 - 、リ、、゚ FM-TOWNSIIHC
80 2.41 PII 233- Linux-2.2.10 - HIRO -
81 2.32 MMXP5 x 2 200- WinNT4.0SP5 - mmm -
82 1.90 PPro 66 x 3- WinNT4.0SP5 - 、ソ、。シ -
83 1.63 WinChip2 266 66 x 3.5- WinNTSP5 - I-walker PC-98(Xt13/K12)
84 1.57 WinChip2-240 66 x 4- Win98 - 」モ」ヘ」ノ」フ」ル PC-9821Cx2(イ)
85 1.52 K6 300- Win2000 - Yamao -
86 1.41 MMXP5 x 2 66 x 3.5 ST WinNT4.0SP4 - 、皃ヘ、キ、ケ-
87 1.38 K6 300- TurboLinux4.0 - Yamao -
88 1.34 Cyrix MII 95 x 4- Win2000Pro beta3 - 、ユ、ネ、゙、 ツフフワツフフワ、ヌ、ケ(オ)
89 1.32 K6 66 x 4- FreeBSD2.2.8R gcc version 2.7.2 ツフヌマノラ -
90 1.22 K6 300- BeOS R4.5.2 - Yamao -
91 1.21 MMXP5 66 x 3- Win98SP1 - 、「、テ、ラ、、ユ、ァ、ホ、 -
92 1.12 Cyrix MII-400 112 x 2.5 off MMX Win98SE- Kazz.-
93 1.11 Cyrix MII-400 112 x 2.5- Win98SE- Kazz. -
94 1.05 Cyrix MII 75 x 3.5- Win95OSR2.1 - Paper -
95 1.02 mp6-266 66 x 3- Win95OSR2.1 - 、隍キ、ヒ、遉 -
96 0.96 MMXPentium 66 x 2.5- Win9x - 、ヲ、、 -
97 0.80 P5 60 x 2.5- Win95OSR2.5 - 、ソ、。シ -
98 0.64 P5 60 x 2- Win95OSR2 - t.derringer FMV-5120
99 0.53 Cx6x86-PR200 75 x 2- FreeBSD3.2R - 、荀、鬢ョ -
100 0.48 P5 66 x 1.5- Linux-2.2.13 - HIRO -
101 0.277 Cx5x86 37.5 x 3- TownsOSV2.1L51 High-C Hash -
102 0.23 Cx5x86-120GP 20 x 2 x 3- Win95 - 、、、キ、ォ、 PC-9801DA+Melco EUB=HOM
103 0.21 5x86-P75 35 x 4- FreeBSD(98)2.28R rev0 gcc 2.7.2.1 、ユ、ハ、ン、 PC9821As
104 0.20 Cx5x86 100- MSDOS6.2+EXE3861.0m TOWNS-bin 、荀、鬢ョ PC-9821As
105 0.19 5x86P75 133- TownsOSV2.1L51 - Kyozy FM-TOWNSIIFresh
106 0.18 i486DX4 33 x 3- Win95OSR2.1 - 、隍キ、ヒ、遉 -
107 0.17 AM486DX4-75 33 x 3- Win95OSR2.1 - 、隍キ、ヒ、遉 -
108 0.12 i486DX4 25 x 3- Win95 - キラ ・・ヨ・・テ・ネ20
109 0.12 i486ODP-DX4 25 x 3- MSDOS5.0A-H+EXE386 1. TOWNS-bin 、ソ、。シPC-9821Ae
110 0.10 Cx486Dx2 33 x 2- Win95 - HMD EPSON VM466R
111 0.09 i486DX-ODP 40 27 x 2- TownsOSV2.1L20 - 、リ、、゚ FM-TOWNSIIHR(^^;
112 0.0195 IBM486BL3+i387DX 33- NetBSD/pc98(base1.41)gcc -mcpu=i386クカナト PC-H98model70
113 0.0037 486SX (no FPU) 25 x 2- Win95 - I-walkter EPSON PC-486SE
114 0.00213 486SX (no FPU) 25- Win95 - 、「、テ、ラ、、ユ、ァ、ホ、 EPSON PC-486SE

Please mail to shigeo
gogo239b/bench/makehtml.awk100644 23421 144 2317 7220537254 14724 0ustar shigeousers# # # BEGIN{ num=0 FS="," } { if($1 !~/^;/ && $1 !~/^$/){ psy[num]=$1 nopsy[num]=$2 CPU[num]=$3 clock[num]=$4 OS[num]=$5 compiler[num]=$6 name[num]=$7 etc[num]=$8 num++ } } END{ rank=0 for(i=0;i" CPU[i] }else if( CPU[i] ~/P[I5Pe]/ || CPU[i] ~/Cel/ || CPU[i] ~/486/ ){ CPU[i]="" CPU[i] }else if( CPU[i] ~/K6/ || CPU[i] ~/Ath/ || CPU[i] ~/5x/ ){ CPU[i]="" CPU[i] }else { CPU[i]="" CPU[i] } OS[i]=substr(OS[i],0,22) if( OS[i] ~/Win/ ){ OS[i]="" OS[i] }else if( OS[i] ~/Linux/ || OS[i] ~/BSD/ ){ OS[i]="" OS[i] }else { OS[i]="" OS[i] } if( etc[i] ~/ST/ || etc[i] ~/off/ ){ stat=etc[i] etc[i]="-" }else { stat="-" } printf("%d %s (%s) %s%s%s %s%s%s%s\n",rank,result,psy[i],CPU[i],clock[i],stat,OS[i],substr(compiler[i],0,18),name[i],etc[i]) } # if( i == top-1 )break; } } gogo239b/bench/makehtml.sh100644 23421 144 3570 7220537254 14556 0ustar shigeousers#!/bin/sh if [ $# -ge 1 ] then #all list top_max=999 echo 'gogo bench

ク盧螟ホ、ル、、チ、マフオツフ、ル、、チ
benchmark (all for ver. 2.22)

back


' setenv LANG date '+%b.%d.%Y' echo '
' else #top 30 top_max=30 echo 'gogo bench

ク盧螟ホ、ル、、チ、マフオツフ、ル、、チ
benchmark (top 30)

、ノ、、ノ、サイイテ、キ、ニ、ヘ
join us!

all list for ver. 2.26a is here

' echo '
last up date:' date '+%m/%d.%Y' echo '
' fi # gogo -test -nopsy for only ST echo '
' sort +1nr bench.txt |awk -f makehtml.awk -v mode="ST" -v top=`expr $top_max` echo '
gogo235 -test -nopsy -silent (for only ST)
rankresult (psy)CPUclockstatusOScompilernameetc
' echo '


' # gogo -test -nopsy for all echo '
' sort +1nr bench.txt|awk -f makehtml.awk -v top=`expr $top_max` echo '
gogo235 -test -nopsy -silent (for all)
rankresult (psy)CPUclockstatusOScompilernameetc
' #end echo '

Please mail to shigeo
' gogo239b/l3bs.c100644 23421 144 34542 7220537347 12376 0ustar shigeousers#ifdef USE_VBR #include "l3bs_old.c" #else /* * for new GOGO-no-coda (1999/09, 2000) * modified by shigeo * renewed by sakai (2000/02) * by shigeo (2000/11/10) */ extern const int *scalefac_long; extern const int *scalefac_short; #include #include #include #include "l3bs.h" /* the public interface */ #include "l3psy.h" #include "mdct.h" #include "loop.h" #include "huffman.h" #include "bitstrem.h" /* for putbits() */ static unsigned slen1_tab[16] = {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4}; static unsigned slen2_tab[16] = {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}; /* export to putbits.nas */ int BitCount = 0; int BitsRemaining = 0; void write_main_data_with_side_info(unsigned int val, unsigned int nbits); /* forward declarations */ static void store_side_info(III_side_info_t *si, int bitsPerFrame); static void Huffmancodebits(int *ix, gr_info *gi); typedef struct list_t{ int frameLength; int SILength; III_side_info_t l3_side; } list_t; static list_t queBuf[2]; static struct{ int frameSize; int frameLength; int SILength; int element; int stat; } que; /* * 00/11/10 by shigeo * store, getを繰り返すが、queバッファは最大2つ * このときの遷移状態は5個しかない * pushはいれるべき箱の番号 * popは出すべき箱の番号 * upは1個増えたときの状態番号 * downは1個減ったときの状態番号(-1はありえない) */ static struct{ int push, pop; int up, down; } queTbl[5] = { /* box0 box1 */ { 0, -1, 1,-1}, /* [ ][ ] */ { 1, 0, 2, 0}, /* [ * ][ ] */ {-1, 0,-1, 3}, /* [old][new] */ { 0, 1, 4, 0}, /* [ ][ * ] */ {-1, 1,-1, 1} /* [new][old] */ }; static list_t *get_side_info(void){ int idx; assert(que.element == 0); idx = queTbl[que.stat].pop; que.stat = queTbl[que.stat].down; que.element--; que.frameLength -= queBuf[idx].frameLength; que.SILength -= queBuf[idx].SILength; return &queBuf[idx]; } static void store_side_info(III_side_info_t *si, int bitsPerFrame){ static int bitsTbl[2][2] = {{104, 168}, {168, 288}}; int bits; int idx; assert(que.element == 2); /* max of que-buf is 2 */ bits = bitsTbl[gl.version][gl.stereo - 1]; idx = queTbl[que.stat].push; que.stat = queTbl[que.stat].up; queBuf[idx].frameLength = bitsPerFrame; queBuf[idx].SILength = bits; queBuf[idx].l3_side = *si; que.element++; que.frameLength += bitsPerFrame; que.SILength += bits; } /* WriteMainDataBits()はものすごい回数呼ばれるのでインライン展開 */ /* nbits != 0 であること。 */ /* static void WriteMainDataBits( unsigned val, unsigned nbits ); */ #define WriteMainDataBits(_val,_nbits) \ { \ unsigned val=(_val), nbits=(_nbits); \ assert( ( 0 < nbits) && (nbits <= 32) ); \ if( nbits > BitsRemaining ){ \ write_main_data_with_side_info(val, nbits); \ }else{ \ putbits( val, nbits ); \ BitCount += nbits; \ BitsRemaining -= nbits; \ } \ assert( BitCount <= que.frameSize ); \ assert( BitsRemaining >= 0 ); \ assert( (BitCount + BitsRemaining) == que.frameSize ); \ } #define WriteMainDataBits24(_val,_nbits) \ { \ unsigned val=(_val), nbits=(_nbits); \ assert( ( 0 < nbits) && (nbits <= 32) ); \ if( nbits > BitsRemaining ){ \ write_main_data_with_side_info(val, nbits); \ }else{ \ putbits24( val, nbits ); \ BitCount += nbits; \ BitsRemaining -= nbits; \ } \ assert( BitCount <= que.frameSize ); \ assert( BitsRemaining >= 0 ); \ assert( (BitCount + BitsRemaining) == que.frameSize ); \ } static void encodeMainData(int l3_enc[2][2][576], III_side_info_t *si, III_scalefac_t *scalefac) { int i, gr, ch, sfb, window; int *facl, (*facs)[3]; int tmp; if (gl.version == 1) { /* MPEG 1 */ for (gr = 0; gr < 2; gr++) { for (ch = 0; ch < gl.stereo; ch++) { gr_info *gi = &(si->gr[gr].ch[ch].tt); unsigned slen1 = slen1_tab[gi->scalefac_compress]; unsigned slen2 = slen2_tab[gi->scalefac_compress]; int *ix = &l3_enc[gr][ch][0]; facl = scalefac->l[gr][ch]; facs = scalefac->s[gr][ch]; if (gi->block_type == SHORT_TYPE) { if (slen1) { tmp = facs[0][0]; tmp <<= slen1; tmp |= facs[0][1]; tmp <<= slen1; tmp |= facs[0][2]; tmp <<= slen1; tmp |= facs[1][0]; tmp <<= slen1; tmp |= facs[1][1]; tmp <<= slen1; tmp |= facs[1][2]; WriteMainDataBits24(tmp, slen1 * 6); // max = 4*3*2 tmp = facs[2][0]; tmp <<= slen1; tmp |= facs[2][1]; tmp <<= slen1; tmp |= facs[2][2]; tmp <<= slen1; tmp |= facs[3][0]; tmp <<= slen1; tmp |= facs[3][1]; tmp <<= slen1; tmp |= facs[3][2]; WriteMainDataBits24(tmp, slen1 * 6); // max = 4*3*2 tmp = facs[4][0]; tmp <<= slen1; tmp |= facs[4][1]; tmp <<= slen1; tmp |= facs[4][2]; tmp <<= slen1; tmp |= facs[5][0]; tmp <<= slen1; tmp |= facs[5][1]; tmp <<= slen1; tmp |= facs[5][2]; WriteMainDataBits24(tmp, slen1 * 6); // max = 4*3*2 } if (slen2) { tmp = facs[ 6][0]; tmp <<= slen2; tmp |= facs[ 6][1]; tmp <<= slen2; tmp |= facs[ 6][2]; tmp <<= slen2; tmp |= facs[ 7][0]; tmp <<= slen2; tmp |= facs[ 7][1]; tmp <<= slen2; tmp |= facs[ 7][2]; tmp <<= slen2; tmp |= facs[ 8][0]; tmp <<= slen2; tmp |= facs[ 8][1]; WriteMainDataBits24(tmp, slen2 * 8); // max(slen2)=3 tmp = facs[ 8][2]; tmp <<= slen2; tmp |= facs[ 9][0]; tmp <<= slen2; tmp |= facs[ 9][1]; tmp <<= slen2; tmp |= facs[ 9][2]; tmp <<= slen2; tmp |= facs[10][0]; tmp <<= slen2; tmp |= facs[10][1]; tmp <<= slen2; tmp |= facs[10][2]; tmp <<= slen2; tmp |= facs[11][0]; tmp <<= slen2; tmp |= facs[11][1]; tmp <<= slen2; tmp |= facs[11][2]; WriteMainDataBits(tmp, slen2 * 10); // max(slen2)=3 } } else { if (slen1) { tmp = 0; /* max = 4*6 */ for (sfb = 0; sfb < 6; sfb++) { tmp = facl[sfb] | (tmp<gr[gr].ch[ch].tt); int *ix = &l3_enc[gr][ch][0]; int sfb_partition; facl = scalefac->l[gr][ch]; facs = scalefac->s[gr][ch]; if (gi->block_type == SHORT_TYPE) { { for (sfb = 0, sfb_partition = 0; sfb_partition < 4; sfb_partition++) { int sfbs = gi->sfbTblSub[sfb_partition] / 3; int slen = gi->slen[sfb_partition]; if (slen){ for (i = 0; i < sfbs; i++, sfb++){ for (window = 0; window < 3; window++){ WriteMainDataBits(facs[sfb][window], slen); } } } } } } else { for (sfb = 0, sfb_partition = 0; sfb_partition < 4; sfb_partition++) { int sfbs = gi->sfbTblSub[sfb_partition]; int slen = gi->slen[sfb_partition]; if (slen){ for (i = 0; i < sfbs; i++, sfb++){ WriteMainDataBits(facl[sfb], slen); } } } } Huffmancodebits(ix, gi); } /* for ch */ } } /* end of encodeMainData */ /* 153clk -> 96clk by shigeo 00/02/07 */ /* absolute of v, w, x, y <=1 always */ static int L3_huffman_coder_count1(struct huffcodetab *h, int *ix, int count) { int huffbits, len, p; int ret = 0; while( count ){ huffbits = len = p = 0; if (ix[0]) { if (ix[0] < 0) huffbits++; p = 8; len++; } if (ix[1]) { huffbits <<= 1; if (ix[1] < 0) huffbits++; p |= 4; len++; } if (ix[2]) { huffbits <<= 1; if (ix[2] < 0) huffbits++; p |= 2; len++; } if (ix[3]) { huffbits <<= 1; if (ix[3] < 0) huffbits++; p |= 1; len++; } huffbits += h->table[p] << len; /* max of len = 19 + 4 */ len += h->hlen[p]; if( len ) WriteMainDataBits24(huffbits, len); ret += len; ix += 4; count--; } return ret; } static void Huffmancodebits(int *ix, gr_info * gi){ int region1Start; int region2Start; int bigvalues; int i, x, y, bits, stuffingBits; struct huffcodetab *h; int written = 0; /* defined in putbits.nas */ extern int HuffmanCodePutBits(int table_select, int x,int y); /* 1: Write the bigvalues */ bigvalues = gi->big_values * 2; if(bigvalues){ if(gi->block_type == SHORT_TYPE){ int sfb, window, line, start, end; I192_3 *ix_s; ix_s = (I192_3 *) ix; region1Start = 12; region2Start = 576; for (sfb = 0; sfb < 13; sfb++) { unsigned tableindex; start = scalefac_short[sfb]; end = scalefac_short[sfb + 1]; if (start < region1Start) tableindex = gi->table_select[0]; else tableindex = gi->table_select[1]; if (tableindex) { for (window = 0; window < 3; window++) { for (line = start; line < end; line += 2) { x = (*ix_s)[line][window]; y = (*ix_s)[line + 1][window]; bits = HuffmanCodePutBits(tableindex, x, y); written += bits; } } } } } else { /* Long blocks */ unsigned scalefac_index; unsigned tableindex; scalefac_index = gi->region0_count + 1; region1Start = scalefac_long[scalefac_index]; scalefac_index += gi->region1_count + 1; region2Start = scalefac_long[scalefac_index]; if(region1Start > bigvalues) region1Start = bigvalues; /* get table pointer */ tableindex = gi->table_select[0]; if(tableindex){ for(i = 0; i < region1Start; i += 2){ x = ix[i]; y = ix[i + 1]; bits = HuffmanCodePutBits(tableindex, x, y); written += bits; } } if(region2Start > bigvalues) region2Start = bigvalues; /* get table pointer */ tableindex = gi->table_select[1]; if (tableindex) { for (i = region1Start; i < region2Start; i += 2) { /* get huffman code */ x = ix[i]; y = ix[i + 1]; bits = HuffmanCodePutBits(tableindex, x, y); written += bits; } } /* get table pointer */ tableindex = gi->table_select[2]; if (tableindex) { for (i = region2Start; i < bigvalues; i += 2) { /* get huffman code */ x = ix[i]; y = ix[i + 1]; bits = HuffmanCodePutBits(tableindex, x, y); written += bits; } } } } h = &ht[gi->count1table_select + 32]; written += L3_huffman_coder_count1(h, &ix[bigvalues], gi->count1); stuffingBits = gi->part2_3_length - gi->part2_length - written; if(stuffingBits){ int words = stuffingBits >> 5; int remain = stuffingBits & 31; while(words--) WriteMainDataBits(~0, 32); if(remain) WriteMainDataBits(~0, remain); written += stuffingBits; } } void InitFormatBitStream(void){ BitCount = 0; que.frameSize = 0; BitsRemaining = 0; que.element = 0; que.frameLength = 0; que.SILength = 0; que.stat = 0; } void write_main_data_with_side_info(unsigned int val, unsigned int nbits){ int gr, ch, region, window; list_t *l; III_side_info_t *si; int tmp; l = get_side_info(); si = &l->l3_side; if(BitsRemaining){ unsigned extra = val >> (nbits - BitsRemaining); nbits -= BitsRemaining; putbits( extra, BitsRemaining ); } /* write header */ tmp = (0xFFF<<4) | (gl.version<<3) | (1<<1) | 1; putbits24(tmp, 16); tmp = (si->rate_idx<<12) | (gl.freq_idx<<10) | (si->padding<<9) | (gl.extension<<8) | (gl.mode<<6) | (si->mode_ext<<4) | (0 /* copyright */<<3) | (1 /* gl.original */<<2) | (gl.emphasis); putbits24(tmp, 16); if (gl.version == 1) { /* MPEG1 */ /* write frame info */ putbits24(si->main_data_begin, 9); if (gl.stereo == 2) { putbits24(0, 3 + 8); } else { putbits24(0, 5 + 4); } /* write spectrum info */ for (gr = 0; gr < 2; gr++) { for (ch = 0; ch < gl.stereo; ch++) { gr_info *gi = &(si->gr[gr].ch[ch].tt); putbits24(gi->part2_3_length, 12); tmp = (gi->big_values<<13) | (gi->global_gain<<5) | (gi->scalefac_compress<<1) | gi->window_switching_flag; putbits24(tmp, 9 + 8 + 4 + 1); if (gi->window_switching_flag) { tmp = (gi->block_type<<20) | (0<<19) | (gi->table_select[0]<<14) | (gi->table_select[1]<<9); putbits24(tmp,22); } else { assert(gi->block_type == 0); tmp = (gi->table_select[0]<<17) | (gi->table_select[1]<<12) | (gi->table_select[2]<<7) | (gi->region0_count<<3) | gi->region1_count; putbits24(tmp, 22); } tmp = (gi->preflag<<2) | (gi->scalefac_scale<<1) | gi->count1table_select; putbits24(tmp, 3); } } } else { /* MPEG2 */ /* write frame info */ putbits24(si->main_data_begin, 8); if (gl.stereo == 2) { putbits24(0, 2); } else { putbits24(0, 1); } /* write spectrum info */ gr = 0; for (ch = 0; ch < gl.stereo; ch++) { gr_info *gi = &(si->gr[gr].ch[ch].tt); putbits24(gi->part2_3_length, 12); putbits24(gi->big_values, 9); putbits24(gi->global_gain, 8); putbits24(gi->scalefac_compress, 9); putbits24(gi->window_switching_flag, 1); if (gi->window_switching_flag) { putbits24(gi->block_type, 2); putbits24(0, 1); for (region = 0; region < 2; region++) putbits24(gi->table_select[region], 5); for (window = 0; window < 3; window++) { putbits24(0, 3); } } else { for (region = 0; region < 3; region++) putbits24(gi->table_select[region], 5); putbits24(gi->region0_count, 4); putbits24(gi->region1_count, 3); } putbits24(gi->scalefac_scale, 1); putbits24(gi->count1table_select, 1); } } que.frameSize = l->frameLength; BitCount = l->SILength; BitsRemaining = que.frameSize - BitCount; if( nbits ){ putbits( val, nbits ); BitCount += nbits; BitsRemaining -= nbits; } } void III_format_bitstream(int bitsPerFrame, int l3_enc[2][2][576], III_side_info_t *l3_side, III_scalefac_t *scalefac){ store_side_info(l3_side, bitsPerFrame); encodeMainData(l3_enc, l3_side, scalefac); if(l3_side->resvDrain){ int words, remain; words = l3_side->resvDrain >> 5; remain = l3_side->resvDrain & 31; while(words--) WriteMainDataBits(0, 32); if(remain) WriteMainDataBits(0, remain); } l3_side->main_data_begin = ((BitsRemaining & -8) + (que.frameLength & -8) - (que.SILength & -8)) >> 3; } void III_FlushBitstream(void){ if(que.element){ int remain = que.frameLength - que.SILength; int words = remain >> 5; while(words--) WriteMainDataBits(0, 32); remain &= 31; if(remain) WriteMainDataBits(0, remain); } BitCount = 0; que.frameSize = 0; BitsRemaining = 0; } #endif /* USE_VBR */ gogo239b/musenc.c100644 23421 144 237747 7220537347 13061 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * Copyright (C) 1999, 2000 PEN@MarineCat, shigeo, sakai, Noisyu */ /* define if you want to encode with lowpass filter */ #ifdef USE_VBR #define PENOUTFREQ #define PENOUTBTARE #define PENMS #endif /* * 1999/10/02 POSIX thread 対応 * 1999/10/03 MC_EMPHASIS追加 * 1999/10/13 musenc.cをmusenc.cからインクルードしてMT用とST用の関数を定義 * これにより -spc2 でMTかSTか選択できる * 1999/10/14 -cpu で CPU 数を指定できるようにした。 * nCPU <= 1 の時はシングルスレッドgogo * * 1999/11/09 thread priority down (BeOS) * 2000/03/22 get_audio()周りの改造 by K.SAKAI * 2000/03/23 MPGE_processTrack()新設 by K.SAKAI * 2000/04/10 Windows MultiThread高速化開始 (PIII450x2 x35) by PEN * 2000/04/14 Windows MultiThread高速化中 (PIII450x2 x42) by PEN * 2000/04/17 SMP最適化のための布石 by K.SAKAI * */ #if defined( WIN32 ) && !defined( MUSENC_PASS2 ) #pragma message("--[ Detect Configure ]----------------------------------") #ifdef USE_VBR #pragma message("Using VBR code") #else #pragma message("NotUse VBR code") #endif #ifdef USE_E3DN #pragma message("Using Enhanced3DNow code") #else #pragma message("NotUse Enhanced3DNow code") #endif #ifdef USE_WINTHREAD #pragma message("Using Multithread Kernel") #else #pragma message("NotUse Multithread Kernel") #endif #pragma message("Including a part of LAME 3.55") #if defined(GOGO_DLL_EXPORTS) && defined(USE_REGISTRY) #pragma message("Using Registry Database") #else #pragma message("NotUse Registry Database") #endif #if defined(RAW_INPUT) #pragma message("Using Raw-PCM Input") #else #pragma message("NotUse Raw-PCM Input") #endif #if defined(BENCH_ONLY) #pragma message("making gogo.dll for only benchmark!") #endif #pragma message("--------------------------------------------------------") #endif #if defined(USE_PTHREAD) || defined(USE_WINTHREAD) || defined(USE_BTHREAD) || defined(USE_OS2THREAD) #define MT_ENCODER #undef ST_ENCODER #else #undef MT_ENCODER #define ST_ENCODER #endif #if !defined(MUSENC_PASS2) #define _MAIN_C /* defined in only this source */ #define ALIGN(x,y) ((int)(x+(y-1))&-y) #ifdef GOGO_DLL_EXPORTS #include "stdafx.h" #endif /* for formal release(公開する時忘れないために) */ #if defined(_WINDOWS) && !defined(BENCH_ONLY) #if !defined ( USE_VBR ) || !defined ( USE_E3DN ) # error "define USE_VBR and USE_E3DN" #endif #endif /* longjmp()を使う/使わないための設定 */ #ifdef WIN32 #ifdef _WINDOWS #define USE_LONGJMP /* GUI */ #else #define DONT_USE_LONGJMP #endif #else /* WIN32 */ #define DONT_USE_LONGJMP /* console */ #endif /* WIN32 */ #include #include #include #include #include #include #include #include #include /* for LONG_MAX */ #if defined(USE_PTHREAD) #if defined(__FreeBSD__) #include #endif #include #include #endif #ifdef WIN32 #include #include #include #endif #ifdef USE_OS2THREAD #define INCL_DOS #include #include #endif #ifdef USE_BTHREAD #include #endif #include "common.h" #include "global.h" #include "musenc.h" #include "subband.h" #include "l3bs.h" #include "readsmpl.h" #include "bitstrem.h" #include "l3psy.h" #include "mdct.h" #include "loop.h" #include "vbrtag.h" #include "haveunit.h" #include "message.h" #if defined( WIN32 ) | defined ( __HIGHC__ ) #include #endif #ifdef __FreeBSD__ #include #endif #ifdef ABORTFP #include #endif /* * 互換性のため残す(defined in common.h) */ int bForceMono = FALSE; int force_ms = FALSE; int sfb21 = 1; int VBR = 0; int VBR_q = -1;/* -1: no VBR */ int VBR_min_rate_idx = -1; /* 64kbs */ int VBR_max_rate_idx = -1; /* 256kbs */ unsigned long read_limitsize = MC_MAXFLEN_IGNORE; int fast_mode = 0; int g_bWriteVbrTag = 1; int bBitConvert = FALSE; /* 8bit->16bit */ int bSwapByte = FALSE; /* low, high bit convert */ int bTownsSND = FALSE; /* SND for TownsOS */ int bOutputVBR_userfunc = TRUE; /* Userfnc出力時 XingVBRを利用する */ struct MCP_INPDEV_USERFUNC mc_userfunc; // extern/ユーザー関数設定 MPGE_USERFUNC mc_userStore; #define ISUSERFUNCIN() (mc_userfunc.pUserFunc != MPGE_NULL_FUNC ) static FILE *musicin; static int firstcall; int debug = 0; static III_side_info_t l3_side; static int totalframes; static jmp_buf _longjmp_ptr; /* goto longjmp */ #if defined(USE_WINTHREAD) || defined(USE_OS2THREAD) static int boot_thread = 0; /* スレッド起動はブート後一回のみとする */ static MERET error_notify = ME_NOERR; /* エラー発生時停止させるため */ static int nThreadPrio; #endif #ifdef USE_VBR static float VBR_pe_sum = 0; #endif #ifdef RAW_INPUT static int nStartOffset = -1; static int is8bitPCM = FALSE; static int isMonoPCM = FALSE; #endif /* RAW_INPUT */ static int outputFormat = MC_OUTPUT_NORMAL; static char *pRiffInfos = NULL; static int riffInfosLen = 0; static int outputOffset = 0; static int verifyFlag = 0; static int outstream_nonbufferd = 0; static float msstereo_threshold, msstereo_ratio; static char outputDir[MAX_FILE_LEN]; // RIFF の先頭のチャンクヘッダ struct CK_RIFF { long chunk; /* "RIFF" */ long size; /* sizeof "RIFF" */ long form; /* "WAVE" or etc */ } ; // RIFF/WAVE の fmt チャンク struct CK_FMT { long chunk; /* "fmt " */ long size; /* 30 */ short formatID; /* 0x55 = WAVE_FORMAT_MPEGLAYER3 */ short num_of_channel; /* 1 or 2 */ long srate; /* 44100 etc. */ long avg_bytes_per_sec; /* 平均ビットレート(バイト/秒) */ short block_size; /* 1 */ short bits_per_sample; /* 0 */ short cbSize; /* 12 */ short wID; /* 1 = MPEGLAYER3_ID_MPEG */ long fdwFlags; /* 2 */ short nBlockSize; /* フレームのバイト数 */ short nFramesPerBlock; /* 1 */ short nCodecDelay; /* ?? */ } ; // RIFF/WAVE の fact チャンク struct CK_FACT { long chunk; /* "fact" */ long size; /* 4 */ long num_of_sample; /* サンプル数 */ } ; // RIFF の data チャンクのヘッダ struct CK_DATA { long chunk; /* "data" */ long size; /* sizeof "DATA" */ } ; // RIFF/WAVE の mp3 本体より前の部分 struct CK_WAVE { struct CK_RIFF riff; struct CK_FMT fmt; struct CK_FACT fact; struct CK_DATA data; } ; // RIFF/RMP の mp3 本体より前の部分 struct CK_RMP { struct CK_RIFF riff; struct CK_DATA data; }; // RIFF の LIST チャンクのヘッダ struct CK_LIST { long chunk; /* "LIST" */ long size; /* sizeof "LIST" */ long form; /* "INFO" etc */ } ; // 各チャンク構造体の隙間無しのバイト数 #define SizeOfCkRiff (12) #define SizeOfCkFmt (38) #define SizeOfCkFact (12) #define SizeOfCkData (8) #define SizeOfCkWave (SizeOfCkRiff+SizeOfCkFmt+SizeOfCkFact+SizeOfCkData) #define SizeOfCkRmp (SizeOfCkRiff+SizeOfCkData) #define SizeOfCkList (12) float lowpass1, lowpass2; #define tprintf if( 0 ) printf /* change suffix of src to mp3 */ /* suppose sizeof(dest)>=sizeof(src) */ static int changeSuf( char *dest, const char *src, const int max_len ) { char *p; int i, len; strcpy( dest, src ); len = strlen( dest ); p = &dest[ len - 1 ]; len = Min( len, 4 ); /* if the len of suffix < 4 then replace it with "mp3" */ for( i = 0; i< len; i++,p-- ){ if( *p == '\\' || *p == '/' )break; /* no suffix */ if( *p == '.' ){ *p = '\0'; break; } } if( strlen( dest ) + 4 >= max_len ) return ERR; strcat( dest, ".mp3" ); return NOERR; } /* destからファイル名のみを取り出しpathの後につけてdestに出力 */ #ifdef __unix__ #define SEP '/' #else #define SEP '\\' #endif static int changePath( char *dest, const char *path, const int max_len ) { char tmp[ MAX_FILE_LEN ]; int len, i; char *p; strcpy( tmp, path ); len = strlen( tmp ); if( tmp[len - 1] != SEP ){ tmp[len] = SEP; tmp[len + 1] = NUL; } len = strlen( dest ); #ifndef JAPANESE_SPC for( i = len - 1; i >= 0 && dest[i] != SEP; i-- ) ; /* void */ p = &dest[i]; p++; #else #define isKANJI1(x) ((unsigned char)((x^0x20)-0xA1)<=0x3B) p = dest; for( i = 0; i < len; i++ ){ if( isKANJI1( dest[i] ) ){ i++; continue; } if( dest[i] == SEP ){ p = &dest[i]; } } if( *p == SEP ) p++; #undef isKANJI1 #endif /* JAPANESE_SPC */ if( strlen( tmp ) + strlen( dest ) >= max_len ) return ERR; strcat( tmp, p ); strcpy( dest, tmp ); return NOERR; } #undef SEP /////////////////////////////////////////////////////////////////////////// static char szInFile[ MAX_FILE_LEN ]; static char szOutFile[ MAX_FILE_LEN ]; static int bInputStdio; static int bOutputStdio; static int useUNIT; #if defined(MT_ENCODER) static int nCPU; #define ISMULTI() (nCPU > 1) #endif /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// #if defined(BeOS) || defined( WIN32 ) static int intEncodeThreadPriority = 10; static int intReadThreadPriority = 0; #endif /////////////////////////////////////////////////////////////////////////// #define EXTRADELAY 56 #define bitsPerSlot 8 /* エラーメッセージ表示 */ static void err_puts(char *mes){ #ifndef _WINDOWS fprintf(stderr,"%s\n",mes); #endif } /* * SSE非サポートOSでの処理 */ #if defined( __unix__ ) | defined( WIN32 ) | defined( __os2__ ) | defined( __dos__ ) #include void SSE_not_support(int sig) { if(debug)err_puts( getMsg( MSG_NOT_SUPPORT_SSE ) ); signal( SIGILL, SIG_DFL ); // or SIG_IGN longjmp( _longjmp_ptr, 1); } #endif #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) #if defined(USE_PTHREAD) /* 生成可能なスレッドの最大数を設定。 */ #define NTHREADS 16 /* とりあえず16までにしておく */ static pthread_mutex_t mutex_mfbuf = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t mutex_l3_sb_sample = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t mutex_l3_side = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t mutex_fmt_bitstm = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t mutex_frames = PTHREAD_MUTEX_INITIALIZER; typedef struct { pthread_t ptid; int tid; /* Thread ID */ int *frameNum; } encodeframe_arg_t; static void *encodeframethread(void *); #endif #if defined(USE_WINTHREAD) /* 生成可能なスレッドの最大数を設定。 */ #define NTHREADS 4 /* 現状では4つでOK。調整要 */ static char __frmBuffer[ 2 * 1152 * sizeof(short) + 16]; /* 初期化不要 */ static unsigned __stdcall encodeframethread(void *); static CRITICAL_SECTION mutex_mfbuf; static CRITICAL_SECTION mutex_l3_sb_sample; static CRITICAL_SECTION mutex_l3_side; static CRITICAL_SECTION mutex_frmBuffer ; static CRITICAL_SECTION mutex_fmt_bitstm ; static HANDLE cond_frmBuffer; typedef struct { short *buf; int tid; /* Thread ID */ unsigned threadaddr; unsigned long hThread; /* Thread Handle */ char firstthreadin; char finthread; volatile char readytoencode; /* Ready To Encode */ CRITICAL_SECTION section; HANDLE hEnterFrame; HANDLE hLeaveFrame; HANDLE hWaitEncoding; HANDLE hExistThread; } encodeframe_arg_t; encodeframe_arg_t encodeframe_arg[NTHREADS]; #endif #if defined(USE_OS2THREAD) /* 生成可能なスレッドの最大数を設定。 */ #define NTHREADS 3 /* 現状では3つでOK。調整要 wassat do anyway ?? */ static char __frmBuffer[ 2 * 1152 * sizeof(short) + 16]; /* 初期化不要 */ static int _System encodeframe(void *); static HMTX mutex_mfbuf; static HMTX mutex_l3_sb_sample; static HMTX mutex_l3_side; static HMTX mutex_frmBuffer ; static HMTX mutex_fmt_bitstm ; static HEV cond_frmBuffer; typedef struct { short (*buf)[1152]; int tid; /* Thread ID */ unsigned threadaddr; unsigned long hThread; /* Thread Handle */ BOOL finthread; HMTX section; HEV hEnterFrame; HEV hLeaveFrame; HEV hWaitEncoding; HEV hExistThread; } encodeframe_arg_t; encodeframe_arg_t encodeframe_arg[NTHREADS]; #endif /* USE_OS2THREAD */ MERET EXPORT MPGE_initializeWork() { int statUNIT; #if defined(GOGO_DLL_EXPORTS) && defined(USE_REGISTRY) static BOOL bRegistered = FALSE; #define ParentKey HKEY_CURRENT_USER //親キー #define SubKey "Software\\MarineCat\\GOGO_DLL" //今回作るサブキー if( !bRegistered ){ HKEY hKey; DWORD dwPosition; LONG lResult; char szPathName[ _MAX_PATH ]; extern HINSTANCE hDLLInstance; GetModuleFileName(hDLLInstance, szPathName, sizeof szPathName); if( RegCreateKeyEx( ParentKey, SubKey, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwPosition) == ERROR_SUCCESS ){ // for VC/BC/Delphi etc. lResult = RegSetValueEx(hKey, "INSTPATH", 0, REG_SZ, (CONST BYTE *)szPathName, lstrlen(szPathName)); // for VB lResult = RegSetValueEx(hKey, "INSTPATH_VB", 0, REG_SZ, (CONST BYTE *)szPathName, lstrlen(szPathName)); RegCloseKey(hKey); } bRegistered = TRUE; } #endif memset(&gl, 0, sizeof(gl) ); gl.mode = -1; gl.inp_freqHz = -1; gl.enc_freqHz = -1; gl.rate_kbps = -1; gl.freq_idx = 0; /* enc_freqHz から決定される */ l3_side.rate_idx = 0; /* rate_kbps から決定される */ sfb21 = -1; VBR = 0; VBR_q = -1; VBR_min_rate_idx = -1; /* 64kbs */ VBR_max_rate_idx = -1; /* 256kbs */ read_limitsize = MC_MAXFLEN_IGNORE; #if defined( WIN32 ) intEncodeThreadPriority = -1; intReadThreadPriority = -1; #endif msstereo_threshold = 0.70; msstereo_ratio = 0; #ifdef USE_VBR VBR_pe_sum = 0; #endif fast_mode = 0; g_bWriteVbrTag = 1; firstcall = 1; bBitConvert = FALSE; /* 8bit->16bit */ bSwapByte = FALSE; bTownsSND = FALSE; #ifdef RAW_INPUT nStartOffset = -1; /* -1でないときはRAW-PCMモード */ is8bitPCM = FALSE; isMonoPCM = FALSE; #endif /* RAW_INPUT */ szInFile[ 0 ] = '\0'; szOutFile[ 0 ] = '\0'; bInputStdio = FALSE; bOutputStdio = FALSE; bForceMono = FALSE; if( pid3tag ){ mem_free( (void **)&pid3tag ); } nid3taglen = 0; pid3tag = NULL; memset( &mc_userfunc, 0, sizeof mc_userfunc ); memset( &l3_side, 0, sizeof( l3_side ) ); mc_userStore = MPGE_NULL_FUNC; outputFormat = MC_OUTPUT_NORMAL; riffInfosLen = 0; outputOffset = 0; verifyFlag = 0; outstream_nonbufferd = 0; *outputDir = NUL; if( pRiffInfos ){ mem_free( (void**)&pRiffInfos ); } #ifdef PENOUTFREQ // ローパスフィルタの設定 lowpass1 = lowpass2 = -1; #endif #ifdef __FreeBSD__ { fp_except_t mask; mask=fpgetmask(); /* printf("FreeBSD mask is 0x%x\n",mask); */ } #endif #ifdef ABORTFP { unsigned int mask; _FPU_GETCW(mask); /* Set the Linux mask to the FreeBSD default mask */ mask &= ~( _FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM ); _FPU_SETCW(mask); } #endif /* 3D Now!等の搭載確認 */ statUNIT = haveUNIT(); if( !( statUNIT & tFPU ) ){ return ME_NOFPU; } useUNIT = statUNIT; #ifdef WIN32 #if 1 /* for other C compilers on Windows */ maskFPU_exception(); #else { /* DelphiのFPU例外処理を回避する */ unsigned int mask; _asm{ fnstcw word ptr [mask] and word ptr [mask], 0xfff2 fldcw word ptr [mask] }; } #endif #endif #if defined(USE_PTHREAD) /* プロセッサ数の確認 */ #if defined(__linux__) { FILE *cpuinfo; char buffer[256]; nCPU = 0; useUNIT &= ~tMULTI; if((cpuinfo = fopen("/proc/cpuinfo", "r")) != NULL){ while(fgets(buffer, sizeof buffer, cpuinfo) != NULL){ if(memcmp(buffer, "processor", (sizeof "processor") - 1) == 0){ nCPU++; } } fclose(cpuinfo); } /* CPU number detection for Linux emulator on FreeBSD */ else if((cpuinfo = popen("/sbin/sysctl hw.ncpu", "r")) != NULL){ if(fgets(buffer, sizeof buffer, cpuinfo) != NULL){ int cpu; if(sscanf(buffer, "hw.ncpu: %d", &cpu) == 1){ nCPU = cpu; } } fclose(cpuinfo); } } #endif #if defined(__FreeBSD__) { int sysname[] = {CTL_HW, HW_NCPU}, len, cpu; len = sizeof(int); if(sysctl(sysname, 2, &cpu, &len, NULL, 0) == 0){ if(len == sizeof(int)) nCPU = cpu; } } #endif if( nCPU >= NTHREADS ) nCPU = NTHREADS; if(nCPU > 1){ fprintf( stderr, "%s %d\n", getMsg( MSG_NUM_OF_CPU ), nCPU ); useUNIT |= tMULTI; } #elif defined(USE_BTHREAD) /* プロセッサ数の取得 */ { system_info udtsystem_info; nCPU = 1; useUNIT &= ~tMULTI; get_system_info(&udtsystem_info); if((nCPU = udtsystem_info.cpu_count) > 1){ fprintf( stderr, "%s %d\n", getMsg( MSG_NUM_OF_CPU ), nCPU ); useUNIT |= tMULTI; } } #elif defined(USE_WINTHREAD) /* プロセッサ数の取得 */ { SYSTEM_INFO cpuinfo; GetSystemInfo( &cpuinfo ); if((nCPU = cpuinfo.dwNumberOfProcessors) > 1){ tprintf( "%s %d\n", getMsg( MSG_NUM_OF_CPU ), nCPU ); useUNIT |= tMULTI; } /* 最大8CPU */ if( nCPU >= NTHREADS ) nCPU = NTHREADS; } if( !boot_thread ){ int i; boot_thread = !0; // boot_thread <- true memset( &encodeframe_arg, 0, sizeof( encodeframe_arg ) ); InitializeCriticalSection( &mutex_mfbuf ); InitializeCriticalSection( &mutex_l3_sb_sample ); InitializeCriticalSection( &mutex_l3_side ); InitializeCriticalSection( &mutex_frmBuffer ); InitializeCriticalSection( &mutex_fmt_bitstm ); for(i = 0; i < NTHREADS; i++){ encodeframe_arg[i].tid = i; encodeframe_arg[i].buf = (short *)ALIGN(__frmBuffer,16); encodeframe_arg[i].finthread = FALSE; encodeframe_arg[i].readytoencode = FALSE; InitializeCriticalSection( &encodeframe_arg[i].section ); encodeframe_arg[i].hEnterFrame = CreateEvent( NULL, TRUE, FALSE, NULL ); assert( encodeframe_arg[i].hEnterFrame != NULL ); encodeframe_arg[i].hLeaveFrame = CreateEvent( NULL, TRUE, FALSE, NULL ); assert( encodeframe_arg[i].hLeaveFrame != NULL ); encodeframe_arg[i].hWaitEncoding = CreateEvent( NULL, TRUE, FALSE, NULL ); assert( encodeframe_arg[i].hWaitEncoding != NULL ); if( (encodeframe_arg[i].hThread = _beginthreadex( NULL, // security 0, // stksize encodeframethread, (void *)&encodeframe_arg[i] , 0, &encodeframe_arg[i].threadaddr ) ) == 0 ){ return ME_CANNOT_CREATE_THREAD; } } } { int i; for(i = 0; i < NTHREADS; i++) encodeframe_arg[i].firstthreadin = TRUE; for(i = 0; i < NTHREADS; i++){ WaitForSingleObject( encodeframe_arg[i].hWaitEncoding, INFINITE ); } } error_notify = ME_NOERR; #endif /* USE_WINTHREAD */ #if defined(USE_OS2THREAD) { #define QSV_NUMPROCESSORS 26 APIRET apiretRc=0; apiretRc=DosQuerySysInfo(QSV_NUMPROCESSORS, QSV_NUMPROCESSORS, &nCPU, sizeof(nCPU)); if(apiretRc!=0) nCPU=1; if(nCPU > 1){ fprintf( stderr, "%s %d\n", getMsg( MSG_NUM_OF_CPU ), nCPU ); useUNIT |= tMULTI; } } if(!boot_thread){ int i; boot_thread = !0; // boot_thread <- true memset( &encodeframe_arg, 0, sizeof( encodeframe_arg ) ); DosCreateMutexSem(NULL,&mutex_mfbuf,0,FALSE); DosCreateMutexSem(NULL,&mutex_l3_sb_sample,0,FALSE); DosCreateMutexSem(NULL,&mutex_l3_side,0,FALSE); DosCreateMutexSem(NULL,&mutex_frmBuffer,0,FALSE); DosCreateMutexSem(NULL,&mutex_fmt_bitstm,0,FALSE); for(i = 0; i < NTHREADS; i++){ encodeframe_arg[i].tid = i; encodeframe_arg[i].buf = (short *)ALIGN(__frmBuffer,16); encodeframe_arg[i].finthread = FALSE; DosCreateMutexSem(NULL,&encodeframe_arg[i].section,0,FALSE); DosCreateEventSem(NULL,&encodeframe_arg[i].hEnterFrame,0,FALSE); DosCreateEventSem(NULL,&encodeframe_arg[i].hLeaveFrame,0,FALSE); DosCreateEventSem(NULL,&encodeframe_arg[i].hWaitEncoding,0,FALSE); if( (encodeframe_arg[i].hThread = _beginthread( (void (*)(void *))encodeframe, 0, 65536, &encodeframe_arg[i])) == -1 ){ return ME_CANNOT_CREATE_THREAD; } } } error_notify = ME_NOERR; #endif /* USE_OS2THREAD */ return ME_NOERR; } #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) //enum { FALSE, TRUE }; MERET EXPORT #ifndef __os2__ MPGE_setConfigure(MPARAM mode, UPARAM dwPara1, UPARAM dwPara2 ) #else MPGE_setConfigure(MUPARAM mode, UPARAM dwPara1, UPARAM dwPara2 ) #endif { // エンコードが開始すると設定を呼び出せない if( musicin ) return ME_PARAMERROR; switch( mode ){ case MC_INPUTFILE: if( dwPara1 == MC_INPDEV_FILE ){ bInputStdio = FALSE; mc_userfunc.pUserFunc = MPGE_NULL_FUNC; if( strlen( (char *)dwPara2 ) >= MAX_FILE_LEN ) return ME_PARAMERROR; strcpy( szInFile, (char *)dwPara2 ); return ME_NOERR; } else if( dwPara1 == MC_INPDEV_STDIO ){ bInputStdio = TRUE; mc_userfunc.pUserFunc = MPGE_NULL_FUNC; return ME_NOERR; } else if( dwPara1 == MC_INPDEV_USERFUNC ){ bInputStdio = FALSE; mc_userfunc = *((struct MCP_INPDEV_USERFUNC *)dwPara2); return ME_NOERR; } return ME_PARAMERROR; case MC_OUTPUTFILE: if( dwPara1 == MC_OUTDEV_FILE ){ bOutputStdio = FALSE; if( strlen( (char *)dwPara2 ) >= MAX_FILE_LEN ) return ME_PARAMERROR; strcpy( szOutFile, (char *)dwPara2 ); mc_userStore = MPGE_NULL_FUNC; return ME_NOERR; } else if( dwPara1 == MC_OUTDEV_FILE ){ bOutputStdio = TRUE; mc_userStore = MPGE_NULL_FUNC; return ME_NOERR; } else if( dwPara1 == MC_OUTDEV_USERFUNC ){ mc_userStore = (MPGE_USERFUNC )dwPara2; bOutputStdio = FALSE; bOutputVBR_userfunc = FALSE; return ME_NOERR; } else if( dwPara1 == MC_OUTDEV_USERFUNC_WITHVBRTAG ){ mc_userStore = (MPGE_USERFUNC )dwPara2; bOutputStdio = FALSE; bOutputVBR_userfunc = TRUE; return ME_NOERR; } return ME_PARAMERROR; case MC_ENCODEMODE: if( dwPara1 == MC_MODE_MONO ){ gl.mode = MPG_MD_MONO; l3_side.mode_ext = 0; force_ms = 0; return ME_NOERR; } else if( dwPara1 == MC_MODE_STEREO ){ gl.mode = MPG_MD_STEREO; l3_side.mode_ext = 0; force_ms = 0; return ME_NOERR; } else if( dwPara1 == MC_MODE_JOINT ){ gl.mode = MPG_MD_JOINT_STEREO; l3_side.mode_ext = 0; force_ms = 0; return ME_NOERR; } else if( dwPara1 == MC_MODE_MSSTEREO ){ gl.mode = MPG_MD_JOINT_STEREO; l3_side.mode_ext = 0; force_ms = 1; return ME_NOERR; } else if( dwPara1 == MC_MODE_DUALCHANNEL ){ gl.mode = MPG_MD_DUAL_CHANNEL; l3_side.mode_ext = 0; force_ms = 0; return ME_NOERR; } return ME_PARAMERROR; case MC_BITRATE: gl.rate_kbps = dwPara1; return ME_NOERR; case MC_EMPHASIS: gl.emphasis = dwPara1; return ME_NOERR; case MC_INPFREQ: gl.inp_freqHz = dwPara1; return ME_NOERR; case MC_OUTFREQ: gl.enc_freqHz = dwPara1; return ME_NOERR; #ifdef USE_VBR case MC_VBR: VBR = 1; VBR_q = dwPara1; if( VBR_q < 0 ) VBR_q = 4; return ME_NOERR; case MC_VBRBITRATE: gl.rate_kbps = dwPara1; VBR_min_rate_idx = get_rate_idx(dwPara1, 1); VBR_max_rate_idx = get_rate_idx(dwPara2, 1); if(dwPara1 > dwPara2) return ME_PARAMERROR; if( VBR_min_rate_idx == -1 || VBR_max_rate_idx == -1 ) return ME_PARAMERROR; return ME_NOERR; #endif /* USE_VBR */ #ifdef RAW_INPUT case MC_STARTOFFSET: nStartOffset = dwPara1; return ME_NOERR; case MC_BYTE_SWAP: bSwapByte = TRUE; return ME_NOERR; case MC_8BIT_PCM: is8bitPCM = TRUE; return ME_NOERR; case MC_MONO_PCM: isMonoPCM = TRUE; return ME_NOERR; case MC_TOWNS_SND: bTownsSND = TRUE; return ME_NOERR; #endif /* RAW_INPUT */ case MC_USEPSY: fast_mode = dwPara1 ? FALSE: TRUE ; return ME_NOERR; case MC_USELPF16: sfb21 = dwPara1 ? TRUE: FALSE ; return ME_NOERR; case MC_USEMMX: if( dwPara1 ) { useUNIT |= tMMX; } else { useUNIT &= ~(tMMX); } return ME_NOERR; case MC_USE3DNOW: if( dwPara1 ) { useUNIT |= t3DN; } else { useUNIT &= ~(t3DN); useUNIT &= ~(tE3DN); /* 3DNを使わない時はE3DNも使わない */ } return ME_NOERR; case MC_USEKNI: if( dwPara1 ) { useUNIT |= tSSE; } else { useUNIT &= ~(tSSE); } return ME_NOERR; case MC_USEE3DNOW: if( dwPara1 ) { useUNIT |= tE3DN ; useUNIT |= t3DN ; /* E3DNを使う時は3DNも使う */ } else { useUNIT &= ~tE3DN ; } return ME_NOERR; case MC_USESPC1: if( dwPara1 ) { useUNIT |= tSPC1; } else { useUNIT &= ~(tSPC1); } return ME_NOERR; case MC_USESPC2: if( dwPara1 ) { useUNIT |= tSPC2; } else { useUNIT &= ~(tSPC2); } return ME_NOERR; #if defined(MT_ENCODER) case MC_CPU: if( dwPara1 > 0) { if((nCPU = dwPara1) > 1){ #if defined(USE_BTHREAD) if( nCPU >= B_MAX_CPU_COUNT ) nCPU = B_MAX_CPU_COUNT; #else if( nCPU >= NTHREADS ) nCPU = NTHREADS; #endif useUNIT |= tMULTI; }else{ useUNIT &= ~(tMULTI); } } return ME_NOERR; #endif #if defined(BeOS) || defined( WIN32 ) case MC_THREAD_PRIORITY: if( dwPara1 > 0) { intEncodeThreadPriority = dwPara1; } return ME_NOERR; #endif #if defined(USE_BTHREAD) case MC_READTHREAD_PRIORITY: if( dwPara1 >= 0) { intReadThreadPriority = dwPara1; } return ME_NOERR; #endif case MC_ADDTAG: { //nid3taglen = dwPara1; if( dwPara1 ){ if( pid3tag ){ char *ptmp = mem_alloc( dwPara1 + nid3taglen + 4, "ID3TAG" ); if( ptmp == NULL ){ mem_free( (void **)&pid3tag ); nid3taglen = 0; return ME_NOMEMORY; } memcpy( ptmp, pid3tag, nid3taglen ); memcpy( ptmp + nid3taglen, (void *)dwPara2, dwPara1 ); nid3taglen += dwPara1; mem_free( (void **)&pid3tag ); pid3tag = ptmp; } else { nid3taglen = dwPara1; pid3tag = mem_alloc( nid3taglen + 4, "ID3TAG" ); if( pid3tag == NULL ){ nid3taglen = 0; return ME_NOMEMORY; } memcpy( pid3tag, (void*)dwPara2, nid3taglen ); } } } return ME_NOERR; case MC_OUTPUT_FORMAT: { switch(dwPara1) { case MC_OUTPUT_NORMAL: case MC_OUTPUT_RIFF_WAVE: case MC_OUTPUT_RIFF_RMP: outputFormat = dwPara1; break; default: return ME_PARAMERROR; } } return ME_NOERR; case MC_RIFF_INFO: { if( 4 <= dwPara1 && dwPara2 ){ int addInfoSize = (dwPara1 & 1) ? dwPara1 + 5 : dwPara1 + 4; if( pRiffInfos ){ char *pTmp = mem_alloc( riffInfosLen + addInfoSize, "RIFFINFO" ); if( pTmp == NULL ){ mem_free( (void **)&pRiffInfos ); riffInfosLen = 0; return ME_NOMEMORY; } memmove( pTmp, pRiffInfos, riffInfosLen ); memmove( pTmp + riffInfosLen, (void *)dwPara2, 4 ); *(int *)(pTmp + riffInfosLen + 4) = dwPara1-4; memmove( pTmp + riffInfosLen + 8, (void *)((char *)dwPara2+4), dwPara1-4 ); riffInfosLen += addInfoSize; mem_free( (void **)&pRiffInfos ); pRiffInfos = pTmp; } else { pRiffInfos = mem_alloc( addInfoSize, "RIFFINFO" ); if( pRiffInfos == NULL ){ riffInfosLen = 0; return ME_NOMEMORY; } memmove( pRiffInfos, (void *)dwPara2, 4 ); *(int *)(pRiffInfos + 4) = dwPara1-4; memmove( pRiffInfos + 8, (void *)((char *)dwPara2+4), dwPara1-4 ); riffInfosLen = addInfoSize; } } } return ME_NOERR; case MC_VERIFY: verifyFlag = 1; return ME_NOERR; case MC_OUTPUTDIR: if( strlen( (char *)dwPara1 ) >= MAX_FILE_LEN ) return ME_PARAMERROR; strcpy( outputDir, (char *)dwPara1 ); return ME_NOERR; case MC_ENHANCEDFILTER: #ifdef PENOUTFREQ if(dwPara1 <= 100 && dwPara2 <= 100 && dwPara1 <= dwPara2){ lowpass1 = (float)dwPara1 / 100.; lowpass2 = (float)dwPara2 / 100.; return ME_NOERR; } #endif return ME_PARAMERROR; case MC_MSTHRESHOLD: if(dwPara1 <= 100 && dwPara2 <= 100 && dwPara1 <= dwPara2){ msstereo_threshold = (float)dwPara1/ 100.; msstereo_ratio = (float)dwPara2/ 200.; return ME_NOERR; } return ME_PARAMERROR; case MC_LANG: setLang( (t_lang)dwPara1 ); return ME_NOERR; case MC_MAXFILELENGTH: read_limitsize = (unsigned long)dwPara1; return ME_NOERR; case MC_OUTSTREAM_BUFFERD: outstream_nonbufferd = dwPara1 ? FALSE : TRUE; return ME_NOERR; default: return ME_PARAMERROR; } return ME_PARAMERROR; } #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) MERET EXPORT MPGE_detectConfigure() { size_t size; int freq, bit, channel; if( musicin != NULL ) return ME_INTERNALERROR; /* open input file */ if( ISUSERFUNCIN() ){ musicin = (FILE *)-1; } else if( bInputStdio ){ /* Thanks to Tomoya Tokairin */ /* by sava */ #if defined(__EMX__) /* OS/2 emx + gcc */ _fsetmode(stdin, "b"); #elif defined(__WATCOMC__) /* Watcom C dos4gw, os/2 or win */ setmode( _fileno( stdin ), _O_BINARY ); #elif defined(GO32) /* MS-DOS DJGPP gcc */ setmode( fileno( stdin ), O_BINARY ); #elif defined(WIN32) #ifdef __BORLANDC__ setmode( _fileno( stdin ), _O_BINARY ); #else _setmode( _fileno( stdin ), _O_BINARY ); #endif #elif __HIGHC__ _setmode( stdin, _BINARY ); #endif musicin = stdin;/* unix */ } else { musicin = fopen( szInFile, "rb" ); if( !musicin ) return ME_INFILE_NOFOUND; } /* detective the name of output file */ if( szOutFile[0] == '\0' ){ if( bInputStdio ){ return ME_OUTFILE_NOFOUND; } if( !*szInFile ){ strcpy( szOutFile, "default.mp3" ); }else{ if( changeSuf( szOutFile, szInFile, MAX_FILE_LEN ) == ERR ) return ME_INTERNALERROR; } } if( *outputDir ){ if( changePath( szOutFile, outputDir, MAX_FILE_LEN ) == ERR ) return ME_INTERNALERROR; } #ifndef _WINDOWS /* only console */ if( verifyFlag ){ FILE *fp; fp = fopen( szOutFile, "r" ); if( fp ){ char tmp[4]; fclose(fp); fprintf( stderr, "%s[%s]\n", getMsg( MSG_VERIFY ), szOutFile ); fgets( tmp, sizeof(tmp), stdin ); if( getLangType() == tLANG_GERMAN ){ if( *tmp != 'j' && *tmp != 'J' ) return ME_HALTED; }else{ if( *tmp != 'y' && *tmp != 'Y' ) return ME_HALTED; } } } #endif /* _WINDOWS */ /* 入力/出力PCMの周波数を決定する */ #ifdef RAW_INPUT if( nStartOffset != -1 && !ISUSERFUNCIN() ){ int i; if( !bInputStdio ){ fseek( musicin, 0, SEEK_END ); size = ftell( musicin ); rewind( musicin ); }else{ size = LONG_MAX; } size -= nStartOffset; /* subtract size of header */ for( i = 0; i < nStartOffset; i++ ){ fgetc( musicin ); /* header skip. Don't use fseek */ } bit = is8bitPCM ? 8 : 16; channel = isMonoPCM ? 1 : 2; }else #endif /* RAW_INPUT */ if( !ISUSERFUNCIN() ){ if( !WAV_checkFMT( musicin, &size, &bit, &freq, &channel) || !size ){ fclose( musicin ); return ME_WAVETYPE_ERR; /* WAVE format error */ } if(gl.inp_freqHz == -1) gl.inp_freqHz = freq; } else { size = mc_userfunc.nSize; bit = mc_userfunc.nBit; gl.inp_freqHz = mc_userfunc.nFreq; channel = mc_userfunc.nChn; } // サイズ情報が確定したら... if( read_limitsize == MC_MAXFLEN_WAVEHEADER ) read_limitsize = size; bBitConvert = ( bit == 16 ) ? FALSE : TRUE; /* ビット深度変換 */ if( channel == 1 ){ gl.mode = MPG_MD_MONO; l3_side.mode_ext = 0; force_ms = FALSE; } else if( channel == 2 ){ if( gl.mode == MPG_MD_MONO ){ bForceMono = TRUE; /* 強制モノラル変換 */ channel = 1; /* 内部モノラル処理 */ } } #define ENC_BUFFER_SIZE 16384 if( mc_userStore == MPGE_NULL_FUNC ){ if( !open_bit_stream_w( szOutFile, ENC_BUFFER_SIZE) ){ musicin = NULL; return ME_OUTFILE_NOFOUND; } } else { open_bit_stream_userfunc( mc_userStore , ENC_BUFFER_SIZE); } if( gl.inp_freqHz == -1 ){ /* 入力周波数が指定されていなかったら44.1kHz */ gl.inp_freqHz = 44100; } #ifndef PENOUTFREQ /* !PENOUTFREQ */ if( gl.enc_freqHz == -1 ){ /* 出力周波数が指定されていなかったら入力と同じ */ gl.enc_freqHz = gl.inp_freqHz; } #else /* PENOUTFREQ */ if( gl.enc_freqHz == -1 ){ /* 入力周波数・ビットレートに応じて出力周波数を変更する */ if( VBR ){ if( gl.inp_freqHz >= 28000 ) { // for MPEG1 if( VBR_q >= 7 ) gl.enc_freqHz = 32000; else gl.enc_freqHz = gl.inp_freqHz; } else { // for MPEG2 if( VBR_q >= 7 ) gl.enc_freqHz = 16000; else gl.enc_freqHz = gl.inp_freqHz; } } else { int kbps; kbps = gl.rate_kbps; if( kbps <= 0 ) kbps = 128; if( channel == 2 ) kbps /= 2; if( gl.inp_freqHz >= 28000 ) { /* MPEG1 */ if( kbps <= 32 ) { gl.enc_freqHz = 32000; if( gl.mode < 0 ){ // MSSTEREO gl.mode = MPG_MD_JOINT_STEREO; l3_side.mode_ext = 0; force_ms = 1; if( lowpass1 < 0 && lowpass2 < 0 ){ sfb21 = 0; lowpass1 = 0.40; lowpass2 = 0.50; } else { sfb21 = 1; } } } else if( kbps <= 56 ) { gl.enc_freqHz = 32000; if( gl.mode < 0 ){ // MSSTEREO gl.mode = MPG_MD_JOINT_STEREO; l3_side.mode_ext = 0; force_ms = 1; if( lowpass1 < 0 && lowpass2 < 0 && sfb21 < 0 ){ sfb21 = 0; lowpass1 = 0.63; lowpass2 = 0.70; } } } else { gl.enc_freqHz = gl.inp_freqHz; } } else { /* MPEG2 */ if( kbps <= 16 ) { gl.enc_freqHz = 16000; } else if( kbps <= 32 && gl.enc_freqHz >= 22050) { gl.enc_freqHz = 22050; } else { gl.enc_freqHz = gl.inp_freqHz; } } } } #endif /* PENOUTFREQ */ /* the nearest sampling-frequency to encode */ gl.enc_freqHz = NormalizeSmpFreq(gl.enc_freqHz); /* サンプリングコンバーターの初期化 */ InitializeSampleConverter(gl.inp_freqHz, gl.enc_freqHz); /* MPEG1/2判定 */ if( (gl.freq_idx = get_freq_idx(gl.enc_freqHz, &gl.version)) < 0){ if( ISUSERFUNCIN() ) mc_userfunc.pUserFunc( NULL, 0 ); else fclose( musicin ); musicin = NULL; return ME_FREQERROR; } gl.frameSize = ( gl.version ) ? 1152 : 576; /* モード */ if( gl.mode < 0 ){ gl.mode = MPG_MD_JOINT_STEREO;/* デフォルトは JOINT-STEREO */ l3_side.mode_ext = 0; force_ms = 0; } /* フレーム数の算出 */ if( size != MC_INPDEV_MEMORY_NOSIZE ){ { double num = (double)size * (double)gl.enc_freqHz / (double)gl.inp_freqHz; unsigned int perFrame = gl.frameSize * 2 * bit/8; if( gl.mode == MPG_MD_MONO && !bForceMono ){ perFrame /= 2; } totalframes = ( num + gl.frameSize - 1 ) / perFrame; } } else { totalframes = 0; } /* ビットレート */ if( gl.rate_kbps <= 0 ){ gl.rate_kbps = 128; } l3_side.rate_idx = get_rate_idx(gl.rate_kbps, gl.version); if( l3_side.rate_idx < 0 ){ if( ISUSERFUNCIN() ) mc_userfunc.pUserFunc( NULL, 0 ); else fclose( musicin ); musicin = NULL; return ME_BITRATEERROR; } /* a bit rate was specified. for VBR, take this to be the minimum */ if( gl.rate_kbps >= 192 ){ if( gl.mode != MPG_MD_MONO && gl.mode != MPG_MD_DUAL_CHANNEL ){ /* 192kbps以上のビットレートでは強制的にSTEREOとする */ gl.mode = MPG_MD_STEREO; l3_side.mode_ext = 0; force_ms = 0; } } /* 高圧縮なときは フィルタを使用 */ #ifdef PENOUTFREQ if( sfb21 == -1 && lowpass1 < 0 && lowpass2 < 0){ if( VBR ){ lowpass1 = lowpass2 = 0; // 固定フィルタは用いない if( VBR_min_rate_idx > 7 ) { sfb21 = 0; } else { sfb21 = 1; } } else { float compression_ratio; compression_ratio = gl.enc_freqHz * channel * 16 / ( gl.rate_kbps * 1000.0 ); if( gl.rate_kbps / channel <= 32 ){ // 32kbps/ch以下の場合 sfb21 = 0; if( compression_ratio > 15.5 ){ lowpass1 = 0.35; /* for 16kHz 16kbps */ lowpass2 = 0.50; }else if( compression_ratio > 14 ){ lowpass1 = 0.40; /* for 22kHz 24kbps */ lowpass2 = 0.55; }else{ lowpass1 = 0.55; /* for 16kHz 24kbps */ lowpass2 = 0.70; } } else { if( gl.rate_kbps / channel <= 64 ){ sfb21 = 1; } else { sfb21 = 0; } } } } #else /* PENOUTFREQ */ if( sfb21 == -1 ){ float compression_ratio; lowpass1 = lowpass2 = 0; compression_ratio = gl.enc_freqHz * channel * 16 / ( gl.rate_kbps * 1000.0 ); if( gl.rate_kbps / channel <= 32 ){ sfb21 = 0; if( compression_ratio > 15.5 ){ lowpass1 = 0.35; /* for 16kHz 16kbps */ lowpass2 = 0.50; }else if( compression_ratio > 14 ){ lowpass1 = 0.40; /* for 22kHz 24kbps */ lowpass2 = 0.55; }else{ lowpass1 = 0.55; /* for 16kHz 24kbps */ lowpass2 = 0.70; } } if( gl.rate_kbps / channel <= 64 ){ sfb21 = 1; } else { sfb21 = 0; } } #endif /* PENOUTFREQ */ /* 出力フォーマット */ if( mc_userStore != MPGE_NULL_FUNC || bOutputStdio ) { // ユーザー定義出力・標準出力時は、通常フォーマット(mp3+pid3tag)のみ可能 outputFormat = MC_OUTPUT_NORMAL; } // フォーマット毎のファイル先頭から mp3 本体へのオフセットの設定 switch( outputFormat ) { case MC_OUTPUT_NORMAL: outputOffset = 0; break; case MC_OUTPUT_RIFF_WAVE: outputOffset = SizeOfCkWave; break; case MC_OUTPUT_RIFF_RMP: outputOffset = SizeOfCkRmp; break; default: return ME_INTERNALERROR; } // mp3 本体の前に入るデータ分を空けておく { // 直接 fseek すると後の拡張で bitstream.c の関数と不整合がでたらイヤだから // putbits しておく int seekPoint = outputOffset; while( seekPoint ){ putbits(0, 8); seekPoint--; } } /* その他のパラメータの初期化 */ gl.stereo = ( gl.mode == MPG_MD_MONO ) ? 1 : 2; gl.mode_gr = ( gl.version == 1 ) ? 2 : 1; /* デバイス初期化 */ #if defined( WIN32 ) && defined( _WINDOWS ) /* for only WinGUI */ if( useUNIT & tSSE ){ __try { setPIII_round(); } __except(EXCEPTION_EXECUTE_HANDLER) { useUNIT &= ~tSSE; } } #else #if defined( __unix__ ) || defined( WIN32 ) || defined( __os2__ ) || defined( __dos__ ) if( useUNIT & tSSE ){ MERET jmpval; jmpval = setjmp( _longjmp_ptr ); if( !jmpval ){ if(debug)err_puts( getMsg( MSG_CHECK_SSE ) ); signal(SIGILL,SSE_not_support); setPIII_round(); if(debug)err_puts( getMsg( MSG_SUPPORT_SSE ) ); signal(SIGILL,SIG_DFL); } else { useUNIT &= ~tSSE; } } #endif if( useUNIT & tSSE ){ setPIII_round(); /* SSEを使うなら四捨五入モードにセット */ } #endif if( gl.version == 0 ) g_bWriteVbrTag = 0; if( !VBR ) g_bWriteVbrTag = 0; #ifdef USE_VBR if( l3_side.rate_idx == 14 ) VBR = 0; /* dont bother with VBR at 320kbs */ if( VBR ){ // VBR時のMIN/MAXBITRATEを決定します if( VBR_min_rate_idx < 0 || VBR_max_rate_idx < 0 ){ /* a bit rate was specified. for VBR, take this to be the minimum */ VBR_min_rate_idx = l3_side.rate_idx; /* quality設定より最大ビットレート量を算出する */ if( l3_side.rate_idx >= 13 ) VBR_max_rate_idx = 14; if( VBR_q == 0 ) VBR_max_rate_idx = 14; if( VBR_q >= 1 ) VBR_max_rate_idx = 13; if( VBR_q >= 5 ) VBR_max_rate_idx = 12; if( VBR_q >= 8 ) VBR_max_rate_idx = 9; } fast_mode = FALSE; #ifndef PENOUTFREQ if( VBR_q < 4 ) sfb21 = 0; #endif if( g_bWriteVbrTag ) InitVbrTag(gl.version-1,gl.mode,gl.freq_idx); } #endif /* USE_VBR */ /* その他の初期化 */ firstcall = 1; setupUNIT( useUNIT ); L3psy_init( gl.enc_freqHz ); window_subband_init(); framebitstable_init(); tableInitForMDCT(); /* 本当は1度だけで良い */ InitFormatBitStream(); /* l3bs.c */ InitLoop(); /* loop.c */ #ifdef BENCH_ONLY { extern int initBenchFlag; initBenchFlag = 1; } #endif /* BENCH_ONLY */ return ME_NOERR; } #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) MERET EXPORT #ifndef __os2__ MPGE_getConfigure(MPARAM mode, void *param ) #else MPGE_getConfigure(MUPARAM mode, void *param ) #endif { int *iparam = (int *)param; // エンコードが開始するまで設定取得を呼び出せない if( !musicin ) return ME_PARAMERROR; switch( mode ){ case MG_INPUTFILE: if( bInputStdio ) ((char *)param)[0] = '\0'; else strcpy( param, szInFile); return ME_NOERR; case MG_OUTPUTFILE: if( bOutputStdio ){ ((char *)param)[0] = '\0'; } else { strcpy( param, szOutFile); } return ME_NOERR; case MG_ENCODEMODE: switch( gl.mode ){ case MPG_MD_MONO: *iparam = MC_MODE_MONO; return ME_NOERR; case MPG_MD_STEREO: *iparam = MC_MODE_STEREO; return ME_NOERR; case MPG_MD_JOINT_STEREO: if( !force_ms ) *iparam = MC_MODE_JOINT; else *iparam = MC_MODE_MSSTEREO; return ME_NOERR; case MPG_MD_DUAL_CHANNEL: *iparam = MC_MODE_DUALCHANNEL; return ME_NOERR; } return ME_PARAMERROR; case MG_BITRATE: *iparam = gl.rate_kbps; return ME_NOERR; case MG_INPFREQ: *iparam = gl.inp_freqHz; return ME_NOERR; case MG_OUTFREQ: *iparam = gl.enc_freqHz; return ME_NOERR; case MG_STARTOFFSET: *iparam = -1; return ME_NOERR; case MG_USEPSY: *iparam = fast_mode ? FALSE: TRUE ; return ME_NOERR; case MG_USEMMX: *iparam = ( useUNIT & tMMX ) ? TRUE : FALSE; return ME_NOERR; case MG_USE3DNOW: *iparam = ( useUNIT & t3DN ) ? TRUE : FALSE; return ME_NOERR; case MG_USEKNI: *iparam = ( useUNIT & tSSE ) ? TRUE : FALSE; return ME_NOERR; case MG_USEE3DNOW: *iparam = ( useUNIT & tE3DN ) ? TRUE : FALSE; return ME_NOERR; case MG_USESPC1: *iparam = ( useUNIT & tSPC1 ) ? TRUE : FALSE; return ME_NOERR; case MG_USESPC2: *iparam = ( useUNIT & tSPC2 ) ? TRUE : FALSE; return ME_NOERR; case MG_COUNT_FRAME: *iparam = totalframes; return ME_NOERR; case MG_NUM_OF_SAMPLES: *iparam = gl.frameSize; return ME_NOERR; case MG_MPEG_VERSION: *iparam = gl.version; return ME_NOERR; #if defined(USE_BTHREAD) case MG_READTHREAD_PRIORITY: *iparam = intReadThreadPriority; return ME_NOERR; #endif } return ME_PARAMERROR; } #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) #if defined(USE_WINTHREAD) || defined(USE_BTHREAD) || defined(USE_OS2THREAD) static int maxthread = 0; static int curthread = 0; #endif #if !defined(USE_OS2THREAD) static int encodeframe(void); #endif #if defined(USE_BTHREAD) static sem_id mutex_mfbuf; static sem_id mutex_l3_sb_sample; static sem_id mutex_l3_side; static sem_id mutex_fmt_bitstm; static thread_id ptid[B_MAX_CPU_COUNT]; /* BeOSでサポートしている最大CPU数と同じだけ確保 */ static sem_id mutex_frames; static port_id port_frames; /* スレッド間通信ポート */ static void *encodeframethread(void *); static int frameNum = 0; /* エンコードスレッドの現在の処理フレーム数カウント */ #endif #ifdef USE_BTHREAD MERET EXPORT MPGE_processFrame(int * frameNum) #else MERET EXPORT MPGE_processFrame() #endif { #if defined(USE_WINTHREAD) || defined(USE_OS2THREAD) static int i; short *frmBuffer = (short *)ALIGN(__frmBuffer,16); #endif #ifdef USE_LONGJMP { MERET jmpval; jmpval = setjmp( _longjmp_ptr ); if( jmpval ) { return (MERET)jmpval; } } #else #ifndef DONT_USE_LONGJMP #error "define *_LONGJMP " #endif #endif /* USE_LONGJMP */ /* 最初のみ実行される部分 */ #if defined( USE_WINTHREAD ) if( firstcall ){ if( intEncodeThreadPriority == -1 ){ nThreadPrio = GetThreadPriority( GetCurrentThread() ); } else { nThreadPrio = intEncodeThreadPriority; } } #ifdef USE_LONGJMP if( error_notify ){ // 以前エンコードしていたスレッド中でエラーが発生している場合 return error_notify; } #endif if( ISMULTI() ){ SAMPLES_T rval; rval = get_audio( musicin, frmBuffer ); if( rval == SAMPLES_PAUSED ) return ME_MOREDATA; if( rval == SAMPLES_READ ){ #ifdef _DEBUG tprintf("Set Event In\n"); #endif if( !ResetEvent( encodeframe_arg[i].hWaitEncoding ) ){ return ME_INTERNALERROR; } // 待機フラグをおろす SetEvent( encodeframe_arg[i].hEnterFrame ); // フレーム使用中フラグを上げる WaitForSingleObject( encodeframe_arg[i].hLeaveFrame, INFINITE ); // 使い終わるまで待つ ResetEvent( encodeframe_arg[i].hLeaveFrame ); // CloseHandle( encodeframe_arg[i].hLeaveFrame ); #ifdef _DEBUG tprintf("Leave Event\n"); #endif /* RR scheduling */ if(++i >= nCPU /*NTHREADS*/) i = 0; return ME_NOERR; } else { MERET rval = MPGE_closeCoder(); if( rval != ME_NOERR ) return rval; return ME_EMPTYSTREAM; } } #elif defined( USE_OS2THREAD ) if( firstcall ){ // nThreadClass = GetPriorityClass( GetCurrentProcess() ); // nThreadPrio = GetThreadPriority( GetCurrentThread() ); } #ifdef USE_LONGJMP if( error_notify ){ // 以前エンコードしていたスレッド中でエラーが発生している場合 return error_notify; } #endif if( get_audio( musicin, frmBuffer ) ){ if( ISMULTI() ){ ULONG resetcount; APIRET ulrc; #ifdef _DEBUG tprintf("Set Event In\n"); #endif ulrc = DosResetEventSem( encodeframe_arg[i].hWaitEncoding, &resetcount ); if( ulrc != 0 && ulrc != 300 ){ return ME_INTERNALERROR; } // 待機フラグをおろす DosPostEventSem( encodeframe_arg[i].hEnterFrame ); // フレーム使用中フラグを上げる DosWaitEventSem( encodeframe_arg[i].hLeaveFrame, -1); // 使い終わるまで待つ DosResetEventSem( encodeframe_arg[i].hLeaveFrame, &resetcount ); // CloseHandle( encodeframe_arg[i].hLeaveFrame ); #ifdef _DEBUG tprintf("Leave Event\n"); #endif /* RR scheduling */ if(++i >= NTHREADS) i = 0; } else { encodeframe( NULL ); } return ME_NOERR; } else { MERET rval = MPGE_closeCoder(); if( rval != ME_NOERR ) return rval; return ME_EMPTYSTREAM; } #elif defined(USE_PTHREAD) if( ISMULTI() ){ if(encodeframethread(NULL) == NULL){ return ME_NOERR; }else{ MERET rval = MPGE_closeCoder(); if( rval != ME_NOERR ) return rval; return ME_EMPTYSTREAM; } } #elif defined(USE_BTHREAD) if( ISMULTI() ){ int i; if(curthread){ /* エンコード中のスレッドがある */ read_port(port_frames,(int32 *)frameNum,(void *)&i,0); return ME_NOERR; } else if (maxthread){ /* エンコードは全て終わった */ MERET rval; /* all threads have terminated */ acquire_sem(mutex_frames); delete_sem(mutex_mfbuf); delete_sem(mutex_l3_sb_sample); delete_sem(mutex_l3_side); delete_sem(mutex_frames); delete_port(port_frames); rval = MPGE_closeCoder(); if( rval != ME_NOERR ) return rval; return ME_EMPTYSTREAM; } else { /* まだスレッドが起動されていない */ /* 使用するセマフォの作成、初期化 */ mutex_mfbuf = create_sem(1,"mfbuf"); mutex_l3_sb_sample = create_sem(1,"l3_sb_sample"); mutex_l3_side = create_sem(1,"l3_side"); mutex_fmt_bitstm = create_sem(1,"fmt_bitstm"); mutex_frames = create_sem(1,"frames"); port_frames = create_port(1,"port_frames"); /* create */ acquire_sem(mutex_frames); /* 検出されたCPUの数だけスレッドを作成する */ for(i = 0; i < nCPU; i++){ /* bring thread-priority down 99/11/12 */ /* What is suitable value? set 100 if you want to run gogo faster, but it's dangerous. */ if((ptid[i] = spawn_thread((thread_func)encodeframethread,"gogoEncodeThread",intEncodeThreadPriority,(void *)NULL)) < 0) { return ME_CANNOT_CREATE_THREAD; } resume_thread(ptid[i]); } release_sem(mutex_frames); // set_thread_priority(find_thread((void *)0),11); /* 表示スレッドの優先度をちょっとあげる(default 10) */ read_port(port_frames,(int32 *)frameNum,(void *)&i,0); /* エンコードスレッドからの通信を待つ */ return ME_NOERR; } } #endif #ifdef WIN32 { int rval = encodeframe(); if( rval == 0 ){ return ME_NOERR; } else if(rval == 1 ) { return ME_MOREDATA; } else { MERET rval = MPGE_closeCoder(); if( rval != ME_NOERR ) return rval; return ME_EMPTYSTREAM; } } #else #if !defined(USE_OS2THREAD) if( encodeframe() == 0 ){ return ME_NOERR; } else { MERET rval = MPGE_closeCoder(); if( rval != ME_NOERR ) return rval; return ME_EMPTYSTREAM; } #endif #endif } MERET EXPORT MPGE_processTrack(int *frameNum) { MERET rval; #if defined(USE_PTHREAD) pthread_attr_t attr_child; encodeframe_arg_t arg[NTHREADS]; #endif #if defined(USE_WINTHREAD) encodeframe_arg_t arg[NTHREADS]; #endif *frameNum = 0; #if defined(USE_PTHREAD) pthread_attr_init(&attr_child); if( ISMULTI() && (pthread_attr_setscope(&attr_child, PTHREAD_SCOPE_SYSTEM) == 0)){ /* Multi-threaded encoding */ int i; /* create */ pthread_mutex_lock(&mutex_frames); pthread_attr_setdetachstate(&attr_child, PTHREAD_CREATE_JOINABLE); for(i = 0; i < nCPU; i++){ arg[i].tid = i; arg[i].frameNum = frameNum; if(pthread_create(&arg[i].ptid, &attr_child, encodeframethread, &arg[i])){ return ME_CANNOT_CREATE_THREAD; } } /* start encoding */ pthread_mutex_unlock(&mutex_frames); /* waiting for the termination of the child */ for(i = 0; i < nCPU; i++){ if(pthread_join(arg[i].ptid, NULL)){ return ME_INTERNALERROR; } } /* all threads have terminated */ rval = MPGE_closeCoder(); if( rval != ME_NOERR ) return rval; return ME_EMPTYSTREAM; } #endif /* Single-threaded encoding */ #if defined(USE_WINTHREAD) while(encodeframethread( &arg[ 0 ] ) >= 0) (*frameNum)++; #elif defined( USE_OS2THREAD ) while(encodeframe(NULL) >= 0 ) (*frameNum)++; #else while(encodeframe() >= 0) (*frameNum)++; #endif rval = MPGE_closeCoder(); if( rval != ME_NOERR ) return rval; return ME_EMPTYSTREAM; } #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) MERET EXPORT MPGE_endCoder() { #if defined( USE_WINTHREAD ) if( boot_thread ){ int i; boot_thread = 0; /* 生成したスレッドがすべて停止したことを確認 */ for(i = NTHREADS - 1; i >= 0 ; i--){ tprintf("th %d : Enc.finthread = TRUE\n", i); encodeframe_arg[i].finthread = TRUE; SetEvent( encodeframe_arg[i].hEnterFrame ); LeaveCriticalSection( &mutex_mfbuf ); WaitForSingleObject( encodeframe_arg[i].hExistThread, INFINITE ); /* タイムアウト 1sec */ tprintf("th %d : ClsoeHandle\n", i); CloseHandle( encodeframe_arg[i].hEnterFrame ); CloseHandle( encodeframe_arg[i].hLeaveFrame ); CloseHandle( encodeframe_arg[i].hExistThread ); CloseHandle( encodeframe_arg[i].hWaitEncoding ); } /* スレッドの後始末 */ for(i = NTHREADS - 1;i >= 0; i--){ DeleteCriticalSection( &encodeframe_arg[i].section ); if( encodeframe_arg[i].hThread ) { DWORD exitCode; while( GetExitCodeThread( (HANDLE)encodeframe_arg[i].hThread, &exitCode ) ) { if( exitCode != STILL_ACTIVE ) break; Sleep( 10 ); } CloseHandle( (HANDLE) encodeframe_arg[i].hThread ); // _beginthreadex使用時は... } } DeleteCriticalSection( &mutex_mfbuf ); DeleteCriticalSection( &mutex_l3_sb_sample ); DeleteCriticalSection( &mutex_l3_side ); DeleteCriticalSection( &mutex_frmBuffer ); DeleteCriticalSection( &mutex_fmt_bitstm ); } #elif defined( USE_OS2THREAD ) if( boot_thread ){ int i; boot_thread = 0; /* 生成したスレッドがすべて停止したことを確認 */ for(i = NTHREADS - 1; i >= 0 ; i--){ tprintf("th %d : Enc.finthread = TRUE\n", i); encodeframe_arg[i].finthread = TRUE; DosPostEventSem( encodeframe_arg[i].hEnterFrame ); DosReleaseMutexSem( mutex_mfbuf ); DosWaitEventSem( encodeframe_arg[i].hExistThread, -1); /* タイムアウト 1sec */ tprintf("th %d : CloseHandle\n", i); DosCloseEventSem( encodeframe_arg[i].hEnterFrame ); DosCloseEventSem( encodeframe_arg[i].hLeaveFrame ); DosCloseEventSem( encodeframe_arg[i].hExistThread ); DosCloseEventSem( encodeframe_arg[i].hWaitEncoding ); } /* スレッドの後始末 */ for(i = NTHREADS - 1;i >= 0; i--){ DosCloseMutexSem( encodeframe_arg[i].section ); if( encodeframe_arg[i].hThread ) DosKillThread( encodeframe_arg[i].hThread ); // _beginthreadex使用時は... } DosCloseMutexSem( mutex_mfbuf ); DosCloseMutexSem( mutex_l3_sb_sample ); DosCloseMutexSem( mutex_l3_side ); DosCloseMutexSem( mutex_frmBuffer ); DosCloseMutexSem( mutex_fmt_bitstm ); } #endif /* USE_OS2THREAD */ if( pid3tag ){ mem_free( (void **)&pid3tag ); } nid3taglen = 0; pid3tag = NULL; if( pRiffInfos ){ mem_free( (void **)&pRiffInfos ); } riffInfosLen = 0; pRiffInfos = NULL; return ME_NOERR; } #endif /* !defined(MUSENC_PASS2) */ #if defined(USE_PTHREAD) || defined(USE_BTHREAD) static void * encodeframethread(void *arg) #elif defined(USE_WINTHREAD) static unsigned __stdcall encodeframethread(void *arg) #elif defined(USE_OS2THREAD) static int _System encodeframe(void *arg) #else static int encodeframe(void) #endif { /* These are expected to be aligned to 16 bytes. */ /* int l3_enc[2][2][576]; */ char __l3_enc[ 2 * 2 * 576 * sizeof(int) + 16 ]; /* 初期化不要 */ int (*l3_enc)[2][576] = (int (*)[2][576])ALIGN(__l3_enc,16); /* float xr[2][2][576]; */ char __xr[ 2 * 2 * 576 * sizeof(float) + 16 ]; float (*xr)[2][576] = (float (*)[2][576])ALIGN(__xr,16); /* static int mfbuf[2][1152+576+EXTRADELAY]; */ char __mfbuf[ 2 * (1152+576+EXTRADELAY) * sizeof(int) + 32 ]; extern int Amfbuf[2][1152+576+EXTRADELAY]; /* defined in align.nas */ int (*mfbuf)[1152+576+EXTRADELAY] = Amfbuf; /* static float sbd_work[2][1152+HAN_SIZE] */ char __sbd_work[ 2 * (1152+HAN_SIZE) * sizeof(float) + 32 ]; extern float sbd_xxx[2][HAN_SIZE+1152]; /* defined in sbandtbl.nas */ float (*sbd_work)[1152+HAN_SIZE] = sbd_xxx; ratio_t ratio; III_scalefac_t scalefac; int ch,gr,mean_bits; int bitsPerFrame; int force_jointstereo = 0; float pe[2][2]; int i; float ms_ener_ratio[2] = {0, 0}; int blocktype[2][2]; III_side_info_t L_l3_side; #if defined(USE_PTHREAD) || defined(USE_BTHREAD) || defined(ST_ENCODER) char __frmBuffer[ 2 * 1152 * sizeof(short) + 16]; /* 初期化不要 */ #ifndef WIN32 int iread; #endif /* WIN32 */ #endif /* __frmBuffer is defined somewhere :-) */ short *frmBuffer = (short *)ALIGN(__frmBuffer,16); #if defined(USE_BTHREAD) int tid; #endif #if defined(USE_WINTHREAD) || defined(USE_OS2THREAD) || defined(USE_PTHREAD) encodeframe_arg_t *private_data = (encodeframe_arg_t *)arg; #endif /* 初期化不要な static 変数 */ static int check_ms_stereo; static unsigned long sentBits; /* for only VBR */ static int old_bitrate; /* for only VBR */ static float frac_SpF; static float slot_lag; extern L3SBS l3_sb_sample[1]; /* align16 for SSE */ #if defined(USE_PTHREAD) pthread_mutex_lock(&mutex_frames); #elif defined(USE_WINTHREAD) if( private_data ){ // ThreadBoot? private_data->hExistThread = CreateEvent( NULL, FALSE, FALSE, NULL ); while( private_data->hExistThread == NULL ); tprintf("%d : ready to encode\n", private_data->tid ); SetEvent( private_data->hWaitEncoding ); // 待機状態に入る WaitForSingleObject( private_data->hEnterFrame, INFINITE ); if( private_data->firstthreadin ) { SetThreadPriority( GetCurrentThread(), nThreadPrio ); private_data->firstthreadin = FALSE; } ResetEvent( private_data->hWaitEncoding ); // 待機状態から抜ける ResetEvent( private_data->hEnterFrame ); if( private_data->finthread ){ SetEvent( private_data->hExistThread ); tprintf("%d : Stop Thread \n", private_data->tid ); return 0; } tprintf("Starting thread(tid = %d)\n", private_data->tid); frmBuffer = private_data->buf; } #elif defined(USE_OS2THREAD) if( private_data ){ // ThreadBoot? ULONG resetcount; DosCreateEventSem(NULL,&private_data->hExistThread,0,FALSE); DosPostEventSem( private_data->hWaitEncoding ); // 待機状態に入る DosWaitEventSem( private_data->hEnterFrame, -1); DosResetEventSem( private_data->hWaitEncoding, &resetcount ); // 待機状態から抜ける DosResetEventSem( private_data->hEnterFrame, &resetcount ); if( private_data->finthread ){ DosPostEventSem( private_data->hExistThread ); tprintf("%d : Stop Thread \n", private_data->tid ); return 0; } tprintf("Starting thread(tid = %d)\n", private_data->tid); frmBuffer = private_data->buf; } #elif defined(USE_BTHREAD) acquire_sem(mutex_frames); tid = curthread++; maxthread = curthread; #endif #if defined(USE_WINTHREAD) loop: #ifdef USE_LONGJMP if( error_notify ) return -1; #endif { EnterCriticalSection(&mutex_mfbuf); if( private_data->finthread ){ SetEvent( private_data->hExistThread ); tprintf("%d : Stop Thread \n", private_data->tid ); return 0; } curthread ++; if( curthread > maxthread){ maxthread = curthread; } tprintf("%d : Enter Thread (%d / %d)\n", private_data->tid, curthread, maxthread ); } #elif defined(USE_OS2THREAD) loop: #ifdef USE_LONGJMP if( error_notify ) return -1; #endif if( ISMULTI() ){ DosRequestMutexSem(mutex_mfbuf, -1); if( private_data->finthread ){ DosPostEventSem( private_data->hExistThread ); tprintf("%d : Stop Thread \n", private_data->tid ); return 0; } curthread ++; if( curthread > maxthread){ maxthread = curthread; } tprintf("%d : Enter Thread (%d / %d)\n", private_data->tid, curthread, maxthread ); } #endif if( firstcall ){ float avg_slots_per_frame; int whole_SpF; firstcall = 0; sentBits = 0; memset((char *) mfbuf, 0, 2 * (1152+576+EXTRADELAY) * sizeof(int) ); /* Figure average number of 'slots' per frame. */ /* Bitrate means TOTAL for both channels, not per side. */ avg_slots_per_frame = gl.frameSize * gl.rate_kbps / (gl.enc_freqHz * 0.001 * bitsPerSlot ); #ifdef USE_WINTHREAD /* Why is it different? */ whole_SpF = (int) (avg_slots_per_frame + 1e-5); #else whole_SpF = (int) avg_slots_per_frame; #endif frac_SpF = avg_slots_per_frame - (float)whole_SpF; slot_lag = -frac_SpF; l3_side.padding = 1; if (fabs(frac_SpF) < 1e-9) l3_side.padding = 0; check_ms_stereo =( gl.mode == MPG_MD_JOINT_STEREO && !force_ms && gl.version == 1 && gl.stereo == 2 ); old_bitrate = l3_side.rate_idx; force_jointstereo = check_ms_stereo; // 最初の1フレーム目だけ // memset( &l3_sb_sample, 0, sizeof( l3_sb_sample ) ); } #if defined(USE_PTHREAD) loop: iread = get_audio( musicin, frmBuffer ); if( !iread ){ pthread_mutex_unlock(&mutex_frames); return (void *)-1; } pthread_mutex_lock(&mutex_mfbuf); pthread_mutex_unlock(&mutex_frames); #elif defined(USE_BTHREAD) loop: if(intReadThreadPriority) { iread = get_audio_thread( musicin, frmBuffer ); } else { iread = get_audio( musicin, frmBuffer ); } if( !iread ){ curthread--; write_port_etc(port_frames,frameNum,0,0,B_TIMEOUT,0); release_sem(mutex_frames); return NULL; } write_port_etc(port_frames,frameNum++,0,0,B_TIMEOUT,0); acquire_sem(mutex_mfbuf); release_sem(mutex_frames); #elif !defined(USE_WINTHREAD) && !defined(USE_OS2THREAD) #ifdef WIN32 { SAMPLES_T iread = get_audio( musicin, frmBuffer ); if( iread == SAMPLES_PAUSED ){ return 1; } else if( iread != SAMPLES_READ ){ return -1; } } #else iread = get_audio( musicin, frmBuffer ); if( !iread ){ return -1; } #endif #endif /* shiftin前にfrmBufferに対して演算を行っても意味は変わらない */ /* mfbuf先頭576要素は前のフレームで stereo -> mid/side 変換が済んでるので */ if( force_ms ){ for( i = 0; i < gl.frameSize; i++ ){ int mid = (frmBuffer[i*2+0] + frmBuffer[i*2+1])/2; /* shiftでも構わない */ int side= (frmBuffer[i*2+0] - frmBuffer[i*2+1])/2; frmBuffer[i*2 + 0] = mid; frmBuffer[i*2 + 1] = side; } } /* 576+EXTRADELAY だけ遅らせて新しい標本に shift in */ /* EXTRADELAY is used in l3psya.nas */ if(frame_shiftin_multi != (void (*)(int (*)[1784], short *, float (*)[1664], int , int))NULL){ mfbuf = (int (*)[1152+576+EXTRADELAY])ALIGN(__mfbuf,32); sbd_work = (float (*)[1152+HAN_SIZE])ALIGN(__sbd_work,32); frame_shiftin_multi(mfbuf, frmBuffer, sbd_work, gl.mode_gr, gl.stereo); }else{ #if 1 frame_shiftin( (int *)mfbuf, (short *)frmBuffer, gl.frameSize, gl.stereo); #else for( ch = 0; ch < gl.stereo; ch++ ){ for( i = 0; i < 576 + EXTRADELAY; i++ ){ mfbuf[ch][i] = mfbuf[ch][i+gl.frameSize]; } } if(gl.stereo == 2){ for( i = 0; i < gl.frameSize; i++ ){ mfbuf[0][i+576+EXTRADELAY] = frmBuffer[i*2 + 0]; mfbuf[1][i+576+EXTRADELAY] = frmBuffer[i*2 + 1]; } }else{ for( i = 0; i < gl.frameSize; i++ ){ mfbuf[0][i+576+EXTRADELAY] = frmBuffer[i]; } } #endif } #if defined(USE_WINTHREAD) SetEvent( private_data->hLeaveFrame ) ; #endif #if defined(USE_OS2THREAD) if( ISMULTI() ){ DosPostEventSem( private_data->hLeaveFrame ) ; } #endif #if defined(MT_ENCODER) L_l3_side.padding = -1; /* 削除不可 */ #endif if( !VBR ){ if( frac_SpF ){ float temp = frac_SpF - 1; if( slot_lag > temp ){ slot_lag -= frac_SpF; #if defined(MT_ENCODER) L_l3_side.padding = 0; // defered update #else l3_side.padding = 0; #endif }else{ slot_lag -= temp; #if defined(MT_ENCODER) L_l3_side.padding = 1; // defered update #else l3_side.padding = 1; #endif } } } /***************************** Layer 3 ********************************** * mfbuf contains 3 granules: [0 1 2 ] * encoder will encode granules 0 1 * psy-model will be fed granules 1 2, and because of its 1 granule delay * it will return thresholds for granules 0 1 */ if( !fast_mode ){ /* psychoacoustic model * psy model adds a 544 delay to sync with the filterbanks * in addition to this delay, it also adds a 1 granule (576) delay * that we must compensate for (mt 6/99). */ int *bufp[2]; /* address of beginning of left & right granule */ for( gr = 0; gr < gl.mode_gr; gr++ ){ bufp[0] = &mfbuf[0][576 + gr*576]; if( gl.stereo == 2 ){ bufp[1] = &mfbuf[1][576 + gr*576]; } L3psycho_anal( bufp, check_ms_stereo, &ms_ener_ratio[gr], ratio.l[gr], ratio.s[gr], pe[gr], blocktype[gr]); L_l3_side.gr[gr].ch[0].tt.block_type=blocktype[gr][0]; if( gl.stereo == 2 ){ L_l3_side.gr[gr].ch[1].tt.block_type=blocktype[gr][1]; } } }else{ for( gr = 0; gr < gl.mode_gr; gr++ ){ blocktype[gr][0] = NORM_TYPE; L_l3_side.gr[gr].ch[0].tt.block_type = blocktype[gr][0]; pe[gr][0] = 700; if( gl.stereo == 2 ){ blocktype[gr][1] = NORM_TYPE; L_l3_side.gr[gr].ch[1].tt.block_type = blocktype[gr][1]; pe[gr][1] = 700; } } } #if defined(USE_PTHREAD) pthread_mutex_lock(&mutex_l3_sb_sample); sbd_shiftin(mfbuf, gl.stereo, gl.mode_gr); pthread_mutex_unlock(&mutex_mfbuf); #elif defined(USE_WINTHREAD) EnterCriticalSection(&mutex_l3_sb_sample); sbd_shiftin(mfbuf, gl.stereo, gl.mode_gr); LeaveCriticalSection( &mutex_mfbuf ); #elif defined(USE_OS2THREAD) if( ISMULTI() ){ DosRequestMutexSem(mutex_l3_sb_sample, -1); sbd_shiftin(mfbuf, gl.stereo, gl.mode_gr); DosReleaseMutexSem( mutex_mfbuf ); } else { sbd_shiftin(mfbuf, gl.stereo, gl.mode_gr); } #elif defined(USE_BTHREAD) acquire_sem(mutex_l3_sb_sample); sbd_shiftin(mfbuf, gl.stereo, gl.mode_gr); release_sem(mutex_mfbuf); #else sbd_shiftin(mfbuf, gl.stereo, gl.mode_gr); #endif window_filter_subband( sbd_work[0], (*l3_sb_sample)[0][1][0], gl.mode_gr ); if( gl.stereo == 2 ){ window_filter_subband( sbd_work[1], (*l3_sb_sample)[1][1][0], gl.mode_gr); } /* MDCTを多重位相出力に適用 */ mdct_sub( l3_sb_sample, xr, gl.stereo, &L_l3_side, gl.mode_gr ); #if defined(USE_PTHREAD) pthread_mutex_lock(&mutex_l3_side); pthread_mutex_unlock(&mutex_l3_sb_sample); #elif defined(USE_WINTHREAD) EnterCriticalSection(&mutex_l3_side); LeaveCriticalSection(&mutex_l3_sb_sample); #elif defined(USE_OS2THREAD) if( ISMULTI() ){ DosRequestMutexSem(mutex_l3_side, -1); DosReleaseMutexSem(mutex_l3_sb_sample); } #elif defined(USE_BTHREAD) acquire_sem(mutex_l3_side); release_sem(mutex_l3_sb_sample); #endif #ifdef USE_VBR if( VBR ){ float pe_sum_old; pe_sum_old = VBR_pe_sum; VBR_pe_sum = 0; for( gr = 0; gr < gl.mode_gr; gr++ ){ VBR_pe_sum += pe[gr][0]; if( gl.stereo == 2 ) VBR_pe_sum += pe[gr][1]; } /* for VBR, what bitrate should we try first? */ l3_side.rate_idx = old_bitrate - 1; if( abs( pe_sum_old - VBR_pe_sum ) > 200 ){ if( pe_sum_old > VBR_pe_sum ) l3_side.rate_idx--; } if( l3_side.rate_idx < VBR_min_rate_idx ){ l3_side.rate_idx = VBR_min_rate_idx; }else if( l3_side.rate_idx > VBR_max_rate_idx ){ l3_side.rate_idx = VBR_max_rate_idx; } } #endif /* USE_VBR */ /* block type flags */ for( gr = 0; gr < gl.mode_gr; gr++ ){ for ( ch = 0; ch < gl.stereo; ch++ ){ gr_info *cod_info = &l3_side.gr[gr].ch[ch].tt; // cod_info->mixed_block_flag = 0; /* never used by this model */ cod_info->block_type = blocktype[gr][ch]; if (cod_info->block_type == NORM_TYPE ) cod_info->window_switching_flag = 0; else cod_info->window_switching_flag = 1; } } /* data was scaled by 1/2. fix so effectively it was scaled by 1/sqrt(2) */ if( force_ms ){ for( gr = 0; gr < gl.mode_gr; gr++ ){ for( ch = 0; ch < gl.stereo; ch++ ){ for(i =0 ; i< 576; i++ ){ xr[gr][ch][i] *= (float)SQRT2; } } } } /* 各チャンネルで block tye が同じか確かめる */ #if defined(MT_ENCODER) if(L_l3_side.padding >= 0) l3_side.padding = L_l3_side.padding; // update at here #endif #ifdef PENMS l3_side.mode_ext = 0; if( force_ms || fast_mode ){ // 和ch=66.6% / 差ch=33.3% (frac = 0.33) としておく ms_ener_ratio[0] = msstereo_ratio; ms_ener_ratio[1] = msstereo_ratio; } #else l3_side.mode_ext = 0; if( force_ms || fast_mode ){ ms_ener_ratio[0] = 0.25; ms_ener_ratio[1] = 0.25; } #endif #ifdef PENMS if( !force_jointstereo ) { if( check_ms_stereo && l3_side.gr[0].ch[0].tt.block_type == l3_side.gr[0].ch[1].tt.block_type && l3_side.gr[1].ch[0].tt.block_type == l3_side.gr[1].ch[1].tt.block_type && ms_ener_ratio[0] + ms_ener_ratio[1] < msstereo_threshold ){ // Setting::ms stereo l3_side.mode_ext = MPG_MD_MS_LR; ms_ener_ratio[0] = Min( ms_ener_ratio[0], 0.5 ); ms_ener_ratio[1] = Min( ms_ener_ratio[1], 0.5 ); } else { // Setting::Joint Stereo } }else{ force_jointstereo = 0; } #else if( check_ms_stereo && l3_side.gr[0].ch[0].tt.block_type == l3_side.gr[0].ch[1].tt.block_type && l3_side.gr[1].ch[0].tt.block_type == l3_side.gr[1].ch[1].tt.block_type && ms_ener_ratio[0] + ms_ener_ratio[1] < msstereo_threshold ){ l3_side.mode_ext = MPG_MD_MS_LR; ms_ener_ratio[0] = Min( ms_ener_ratio[0], 0.5 ); ms_ener_ratio[1] = Min( ms_ener_ratio[1], 0.5 ); } #endif #ifdef USE_VBR if( VBR ){ VBR_iteration_loop( pe, ms_ener_ratio, xr, &ratio, &l3_side, l3_enc, &scalefac ); }else #endif /* USE_VBR */ { iteration_loop( pe, ms_ener_ratio, xr, &ratio, &l3_side, l3_enc, &scalefac ); } /* flag for our ms_stereo with psy-model on mid & side channels */ if( force_ms ) l3_side.mode_ext = MPG_MD_MS_LR; /* bitstream に frame を書きだす */ getframebits(&bitsPerFrame,&mean_bits,l3_side.rate_idx,l3_side.padding); #if defined(USE_PTHREAD) pthread_mutex_lock(&mutex_fmt_bitstm); L_l3_side = l3_side; pthread_mutex_unlock(&mutex_l3_side); III_format_bitstream( bitsPerFrame, l3_enc, &L_l3_side, &scalefac ); /* III_format_bitstream() 内で参照され更新されるようだ */ /* だから、たぶん、mutex_l3_side の外で更新しても大丈夫 */ l3_side.main_data_begin = L_l3_side.main_data_begin; /* なお、l3_side のそれ以外のメンバはここでは参照のみ */ #elif defined(USE_WINTHREAD) EnterCriticalSection(&mutex_fmt_bitstm); L_l3_side = l3_side; LeaveCriticalSection( &mutex_l3_side); III_format_bitstream( bitsPerFrame, l3_enc, &L_l3_side, &scalefac ); l3_side.main_data_begin = L_l3_side.main_data_begin; #elif defined(USE_OS2THREAD) if( ISMULTI() ) DosRequestMutexSem(mutex_fmt_bitstm, -1); L_l3_side = l3_side; if( ISMULTI() ) DosReleaseMutexSem( mutex_l3_side); III_format_bitstream( bitsPerFrame, l3_enc, &L_l3_side, &scalefac ); l3_side.main_data_begin = L_l3_side.main_data_begin; #elif defined(USE_BTHREAD) acquire_sem(mutex_fmt_bitstm); L_l3_side = l3_side; release_sem(mutex_l3_side); III_format_bitstream( bitsPerFrame, l3_enc, &L_l3_side, &scalefac ); l3_side.main_data_begin = L_l3_side.main_data_begin; #else III_format_bitstream( bitsPerFrame, l3_enc, &l3_side, &scalefac ); #endif if( g_bWriteVbrTag ){ unsigned long frameBits; frameBits = sstell( ) - sentBits; sentBits += frameBits; AddVbrFrame( sentBits / 8 ); } if( outstream_nonbufferd ) empty_buffer(); #if defined(USE_PTHREAD) if(private_data != NULL){ (*private_data->frameNum)++; pthread_mutex_unlock(&mutex_fmt_bitstm); /* 処理終了*/ pthread_mutex_lock(&mutex_frames); /* 処理開始 */ /* 2周目以降、初期値が設定されることを期待している変数 */ force_jointstereo = 0; ms_ener_ratio[0] = ms_ener_ratio[1] = 0.0; goto loop; }else{ pthread_mutex_unlock(&mutex_fmt_bitstm); /* 処理終了*/ return NULL; } #elif defined(USE_WINTHREAD) tprintf("%d : Leave Thread \n", private_data->tid ); LeaveCriticalSection(&mutex_fmt_bitstm); /* 処理終了*/ curthread --; SetEvent( private_data->hWaitEncoding ); // 待機状態に入る WaitForSingleObject( private_data->hEnterFrame, INFINITE ); ResetEvent( private_data->hWaitEncoding ); // 待機状態から抜ける ResetEvent( private_data->hEnterFrame ); /* 2周目以降、初期値が設定されることを期待している変数 */ force_jointstereo = 0; ms_ener_ratio[0] = ms_ener_ratio[1] = 0.0; if( !private_data->finthread ) goto loop; tprintf("%d : Stop Thread \n", private_data->tid ); SetEvent( private_data->hExistThread ); return 0; #elif defined(USE_OS2THREAD) if( ISMULTI() ){ ULONG resetcount; tprintf("%d : Leave Thread \n", private_data->tid ); DosReleaseMutexSem(mutex_fmt_bitstm); /* 処理終了*/ curthread --; DosPostEventSem( private_data->hWaitEncoding ); // 待機状態に入る DosWaitEventSem( private_data->hEnterFrame, -1 ); DosResetEventSem( private_data->hWaitEncoding, &resetcount ); // 待機状態から抜ける DosResetEventSem( private_data->hEnterFrame, &resetcount ); /* 2周目以降、初期値が設定されることを期待している変数 */ force_jointstereo = 0; ms_ener_ratio[0] = ms_ener_ratio[1] = 0.0; if( !private_data->finthread ) goto loop; tprintf("%d : Stop Thread \n", private_data->tid ); DosPostEventSem( private_data->hExistThread ); } return 0; #elif defined(USE_BTHREAD) release_sem(mutex_fmt_bitstm); /* 処理終了*/ acquire_sem(mutex_frames); /* 処理開始 */ /* 2周目以降、初期値が設定されることを期待している変数 */ force_jointstereo = 0; ms_ener_ratio[0] = ms_ener_ratio[1] = 0.0; goto loop; #else /* defined(ST_ENCODER) */ return 0; #endif } #if !defined(MUSENC_PASS2) MERET EXPORT MPGE_closeCoder() { /* clean up if we were producing an mp3 file */ if( musicin ){ #if defined( USE_WINTHREAD ) if( ISMULTI() ){ int i; /* 生成したスレッドがすべて停止したことを確認 */ for(i = nCPU - 1 /*NTHREADS - 1*/; i >= 0 ; i--){ WaitForSingleObject( encodeframe_arg[i].hWaitEncoding, INFINITE ); // フレームにデータが来るのを待つ } /* スレッドの後始末 */ } #elif defined( USE_OS2THREAD ) if( ISMULTI() ){ int i; /* 生成したスレッドがすべて停止したことを確認 */ for(i = NTHREADS - 1; i >= 0 ; i--){ DosWaitEventSem( encodeframe_arg[i].hWaitEncoding, -1 ); // フレームにデータが来るのを待つ } /* スレッドの後始末 */ } #endif III_FlushBitstream(); close_bit_stream_w(); if( ISUSERFUNCIN() ) mc_userfunc.pUserFunc( NULL, 0 ); else if( !bInputStdio ) fclose(musicin); musicin = NULL; /* 出力がファイルの時のみ処理する */ if( mc_userStore == MPGE_NULL_FUNC && !bOutputStdio ){ #define fwritestream(var) fwrite(&(var), sizeof(var), 1, stream) switch( outputFormat ) { case MC_OUTPUT_NORMAL: if( g_bWriteVbrTag ){ int nQuality=VBR_q*100/9; PutVbrTag(szOutFile,nQuality); /* ここで出力ファイルを再度openする(要注意) */ } break; case MC_OUTPUT_RIFF_WAVE: { struct CK_WAVE header; FILE* stream; int fileSize; int dataSize; stream=fopen(szOutFile,"rb+"); if (stream==NULL) return ME_OUTFILE_NOFOUND; fseek(stream, 0, SEEK_END); fileSize = ftell(stream); dataSize = fileSize-outputOffset; if( fileSize % 2 ) { fputc(0, stream); fileSize++; } fseek(stream, 0, SEEK_SET); memmove( &(header.riff.chunk), "RIFF", 4); header.riff.size = fileSize-8; if( riffInfosLen ) { header.riff.size += riffInfosLen+12; } memmove( &(header.riff.form), "WAVE", 4); memmove( &(header.fmt.chunk), "fmt ", 4); header.fmt.size = SizeOfCkFmt-8; header.fmt.formatID = 0x55; header.fmt.num_of_channel = (gl.mode == MPG_MD_MONO) ? 1 : 2; header.fmt.srate = gl.enc_freqHz; header.fmt.avg_bytes_per_sec = VBR ? 1.0*(fileSize-outputOffset)*gl.enc_freqHz/(1.0*totalframes*gl.frameSize) : gl.rate_kbps*1000/8; header.fmt.block_size = 1; header.fmt.bits_per_sample = 0; header.fmt.cbSize = 12; header.fmt.wID = 1; header.fmt.fdwFlags = 2; header.fmt.nBlockSize = VBR ? 144.0*320000/gl.enc_freqHz : 144.0*gl.rate_kbps*1000/gl.enc_freqHz; header.fmt.nFramesPerBlock = 1; header.fmt.nCodecDelay = 0x0571; memmove( &(header.fact.chunk), "fact", 4); header.fact.size = SizeOfCkFact-8; header.fact.num_of_sample = totalframes*gl.frameSize; memmove( &(header.data.chunk), "data", 4); header.data.size = dataSize; fwritestream(header.riff.chunk); fwritestream(header.riff.size); fwritestream(header.riff.form); fwritestream(header.fmt.chunk); fwritestream(header.fmt.size); fwritestream(header.fmt.formatID); fwritestream(header.fmt.num_of_channel); fwritestream(header.fmt.srate); fwritestream(header.fmt.avg_bytes_per_sec); fwritestream(header.fmt.block_size); fwritestream(header.fmt.bits_per_sample); fwritestream(header.fmt.cbSize); fwritestream(header.fmt.wID); fwritestream(header.fmt.fdwFlags); fwritestream(header.fmt.nBlockSize); fwritestream(header.fmt.nFramesPerBlock); fwritestream(header.fmt.nCodecDelay); fwritestream(header.fact.chunk); fwritestream(header.fact.size); fwritestream(header.fact.num_of_sample); fwritestream(header.data.chunk); fwritestream(header.data.size); if( g_bWriteVbrTag ){ int nVBRTagSize; BYTE pbtBuffer[216]; int nQuality=VBR_q*100/9; nVBRTagSize = PutVbrTagStream( (char *)pbtBuffer, nQuality, dataSize, gl.freq_idx); fwrite(pbtBuffer, nVBRTagSize, 1, stream); } if( riffInfosLen ) { struct CK_LIST list; fseek(stream, 0, SEEK_END); memmove(&(list.chunk), "LIST", 4); list.size = riffInfosLen+4; memmove( &(list.form), "INFO", 4); fwritestream(list.chunk); fwritestream(list.size); fwritestream(list.form); fwrite(pRiffInfos, riffInfosLen, 1, stream); } fclose(stream); } break; case MC_OUTPUT_RIFF_RMP: { struct CK_RMP header; FILE* stream; int fileSize; int dataSize; stream=fopen(szOutFile,"rb+"); if (stream==NULL) return ME_OUTFILE_NOFOUND; fseek(stream, 0, SEEK_END); fileSize = ftell(stream); dataSize = fileSize-outputOffset; if( fileSize % 2 ) { fputc(0, stream); fileSize++; } fseek(stream, 0, SEEK_SET); memmove( &(header.riff.chunk), "RIFF", 4); header.riff.size = fileSize-8; if( riffInfosLen ) { header.riff.size += riffInfosLen+12; } memmove( &(header.riff.form), "RMP3", 4); memmove( &(header.data.chunk), "data", 4); header.data.size = dataSize; fwritestream(header.riff.chunk); fwritestream(header.riff.size); fwritestream(header.riff.form); fwritestream(header.data.chunk); fwritestream(header.data.size); if( g_bWriteVbrTag ){ int nVBRTagSize; BYTE pbtBuffer[216]; int nQuality=VBR_q*100/9; nVBRTagSize = PutVbrTagStream( (char *)pbtBuffer, nQuality, dataSize, gl.freq_idx); fwrite(pbtBuffer, nVBRTagSize, 1, stream); } if( riffInfosLen ) { struct CK_LIST list; fseek(stream, 0, SEEK_END); memmove(&(list.chunk), "LIST", 4); list.size = riffInfosLen+4; memmove( &(list.form), "INFO", 4); fwritestream(list.chunk); fwritestream(list.size); fwritestream(list.form); fwrite(pRiffInfos, riffInfosLen, 1, stream); } fclose(stream); } break; } #undef fwritestream } else /* by kazumi-t@ss.iij4u.or.jp */ if( mc_userStore != MPGE_NULL_FUNC && bOutputVBR_userfunc ){ /* ストリーム入力の時もVBRTagを書きこみたい kazumi-t@ss.iij4u.or.jp * mc_userStore( NULL, 0 ); この呼出時にコールバックされる側は * ファイルポインタを先頭へシークする(戻り値はファイルサイズ)。 */ if( g_bWriteVbrTag ){ int nVBRTagSize; long lFileSize; BYTE pbtBuffer[216]; int nQuality=VBR_q*100/9; /* ファイルポインタを先頭にシーク */ if( 0 < (lFileSize = mc_userStore( NULL, 0)) ){ nVBRTagSize = PutVbrTagStream( (char *)pbtBuffer, nQuality, lFileSize, gl.freq_idx); mc_userStore( pbtBuffer, nVBRTagSize ); // write TAG mc_userStore( NULL, 0 ); // to close } } } } return ME_NOERR; } #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) void term( MERET err) { #ifdef USE_LONGJMP #if defined( USE_WINTHREAD ) || defined ( USE_OS2THREAD ) if( error_notify != ME_NOERR ) return; error_notify = err; #endif if( ISMULTI() ){ // このスレッドは停止させる return; } else { longjmp( _longjmp_ptr, err); } #else #ifdef DONT_USE_LONGJMP const char *msg = NULL; if( err < ME_INTERNALERROR ) return; // 停止エラーではない switch ( err ){ case ME_PARAMERROR: msg = getMsg( MSG_ME_PARAMERROR ); break; case ME_NOFPU: msg = getMsg( MSG_ME_NOFPU ); break; case ME_INFILE_NOFOUND: msg = getMsg( MSG_ME_INFILE_NOFOUND ); break; case ME_OUTFILE_NOFOUND: msg = getMsg( MSG_ME_OUTFILE_NOFOUND ); break; case ME_BITRATEERROR: msg = getMsg( MSG_ME_BITRATEERROR ); break; case ME_WAVETYPE_ERR: msg = getMsg( MSG_ME_WAVETYPE_ERR ); break; case ME_WRITEERROR: msg = getMsg( MSG_ME_WRITEERROR ); break; default: msg = getMsg( MSG_ME_INTERNALERROR ); break; } fprintf( stderr, "\n\n%s\n", msg ); exit( err ); #else #error "define *_LONGJMP" #endif /* DONT_USE_LONGJMP */ #endif /* USE_LONGJMP */ } void term2(int rval, const char *lpszFile, int line ) { #ifdef _WINDOWS char buf[1024]; wsprintf( buf, "terminated on %s line %d / err = %d\n", lpszFile, line, rval ); MessageBox( NULL, buf, "GOGO2DLL", MB_OK ); #else fprintf( stderr, "terminated on %s line %d / err = %d\n", lpszFile, line, rval ); #endif term( rval ); } #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) MERET EXPORT MPGE_getUnitStates( unsigned long *pUnit ) { static unsigned long unit = 0; if( unit == 0 ){ #if defined( WIN32 ) && defined( _WINDOWS ) unit = haveUNIT(); if( unit & tSSE ){ __try { setPIII_round(); } __except(EXCEPTION_EXECUTE_HANDLER) { unit &= ~tSSE; } } #else unit = haveUNIT(); if( unit & tSSE ){ MERET jmpval; jmpval = setjmp( _longjmp_ptr ); if( !jmpval ){ signal(SIGILL,SSE_not_support); setPIII_round(); signal(SIGILL,SIG_DFL); } else { unit &= ~tSSE; } } #endif } *pUnit = unit; return ME_NOERR; } #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) #ifdef GOGO_DLL_EXPORTS MERET EXPORT MPGE_getVersion( unsigned long *vercode, char *verstring ) { *vercode = VERSION_NUM; strcpy( verstring, VERSION ); return ME_NOERR; } #ifdef WIN32 /* FUNCTION EXPORT FOR VISUAL BASIC */ typedef MERET (__stdcall *MPGE_CALLBACK_VB)( void *, unsigned long ); static MPGE_CALLBACK_VB g_src_cbfunc; static MPGE_CALLBACK_VB g_dst_cbfunc; static MERET __cdecl mpge_src_cbfunc( void *buf, unsigned long nLength ) { if( g_src_cbfunc ) return g_src_cbfunc( buf, nLength ); return ME_INTERNALERROR; } static MERET __cdecl mpge_dst_cbfunc( void *buf, unsigned long nLength ) { if( g_dst_cbfunc ) return g_dst_cbfunc( buf, nLength ); return ME_INTERNALERROR; } MERET EXPORT_VB MPGE_initializeWorkVB() { g_src_cbfunc = NULL; g_dst_cbfunc = NULL; return MPGE_initializeWork(); } MERET EXPORT_VB MPGE_setConfigureVB(MPARAM mode, UPARAM dwPara1, UPARAM dwPara2 ) { if( mode == MC_INPUTFILE ){ // コールバック登録の場合 if( dwPara1 == MC_INPDEV_USERFUNC ){ struct MCP_INPDEV_USERFUNC func = *((struct MCP_INPDEV_USERFUNC *)dwPara2); g_src_cbfunc = (MPGE_CALLBACK_VB)func.pUserFunc; func.pUserFunc = mpge_src_cbfunc; return MPGE_setConfigure( mode, dwPara1, (UPARAM)&func ); } } else if( mode == MC_OUTPUTFILE){ // コールバック登録の場合 if( dwPara1 == MC_OUTDEV_USERFUNC || dwPara1 == MC_OUTDEV_USERFUNC_WITHVBRTAG ){ g_dst_cbfunc = (MPGE_CALLBACK_VB)dwPara2; dwPara2 = (UPARAM)&mpge_dst_cbfunc; return MPGE_setConfigure( mode, dwPara1, dwPara2 ); } } return MPGE_setConfigure( mode, dwPara1, dwPara2 ); } MERET EXPORT_VB MPGE_getConfigureVB(MPARAM mode, void *para1 ) { return MPGE_getConfigure( mode, para1 ); } MERET EXPORT_VB MPGE_detectConfigureVB() { return MPGE_detectConfigure(); } MERET EXPORT_VB MPGE_processFrameVB() { return MPGE_processFrame(); } MERET EXPORT_VB MPGE_closeCoderVB() { return MPGE_closeCoder(); } MERET EXPORT_VB MPGE_endCoderVB() { return MPGE_endCoder(); } MERET EXPORT_VB MPGE_getUnitStatesVB( unsigned long *unit ) { return MPGE_getUnitStates( unit ); } MERET EXPORT_VB MPGE_processTrackVB(int *frameNum) { return MPGE_processTrack( frameNum ); } MERET EXPORT_VB MPGE_getVersionVB( unsigned long *vercode, char *verstring ) { return MPGE_getVersion( vercode, verstring ); } #endif #endif #endif /* !defined(MUSENC_PASS2) */ #if !defined(MUSENC_PASS2) /* pass 2 for defining the single thread function */ #if defined(USE_PTHREAD) /* multithreaded functions are defined in pass 1. */ #undef USE_PTHREAD #define MUSENC_PASS2 #include "musenc.c" #endif /* BeOS */ #if defined(USE_BTHREAD) /* multithreaded functions are defined in pass 1. */ #undef USE_BTHREAD #define MUSENC_PASS2 #include "musenc.c" #endif /* Windows */ #if defined(USE_WINTHREAD) /* multithreaded functions are defined in pass 1. */ #undef USE_WINTHREAD #define MUSENC_PASS2 #include "musenc.c" #endif #endif gogo239b/common.h100644 23421 144 6653 7220537347 13012 0ustar shigeousers/* * for new GOGO-no-coda (1999, 2000) * modified by shigeo, PEN@MarineCat */ #ifndef COMMON_DOT_H #define COMMON_DOT_H /* * バージョンコードはここに記入する */ #define VERSION_NUM 0x239 #ifdef BENCH_ONLY #define VERSION "ver. 2.39 for only bench" #else #define VERSION "ver. 2.39 (" __DATE__ ")" #endif /* deal with path including Japanese characters */ #define JAPANESE_SPC /* * WIN32でのwaringの抑制 */ #ifdef WIN32 #ifdef _MSC_VER #pragma warning( disable : 4305 ) /* const double->float 変換 */ #pragma warning( disable : 4244 ) /* double->float 変換 */ #pragma warning( disable : 4761 ) /* 仮引数と実引数の型が異なる */ #pragma warning( disable : 4018 ) /* signed/unsigned間の比較 */ #endif #endif #include #include #include #include #ifdef __unix__ #include #endif #ifdef __GNUC__ #define INLINE inline #else #define INLINE #endif #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifndef PI #define PI 3.14159265358979 #endif #define SQRT2 1.414213562373095 #define MONO 1 #define STEREO 2 #define HAN_SIZE 512 #define SCALE 32768 #define SCALER (1/32768.) /* 1/SCALE */ /* MPEG Header Definitions - Mode Values */ #define MPG_MD_STEREO 0 #define MPG_MD_JOINT_STEREO 1 #define MPG_MD_DUAL_CHANNEL 2 #define MPG_MD_MONO 3 /* Mode Extention */ #define MPG_MD_MS_LR 2 #ifndef NUL #define NUL '\0' #endif #ifndef NOERR #define NOERR 0 #define ERR 1 #endif #define Min(A, B) ((A) < (B) ? (A) : (B)) #define Max(A, B) ((A) > (B) ? (A) : (B)) #ifdef WIN32 # define MAX_FILE_LEN 260 #elif BeOS # define MAX_FILE_LEN 1024 #else # define MAX_FILE_LEN 256 #endif #include "l3side.h" extern int bitsPerFrame_table[15][2]; extern int mean_bits_table[15][2]; #define getframebits( bitsPerFrame, mean_bits, _br, _padding ) \ {\ int br = (_br), padding = (_padding);\ \ *(bitsPerFrame) = bitsPerFrame_table[br][padding];\ *(mean_bits) = mean_bits_table[br][padding];\ } void framebitstable_init(void); int get_freq_idx(int freqHz, int *version); int get_rate_idx(int rate_kbps, int version); void *mem_alloc(unsigned long block,char *item); void mem_free(void **ptr_addr); void memFreeChk(void); int WAV_checkFMT(FILE *fp, int *size, int *bit, int *freq, int *channel); void term(int rval ); void term2(int rval, const char *lpszFile, int line ); int NormalizeSmpFreq(long freqHz); /* exitの代用としてTERMを呼ぶこと */ #ifdef NDEBUG #define TERM(x) term(x) #else #define TERM(x) term2(x, __FILE__, __LINE__ ) #endif /* * エラー表示 */ void disp_err( const char *mesg, ... ); /* * 最適化チェック用 rdtcsが使えなければ例外を起こす!!! * clockを計りたい部分をclkbegin(),clkend()で挟む */ void clkbegin(void); void clkend(void); #ifdef _MAIN_C #define EXT #define VAL(x,y) x=y #else #define EXT extern #define VAL(x,y) x #endif EXT int VAL( nid3taglen, 0 ); // refer bitstrem.c EXT char VAL( *pid3tag, 0 ); // refer bitstrem.c EXT struct GLOBAL_VAR{ int stereo; int mode_gr; int version; int frameSize; /* = ( version ) ? 1152 : 576 */ int freq_idx; /* index for table */ int inp_freqHz; /* input freq Hz ex. 44100 */ int enc_freqHz; /* encode freq Hz ex. 44100 */ int rate_kbps; /* ex. 128(kbps) */ /* for header */ int extension; int mode; int emphasis; }gl; /* global variables */ #undef EXT #undef VAL #endif /* COMMON_H */ gogo239b/l3bs_old.c100644 23421 144 41317 7220537347 13232 0ustar shigeousers/* * for new GOGO-no-coda (1999/09) * modified by shigeo * renewed by sakai (2000/02) */ extern const int *scalefac_long; extern const int *scalefac_short; #include #include #include #include "l3bs.h" /* the public interface */ #include "l3psy.h" #include "mdct.h" #include "loop.h" #include "huffman.h" #include "bitstrem.h" /* for putbits() */ /* globals */ /* export to putbits.nas */ int BitCount = 0; int BitsRemaining = 0; void write_main_data_with_side_info(unsigned int val, unsigned int nbits); static int ThisFrameSize = 0; static int elements, forwardFrameLength, forwardSILength; typedef struct side_info_link { struct side_info_link *next; int frameLength; int SILength; III_side_info_t l3_side; } side_info_link; static struct side_info_link *side_queue_head = NULL; static struct side_info_link *side_queue_free = NULL; /* forward declarations */ static void store_side_info(III_side_info_t *si, int bitsPerFrame); static void free_side_queues(void); static side_info_link *get_side_info(void); static void encodeMainData(int l3_enc[2][2][576], III_side_info_t *si, III_scalefac_t *scalefac); static void Huffmancodebits(int *ix, gr_info *gi ); static void drain_into_ancillary_data( int lengthInBits ); void InitFormatBitStream(void) { BitCount = 0; ThisFrameSize = 0; BitsRemaining = 0; elements = 0; forwardFrameLength = 0; forwardSILength = 0; side_queue_head = NULL; side_queue_free = NULL; } void III_format_bitstream(int bitsPerFrame, int l3_enc[2][2][576], III_side_info_t *l3_side, III_scalefac_t *scalefac) { /* BitStreamFrame is the public interface to the bitstream formatting package. It writes one frame of main data per call. Assumptions: - The back pointer is zero on the first call - An integral number of bytes is written each frame You should be able to change the frame length, side info length, #channels, #granules on a frame-by-frame basis. */ /* save SI and compute its length */ store_side_info(l3_side, bitsPerFrame); /* encode & write the main data, inserting SI to maintain framing */ encodeMainData(l3_enc, l3_side, scalefac); if (l3_side->resvDrain){ drain_into_ancillary_data(l3_side->resvDrain); } /* Caller must ensure that back SI and main data are an integral number of bytes, since the back pointer can only point to a byte boundary and this code does not add stuffing bits */ /* we set this here -- it will be tested in the next loops iteration */ l3_side->main_data_begin = (BitsRemaining >> 3) + (forwardFrameLength >> 3) - (forwardSILength >> 3); } /* WriteMainDataBits()はものすごい回数呼ばれるのでインライン展開 */ /* nbits != 0 であること。 */ /* static void WriteMainDataBits( unsigned val, unsigned nbits ); */ #define WriteMainDataBits(_val,_nbits) \ { \ unsigned val=(_val), nbits=(_nbits); \ assert( ( 0 < nbits) && (nbits <= 32) ); \ if( nbits > BitsRemaining ){ \ write_main_data_with_side_info(val, nbits); \ }else{ \ putbits( val, nbits ); \ BitCount += nbits; \ BitsRemaining -= nbits; \ } \ assert( BitCount <= ThisFrameSize ); \ assert( BitsRemaining >= 0 ); \ assert( (BitCount + BitsRemaining) == ThisFrameSize ); \ } #define WriteMainDataBits24(_val,_nbits) \ { \ unsigned val=(_val), nbits=(_nbits); \ assert( ( 0 < nbits) && (nbits <= 32) ); \ if( nbits > BitsRemaining ){ \ write_main_data_with_side_info(val, nbits); \ }else{ \ putbits24( val, nbits ); \ BitCount += nbits; \ BitsRemaining -= nbits; \ } \ assert( BitCount <= ThisFrameSize ); \ assert( BitsRemaining >= 0 ); \ assert( (BitCount + BitsRemaining) == ThisFrameSize ); \ } static unsigned slen1_tab[16] = {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4}; static unsigned slen2_tab[16] = {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}; static void encodeMainData(int l3_enc[2][2][576], III_side_info_t *si, III_scalefac_t *scalefac) { int i, gr, ch, sfb, window; int *facl, (*facs)[3]; int tmp; if (gl.version == 1) { /* MPEG 1 */ for (gr = 0; gr < 2; gr++) { for (ch = 0; ch < gl.stereo; ch++) { gr_info *gi = &(si->gr[gr].ch[ch].tt); unsigned slen1 = slen1_tab[gi->scalefac_compress]; unsigned slen2 = slen2_tab[gi->scalefac_compress]; int *ix = &l3_enc[gr][ch][0]; facl = scalefac->l[gr][ch]; facs = scalefac->s[gr][ch]; if (gi->block_type == SHORT_TYPE) { if (slen1) { tmp = facs[0][0]; tmp <<= slen1; tmp |= facs[0][1]; tmp <<= slen1; tmp |= facs[0][2]; tmp <<= slen1; tmp |= facs[1][0]; tmp <<= slen1; tmp |= facs[1][1]; tmp <<= slen1; tmp |= facs[1][2]; WriteMainDataBits24(tmp, slen1 * 6); // max = 4*3*2 tmp = facs[2][0]; tmp <<= slen1; tmp |= facs[2][1]; tmp <<= slen1; tmp |= facs[2][2]; tmp <<= slen1; tmp |= facs[3][0]; tmp <<= slen1; tmp |= facs[3][1]; tmp <<= slen1; tmp |= facs[3][2]; WriteMainDataBits24(tmp, slen1 * 6); // max = 4*3*2 tmp = facs[4][0]; tmp <<= slen1; tmp |= facs[4][1]; tmp <<= slen1; tmp |= facs[4][2]; tmp <<= slen1; tmp |= facs[5][0]; tmp <<= slen1; tmp |= facs[5][1]; tmp <<= slen1; tmp |= facs[5][2]; WriteMainDataBits24(tmp, slen1 * 6); // max = 4*3*2 } if (slen2) { tmp = facs[ 6][0]; tmp <<= slen2; tmp |= facs[ 6][1]; tmp <<= slen2; tmp |= facs[ 6][2]; tmp <<= slen2; tmp |= facs[ 7][0]; tmp <<= slen2; tmp |= facs[ 7][1]; tmp <<= slen2; tmp |= facs[ 7][2]; tmp <<= slen2; tmp |= facs[ 8][0]; tmp <<= slen2; tmp |= facs[ 8][1]; WriteMainDataBits24(tmp, slen2 * 8); // max(slen2)=3 tmp = facs[ 8][2]; tmp <<= slen2; tmp |= facs[ 9][0]; tmp <<= slen2; tmp |= facs[ 9][1]; tmp <<= slen2; tmp |= facs[ 9][2]; tmp <<= slen2; tmp |= facs[10][0]; tmp <<= slen2; tmp |= facs[10][1]; tmp <<= slen2; tmp |= facs[10][2]; tmp <<= slen2; tmp |= facs[11][0]; tmp <<= slen2; tmp |= facs[11][1]; tmp <<= slen2; tmp |= facs[11][2]; WriteMainDataBits(tmp, slen2 * 10); // max(slen2)=3 } } else { if (slen1) { tmp = 0; /* max = 4*6 */ for (sfb = 0; sfb < 6; sfb++) { tmp = facl[sfb] | (tmp<gr[gr].ch[ch].tt); int *ix = &l3_enc[gr][ch][0]; int sfb_partition; assert(gi->sfbTblSub); facl = scalefac->l[gr][ch]; facs = scalefac->s[gr][ch]; if (gi->block_type == SHORT_TYPE) { { for (sfb = 0, sfb_partition = 0; sfb_partition < 4; sfb_partition++) { int sfbs = gi->sfbTblSub[sfb_partition] / 3; int slen = gi->slen[sfb_partition]; if (slen){ for (i = 0; i < sfbs; i++, sfb++){ for (window = 0; window < 3; window++){ WriteMainDataBits(facs[sfb][window], slen); } } } } } } else { for (sfb = 0, sfb_partition = 0; sfb_partition < 4; sfb_partition++) { int sfbs = gi->sfbTblSub[sfb_partition]; int slen = gi->slen[sfb_partition]; if (slen){ for (i = 0; i < sfbs; i++, sfb++){ WriteMainDataBits(facl[sfb], slen); } } } } Huffmancodebits(ix, gi); } /* for ch */ } } /* end of encodeMainData */ /* 153clk -> 96clk by shigeo 00/02/07 */ /* absolute of v, w, x, y <=1 always */ static int L3_huffman_coder_count1(struct huffcodetab *h, int *ix, int count) { int huffbits, len, p; int ret = 0; while( count ){ huffbits = len = p = 0; if (ix[0]) { if (ix[0] < 0) huffbits++; p = 8; len++; } if (ix[1]) { huffbits <<= 1; if (ix[1] < 0) huffbits++; p |= 4; len++; } if (ix[2]) { huffbits <<= 1; if (ix[2] < 0) huffbits++; p |= 2; len++; } if (ix[3]) { huffbits <<= 1; if (ix[3] < 0) huffbits++; p |= 1; len++; } huffbits += h->table[p] << len; /* max of len = 19 + 4 */ len += h->hlen[p]; if( len ) WriteMainDataBits24(huffbits, len); ret += len; ix += 4; count--; } return ret; } /* defined in putbits.nas */ int HuffmanCodePutBits(int table_select, int x,int y); static void Huffmancodebits(int *ix, gr_info * gi) { int region1Start; int region2Start; int bigvalues; int i, x, y, bits, stuffingBits; struct huffcodetab *h; int bitsWritten = 0; /* 1: Write the bigvalues */ bigvalues = gi->big_values * 2; if (bigvalues) { if (gi->block_type == SHORT_TYPE) { int sfb, window, line, start, end; I192_3 *ix_s; ix_s = (I192_3 *) ix; region1Start = 12; region2Start = 576; for (sfb = 0; sfb < 13; sfb++) { unsigned tableindex; start = scalefac_short[sfb]; end = scalefac_short[sfb + 1]; if (start < region1Start) tableindex = gi->table_select[0]; else tableindex = gi->table_select[1]; if (tableindex) { for (window = 0; window < 3; window++) { for (line = start; line < end; line += 2) { x = (*ix_s)[line][window]; y = (*ix_s)[line + 1][window]; bits = HuffmanCodePutBits(tableindex, x, y); bitsWritten += bits; } } } } } else { /* Long blocks */ unsigned scalefac_index; unsigned tableindex; scalefac_index = gi->region0_count + 1; assert(scalefac_index < 23); region1Start = scalefac_long[scalefac_index]; scalefac_index += gi->region1_count + 1; assert(scalefac_index < 23); region2Start = scalefac_long[scalefac_index]; if(region1Start > bigvalues) region1Start = bigvalues; /* get table pointer */ tableindex = gi->table_select[0]; if (tableindex) { for (i = 0; i < region1Start; i += 2) { /* get huffman code */ x = ix[i]; y = ix[i + 1]; bits = HuffmanCodePutBits(tableindex, x, y); bitsWritten += bits; } } if(region2Start > bigvalues) region2Start = bigvalues; /* get table pointer */ tableindex = gi->table_select[1]; if (tableindex) { for (i = region1Start; i < region2Start; i += 2) { /* get huffman code */ x = ix[i]; y = ix[i + 1]; bits = HuffmanCodePutBits(tableindex, x, y); bitsWritten += bits; } } /* get table pointer */ tableindex = gi->table_select[2]; if (tableindex) { for (i = region2Start; i < bigvalues; i += 2) { /* get huffman code */ x = ix[i]; y = ix[i + 1]; bits = HuffmanCodePutBits(tableindex, x, y); bitsWritten += bits; } } } } /* 2: Write count1 area */ assert((gi->count1table_select < 2)); h = &ht[gi->count1table_select + 32]; bitsWritten += L3_huffman_coder_count1(h, &ix[bigvalues], gi->count1 ); stuffingBits = gi->part2_3_length - gi->part2_length - bitsWritten; if (stuffingBits) { int stuffingWords = stuffingBits >> 5; int remainingBits = stuffingBits & 31; assert(stuffingBits > 0); while (stuffingWords--) { WriteMainDataBits(~0, 32); } if (remainingBits) { WriteMainDataBits(~0, remainingBits); } bitsWritten += stuffingBits; } assert(bitsWritten == gi->part2_3_length - gi->part2_length); } void III_FlushBitstream(void) { if (elements) { int bitsRemaining = forwardFrameLength - forwardSILength; int wordsRemaining = bitsRemaining >> 5; while (wordsRemaining--) { WriteMainDataBits(0, 32); } bitsRemaining &= 31; if( bitsRemaining ) // <- assert対策 2000.03.11 T.Narita WriteMainDataBits(0, bitsRemaining & 31); } /* reclaim queue space */ free_side_queues(); /* reinitialize globals */ BitCount = 0; ThisFrameSize = 0; BitsRemaining = 0; return; } static void drain_into_ancillary_data(int lengthInBits) { int wordsToSend = lengthInBits >> 5; // / 32; int remainingBits = lengthInBits & 31; //% 32; int i; for (i = 0; i < wordsToSend; i++) WriteMainDataBits(0, 32); if (remainingBits) WriteMainDataBits(0, remainingBits); } void write_main_data_with_side_info(unsigned int val, unsigned int nbits) { int gr, ch, region, window; side_info_link *l; III_side_info_t *si; int tmp; l = get_side_info(); si = &l->l3_side; if(BitsRemaining){ unsigned extra = val >> (nbits - BitsRemaining); nbits -= BitsRemaining; putbits( extra, BitsRemaining ); } /* write header */ /* write header */ tmp = (0xFFF<<4) | (gl.version<<3) | (1<<1) | 1; putbits24(tmp, 16); tmp = (si->rate_idx<<12) | (gl.freq_idx<<10) | (si->padding<<9) | (gl.extension<<8) | (gl.mode<<6) | (si->mode_ext<<4) | (0 /* gl.copyright */<<3) | (1 /* gl.original */ <<2) | (gl.emphasis); putbits24(tmp, 16); if (gl.version == 1) { /* MPEG1 */ /* write frame info */ putbits24(si->main_data_begin, 9); if (gl.stereo == 2) { putbits24(0, 3 + 8); } else { putbits24(0, 5 + 4); } /* write spectrum info */ for (gr = 0; gr < 2; gr++) { for (ch = 0; ch < gl.stereo; ch++) { gr_info *gi = &(si->gr[gr].ch[ch].tt); putbits24(gi->part2_3_length, 12); tmp = (gi->big_values<<13) | (gi->global_gain<<5) | (gi->scalefac_compress<<1) | gi->window_switching_flag; putbits24(tmp, 9 + 8 + 4 + 1); if (gi->window_switching_flag) { tmp = (gi->block_type<<20) | (0<<19) | (gi->table_select[0]<<14) | (gi->table_select[1]<<9); putbits24(tmp,22); } else { assert(gi->block_type == 0); tmp = (gi->table_select[0]<<17) | (gi->table_select[1]<<12) | (gi->table_select[2]<<7) | (gi->region0_count<<3) | gi->region1_count; putbits24(tmp, 22); } tmp = (gi->preflag<<2) | (gi->scalefac_scale<<1) | gi->count1table_select; putbits24(tmp, 3); } } } else { /* MPEG2 */ /* write frame info */ putbits24(si->main_data_begin, 8); if (gl.stereo == 2) { putbits24(0, 2); } else { putbits24(0, 1); } /* write spectrum info */ gr = 0; for (ch = 0; ch < gl.stereo; ch++) { gr_info *gi = &(si->gr[gr].ch[ch].tt); putbits24(gi->part2_3_length, 12); putbits24(gi->big_values, 9); putbits24(gi->global_gain, 8); putbits24(gi->scalefac_compress, 9); putbits24(gi->window_switching_flag, 1); if (gi->window_switching_flag) { putbits24(gi->block_type, 2); putbits24(0, 1); for (region = 0; region < 2; region++) putbits24(gi->table_select[region], 5); for (window = 0; window < 3; window++) { putbits24(0, 3); } } else { for (region = 0; region < 3; region++) putbits24(gi->table_select[region], 5); putbits24(gi->region0_count, 4); putbits24(gi->region1_count, 3); } putbits24(gi->scalefac_scale, 1); putbits24(gi->count1table_select, 1); } } ThisFrameSize = l->frameLength; BitCount = l->SILength; BitsRemaining = ThisFrameSize - BitCount; if( nbits ){ putbits( val, nbits ); BitCount += nbits; BitsRemaining -= nbits; } } static void store_side_info(III_side_info_t *si, int bitsPerFrame) { side_info_link *l; side_info_link *f = side_queue_free; int bits = 32; /* calculate the number of bits in SI */ if (gl.version == 1) { /* MPEG1 */ if (gl.stereo == 2) bits += 256; else bits += 136; } else { /* MPEG2 */ if (gl.stereo == 2) bits += 136; else bits += 72; } if (f == NULL) { /* must allocate another */ l = (side_info_link *) mem_alloc(sizeof(side_info_link), "side_info_link"); } else { /* remove from the free list */ side_queue_free = f->next; l = f; } /* copy data */ l->next = NULL; l->frameLength = bitsPerFrame; l->SILength = bits; l->l3_side = *si; elements++; forwardFrameLength += bitsPerFrame; forwardSILength += bits; /* place at end of queue */ f = side_queue_head; if (f == NULL) { /* empty queue */ side_queue_head = l; } else { /* find last element */ while (f->next) f = f->next; f->next = l; } } static side_info_link * get_side_info(void) { side_info_link *f = side_queue_free; side_info_link *l = side_queue_head; /* If we stop here it means you didn't provide enough headers to support the amount of main data that was written. */ #if 1 /* by PEN 99/11/8 */ if (!l) return f; #else assert(l); #endif /* update queue head */ side_queue_head = l->next; side_queue_free = l; l->next = f; elements--; forwardFrameLength -= l->frameLength; forwardSILength -= l->SILength; return l; } static void free_side_queues(void) { side_info_link *l, *next; for (l = side_queue_head; l; l = next) { next = l->next; mem_free((void **) &l); } side_queue_head = NULL; for (l = side_queue_free; l; l = next) { next = l->next; mem_free((void **) &l); } side_queue_free = NULL; } gogo239b/benchdll.rc100644 23421 144 6440 7220537347 13444 0ustar shigeousers//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // 日本語 resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) #ifdef _WIN32 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT #pragma code_page(932) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 2,3,9,0 PRODUCTVERSION 2,3,9,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x2bL #else FILEFLAGS 0x2aL #endif FILEOS 0x4L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "000004b0" BEGIN VALUE "Comments", "gogo-no-coda Dynamic Link Library\0" VALUE "CompanyName", "MarineCat\0" VALUE "FileDescription", "GOGO DLL(for only benchmark)\0" VALUE "FileVersion", "2, 3, 9, 0\0" VALUE "InternalName", "GOGO DLL\0" VALUE "LegalCopyright", "Copyright (C) 1999,2000 PEN@MarineCat / Herr.Mie\0" VALUE "LegalTrademarks", " \0" VALUE "OriginalFilename", "GOGO.DLL\0" VALUE "PrivateBuild", " \0" VALUE "ProductName", "MarineCat GOGO DLL\0" VALUE "ProductVersion", "2, 3, 9, 0\0" VALUE "SpecialBuild", " \0" END BLOCK "041104b0" BEGIN VALUE "Comments", "ク盧螟ホ、ウ。チ、タ ニーナェ・・・ッ・鬣、・ヨ・鬣鷭0\0" VALUE "CompanyName", "MarineCat\0" VALUE "FileDescription", "GOGO DLL\0" VALUE "FileVersion", "2, 3, 9, 0\0" VALUE "InternalName", "GOGO DLL\0" VALUE "LegalCopyright", "Copyright (C) 1999,2000 」ミ」ナ」ホ。・゙・・・ュ・罕テ・ネ 。・、リ、・゚\0" VALUE "LegalTrademarks", "。。。。\0" VALUE "OriginalFilename", "GOGO.DLL\0" VALUE "PrivateBuild", "。。\0" VALUE "ProductName", "MarineCat GOGO DLL\0" VALUE "ProductVersion", "2, 3, 9, 0\0" VALUE "SpecialBuild", "。。\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0, 1200, 0x411, 1200 END END #endif // !_MAC #endif // 日本語 resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED gogo239b/benchdll.dsp100644 23421 144 53572 7220537347 13656 0ustar shigeousers# Microsoft Developer Studio Project File - Name="BENCHDLL" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** 編集しないでください ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=BENCHDLL - Win32 Release !MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 !MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください !MESSAGE !MESSAGE NMAKE /f "benchdll.mak". !MESSAGE !MESSAGE NMAKE の実行時に構成を指定できます !MESSAGE コマンド ライン上でマクロの設定を定義します。例: !MESSAGE !MESSAGE NMAKE /f "benchdll.mak" CFG="BENCHDLL - Win32 Release" !MESSAGE !MESSAGE 選択可能なビルド モード: !MESSAGE !MESSAGE "BENCHDLL - Win32 Release" ("Win32 (x86) Dynamic-Link Library" 用) !MESSAGE "BENCHDLL - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" 用) !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName ""$/BENCHDLL/DLL", GKAAAAAA" # PROP Scc_LocalPath "." CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "BENCHDLL - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "C:\temp\vctmp\gogo\ReleaseDLL" # PROP Intermediate_Dir "C:\temp\vctmp\gogo\ReleaseDLL" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BENCHDLL_EXPORTS" /Yu"stdafx.h" /FD /c # ADD CPP /nologo /MD /W3 /GX /Zd /O2 /Ob2 /D "USE_REGISTRY" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GOGO_DLL_EXPORTS" /D "USE_E3DN" /D "LAME355" /D "USE_WINTHREAD" /D "BENCH_ONLY" /FD /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x411 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"C:\temp\vctmp\gogo\ReleaseDLL/GOGO.DLL" !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "C:\temp\vctmp\gogo\DebugDLL" # PROP Intermediate_Dir "C:\temp\vctmp\gogo\DebugDLL" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BENCHDLL_EXPORTS" /Yu"stdafx.h" /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "BENCH_ONLY" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GOGO_DLL_EXPORTS" /D "USE_E3DN" /D "LAME355" /D "USE_WINTHREAD" /FR /FD /GZ /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"C:\temp\vctmp\gogo\DebugDLL/GOGO.DLL" /pdbtype:sept # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Cmds=copy C:\temp\vctmp\gogo\debugdll\gogo.dll C:\temp\vctmp\gogo\Debug8HZ copy C:\temp\vctmp\gogo\debugdll\gogo.dll C:\temp\vctmp\Wing\debug\gogo.dll copy C:\temp\vctmp\gogo\debugdll\gogo.dll C:\temp\vctmp\streamin\Debug\ # End Special Build Tool !ENDIF # Begin Target # Name "BENCHDLL - Win32 Release" # Name "BENCHDLL - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Group "nasM" # PROP Default_Filter ".nas" # Begin Source File SOURCE=.\align.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\align.nas InputName=align "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\align.nas InputName=align "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\clk.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\clk.nas InputName=clk "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\clk.nas InputName=clk "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fft.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\fft.nas InputName=fft "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\fft.nas InputName=fft "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fft3dn.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\fft3dn.nas InputName=fft3dn "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\fft3dn.nas InputName=fft3dn "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fftfpu.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\fftfpu.nas InputName=fftfpu "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\fftfpu.nas InputName=fftfpu "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\fftsse.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\fftsse.nas InputName=fftsse "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\fftsse.nas InputName=fftsse "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\ffttbl.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\ffttbl.nas InputName=ffttbl "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\ffttbl.nas InputName=ffttbl "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\Haveunit.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\Haveunit.nas InputName=Haveunit "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\Haveunit.nas InputName=Haveunit "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\huffmana.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\huffmana.nas InputName=huffmana "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\huffmana.nas InputName=huffmana "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\l3psya.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\l3psya.nas InputName=l3psya "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\l3psya.nas InputName=l3psya "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\mdct3dn.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\mdct3dn.nas InputName=mdct3dn "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\mdct3dn.nas InputName=mdct3dn "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\mdctfpu.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\mdctfpu.nas InputName=mdctfpu "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\mdctfpu.nas InputName=mdctfpu "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\mdcttbl.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\mdcttbl.nas InputName=mdcttbl "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\mdcttbl.nas InputName=mdcttbl "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msub3dn.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\msub3dn.nas InputName=msub3dn "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\msub3dn.nas InputName=msub3dn "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msubfpu.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\msubfpu.nas InputName=msubfpu "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\msubfpu.nas InputName=msubfpu "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msubsse.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\msubsse.nas InputName=msubsse "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\msubsse.nas InputName=msubsse "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\msubtbl.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\msubtbl.nas InputName=msubtbl "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\msubtbl.nas InputName=msubtbl "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\PUTBITS.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\PUTBITS.nas InputName=PUTBITS "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\PUTBITS.nas InputName=PUTBITS "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\Quantize.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\Quantize.nas InputName=Quantize "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\Quantize.nas InputName=Quantize "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sband3dn.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\sband3dn.nas InputName=sband3dn "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\sband3dn.nas InputName=sband3dn "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sbandfpu.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\sbandfpu.nas InputName=sbandfpu "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\sbandfpu.nas InputName=sbandfpu "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sbandsse.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\sbandsse.nas InputName=sbandsse "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\sbandsse.nas InputName=sbandsse "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\sbandtbl.nas !IF "$(CFG)" == "BENCHDLL - Win32 Release" # Begin Custom Build InputPath=.\sbandtbl.nas InputName=sbandtbl "ReleaseDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o ReleaseDLL/$(InputName).obj $(InputPath) # End Custom Build !ELSEIF "$(CFG)" == "BENCHDLL - Win32 Debug" # Begin Custom Build InputPath=.\sbandtbl.nas InputName=sbandtbl "DebugDLL/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" nasmw -f win32 -DWIN32 -DUSE_E3DN -o DebugDLL/$(InputName).obj $(InputPath) # End Custom Build !ENDIF # End Source File # End Group # Begin Source File SOURCE=.\bitstrem.c # End Source File # Begin Source File SOURCE=.\common.c # End Source File # Begin Source File SOURCE=.\encode.c # End Source File # Begin Source File SOURCE=.\gogo_dll.cpp # End Source File # Begin Source File SOURCE=.\gogo_dll.def # End Source File # Begin Source File SOURCE=.\huffman.c # End Source File # Begin Source File SOURCE=.\l3bs.c # End Source File # Begin Source File SOURCE=.\l3psy.c # End Source File # Begin Source File SOURCE=.\loop.c # End Source File # Begin Source File SOURCE=.\mdct.c # End Source File # Begin Source File SOURCE=.\message.c # End Source File # Begin Source File SOURCE=.\musenc.c # End Source File # Begin Source File SOURCE=.\read4win.c # End Source File # Begin Source File SOURCE=.\setup.c # End Source File # Begin Source File SOURCE=.\stdafx.cpp # ADD CPP /Yc"stdafx.h" # End Source File # Begin Source File SOURCE=.\subs.c # End Source File # Begin Source File SOURCE=.\tables.c # End Source File # Begin Source File SOURCE=.\vbrtag.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\bitstrem.h # End Source File # Begin Source File SOURCE=.\common.h # End Source File # Begin Source File SOURCE=.\global.h # End Source File # Begin Source File SOURCE=.\grinfo.inc # End Source File # Begin Source File SOURCE=.\haveunit.h # End Source File # Begin Source File SOURCE=.\huffcode.tbl # End Source File # Begin Source File SOURCE=.\huffman.h # End Source File # Begin Source File SOURCE=.\l3bs.h # End Source File # Begin Source File SOURCE=.\l3psy.h # End Source File # Begin Source File SOURCE=.\l3side.h # End Source File # Begin Source File SOURCE=.\loop.h # End Source File # Begin Source File SOURCE=.\mdct.h # End Source File # Begin Source File SOURCE=.\message.h # End Source File # Begin Source File SOURCE=.\musenc.h # End Source File # Begin Source File SOURCE=.\readsmpl.h # End Source File # Begin Source File SOURCE=.\stdafx.h # End Source File # Begin Source File SOURCE=.\subband.h # End Source File # Begin Source File SOURCE=.\vbrtag.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File SOURCE=.\benchdll.rc # End Source File # Begin Source File SOURCE=.\english.msg # End Source File # Begin Source File SOURCE=.\german.msg # End Source File # Begin Source File SOURCE=.\japanese.msg # End Source File # Begin Source File SOURCE=.\spanish.msg # End Source File # End Group # Begin Source File SOURCE=.\readme.txt # End Source File # End Target # End Project