gstreamer/ext/vorbis/gstvorbisdeclib.h
Wim Taymans dae848818d audio: rework audio caps.
Rework the audio caps similar to the video caps. Remove
width/depth/endianness/signed fields and replace with a simple string
format and media type audio/x-raw.
Create a GstAudioInfo and some helper methods to parse caps.
Remove duplicate code from the ringbuffer and replace with audio info.
Use AudioInfo in the base audio filter class.
Port elements to new API.
2011-08-18 19:15:03 +02:00

194 lines
5.1 KiB
C

/* GStreamer
* Copyright (C) 2010 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
* Copyright (C) 2010 Nokia Corporation. All rights reserved.
* Contact: Stefan Kost <stefan.kost@nokia.com>
*
* Tremor modifications <2006>:
* Chris Lord, OpenedHand Ltd. <chris@openedhand.com>, http://www.o-hand.com/
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_VORBIS_DEC_LIB_H__
#define __GST_VORBIS_DEC_LIB_H__
#include <gst/gst.h>
#include <gst/audio/audio.h>
#ifndef TREMOR
#include <vorbis/codec.h>
typedef float vorbis_sample_t;
typedef ogg_packet ogg_packet_wrapper;
#define GST_VORBIS_DEC_DESCRIPTION "decode raw vorbis streams to float audio"
#define GST_VORBIS_AUDIO_FORMAT GST_AUDIO_FORMAT_F32
#if G_BYTE_ORDER == G_BIG_ENDIAN
#define GST_VORBIS_AUDIO_FORMAT_STR "F32_BE"
#else
#define GST_VORBIS_AUDIO_FORMAT_STR "F32_LE"
#endif
#define GST_VORBIS_DEC_SRC_CAPS \
GST_STATIC_CAPS ("audio/x-raw, " \
"format = (string)" GST_VORBIS_AUDIO_FORMAT_STR ", " \
"rate = (int) [ 1, MAX ], " \
"channels = (int) [ 1, 256 ]")
#define GST_VORBIS_DEC_DEFAULT_SAMPLE_WIDTH (32)
#define GST_VORBIS_DEC_GLIB_TYPE_NAME GstVorbisDec
static inline guint8 *
gst_ogg_packet_data (ogg_packet * p)
{
return (guint8 *) p->packet;
}
static inline gint
gst_ogg_packet_size (ogg_packet * p)
{
return p->bytes;
}
static inline void
gst_ogg_packet_wrapper_map (ogg_packet * packet, GstBuffer * buffer)
{
gsize size;
packet->packet = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
packet->bytes = size;
}
static inline void
gst_ogg_packet_wrapper_unmap (ogg_packet * packet, GstBuffer * buffer)
{
gst_buffer_unmap (buffer, packet->packet, packet->bytes);
}
static inline ogg_packet *
gst_ogg_packet_from_wrapper (ogg_packet_wrapper * packet)
{
return packet;
}
#else
#ifdef USE_TREMOLO
#include <Tremolo/ivorbiscodec.h>
#include <Tremolo/codec_internal.h>
typedef ogg_int16_t vorbis_sample_t;
#else
#include <tremor/ivorbiscodec.h>
typedef ogg_int32_t vorbis_sample_t;
#endif
typedef struct _ogg_packet_wrapper ogg_packet_wrapper;
struct _ogg_packet_wrapper {
ogg_packet packet;
ogg_reference ref;
ogg_buffer buf;
};
#define GST_VORBIS_DEC_DESCRIPTION "decode raw vorbis streams to integer audio"
#define GST_VORBIS_AUDIO_FORMAT GST_AUDIO_FORMAT_S16
#if G_BYTE_ORDER == G_BIG_ENDIAN
#define GST_VORBIS_AUDIO_FORMAT_STR "S16_BE"
#else
#define GST_VORBIS_AUDIO_FORMAT_STR "S16_LE"
#endif
#define GST_VORBIS_DEC_SRC_CAPS \
GST_STATIC_CAPS ("audio/x-raw, " \
"format = (string) " GST_VORBIS_AUDIO_FORMAT_STR ", " \
"rate = (int) [ 1, MAX ], " \
"channels = (int) [ 1, 6 ]")
/* we need a different type name here */
#define GST_VORBIS_DEC_GLIB_TYPE_NAME GstIVorbisDec
/* and still have it compile */
typedef struct _GstVorbisDec GstIVorbisDec;
typedef struct _GstVorbisDecClass GstIVorbisDecClass;
/* compensate minor variation */
#define vorbis_synthesis(a, b) vorbis_synthesis (a, b, 1)
static inline guint8 *
gst_ogg_packet_data (ogg_packet * p)
{
return (guint8 *) p->packet->buffer->data;
}
static inline gint
gst_ogg_packet_size (ogg_packet * p)
{
return p->packet->buffer->size;
}
static inline void
gst_ogg_packet_wrapper_map (ogg_packet_wrapper * packet,
GstBuffer * buffer)
{
ogg_reference *ref = &packet->ref;
ogg_buffer *buf = &packet->buf;
gsize size;
buf->data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
buf->size = size;
buf->refcount = 1;
buf->ptr.owner = NULL;
buf->ptr.next = NULL;
ref->buffer = buf;
ref->begin = 0;
ref->length = buf->size;
ref->next = NULL;
packet->packet.packet = ref;
packet->packet.bytes = ref->length;
}
static inline void
gst_ogg_packet_wrapper_unmap (ogg_packet_wrapper * packet,
GstBuffer * buffer)
{
ogg_reference *ref = &packet->ref;
ogg_buffer *buf = &packet->buf;
gst_buffer_unmap (buffer, buf->data, buf->size);
}
static inline ogg_packet *
gst_ogg_packet_from_wrapper (ogg_packet_wrapper * packet)
{
return &(packet->packet);
}
#endif
typedef void (*CopySampleFunc)(vorbis_sample_t *out, vorbis_sample_t **in,
guint samples, gint channels);
CopySampleFunc get_copy_sample_func (gint channels);
#endif /* __GST_VORBIS_DEC_LIB_H__ */