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

流媒体/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 <stdio.h>
  19. #include <unistd.h>
  20. #include <string.h>
  21. #include <math.h>
  22. #include "sndfile.h"
  23. #include "config.h"
  24. #include "sfendian.h"
  25. #include "common.h"
  26. #include "au.h"
  27. #include "G72x/g72x.h"
  28. static int au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x) ;
  29. static int au_g72x_read (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len) ;
  30. static int au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x) ;
  31. static int au_g72x_write (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len) ;
  32. static int au_g72x_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
  33. static int au_g72x_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
  34. static int au_g72x_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
  35. static int au_g72x_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
  36. static int au_g72x_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
  37. static int au_g72x_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
  38. static  off_t au_g72x_seek (SF_PRIVATE *psf, off_t offset, int whence) ;
  39. static int au_g72x_close (SF_PRIVATE  *psf) ;
  40. /*============================================================================================
  41. ** WAV G721 Reader initialisation function.
  42. */
  43. int au_g72x_reader_init (SF_PRIVATE *psf, int codec)
  44. { G72x_DATA *pg72x ;
  45. int bitspersample ;
  46. psf->sf.seekable = SF_FALSE ;
  47. if (psf->mode != SF_MODE_READ)
  48. return SFE_BAD_MODE_RW ;
  49. if (! (pg72x = malloc (sizeof (G72x_DATA))))
  50. return SFE_MALLOC_FAILED ;
  51. psf->fdata = (void*) pg72x ;
  52. pg72x->blockcount  = 0 ;
  53. pg72x->samplecount = 0 ;
  54. switch (codec)
  55. { case AU_H_G721_32 :
  56. g72x_reader_init (pg72x, G721_32_BITS_PER_SAMPLE) ;
  57. pg72x->bytesperblock = G721_32_BYTES_PER_BLOCK ;
  58. bitspersample = G721_32_BITS_PER_SAMPLE ;
  59. break ;
  60. case AU_H_G723_24:
  61. g72x_reader_init (pg72x, G723_24_BITS_PER_SAMPLE) ;
  62. pg72x->bytesperblock = G723_24_BYTES_PER_BLOCK ;
  63. bitspersample = G723_24_BITS_PER_SAMPLE ;
  64. break ;
  65. default : return 0 ;
  66. } ;
  67. psf->read_short  = (func_short)  au_g72x_read_s ;
  68. psf->read_int    = (func_int)    au_g72x_read_i ;
  69. psf->read_double = (func_double) au_g72x_read_d ;
  70.  
  71.   psf->seek_func   = (func_seek)   au_g72x_seek ;
  72.   psf->close       = (func_close)  au_g72x_close ;
  73. if (psf->datalength % pg72x->blocksize)
  74. pg72x->blocks = (psf->datalength / pg72x->blocksize) + 1 ;
  75. else
  76. pg72x->blocks = psf->datalength / pg72x->blocksize ;
  77. psf->sf.samples = (8 * psf->datalength) / bitspersample ;
  78. if ((psf->sf.samples * bitspersample) / 8 != psf->datalength)
  79. psf_sprintf (psf, "*** Warning : weird psf->datalength.n") ;
  80. psf->blockwidth = psf->bytewidth = 1 ;
  81. au_g72x_read_block (psf, pg72x) ;
  82. return 0 ;
  83. } /* au_g72x_reader_init */
  84. /*============================================================================================
  85. ** WAV G721 writer initialisation function.
  86. */
  87. int au_g72x_writer_init (SF_PRIVATE *psf, int codec)
  88. { G72x_DATA *pg72x ;
  89. psf->sf.seekable = SF_FALSE ;
  90. if (psf->mode != SF_MODE_WRITE)
  91. return SFE_BAD_MODE_RW ;
  92. if (! (pg72x = malloc (sizeof (G72x_DATA))))
  93. return SFE_MALLOC_FAILED ;
  94. psf->fdata = (void*) pg72x ;
  95. pg72x->blockcount  = 0 ;
  96. pg72x->samplecount = 0 ;
  97. switch (codec)
  98. { case AU_H_G721_32 :
  99. g72x_writer_init (pg72x, G721_32_BITS_PER_SAMPLE) ;
  100. pg72x->bytesperblock = G721_32_BYTES_PER_BLOCK ;
  101. break ;
  102. case AU_H_G723_24:
  103. g72x_writer_init (pg72x, G723_24_BITS_PER_SAMPLE) ;
  104. pg72x->bytesperblock = G723_24_BYTES_PER_BLOCK ;
  105. break ;
  106. default : return 0 ;
  107. } ;
  108. psf->write_short  = (func_short)  au_g72x_write_s ;
  109. psf->write_int    = (func_int)    au_g72x_write_i ;
  110. psf->write_double = (func_double) au_g72x_write_d ;
  111.  
  112.   psf->seek_func   = (func_seek)    au_g72x_seek ;
  113.   psf->close       = (func_close)   au_g72x_close ;
  114.  
  115. psf->blockwidth = psf->bytewidth = 1 ;
  116. return 0 ;
  117. } /* au_g72x_writer_init */
  118. /*============================================================================================
  119. ** G721 Read Functions.
  120. */
  121. static
  122. int au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
  123. { int k ;
  124. pg72x->blockcount ++ ;
  125. pg72x->samplecount = 0 ;
  126. if (pg72x->samplecount > pg72x->blocksize)
  127. { memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ;
  128. return 1 ;
  129. } ;
  130. if ((k = fread (pg72x->block, 1, pg72x->bytesperblock, psf->file)) != pg72x->bytesperblock)
  131. psf_sprintf (psf, "*** Warning : short read (%d != %d).n", k, pg72x->bytesperblock) ;
  132. pg72x->blocksize = k ;
  133. g72x_decode_block (pg72x) ;
  134. return 1 ;
  135. } /* au_g72x_read_block */
  136. static
  137. int au_g72x_read (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
  138. { int count, total = 0, index = 0 ;
  139. while (index < len)
  140. { if (pg72x->blockcount >= pg72x->blocks && pg72x->samplecount >= pg72x->samplesperblock)
  141. { memset (&(ptr[index]), 0, (len - index) * sizeof (short)) ;
  142. return total ;
  143. } ;
  144. if (pg72x->samplecount >= pg72x->samplesperblock)
  145. au_g72x_read_block (psf, pg72x) ;
  146. count = pg72x->samplesperblock - pg72x->samplecount ;
  147. count = (len - index > count) ? count : len - index ;
  148. memcpy (&(ptr[index]), &(pg72x->samples [pg72x->samplecount]), count * sizeof (short)) ;
  149. index += count ;
  150. pg72x->samplecount += count ;
  151. total = index ;
  152. } ;
  153. return total ;
  154. } /* au_g72x_read */
  155. static
  156. int au_g72x_read_s (SF_PRIVATE *psf, short *ptr, int len)
  157. { G72x_DATA  *pg72x ; 
  158. int total ;
  159. if (! psf->fdata)
  160. return 0 ;
  161. pg72x = (G72x_DATA*) psf->fdata ;
  162. total = au_g72x_read (psf, pg72x, ptr, len) ;
  163. return total ;
  164. } /* au_g72x_read_s */
  165. static
  166. int au_g72x_read_i  (SF_PRIVATE *psf, int *ptr, int len)
  167. { G72x_DATA *pg72x ; 
  168. short *sptr ;
  169. int k, bufferlen, readcount = 0, count ;
  170. int index = 0, total = 0 ;
  171. if (! psf->fdata)
  172. return 0 ;
  173. pg72x = (G72x_DATA*) psf->fdata ;
  174. sptr = (short*) psf->buffer ;
  175. bufferlen = SF_BUFFER_LEN / sizeof (short) ;
  176. while (len > 0)
  177. { readcount = (len >= bufferlen) ? bufferlen : len ;
  178. count = au_g72x_read (psf, pg72x, sptr, readcount) ;
  179. for (k = 0 ; k < readcount ; k++)
  180. ptr [index+k] = (int) (sptr [k]) ;
  181. index += readcount ;
  182. total += count ;
  183. len -= readcount ;
  184. } ;
  185. return total ;
  186. } /* au_g72x_read_i */
  187. static
  188. int au_g72x_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  189. { G72x_DATA *pg72x ; 
  190. short *sptr ;
  191. int k, bufferlen, readcount = 0, count ;
  192. int index = 0, total = 0 ;
  193. if (! psf->fdata)
  194. return 0 ;
  195. pg72x = (G72x_DATA*) psf->fdata ;
  196. sptr = (short*) psf->buffer ;
  197. bufferlen = SF_BUFFER_LEN / sizeof (short) ;
  198. while (len > 0)
  199. { readcount = (len >= bufferlen) ? bufferlen : len ;
  200. count = au_g72x_read (psf, pg72x, sptr, readcount) ;
  201. for (k = 0 ; k < readcount ; k++)
  202. ptr [index+k] = (double) (sptr [k]) ;
  203. index += readcount ;
  204. total += count ;
  205. len -= readcount ;
  206. } ;
  207. return total ;
  208. } /* au_g72x_read_d */
  209. static
  210. off_t    au_g72x_seek   (SF_PRIVATE *psf, off_t offset, int whence)
  211. {
  212. /* No simple solution. To do properly, would need to seek
  213. ** to start of file and decode everything up to seek position.
  214. ** Maybe implement SEEK_SET to 0 only?
  215. */
  216. return 0 ;
  217. /*
  218. ** G72x_DATA *pg72x ; 
  219. ** int newblock, newsample, samplecount ;
  220. **
  221. ** if (! psf->fdata)
  222. ** return 0 ;
  223. ** pg72x = (G72x_DATA*) psf->fdata ;
  224. **
  225. ** if (! (psf->datalength && psf->dataoffset))
  226. ** { psf->error = SFE_BAD_SEEK ;
  227. ** return ((off_t) -1) ;
  228. ** } ;
  229. **
  230. ** samplecount = (8 * psf->datalength) / G721_32_BITS_PER_SAMPLE ;
  231. **
  232. ** switch (whence)
  233. ** { case SEEK_SET :
  234. ** if (offset < 0 || offset > samplecount)
  235. ** { psf->error = SFE_BAD_SEEK ;
  236. ** return ((off_t) -1) ;
  237. ** } ;
  238. ** newblock  = offset / pg72x->samplesperblock ;
  239. ** newsample = offset % pg72x->samplesperblock ;
  240. ** break ;
  241. **
  242. ** case SEEK_CUR :
  243. ** if (psf->current + offset < 0 || psf->current + offset > samplecount)
  244. ** { psf->error = SFE_BAD_SEEK ;
  245. ** return ((off_t) -1) ;
  246. ** } ;
  247. ** newblock  = (8 * (psf->current + offset)) / pg72x->samplesperblock ;
  248. ** newsample = (8 * (psf->current + offset)) % pg72x->samplesperblock ;
  249. ** break ;
  250. **
  251. ** case SEEK_END :
  252. ** if (offset > 0 || samplecount + offset < 0)
  253. ** { psf->error = SFE_BAD_SEEK ;
  254. ** return ((off_t) -1) ;
  255. ** } ;
  256. ** newblock  = (samplecount + offset) / pg72x->samplesperblock ;
  257. ** newsample = (samplecount + offset) % pg72x->samplesperblock ;
  258. ** break ;
  259. **
  260. ** default : 
  261. ** psf->error = SFE_BAD_SEEK ;
  262. ** return ((off_t) -1) ;
  263. ** } ;
  264. **
  265. ** if (psf->mode == SF_MODE_READ)
  266. ** { fseek (psf->file, (int) (psf->dataoffset + newblock * pg72x->blocksize), SEEK_SET) ;
  267. ** pg72x->blockcount  = newblock ;
  268. ** au_g72x_read_block (psf, pg72x) ;
  269. ** pg72x->samplecount = newsample ;
  270. ** }
  271. ** else
  272. ** { /+* What to do about write??? *+/ 
  273. ** psf->error = SFE_BAD_SEEK ;
  274. ** return ((off_t) -1) ;
  275. ** } ;
  276. **
  277. ** psf->current = newblock * pg72x->samplesperblock + newsample ;
  278. ** return psf->current ;
  279. **
  280. */
  281. } /* au_g72x_seek */
  282. /*==========================================================================================
  283. ** G721 Write Functions.
  284. */
  285. /*==========================================================================================
  286. */
  287. static
  288. int au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
  289. { int k ;
  290. /* Encode the samples. */
  291. g72x_encode_block (pg72x) ;
  292. /* Write the block to disk. */
  293. if ((k = fwrite (pg72x->block, 1, pg72x->blocksize, psf->file)) != pg72x->blocksize)
  294. psf_sprintf (psf, "*** Warning : short write (%d != %d).n", k, pg72x->blocksize) ;
  295. pg72x->samplecount = 0 ;
  296. pg72x->blockcount ++ ;
  297. /* Set samples to zero for next block. */
  298. memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ;
  299. return 1 ;
  300. } /* au_g72x_write_block */
  301. static
  302. int au_g72x_write (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
  303. { int count, total = 0, index = 0 ;
  304. while (index < len)
  305. { count = pg72x->samplesperblock - pg72x->samplecount ;
  306. if (count > len - index)
  307. count = len - index ;
  308. memcpy (&(pg72x->samples [pg72x->samplecount]), &(ptr [index]), count * sizeof (short)) ;
  309. index += count ;
  310. pg72x->samplecount += count ;
  311. total = index ;
  312. if (pg72x->samplecount >= pg72x->samplesperblock)
  313. au_g72x_write_block (psf, pg72x) ;
  314. } ;
  315. return total ;
  316. } /* au_g72x_write */
  317. static
  318. int au_g72x_write_s (SF_PRIVATE *psf, short *ptr, int len)
  319. { G72x_DATA  *pg72x ; 
  320. int total ;
  321. if (! psf->fdata)
  322. return 0 ;
  323. pg72x = (G72x_DATA*) psf->fdata ;
  324. total = au_g72x_write (psf, pg72x, ptr, len) ;
  325. return total ;
  326. } /* au_g72x_write_s */
  327. static
  328. int au_g72x_write_i  (SF_PRIVATE *psf, int *ptr, int len)
  329. { G72x_DATA *pg72x ; 
  330. short *sptr ;
  331. int k, bufferlen, writecount = 0, count ;
  332. int index = 0, total = 0 ;
  333. if (! psf->fdata)
  334. return 0 ;
  335. pg72x = (G72x_DATA*) psf->fdata ;
  336. sptr = (short*) psf->buffer ;
  337. bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
  338. while (len > 0)
  339. { writecount = (len >= bufferlen) ? bufferlen : len ;
  340. for (k = 0 ; k < writecount ; k++)
  341. sptr [k] = (short) ptr [index+k] ;
  342. count = au_g72x_write (psf, pg72x, sptr, writecount) ;
  343. index += writecount ;
  344. total += count ;
  345. len -= writecount ;
  346. } ;
  347. return total ;
  348. } /* au_g72x_write_i */
  349. static
  350. int au_g72x_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
  351. { G72x_DATA *pg72x ; 
  352. short *sptr ;
  353. int k, bufferlen, writecount = 0, count ;
  354. int index = 0, total = 0 ;
  355. if (! psf->fdata)
  356. return 0 ;
  357. pg72x = (G72x_DATA*) psf->fdata ;
  358. sptr = (short*) psf->buffer ;
  359. bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
  360. while (len > 0)
  361. { writecount = (len >= bufferlen) ? bufferlen : len ;
  362. for (k = 0 ; k < writecount ; k++)
  363. sptr [k] = (short) ptr [index+k]  ;
  364. count = au_g72x_write (psf, pg72x, sptr, writecount) ;
  365. index += writecount ;
  366. total += count ;
  367. len -= writecount ;
  368. } ;
  369. return total ;
  370. } /* au_g72x_write_d */
  371. static
  372. int au_g72x_close (SF_PRIVATE  *psf)
  373. { G72x_DATA *pg72x ; 
  374. if (! psf->fdata)
  375. return 0 ;
  376. pg72x = (G72x_DATA*) psf->fdata ;
  377. if (psf->mode == SF_MODE_WRITE)
  378. { /* If a block has been partially assembled, write it out
  379. ** as the final block.
  380. */
  381. if (pg72x->samplecount && pg72x->samplecount < G72x_BLOCK_SIZE)
  382. au_g72x_write_block (psf, pg72x) ;
  383. /*  Now we know for certain the length of the file we can
  384. **  re-write correct values for the RIFF and data chunks.
  385. */
  386.  
  387. } ;
  388. if (psf->fdata)
  389. free (psf->fdata) ;
  390. psf->fdata = NULL ;
  391. return 0 ;
  392. } /* au_g72x_close */