FIXES.TXT
上传用户:dshsh2009
上传日期:2007-01-07
资源大小:155k
文件大小:11k
源码类别:

mpeg/mp3

开发平台:

Unix_Linux

  1. From: US1RMC::"seymour@m31.dgbt.doc.ca" "Seymour Shlien" 27-AUG-1993 15:05:31.82
  2. To: 3d::pan
  3. CC:
  4. Subj: problems and fixes
  5. Dear Davis,
  6. I have now got the MPEG audio coder and decoder to
  7. work on both UNIX (Sparc 2) and Microsoft C. All the problems
  8. that we encountered were mainly restricted to the code in the
  9. file common.c and were related to the AIFF
  10. audio format functions. I gather from the comments in
  11. the text, other people had encountered similar problems.
  12. When compiled under UNIX,  the gcc compiler
  13. gave messages similar to below.  
  14. common.c: In function `aiff_read_headers':
  15. common.c:673: warning: multi-character character constant
  16. common.c:674: warning: multi-character character constant
  17. common.c:688: warning: multi-character character constant
  18. common.c:719: warning: multi-character character constant
  19. common.c:719: warning: passing arg 2 of `strcmp' makes pointer from integer without a cast
  20. common.c: In function `aiff_write_headers':
  21. common.c:807: warning: multi-character character constant
  22. common.c:808: warning: multi-character character constant
  23. common.c:809: warning: multi-character character constant
  24.    670     if (fread(&FormChunk, sizeof(Chunk), 1, file_ptr) != 1)
  25.    671        return(-1);
  26.    672   
  27.    673     if (*(unsigned long *) FormChunk.ckID != IFF_ID_FORM ||
  28.    674         *(unsigned long *) FormChunk.formType != IFF_ID_AIFF)
  29.    675        return(-1);
  30.    676
  31.    677
  32.    678  /*   if (strcmp(FormChunk.ckID,IFF_ID_FORM) ||
  33.    679         strcmp(FormChunk.formType,IFF_ID_AIFF))
  34.    680        return(-1);
  35.    681  */
  36.    ...
  37.    ...
  38.    715           aiff_ptr->numSampleFrames = CommChunk.numSampleFrames;
  39.    716           aiff_ptr->sampleSize = CommChunk.sampleSize;
  40.    717   
  41.    718  /*    } else if (*(unsigned long *)Header.ckID == IFF_ID_SSND) { */
  42.    719        } else if (strcmp(Header.ckID,IFF_ID_SSND)) {
  43.    720   
  44.    721           /*
  45. Similarly on MSDOS we obtained the following warnings
  46. Microsoft (R) Program Maintenance Utility   Version 1.11    
  47. Copyright (c) Microsoft Corp 1988-90. All rights reserved.
  48. cl /AL /G2 /FPi87 /nologo /c /Gi musicin.c
  49. musicin.c
  50. musicin.c(959) : warning C4047: '!=' : different levels of indirection
  51. cl /AL /G2 /FPi87 /nologo /c /Gi common.c
  52. common.c
  53. common.c(814) : warning C4047: '=' : different levels of indirection
  54. common.c(815) : warning C4047: '=' : different levels of indirection
  55. common.c(816) : warning C4047: '=' : different levels of indirection
  56.    814   
  57.    815     *(unsigned long *) FormChunk.ckID     = IFF_ID_FORM;
  58.    816     *(unsigned long *) FormChunk.formType = IFF_ID_AIFF;
  59.    817     *(unsigned long *) CommChunk.ckID     = IFF_ID_COMM;
  60.    818
  61.    819     double_to_extended(&aiff_ptr->sampleRate, temp_sampleRate);
  62.   
  63. also a few similar error messages in musicin.c and musicout.c
  64. Despite these warnings both the encoder (musicin) and the decoder
  65. musicout appeared to run correctly on the data files 
  66. orig.mpg and sine.dec. However command line input is not
  67. properly implemented on MicroSoft C. The program tries to make
  68. a file orig.mpg.dec which is not legal in MSDOS
  69.          BUGS  IN THE SOFTWARE
  70. For MS_DOS it was necessary to modify the
  71. mem_alloc function in order to avoid crashing the computer on startup.
  72. I do not know the reason as I am not an expert in MicroSoft C.
  73. Also, the software does not properly handle AIFF formatted files.
  74. Using the program musicout I created an AIFF formatted file from
  75. the orig.mpg file. When I ran musicin on the AIFF formatted file on
  76. our SUN work station (ie UNIX environment) , the program crashed.
  77. On the other hand, when the same test was performed on the MSDOS,
  78. the computer did not crash but it failed to recognize the
  79. file as an AIFF formatted file and it did not read the header block.
  80. Nevertheless it was still able to compress the file, once the appropriate
  81. header information was typed in. 
  82. The problems seem to be related to the handling of the ID information
  83. in the chunk structure of the AIFF file. The ID is a 32 bit integer   
  84. which can take one of 5 designated values. The designated values
  85. for convenience also can be decoded as ascii strings FORM, AIFF
  86. COMM, SSND and MPEG. The ISO software attempts to provide two ways
  87. of handling these numbers- either as a multicharacter constant or
  88. a string.
  89. In the common.h file
  90. /*
  91.  * Note:  The value of a multi-character constant
  92.  *        is implementation-defined.
  93.  */
  94. #if !defined(MS_DOS) && !defined(AIX)
  95. #define         IFF_ID_FORM             'FORM'
  96. #define         IFF_ID_AIFF             'AIFF'
  97. #define         IFF_ID_COMM             'COMM'
  98. #define         IFF_ID_SSND             'SSND'
  99. #define         IFF_ID_MPEG             'MPEG'
  100. #else
  101. #define         IFF_ID_FORM             "FORM"
  102. #define         IFF_ID_AIFF             "AIFF"
  103. #define         IFF_ID_COMM             "COMM"
  104. #define         IFF_ID_SSND             "SSND"
  105. #define         IFF_ID_MPEG             "MPEG"
  106. #endif
  107.  
  108. Unfortunately, the revisions to the code in common.c
  109. do not properly read or write the AIFF header block in
  110. either mode.
  111. If the IFF_* constants are defined as a long integer, (ie
  112. single quotes around FORM, AIFF, etc.), then the strcmp
  113. function will crash on some machines because the inputs
  114. Header.ckID and IFF_ID_FORM are not strings. Strcmp
  115. expects to receive null terminated strings. Since it
  116. instead receives addresses to nonterminated strings, the
  117. strcmp runs off to infinity searching for the null character.
  118. Note: when IFF_* are defined as strings, Header.ckID is
  119. still not a null terminated string. Fortunately strcmp
  120. stops when a null is encountered in either one of its 
  121. arguments -- in this case a null is encountered in
  122. IFF_*. It might be safer to use strncmp which includes
  123. a string length argument.
  124.   
  125. This was the source of our problem on the UNIX machine as
  126. the common.c attempted to do a string compare in one
  127. spot (around line 718). 
  128. /*    } else if (*(unsigned long *)Header.ckID == IFF_ID_SSND) { */
  129.       } else if (strcmp(Header.ckID,IFF_ID_SSND)) {
  130. The commented line would have worked correctly in the
  131. UNIX environment.
  132. A different problem occurs in MS_DOS. In the function 
  133. aiff_write_header the following statement does not do what
  134. was intended when IFF_ID_FORM is a string.
  135.   *(unsigned long *) FormChunk.ckID     = IFF_ID_FORM;
  136. IFF_ID_FORM points to an address of the string "FORM". Though
  137. it was intended to put "FORM" in FormChunk.ckID, the above
  138. statement instead places the address of IFF_ID_FORM into
  139. FormChunk.ckID. This is what is put in the AIFF file. Musicin
  140. reads the file and fails to recognize it as an AIFF file. (The
  141. above statement would have been correct if IFF_ID_FORM was
  142. a long integer.) 
  143.                FIXES
  144. I have made the following changes in the software so that it
  145. can now handle AIFF formatted files in either MicroSoft C or
  146. UNIX.
  147. In common.h, I have introduced a new def called IFF_LONG
  148. whenever IFF_* is represented by multicharacter longs instead
  149. of strings. 
  150.  
  151. 187,188c187
  152. < #if !defined(MS_DOS) && !defined(AIX)  
  153. < #define         IFF_LONG
  154. ---
  155. > #if !defined(MS_DOS) && !defined(AIX)
  156. In common.c the following changes were made
  157. For avoiding crashing the PC on startup
  158. 456,457c456
  159. <     /*ptr = (void FAR *) _fmalloc((unsigned int)block);*/ /* far memory, 92-07-08 sr */
  160. <     ptr = (void FAR *) malloc((unsigned int)block); /* far memory, 93-08-24 ss */
  161. ---
  162. >     ptr = (void FAR *) _fmalloc((unsigned int)block); /* far memory, 92-07-08 sr */
  163.  
  164. For debugging and testing
  165. 646,656d644
  166. < /****  for debugging 
  167. < showchar(str)
  168. < char str[4];
  169. < {
  170. < int i;
  171. < for (i=0;i<4;i++) printf("%c",str[i]);
  172. < printf("n");
  173. < }
  174. < ****/
  175. To correct the problems with the IFF_* ID's I do
  176. the string comparisons two different ways depending
  177. on whether IFF_LONG is defined. 
  178. 685d672
  179. < #ifdef IFF_LONG 
  180. 689d675
  181. < #else
  182. 691,694d676
  183. <    if (strncmp(FormChunk.ckID,IFF_ID_FORM,4) ||
  184. <        strncmp(FormChunk.formType,IFF_ID_AIFF,4))
  185. <       return(-1);
  186. < #endif
  187. 695a678,681
  188. > /*   if (strcmp(FormChunk.ckID,IFF_ID_FORM) ||
  189. >        strcmp(FormChunk.formType,IFF_ID_AIFF))
  190. >       return(-1);
  191. > */
  192. 702d687
  193. < #ifdef IFF_LONG  
  194. 705,708c690,691
  195. < #else
  196. <       if (strncmp(Header.ckID,IFF_ID_COMM,4) == 0) {
  197. < #endif
  198. ---
  199. > /*      if (strcmp(Header.ckID,IFF_ID_COMM)) {
  200. > */
  201. 711a695
  202. 734,738c718,720
  203. < #ifdef IFF_LONG 
  204. <       } else if (*(unsigned long *)Header.ckID == IFF_ID_SSND) { 
  205. < #else
  206. <       } else if (strncmp(Header.ckID,IFF_ID_SSND,4) == 0) {
  207. < #endif
  208. ---
  209. > /*    } else if (*(unsigned long *)Header.ckID == IFF_ID_SSND) { */
  210. >       } else if (strcmp(Header.ckID,IFF_ID_SSND)) {
  211. 741a724
  212. 824d806
  213. < #ifdef IFF_LONG 
  214. 828,832d809
  215. < #else
  216. <    strncpy(FormChunk.ckID,IFF_ID_FORM,4);
  217. <    strncpy(FormChunk.formType,IFF_ID_AIFF,4);
  218. <    strncpy(CommChunk.ckID,IFF_ID_COMM,4);
  219. < #endif
  220. 1536a1514
  221. In musicin.c
  222. The following changes were made for the same reasons discussed above.
  223. 959d958
  224. < #ifdef IFF_LONG
  225. 961,963d959
  226. < #else
  227. <     if (strncmp(&pcm_aiff_data->sampleType,IFF_ID_SSND,4)) {
  228. < #endif
  229. In musicout.c
  230. The following changes were made for the same reasons discussed above.
  231. 381d380
  232. < #ifdef IFF_LONG       
  233. 383,385d381
  234. < #else
  235. <        strncpy(&pcm_aiff_data.sampleType,IFF_ID_SSND,4);
  236. < #endif
  237. 388c384
  238. <  
  239. ---
  240. This is a copy of the makefile that I am using on the IBM. Perhaps
  241. one of the switches might explain why I had trouble with the 
  242. mem_alloc.
  243. ALL : musicin.exe musicout.exe
  244. CFLAGS = /AL /G2 /FPi87 /nologo /c /Gi /F 256 
  245. LFLAGS= /SE:256 /ST:16000 /F /PACKC
  246. musicin.obj: musicin.c common.h encoder.h
  247.     cl $(CFLAGS) musicin.c
  248. common.obj: common.c common.h
  249.     cl $(CFLAGS) common.c
  250. encode.obj: encode.c common.h encoder.h
  251.     cl $(CFLAGS) encode.c
  252. subs.obj: subs.c common.h encoder.h
  253.     cl $(CFLAGS) subs.c
  254. psy.obj: psy.c common.h encoder.h
  255.     cl $(CFLAGS) psy.c
  256. tonal.obj: tonal.c common.h encoder.h
  257.     cl $(CFLAGS) tonal.c
  258. musicout.obj: musicout.c common.h decoder.h
  259.     cl $(CFLAGS) musicout.c
  260. decode.obj: decode.c common.h decoder.h
  261.     cl $(CFLAGS) decode.c
  262. musicin.exe: musicin.obj common.obj encode.obj subs.obj psy.obj tonal.obj
  263.     link $(LFLAGS) musicin common encode subs psy tonal,musicin,,;
  264. musicout.exe: musicout.obj common.obj decode.obj subs.obj
  265.     link $(LFLAGS) musicout common decode subs,musicout,,;
  266. I am grateful, for the help from Daniel Lauzon -- our resident C and C++
  267. expert. Also Bill Truerniet helped me with Microsoft C 
  268. on the PC.
  269.    
  270. seymour@dgbt.doc.ca
  271. % ====== Internet headers and postmarks (see DECWRL::GATEWAY.DOC) ======
  272. % Received: by us1rmc.bb.dec.com; id AA06920; Fri, 27 Aug 93 14:58:09 -0400
  273. % Received: by inet-gw-1.pa.dec.com; id AA02547; Fri, 27 Aug 93 11:59:18 -0700
  274. % Received: from rigel.dgbt.doc.ca by  m31.dgbt.doc.ca (4.1/SMI-4.1) id AA01692; Fri, 27 Aug 93 14:57:59 ED
  275. % Date: Fri, 27 Aug 93 14:57:59 EDT
  276. % From: seymour@m31.dgbt.doc.ca (Seymour Shlien)
  277. % Message-Id: <9308271857.AA01692@ m31.dgbt.doc.ca>
  278. % To: 3d::pan
  279. % Subject: problems and fixes
  280.