summaryrefslogtreecommitdiff
path: root/ext/ogg/vorbis_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/ogg/vorbis_parse.c')
-rw-r--r--ext/ogg/vorbis_parse.c239
1 files changed, 0 insertions, 239 deletions
diff --git a/ext/ogg/vorbis_parse.c b/ext/ogg/vorbis_parse.c
deleted file mode 100644
index f9ba746d..00000000
--- a/ext/ogg/vorbis_parse.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- This file borrowed from liboggz
- */
-/*
- Copyright (C) 2003 Commonwealth Scientific and Industrial Research
- Organisation (CSIRO) Australia
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- - Neither the name of CSIRO Australia nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*
- * oggz_auto.c
- *
- * Conrad Parker <conrad@annodex.net>
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "gstoggstream.h"
-
-/*
- * Vorbis packets can be short or long, and each packet overlaps the previous
- * and next packets. The granulepos of a packet is always the last sample
- * that is completely decoded at the end of decoding that packet - i.e. the
- * last packet before the first overlapping packet. If the sizes of packets
- * are 's' and 'l', then the increment will depend on the previous and next
- * packet types:
- * v prev<<1 | next
- * lll: l/2 3
- * lls: 3l/4 - s/4 2
- * lsl: s/2
- * lss: s/2
- * sll: l/4 + s/4 1
- * sls: l/2 0
- * ssl: s/2
- * sss: s/2
- *
- * The previous and next packet types can be inferred from the current packet
- * (additional information is not required)
- *
- * The two blocksizes can be determined from the first header packet, by reading
- * byte 28. 1 << (packet[28] >> 4) == long_size.
- * 1 << (packet[28] & 0xF) == short_size.
- *
- * (see http://xiph.org/vorbis/doc/Vorbis_I_spec.html for specification)
- */
-
-
-void
-parse_vorbis_header_packet (GstOggStream * pad, ogg_packet * packet)
-{
- /*
- * on the first (b_o_s) packet, determine the long and short sizes,
- * and then calculate l/2, l/4 - s/4, 3 * l/4 - s/4, l/2 - s/2 and s/2
- */
- int short_size;
- int long_size;
-
- long_size = 1 << (packet->packet[28] >> 4);
- short_size = 1 << (packet->packet[28] & 0xF);
-
- pad->nln_increments[3] = long_size >> 1;
- pad->nln_increments[2] = 3 * (long_size >> 2) - (short_size >> 2);
- pad->nln_increments[1] = (long_size >> 2) + (short_size >> 2);
- pad->nln_increments[0] = pad->nln_increments[3];
- pad->short_size = short_size;
- pad->long_size = long_size;
- pad->nsn_increment = short_size >> 1;
-}
-
-void
-parse_vorbis_setup_packet (GstOggStream * pad, ogg_packet * op)
-{
- /*
- * the code pages, a whole bunch of other fairly useless stuff, AND,
- * RIGHT AT THE END (of a bunch of variable-length compressed rubbish that
- * basically has only one actual set of values that everyone uses BUT YOU
- * CAN'T BE SURE OF THAT, OH NO YOU CAN'T) is the only piece of data that's
- * actually useful to us - the packet modes (because it's inconceivable to
- * think people might want _just that_ and nothing else, you know, for
- * seeking and stuff).
- *
- * Fortunately, because of the mandate that non-used bits must be zero
- * at the end of the packet, we might be able to sneakily work backwards
- * and find out the information we need (namely a mapping of modes to
- * packet sizes)
- */
- unsigned char *current_pos = &op->packet[op->bytes - 1];
- int offset;
- int size;
- int size_check;
- int *mode_size_ptr;
- int i;
- int ii;
-
- /*
- * This is the format of the mode data at the end of the packet for all
- * Vorbis Version 1 :
- *
- * [ 6:number_of_modes ]
- * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]
- * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]
- * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]
- * [ 1:framing(1) ]
- *
- * e.g.:
- *
- * <-
- * 0 0 0 0 0 1 0 0
- * 0 0 1 0 0 0 0 0
- * 0 0 1 0 0 0 0 0
- * 0 0 1|0 0 0 0 0
- * 0 0 0 0|0|0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0|0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 0 0|0 0 0 0
- * 0 0 0|1|0 0 0 0 |
- * 0 0 0 0 0 0 0 0 V
- * 0 0 0|0 0 0 0 0
- * 0 0 0 0 0 0 0 0
- * 0 0 1|0 0 0 0 0
- * 0 0|1|0 0 0 0 0
- *
- *
- * i.e. each entry is an important bit, 32 bits of 0, 8 bits of blah, a
- * bit of 1.
- * Let's find our last 1 bit first.
- *
- */
-
- size = 0;
-
- offset = 8;
- while (!((1 << --offset) & *current_pos)) {
- if (offset == 0) {
- offset = 8;
- current_pos -= 1;
- }
- }
-
- while (1) {
-
- /*
- * from current_pos-5:(offset+1) to current_pos-1:(offset+1) should
- * be zero
- */
- offset = (offset + 7) % 8;
- if (offset == 7)
- current_pos -= 1;
-
- if (((current_pos[-5] & ~((1 << (offset + 1)) - 1)) != 0)
- ||
- current_pos[-4] != 0
- ||
- current_pos[-3] != 0
- ||
- current_pos[-2] != 0
- || ((current_pos[-1] & ((1 << (offset + 1)) - 1)) != 0)
- ) {
- break;
- }
-
- size += 1;
-
- current_pos -= 5;
-
- }
-
- /* Give ourselves a chance to recover if we went back too far by using
- * the size check. */
- for (ii = 0; ii < 2; ii++) {
- if (offset > 4) {
- size_check = (current_pos[0] >> (offset - 5)) & 0x3F;
- } else {
- /* mask part of byte from current_pos */
- size_check = (current_pos[0] & ((1 << (offset + 1)) - 1));
- /* shift to appropriate position */
- size_check <<= (5 - offset);
- /* or in part of byte from current_pos - 1 */
- size_check |= (current_pos[-1] & ~((1 << (offset + 3)) - 1)) >>
- (offset + 3);
- }
-
- size_check += 1;
- if (size_check == size) {
- break;
- }
- offset = (offset + 1) % 8;
- if (offset == 0)
- current_pos += 1;
- current_pos += 5;
- size -= 1;
- }
-
- /* Store mode size information in our info struct */
- i = -1;
- while ((1 << (++i)) < size);
- pad->vorbis_log2_num_modes = i;
-
- mode_size_ptr = pad->vorbis_mode_sizes;
-
- for (i = 0; i < size; i++) {
- offset = (offset + 1) % 8;
- if (offset == 0)
- current_pos += 1;
- *mode_size_ptr++ = (current_pos[0] >> offset) & 0x1;
- current_pos += 5;
- }
-
-}