portableio.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* Copyright (C) 1988-1991 Apple Computer, Inc.
  2.  * All Rights Reserved.
  3.  *
  4.  * Warranty Information
  5.  * Even though Apple has reviewed this software, Apple makes no warranty
  6.  * or representation, either express or implied, with respect to this
  7.  * software, its quality, accuracy, merchantability, or fitness for a 
  8.  * particular purpose.  As a result, this software is provided "as is,"
  9.  * and you, its user, are assuming the entire risk as to its quality
  10.  * and accuracy.
  11.  *
  12.  * This code may be used and freely distributed as long as it includes
  13.  * this copyright notice and the warranty information.
  14.  *
  15.  *
  16.  * Motorola processors (Macintosh, Sun, Sparc, MIPS, etc)
  17.  * pack bytes from high to low (they are big-endian).
  18.  * Use the HighLow routines to match the native format
  19.  * of these machines.
  20.  *
  21.  * Intel-like machines (PCs, Sequent)
  22.  * pack bytes from low to high (the are little-endian).
  23.  * Use the LowHigh routines to match the native format
  24.  * of these machines.
  25.  *
  26.  * These routines have been tested on the following machines:
  27.  * Apple Macintosh, MPW 3.1 C compiler
  28.  * Apple Macintosh, THINK C compiler
  29.  * Silicon Graphics IRIS, MIPS compiler
  30.  * Cray X/MP and Y/MP
  31.  * Digital Equipment VAX
  32.  *
  33.  *
  34.  * Implemented by Malcolm Slaney and Ken Turkowski.
  35.  *
  36.  * Malcolm Slaney contributions during 1988-1990 include big- and little-
  37.  * endian file I/O, conversion to and from Motorola's extended 80-bit
  38.  * floating-point format, and conversions to and from IEEE single-
  39.  * precision floating-point format.
  40.  *
  41.  * In 1991, Ken Turkowski implemented the conversions to and from
  42.  * IEEE double-precision format, added more precision to the extended
  43.  * conversions, and accommodated conversions involving +/- infinity,
  44.  * NaN's, and denormalized numbers.
  45.  *
  46.  * $Id: portableio.c,v 1.2 2001/06/01 22:26:00 wmay Exp $
  47.  *
  48.  * Revision 1.1.1.1  1999/11/24 08:43:35  markt
  49.  * initial checkin of LAME
  50.  * Starting with LAME 3.57beta with some modifications
  51.  *
  52.  * Revision 2.6  91/04/30  17:06:02  malcolm
  53.  */
  54. #include <stdio.h>
  55. #include <math.h>
  56. #include "portableio.h"
  57. /****************************************************************
  58.  * Big/little-endian independent I/O routines.
  59.  ****************************************************************/
  60. int
  61. ReadByte(FILE *fp)
  62. {
  63. int result;
  64. result = getc(fp) & 0xff;
  65. if (result & 0x80)
  66. result = result - 0x100;
  67. return result;
  68. }
  69. int
  70. Read16BitsLowHigh(FILE *fp)
  71. {
  72. int first, second, result;
  73. first = 0xff & getc(fp);
  74. second = 0xff & getc(fp);
  75. result = (second << 8) + first;
  76. #ifndef THINK_C42
  77. if (result & 0x8000)
  78. result = result - 0x10000;
  79. #endif /* THINK_C */
  80. return(result);
  81. }
  82. int
  83. Read16BitsHighLow(FILE *fp)
  84. {
  85. int first, second, result;
  86. first = 0xff & getc(fp);
  87. second = 0xff & getc(fp);
  88. result = (first << 8) + second;
  89. #ifndef THINK_C42
  90. if (result & 0x8000)
  91. result = result - 0x10000;
  92. #endif /* THINK_C */
  93. return(result);
  94. }
  95. void
  96. Write8Bits(FILE *fp, int i)
  97. {
  98. putc(i&0xff,fp);
  99. }
  100. void
  101. Write16BitsLowHigh(FILE *fp, int i)
  102. {
  103. putc(i&0xff,fp);
  104. putc((i>>8)&0xff,fp);
  105. }
  106. void
  107. Write16BitsHighLow(FILE *fp, int i)
  108. {
  109. putc((i>>8)&0xff,fp);
  110. putc(i&0xff,fp);
  111. }
  112. int
  113. Read24BitsHighLow(FILE *fp)
  114. {
  115. int first, second, third;
  116. int result;
  117. first = 0xff & getc(fp);
  118. second = 0xff & getc(fp);
  119. third = 0xff & getc(fp);
  120. result = (first << 16) + (second << 8) + third;
  121. if (result & 0x800000)
  122. result = result - 0x1000000;
  123. return(result);
  124. }
  125. #define Read32BitsLowHigh(f) Read32Bits(f)
  126. int
  127. Read32Bits(FILE *fp)
  128. {
  129. int first, second, result;
  130. first = 0xffff & Read16BitsLowHigh(fp);
  131. second = 0xffff & Read16BitsLowHigh(fp);
  132. result = (second << 16) + first;
  133. #ifdef CRAY
  134. if (result & 0x80000000)
  135. result = result - 0x100000000;
  136. #endif /* CRAY */
  137. return(result);
  138. }
  139. int
  140. Read32BitsHighLow(FILE *fp)
  141. {
  142. int first, second, result;
  143. first = 0xffff & Read16BitsHighLow(fp);
  144. second = 0xffff & Read16BitsHighLow(fp);
  145. result = (first << 16) + second;
  146. #ifdef CRAY
  147. if (result & 0x80000000)
  148. result = result - 0x100000000;
  149. #endif
  150. return(result);
  151. }
  152. void
  153. Write32Bits(FILE *fp, int i)
  154. {
  155. Write16BitsLowHigh(fp,(int)(i&0xffffL));
  156. Write16BitsLowHigh(fp,(int)((i>>16)&0xffffL));
  157. }
  158. void
  159. Write32BitsLowHigh(FILE *fp, int i)
  160. {
  161. Write16BitsLowHigh(fp,(int)(i&0xffffL));
  162. Write16BitsLowHigh(fp,(int)((i>>16)&0xffffL));
  163. }
  164. void
  165. Write32BitsHighLow(FILE *fp, int i)
  166. {
  167. Write16BitsHighLow(fp,(int)((i>>16)&0xffffL));
  168. Write16BitsHighLow(fp,(int)(i&0xffffL));
  169. }
  170. void ReadBytes(FILE *fp, char *p, int n)
  171. {
  172. while (!feof(fp) & (n-- > 0))
  173. *p++ = getc(fp);
  174. }
  175. void ReadBytesSwapped(FILE *fp, char *p, int n)
  176. {
  177. register char *q = p;
  178. while (!feof(fp) & (n-- > 0))
  179. *q++ = getc(fp);
  180. for (q--; p < q; p++, q--){
  181. n = *p;
  182. *p = *q;
  183. *q = n;
  184. }
  185. }
  186. void WriteBytes(FILE *fp, char *p, int n)
  187. {
  188. while (n-- > 0)
  189. putc(*p++, fp);
  190. }
  191. void WriteBytesSwapped(FILE *fp, char *p, int n)
  192. {
  193. p += n-1;
  194. while (n-- > 0)
  195. putc(*p--, fp);
  196. }
  197. defdouble
  198. ReadIeeeFloatHighLow(FILE *fp)
  199. {
  200. char bits[kFloatLength];
  201. ReadBytes(fp, bits, kFloatLength);
  202. return ConvertFromIeeeSingle(bits);
  203. }
  204. defdouble
  205. ReadIeeeFloatLowHigh(FILE *fp)
  206. {
  207. char bits[kFloatLength];
  208. ReadBytesSwapped(fp, bits, kFloatLength);
  209. return ConvertFromIeeeSingle(bits);
  210. }
  211. defdouble
  212. ReadIeeeDoubleHighLow(FILE *fp)
  213. {
  214. char bits[kDoubleLength];
  215. ReadBytes(fp, bits, kDoubleLength);
  216. return ConvertFromIeeeDouble(bits);
  217. }
  218. defdouble
  219. ReadIeeeDoubleLowHigh(FILE *fp)
  220. {
  221. char bits[kDoubleLength];
  222. ReadBytesSwapped(fp, bits, kDoubleLength);
  223. return ConvertFromIeeeDouble(bits);
  224. }
  225. defdouble
  226. ReadIeeeExtendedHighLow(FILE *fp)
  227. {
  228. char bits[kExtendedLength];
  229. ReadBytes(fp, bits, kExtendedLength);
  230. return ConvertFromIeeeExtended(bits);
  231. }
  232. defdouble
  233. ReadIeeeExtendedLowHigh(FILE *fp)
  234. {
  235. char bits[kExtendedLength];
  236. ReadBytesSwapped(fp, bits, kExtendedLength);
  237. return ConvertFromIeeeExtended(bits);
  238. }
  239. void
  240. WriteIeeeFloatLowHigh(FILE *fp, defdouble num)
  241. {
  242. char bits[kFloatLength];
  243. ConvertToIeeeSingle(num,bits);
  244. WriteBytesSwapped(fp,bits,kFloatLength);
  245. }
  246. void
  247. WriteIeeeFloatHighLow(FILE *fp, defdouble num)
  248. {
  249. char bits[kFloatLength];
  250. ConvertToIeeeSingle(num,bits);
  251. WriteBytes(fp,bits,kFloatLength);
  252. }
  253. void
  254. WriteIeeeDoubleLowHigh(FILE *fp, defdouble num)
  255. {
  256. char bits[kDoubleLength];
  257. ConvertToIeeeDouble(num,bits);
  258. WriteBytesSwapped(fp,bits,kDoubleLength);
  259. }
  260. void
  261. WriteIeeeDoubleHighLow(FILE *fp, defdouble num)
  262. {
  263. char bits[kDoubleLength];
  264. ConvertToIeeeDouble(num,bits);
  265. WriteBytes(fp,bits,kDoubleLength);
  266. }
  267. void
  268. WriteIeeeExtendedLowHigh(FILE *fp, defdouble num)
  269. {
  270. char bits[kExtendedLength];
  271. ConvertToIeeeExtended(num,bits);
  272. WriteBytesSwapped(fp,bits,kExtendedLength);
  273. }
  274. void
  275. WriteIeeeExtendedHighLow(FILE *fp, defdouble num)
  276. {
  277. char bits[kExtendedLength];
  278. ConvertToIeeeExtended(num,bits);
  279. WriteBytes(fp,bits,kExtendedLength);
  280. }