common.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:10k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2. ** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
  3. **  
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU Lesser General Public License as published by
  6. ** the Free Software Foundation; either version 2.1 of the License, or
  7. ** (at your option) any later version.
  8. ** 
  9. ** This program is distributed in the hope that it will be useful,
  10. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ** GNU Lesser General Public License for more details.
  13. ** 
  14. ** You should have received a copy of the GNU Lesser General Public License
  15. ** along with this program; if not, write to the Free Software 
  16. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. #include <stdarg.h>
  19. #include <string.h>
  20. #include "sndfile.h"
  21. #include "sfendian.h"
  22. #include "common.h"
  23. /*-----------------------------------------------------------------------------------------------
  24.  */
  25. void endswap_short_array (short *ptr, int len)
  26. { int k ;
  27. for (k = 0 ; k < len ; k++)
  28. ptr[k] = ((((ptr[k])>>8)&0xFF)|(((ptr[k])&0xFF)<<8)) ;
  29. } /* endswap_short_array */
  30. void endswap_int_array (int *ptr, int len)
  31. { int k ;
  32. for (k = 0 ; k < len ; k++)
  33. ptr[k] = ((((ptr[k])>>24)&0xFF)|(((ptr[k])>>8)&0xFF00)|
  34. (((ptr[k])&0xFF00)<<8)|(((ptr[k])&0xFF)<<24)) ;
  35. } /* endswap_int_array */
  36. /*-----------------------------------------------------------------------------------------------
  37.  */
  38. #define psf_putchar(a,b)
  39. if ((a)->strindex < SF_BUFFER_LEN - 1)
  40. { (a)->strbuffer [(a)->strindex++] = (b) ;
  41. (a)->strbuffer [(a)->strindex] = 0 ;
  42. } ;
  43. void psf_sprintf (SF_PRIVATE *psf, char *format, ...)
  44. { va_list ap ;
  45. int     d, tens, shift ;
  46. char    c, *strptr, istr [5] ;
  47. va_start(ap, format);
  48. /* printf ("psf_sprintf : %sn", format) ; */
  49. while ((c = *format++))
  50. { if (c != '%')
  51. { psf_putchar (psf, c) ;
  52. continue ;
  53. } ;
  54. switch((c = *format++)) 
  55. { case 's': /* string */
  56. strptr = va_arg (ap, char *) ;
  57. while (*strptr)
  58. psf_putchar (psf, *strptr++) ;
  59. break;
  60.     
  61. case 'd': /* int */
  62. d = va_arg (ap, int) ;
  63. if (d == 0)
  64. { psf_putchar (psf, '0') ;
  65. break ;
  66. if (d < 0)
  67. { psf_putchar (psf, '-') ;
  68. d = -d ;
  69. } ;
  70. tens = 1 ;
  71. while (d / tens >= 10) 
  72. tens *= 10 ;
  73. while (tens > 0)
  74. { psf_putchar (psf, '0' + d / tens) ;
  75. d %= tens ;
  76. tens /= 10 ;
  77. } ;
  78. break;
  79. case 'X': /* hex */
  80. d = va_arg (ap, int) ;
  81. if (d == 0)
  82. { psf_putchar (psf, '0') ;
  83. break ;
  84. } ;
  85. shift = 28 ;
  86. while (! ((0xF << shift) & d))
  87. shift -= 4 ;
  88. while (shift >= 0)
  89. { c = (d >> shift) & 0xF ;
  90. psf_putchar (psf, (c > 9) ? c + 'A' - 10 : c + '0') ;
  91. shift -= 4 ;
  92. } ;
  93. break;
  94. case 'c': /* char */
  95. c = va_arg (ap, int) & 0xFF ;
  96. psf_putchar (psf, c);
  97. break;
  98. case 'D': /* int2str */
  99. d = va_arg (ap, int);
  100. if (CPU_IS_LITTLE_ENDIAN)
  101. { istr [0] = d & 0xFF ;
  102. istr [1] = (d >> 8) & 0xFF ;
  103. istr [2] = (d >> 16) & 0xFF ;
  104. istr [3] = (d >> 24) & 0xFF ;
  105. }
  106. else
  107. { istr [3] = d & 0xFF ;
  108. istr [2] = (d >> 8) & 0xFF ;
  109. istr [1] = (d >> 16) & 0xFF ;
  110. istr [0] = (d >> 24) & 0xFF ;
  111. } ;
  112. istr [4] = 0 ;
  113. strptr = istr ;
  114. while (*strptr)
  115. { c = *strptr++ ;
  116. psf_putchar (psf, c) ;
  117. } ;
  118. break;
  119. default :
  120. psf_putchar (psf, '?') ;
  121. psf_putchar (psf, c) ;
  122. psf_putchar (psf, '?') ;
  123. break ;
  124. } /* switch */
  125. } /* while */
  126. va_end(ap);
  127. return ;
  128. } /* psf_sprintf */
  129. /*------------------------------------------------------------------------------
  130. **  Format specifiers for psf_hprintf are as follows
  131. ** m - marker - four bytes - no endian problems
  132. ** w - two byte value - little endian
  133. ** W - two byte value - big endian
  134. ** l - four byte value - little endian
  135. ** L - four byte value - big endian
  136. ** s   - string preceded by a little endian four byte length
  137. ** S   - string preceded by a big endian four byte length
  138. ** b - binary data (see below)
  139. **
  140. ** To write a word followed by a long (both little endian) use:
  141. ** psf_hprintf ("wl", wordval, longval) ;
  142. **
  143. ** To write binary data use:
  144. ** psf_hprintf ("b", &bindata, sizeof (bindata)) ;
  145. */
  146. /* These macros may seem a bit messy but do prevent problems with processors which 
  147. ** seg. fault when asked to write an int or short to a non-int/short aligned address.
  148. */
  149. #if (CPU_IS_BIG_ENDIAN == 1)
  150. #define put_int(psf,x) { (psf)->header [(psf)->headindex++] = ((x) >> 24) & 0xFF ;
  151. (psf)->header [(psf)->headindex++] = ((x) >> 16) & 0xFF ;
  152. (psf)->header [(psf)->headindex++] = ((x) >>  8) & 0xFF ;
  153. (psf)->header [(psf)->headindex++] = (x) & 0xFF ;   }
  154.                                                                         
  155. #define put_short(psf,x) { (psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ;
  156. (psf)->header [(psf)->headindex++] = (x) & 0xFF ;   }
  157. #elif (CPU_IS_LITTLE_ENDIAN == 1)
  158. #define put_int(psf,x) { (psf)->header [(psf)->headindex++] = (x) & 0xFF ;
  159. (psf)->header [(psf)->headindex++] = ((x) >>  8) & 0xFF ;
  160. (psf)->header [(psf)->headindex++] = ((x) >> 16) & 0xFF ;
  161. (psf)->header [(psf)->headindex++] = ((x) >> 24) & 0xFF ;   }
  162.                                                                         
  163. #define put_short(psf,x) { (psf)->header [(psf)->headindex++] = (x) & 0xFF ;
  164. (psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ;   }
  165. #else
  166. #       error "Cannot determine endian-ness of processor."
  167. #endif
  168. void psf_hprintf (SF_PRIVATE *psf, char *format, ...)
  169. { va_list argptr ;
  170. unsigned int  longdata ;
  171. unsigned short worddata ;
  172. void *bindata ;
  173. size_t size ;
  174. char    c, *strptr ;
  175. va_start(argptr, format);
  176. while ((c = *format++))
  177. { switch (c)
  178. { case 'm' : 
  179. longdata = va_arg (argptr, unsigned int) ;
  180. put_int (psf, longdata) ;
  181. break ;
  182. case 'l' :
  183. longdata = va_arg (argptr, unsigned int) ;
  184. longdata = H2LE_INT (longdata) ;
  185. put_int (psf, longdata) ;
  186. break ;
  187. case 'L' :
  188. longdata = va_arg (argptr, unsigned int) ;
  189. longdata = H2BE_INT (longdata) ;
  190. put_int (psf, longdata) ;
  191. break ;
  192. case 'w' :
  193. worddata = va_arg (argptr, int) & 0xFFFF ;
  194. worddata = H2LE_SHORT (worddata) ;
  195. put_short (psf, worddata) ;
  196. break ;
  197. case 'W' :
  198. worddata = va_arg (argptr, int) & 0xFFFF ;
  199. worddata = H2BE_SHORT (worddata) ;
  200. put_short (psf, worddata) ;
  201. break ;
  202. case 'b' :
  203. bindata = va_arg (argptr, void *) ;
  204. size    = va_arg (argptr, size_t) ;
  205. memcpy (&(psf->header [psf->headindex]), bindata, size) ;
  206. psf->headindex += size ;
  207. break ;
  208. case 's' :
  209. strptr = va_arg (argptr, char *) ;
  210. size    = strlen (strptr) + 1 ;
  211. size   += (size & 1) ;
  212. longdata = H2LE_INT (size) ;
  213. put_int (psf, longdata) ;
  214. memcpy (&(psf->header [psf->headindex]), strptr, size) ;
  215. psf->headindex += size ;
  216. break ;
  217. case 'S' :
  218. strptr = va_arg (argptr, char *) ;
  219. size    = strlen (strptr) + 1 ;
  220. size   += (size & 1) ;
  221. longdata = H2BE_INT (size) ;
  222. put_int (psf, longdata) ;
  223. memcpy (&(psf->header [psf->headindex]), strptr, size) ;
  224. psf->headindex += size ;
  225. break ;
  226. default : break ;
  227. } ;
  228. } ;
  229. va_end(argptr);
  230. return ;
  231. } /* psf_hprintf */
  232. /*-----------------------------------------------------------------------------------------------
  233. */
  234. void psf_hsetf (SF_PRIVATE *psf, unsigned int marker, char *format, ...)
  235. { va_list argptr ;
  236. unsigned int  longdata, oldheadindex ;
  237. unsigned short worddata ;
  238. void *bindata ;
  239. size_t size ;
  240. char    c, *strptr ;
  241. /* Save old head index. */
  242. oldheadindex = psf->headindex ;
  243. psf->headindex = 0 ;
  244. /* Find the marker. */
  245. while (psf->headindex < oldheadindex)
  246. { if (*((unsigned int*) &(psf->header[psf->headindex])) == marker)
  247. break ;
  248. psf->headindex += 4 ;
  249. } ;
  250. /* If not found return. */
  251. if (psf->headindex >= oldheadindex)
  252. return ;
  253. /* Move past marker. */
  254. psf->headindex += 4 ;
  255. va_start(argptr, format);
  256. while ((c = *format++))
  257. { switch (c)
  258. { case 'm' : 
  259. longdata = va_arg (argptr, unsigned int) ;
  260. put_int (psf, longdata) ;
  261. break ;
  262. case 'l' :
  263. longdata = va_arg (argptr, unsigned int) ;
  264. longdata = H2LE_INT (longdata) ;
  265. put_int (psf, longdata) ;
  266. break ;
  267. case 'L' :
  268. longdata = va_arg (argptr, unsigned int) ;
  269. longdata = H2BE_INT (longdata) ;
  270. put_int (psf, longdata) ;
  271. break ;
  272. case 'w' :
  273. worddata = va_arg (argptr, int) & 0xFFFF ;
  274. worddata = H2LE_SHORT (worddata) ;
  275. put_short (psf, worddata) ;
  276. break ;
  277. case 'W' :
  278. worddata = va_arg (argptr, int) & 0xFFFF ;
  279. worddata = H2BE_SHORT (worddata) ;
  280. put_short (psf, worddata) ;
  281. break ;
  282. case 'b' :
  283. bindata = va_arg (argptr, void *) ;
  284. size    = va_arg (argptr, size_t) ;
  285. memcpy (&(psf->header [psf->headindex]), bindata, size) ;
  286. psf->headindex += size ;
  287. break ;
  288. case 's' :
  289. strptr = va_arg (argptr, char *) ;
  290. size    = strlen (strptr) + 1 ;
  291. size   += (size & 1) ;
  292. longdata = H2LE_INT (size) ;
  293. put_int (psf, longdata) ;
  294. memcpy (&(psf->header [psf->headindex]), strptr, size) ;
  295. psf->headindex += size ;
  296. break ;
  297. case 'S' :
  298. strptr = va_arg (argptr, char *) ;
  299. size    = strlen (strptr) + 1 ;
  300. size   += (size & 1) ;
  301. longdata = H2BE_INT (size) ;
  302. put_int (psf, longdata) ;
  303. memcpy (&(psf->header [psf->headindex]), strptr, size) ;
  304. psf->headindex += size ;
  305. break ;
  306. default : break ;
  307. } ;
  308. } ;
  309. va_end(argptr);
  310. psf->headindex = oldheadindex ;
  311. return ;
  312. } /* psf_hsetf */