summaryrefslogtreecommitdiff
path: root/gst/tta/gstttadec.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/tta/gstttadec.c')
-rw-r--r--gst/tta/gstttadec.c444
1 files changed, 0 insertions, 444 deletions
diff --git a/gst/tta/gstttadec.c b/gst/tta/gstttadec.c
deleted file mode 100644
index 1aa9d95f1..000000000
--- a/gst/tta/gstttadec.c
+++ /dev/null
@@ -1,444 +0,0 @@
-/* GStreamer TTA plugin
- * (c) 2004 Arwed v. Merkatz <v.merkatz@gmx.net>
- *
- * based on ttalib
- * (c) 1999-2004 Alexander Djourik <sasha@iszf.irk.ru>
- *
- * gstttadec.c: raw TTA bitstream decoder
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include <gst/gst.h>
-
-#include <math.h>
-#include <string.h>
-
-#include "gstttadec.h"
-#include "ttadec.h"
-#include "filters.h"
-
-#define TTA_BUFFER_SIZE (1024 * 32 * 8)
-
-/* this is from ttadec.h originally */
-
-static const unsigned long bit_mask[] = {
- 0x00000000, 0x00000001, 0x00000003, 0x00000007,
- 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
- 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
- 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
- 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
- 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
- 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
- 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
- 0xffffffff
-};
-
-static const unsigned long bit_shift[] = {
- 0x00000001, 0x00000002, 0x00000004, 0x00000008,
- 0x00000010, 0x00000020, 0x00000040, 0x00000080,
- 0x00000100, 0x00000200, 0x00000400, 0x00000800,
- 0x00001000, 0x00002000, 0x00004000, 0x00008000,
- 0x00010000, 0x00020000, 0x00040000, 0x00080000,
- 0x00100000, 0x00200000, 0x00400000, 0x00800000,
- 0x01000000, 0x02000000, 0x04000000, 0x08000000,
- 0x10000000, 0x20000000, 0x40000000, 0x80000000,
- 0x80000000, 0x80000000, 0x80000000, 0x80000000,
- 0x80000000, 0x80000000, 0x80000000, 0x80000000
-};
-
-static const unsigned long *shift_16 = bit_shift + 4;
-
-/* Filter signals and args */
-enum
-{
- LAST_SIGNAL
-};
-
-enum
-{
- PROP_0
-};
-
-static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-tta, "
- "width = (int) { 8, 16, 24 }, "
- "channels = (int) { 1, 2 }, " "rate = (int) [ 8000, 96000 ]")
- );
-
-static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-raw-int, "
- "width = (int) { 8, 16, 24 }, "
- "depth = (int) { 8, 16, 24 }, "
- "channels = (int) { 1, 2 }, "
- "rate = (int) [ 8000, 96000 ], "
- "endianness = (int) BYTE_ORDER, " "signed = (boolean) true")
- );
-
-static void gst_tta_dec_class_init (GstTtaDecClass * klass);
-static void gst_tta_dec_base_init (GstTtaDecClass * klass);
-static void gst_tta_dec_init (GstTtaDec * ttadec);
-
-static GstFlowReturn gst_tta_dec_chain (GstPad * pad, GstBuffer * in);
-
-static GstElementClass *parent = NULL;
-
-static gboolean
-gst_tta_dec_setcaps (GstPad * pad, GstCaps * caps)
-{
- GstTtaDec *ttadec = GST_TTA_DEC (gst_pad_get_parent (pad));
- GstStructure *structure = gst_caps_get_structure (caps, 0);
- GstCaps *srccaps;
- gint bits, channels;
- gint32 samplerate;
-
-// if (!gst_caps_is_fixed (caps))
-// return GST_PAD_LINK_DELAYED;
-
- gst_structure_get_int (structure, "rate", &samplerate);
- ttadec->samplerate = (guint32) samplerate;
- gst_structure_get_int (structure, "channels", &channels);
- ttadec->channels = (guint) channels;
- gst_structure_get_int (structure, "width", &bits);
- ttadec->bytes = bits / 8;
-
- srccaps = gst_caps_new_simple ("audio/x-raw-int",
- "rate", G_TYPE_INT, ttadec->samplerate,
- "channels", G_TYPE_INT, ttadec->channels,
- "depth", G_TYPE_INT, bits,
- "width", G_TYPE_INT, bits,
- "endianness", G_TYPE_INT, G_BYTE_ORDER,
- "signed", G_TYPE_BOOLEAN, TRUE, NULL);
-
- if (!gst_pad_set_caps (ttadec->srcpad, srccaps))
- return FALSE;
-
- ttadec->frame_length = FRAME_TIME * ttadec->samplerate;
-
- ttadec->tta = g_malloc (ttadec->channels * sizeof (decoder));
- ttadec->cache = g_malloc (ttadec->channels * sizeof (long));
-
- ttadec->decdata =
- (guchar *) g_malloc (ttadec->channels * ttadec->frame_length *
- ttadec->bytes * sizeof (guchar));
-
- return TRUE;
-}
-
-GType
-gst_tta_dec_get_type (void)
-{
- static GType plugin_type = 0;
-
- if (!plugin_type) {
- static const GTypeInfo plugin_info = {
- sizeof (GstTtaDecClass),
- (GBaseInitFunc) gst_tta_dec_base_init,
- NULL,
- (GClassInitFunc) gst_tta_dec_class_init,
- NULL,
- NULL,
- sizeof (GstTtaDec),
- 0,
- (GInstanceInitFunc) gst_tta_dec_init,
- };
- plugin_type = g_type_register_static (GST_TYPE_ELEMENT,
- "GstTtaDec", &plugin_info, 0);
- }
- return plugin_type;
-}
-
-static void
-gst_tta_dec_base_init (GstTtaDecClass * klass)
-{
-
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-
- gst_element_class_add_static_pad_template (element_class, &src_factory);
- gst_element_class_add_static_pad_template (element_class, &sink_factory);
- gst_element_class_set_static_metadata (element_class, "TTA audio decoder",
- "Codec/Decoder/Audio",
- "Decode TTA audio data", "Arwed v. Merkatz <v.merkatz@gmx.net>");
-}
-
-static void
-gst_tta_dec_dispose (GObject * object)
-{
- GstTtaDec *ttadec = GST_TTA_DEC (object);
-
- g_free (ttadec->tta);
- g_free (ttadec->decdata);
- g_free (ttadec->tta_buf.buffer);
-
- G_OBJECT_CLASS (parent)->dispose (object);
-}
-
-static void
-gst_tta_dec_class_init (GstTtaDecClass * klass)
-{
- GObjectClass *gobject_class;
-
- gobject_class = (GObjectClass *) klass;
-
- parent = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = gst_tta_dec_dispose;
-}
-
-static void
-gst_tta_dec_init (GstTtaDec * ttadec)
-{
- GstElementClass *klass = GST_ELEMENT_GET_CLASS (ttadec);
-
- ttadec->sinkpad =
- gst_pad_new_from_template (gst_element_class_get_pad_template (klass,
- "sink"), "sink");
- gst_pad_set_setcaps_function (ttadec->sinkpad, gst_tta_dec_setcaps);
-
- ttadec->srcpad =
- gst_pad_new_from_template (gst_element_class_get_pad_template (klass,
- "src"), "src");
- gst_pad_use_fixed_caps (ttadec->srcpad);
-
- gst_element_add_pad (GST_ELEMENT (ttadec), ttadec->sinkpad);
- gst_element_add_pad (GST_ELEMENT (ttadec), ttadec->srcpad);
- gst_pad_set_chain_function (ttadec->sinkpad, gst_tta_dec_chain);
- ttadec->tta_buf.buffer = (guchar *) g_malloc (TTA_BUFFER_SIZE + 4);
- ttadec->tta_buf.buffer_end = ttadec->tta_buf.buffer + TTA_BUFFER_SIZE;
-}
-
-static void
-rice_init (adapt * rice, unsigned long k0, unsigned long k1)
-{
- rice->k0 = k0;
- rice->k1 = k1;
- rice->sum0 = shift_16[k0];
- rice->sum1 = shift_16[k1];
-}
-
-static void
-decoder_init (decoder * tta, long nch, long byte_size)
-{
- long shift = flt_set[byte_size - 1];
- long i;
-
- for (i = 0; i < nch; i++) {
- filter_init (&tta[i].fst, shift);
- rice_init (&tta[i].rice, 10, 10);
- tta[i].last = 0;
- }
-}
-
-static void
-get_binary (tta_buffer * tta_buf, guchar * buffer, unsigned long buffersize,
- unsigned long *value, unsigned long bits)
-{
- while (tta_buf->bit_count < bits) {
- if (tta_buf->bitpos == tta_buf->buffer_end) {
- int max =
- TTA_BUFFER_SIZE <=
- buffersize - tta_buf->offset ? TTA_BUFFER_SIZE : buffersize -
- tta_buf->offset;
- memcpy (tta_buf->buffer, buffer + tta_buf->offset, max);
- tta_buf->offset += max;
- tta_buf->bitpos = tta_buf->buffer;
- }
-
- tta_buf->bit_cache |= *tta_buf->bitpos << tta_buf->bit_count;
- tta_buf->bit_count += 8;
- tta_buf->bitpos++;
- }
-
- *value = tta_buf->bit_cache & bit_mask[bits];
- tta_buf->bit_cache >>= bits;
- tta_buf->bit_count -= bits;
- tta_buf->bit_cache &= bit_mask[tta_buf->bit_count];
-}
-
-static void
-get_unary (tta_buffer * tta_buf, guchar * buffer, unsigned long buffersize,
- unsigned long *value)
-{
- *value = 0;
-
- while (!(tta_buf->bit_cache ^ bit_mask[tta_buf->bit_count])) {
- if (tta_buf->bitpos == tta_buf->buffer_end) {
- int max =
- TTA_BUFFER_SIZE <=
- buffersize - tta_buf->offset ? TTA_BUFFER_SIZE : buffersize -
- tta_buf->offset;
- memcpy (tta_buf->buffer, buffer + tta_buf->offset, max);
- tta_buf->offset += max;
- tta_buf->bitpos = tta_buf->buffer;
- }
-
- *value += tta_buf->bit_count;
- tta_buf->bit_cache = *tta_buf->bitpos++;
- tta_buf->bit_count = 8;
- }
-
- while (tta_buf->bit_cache & 1) {
- (*value)++;
- tta_buf->bit_cache >>= 1;
- tta_buf->bit_count--;
- }
-
- tta_buf->bit_cache >>= 1;
- tta_buf->bit_count--;
-}
-
-static GstFlowReturn
-gst_tta_dec_chain (GstPad * pad, GstBuffer * in)
-{
- GstTtaDec *ttadec;
- GstBuffer *outbuf, *buf = GST_BUFFER (in);
- guchar *data, *p;
- decoder *dec;
- unsigned long outsize;
- unsigned long size;
- guint32 frame_samples;
- long res;
- long *prev;
-
- ttadec = GST_TTA_DEC (GST_OBJECT_PARENT (pad));
-
- data = GST_BUFFER_DATA (buf);
- size = GST_BUFFER_SIZE (buf);
-
- ttadec->tta_buf.bit_count = 0;
- ttadec->tta_buf.bit_cache = 0;
- ttadec->tta_buf.bitpos = ttadec->tta_buf.buffer_end;
- ttadec->tta_buf.offset = 0;
- decoder_init (ttadec->tta, ttadec->channels, ttadec->bytes);
-
- if (GST_BUFFER_DURATION_IS_VALID (buf)) {
- frame_samples =
- ceil ((gdouble) (GST_BUFFER_DURATION (buf) * ttadec->samplerate) /
- (gdouble) GST_SECOND);
- } else {
- frame_samples = ttadec->samplerate * FRAME_TIME;
- }
- outsize = ttadec->channels * frame_samples * ttadec->bytes;
-
- dec = ttadec->tta;
- p = ttadec->decdata;
- prev = ttadec->cache;
- for (res = 0;
- p < ttadec->decdata + frame_samples * ttadec->channels * ttadec->bytes;) {
- unsigned long unary, binary, depth, k;
- long value, temp_value;
- fltst *fst = &dec->fst;
- adapt *rice = &dec->rice;
- long *last = &dec->last;
-
- // decode Rice unsigned
- get_unary (&ttadec->tta_buf, data, size, &unary);
-
- switch (unary) {
- case 0:
- depth = 0;
- k = rice->k0;
- break;
- default:
- depth = 1;
- k = rice->k1;
- unary--;
- }
-
- if (k) {
- get_binary (&ttadec->tta_buf, data, size, &binary, k);
- value = (unary << k) + binary;
- } else
- value = unary;
-
- switch (depth) {
- case 1:
- rice->sum1 += value - (rice->sum1 >> 4);
- if (rice->k1 > 0 && rice->sum1 < shift_16[rice->k1])
- rice->k1--;
- else if (rice->sum1 > shift_16[rice->k1 + 1])
- rice->k1++;
- value += bit_shift[rice->k0];
- default:
- rice->sum0 += value - (rice->sum0 >> 4);
- if (rice->k0 > 0 && rice->sum0 < shift_16[rice->k0])
- rice->k0--;
- else if (rice->sum0 > shift_16[rice->k0 + 1])
- rice->k0++;
- }
-
- /* this only uses a temporary variable to silence a gcc warning */
- temp_value = DEC (value);
- value = temp_value;
-
- // decompress stage 1: adaptive hybrid filter
- hybrid_filter (fst, &value);
-
- // decompress stage 2: fixed order 1 prediction
- switch (ttadec->bytes) {
- case 1:
- value += PREDICTOR1 (*last, 4);
- break; // bps 8
- case 2:
- value += PREDICTOR1 (*last, 5);
- break; // bps 16
- case 3:
- value += PREDICTOR1 (*last, 5);
- break; // bps 24
- case 4:
- value += *last;
- break; // bps 32
- }
- *last = value;
-
- if (dec < ttadec->tta + ttadec->channels - 1) {
- *prev++ = value;
- dec++;
- } else {
- *prev = value;
- if (ttadec->channels > 1) {
- long *r = prev - 1;
-
- for (*prev += *r / 2; r >= ttadec->cache; r--)
- *r = *(r + 1) - *r;
- for (r = ttadec->cache; r < prev; r++)
- WRITE_BUFFER (r, ttadec->bytes, p);
- }
- WRITE_BUFFER (prev, ttadec->bytes, p);
- prev = ttadec->cache;
- res++;
- dec = ttadec->tta;
- }
- }
-
- outbuf = gst_buffer_new_and_alloc (outsize);
- memcpy (GST_BUFFER_DATA (outbuf), ttadec->decdata, outsize);
- GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf);
- GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf);
- gst_buffer_set_caps (outbuf, GST_PAD_CAPS (ttadec->srcpad));
- return gst_pad_push (ttadec->srcpad, outbuf);
-}
-
-gboolean
-gst_tta_dec_plugin_init (GstPlugin * plugin)
-{
- return gst_element_register (plugin, "ttadec",
- GST_RANK_NONE, GST_TYPE_TTA_DEC);
-}