ogg.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:34k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 2002-2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  3. ** Copyright (C) 2007 John ffitch
  4. **
  5. ** This program is free software ; you can redistribute it and/or modify
  6. ** it under the terms of the GNU Lesser General Public License as published by
  7. ** the Free Software Foundation ; either version 2.1 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY ; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ** GNU Lesser General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU Lesser General Public License
  16. ** along with this program ; if not, write to the Free Software
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19. /*
  20. **  Much of this code is based on the examples in libvorbis from the
  21. ** XIPHOPHORUS Company http://www.xiph.org/ which has a BSD-style Licence
  22. ** Copyright (c) 2002, Xiph.org Foundation
  23. **
  24. ** Redistribution and use in source and binary forms, with or without
  25. ** modification, are permitted provided that the following conditions
  26. ** are met:
  27. **
  28. ** - Redistributions of source code must retain the above copyright
  29. ** notice, this list of conditions and the following disclaimer.
  30. **
  31. ** - Redistributions in binary form must reproduce the above copyright
  32. ** notice, this list of conditions and the following disclaimer in the
  33. ** documentation and/or other materials provided with the distribution.
  34. **
  35. ** - Neither the name of the Xiph.org Foundation nor the names of its
  36. ** contributors may be used to endorse or promote products derived from
  37. ** this software without specific prior written permission.
  38. **
  39. ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  40. ** ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  41. ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  42. ** A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION
  43. ** OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  44. ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  45. ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE,
  46. ** DATA, OR PROFITS ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  47. ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  48. ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  49. ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  50. */
  51. #include "sfconfig.h"
  52. #include <stdio.h>
  53. #include <fcntl.h>
  54. #include <string.h>
  55. #include <ctype.h>
  56. #include <time.h>
  57. #include <math.h>
  58. #if HAVE_UNISTD_H
  59. #include <unistd.h>
  60. #endif
  61. #include "sndfile.h"
  62. #include "sfendian.h"
  63. #include "common.h"
  64. #if HAVE_EXTERNAL_LIBS
  65. #include <vorbis/codec.h>
  66. #include <vorbis/vorbisenc.h>
  67. typedef int convert_func (int, void *, int, int, float **) ;
  68. static int ogg_read_header (SF_PRIVATE *psf, int log_data) ;
  69. static int ogg_write_header (SF_PRIVATE *psf, int calc_length) ;
  70. static int ogg_close (SF_PRIVATE *psf) ;
  71. static int ogg_command (SF_PRIVATE *psf, int command, void *data, int datasize) ;
  72. static sf_count_t ogg_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
  73. static sf_count_t ogg_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
  74. static sf_count_t ogg_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
  75. static sf_count_t ogg_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
  76. static sf_count_t ogg_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
  77. static sf_count_t ogg_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ;
  78. static sf_count_t ogg_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ;
  79. static sf_count_t ogg_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ;
  80. static sf_count_t ogg_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ;
  81. static sf_count_t ogg_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *transfn) ;
  82. static sf_count_t ogg_length (SF_PRIVATE *psf) ;
  83. typedef struct
  84. { int id ;
  85. const char *name ;
  86. } STR_PAIRS ;
  87. static STR_PAIRS vorbis_metatypes [] =
  88. { { SF_STR_TITLE, "Title" },
  89. { SF_STR_COPYRIGHT, "Copyright" },
  90. { SF_STR_SOFTWARE, "Software" },
  91. { SF_STR_ARTIST, "Artist" },
  92. { SF_STR_COMMENT, "Comment" },
  93. { SF_STR_DATE, "Date" },
  94. { SF_STR_ALBUM, "Album" },
  95. { SF_STR_LICENSE, "License" },
  96. } ;
  97. typedef struct
  98. { /* Sync and verify incoming physical bitstream */
  99. ogg_sync_state oy ;
  100. /* Take physical pages, weld into a logical stream of packets */
  101. ogg_stream_state os ;
  102. /* One Ogg bitstream page.  Vorbis packets are inside */
  103. ogg_page og ;
  104. /* One raw packet of data for decode */
  105. ogg_packet op ;
  106. int eos ;
  107. } OGG_PRIVATE ;
  108. typedef struct
  109. { /* Count current location */
  110. sf_count_t loc ;
  111. /* Struct that stores all the static vorbis bitstream settings */
  112. vorbis_info vi ;
  113. /* Struct that stores all the bitstream user comments */
  114. vorbis_comment vc ;
  115. /* Ventral working state for the packet->PCM decoder */
  116. vorbis_dsp_state vd ;
  117. /* Local working space for packet->PCM decode */
  118. vorbis_block vb ;
  119. /* Encoding quality in range [0.0, 1.0]. */
  120. double quality ;
  121. } VORBIS_PRIVATE ;
  122. static int
  123. ogg_read_header (SF_PRIVATE *psf, int log_data)
  124. {
  125. OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
  126. VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
  127. char *buffer ;
  128. int  bytes ;
  129. int i, nn ;
  130. odata->eos = 0 ;
  131. /* Weird stuff happens if these aren't called. */
  132. ogg_stream_reset (&odata->os) ;
  133. ogg_sync_reset (&odata->oy) ;
  134. /*
  135. ** Grab some data at the head of the stream.  We want the first page
  136. ** (which is guaranteed to be small and only contain the Vorbis
  137. ** stream initial header) We need the first page to get the stream
  138. ** serialno.
  139. */
  140. /* Expose the buffer */
  141. buffer = ogg_sync_buffer (&odata->oy, 4096L) ;
  142. /* Grab the part of the header that has already been read. */
  143. memcpy (buffer, psf->header, psf->headindex) ;
  144. bytes = psf->headindex ;
  145. /* Submit a 4k block to libvorbis' Ogg layer */
  146. bytes += psf_fread (buffer + psf->headindex, 1, 4096 - psf->headindex, psf) ;
  147. ogg_sync_wrote (&odata->oy, bytes) ;
  148. /* Get the first page. */
  149. if ((nn = ogg_sync_pageout (&odata->oy, &odata->og)) != 1)
  150. {
  151. /* Have we simply run out of data?  If so, we're done. */
  152. if (bytes < 4096)
  153. return 0 ;
  154. /* Error case.  Must not be Vorbis data */
  155. psf_log_printf (psf, "Input does not appear to be an Ogg bitstream.n") ;
  156. return SFE_MALFORMED_FILE ;
  157. } ;
  158. /*
  159. ** Get the serial number and set up the rest of decode.
  160. ** Serialno first ; use it to set up a logical stream.
  161. */
  162. ogg_stream_clear (&odata->os) ;
  163. ogg_stream_init (&odata->os, ogg_page_serialno (&odata->og)) ;
  164. /*
  165. ** This function (ogg_read_header) gets called multiple times, so the OGG
  166. ** and vorbis structs have to be cleared every time we pass through to
  167. ** prevent memory leaks.
  168. */
  169. vorbis_block_clear (&vdata->vb) ;
  170. vorbis_dsp_clear (&vdata->vd) ;
  171. vorbis_comment_clear (&vdata->vc) ;
  172. vorbis_info_clear (&vdata->vi) ;
  173. /*
  174. ** Extract the initial header from the first page and verify that the
  175. ** Ogg bitstream is in fact Vorbis data.
  176. **
  177. ** I handle the initial header first instead of just having the code
  178. ** read all three Vorbis headers at once because reading the initial
  179. ** header is an easy way to identify a Vorbis bitstream and it's
  180. ** useful to see that functionality seperated out.
  181. */
  182. vorbis_info_init (&vdata->vi) ;
  183. vorbis_comment_init (&vdata->vc) ;
  184. if (ogg_stream_pagein (&odata->os, &odata->og) < 0)
  185. { /* Error ; stream version mismatch perhaps. */
  186. psf_log_printf (psf, "Error reading first page of Ogg bitstream datan") ;
  187. return SFE_MALFORMED_FILE ;
  188. } ;
  189. if (ogg_stream_packetout (&odata->os, &odata->op) != 1)
  190. { /* No page? must not be vorbis. */
  191. psf_log_printf (psf, "Error reading initial header packet.n") ;
  192. return SFE_MALFORMED_FILE ;
  193. } ;
  194. if (vorbis_synthesis_headerin (&vdata->vi, &vdata->vc, &odata->op) < 0)
  195. { /* Error case ; not a vorbis header. */
  196. psf_log_printf (psf, "This Ogg bitstream does not contain Vorbis audio data.n") ;
  197. return SFE_MALFORMED_FILE ;
  198. } ;
  199. /*
  200. ** Common Ogg metadata fields?
  201. ** TITLE, VERSION, ALBUM, TRACKNUMBER, ARTIST, PERFORMER, COPYRIGHT, LICENSE,
  202. ** ORGANIZATION, DESCRIPTION, GENRE, DATE, LOCATION, CONTACT, ISRC,
  203. */
  204. if (log_data)
  205. { int k ;
  206. for (k = 0 ; k < ARRAY_LEN (vorbis_metatypes) ; k++)
  207. { char *dd ;
  208. dd = vorbis_comment_query (&vdata->vc, vorbis_metatypes [k].name, 0) ;
  209. if (dd == NULL)
  210. continue ;
  211. psf_store_string (psf, vorbis_metatypes [k].id, dd) ;
  212. } ;
  213. } ;
  214. /*
  215. ** At this point, we're sure we're Vorbis. We've set up the logical (Ogg)
  216. ** bitstream decoder. Get the comment and codebook headers and set up the
  217. ** Vorbis decoder.
  218. **
  219. ** The next two packets in order are the comment and codebook headers.
  220. ** They're likely large and may span multiple pages.  Thus we reead
  221. ** and submit data until we get our two pacakets, watching that no
  222. ** pages are missing.  If a page is missing, error out ; losing a
  223. ** header page is the only place where missing data is fatal.
  224. */
  225. i = 0 ;  /* Count of number of packets read */
  226. while (i < 2)
  227. { int result = ogg_sync_pageout (&odata->oy, &odata->og) ;
  228. if (result == 0)
  229. { /* Need more data */
  230. buffer = ogg_sync_buffer (&odata->oy, 4096) ;
  231. bytes = psf_fread (buffer, 1, 4096, psf) ;
  232. if (bytes == 0 && i < 2)
  233. { psf_log_printf (psf, "End of file before finding all Vorbis headers!n") ;
  234. return SFE_MALFORMED_FILE ;
  235. } ;
  236. nn = ogg_sync_wrote (&odata->oy, bytes) ;
  237. }
  238. else if (result == 1)
  239. { /*
  240. ** Don't complain about missing or corrupt data yet. We'll
  241. ** catch it at the packet output phase.
  242. **
  243. ** We can ignore any errors here as they'll also become apparent
  244. ** at packetout.
  245. */
  246. nn = ogg_stream_pagein (&odata->os, &odata->og) ;
  247. while (i < 2)
  248. { result = ogg_stream_packetout (&odata->os, &odata->op) ;
  249. if (result == 0)
  250. break ;
  251. if (result < 0)
  252. { /* Uh oh ; data at some point was corrupted or missing!
  253. ** We can't tolerate that in a header. Die. */
  254. psf_log_printf (psf, "Corrupt secondary header. Exiting.n") ;
  255. return SFE_MALFORMED_FILE ;
  256. } ;
  257. vorbis_synthesis_headerin (&vdata->vi, &vdata->vc, &odata->op) ;
  258. i++ ;
  259. } ;
  260. } ;
  261. } ;
  262. if (log_data)
  263. { int printed_metadata_msg = 0 ;
  264. int k ;
  265. psf_log_printf (psf, "nBitstream is %d channel, %D Hzn", vdata->vi.channels, vdata->vi.rate) ;
  266. psf_log_printf (psf, "Encoded by: %sn", vdata->vc.vendor) ;
  267. /* Throw the comments plus a few lines about the bitstream we're decoding. */
  268. for (k = 0 ; k < ARRAY_LEN (vorbis_metatypes) ; k++)
  269. { char *dd ;
  270. dd = vorbis_comment_query (&vdata->vc, vorbis_metatypes [k].name, 0) ;
  271. if (dd == NULL)
  272. continue ;
  273. if (printed_metadata_msg == 0)
  274. { psf_log_printf (psf, "Metadata :n") ;
  275. printed_metadata_msg = 1 ;
  276. } ;
  277. psf_store_string (psf, vorbis_metatypes [k].id, dd) ;
  278. psf_log_printf (psf, "  %-10s : %sn", vorbis_metatypes [k].name, dd) ;
  279. } ;
  280. psf_log_printf (psf, "Endn") ;
  281. } ;
  282. psf->sf.samplerate = vdata->vi.rate ;
  283. psf->sf.channels = vdata->vi.channels ;
  284. psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ;
  285. /* OK, got and parsed all three headers. Initialize the Vorbis
  286. ** packet->PCM decoder.
  287. ** Central decode state. */
  288. vorbis_synthesis_init (&vdata->vd, &vdata->vi) ;
  289. /* Local state for most of the decode so multiple block decodes can
  290. ** proceed in parallel. We could init multiple vorbis_block structures
  291. ** for vd here. */
  292. vorbis_block_init (&vdata->vd, &vdata->vb) ;
  293. vdata->loc = 0 ;
  294. return 0 ;
  295. } /* ogg_read_header */
  296. static int
  297. ogg_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
  298. {
  299. OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
  300. VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
  301. int k, ret ;
  302. vorbis_info_init (&vdata->vi) ;
  303. /* The style of encoding should be selectable here, VBR quality mode. */
  304. ret = vorbis_encode_init_vbr (&vdata->vi, psf->sf.channels, psf->sf.samplerate, vdata->quality) ;
  305. #if 0
  306. ret = vorbis_encode_init (&vdata->vi, psf->sf.channels, psf->sf.samplerate, -1, 128000, -1) ; /* average bitrate mode */
  307. ret = ( vorbis_encode_setup_managed (&vdata->vi, psf->sf.channels,
  308.  psf->sf.samplerate, -1, 128000, -1) ||
  309. vorbis_encode_ctl (&vdata->vi, OV_ECTL_RATEMANAGE_AVG, NULL) ||
  310. vorbis_encode_setup_init (&vdata->vi)) ;
  311. #endif
  312. if (ret)
  313. return SFE_BAD_OPEN_FORMAT ;
  314. vdata->loc = 0 ;
  315. /* add a comment */
  316. vorbis_comment_init (&vdata->vc) ;
  317. vorbis_comment_add_tag (&vdata->vc, "ENCODER", "libsndfile") ;
  318. for (k = 0 ; k < SF_MAX_STRINGS ; k++)
  319. { const char * name ;
  320. if (psf->strings [k].type == 0)
  321. break ;
  322. switch (psf->strings [k].type)
  323. { case SF_STR_TITLE : name = "TITLE" ; break ;
  324. case SF_STR_COPYRIGHT : name = "COPYRIGHT" ; break ;
  325. case SF_STR_SOFTWARE : name = "SOFTWARE" ; break ;
  326. case SF_STR_ARTIST : name = "ARTIST" ; break ;
  327. case SF_STR_COMMENT : name = "COMMENT" ; break ;
  328. case SF_STR_DATE : name = "DATE" ; break ;
  329. case SF_STR_ALBUM : name = "ALBUM" ; break ;
  330. case SF_STR_LICENSE : name = "LICENSE" ; break ;
  331. default : continue ;
  332. } ;
  333. vorbis_comment_add_tag (&vdata->vc, name, psf->strings [k].str) ;
  334. } ;
  335. /* set up the analysis state and auxiliary encoding storage */
  336. vorbis_analysis_init (&vdata->vd, &vdata->vi) ;
  337. vorbis_block_init (&vdata->vd, &vdata->vb) ;
  338. /*
  339. ** Set up our packet->stream encoder.
  340. ** Pick a random serial number ; that way we can more likely build
  341. ** chained streams just by concatenation.
  342. */
  343. ogg_stream_init (&odata->os, psf_rand_int32 ()) ;
  344. /* Vorbis streams begin with three headers ; the initial header (with
  345.    most of the codec setup parameters) which is mandated by the Ogg
  346.    bitstream spec.  The second header holds any comment fields.  The
  347.    third header holds the bitstream codebook.  We merely need to
  348.    make the headers, then pass them to libvorbis one at a time ;
  349.    libvorbis handles the additional Ogg bitstream constraints */
  350. { ogg_packet header ;
  351. ogg_packet header_comm ;
  352. ogg_packet header_code ;
  353. int result ;
  354. vorbis_analysis_headerout (&vdata->vd, &vdata->vc, &header, &header_comm, &header_code) ;
  355. ogg_stream_packetin (&odata->os, &header) ; /* automatically placed in its own page */
  356. ogg_stream_packetin (&odata->os, &header_comm) ;
  357. ogg_stream_packetin (&odata->os, &header_code) ;
  358. /* This ensures the actual
  359.  * audio data will start on a new page, as per spec
  360.  */
  361. while ((result = ogg_stream_flush (&odata->os, &odata->og)) != 0)
  362. { psf_fwrite (odata->og.header, 1, odata->og.header_len, psf) ;
  363. psf_fwrite (odata->og.body, 1, odata->og.body_len, psf) ;
  364. } ;
  365. }
  366. return 0 ;
  367. } /* ogg_write_header */
  368. static int
  369. ogg_close (SF_PRIVATE *psf)
  370. {
  371. OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
  372. VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
  373. if (odata == NULL || vdata == NULL)
  374. return 0 ;
  375. /* Clean up this logical bitstream ; before exit we shuld see if we're
  376. ** followed by another [chained]. */
  377. if (psf->file.mode == SFM_WRITE)
  378. {
  379. if (psf->write_current <= 0)
  380. ogg_write_header (psf, 0) ;
  381. vorbis_analysis_wrote (&vdata->vd, 0) ;
  382. while (vorbis_analysis_blockout (&vdata->vd, &vdata->vb) == 1)
  383. {
  384. /* analysis, assume we want to use bitrate management */
  385. vorbis_analysis (&vdata->vb, NULL) ;
  386. vorbis_bitrate_addblock (&vdata->vb) ;
  387. while (vorbis_bitrate_flushpacket (&vdata->vd, &odata->op))
  388. { /* weld the packet into the bitstream */
  389. ogg_stream_packetin (&odata->os, &odata->op) ;
  390. /* write out pages (if any) */
  391. while (!odata->eos)
  392. { int result = ogg_stream_pageout (&odata->os, &odata->og) ;
  393. if (result == 0) break ;
  394. psf_fwrite (odata->og.header, 1, odata->og.header_len, psf) ;
  395. psf_fwrite (odata->og.body, 1, odata->og.body_len, psf) ;
  396. /* this could be set above, but for illustrative purposes, I do
  397.    it here (to show that vorbis does know where the stream ends) */
  398. if (ogg_page_eos (&odata->og)) odata->eos = 1 ;
  399. }
  400. }
  401. }
  402. }
  403. /* ogg_page and ogg_packet structs always point to storage in
  404.    libvorbis.  They are never freed or manipulated directly */
  405. vorbis_block_clear (&vdata->vb) ;
  406. vorbis_dsp_clear (&vdata->vd) ;
  407. vorbis_comment_clear (&vdata->vc) ;
  408. vorbis_info_clear (&vdata->vi) ;  /* must be called last */
  409. /* should look here to reopen if chained */
  410. /* OK, clean up the framer */
  411. ogg_sync_clear (&odata->oy) ;
  412. ogg_stream_clear (&odata->os) ;
  413. return 0 ;
  414. } /* ogg_close */
  415. int
  416. ogg_open (SF_PRIVATE *psf)
  417. { OGG_PRIVATE* odata = calloc (1, sizeof (OGG_PRIVATE)) ;
  418. VORBIS_PRIVATE* vdata = calloc (1, sizeof (VORBIS_PRIVATE)) ;
  419. int error = 0 ;
  420. psf->container_data = odata ;
  421. psf->codec_data = vdata ;
  422. if (psf->file.mode == SFM_RDWR)
  423. return SFE_BAD_MODE_RW ;
  424. #if HAVE_VORBIS_VERSION_STRING
  425. psf_log_printf (psf, "Vorbis library version : %sn", vorbis_version_string ()) ;
  426. #endif
  427. if (psf->file.mode == SFM_READ)
  428. { /* Call this here so it only gets called once, so no memory is leaked. */
  429. ogg_sync_init (&odata->oy) ;
  430. if ((error = ogg_read_header (psf, 1)))
  431. return error ;
  432. psf->read_short = ogg_read_s ;
  433. psf->read_int = ogg_read_i ;
  434. psf->read_float = ogg_read_f ;
  435. psf->read_double = ogg_read_d ;
  436. psf->sf.frames = ogg_length (psf) ;
  437. } ;
  438. psf->container_close = ogg_close ;
  439. if (psf->file.mode == SFM_WRITE)
  440. {
  441. /* Set the default vorbis quality here. */
  442. vdata->quality = 0.4 ;
  443. psf->write_header = ogg_write_header ;
  444. psf->write_short = ogg_write_s ;
  445. psf->write_int = ogg_write_i ;
  446. psf->write_float = ogg_write_f ;
  447. psf->write_double = ogg_write_d ;
  448. psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */
  449. psf->str_flags = SF_STR_ALLOW_START ;
  450. } ;
  451. psf->bytewidth = 1 ;
  452. psf->blockwidth = psf->bytewidth * psf->sf.channels ;
  453. psf->seek = ogg_seek ;
  454. psf->command = ogg_command ;
  455. /* FIXME, FIXME, FIXME : Hack these here for now and correct later. */
  456. psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ;
  457. psf->sf.sections = 1 ;
  458. psf->datalength = 1 ;
  459. psf->dataoffset = 0 ;
  460. /* End FIXME. */
  461. return error ;
  462. } /* ogg_open */
  463. static int
  464. ogg_command (SF_PRIVATE *psf, int command, void * data, int datasize)
  465. { VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
  466. switch (command)
  467. { case SFC_SET_VBR_ENCODING_QUALITY :
  468. if (data == NULL || datasize != sizeof (double))
  469. return 1 ;
  470. if (psf->have_written)
  471. return 1 ;
  472. vdata->quality = *((double *) data) ;
  473. /* Clip range. */
  474. vdata->quality = SF_MAX (0.0, SF_MIN (1.0, vdata->quality)) ;
  475. psf_log_printf (psf, "%s : Setting SFC_SET_VBR_ENCODING_QUALITY to %f.n", __func__, vdata->quality) ;
  476. break ;
  477. default :
  478. return 0 ;
  479. } ;
  480. return 0 ;
  481. } /* ogg_command */
  482. static int
  483. ogg_rnull (int samples, void *UNUSED (vptr), int UNUSED (off) , int channels, float **UNUSED (pcm))
  484. {
  485. return samples * channels ;
  486. } /* ogg_rnull */
  487. static int
  488. ogg_rshort (int samples, void *vptr, int off, int channels, float **pcm)
  489. {
  490. short *ptr = (short*) vptr + off ;
  491. int i = 0, j, n ;
  492. for (j = 0 ; j < samples ; j++)
  493. for (n = 0 ; n < channels ; n++)
  494. { float value = pcm [n][j] ;
  495. if (CPU_CLIPS_POSITIVE == 0 && value >= 1.0)
  496. { ptr [i++] = 0x7fff ;
  497. continue ;
  498. } ;
  499. if (CPU_CLIPS_NEGATIVE == 0 && value <= -1.0)
  500. { ptr [i++] = 0x8000 ;
  501. continue ;
  502. } ;
  503. ptr [i++] = lrintf (value * 32767.0f) ;
  504. } ;
  505. return i ;
  506. } /* ogg_rshort */
  507. static int
  508. ogg_rint (int samples, void *vptr, int off, int channels, float **pcm)
  509. {
  510. int *ptr = (int*) vptr + off ;
  511. int i = 0, j, n ;
  512. for (j = 0 ; j < samples ; j++)
  513. for (n = 0 ; n < channels ; n++)
  514. { float value = pcm [n][j] ;
  515. if (CPU_CLIPS_POSITIVE == 0 && value >= 1.0)
  516. { ptr [i++] = 0x7fffffff ;
  517. continue ;
  518. } ;
  519. if (CPU_CLIPS_NEGATIVE == 0 && value <= -1.0)
  520. { ptr [i++] = 0x80000000 ;
  521. continue ;
  522. } ;
  523. ptr [i++] = lrintf (value * 2147483647.0f) ;
  524. } ;
  525. return i ;
  526. } /* ogg_rint */
  527. static int
  528. ogg_rfloat (int samples, void *vptr, int off, int channels, float **pcm)
  529. {
  530. float *ptr = (float*) vptr + off ;
  531. int i = 0, j, n ;
  532. for (j = 0 ; j < samples ; j++)
  533. for (n = 0 ; n < channels ; n++)
  534. ptr [i++] = pcm [n][j] ;
  535. return i ;
  536. } /* ogg_rfloat */
  537. static int
  538. ogg_rdouble (int samples, void *vptr, int off, int channels, float **pcm)
  539. {
  540. double *ptr = (double*) vptr + off ;
  541. int i = 0, j, n ;
  542. for (j = 0 ; j < samples ; j++)
  543. for (n = 0 ; n < channels ; n++)
  544. ptr [i++] = pcm [n][j] ;
  545. return i ;
  546. } /* ogg_rdouble */
  547. static sf_count_t
  548. ogg_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *transfn)
  549. {
  550. VORBIS_PRIVATE *vdata = psf->codec_data ;
  551. OGG_PRIVATE *odata = psf->container_data ;
  552. int result, len, samples, i = 0 ;
  553. float **pcm ;
  554. len = lens / psf->sf.channels ;
  555. while ((samples = vorbis_synthesis_pcmout (&vdata->vd, &pcm)) > 0)
  556. { if (samples > len) samples = len ;
  557. i += transfn (samples, ptr, i, psf->sf.channels, pcm) ;
  558. len -= samples ;
  559. /* tell libvorbis how many samples we actually consumed */
  560. vorbis_synthesis_read (&vdata->vd, samples) ;
  561. vdata->loc += samples ;
  562. if (len == 0)
  563. return i ; /* Is this necessary */
  564. }
  565. goto start0 ;  /* Jump into the nasty nest */
  566. while (len > 0 && !odata->eos)
  567. {
  568. while (len > 0 && !odata->eos)
  569. { result = ogg_sync_pageout (&odata->oy, &odata->og) ;
  570. if (result == 0) break ; /* need more data */
  571. if (result < 0)
  572. { /* missing or corrupt data at this page position */
  573. psf_log_printf (psf, "Corrupt or missing data in bitstream ; continuing...n") ;
  574. }
  575. else
  576. { /* can safely ignore errors at this point */
  577. ogg_stream_pagein (&odata->os, &odata->og) ;
  578. start0:
  579. while (1)
  580. { result = ogg_stream_packetout (&odata->os, &odata->op) ;
  581. if (result == 0)
  582. break ; /* need more data */
  583. if (result < 0)
  584. { /* missing or corrupt data at this page position */
  585. /* no reason to complain ; already complained above */
  586. }
  587. else
  588. { /* we have a packet. Decode it */
  589. if (vorbis_synthesis (&vdata->vb, &odata->op) == 0) /* test for success! */
  590. vorbis_synthesis_blockin (&vdata->vd, &vdata->vb) ;
  591.   /*
  592.   **pcm is a multichannel float vector.  In stereo, for
  593.   example, pcm [0] is left, and pcm [1] is right.  samples is
  594.   the size of each channel.  Convert the float values
  595.   (-1.<=range<=1.) to whatever PCM format and write it out */
  596. while ((samples = vorbis_synthesis_pcmout (&vdata->vd, &pcm)) > 0)
  597. { if (samples>len) samples = len ;
  598. i += transfn (samples, ptr, i, psf->sf.channels, pcm) ;
  599. len -= samples ;
  600. /* tell libvorbis how many samples we actually consumed */
  601. vorbis_synthesis_read (&vdata->vd, samples) ;
  602. vdata->loc += samples ;
  603. if (len == 0)
  604. return i ; /* Is this necessary */
  605. } ;
  606. }
  607. }
  608. if (ogg_page_eos (&odata->og)) odata->eos = 1 ;
  609. }
  610. }
  611. if (!odata->eos)
  612. { char *buffer ;
  613. int bytes ;
  614. buffer = ogg_sync_buffer (&odata->oy, 4096) ;
  615. bytes = psf_fread (buffer, 1, 4096, psf) ;
  616. ogg_sync_wrote (&odata->oy, bytes) ;
  617. if (bytes == 0) odata->eos = 1 ;
  618. }
  619. }
  620. return i ;
  621. } /* ogg_read_sample */
  622. static sf_count_t
  623. ogg_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t lens)
  624. { return ogg_read_sample (psf, (void*) ptr, lens, ogg_rshort) ;
  625. } /* ogg_read_s */
  626. static sf_count_t
  627. ogg_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t lens)
  628. { return ogg_read_sample (psf, (void*) ptr, lens, ogg_rint) ;
  629. } /* ogg_read_i */
  630. static sf_count_t
  631. ogg_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t lens)
  632. { return ogg_read_sample (psf, (void*) ptr, lens, ogg_rfloat) ;
  633. } /* ogg_read_f */
  634. static sf_count_t
  635. ogg_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t lens)
  636. { return ogg_read_sample (psf, (void*) ptr, lens, ogg_rdouble) ;
  637. } /* ogg_read_d */
  638. /*==============================================================================
  639. */
  640. static void
  641. ogg_write_samples (SF_PRIVATE *psf, OGG_PRIVATE *odata, VORBIS_PRIVATE *vdata, int in_frames)
  642. {
  643. vorbis_analysis_wrote (&vdata->vd, in_frames) ;
  644. /*
  645. ** Vorbis does some data preanalysis, then divvies up blocks for
  646. ** more involved (potentially parallel) processing. Get a single
  647. ** block for encoding now.
  648. */
  649. while (vorbis_analysis_blockout (&vdata->vd, &vdata->vb) == 1)
  650. {
  651. /* analysis, assume we want to use bitrate management */
  652. vorbis_analysis (&vdata->vb, NULL) ;
  653. vorbis_bitrate_addblock (&vdata->vb) ;
  654. while (vorbis_bitrate_flushpacket (&vdata->vd, &odata->op))
  655. {
  656. /* weld the packet into the bitstream */
  657. ogg_stream_packetin (&odata->os, &odata->op) ;
  658. /* write out pages (if any) */
  659. while (!odata->eos)
  660. { int result = ogg_stream_pageout (&odata->os, &odata->og) ;
  661. if (result == 0)
  662. break ;
  663. psf_fwrite (odata->og.header, 1, odata->og.header_len, psf) ;
  664. psf_fwrite (odata->og.body, 1, odata->og.body_len, psf) ;
  665. /* This could be set above, but for illustrative purposes, I do
  666. ** it here (to show that vorbis does know where the stream ends) */
  667. if (ogg_page_eos (&odata->og))
  668. odata->eos = 1 ;
  669. } ;
  670. } ;
  671. } ;
  672. vdata->loc += in_frames ;
  673. } /* ogg_write_data */
  674. static sf_count_t
  675. ogg_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t lens)
  676. {
  677. int i, m, j = 0 ;
  678. OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
  679. VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
  680. int in_frames = lens / psf->sf.channels ;
  681. float **buffer = vorbis_analysis_buffer (&vdata->vd, in_frames) ;
  682. for (i = 0 ; i < in_frames ; i++)
  683. for (m = 0 ; m < psf->sf.channels ; m++)
  684. buffer [m][i] = (float) (ptr [j++]) / 32767.0f ;
  685. ogg_write_samples (psf, odata, vdata, in_frames) ;
  686. return lens ;
  687. } /* ogg_write_s */
  688. static sf_count_t
  689. ogg_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t lens)
  690. { int i, m, j = 0 ;
  691. OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
  692. VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
  693. int in_frames = lens / psf->sf.channels ;
  694. float **buffer = vorbis_analysis_buffer (&vdata->vd, in_frames) ;
  695. for (i = 0 ; i < in_frames ; i++)
  696. for (m = 0 ; m < psf->sf.channels ; m++)
  697. buffer [m][i] = (float) (ptr [j++]) / 2147483647.0f ;
  698. ogg_write_samples (psf, odata, vdata, in_frames) ;
  699. return lens ;
  700. } /* ogg_write_i */
  701. static sf_count_t
  702. ogg_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t lens)
  703. { int i, m, j = 0 ;
  704. OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
  705. VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
  706. int in_frames = lens / psf->sf.channels ;
  707. float **buffer = vorbis_analysis_buffer (&vdata->vd, in_frames) ;
  708. for (i = 0 ; i < in_frames ; i++)
  709. for (m = 0 ; m < psf->sf.channels ; m++)
  710. buffer [m][i] = ptr [j++] ;
  711. ogg_write_samples (psf, odata, vdata, in_frames) ;
  712. return lens ;
  713. } /* ogg_write_f */
  714. static sf_count_t
  715. ogg_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t lens)
  716. { int i, m, j = 0 ;
  717. OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
  718. VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
  719. int in_frames = lens / psf->sf.channels ;
  720. float **buffer = vorbis_analysis_buffer (&vdata->vd, in_frames) ;
  721. for (i = 0 ; i < in_frames ; i++)
  722. for (m = 0 ; m < psf->sf.channels ; m++)
  723. buffer [m][i] = (float) ptr [j++] ;
  724. ogg_write_samples (psf, odata, vdata, in_frames) ;
  725. return lens ;
  726. } /* ogg_write_d */
  727. static sf_count_t
  728. ogg_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset)
  729. {
  730. OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ;
  731. VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
  732. if (odata == NULL || vdata == NULL)
  733. return 0 ;
  734. if (offset < 0)
  735. { psf->error = SFE_BAD_SEEK ;
  736. return ((sf_count_t) -1) ;
  737. } ;
  738. if (psf->file.mode == SFM_READ)
  739. { sf_count_t target = offset - vdata->loc ;
  740. if (target < 0)
  741. { /* 12 to allow for OggS bit */
  742. psf_fseek (psf, 12, SEEK_SET) ;
  743. ogg_read_header (psf, 0) ; /* Reset state */
  744. target = offset ;
  745. } ;
  746. while (target > 0)
  747. { sf_count_t m = target > 4096 ? 4096 : target ;
  748. /*
  749. ** Need to multiply by channels here because the seek is done in
  750. ** terms of frames and the read function is done in terms of
  751. ** samples.
  752. */
  753. ogg_read_sample (psf, (void *) NULL, m * psf->sf.channels, ogg_rnull) ;
  754. target -= m ;
  755. } ;
  756. return vdata->loc ;
  757. } ;
  758. return 0 ;
  759. } /* ogg_seek */
  760. /*==============================================================================
  761. ** Most of the following code was snipped from Mike Smith's ogginfo utility
  762. ** which is part of vorbis-tools.
  763. ** Vorbis tools is released under the GPL but Mike has kindly allowed the
  764. ** following to be relicensed as LGPL for libsndfile.
  765. */
  766. typedef struct
  767. {
  768. int isillegal ;
  769. int shownillegal ;
  770. int isnew ;
  771. int end ;
  772. uint32_t serial ; /* must be 32 bit unsigned */
  773. ogg_stream_state os ;
  774. vorbis_info vi ;
  775. vorbis_comment vc ;
  776. sf_count_t lastgranulepos ;
  777. int doneheaders ;
  778. } stream_processor ;
  779. typedef struct
  780. {
  781. stream_processor *streams ;
  782. int allocated ;
  783. int used ;
  784. int in_headers ;
  785. } stream_set ;
  786. static stream_set *
  787. create_stream_set (void)
  788. { stream_set *set = calloc (1, sizeof (stream_set)) ;
  789. set->streams = calloc (5, sizeof (stream_processor)) ;
  790. set->allocated = 5 ;
  791. set->used = 0 ;
  792. return set ;
  793. } /* create_stream_set */
  794. static void
  795. vorbis_end (stream_processor *stream, sf_count_t * len)
  796. { *len += stream->lastgranulepos ;
  797. vorbis_comment_clear (&stream->vc) ;
  798. vorbis_info_clear (&stream->vi) ;
  799. } /* vorbis_end */
  800. static void
  801. free_stream_set (stream_set *set, sf_count_t * len)
  802. { int i ;
  803. for (i = 0 ; i < set->used ; i++)
  804. { if (!set->streams [i].end)
  805. vorbis_end (&set->streams [i], len) ;
  806. ogg_stream_clear (&set->streams [i].os) ;
  807. } ;
  808. free (set->streams) ;
  809. free (set) ;
  810. } /* free_stream_set */
  811. static int
  812. streams_open (stream_set *set)
  813. { int i, res = 0 ;
  814. for (i = 0 ; i < set->used ; i++)
  815. if (!set->streams [i].end)
  816. res ++ ;
  817. return res ;
  818. } /* streams_open */
  819. static stream_processor *
  820. find_stream_processor (stream_set *set, ogg_page *page)
  821. { uint32_t serial = ogg_page_serialno (page) ;
  822. int i, found = 0 ;
  823. int invalid = 0 ;
  824. stream_processor *stream ;
  825. for (i = 0 ; i < set->used ; i++)
  826. {
  827. if (serial == set->streams [i].serial)
  828. { /* We have a match! */
  829. found = 1 ;
  830. stream = & (set->streams [i]) ;
  831. set->in_headers = 0 ;
  832. /* if we have detected EOS, then this can't occur here. */
  833. if (stream->end)
  834. { stream->isillegal = 1 ;
  835. return stream ;
  836. }
  837. stream->isnew = 0 ;
  838. stream->end = ogg_page_eos (page) ;
  839. stream->serial = serial ;
  840. return stream ;
  841. } ;
  842. } ;
  843. /* If there are streams open, and we've reached the end of the
  844. ** headers, then we can't be starting a new stream.
  845. ** XXX: might this sometimes catch ok streams if EOS flag is missing,
  846. ** but the stream is otherwise ok?
  847. */
  848. if (streams_open (set) && !set->in_headers)
  849. invalid = 1 ;
  850. set->in_headers = 1 ;
  851. if (set->allocated < set->used)
  852. stream = &set->streams [set->used] ;
  853. else
  854. { set->allocated += 5 ;
  855. set->streams = realloc (set->streams, sizeof (stream_processor) * set->allocated) ;
  856. stream = &set->streams [set->used] ;
  857. } ;
  858. set->used++ ;
  859. stream->isnew = 1 ;
  860. stream->isillegal = invalid ;
  861. {
  862. int res ;
  863. ogg_packet packet ;
  864. /* We end up processing the header page twice, but that's ok. */
  865. ogg_stream_init (&stream->os, serial) ;
  866. ogg_stream_pagein (&stream->os, page) ;
  867. res = ogg_stream_packetout (&stream->os, &packet) ;
  868. if (res <= 0)
  869. return NULL ;
  870. else if (packet.bytes >= 7 && memcmp (packet.packet, "x01vorbis", 7) == 0)
  871. {
  872. stream->lastgranulepos = 0 ;
  873. vorbis_comment_init (&stream->vc) ;
  874. vorbis_info_init (&stream->vi) ;
  875. } ;
  876. res = ogg_stream_packetout (&stream->os, &packet) ;
  877. /* re-init, ready for processing */
  878. ogg_stream_clear (&stream->os) ;
  879. ogg_stream_init (&stream->os, serial) ;
  880. }
  881. stream->end = ogg_page_eos (page) ;
  882. stream->serial = serial ;
  883. return stream ;
  884. } /* find_stream_processor */
  885. static int
  886. ogg_length_get_next_page (SF_PRIVATE *psf, ogg_sync_state * osync, ogg_page *page)
  887. { static const int CHUNK_SIZE = 4500 ;
  888. while (ogg_sync_pageout (osync, page) <= 0)
  889. { char * buffer = ogg_sync_buffer (osync, CHUNK_SIZE) ;
  890. int bytes = psf_fread (buffer, 1, 4096, psf) ;
  891. if (bytes <= 0)
  892. { ogg_sync_wrote (osync, 0) ;
  893. return 0 ;
  894. } ;
  895. ogg_sync_wrote (osync, bytes) ;
  896. } ;
  897. return 1 ;
  898. } /* ogg_length_get_next_page */
  899. static sf_count_t
  900. ogg_length_aux (SF_PRIVATE * psf)
  901. {
  902. ogg_sync_state osync ;
  903. ogg_page page ;
  904. int gotpage = 0 ;
  905. sf_count_t len = 0 ;
  906. stream_set *processors ;
  907. processors = create_stream_set () ;
  908. if (processors == NULL)
  909. return 0 ; // out of memory?
  910. ogg_sync_init (&osync) ;
  911. while (ogg_length_get_next_page (psf, &osync, &page))
  912. {
  913. stream_processor *p = find_stream_processor (processors, &page) ;
  914. gotpage = 1 ;
  915. if (!p)
  916. { len = 0 ;
  917. break ;
  918. } ;
  919. if (p->isillegal && !p->shownillegal)
  920. {
  921. p->shownillegal = 1 ;
  922. /* If it's a new stream, we want to continue processing this page
  923. ** anyway to suppress additional spurious errors
  924. */
  925. if (!p->isnew) continue ;
  926. } ;
  927. if (!p->isillegal)
  928. { ogg_packet packet ;
  929. int header = 0 ;
  930. ogg_stream_pagein (&p->os, &page) ;
  931. if (p->doneheaders < 3)
  932. header = 1 ;
  933. while (ogg_stream_packetout (&p->os, &packet) > 0)
  934. {
  935. if (p->doneheaders < 3)
  936. { if (vorbis_synthesis_headerin (&p->vi, &p->vc, &packet) < 0)
  937. continue ;
  938. p->doneheaders ++ ;
  939. } ;
  940. } ;
  941. if (!header)
  942. { sf_count_t gp = ogg_page_granulepos (&page) ;
  943. if (gp > 0) p->lastgranulepos = gp ;
  944. } ;
  945. if (p->end)
  946. { vorbis_end (p, &len) ;
  947. p->isillegal = 1 ;
  948. } ;
  949. } ;
  950. } ;
  951. ogg_sync_clear (&osync) ;
  952. free_stream_set (processors, &len) ;
  953. return len ;
  954. } /* ogg_length_aux */
  955. static sf_count_t
  956. ogg_length (SF_PRIVATE *psf)
  957. { sf_count_t length ;
  958. int error ;
  959. if (psf->sf.seekable == 0)
  960. return SF_COUNT_MAX ;
  961. psf_fseek (psf, 0, SEEK_SET) ;
  962. length = ogg_length_aux (psf) ;
  963. psf_fseek (psf, 12, SEEK_SET) ;
  964. if ((error = ogg_read_header (psf, 0)) != 0)
  965. psf->error = error ;
  966. return length ;
  967. } /* ogg_length */
  968. #else /* HAVE_EXTERNAL_LIBS */
  969. int
  970. ogg_open (SF_PRIVATE *psf)
  971. {
  972. psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Vorbis support.n") ;
  973. return SFE_UNIMPLEMENTED ;
  974. } /* ogg_open */
  975. #endif