mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-12 02:15:31 +00:00
remove gst-libs from gst-plugins module as it is in gst-plugins-base now
Original commit message from CVS: remove gst-libs from gst-plugins module as it is in gst-plugins-base now
This commit is contained in:
parent
4cb81e7ecb
commit
086b25d40a
113 changed files with 6 additions and 17715 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2005-05-06 Christian Schaller <uraeus@gnome.org>
|
||||||
|
|
||||||
|
* gst-libs: Remove all files as this is in gst-plugins-base now
|
||||||
|
* gst-libs/README: add a remove informing of this move
|
||||||
|
|
||||||
2005-05-06 Christian Schaller <uraeus@gnome.org>
|
2005-05-06 Christian Schaller <uraeus@gnome.org>
|
||||||
|
|
||||||
* PORTED_09: update to add videofilter
|
* PORTED_09: update to add videofilter
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
SUBDIRS = gst ext
|
|
||||||
|
|
||||||
DIST_SUBDIRS = gst ext
|
|
1
gst-libs/README
Normal file
1
gst-libs/README
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Everything that used to be here is now in gst-plugins-base module
|
|
@ -1,2 +0,0 @@
|
||||||
SUBDIRS =
|
|
||||||
DIST_SUBDIRS =
|
|
|
@ -1,53 +0,0 @@
|
||||||
# variables used for enum/marshal generation
|
|
||||||
glib_enum_headers=multichannel.h
|
|
||||||
glib_enum_define=GST_AUDIO
|
|
||||||
glib_enum_prefix=gst_audio
|
|
||||||
|
|
||||||
built_sources = multichannel-enumtypes.c
|
|
||||||
built_headers = multichannel-enumtypes.h
|
|
||||||
BUILT_SOURCES = $(built_sources) $(built_headers)
|
|
||||||
|
|
||||||
librarydir = $(libdir)/gstreamer-@GST_MAJORMINOR@
|
|
||||||
|
|
||||||
library_LTLIBRARIES = libgstaudio.la libgstaudiofilter.la
|
|
||||||
noinst_LTLIBRARIES = libgstaudiofilterexample.la
|
|
||||||
|
|
||||||
EXTRA_DIST = gstaudiofiltertemplate.c make_filter
|
|
||||||
CLEANFILES = gstaudiofilterexample.c \
|
|
||||||
$(BUILT_SOURCES)
|
|
||||||
|
|
||||||
libgstaudio_la_SOURCES = audio.c audioclock.c \
|
|
||||||
multichannel.c
|
|
||||||
nodist_libgstaudio_la_SOURCES = $(built_sources)
|
|
||||||
|
|
||||||
libgstaudioincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/audio
|
|
||||||
libgstaudioinclude_HEADERS = \
|
|
||||||
audio.h \
|
|
||||||
audioclock.h \
|
|
||||||
gstaudiofilter.h \
|
|
||||||
multichannel.h
|
|
||||||
|
|
||||||
nodist_libgstaudioinclude_HEADERS = \
|
|
||||||
multichannel-enumtypes.h
|
|
||||||
|
|
||||||
libgstaudio_la_LIBADD =
|
|
||||||
libgstaudio_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
libgstaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
|
||||||
|
|
||||||
libgstaudiofilter_la_SOURCES = gstaudiofilter.c gstaudiofilter.h
|
|
||||||
libgstaudiofilter_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
libgstaudiofilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
|
||||||
|
|
||||||
libgstaudiofilterexample_la_SOURCES = gstaudiofilterexample.c
|
|
||||||
libgstaudiofilterexample_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
libgstaudiofilterexample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
|
||||||
|
|
||||||
gstaudiofilterexample.c: $(srcdir)/make_filter $(srcdir)/gstaudiofiltertemplate.c
|
|
||||||
$(srcdir)/make_filter AudiofilterExample $(srcdir)/gstaudiofiltertemplate.c
|
|
||||||
|
|
||||||
noinst_PROGRAMS = testchannels
|
|
||||||
testchannels_SOURCES = testchannels.c
|
|
||||||
testchannels_CFLAGS = $(GST_CFLAGS)
|
|
||||||
testchannels_LDFLAGS = $(GST_LIBS)
|
|
||||||
|
|
||||||
include $(top_srcdir)/common/glib-gen.mak
|
|
|
@ -1,280 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "audio.h"
|
|
||||||
#include "multichannel-enumtypes.h"
|
|
||||||
|
|
||||||
#include <gst/gststructure.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
gst_audio_frame_byte_size (GstPad * pad)
|
|
||||||
{
|
|
||||||
/* calculate byte size of an audio frame
|
|
||||||
* this should be moved closer to the gstreamer core
|
|
||||||
* and be implemented for every mime type IMO
|
|
||||||
* returns -1 if there's an error (to avoid division by zero),
|
|
||||||
* or the byte size if everything's ok
|
|
||||||
*/
|
|
||||||
|
|
||||||
int width = 0;
|
|
||||||
int channels = 0;
|
|
||||||
const GstCaps *caps = NULL;
|
|
||||||
GstStructure *structure;
|
|
||||||
|
|
||||||
/* get caps of pad */
|
|
||||||
caps = GST_PAD_CAPS (pad);
|
|
||||||
|
|
||||||
if (caps == NULL) {
|
|
||||||
/* ERROR: could not get caps of pad */
|
|
||||||
g_warning ("gstaudio: could not get caps of pad %s:%s\n",
|
|
||||||
GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
|
|
||||||
gst_structure_get_int (structure, "width", &width);
|
|
||||||
gst_structure_get_int (structure, "channels", &channels);
|
|
||||||
return (width / 8) * channels;
|
|
||||||
}
|
|
||||||
|
|
||||||
long
|
|
||||||
gst_audio_frame_length (GstPad * pad, GstBuffer * buf)
|
|
||||||
/* calculate length of buffer in frames
|
|
||||||
* this should be moved closer to the gstreamer core
|
|
||||||
* and be implemented for every mime type IMO
|
|
||||||
* returns 0 if there's an error, or the number of frames if everything's ok
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
int frame_byte_size = 0;
|
|
||||||
|
|
||||||
frame_byte_size = gst_audio_frame_byte_size (pad);
|
|
||||||
if (frame_byte_size == 0)
|
|
||||||
/* error */
|
|
||||||
return 0;
|
|
||||||
/* FIXME: this function assumes the buffer size to be a whole multiple
|
|
||||||
* of the frame byte size
|
|
||||||
*/
|
|
||||||
return GST_BUFFER_SIZE (buf) / frame_byte_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
long
|
|
||||||
gst_audio_frame_rate (GstPad * pad)
|
|
||||||
/*
|
|
||||||
* calculate frame rate (based on caps of pad)
|
|
||||||
* returns 0 if failed, rate if success
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
const GstCaps *caps = NULL;
|
|
||||||
gint rate;
|
|
||||||
GstStructure *structure;
|
|
||||||
|
|
||||||
/* get caps of pad */
|
|
||||||
caps = GST_PAD_CAPS (pad);
|
|
||||||
|
|
||||||
if (caps == NULL) {
|
|
||||||
/* ERROR: could not get caps of pad */
|
|
||||||
g_warning ("gstaudio: could not get caps of pad %s:%s\n",
|
|
||||||
GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
gst_structure_get_int (structure, "rate", &rate);
|
|
||||||
return rate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
gst_audio_length (GstPad * pad, GstBuffer * buf)
|
|
||||||
{
|
|
||||||
/* calculate length in seconds
|
|
||||||
* of audio buffer buf
|
|
||||||
* based on capabilities of pad
|
|
||||||
*/
|
|
||||||
|
|
||||||
long bytes = 0;
|
|
||||||
int width = 0;
|
|
||||||
int channels = 0;
|
|
||||||
int rate = 0;
|
|
||||||
|
|
||||||
double length;
|
|
||||||
|
|
||||||
const GstCaps *caps = NULL;
|
|
||||||
GstStructure *structure;
|
|
||||||
|
|
||||||
g_assert (GST_IS_BUFFER (buf));
|
|
||||||
/* get caps of pad */
|
|
||||||
caps = GST_PAD_CAPS (pad);
|
|
||||||
if (caps == NULL) {
|
|
||||||
/* ERROR: could not get caps of pad */
|
|
||||||
g_warning ("gstaudio: could not get caps of pad %s:%s\n",
|
|
||||||
GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
|
|
||||||
length = 0.0;
|
|
||||||
} else {
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
bytes = GST_BUFFER_SIZE (buf);
|
|
||||||
gst_structure_get_int (structure, "width", &width);
|
|
||||||
gst_structure_get_int (structure, "channels", &channels);
|
|
||||||
gst_structure_get_int (structure, "rate", &rate);
|
|
||||||
|
|
||||||
g_assert (bytes != 0);
|
|
||||||
g_assert (width != 0);
|
|
||||||
g_assert (channels != 0);
|
|
||||||
g_assert (rate != 0);
|
|
||||||
length = (bytes * 8.0) / (double) (rate * channels * width);
|
|
||||||
}
|
|
||||||
/* g_print ("DEBUG: audio: returning length of %f\n", length); */
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
long
|
|
||||||
gst_audio_highest_sample_value (GstPad * pad)
|
|
||||||
/* calculate highest possible sample value
|
|
||||||
* based on capabilities of pad
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
gboolean is_signed = FALSE;
|
|
||||||
gint width = 0;
|
|
||||||
const GstCaps *caps = NULL;
|
|
||||||
GstStructure *structure;
|
|
||||||
|
|
||||||
caps = GST_PAD_CAPS (pad);
|
|
||||||
if (caps == NULL) {
|
|
||||||
g_warning ("gstaudio: could not get caps of pad %s:%s\n",
|
|
||||||
GST_ELEMENT_NAME (gst_pad_get_parent (pad)), GST_PAD_NAME (pad));
|
|
||||||
}
|
|
||||||
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
gst_structure_get_int (structure, "width", &width);
|
|
||||||
gst_structure_get_boolean (structure, "signed", &is_signed);
|
|
||||||
|
|
||||||
if (is_signed)
|
|
||||||
--width;
|
|
||||||
/* example : 16 bit, signed : samples between -32768 and 32767 */
|
|
||||||
return ((long) (1 << width));
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_audio_is_buffer_framed (GstPad * pad, GstBuffer * buf)
|
|
||||||
/* check if the buffer size is a whole multiple of the frame size */
|
|
||||||
{
|
|
||||||
if (GST_BUFFER_SIZE (buf) % gst_audio_frame_byte_size (pad) == 0)
|
|
||||||
return TRUE;
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* _getcaps helper functions
|
|
||||||
* sets structure fields to default for audio type
|
|
||||||
* flag determines which structure fields to set to default
|
|
||||||
* keep these functions in sync with the templates in audio.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* private helper function
|
|
||||||
* sets a list on the structure
|
|
||||||
* pass in structure, fieldname for the list, type of the list values,
|
|
||||||
* number of list values, and each of the values, terminating with NULL
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
_gst_audio_structure_set_list (GstStructure * structure,
|
|
||||||
const gchar * fieldname, GType type, int number, ...)
|
|
||||||
{
|
|
||||||
va_list varargs;
|
|
||||||
GValue value = { 0 };
|
|
||||||
GArray *array;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
g_return_if_fail (structure != NULL);
|
|
||||||
|
|
||||||
g_value_init (&value, GST_TYPE_LIST);
|
|
||||||
array = g_value_peek_pointer (&value);
|
|
||||||
|
|
||||||
va_start (varargs, number);
|
|
||||||
|
|
||||||
for (j = 0; j < number; ++j) {
|
|
||||||
int i;
|
|
||||||
gboolean b;
|
|
||||||
|
|
||||||
GValue list_value = { 0 };
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case G_TYPE_INT:
|
|
||||||
i = va_arg (varargs, int);
|
|
||||||
|
|
||||||
g_value_init (&list_value, G_TYPE_INT);
|
|
||||||
g_value_set_int (&list_value, i);
|
|
||||||
break;
|
|
||||||
case G_TYPE_BOOLEAN:
|
|
||||||
b = va_arg (varargs, gboolean);
|
|
||||||
g_value_init (&list_value, G_TYPE_BOOLEAN);
|
|
||||||
g_value_set_boolean (&list_value, b);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_warning
|
|
||||||
("_gst_audio_structure_set_list: LIST of given type not implemented.");
|
|
||||||
}
|
|
||||||
g_array_append_val (array, list_value);
|
|
||||||
|
|
||||||
}
|
|
||||||
gst_structure_set_value (structure, fieldname, &value);
|
|
||||||
va_end (varargs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_audio_structure_set_int (GstStructure * structure, GstAudioFieldFlag flag)
|
|
||||||
{
|
|
||||||
if (flag & GST_AUDIO_FIELD_RATE)
|
|
||||||
gst_structure_set (structure, "rate", GST_TYPE_INT_RANGE, 1, G_MAXINT,
|
|
||||||
NULL);
|
|
||||||
if (flag & GST_AUDIO_FIELD_CHANNELS)
|
|
||||||
gst_structure_set (structure, "channels", GST_TYPE_INT_RANGE, 1, G_MAXINT,
|
|
||||||
NULL);
|
|
||||||
if (flag & GST_AUDIO_FIELD_ENDIANNESS)
|
|
||||||
_gst_audio_structure_set_list (structure, "endianness", G_TYPE_INT, 2,
|
|
||||||
G_LITTLE_ENDIAN, G_BIG_ENDIAN, NULL);
|
|
||||||
if (flag & GST_AUDIO_FIELD_WIDTH)
|
|
||||||
_gst_audio_structure_set_list (structure, "width", G_TYPE_INT, 3, 8, 16, 32,
|
|
||||||
NULL);
|
|
||||||
if (flag & GST_AUDIO_FIELD_DEPTH)
|
|
||||||
gst_structure_set (structure, "depth", GST_TYPE_INT_RANGE, 1, 32, NULL);
|
|
||||||
if (flag & GST_AUDIO_FIELD_SIGNED)
|
|
||||||
_gst_audio_structure_set_list (structure, "signed", G_TYPE_BOOLEAN, 2, TRUE,
|
|
||||||
FALSE, NULL);
|
|
||||||
if (flag & GST_AUDIO_FIELD_BUFFER_FRAMES)
|
|
||||||
gst_structure_set (structure, "buffer-frames", GST_TYPE_INT_RANGE, 1,
|
|
||||||
G_MAXINT, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
plugin_init (GstPlugin * plugin)
|
|
||||||
{
|
|
||||||
gst_audio_channel_position_get_type ();
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
||||||
GST_VERSION_MINOR,
|
|
||||||
"gstaudio",
|
|
||||||
"Support services for audio plugins",
|
|
||||||
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN);
|
|
|
@ -1,5 +0,0 @@
|
||||||
EXPORTS
|
|
||||||
gst_plugin_desc
|
|
||||||
gst_audio_length
|
|
||||||
gst_audio_is_buffer_framed
|
|
||||||
gst_audio_highest_sample_value
|
|
|
@ -1,131 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
* Library <2001> Thomas Vander Stichele <thomas@apestaart.org>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
#include <gst/audio/audioclock.h>
|
|
||||||
|
|
||||||
#ifndef __GST_AUDIO_AUDIO_H__
|
|
||||||
#define __GST_AUDIO_AUDIO_H__
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
/* For people that are looking at this source: the purpose of these defines is
|
|
||||||
* to make GstCaps a bit easier, in that you don't have to know all of the
|
|
||||||
* properties that need to be defined. you can just use these macros. currently
|
|
||||||
* (8/01) the only plugins that use these are the passthrough, speed, volume,
|
|
||||||
* adder, and [de]interleave plugins. These are for convenience only, and do not
|
|
||||||
* specify the 'limits' of GStreamer. you might also use these definitions as a
|
|
||||||
* base for making your own caps, if need be.
|
|
||||||
*
|
|
||||||
* For example, to make a source pad that can output streams of either mono
|
|
||||||
* float or any channel int:
|
|
||||||
*
|
|
||||||
* template = gst_pad_template_new
|
|
||||||
* ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
|
|
||||||
* gst_caps_append(gst_caps_new ("sink_int", "audio/x-raw-int",
|
|
||||||
* GST_AUDIO_INT_PAD_TEMPLATE_PROPS),
|
|
||||||
* gst_caps_new ("sink_float", "audio/x-raw-float",
|
|
||||||
* GST_AUDIO_FLOAT_PAD_TEMPLATE_PROPS)),
|
|
||||||
* NULL);
|
|
||||||
*
|
|
||||||
* sinkpad = gst_pad_new_from_template(template, "sink");
|
|
||||||
*
|
|
||||||
* Andy Wingo, 18 August 2001
|
|
||||||
* Thomas, 6 September 2002 */
|
|
||||||
|
|
||||||
#define GST_AUDIO_DEF_RATE 44100
|
|
||||||
|
|
||||||
#define GST_AUDIO_INT_PAD_TEMPLATE_CAPS \
|
|
||||||
"audio/x-raw-int, " \
|
|
||||||
"rate = (int) [ 1, MAX ], " \
|
|
||||||
"channels = (int) [ 1, MAX ], " \
|
|
||||||
"endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
|
|
||||||
"width = (int) { 8, 16, 24, 32 }, " \
|
|
||||||
"depth = (int) [ 1, 32 ], " \
|
|
||||||
"signed = (boolean) { true, false }"
|
|
||||||
|
|
||||||
|
|
||||||
/* "standard" int audio is native order, 16 bit stereo. */
|
|
||||||
#define GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS \
|
|
||||||
"audio/x-raw-int, " \
|
|
||||||
"rate = (int) [ 1, MAX ], " \
|
|
||||||
"channels = (int) 2, " \
|
|
||||||
"endianness = (int) BYTE_ORDER, " \
|
|
||||||
"width = (int) 16, " \
|
|
||||||
"depth = (int) 16, " \
|
|
||||||
"signed = (boolean) true"
|
|
||||||
|
|
||||||
#define GST_AUDIO_FLOAT_PAD_TEMPLATE_CAPS \
|
|
||||||
"audio/x-raw-float, " \
|
|
||||||
"rate = (int) [ 1, MAX ], " \
|
|
||||||
"channels = (int) [ 1, MAX ], " \
|
|
||||||
"endianness = (int) { LITTLE_ENDIAN , BIG_ENDIAN }, " \
|
|
||||||
"width = (int) { 32, 64 }, " \
|
|
||||||
"buffer-frames = (int) [ 1, MAX]"
|
|
||||||
|
|
||||||
/* "standard" float audio is native order, 32 bit mono. */
|
|
||||||
#define GST_AUDIO_FLOAT_STANDARD_PAD_TEMPLATE_CAPS \
|
|
||||||
"audio/x-raw-float, " \
|
|
||||||
"width = (int) 32, " \
|
|
||||||
"rate = (int) [ 1, MAX ], " \
|
|
||||||
"channels = (int) 1, " \
|
|
||||||
"endianness = (int) BYTE_ORDER, " \
|
|
||||||
"buffer-frames = (int) [ 1, MAX]"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this library defines and implements some helper functions for audio
|
|
||||||
* handling
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* get byte size of audio frame (based on caps of pad */
|
|
||||||
int gst_audio_frame_byte_size (GstPad* pad);
|
|
||||||
|
|
||||||
/* get length in frames of buffer */
|
|
||||||
long gst_audio_frame_length (GstPad* pad, GstBuffer* buf);
|
|
||||||
|
|
||||||
/* get frame rate based on caps */
|
|
||||||
long gst_audio_frame_rate (GstPad *pad);
|
|
||||||
|
|
||||||
/* calculate length in seconds of audio buffer buf based on caps of pad */
|
|
||||||
double gst_audio_length (GstPad* pad, GstBuffer* buf);
|
|
||||||
|
|
||||||
/* calculate highest possible sample value based on capabilities of pad */
|
|
||||||
long gst_audio_highest_sample_value (GstPad* pad);
|
|
||||||
|
|
||||||
/* check if the buffer size is a whole multiple of the frame size */
|
|
||||||
gboolean gst_audio_is_buffer_framed (GstPad* pad, GstBuffer* buf);
|
|
||||||
|
|
||||||
/* functions useful for _getcaps functions */
|
|
||||||
typedef enum {
|
|
||||||
GST_AUDIO_FIELD_RATE = (1 << 0),
|
|
||||||
GST_AUDIO_FIELD_CHANNELS = (1 << 1),
|
|
||||||
GST_AUDIO_FIELD_ENDIANNESS = (1 << 2),
|
|
||||||
GST_AUDIO_FIELD_WIDTH = (1 << 3),
|
|
||||||
GST_AUDIO_FIELD_DEPTH = (1 << 4),
|
|
||||||
GST_AUDIO_FIELD_SIGNED = (1 << 5),
|
|
||||||
GST_AUDIO_FIELD_BUFFER_FRAMES = (1 << 6)
|
|
||||||
} GstAudioFieldFlag;
|
|
||||||
|
|
||||||
void gst_audio_structure_set_int (GstStructure *structure, GstAudioFieldFlag flag);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_AUDIO_AUDIO_H__ */
|
|
|
@ -1,153 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="audio"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D67893}"
|
|
||||||
RootNamespace="audio"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;AUDIO_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstaudio.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="audio.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/audio.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstaudio.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;AUDIO_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstaudio.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="audio.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstaudio.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\audio.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\audio.def">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\audioclock.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\audio.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\audioclock.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,205 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
* 2000 Wim Taymans <wtay@chello.be>
|
|
||||||
*
|
|
||||||
* audioclock.c: Clock for use by audio plugins
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "audioclock.h"
|
|
||||||
|
|
||||||
static void gst_audio_clock_class_init (GstAudioClockClass * klass);
|
|
||||||
static void gst_audio_clock_init (GstAudioClock * clock);
|
|
||||||
|
|
||||||
static GstClockTime gst_audio_clock_get_internal_time (GstClock * clock);
|
|
||||||
static GstClockEntryStatus gst_audio_clock_id_wait_async (GstClock * clock,
|
|
||||||
GstClockEntry * entry);
|
|
||||||
static void gst_audio_clock_id_unschedule (GstClock * clock,
|
|
||||||
GstClockEntry * entry);
|
|
||||||
|
|
||||||
static GstSystemClockClass *parent_class = NULL;
|
|
||||||
|
|
||||||
/* static guint gst_audio_clock_signals[LAST_SIGNAL] = { 0 }; */
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_audio_clock_get_type (void)
|
|
||||||
{
|
|
||||||
static GType clock_type = 0;
|
|
||||||
|
|
||||||
if (!clock_type) {
|
|
||||||
static const GTypeInfo clock_info = {
|
|
||||||
sizeof (GstAudioClockClass),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(GClassInitFunc) gst_audio_clock_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstAudioClock),
|
|
||||||
4,
|
|
||||||
(GInstanceInitFunc) gst_audio_clock_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
clock_type = g_type_register_static (GST_TYPE_SYSTEM_CLOCK, "GstAudioClock",
|
|
||||||
&clock_info, 0);
|
|
||||||
}
|
|
||||||
return clock_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audio_clock_class_init (GstAudioClockClass * klass)
|
|
||||||
{
|
|
||||||
GObjectClass *gobject_class;
|
|
||||||
GstObjectClass *gstobject_class;
|
|
||||||
GstClockClass *gstclock_class;
|
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
|
||||||
gstobject_class = (GstObjectClass *) klass;
|
|
||||||
gstclock_class = (GstClockClass *) klass;
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_SYSTEM_CLOCK);
|
|
||||||
|
|
||||||
gstclock_class->get_internal_time = gst_audio_clock_get_internal_time;
|
|
||||||
gstclock_class->wait_async = gst_audio_clock_id_wait_async;
|
|
||||||
gstclock_class->unschedule = gst_audio_clock_id_unschedule;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audio_clock_init (GstAudioClock * clock)
|
|
||||||
{
|
|
||||||
gst_object_set_name (GST_OBJECT (clock), "GstAudioClock");
|
|
||||||
|
|
||||||
clock->prev1 = 0;
|
|
||||||
clock->prev2 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstClock *
|
|
||||||
gst_audio_clock_new (gchar * name, GstAudioClockGetTimeFunc func,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
GstAudioClock *aclock =
|
|
||||||
GST_AUDIO_CLOCK (g_object_new (GST_TYPE_AUDIO_CLOCK, NULL));
|
|
||||||
|
|
||||||
aclock->func = func;
|
|
||||||
aclock->user_data = user_data;
|
|
||||||
aclock->adjust = 0;
|
|
||||||
|
|
||||||
return (GstClock *) aclock;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_audio_clock_set_active (GstAudioClock * aclock, gboolean active)
|
|
||||||
{
|
|
||||||
GstClockTime audio_time, system_time;
|
|
||||||
GstClock *clock;
|
|
||||||
GTimeVal timeval;
|
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_AUDIO_CLOCK (aclock));
|
|
||||||
clock = GST_CLOCK (aclock);
|
|
||||||
|
|
||||||
if (active == aclock->active) {
|
|
||||||
/* Nothing to do. */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
audio_time = aclock->func (clock, aclock->user_data);
|
|
||||||
|
|
||||||
g_get_current_time (&timeval);
|
|
||||||
system_time = GST_TIMEVAL_TO_TIME (timeval);
|
|
||||||
|
|
||||||
/* Set the new adjust value in such a way that there's no abrupt
|
|
||||||
discontinuity, i.e. if gst_audio_clock_get_internal_time is
|
|
||||||
invoked right before and right after (de)activating the clock,
|
|
||||||
the values returned will be close to each other, and the second
|
|
||||||
value will be greater than or equal than the first. */
|
|
||||||
if (active) {
|
|
||||||
aclock->adjust = aclock->adjust + system_time - audio_time;
|
|
||||||
} else {
|
|
||||||
aclock->adjust = aclock->adjust + audio_time - system_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
aclock->active = active;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstClockTime
|
|
||||||
gst_audio_clock_get_internal_time (GstClock * clock)
|
|
||||||
{
|
|
||||||
GstAudioClock *aclock = GST_AUDIO_CLOCK (clock);
|
|
||||||
|
|
||||||
if (aclock->active) {
|
|
||||||
return aclock->func (clock, aclock->user_data) + aclock->adjust;
|
|
||||||
} else {
|
|
||||||
GTimeVal timeval;
|
|
||||||
|
|
||||||
g_get_current_time (&timeval);
|
|
||||||
return GST_TIMEVAL_TO_TIME (timeval) + aclock->adjust;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_audio_clock_update_time (GstAudioClock * aclock, GstClockTime time)
|
|
||||||
{
|
|
||||||
/* I don't know of a purpose in updating these; perhaps they can be removed */
|
|
||||||
aclock->prev2 = aclock->prev1;
|
|
||||||
aclock->prev1 = time;
|
|
||||||
|
|
||||||
/* FIXME: the wait_async subsystem should be made threadsafe, but I don't want
|
|
||||||
* to lock and unlock a mutex on every iteration... */
|
|
||||||
while (aclock->async_entries) {
|
|
||||||
GstClockEntry *entry = (GstClockEntry *) aclock->async_entries->data;
|
|
||||||
|
|
||||||
if (entry->time > time)
|
|
||||||
break;
|
|
||||||
|
|
||||||
entry->func ((GstClock *) aclock, time, entry, entry->user_data);
|
|
||||||
|
|
||||||
aclock->async_entries = g_slist_delete_link (aclock->async_entries,
|
|
||||||
aclock->async_entries);
|
|
||||||
/* do I need to free the entry? */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint
|
|
||||||
compare_clock_entries (GstClockEntry * entry1, GstClockEntry * entry2)
|
|
||||||
{
|
|
||||||
return entry1->time - entry2->time;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstClockEntryStatus
|
|
||||||
gst_audio_clock_id_wait_async (GstClock * clock, GstClockEntry * entry)
|
|
||||||
{
|
|
||||||
GstAudioClock *aclock = (GstAudioClock *) clock;
|
|
||||||
|
|
||||||
aclock->async_entries = g_slist_insert_sorted (aclock->async_entries,
|
|
||||||
entry, (GCompareFunc) compare_clock_entries);
|
|
||||||
|
|
||||||
/* is this the proper return val? */
|
|
||||||
return GST_CLOCK_EARLY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audio_clock_id_unschedule (GstClock * clock, GstClockEntry * entry)
|
|
||||||
{
|
|
||||||
GstAudioClock *aclock = (GstAudioClock *) clock;
|
|
||||||
|
|
||||||
aclock->async_entries = g_slist_remove (aclock->async_entries, entry);
|
|
||||||
}
|
|
|
@ -1,81 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
* 2000 Wim Taymans <wtay@chello.be>
|
|
||||||
*
|
|
||||||
* audioclock.h: Clock for use by audio plugins
|
|
||||||
*
|
|
||||||
* 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_AUDIO_CLOCK_H__
|
|
||||||
#define __GST_AUDIO_CLOCK_H__
|
|
||||||
|
|
||||||
#include <gst/gstsystemclock.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_AUDIO_CLOCK \
|
|
||||||
(gst_audio_clock_get_type())
|
|
||||||
#define GST_AUDIO_CLOCK(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_CLOCK,GstAudioClock))
|
|
||||||
#define GST_AUDIO_CLOCK_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_CLOCK,GstAudioClockClass))
|
|
||||||
#define GST_IS_AUDIO_CLOCK(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_CLOCK))
|
|
||||||
#define GST_IS_AUDIO_CLOCK_CLASS(obj) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_CLOCK))
|
|
||||||
|
|
||||||
typedef struct _GstAudioClock GstAudioClock;
|
|
||||||
typedef struct _GstAudioClockClass GstAudioClockClass;
|
|
||||||
|
|
||||||
typedef GstClockTime (*GstAudioClockGetTimeFunc) (GstClock *clock, gpointer user_data);
|
|
||||||
|
|
||||||
|
|
||||||
struct _GstAudioClock {
|
|
||||||
GstSystemClock clock;
|
|
||||||
|
|
||||||
GstClockTime prev1, prev2;
|
|
||||||
|
|
||||||
/* --- protected --- */
|
|
||||||
GstAudioClockGetTimeFunc func;
|
|
||||||
gpointer user_data;
|
|
||||||
|
|
||||||
GstClockTimeDiff adjust;
|
|
||||||
|
|
||||||
GSList *async_entries;
|
|
||||||
|
|
||||||
gboolean active;
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstAudioClockClass {
|
|
||||||
GstSystemClockClass parent_class;
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
};
|
|
||||||
|
|
||||||
GType gst_audio_clock_get_type (void);
|
|
||||||
GstClock* gst_audio_clock_new (gchar *name, GstAudioClockGetTimeFunc func,
|
|
||||||
gpointer user_data);
|
|
||||||
void gst_audio_clock_set_active (GstAudioClock *aclock, gboolean active);
|
|
||||||
|
|
||||||
void gst_audio_clock_update_time (GstAudioClock *aclock, GstClockTime time);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_AUDIO_CLOCK_H__ */
|
|
|
@ -1,144 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="audiofilter"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D67894}"
|
|
||||||
RootNamespace="audiofilter"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;AUDIOFILTER_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstaudiofilter.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="audio.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/audiofilter.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstaudiofilter.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;AUDIOFILTER_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstaudiofilter.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="audio.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstaudiofilter.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\gstaudiofilter.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\gstaudiofilter.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,313 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
* Copyright (C) <2003> David Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*#define DEBUG_ENABLED */
|
|
||||||
#include "gstaudiofilter.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* GstAudiofilter signals and args */
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
/* FILL ME */
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
ARG_0,
|
|
||||||
ARG_METHOD
|
|
||||||
/* FILL ME */
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_audiofilter_base_init (gpointer g_class);
|
|
||||||
static void gst_audiofilter_class_init (gpointer g_class, gpointer class_data);
|
|
||||||
static void gst_audiofilter_init (GTypeInstance * instance, gpointer g_class);
|
|
||||||
|
|
||||||
static void gst_audiofilter_set_property (GObject * object, guint prop_id,
|
|
||||||
const GValue * value, GParamSpec * pspec);
|
|
||||||
static void gst_audiofilter_get_property (GObject * object, guint prop_id,
|
|
||||||
GValue * value, GParamSpec * pspec);
|
|
||||||
|
|
||||||
static void gst_audiofilter_chain (GstPad * pad, GstData * _data);
|
|
||||||
GstCaps *gst_audiofilter_class_get_capslist (GstAudiofilterClass * klass);
|
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_audiofilter_get_type (void)
|
|
||||||
{
|
|
||||||
static GType audiofilter_type = 0;
|
|
||||||
|
|
||||||
if (!audiofilter_type) {
|
|
||||||
static const GTypeInfo audiofilter_info = {
|
|
||||||
sizeof (GstAudiofilterClass),
|
|
||||||
gst_audiofilter_base_init,
|
|
||||||
NULL,
|
|
||||||
gst_audiofilter_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstAudiofilter),
|
|
||||||
0,
|
|
||||||
gst_audiofilter_init,
|
|
||||||
};
|
|
||||||
|
|
||||||
audiofilter_type = g_type_register_static (GST_TYPE_ELEMENT,
|
|
||||||
"GstAudiofilter", &audiofilter_info, G_TYPE_FLAG_ABSTRACT);
|
|
||||||
}
|
|
||||||
return audiofilter_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_base_init (gpointer g_class)
|
|
||||||
{
|
|
||||||
static GstElementDetails audiofilter_details = {
|
|
||||||
"Audio filter base class",
|
|
||||||
"Filter/Effect/Audio",
|
|
||||||
"Filters audio",
|
|
||||||
"David Schleef <ds@schleef.org>"
|
|
||||||
};
|
|
||||||
GstAudiofilterClass *klass = (GstAudiofilterClass *) g_class;
|
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
|
||||||
|
|
||||||
gst_element_class_set_details (element_class, &audiofilter_details);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_class_init (gpointer g_class, gpointer class_data)
|
|
||||||
{
|
|
||||||
GObjectClass *gobject_class;
|
|
||||||
GstElementClass *gstelement_class;
|
|
||||||
GstAudiofilterClass *klass;
|
|
||||||
|
|
||||||
klass = (GstAudiofilterClass *) g_class;
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
|
||||||
gstelement_class = (GstElementClass *) klass;
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
|
||||||
|
|
||||||
gobject_class->set_property = gst_audiofilter_set_property;
|
|
||||||
gobject_class->get_property = gst_audiofilter_get_property;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstPadLinkReturn
|
|
||||||
gst_audiofilter_link (GstPad * pad, const GstCaps * caps)
|
|
||||||
{
|
|
||||||
GstAudiofilter *audiofilter;
|
|
||||||
GstPadLinkReturn ret;
|
|
||||||
GstPadLinkReturn link_ret;
|
|
||||||
GstStructure *structure;
|
|
||||||
GstAudiofilterClass *audiofilter_class;
|
|
||||||
|
|
||||||
GST_DEBUG ("gst_audiofilter_link");
|
|
||||||
audiofilter = GST_AUDIOFILTER (gst_pad_get_parent (pad));
|
|
||||||
audiofilter_class = GST_AUDIOFILTER_CLASS (G_OBJECT_GET_CLASS (audiofilter));
|
|
||||||
|
|
||||||
ret = GST_PAD_LINK_DELAYED; /* intialise with dummy value */
|
|
||||||
if (pad == audiofilter->srcpad) {
|
|
||||||
link_ret = gst_pad_try_set_caps (audiofilter->sinkpad, caps);
|
|
||||||
} else {
|
|
||||||
link_ret = gst_pad_try_set_caps (audiofilter->srcpad, caps);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GST_PAD_LINK_FAILED (link_ret)) {
|
|
||||||
return link_ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
|
|
||||||
if (strcmp (gst_structure_get_name (structure), "audio/x-raw-int") == 0) {
|
|
||||||
ret = gst_structure_get_int (structure, "depth", &audiofilter->depth);
|
|
||||||
ret &= gst_structure_get_int (structure, "width", &audiofilter->width);
|
|
||||||
} else if (strcmp (gst_structure_get_name (structure), "audio/x-raw-float")
|
|
||||||
== 0) {
|
|
||||||
ret &= gst_structure_get_int (structure, "width", &audiofilter->width);
|
|
||||||
} else {
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
ret &= gst_structure_get_int (structure, "rate", &audiofilter->rate);
|
|
||||||
ret &= gst_structure_get_int (structure, "channels", &audiofilter->channels);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
return GST_PAD_LINK_REFUSED;
|
|
||||||
|
|
||||||
audiofilter->bytes_per_sample = (audiofilter->width / 8) *
|
|
||||||
audiofilter->channels;
|
|
||||||
|
|
||||||
if (audiofilter_class->setup)
|
|
||||||
(audiofilter_class->setup) (audiofilter);
|
|
||||||
|
|
||||||
return GST_PAD_LINK_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_init (GTypeInstance * instance, gpointer g_class)
|
|
||||||
{
|
|
||||||
GstAudiofilter *audiofilter = GST_AUDIOFILTER (instance);
|
|
||||||
GstPadTemplate *pad_template;
|
|
||||||
|
|
||||||
GST_DEBUG ("gst_audiofilter_init");
|
|
||||||
|
|
||||||
pad_template =
|
|
||||||
gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "sink");
|
|
||||||
g_return_if_fail (pad_template != NULL);
|
|
||||||
audiofilter->sinkpad = gst_pad_new_from_template (pad_template, "sink");
|
|
||||||
gst_element_add_pad (GST_ELEMENT (audiofilter), audiofilter->sinkpad);
|
|
||||||
gst_pad_set_chain_function (audiofilter->sinkpad, gst_audiofilter_chain);
|
|
||||||
gst_pad_set_link_function (audiofilter->sinkpad, gst_audiofilter_link);
|
|
||||||
gst_pad_set_getcaps_function (audiofilter->sinkpad, gst_pad_proxy_getcaps);
|
|
||||||
|
|
||||||
pad_template =
|
|
||||||
gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
|
|
||||||
g_return_if_fail (pad_template != NULL);
|
|
||||||
audiofilter->srcpad = gst_pad_new_from_template (pad_template, "src");
|
|
||||||
gst_element_add_pad (GST_ELEMENT (audiofilter), audiofilter->srcpad);
|
|
||||||
gst_pad_set_link_function (audiofilter->srcpad, gst_audiofilter_link);
|
|
||||||
gst_pad_set_getcaps_function (audiofilter->srcpad, gst_pad_proxy_getcaps);
|
|
||||||
|
|
||||||
audiofilter->inited = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_chain (GstPad * pad, GstData * data)
|
|
||||||
{
|
|
||||||
GstBuffer *inbuf = GST_BUFFER (data);
|
|
||||||
GstAudiofilter *audiofilter;
|
|
||||||
GstBuffer *outbuf;
|
|
||||||
GstAudiofilterClass *audiofilter_class;
|
|
||||||
|
|
||||||
GST_DEBUG ("gst_audiofilter_chain");
|
|
||||||
|
|
||||||
g_return_if_fail (pad != NULL);
|
|
||||||
g_return_if_fail (GST_IS_PAD (pad));
|
|
||||||
g_return_if_fail (inbuf != NULL);
|
|
||||||
|
|
||||||
audiofilter = GST_AUDIOFILTER (gst_pad_get_parent (pad));
|
|
||||||
//g_return_if_fail (audiofilter->inited);
|
|
||||||
audiofilter_class = GST_AUDIOFILTER_CLASS (G_OBJECT_GET_CLASS (audiofilter));
|
|
||||||
|
|
||||||
GST_DEBUG ("gst_audiofilter_chain: got buffer of %d bytes in '%s'",
|
|
||||||
GST_BUFFER_SIZE (inbuf), GST_OBJECT_NAME (audiofilter));
|
|
||||||
|
|
||||||
if (audiofilter->passthru) {
|
|
||||||
gst_pad_push (audiofilter->srcpad, data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
audiofilter->size = GST_BUFFER_SIZE (inbuf);
|
|
||||||
audiofilter->n_samples = audiofilter->size / audiofilter->bytes_per_sample;
|
|
||||||
|
|
||||||
if (gst_data_is_writable (data)) {
|
|
||||||
if (audiofilter_class->filter_inplace) {
|
|
||||||
(audiofilter_class->filter_inplace) (audiofilter, inbuf);
|
|
||||||
outbuf = inbuf;
|
|
||||||
} else {
|
|
||||||
outbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (inbuf));
|
|
||||||
GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf);
|
|
||||||
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf);
|
|
||||||
|
|
||||||
(audiofilter_class->filter) (audiofilter, outbuf, inbuf);
|
|
||||||
gst_buffer_unref (inbuf);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
outbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (inbuf));
|
|
||||||
GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf);
|
|
||||||
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf);
|
|
||||||
if (audiofilter_class->filter) {
|
|
||||||
(audiofilter_class->filter) (audiofilter, outbuf, inbuf);
|
|
||||||
} else {
|
|
||||||
memcpy (GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (inbuf),
|
|
||||||
GST_BUFFER_SIZE (inbuf));
|
|
||||||
|
|
||||||
(audiofilter_class->filter_inplace) (audiofilter, outbuf);
|
|
||||||
}
|
|
||||||
gst_buffer_unref (inbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_pad_push (audiofilter->srcpad, GST_DATA (outbuf));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_set_property (GObject * object, guint prop_id,
|
|
||||||
const GValue * value, GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstAudiofilter *src;
|
|
||||||
|
|
||||||
/* it's not null if we got it, but it might not be ours */
|
|
||||||
g_return_if_fail (GST_IS_AUDIOFILTER (object));
|
|
||||||
src = GST_AUDIOFILTER (object);
|
|
||||||
|
|
||||||
GST_DEBUG ("gst_audiofilter_set_property");
|
|
||||||
switch (prop_id) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_get_property (GObject * object, guint prop_id, GValue * value,
|
|
||||||
GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstAudiofilter *src;
|
|
||||||
|
|
||||||
/* it's not null if we got it, but it might not be ours */
|
|
||||||
g_return_if_fail (GST_IS_AUDIOFILTER (object));
|
|
||||||
src = GST_AUDIOFILTER (object);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_audiofilter_class_add_pad_templates (GstAudiofilterClass *
|
|
||||||
audiofilter_class, const GstCaps * caps)
|
|
||||||
{
|
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS (audiofilter_class);
|
|
||||||
|
|
||||||
audiofilter_class->caps = gst_caps_copy (caps);
|
|
||||||
|
|
||||||
gst_element_class_add_pad_template (element_class,
|
|
||||||
gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
|
|
||||||
gst_caps_copy (caps)));
|
|
||||||
|
|
||||||
gst_element_class_add_pad_template (element_class,
|
|
||||||
gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
|
|
||||||
gst_caps_copy (caps)));
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
plugin_init (GstPlugin * plugin)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
||||||
GST_VERSION_MINOR,
|
|
||||||
"gstaudiofilter",
|
|
||||||
"Audio filter parent class",
|
|
||||||
plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN)
|
|
|
@ -1,87 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* 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_AUDIOFILTER_H__
|
|
||||||
#define __GST_AUDIOFILTER_H__
|
|
||||||
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
typedef struct _GstAudiofilter GstAudiofilter;
|
|
||||||
typedef struct _GstAudiofilterClass GstAudiofilterClass;
|
|
||||||
|
|
||||||
typedef void (*GstAudiofilterFilterFunc)(GstAudiofilter *filter,
|
|
||||||
GstBuffer *outbuf, GstBuffer *inbuf);
|
|
||||||
typedef void (*GstAudiofilterInplaceFilterFunc)(GstAudiofilter *filter,
|
|
||||||
GstBuffer *buffer);
|
|
||||||
|
|
||||||
typedef void (*GstAudiofilterSetupFunc) (GstAudiofilter *filter);
|
|
||||||
|
|
||||||
|
|
||||||
#define GST_TYPE_AUDIOFILTER \
|
|
||||||
(gst_audiofilter_get_type())
|
|
||||||
#define GST_AUDIOFILTER(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIOFILTER,GstAudiofilter))
|
|
||||||
#define GST_AUDIOFILTER_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOFILTER,GstAudiofilterClass))
|
|
||||||
#define GST_IS_AUDIOFILTER(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIOFILTER))
|
|
||||||
#define GST_IS_AUDIOFILTER_CLASS(obj) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOFILTER))
|
|
||||||
|
|
||||||
struct _GstAudiofilter {
|
|
||||||
GstElement element;
|
|
||||||
|
|
||||||
GstPad *sinkpad,*srcpad;
|
|
||||||
|
|
||||||
/* audio state */
|
|
||||||
gboolean inited;
|
|
||||||
gboolean passthru;
|
|
||||||
|
|
||||||
int rate;
|
|
||||||
int width;
|
|
||||||
int channels;
|
|
||||||
int depth;
|
|
||||||
|
|
||||||
int n_samples;
|
|
||||||
int size;
|
|
||||||
int bytes_per_sample;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstAudiofilterClass {
|
|
||||||
GstElementClass parent_class;
|
|
||||||
|
|
||||||
GstCaps *caps;
|
|
||||||
GstAudiofilterSetupFunc setup;
|
|
||||||
GstAudiofilterInplaceFilterFunc filter_inplace;
|
|
||||||
GstAudiofilterFilterFunc filter;
|
|
||||||
};
|
|
||||||
|
|
||||||
GType gst_audiofilter_get_type(void);
|
|
||||||
|
|
||||||
void gst_audiofilter_class_add_pad_templates (GstAudiofilterClass *audiofilterclass, const GstCaps *caps);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_AUDIOFILTER_H__ */
|
|
||||||
|
|
|
@ -1,270 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
* Copyright (C) <2003> David Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file was (probably) generated from
|
|
||||||
* $Id$
|
|
||||||
* and
|
|
||||||
* MAKEFILTERVERSION
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/audio/audio.h>
|
|
||||||
#include <gst/audio/gstaudiofilter.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
typedef struct _GstAudiofilterTemplate GstAudiofilterTemplate;
|
|
||||||
typedef struct _GstAudiofilterTemplateClass GstAudiofilterTemplateClass;
|
|
||||||
|
|
||||||
#define GST_TYPE_AUDIOFILTER_TEMPLATE \
|
|
||||||
(gst_audiofilter_template_get_type())
|
|
||||||
#define GST_AUDIOFILTER_TEMPLATE(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIOFILTER_TEMPLATE,GstAudiofilterTemplate))
|
|
||||||
#define GST_AUDIOFILTER_TEMPLATE_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOFILTER_TEMPLATE,GstAudiofilterTemplateClass))
|
|
||||||
#define GST_IS_AUDIOFILTER_TEMPLATE(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIOFILTER_TEMPLATE))
|
|
||||||
#define GST_IS_AUDIOFILTER_TEMPLATE_CLASS(obj) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOFILTER_TEMPLATE))
|
|
||||||
|
|
||||||
struct _GstAudiofilterTemplate
|
|
||||||
{
|
|
||||||
GstAudiofilter audiofilter;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstAudiofilterTemplateClass
|
|
||||||
{
|
|
||||||
GstAudiofilterClass parent_class;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
/* FILL ME */
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
ARG_0
|
|
||||||
/* FILL ME */
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_audiofilter_template_base_init (gpointer g_class);
|
|
||||||
static void gst_audiofilter_template_class_init (gpointer g_class,
|
|
||||||
gpointer class_data);
|
|
||||||
static void gst_audiofilter_template_init (GTypeInstance * instance,
|
|
||||||
gpointer g_class);
|
|
||||||
|
|
||||||
static void gst_audiofilter_template_set_property (GObject * object,
|
|
||||||
guint prop_id, const GValue * value, GParamSpec * pspec);
|
|
||||||
static void gst_audiofilter_template_get_property (GObject * object,
|
|
||||||
guint prop_id, GValue * value, GParamSpec * pspec);
|
|
||||||
|
|
||||||
static void gst_audiofilter_template_setup (GstAudiofilter * audiofilter);
|
|
||||||
static void gst_audiofilter_template_filter (GstAudiofilter * audiofilter,
|
|
||||||
GstBuffer * outbuf, GstBuffer * inbuf);
|
|
||||||
static void gst_audiofilter_template_filter_inplace (GstAudiofilter *
|
|
||||||
audiofilter, GstBuffer * buf);
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_audiofilter_template_get_type (void)
|
|
||||||
{
|
|
||||||
static GType audiofilter_template_type = 0;
|
|
||||||
|
|
||||||
if (!audiofilter_template_type) {
|
|
||||||
static const GTypeInfo audiofilter_template_info = {
|
|
||||||
sizeof (GstAudiofilterTemplateClass),
|
|
||||||
gst_audiofilter_template_base_init,
|
|
||||||
NULL,
|
|
||||||
gst_audiofilter_template_class_init,
|
|
||||||
NULL,
|
|
||||||
gst_audiofilter_template_init,
|
|
||||||
sizeof (GstAudiofilterTemplate),
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
audiofilter_template_type = g_type_register_static (GST_TYPE_AUDIOFILTER,
|
|
||||||
"GstAudiofilterTemplate", &audiofilter_template_info, 0);
|
|
||||||
}
|
|
||||||
return audiofilter_template_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_template_base_init (gpointer g_class)
|
|
||||||
{
|
|
||||||
static GstElementDetails audiofilter_template_details = {
|
|
||||||
"Audio filter template",
|
|
||||||
"Filter/Effect/Audio",
|
|
||||||
"Filters audio",
|
|
||||||
"David Schleef <ds@schleef.org>"
|
|
||||||
};
|
|
||||||
GstAudiofilterTemplateClass *klass = (GstAudiofilterTemplateClass *) g_class;
|
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
|
||||||
|
|
||||||
gst_element_class_set_details (element_class, &audiofilter_template_details);
|
|
||||||
|
|
||||||
gst_audiofilter_class_add_pad_templates (GST_AUDIOFILTER_CLASS (g_class),
|
|
||||||
gst_caps_from_string (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_template_class_init (gpointer g_class, gpointer class_data)
|
|
||||||
{
|
|
||||||
GObjectClass *gobject_class;
|
|
||||||
GstElementClass *gstelement_class;
|
|
||||||
GstAudiofilterTemplateClass *klass;
|
|
||||||
GstAudiofilterClass *audiofilter_class;
|
|
||||||
|
|
||||||
klass = (GstAudiofilterTemplateClass *) g_class;
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
|
||||||
gstelement_class = (GstElementClass *) klass;
|
|
||||||
audiofilter_class = (GstAudiofilterClass *) g_class;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
g_object_class_install_property (gobject_class, ARG_METHOD,
|
|
||||||
g_param_spec_enum ("method", "method", "method",
|
|
||||||
GST_TYPE_AUDIOTEMPLATE_METHOD, GST_AUDIOTEMPLATE_METHOD_1,
|
|
||||||
G_PARAM_READWRITE));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gobject_class->set_property = gst_audiofilter_template_set_property;
|
|
||||||
gobject_class->get_property = gst_audiofilter_template_get_property;
|
|
||||||
|
|
||||||
audiofilter_class->setup = gst_audiofilter_template_setup;
|
|
||||||
audiofilter_class->filter = gst_audiofilter_template_filter;
|
|
||||||
audiofilter_class->filter_inplace = gst_audiofilter_template_filter_inplace;
|
|
||||||
audiofilter_class->filter = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_template_init (GTypeInstance * instance, gpointer g_class)
|
|
||||||
{
|
|
||||||
//GstAudiofilterTemplate *audiofilter_template = GST_AUDIOFILTER_TEMPLATE (instance);
|
|
||||||
//GstAudiofilter *audiofilter = GST_AUDIOFILTER (instance);
|
|
||||||
|
|
||||||
GST_DEBUG ("gst_audiofilter_template_init");
|
|
||||||
|
|
||||||
/* do stuff */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_template_set_property (GObject * object, guint prop_id,
|
|
||||||
const GValue * value, GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstAudiofilterTemplate *src;
|
|
||||||
|
|
||||||
/* it's not null if we got it, but it might not be ours */
|
|
||||||
g_return_if_fail (GST_IS_AUDIOFILTER_TEMPLATE (object));
|
|
||||||
src = GST_AUDIOFILTER_TEMPLATE (object);
|
|
||||||
|
|
||||||
GST_DEBUG ("gst_audiofilter_template_set_property");
|
|
||||||
switch (prop_id) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_template_get_property (GObject * object, guint prop_id,
|
|
||||||
GValue * value, GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstAudiofilterTemplate *src;
|
|
||||||
|
|
||||||
/* it's not null if we got it, but it might not be ours */
|
|
||||||
g_return_if_fail (GST_IS_AUDIOFILTER_TEMPLATE (object));
|
|
||||||
src = GST_AUDIOFILTER_TEMPLATE (object);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
plugin_init (GstPlugin * plugin)
|
|
||||||
{
|
|
||||||
if (!gst_library_load ("gstaudiofilter"))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return gst_element_register (plugin, "audiofiltertemplate", GST_RANK_NONE,
|
|
||||||
GST_TYPE_AUDIOFILTER_TEMPLATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
||||||
GST_VERSION_MINOR,
|
|
||||||
"gstaudiofilter_template",
|
|
||||||
"Audio filter template",
|
|
||||||
plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN)
|
|
||||||
|
|
||||||
static void gst_audiofilter_template_setup (GstAudiofilter * audiofilter)
|
|
||||||
{
|
|
||||||
GstAudiofilterTemplate *audiofilter_template;
|
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_AUDIOFILTER_TEMPLATE (audiofilter));
|
|
||||||
audiofilter_template = GST_AUDIOFILTER_TEMPLATE (audiofilter);
|
|
||||||
|
|
||||||
/* if any setup needs to be done, do it here */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* You may choose to implement either a copying filter or an
|
|
||||||
* in-place filter (or both). Implementing only one will give
|
|
||||||
* full functionality, however, implementing both will cause
|
|
||||||
* audiofilter to use the optimal function in every situation,
|
|
||||||
* with a minimum of memory copies. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_template_filter (GstAudiofilter * audiofilter,
|
|
||||||
GstBuffer * outbuf, GstBuffer * inbuf)
|
|
||||||
{
|
|
||||||
GstAudiofilterTemplate *audiofilter_template;
|
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_AUDIOFILTER_TEMPLATE (audiofilter));
|
|
||||||
audiofilter_template = GST_AUDIOFILTER_TEMPLATE (audiofilter);
|
|
||||||
|
|
||||||
/* do something interesting here. This simply copies the source
|
|
||||||
* to the destination. */
|
|
||||||
|
|
||||||
memcpy (GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (inbuf), audiofilter->size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_audiofilter_template_filter_inplace (GstAudiofilter * audiofilter,
|
|
||||||
GstBuffer * buf)
|
|
||||||
{
|
|
||||||
GstAudiofilterTemplate *audiofilter_template;
|
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_AUDIOFILTER_TEMPLATE (audiofilter));
|
|
||||||
audiofilter_template = GST_AUDIOFILTER_TEMPLATE (audiofilter);
|
|
||||||
|
|
||||||
/* do something interesting here. This simply copies the source
|
|
||||||
* to the destination. */
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
LANG=C
|
|
||||||
LC_COLLATE=C
|
|
||||||
export LANG
|
|
||||||
export LC_COLLATE
|
|
||||||
|
|
||||||
Template=$1;
|
|
||||||
srcfile=$2;
|
|
||||||
|
|
||||||
if test x"$1" = x ; then
|
|
||||||
echo "$0 Objectname [srcfile]\n";
|
|
||||||
echo " creates gstobjectname.{c,h} implementing GstObjectname,\n";
|
|
||||||
echo " subclassing GstAudiofilter.\n";
|
|
||||||
exit 1;
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test x"$2" = x ; then
|
|
||||||
srcfile="gstaudiofiltertemplate.c"
|
|
||||||
fi
|
|
||||||
|
|
||||||
id=`echo '$Id$' | sed \
|
|
||||||
-e 's/\$I[d]: \([^$]*\)\$/\1/g'`
|
|
||||||
echo $id
|
|
||||||
|
|
||||||
TEMPLATE=`echo $Template | tr [:lower:] [:upper:]`
|
|
||||||
template=`echo $Template | tr [:upper:] [:lower:]`
|
|
||||||
|
|
||||||
echo TEMPLATE $TEMPLATE
|
|
||||||
echo template $template
|
|
||||||
|
|
||||||
# remember to break up the Id: in the line below
|
|
||||||
sed \
|
|
||||||
-e 's/gstaudiofiltertemplate\.c/SOURCEFILE/g' \
|
|
||||||
-e "s/AudiofilterTemplate/$Template/g" \
|
|
||||||
-e "s/audiofiltertemplate/$template/g" \
|
|
||||||
-e "s/VIDEOFILTERTEMPLATE/$TEMPLATE/g" \
|
|
||||||
-e 's/\$I[d]: \([^$]*\)\$/\1/g' \
|
|
||||||
-e 's/SOURCEFILE/gstaudiofiltertemplate\.c/g' \
|
|
||||||
-e "s%MAKEFILTERVERSION%$id%g" \
|
|
||||||
$srcfile >gst$template.c.tmp && mv gst$template.c.tmp gst$template.c
|
|
||||||
|
|
|
@ -1,634 +0,0 @@
|
||||||
/* GStreamer Multichannel-Audio helper functions
|
|
||||||
* (c) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "multichannel.h"
|
|
||||||
|
|
||||||
#define GST_AUDIO_CHANNEL_POSITIONS_PROPERTY_NAME "channel-positions"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function checks if basic assumptions apply:
|
|
||||||
* - does each position occur at most once?
|
|
||||||
* - do conflicting positions occur?
|
|
||||||
* + front_mono vs. front_left/right
|
|
||||||
* + front_center vs. front_left/right_of_center
|
|
||||||
* + rear_center vs. rear_left/right
|
|
||||||
* It also adds some hacks that 0.8.x needs for compatibility:
|
|
||||||
* - if channels == 1, are we really mono?
|
|
||||||
* - if channels == 2, are we really stereo?
|
|
||||||
*/
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_audio_check_channel_positions (const GstAudioChannelPosition * pos,
|
|
||||||
gint channels)
|
|
||||||
{
|
|
||||||
gint i, n;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
GstAudioChannelPosition pos1[2];
|
|
||||||
GstAudioChannelPosition pos2[1];
|
|
||||||
} conf[] = {
|
|
||||||
/* front: mono <-> stereo */
|
|
||||||
{ {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}},
|
|
||||||
/* front center: 2 <-> 1 */
|
|
||||||
{ {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}},
|
|
||||||
/* rear: 2 <-> 1 */
|
|
||||||
{ {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}}, { {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_INVALID}}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* check for invalid channel positions */
|
|
||||||
for (n = 0; n < channels; n++) {
|
|
||||||
if (pos[n] == GST_AUDIO_CHANNEL_POSITION_INVALID) {
|
|
||||||
g_warning ("Position %d is invalid, not allowed", n);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check for multiple position occurrences */
|
|
||||||
for (i = GST_AUDIO_CHANNEL_POSITION_INVALID + 1;
|
|
||||||
i < GST_AUDIO_CHANNEL_POSITION_NUM; i++) {
|
|
||||||
gint count = 0;
|
|
||||||
|
|
||||||
for (n = 0; n < channels; n++) {
|
|
||||||
if (pos[n] == i)
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count > 1) {
|
|
||||||
g_warning ("Channel position %d occurred %d times, not allowed",
|
|
||||||
i, count);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check for position conflicts */
|
|
||||||
for (i = 0; conf[i].pos1[0] != GST_AUDIO_CHANNEL_POSITION_INVALID; i++) {
|
|
||||||
gboolean found1 = FALSE, found2 = FALSE;
|
|
||||||
|
|
||||||
for (n = 0; n < channels; n++) {
|
|
||||||
if (pos[n] == conf[i].pos1[0] || pos[n] == conf[i].pos1[1])
|
|
||||||
found1 = TRUE;
|
|
||||||
else if (pos[n] == conf[i].pos2[0])
|
|
||||||
found2 = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found1 && found2) {
|
|
||||||
g_warning ("Found conflicting channel positions %d/%d and %d",
|
|
||||||
conf[i].pos1[0], conf[i].pos1[1], conf[i].pos2[0]);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 0.8.x evilry */
|
|
||||||
if ((channels == 1 && pos[0] != GST_AUDIO_CHANNEL_POSITION_FRONT_MONO) ||
|
|
||||||
(channels == 2 && (pos[0] != GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT ||
|
|
||||||
pos[1] != GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT))) {
|
|
||||||
g_warning ("0.8.x: channels=1 implies mono; channels=2 implies stereo");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_audio_get_channel_positions:
|
|
||||||
* @str: A #GstStructure to retrieve channel positions from.
|
|
||||||
*
|
|
||||||
* Retrieves a number of (fixed!) audio channel positions from
|
|
||||||
* the provided #GstStructure and returns it as a newly allocated
|
|
||||||
* array. The caller should g_free () this array. The caller
|
|
||||||
* should also check that the members in this #GstStructure are
|
|
||||||
* indeed "fixed" before calling this function.
|
|
||||||
*
|
|
||||||
* Returns: a newly allocated array containing the channel
|
|
||||||
* positions as provided in the given #GstStructure. Returns
|
|
||||||
* NULL on error.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstAudioChannelPosition *
|
|
||||||
gst_audio_get_channel_positions (GstStructure * str)
|
|
||||||
{
|
|
||||||
GstAudioChannelPosition *pos;
|
|
||||||
gint channels, n;
|
|
||||||
const GValue *pos_val_arr, *pos_val_entry;
|
|
||||||
gboolean res;
|
|
||||||
GType t;
|
|
||||||
|
|
||||||
/* get number of channels, general type checkups */
|
|
||||||
g_return_val_if_fail (str != NULL, NULL);
|
|
||||||
res = gst_structure_get_int (str, "channels", &channels);
|
|
||||||
g_return_val_if_fail (res, NULL);
|
|
||||||
g_return_val_if_fail (channels > 0, NULL);
|
|
||||||
pos_val_arr = gst_structure_get_value (str,
|
|
||||||
GST_AUDIO_CHANNEL_POSITIONS_PROPERTY_NAME);
|
|
||||||
|
|
||||||
/* The following checks are here to retain compatibility for plugins not
|
|
||||||
* implementing this property. They expect that channels=1 implies mono
|
|
||||||
* and channels=2 implies stereo, so we follow that.
|
|
||||||
* This might be removed during 0.9.x. */
|
|
||||||
if (!pos_val_arr && (channels == 1 || channels == 2)) {
|
|
||||||
pos = g_new (GstAudioChannelPosition, channels);
|
|
||||||
if (channels == 1) {
|
|
||||||
pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;
|
|
||||||
} else {
|
|
||||||
pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
|
|
||||||
pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
|
|
||||||
}
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
g_return_val_if_fail (pos_val_arr != NULL, NULL);
|
|
||||||
g_return_val_if_fail (gst_value_list_get_size (pos_val_arr) == channels,
|
|
||||||
NULL);
|
|
||||||
for (n = 0; n < channels; n++) {
|
|
||||||
t = G_VALUE_TYPE (gst_value_list_get_value (pos_val_arr, n));
|
|
||||||
g_return_val_if_fail (t == GST_TYPE_AUDIO_CHANNEL_POSITION, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ... and fill array */
|
|
||||||
pos = g_new (GstAudioChannelPosition, channels);
|
|
||||||
for (n = 0; n < channels; n++) {
|
|
||||||
pos_val_entry = gst_value_list_get_value (pos_val_arr, n);
|
|
||||||
pos[n] = g_value_get_enum (pos_val_entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gst_audio_check_channel_positions (pos, channels)) {
|
|
||||||
g_free (pos);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_audio_set_channel_positions:
|
|
||||||
* @str: A #GstStructure to retrieve channel positions from.
|
|
||||||
* @pos: an array of channel positions. The number of members
|
|
||||||
* in this array should be equal to the (fixed!) number
|
|
||||||
* of the "channels" property in the given #GstStructure.
|
|
||||||
*
|
|
||||||
* Adds a "channel-positions" property to the given #GstStructure,
|
|
||||||
* which will represent the channel positions as given in the
|
|
||||||
* provided #GstAudioChannelPosition array.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_audio_set_channel_positions (GstStructure * str,
|
|
||||||
const GstAudioChannelPosition * pos)
|
|
||||||
{
|
|
||||||
GValue pos_val_arr = { 0 }, pos_val_entry = {
|
|
||||||
0};
|
|
||||||
gint channels, n;
|
|
||||||
gboolean res;
|
|
||||||
|
|
||||||
/* get number of channels, checkups */
|
|
||||||
g_return_if_fail (str != NULL);
|
|
||||||
g_return_if_fail (pos != NULL);
|
|
||||||
res = gst_structure_get_int (str, "channels", &channels);
|
|
||||||
g_return_if_fail (res);
|
|
||||||
g_return_if_fail (channels > 0);
|
|
||||||
if (!gst_audio_check_channel_positions (pos, channels))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* build gvaluearray from positions */
|
|
||||||
g_value_init (&pos_val_entry, GST_TYPE_AUDIO_CHANNEL_POSITION);
|
|
||||||
g_value_init (&pos_val_arr, GST_TYPE_FIXED_LIST);
|
|
||||||
for (n = 0; n < channels; n++) {
|
|
||||||
g_value_set_enum (&pos_val_entry, pos[n]);
|
|
||||||
gst_value_list_append_value (&pos_val_arr, &pos_val_entry);
|
|
||||||
}
|
|
||||||
g_value_unset (&pos_val_entry);
|
|
||||||
|
|
||||||
/* add to structure */
|
|
||||||
gst_structure_set_value (str,
|
|
||||||
GST_AUDIO_CHANNEL_POSITIONS_PROPERTY_NAME, &pos_val_arr);
|
|
||||||
g_value_unset (&pos_val_arr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_audio_set_structure_channel_positions_list:
|
|
||||||
* @str: #GstStructure to set the list of channel positions
|
|
||||||
* on.
|
|
||||||
* @pos: the array containing one or more possible audio
|
|
||||||
* channel positions that we should add in each value
|
|
||||||
* of the array in the given structure.
|
|
||||||
* @num_positions: the number of values in pos.
|
|
||||||
*
|
|
||||||
* Sets a (possibly non-fixed) list of possible audio channel
|
|
||||||
* positions (given in pos) on the given structure. The
|
|
||||||
* structure, after this function has been called, will contain
|
|
||||||
* a "channel-positions" property with an array of the size of
|
|
||||||
* the "channels" property value in the given structure (note
|
|
||||||
* that this means that the channels property in the provided
|
|
||||||
* structure should be fixed!). Each value in the array will
|
|
||||||
* contain each of the values given in the pos array.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_audio_set_structure_channel_positions_list (GstStructure * str,
|
|
||||||
const GstAudioChannelPosition * pos, gint num_positions)
|
|
||||||
{
|
|
||||||
gint channels, n, c;
|
|
||||||
GValue pos_val_arr = { 0 }, pos_val_list = {
|
|
||||||
0}, pos_val_entry = {
|
|
||||||
0};
|
|
||||||
gboolean res;
|
|
||||||
|
|
||||||
/* get number of channels, general type checkups */
|
|
||||||
g_return_if_fail (str != NULL);
|
|
||||||
g_return_if_fail (num_positions > 0);
|
|
||||||
g_return_if_fail (pos != NULL);
|
|
||||||
res = gst_structure_get_int (str, "channels", &channels);
|
|
||||||
g_return_if_fail (res);
|
|
||||||
g_return_if_fail (channels > 0);
|
|
||||||
|
|
||||||
/* 0.8.x: channels=1 or channels=2 is mono/stereo, no positions needed
|
|
||||||
* there (we discard them anyway) */
|
|
||||||
if (channels == 1 || channels == 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* create the array of lists */
|
|
||||||
g_value_init (&pos_val_arr, GST_TYPE_FIXED_LIST);
|
|
||||||
g_value_init (&pos_val_entry, GST_TYPE_AUDIO_CHANNEL_POSITION);
|
|
||||||
for (n = 0; n < channels; n++) {
|
|
||||||
g_value_init (&pos_val_list, GST_TYPE_LIST);
|
|
||||||
for (c = 0; c < num_positions; c++) {
|
|
||||||
g_value_set_enum (&pos_val_entry, pos[c]);
|
|
||||||
gst_value_list_append_value (&pos_val_list, &pos_val_entry);
|
|
||||||
}
|
|
||||||
gst_value_list_append_value (&pos_val_arr, &pos_val_list);
|
|
||||||
g_value_unset (&pos_val_list);
|
|
||||||
}
|
|
||||||
g_value_unset (&pos_val_entry);
|
|
||||||
gst_structure_set_value (str, GST_AUDIO_CHANNEL_POSITIONS_PROPERTY_NAME,
|
|
||||||
&pos_val_arr);
|
|
||||||
g_value_unset (&pos_val_arr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Helper function for below. The structure will be conserved,
|
|
||||||
* but might be cut down. Any additional structures that were
|
|
||||||
* created will be stored in the returned caps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static GstCaps *
|
|
||||||
add_list_to_struct (GstStructure * str,
|
|
||||||
const GstAudioChannelPosition * pos, gint num_positions)
|
|
||||||
{
|
|
||||||
GstCaps *caps = gst_caps_new_empty ();
|
|
||||||
const GValue *chan_val;
|
|
||||||
|
|
||||||
chan_val = gst_structure_get_value (str, "channels");
|
|
||||||
if (G_VALUE_TYPE (chan_val) == G_TYPE_INT) {
|
|
||||||
gst_audio_set_structure_channel_positions_list (str, pos, num_positions);
|
|
||||||
} else if (G_VALUE_TYPE (chan_val) == GST_TYPE_LIST) {
|
|
||||||
gint size;
|
|
||||||
const GValue *sub_val;
|
|
||||||
|
|
||||||
size = gst_value_list_get_size (chan_val);
|
|
||||||
sub_val = gst_value_list_get_value (chan_val, 0);
|
|
||||||
gst_structure_set_value (str, "channels", sub_val);
|
|
||||||
gst_caps_append (caps, add_list_to_struct (str, pos, num_positions));
|
|
||||||
while (--size > 0) {
|
|
||||||
str = gst_structure_copy (str);
|
|
||||||
sub_val = gst_value_list_get_value (chan_val, size);
|
|
||||||
gst_structure_set_value (str, "channels", sub_val);
|
|
||||||
gst_caps_append (caps, add_list_to_struct (str, pos, num_positions));
|
|
||||||
gst_caps_append_structure (caps, str);
|
|
||||||
}
|
|
||||||
} else if (G_VALUE_TYPE (chan_val) == GST_TYPE_INT_RANGE) {
|
|
||||||
gint min, max;
|
|
||||||
|
|
||||||
min = gst_value_get_int_range_min (chan_val);
|
|
||||||
max = gst_value_get_int_range_max (chan_val);
|
|
||||||
|
|
||||||
gst_structure_set (str, "channels", G_TYPE_INT, min, NULL);
|
|
||||||
gst_audio_set_structure_channel_positions_list (str, pos, num_positions);
|
|
||||||
for (++min; min < max; min++) {
|
|
||||||
str = gst_structure_copy (str);
|
|
||||||
gst_structure_set (str, "channels", G_TYPE_INT, min, NULL);
|
|
||||||
gst_audio_set_structure_channel_positions_list (str, pos, num_positions);
|
|
||||||
gst_caps_append_structure (caps, str);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
g_warning ("Unknown value type for channels property");
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_audio_set_caps_channel_positions_list:
|
|
||||||
* @caps: #GstCaps to set the list of channel positions on.
|
|
||||||
* @pos: the array containing one or more possible audio
|
|
||||||
* channel positions that we should add in each value
|
|
||||||
* of the array in the given structure.
|
|
||||||
* @num_positions: the number of values in pos.
|
|
||||||
*
|
|
||||||
* Sets a (possibly non-fixed) list of possible audio channel
|
|
||||||
* positions (given in pos) on the given caps. Each of the
|
|
||||||
* structures of the caps, after this function has been called,
|
|
||||||
* will contain a "channel-positions" property with an array.
|
|
||||||
* Each value in the array will contain each of the values given
|
|
||||||
* in the pos array. Note that the size of the caps might be
|
|
||||||
* increased by this, since each structure with a "channel-
|
|
||||||
* positions" property needs to have a fixed "channels" property.
|
|
||||||
* The input caps is not required to have this.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_audio_set_caps_channel_positions_list (GstCaps * caps,
|
|
||||||
const GstAudioChannelPosition * pos, gint num_positions)
|
|
||||||
{
|
|
||||||
gint size, n;
|
|
||||||
|
|
||||||
/* get number of channels, general type checkups */
|
|
||||||
g_return_if_fail (caps != NULL);
|
|
||||||
g_return_if_fail (num_positions > 0);
|
|
||||||
g_return_if_fail (pos != NULL);
|
|
||||||
|
|
||||||
size = gst_caps_get_size (caps);
|
|
||||||
for (n = 0; n < size; n++) {
|
|
||||||
gst_caps_append (caps, add_list_to_struct (gst_caps_get_structure (caps,
|
|
||||||
n), pos, num_positions));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_audio_fixate_channel_positions:
|
|
||||||
* @str: a #GstStructure containing a (possibly unfixed)
|
|
||||||
* "channel-positions" property.
|
|
||||||
*
|
|
||||||
* Custom fixate function. Elements that implement some sort of
|
|
||||||
* channel conversion algorhithm should use this function for
|
|
||||||
* fixating on GstAudioChannelPosition properties. It will take
|
|
||||||
* care of equal channel positioning (left/right). Caller g_free()s
|
|
||||||
* the return value. The input properties may be (and are supposed
|
|
||||||
* to be) unfixed.
|
|
||||||
* Note that this function is mostly a hack because we currently
|
|
||||||
* have no way to add default fixation functions for new GTypes.
|
|
||||||
*
|
|
||||||
* Returns: fixed values that the caller could use as a fixed
|
|
||||||
* set of #GstAudioChannelPosition values.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstAudioChannelPosition *
|
|
||||||
gst_audio_fixate_channel_positions (GstStructure * str)
|
|
||||||
{
|
|
||||||
GstAudioChannelPosition *pos;
|
|
||||||
gint channels, n, num_unfixed = 0, i, c;
|
|
||||||
const GValue *pos_val_arr, *pos_val_entry, *pos_val;
|
|
||||||
gboolean res, is_stereo = TRUE;
|
|
||||||
GType t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We're going to do this cluelessly. We'll make an array of values that
|
|
||||||
* conflict with each other and, for each iteration in this array, pick
|
|
||||||
* either one until all unknown values are filled. This might not work in
|
|
||||||
* corner cases but should work OK for the general case.
|
|
||||||
*/
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
GstAudioChannelPosition pos1[2];
|
|
||||||
GstAudioChannelPosition pos2[1];
|
|
||||||
} conf[] = {
|
|
||||||
/* front: mono <-> stereo */
|
|
||||||
{ {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}},
|
|
||||||
/* front center: 2 <-> 1 */
|
|
||||||
{ {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER}, {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}},
|
|
||||||
/* rear: 2 <-> 1 */
|
|
||||||
{ {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}}, { {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_INVALID, GST_AUDIO_CHANNEL_POSITION_INVALID}, {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_LFE}}, { {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_INVALID}}, { {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_INVALID, GST_AUDIO_CHANNEL_POSITION_INVALID}, {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_INVALID}}
|
|
||||||
};
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
gint num_opt[3];
|
|
||||||
guint num_opts[3];
|
|
||||||
gboolean is_fixed[3];
|
|
||||||
gint choice; /* -1 is none, 0 is the two, 1 is the one */
|
|
||||||
} opt;
|
|
||||||
|
|
||||||
/* get number of channels, general type checkups */
|
|
||||||
g_return_val_if_fail (str != NULL, NULL);
|
|
||||||
res = gst_structure_get_int (str, "channels", &channels);
|
|
||||||
g_return_val_if_fail (res, NULL);
|
|
||||||
g_return_val_if_fail (channels > 0, NULL);
|
|
||||||
|
|
||||||
/* 0.8.x mono/stereo checks */
|
|
||||||
pos_val_arr = gst_structure_get_value (str,
|
|
||||||
GST_AUDIO_CHANNEL_POSITIONS_PROPERTY_NAME);
|
|
||||||
if (!pos_val_arr && (channels == 1 || channels == 2)) {
|
|
||||||
pos = g_new (GstAudioChannelPosition, channels);
|
|
||||||
if (channels == 1) {
|
|
||||||
pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;
|
|
||||||
} else {
|
|
||||||
pos[0] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
|
|
||||||
pos[1] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
|
|
||||||
}
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
g_return_val_if_fail (pos_val_arr != NULL, NULL);
|
|
||||||
g_return_val_if_fail (gst_value_list_get_size (pos_val_arr) == channels,
|
|
||||||
NULL);
|
|
||||||
for (n = 0; n < channels; n++) {
|
|
||||||
t = G_VALUE_TYPE (gst_value_list_get_value (pos_val_arr, n));
|
|
||||||
g_return_val_if_fail (t == GST_TYPE_LIST ||
|
|
||||||
t == GST_TYPE_AUDIO_CHANNEL_POSITION, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* all unknown, to start with */
|
|
||||||
pos = g_new (GstAudioChannelPosition, channels);
|
|
||||||
for (n = 0; n < channels; n++)
|
|
||||||
pos[n] = GST_AUDIO_CHANNEL_POSITION_INVALID;
|
|
||||||
num_unfixed = channels;
|
|
||||||
|
|
||||||
/* Iterate the array of conflicting values */
|
|
||||||
for (i = 0; conf[i].pos1[0] != GST_AUDIO_CHANNEL_POSITION_INVALID ||
|
|
||||||
conf[i].pos2[0] != GST_AUDIO_CHANNEL_POSITION_INVALID; i++) {
|
|
||||||
/* front/center only important if not mono (obviously) */
|
|
||||||
if (conf[i].pos1[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER &&
|
|
||||||
!is_stereo)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* init values */
|
|
||||||
for (n = 0; n < 3; n++) {
|
|
||||||
opt.num_opt[n] = -1;
|
|
||||||
opt.num_opts[n] = -1;
|
|
||||||
opt.is_fixed[n] = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now, we'll see for each channel if it allows for any of the values in
|
|
||||||
* the set of conflicting audio channel positions and keep scores. */
|
|
||||||
for (n = 0; n < channels; n++) {
|
|
||||||
/* if the channel is already taken, don't bother */
|
|
||||||
if (pos[n] != GST_AUDIO_CHANNEL_POSITION_INVALID)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
pos_val_entry = gst_value_list_get_value (pos_val_arr, n);
|
|
||||||
t = G_VALUE_TYPE (pos_val_entry);
|
|
||||||
if (t == GST_TYPE_LIST) {
|
|
||||||
/* This algorhythm is suboptimal. */
|
|
||||||
for (c = 0; c < gst_value_list_get_size (pos_val_entry); c++) {
|
|
||||||
pos_val = gst_value_list_get_value (pos_val_entry, c);
|
|
||||||
if (g_value_get_enum (pos_val) == conf[i].pos1[0] &&
|
|
||||||
opt.num_opts[0] > gst_value_list_get_size (pos_val_entry) &&
|
|
||||||
!opt.is_fixed[0]) {
|
|
||||||
/* Now test if the old position of num_opt[0] also allows for
|
|
||||||
* the other channel (which was skipped previously). If so,
|
|
||||||
* keep score. */
|
|
||||||
if (opt.num_opt[0] != -1) {
|
|
||||||
gint c1;
|
|
||||||
|
|
||||||
pos_val_entry = gst_value_list_get_value (pos_val_arr,
|
|
||||||
opt.num_opt[0]);
|
|
||||||
if (G_VALUE_TYPE (pos_val_entry) == GST_TYPE_LIST) {
|
|
||||||
for (c1 = 0; c1 < gst_value_list_get_size (pos_val_entry); c1++) {
|
|
||||||
pos_val = gst_value_list_get_value (pos_val_entry, c1);
|
|
||||||
if (g_value_get_enum (pos_val) == conf[i].pos1[1] &&
|
|
||||||
opt.num_opts[1] > opt.num_opts[0] && !opt.is_fixed[1]) {
|
|
||||||
opt.num_opts[1] = opt.num_opts[0];
|
|
||||||
opt.num_opt[1] = opt.num_opt[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pos_val = gst_value_list_get_value (pos_val_entry, c);
|
|
||||||
}
|
|
||||||
pos_val_entry = gst_value_list_get_value (pos_val_arr, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* and save values */
|
|
||||||
opt.num_opts[0] = gst_value_list_get_size (pos_val_entry);
|
|
||||||
opt.num_opt[0] = n;
|
|
||||||
} else if (g_value_get_enum (pos_val) == conf[i].pos1[1] &&
|
|
||||||
opt.num_opts[1] > gst_value_list_get_size (pos_val_entry) &&
|
|
||||||
!opt.is_fixed[1] && n != opt.num_opt[0]) {
|
|
||||||
opt.num_opts[1] = gst_value_list_get_size (pos_val_entry);
|
|
||||||
opt.num_opt[1] = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 2 goes separately, because 0/1 vs. 2 are separate */
|
|
||||||
if (g_value_get_enum (pos_val) == conf[i].pos2[0] &&
|
|
||||||
opt.num_opts[2] > gst_value_list_get_size (pos_val_entry) &&
|
|
||||||
!opt.is_fixed[2]) {
|
|
||||||
opt.num_opts[2] = gst_value_list_get_size (pos_val_entry);
|
|
||||||
opt.num_opt[2] = n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (g_value_get_enum (pos_val_entry) == conf[i].pos1[0]) {
|
|
||||||
opt.num_opt[0] = n;
|
|
||||||
opt.is_fixed[0] = TRUE;
|
|
||||||
} else if (g_value_get_enum (pos_val_entry) == conf[i].pos1[1]) {
|
|
||||||
opt.num_opt[1] = n;
|
|
||||||
opt.is_fixed[1] = TRUE;
|
|
||||||
} else if (g_value_get_enum (pos_val_entry) == conf[i].pos2[0]) {
|
|
||||||
opt.num_opt[2] = n;
|
|
||||||
opt.is_fixed[2] = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check our results and choose either one */
|
|
||||||
if ((opt.is_fixed[0] || opt.is_fixed[1]) && opt.is_fixed[2]) {
|
|
||||||
g_warning ("Pre-fixated on both %d/%d and %d - conflict!",
|
|
||||||
conf[i].pos1[0], conf[i].pos1[1], conf[i].pos2[0]);
|
|
||||||
g_free (pos);
|
|
||||||
return NULL;
|
|
||||||
} else if ((opt.is_fixed[0] && opt.num_opt[1] == -1) ||
|
|
||||||
(opt.is_fixed[1] && opt.num_opt[0] == -1)) {
|
|
||||||
g_warning ("Pre-fixated one side, but other side n/a of %d/%d",
|
|
||||||
conf[i].pos1[0], conf[i].pos1[1]);
|
|
||||||
g_free (pos);
|
|
||||||
return NULL;
|
|
||||||
} else if (opt.is_fixed[0] || opt.is_fixed[1]) {
|
|
||||||
opt.choice = 0;
|
|
||||||
} else if (opt.is_fixed[2]) {
|
|
||||||
opt.choice = 1;
|
|
||||||
} else if (opt.num_opt[0] != -1 && opt.num_opt[1] != -1) {
|
|
||||||
opt.choice = 0;
|
|
||||||
} else if (opt.num_opt[2] != -1) {
|
|
||||||
opt.choice = 1;
|
|
||||||
} else {
|
|
||||||
opt.choice = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* stereo? Note that we keep is_stereo to TRUE if we didn't decide on
|
|
||||||
* any arrangement. The mono/stereo channels might be handled elsewhere
|
|
||||||
* which is clearly outside the scope of this element, so we cannot
|
|
||||||
* know and expect the application to handle that then. */
|
|
||||||
if (conf[i].pos2[0] == GST_AUDIO_CHANNEL_POSITION_FRONT_MONO &&
|
|
||||||
opt.choice == 1) {
|
|
||||||
is_stereo = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now actually decide what we'll do and fixate on that */
|
|
||||||
if (opt.choice == 0) {
|
|
||||||
g_assert (conf[i].pos1[0] != GST_AUDIO_CHANNEL_POSITION_INVALID &&
|
|
||||||
conf[i].pos1[1] != GST_AUDIO_CHANNEL_POSITION_INVALID);
|
|
||||||
pos[opt.num_opt[0]] = conf[i].pos1[0];
|
|
||||||
pos[opt.num_opt[1]] = conf[i].pos1[1];
|
|
||||||
num_unfixed -= 2;
|
|
||||||
} else if (opt.choice == 1) {
|
|
||||||
g_assert (conf[i].pos2[0] != GST_AUDIO_CHANNEL_POSITION_INVALID);
|
|
||||||
pos[opt.num_opt[2]] = conf[i].pos2[0];
|
|
||||||
num_unfixed--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* safety check */
|
|
||||||
if (num_unfixed > 0) {
|
|
||||||
g_warning ("%d unfixed channel positions left after fixation!",
|
|
||||||
num_unfixed);
|
|
||||||
g_free (pos);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gst_audio_check_channel_positions (pos, channels)) {
|
|
||||||
g_free (pos);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
|
@ -1,90 +0,0 @@
|
||||||
/* GStreamer Multichannel-Audio helper functions
|
|
||||||
* (c) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* 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_AUDIO_MULTICHANNEL_H__
|
|
||||||
#define __GST_AUDIO_MULTICHANNEL_H__
|
|
||||||
|
|
||||||
#include <gst/audio/audio.h>
|
|
||||||
#include <gst/audio/multichannel-enumtypes.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_INVALID = -1,
|
|
||||||
|
|
||||||
/* Main front speakers. Mono and left/right are mututally exclusive! */
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_MONO,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
||||||
|
|
||||||
/* rear. Left/right and center are mututally exclusive! */
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
|
|
||||||
|
|
||||||
/* subwoofer/low-frequency */
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_LFE,
|
|
||||||
|
|
||||||
/* Center front speakers. Center and left/right_of_center cannot be
|
|
||||||
* used together! */
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
|
|
||||||
|
|
||||||
/* sides */
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
|
|
||||||
|
|
||||||
/* don't use - counter */
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_NUM
|
|
||||||
} GstAudioChannelPosition;
|
|
||||||
|
|
||||||
/* Retrieves or sets the positions from/to a GstStructure. Only
|
|
||||||
* works with fixed caps, caller should check for that! Caller
|
|
||||||
* g_free()s result of the getter. */
|
|
||||||
GstAudioChannelPosition *
|
|
||||||
gst_audio_get_channel_positions (GstStructure *str);
|
|
||||||
void gst_audio_set_channel_positions (GstStructure *str,
|
|
||||||
const GstAudioChannelPosition *pos);
|
|
||||||
|
|
||||||
/* Sets a (non-fixed) list of possible audio channel positions
|
|
||||||
* on a structure (this requires the "channels" property to
|
|
||||||
* be fixed!) or on a caps (here, the "channels" property may be
|
|
||||||
* unfixed and the caps may even contain multiple structures). */
|
|
||||||
void gst_audio_set_structure_channel_positions_list
|
|
||||||
(GstStructure *str,
|
|
||||||
const GstAudioChannelPosition *pos,
|
|
||||||
gint num_positions);
|
|
||||||
void gst_audio_set_caps_channel_positions_list
|
|
||||||
(GstCaps *caps,
|
|
||||||
const GstAudioChannelPosition *pos,
|
|
||||||
gint num_positions);
|
|
||||||
|
|
||||||
/* Custom fixate function. Elements that implement some sort of
|
|
||||||
* channel conversion algorhithm should use this function for
|
|
||||||
* fixating on GstAudioChannelPosition properties. It will take
|
|
||||||
* care of equal channel positioning (left/right). Caller g_free()s
|
|
||||||
* the return value. The input properties may be (and are supposed
|
|
||||||
* to be) unfixed. */
|
|
||||||
GstAudioChannelPosition *
|
|
||||||
gst_audio_fixate_channel_positions (GstStructure *str);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_AUDIO_MULTICHANNEL_H__ */
|
|
|
@ -1,55 +0,0 @@
|
||||||
/* GStreamer Multichannel Test
|
|
||||||
* (c) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
#include <multichannel.c>
|
|
||||||
#include <multichannel-enumtypes.c>
|
|
||||||
|
|
||||||
gint
|
|
||||||
main (gint argc, gchar * argv[])
|
|
||||||
{
|
|
||||||
gchar *str;
|
|
||||||
GstCaps *caps;
|
|
||||||
GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
|
||||||
};
|
|
||||||
|
|
||||||
/* register multichannel type */
|
|
||||||
gst_init (&argc, &argv);
|
|
||||||
gst_audio_channel_position_get_type ();
|
|
||||||
|
|
||||||
/* test some caps-string conversions */
|
|
||||||
caps = gst_caps_new_simple ("audio/x-raw-int",
|
|
||||||
"channels", G_TYPE_INT, 2, NULL);
|
|
||||||
str = gst_caps_to_string (caps);
|
|
||||||
g_print ("Test caps #1: %s\n", str);
|
|
||||||
g_free (str);
|
|
||||||
gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
|
|
||||||
str = gst_caps_to_string (caps);
|
|
||||||
g_print ("Test caps #2: %s\n", str);
|
|
||||||
g_free (str);
|
|
||||||
gst_caps_free (caps);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
# variables used for enum/marshal generation
|
|
||||||
glib_enum_headers=$(colorbalance_headers)
|
|
||||||
glib_enum_define=GST_COLOR_BALANCE
|
|
||||||
glib_enum_prefix=gst_color_balance
|
|
||||||
|
|
||||||
libgstcolorbalanceincludedir = \
|
|
||||||
$(includedir)/gstreamer-@GST_MAJORMINOR@/gst/colorbalance
|
|
||||||
|
|
||||||
colorbalance_headers = \
|
|
||||||
colorbalance.h \
|
|
||||||
colorbalancechannel.h
|
|
||||||
|
|
||||||
built_sources = \
|
|
||||||
colorbalance-marshal.c \
|
|
||||||
colorbalance-enumtypes.c
|
|
||||||
|
|
||||||
built_headers = \
|
|
||||||
colorbalance-marshal.h \
|
|
||||||
colorbalance-enumtypes.h
|
|
||||||
|
|
||||||
libgstcolorbalanceinclude_HEADERS = \
|
|
||||||
$(colorbalance_headers)
|
|
||||||
|
|
||||||
nodist_libgstcolorbalanceinclude_HEADERS = \
|
|
||||||
colorbalance-enumtypes.h
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libgstcolorbalance.la
|
|
||||||
|
|
||||||
libgstcolorbalance_la_SOURCES = \
|
|
||||||
colorbalance.c \
|
|
||||||
colorbalancechannel.c
|
|
||||||
|
|
||||||
nodist_libgstcolorbalance_la_SOURCES = \
|
|
||||||
$(built_sources) \
|
|
||||||
colorbalance-marshal.h
|
|
||||||
|
|
||||||
libgstcolorbalance_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
|
|
||||||
BUILT_SOURCES = \
|
|
||||||
$(built_sources) \
|
|
||||||
$(built_headers)
|
|
||||||
|
|
||||||
EXTRA_DIST = colorbalance-marshal.list
|
|
||||||
|
|
||||||
CLEANFILES = $(BUILT_SOURCES)
|
|
||||||
|
|
||||||
include $(top_srcdir)/common/glib-gen.mak
|
|
|
@ -1 +0,0 @@
|
||||||
VOID:OBJECT,INT
|
|
|
@ -1,136 +0,0 @@
|
||||||
/* GStreamer Color Balance
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* colorbalance.c: image color balance interface design
|
|
||||||
* virtual class function wrappers
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "colorbalance.h"
|
|
||||||
#include "colorbalance-marshal.h"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
VALUE_CHANGED,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_color_balance_class_init (GstColorBalanceClass * klass);
|
|
||||||
|
|
||||||
static guint gst_color_balance_signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_color_balance_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_color_balance_type = 0;
|
|
||||||
|
|
||||||
if (!gst_color_balance_type) {
|
|
||||||
static const GTypeInfo gst_color_balance_info = {
|
|
||||||
sizeof (GstColorBalanceClass),
|
|
||||||
(GBaseInitFunc) gst_color_balance_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_color_balance_type = g_type_register_static (G_TYPE_INTERFACE,
|
|
||||||
"GstColorBalance", &gst_color_balance_info, 0);
|
|
||||||
g_type_interface_add_prerequisite (gst_color_balance_type,
|
|
||||||
GST_TYPE_IMPLEMENTS_INTERFACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_color_balance_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_color_balance_class_init (GstColorBalanceClass * klass)
|
|
||||||
{
|
|
||||||
static gboolean initialized = FALSE;
|
|
||||||
|
|
||||||
if (!initialized) {
|
|
||||||
gst_color_balance_signals[VALUE_CHANGED] =
|
|
||||||
g_signal_new ("value-changed",
|
|
||||||
GST_TYPE_COLOR_BALANCE, G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstColorBalanceClass, value_changed),
|
|
||||||
NULL, NULL,
|
|
||||||
gst_color_balance_marshal_VOID__OBJECT_INT,
|
|
||||||
G_TYPE_NONE, 2, GST_TYPE_COLOR_BALANCE_CHANNEL, G_TYPE_INT);
|
|
||||||
|
|
||||||
initialized = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
klass->balance_type = GST_COLOR_BALANCE_SOFTWARE;
|
|
||||||
|
|
||||||
/* default virtual functions */
|
|
||||||
klass->list_channels = NULL;
|
|
||||||
klass->set_value = NULL;
|
|
||||||
klass->get_value = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const GList *
|
|
||||||
gst_color_balance_list_channels (GstColorBalance * balance)
|
|
||||||
{
|
|
||||||
GstColorBalanceClass *klass = GST_COLOR_BALANCE_GET_CLASS (balance);
|
|
||||||
|
|
||||||
if (klass->list_channels) {
|
|
||||||
return klass->list_channels (balance);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_color_balance_set_value (GstColorBalance * balance,
|
|
||||||
GstColorBalanceChannel * channel, gint value)
|
|
||||||
{
|
|
||||||
GstColorBalanceClass *klass = GST_COLOR_BALANCE_GET_CLASS (balance);
|
|
||||||
|
|
||||||
if (klass->set_value) {
|
|
||||||
klass->set_value (balance, channel, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
gst_color_balance_get_value (GstColorBalance * balance,
|
|
||||||
GstColorBalanceChannel * channel)
|
|
||||||
{
|
|
||||||
GstColorBalanceClass *klass = GST_COLOR_BALANCE_GET_CLASS (balance);
|
|
||||||
|
|
||||||
if (klass->get_value) {
|
|
||||||
return klass->get_value (balance, channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
return channel->min_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_color_balance_value_changed (GstColorBalance * balance,
|
|
||||||
GstColorBalanceChannel * channel, gint value)
|
|
||||||
{
|
|
||||||
g_signal_emit (G_OBJECT (balance),
|
|
||||||
gst_color_balance_signals[VALUE_CHANGED], 0, channel, value);
|
|
||||||
|
|
||||||
g_signal_emit_by_name (G_OBJECT (channel), "value_changed", value);
|
|
||||||
}
|
|
|
@ -1,96 +0,0 @@
|
||||||
/* GStreamer Color Balance
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* color-balance.h: image color balance interface design
|
|
||||||
*
|
|
||||||
* 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_COLOR_BALANCE_H__
|
|
||||||
#define __GST_COLOR_BALANCE_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/colorbalance/colorbalancechannel.h>
|
|
||||||
#include <gst/colorbalance/colorbalance-enumtypes.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_COLOR_BALANCE \
|
|
||||||
(gst_color_balance_get_type ())
|
|
||||||
#define GST_COLOR_BALANCE(obj) \
|
|
||||||
(GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_COLOR_BALANCE, \
|
|
||||||
GstColorBalance))
|
|
||||||
#define GST_COLOR_BALANCE_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_COLOR_BALANCE, \
|
|
||||||
GstColorBalanceClass))
|
|
||||||
#define GST_IS_COLOR_BALANCE(obj) \
|
|
||||||
(GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_COLOR_BALANCE))
|
|
||||||
#define GST_IS_COLOR_BALANCE_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_COLOR_BALANCE))
|
|
||||||
#define GST_COLOR_BALANCE_GET_CLASS(inst) \
|
|
||||||
(G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_COLOR_BALANCE, GstColorBalanceClass))
|
|
||||||
|
|
||||||
#define GST_COLOR_BALANCE_TYPE(klass) (klass->balance_type)
|
|
||||||
|
|
||||||
typedef struct _GstColorBalance GstColorBalance;
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
GST_COLOR_BALANCE_HARDWARE,
|
|
||||||
GST_COLOR_BALANCE_SOFTWARE
|
|
||||||
} GstColorBalanceType;
|
|
||||||
|
|
||||||
typedef struct _GstColorBalanceClass {
|
|
||||||
GTypeInterface klass;
|
|
||||||
|
|
||||||
GstColorBalanceType balance_type;
|
|
||||||
|
|
||||||
/* virtual functions */
|
|
||||||
const GList * (* list_channels) (GstColorBalance *balance);
|
|
||||||
|
|
||||||
void (* set_value) (GstColorBalance *balance,
|
|
||||||
GstColorBalanceChannel *channel,
|
|
||||||
gint value);
|
|
||||||
gint (* get_value) (GstColorBalance *balance,
|
|
||||||
GstColorBalanceChannel *channel);
|
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (* value_changed) (GstColorBalance *balance,
|
|
||||||
GstColorBalanceChannel *channel,
|
|
||||||
gint value);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
} GstColorBalanceClass;
|
|
||||||
|
|
||||||
GType gst_color_balance_get_type (void);
|
|
||||||
|
|
||||||
/* virtual class function wrappers */
|
|
||||||
const GList *
|
|
||||||
gst_color_balance_list_channels (GstColorBalance *balance);
|
|
||||||
void gst_color_balance_set_value (GstColorBalance *balance,
|
|
||||||
GstColorBalanceChannel *channel,
|
|
||||||
gint value);
|
|
||||||
gint gst_color_balance_get_value (GstColorBalance *balance,
|
|
||||||
GstColorBalanceChannel *channel);
|
|
||||||
|
|
||||||
/* trigger signal */
|
|
||||||
void gst_color_balance_value_changed (GstColorBalance *balance,
|
|
||||||
GstColorBalanceChannel *channel,
|
|
||||||
gint value);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_COLOR_BALANCE_H__ */
|
|
|
@ -1,150 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="colorbalance"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D67894}"
|
|
||||||
RootNamespace="colorbalance"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstcolorbalance.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="colorbalance.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/colorbalance.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstcolorbalance.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstcolorbalance.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="colorbalance.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstcolorbalance.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\colorbalance.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\colorbalancechannel.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\colorbalance.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\colorbalancechannel.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,106 +0,0 @@
|
||||||
/* GStreamer Color Balance
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* colorbalancechannel.c: colorbalance channel object design
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "colorbalancechannel.h"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
/* FILL ME */
|
|
||||||
SIGNAL_VALUE_CHANGED,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_color_balance_channel_class_init (GstColorBalanceChannelClass *
|
|
||||||
klass);
|
|
||||||
static void gst_color_balance_channel_init (GstColorBalanceChannel * balance);
|
|
||||||
static void gst_color_balance_channel_dispose (GObject * object);
|
|
||||||
|
|
||||||
static GObjectClass *parent_class = NULL;
|
|
||||||
static guint signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_color_balance_channel_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_color_balance_channel_type = 0;
|
|
||||||
|
|
||||||
if (!gst_color_balance_channel_type) {
|
|
||||||
static const GTypeInfo color_balance_channel_info = {
|
|
||||||
sizeof (GstColorBalanceChannelClass),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(GClassInitFunc) gst_color_balance_channel_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstColorBalanceChannel),
|
|
||||||
0,
|
|
||||||
(GInstanceInitFunc) gst_color_balance_channel_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_color_balance_channel_type =
|
|
||||||
g_type_register_static (G_TYPE_OBJECT,
|
|
||||||
"GstColorBalanceChannel", &color_balance_channel_info, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_color_balance_channel_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_color_balance_channel_class_init (GstColorBalanceChannelClass * klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_klass = (GObjectClass *) klass;
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (G_TYPE_OBJECT);
|
|
||||||
|
|
||||||
signals[SIGNAL_VALUE_CHANGED] =
|
|
||||||
g_signal_new ("value-changed", G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstColorBalanceChannelClass,
|
|
||||||
value_changed),
|
|
||||||
NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
|
|
||||||
|
|
||||||
object_klass->dispose = gst_color_balance_channel_dispose;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_color_balance_channel_init (GstColorBalanceChannel * channel)
|
|
||||||
{
|
|
||||||
channel->label = NULL;
|
|
||||||
channel->min_value = channel->max_value = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_color_balance_channel_dispose (GObject * object)
|
|
||||||
{
|
|
||||||
GstColorBalanceChannel *channel = GST_COLOR_BALANCE_CHANNEL (object);
|
|
||||||
|
|
||||||
if (channel->label)
|
|
||||||
g_free (channel->label);
|
|
||||||
|
|
||||||
channel->label = NULL;
|
|
||||||
|
|
||||||
if (parent_class->dispose)
|
|
||||||
parent_class->dispose (object);
|
|
||||||
}
|
|
|
@ -1,64 +0,0 @@
|
||||||
/* GStreamer Color Balance
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* colorbalancechannel.h: individual channel object
|
|
||||||
*
|
|
||||||
* 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_COLOR_BALANCE_CHANNEL_H__
|
|
||||||
#define __GST_COLOR_BALANCE_CHANNEL_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_COLOR_BALANCE_CHANNEL \
|
|
||||||
(gst_color_balance_channel_get_type ())
|
|
||||||
#define GST_COLOR_BALANCE_CHANNEL(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_COLOR_BALANCE_CHANNEL, \
|
|
||||||
GstColorBalanceChannel))
|
|
||||||
#define GST_COLOR_BALANCE_CHANNEL_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_COLOR_BALANCE_CHANNEL, \
|
|
||||||
GstColorBalanceChannelClass))
|
|
||||||
#define GST_IS_COLOR_BALANCE_CHANNEL(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_COLOR_BALANCE_CHANNEL))
|
|
||||||
#define GST_IS_COLOR_BALANCE_CHANNEL_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_COLOR_BALANCE_CHANNEL))
|
|
||||||
|
|
||||||
typedef struct _GstColorBalanceChannel {
|
|
||||||
GObject parent;
|
|
||||||
|
|
||||||
gchar *label;
|
|
||||||
gint min_value,
|
|
||||||
max_value;
|
|
||||||
} GstColorBalanceChannel;
|
|
||||||
|
|
||||||
typedef struct _GstColorBalanceChannelClass {
|
|
||||||
GObjectClass parent;
|
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (* value_changed) (GstColorBalanceChannel *channel,
|
|
||||||
gint value);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
} GstColorBalanceChannelClass;
|
|
||||||
|
|
||||||
GType gst_color_balance_channel_get_type (void);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_COLOR_BALANCE_CHANNEL_H__ */
|
|
|
@ -1,2 +0,0 @@
|
||||||
floatcastincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/floatcast
|
|
||||||
floatcastinclude_HEADERS = floatcast.h
|
|
|
@ -1,106 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
* Library <2002> Steve Baker <stevebaker_org@yahoo.co.uk>
|
|
||||||
*
|
|
||||||
* 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 __FLOATCAST_H__
|
|
||||||
#define __FLOATCAST_H__
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <glib/gtypes.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#if (HAVE_LRINT && HAVE_LRINTF)
|
|
||||||
|
|
||||||
/* These defines enable functionality introduced with the 1999 ISO C
|
|
||||||
** standard. They must be defined before the inclusion of math.h to
|
|
||||||
** engage them. If optimisation is enabled, these functions will be
|
|
||||||
** inlined. With optimisation switched off, you have to link in the
|
|
||||||
** maths library using -lm.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _ISOC9X_SOURCE 1
|
|
||||||
#define _ISOC99_SOURCE 1
|
|
||||||
|
|
||||||
#define __USE_ISOC9X 1
|
|
||||||
#define __USE_ISOC99 1
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#define gst_cast_float(x) ((gint)lrintf(x))
|
|
||||||
#define gst_cast_double(x) ((gint)lrint(x))
|
|
||||||
|
|
||||||
#else
|
|
||||||
/* use a standard c cast, but do rounding correctly */
|
|
||||||
#define gst_cast_float(x) ((gint)floor((x)+0.5))
|
|
||||||
#define gst_cast_double(x) ((gint)floor((x)+0.5))
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
inline static gfloat
|
|
||||||
GFLOAT_SWAP_LE_BE(gfloat in)
|
|
||||||
{
|
|
||||||
gint32 swap;
|
|
||||||
gfloat out;
|
|
||||||
memcpy(&swap, &in, 4);
|
|
||||||
swap = GUINT32_SWAP_LE_BE_CONSTANT (swap);
|
|
||||||
memcpy(&out, &swap, 4);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline static gdouble
|
|
||||||
GDOUBLE_SWAP_LE_BE(gdouble in)
|
|
||||||
{
|
|
||||||
gint64 swap;
|
|
||||||
gdouble out;
|
|
||||||
memcpy(&swap, &in, 8);
|
|
||||||
swap = GUINT64_SWAP_LE_BE_CONSTANT (swap);
|
|
||||||
memcpy(&out, &swap, 8);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
|
||||||
#define GFLOAT_TO_LE(val) ((gfloat) (val))
|
|
||||||
#define GFLOAT_TO_BE(val) (GFLOAT_SWAP_LE_BE (val))
|
|
||||||
#define GDOUBLE_TO_LE(val) ((gdouble) (val))
|
|
||||||
#define GDOUBLE_TO_BE(val) (GDOUBLE_SWAP_LE_BE (val))
|
|
||||||
|
|
||||||
#elif G_BYTE_ORDER == G_BIG_ENDIAN
|
|
||||||
#define GFLOAT_TO_LE(val) (GFLOAT_SWAP_LE_BE (val))
|
|
||||||
#define GFLOAT_TO_BE(val) ((gfloat) (val))
|
|
||||||
#define GDOUBLE_TO_LE(val) (GDOUBLE_SWAP_LE_BE (val))
|
|
||||||
#define GDOUBLE_TO_BE(val) ((gdouble) (val))
|
|
||||||
|
|
||||||
#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
|
|
||||||
#error unknown ENDIAN type
|
|
||||||
#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
|
|
||||||
|
|
||||||
#define GFLOAT_FROM_LE(val) (GFLOAT_TO_LE (val))
|
|
||||||
#define GFLOAT_FROM_BE(val) (GDOUBLE_TO_BE (val))
|
|
||||||
#define GDOUBLE_FROM_LE(val) (GFLOAT_TO_LE (val))
|
|
||||||
#define GDOUBLE_FROM_BE(val) (GDOUBLE_TO_BE (val))
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __FLOATCAST_H__ */
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
librarydir = $(libdir)
|
|
||||||
|
|
||||||
library_LTLIBRARIES = libgstgconf-@GST_MAJORMINOR@.la
|
|
||||||
|
|
||||||
libgstgconf_@GST_MAJORMINOR@_la_SOURCES = gconf.c
|
|
||||||
|
|
||||||
libgstgconf_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/gconf
|
|
||||||
libgstgconf_@GST_MAJORMINOR@include_HEADERS = gconf.h
|
|
||||||
|
|
||||||
noinst_PROGRAMS = test-gconf
|
|
||||||
|
|
||||||
# add define for GST_GCONF_DIR
|
|
||||||
DIR_CFLAGS=-DGST_GCONF_DIR=\"/system/gstreamer/@GST_MAJORMINOR@\"
|
|
||||||
|
|
||||||
test_gconf_CFLAGS = $(GST_CFLAGS) $(GCONF_CFLAGS) $(DIR_CFLAGS)
|
|
||||||
test_gconf_LDADD = $(GST_LIBS) $(GCONF_LIBS) libgstgconf-@GST_MAJORMINOR@.la
|
|
||||||
|
|
||||||
libgstgconf_@GST_MAJORMINOR@_la_LIBADD = $(GST_LIBS) $(GCONF_LIBS)
|
|
||||||
libgstgconf_@GST_MAJORMINOR@_la_CFLAGS = $(GST_CFLAGS) $(GCONF_CFLAGS) $(DIR_CFLAGS)
|
|
||||||
libgstgconf_@GST_MAJORMINOR@_la_LDFLAGS = @GST_PLUGINS_LT_LDFLAGS@ -version-info @GST_PLUGINS_LIBVERSION@
|
|
|
@ -1,318 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <2002> Thomas Vander Stichele <thomas@apestaart.org>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this library handles interaction with GConf
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "gconf.h"
|
|
||||||
|
|
||||||
#ifndef GST_GCONF_DIR
|
|
||||||
#error "GST_GCONF_DIR is not defined !"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static GConfClient *_gst_gconf_client = NULL; /* GConf connection */
|
|
||||||
|
|
||||||
|
|
||||||
/* internal functions */
|
|
||||||
|
|
||||||
static GConfClient *
|
|
||||||
gst_gconf_get_client (void)
|
|
||||||
{
|
|
||||||
if (!_gst_gconf_client)
|
|
||||||
_gst_gconf_client = gconf_client_get_default ();
|
|
||||||
|
|
||||||
return _gst_gconf_client;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* go through a bin, finding the one pad that is unconnected in the given
|
|
||||||
* * direction, and return that pad */
|
|
||||||
static GstPad *
|
|
||||||
gst_bin_find_unconnected_pad (GstBin * bin, GstPadDirection direction)
|
|
||||||
{
|
|
||||||
GstPad *pad = NULL;
|
|
||||||
GList *elements = NULL;
|
|
||||||
const GList *pads = NULL;
|
|
||||||
GstElement *element = NULL;
|
|
||||||
|
|
||||||
elements = (GList *) gst_bin_get_list (bin);
|
|
||||||
/* traverse all elements looking for unconnected pads */
|
|
||||||
while (elements && pad == NULL) {
|
|
||||||
element = GST_ELEMENT (elements->data);
|
|
||||||
pads = gst_element_get_pad_list (element);
|
|
||||||
while (pads) {
|
|
||||||
/* check if the direction matches */
|
|
||||||
if (GST_PAD_DIRECTION (GST_PAD (pads->data)) == direction) {
|
|
||||||
if (GST_PAD_PEER (GST_PAD (pads->data)) == NULL) {
|
|
||||||
/* found it ! */
|
|
||||||
pad = GST_PAD (pads->data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pad)
|
|
||||||
break; /* found one already */
|
|
||||||
pads = g_list_next (pads);
|
|
||||||
}
|
|
||||||
elements = g_list_next (elements);
|
|
||||||
}
|
|
||||||
return pad;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* external functions */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_gconf_get_string:
|
|
||||||
* @key: a #gchar corresponding to the key you want to get.
|
|
||||||
*
|
|
||||||
* Get GConf key @key's string value.
|
|
||||||
*
|
|
||||||
* Returns: a newly allocated #gchar string containing @key's value,
|
|
||||||
* or NULL in the case of an error..
|
|
||||||
*/
|
|
||||||
gchar *
|
|
||||||
gst_gconf_get_string (const gchar * key)
|
|
||||||
{
|
|
||||||
GError *error = NULL;
|
|
||||||
gchar *value = NULL;
|
|
||||||
gchar *full_key = g_strdup_printf ("%s/%s", GST_GCONF_DIR, key);
|
|
||||||
|
|
||||||
|
|
||||||
value = gconf_client_get_string (gst_gconf_get_client (), full_key, &error);
|
|
||||||
g_free (full_key);
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
g_warning ("gst_gconf_get_string: error: %s\n", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_gconf_set_string:
|
|
||||||
* @key: a #gchar corresponding to the key you want to set.
|
|
||||||
* @value: a #gchar containing key value.
|
|
||||||
*
|
|
||||||
* Set GConf key @key to string value @value.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gst_gconf_set_string (const gchar * key, const gchar * value)
|
|
||||||
{
|
|
||||||
GError *error = NULL;
|
|
||||||
gchar *full_key = g_strdup_printf ("%s/%s", GST_GCONF_DIR, key);
|
|
||||||
|
|
||||||
gconf_client_set_string (gst_gconf_get_client (), full_key, value, &error);
|
|
||||||
if (error) {
|
|
||||||
GST_ERROR ("gst_gconf_set_string: error: %s\n", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
g_free (full_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_gconf_render_bin_from_description:
|
|
||||||
* @description: a #gchar string describing the bin.
|
|
||||||
*
|
|
||||||
* Render bin from description @description.
|
|
||||||
*
|
|
||||||
* Returns: a #GstElement containing the rendered bin.
|
|
||||||
*/
|
|
||||||
GstElement *
|
|
||||||
gst_gconf_render_bin_from_description (const gchar * description)
|
|
||||||
{
|
|
||||||
GstElement *bin = NULL;
|
|
||||||
GstPad *pad = NULL;
|
|
||||||
GError *error = NULL;
|
|
||||||
gchar *desc = NULL;
|
|
||||||
|
|
||||||
/* parse the pipeline to a bin */
|
|
||||||
desc = g_strdup_printf ("bin.( %s )", description);
|
|
||||||
bin = GST_ELEMENT (gst_parse_launch (desc, &error));
|
|
||||||
g_free (desc);
|
|
||||||
if (error) {
|
|
||||||
GST_ERROR ("gstgconf: error parsing pipeline %s\n%s\n",
|
|
||||||
description, error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find pads and ghost them if necessary */
|
|
||||||
if ((pad = gst_bin_find_unconnected_pad (GST_BIN (bin), GST_PAD_SRC))) {
|
|
||||||
gst_element_add_ghost_pad (bin, pad, "src");
|
|
||||||
}
|
|
||||||
if ((pad = gst_bin_find_unconnected_pad (GST_BIN (bin), GST_PAD_SINK))) {
|
|
||||||
gst_element_add_ghost_pad (bin, pad, "sink");
|
|
||||||
}
|
|
||||||
return bin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_gconf_render_bin_from_key:
|
|
||||||
* @key: a #gchar string corresponding to a GConf key.
|
|
||||||
*
|
|
||||||
* Render bin from GConf key @key.
|
|
||||||
*
|
|
||||||
* Returns: a #GstElement containing the rendered bin.
|
|
||||||
*/
|
|
||||||
GstElement *
|
|
||||||
gst_gconf_render_bin_from_key (const gchar * key)
|
|
||||||
{
|
|
||||||
GstElement *bin = NULL;
|
|
||||||
gchar *value;
|
|
||||||
|
|
||||||
value = gst_gconf_get_string (key);
|
|
||||||
if (value)
|
|
||||||
bin = gst_gconf_render_bin_from_description (value);
|
|
||||||
g_free (value);
|
|
||||||
return bin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_gconf_get_default_audio_sink:
|
|
||||||
*
|
|
||||||
* Render audio output bin from GStreamer GConf key : "default/audiosink".
|
|
||||||
* If key is invalid, the default audio sink for the platform is used
|
|
||||||
* (typically osssink or sunaudiosink).
|
|
||||||
*
|
|
||||||
* Returns: a #GstElement containing the audio output bin, or NULL if
|
|
||||||
* everything failed.
|
|
||||||
*/
|
|
||||||
GstElement *
|
|
||||||
gst_gconf_get_default_audio_sink (void)
|
|
||||||
{
|
|
||||||
GstElement *ret = gst_gconf_render_bin_from_key ("default/audiosink");
|
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
ret = gst_element_factory_make (DEFAULT_AUDIOSINK, NULL);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
g_warning ("No GConf default audio sink key and %s doesn't work",
|
|
||||||
DEFAULT_AUDIOSINK);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_gconf_get_default_video_sink:
|
|
||||||
*
|
|
||||||
* Render video output bin from GStreamer GConf key : "default/videosink".
|
|
||||||
* If key is invalid, the default video sink for the platform is used
|
|
||||||
* (typically xvimagesink or ximagesink).
|
|
||||||
*
|
|
||||||
* Returns: a #GstElement containing the video output bin, or NULL if
|
|
||||||
* everything failed.
|
|
||||||
*/
|
|
||||||
GstElement *
|
|
||||||
gst_gconf_get_default_video_sink (void)
|
|
||||||
{
|
|
||||||
GstElement *ret = gst_gconf_render_bin_from_key ("default/videosink");
|
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
ret = gst_element_factory_make (DEFAULT_VIDEOSINK, NULL);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
g_warning ("No GConf default video sink key and %s doesn't work",
|
|
||||||
DEFAULT_VIDEOSINK);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_gconf_get_default_audio_src:
|
|
||||||
*
|
|
||||||
* Render audio acquisition bin from GStreamer GConf key : "default/audiosrc".
|
|
||||||
* If key is invalid, the default audio source for the plaform is used.
|
|
||||||
* (typically osssrc or sunaudiosrc).
|
|
||||||
*
|
|
||||||
* Returns: a #GstElement containing the audio source bin, or NULL if
|
|
||||||
* everything failed.
|
|
||||||
*/
|
|
||||||
GstElement *
|
|
||||||
gst_gconf_get_default_audio_src (void)
|
|
||||||
{
|
|
||||||
GstElement *ret = gst_gconf_render_bin_from_key ("default/audiosrc");
|
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
ret = gst_element_factory_make (DEFAULT_AUDIOSRC, NULL);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
g_warning ("No GConf default audio src key and %s doesn't work",
|
|
||||||
DEFAULT_AUDIOSRC);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_gconf_get_default_video_src:
|
|
||||||
*
|
|
||||||
* Render video acquisition bin from GStreamer GConf key :
|
|
||||||
* "default/videosrc". If key is invalid, the default video source
|
|
||||||
* for the platform is used (typically videotestsrc).
|
|
||||||
*
|
|
||||||
* Returns: a #GstElement containing the video source bin, or NULL if
|
|
||||||
* everything failed.
|
|
||||||
*/
|
|
||||||
GstElement *
|
|
||||||
gst_gconf_get_default_video_src (void)
|
|
||||||
{
|
|
||||||
GstElement *ret = gst_gconf_render_bin_from_key ("default/videosrc");
|
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
ret = gst_element_factory_make (DEFAULT_VIDEOSRC, NULL);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
g_warning ("No GConf default video src key and %s doesn't work",
|
|
||||||
DEFAULT_VIDEOSRC);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_gconf_get_default_visualization_element:
|
|
||||||
*
|
|
||||||
* Render visualization bin from GStreamer GConf key : "default/visualization".
|
|
||||||
* If key is invalid, the default visualization element is used.
|
|
||||||
*
|
|
||||||
* Returns: a #GstElement containing the visualization bin, or NULL if
|
|
||||||
* everything failed.
|
|
||||||
*/
|
|
||||||
GstElement *
|
|
||||||
gst_gconf_get_default_visualization_element (void)
|
|
||||||
{
|
|
||||||
GstElement *ret = gst_gconf_render_bin_from_key ("default/visualization");
|
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
ret = gst_element_factory_make (DEFAULT_VISUALIZER, NULL);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
g_warning
|
|
||||||
("No GConf default visualization plugin key and %s doesn't work",
|
|
||||||
DEFAULT_VISUALIZER);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <2002> Thomas Vander Stichele <thomas@apestaart.org>
|
|
||||||
*
|
|
||||||
* 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_GCONF_H
|
|
||||||
#define GST_GCONF_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this library handles interaction with GConf
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gconf/gconf-client.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
gchar * gst_gconf_get_string (const gchar *key);
|
|
||||||
void gst_gconf_set_string (const gchar *key,
|
|
||||||
const gchar *value);
|
|
||||||
|
|
||||||
GstElement * gst_gconf_render_bin_from_key (const gchar *key);
|
|
||||||
GstElement * gst_gconf_render_bin_from_description (const gchar *description);
|
|
||||||
|
|
||||||
GstElement * gst_gconf_get_default_video_sink (void);
|
|
||||||
GstElement * gst_gconf_get_default_audio_sink (void);
|
|
||||||
GstElement * gst_gconf_get_default_video_src (void);
|
|
||||||
GstElement * gst_gconf_get_default_audio_src (void);
|
|
||||||
GstElement * gst_gconf_get_default_visualization_element (void);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* GST_GCONF_H */
|
|
|
@ -1,36 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <2002> Thomas Vander Stichele <thomas@apestaart.org>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "gconf.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
gst_init (&argc, &argv);
|
|
||||||
|
|
||||||
printf ("Default video sink : %s\n",
|
|
||||||
gst_gconf_get_string ("default/videosink"));
|
|
||||||
printf ("Default audio sink : %s\n",
|
|
||||||
gst_gconf_get_string ("default/audiosink"));
|
|
||||||
printf ("Default video src : %s\n",
|
|
||||||
gst_gconf_get_string ("default/videosrc"));
|
|
||||||
printf ("Default audio src : %s\n",
|
|
||||||
gst_gconf_get_string ("default/audiosrc"));
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
|
|
||||||
librarydir = $(libdir)/gstreamer-@GST_MAJORMINOR@
|
|
||||||
|
|
||||||
library_LTLIBRARIES = libgstidct.la
|
|
||||||
|
|
||||||
libgstidct_la_SOURCES = \
|
|
||||||
fastintidct.c \
|
|
||||||
floatidct.c \
|
|
||||||
idct.c \
|
|
||||||
intidct.c
|
|
||||||
|
|
||||||
libgstidctincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/idct
|
|
||||||
libgstidctinclude_HEADERS = idct.h
|
|
||||||
noinst_HEADERS = dct.h
|
|
||||||
|
|
||||||
## check_PROGRAMS = ieeetest
|
|
||||||
|
|
||||||
## ieeetest_SOURCES = ieeetest.c
|
|
||||||
## ieeetest_LDADD = libgstidct.la
|
|
||||||
## ieeetest_CFLAGS = $(GST_CFLAGS)
|
|
||||||
## ieeetest_LDFLAGS = $(GST_LIBS)
|
|
||||||
|
|
||||||
|
|
||||||
libgstidct_la_LIBADD =
|
|
||||||
libgstidct_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
libgstidct_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
|
|
@ -1,48 +0,0 @@
|
||||||
This archive contains a quick & dirty implementation of the IEEE Standard
|
|
||||||
1180-1990 accuracy test for inverse DCT. It is not guaranteed to be
|
|
||||||
correct ... but if you find any bugs, please let me know (by email to
|
|
||||||
tgl@cs.cmu.edu).
|
|
||||||
|
|
||||||
The test harness consists of the C program ieeetest.c and shell script
|
|
||||||
doieee. For comparison purposes I have also supplied a copy of jrevdct.c,
|
|
||||||
the inverse DCT routine from release 4 of the Independent JPEG Group's
|
|
||||||
free JPEG software. (jrevdct.c is slightly modified from the IJG release
|
|
||||||
so that it will compile without the IJG include files.) jrevdct.c passes
|
|
||||||
the 1180 test --- or at least, this program thinks so. jrevdct.out is
|
|
||||||
the output from a test run.
|
|
||||||
|
|
||||||
Note that numerical results may vary somewhat across machines. This appears
|
|
||||||
to be mostly due to differing results from the cosine function.
|
|
||||||
|
|
||||||
|
|
||||||
INSTALLATION:
|
|
||||||
Check the Makefile, change CC and CFLAGS if needed. Then say "make".
|
|
||||||
If your C compiler is non-ANSI, you may need to change includes and/or
|
|
||||||
function headers.
|
|
||||||
|
|
||||||
To test a different IDCT routine, link with that routine instead of
|
|
||||||
jrevdct.o. You will need to modify dct.h and/or ieeetest.c if your
|
|
||||||
routine's calling convention is not in-place modification of an array
|
|
||||||
of 64 "short"s.
|
|
||||||
|
|
||||||
|
|
||||||
USAGE:
|
|
||||||
The standard test procedure is
|
|
||||||
doieee ieeetest >outputfile
|
|
||||||
Expect it to take a while (almost 80 minutes on my old 68030 box).
|
|
||||||
Each of the six passes will emit a row of 100 dots as it runs.
|
|
||||||
|
|
||||||
You can grep the output for the word FAILS if you just want to know
|
|
||||||
yea or nay.
|
|
||||||
|
|
||||||
|
|
||||||
LEGAL MUMBO-JUMBO:
|
|
||||||
I hereby release the test harness to the public domain.
|
|
||||||
Thomas G. Lane, 22 Nov 1993
|
|
||||||
|
|
||||||
IMPORTANT: jrevdct.c is NOT public domain, but is copyrighted free software
|
|
||||||
(not the same thing at all). It is subject to IJG's distribution terms, which
|
|
||||||
primarily state that if you incorporate it into a program you must acknowledge
|
|
||||||
IJG's contribution in your program documentation. For more details and the
|
|
||||||
complete IJG software, see the IJG FTP archive at ftp.uu.net, in directory
|
|
||||||
/graphics/jpeg.
|
|
|
@ -1,26 +0,0 @@
|
||||||
/* define DCT types */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* DCTSIZE underlying (1d) transform size
|
|
||||||
* DCTSIZE2 DCTSIZE squared
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define DCTSIZE (8)
|
|
||||||
#define DCTSIZE2 (DCTSIZE*DCTSIZE)
|
|
||||||
|
|
||||||
#define EIGHT_BIT_SAMPLES /* needed in jrevdct.c */
|
|
||||||
|
|
||||||
typedef short DCTELEM; /* must be at least 16 bits */
|
|
||||||
|
|
||||||
typedef DCTELEM DCTBLOCK[DCTSIZE2];
|
|
||||||
|
|
||||||
typedef long INT32; /* must be at least 32 bits */
|
|
||||||
|
|
||||||
extern void gst_idct_int_idct();
|
|
||||||
|
|
||||||
extern void gst_idct_init_fast_int_idct (void);
|
|
||||||
extern void gst_idct_fast_int_idct (short *block);
|
|
||||||
|
|
||||||
extern void gst_idct_init_float_idct(void);
|
|
||||||
extern void gst_idct_float_idct (short *block);
|
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
# perform IEEE 1180 test series
|
|
||||||
# Typical usage:
|
|
||||||
# doieee >outfile
|
|
||||||
# where progname is ieeetest or a variant
|
|
||||||
|
|
||||||
for i in 1 2 3 4 5;
|
|
||||||
do
|
|
||||||
time ./ieeetest $i -256 255 1 10000
|
|
||||||
time ./ieeetest $i -5 5 1 10000
|
|
||||||
time ./ieeetest $i -300 300 1 10000
|
|
||||||
|
|
||||||
time ./ieeetest $i -256 255 -1 10000
|
|
||||||
time ./ieeetest $i -5 5 -1 10000
|
|
||||||
time ./ieeetest $i -300 300 -1 10000
|
|
||||||
done
|
|
|
@ -1,215 +0,0 @@
|
||||||
/* idct.c, inverse fast discrete cosine transform */
|
|
||||||
|
|
||||||
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Disclaimer of Warranty
|
|
||||||
*
|
|
||||||
* These software programs are available to the user without any license fee or
|
|
||||||
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
|
|
||||||
* any and all warranties, whether express, implied, or statuary, including any
|
|
||||||
* implied warranties or merchantability or of fitness for a particular
|
|
||||||
* purpose. In no event shall the copyright-holder be liable for any
|
|
||||||
* incidental, punitive, or consequential damages of any kind whatsoever
|
|
||||||
* arising from the use of these programs.
|
|
||||||
*
|
|
||||||
* This disclaimer of warranty extends to the user of these programs and user's
|
|
||||||
* customers, employees, agents, transferees, successors, and assigns.
|
|
||||||
*
|
|
||||||
* The MPEG Software Simulation Group does not represent or warrant that the
|
|
||||||
* programs furnished hereunder are free of infringement of any third-party
|
|
||||||
* patents.
|
|
||||||
*
|
|
||||||
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
|
|
||||||
* are subject to royalty fees to patent holders. Many of these patents are
|
|
||||||
* general enough such that they are unavoidable regardless of implementation
|
|
||||||
* design.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**********************************************************/
|
|
||||||
/* inverse two dimensional DCT, Chen-Wang algorithm */
|
|
||||||
/* (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984) */
|
|
||||||
/* 32-bit integer arithmetic (8 bit coefficients) */
|
|
||||||
/* 11 mults, 29 adds per DCT */
|
|
||||||
/* sE, 18.8.91 */
|
|
||||||
/**********************************************************/
|
|
||||||
/* coefficients extended to 12 bit for IEEE1180-1990 */
|
|
||||||
/* compliance sE, 2.1.94 */
|
|
||||||
/**********************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* this code assumes >> to be a two's-complement arithmetic */
|
|
||||||
/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2 */
|
|
||||||
|
|
||||||
#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
|
|
||||||
#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
|
|
||||||
#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */
|
|
||||||
#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */
|
|
||||||
#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
|
|
||||||
#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */
|
|
||||||
|
|
||||||
#include "dct.h"
|
|
||||||
|
|
||||||
/* private data */
|
|
||||||
static short iclip[1024]; /* clipping table */
|
|
||||||
static short *iclp;
|
|
||||||
|
|
||||||
/* private prototypes */
|
|
||||||
static void idctrow (short *blk);
|
|
||||||
static void idctcol (short *blk);
|
|
||||||
|
|
||||||
/* row (horizontal) IDCT
|
|
||||||
*
|
|
||||||
* 7 pi 1
|
|
||||||
* dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l )
|
|
||||||
* l=0 8 2
|
|
||||||
*
|
|
||||||
* where: c[0] = 128
|
|
||||||
* c[1..7] = 128*sqrt(2)
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
|
||||||
idctrow (blk)
|
|
||||||
short *blk;
|
|
||||||
{
|
|
||||||
int x0, x1, x2, x3, x4, x5, x6, x7, x8;
|
|
||||||
|
|
||||||
/* shortcut */
|
|
||||||
if (!((x1 = blk[4] << 11) | (x2 = blk[6]) | (x3 = blk[2]) |
|
|
||||||
(x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3]))) {
|
|
||||||
blk[0] = blk[1] = blk[2] = blk[3] = blk[4] = blk[5] = blk[6] = blk[7] =
|
|
||||||
blk[0] << 3;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
x0 = (blk[0] << 11) + 128; /* for proper rounding in the fourth stage */
|
|
||||||
|
|
||||||
/* first stage */
|
|
||||||
x8 = W7 * (x4 + x5);
|
|
||||||
x4 = x8 + (W1 - W7) * x4;
|
|
||||||
x5 = x8 - (W1 + W7) * x5;
|
|
||||||
x8 = W3 * (x6 + x7);
|
|
||||||
x6 = x8 - (W3 - W5) * x6;
|
|
||||||
x7 = x8 - (W3 + W5) * x7;
|
|
||||||
|
|
||||||
/* second stage */
|
|
||||||
x8 = x0 + x1;
|
|
||||||
x0 -= x1;
|
|
||||||
x1 = W6 * (x3 + x2);
|
|
||||||
x2 = x1 - (W2 + W6) * x2;
|
|
||||||
x3 = x1 + (W2 - W6) * x3;
|
|
||||||
x1 = x4 + x6;
|
|
||||||
x4 -= x6;
|
|
||||||
x6 = x5 + x7;
|
|
||||||
x5 -= x7;
|
|
||||||
|
|
||||||
/* third stage */
|
|
||||||
x7 = x8 + x3;
|
|
||||||
x8 -= x3;
|
|
||||||
x3 = x0 + x2;
|
|
||||||
x0 -= x2;
|
|
||||||
x2 = (181 * (x4 + x5) + 128) >> 8;
|
|
||||||
x4 = (181 * (x4 - x5) + 128) >> 8;
|
|
||||||
|
|
||||||
/* fourth stage */
|
|
||||||
blk[0] = (x7 + x1) >> 8;
|
|
||||||
blk[1] = (x3 + x2) >> 8;
|
|
||||||
blk[2] = (x0 + x4) >> 8;
|
|
||||||
blk[3] = (x8 + x6) >> 8;
|
|
||||||
blk[4] = (x8 - x6) >> 8;
|
|
||||||
blk[5] = (x0 - x4) >> 8;
|
|
||||||
blk[6] = (x3 - x2) >> 8;
|
|
||||||
blk[7] = (x7 - x1) >> 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* column (vertical) IDCT
|
|
||||||
*
|
|
||||||
* 7 pi 1
|
|
||||||
* dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l )
|
|
||||||
* l=0 8 2
|
|
||||||
*
|
|
||||||
* where: c[0] = 1/1024
|
|
||||||
* c[1..7] = (1/1024)*sqrt(2)
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
idctcol (blk)
|
|
||||||
short *blk;
|
|
||||||
{
|
|
||||||
int x0, x1, x2, x3, x4, x5, x6, x7, x8;
|
|
||||||
|
|
||||||
/* shortcut */
|
|
||||||
if (!((x1 = (blk[8 * 4] << 8)) | (x2 = blk[8 * 6]) | (x3 = blk[8 * 2]) |
|
|
||||||
(x4 = blk[8 * 1]) | (x5 = blk[8 * 7]) | (x6 = blk[8 * 5]) | (x7 =
|
|
||||||
blk[8 * 3]))) {
|
|
||||||
blk[8 * 0] = blk[8 * 1] = blk[8 * 2] = blk[8 * 3] = blk[8 * 4] =
|
|
||||||
blk[8 * 5] = blk[8 * 6] = blk[8 * 7] = iclp[(blk[8 * 0] + 32) >> 6];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
x0 = (blk[8 * 0] << 8) + 8192;
|
|
||||||
|
|
||||||
/* first stage */
|
|
||||||
x8 = W7 * (x4 + x5) + 4;
|
|
||||||
x4 = (x8 + (W1 - W7) * x4) >> 3;
|
|
||||||
x5 = (x8 - (W1 + W7) * x5) >> 3;
|
|
||||||
x8 = W3 * (x6 + x7) + 4;
|
|
||||||
x6 = (x8 - (W3 - W5) * x6) >> 3;
|
|
||||||
x7 = (x8 - (W3 + W5) * x7) >> 3;
|
|
||||||
|
|
||||||
/* second stage */
|
|
||||||
x8 = x0 + x1;
|
|
||||||
x0 -= x1;
|
|
||||||
x1 = W6 * (x3 + x2) + 4;
|
|
||||||
x2 = (x1 - (W2 + W6) * x2) >> 3;
|
|
||||||
x3 = (x1 + (W2 - W6) * x3) >> 3;
|
|
||||||
x1 = x4 + x6;
|
|
||||||
x4 -= x6;
|
|
||||||
x6 = x5 + x7;
|
|
||||||
x5 -= x7;
|
|
||||||
|
|
||||||
/* third stage */
|
|
||||||
x7 = x8 + x3;
|
|
||||||
x8 -= x3;
|
|
||||||
x3 = x0 + x2;
|
|
||||||
x0 -= x2;
|
|
||||||
x2 = (181 * (x4 + x5) + 128) >> 8;
|
|
||||||
x4 = (181 * (x4 - x5) + 128) >> 8;
|
|
||||||
|
|
||||||
/* fourth stage */
|
|
||||||
blk[8 * 0] = iclp[(x7 + x1) >> 14];
|
|
||||||
blk[8 * 1] = iclp[(x3 + x2) >> 14];
|
|
||||||
blk[8 * 2] = iclp[(x0 + x4) >> 14];
|
|
||||||
blk[8 * 3] = iclp[(x8 + x6) >> 14];
|
|
||||||
blk[8 * 4] = iclp[(x8 - x6) >> 14];
|
|
||||||
blk[8 * 5] = iclp[(x0 - x4) >> 14];
|
|
||||||
blk[8 * 6] = iclp[(x3 - x2) >> 14];
|
|
||||||
blk[8 * 7] = iclp[(x7 - x1) >> 14];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* two dimensional inverse discrete cosine transform */
|
|
||||||
void
|
|
||||||
gst_idct_fast_int_idct (block)
|
|
||||||
short *block;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
idctrow (block + 8 * i);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
idctcol (block + i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_idct_init_fast_int_idct ()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
iclp = iclip + 512;
|
|
||||||
for (i = -512; i < 512; i++)
|
|
||||||
iclp[i] = (i < -256) ? -256 : ((i > 255) ? 255 : i);
|
|
||||||
}
|
|
|
@ -1,106 +0,0 @@
|
||||||
/* Reference_IDCT.c, Inverse Discrete Fourier Transform, double precision */
|
|
||||||
|
|
||||||
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Disclaimer of Warranty
|
|
||||||
*
|
|
||||||
* These software programs are available to the user without any license fee or
|
|
||||||
* royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
|
|
||||||
* any and all warranties, whether express, implied, or statuary, including any
|
|
||||||
* implied warranties or merchantability or of fitness for a particular
|
|
||||||
* purpose. In no event shall the copyright-holder be liable for any
|
|
||||||
* incidental, punitive, or consequential damages of any kind whatsoever
|
|
||||||
* arising from the use of these programs.
|
|
||||||
*
|
|
||||||
* This disclaimer of warranty extends to the user of these programs and user's
|
|
||||||
* customers, employees, agents, transferees, successors, and assigns.
|
|
||||||
*
|
|
||||||
* The MPEG Software Simulation Group does not represent or warrant that the
|
|
||||||
* programs furnished hereunder are free of infringement of any third-party
|
|
||||||
* patents.
|
|
||||||
*
|
|
||||||
* Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
|
|
||||||
* are subject to royalty fees to patent holders. Many of these patents are
|
|
||||||
* general enough such that they are unavoidable regardless of implementation
|
|
||||||
* design.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1
|
|
||||||
* direct matrix multiply) Inverse Discrete Cosine Transform
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Here we use math.h to generate constants. Compiler results may
|
|
||||||
vary a little */
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#ifndef PI
|
|
||||||
# ifdef M_PI
|
|
||||||
# define PI M_PI
|
|
||||||
# else
|
|
||||||
# define PI 3.14159265358979323846
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* private data */
|
|
||||||
|
|
||||||
/* cosine transform matrix for 8x1 IDCT */
|
|
||||||
static double gst_idct_float_c[8][8];
|
|
||||||
|
|
||||||
/* initialize DCT coefficient matrix */
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_idct_init_float_idct ()
|
|
||||||
{
|
|
||||||
int freq, time;
|
|
||||||
double scale;
|
|
||||||
|
|
||||||
for (freq = 0; freq < 8; freq++) {
|
|
||||||
scale = (freq == 0) ? sqrt (0.125) : 0.5;
|
|
||||||
for (time = 0; time < 8; time++)
|
|
||||||
gst_idct_float_c[freq][time] =
|
|
||||||
scale * cos ((PI / 8.0) * freq * (time + 0.5));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* perform IDCT matrix multiply for 8x8 coefficient block */
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_idct_float_idct (block)
|
|
||||||
short *block;
|
|
||||||
{
|
|
||||||
int i, j, k, v;
|
|
||||||
double partial_product;
|
|
||||||
double tmp[64];
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
for (j = 0; j < 8; j++) {
|
|
||||||
partial_product = 0.0;
|
|
||||||
|
|
||||||
for (k = 0; k < 8; k++)
|
|
||||||
partial_product += gst_idct_float_c[k][j] * block[8 * i + k];
|
|
||||||
|
|
||||||
tmp[8 * i + j] = partial_product;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Transpose operation is integrated into address mapping by switching
|
|
||||||
loop order of i and j */
|
|
||||||
|
|
||||||
for (j = 0; j < 8; j++)
|
|
||||||
for (i = 0; i < 8; i++) {
|
|
||||||
partial_product = 0.0;
|
|
||||||
|
|
||||||
for (k = 0; k < 8; k++)
|
|
||||||
partial_product += gst_idct_float_c[k][i] * tmp[8 * k + j];
|
|
||||||
|
|
||||||
v = (int) floor (partial_product + 0.5);
|
|
||||||
block[8 * i + j] = (v < -256) ? -256 : ((v > 255) ? 255 : v);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,136 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/idct/idct.h>
|
|
||||||
#include "dct.h"
|
|
||||||
|
|
||||||
static void gst_idct_int_sparse_idct (short *data);
|
|
||||||
|
|
||||||
GstIDCT *
|
|
||||||
gst_idct_new (GstIDCTMethod method)
|
|
||||||
{
|
|
||||||
GstIDCT *new = g_malloc (sizeof (GstIDCT));
|
|
||||||
|
|
||||||
new->need_transpose = FALSE;
|
|
||||||
|
|
||||||
if (method == GST_IDCT_DEFAULT) {
|
|
||||||
method = GST_IDCT_FAST_INT;
|
|
||||||
}
|
|
||||||
|
|
||||||
new->convert_sparse = gst_idct_int_sparse_idct;
|
|
||||||
|
|
||||||
switch (method) {
|
|
||||||
case GST_IDCT_FAST_INT:
|
|
||||||
GST_INFO ("using fast_int_idct");
|
|
||||||
gst_idct_init_fast_int_idct ();
|
|
||||||
new->convert = gst_idct_fast_int_idct;
|
|
||||||
break;
|
|
||||||
case GST_IDCT_INT:
|
|
||||||
GST_INFO ("using int_idct");
|
|
||||||
new->convert = gst_idct_int_idct;
|
|
||||||
break;
|
|
||||||
case GST_IDCT_FLOAT:
|
|
||||||
GST_INFO ("using float_idct");
|
|
||||||
gst_idct_init_float_idct ();
|
|
||||||
new->convert = gst_idct_float_idct;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
GST_INFO ("method not supported");
|
|
||||||
g_free (new);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_idct_int_sparse_idct (short *data)
|
|
||||||
{
|
|
||||||
short val;
|
|
||||||
gint32 v, *dp = (guint32 *) data;
|
|
||||||
|
|
||||||
v = *data;
|
|
||||||
|
|
||||||
if (v < 0) {
|
|
||||||
val = -v;
|
|
||||||
val += (8 >> 1);
|
|
||||||
val /= 8;
|
|
||||||
val = -val;
|
|
||||||
} else {
|
|
||||||
val = (v + (8 >> 1)) / 8;
|
|
||||||
}
|
|
||||||
v = ((val & 0xffff) | (val << 16));
|
|
||||||
|
|
||||||
dp[0] = v;
|
|
||||||
dp[1] = v;
|
|
||||||
dp[2] = v;
|
|
||||||
dp[3] = v;
|
|
||||||
dp[4] = v;
|
|
||||||
dp[5] = v;
|
|
||||||
dp[6] = v;
|
|
||||||
dp[7] = v;
|
|
||||||
dp[8] = v;
|
|
||||||
dp[9] = v;
|
|
||||||
dp[10] = v;
|
|
||||||
dp[11] = v;
|
|
||||||
dp[12] = v;
|
|
||||||
dp[13] = v;
|
|
||||||
dp[14] = v;
|
|
||||||
dp[15] = v;
|
|
||||||
dp[16] = v;
|
|
||||||
dp[17] = v;
|
|
||||||
dp[18] = v;
|
|
||||||
dp[19] = v;
|
|
||||||
dp[20] = v;
|
|
||||||
dp[21] = v;
|
|
||||||
dp[22] = v;
|
|
||||||
dp[23] = v;
|
|
||||||
dp[24] = v;
|
|
||||||
dp[25] = v;
|
|
||||||
dp[26] = v;
|
|
||||||
dp[27] = v;
|
|
||||||
dp[28] = v;
|
|
||||||
dp[29] = v;
|
|
||||||
dp[30] = v;
|
|
||||||
dp[31] = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_idct_destroy (GstIDCT * idct)
|
|
||||||
{
|
|
||||||
g_return_if_fail (idct != NULL);
|
|
||||||
|
|
||||||
g_free (idct);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
plugin_init (GstPlugin * plugin)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
||||||
GST_VERSION_MINOR,
|
|
||||||
"gstidct",
|
|
||||||
"Accelerated IDCT routines",
|
|
||||||
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN)
|
|
|
@ -1,55 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* 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_IDCT_H__
|
|
||||||
#define __GST_IDCT_H__
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
GST_IDCT_DEFAULT,
|
|
||||||
GST_IDCT_INT,
|
|
||||||
GST_IDCT_FAST_INT,
|
|
||||||
GST_IDCT_FLOAT,
|
|
||||||
} GstIDCTMethod;
|
|
||||||
|
|
||||||
typedef struct _GstIDCT GstIDCT;
|
|
||||||
typedef void (*GstIDCTFunction) (gshort *block);
|
|
||||||
|
|
||||||
#define GST_IDCT_TRANSPOSE(idct) ((idct)->need_transpose)
|
|
||||||
|
|
||||||
struct _GstIDCT {
|
|
||||||
/* private */
|
|
||||||
GstIDCTFunction convert;
|
|
||||||
GstIDCTFunction convert_sparse;
|
|
||||||
gboolean need_transpose;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
GstIDCT *gst_idct_new(GstIDCTMethod method);
|
|
||||||
#define gst_idct_convert(idct, blocks) (idct)->convert((blocks))
|
|
||||||
#define gst_idct_convert_sparse(idct, blocks) (idct)->convert_sparse((blocks))
|
|
||||||
void gst_idct_destroy(GstIDCT *idct);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_IDCT_H__ */
|
|
|
@ -1,156 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="idtc"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D67895}"
|
|
||||||
RootNamespace="idtc"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstidtc.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile=""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/idtc.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstidtc.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstidtc.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile=""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstidtc.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\fastintidct.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\floatidct.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\idct.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\intidct.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\dct.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\idtc.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,366 +0,0 @@
|
||||||
/*
|
|
||||||
* ieeetest.c --- test IDCT code against the IEEE Std 1180-1990 spec
|
|
||||||
*
|
|
||||||
* Note that this does only one pass of the test.
|
|
||||||
* Six invocations of ieeetest are needed to complete the entire spec.
|
|
||||||
* The shell script "doieee" performs the complete test.
|
|
||||||
*
|
|
||||||
* Written by Tom Lane (tgl@cs.cmu.edu).
|
|
||||||
* Released to public domain 11/22/93.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/idct/idct.h>
|
|
||||||
#include "dct.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* prototypes */
|
|
||||||
|
|
||||||
void usage (char *msg);
|
|
||||||
long ieeerand (long L, long H);
|
|
||||||
void dct_init (void);
|
|
||||||
void ref_fdct (DCTELEM block[8][8]);
|
|
||||||
void ref_idct (DCTELEM block[8][8]);
|
|
||||||
|
|
||||||
/* error stat accumulators -- assume initialized to 0 */
|
|
||||||
|
|
||||||
long sumerrs[DCTSIZE2];
|
|
||||||
long sumsqerrs[DCTSIZE2];
|
|
||||||
int maxerr[DCTSIZE2];
|
|
||||||
|
|
||||||
|
|
||||||
char *
|
|
||||||
meets (double val, double limit)
|
|
||||||
{
|
|
||||||
return ((fabs (val) <= limit) ? "meets" : "FAILS");
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char **argv)
|
|
||||||
{
|
|
||||||
long minpix, maxpix, sign;
|
|
||||||
long curiter, niters;
|
|
||||||
int i, j;
|
|
||||||
double max, total;
|
|
||||||
int method;
|
|
||||||
DCTELEM block[DCTSIZE2]; /* random source data */
|
|
||||||
DCTELEM refcoefs[DCTSIZE2]; /* coefs from reference FDCT */
|
|
||||||
DCTELEM refout[DCTSIZE2]; /* output from reference IDCT */
|
|
||||||
DCTELEM testout[DCTSIZE2]; /* output from test IDCT */
|
|
||||||
GstIDCT *idct;
|
|
||||||
guint64 tscstart, tscmin = ~0, tscmax = 0;
|
|
||||||
guint64 tscstop;
|
|
||||||
|
|
||||||
/* Argument parsing --- not very bulletproof at all */
|
|
||||||
|
|
||||||
if (argc != 6)
|
|
||||||
usage (NULL);
|
|
||||||
|
|
||||||
method = atoi (argv[1]);
|
|
||||||
minpix = atoi (argv[2]);
|
|
||||||
maxpix = atoi (argv[3]);
|
|
||||||
sign = atoi (argv[4]);
|
|
||||||
niters = atol (argv[5]);
|
|
||||||
|
|
||||||
gst_library_load ("gstidct");
|
|
||||||
|
|
||||||
idct = gst_idct_new (method);
|
|
||||||
if (idct == 0) {
|
|
||||||
printf ("method not available\n\n\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
dct_init ();
|
|
||||||
|
|
||||||
/* Loop once per generated random-data block */
|
|
||||||
|
|
||||||
for (curiter = 0; curiter < niters; curiter++) {
|
|
||||||
|
|
||||||
/* generate a pseudo-random block of data */
|
|
||||||
for (i = 0; i < DCTSIZE2; i++)
|
|
||||||
block[i] = (DCTELEM) (ieeerand (-minpix, maxpix) * sign);
|
|
||||||
|
|
||||||
/* perform reference FDCT */
|
|
||||||
memcpy (refcoefs, block, sizeof (DCTELEM) * DCTSIZE2);
|
|
||||||
ref_fdct ((DCTELEM **) & refcoefs);
|
|
||||||
/* clip */
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
if (refcoefs[i] < -2048)
|
|
||||||
refcoefs[i] = -2048;
|
|
||||||
else if (refcoefs[i] > 2047)
|
|
||||||
refcoefs[i] = 2047;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* perform reference IDCT */
|
|
||||||
memcpy (refout, refcoefs, sizeof (DCTELEM) * DCTSIZE2);
|
|
||||||
ref_idct (refout);
|
|
||||||
/* clip */
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
if (refout[i] < -256)
|
|
||||||
refout[i] = -256;
|
|
||||||
else if (refout[i] > 255)
|
|
||||||
refout[i] = 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* perform test IDCT */
|
|
||||||
if (GST_IDCT_TRANSPOSE (idct)) {
|
|
||||||
for (j = 0; j < DCTSIZE; j++) {
|
|
||||||
for (i = 0; i < DCTSIZE; i++) {
|
|
||||||
testout[i * DCTSIZE + j] = refcoefs[j * DCTSIZE + i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
memcpy (testout, refcoefs, sizeof (DCTELEM) * DCTSIZE2);
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_trace_read_tsc (&tscstart);
|
|
||||||
gst_idct_convert (idct, testout);
|
|
||||||
gst_trace_read_tsc (&tscstop);
|
|
||||||
/*printf("time %llu, %llu %lld\n", tscstart, tscstop, tscstop-tscstart); */
|
|
||||||
if (tscstop - tscstart < tscmin)
|
|
||||||
tscmin = tscstop - tscstart;
|
|
||||||
if (tscstop - tscstart > tscmax)
|
|
||||||
tscmax = tscstop - tscstart;
|
|
||||||
|
|
||||||
/* clip */
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
if (testout[i] < -256)
|
|
||||||
testout[i] = -256;
|
|
||||||
else if (testout[i] > 255)
|
|
||||||
testout[i] = 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* accumulate error stats */
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
register int err = testout[i] - refout[i];
|
|
||||||
|
|
||||||
sumerrs[i] += err;
|
|
||||||
sumsqerrs[i] += err * err;
|
|
||||||
if (err < 0)
|
|
||||||
err = -err;
|
|
||||||
if (maxerr[i] < err)
|
|
||||||
maxerr[i] = err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (curiter % 100 == 99) {
|
|
||||||
fprintf (stderr, ".");
|
|
||||||
fflush (stderr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
|
|
||||||
/* print results */
|
|
||||||
|
|
||||||
printf
|
|
||||||
("IEEE test conditions: -L = %ld, +H = %ld, sign = %ld, #iters = %ld\n",
|
|
||||||
minpix, maxpix, sign, niters);
|
|
||||||
|
|
||||||
printf ("Speed, min time %lld, max %lld\n", tscmin, tscmax);
|
|
||||||
|
|
||||||
printf ("Peak absolute values of errors:\n");
|
|
||||||
for (i = 0, j = 0; i < DCTSIZE2; i++) {
|
|
||||||
if (j < maxerr[i])
|
|
||||||
j = maxerr[i];
|
|
||||||
printf ("%4d", maxerr[i]);
|
|
||||||
if ((i % DCTSIZE) == DCTSIZE - 1)
|
|
||||||
printf ("\n");
|
|
||||||
}
|
|
||||||
printf ("Worst peak error = %d (%s spec limit 1)\n\n", j,
|
|
||||||
meets ((double) j, 1.0));
|
|
||||||
|
|
||||||
printf ("Mean square errors:\n");
|
|
||||||
max = total = 0.0;
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
double err = (double) sumsqerrs[i] / ((double) niters);
|
|
||||||
|
|
||||||
total += (double) sumsqerrs[i];
|
|
||||||
if (max < err)
|
|
||||||
max = err;
|
|
||||||
printf (" %8.4f", err);
|
|
||||||
if ((i % DCTSIZE) == DCTSIZE - 1)
|
|
||||||
printf ("\n");
|
|
||||||
}
|
|
||||||
printf ("Worst pmse = %.6f (%s spec limit 0.06)\n", max, meets (max, 0.06));
|
|
||||||
total /= (double) (64 * niters);
|
|
||||||
printf ("Overall mse = %.6f (%s spec limit 0.02)\n\n", total,
|
|
||||||
meets (total, 0.02));
|
|
||||||
|
|
||||||
printf ("Mean errors:\n");
|
|
||||||
max = total = 0.0;
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
double err = (double) sumerrs[i] / ((double) niters);
|
|
||||||
|
|
||||||
total += (double) sumerrs[i];
|
|
||||||
printf (" %8.4f", err);
|
|
||||||
if (err < 0.0)
|
|
||||||
err = -err;
|
|
||||||
if (max < err)
|
|
||||||
max = err;
|
|
||||||
if ((i % DCTSIZE) == DCTSIZE - 1)
|
|
||||||
printf ("\n");
|
|
||||||
}
|
|
||||||
printf ("Worst mean error = %.6f (%s spec limit 0.015)\n", max,
|
|
||||||
meets (max, 0.015));
|
|
||||||
total /= (double) (64 * niters);
|
|
||||||
printf ("Overall mean error = %.6f (%s spec limit 0.0015)\n\n", total,
|
|
||||||
meets (total, 0.0015));
|
|
||||||
|
|
||||||
/* test for 0 input giving 0 output */
|
|
||||||
memset (testout, 0, sizeof (DCTELEM) * DCTSIZE2);
|
|
||||||
gst_idct_convert (idct, testout);
|
|
||||||
for (i = 0, j = 0; i < DCTSIZE2; i++) {
|
|
||||||
if (testout[i]) {
|
|
||||||
printf ("Position %d of IDCT(0) = %d (FAILS)\n", i, testout[i]);
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf ("%d elements of IDCT(0) were not zero\n\n\n", j);
|
|
||||||
|
|
||||||
exit (0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
usage (char *msg)
|
|
||||||
{
|
|
||||||
if (msg != NULL)
|
|
||||||
fprintf (stderr, "\nerror: %s\n", msg);
|
|
||||||
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
fprintf (stderr, "usage: ieeetest minpix maxpix sign niters\n");
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
fprintf (stderr, " test = 1 - 5\n");
|
|
||||||
fprintf (stderr, " minpix = -L value per IEEE spec\n");
|
|
||||||
fprintf (stderr, " maxpix = H value per IEEE spec\n");
|
|
||||||
fprintf (stderr, " sign = +1 for normal, -1 to run negated test\n");
|
|
||||||
fprintf (stderr, " niters = # iterations (10000 for full test)\n");
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Pseudo-random generator specified by IEEE 1180 */
|
|
||||||
|
|
||||||
long
|
|
||||||
ieeerand (long L, long H)
|
|
||||||
{
|
|
||||||
static long randx = 1;
|
|
||||||
static double z = (double) 0x7fffffff;
|
|
||||||
|
|
||||||
long i, j;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
randx = (randx * 1103515245) + 12345;
|
|
||||||
i = randx & 0x7ffffffe;
|
|
||||||
x = ((double) i) / z;
|
|
||||||
x *= (L + H + 1);
|
|
||||||
j = x;
|
|
||||||
return j - L;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Reference double-precision FDCT and IDCT */
|
|
||||||
|
|
||||||
|
|
||||||
/* The cosine lookup table */
|
|
||||||
/* coslu[a][b] = C(b)/2 * cos[(2a+1)b*pi/16] */
|
|
||||||
double coslu[8][8];
|
|
||||||
|
|
||||||
|
|
||||||
/* Routine to initialise the cosine lookup table */
|
|
||||||
void
|
|
||||||
dct_init (void)
|
|
||||||
{
|
|
||||||
int a, b;
|
|
||||||
double tmp;
|
|
||||||
|
|
||||||
for (a = 0; a < 8; a++)
|
|
||||||
for (b = 0; b < 8; b++) {
|
|
||||||
tmp = cos ((double) ((a + a + 1) * b) * (3.14159265358979323846 / 16.0));
|
|
||||||
if (b == 0)
|
|
||||||
tmp /= sqrt (2.0);
|
|
||||||
coslu[a][b] = tmp * 0.5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ref_fdct (DCTELEM block[8][8])
|
|
||||||
{
|
|
||||||
int x, y, u, v;
|
|
||||||
double tmp, tmp2;
|
|
||||||
double res[8][8];
|
|
||||||
|
|
||||||
for (v = 0; v < 8; v++) {
|
|
||||||
for (u = 0; u < 8; u++) {
|
|
||||||
tmp = 0.0;
|
|
||||||
for (y = 0; y < 8; y++) {
|
|
||||||
tmp2 = 0.0;
|
|
||||||
for (x = 0; x < 8; x++) {
|
|
||||||
tmp2 += (double) block[y][x] * coslu[x][u];
|
|
||||||
}
|
|
||||||
tmp += coslu[y][v] * tmp2;
|
|
||||||
}
|
|
||||||
res[v][u] = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (v = 0; v < 8; v++) {
|
|
||||||
for (u = 0; u < 8; u++) {
|
|
||||||
tmp = res[v][u];
|
|
||||||
if (tmp < 0.0) {
|
|
||||||
x = -((int) (0.5 - tmp));
|
|
||||||
} else {
|
|
||||||
x = (int) (tmp + 0.5);
|
|
||||||
}
|
|
||||||
block[v][u] = (DCTELEM) x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ref_idct (DCTELEM block[8][8])
|
|
||||||
{
|
|
||||||
int x, y, u, v;
|
|
||||||
double tmp, tmp2;
|
|
||||||
double res[8][8];
|
|
||||||
|
|
||||||
for (y = 0; y < 8; y++) {
|
|
||||||
for (x = 0; x < 8; x++) {
|
|
||||||
tmp = 0.0;
|
|
||||||
for (v = 0; v < 8; v++) {
|
|
||||||
tmp2 = 0.0;
|
|
||||||
for (u = 0; u < 8; u++) {
|
|
||||||
tmp2 += (double) block[v][u] * coslu[x][u];
|
|
||||||
}
|
|
||||||
tmp += coslu[y][v] * tmp2;
|
|
||||||
}
|
|
||||||
res[y][x] = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (v = 0; v < 8; v++) {
|
|
||||||
for (u = 0; u < 8; u++) {
|
|
||||||
tmp = res[v][u];
|
|
||||||
if (tmp < 0.0) {
|
|
||||||
x = -((int) (0.5 - tmp));
|
|
||||||
} else {
|
|
||||||
x = (int) (tmp + 0.5);
|
|
||||||
}
|
|
||||||
block[v][u] = (DCTELEM) x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,380 +0,0 @@
|
||||||
/*
|
|
||||||
* jrevdct.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991, 1992, Thomas G. Lane.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains the basic inverse-DCT transformation subroutine.
|
|
||||||
*
|
|
||||||
* This implementation is based on an algorithm described in
|
|
||||||
* C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
|
|
||||||
* Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
|
|
||||||
* Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
|
|
||||||
* The primary algorithm described there uses 11 multiplies and 29 adds.
|
|
||||||
* We use their alternate method with 12 multiplies and 32 adds.
|
|
||||||
* The advantage of this method is that no data path contains more than one
|
|
||||||
* multiplication; this allows a very simple and accurate implementation in
|
|
||||||
* scaled fixed-point arithmetic, with a minimal number of shifts.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "dct.h"
|
|
||||||
|
|
||||||
/* We assume that right shift corresponds to signed division by 2 with
|
|
||||||
* rounding towards minus infinity. This is correct for typical "arithmetic
|
|
||||||
* shift" instructions that shift in copies of the sign bit. But some
|
|
||||||
* C compilers implement >> with an unsigned shift. For these machines you
|
|
||||||
* must define RIGHT_SHIFT_IS_UNSIGNED.
|
|
||||||
* RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
|
|
||||||
* It is only applied with constant shift counts. SHIFT_TEMPS must be
|
|
||||||
* included in the variables of any routine using RIGHT_SHIFT.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
#define SHIFT_TEMPS INT32 shift_temp;
|
|
||||||
#define RIGHT_SHIFT(x,shft) \
|
|
||||||
((shift_temp = (x)) < 0 ? \
|
|
||||||
(shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
|
|
||||||
(shift_temp >> (shft)))
|
|
||||||
#else
|
|
||||||
#define SHIFT_TEMPS
|
|
||||||
#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This routine is specialized to the case DCTSIZE = 8.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if DCTSIZE != 8
|
|
||||||
Sorry, this code only copes with 8 x8 DCTs. /* deliberate syntax err */
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* A 2-D IDCT can be done by 1-D IDCT on each row followed by 1-D IDCT
|
|
||||||
* on each column. Direct algorithms are also available, but they are
|
|
||||||
* much more complex and seem not to be any faster when reduced to code.
|
|
||||||
*
|
|
||||||
* The poop on this scaling stuff is as follows:
|
|
||||||
*
|
|
||||||
* Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
|
|
||||||
* larger than the true IDCT outputs. The final outputs are therefore
|
|
||||||
* a factor of N larger than desired; since N=8 this can be cured by
|
|
||||||
* a simple right shift at the end of the algorithm. The advantage of
|
|
||||||
* this arrangement is that we save two multiplications per 1-D IDCT,
|
|
||||||
* because the y0 and y4 inputs need not be divided by sqrt(N).
|
|
||||||
*
|
|
||||||
* We have to do addition and subtraction of the integer inputs, which
|
|
||||||
* is no problem, and multiplication by fractional constants, which is
|
|
||||||
* a problem to do in integer arithmetic. We multiply all the constants
|
|
||||||
* by CONST_SCALE and convert them to integer constants (thus retaining
|
|
||||||
* CONST_BITS bits of precision in the constants). After doing a
|
|
||||||
* multiplication we have to divide the product by CONST_SCALE, with proper
|
|
||||||
* rounding, to produce the correct output. This division can be done
|
|
||||||
* cheaply as a right shift of CONST_BITS bits. We postpone shifting
|
|
||||||
* as long as possible so that partial sums can be added together with
|
|
||||||
* full fractional precision.
|
|
||||||
*
|
|
||||||
* The outputs of the first pass are scaled up by PASS1_BITS bits so that
|
|
||||||
* they are represented to better-than-integral precision. These outputs
|
|
||||||
* require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
|
|
||||||
* with the recommended scaling. (To scale up 12-bit sample data further, an
|
|
||||||
* intermediate INT32 array would be needed.)
|
|
||||||
*
|
|
||||||
* To avoid overflow of the 32-bit intermediate results in pass 2, we must
|
|
||||||
* have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis
|
|
||||||
* shows that the values given below are the most effective.
|
|
||||||
*/
|
|
||||||
#ifdef EIGHT_BIT_SAMPLES
|
|
||||||
#define CONST_BITS 13
|
|
||||||
#define PASS1_BITS 2
|
|
||||||
#else
|
|
||||||
#define CONST_BITS 13
|
|
||||||
#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
|
|
||||||
#endif
|
|
||||||
#define ONE ((INT32) 1)
|
|
||||||
#define CONST_SCALE (ONE << CONST_BITS)
|
|
||||||
/* Convert a positive real constant to an integer scaled by CONST_SCALE. */
|
|
||||||
#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5))
|
|
||||||
/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
|
|
||||||
* causing a lot of useless floating-point operations at run time.
|
|
||||||
* To get around this we use the following pre-calculated constants.
|
|
||||||
* If you change CONST_BITS you may want to add appropriate values.
|
|
||||||
* (With a reasonable C compiler, you can just rely on the FIX() macro...)
|
|
||||||
*/
|
|
||||||
#if CONST_BITS == 13
|
|
||||||
#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */
|
|
||||||
#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */
|
|
||||||
#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */
|
|
||||||
#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
|
|
||||||
#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
|
|
||||||
#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */
|
|
||||||
#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */
|
|
||||||
#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
|
|
||||||
#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */
|
|
||||||
#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */
|
|
||||||
#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
|
|
||||||
#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */
|
|
||||||
#else
|
|
||||||
#define FIX_0_298631336 FIX(0.298631336)
|
|
||||||
#define FIX_0_390180644 FIX(0.390180644)
|
|
||||||
#define FIX_0_541196100 FIX(0.541196100)
|
|
||||||
#define FIX_0_765366865 FIX(0.765366865)
|
|
||||||
#define FIX_0_899976223 FIX(0.899976223)
|
|
||||||
#define FIX_1_175875602 FIX(1.175875602)
|
|
||||||
#define FIX_1_501321110 FIX(1.501321110)
|
|
||||||
#define FIX_1_847759065 FIX(1.847759065)
|
|
||||||
#define FIX_1_961570560 FIX(1.961570560)
|
|
||||||
#define FIX_2_053119869 FIX(2.053119869)
|
|
||||||
#define FIX_2_562915447 FIX(2.562915447)
|
|
||||||
#define FIX_3_072711026 FIX(3.072711026)
|
|
||||||
#endif
|
|
||||||
/* Descale and correctly round an INT32 value that's scaled by N bits.
|
|
||||||
* We assume RIGHT_SHIFT rounds towards minus infinity, so adding
|
|
||||||
* the fudge factor is correct for either sign of X.
|
|
||||||
*/
|
|
||||||
#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
|
|
||||||
/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
|
|
||||||
* For 8-bit samples with the recommended scaling, all the variable
|
|
||||||
* and constant values involved are no more than 16 bits wide, so a
|
|
||||||
* 16x16->32 bit multiply can be used instead of a full 32x32 multiply;
|
|
||||||
* this provides a useful speedup on many machines.
|
|
||||||
* There is no way to specify a 16x16->32 multiply in portable C, but
|
|
||||||
* some C compilers will do the right thing if you provide the correct
|
|
||||||
* combination of casts.
|
|
||||||
* NB: for 12-bit samples, a full 32-bit multiplication will be needed.
|
|
||||||
*/
|
|
||||||
#ifdef EIGHT_BIT_SAMPLES
|
|
||||||
#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */
|
|
||||||
#define MULTIPLY(var,const) (((INT16) (var)) * ((INT16) (const)))
|
|
||||||
#endif
|
|
||||||
#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */
|
|
||||||
#define MULTIPLY(var,const) (((INT16) (var)) * ((INT32) (const)))
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifndef MULTIPLY /* default definition */
|
|
||||||
#define MULTIPLY(var,const) ((var) * (const))
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Perform the inverse DCT on one block of coefficients.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gst_idct_int_idct (DCTBLOCK data)
|
|
||||||
{
|
|
||||||
INT32 tmp0, tmp1, tmp2, tmp3;
|
|
||||||
INT32 tmp10, tmp11, tmp12, tmp13;
|
|
||||||
INT32 z1, z2, z3, z4, z5;
|
|
||||||
register DCTELEM *dataptr;
|
|
||||||
int rowctr;
|
|
||||||
|
|
||||||
SHIFT_TEMPS
|
|
||||||
/* Pass 1: process rows. */
|
|
||||||
/* Note results are scaled up by sqrt(8) compared to a true IDCT; */
|
|
||||||
/* furthermore, we scale the results by 2**PASS1_BITS. */
|
|
||||||
dataptr = data;
|
|
||||||
for (rowctr = DCTSIZE - 1; rowctr >= 0; rowctr--) {
|
|
||||||
/* Due to quantization, we will usually find that many of the input
|
|
||||||
* coefficients are zero, especially the AC terms. We can exploit this
|
|
||||||
* by short-circuiting the IDCT calculation for any row in which all
|
|
||||||
* the AC terms are zero. In that case each output is equal to the
|
|
||||||
* DC coefficient (with scale factor as needed).
|
|
||||||
* With typical images and quantization tables, half or more of the
|
|
||||||
* row DCT calculations can be simplified this way.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((dataptr[1] | dataptr[2] | dataptr[3] | dataptr[4] |
|
|
||||||
dataptr[5] | dataptr[6] | dataptr[7]) == 0) {
|
|
||||||
/* AC terms all zero */
|
|
||||||
DCTELEM dcval = (DCTELEM) (dataptr[0] << PASS1_BITS);
|
|
||||||
|
|
||||||
dataptr[0] = dcval;
|
|
||||||
dataptr[1] = dcval;
|
|
||||||
dataptr[2] = dcval;
|
|
||||||
dataptr[3] = dcval;
|
|
||||||
dataptr[4] = dcval;
|
|
||||||
dataptr[5] = dcval;
|
|
||||||
dataptr[6] = dcval;
|
|
||||||
dataptr[7] = dcval;
|
|
||||||
|
|
||||||
dataptr += DCTSIZE; /* advance pointer to next row */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Even part: reverse the even part of the forward DCT. */
|
|
||||||
/* The rotator is sqrt(2)*c(-6). */
|
|
||||||
|
|
||||||
z2 = (INT32) dataptr[2];
|
|
||||||
z3 = (INT32) dataptr[6];
|
|
||||||
|
|
||||||
z1 = MULTIPLY (z2 + z3, FIX_0_541196100);
|
|
||||||
tmp2 = z1 + MULTIPLY (z3, -FIX_1_847759065);
|
|
||||||
tmp3 = z1 + MULTIPLY (z2, FIX_0_765366865);
|
|
||||||
|
|
||||||
tmp0 = ((INT32) dataptr[0] + (INT32) dataptr[4]) << CONST_BITS;
|
|
||||||
tmp1 = ((INT32) dataptr[0] - (INT32) dataptr[4]) << CONST_BITS;
|
|
||||||
|
|
||||||
tmp10 = tmp0 + tmp3;
|
|
||||||
tmp13 = tmp0 - tmp3;
|
|
||||||
tmp11 = tmp1 + tmp2;
|
|
||||||
tmp12 = tmp1 - tmp2;
|
|
||||||
|
|
||||||
/* Odd part per figure 8; the matrix is unitary and hence its
|
|
||||||
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
|
|
||||||
*/
|
|
||||||
|
|
||||||
tmp0 = (INT32) dataptr[7];
|
|
||||||
tmp1 = (INT32) dataptr[5];
|
|
||||||
tmp2 = (INT32) dataptr[3];
|
|
||||||
tmp3 = (INT32) dataptr[1];
|
|
||||||
|
|
||||||
z1 = tmp0 + tmp3;
|
|
||||||
z2 = tmp1 + tmp2;
|
|
||||||
z3 = tmp0 + tmp2;
|
|
||||||
z4 = tmp1 + tmp3;
|
|
||||||
z5 = MULTIPLY (z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
|
|
||||||
|
|
||||||
tmp0 = MULTIPLY (tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
|
|
||||||
tmp1 = MULTIPLY (tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
|
|
||||||
tmp2 = MULTIPLY (tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
|
|
||||||
tmp3 = MULTIPLY (tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
|
|
||||||
z1 = MULTIPLY (z1, -FIX_0_899976223); /* sqrt(2) * (c7-c3) */
|
|
||||||
z2 = MULTIPLY (z2, -FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
|
|
||||||
z3 = MULTIPLY (z3, -FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
|
|
||||||
z4 = MULTIPLY (z4, -FIX_0_390180644); /* sqrt(2) * (c5-c3) */
|
|
||||||
|
|
||||||
z3 += z5;
|
|
||||||
z4 += z5;
|
|
||||||
|
|
||||||
tmp0 += z1 + z3;
|
|
||||||
tmp1 += z2 + z4;
|
|
||||||
tmp2 += z2 + z3;
|
|
||||||
tmp3 += z1 + z4;
|
|
||||||
|
|
||||||
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
|
|
||||||
|
|
||||||
dataptr[0] = (DCTELEM) DESCALE (tmp10 + tmp3, CONST_BITS - PASS1_BITS);
|
|
||||||
dataptr[7] = (DCTELEM) DESCALE (tmp10 - tmp3, CONST_BITS - PASS1_BITS);
|
|
||||||
dataptr[1] = (DCTELEM) DESCALE (tmp11 + tmp2, CONST_BITS - PASS1_BITS);
|
|
||||||
dataptr[6] = (DCTELEM) DESCALE (tmp11 - tmp2, CONST_BITS - PASS1_BITS);
|
|
||||||
dataptr[2] = (DCTELEM) DESCALE (tmp12 + tmp1, CONST_BITS - PASS1_BITS);
|
|
||||||
dataptr[5] = (DCTELEM) DESCALE (tmp12 - tmp1, CONST_BITS - PASS1_BITS);
|
|
||||||
dataptr[3] = (DCTELEM) DESCALE (tmp13 + tmp0, CONST_BITS - PASS1_BITS);
|
|
||||||
dataptr[4] = (DCTELEM) DESCALE (tmp13 - tmp0, CONST_BITS - PASS1_BITS);
|
|
||||||
|
|
||||||
dataptr += DCTSIZE; /* advance pointer to next row */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Pass 2: process columns. */
|
|
||||||
/* Note that we must descale the results by a factor of 8 == 2**3, */
|
|
||||||
/* and also undo the PASS1_BITS scaling. */
|
|
||||||
|
|
||||||
dataptr = data;
|
|
||||||
for (rowctr = DCTSIZE - 1; rowctr >= 0; rowctr--) {
|
|
||||||
/* Columns of zeroes can be exploited in the same way as we did with rows.
|
|
||||||
* However, the row calculation has created many nonzero AC terms, so the
|
|
||||||
* simplification applies less often (typically 5% to 10% of the time).
|
|
||||||
* On machines with very fast multiplication, it's possible that the
|
|
||||||
* test takes more time than it's worth. In that case this section
|
|
||||||
* may be commented out.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef NO_ZERO_COLUMN_TEST
|
|
||||||
if ((dataptr[DCTSIZE * 1] | dataptr[DCTSIZE * 2] | dataptr[DCTSIZE * 3] |
|
|
||||||
dataptr[DCTSIZE * 4] | dataptr[DCTSIZE * 5] | dataptr[DCTSIZE * 6] |
|
|
||||||
dataptr[DCTSIZE * 7]) == 0) {
|
|
||||||
/* AC terms all zero */
|
|
||||||
DCTELEM dcval = (DCTELEM) DESCALE ((INT32) dataptr[0], PASS1_BITS + 3);
|
|
||||||
|
|
||||||
dataptr[DCTSIZE * 0] = dcval;
|
|
||||||
dataptr[DCTSIZE * 1] = dcval;
|
|
||||||
dataptr[DCTSIZE * 2] = dcval;
|
|
||||||
dataptr[DCTSIZE * 3] = dcval;
|
|
||||||
dataptr[DCTSIZE * 4] = dcval;
|
|
||||||
dataptr[DCTSIZE * 5] = dcval;
|
|
||||||
dataptr[DCTSIZE * 6] = dcval;
|
|
||||||
dataptr[DCTSIZE * 7] = dcval;
|
|
||||||
|
|
||||||
dataptr++; /* advance pointer to next column */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Even part: reverse the even part of the forward DCT. */
|
|
||||||
/* The rotator is sqrt(2)*c(-6). */
|
|
||||||
|
|
||||||
z2 = (INT32) dataptr[DCTSIZE * 2];
|
|
||||||
z3 = (INT32) dataptr[DCTSIZE * 6];
|
|
||||||
|
|
||||||
z1 = MULTIPLY (z2 + z3, FIX_0_541196100);
|
|
||||||
tmp2 = z1 + MULTIPLY (z3, -FIX_1_847759065);
|
|
||||||
tmp3 = z1 + MULTIPLY (z2, FIX_0_765366865);
|
|
||||||
|
|
||||||
tmp0 =
|
|
||||||
((INT32) dataptr[DCTSIZE * 0] +
|
|
||||||
(INT32) dataptr[DCTSIZE * 4]) << CONST_BITS;
|
|
||||||
tmp1 =
|
|
||||||
((INT32) dataptr[DCTSIZE * 0] -
|
|
||||||
(INT32) dataptr[DCTSIZE * 4]) << CONST_BITS;
|
|
||||||
|
|
||||||
tmp10 = tmp0 + tmp3;
|
|
||||||
tmp13 = tmp0 - tmp3;
|
|
||||||
tmp11 = tmp1 + tmp2;
|
|
||||||
tmp12 = tmp1 - tmp2;
|
|
||||||
|
|
||||||
/* Odd part per figure 8; the matrix is unitary and hence its
|
|
||||||
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
|
|
||||||
*/
|
|
||||||
|
|
||||||
tmp0 = (INT32) dataptr[DCTSIZE * 7];
|
|
||||||
tmp1 = (INT32) dataptr[DCTSIZE * 5];
|
|
||||||
tmp2 = (INT32) dataptr[DCTSIZE * 3];
|
|
||||||
tmp3 = (INT32) dataptr[DCTSIZE * 1];
|
|
||||||
|
|
||||||
z1 = tmp0 + tmp3;
|
|
||||||
z2 = tmp1 + tmp2;
|
|
||||||
z3 = tmp0 + tmp2;
|
|
||||||
z4 = tmp1 + tmp3;
|
|
||||||
z5 = MULTIPLY (z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
|
|
||||||
|
|
||||||
tmp0 = MULTIPLY (tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
|
|
||||||
tmp1 = MULTIPLY (tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
|
|
||||||
tmp2 = MULTIPLY (tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
|
|
||||||
tmp3 = MULTIPLY (tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
|
|
||||||
z1 = MULTIPLY (z1, -FIX_0_899976223); /* sqrt(2) * (c7-c3) */
|
|
||||||
z2 = MULTIPLY (z2, -FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
|
|
||||||
z3 = MULTIPLY (z3, -FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
|
|
||||||
z4 = MULTIPLY (z4, -FIX_0_390180644); /* sqrt(2) * (c5-c3) */
|
|
||||||
|
|
||||||
z3 += z5;
|
|
||||||
z4 += z5;
|
|
||||||
|
|
||||||
tmp0 += z1 + z3;
|
|
||||||
tmp1 += z2 + z4;
|
|
||||||
tmp2 += z2 + z3;
|
|
||||||
tmp3 += z1 + z4;
|
|
||||||
|
|
||||||
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
|
|
||||||
|
|
||||||
dataptr[DCTSIZE * 0] = (DCTELEM) DESCALE (tmp10 + tmp3,
|
|
||||||
CONST_BITS + PASS1_BITS + 3);
|
|
||||||
dataptr[DCTSIZE * 7] = (DCTELEM) DESCALE (tmp10 - tmp3,
|
|
||||||
CONST_BITS + PASS1_BITS + 3);
|
|
||||||
dataptr[DCTSIZE * 1] = (DCTELEM) DESCALE (tmp11 + tmp2,
|
|
||||||
CONST_BITS + PASS1_BITS + 3);
|
|
||||||
dataptr[DCTSIZE * 6] = (DCTELEM) DESCALE (tmp11 - tmp2,
|
|
||||||
CONST_BITS + PASS1_BITS + 3);
|
|
||||||
dataptr[DCTSIZE * 2] = (DCTELEM) DESCALE (tmp12 + tmp1,
|
|
||||||
CONST_BITS + PASS1_BITS + 3);
|
|
||||||
dataptr[DCTSIZE * 5] = (DCTELEM) DESCALE (tmp12 - tmp1,
|
|
||||||
CONST_BITS + PASS1_BITS + 3);
|
|
||||||
dataptr[DCTSIZE * 3] = (DCTELEM) DESCALE (tmp13 + tmp0,
|
|
||||||
CONST_BITS + PASS1_BITS + 3);
|
|
||||||
dataptr[DCTSIZE * 4] = (DCTELEM) DESCALE (tmp13 - tmp0,
|
|
||||||
CONST_BITS + PASS1_BITS + 3);
|
|
||||||
|
|
||||||
dataptr++; /* advance pointer to next column */
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
lib_LTLIBRARIES = libgstmedia-info-@GST_MAJORMINOR@.la
|
|
||||||
|
|
||||||
libgstmedia_info_@GST_MAJORMINOR@_la_SOURCES = media-info.c media-info-priv.c
|
|
||||||
|
|
||||||
libgstmedia_info_@GST_MAJORMINOR@_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGIN_CFLAGS)
|
|
||||||
libgstmedia_info_@GST_MAJORMINOR@_la_LIBADD = \
|
|
||||||
$(GST_LIBS) $(GST_PLUGIN_LIBS)
|
|
||||||
libgstmedia_info_@GST_MAJORMINOR@_la_LDFLAGS = \
|
|
||||||
-version-info @GST_PLUGINS_LIBVERSION@
|
|
||||||
|
|
||||||
|
|
||||||
libincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/media-info
|
|
||||||
libinclude_HEADERS = media-info.h
|
|
||||||
|
|
||||||
noinst_PROGRAMS = media-info-test
|
|
||||||
noinst_HEADERS = media-info-priv.h
|
|
||||||
|
|
||||||
media_info_test_SOURCES = media-info-test.c
|
|
||||||
media_info_test_CFLAGS = $(GST_CFLAGS)
|
|
||||||
media_info_test_LDADD = $(GST_LIBS) libgstmedia-info-@GST_MAJORMINOR@.la
|
|
|
@ -1,30 +0,0 @@
|
||||||
* media-info is a library to collect metadata and streaminfo from media
|
|
||||||
files
|
|
||||||
|
|
||||||
* the current implementation is idler-based.
|
|
||||||
|
|
||||||
* you create a new media_info object
|
|
||||||
* you set the string name of a source element to use using g_object_set or
|
|
||||||
gst_media_info_set_source
|
|
||||||
* you declare you'll read a given file by using gst_media_info_read_with_idler
|
|
||||||
* you loop gst_media_info_read_idler (info, &stream) as long as it returns TRUE
|
|
||||||
and as long as stream is still NULL
|
|
||||||
|
|
||||||
|
|
||||||
* INTERNALS:
|
|
||||||
- instance_init sets up the media info reader, its elements, and connects
|
|
||||||
the deep_notify callback
|
|
||||||
- read_with_idler resets the media info reader object,
|
|
||||||
and sets location and flags
|
|
||||||
|
|
||||||
- read_idler runs through a state machine:
|
|
||||||
NULL - TYPEFIND - STREAM - METADATA - STREAMINFO - FORMAT
|
|
||||||
|
|
||||||
- NULL: just returns find_type_pre, which moves state to TYPEFIND
|
|
||||||
- TYPEFIND:
|
|
||||||
- iterates as long as it can until it has priv->type
|
|
||||||
- find_type_post
|
|
||||||
- call gmi_set_mime which creates a pipeline to decode stuff
|
|
||||||
- move to STREAM
|
|
||||||
|
|
||||||
- STREAM
|
|
|
@ -1,775 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* media-info-priv.c - handling of internal stuff */
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "media-info.h"
|
|
||||||
#include "media-info-priv.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* helper structs bits */
|
|
||||||
GstMediaInfoStream *
|
|
||||||
gmi_stream_new (void)
|
|
||||||
{
|
|
||||||
GstMediaInfoStream *stream;
|
|
||||||
|
|
||||||
stream = (GstMediaInfoStream *) g_malloc (sizeof (GstMediaInfoStream));
|
|
||||||
|
|
||||||
stream->length_tracks = 0;
|
|
||||||
stream->length_time = 0;
|
|
||||||
stream->bitrate = 0;
|
|
||||||
stream->seekable = FALSE;
|
|
||||||
stream->path = NULL;
|
|
||||||
stream->mime = NULL;
|
|
||||||
stream->tracks = NULL;
|
|
||||||
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmi_stream_free (GstMediaInfoStream * stream)
|
|
||||||
{
|
|
||||||
if (stream->mime)
|
|
||||||
g_free (stream->mime);
|
|
||||||
/* FIXME: free tracks */
|
|
||||||
g_free (stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
GstMediaInfoTrack *
|
|
||||||
gmi_track_new (void)
|
|
||||||
{
|
|
||||||
GstMediaInfoTrack *track;
|
|
||||||
|
|
||||||
track = g_malloc (sizeof (GstMediaInfoTrack));
|
|
||||||
|
|
||||||
track->metadata = NULL;
|
|
||||||
track->streaminfo = NULL;
|
|
||||||
track->format = NULL;
|
|
||||||
track->length_time = 0;
|
|
||||||
track->con_streams = NULL;
|
|
||||||
|
|
||||||
return track;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* private functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* callbacks */
|
|
||||||
static void
|
|
||||||
have_type_callback (GstElement * typefind, guint probability, GstCaps * type,
|
|
||||||
GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
GstStructure *str;
|
|
||||||
const gchar *mime;
|
|
||||||
|
|
||||||
priv->type = gst_caps_copy (type);
|
|
||||||
str = gst_caps_get_structure (type, 0);
|
|
||||||
mime = gst_structure_get_name (str);
|
|
||||||
GST_DEBUG ("caps %p, mime %s", type, mime);
|
|
||||||
|
|
||||||
/* FIXME: this code doesn't yet work, test it later */
|
|
||||||
#ifdef DONTWORK
|
|
||||||
if (strcmp (mime, "application/x-id3") == 0) {
|
|
||||||
/* dig a little deeper */
|
|
||||||
GST_DEBUG ("dealing with id3, digging deeper");
|
|
||||||
gst_element_set_state (priv->pipeline, GST_STATE_READY);
|
|
||||||
gst_element_unlink (priv->source, priv->typefind);
|
|
||||||
g_assert (priv->decontainer == NULL);
|
|
||||||
priv->decontainer = gst_element_factory_make ("id3tag", "decontainer");
|
|
||||||
gst_bin_add (GST_BIN (priv->pipeline), priv->decontainer);
|
|
||||||
if (priv->decontainer == NULL)
|
|
||||||
/* FIXME: signal error */
|
|
||||||
g_warning ("Couldn't create id3tag");
|
|
||||||
if (!gst_element_link_many (priv->source, priv->decontainer, priv->typefind,
|
|
||||||
NULL));
|
|
||||||
g_warning ("Couldn't link in id3tag");
|
|
||||||
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PLAYING)
|
|
||||||
== GST_STATE_FAILURE)
|
|
||||||
g_warning ("Couldn't set to playing");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
deep_notify_callback (GObject * object, GstObject * origin,
|
|
||||||
GParamSpec * pspec, GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
GValue value = { 0, };
|
|
||||||
|
|
||||||
/* we only care about pad notifies */
|
|
||||||
if (!GST_IS_PAD (origin))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
|
||||||
GST_DEBUG ("DEBUG: deep_notify: have notify of %s from object %s:%s !",
|
|
||||||
pspec->name, gst_element_get_name (gst_pad_get_parent (GST_PAD (origin))),
|
|
||||||
gst_object_get_name (origin));
|
|
||||||
*/
|
|
||||||
else if (strcmp (pspec->name, "caps") == 0) {
|
|
||||||
/* check if we're getting it from fakesink */
|
|
||||||
if (GST_IS_PAD (origin) && GST_PAD_PARENT (origin) == priv->fakesink) {
|
|
||||||
GST_DEBUG ("have caps on fakesink pad !");
|
|
||||||
g_value_init (&value, pspec->value_type);
|
|
||||||
g_object_get_property (G_OBJECT (origin), pspec->name, &value);
|
|
||||||
priv->format = g_value_peek_pointer (&value);
|
|
||||||
GST_DEBUG ("caps: %" GST_PTR_FORMAT, priv->format);
|
|
||||||
} else
|
|
||||||
GST_DEBUG ("ignoring caps on object %s:%s",
|
|
||||||
gst_object_get_name (gst_object_get_parent (origin)),
|
|
||||||
gst_object_get_name (origin));
|
|
||||||
} else if (strcmp (pspec->name, "offset") == 0) {
|
|
||||||
/* we REALLY ignore offsets, we hate them */
|
|
||||||
}
|
|
||||||
//else GST_DEBUG ("ignoring notify of %s", pspec->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
guint meta;
|
|
||||||
guint encoded;
|
|
||||||
}
|
|
||||||
TagFlagScore;
|
|
||||||
|
|
||||||
static void
|
|
||||||
tag_flag_score (const GstTagList * list, const gchar * tag, gpointer user_data)
|
|
||||||
{
|
|
||||||
TagFlagScore *score = (TagFlagScore *) user_data;
|
|
||||||
GstTagFlag flag;
|
|
||||||
|
|
||||||
flag = gst_tag_get_flag (tag);
|
|
||||||
if (flag == GST_TAG_FLAG_META)
|
|
||||||
score->meta++;
|
|
||||||
if (flag == GST_TAG_FLAG_ENCODED)
|
|
||||||
score->encoded++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
found_tag_callback (GObject * pipeline, GstElement * source, GstTagList * tags,
|
|
||||||
GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
TagFlagScore score;
|
|
||||||
|
|
||||||
score.meta = 0;
|
|
||||||
score.encoded = 0;
|
|
||||||
GST_DEBUG ("element %s found tag", GST_STR_NULL (GST_ELEMENT_NAME (source)));
|
|
||||||
|
|
||||||
/* decide if it's likely to be metadata or streaminfo */
|
|
||||||
/* FIXME: this is a hack, there must be a better way,
|
|
||||||
but as long as elements can report both mixed we need to do this */
|
|
||||||
|
|
||||||
gst_tag_list_foreach (tags, tag_flag_score, &score);
|
|
||||||
|
|
||||||
if (score.meta > score.encoded) {
|
|
||||||
GST_DEBUG ("found tags from decoder, adding them as metadata");
|
|
||||||
priv->metadata = gst_tag_list_copy (tags);
|
|
||||||
} else {
|
|
||||||
GST_DEBUG ("found tags, adding them as streaminfo");
|
|
||||||
priv->streaminfo = gst_tag_list_copy (tags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
error_callback (GObject * element, GstElement * source, GError * error,
|
|
||||||
gchar * debug, GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
g_print ("ERROR: %s\n", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* helpers */
|
|
||||||
|
|
||||||
/* General GError creation */
|
|
||||||
static void
|
|
||||||
gst_media_info_error_create (GError ** error, const gchar * message)
|
|
||||||
{
|
|
||||||
/* check if caller wanted an error reported */
|
|
||||||
if (error == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
*error = g_error_new (GST_MEDIA_INFO_ERROR, 0, message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GError creation when element is missing */
|
|
||||||
static void
|
|
||||||
gst_media_info_error_element (const gchar * element, GError ** error)
|
|
||||||
{
|
|
||||||
gchar *message;
|
|
||||||
|
|
||||||
message = g_strdup_printf ("The %s element could not be found. "
|
|
||||||
"This element is essential for reading. "
|
|
||||||
"Please install the right plug-in and verify "
|
|
||||||
"that it works by running 'gst-inspect %s'", element, element);
|
|
||||||
gst_media_info_error_create (error, message);
|
|
||||||
g_free (message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialise priv; done the first time */
|
|
||||||
gboolean
|
|
||||||
gmip_init (GstMediaInfoPriv * priv, GError ** error)
|
|
||||||
{
|
|
||||||
#define GST_MEDIA_INFO_MAKE_OR_ERROR(el, factory, name, error) \
|
|
||||||
G_STMT_START { \
|
|
||||||
el = gst_element_factory_make (factory, name); \
|
|
||||||
if (!GST_IS_ELEMENT (el)) \
|
|
||||||
{ \
|
|
||||||
gst_media_info_error_element (factory, error); \
|
|
||||||
return FALSE; \
|
|
||||||
} \
|
|
||||||
} G_STMT_END
|
|
||||||
/* create the typefind element and make sure it stays around by reffing */
|
|
||||||
GST_MEDIA_INFO_MAKE_OR_ERROR (priv->typefind, "typefind", "typefind", error);
|
|
||||||
gst_object_ref (GST_OBJECT (priv->typefind));
|
|
||||||
|
|
||||||
/* create the fakesink element and make sure it stays around by reffing */
|
|
||||||
GST_MEDIA_INFO_MAKE_OR_ERROR (priv->fakesink, "fakesink", "fakesink", error);
|
|
||||||
gst_object_ref (GST_OBJECT (priv->fakesink));
|
|
||||||
/* source element for media info reading */
|
|
||||||
priv->source = NULL;
|
|
||||||
priv->source_name = NULL;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* called at the beginning of each use cycle */
|
|
||||||
/* reset info to a state where it can be used to query for media info */
|
|
||||||
void
|
|
||||||
gmip_reset (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
|
|
||||||
#define STRING_RESET(string) \
|
|
||||||
G_STMT_START { \
|
|
||||||
if (string) g_free (string); \
|
|
||||||
string = NULL; \
|
|
||||||
} G_STMT_END
|
|
||||||
|
|
||||||
STRING_RESET (priv->pipeline_desc);
|
|
||||||
STRING_RESET (priv->location);
|
|
||||||
#undef STRING_RESET
|
|
||||||
|
|
||||||
#define CAPS_RESET(target) \
|
|
||||||
G_STMT_START { \
|
|
||||||
if (target) gst_caps_free (target); \
|
|
||||||
target = NULL; \
|
|
||||||
} G_STMT_END
|
|
||||||
CAPS_RESET (priv->type);
|
|
||||||
CAPS_RESET (priv->format);
|
|
||||||
#undef CAPS_RESET
|
|
||||||
|
|
||||||
#define TAGS_RESET(target) \
|
|
||||||
G_STMT_START { \
|
|
||||||
if (target) \
|
|
||||||
gst_tag_list_free (target); \
|
|
||||||
target = NULL; \
|
|
||||||
} G_STMT_END
|
|
||||||
TAGS_RESET (priv->metadata);
|
|
||||||
TAGS_RESET (priv->streaminfo);
|
|
||||||
#undef TAGS_RESET
|
|
||||||
|
|
||||||
if (priv->stream) {
|
|
||||||
gmi_stream_free (priv->stream);
|
|
||||||
priv->stream = NULL;
|
|
||||||
}
|
|
||||||
priv->flags = 0;
|
|
||||||
priv->state = GST_MEDIA_INFO_STATE_NULL;
|
|
||||||
|
|
||||||
priv->error = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* seek to a track and reset metadata and streaminfo structs */
|
|
||||||
gboolean
|
|
||||||
gmi_seek_to_track (GstMediaInfo * info, long track)
|
|
||||||
{
|
|
||||||
GstEvent *event;
|
|
||||||
GstFormat track_format = 0;
|
|
||||||
GstMediaInfoPriv *priv = info->priv;
|
|
||||||
gboolean res;
|
|
||||||
|
|
||||||
/* FIXME: consider more nicks as "track" */
|
|
||||||
track_format = gst_format_get_by_nick ("logical_stream");
|
|
||||||
if (track_format == 0)
|
|
||||||
return FALSE;
|
|
||||||
GST_DEBUG ("Track format: %d", track_format);
|
|
||||||
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PLAYING)
|
|
||||||
== GST_STATE_FAILURE)
|
|
||||||
g_warning ("Couldn't set to play");
|
|
||||||
g_assert (GST_IS_PAD (info->priv->decoder_pad));
|
|
||||||
event = gst_event_new_seek (track_format |
|
|
||||||
GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, track);
|
|
||||||
res = gst_pad_send_event (info->priv->decoder_pad, event);
|
|
||||||
if (!res) {
|
|
||||||
g_warning ("seek to logical track on pad %s:%s failed",
|
|
||||||
GST_DEBUG_PAD_NAME (info->priv->decoder_pad));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
/* clear structs because of the seek */
|
|
||||||
if (priv->metadata) {
|
|
||||||
gst_tag_list_free (priv->metadata);
|
|
||||||
priv->metadata = NULL;
|
|
||||||
}
|
|
||||||
if (priv->streaminfo) {
|
|
||||||
gst_tag_list_free (priv->streaminfo);
|
|
||||||
priv->streaminfo = NULL;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set the mime type on the media info getter */
|
|
||||||
gboolean
|
|
||||||
gmi_set_mime (GstMediaInfo * info, const char *mime)
|
|
||||||
{
|
|
||||||
gchar *desc = NULL;
|
|
||||||
GError *error = NULL;
|
|
||||||
GstMediaInfoPriv *priv = info->priv;
|
|
||||||
|
|
||||||
/* FIXME: please figure out proper mp3 mimetypes */
|
|
||||||
if ((strcmp (mime, "application/x-ogg") == 0) ||
|
|
||||||
(strcmp (mime, "application/ogg") == 0))
|
|
||||||
desc =
|
|
||||||
g_strdup_printf
|
|
||||||
("%s name=source ! oggdemux ! vorbisdec name=decoder ! fakesink name=sink",
|
|
||||||
priv->source_name);
|
|
||||||
else if ((strcmp (mime, "audio/mpeg") == 0)
|
|
||||||
|| (strcmp (mime, "audio/x-mp3") == 0)
|
|
||||||
|| (strcmp (mime, "audio/mp3") == 0)
|
|
||||||
|| (strcmp (mime, "application/x-id3") == 0)
|
|
||||||
|| (strcmp (mime, "audio/x-id3") == 0))
|
|
||||||
desc =
|
|
||||||
g_strdup_printf
|
|
||||||
("%s name=source ! id3tag ! mad name=decoder ! audio/x-raw-int ! fakesink name=sink",
|
|
||||||
priv->source_name);
|
|
||||||
else if ((strcmp (mime, "application/x-flac") == 0)
|
|
||||||
|| (strcmp (mime, "audio/x-flac") == 0))
|
|
||||||
desc =
|
|
||||||
g_strdup_printf
|
|
||||||
("%s name=source ! flacdec name=decoder ! audio/x-raw-int ! fakesink name=sink",
|
|
||||||
priv->source_name);
|
|
||||||
else if ((strcmp (mime, "audio/wav") == 0)
|
|
||||||
|| (strcmp (mime, "audio/x-wav") == 0))
|
|
||||||
desc =
|
|
||||||
g_strdup_printf
|
|
||||||
("%s name=source ! wavparse name=decoder ! audio/x-raw-int ! fakesink name=sink",
|
|
||||||
priv->source_name);
|
|
||||||
else if (strcmp (mime, "audio/x-mod") == 0
|
|
||||||
|| strcmp (mime, "audio/x-s3m") == 0 || strcmp (mime, "audio/x-xm") == 0
|
|
||||||
|| strcmp (mime, "audio/x-it") == 0)
|
|
||||||
desc =
|
|
||||||
g_strdup_printf
|
|
||||||
("%s name=source ! modplug name=decoder ! audio/x-raw-int ! fakesink name=sink",
|
|
||||||
priv->source_name);
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
GST_DEBUG ("using description %s", desc);
|
|
||||||
priv->pipeline_desc = desc;
|
|
||||||
priv->pipeline = gst_parse_launch (desc, &error);
|
|
||||||
if (error) {
|
|
||||||
g_warning ("Error parsing pipeline description: %s\n", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
/* get a bunch of elements from the bin */
|
|
||||||
priv->source = gst_bin_get_by_name (GST_BIN (priv->pipeline), "source");
|
|
||||||
if (!GST_IS_ELEMENT (priv->source))
|
|
||||||
g_error ("Could not create source element '%s'", priv->source_name);
|
|
||||||
|
|
||||||
g_assert (GST_IS_ELEMENT (priv->source));
|
|
||||||
g_object_set (G_OBJECT (priv->source), "location", priv->location, NULL);
|
|
||||||
priv->decoder = gst_bin_get_by_name (GST_BIN (priv->pipeline), "decoder");
|
|
||||||
g_assert (GST_IS_ELEMENT (priv->decoder));
|
|
||||||
priv->fakesink = gst_bin_get_by_name (GST_BIN (priv->pipeline), "sink");
|
|
||||||
g_assert (GST_IS_ELEMENT (priv->fakesink));
|
|
||||||
|
|
||||||
/* get the "source " source pad */
|
|
||||||
priv->source_pad = gst_element_get_pad (priv->source, "src");
|
|
||||||
g_assert (GST_IS_PAD (priv->source_pad));
|
|
||||||
/* get the "decoder" source pad */
|
|
||||||
priv->decoder_pad = gst_element_get_pad (priv->decoder, "src");
|
|
||||||
g_assert (GST_IS_PAD (priv->decoder_pad));
|
|
||||||
GST_DEBUG ("decoder pad: %s:%s",
|
|
||||||
gst_object_get_name (gst_object_get_parent (GST_OBJECT (priv->
|
|
||||||
decoder_pad))), gst_pad_get_name (priv->decoder_pad));
|
|
||||||
|
|
||||||
/* attach notify handler */
|
|
||||||
g_signal_connect (G_OBJECT (info->priv->pipeline), "deep_notify",
|
|
||||||
G_CALLBACK (deep_notify_callback), info->priv);
|
|
||||||
g_signal_connect (G_OBJECT (info->priv->pipeline), "found-tag",
|
|
||||||
G_CALLBACK (found_tag_callback), info->priv);
|
|
||||||
g_signal_connect (G_OBJECT (info->priv->pipeline), "error",
|
|
||||||
G_CALLBACK (error_callback), info->priv);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clear the decoding pipeline */
|
|
||||||
void
|
|
||||||
gmi_clear_decoder (GstMediaInfo * info)
|
|
||||||
{
|
|
||||||
if (info->priv->pipeline) {
|
|
||||||
GST_DEBUG ("Unreffing pipeline");
|
|
||||||
gst_object_unref (GST_OBJECT (info->priv->pipeline));
|
|
||||||
}
|
|
||||||
info->priv->pipeline = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/****
|
|
||||||
* typefind functions
|
|
||||||
* find the type of a file and store it in the caps of the info
|
|
||||||
* FIXME: we might better return GstCaps instead of storing them
|
|
||||||
* internally */
|
|
||||||
|
|
||||||
/* prepare for typefind, move from NULL to TYPEFIND */
|
|
||||||
gboolean
|
|
||||||
gmip_find_type_pre (GstMediaInfoPriv * priv, GError ** error)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
|
||||||
|
|
||||||
GST_DEBUG ("gmip_find_type_pre: start");
|
|
||||||
/* find out type */
|
|
||||||
/* FIXME: we could move caps for typefind out of struct and
|
|
||||||
* just use it through this function only */
|
|
||||||
|
|
||||||
priv->pipeline = gst_pipeline_new ("pipeline-typefind");
|
|
||||||
if (!GST_IS_PIPELINE (priv->pipeline)) {
|
|
||||||
gst_media_info_error_create (error, "Internal GStreamer error.");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
gst_bin_add (GST_BIN (priv->pipeline), priv->typefind);
|
|
||||||
GST_MEDIA_INFO_MAKE_OR_ERROR (priv->source, priv->source_name, "source",
|
|
||||||
error);
|
|
||||||
g_object_set (G_OBJECT (priv->source), "location", priv->location, NULL);
|
|
||||||
gst_bin_add (GST_BIN (priv->pipeline), priv->source);
|
|
||||||
if (!gst_element_link (priv->source, priv->typefind))
|
|
||||||
g_warning ("Couldn't connect source and typefind\n");
|
|
||||||
g_signal_connect (G_OBJECT (priv->typefind), "have-type",
|
|
||||||
G_CALLBACK (have_type_callback), priv);
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PLAYING)
|
|
||||||
== GST_STATE_FAILURE) {
|
|
||||||
g_warning ("Couldn't set to play");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
GST_DEBUG ("moving to STATE_TYPEFIND\n");
|
|
||||||
priv->state = GST_MEDIA_INFO_STATE_TYPEFIND;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* finish off typefind */
|
|
||||||
gboolean
|
|
||||||
gmip_find_type_post (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
/*clear up typefind */
|
|
||||||
gst_element_set_state (priv->pipeline, GST_STATE_READY);
|
|
||||||
if (priv->decontainer) {
|
|
||||||
gst_element_unlink (priv->source, priv->decontainer);
|
|
||||||
gst_element_unlink (priv->decontainer, priv->typefind);
|
|
||||||
gst_bin_remove (GST_BIN (priv->pipeline), priv->decontainer);
|
|
||||||
} else {
|
|
||||||
gst_element_unlink (priv->source, priv->typefind);
|
|
||||||
}
|
|
||||||
gst_bin_remove (GST_BIN (priv->pipeline), priv->typefind);
|
|
||||||
|
|
||||||
if (priv->type == NULL) {
|
|
||||||
g_warning ("iteration ended, type not found !\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
GST_DEBUG ("moving to STATE_STREAM\n");
|
|
||||||
priv->state = GST_MEDIA_INFO_STATE_STREAM;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* complete version */
|
|
||||||
gboolean
|
|
||||||
gmip_find_type (GstMediaInfoPriv * priv, GError ** error)
|
|
||||||
{
|
|
||||||
if (!gmip_find_type_pre (priv, error))
|
|
||||||
return FALSE;
|
|
||||||
GST_DEBUG ("gmip_find_type: iterating");
|
|
||||||
while ((priv->type == NULL) && gst_bin_iterate (GST_BIN (priv->pipeline)))
|
|
||||||
GMI_DEBUG ("+");
|
|
||||||
GMI_DEBUG ("\n");
|
|
||||||
return gmip_find_type_post (priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: why not have these functions work on priv types ? */
|
|
||||||
gboolean
|
|
||||||
gmip_find_stream_pre (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PLAYING)
|
|
||||||
== GST_STATE_FAILURE) {
|
|
||||||
g_warning ("Couldn't set to play");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
priv->state = GST_MEDIA_INFO_STATE_STREAM;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gmip_find_stream_post (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
GstMediaInfoStream *stream = priv->stream;
|
|
||||||
const GstFormat *formats;
|
|
||||||
GstFormat track_format = 0;
|
|
||||||
GstFormat format;
|
|
||||||
gint64 value;
|
|
||||||
gboolean res;
|
|
||||||
glong bytes = 0;
|
|
||||||
|
|
||||||
|
|
||||||
GST_DEBUG ("gmip_find_stream_post: start");
|
|
||||||
/* find a format that matches the "track" concept */
|
|
||||||
/* FIXME: this is used in vorbis, but we might have to loop when
|
|
||||||
* more codecs have tracks */
|
|
||||||
track_format = gst_format_get_by_nick ("logical_stream");
|
|
||||||
|
|
||||||
/* get supported formats on decoder pad */
|
|
||||||
formats = gst_pad_get_formats (priv->decoder_pad);
|
|
||||||
while (*formats) {
|
|
||||||
const GstFormatDefinition *definition;
|
|
||||||
|
|
||||||
format = *formats;
|
|
||||||
|
|
||||||
g_assert (GST_IS_PAD (priv->decoder_pad));
|
|
||||||
definition = gst_format_get_details (*formats);
|
|
||||||
GST_DEBUG ("trying to figure out length for format %s", definition->nick);
|
|
||||||
|
|
||||||
res = gst_pad_query (priv->decoder_pad, GST_QUERY_TOTAL, &format, &value);
|
|
||||||
|
|
||||||
if (res) {
|
|
||||||
switch (format) {
|
|
||||||
case GST_FORMAT_TIME:
|
|
||||||
stream->length_time = value;
|
|
||||||
GST_DEBUG (" total %s: %lld", definition->nick, value);
|
|
||||||
break;
|
|
||||||
case GST_FORMAT_DEFAULT:
|
|
||||||
case GST_FORMAT_BYTES:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* separation is necessary because track_format doesn't resolve to
|
|
||||||
* int */
|
|
||||||
if (format == track_format) {
|
|
||||||
stream->length_tracks = value;
|
|
||||||
GST_DEBUG (" total %s: %lld", definition->nick, value);
|
|
||||||
} else
|
|
||||||
GST_DEBUG ("unhandled format %s", definition->nick);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
GST_DEBUG ("query didn't return result for %s", definition->nick);
|
|
||||||
|
|
||||||
formats++;
|
|
||||||
}
|
|
||||||
if (stream->length_tracks == 0)
|
|
||||||
stream->length_tracks = 1;
|
|
||||||
|
|
||||||
/* now get number of bytes from the sink pad to get the bitrate */
|
|
||||||
format = GST_FORMAT_BYTES;
|
|
||||||
g_assert (GST_IS_PAD (priv->source_pad));
|
|
||||||
res = gst_pad_query (priv->source_pad, GST_QUERY_TOTAL, &format, &value);
|
|
||||||
if (!res)
|
|
||||||
g_warning ("Failed to query on sink pad !");
|
|
||||||
bytes = value;
|
|
||||||
GST_DEBUG ("bitrate calc: bytes gotten: %ld", bytes);
|
|
||||||
|
|
||||||
if (bytes) {
|
|
||||||
double seconds = (double) stream->length_time / GST_SECOND;
|
|
||||||
double bits = bytes * 8;
|
|
||||||
|
|
||||||
stream->bitrate = (long) (bits / seconds);
|
|
||||||
}
|
|
||||||
GST_DEBUG ("moving to STATE_METADATA\n");
|
|
||||||
priv->state = GST_MEDIA_INFO_STATE_METADATA; /* metadata of first track */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get properties of complete physical stream
|
|
||||||
* and return them in pre-alloced stream struct in priv->stream */
|
|
||||||
gboolean
|
|
||||||
gmip_find_stream (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
GST_DEBUG ("mip_find_stream start");
|
|
||||||
|
|
||||||
gmip_find_stream_pre (priv);
|
|
||||||
/* iterate until caps are found */
|
|
||||||
/* FIXME: this should be done through the plugin sending some signal
|
|
||||||
* that it is ready for queries */
|
|
||||||
while (gst_bin_iterate (GST_BIN (priv->pipeline)) && priv->format == NULL);
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PAUSED)
|
|
||||||
== GST_STATE_FAILURE)
|
|
||||||
g_warning ("Couldn't set to paused");
|
|
||||||
|
|
||||||
if (priv->format == NULL) {
|
|
||||||
GMI_DEBUG ("gmip_find_stream: couldn't get caps !");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return gmip_find_stream_post (priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find metadata encoded in media and store in priv->metadata */
|
|
||||||
gboolean
|
|
||||||
gmip_find_track_metadata_pre (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
/* FIXME: this is a hack to set max allowed iterations for metadata
|
|
||||||
* querying - we should make gst smarter by itself instead */
|
|
||||||
priv->metadata_iters = 0;
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PLAYING)
|
|
||||||
== GST_STATE_FAILURE) {
|
|
||||||
g_warning ("Couldn't set to play");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gmip_find_track_metadata_post (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PAUSED)
|
|
||||||
== GST_STATE_FAILURE)
|
|
||||||
return FALSE;
|
|
||||||
priv->current_track->metadata = priv->metadata;
|
|
||||||
priv->metadata = NULL;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gmip_find_track_metadata (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
gmip_find_track_metadata_pre (priv);
|
|
||||||
GST_DEBUG ("gmip_find_metadata: iterating");
|
|
||||||
while ((priv->metadata == NULL) && gst_bin_iterate (GST_BIN (priv->pipeline)))
|
|
||||||
GMI_DEBUG ("+");
|
|
||||||
GMI_DEBUG ("\n");
|
|
||||||
gmip_find_track_metadata_post (priv);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find streaminfo found by decoder and store in priv->streaminfo */
|
|
||||||
/* FIXME: this is an exact copy, so reuse this function instead */
|
|
||||||
gboolean
|
|
||||||
gmip_find_track_streaminfo_pre (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PLAYING)
|
|
||||||
== GST_STATE_FAILURE) {
|
|
||||||
g_warning ("Couldn't set to play");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gmip_find_track_streaminfo_post (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
GstFormat format, track_format;
|
|
||||||
|
|
||||||
gst_element_set_state (priv->pipeline, GST_STATE_PAUSED);
|
|
||||||
|
|
||||||
/* now add total length to this, and maybe even bitrate ? FIXME */
|
|
||||||
track_format = gst_format_get_by_nick ("logical_stream");
|
|
||||||
if (track_format == 0) {
|
|
||||||
g_print ("FIXME: implement getting length of whole track\n");
|
|
||||||
} else {
|
|
||||||
/* which one are we at ? */
|
|
||||||
long track_num;
|
|
||||||
gint64 value_start, value_end;
|
|
||||||
gboolean res;
|
|
||||||
|
|
||||||
res = gst_pad_query (priv->decoder_pad, GST_QUERY_POSITION,
|
|
||||||
&track_format, &value_start);
|
|
||||||
if (res) {
|
|
||||||
format = GST_FORMAT_TIME;
|
|
||||||
track_num = value_start;
|
|
||||||
GST_DEBUG ("we are currently at %ld", track_num);
|
|
||||||
res = gst_pad_convert (priv->decoder_pad,
|
|
||||||
track_format, track_num, &format, &value_start);
|
|
||||||
res &= gst_pad_convert (priv->decoder_pad,
|
|
||||||
track_format, track_num + 1, &format, &value_end);
|
|
||||||
if (res) {
|
|
||||||
/* substract to get the length */
|
|
||||||
GST_DEBUG ("start %lld, end %lld", value_start, value_end);
|
|
||||||
value_end -= value_start;
|
|
||||||
/* FIXME: check units; this is in seconds */
|
|
||||||
|
|
||||||
gst_tag_list_add (priv->streaminfo, GST_TAG_MERGE_REPLACE,
|
|
||||||
GST_TAG_DURATION, (int) (value_end / 1E6), NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
priv->current_track->streaminfo = priv->streaminfo;
|
|
||||||
priv->streaminfo = NULL;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gmip_find_track_streaminfo (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
gmip_find_track_streaminfo_pre (priv);
|
|
||||||
GST_DEBUG ("DEBUG: gmip_find_streaminfo: iterating");
|
|
||||||
while ((priv->streaminfo == NULL) &&
|
|
||||||
gst_bin_iterate (GST_BIN (priv->pipeline)))
|
|
||||||
GMI_DEBUG ("+");
|
|
||||||
GMI_DEBUG ("\n");
|
|
||||||
gmip_find_track_streaminfo_post (priv);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find format found by decoder and store in priv->format */
|
|
||||||
gboolean
|
|
||||||
gmip_find_track_format_pre (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PLAYING)
|
|
||||||
== GST_STATE_FAILURE) {
|
|
||||||
g_warning ("Couldn't set to play");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gmip_find_track_format_post (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
if (gst_element_set_state (priv->pipeline, GST_STATE_PAUSED)
|
|
||||||
== GST_STATE_FAILURE)
|
|
||||||
return FALSE;
|
|
||||||
priv->current_track->format = priv->format;
|
|
||||||
priv->format = NULL;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gmip_find_track_format (GstMediaInfoPriv * priv)
|
|
||||||
{
|
|
||||||
gmip_find_track_format_pre (priv);
|
|
||||||
GST_DEBUG ("DEBUG: gmip_find_format: iterating");
|
|
||||||
while ((priv->format == NULL) && gst_bin_iterate (GST_BIN (priv->pipeline)))
|
|
||||||
GMI_DEBUG ("+");
|
|
||||||
GMI_DEBUG ("\n");
|
|
||||||
gmip_find_track_format_post (priv);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
|
@ -1,159 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* media-info-priv.h: private stuff */
|
|
||||||
|
|
||||||
#ifndef __GST_MEDIA_INFO_PRIV_H__
|
|
||||||
#define __GST_MEDIA_INFO_PRIV_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <glib/gprintf.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
/* debug */
|
|
||||||
GST_DEBUG_CATEGORY_EXTERN (gst_media_info_debug);
|
|
||||||
#define GST_CAT_DEFAULT gst_media_info_debug
|
|
||||||
|
|
||||||
//#define DEBUG
|
|
||||||
#ifdef DEBUG
|
|
||||||
static gboolean _gmi_debug = TRUE;
|
|
||||||
#else
|
|
||||||
static gboolean _gmi_debug = FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef G_HAVE_ISO_VARARGS
|
|
||||||
|
|
||||||
#define GMI_DEBUG(...) \
|
|
||||||
{ if (_gmi_debug) { g_print ( __VA_ARGS__ ); }}
|
|
||||||
|
|
||||||
#elif defined(G_HAVE_GNUC_VARARGS)
|
|
||||||
|
|
||||||
#define GMI_DEBUG(format, args...) \
|
|
||||||
{ if (_gmi_debug) { g_print ( format , ## args ); }}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
GMI_DEBUG (const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list varargs;
|
|
||||||
|
|
||||||
if (_gmi_debug) {
|
|
||||||
va_start (varargs, format);
|
|
||||||
g_vprintf ( format, varargs);
|
|
||||||
va_end (varargs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* state machine enum; FIXME: can we move this to priv.c ? */
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
GST_MEDIA_INFO_STATE_NULL,
|
|
||||||
GST_MEDIA_INFO_STATE_TYPEFIND,
|
|
||||||
GST_MEDIA_INFO_STATE_STREAM,
|
|
||||||
GST_MEDIA_INFO_STATE_METADATA,
|
|
||||||
GST_MEDIA_INFO_STATE_STREAMINFO,
|
|
||||||
GST_MEDIA_INFO_STATE_FORMAT,
|
|
||||||
GST_MEDIA_INFO_STATE_DONE
|
|
||||||
} GstMediaInfoState;
|
|
||||||
|
|
||||||
/* private structure */
|
|
||||||
struct GstMediaInfoPriv
|
|
||||||
{
|
|
||||||
GstElement *typefind;
|
|
||||||
|
|
||||||
GstCaps *type;
|
|
||||||
|
|
||||||
GstCaps *format;
|
|
||||||
GstTagList *metadata;
|
|
||||||
gint metadata_iters;
|
|
||||||
GstTagList *streaminfo;
|
|
||||||
|
|
||||||
GstElement *pipeline; /* will be != NULL during collection */
|
|
||||||
gchar *pipeline_desc; /* will be != NULL during collection */
|
|
||||||
GstElement *fakesink; /* so we can get caps from the
|
|
||||||
decoder sink pad */
|
|
||||||
gchar *source_name; /* type of element used as source */
|
|
||||||
GstElement *source;
|
|
||||||
GstPad *source_pad; /* pad for querying encoded caps */
|
|
||||||
GstElement *decoder;
|
|
||||||
GstPad *decoder_pad; /* pad for querying decoded caps */
|
|
||||||
GstElement *decontainer; /* element to typefind in containers */
|
|
||||||
|
|
||||||
GstMediaInfoState state; /* current state of state machine */
|
|
||||||
gchar *location; /* location set on the info object */
|
|
||||||
guint16 flags; /* flags supplied for detection */
|
|
||||||
GstMediaInfoTrack *current_track; /* track pointer under inspection */
|
|
||||||
glong current_track_num; /* current track under inspection */
|
|
||||||
|
|
||||||
GstMediaInfoStream *stream; /* total stream properties */
|
|
||||||
char *cache; /* location of cache */
|
|
||||||
|
|
||||||
GError *error; /* error for creation problems */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* declarations */
|
|
||||||
GstMediaInfoStream *
|
|
||||||
gmi_stream_new (void);
|
|
||||||
void gmi_stream_free (GstMediaInfoStream *stream);
|
|
||||||
|
|
||||||
GstMediaInfoTrack *
|
|
||||||
gmi_track_new (void);
|
|
||||||
|
|
||||||
void gmip_reset (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_init (GstMediaInfoPriv *priv, GError **error);
|
|
||||||
|
|
||||||
void gmi_clear_decoder (GstMediaInfo *info);
|
|
||||||
|
|
||||||
gboolean gmi_seek_to_track (GstMediaInfo *info,
|
|
||||||
long track);
|
|
||||||
|
|
||||||
gboolean gmi_set_mime (GstMediaInfo *info,
|
|
||||||
const char *mime);
|
|
||||||
|
|
||||||
void deep_notify_callback (GObject *object,
|
|
||||||
GstObject *origin,
|
|
||||||
GParamSpec *pspec,
|
|
||||||
GstMediaInfoPriv *priv);
|
|
||||||
void found_tag_callback (GObject *pipeline, GstElement *source, GstTagList *tags, GstMediaInfoPriv *priv);
|
|
||||||
void error_callback (GObject *element, GstElement *source, GError *error, gchar *debug, GstMediaInfoPriv *priv);
|
|
||||||
|
|
||||||
gboolean gmip_find_type_pre (GstMediaInfoPriv *priv, GError **error);
|
|
||||||
gboolean gmip_find_type_post (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_type (GstMediaInfoPriv *priv, GError **error);
|
|
||||||
gboolean gmip_find_stream_pre (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_stream_post (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_stream (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_track_metadata_pre (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_track_metadata_post (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_track_metadata (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_track_streaminfo_pre (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_track_streaminfo_post (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_track_streaminfo (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_track_format_pre (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_track_format_post (GstMediaInfoPriv *priv);
|
|
||||||
gboolean gmip_find_track_format (GstMediaInfoPriv *priv);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_MEDIA_INFO_PRIV_H__ */
|
|
|
@ -1,120 +0,0 @@
|
||||||
/* media-info test app */
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "media-info.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
print_tag (const GstTagList * list, const gchar * tag, gpointer unused)
|
|
||||||
{
|
|
||||||
gint i, count;
|
|
||||||
|
|
||||||
count = gst_tag_list_get_tag_size (list, tag);
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
gchar *str;
|
|
||||||
|
|
||||||
if (gst_tag_get_type (tag) == G_TYPE_STRING) {
|
|
||||||
if (!gst_tag_list_get_string_index (list, tag, i, &str))
|
|
||||||
g_assert_not_reached ();
|
|
||||||
} else {
|
|
||||||
str =
|
|
||||||
g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, i));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == 0) {
|
|
||||||
g_print ("%15s: %s\n", gst_tag_get_nick (tag), str);
|
|
||||||
} else {
|
|
||||||
g_print (" : %s\n", str);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
info_print (GstMediaInfoStream * stream)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
GList *p;
|
|
||||||
GstMediaInfoTrack *track;
|
|
||||||
|
|
||||||
g_print ("- mime type: %s\n", stream->mime);
|
|
||||||
g_print ("- length: %.3f seconds\n",
|
|
||||||
(gdouble) stream->length_time / GST_SECOND);
|
|
||||||
g_print ("- bitrate: %.3f kbps\n", stream->bitrate / 1000.0);
|
|
||||||
g_print ("- number of tracks: %ld\n", stream->length_tracks);
|
|
||||||
p = stream->tracks;
|
|
||||||
if (p == NULL) {
|
|
||||||
g_print ("- no track information, probably an error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (i = 0; i < stream->length_tracks; ++i) {
|
|
||||||
g_print ("- track %d\n", i);
|
|
||||||
track = (GstMediaInfoTrack *) p->data;
|
|
||||||
g_print (" - metadata:\n");
|
|
||||||
if (track->metadata)
|
|
||||||
gst_tag_list_foreach (track->metadata, print_tag, NULL);
|
|
||||||
else
|
|
||||||
g_print (" (none found)\n");
|
|
||||||
g_print (" - streaminfo:\n");
|
|
||||||
gst_tag_list_foreach (track->streaminfo, print_tag, NULL);
|
|
||||||
g_print (" - format:\n");
|
|
||||||
g_print ("%s\n", gst_caps_to_string (track->format));
|
|
||||||
p = p->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
GstMediaInfo *info;
|
|
||||||
GstMediaInfoStream *stream = NULL;
|
|
||||||
GError *error = NULL;
|
|
||||||
gint i;
|
|
||||||
|
|
||||||
g_assert (argc > 1);
|
|
||||||
|
|
||||||
gst_media_info_init ();
|
|
||||||
gst_init (&argc, &argv);
|
|
||||||
|
|
||||||
info = gst_media_info_new (&error);
|
|
||||||
if (error != NULL) {
|
|
||||||
g_print ("Error creating media-info object: %s\n", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_assert (G_IS_OBJECT (info));
|
|
||||||
if (!gst_media_info_set_source (info, "gnomevfssrc", &error)) {
|
|
||||||
g_print ("Could not set gnomevfssrc as a source\n");
|
|
||||||
g_print ("reason: %s\n", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_print ("stream: %p, &stream: %p\n", stream, &stream);
|
|
||||||
for (i = 1; i < argc; ++i) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
stream = gst_media_info_read (info, argv[i], GST_MEDIA_INFO_ALL);
|
|
||||||
*/
|
|
||||||
gst_media_info_read_with_idler (info, argv[i], GST_MEDIA_INFO_ALL, &error);
|
|
||||||
while (gst_media_info_read_idler (info, &stream, &error) && stream == NULL)
|
|
||||||
/* keep idling */
|
|
||||||
g_print ("+");
|
|
||||||
g_print ("\nFILE: %s\n", argv[i]);
|
|
||||||
g_print ("stream: %p, &stream: %p\n", stream, &stream);
|
|
||||||
if (error) {
|
|
||||||
g_print ("Error reading media info: %s\n", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
if (stream)
|
|
||||||
info_print (stream);
|
|
||||||
else
|
|
||||||
g_print ("no media info found.\n");
|
|
||||||
stream = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,428 +0,0 @@
|
||||||
/* GStreamer media-info library
|
|
||||||
* Copyright (C) 2003,2004 Thomas Vander Stichele <thomas@apestaart.org>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "media-info.h"
|
|
||||||
#include "media-info-priv.h"
|
|
||||||
|
|
||||||
static void gst_media_info_class_init (GstMediaInfoClass * klass);
|
|
||||||
static void gst_media_info_instance_init (GstMediaInfo * info);
|
|
||||||
|
|
||||||
static void gst_media_info_get_property (GObject * object, guint prop_id,
|
|
||||||
GValue * value, GParamSpec * pspec);
|
|
||||||
|
|
||||||
|
|
||||||
static gboolean _media_info_inited = FALSE;
|
|
||||||
|
|
||||||
/* FIXME: this is a lousy hack that needs to go */
|
|
||||||
#define MAX_METADATA_ITERS 5
|
|
||||||
|
|
||||||
/* GObject-y bits */
|
|
||||||
|
|
||||||
/* signal stuff */
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MEDIA_INFO_SIGNAL,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static guint gst_media_info_signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
/*
|
|
||||||
* all GError stuff
|
|
||||||
*/
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MEDIA_INFO_ERROR_FILE
|
|
||||||
};
|
|
||||||
|
|
||||||
/* GError quark stuff */
|
|
||||||
GQuark
|
|
||||||
gst_media_info_error_quark (void)
|
|
||||||
{
|
|
||||||
static GQuark quark = 0;
|
|
||||||
|
|
||||||
if (quark == 0)
|
|
||||||
quark = g_quark_from_static_string ("gst-media-info-error-quark");
|
|
||||||
return quark;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* GObject type stuff
|
|
||||||
*/
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
PROP_SOURCE
|
|
||||||
};
|
|
||||||
|
|
||||||
static GObjectClass *parent_class = NULL;
|
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY (gst_media_info_debug);
|
|
||||||
|
|
||||||
/* initialize the media-info library */
|
|
||||||
void
|
|
||||||
gst_media_info_init (void)
|
|
||||||
{
|
|
||||||
if (_media_info_inited)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* register our debugging category */
|
|
||||||
GST_DEBUG_CATEGORY_INIT (gst_media_info_debug, "GST_MEDIA_INFO", 0,
|
|
||||||
"GStreamer media-info library");
|
|
||||||
GST_DEBUG ("Initialized media-info library");
|
|
||||||
_media_info_inited = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_media_info_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_media_info_type = 0;
|
|
||||||
|
|
||||||
if (!gst_media_info_type) {
|
|
||||||
static const GTypeInfo gst_media_info_info = {
|
|
||||||
sizeof (GstMediaInfoClass),
|
|
||||||
(GBaseInitFunc) NULL,
|
|
||||||
(GBaseFinalizeFunc) NULL,
|
|
||||||
(GClassInitFunc) gst_media_info_class_init,
|
|
||||||
NULL, NULL,
|
|
||||||
sizeof (GstMediaInfo),
|
|
||||||
0,
|
|
||||||
(GInstanceInitFunc) gst_media_info_instance_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_media_info_type = g_type_register_static (G_TYPE_OBJECT,
|
|
||||||
"GstMediaInfo", &gst_media_info_info, 0);
|
|
||||||
}
|
|
||||||
return gst_media_info_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_media_info_class_init (GstMediaInfoClass * klass)
|
|
||||||
{
|
|
||||||
GObjectClass *g_object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (G_TYPE_OBJECT);
|
|
||||||
//parent_class = g_type_class_peek_parent (klass);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
object_class->finalize = gst_media_info_finalize;
|
|
||||||
object_class->dispose = gst_media_info_dispose;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
g_object_class->set_property = gst_media_info_set_property;
|
|
||||||
*/
|
|
||||||
g_object_class->get_property = gst_media_info_get_property;
|
|
||||||
|
|
||||||
klass->media_info_signal = NULL;
|
|
||||||
|
|
||||||
gst_media_info_signals[MEDIA_INFO_SIGNAL] =
|
|
||||||
g_signal_new ("media-info",
|
|
||||||
G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstMediaInfoClass, media_info_signal),
|
|
||||||
NULL, NULL, gst_marshal_VOID__VOID, G_TYPE_NONE, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_media_info_instance_init (GstMediaInfo * info)
|
|
||||||
{
|
|
||||||
GError **error;
|
|
||||||
|
|
||||||
info->priv = g_new0 (GstMediaInfoPriv, 1);
|
|
||||||
error = &info->priv->error;
|
|
||||||
|
|
||||||
if (!_media_info_inited) {
|
|
||||||
gst_media_info_init ();
|
|
||||||
}
|
|
||||||
|
|
||||||
gmip_init (info->priv, error);
|
|
||||||
gmip_reset (info->priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get/set */
|
|
||||||
static void
|
|
||||||
gst_media_info_get_property (GObject * object, guint prop_id,
|
|
||||||
GValue * value, GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstMediaInfo *info = GST_MEDIA_INFO (object);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case PROP_SOURCE:
|
|
||||||
g_value_set_string (value, info->priv->source_name);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GstMediaInfo *
|
|
||||||
gst_media_info_new (GError ** error)
|
|
||||||
{
|
|
||||||
GstMediaInfo *info = g_object_new (GST_MEDIA_INFO_TYPE, NULL);
|
|
||||||
|
|
||||||
if (info->priv->error) {
|
|
||||||
if (error) {
|
|
||||||
*error = info->priv->error;
|
|
||||||
info->priv->error = NULL;
|
|
||||||
} else {
|
|
||||||
g_warning ("Error creating GstMediaInfo object.\n%s",
|
|
||||||
info->priv->error->message);
|
|
||||||
g_error_free (info->priv->error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* public methods
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
gst_media_info_set_source (GstMediaInfo * info, const char *source,
|
|
||||||
GError ** error)
|
|
||||||
{
|
|
||||||
info->priv->source_name = g_strdup (source);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* idler-based implementation
|
|
||||||
* set up read on a given location
|
|
||||||
* FIXME: maybe we should check if the info is cleared when calling this
|
|
||||||
* function ? What happens if it gets called again on same info before
|
|
||||||
* previous one is done ?
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gst_media_info_read_with_idler (GstMediaInfo * info, const char *location,
|
|
||||||
guint16 flags, GError ** error)
|
|
||||||
{
|
|
||||||
GstMediaInfoPriv *priv = info->priv;
|
|
||||||
|
|
||||||
gmip_reset (info->priv); /* reset all structs */
|
|
||||||
priv->location = g_strdup (location);
|
|
||||||
priv->flags = flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* an idler which does the work of actually collecting all data
|
|
||||||
* this must be called repeatedly, until streamp is set to a non-NULL value
|
|
||||||
* returns: TRUE if it was able to idle, FALSE if there was an error
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
gst_media_info_read_idler (GstMediaInfo * info, GstMediaInfoStream ** streamp,
|
|
||||||
GError ** error)
|
|
||||||
{
|
|
||||||
GstMediaInfoPriv *priv;
|
|
||||||
|
|
||||||
/* if it's NULL then we're sure something went wrong higher up) */
|
|
||||||
if (info == NULL)
|
|
||||||
return FALSE;
|
|
||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
|
||||||
|
|
||||||
priv = info->priv;
|
|
||||||
|
|
||||||
g_assert (streamp != NULL);
|
|
||||||
g_assert (priv);
|
|
||||||
|
|
||||||
switch (priv->state) {
|
|
||||||
case GST_MEDIA_INFO_STATE_NULL:
|
|
||||||
/* make sure we have a source */
|
|
||||||
if (!priv->source_name) {
|
|
||||||
*error = g_error_new (GST_MEDIA_INFO_ERROR, 0,
|
|
||||||
"No source set on media info.");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* need to find type */
|
|
||||||
GST_DEBUG ("idler: NULL, need to find type, priv %p", priv);
|
|
||||||
return gmip_find_type_pre (priv, error);
|
|
||||||
|
|
||||||
case GST_MEDIA_INFO_STATE_TYPEFIND:
|
|
||||||
{
|
|
||||||
gchar *mime;
|
|
||||||
|
|
||||||
GST_LOG ("STATE_TYPEFIND");
|
|
||||||
if ((priv->type == NULL) && gst_bin_iterate (GST_BIN (priv->pipeline))) {
|
|
||||||
GST_DEBUG ("iterating while in STATE_TYPEFIND");
|
|
||||||
GMI_DEBUG ("?");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (priv->type == NULL) {
|
|
||||||
g_warning ("Couldn't find type\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
/* do the state transition */
|
|
||||||
GST_DEBUG ("doing find_type_post");
|
|
||||||
gmip_find_type_post (priv);
|
|
||||||
GST_DEBUG ("finding out mime type");
|
|
||||||
mime =
|
|
||||||
g_strdup (gst_structure_get_name (gst_caps_get_structure (priv->type,
|
|
||||||
0)));
|
|
||||||
GST_DEBUG ("found out mime type: %s", mime);
|
|
||||||
if (!gmi_set_mime (info, mime)) {
|
|
||||||
/* FIXME: pop up error */
|
|
||||||
GST_DEBUG ("no decoder pipeline found for mime %s", mime);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
priv->stream = gmi_stream_new ();
|
|
||||||
GST_DEBUG ("new stream: %p", priv->stream);
|
|
||||||
priv->stream->mime = mime;
|
|
||||||
priv->stream->path = priv->location;
|
|
||||||
|
|
||||||
gmip_find_stream_pre (priv);
|
|
||||||
}
|
|
||||||
case GST_MEDIA_INFO_STATE_STREAM:
|
|
||||||
{
|
|
||||||
GST_LOG ("STATE_STREAM");
|
|
||||||
if ((priv->format == NULL) && gst_bin_iterate (GST_BIN (priv->pipeline))) {
|
|
||||||
GMI_DEBUG ("?");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (priv->format == NULL) {
|
|
||||||
g_warning ("Couldn't find format\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
/* do state transition; stream -> first track metadata */
|
|
||||||
priv->current_track_num = 0;
|
|
||||||
gmip_find_stream_post (priv);
|
|
||||||
priv->current_track = gmi_track_new ();
|
|
||||||
gmip_find_track_metadata_pre (priv);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
/* these ones are repeated per track */
|
|
||||||
case GST_MEDIA_INFO_STATE_METADATA:
|
|
||||||
{
|
|
||||||
if ((priv->metadata == NULL) &&
|
|
||||||
gst_bin_iterate (GST_BIN (priv->pipeline)) &&
|
|
||||||
priv->metadata_iters < MAX_METADATA_ITERS) {
|
|
||||||
GMI_DEBUG ("?");
|
|
||||||
priv->metadata_iters++;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (priv->metadata_iters == MAX_METADATA_ITERS)
|
|
||||||
g_print ("iterated a few times, didn't find metadata\n");
|
|
||||||
if (priv->metadata == NULL) {
|
|
||||||
/* this is not a permanent failure */
|
|
||||||
GST_DEBUG ("Couldn't find metadata");
|
|
||||||
}
|
|
||||||
GST_DEBUG ("found metadata of track %ld", priv->current_track_num);
|
|
||||||
if (!gmip_find_track_metadata_post (priv))
|
|
||||||
return FALSE;
|
|
||||||
GST_DEBUG ("METADATA: going to STREAMINFO\n");
|
|
||||||
priv->state = GST_MEDIA_INFO_STATE_STREAMINFO;
|
|
||||||
return gmip_find_track_streaminfo_pre (priv);
|
|
||||||
}
|
|
||||||
case GST_MEDIA_INFO_STATE_STREAMINFO:
|
|
||||||
{
|
|
||||||
if ((priv->streaminfo == NULL) &&
|
|
||||||
gst_bin_iterate (GST_BIN (priv->pipeline))) {
|
|
||||||
GMI_DEBUG ("?");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (priv->streaminfo == NULL) {
|
|
||||||
/* this is not a permanent failure */
|
|
||||||
GST_DEBUG ("Couldn't find streaminfo");
|
|
||||||
} else
|
|
||||||
GST_DEBUG ("found streaminfo of track %ld", priv->current_track_num);
|
|
||||||
if (!gmip_find_track_streaminfo_post (priv))
|
|
||||||
return FALSE;
|
|
||||||
priv->state = GST_MEDIA_INFO_STATE_FORMAT;
|
|
||||||
return gmip_find_track_format_pre (priv);
|
|
||||||
}
|
|
||||||
case GST_MEDIA_INFO_STATE_FORMAT:
|
|
||||||
{
|
|
||||||
if ((priv->format == NULL) && gst_bin_iterate (GST_BIN (priv->pipeline))) {
|
|
||||||
GMI_DEBUG ("?");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (priv->format == NULL) {
|
|
||||||
g_warning ("Couldn't find format\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
GST_DEBUG ("found format of track %ld", priv->current_track_num);
|
|
||||||
if (!gmip_find_track_format_post (priv))
|
|
||||||
return FALSE;
|
|
||||||
/* save the track info */
|
|
||||||
priv->stream->tracks = g_list_append (priv->stream->tracks,
|
|
||||||
priv->current_track);
|
|
||||||
/* these alloc'd data types have been handed off */
|
|
||||||
priv->current_track = NULL;
|
|
||||||
priv->location = NULL;
|
|
||||||
/* now see if we need to seek to a next track or not */
|
|
||||||
priv->current_track_num++;
|
|
||||||
if (priv->current_track_num < priv->stream->length_tracks) {
|
|
||||||
gmi_seek_to_track (info, priv->current_track_num);
|
|
||||||
priv->current_track = gmi_track_new ();
|
|
||||||
if (!gmip_find_track_metadata_pre (priv)) {
|
|
||||||
g_free (priv->current_track);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
priv->state = GST_MEDIA_INFO_STATE_METADATA;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
priv->state = GST_MEDIA_INFO_STATE_DONE;
|
|
||||||
gmi_clear_decoder (info);
|
|
||||||
GST_DEBUG ("TOTALLY DONE, setting pointer *streamp to %p", *streamp);
|
|
||||||
*streamp = priv->stream;
|
|
||||||
priv->stream = NULL;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
case GST_MEDIA_INFO_STATE_DONE:
|
|
||||||
return TRUE;
|
|
||||||
default:
|
|
||||||
g_warning ("don't know what to do\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* main function
|
|
||||||
* read all possible info from the file pointed to by location
|
|
||||||
* use flags to limit the type of information searched for */
|
|
||||||
GstMediaInfoStream *
|
|
||||||
gst_media_info_read (GstMediaInfo * info, const char *location, guint16 flags,
|
|
||||||
GError ** error)
|
|
||||||
{
|
|
||||||
GstMediaInfoStream *stream = NULL;
|
|
||||||
|
|
||||||
gst_media_info_read_with_idler (info, location, flags, error);
|
|
||||||
if (*error)
|
|
||||||
return FALSE;
|
|
||||||
while (gst_media_info_read_idler (info, &stream, error) && stream == NULL)
|
|
||||||
/* keep looping */ ;
|
|
||||||
if (*error)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FIXME: reset ?
|
|
||||||
gboolean gst_media_info_write (GstMediaInfo *media_info,
|
|
||||||
const char *location,
|
|
||||||
GstCaps *media_info);
|
|
||||||
*/
|
|
|
@ -1,140 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* 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_MEDIA_INFO_H__
|
|
||||||
#define __GST_MEDIA_INFO_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
typedef struct GstMediaInfoPriv GstMediaInfoPriv;
|
|
||||||
typedef struct _GstMediaInfo GstMediaInfo;
|
|
||||||
typedef struct _GstMediaInfoClass GstMediaInfoClass;
|
|
||||||
|
|
||||||
struct _GstMediaInfo
|
|
||||||
{
|
|
||||||
GObject parent;
|
|
||||||
|
|
||||||
GstMediaInfoPriv *priv;
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstMediaInfoClass
|
|
||||||
{
|
|
||||||
GObjectClass parent_class;
|
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (*media_info_signal) (GstMediaInfo *gst_media_info);
|
|
||||||
void (*error_signal) (GstMediaInfo *gst_media_info, GError *error, const gchar *debug);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* structure for "physical" stream,
|
|
||||||
* which can contain multiple sequential ones */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
gboolean seekable;
|
|
||||||
gchar *mime;
|
|
||||||
gchar *path;
|
|
||||||
GstCaps *caps; /* properties of the complete bitstream */
|
|
||||||
|
|
||||||
guint64 length_time;
|
|
||||||
glong length_tracks;
|
|
||||||
glong bitrate;
|
|
||||||
|
|
||||||
GList *tracks;
|
|
||||||
} GstMediaInfoStream;
|
|
||||||
|
|
||||||
/* structure for "logical" stream or track,
|
|
||||||
* or one of a set of sequentially muxed streams */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
GstTagList *metadata; /* changeable metadata or tags */
|
|
||||||
GstTagList *streaminfo; /* codec property stuff */
|
|
||||||
GstCaps *format; /* properties of the logical stream */
|
|
||||||
|
|
||||||
guint64 length_time;
|
|
||||||
|
|
||||||
GList *con_streams; /* list of concurrent streams in this
|
|
||||||
sequential stream */
|
|
||||||
} GstMediaInfoTrack;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
GstCaps *caps; /* properties of the muxed concurrent stream */
|
|
||||||
} GstMediaInfoConcurrent;
|
|
||||||
|
|
||||||
#define GST_MEDIA_INFO_ERROR gst_media_info_error_quark ()
|
|
||||||
|
|
||||||
#define GST_MEDIA_INFO_TYPE (gst_media_info_get_type ())
|
|
||||||
#define GST_MEDIA_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_MEDIA_INFO_TYPE, GstMediaInfo))
|
|
||||||
#define GST_MEDIA_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_MEDIA_INFO_TYPE, GstMediaInfoClass))
|
|
||||||
#define IS_GST_MEDIA_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_MEDIA_INFO_TYPE))
|
|
||||||
#define IS_GST_MEDIA_INFO_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_MEDIA_INFO_TYPE))
|
|
||||||
#define GST_MEDIA_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_MEDIA_INFO_TYPE, GstMediaInfoClass))
|
|
||||||
|
|
||||||
#define GST_MEDIA_INFO_STREAM 1 << 1
|
|
||||||
#define GST_MEDIA_INFO_MIME 1 << 2
|
|
||||||
#define GST_MEDIA_INFO_METADATA 1 << 3
|
|
||||||
#define GST_MEDIA_INFO_STREAMINFO 1 << 4
|
|
||||||
#define GST_MEDIA_INFO_FORMAT 1 << 5
|
|
||||||
#define GST_MEDIA_INFO_ALL ((1 << 6) - 1)
|
|
||||||
|
|
||||||
GQuark gst_media_info_error_quark (void);
|
|
||||||
|
|
||||||
void gst_media_info_init (void);
|
|
||||||
GType gst_media_info_get_type (void);
|
|
||||||
|
|
||||||
GstMediaInfo * gst_media_info_new (GError **error);
|
|
||||||
|
|
||||||
gboolean gst_media_info_set_source (GstMediaInfo *info,
|
|
||||||
const char *source,
|
|
||||||
GError **error);
|
|
||||||
void gst_media_info_read_with_idler (GstMediaInfo *media_info,
|
|
||||||
const char *location,
|
|
||||||
guint16 GST_MEDIA_INFO_FLAGS,
|
|
||||||
GError **error);
|
|
||||||
gboolean gst_media_info_read_idler (GstMediaInfo *media_info,
|
|
||||||
GstMediaInfoStream **streamp,
|
|
||||||
GError **error);
|
|
||||||
GstMediaInfoStream *
|
|
||||||
gst_media_info_read (GstMediaInfo *media_info,
|
|
||||||
const char *location,
|
|
||||||
guint16 GST_MEDIA_INFO_FLAGS,
|
|
||||||
GError **error);
|
|
||||||
gboolean gst_media_info_read_many (GstMediaInfo *media_info,
|
|
||||||
GList *locations,
|
|
||||||
guint16 GST_MEDIA_INFO_FLAGS,
|
|
||||||
GError **error);
|
|
||||||
GstCaps * gst_media_info_get_next (GstMediaInfo *media_info,
|
|
||||||
GError **error);
|
|
||||||
/*
|
|
||||||
* FIXME: reset ?
|
|
||||||
gboolean gst_media_info_write (GstMediaInfo *media_info,
|
|
||||||
const char *location,
|
|
||||||
GstCaps *media_info);
|
|
||||||
*/
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_MEDIA_INFO_H__ */
|
|
|
@ -1,150 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="media-info"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D67896}"
|
|
||||||
RootNamespace="media-info"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstmedia-info.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile=""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/media-info.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstmedia-info.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstmedia-info.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile=""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstmedia-info.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\media-info-priv.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\media-info.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\media-info-priv.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\media-info.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,49 +0,0 @@
|
||||||
# variables used for enum/marshal generation
|
|
||||||
glib_enum_headers=$(mixer_headers)
|
|
||||||
glib_enum_define=GST_MIXER
|
|
||||||
glib_enum_prefix=gst_mixer
|
|
||||||
|
|
||||||
|
|
||||||
libgstmixerincludedir = \
|
|
||||||
$(includedir)/gstreamer-@GST_MAJORMINOR@/gst/mixer
|
|
||||||
|
|
||||||
mixer_headers = \
|
|
||||||
mixer.h \
|
|
||||||
mixeroptions.h \
|
|
||||||
mixertrack.h
|
|
||||||
|
|
||||||
built_sources = \
|
|
||||||
mixer-marshal.c \
|
|
||||||
mixer-enumtypes.c
|
|
||||||
|
|
||||||
built_headers = \
|
|
||||||
mixer-marshal.h \
|
|
||||||
mixer-enumtypes.h
|
|
||||||
|
|
||||||
libgstmixerinclude_HEADERS = \
|
|
||||||
$(mixer_headers)
|
|
||||||
|
|
||||||
nodist_libgstmixerinclude_HEADERS = \
|
|
||||||
mixer-enumtypes.h
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libgstmixer.la
|
|
||||||
|
|
||||||
libgstmixer_la_SOURCES = \
|
|
||||||
mixer.c \
|
|
||||||
mixeroptions.c \
|
|
||||||
mixertrack.c
|
|
||||||
|
|
||||||
nodist_libgstmixer_la_SOURCES = \
|
|
||||||
$(built_sources)
|
|
||||||
|
|
||||||
libgstmixer_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
|
|
||||||
BUILT_SOURCES = \
|
|
||||||
$(built_sources) \
|
|
||||||
$(built_headers)
|
|
||||||
|
|
||||||
EXTRA_DIST = mixer-marshal.list
|
|
||||||
|
|
||||||
CLEANFILES = $(BUILT_SOURCES)
|
|
||||||
|
|
||||||
include $(top_srcdir)/common/glib-gen.mak
|
|
|
@ -1,3 +0,0 @@
|
||||||
VOID:OBJECT,BOOLEAN
|
|
||||||
VOID:OBJECT,POINTER
|
|
||||||
VOID:OBJECT,STRING
|
|
|
@ -1,317 +0,0 @@
|
||||||
/* GStreamer Mixer
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* mixer.c: mixer design virtual class function wrappers
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mixer.h"
|
|
||||||
#include "mixer-marshal.h"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
SIGNAL_MUTE_TOGGLED,
|
|
||||||
SIGNAL_RECORD_TOGGLED,
|
|
||||||
SIGNAL_VOLUME_CHANGED,
|
|
||||||
SIGNAL_OPTION_CHANGED,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_mixer_class_init (GstMixerClass * klass);
|
|
||||||
|
|
||||||
static guint gst_mixer_signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_mixer_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_mixer_type = 0;
|
|
||||||
|
|
||||||
if (!gst_mixer_type) {
|
|
||||||
static const GTypeInfo gst_mixer_info = {
|
|
||||||
sizeof (GstMixerClass),
|
|
||||||
(GBaseInitFunc) gst_mixer_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_mixer_type = g_type_register_static (G_TYPE_INTERFACE,
|
|
||||||
"GstMixer", &gst_mixer_info, 0);
|
|
||||||
g_type_interface_add_prerequisite (gst_mixer_type,
|
|
||||||
GST_TYPE_IMPLEMENTS_INTERFACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_mixer_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_mixer_class_init (GstMixerClass * klass)
|
|
||||||
{
|
|
||||||
static gboolean initialized = FALSE;
|
|
||||||
|
|
||||||
if (!initialized) {
|
|
||||||
gst_mixer_signals[SIGNAL_RECORD_TOGGLED] =
|
|
||||||
g_signal_new ("record-toggled",
|
|
||||||
GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstMixerClass, record_toggled),
|
|
||||||
NULL, NULL,
|
|
||||||
gst_mixer_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 2,
|
|
||||||
GST_TYPE_MIXER_TRACK, G_TYPE_BOOLEAN);
|
|
||||||
gst_mixer_signals[SIGNAL_MUTE_TOGGLED] =
|
|
||||||
g_signal_new ("mute-toggled",
|
|
||||||
GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstMixerClass, mute_toggled),
|
|
||||||
NULL, NULL,
|
|
||||||
gst_mixer_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 2,
|
|
||||||
GST_TYPE_MIXER_TRACK, G_TYPE_BOOLEAN);
|
|
||||||
gst_mixer_signals[SIGNAL_VOLUME_CHANGED] =
|
|
||||||
g_signal_new ("volume-changed",
|
|
||||||
GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstMixerClass, volume_changed),
|
|
||||||
NULL, NULL,
|
|
||||||
gst_mixer_marshal_VOID__OBJECT_POINTER, G_TYPE_NONE, 2,
|
|
||||||
GST_TYPE_MIXER_TRACK, G_TYPE_POINTER);
|
|
||||||
gst_mixer_signals[SIGNAL_OPTION_CHANGED] =
|
|
||||||
g_signal_new ("option-changed",
|
|
||||||
GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstMixerClass, option_changed),
|
|
||||||
NULL, NULL,
|
|
||||||
gst_mixer_marshal_VOID__OBJECT_STRING, G_TYPE_NONE, 2,
|
|
||||||
GST_TYPE_MIXER_OPTIONS, G_TYPE_STRING);
|
|
||||||
|
|
||||||
initialized = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
klass->mixer_type = GST_MIXER_SOFTWARE;
|
|
||||||
|
|
||||||
/* default virtual functions */
|
|
||||||
klass->list_tracks = NULL;
|
|
||||||
klass->set_volume = NULL;
|
|
||||||
klass->get_volume = NULL;
|
|
||||||
klass->set_mute = NULL;
|
|
||||||
klass->set_record = NULL;
|
|
||||||
klass->set_option = NULL;
|
|
||||||
klass->get_option = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_mixer_list_tracks:
|
|
||||||
* @mixer: the #GstMixer (a #GstElement) to get the tracks from.
|
|
||||||
*
|
|
||||||
* Returns a list of available tracks for this mixer/element. Note
|
|
||||||
* that it is allowed for sink (output) elements to only provide
|
|
||||||
* the output tracks in this list. Likewise, for sources (inputs),
|
|
||||||
* it is allowed to only provide input elements in this list.
|
|
||||||
*
|
|
||||||
* Returns: A #GList consisting of zero or more #GstMixerTracks.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const GList *
|
|
||||||
gst_mixer_list_tracks (GstMixer * mixer)
|
|
||||||
{
|
|
||||||
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
|
||||||
|
|
||||||
if (klass->list_tracks) {
|
|
||||||
return klass->list_tracks (mixer);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_mixer_set_volume:
|
|
||||||
* @mixer: The #GstMixer (a #GstElement) that owns the track.
|
|
||||||
* @track: The #GstMixerTrack to set the volume on.
|
|
||||||
* @volumes: an array of integers (of size track->num_channels)
|
|
||||||
* that gives the wanted volume for each channel in
|
|
||||||
* this track.
|
|
||||||
*
|
|
||||||
* Sets the volume on each channel in a track. Short note about
|
|
||||||
* naming: a track is defined as one separate stream owned by
|
|
||||||
* the mixer/element, such as 'Line-in' or 'Microphone'. A
|
|
||||||
* channel is said to be a mono-stream inside this track. A
|
|
||||||
* stereo track thus contains two channels.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_mixer_set_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes)
|
|
||||||
{
|
|
||||||
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
|
||||||
|
|
||||||
if (klass->set_volume) {
|
|
||||||
klass->set_volume (mixer, track, volumes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* gst_mixer_get_volume:
|
|
||||||
* @mixer: the #GstMixer (a #GstElement) that owns the track
|
|
||||||
* @track: the GstMixerTrack to get the volume from.
|
|
||||||
* @volumes: a pre-allocated array of integers (of size
|
|
||||||
* track->num_channels) to store the current volume
|
|
||||||
* of each channel in the given track in.
|
|
||||||
*
|
|
||||||
* Get the current volume(s) on the given track.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_mixer_get_volume (GstMixer * mixer, GstMixerTrack * track, gint * volumes)
|
|
||||||
{
|
|
||||||
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
|
||||||
|
|
||||||
if (klass->get_volume) {
|
|
||||||
klass->get_volume (mixer, track, volumes);
|
|
||||||
} else {
|
|
||||||
gint i;
|
|
||||||
|
|
||||||
for (i = 0; i < track->num_channels; i++) {
|
|
||||||
volumes[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_mixer_set_mute:
|
|
||||||
* @mixer: the #GstMixer (a #GstElement) that owns the track.
|
|
||||||
* @track: the #GstMixerTrack to operate on.
|
|
||||||
* @mute: a boolean value indicating whether to turn on or off
|
|
||||||
* muting.
|
|
||||||
*
|
|
||||||
* Mutes or unmutes the given channel. To find out whether a
|
|
||||||
* track is currently muted, use GST_MIXER_TRACK_HAS_FLAG ().
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_mixer_set_mute (GstMixer * mixer, GstMixerTrack * track, gboolean mute)
|
|
||||||
{
|
|
||||||
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
|
||||||
|
|
||||||
if (klass->set_mute) {
|
|
||||||
klass->set_mute (mixer, track, mute);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_mixer_set_record:
|
|
||||||
* @mixer: The #GstMixer (a #GstElement) that owns the track.
|
|
||||||
* @track: the #GstMixerTrack to operate on.
|
|
||||||
* @record: a boolean value that indicates whether to turn on
|
|
||||||
* or off recording.
|
|
||||||
*
|
|
||||||
* Enables or disables recording on the given track. Note that
|
|
||||||
* this is only possible on input tracks, not on output tracks
|
|
||||||
* (see GST_MIXER_TRACK_HAS_FLAG () and the GST_MIXER_TRACK_INPUT
|
|
||||||
* flag).
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_mixer_set_record (GstMixer * mixer, GstMixerTrack * track, gboolean record)
|
|
||||||
{
|
|
||||||
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
|
||||||
|
|
||||||
if (klass->set_record) {
|
|
||||||
klass->set_record (mixer, track, record);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_mixer_set_option:
|
|
||||||
* @mixer: The #GstMixer (a #GstElement) that owns the optionlist.
|
|
||||||
* @opts: The #GstMixerOptions that we operate on.
|
|
||||||
* @value: The requested new option value.
|
|
||||||
*
|
|
||||||
* Sets a name/value option in the mixer to the requested value.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_mixer_set_option (GstMixer * mixer, GstMixerOptions * opts, gchar * value)
|
|
||||||
{
|
|
||||||
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
|
||||||
|
|
||||||
if (klass->set_option) {
|
|
||||||
klass->set_option (mixer, opts, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_mixer_get_option:
|
|
||||||
* @mixer: The #GstMixer (a #GstElement) that owns the optionlist.
|
|
||||||
* @opts: The #GstMixerOptions that we operate on.
|
|
||||||
*
|
|
||||||
* Get the current value of a name/value option in the mixer.
|
|
||||||
*
|
|
||||||
* Returns: current value of the name/value option.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const gchar *
|
|
||||||
gst_mixer_get_option (GstMixer * mixer, GstMixerOptions * opts)
|
|
||||||
{
|
|
||||||
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
|
||||||
|
|
||||||
if (klass->get_option) {
|
|
||||||
return klass->get_option (mixer, opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_mixer_mute_toggled (GstMixer * mixer, GstMixerTrack * track, gboolean mute)
|
|
||||||
{
|
|
||||||
g_signal_emit (G_OBJECT (mixer),
|
|
||||||
gst_mixer_signals[SIGNAL_MUTE_TOGGLED], 0, track, mute);
|
|
||||||
|
|
||||||
g_signal_emit_by_name (G_OBJECT (track), "mute_toggled", mute);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_mixer_record_toggled (GstMixer * mixer,
|
|
||||||
GstMixerTrack * track, gboolean record)
|
|
||||||
{
|
|
||||||
g_signal_emit (G_OBJECT (mixer),
|
|
||||||
gst_mixer_signals[SIGNAL_RECORD_TOGGLED], 0, track, record);
|
|
||||||
|
|
||||||
g_signal_emit_by_name (G_OBJECT (track), "record_toggled", record);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_mixer_volume_changed (GstMixer * mixer,
|
|
||||||
GstMixerTrack * track, gint * volumes)
|
|
||||||
{
|
|
||||||
g_signal_emit (G_OBJECT (mixer),
|
|
||||||
gst_mixer_signals[SIGNAL_VOLUME_CHANGED], 0, track, volumes);
|
|
||||||
|
|
||||||
g_signal_emit_by_name (G_OBJECT (track), "volume_changed", volumes);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_mixer_option_changed (GstMixer * mixer,
|
|
||||||
GstMixerOptions * opts, gchar * value)
|
|
||||||
{
|
|
||||||
g_signal_emit (G_OBJECT (mixer),
|
|
||||||
gst_mixer_signals[SIGNAL_OPTION_CHANGED], 0, opts, value);
|
|
||||||
|
|
||||||
g_signal_emit_by_name (G_OBJECT (opts), "value_changed", value);
|
|
||||||
}
|
|
|
@ -1,141 +0,0 @@
|
||||||
/* GStreamer Mixer
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* mixer.h: mixer interface design
|
|
||||||
*
|
|
||||||
* 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_MIXER_H__
|
|
||||||
#define __GST_MIXER_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/mixer/mixeroptions.h>
|
|
||||||
#include <gst/mixer/mixertrack.h>
|
|
||||||
#include <gst/mixer/mixer-enumtypes.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_MIXER \
|
|
||||||
(gst_mixer_get_type ())
|
|
||||||
#define GST_MIXER(obj) \
|
|
||||||
(GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIXER, GstMixer))
|
|
||||||
#define GST_MIXER_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIXER, GstMixerClass))
|
|
||||||
#define GST_IS_MIXER(obj) \
|
|
||||||
(GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIXER))
|
|
||||||
#define GST_IS_MIXER_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIXER))
|
|
||||||
#define GST_MIXER_GET_CLASS(inst) \
|
|
||||||
(G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_MIXER, GstMixerClass))
|
|
||||||
|
|
||||||
#define GST_MIXER_TYPE(klass) (klass->mixer_type)
|
|
||||||
|
|
||||||
typedef struct _GstMixer GstMixer;
|
|
||||||
typedef struct _GstMixerClass GstMixerClass;
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
GST_MIXER_HARDWARE,
|
|
||||||
GST_MIXER_SOFTWARE
|
|
||||||
} GstMixerType;
|
|
||||||
|
|
||||||
struct _GstMixerClass {
|
|
||||||
GTypeInterface klass;
|
|
||||||
|
|
||||||
GstMixerType mixer_type;
|
|
||||||
|
|
||||||
/* virtual functions */
|
|
||||||
const GList * (* list_tracks) (GstMixer *mixer);
|
|
||||||
|
|
||||||
void (* set_volume) (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gint *volumes);
|
|
||||||
void (* get_volume) (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gint *volumes);
|
|
||||||
|
|
||||||
void (* set_mute) (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gboolean mute);
|
|
||||||
void (* set_record) (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gboolean record);
|
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (* mute_toggled) (GstMixer *mixer,
|
|
||||||
GstMixerTrack *channel,
|
|
||||||
gboolean mute);
|
|
||||||
void (* record_toggled) (GstMixer *mixer,
|
|
||||||
GstMixerTrack *channel,
|
|
||||||
gboolean record);
|
|
||||||
void (* volume_changed) (GstMixer *mixer,
|
|
||||||
GstMixerTrack *channel,
|
|
||||||
gint *volumes);
|
|
||||||
|
|
||||||
/* use padding */
|
|
||||||
void (* set_option) (GstMixer *mixer,
|
|
||||||
GstMixerOptions *opts,
|
|
||||||
gchar *value);
|
|
||||||
const gchar * (* get_option) (GstMixer *mixer,
|
|
||||||
GstMixerOptions *opts);
|
|
||||||
|
|
||||||
void (* option_changed) (GstMixer *mixer,
|
|
||||||
GstMixerOptions *opts,
|
|
||||||
gchar *option);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING-3];
|
|
||||||
};
|
|
||||||
|
|
||||||
GType gst_mixer_get_type (void);
|
|
||||||
|
|
||||||
/* virtual class function wrappers */
|
|
||||||
const GList * gst_mixer_list_tracks (GstMixer *mixer);
|
|
||||||
void gst_mixer_set_volume (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gint *volumes);
|
|
||||||
void gst_mixer_get_volume (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gint *volumes);
|
|
||||||
void gst_mixer_set_mute (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gboolean mute);
|
|
||||||
void gst_mixer_set_record (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gboolean record);
|
|
||||||
void gst_mixer_set_option (GstMixer *mixer,
|
|
||||||
GstMixerOptions *opts,
|
|
||||||
gchar *value);
|
|
||||||
const gchar * gst_mixer_get_option (GstMixer *mixer,
|
|
||||||
GstMixerOptions *opts);
|
|
||||||
|
|
||||||
/* trigger signals */
|
|
||||||
void gst_mixer_mute_toggled (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gboolean mute);
|
|
||||||
void gst_mixer_record_toggled (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gboolean record);
|
|
||||||
void gst_mixer_volume_changed (GstMixer *mixer,
|
|
||||||
GstMixerTrack *track,
|
|
||||||
gint *volumes);
|
|
||||||
void gst_mixer_option_changed (GstMixer *mixer,
|
|
||||||
GstMixerOptions *opts,
|
|
||||||
gchar *value);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_MIXER_H__ */
|
|
|
@ -1,156 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="mixer"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D67897}"
|
|
||||||
RootNamespace="mixer"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstmixer.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="mixer.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/mixer.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstmixer.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstmixer.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="mixer.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstmixer.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\mixer.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\mixeroptions.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\mixertrack.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\mixer.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\mixeroptions.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\mixertrack.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,122 +0,0 @@
|
||||||
/* GStreamer Mixer
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* mixeroptions.c: mixer track options object design
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mixeroptions.h"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
/* FILL ME */
|
|
||||||
SIGNAL_OPTION_CHANGED,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_mixer_options_class_init (GstMixerOptionsClass * klass);
|
|
||||||
static void gst_mixer_options_init (GstMixerOptions * mixer);
|
|
||||||
static void gst_mixer_options_dispose (GObject * object);
|
|
||||||
|
|
||||||
static GObjectClass *parent_class = NULL;
|
|
||||||
static guint signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_mixer_options_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_mixer_options_type = 0;
|
|
||||||
|
|
||||||
if (!gst_mixer_options_type) {
|
|
||||||
static const GTypeInfo mixer_options_info = {
|
|
||||||
sizeof (GstMixerOptionsClass),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(GClassInitFunc) gst_mixer_options_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstMixerOptions),
|
|
||||||
0,
|
|
||||||
(GInstanceInitFunc) gst_mixer_options_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_mixer_options_type =
|
|
||||||
g_type_register_static (GST_TYPE_MIXER_TRACK,
|
|
||||||
"GstMixerOptions", &mixer_options_info, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_mixer_options_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_mixer_options_class_init (GstMixerOptionsClass * klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_klass = (GObjectClass *) klass;
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_MIXER_TRACK);
|
|
||||||
|
|
||||||
signals[SIGNAL_OPTION_CHANGED] =
|
|
||||||
g_signal_new ("option_changed", G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstMixerOptionsClass, option_changed),
|
|
||||||
NULL, NULL, g_cclosure_marshal_VOID__STRING,
|
|
||||||
G_TYPE_NONE, 1, G_TYPE_STRING);
|
|
||||||
|
|
||||||
object_klass->dispose = gst_mixer_options_dispose;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_mixer_options_init (GstMixerOptions * mixer_options)
|
|
||||||
{
|
|
||||||
mixer_options->values = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_mixer_options_get_values:
|
|
||||||
* @mixer_optnios: The #GstMixerOptions item that owns the values.
|
|
||||||
*
|
|
||||||
* Get the values for the mixer option.
|
|
||||||
*
|
|
||||||
* Returns: A list of all the possible values for the mixer option.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GList *
|
|
||||||
gst_mixer_options_get_values (GstMixerOptions * mixer_options)
|
|
||||||
{
|
|
||||||
if (!mixer_options->values)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return (GList *) mixer_options->values;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_mixer_options_dispose (GObject * object)
|
|
||||||
{
|
|
||||||
GstMixerOptions *opts = GST_MIXER_OPTIONS (object);
|
|
||||||
|
|
||||||
g_list_foreach (opts->values, (GFunc) g_free, NULL);
|
|
||||||
g_list_free (opts->values);
|
|
||||||
opts->values = NULL;
|
|
||||||
|
|
||||||
if (parent_class->dispose)
|
|
||||||
parent_class->dispose (object);
|
|
||||||
}
|
|
|
@ -1,73 +0,0 @@
|
||||||
/* GStreamer Mixer
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* mixeroptions.h: mixer track options object
|
|
||||||
* This should be a subclass of MixerItem, along with MixerOptions,
|
|
||||||
* but that's not possible because of API/ABI in 0.8.x. FIXME.
|
|
||||||
*
|
|
||||||
* 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_MIXER_OPTIONS_H__
|
|
||||||
#define __GST_MIXER_OPTIONS_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/mixer/mixertrack.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_MIXER_OPTIONS \
|
|
||||||
(gst_mixer_options_get_type ())
|
|
||||||
#define GST_MIXER_OPTIONS(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIXER_OPTIONS, \
|
|
||||||
GstMixerOptions))
|
|
||||||
#define GST_MIXER_OPTIONS_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIXER_OPTIONS, \
|
|
||||||
GstMixerOptionsClass))
|
|
||||||
#define GST_IS_MIXER_OPTIONS(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIXER_OPTIONS))
|
|
||||||
#define GST_IS_MIXER_OPTIONS_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIXER_OPTIONS))
|
|
||||||
|
|
||||||
typedef struct _GstMixerOptions GstMixerOptions;
|
|
||||||
typedef struct _GstMixerOptionsClass GstMixerOptionsClass;
|
|
||||||
|
|
||||||
struct _GstMixerOptions {
|
|
||||||
GstMixerTrack parent;
|
|
||||||
|
|
||||||
/* list of strings */
|
|
||||||
GList *values;
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstMixerOptionsClass {
|
|
||||||
GstMixerTrackClass parent;
|
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (* option_changed) (GstMixerOptions *opts,
|
|
||||||
gchar *value);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
};
|
|
||||||
|
|
||||||
GType gst_mixer_options_get_type (void);
|
|
||||||
|
|
||||||
GList * gst_mixer_options_get_values (GstMixerOptions *mixer_options);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_MIXER_OPTIONS_H__ */
|
|
|
@ -1,193 +0,0 @@
|
||||||
/* GStreamer Mixer
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* mixertrack.c: mixer track object design
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mixertrack.h"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
/* FILL ME */
|
|
||||||
SIGNAL_VOLUME_CHANGED,
|
|
||||||
SIGNAL_RECORD_TOGGLED,
|
|
||||||
SIGNAL_MUTE_TOGGLED,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
ARG_0,
|
|
||||||
ARG_LABEL,
|
|
||||||
ARG_MIN_VOLUME,
|
|
||||||
ARG_MAX_VOLUME,
|
|
||||||
ARG_FLAGS,
|
|
||||||
ARG_NUM_CHANNELS
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_mixer_track_class_init (GstMixerTrackClass * klass);
|
|
||||||
static void gst_mixer_track_init (GstMixerTrack * mixer);
|
|
||||||
static void gst_mixer_track_dispose (GObject * object);
|
|
||||||
|
|
||||||
static void gst_mixer_track_get_property (GObject * object, guint prop_id,
|
|
||||||
GValue * value, GParamSpec * pspec);
|
|
||||||
|
|
||||||
static GObjectClass *parent_class = NULL;
|
|
||||||
static guint signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_mixer_track_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_mixer_track_type = 0;
|
|
||||||
|
|
||||||
if (!gst_mixer_track_type) {
|
|
||||||
static const GTypeInfo mixer_track_info = {
|
|
||||||
sizeof (GstMixerTrackClass),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(GClassInitFunc) gst_mixer_track_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstMixerTrack),
|
|
||||||
0,
|
|
||||||
(GInstanceInitFunc) gst_mixer_track_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_mixer_track_type =
|
|
||||||
g_type_register_static (G_TYPE_OBJECT,
|
|
||||||
"GstMixerTrack", &mixer_track_info, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_mixer_track_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_mixer_track_class_init (GstMixerTrackClass * klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_klass = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (G_TYPE_OBJECT);
|
|
||||||
|
|
||||||
object_klass->get_property = gst_mixer_track_get_property;
|
|
||||||
|
|
||||||
g_object_class_install_property (object_klass, ARG_LABEL,
|
|
||||||
g_param_spec_string ("label", "Track label",
|
|
||||||
"The label assigned to the track", NULL, G_PARAM_READABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_klass, ARG_MIN_VOLUME,
|
|
||||||
g_param_spec_int ("min_volume", "Minimum volume level",
|
|
||||||
"The minimum possible volume level", G_MININT, G_MAXINT,
|
|
||||||
0, G_PARAM_READABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_klass, ARG_MAX_VOLUME,
|
|
||||||
g_param_spec_int ("max_volume", "Maximum volume level",
|
|
||||||
"The maximum possible volume level", G_MININT, G_MAXINT,
|
|
||||||
0, G_PARAM_READABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_klass, ARG_FLAGS,
|
|
||||||
g_param_spec_uint ("flags", "Flags",
|
|
||||||
"Flags indicating the type of mixer track",
|
|
||||||
0, G_MAXUINT, 0, G_PARAM_READABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_klass, ARG_NUM_CHANNELS,
|
|
||||||
g_param_spec_int ("num_channels", "Number of channels",
|
|
||||||
"The number of channels contained within the track",
|
|
||||||
0, G_MAXINT, 0, G_PARAM_READABLE));
|
|
||||||
|
|
||||||
signals[SIGNAL_RECORD_TOGGLED] =
|
|
||||||
g_signal_new ("record_toggled", G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstMixerTrackClass,
|
|
||||||
record_toggled),
|
|
||||||
NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN,
|
|
||||||
G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
|
|
||||||
signals[SIGNAL_MUTE_TOGGLED] =
|
|
||||||
g_signal_new ("mute_toggled", G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstMixerTrackClass,
|
|
||||||
mute_toggled),
|
|
||||||
NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN,
|
|
||||||
G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
|
|
||||||
signals[SIGNAL_VOLUME_CHANGED] =
|
|
||||||
g_signal_new ("volume_changed", G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstMixerTrackClass,
|
|
||||||
volume_changed),
|
|
||||||
NULL, NULL, g_cclosure_marshal_VOID__POINTER,
|
|
||||||
G_TYPE_NONE, 1, G_TYPE_POINTER);
|
|
||||||
|
|
||||||
object_klass->dispose = gst_mixer_track_dispose;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_mixer_track_init (GstMixerTrack * mixer_track)
|
|
||||||
{
|
|
||||||
mixer_track->label = NULL;
|
|
||||||
mixer_track->min_volume = mixer_track->max_volume = 0;
|
|
||||||
mixer_track->flags = 0;
|
|
||||||
mixer_track->num_channels = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_mixer_track_get_property (GObject * object, guint prop_id, GValue * value,
|
|
||||||
GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstMixerTrack *mixer_track;
|
|
||||||
|
|
||||||
mixer_track = GST_MIXER_TRACK (object);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case ARG_LABEL:
|
|
||||||
g_value_set_string (value, mixer_track->label);
|
|
||||||
break;
|
|
||||||
case ARG_MIN_VOLUME:
|
|
||||||
g_value_set_int (value, mixer_track->min_volume);
|
|
||||||
break;
|
|
||||||
case ARG_MAX_VOLUME:
|
|
||||||
g_value_set_int (value, mixer_track->max_volume);
|
|
||||||
break;
|
|
||||||
case ARG_FLAGS:
|
|
||||||
g_value_set_uint (value, (guint32) mixer_track->flags);
|
|
||||||
break;
|
|
||||||
case ARG_NUM_CHANNELS:
|
|
||||||
g_value_set_int (value, mixer_track->num_channels);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_mixer_track_dispose (GObject * object)
|
|
||||||
{
|
|
||||||
GstMixerTrack *channel = GST_MIXER_TRACK (object);
|
|
||||||
|
|
||||||
if (channel->label) {
|
|
||||||
g_free (channel->label);
|
|
||||||
channel->label = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parent_class->dispose)
|
|
||||||
parent_class->dispose (object);
|
|
||||||
}
|
|
|
@ -1,102 +0,0 @@
|
||||||
/* GStreamer Mixer
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* mixertrack.h: mixer track object
|
|
||||||
*
|
|
||||||
* 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_MIXER_TRACK_H__
|
|
||||||
#define __GST_MIXER_TRACK_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_MIXER_TRACK \
|
|
||||||
(gst_mixer_track_get_type ())
|
|
||||||
#define GST_MIXER_TRACK(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIXER_TRACK, \
|
|
||||||
GstMixerTrack))
|
|
||||||
#define GST_MIXER_TRACK_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIXER_TRACK, \
|
|
||||||
GstMixerTrackClass))
|
|
||||||
#define GST_IS_MIXER_TRACK(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIXER_TRACK))
|
|
||||||
#define GST_IS_MIXER_TRACK_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIXER_TRACK))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Naming:
|
|
||||||
*
|
|
||||||
* A track is a single input/output stream (e.g. line-in,
|
|
||||||
* microphone, etc.). Channels are then single streams
|
|
||||||
* within a track. A mono stream has one channel, a stereo
|
|
||||||
* stream has two, etc.
|
|
||||||
*
|
|
||||||
* Input tracks can have 'recording' enabled, which means
|
|
||||||
* that any input will be hearable into the speakers that
|
|
||||||
* are attached to the output. Mute is obvious. A track
|
|
||||||
* flagged as master is the master volume track on this
|
|
||||||
* mixer, which means that setting this track will change
|
|
||||||
* the hearable volume on any output.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
GST_MIXER_TRACK_INPUT = (1<<0),
|
|
||||||
GST_MIXER_TRACK_OUTPUT = (1<<1),
|
|
||||||
GST_MIXER_TRACK_MUTE = (1<<2),
|
|
||||||
GST_MIXER_TRACK_RECORD = (1<<3),
|
|
||||||
GST_MIXER_TRACK_MASTER = (1<<4),
|
|
||||||
GST_MIXER_TRACK_SOFTWARE = (1<<5)
|
|
||||||
} GstMixerTrackFlags;
|
|
||||||
|
|
||||||
#define GST_MIXER_TRACK_HAS_FLAG(channel, flag) \
|
|
||||||
((channel)->flags & flag)
|
|
||||||
|
|
||||||
typedef struct _GstMixerTrack GstMixerTrack;
|
|
||||||
typedef struct _GstMixerTrackClass GstMixerTrackClass;
|
|
||||||
|
|
||||||
struct _GstMixerTrack {
|
|
||||||
GObject parent;
|
|
||||||
|
|
||||||
gchar *label;
|
|
||||||
/* FIXME: flags should be guint32. Change in 0.9 */
|
|
||||||
GstMixerTrackFlags flags;
|
|
||||||
gint num_channels,
|
|
||||||
min_volume,
|
|
||||||
max_volume;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstMixerTrackClass {
|
|
||||||
GObjectClass parent;
|
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (* mute_toggled) (GstMixerTrack *channel,
|
|
||||||
gboolean mute);
|
|
||||||
void (* record_toggled) (GstMixerTrack *channel,
|
|
||||||
gboolean record);
|
|
||||||
void (* volume_changed) (GstMixerTrack *channel,
|
|
||||||
gint *volumes);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
};
|
|
||||||
|
|
||||||
GType gst_mixer_track_get_type (void);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_MIXER_TRACK_H__ */
|
|
|
@ -1,8 +0,0 @@
|
||||||
noinst_LTLIBRARIES = libgstnavigation.la
|
|
||||||
|
|
||||||
libgstnavigation_la_SOURCES = navigation.c
|
|
||||||
|
|
||||||
libgstnavigationincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/navigation
|
|
||||||
libgstnavigationinclude_HEADERS = navigation.h
|
|
||||||
|
|
||||||
libgstnavigation_la_CFLAGS = $(GST_CFLAGS)
|
|
|
@ -1,91 +0,0 @@
|
||||||
/* GStreamer Navigation
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* navigation.c: navigation design virtual class function wrappers
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gst/navigation/navigation.h>
|
|
||||||
|
|
||||||
static void gst_navigation_class_init (GstNavigationInterface * iface);
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_navigation_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_navigation_type = 0;
|
|
||||||
|
|
||||||
if (!gst_navigation_type) {
|
|
||||||
static const GTypeInfo gst_navigation_info = {
|
|
||||||
sizeof (GstNavigationInterface),
|
|
||||||
(GBaseInitFunc) gst_navigation_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_navigation_type = g_type_register_static (G_TYPE_INTERFACE,
|
|
||||||
"GstNavigation", &gst_navigation_info, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_navigation_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_navigation_class_init (GstNavigationInterface * iface)
|
|
||||||
{
|
|
||||||
/* default virtual functions */
|
|
||||||
iface->send_event = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The interface implementer should make sure that the object can handle
|
|
||||||
* the event. */
|
|
||||||
void
|
|
||||||
gst_navigation_send_event (GstNavigation * navigation, GstStructure * structure)
|
|
||||||
{
|
|
||||||
GstNavigationInterface *iface = GST_NAVIGATION_GET_IFACE (navigation);
|
|
||||||
|
|
||||||
if (iface->send_event) {
|
|
||||||
iface->send_event (navigation, structure);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_navigation_send_key_event (GstNavigation * navigation, const char *event,
|
|
||||||
const char *key)
|
|
||||||
{
|
|
||||||
gst_navigation_send_event (navigation,
|
|
||||||
gst_structure_new ("application/x-gst-navigation", "event", G_TYPE_STRING,
|
|
||||||
event, "key", G_TYPE_STRING, key, NULL));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_navigation_send_mouse_event (GstNavigation * navigation, const char *event,
|
|
||||||
int button, double x, double y)
|
|
||||||
{
|
|
||||||
gst_navigation_send_event (navigation,
|
|
||||||
gst_structure_new ("application/x-gst-navigation", "event", G_TYPE_STRING,
|
|
||||||
event, "button", G_TYPE_INT, button, "pointer_x", G_TYPE_DOUBLE, x,
|
|
||||||
"pointer_y", G_TYPE_DOUBLE, y, NULL));
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
/* GStreamer Navigation
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
* Copyright (C) 2003 David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* navigation.h: navigation interface design
|
|
||||||
*
|
|
||||||
* 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_NAVIGATION_H__
|
|
||||||
#define __GST_NAVIGATION_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_NAVIGATION \
|
|
||||||
(gst_navigation_get_type ())
|
|
||||||
#define GST_NAVIGATION(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_NAVIGATION, GstNavigation))
|
|
||||||
#define GST_IS_NAVIGATION(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_NAVIGATION))
|
|
||||||
#define GST_NAVIGATION_GET_IFACE(obj) \
|
|
||||||
(G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_NAVIGATION, GstNavigationInterface))
|
|
||||||
|
|
||||||
typedef struct _GstNavigation GstNavigation;
|
|
||||||
|
|
||||||
typedef struct _GstNavigationInterface {
|
|
||||||
GTypeInterface g_iface;
|
|
||||||
|
|
||||||
/* virtual functions */
|
|
||||||
void (*send_event) (GstNavigation *navigation, GstStructure *structure);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
} GstNavigationInterface;
|
|
||||||
|
|
||||||
GType gst_navigation_get_type (void);
|
|
||||||
|
|
||||||
/* virtual class function wrappers */
|
|
||||||
void gst_navigation_send_event (GstNavigation *navigation, GstStructure *structure);
|
|
||||||
|
|
||||||
void gst_navigation_send_key_event (GstNavigation *navigation,
|
|
||||||
const char *event, const char *key);
|
|
||||||
void gst_navigation_send_mouse_event (GstNavigation *navigation,
|
|
||||||
const char *event, int button, double x, double y);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_NAVIGATION_H__ */
|
|
|
@ -1,144 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="navigation"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D67898}"
|
|
||||||
RootNamespace="navigation"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstnavigation.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile=""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/navigation.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstnavigation.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstnavigation.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile=""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstnavigation.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\navigation.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\navigation.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,37 +0,0 @@
|
||||||
# variables used for enum generation
|
|
||||||
glib_enum_headers=$(play_headers)
|
|
||||||
glib_enum_define=GST_PLAY
|
|
||||||
glib_enum_prefix=gst_play
|
|
||||||
|
|
||||||
librarydir = $(libdir)
|
|
||||||
|
|
||||||
play_headers = \
|
|
||||||
play.h
|
|
||||||
|
|
||||||
built_headers = \
|
|
||||||
play-enumtypes.h
|
|
||||||
|
|
||||||
library_LTLIBRARIES = libgstplay-@GST_MAJORMINOR@.la
|
|
||||||
|
|
||||||
libgstplay_@GST_MAJORMINOR@_la_SOURCES = play.c
|
|
||||||
nodist_libgstplay_@GST_MAJORMINOR@_la_SOURCES = play-enumtypes.c
|
|
||||||
|
|
||||||
libgstplay_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/play
|
|
||||||
libgstplay_@GST_MAJORMINOR@include_HEADERS = $(play_headers)
|
|
||||||
nodist_libgstplay_@GST_MAJORMINOR@include_HEADERS = $(built_headers)
|
|
||||||
|
|
||||||
libgstplay_@GST_MAJORMINOR@_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_CFLAGS)
|
|
||||||
libgstplay_@GST_MAJORMINOR@_la_LIBADD = \
|
|
||||||
$(GST_LIBS) $(GST_PLUGINS_LIBS) \
|
|
||||||
$(GST_CONTROL_LIBS) \
|
|
||||||
$(top_builddir)/gst-libs/gst/libgstinterfaces-$(GST_MAJORMINOR).la
|
|
||||||
libgstplay_@GST_MAJORMINOR@_la_LDFLAGS = \
|
|
||||||
-version-info @GST_PLUGINS_LIBVERSION@
|
|
||||||
|
|
||||||
BUILT_SOURCES = \
|
|
||||||
play-enumtypes.c \
|
|
||||||
$(built_headers)
|
|
||||||
|
|
||||||
CLEANFILES = $(BUILT_SOURCES)
|
|
||||||
|
|
||||||
include $(top_srcdir)/common/glib-gen.mak
|
|
|
@ -1,758 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) 2003 Julien Moutte <julien@moutte.net>
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/gst-i18n-plugin.h>
|
|
||||||
|
|
||||||
#include "play.h"
|
|
||||||
|
|
||||||
#define TICK_INTERVAL_MSEC 200
|
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (play_debug);
|
|
||||||
#define GST_CAT_DEFAULT play_debug
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
TIME_TICK,
|
|
||||||
STREAM_LENGTH,
|
|
||||||
HAVE_VIDEO_SIZE,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GstPlayPrivate
|
|
||||||
{
|
|
||||||
/* progress indicators */
|
|
||||||
guint64 time_nanos;
|
|
||||||
guint64 length_nanos;
|
|
||||||
gint get_length_attempt;
|
|
||||||
guint tick_id;
|
|
||||||
|
|
||||||
/* playbin object */
|
|
||||||
GstElement *playbin;
|
|
||||||
|
|
||||||
/* visualization */
|
|
||||||
gboolean enable_vis;
|
|
||||||
GstElement *vis_element;
|
|
||||||
|
|
||||||
/* location */
|
|
||||||
char *location;
|
|
||||||
};
|
|
||||||
|
|
||||||
static guint gst_play_signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
static GstPipelineClass *parent_class = NULL;
|
|
||||||
|
|
||||||
/* ======================================================= */
|
|
||||||
/* */
|
|
||||||
/* Private Methods */
|
|
||||||
/* */
|
|
||||||
/* ======================================================= */
|
|
||||||
|
|
||||||
static void
|
|
||||||
caps_set (GstPad * pad, GParamSpec * pspec, GstPlay * play)
|
|
||||||
{
|
|
||||||
const GstCaps *caps = GST_PAD_CAPS (pad);
|
|
||||||
GstStructure *s = gst_caps_get_structure (caps, 0);
|
|
||||||
|
|
||||||
if (s) {
|
|
||||||
const GValue *par;
|
|
||||||
gint w, h;
|
|
||||||
|
|
||||||
/* get effective size */
|
|
||||||
gst_structure_get_int (s, "width", &w);
|
|
||||||
gst_structure_get_int (s, "height", &h);
|
|
||||||
if ((par = gst_structure_get_value (s, "pixel-aspect-ratio"))) {
|
|
||||||
gint num = gst_value_get_fraction_numerator (par),
|
|
||||||
den = gst_value_get_fraction_denominator (par);
|
|
||||||
|
|
||||||
if (num > den)
|
|
||||||
w *= (gfloat) num / den;
|
|
||||||
else
|
|
||||||
h *= (gfloat) den / num;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_signal_emit (play, gst_play_signals[HAVE_VIDEO_SIZE], 0, w, h);
|
|
||||||
g_signal_handlers_disconnect_by_func (pad, caps_set, play);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
setup_size (GstPlay * play)
|
|
||||||
{
|
|
||||||
const GList *streaminfo = NULL;
|
|
||||||
GstPad *pad = NULL;
|
|
||||||
|
|
||||||
g_object_get (G_OBJECT (play->priv->playbin),
|
|
||||||
"stream-info", &streaminfo, NULL);
|
|
||||||
|
|
||||||
for (; streaminfo != NULL; streaminfo = streaminfo->next) {
|
|
||||||
GObject *info = streaminfo->data;
|
|
||||||
gint type;
|
|
||||||
GParamSpec *pspec;
|
|
||||||
GEnumValue *val;
|
|
||||||
|
|
||||||
g_object_get (info, "type", &type, NULL);
|
|
||||||
pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (info), "type");
|
|
||||||
val = g_enum_get_value (G_PARAM_SPEC_ENUM (pspec)->enum_class, type);
|
|
||||||
|
|
||||||
if (g_strrstr (val->value_name, "VIDEO")) {
|
|
||||||
g_object_get (info, "object", &pad, NULL);
|
|
||||||
pad = (GstPad *) GST_PAD_REALIZE (pad);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pad) {
|
|
||||||
/* handle explicit caps as well - they're set later */
|
|
||||||
if (GST_PAD_CAPS (pad))
|
|
||||||
caps_set (pad, NULL, play);
|
|
||||||
else
|
|
||||||
g_signal_connect (pad, "notify::caps", G_CALLBACK (caps_set), play);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_play_tick_callback (GstPlay * play)
|
|
||||||
{
|
|
||||||
GstFormat fmt = GST_FORMAT_TIME;
|
|
||||||
gint64 value;
|
|
||||||
|
|
||||||
/* check length/pos of stream */
|
|
||||||
if (!GST_CLOCK_TIME_IS_VALID (play->priv->length_nanos) &&
|
|
||||||
play->priv->get_length_attempt < 16) {
|
|
||||||
if (gst_element_query (GST_ELEMENT (play->priv->playbin),
|
|
||||||
GST_QUERY_TOTAL, &fmt, &value)) {
|
|
||||||
play->priv->length_nanos = value;
|
|
||||||
g_signal_emit (G_OBJECT (play), gst_play_signals[STREAM_LENGTH],
|
|
||||||
0, play->priv->length_nanos);
|
|
||||||
}
|
|
||||||
play->priv->get_length_attempt++;
|
|
||||||
}
|
|
||||||
if (gst_element_query (GST_ELEMENT (play->priv->playbin),
|
|
||||||
GST_QUERY_POSITION, &fmt, &value)) {
|
|
||||||
play->priv->time_nanos = value;
|
|
||||||
g_signal_emit (G_OBJECT (play), gst_play_signals[TIME_TICK],
|
|
||||||
0, play->priv->time_nanos);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Virtual function.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_play_change_state (GstElement * element,
|
|
||||||
GstElementState old, GstElementState new, gpointer data)
|
|
||||||
{
|
|
||||||
GstPlay *play = GST_PLAY (data);
|
|
||||||
gint t = (old << 8) | new;
|
|
||||||
|
|
||||||
/* now set up tickers */
|
|
||||||
switch (t) {
|
|
||||||
case GST_STATE_PAUSED_TO_PLAYING:
|
|
||||||
play->priv->tick_id = g_timeout_add (TICK_INTERVAL_MSEC,
|
|
||||||
(GSourceFunc) gst_play_tick_callback, play);
|
|
||||||
break;
|
|
||||||
case GST_STATE_PLAYING_TO_PAUSED:
|
|
||||||
if (play->priv->tick_id != 0) {
|
|
||||||
g_source_remove (play->priv->tick_id);
|
|
||||||
play->priv->tick_id = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GST_STATE_PAUSED_TO_READY:
|
|
||||||
play->priv->length_nanos = GST_CLOCK_TIME_NONE;
|
|
||||||
play->priv->time_nanos = GST_CLOCK_TIME_NONE;
|
|
||||||
play->priv->get_length_attempt = 0;
|
|
||||||
break;
|
|
||||||
case GST_STATE_READY_TO_PAUSED:
|
|
||||||
setup_size (play);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =========================================== */
|
|
||||||
/* */
|
|
||||||
/* Init & Dispose & Class init */
|
|
||||||
/* */
|
|
||||||
/* =========================================== */
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_play_dispose (GObject * object)
|
|
||||||
{
|
|
||||||
GstPlay *play = GST_PLAY (object);
|
|
||||||
|
|
||||||
/* reset */
|
|
||||||
gst_element_set_state (GST_ELEMENT (play), GST_STATE_NULL);
|
|
||||||
|
|
||||||
/* no vis */
|
|
||||||
if (play->priv->vis_element) {
|
|
||||||
gst_object_unref (GST_OBJECT (play->priv->vis_element));
|
|
||||||
play->priv->vis_element = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (play->priv->location);
|
|
||||||
play->priv->location = NULL;
|
|
||||||
|
|
||||||
/* parent will clean up the rest */
|
|
||||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_play_init (GstPlay * play)
|
|
||||||
{
|
|
||||||
play->priv = g_new0 (GstPlayPrivate, 1);
|
|
||||||
|
|
||||||
/* default */
|
|
||||||
play->priv->length_nanos = GST_CLOCK_TIME_NONE;
|
|
||||||
play->priv->time_nanos = GST_CLOCK_TIME_NONE;
|
|
||||||
play->priv->tick_id = 0;
|
|
||||||
play->priv->get_length_attempt = 0;
|
|
||||||
|
|
||||||
play->priv->enable_vis = FALSE;
|
|
||||||
play->priv->vis_element = NULL;
|
|
||||||
|
|
||||||
play->priv->location = NULL;
|
|
||||||
|
|
||||||
/* make playbin */
|
|
||||||
play->priv->playbin = gst_element_factory_make ("playbin", "player");
|
|
||||||
if (play->priv->playbin) {
|
|
||||||
gst_bin_add (GST_BIN (play), play->priv->playbin);
|
|
||||||
g_signal_connect (play->priv->playbin, "state-change",
|
|
||||||
G_CALLBACK (gst_play_change_state), play);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_play_class_init (GstPlayClass * klass)
|
|
||||||
{
|
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_PIPELINE);
|
|
||||||
|
|
||||||
gobject_class->dispose = gst_play_dispose;
|
|
||||||
|
|
||||||
gst_play_signals[TIME_TICK] =
|
|
||||||
g_signal_new ("time-tick", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
|
|
||||||
G_STRUCT_OFFSET (GstPlayClass, time_tick), NULL, NULL,
|
|
||||||
gst_marshal_VOID__INT64, G_TYPE_NONE, 1, G_TYPE_INT64);
|
|
||||||
gst_play_signals[STREAM_LENGTH] =
|
|
||||||
g_signal_new ("stream-length", G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_FIRST,
|
|
||||||
G_STRUCT_OFFSET (GstPlayClass, stream_length), NULL, NULL,
|
|
||||||
gst_marshal_VOID__INT64, G_TYPE_NONE, 1, G_TYPE_INT64);
|
|
||||||
gst_play_signals[HAVE_VIDEO_SIZE] =
|
|
||||||
g_signal_new ("have-video-size", G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_FIRST,
|
|
||||||
G_STRUCT_OFFSET (GstPlayClass, have_video_size), NULL, NULL,
|
|
||||||
gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
|
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_INIT (play_debug, "GST_PLAY", 0, "GStreamer Play library");
|
|
||||||
|
|
||||||
GST_DEBUG ("Play class initialized");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ======================================================= */
|
|
||||||
/* */
|
|
||||||
/* Public Methods */
|
|
||||||
/* */
|
|
||||||
/* ======================================================= */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_set_location:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
* @location: a const #char* indicating location to play
|
|
||||||
*
|
|
||||||
* Set location of @play to @location.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if location was set successfully.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_play_set_location (GstPlay * play, const char *location)
|
|
||||||
{
|
|
||||||
char *uri;
|
|
||||||
|
|
||||||
g_return_val_if_fail (play != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (GST_IS_PLAY (play), FALSE);
|
|
||||||
g_return_val_if_fail (location != NULL, FALSE);
|
|
||||||
|
|
||||||
/* cache */
|
|
||||||
if (play->priv->location)
|
|
||||||
g_free (play->priv->location);
|
|
||||||
play->priv->location = g_strdup (location);
|
|
||||||
|
|
||||||
/* get file */
|
|
||||||
gst_element_set_state (play->priv->playbin, GST_STATE_READY);
|
|
||||||
if (strchr (location, ':'))
|
|
||||||
uri = g_strdup (location);
|
|
||||||
else if (location[0] == '/')
|
|
||||||
uri = g_strdup_printf ("file://%s", location);
|
|
||||||
else {
|
|
||||||
char cwd[256];
|
|
||||||
|
|
||||||
getcwd (cwd, 255);
|
|
||||||
uri = g_strdup_printf ("file://%s/%s", cwd, location);
|
|
||||||
}
|
|
||||||
g_object_set (play->priv->playbin, "uri", uri, NULL);
|
|
||||||
g_free (uri);
|
|
||||||
|
|
||||||
/* open */
|
|
||||||
if (gst_element_set_state (play->priv->playbin,
|
|
||||||
GST_STATE_PAUSED) != GST_STATE_SUCCESS) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_get_location:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
*
|
|
||||||
* Get current location of @play.
|
|
||||||
*
|
|
||||||
* Returns: a #char* pointer to current location.
|
|
||||||
*/
|
|
||||||
|
|
||||||
char *
|
|
||||||
gst_play_get_location (GstPlay * play)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (play != NULL, NULL);
|
|
||||||
g_return_val_if_fail (GST_IS_PLAY (play), NULL);
|
|
||||||
|
|
||||||
return g_strdup (play->priv->location);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_seek_to_time:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
* @time_nanos: a #gint64 indicating a time position.
|
|
||||||
*
|
|
||||||
* Performs a seek on @play until @time_nanos.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FIXME: use GstClockTime for 0.9
|
|
||||||
*/
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_play_seek_to_time (GstPlay * play, gint64 time_nanos)
|
|
||||||
{
|
|
||||||
return gst_element_seek (play->priv->playbin,
|
|
||||||
GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, time_nanos);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_set_data_src:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
* @data_src: a #GstElement.
|
|
||||||
*
|
|
||||||
* Set @data_src as the source element of @play.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if call succeeded.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_play_set_data_src (GstPlay * play, GstElement * data_src)
|
|
||||||
{
|
|
||||||
/* deprecated - use URIs */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_set_video_sink:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
* @video_sink: a #GstElement.
|
|
||||||
*
|
|
||||||
* Set @video_sink as the video sink element of @play.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if call succeeded.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_play_set_video_sink (GstPlay * play, GstElement * video_sink)
|
|
||||||
{
|
|
||||||
g_object_set (G_OBJECT (play->priv->playbin), "video-sink", video_sink, NULL);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_set_audio_sink:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
* @audio_sink: a #GstElement.
|
|
||||||
*
|
|
||||||
* Set @audio_sink as the audio sink element of @play.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if call succeeded.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_play_set_audio_sink (GstPlay * play, GstElement * audio_sink)
|
|
||||||
{
|
|
||||||
g_object_set (G_OBJECT (play->priv->playbin), "audio-sink", audio_sink, NULL);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_set_visualization:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
* @element: a #GstElement.
|
|
||||||
*
|
|
||||||
* Set @video_sink as the video sink element of @play.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if call succeeded.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_play_set_visualization (GstPlay * play, GstElement * vis_element)
|
|
||||||
{
|
|
||||||
/* unset old */
|
|
||||||
if (play->priv->vis_element) {
|
|
||||||
gst_object_unref (GST_OBJECT (play->priv->vis_element));
|
|
||||||
play->priv->vis_element = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set new */
|
|
||||||
if (vis_element) {
|
|
||||||
gst_object_ref (GST_OBJECT (vis_element));
|
|
||||||
play->priv->vis_element = vis_element;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* use */
|
|
||||||
if (play->priv->vis_element && play->priv->enable_vis) {
|
|
||||||
g_object_set (G_OBJECT (play->priv->playbin),
|
|
||||||
"vis-plugin", vis_element, NULL);
|
|
||||||
} else {
|
|
||||||
g_object_set (G_OBJECT (play->priv->playbin), "vis-plugin", NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_connect_visualization:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
* @connect: a #gboolean indicating wether or not
|
|
||||||
* visualization should be connected.
|
|
||||||
*
|
|
||||||
* Connect or disconnect visualization bin in @play.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if call succeeded.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_play_connect_visualization (GstPlay * play, gboolean connect)
|
|
||||||
{
|
|
||||||
play->priv->enable_vis = connect;
|
|
||||||
|
|
||||||
/* use */
|
|
||||||
if (play->priv->vis_element && play->priv->enable_vis) {
|
|
||||||
g_object_set (G_OBJECT (play->priv->playbin),
|
|
||||||
"vis-plugin", play->priv->vis_element, NULL);
|
|
||||||
} else {
|
|
||||||
g_object_set (G_OBJECT (play->priv->playbin), "vis-plugin", NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_get_framerate:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
*
|
|
||||||
* Get the video framerate from @play.
|
|
||||||
*
|
|
||||||
* Returns: a #gdouble indicating video framerate in frame per second.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gdouble
|
|
||||||
gst_play_get_framerate (GstPlay * play)
|
|
||||||
{
|
|
||||||
const GList *streaminfo = NULL;
|
|
||||||
const GstStructure *str = NULL;
|
|
||||||
gdouble value;
|
|
||||||
|
|
||||||
g_object_get (G_OBJECT (play->priv->playbin),
|
|
||||||
"stream-info", &streaminfo, NULL);
|
|
||||||
|
|
||||||
for (; streaminfo != NULL; streaminfo = streaminfo->next) {
|
|
||||||
GObject *info = streaminfo->data;
|
|
||||||
gint type;
|
|
||||||
GParamSpec *pspec;
|
|
||||||
GEnumValue *val;
|
|
||||||
|
|
||||||
g_object_get (info, "type", &type, NULL);
|
|
||||||
pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (info), "type");
|
|
||||||
val = g_enum_get_value (G_PARAM_SPEC_ENUM (pspec)->enum_class, type);
|
|
||||||
|
|
||||||
if (strstr (val->value_name, "VIDEO")) {
|
|
||||||
const GstCaps *caps = NULL;
|
|
||||||
GstPad *pad = NULL;
|
|
||||||
|
|
||||||
g_object_get (info, "object", &pad, NULL);
|
|
||||||
g_assert (GST_IS_PAD (pad));
|
|
||||||
pad = (GstPad *) GST_PAD_REALIZE (pad);
|
|
||||||
caps = GST_PAD_CAPS (pad);
|
|
||||||
str = gst_caps_get_structure (caps, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!str)
|
|
||||||
return 0.;
|
|
||||||
|
|
||||||
gst_structure_get_double (str, "framerate", &value);
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_get_sink_element:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
* @element: a #GstElement.
|
|
||||||
* @sink_type: a #GstPlaySinkType.
|
|
||||||
*
|
|
||||||
* Searches recursively for a sink #GstElement with
|
|
||||||
* type @sink_type in @element which is supposed to be a #GstBin.
|
|
||||||
*
|
|
||||||
* Returns: the sink #GstElement of @element.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (Ronald) what is this?
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstElement *
|
|
||||||
gst_play_get_sink_element (GstPlay * play,
|
|
||||||
GstElement * element, GstPlaySinkType sink_type)
|
|
||||||
{
|
|
||||||
GList *elements = NULL;
|
|
||||||
const GList *pads = NULL;
|
|
||||||
gboolean has_src, has_correct_type;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_PLAY (play), NULL);
|
|
||||||
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (play, "looking for sink element in %s",
|
|
||||||
GST_ELEMENT_NAME (element));
|
|
||||||
|
|
||||||
if (!GST_IS_BIN (element)) {
|
|
||||||
/* since its not a bin, we'll assume this
|
|
||||||
* element is a sink element */
|
|
||||||
GST_DEBUG_OBJECT (play, "not a bin, returning %s as sink element",
|
|
||||||
GST_ELEMENT_NAME (element));
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
|
|
||||||
elements = (GList *) gst_bin_get_list (GST_BIN (element));
|
|
||||||
|
|
||||||
/* traverse all elements looking for one without src pad */
|
|
||||||
|
|
||||||
while (elements) {
|
|
||||||
element = GST_ELEMENT (elements->data);
|
|
||||||
GST_DEBUG_OBJECT (play, "looking at element %s",
|
|
||||||
GST_ELEMENT_NAME (element));
|
|
||||||
|
|
||||||
/* Recursivity :) */
|
|
||||||
|
|
||||||
if (GST_IS_BIN (element)) {
|
|
||||||
element = gst_play_get_sink_element (play, element, sink_type);
|
|
||||||
if (GST_IS_ELEMENT (element))
|
|
||||||
return element;
|
|
||||||
} else {
|
|
||||||
pads = gst_element_get_pad_list (element);
|
|
||||||
has_src = FALSE;
|
|
||||||
has_correct_type = FALSE;
|
|
||||||
while (pads) {
|
|
||||||
/* check for src pad */
|
|
||||||
if (GST_PAD_DIRECTION (GST_PAD (pads->data)) == GST_PAD_SRC) {
|
|
||||||
GST_DEBUG_OBJECT (play, "element %s has a src pad",
|
|
||||||
GST_ELEMENT_NAME (element));
|
|
||||||
has_src = TRUE;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
/* If not a src pad checking caps */
|
|
||||||
GstPad *pad;
|
|
||||||
GstCaps *caps;
|
|
||||||
GstStructure *structure;
|
|
||||||
int i;
|
|
||||||
gboolean has_video_cap = FALSE;
|
|
||||||
gboolean has_audio_cap = FALSE;
|
|
||||||
|
|
||||||
pad = GST_PAD (pads->data);
|
|
||||||
caps = gst_pad_get_caps (pad);
|
|
||||||
/* loop over all caps members to find mime types */
|
|
||||||
for (i = 0; i < gst_caps_get_size (caps); ++i) {
|
|
||||||
structure = gst_caps_get_structure (caps, i);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (play,
|
|
||||||
"looking at caps %d pad %s:%s on element %s with mime %s", i,
|
|
||||||
GST_DEBUG_PAD_NAME (pad),
|
|
||||||
GST_ELEMENT_NAME (element), gst_structure_get_name (structure));
|
|
||||||
|
|
||||||
if (strcmp (gst_structure_get_name (structure),
|
|
||||||
"audio/x-raw-int") == 0) {
|
|
||||||
has_audio_cap = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp (gst_structure_get_name (structure),
|
|
||||||
"video/x-raw-yuv") == 0 ||
|
|
||||||
strcmp (gst_structure_get_name (structure),
|
|
||||||
"video/x-raw-rgb") == 0) {
|
|
||||||
has_video_cap = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_caps_free (caps);
|
|
||||||
|
|
||||||
switch (sink_type) {
|
|
||||||
case GST_PLAY_SINK_TYPE_AUDIO:
|
|
||||||
if (has_audio_cap)
|
|
||||||
has_correct_type = TRUE;
|
|
||||||
break;
|
|
||||||
case GST_PLAY_SINK_TYPE_VIDEO:
|
|
||||||
if (has_video_cap)
|
|
||||||
has_correct_type = TRUE;
|
|
||||||
break;
|
|
||||||
case GST_PLAY_SINK_TYPE_ANY:
|
|
||||||
if ((has_video_cap) || (has_audio_cap))
|
|
||||||
has_correct_type = TRUE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
has_correct_type = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pads = g_list_next (pads);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!has_src) && (has_correct_type)) {
|
|
||||||
GST_DEBUG_OBJECT (play, "found %s with src pad and correct type",
|
|
||||||
GST_ELEMENT_NAME (element));
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
elements = g_list_next (elements);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we didn't find a sink element */
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_get_all_by_interface:
|
|
||||||
* @play: a #GstPlay.
|
|
||||||
* @interface: an interface.
|
|
||||||
*
|
|
||||||
* Returns all elements that are used by @play implementing the given interface.
|
|
||||||
*
|
|
||||||
* Returns: a #GList of #GstElement implementing the interface.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GList *
|
|
||||||
gst_play_get_all_by_interface (GstPlay * play, GType interface_type)
|
|
||||||
{
|
|
||||||
GstElement *videosink = NULL, *audiosink = NULL;
|
|
||||||
GList *res = NULL;
|
|
||||||
|
|
||||||
g_object_get (G_OBJECT (play->priv->playbin),
|
|
||||||
"video-sink", &videosink, "audio-sink", &audiosink, NULL);
|
|
||||||
|
|
||||||
/* ehw... */
|
|
||||||
if (videosink && GST_IS_BIN (videosink)) {
|
|
||||||
res = gst_bin_get_all_by_interface (GST_BIN (videosink), interface_type);
|
|
||||||
}
|
|
||||||
if (!res && audiosink && GST_IS_BIN (audiosink)) {
|
|
||||||
res = gst_bin_get_all_by_interface (GST_BIN (audiosink), interface_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_play_new:
|
|
||||||
* @error: a pointer to a #GError, which will be filled in on error.
|
|
||||||
*
|
|
||||||
* Creates a new GstPlay object.
|
|
||||||
*
|
|
||||||
* Returns: a newly created #GstPlay, or NULL on error (the #GError
|
|
||||||
* will be set accordingly).
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstPlay *
|
|
||||||
gst_play_new (GError ** error)
|
|
||||||
{
|
|
||||||
GstPlay *play = g_object_new (GST_TYPE_PLAY, NULL);
|
|
||||||
|
|
||||||
if (!play->priv->playbin) {
|
|
||||||
g_set_error (error, 0, 0, _("Failed to create playbin object"));
|
|
||||||
g_object_unref (G_OBJECT (play));
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return play;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* =========================================== */
|
|
||||||
/* */
|
|
||||||
/* Object typing & Creation */
|
|
||||||
/* */
|
|
||||||
/* =========================================== */
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_play_get_type (void)
|
|
||||||
{
|
|
||||||
static GType play_type = 0;
|
|
||||||
|
|
||||||
if (!play_type) {
|
|
||||||
static const GTypeInfo play_info = {
|
|
||||||
sizeof (GstPlayClass),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(GClassInitFunc) gst_play_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstPlay),
|
|
||||||
0,
|
|
||||||
(GInstanceInitFunc) gst_play_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
play_type = g_type_register_static (GST_TYPE_PIPELINE, "GstPlay",
|
|
||||||
&play_info, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return play_type;
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
noinst_LTLIBRARIES = libgstpropertyprobe.la
|
|
||||||
|
|
||||||
libgstpropertyprobe_la_SOURCES = propertyprobe.c
|
|
||||||
|
|
||||||
libgstpropertyprobeincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/propertyprobe
|
|
||||||
libgstpropertyprobeinclude_HEADERS = propertyprobe.h
|
|
||||||
|
|
||||||
libgstpropertyprobe_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
|
|
|
@ -1,345 +0,0 @@
|
||||||
/* GStreamer PropertyProbe
|
|
||||||
* Copyright (C) 2003 David Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* property_probe.c: property_probe design virtual class function wrappers
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "propertyprobe.h"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
SIGNAL_PROBE_NEEDED,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_property_probe_iface_init (GstPropertyProbeInterface * iface);
|
|
||||||
|
|
||||||
static guint gst_property_probe_signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_property_probe_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_property_probe_type = 0;
|
|
||||||
|
|
||||||
if (!gst_property_probe_type) {
|
|
||||||
static const GTypeInfo gst_property_probe_info = {
|
|
||||||
sizeof (GstPropertyProbeInterface),
|
|
||||||
(GBaseInitFunc) gst_property_probe_iface_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_property_probe_type =
|
|
||||||
g_type_register_static (G_TYPE_INTERFACE,
|
|
||||||
"GstPropertyProbe", &gst_property_probe_info, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_property_probe_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_property_probe_iface_init (GstPropertyProbeInterface * iface)
|
|
||||||
{
|
|
||||||
static gboolean initialized = FALSE;
|
|
||||||
|
|
||||||
if (!initialized) {
|
|
||||||
gst_property_probe_signals[SIGNAL_PROBE_NEEDED] =
|
|
||||||
g_signal_new ("probe-needed", G_TYPE_FROM_CLASS (iface),
|
|
||||||
G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstPropertyProbeInterface,
|
|
||||||
probe_needed), NULL, NULL, g_cclosure_marshal_VOID__POINTER,
|
|
||||||
G_TYPE_NONE, 1, G_TYPE_POINTER);
|
|
||||||
initialized = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* default virtual functions */
|
|
||||||
iface->get_properties = NULL;
|
|
||||||
iface->get_values = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_property_probe_get_properties:
|
|
||||||
* @probe: the #GstPropertyProbe to get the properties for.
|
|
||||||
*
|
|
||||||
* Get a list of properties for which probing is supported.
|
|
||||||
*
|
|
||||||
* Returns the list of properties for which probing is supported
|
|
||||||
* by this element.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const GList *
|
|
||||||
gst_property_probe_get_properties (GstPropertyProbe * probe)
|
|
||||||
{
|
|
||||||
GstPropertyProbeInterface *iface;
|
|
||||||
|
|
||||||
g_return_val_if_fail (probe != NULL, NULL);
|
|
||||||
|
|
||||||
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
|
|
||||||
|
|
||||||
if (iface->get_properties)
|
|
||||||
return iface->get_properties (probe);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const GParamSpec *
|
|
||||||
gst_property_probe_get_property (GstPropertyProbe * probe, const gchar * name)
|
|
||||||
{
|
|
||||||
const GList *pspecs = gst_property_probe_get_properties (probe);
|
|
||||||
|
|
||||||
g_return_val_if_fail (probe != NULL, NULL);
|
|
||||||
g_return_val_if_fail (name != NULL, NULL);
|
|
||||||
|
|
||||||
while (pspecs) {
|
|
||||||
const GParamSpec *pspec = pspecs->data;
|
|
||||||
|
|
||||||
if (!strcmp (pspec->name, name))
|
|
||||||
return pspec;
|
|
||||||
|
|
||||||
pspecs = pspecs->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_property_probe_probe_property (GstPropertyProbe * probe,
|
|
||||||
const GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstPropertyProbeInterface *iface;
|
|
||||||
|
|
||||||
g_return_if_fail (probe != NULL);
|
|
||||||
g_return_if_fail (pspec != NULL);
|
|
||||||
|
|
||||||
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
|
|
||||||
|
|
||||||
if (iface->probe_property)
|
|
||||||
iface->probe_property (probe, pspec->param_id, pspec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_property_probe_probe_property_name:
|
|
||||||
* @probe: the #GstPropertyProbe to check.
|
|
||||||
* @name: name of the property to return.
|
|
||||||
*
|
|
||||||
* Returns the #GParamSpec for the given property. It's similar to
|
|
||||||
* g_object_class_find_property (), except that this function only
|
|
||||||
* takes "probe'able" properties into account.
|
|
||||||
*
|
|
||||||
* Returns: the #GParamSpec that belongs to the given property.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_property_probe_probe_property_name (GstPropertyProbe * probe,
|
|
||||||
const gchar * name)
|
|
||||||
{
|
|
||||||
const GParamSpec *pspec;
|
|
||||||
|
|
||||||
g_return_if_fail (probe != NULL);
|
|
||||||
g_return_if_fail (name != NULL);
|
|
||||||
|
|
||||||
pspec = g_object_class_find_property (G_OBJECT_CLASS (probe), name);
|
|
||||||
if (!pspec) {
|
|
||||||
g_warning ("No such property %s", name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_property_probe_probe_property (probe, pspec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_property_probe_needs_probe:
|
|
||||||
* @probe: the #GstPropertyProbe object to which the given property belongs.
|
|
||||||
* @pspec: a #GParamSpec that identifies the property to check.
|
|
||||||
*
|
|
||||||
* Checks whether a property needs a probe. This might be because
|
|
||||||
* the property wasn't initialized before, or because host setup
|
|
||||||
* changed. This might be, for example, because a new device was
|
|
||||||
* added, and thus device probing needs to be refreshed to display
|
|
||||||
* the new device.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if the property needs a new probe, FALSE if not.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_property_probe_needs_probe (GstPropertyProbe * probe,
|
|
||||||
const GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstPropertyProbeInterface *iface;
|
|
||||||
|
|
||||||
g_return_val_if_fail (probe != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (pspec != NULL, FALSE);
|
|
||||||
|
|
||||||
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
|
|
||||||
|
|
||||||
if (iface->needs_probe)
|
|
||||||
return iface->needs_probe (probe, pspec->param_id, pspec);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_property_probe_needs_probe_name:
|
|
||||||
* @probe: the #GstPropertyProbe object to which the given property belongs.
|
|
||||||
* @name: the name of the property to check.
|
|
||||||
*
|
|
||||||
* Same as gst_property_probe_needs_probe ().
|
|
||||||
*
|
|
||||||
* Returns: TRUE if the property needs a new probe, FALSE if not.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gst_property_probe_needs_probe_name (GstPropertyProbe * probe,
|
|
||||||
const gchar * name)
|
|
||||||
{
|
|
||||||
const GParamSpec *pspec;
|
|
||||||
|
|
||||||
g_return_val_if_fail (probe != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (name != NULL, FALSE);
|
|
||||||
|
|
||||||
pspec = g_object_class_find_property (G_OBJECT_CLASS (probe), name);
|
|
||||||
if (!pspec) {
|
|
||||||
g_warning ("No such property %s", name);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_property_probe_needs_probe (probe, pspec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_property_probe_get_values:
|
|
||||||
* @probe: the #GstPropertyProbe object.
|
|
||||||
* @pspec: the #GParamSpec property identifier.
|
|
||||||
*
|
|
||||||
* Gets the possible (probed) values for the given property,
|
|
||||||
* requires the property to have been probed before.
|
|
||||||
*
|
|
||||||
* Returns: A list of valid values for the given property.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GValueArray *
|
|
||||||
gst_property_probe_get_values (GstPropertyProbe * probe,
|
|
||||||
const GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstPropertyProbeInterface *iface;
|
|
||||||
|
|
||||||
g_return_val_if_fail (probe != NULL, NULL);
|
|
||||||
g_return_val_if_fail (pspec != NULL, NULL);
|
|
||||||
|
|
||||||
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
|
|
||||||
|
|
||||||
if (iface->get_values)
|
|
||||||
return iface->get_values (probe, pspec->param_id, pspec);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_property_probe_get_values_name:
|
|
||||||
* @probe: the #GstPropertyProbe object.
|
|
||||||
* @name: the name of the property to get values for.
|
|
||||||
*
|
|
||||||
* Same as gst_property_probe_get_values ().
|
|
||||||
*
|
|
||||||
* Returns: A list of valid values for the given property.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GValueArray *
|
|
||||||
gst_property_probe_get_values_name (GstPropertyProbe * probe,
|
|
||||||
const gchar * name)
|
|
||||||
{
|
|
||||||
const GParamSpec *pspec;
|
|
||||||
|
|
||||||
g_return_val_if_fail (probe != NULL, NULL);
|
|
||||||
g_return_val_if_fail (name != NULL, NULL);
|
|
||||||
|
|
||||||
pspec = g_object_class_find_property (G_OBJECT_CLASS (probe), name);
|
|
||||||
if (!pspec) {
|
|
||||||
g_warning ("No such property %s", name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_property_probe_get_values (probe, pspec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_property_probe_probe_and_get_values:
|
|
||||||
* @probe: the #GstPropertyProbe object.
|
|
||||||
* @pspec: The #GParamSpec property identifier.
|
|
||||||
*
|
|
||||||
* Check whether the given property requires a new probe. If so,
|
|
||||||
* fo the probe. After that, retrieve a value list. Meant as a
|
|
||||||
* utility function that wraps the above functions.
|
|
||||||
*
|
|
||||||
* Return: the list of valid values for this property.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GValueArray *
|
|
||||||
gst_property_probe_probe_and_get_values (GstPropertyProbe * probe,
|
|
||||||
const GParamSpec * pspec)
|
|
||||||
{
|
|
||||||
GstPropertyProbeInterface *iface;
|
|
||||||
|
|
||||||
g_return_val_if_fail (probe != NULL, NULL);
|
|
||||||
g_return_val_if_fail (pspec != NULL, NULL);
|
|
||||||
|
|
||||||
iface = GST_PROPERTY_PROBE_GET_IFACE (probe);
|
|
||||||
|
|
||||||
if (gst_property_probe_needs_probe (probe, pspec))
|
|
||||||
gst_property_probe_probe_property (probe, pspec);
|
|
||||||
|
|
||||||
return gst_property_probe_get_values (probe, pspec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_property_probe_probe_and_get_values_name:
|
|
||||||
* @probe: the #GstPropertyProbe object.
|
|
||||||
* @name: the name of the property to get values for.
|
|
||||||
*
|
|
||||||
* Same as gst_property_probe_probe_and_get_values ().
|
|
||||||
*
|
|
||||||
* Return: the list of valid values for this property.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GValueArray *
|
|
||||||
gst_property_probe_probe_and_get_values_name (GstPropertyProbe * probe,
|
|
||||||
const gchar * name)
|
|
||||||
{
|
|
||||||
const GParamSpec *pspec;
|
|
||||||
|
|
||||||
g_return_val_if_fail (probe != NULL, NULL);
|
|
||||||
g_return_val_if_fail (name != NULL, NULL);
|
|
||||||
|
|
||||||
pspec = g_object_class_find_property (G_OBJECT_CLASS (probe), name);
|
|
||||||
if (!pspec) {
|
|
||||||
g_warning ("No such property %s", name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_property_probe_probe_and_get_values (probe, pspec);
|
|
||||||
}
|
|
|
@ -1,97 +0,0 @@
|
||||||
/* GStreamer PropertyProbe
|
|
||||||
* Copyright (C) 2003 David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* property_probe.h: property_probe interface design
|
|
||||||
*
|
|
||||||
* 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_PROPERTY_PROBE_H__
|
|
||||||
#define __GST_PROPERTY_PROBE_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_PROPERTY_PROBE \
|
|
||||||
(gst_property_probe_get_type ())
|
|
||||||
#define GST_PROPERTY_PROBE(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PROPERTY_PROBE, GstPropertyProbe))
|
|
||||||
#define GST_IS_PROPERTY_PROBE(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PROPERTY_PROBE))
|
|
||||||
#define GST_PROPERTY_PROBE_GET_IFACE(obj) \
|
|
||||||
(G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_PROPERTY_PROBE, GstPropertyProbeInterface))
|
|
||||||
|
|
||||||
typedef struct _GstPropertyProbe GstPropertyProbe; /* dummy typedef */
|
|
||||||
|
|
||||||
typedef struct _GstPropertyProbeInterface {
|
|
||||||
GTypeInterface klass;
|
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (*probe_needed) (GstPropertyProbe *probe,
|
|
||||||
const GParamSpec *pspec);
|
|
||||||
|
|
||||||
/* virtual functions */
|
|
||||||
const GList * (*get_properties) (GstPropertyProbe *probe);
|
|
||||||
gboolean (*needs_probe) (GstPropertyProbe *probe,
|
|
||||||
guint prop_id,
|
|
||||||
const GParamSpec *pspec);
|
|
||||||
void (*probe_property) (GstPropertyProbe *probe,
|
|
||||||
guint prop_id,
|
|
||||||
const GParamSpec *pspec);
|
|
||||||
GValueArray * (*get_values) (GstPropertyProbe *probe,
|
|
||||||
guint prop_id,
|
|
||||||
const GParamSpec *pspec);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
} GstPropertyProbeInterface;
|
|
||||||
|
|
||||||
GType gst_property_probe_get_type (void);
|
|
||||||
|
|
||||||
/* virtual class function wrappers */
|
|
||||||
|
|
||||||
/* returns list of GParamSpecs */
|
|
||||||
const GList * gst_property_probe_get_properties (GstPropertyProbe *probe);
|
|
||||||
const GParamSpec *gst_property_probe_get_property (GstPropertyProbe *probe,
|
|
||||||
const gchar *name);
|
|
||||||
|
|
||||||
/* probe one property */
|
|
||||||
void gst_property_probe_probe_property (GstPropertyProbe *probe,
|
|
||||||
const GParamSpec *pspec);
|
|
||||||
void gst_property_probe_probe_property_name (GstPropertyProbe *probe,
|
|
||||||
const gchar *name);
|
|
||||||
|
|
||||||
/* do we need a probe? */
|
|
||||||
gboolean gst_property_probe_needs_probe (GstPropertyProbe *probe,
|
|
||||||
const GParamSpec *pspec);
|
|
||||||
gboolean gst_property_probe_needs_probe_name (GstPropertyProbe *probe,
|
|
||||||
const gchar *name);
|
|
||||||
|
|
||||||
/* returns list of GValues */
|
|
||||||
GValueArray * gst_property_probe_get_values (GstPropertyProbe *probe,
|
|
||||||
const GParamSpec *pspec);
|
|
||||||
GValueArray * gst_property_probe_get_values_name (GstPropertyProbe *probe,
|
|
||||||
const gchar *name);
|
|
||||||
|
|
||||||
/* sugar */
|
|
||||||
GValueArray * gst_property_probe_probe_and_get_values (GstPropertyProbe *probe,
|
|
||||||
const GParamSpec *pspec);
|
|
||||||
GValueArray * gst_property_probe_probe_and_get_values_name (GstPropertyProbe *probe,
|
|
||||||
const gchar *name);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_PROPERTY_PROBE_H__ */
|
|
|
@ -1,144 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="propertyprobe"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D6789A}"
|
|
||||||
RootNamespace="propertyprobe"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstpropertyprobe.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile=""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/propertyprobe.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstpropertyprobe.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstpropertyprobe.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile=""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstpropertyprobe.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\propertyprobe.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\propertyprobe.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,14 +0,0 @@
|
||||||
librarydir = $(libdir)/gstreamer-@GST_MAJORMINOR@
|
|
||||||
|
|
||||||
library_LTLIBRARIES = libgstresample.la
|
|
||||||
|
|
||||||
libgstresample_la_SOURCES = dtos.c dtof.c functable.c resample.c resample.h
|
|
||||||
libgstresample_la_LIBADD =
|
|
||||||
libgstresample_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
libgstresample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
|
||||||
|
|
||||||
libgstresampleincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/resample
|
|
||||||
libgstresampleinclude_HEADERS = resample.h
|
|
||||||
|
|
||||||
noinst_HEADERS = private.h
|
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
|
|
||||||
This is a snapshot of my current work developing an audio
|
|
||||||
resampling library. While working on this library, I started
|
|
||||||
writing lots of general purpose functions that should really
|
|
||||||
be part of a larger library. Rather than have a constantly
|
|
||||||
changing library, and since the current code is capable, I
|
|
||||||
decided to freeze this codebase for use with gstreamer, and
|
|
||||||
move active development of the code elsewhere.
|
|
||||||
|
|
||||||
The algorithm used is based on Shannon's theorem, which says
|
|
||||||
that you can recreate an input signal from equidistant samples
|
|
||||||
using a sin(x)/x filter; thus, you can create new samples from
|
|
||||||
the regenerated input signal. Since sin(x)/x is expensive to
|
|
||||||
evaluate, an interpolated lookup table is used. Also, a
|
|
||||||
windowing function (1-x^2)^2 is used, which aids the convergence
|
|
||||||
of sin(x)/x for lower frequencies at the expense of higher.
|
|
||||||
|
|
||||||
There is one tunable parameter, which is the filter length.
|
|
||||||
Longer filter lengths are obviously slower, but more accurate.
|
|
||||||
There's not much reason to use a filter length longer than 64,
|
|
||||||
since other approximations start to dominate. Filter lengths
|
|
||||||
as short as 8 are audially acceptable, but should not be
|
|
||||||
considered for serious work.
|
|
||||||
|
|
||||||
Performance: A PowerPC G4 at 400 Mhz can resample 2 audio
|
|
||||||
channels at almost 10x speed with a filter length of 64, without
|
|
||||||
using Altivec extensions. (My goal was 10x speed, which I almost
|
|
||||||
reached. Maybe later.)
|
|
||||||
|
|
||||||
Limitations: Currently only supports streams in the form of
|
|
||||||
interleaved signed 16-bit samples.
|
|
||||||
|
|
||||||
The test.c program is a simple regression test. It creates a
|
|
||||||
test input pattern (1 sec at 48 khz) that is a frequency ramp
|
|
||||||
from 0 to 24000 hz, and then converts it to 44100 hz using a
|
|
||||||
filter length of 64. It then compares the result to the same
|
|
||||||
pattern generated at 44100 hz, and outputs the result to the
|
|
||||||
file "out".
|
|
||||||
|
|
||||||
A graph of the correct output should have field 2 and field 4
|
|
||||||
almost equal (plus/minus 1) up to about sample 40000 (which
|
|
||||||
corresponds to 20 khz), and then field 2 should be close to 0
|
|
||||||
above that. Running the test program will print to stdout
|
|
||||||
something like the following:
|
|
||||||
|
|
||||||
time 0.112526
|
|
||||||
average error 10k=0.4105 22k=639.34
|
|
||||||
|
|
||||||
The average error is RMS error over the range [0-10khz] and
|
|
||||||
[0-22khz], and is expressed in sample values, for an input
|
|
||||||
amplitude of 16000. Note that RMS errors below 1.0 can't
|
|
||||||
really be compared, but basically this shows that below
|
|
||||||
10 khz, the resampler is nearly perfect. Most of the error
|
|
||||||
is concentrated above 20 khz.
|
|
||||||
|
|
||||||
If the average error is significantly larger after modifying
|
|
||||||
the code, it's probably not good.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dave...
|
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* 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 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/*#include <ml.h> */
|
|
||||||
#include "private.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_double_float_ref (double *dest, float *src, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
dest[i] = src[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_float_double_ref (float *dest, double *src, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
dest[i] = src[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_double_float_dstr (double *dest, float *src, int n, int dstr)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
void *d = dest;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
(*(double *) d) = *src++;
|
|
||||||
d += dstr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_float_double_sstr (float *dest, double *src, int n, int sstr)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
void *s = src;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
*dest++ = *(double *) s;
|
|
||||||
s += sstr;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,217 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* 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 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/*#include <ml.h> */
|
|
||||||
#include <resample.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define short_to_double_table
|
|
||||||
/*#define short_to_double_altivec */
|
|
||||||
#define short_to_double_unroll
|
|
||||||
|
|
||||||
#ifdef short_to_double_table
|
|
||||||
static float ints_high[256];
|
|
||||||
static float ints_low[256];
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_double_short_table (double *dest, short *src, int n)
|
|
||||||
{
|
|
||||||
static int init = 0;
|
|
||||||
int i;
|
|
||||||
unsigned int idx;
|
|
||||||
|
|
||||||
if (!init) {
|
|
||||||
for (i = 0; i < 256; i++) {
|
|
||||||
ints_high[i] = 256.0 * ((i < 128) ? i : i - 256);
|
|
||||||
ints_low[i] = i;
|
|
||||||
}
|
|
||||||
init = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n & 1) {
|
|
||||||
idx = (unsigned short) *src++;
|
|
||||||
*dest++ = ints_high[(idx >> 8)] + ints_low[(idx & 0xff)];
|
|
||||||
n -= 1;
|
|
||||||
}
|
|
||||||
for (i = 0; i < n; i += 2) {
|
|
||||||
idx = (unsigned short) *src++;
|
|
||||||
*dest++ = ints_high[(idx >> 8)] + ints_low[(idx & 0xff)];
|
|
||||||
idx = (unsigned short) *src++;
|
|
||||||
*dest++ = ints_high[(idx >> 8)] + ints_low[(idx & 0xff)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef short_to_double_unroll
|
|
||||||
void
|
|
||||||
conv_double_short_unroll (double *dest, short *src, int n)
|
|
||||||
{
|
|
||||||
if (n & 1) {
|
|
||||||
*dest++ = *src++;
|
|
||||||
n--;
|
|
||||||
}
|
|
||||||
if (n & 2) {
|
|
||||||
*dest++ = *src++;
|
|
||||||
*dest++ = *src++;
|
|
||||||
n -= 2;
|
|
||||||
}
|
|
||||||
while (n > 0) {
|
|
||||||
*dest++ = *src++;
|
|
||||||
*dest++ = *src++;
|
|
||||||
*dest++ = *src++;
|
|
||||||
*dest++ = *src++;
|
|
||||||
n -= 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_double_short_ref (double *dest, short *src, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
dest[i] = src[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_CPU_PPC
|
|
||||||
#if 0
|
|
||||||
static union
|
|
||||||
{
|
|
||||||
int i[4];
|
|
||||||
float f[4];
|
|
||||||
}
|
|
||||||
av_tmp __attribute__ ((__aligned__ (16)));
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_double_short_altivec (double *dest, short *src, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i += 4) {
|
|
||||||
av_tmp.i[0] = src[0];
|
|
||||||
av_tmp.i[1] = src[1];
|
|
||||||
av_tmp.i[2] = src[2];
|
|
||||||
av_tmp.i[3] = src[3];
|
|
||||||
|
|
||||||
asm (" lvx 0,0,%0\n" " vcfsx 1,0,0\n" " stvx 1,0,%0\n": :"r" (&av_tmp)
|
|
||||||
);
|
|
||||||
|
|
||||||
dest[0] = av_tmp.f[0];
|
|
||||||
dest[1] = av_tmp.f[1];
|
|
||||||
dest[2] = av_tmp.f[2];
|
|
||||||
dest[3] = av_tmp.f[3];
|
|
||||||
src += 4;
|
|
||||||
dest += 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* double to short */
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_short_double_ref (short *dest, double *src, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
x = *src++;
|
|
||||||
if (x < -32768.0)
|
|
||||||
x = -32768.0;
|
|
||||||
if (x > 32767.0)
|
|
||||||
x = 32767.0;
|
|
||||||
*dest++ = rint (x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* #ifdef HAVE_CPU_PPC */
|
|
||||||
#if 0
|
|
||||||
void
|
|
||||||
conv_short_double_ppcasm (short *dest, double *src, int n)
|
|
||||||
{
|
|
||||||
int tmp[2];
|
|
||||||
double min = -32768.0;
|
|
||||||
double max = 32767.0;
|
|
||||||
double ftmp0, ftmp1;
|
|
||||||
|
|
||||||
asm __volatile__ ("\taddic. %3,%3,-8\n"
|
|
||||||
"\taddic. %6,%6,-2\n"
|
|
||||||
"loop:\n"
|
|
||||||
"\tlfdu %0,8(%3)\n"
|
|
||||||
"\tfsub %1,%0,%4\n"
|
|
||||||
"\tfsel %0,%1,%0,%4\n"
|
|
||||||
"\tfsub %1,%0,%5\n"
|
|
||||||
"\tfsel %0,%1,%5,%0\n"
|
|
||||||
"\tfctiw %1,%0\n"
|
|
||||||
"\taddic. 5,5,-1\n"
|
|
||||||
"\tstfd %1,0(%2)\n"
|
|
||||||
"\tlhz 9,6(%2)\n"
|
|
||||||
"\tsthu 9,2(%6)\n" "\tbne loop\n":"=&f" (ftmp0), "=&f" (ftmp1)
|
|
||||||
:"b" (tmp), "r" (src), "f" (min), "f" (max), "r" (dest)
|
|
||||||
:"r9", "r5");
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_double_short_dstr (double *dest, short *src, int n, int dstr)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
void *d = dest;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
(*(double *) d) = *src++;
|
|
||||||
d += dstr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
conv_short_double_sstr (short *dest, double *src, int n, int sstr)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x;
|
|
||||||
void *s = src;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
x = *(double *) s;
|
|
||||||
if (x < -32768.0)
|
|
||||||
x = -32768.0;
|
|
||||||
if (x > 32767.0)
|
|
||||||
x = 32767.0;
|
|
||||||
*dest++ = rint (x);
|
|
||||||
s += sstr;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,322 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* 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 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "private.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_sinc (void *p, double x)
|
|
||||||
{
|
|
||||||
if (x == 0)
|
|
||||||
return 1;
|
|
||||||
return sin (x) / x;
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_dsinc (void *p, double x)
|
|
||||||
{
|
|
||||||
if (x == 0)
|
|
||||||
return 0;
|
|
||||||
return cos (x) / x - sin (x) / (x * x);
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_window_boxcar (void *p, double x)
|
|
||||||
{
|
|
||||||
if (x < -1 || x > 1)
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_window_dboxcar (void *p, double x)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_window_std (void *p, double x)
|
|
||||||
{
|
|
||||||
if (x < -1 || x > 1)
|
|
||||||
return 0;
|
|
||||||
return (1 - x * x) * (1 - x * x);
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_window_dstd (void *p, double x)
|
|
||||||
{
|
|
||||||
if (x < -1 || x > 1)
|
|
||||||
return 0;
|
|
||||||
return -4 * x * (1 - x * x);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_init (functable_t * t)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
t->fx = malloc (sizeof (double) * (t->len + 1));
|
|
||||||
t->fdx = malloc (sizeof (double) * (t->len + 1));
|
|
||||||
|
|
||||||
t->invoffset = 1.0 / t->offset;
|
|
||||||
|
|
||||||
for (i = 0; i < t->len + 1; i++) {
|
|
||||||
x = t->start + t->offset * i;
|
|
||||||
x *= t->scale;
|
|
||||||
|
|
||||||
t->fx[i] = t->func_x (t->priv, x);
|
|
||||||
t->fdx[i] = t->scale * t->func_dx (t->priv, x);
|
|
||||||
}
|
|
||||||
if (t->func2_x) {
|
|
||||||
double f1x, f1dx;
|
|
||||||
double f2x, f2dx;
|
|
||||||
|
|
||||||
for (i = 0; i < t->len + 1; i++) {
|
|
||||||
x = t->start + t->offset * i;
|
|
||||||
x *= t->scale2;
|
|
||||||
|
|
||||||
f2x = t->func2_x (t->priv, x);
|
|
||||||
f2dx = t->scale2 * t->func2_dx (t->priv, x);
|
|
||||||
|
|
||||||
f1x = t->fx[i];
|
|
||||||
f1dx = t->fdx[i];
|
|
||||||
|
|
||||||
t->fx[i] = f1x * f2x;
|
|
||||||
t->fdx[i] = f1x * f2dx + f1dx * f2x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_eval (functable_t * t, double x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double f0, f1, w0, w1;
|
|
||||||
double x2, x3;
|
|
||||||
double w;
|
|
||||||
|
|
||||||
if (x < t->start || x > (t->start + (t->len + 1) * t->offset)) {
|
|
||||||
printf ("x out of range %g\n", x);
|
|
||||||
}
|
|
||||||
x -= t->start;
|
|
||||||
x /= t->offset;
|
|
||||||
i = floor (x);
|
|
||||||
x -= i;
|
|
||||||
|
|
||||||
x2 = x * x;
|
|
||||||
x3 = x2 * x;
|
|
||||||
|
|
||||||
f1 = 3 * x2 - 2 * x3;
|
|
||||||
f0 = 1 - f1;
|
|
||||||
w0 = (x - 2 * x2 + x3) * t->offset;
|
|
||||||
w1 = (-x2 + x3) * t->offset;
|
|
||||||
|
|
||||||
/*printf("i=%d x=%g f0=%g f1=%g w0=%g w1=%g\n",i,x,f0,f1,w0,w1); */
|
|
||||||
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->fdx[i] * w0 + t->fdx[i + 1] * w1;
|
|
||||||
|
|
||||||
/*w = t->fx[i] * (1-x) + t->fx[i+1] * x; */
|
|
||||||
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
double
|
|
||||||
functable_fir (functable_t * t, double x, int n, double *data, int len)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
double f0, f1, w0, w1;
|
|
||||||
double x2, x3;
|
|
||||||
double w;
|
|
||||||
double sum;
|
|
||||||
|
|
||||||
x -= t->start;
|
|
||||||
x /= t->offset;
|
|
||||||
i = floor (x);
|
|
||||||
x -= i;
|
|
||||||
|
|
||||||
x2 = x * x;
|
|
||||||
x3 = x2 * x;
|
|
||||||
|
|
||||||
f1 = 3 * x2 - 2 * x3;
|
|
||||||
f0 = 1 - f1;
|
|
||||||
w0 = (x - 2 * x2 + x3) * t->offset;
|
|
||||||
w1 = (-x2 + x3) * t->offset;
|
|
||||||
|
|
||||||
sum = 0;
|
|
||||||
for (j = 0; j < len; j++) {
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->fdx[i] * w0 + t->fdx[i + 1] * w1;
|
|
||||||
sum += data[j * 2] * w;
|
|
||||||
i += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
functable_fir2 (functable_t * t, double *r0, double *r1, double x,
|
|
||||||
int n, double *data, int len)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
double f0, f1, w0, w1;
|
|
||||||
double x2, x3;
|
|
||||||
double w;
|
|
||||||
double sum0, sum1;
|
|
||||||
double floor_x;
|
|
||||||
|
|
||||||
x -= t->start;
|
|
||||||
x *= t->invoffset;
|
|
||||||
floor_x = floor (x);
|
|
||||||
i = floor_x;
|
|
||||||
x -= floor_x;
|
|
||||||
|
|
||||||
x2 = x * x;
|
|
||||||
x3 = x2 * x;
|
|
||||||
|
|
||||||
f1 = 3 * x2 - 2 * x3;
|
|
||||||
f0 = 1 - f1;
|
|
||||||
w0 = (x - 2 * x2 + x3) * t->offset;
|
|
||||||
w1 = (-x2 + x3) * t->offset;
|
|
||||||
|
|
||||||
sum0 = 0;
|
|
||||||
sum1 = 0;
|
|
||||||
for (j = 0; j < len; j++) {
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->fdx[i] * w0 + t->fdx[i + 1] * w1;
|
|
||||||
sum0 += data[j * 2] * w;
|
|
||||||
sum1 += data[j * 2 + 1] * w;
|
|
||||||
i += n;
|
|
||||||
|
|
||||||
#define unroll2
|
|
||||||
#define unroll3
|
|
||||||
#define unroll4
|
|
||||||
#ifdef unroll2
|
|
||||||
j++;
|
|
||||||
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->fdx[i] * w0 + t->fdx[i + 1] * w1;
|
|
||||||
sum0 += data[j * 2] * w;
|
|
||||||
sum1 += data[j * 2 + 1] * w;
|
|
||||||
i += n;
|
|
||||||
#endif
|
|
||||||
#ifdef unroll3
|
|
||||||
j++;
|
|
||||||
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->fdx[i] * w0 + t->fdx[i + 1] * w1;
|
|
||||||
sum0 += data[j * 2] * w;
|
|
||||||
sum1 += data[j * 2 + 1] * w;
|
|
||||||
i += n;
|
|
||||||
#endif
|
|
||||||
#ifdef unroll4
|
|
||||||
j++;
|
|
||||||
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->fdx[i] * w0 + t->fdx[i + 1] * w1;
|
|
||||||
sum0 += data[j * 2] * w;
|
|
||||||
sum1 += data[j * 2 + 1] * w;
|
|
||||||
i += n;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
*r0 = sum0;
|
|
||||||
*r1 = sum1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef unused
|
|
||||||
void
|
|
||||||
functable_fir2_altivec (functable_t * t, float *r0, float *r1,
|
|
||||||
double x, int n, float *data, int len)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
double f0, f1, w0, w1;
|
|
||||||
double x2, x3;
|
|
||||||
double w;
|
|
||||||
double sum0, sum1;
|
|
||||||
double floor_x;
|
|
||||||
|
|
||||||
x -= t->start;
|
|
||||||
x *= t->invoffset;
|
|
||||||
floor_x = floor (x);
|
|
||||||
i = floor_x;
|
|
||||||
x -= floor_x;
|
|
||||||
|
|
||||||
x2 = x * x;
|
|
||||||
x3 = x2 * x;
|
|
||||||
|
|
||||||
f1 = 3 * x2 - 2 * x3;
|
|
||||||
f0 = 1 - f1;
|
|
||||||
w0 = (x - 2 * x2 + x3) * t->offset;
|
|
||||||
w1 = (-x2 + x3) * t->offset;
|
|
||||||
|
|
||||||
sum0 = 0;
|
|
||||||
sum1 = 0;
|
|
||||||
for (j = 0; j < len; j++) {
|
|
||||||
/* t->fx, t->fdx needs to be multiplexed by n */
|
|
||||||
/* we need 5 consecutive floats, which fit into 2 vecs */
|
|
||||||
/* load v0, t->fx[i] */
|
|
||||||
/* load v1, t->fx[i+n] */
|
|
||||||
/* v2 = v0 (not correct) */
|
|
||||||
/* v3 = (v0>>32) || (v1<<3*32) (not correct) */
|
|
||||||
/* */
|
|
||||||
/* load v4, t->dfx[i] */
|
|
||||||
/* load v5, t->dfx[i+n] */
|
|
||||||
/* v6 = v4 (not correct) */
|
|
||||||
/* v7 = (v4>>32) || (v5<<3*32) (not correct) */
|
|
||||||
/* */
|
|
||||||
/* v8 = splat(f0) */
|
|
||||||
/* v9 = splat(f1) */
|
|
||||||
/* v10 = splat(w0) */
|
|
||||||
/* v11 = splat(w1) */
|
|
||||||
/* */
|
|
||||||
/* v12 = v2 * v8 */
|
|
||||||
/* v12 += v3 * v9 */
|
|
||||||
/* v12 += v6 * v10 */
|
|
||||||
/* v12 += v7 * v11 */
|
|
||||||
|
|
||||||
w = t->fx[i] * f0 + t->fx[i + 1] * f1 + t->fdx[i] * w0 + t->fdx[i + 1] * w1;
|
|
||||||
|
|
||||||
/* v13 = data[j*2] */
|
|
||||||
/* v14 = data[j*2+4] */
|
|
||||||
/* v15 = deinterlace_high(v13,v14) */
|
|
||||||
/* v16 = deinterlace_low(v13,v14) */
|
|
||||||
/* (sum0) v17 += multsum(v13,v15) */
|
|
||||||
/* (sum1) v18 += multsum(v14,v16) */
|
|
||||||
|
|
||||||
sum0 += data[j * 2] * w;
|
|
||||||
sum1 += data[j * 2 + 1] * w;
|
|
||||||
i += n;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
*r0 = sum0;
|
|
||||||
*r1 = sum1;
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,118 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* 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 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 __PRIVATE_H__
|
|
||||||
#define __PRIVATE_H__
|
|
||||||
|
|
||||||
#include "resample.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
void gst_resample_nearest_s16(gst_resample_t *r);
|
|
||||||
void gst_resample_bilinear_s16(gst_resample_t *r);
|
|
||||||
void gst_resample_sinc_s16(gst_resample_t *r);
|
|
||||||
void gst_resample_sinc_slow_s16(gst_resample_t *r);
|
|
||||||
void gst_resample_sinc_ft_s16(gst_resample_t * r);
|
|
||||||
|
|
||||||
void gst_resample_nearest_float(gst_resample_t *r);
|
|
||||||
void gst_resample_bilinear_float(gst_resample_t *r);
|
|
||||||
void gst_resample_sinc_float(gst_resample_t *r);
|
|
||||||
void gst_resample_sinc_slow_float(gst_resample_t *r);
|
|
||||||
void gst_resample_sinc_ft_float(gst_resample_t * r);
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct functable_s functable_t;
|
|
||||||
struct functable_s {
|
|
||||||
double start;
|
|
||||||
double offset;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
double invoffset;
|
|
||||||
|
|
||||||
double scale;
|
|
||||||
double scale2;
|
|
||||||
|
|
||||||
double (*func_x)(void *,double x);
|
|
||||||
double (*func_dx)(void *,double x);
|
|
||||||
|
|
||||||
double (*func2_x)(void *,double x);
|
|
||||||
double (*func2_dx)(void *,double x);
|
|
||||||
|
|
||||||
double *fx;
|
|
||||||
double *fdx;
|
|
||||||
|
|
||||||
void *priv;
|
|
||||||
};
|
|
||||||
|
|
||||||
void functable_init(functable_t *t);
|
|
||||||
double functable_eval(functable_t *t,double x);
|
|
||||||
|
|
||||||
double functable_fir(functable_t *t,double x0,int n,double *data,int len);
|
|
||||||
void functable_fir2(functable_t *t,double *r0, double *r1, double x0,
|
|
||||||
int n,double *data,int len);
|
|
||||||
|
|
||||||
double functable_sinc(void *p, double x);
|
|
||||||
double functable_dsinc(void *p, double x);
|
|
||||||
double functable_window_std(void *p, double x);
|
|
||||||
double functable_window_dstd(void *p, double x);
|
|
||||||
double functable_window_boxcar(void *p, double x);
|
|
||||||
double functable_window_dboxcar(void *p, double x);
|
|
||||||
|
|
||||||
/* math lib stuff */
|
|
||||||
|
|
||||||
void conv_double_short_table(double *dest, short *src, int n);
|
|
||||||
void conv_double_short_unroll(double *dest, short *src, int n);
|
|
||||||
void conv_double_short_ref(double *dest, short *src, int n);
|
|
||||||
#ifdef HAVE_CPU_PPC
|
|
||||||
void conv_double_short_altivec(double *dest, short *src, int n);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void conv_short_double_ref(short *dest, double *src, int n);
|
|
||||||
#ifdef HAVE_CPU_PPC
|
|
||||||
void conv_short_double_ppcasm(short *dest, double *src, int n);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_CPU_PPC
|
|
||||||
# define conv_double_short conv_double_short_table
|
|
||||||
# if 0
|
|
||||||
/* disabled as in .c */
|
|
||||||
# define conv_short_double conv_short_double_ppcasm
|
|
||||||
# else
|
|
||||||
# define conv_short_double conv_short_double_ref
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define conv_double_short conv_double_short_ref
|
|
||||||
# define conv_short_double conv_short_double_ref
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define conv_double_float conv_double_float_ref
|
|
||||||
#define conv_float_double conv_float_double_ref
|
|
||||||
|
|
||||||
void conv_double_short_dstr(double *dest, short *src, int n, int dstr);
|
|
||||||
void conv_short_double_sstr(short *dest, double *src, int n, int dstr);
|
|
||||||
|
|
||||||
void conv_double_float_ref(double *dest, float *src, int n);
|
|
||||||
void conv_float_double_ref(float *dest, double *src, int n);
|
|
||||||
void conv_double_float_dstr(double *dest, float *src, int n, int dstr);
|
|
||||||
void conv_float_double_sstr(float *dest, double *src, int n, int sstr);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __PRIVATE_H__ */
|
|
|
@ -1,929 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David A. Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* 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 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "private.h"
|
|
||||||
#include <gst/gstplugin.h>
|
|
||||||
#include <gst/gstversion.h>
|
|
||||||
|
|
||||||
inline double
|
|
||||||
sinc (double x)
|
|
||||||
{
|
|
||||||
if (x == 0)
|
|
||||||
return 1;
|
|
||||||
return sin (x) / x;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline double
|
|
||||||
window_func (double x)
|
|
||||||
{
|
|
||||||
x = 1 - x * x;
|
|
||||||
return x * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
signed short
|
|
||||||
double_to_s16 (double x)
|
|
||||||
{
|
|
||||||
if (x < -32768) {
|
|
||||||
printf ("clipped\n");
|
|
||||||
return -32768;
|
|
||||||
}
|
|
||||||
if (x > 32767) {
|
|
||||||
printf ("clipped\n");
|
|
||||||
return -32767;
|
|
||||||
}
|
|
||||||
return rint (x);
|
|
||||||
}
|
|
||||||
|
|
||||||
signed short
|
|
||||||
double_to_s16_ppcasm (double x)
|
|
||||||
{
|
|
||||||
if (x < -32768) {
|
|
||||||
return -32768;
|
|
||||||
}
|
|
||||||
if (x > 32767) {
|
|
||||||
return -32767;
|
|
||||||
}
|
|
||||||
return rint (x);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_init (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
r->i_start = 0;
|
|
||||||
if (r->filter_length & 1) {
|
|
||||||
r->o_start = 0;
|
|
||||||
} else {
|
|
||||||
r->o_start = r->o_inc * 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset (r->acc, 0, sizeof (r->acc));
|
|
||||||
|
|
||||||
gst_resample_reinit (r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_reinit (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
/* i_inc is the number of samples that the output increments for
|
|
||||||
* each input sample. o_inc is the opposite. */
|
|
||||||
r->i_inc = (double) r->o_rate / r->i_rate;
|
|
||||||
r->o_inc = (double) r->i_rate / r->o_rate;
|
|
||||||
|
|
||||||
r->halftaps = (r->filter_length - 1.0) * 0.5;
|
|
||||||
|
|
||||||
if (r->format == GST_RESAMPLE_S16) {
|
|
||||||
switch (r->method) {
|
|
||||||
default:
|
|
||||||
case GST_RESAMPLE_NEAREST:
|
|
||||||
r->scale = gst_resample_nearest_s16;
|
|
||||||
break;
|
|
||||||
case GST_RESAMPLE_BILINEAR:
|
|
||||||
r->scale = gst_resample_bilinear_s16;
|
|
||||||
break;
|
|
||||||
case GST_RESAMPLE_SINC_SLOW:
|
|
||||||
r->scale = gst_resample_sinc_s16;
|
|
||||||
break;
|
|
||||||
case GST_RESAMPLE_SINC:
|
|
||||||
r->scale = gst_resample_sinc_ft_s16;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (r->format == GST_RESAMPLE_FLOAT) {
|
|
||||||
switch (r->method) {
|
|
||||||
default:
|
|
||||||
case GST_RESAMPLE_NEAREST:
|
|
||||||
r->scale = gst_resample_nearest_float;
|
|
||||||
break;
|
|
||||||
case GST_RESAMPLE_BILINEAR:
|
|
||||||
r->scale = gst_resample_bilinear_float;
|
|
||||||
break;
|
|
||||||
case GST_RESAMPLE_SINC_SLOW:
|
|
||||||
r->scale = gst_resample_sinc_float;
|
|
||||||
break;
|
|
||||||
case GST_RESAMPLE_SINC:
|
|
||||||
r->scale = gst_resample_sinc_ft_float;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf (stderr, "gst_resample: Unexpected format \"%d\"\n", r->format);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_close (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
if (r->buffer) {
|
|
||||||
free (r->buffer);
|
|
||||||
r->buffer = NULL;
|
|
||||||
r->buffer_len = 0;
|
|
||||||
}
|
|
||||||
if (r->hack_union.s.out_tmp) {
|
|
||||||
free (r->hack_union.s.out_tmp);
|
|
||||||
r->hack_union.s.out_tmp = NULL;
|
|
||||||
r->hack_union.s.out_tmp_len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prepare to be confused.
|
|
||||||
*
|
|
||||||
* We keep a "timebase" that is based on output samples. The zero
|
|
||||||
* of the timebase cooresponds to the next output sample that will
|
|
||||||
* be written.
|
|
||||||
*
|
|
||||||
* i_start is the "time" that corresponds to the first input sample
|
|
||||||
* in an incoming buffer. Since the output depends on input samples
|
|
||||||
* ahead in time, i_start will tend to be around halftaps.
|
|
||||||
*
|
|
||||||
* i_start_buf is the time of the first sample in the temporary
|
|
||||||
* buffer.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gst_resample_scale (gst_resample_t * r, void *i_buf, unsigned int i_size)
|
|
||||||
{
|
|
||||||
int o_size;
|
|
||||||
|
|
||||||
r->i_buf = i_buf;
|
|
||||||
|
|
||||||
r->i_samples = i_size / 2 / r->channels;
|
|
||||||
|
|
||||||
r->i_start_buf = r->i_start - r->filter_length * r->i_inc;
|
|
||||||
|
|
||||||
/* i_start is the offset (in a given output sample) that is the
|
|
||||||
* beginning of the current input buffer */
|
|
||||||
r->i_end = r->i_start + r->i_inc * r->i_samples;
|
|
||||||
|
|
||||||
r->o_samples = floor (r->i_end - r->halftaps * r->i_inc);
|
|
||||||
|
|
||||||
o_size = r->o_samples * r->channels * 2;
|
|
||||||
r->o_buf = r->get_buffer (r->priv, o_size);
|
|
||||||
|
|
||||||
if (r->verbose) {
|
|
||||||
printf ("gst_resample_scale: i_buf=%p i_size=%d\n", i_buf, i_size);
|
|
||||||
printf ("gst_resample_scale: i_samples=%d o_samples=%d i_inc=%g o_buf=%p\n",
|
|
||||||
r->i_samples, r->o_samples, r->i_inc, r->o_buf);
|
|
||||||
printf ("gst_resample_scale: i_start=%g i_end=%g o_start=%g\n",
|
|
||||||
r->i_start, r->i_end, r->o_start);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((r->filter_length + r->i_samples) * sizeof (double) * 2 > r->buffer_len) {
|
|
||||||
int size = (r->filter_length + r->i_samples) * sizeof (double) * 2;
|
|
||||||
|
|
||||||
if (r->verbose) {
|
|
||||||
printf ("gst_resample temp buffer size=%d\n", size);
|
|
||||||
}
|
|
||||||
if (r->buffer)
|
|
||||||
free (r->buffer);
|
|
||||||
r->buffer_len = size;
|
|
||||||
r->buffer = malloc (size);
|
|
||||||
memset (r->buffer, 0, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r->format == GST_RESAMPLE_S16) {
|
|
||||||
if (r->channels == 2) {
|
|
||||||
conv_double_short (r->buffer + r->filter_length * sizeof (double) * 2,
|
|
||||||
r->i_buf, r->i_samples * 2);
|
|
||||||
} else {
|
|
||||||
conv_double_short_dstr (r->buffer +
|
|
||||||
r->filter_length * sizeof (double) * 2, r->i_buf, r->i_samples,
|
|
||||||
sizeof (double) * 2);
|
|
||||||
}
|
|
||||||
} else if (r->format == GST_RESAMPLE_FLOAT) {
|
|
||||||
if (r->channels == 2) {
|
|
||||||
conv_double_float (r->buffer + r->filter_length * sizeof (double) * 2,
|
|
||||||
r->i_buf, r->i_samples * 2);
|
|
||||||
} else {
|
|
||||||
conv_double_float_dstr (r->buffer +
|
|
||||||
r->filter_length * sizeof (double) * 2, r->i_buf, r->i_samples,
|
|
||||||
sizeof (double) * 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
r->scale (r);
|
|
||||||
|
|
||||||
memcpy (r->buffer,
|
|
||||||
r->buffer + r->i_samples * sizeof (double) * 2,
|
|
||||||
r->filter_length * sizeof (double) * 2);
|
|
||||||
|
|
||||||
/* updating times */
|
|
||||||
r->i_start += r->i_samples * r->i_inc;
|
|
||||||
r->o_start += r->o_samples * r->o_inc - r->i_samples;
|
|
||||||
|
|
||||||
/* adjusting timebase zero */
|
|
||||||
r->i_start -= r->o_samples;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_nearest_s16 (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
signed short *i_ptr, *o_ptr;
|
|
||||||
int i_count = 0;
|
|
||||||
double a;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
i_ptr = (signed short *) r->i_buf;
|
|
||||||
o_ptr = (signed short *) r->o_buf;
|
|
||||||
|
|
||||||
a = r->o_start;
|
|
||||||
i_count = 0;
|
|
||||||
#define SCALE_LOOP(COPY,INC) \
|
|
||||||
for (i = 0; i < r->o_samples; i++) { \
|
|
||||||
COPY; \
|
|
||||||
a += r->o_inc; \
|
|
||||||
while (a >= 1) { \
|
|
||||||
a -= 1; \
|
|
||||||
i_ptr+=INC; \
|
|
||||||
i_count++; \
|
|
||||||
} \
|
|
||||||
o_ptr+=INC; \
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (r->channels) {
|
|
||||||
case 1:
|
|
||||||
SCALE_LOOP (o_ptr[0] = i_ptr[0], 1);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
SCALE_LOOP (o_ptr[0] = i_ptr[0];
|
|
||||||
o_ptr[1] = i_ptr[1], 2);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
int n, n_chan = r->channels;
|
|
||||||
|
|
||||||
SCALE_LOOP (for (n = 0; n < n_chan; n++) o_ptr[n] = i_ptr[n], n_chan);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i_count != r->i_samples) {
|
|
||||||
printf ("handled %d in samples (expected %d)\n", i_count, r->i_samples);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_bilinear_s16 (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
signed short *i_ptr, *o_ptr;
|
|
||||||
int o_count = 0;
|
|
||||||
double b;
|
|
||||||
int i;
|
|
||||||
double acc0, acc1;
|
|
||||||
|
|
||||||
i_ptr = (signed short *) r->i_buf;
|
|
||||||
o_ptr = (signed short *) r->o_buf;
|
|
||||||
|
|
||||||
acc0 = r->acc[0];
|
|
||||||
acc1 = r->acc[1];
|
|
||||||
b = r->i_start;
|
|
||||||
for (i = 0; i < r->i_samples; i++) {
|
|
||||||
b += r->i_inc;
|
|
||||||
/*printf("in %d\n",i_ptr[0]); */
|
|
||||||
if (b >= 2) {
|
|
||||||
printf ("not expecting b>=2\n");
|
|
||||||
}
|
|
||||||
if (b >= 1) {
|
|
||||||
acc0 += (1.0 - (b - r->i_inc)) * i_ptr[0];
|
|
||||||
acc1 += (1.0 - (b - r->i_inc)) * i_ptr[1];
|
|
||||||
|
|
||||||
o_ptr[0] = rint (acc0);
|
|
||||||
/*printf("out %d\n",o_ptr[0]); */
|
|
||||||
o_ptr[1] = rint (acc1);
|
|
||||||
o_ptr += 2;
|
|
||||||
o_count++;
|
|
||||||
|
|
||||||
b -= 1.0;
|
|
||||||
|
|
||||||
acc0 = b * i_ptr[0];
|
|
||||||
acc1 = b * i_ptr[1];
|
|
||||||
} else {
|
|
||||||
acc0 += i_ptr[0] * r->i_inc;
|
|
||||||
acc1 += i_ptr[1] * r->i_inc;
|
|
||||||
}
|
|
||||||
i_ptr += 2;
|
|
||||||
}
|
|
||||||
r->acc[0] = acc0;
|
|
||||||
r->acc[1] = acc1;
|
|
||||||
|
|
||||||
if (o_count != r->o_samples) {
|
|
||||||
printf ("handled %d out samples (expected %d)\n", o_count, r->o_samples);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_sinc_slow_s16 (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
signed short *i_ptr, *o_ptr;
|
|
||||||
int i, j;
|
|
||||||
double c0, c1;
|
|
||||||
double a;
|
|
||||||
int start;
|
|
||||||
double center;
|
|
||||||
double weight;
|
|
||||||
|
|
||||||
if (!r->buffer) {
|
|
||||||
int size = r->filter_length * 2 * r->channels;
|
|
||||||
|
|
||||||
printf ("gst_resample temp buffer\n");
|
|
||||||
r->buffer = malloc (size);
|
|
||||||
memset (r->buffer, 0, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
i_ptr = (signed short *) r->i_buf;
|
|
||||||
o_ptr = (signed short *) r->o_buf;
|
|
||||||
|
|
||||||
a = r->i_start;
|
|
||||||
#define GETBUF(index,chan) (((index)<0) \
|
|
||||||
? ((short *)(r->buffer))[((index)+r->filter_length)*2+(chan)] \
|
|
||||||
: i_ptr[(index)*2+(chan)])
|
|
||||||
{
|
|
||||||
double sinx, cosx, sind, cosd;
|
|
||||||
double x, d;
|
|
||||||
double t;
|
|
||||||
|
|
||||||
for (i = 0; i < r->o_samples; i++) {
|
|
||||||
start = floor (a) - r->filter_length;
|
|
||||||
center = a - r->halftaps;
|
|
||||||
x = M_PI * (start - center) * r->o_inc;
|
|
||||||
sinx = sin (M_PI * (start - center) * r->o_inc);
|
|
||||||
cosx = cos (M_PI * (start - center) * r->o_inc);
|
|
||||||
d = M_PI * r->o_inc;
|
|
||||||
sind = sin (M_PI * r->o_inc);
|
|
||||||
cosd = cos (M_PI * r->o_inc);
|
|
||||||
c0 = 0;
|
|
||||||
c1 = 0;
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
weight = (x == 0) ? 1 : (sinx / x);
|
|
||||||
/*printf("j %d sin %g cos %g\n",j,sinx,cosx); */
|
|
||||||
/*printf("j %d sin %g x %g sinc %g\n",j,sinx,x,weight); */
|
|
||||||
c0 += weight * GETBUF ((start + j), 0);
|
|
||||||
c1 += weight * GETBUF ((start + j), 1);
|
|
||||||
t = cosx * cosd - sinx * sind;
|
|
||||||
sinx = cosx * sind + sinx * cosd;
|
|
||||||
cosx = t;
|
|
||||||
x += d;
|
|
||||||
}
|
|
||||||
o_ptr[0] = rint (c0);
|
|
||||||
o_ptr[1] = rint (c1);
|
|
||||||
o_ptr += 2;
|
|
||||||
a += r->o_inc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#undef GETBUF
|
|
||||||
|
|
||||||
memcpy (r->buffer,
|
|
||||||
i_ptr + (r->i_samples - r->filter_length) * r->channels,
|
|
||||||
r->filter_length * 2 * r->channels);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* only works for channels == 2 ???? */
|
|
||||||
void
|
|
||||||
gst_resample_sinc_s16 (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
double *ptr;
|
|
||||||
signed short *o_ptr;
|
|
||||||
int i, j;
|
|
||||||
double c0, c1;
|
|
||||||
double a;
|
|
||||||
int start;
|
|
||||||
double center;
|
|
||||||
double weight;
|
|
||||||
double x0, x, d;
|
|
||||||
double scale;
|
|
||||||
|
|
||||||
ptr = (double *) r->buffer;
|
|
||||||
o_ptr = (signed short *) r->o_buf;
|
|
||||||
|
|
||||||
/* scale provides a cutoff frequency for the low
|
|
||||||
* pass filter aspects of sinc(). scale=M_PI
|
|
||||||
* will cut off at the input frequency, which is
|
|
||||||
* good for up-sampling, but will cause aliasing
|
|
||||||
* for downsampling. Downsampling needs to be
|
|
||||||
* cut off at o_rate, thus scale=M_PI*r->i_inc. */
|
|
||||||
/* actually, it needs to be M_PI*r->i_inc*r->i_inc.
|
|
||||||
* Need to research why. */
|
|
||||||
scale = M_PI * r->i_inc;
|
|
||||||
for (i = 0; i < r->o_samples; i++) {
|
|
||||||
a = r->o_start + i * r->o_inc;
|
|
||||||
start = floor (a - r->halftaps);
|
|
||||||
/*printf("%d: a=%g start=%d end=%d\n",i,a,start,start+r->filter_length-1); */
|
|
||||||
center = a;
|
|
||||||
/*x = M_PI * (start - center) * r->o_inc; */
|
|
||||||
/*d = M_PI * r->o_inc; */
|
|
||||||
/*x = (start - center) * r->o_inc; */
|
|
||||||
x0 = (start - center) * r->o_inc;
|
|
||||||
d = r->o_inc;
|
|
||||||
c0 = 0;
|
|
||||||
c1 = 0;
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
x = x0 + d * j;
|
|
||||||
weight = sinc (x * scale * r->i_inc) * scale / M_PI;
|
|
||||||
weight *= window_func (x / r->halftaps * r->i_inc);
|
|
||||||
c0 += weight * ptr[(start + j + r->filter_length) * 2 + 0];
|
|
||||||
c1 += weight * ptr[(start + j + r->filter_length) * 2 + 1];
|
|
||||||
}
|
|
||||||
o_ptr[0] = double_to_s16 (c0);
|
|
||||||
o_ptr[1] = double_to_s16 (c1);
|
|
||||||
o_ptr += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Resampling audio is best done using a sinc() filter.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* out[t] = Sum( in[t'] * sinc((t-t')/delta_t), all t')
|
|
||||||
*
|
|
||||||
* The immediate problem with this algorithm is that it involves a
|
|
||||||
* sum over an infinite number of input samples, both in the past
|
|
||||||
* and future. Note that even though sinc(x) is bounded by 1/x,
|
|
||||||
* and thus decays to 0 for large x, since sum(x,{x=0,1..,n}) diverges
|
|
||||||
* as log(n), we need to be careful about convergence. This is
|
|
||||||
* typically done by using a windowing function, which also makes
|
|
||||||
* the sum over a finite number of input samples.
|
|
||||||
*
|
|
||||||
* The next problem is computational: sinc(), and especially
|
|
||||||
* sinc() multiplied by a non-trivial windowing function is expensive
|
|
||||||
* to calculate, and also difficult to find SIMD optimizations. Since
|
|
||||||
* the time increment on input and output is different, it is not
|
|
||||||
* possible to use a FIR filter, because the taps would have to be
|
|
||||||
* recalculated for every t.
|
|
||||||
*
|
|
||||||
* To get around the expense of calculating sinc() for every point,
|
|
||||||
* we pre-calculate sinc() at a number of points, and then interpolate
|
|
||||||
* for the values we want in calculations. The interpolation method
|
|
||||||
* chosen is bi-cubic, which requires both the evalated function and
|
|
||||||
* its derivative at every pre-sampled point. Also, if the sampled
|
|
||||||
* points are spaced commensurate with the input delta_t, we notice
|
|
||||||
* that the interpolating weights are the same for every input point.
|
|
||||||
* This decreases the number of operations to 4 multiplies and 4 adds
|
|
||||||
* for each tap, regardless of the complexity of the filtering function.
|
|
||||||
*
|
|
||||||
* At this point, it is possible to rearrange the problem as the sum
|
|
||||||
* of 4 properly weghted FIR filters. Typical SIMD computation units
|
|
||||||
* are highly optimized for FIR filters, making long filter lengths
|
|
||||||
* reasonable.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static functable_t *ft;
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_sinc_ft_s16 (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
double *ptr;
|
|
||||||
signed short *o_ptr;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/*int j; */
|
|
||||||
double c0, c1;
|
|
||||||
|
|
||||||
/*double a; */
|
|
||||||
double start_f, start_x;
|
|
||||||
int start;
|
|
||||||
double center;
|
|
||||||
|
|
||||||
/*double weight; */
|
|
||||||
double x, d;
|
|
||||||
double scale;
|
|
||||||
int n = 4;
|
|
||||||
double *out_tmp;
|
|
||||||
|
|
||||||
if (r->hack_union.s.out_tmp_len < r->o_samples) {
|
|
||||||
r->hack_union.s.out_tmp = realloc (r->hack_union.s.out_tmp,
|
|
||||||
r->o_samples * 2 * sizeof (double));
|
|
||||||
r->hack_union.s.out_tmp_len = r->o_samples;
|
|
||||||
}
|
|
||||||
out_tmp = r->hack_union.s.out_tmp;
|
|
||||||
|
|
||||||
scale = r->i_inc; /* cutoff at 22050 */
|
|
||||||
/*scale = 1.0; // cutoff at 24000 */
|
|
||||||
/*scale = r->i_inc * 0.5; // cutoff at 11025 */
|
|
||||||
|
|
||||||
if (!ft) {
|
|
||||||
ft = malloc (sizeof (*ft));
|
|
||||||
memset (ft, 0, sizeof (*ft));
|
|
||||||
|
|
||||||
ft->len = (r->filter_length + 2) * n;
|
|
||||||
ft->offset = 1.0 / n;
|
|
||||||
ft->start = -ft->len * 0.5 * ft->offset;
|
|
||||||
|
|
||||||
ft->func_x = functable_sinc;
|
|
||||||
ft->func_dx = functable_dsinc;
|
|
||||||
ft->scale = M_PI * scale;
|
|
||||||
|
|
||||||
ft->func2_x = functable_window_std;
|
|
||||||
ft->func2_dx = functable_window_dstd;
|
|
||||||
ft->scale2 = 1.0 / r->halftaps;
|
|
||||||
|
|
||||||
functable_init (ft);
|
|
||||||
|
|
||||||
/*printf("len=%d offset=%g start=%g\n",ft->len,ft->offset,ft->start); */
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = r->buffer;
|
|
||||||
o_ptr = (signed short *) r->o_buf;
|
|
||||||
|
|
||||||
center = r->o_start;
|
|
||||||
while (center - r->halftaps < -1 * r->filter_length)
|
|
||||||
center += 1.0;
|
|
||||||
start_x = center - r->halftaps;
|
|
||||||
start_f = floor (start_x);
|
|
||||||
start_x -= start_f;
|
|
||||||
start = start_f;
|
|
||||||
for (i = 0; i < r->o_samples; i++) {
|
|
||||||
/*start_f = floor(center - r->halftaps); */
|
|
||||||
/*printf("%d: a=%g start=%d end=%d\n",i,a,start,start+r->filter_length-1); */
|
|
||||||
x = start_f - center;
|
|
||||||
d = 1;
|
|
||||||
c0 = 0;
|
|
||||||
c1 = 0;
|
|
||||||
/*#define slow */
|
|
||||||
#ifdef slow
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
weight = functable_eval (ft, x) * scale;
|
|
||||||
/*weight = sinc(M_PI * scale * x)*scale*r->i_inc; */
|
|
||||||
/*weight *= window_func(x / r->halftaps); */
|
|
||||||
c0 += weight * ptr[(start + j + r->filter_length) * 2 + 0];
|
|
||||||
c1 += weight * ptr[(start + j + r->filter_length) * 2 + 1];
|
|
||||||
x += d;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
functable_fir2 (ft,
|
|
||||||
&c0, &c1, x, n, ptr + (start + r->filter_length) * 2, r->filter_length);
|
|
||||||
c0 *= scale;
|
|
||||||
c1 *= scale;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
out_tmp[2 * i + 0] = c0;
|
|
||||||
out_tmp[2 * i + 1] = c1;
|
|
||||||
center += r->o_inc;
|
|
||||||
start_x += r->o_inc;
|
|
||||||
while (start_x >= 1.0) {
|
|
||||||
start_f++;
|
|
||||||
start_x -= 1.0;
|
|
||||||
start++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r->channels == 2) {
|
|
||||||
conv_short_double (r->o_buf, out_tmp, 2 * r->o_samples);
|
|
||||||
} else {
|
|
||||||
conv_short_double_sstr (r->o_buf, out_tmp, r->o_samples,
|
|
||||||
2 * sizeof (double));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/********
|
|
||||||
** float code below
|
|
||||||
********/
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_nearest_float (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
float *i_ptr, *o_ptr;
|
|
||||||
int i_count = 0;
|
|
||||||
double a;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
i_ptr = (float *) r->i_buf;
|
|
||||||
o_ptr = (float *) r->o_buf;
|
|
||||||
|
|
||||||
a = r->o_start;
|
|
||||||
i_count = 0;
|
|
||||||
#define SCALE_LOOP(COPY,INC) \
|
|
||||||
for (i = 0; i < r->o_samples; i++) { \
|
|
||||||
COPY; \
|
|
||||||
a += r->o_inc; \
|
|
||||||
while (a >= 1) { \
|
|
||||||
a -= 1; \
|
|
||||||
i_ptr+=INC; \
|
|
||||||
i_count++; \
|
|
||||||
} \
|
|
||||||
o_ptr+=INC; \
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (r->channels) {
|
|
||||||
case 1:
|
|
||||||
SCALE_LOOP (o_ptr[0] = i_ptr[0], 1);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
SCALE_LOOP (o_ptr[0] = i_ptr[0];
|
|
||||||
o_ptr[1] = i_ptr[1], 2);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
int n, n_chan = r->channels;
|
|
||||||
|
|
||||||
SCALE_LOOP (for (n = 0; n < n_chan; n++) o_ptr[n] = i_ptr[n], n_chan);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i_count != r->i_samples) {
|
|
||||||
printf ("handled %d in samples (expected %d)\n", i_count, r->i_samples);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_bilinear_float (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
float *i_ptr, *o_ptr;
|
|
||||||
int o_count = 0;
|
|
||||||
double b;
|
|
||||||
int i;
|
|
||||||
double acc0, acc1;
|
|
||||||
|
|
||||||
i_ptr = (float *) r->i_buf;
|
|
||||||
o_ptr = (float *) r->o_buf;
|
|
||||||
|
|
||||||
acc0 = r->acc[0];
|
|
||||||
acc1 = r->acc[1];
|
|
||||||
b = r->i_start;
|
|
||||||
for (i = 0; i < r->i_samples; i++) {
|
|
||||||
b += r->i_inc;
|
|
||||||
/*printf("in %d\n",i_ptr[0]); */
|
|
||||||
if (b >= 2) {
|
|
||||||
printf ("not expecting b>=2\n");
|
|
||||||
}
|
|
||||||
if (b >= 1) {
|
|
||||||
acc0 += (1.0 - (b - r->i_inc)) * i_ptr[0];
|
|
||||||
acc1 += (1.0 - (b - r->i_inc)) * i_ptr[1];
|
|
||||||
|
|
||||||
o_ptr[0] = acc0;
|
|
||||||
/*printf("out %d\n",o_ptr[0]); */
|
|
||||||
o_ptr[1] = acc1;
|
|
||||||
o_ptr += 2;
|
|
||||||
o_count++;
|
|
||||||
|
|
||||||
b -= 1.0;
|
|
||||||
|
|
||||||
acc0 = b * i_ptr[0];
|
|
||||||
acc1 = b * i_ptr[1];
|
|
||||||
} else {
|
|
||||||
acc0 += i_ptr[0] * r->i_inc;
|
|
||||||
acc1 += i_ptr[1] * r->i_inc;
|
|
||||||
}
|
|
||||||
i_ptr += 2;
|
|
||||||
}
|
|
||||||
r->acc[0] = acc0;
|
|
||||||
r->acc[1] = acc1;
|
|
||||||
|
|
||||||
if (o_count != r->o_samples) {
|
|
||||||
printf ("handled %d out samples (expected %d)\n", o_count, r->o_samples);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_sinc_slow_float (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
float *i_ptr, *o_ptr;
|
|
||||||
int i, j;
|
|
||||||
double c0, c1;
|
|
||||||
double a;
|
|
||||||
int start;
|
|
||||||
double center;
|
|
||||||
double weight;
|
|
||||||
|
|
||||||
if (!r->buffer) {
|
|
||||||
int size = r->filter_length * sizeof (float) * r->channels;
|
|
||||||
|
|
||||||
printf ("gst_resample temp buffer\n");
|
|
||||||
r->buffer = malloc (size);
|
|
||||||
memset (r->buffer, 0, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
i_ptr = (float *) r->i_buf;
|
|
||||||
o_ptr = (float *) r->o_buf;
|
|
||||||
|
|
||||||
a = r->i_start;
|
|
||||||
#define GETBUF(index,chan) (((index)<0) \
|
|
||||||
? ((float *)(r->buffer))[((index)+r->filter_length)*2+(chan)] \
|
|
||||||
: i_ptr[(index)*2+(chan)])
|
|
||||||
{
|
|
||||||
double sinx, cosx, sind, cosd;
|
|
||||||
double x, d;
|
|
||||||
double t;
|
|
||||||
|
|
||||||
for (i = 0; i < r->o_samples; i++) {
|
|
||||||
start = floor (a) - r->filter_length;
|
|
||||||
center = a - r->halftaps;
|
|
||||||
x = M_PI * (start - center) * r->o_inc;
|
|
||||||
sinx = sin (M_PI * (start - center) * r->o_inc);
|
|
||||||
cosx = cos (M_PI * (start - center) * r->o_inc);
|
|
||||||
d = M_PI * r->o_inc;
|
|
||||||
sind = sin (M_PI * r->o_inc);
|
|
||||||
cosd = cos (M_PI * r->o_inc);
|
|
||||||
c0 = 0;
|
|
||||||
c1 = 0;
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
weight = (x == 0) ? 1 : (sinx / x);
|
|
||||||
/*printf("j %d sin %g cos %g\n",j,sinx,cosx); */
|
|
||||||
/*printf("j %d sin %g x %g sinc %g\n",j,sinx,x,weight); */
|
|
||||||
c0 += weight * GETBUF ((start + j), 0);
|
|
||||||
c1 += weight * GETBUF ((start + j), 1);
|
|
||||||
t = cosx * cosd - sinx * sind;
|
|
||||||
sinx = cosx * sind + sinx * cosd;
|
|
||||||
cosx = t;
|
|
||||||
x += d;
|
|
||||||
}
|
|
||||||
o_ptr[0] = c0;
|
|
||||||
o_ptr[1] = c1;
|
|
||||||
o_ptr += 2;
|
|
||||||
a += r->o_inc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#undef GETBUF
|
|
||||||
|
|
||||||
memcpy (r->buffer,
|
|
||||||
i_ptr + (r->i_samples - r->filter_length) * r->channels,
|
|
||||||
r->filter_length * sizeof (float) * r->channels);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* only works for channels == 2 ???? */
|
|
||||||
void
|
|
||||||
gst_resample_sinc_float (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
double *ptr;
|
|
||||||
float *o_ptr;
|
|
||||||
int i, j;
|
|
||||||
double c0, c1;
|
|
||||||
double a;
|
|
||||||
int start;
|
|
||||||
double center;
|
|
||||||
double weight;
|
|
||||||
double x0, x, d;
|
|
||||||
double scale;
|
|
||||||
|
|
||||||
ptr = (double *) r->buffer;
|
|
||||||
o_ptr = (float *) r->o_buf;
|
|
||||||
|
|
||||||
/* scale provides a cutoff frequency for the low
|
|
||||||
* pass filter aspects of sinc(). scale=M_PI
|
|
||||||
* will cut off at the input frequency, which is
|
|
||||||
* good for up-sampling, but will cause aliasing
|
|
||||||
* for downsampling. Downsampling needs to be
|
|
||||||
* cut off at o_rate, thus scale=M_PI*r->i_inc. */
|
|
||||||
/* actually, it needs to be M_PI*r->i_inc*r->i_inc.
|
|
||||||
* Need to research why. */
|
|
||||||
scale = M_PI * r->i_inc;
|
|
||||||
for (i = 0; i < r->o_samples; i++) {
|
|
||||||
a = r->o_start + i * r->o_inc;
|
|
||||||
start = floor (a - r->halftaps);
|
|
||||||
/*printf("%d: a=%g start=%d end=%d\n",i,a,start,start+r->filter_length-1); */
|
|
||||||
center = a;
|
|
||||||
/*x = M_PI * (start - center) * r->o_inc; */
|
|
||||||
/*d = M_PI * r->o_inc; */
|
|
||||||
/*x = (start - center) * r->o_inc; */
|
|
||||||
x0 = (start - center) * r->o_inc;
|
|
||||||
d = r->o_inc;
|
|
||||||
c0 = 0;
|
|
||||||
c1 = 0;
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
x = x0 + d * j;
|
|
||||||
weight = sinc (x * scale * r->i_inc) * scale / M_PI;
|
|
||||||
weight *= window_func (x / r->halftaps * r->i_inc);
|
|
||||||
c0 += weight * ptr[(start + j + r->filter_length) * 2 + 0];
|
|
||||||
c1 += weight * ptr[(start + j + r->filter_length) * 2 + 1];
|
|
||||||
}
|
|
||||||
o_ptr[0] = c0;
|
|
||||||
o_ptr[1] = c1;
|
|
||||||
o_ptr += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_resample_sinc_ft_float (gst_resample_t * r)
|
|
||||||
{
|
|
||||||
double *ptr;
|
|
||||||
float *o_ptr;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/*int j; */
|
|
||||||
double c0, c1;
|
|
||||||
|
|
||||||
/*double a; */
|
|
||||||
double start_f, start_x;
|
|
||||||
int start;
|
|
||||||
double center;
|
|
||||||
|
|
||||||
/*double weight; */
|
|
||||||
double x, d;
|
|
||||||
double scale;
|
|
||||||
int n = 4;
|
|
||||||
double *out_tmp;
|
|
||||||
|
|
||||||
if (r->hack_union.s.out_tmp_len < r->o_samples) {
|
|
||||||
r->hack_union.s.out_tmp = realloc (r->hack_union.s.out_tmp,
|
|
||||||
r->o_samples * 2 * sizeof (double));
|
|
||||||
r->hack_union.s.out_tmp_len = r->o_samples;
|
|
||||||
}
|
|
||||||
out_tmp = r->hack_union.s.out_tmp;
|
|
||||||
|
|
||||||
scale = r->i_inc; /* cutoff at 22050 */
|
|
||||||
/*scale = 1.0; // cutoff at 24000 */
|
|
||||||
/*scale = r->i_inc * 0.5; // cutoff at 11025 */
|
|
||||||
|
|
||||||
if (!ft) {
|
|
||||||
ft = malloc (sizeof (*ft));
|
|
||||||
memset (ft, 0, sizeof (*ft));
|
|
||||||
|
|
||||||
ft->len = (r->filter_length + 2) * n;
|
|
||||||
ft->offset = 1.0 / n;
|
|
||||||
ft->start = -ft->len * 0.5 * ft->offset;
|
|
||||||
|
|
||||||
ft->func_x = functable_sinc;
|
|
||||||
ft->func_dx = functable_dsinc;
|
|
||||||
ft->scale = M_PI * scale;
|
|
||||||
|
|
||||||
ft->func2_x = functable_window_std;
|
|
||||||
ft->func2_dx = functable_window_dstd;
|
|
||||||
ft->scale2 = 1.0 / r->halftaps;
|
|
||||||
|
|
||||||
functable_init (ft);
|
|
||||||
|
|
||||||
/*printf("len=%d offset=%g start=%g\n",ft->len,ft->offset,ft->start); */
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = r->buffer;
|
|
||||||
o_ptr = (float *) r->o_buf;
|
|
||||||
|
|
||||||
center = r->o_start;
|
|
||||||
start_x = center - r->halftaps;
|
|
||||||
start_f = floor (start_x);
|
|
||||||
start_x -= start_f;
|
|
||||||
start = start_f;
|
|
||||||
for (i = 0; i < r->o_samples; i++) {
|
|
||||||
/*start_f = floor(center - r->halftaps); */
|
|
||||||
/*printf("%d: a=%g start=%d end=%d\n",i,a,start,start+r->filter_length-1); */
|
|
||||||
x = start_f - center;
|
|
||||||
d = 1;
|
|
||||||
c0 = 0;
|
|
||||||
c1 = 0;
|
|
||||||
/*#define slow */
|
|
||||||
#ifdef slow
|
|
||||||
for (j = 0; j < r->filter_length; j++) {
|
|
||||||
weight = functable_eval (ft, x) * scale;
|
|
||||||
/*weight = sinc(M_PI * scale * x)*scale*r->i_inc; */
|
|
||||||
/*weight *= window_func(x / r->halftaps); */
|
|
||||||
c0 += weight * ptr[(start + j + r->filter_length) * 2 + 0];
|
|
||||||
c1 += weight * ptr[(start + j + r->filter_length) * 2 + 1];
|
|
||||||
x += d;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
functable_fir2 (ft,
|
|
||||||
&c0, &c1, x, n, ptr + (start + r->filter_length) * 2, r->filter_length);
|
|
||||||
c0 *= scale;
|
|
||||||
c1 *= scale;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
out_tmp[2 * i + 0] = c0;
|
|
||||||
out_tmp[2 * i + 1] = c1;
|
|
||||||
center += r->o_inc;
|
|
||||||
start_x += r->o_inc;
|
|
||||||
while (start_x >= 1.0) {
|
|
||||||
start_f++;
|
|
||||||
start_x -= 1.0;
|
|
||||||
start++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r->channels == 2) {
|
|
||||||
conv_float_double (r->o_buf, out_tmp, 2 * r->o_samples);
|
|
||||||
} else {
|
|
||||||
conv_float_double_sstr (r->o_buf, out_tmp, r->o_samples,
|
|
||||||
2 * sizeof (double));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
plugin_init (GstPlugin * plugin)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
||||||
GST_VERSION_MINOR,
|
|
||||||
"gstresample",
|
|
||||||
"Resampling routines for use in audio plugins",
|
|
||||||
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN);
|
|
|
@ -1,111 +0,0 @@
|
||||||
/* Resampling library
|
|
||||||
* Copyright (C) <2001> David Schleef <ds@schleef.org>
|
|
||||||
*
|
|
||||||
* 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 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_RESAMPLE_H__
|
|
||||||
#define __GST_RESAMPLE_H__
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
GST_RESAMPLE_NEAREST = 0,
|
|
||||||
GST_RESAMPLE_BILINEAR,
|
|
||||||
GST_RESAMPLE_SINC_SLOW,
|
|
||||||
GST_RESAMPLE_SINC,
|
|
||||||
} gst_resample_method;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
GST_RESAMPLE_S16 = 0,
|
|
||||||
GST_RESAMPLE_FLOAT
|
|
||||||
} gst_resample_format;
|
|
||||||
|
|
||||||
typedef struct gst_resample_s gst_resample_t;
|
|
||||||
|
|
||||||
struct gst_resample_s {
|
|
||||||
/* parameters */
|
|
||||||
|
|
||||||
gst_resample_method method;
|
|
||||||
int channels;
|
|
||||||
int verbose;
|
|
||||||
gst_resample_format format;
|
|
||||||
|
|
||||||
int filter_length;
|
|
||||||
|
|
||||||
double i_rate;
|
|
||||||
double o_rate;
|
|
||||||
|
|
||||||
void *priv;
|
|
||||||
|
|
||||||
void *(*get_buffer)(void *priv, unsigned int size);
|
|
||||||
|
|
||||||
/* internal parameters */
|
|
||||||
|
|
||||||
double halftaps;
|
|
||||||
|
|
||||||
/* filter state */
|
|
||||||
|
|
||||||
void *buffer;
|
|
||||||
int buffer_len;
|
|
||||||
|
|
||||||
double i_start;
|
|
||||||
double o_start;
|
|
||||||
|
|
||||||
double i_start_buf;
|
|
||||||
double i_end_buf;
|
|
||||||
|
|
||||||
double i_inc;
|
|
||||||
double o_inc;
|
|
||||||
|
|
||||||
double i_end;
|
|
||||||
double o_end;
|
|
||||||
|
|
||||||
int i_samples;
|
|
||||||
int o_samples;
|
|
||||||
|
|
||||||
void *i_buf, *o_buf;
|
|
||||||
|
|
||||||
double acc[2];
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
double *out_tmp;
|
|
||||||
int out_tmp_len;
|
|
||||||
} s;
|
|
||||||
double padding[8];
|
|
||||||
} hack_union;
|
|
||||||
|
|
||||||
/* methods */
|
|
||||||
void (*scale)(gst_resample_t *r);
|
|
||||||
|
|
||||||
double ack;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
void gst_resample_init(gst_resample_t *r);
|
|
||||||
|
|
||||||
void gst_resample_reinit(gst_resample_t *r);
|
|
||||||
|
|
||||||
void gst_resample_close (gst_resample_t * r);
|
|
||||||
|
|
||||||
void gst_resample_scale(gst_resample_t *r, void *i_buf, unsigned int size);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_RESAMPLE_H__ */
|
|
|
@ -1,156 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="resample"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D6789B}"
|
|
||||||
RootNamespace="resample"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstresample.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="resample.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/resample.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstresample.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstresample.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="resample.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstresample.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\resample.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\dtos.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\dtof.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\functable.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\resample.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\private.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,375 +0,0 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
#include <resample.h>
|
|
||||||
|
|
||||||
#define AMP 16000
|
|
||||||
#define I_RATE 48000
|
|
||||||
#define O_RATE 44100
|
|
||||||
/*#define O_RATE 24000 */
|
|
||||||
|
|
||||||
/*#define test_func(x) 1 */
|
|
||||||
/*#define test_func(x) sin(2*M_PI*(x)*10) */
|
|
||||||
/*#define test_func(x) sin(2*M_PI*(x)*(x)*1000) */
|
|
||||||
#define test_func(x) sin(2*M_PI*(x)*(x)*12000)
|
|
||||||
|
|
||||||
short i_buf[I_RATE * 2 * 2];
|
|
||||||
short o_buf[O_RATE * 2 * 2];
|
|
||||||
|
|
||||||
static int i_offset;
|
|
||||||
static int o_offset;
|
|
||||||
|
|
||||||
FILE *out;
|
|
||||||
|
|
||||||
void test_res1 (void);
|
|
||||||
void test_res2 (void);
|
|
||||||
void test_res3 (void);
|
|
||||||
void test_res4 (void);
|
|
||||||
void test_res5 (void);
|
|
||||||
void test_res6 (void);
|
|
||||||
void test_res7 (void);
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
out = fopen ("out", "w");
|
|
||||||
|
|
||||||
test_res7 ();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
get_buffer (void *priv, unsigned int size)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
ret = ((void *) o_buf) + o_offset;
|
|
||||||
o_offset += size;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct timeval start_time;
|
|
||||||
void
|
|
||||||
start_timer (void)
|
|
||||||
{
|
|
||||||
gettimeofday (&start_time, NULL);
|
|
||||||
/*printf("start %ld.%06ld\n",start_time.tv_sec,start_time.tv_usec); */
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
end_timer (void)
|
|
||||||
{
|
|
||||||
struct timeval end_time;
|
|
||||||
double diff;
|
|
||||||
|
|
||||||
gettimeofday (&end_time, NULL);
|
|
||||||
/*printf("end %ld.%06ld\n",end_time.tv_sec,end_time.tv_usec); */
|
|
||||||
diff = (end_time.tv_sec - start_time.tv_sec) +
|
|
||||||
1e-6 * (end_time.tv_usec - start_time.tv_usec);
|
|
||||||
|
|
||||||
printf ("time %g\n", diff);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_res1 (void)
|
|
||||||
{
|
|
||||||
resample_t *r;
|
|
||||||
int i;
|
|
||||||
double sum10k, sum22k;
|
|
||||||
double f;
|
|
||||||
int n10k, n22k;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (i = 0; i < I_RATE; i++) {
|
|
||||||
i_buf[i * 2 + 0] = rint (AMP * test_func ((double) i / I_RATE));
|
|
||||||
/*i_buf[i*2+1] = rint(AMP * test_func((double)i/I_RATE)); */
|
|
||||||
i_buf[i * 2 + 1] = (i < 1000) ? AMP : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = malloc (sizeof (resample_t));
|
|
||||||
memset (r, 0, sizeof (resample_t));
|
|
||||||
|
|
||||||
r->i_rate = I_RATE;
|
|
||||||
r->o_rate = O_RATE;
|
|
||||||
/*r->method = RESAMPLE_SINC_SLOW; */
|
|
||||||
r->method = RESAMPLE_SINC;
|
|
||||||
r->channels = 2;
|
|
||||||
/*r->verbose = 1; */
|
|
||||||
r->filter_length = 64;
|
|
||||||
r->get_buffer = get_buffer;
|
|
||||||
|
|
||||||
resample_init (r);
|
|
||||||
|
|
||||||
start_timer ();
|
|
||||||
#define blocked
|
|
||||||
#ifdef blocked
|
|
||||||
for (i = 0; i + 256 < I_RATE; i += 256) {
|
|
||||||
resample_scale (r, i_buf + i * 2, 256 * 2 * 2);
|
|
||||||
}
|
|
||||||
if (I_RATE - i) {
|
|
||||||
resample_scale (r, i_buf + i * 2, (I_RATE - i) * 2 * 2);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
resample_scale (r, i_buf, I_RATE * 2 * 2);
|
|
||||||
#endif
|
|
||||||
end_timer ();
|
|
||||||
|
|
||||||
for (i = 0; i < O_RATE; i++) {
|
|
||||||
f = AMP * test_func ((double) i / O_RATE);
|
|
||||||
/*f = rint(AMP*test_func((double)i/O_RATE)); */
|
|
||||||
fprintf (out, "%d %d %d %g %g\n", i,
|
|
||||||
o_buf[2 * i + 0], o_buf[2 * i + 1], f, o_buf[2 * i + 0] - f);
|
|
||||||
}
|
|
||||||
|
|
||||||
sum10k = 0;
|
|
||||||
sum22k = 0;
|
|
||||||
n10k = 0;
|
|
||||||
n22k = 0;
|
|
||||||
for (i = 0; i < O_RATE; i++) {
|
|
||||||
f = AMP * test_func ((double) i / O_RATE);
|
|
||||||
/*f = rint(AMP*test_func((double)i/O_RATE)); */
|
|
||||||
x = o_buf[2 * i + 0] - f;
|
|
||||||
if (((0.5 * i) / O_RATE * I_RATE) < 10000) {
|
|
||||||
sum10k += x * x;
|
|
||||||
n10k++;
|
|
||||||
}
|
|
||||||
if (((0.5 * i) / O_RATE * I_RATE) < 22050) {
|
|
||||||
sum22k += x * x;
|
|
||||||
n22k++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf ("average error 10k=%g 22k=%g\n",
|
|
||||||
sqrt (sum10k / n10k), sqrt (sum22k / n22k));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
test_res2 (void)
|
|
||||||
{
|
|
||||||
functable_t *t;
|
|
||||||
int i;
|
|
||||||
double x;
|
|
||||||
double f1, f2;
|
|
||||||
|
|
||||||
t = malloc (sizeof (*t));
|
|
||||||
memset (t, 0, sizeof (*t));
|
|
||||||
|
|
||||||
t->start = -50.0;
|
|
||||||
t->offset = 1;
|
|
||||||
t->len = 100;
|
|
||||||
|
|
||||||
t->func_x = functable_sinc;
|
|
||||||
t->func_dx = functable_dsinc;
|
|
||||||
|
|
||||||
functable_init (t);
|
|
||||||
|
|
||||||
for (i = 0; i < 1000; i++) {
|
|
||||||
x = -50.0 + 0.1 * i;
|
|
||||||
f1 = functable_sinc (NULL, x);
|
|
||||||
f2 = functable_eval (t, x);
|
|
||||||
fprintf (out, "%d %g %g %g\n", i, f1, f2, f1 - f2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_res3 (void)
|
|
||||||
{
|
|
||||||
functable_t *t;
|
|
||||||
int i;
|
|
||||||
double x;
|
|
||||||
double f1, f2;
|
|
||||||
int n = 1;
|
|
||||||
|
|
||||||
t = malloc (sizeof (*t));
|
|
||||||
memset (t, 0, sizeof (*t));
|
|
||||||
|
|
||||||
t->start = -50.0;
|
|
||||||
t->offset = 1.0 / n;
|
|
||||||
t->len = 100 * n;
|
|
||||||
|
|
||||||
t->func_x = functable_sinc;
|
|
||||||
t->func_dx = functable_dsinc;
|
|
||||||
|
|
||||||
t->func2_x = functable_window_std;
|
|
||||||
t->func2_dx = functable_window_dstd;
|
|
||||||
|
|
||||||
t->scale = 1.0;
|
|
||||||
t->scale2 = 1.0 / (M_PI * 16);
|
|
||||||
|
|
||||||
functable_init (t);
|
|
||||||
|
|
||||||
for (i = 0; i < 1000 * n; i++) {
|
|
||||||
x = -50.0 + 0.1 / n * i;
|
|
||||||
f1 = functable_sinc (NULL, t->scale * x) *
|
|
||||||
functable_window_std (NULL, t->scale2 * x);
|
|
||||||
f2 = functable_eval (t, x);
|
|
||||||
fprintf (out, "%d %g %g %g\n", i, f1, f2, f2 - f1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
sinc_poly (double x)
|
|
||||||
{
|
|
||||||
#define INV3FAC 1.66666666666666666e-1
|
|
||||||
#define INV5FAC 8.33333333333333333e-3
|
|
||||||
#define INV7FAC 1.984126984e-4
|
|
||||||
#define INV9FAC 2.755731922e-6
|
|
||||||
#define INV11FAC 2.505210839e-8
|
|
||||||
double x2 = x * x;
|
|
||||||
|
|
||||||
return 1 - x2 * INV3FAC + x2 * x2 * INV5FAC - x2 * x2 * x2 * INV7FAC;
|
|
||||||
/*+ x2 * x2 * x2 * x2 * INV9FAC */
|
|
||||||
/*- x2 * x2 * x2 * x2 * x2 * INV11FAC; */
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_res4 (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double x, f1, f2;
|
|
||||||
|
|
||||||
for (i = 1; i < 100; i++) {
|
|
||||||
x = 0.01 * i;
|
|
||||||
f1 = 1 - sin (x) / x;
|
|
||||||
f2 = 1 - sinc_poly (x);
|
|
||||||
|
|
||||||
fprintf (out, "%g %.20g %.20g %.20g\n", x, f1, f2, f2 - f1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
test_res5 (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double sum;
|
|
||||||
|
|
||||||
start_timer ();
|
|
||||||
sum = 0;
|
|
||||||
for (i = 0; i < I_RATE; i++) {
|
|
||||||
sum += i_buf[i * 2];
|
|
||||||
}
|
|
||||||
end_timer ();
|
|
||||||
i_buf[0] = sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
short_to_double (double *d, short *x)
|
|
||||||
{
|
|
||||||
*d = *x;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
short_to_float (float *f, short *x)
|
|
||||||
{
|
|
||||||
*f = *x;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
float_to_double (double *f, float *x)
|
|
||||||
{
|
|
||||||
*f = *x;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
double_to_short (short *f, double *x)
|
|
||||||
{
|
|
||||||
*f = *x;
|
|
||||||
}
|
|
||||||
|
|
||||||
double res6_tmp[1000];
|
|
||||||
|
|
||||||
void
|
|
||||||
test_res6 (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < I_RATE; i++) {
|
|
||||||
i_buf[i] = rint (AMP * test_func ((double) i / I_RATE));
|
|
||||||
}
|
|
||||||
|
|
||||||
conv_double_short_ref (res6_tmp, i_buf, 1000);
|
|
||||||
for (i = 0; i < 1000; i++) {
|
|
||||||
res6_tmp[i] *= 3.0;
|
|
||||||
}
|
|
||||||
conv_short_double_ppcasm (o_buf, res6_tmp, 1000);
|
|
||||||
|
|
||||||
for (i = 0; i < 1000; i++) {
|
|
||||||
fprintf (out, "%d %d %g %d\n", i, i_buf[i], res6_tmp[i], o_buf[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_res7 (void)
|
|
||||||
{
|
|
||||||
resample_t *r;
|
|
||||||
int i;
|
|
||||||
double sum10k, sum22k;
|
|
||||||
double f;
|
|
||||||
int n10k, n22k;
|
|
||||||
double x;
|
|
||||||
|
|
||||||
for (i = 0; i < I_RATE; i++) {
|
|
||||||
i_buf[i] = rint (AMP * test_func ((double) i / I_RATE));
|
|
||||||
}
|
|
||||||
|
|
||||||
r = malloc (sizeof (resample_t));
|
|
||||||
memset (r, 0, sizeof (resample_t));
|
|
||||||
|
|
||||||
r->i_rate = I_RATE;
|
|
||||||
r->o_rate = O_RATE;
|
|
||||||
/*r->method = RESAMPLE_SINC_SLOW; */
|
|
||||||
r->method = RESAMPLE_SINC;
|
|
||||||
r->channels = 1;
|
|
||||||
/*r->verbose = 1; */
|
|
||||||
r->filter_length = 64;
|
|
||||||
r->get_buffer = get_buffer;
|
|
||||||
|
|
||||||
resample_init (r);
|
|
||||||
|
|
||||||
start_timer ();
|
|
||||||
#define blocked
|
|
||||||
#ifdef blocked
|
|
||||||
for (i = 0; i + 256 < I_RATE; i += 256) {
|
|
||||||
resample_scale (r, i_buf + i, 256 * 2);
|
|
||||||
}
|
|
||||||
if (I_RATE - i) {
|
|
||||||
resample_scale (r, i_buf + i, (I_RATE - i) * 2);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
resample_scale (r, i_buf, I_RATE * 2);
|
|
||||||
#endif
|
|
||||||
end_timer ();
|
|
||||||
|
|
||||||
for (i = 0; i < O_RATE; i++) {
|
|
||||||
f = AMP * test_func ((double) i / O_RATE);
|
|
||||||
/*f = rint(AMP*test_func((double)i/O_RATE)); */
|
|
||||||
fprintf (out, "%d %d %d %g %g\n", i, o_buf[i], 0, f, o_buf[i] - f);
|
|
||||||
}
|
|
||||||
|
|
||||||
sum10k = 0;
|
|
||||||
sum22k = 0;
|
|
||||||
n10k = 0;
|
|
||||||
n22k = 0;
|
|
||||||
for (i = 0; i < O_RATE; i++) {
|
|
||||||
f = AMP * test_func ((double) i / O_RATE);
|
|
||||||
/*f = rint(AMP*test_func((double)i/O_RATE)); */
|
|
||||||
x = o_buf[i] - f;
|
|
||||||
if (((0.5 * i) / O_RATE * I_RATE) < 10000) {
|
|
||||||
sum10k += x * x;
|
|
||||||
n10k++;
|
|
||||||
}
|
|
||||||
if (((0.5 * i) / O_RATE * I_RATE) < 22050) {
|
|
||||||
sum22k += x * x;
|
|
||||||
n22k++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf ("average error 10k=%g 22k=%g\n",
|
|
||||||
sqrt (sum10k / n10k), sqrt (sum22k / n22k));
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
plugin_LTLIBRARIES = libgstriff.la
|
|
||||||
|
|
||||||
libgstriff_la_SOURCES = \
|
|
||||||
riff.c \
|
|
||||||
riff-media.c \
|
|
||||||
riff-read.c
|
|
||||||
|
|
||||||
libgstriffincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/riff
|
|
||||||
libgstriffinclude_HEADERS = \
|
|
||||||
riff-ids.h \
|
|
||||||
riff-media.h \
|
|
||||||
riff-read.h
|
|
||||||
|
|
||||||
libgstriff_la_LIBADD =
|
|
||||||
libgstriff_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
libgstriff_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
|
|
@ -1,335 +0,0 @@
|
||||||
/* GStreamer RIFF I/O
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* riff-ids.h: RIFF IDs and structs
|
|
||||||
*
|
|
||||||
* 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_RIFF_IDS_H__
|
|
||||||
#define __GST_RIFF_IDS_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
/* RIFF types */
|
|
||||||
#define GST_RIFF_RIFF_WAVE GST_MAKE_FOURCC ('W','A','V','E')
|
|
||||||
#define GST_RIFF_RIFF_AVI GST_MAKE_FOURCC ('A','V','I',' ')
|
|
||||||
#define GST_RIFF_RIFF_CDXA GST_MAKE_FOURCC ('C','D','X','A')
|
|
||||||
|
|
||||||
/* tags */
|
|
||||||
#define GST_RIFF_TAG_RIFF GST_MAKE_FOURCC ('R','I','F','F')
|
|
||||||
#define GST_RIFF_TAG_RIFX GST_MAKE_FOURCC ('R','I','F','X')
|
|
||||||
#define GST_RIFF_TAG_LIST GST_MAKE_FOURCC ('L','I','S','T')
|
|
||||||
#define GST_RIFF_TAG_avih GST_MAKE_FOURCC ('a','v','i','h')
|
|
||||||
#define GST_RIFF_TAG_strd GST_MAKE_FOURCC ('s','t','r','d')
|
|
||||||
#define GST_RIFF_TAG_strn GST_MAKE_FOURCC ('s','t','r','n')
|
|
||||||
#define GST_RIFF_TAG_strh GST_MAKE_FOURCC ('s','t','r','h')
|
|
||||||
#define GST_RIFF_TAG_strf GST_MAKE_FOURCC ('s','t','r','f')
|
|
||||||
#define GST_RIFF_TAG_vedt GST_MAKE_FOURCC ('v','e','d','t')
|
|
||||||
#define GST_RIFF_TAG_JUNK GST_MAKE_FOURCC ('J','U','N','K')
|
|
||||||
#define GST_RIFF_TAG_idx1 GST_MAKE_FOURCC ('i','d','x','1')
|
|
||||||
#define GST_RIFF_TAG_dmlh GST_MAKE_FOURCC ('d','m','l','h')
|
|
||||||
/* WAV stuff */
|
|
||||||
#define GST_RIFF_TAG_fmt GST_MAKE_FOURCC ('f','m','t',' ')
|
|
||||||
#define GST_RIFF_TAG_data GST_MAKE_FOURCC ('d','a','t','a')
|
|
||||||
#define GST_RIFF_TAG_plst GST_MAKE_FOURCC ('p','l','s','t')
|
|
||||||
#define GST_RIFF_TAG_cue GST_MAKE_FOURCC ('c','u','e',' ')
|
|
||||||
/* LIST types */
|
|
||||||
#define GST_RIFF_LIST_movi GST_MAKE_FOURCC ('m','o','v','i')
|
|
||||||
#define GST_RIFF_LIST_hdrl GST_MAKE_FOURCC ('h','d','r','l')
|
|
||||||
#define GST_RIFF_LIST_odml GST_MAKE_FOURCC ('o','d','m','l')
|
|
||||||
#define GST_RIFF_LIST_strl GST_MAKE_FOURCC ('s','t','r','l')
|
|
||||||
#define GST_RIFF_LIST_INFO GST_MAKE_FOURCC ('I','N','F','O')
|
|
||||||
#define GST_RIFF_LIST_AVIX GST_MAKE_FOURCC ('A','V','I','X')
|
|
||||||
#define GST_RIFF_LIST_adtl GST_MAKE_FOURCC ('a','d','t','l')
|
|
||||||
|
|
||||||
/* fcc types */
|
|
||||||
#define GST_RIFF_FCC_vids GST_MAKE_FOURCC ('v','i','d','s')
|
|
||||||
#define GST_RIFF_FCC_auds GST_MAKE_FOURCC ('a','u','d','s')
|
|
||||||
#define GST_RIFF_FCC_pads GST_MAKE_FOURCC ('p','a','d','s')
|
|
||||||
#define GST_RIFF_FCC_txts GST_MAKE_FOURCC ('t','x','t','s')
|
|
||||||
#define GST_RIFF_FCC_vidc GST_MAKE_FOURCC ('v','i','d','c')
|
|
||||||
#define GST_RIFF_FCC_iavs GST_MAKE_FOURCC ('i','a','v','s')
|
|
||||||
/* fcc handlers */
|
|
||||||
#define GST_RIFF_FCCH_RLE GST_MAKE_FOURCC ('R','L','E',' ')
|
|
||||||
#define GST_RIFF_FCCH_msvc GST_MAKE_FOURCC ('m','s','v','c')
|
|
||||||
#define GST_RIFF_FCCH_MSVC GST_MAKE_FOURCC ('M','S','V','C')
|
|
||||||
|
|
||||||
/* INFO types - see http://www.saettler.com/RIFFMCI/riffmci.html */
|
|
||||||
#define GST_RIFF_INFO_IARL GST_MAKE_FOURCC ('I','A','R','L') /* location */
|
|
||||||
#define GST_RIFF_INFO_IART GST_MAKE_FOURCC ('I','A','R','T') /* artist */
|
|
||||||
#define GST_RIFF_INFO_ICMS GST_MAKE_FOURCC ('I','C','M','S') /* commissioned */
|
|
||||||
#define GST_RIFF_INFO_ICMT GST_MAKE_FOURCC ('I','C','M','T') /* comment */
|
|
||||||
#define GST_RIFF_INFO_ICOP GST_MAKE_FOURCC ('I','C','O','P') /* copyright */
|
|
||||||
#define GST_RIFF_INFO_ICRD GST_MAKE_FOURCC ('I','C','R','D') /* creation date */
|
|
||||||
#define GST_RIFF_INFO_ICRP GST_MAKE_FOURCC ('I','C','R','P') /* cropped */
|
|
||||||
#define GST_RIFF_INFO_IDIM GST_MAKE_FOURCC ('I','D','I','M') /* dimensions */
|
|
||||||
#define GST_RIFF_INFO_IDPI GST_MAKE_FOURCC ('I','D','P','I') /* dots-per-inch */
|
|
||||||
#define GST_RIFF_INFO_IENG GST_MAKE_FOURCC ('I','E','N','G') /* engineer(s) */
|
|
||||||
#define GST_RIFF_INFO_IGNR GST_MAKE_FOURCC ('I','G','N','R') /* genre */
|
|
||||||
#define GST_RIFF_INFO_IKEY GST_MAKE_FOURCC ('I','K','E','Y') /* keywords */
|
|
||||||
#define GST_RIFF_INFO_ILGT GST_MAKE_FOURCC ('I','L','G','T') /* lightness */
|
|
||||||
#define GST_RIFF_INFO_IMED GST_MAKE_FOURCC ('I','M','E','D') /* medium */
|
|
||||||
#define GST_RIFF_INFO_INAM GST_MAKE_FOURCC ('I','N','A','M') /* name */
|
|
||||||
#define GST_RIFF_INFO_IPLT GST_MAKE_FOURCC ('I','P','L','T') /* palette setting */
|
|
||||||
#define GST_RIFF_INFO_IPRD GST_MAKE_FOURCC ('I','P','R','D') /* product */
|
|
||||||
#define GST_RIFF_INFO_ISBJ GST_MAKE_FOURCC ('I','S','B','J') /* subject */
|
|
||||||
#define GST_RIFF_INFO_ISFT GST_MAKE_FOURCC ('I','S','F','T') /* software */
|
|
||||||
#define GST_RIFF_INFO_ISHP GST_MAKE_FOURCC ('I','S','H','P') /* sharpness */
|
|
||||||
#define GST_RIFF_INFO_ISRC GST_MAKE_FOURCC ('I','S','R','C') /* source */
|
|
||||||
#define GST_RIFF_INFO_ISRF GST_MAKE_FOURCC ('I','S','R','F') /* source form */
|
|
||||||
#define GST_RIFF_INFO_ITCH GST_MAKE_FOURCC ('I','T','C','H') /* technician(s) */
|
|
||||||
|
|
||||||
/*********Chunk Names***************/
|
|
||||||
#define GST_RIFF_FF00 GST_MAKE_FOURCC (0xFF,0xFF,0x00,0x00)
|
|
||||||
#define GST_RIFF_00 GST_MAKE_FOURCC ('0', '0',0x00,0x00)
|
|
||||||
#define GST_RIFF_01 GST_MAKE_FOURCC ('0', '1',0x00,0x00)
|
|
||||||
#define GST_RIFF_02 GST_MAKE_FOURCC ('0', '2',0x00,0x00)
|
|
||||||
#define GST_RIFF_03 GST_MAKE_FOURCC ('0', '3',0x00,0x00)
|
|
||||||
#define GST_RIFF_04 GST_MAKE_FOURCC ('0', '4',0x00,0x00)
|
|
||||||
#define GST_RIFF_05 GST_MAKE_FOURCC ('0', '5',0x00,0x00)
|
|
||||||
#define GST_RIFF_06 GST_MAKE_FOURCC ('0', '6',0x00,0x00)
|
|
||||||
#define GST_RIFF_07 GST_MAKE_FOURCC ('0', '7',0x00,0x00)
|
|
||||||
#define GST_RIFF_00pc GST_MAKE_FOURCC ('0', '0', 'p', 'c')
|
|
||||||
#define GST_RIFF_01pc GST_MAKE_FOURCC ('0', '1', 'p', 'c')
|
|
||||||
#define GST_RIFF_00dc GST_MAKE_FOURCC ('0', '0', 'd', 'c')
|
|
||||||
#define GST_RIFF_00dx GST_MAKE_FOURCC ('0', '0', 'd', 'x')
|
|
||||||
#define GST_RIFF_00db GST_MAKE_FOURCC ('0', '0', 'd', 'b')
|
|
||||||
#define GST_RIFF_00xx GST_MAKE_FOURCC ('0', '0', 'x', 'x')
|
|
||||||
#define GST_RIFF_00id GST_MAKE_FOURCC ('0', '0', 'i', 'd')
|
|
||||||
#define GST_RIFF_00rt GST_MAKE_FOURCC ('0', '0', 'r', 't')
|
|
||||||
#define GST_RIFF_0021 GST_MAKE_FOURCC ('0', '0', '2', '1')
|
|
||||||
#define GST_RIFF_00iv GST_MAKE_FOURCC ('0', '0', 'i', 'v')
|
|
||||||
#define GST_RIFF_0031 GST_MAKE_FOURCC ('0', '0', '3', '1')
|
|
||||||
#define GST_RIFF_0032 GST_MAKE_FOURCC ('0', '0', '3', '2')
|
|
||||||
#define GST_RIFF_00vc GST_MAKE_FOURCC ('0', '0', 'v', 'c')
|
|
||||||
#define GST_RIFF_00xm GST_MAKE_FOURCC ('0', '0', 'x', 'm')
|
|
||||||
#define GST_RIFF_01wb GST_MAKE_FOURCC ('0', '1', 'w', 'b')
|
|
||||||
#define GST_RIFF_01dc GST_MAKE_FOURCC ('0', '1', 'd', 'c')
|
|
||||||
#define GST_RIFF_00__ GST_MAKE_FOURCC ('0', '0', '_', '_')
|
|
||||||
|
|
||||||
/*********VIDEO CODECS**************/
|
|
||||||
#define GST_RIFF_cram GST_MAKE_FOURCC ('c', 'r', 'a', 'm')
|
|
||||||
#define GST_RIFF_CRAM GST_MAKE_FOURCC ('C', 'R', 'A', 'M')
|
|
||||||
#define GST_RIFF_wham GST_MAKE_FOURCC ('w', 'h', 'a', 'm')
|
|
||||||
#define GST_RIFF_WHAM GST_MAKE_FOURCC ('W', 'H', 'A', 'M')
|
|
||||||
#define GST_RIFF_rgb GST_MAKE_FOURCC (0x00,0x00,0x00,0x00)
|
|
||||||
#define GST_RIFF_RGB GST_MAKE_FOURCC ('R', 'G', 'B', ' ')
|
|
||||||
#define GST_RIFF_rle8 GST_MAKE_FOURCC (0x01,0x00,0x00,0x00)
|
|
||||||
#define GST_RIFF_RLE8 GST_MAKE_FOURCC ('R', 'L', 'E', '8')
|
|
||||||
#define GST_RIFF_rle4 GST_MAKE_FOURCC (0x02,0x00,0x00,0x00)
|
|
||||||
#define GST_RIFF_RLE4 GST_MAKE_FOURCC ('R', 'L', 'E', '4')
|
|
||||||
#define GST_RIFF_none GST_MAKE_FOURCC (0x00,0x00,0xFF,0xFF)
|
|
||||||
#define GST_RIFF_NONE GST_MAKE_FOURCC ('N', 'O', 'N', 'E')
|
|
||||||
#define GST_RIFF_pack GST_MAKE_FOURCC (0x01,0x00,0xFF,0xFF)
|
|
||||||
#define GST_RIFF_PACK GST_MAKE_FOURCC ('P', 'A', 'C', 'K')
|
|
||||||
#define GST_RIFF_tran GST_MAKE_FOURCC (0x02,0x00,0xFF,0xFF)
|
|
||||||
#define GST_RIFF_TRAN GST_MAKE_FOURCC ('T', 'R', 'A', 'N')
|
|
||||||
#define GST_RIFF_ccc GST_MAKE_FOURCC (0x03,0x00,0xFF,0xFF)
|
|
||||||
#define GST_RIFF_CCC GST_MAKE_FOURCC ('C', 'C', 'C', ' ')
|
|
||||||
#define GST_RIFF_cyuv GST_MAKE_FOURCC ('c', 'y', 'u', 'v')
|
|
||||||
#define GST_RIFF_CYUV GST_MAKE_FOURCC ('C', 'Y', 'U', 'V')
|
|
||||||
#define GST_RIFF_jpeg GST_MAKE_FOURCC (0x04,0x00,0xFF,0xFF)
|
|
||||||
#define GST_RIFF_JPEG GST_MAKE_FOURCC ('J', 'P', 'E', 'G')
|
|
||||||
#define GST_RIFF_MJPG GST_MAKE_FOURCC ('M', 'J', 'P', 'G')
|
|
||||||
#define GST_RIFF_mJPG GST_MAKE_FOURCC ('m', 'J', 'P', 'G')
|
|
||||||
#define GST_RIFF_IJPG GST_MAKE_FOURCC ('I', 'J', 'P', 'G')
|
|
||||||
#define GST_RIFF_rt21 GST_MAKE_FOURCC ('r', 't', '2', '1')
|
|
||||||
#define GST_RIFF_RT21 GST_MAKE_FOURCC ('R', 'T', '2', '1')
|
|
||||||
#define GST_RIFF_iv31 GST_MAKE_FOURCC ('i', 'v', '3', '1')
|
|
||||||
#define GST_RIFF_IV31 GST_MAKE_FOURCC ('I', 'V', '3', '1')
|
|
||||||
#define GST_RIFF_iv32 GST_MAKE_FOURCC ('i', 'v', '3', '2')
|
|
||||||
#define GST_RIFF_IV32 GST_MAKE_FOURCC ('I', 'V', '3', '2')
|
|
||||||
#define GST_RIFF_iv41 GST_MAKE_FOURCC ('i', 'v', '4', '1')
|
|
||||||
#define GST_RIFF_IV41 GST_MAKE_FOURCC ('I', 'V', '4', '1')
|
|
||||||
#define GST_RIFF_iv50 GST_MAKE_FOURCC ('i', 'v', '5', '0')
|
|
||||||
#define GST_RIFF_IV50 GST_MAKE_FOURCC ('I', 'V', '5', '0')
|
|
||||||
#define GST_RIFF_cvid GST_MAKE_FOURCC ('c', 'v', 'i', 'd')
|
|
||||||
#define GST_RIFF_CVID GST_MAKE_FOURCC ('C', 'V', 'I', 'D')
|
|
||||||
#define GST_RIFF_ULTI GST_MAKE_FOURCC ('U', 'L', 'T', 'I')
|
|
||||||
#define GST_RIFF_ulti GST_MAKE_FOURCC ('u', 'l', 't', 'i')
|
|
||||||
#define GST_RIFF_YUV9 GST_MAKE_FOURCC ('Y', 'V', 'U', '9')
|
|
||||||
#define GST_RIFF_YVU9 GST_MAKE_FOURCC ('Y', 'U', 'V', '9')
|
|
||||||
#define GST_RIFF_XMPG GST_MAKE_FOURCC ('X', 'M', 'P', 'G')
|
|
||||||
#define GST_RIFF_xmpg GST_MAKE_FOURCC ('x', 'm', 'p', 'g')
|
|
||||||
#define GST_RIFF_VDOW GST_MAKE_FOURCC ('V', 'D', 'O', 'W')
|
|
||||||
#define GST_RIFF_MVI1 GST_MAKE_FOURCC ('M', 'V', 'I', '1')
|
|
||||||
#define GST_RIFF_v422 GST_MAKE_FOURCC ('v', '4', '2', '2')
|
|
||||||
#define GST_RIFF_V422 GST_MAKE_FOURCC ('V', '4', '2', '2')
|
|
||||||
#define GST_RIFF_mvi1 GST_MAKE_FOURCC ('m', 'v', 'i', '1')
|
|
||||||
#define GST_RIFF_MPIX GST_MAKE_FOURCC (0x04,0x00, 'i', '1') /* MotionPixels munged their id */
|
|
||||||
#define GST_RIFF_AURA GST_MAKE_FOURCC ('A', 'U', 'R', 'A')
|
|
||||||
#define GST_RIFF_DMB1 GST_MAKE_FOURCC ('D', 'M', 'B', '1')
|
|
||||||
#define GST_RIFF_dmb1 GST_MAKE_FOURCC ('d', 'm', 'b', '1')
|
|
||||||
|
|
||||||
#define GST_RIFF_BW10 GST_MAKE_FOURCC ('B', 'W', '1', '0')
|
|
||||||
#define GST_RIFF_bw10 GST_MAKE_FOURCC ('b', 'w', '1', '0')
|
|
||||||
|
|
||||||
#define GST_RIFF_yuy2 GST_MAKE_FOURCC ('y', 'u', 'y', '2')
|
|
||||||
#define GST_RIFF_YUY2 GST_MAKE_FOURCC ('Y', 'U', 'Y', '2')
|
|
||||||
#define GST_RIFF_YUV8 GST_MAKE_FOURCC ('Y', 'U', 'V', '8')
|
|
||||||
#define GST_RIFF_WINX GST_MAKE_FOURCC ('W', 'I', 'N', 'X')
|
|
||||||
#define GST_RIFF_WPY2 GST_MAKE_FOURCC ('W', 'P', 'Y', '2')
|
|
||||||
#define GST_RIFF_m263 GST_MAKE_FOURCC ('m', '2', '6', '3')
|
|
||||||
#define GST_RIFF_M263 GST_MAKE_FOURCC ('M', '2', '6', '3')
|
|
||||||
#define GST_RIFF_H263 GST_MAKE_FOURCC ('H', '2', '6', '3')
|
|
||||||
#define GST_RIFF_i263 GST_MAKE_FOURCC ('i', '2', '6', '3')
|
|
||||||
#define GST_RIFF_L263 GST_MAKE_FOURCC ('L', '2', '6', '3')
|
|
||||||
#define GST_RIFF_x263 GST_MAKE_FOURCC ('x', '2', '6', '3')
|
|
||||||
#define GST_RIFF_VSSH GST_MAKE_FOURCC ( 'V', 'S', 'S', 'H') /* H2.64 */
|
|
||||||
|
|
||||||
#define GST_RIFF_Q1_0 GST_MAKE_FOURCC ('Q', '1',0x2e, '0')
|
|
||||||
#define GST_RIFF_SFMC GST_MAKE_FOURCC ('S', 'F', 'M', 'C')
|
|
||||||
|
|
||||||
#define GST_RIFF_y41p GST_MAKE_FOURCC ('y', '4', '1', 'p')
|
|
||||||
#define GST_RIFF_Y41P GST_MAKE_FOURCC ('Y', '4', '1', 'P')
|
|
||||||
#define GST_RIFF_yv12 GST_MAKE_FOURCC ('y', 'v', '1', '2')
|
|
||||||
#define GST_RIFF_YV12 GST_MAKE_FOURCC ('Y', 'V', '1', '2')
|
|
||||||
#define GST_RIFF_vixl GST_MAKE_FOURCC ('v', 'i', 'x', 'l')
|
|
||||||
#define GST_RIFF_VIXL GST_MAKE_FOURCC ('V', 'I', 'X', 'L')
|
|
||||||
#define GST_RIFF_iyuv GST_MAKE_FOURCC ('i', 'y', 'u', 'v')
|
|
||||||
#define GST_RIFF_IYUV GST_MAKE_FOURCC ('I', 'Y', 'U', 'V')
|
|
||||||
#define GST_RIFF_i420 GST_MAKE_FOURCC ('i', '4', '2', '0')
|
|
||||||
#define GST_RIFF_I420 GST_MAKE_FOURCC ('I', '4', '2', '0')
|
|
||||||
#define GST_RIFF_vyuy GST_MAKE_FOURCC ('v', 'y', 'u', 'y')
|
|
||||||
#define GST_RIFF_VYUY GST_MAKE_FOURCC ('V', 'Y', 'U', 'Y')
|
|
||||||
|
|
||||||
#define GST_RIFF_DIV3 GST_MAKE_FOURCC ('D', 'I', 'V', '3')
|
|
||||||
|
|
||||||
#define GST_RIFF_rpza GST_MAKE_FOURCC ('r', 'p', 'z', 'a')
|
|
||||||
/* And this here's the mistakes that need to be supported */
|
|
||||||
#define GST_RIFF_azpr GST_MAKE_FOURCC ('a', 'z', 'p', 'r') /* recognize Apple's rpza mangled? */
|
|
||||||
|
|
||||||
/*********** FND in MJPG **********/
|
|
||||||
#define GST_RIFF_ISFT GST_MAKE_FOURCC ('I', 'S', 'F', 'T')
|
|
||||||
#define GST_RIFF_IDIT GST_MAKE_FOURCC ('I', 'D', 'I', 'T')
|
|
||||||
|
|
||||||
#define GST_RIFF_00AM GST_MAKE_FOURCC ('0', '0', 'A', 'M')
|
|
||||||
#define GST_RIFF_DISP GST_MAKE_FOURCC ('D', 'I', 'S', 'P')
|
|
||||||
#define GST_RIFF_ISBJ GST_MAKE_FOURCC ('I', 'S', 'B', 'J')
|
|
||||||
|
|
||||||
#define GST_RIFF_rec GST_MAKE_FOURCC ('r', 'e', 'c', ' ')
|
|
||||||
|
|
||||||
/* common data structures */
|
|
||||||
typedef struct _gst_riff_strh {
|
|
||||||
guint32 type; /* stream type */
|
|
||||||
guint32 fcc_handler; /* fcc_handler */
|
|
||||||
guint32 flags;
|
|
||||||
/* flags values */
|
|
||||||
#define GST_RIFF_STRH_DISABLED 0x000000001
|
|
||||||
#define GST_RIFF_STRH_VIDEOPALCHANGES 0x000010000
|
|
||||||
guint32 priority;
|
|
||||||
guint32 init_frames; /* initial frames (???) */
|
|
||||||
guint32 scale;
|
|
||||||
guint32 rate;
|
|
||||||
guint32 start;
|
|
||||||
guint32 length;
|
|
||||||
guint32 bufsize; /* suggested buffer size */
|
|
||||||
guint32 quality;
|
|
||||||
guint32 samplesize;
|
|
||||||
/* XXX 16 bytes ? */
|
|
||||||
} gst_riff_strh;
|
|
||||||
|
|
||||||
typedef struct _gst_riff_strf_vids { /* == BitMapInfoHeader */
|
|
||||||
guint32 size;
|
|
||||||
guint32 width;
|
|
||||||
guint32 height;
|
|
||||||
guint16 planes;
|
|
||||||
guint16 bit_cnt;
|
|
||||||
guint32 compression;
|
|
||||||
guint32 image_size;
|
|
||||||
guint32 xpels_meter;
|
|
||||||
guint32 ypels_meter;
|
|
||||||
guint32 num_colors; /* used colors */
|
|
||||||
guint32 imp_colors; /* important colors */
|
|
||||||
/* may be more for some codecs */
|
|
||||||
} gst_riff_strf_vids;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _gst_riff_strf_auds { /* == WaveHeader (?) */
|
|
||||||
guint16 format;
|
|
||||||
/**** from public Microsoft RIFF docs ******/
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_UNKNOWN (0x0000)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_PCM (0x0001)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_ADPCM (0x0002)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_IBM_CVSD (0x0005)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_ALAW (0x0006)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_MULAW (0x0007)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_OKI_ADPCM (0x0010)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_DVI_ADPCM (0x0011)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_DIGISTD (0x0015)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_DIGIFIX (0x0016)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_YAMAHA_ADPCM (0x0020)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_DSP_TRUESPEECH (0x0022)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_GSM610 (0x0031)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_MSN (0x0032)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_ITU_G721_ADPCM (0x0040)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_MPEGL12 (0x0050)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_MPEGL3 (0x0055)
|
|
||||||
#define GST_RIFF_IBM_FORMAT_MULAW (0x0101)
|
|
||||||
#define GST_RIFF_IBM_FORMAT_ALAW (0x0102)
|
|
||||||
#define GST_RIFF_IBM_FORMAT_ADPCM (0x0103)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_WMAV1 (0x0160)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_WMAV2 (0x0161)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_WMAV3 (0x0162)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_SONY_ATRAC3 (0x0270)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_A52 (0x2000)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_VORBIS1 (0x674f)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_VORBIS2 (0x6750)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_VORBIS3 (0x6751)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_VORBIS1PLUS (0x676f)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_VORBIS2PLUS (0x6770)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_VORBIS3PLUS (0x6771)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_GSM_AMR_CBR (0x7A21)
|
|
||||||
#define GST_RIFF_WAVE_FORMAT_GSM_AMR_VBR (0x7A22)
|
|
||||||
guint16 channels;
|
|
||||||
guint32 rate;
|
|
||||||
guint32 av_bps;
|
|
||||||
guint16 blockalign;
|
|
||||||
guint16 size;
|
|
||||||
} gst_riff_strf_auds;
|
|
||||||
|
|
||||||
typedef struct _gst_riff_strf_iavs {
|
|
||||||
guint32 DVAAuxSrc;
|
|
||||||
guint32 DVAAuxCtl;
|
|
||||||
guint32 DVAAuxSrc1;
|
|
||||||
guint32 DVAAuxCtl1;
|
|
||||||
guint32 DVVAuxSrc;
|
|
||||||
guint32 DVVAuxCtl;
|
|
||||||
guint32 DVReserved1;
|
|
||||||
guint32 DVReserved2;
|
|
||||||
} gst_riff_strf_iavs;
|
|
||||||
|
|
||||||
typedef struct _gst_riff_index_entry {
|
|
||||||
guint32 id;
|
|
||||||
guint32 flags;
|
|
||||||
#define GST_RIFF_IF_LIST (0x00000001L)
|
|
||||||
#define GST_RIFF_IF_KEYFRAME (0x00000010L)
|
|
||||||
#define GST_RIFF_IF_NO_TIME (0x00000100L)
|
|
||||||
#define GST_RIFF_IF_COMPUSE (0x0FFF0000L)
|
|
||||||
guint32 offset;
|
|
||||||
guint32 size;
|
|
||||||
} gst_riff_index_entry;
|
|
||||||
|
|
||||||
typedef struct _gst_riff_dmlh {
|
|
||||||
guint32 totalframes;
|
|
||||||
} gst_riff_dmlh;
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_RIFF_IDS_H__ */
|
|
|
@ -1,713 +0,0 @@
|
||||||
/* GStreamer RIFF I/O
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* riff-media.h: RIFF-id to/from caps routines
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "riff-ids.h"
|
|
||||||
#include "riff-media.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_riff_create_video_caps_with_data:
|
|
||||||
* @codec_fcc: fourCC codec for this codec.
|
|
||||||
* @strh: pointer to the strh stream header structure.
|
|
||||||
* @strf: pointer to the strf stream header structure, including any
|
|
||||||
* data that is within the range of strf.size, but excluding any
|
|
||||||
* additional data withint this chunk but outside strf.size.
|
|
||||||
* @strf_data: a #GstBuffer containing the additional data in the strf
|
|
||||||
* chunk outside reach of strf.size. Ususally a palette.
|
|
||||||
* @strd_data: a #GstBuffer containing the data in the strd stream header
|
|
||||||
* chunk. Usually codec initialization data.
|
|
||||||
* @codec_name: if given, will be filled with a human-readable codec name.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_video_caps_with_data (guint32 codec_fcc,
|
|
||||||
gst_riff_strh * strh, gst_riff_strf_vids * strf,
|
|
||||||
GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
|
|
||||||
{
|
|
||||||
GstCaps *caps = NULL;
|
|
||||||
GstBuffer *palette = NULL;
|
|
||||||
|
|
||||||
switch (codec_fcc) {
|
|
||||||
case GST_MAKE_FOURCC ('D', 'I', 'B', ' '):
|
|
||||||
caps = gst_caps_new_simple ("video/x-raw-rgb",
|
|
||||||
"bpp", G_TYPE_INT, 8,
|
|
||||||
"depth", G_TYPE_INT, 8, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL);
|
|
||||||
palette = strf_data;
|
|
||||||
strf_data = NULL;
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Palettized 8-bit RGB");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('I', '4', '2', '0'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-raw-yuv",
|
|
||||||
"format", GST_TYPE_FOURCC, codec_fcc, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Uncompressed planar YUV 4:2:0");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-raw-yuv",
|
|
||||||
"format", GST_TYPE_FOURCC, codec_fcc, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Uncompressed packed YUV 4:2:2");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('M', 'J', 'P', 'G'): /* YUY2 MJPEG */
|
|
||||||
caps = gst_caps_new_simple ("image/jpeg", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Motion JPEG");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('J', 'P', 'E', 'G'): /* generic (mostly RGB) MJPEG */
|
|
||||||
caps = gst_caps_new_simple ("image/jpeg", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("JPEG Still Image");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('P', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
|
|
||||||
case GST_MAKE_FOURCC ('V', 'I', 'X', 'L'): /* Miro/Pinnacle fourccs */
|
|
||||||
caps = gst_caps_new_simple ("image/jpeg", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Miro/Pinnacle Motion JPEG Video");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-huffyuv", NULL);
|
|
||||||
if (strf) {
|
|
||||||
gst_caps_set_simple (caps, "bpp",
|
|
||||||
G_TYPE_INT, (int) strf->bit_cnt, NULL);
|
|
||||||
}
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Huffman Lossless Codec");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('M', 'P', 'E', 'G'):
|
|
||||||
case GST_MAKE_FOURCC ('M', 'P', 'G', 'I'):
|
|
||||||
case GST_MAKE_FOURCC ('m', 'p', 'g', '1'):
|
|
||||||
case GST_MAKE_FOURCC ('M', 'P', 'G', '1'):
|
|
||||||
caps = gst_caps_new_simple ("video/mpeg",
|
|
||||||
"systemstream", G_TYPE_BOOLEAN, FALSE,
|
|
||||||
"mpegversion", G_TYPE_INT, 1, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("MPEG video");
|
|
||||||
break;
|
|
||||||
case GST_MAKE_FOURCC ('M', 'P', 'G', '2'):
|
|
||||||
case GST_MAKE_FOURCC ('m', 'p', 'g', '2'):
|
|
||||||
caps = gst_caps_new_simple ("video/mpeg",
|
|
||||||
"systemstream", G_TYPE_BOOLEAN, FALSE,
|
|
||||||
"mpegversion", G_TYPE_INT, 2, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("MPEG 2 video");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('H', '2', '6', '3'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-h263", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("ITU H.26n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('i', '2', '6', '3'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-h263", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("ITU H.263");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('L', '2', '6', '3'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-h263", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Lead H.263");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('M', '2', '6', '3'):
|
|
||||||
case GST_MAKE_FOURCC ('m', '2', '6', '3'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-h263", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Microsoft H.263");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('V', 'D', 'O', 'W'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-h263", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("VDOLive");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('V', 'I', 'V', 'O'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-h263", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Vivo H.263");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('x', '2', '6', '3'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-h263", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Xirlink H.263");
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* apparently not standard H.263...? */
|
|
||||||
case GST_MAKE_FOURCC ('I', '2', '6', '3'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-intel-h263", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Intel H.263");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('h', '2', '6', '4'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-h264", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("ITU H.264");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('V', 'S', 'S', 'H'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-h264", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("VideoSoft H.264");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('D', 'I', 'V', '3'):
|
|
||||||
case GST_MAKE_FOURCC ('d', 'i', 'v', '3'):
|
|
||||||
case GST_MAKE_FOURCC ('D', 'I', 'V', '4'):
|
|
||||||
case GST_MAKE_FOURCC ('d', 'i', 'v', '4'):
|
|
||||||
case GST_MAKE_FOURCC ('D', 'I', 'V', '5'):
|
|
||||||
case GST_MAKE_FOURCC ('d', 'i', 'v', '5'):
|
|
||||||
case GST_MAKE_FOURCC ('D', 'I', 'V', '6'):
|
|
||||||
case GST_MAKE_FOURCC ('d', 'i', 'v', '6'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-divx",
|
|
||||||
"divxversion", G_TYPE_INT, 3, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("DivX MS-MPEG-4 Version 3");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('d', 'i', 'v', 'x'):
|
|
||||||
case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-divx",
|
|
||||||
"divxversion", G_TYPE_INT, 4, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("DivX MPEG-4 Version 4");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('B', 'L', 'Z', '0'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-divx",
|
|
||||||
"divxversion", G_TYPE_INT, 4, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Blizzard DivX");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('D', 'X', '5', '0'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-divx",
|
|
||||||
"divxversion", G_TYPE_INT, 5, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("DivX MPEG-4 Version 5");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('X', 'V', 'I', 'D'):
|
|
||||||
case GST_MAKE_FOURCC ('x', 'v', 'i', 'd'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-xvid", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("XVID MPEG-4");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('M', 'P', 'G', '4'):
|
|
||||||
case GST_MAKE_FOURCC ('M', 'P', '4', 'S'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-msmpeg",
|
|
||||||
"msmpegversion", G_TYPE_INT, 41, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Microsoft MPEG-4 4.1");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('m', 'p', '4', '2'):
|
|
||||||
case GST_MAKE_FOURCC ('M', 'P', '4', '2'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-msmpeg",
|
|
||||||
"msmpegversion", G_TYPE_INT, 42, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Microsoft MPEG-4 4.2");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('m', 'p', '4', '3'):
|
|
||||||
case GST_MAKE_FOURCC ('M', 'P', '4', '3'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-msmpeg",
|
|
||||||
"msmpegversion", G_TYPE_INT, 43, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Microsoft MPEG-4 4.3");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('3', 'I', 'V', '1'):
|
|
||||||
case GST_MAKE_FOURCC ('3', 'I', 'V', '2'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-3ivx", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("3ivx");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'):
|
|
||||||
case GST_MAKE_FOURCC ('d', 'v', 's', 'd'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-dv",
|
|
||||||
"systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Generic DV");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('W', 'M', 'V', '1'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-wmv",
|
|
||||||
"wmvversion", G_TYPE_INT, 1, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Microsoft Windows Media 7 (WMV1)");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('W', 'M', 'V', '2'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-wmv",
|
|
||||||
"wmvversion", G_TYPE_INT, 2, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Microsoft Windows Media 8 (WMV2)");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('W', 'M', 'V', '3'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-wmv",
|
|
||||||
"wmvversion", G_TYPE_INT, 3, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Microsoft Windows Media 9 (WMV3)");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('c', 'v', 'i', 'd'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-cinepak", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Cinepak video");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('M', 'S', 'V', 'C'):
|
|
||||||
case GST_MAKE_FOURCC ('m', 's', 'v', 'c'):
|
|
||||||
case GST_MAKE_FOURCC ('C', 'R', 'A', 'M'):
|
|
||||||
case GST_MAKE_FOURCC ('c', 'r', 'a', 'm'):
|
|
||||||
case GST_MAKE_FOURCC ('W', 'H', 'A', 'M'):
|
|
||||||
case GST_MAKE_FOURCC ('w', 'h', 'a', 'm'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-msvideocodec",
|
|
||||||
"msvideoversion", G_TYPE_INT, 1, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("MS video v1");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('R', 'L', 'E', ' '):
|
|
||||||
case GST_MAKE_FOURCC ('m', 'r', 'l', 'e'):
|
|
||||||
case GST_MAKE_FOURCC (0x1, 0x0, 0x0, 0x0): /* why, why, why? */
|
|
||||||
caps = gst_caps_new_simple ("video/x-rle",
|
|
||||||
"layout", G_TYPE_STRING, "microsoft", NULL);
|
|
||||||
palette = strf_data;
|
|
||||||
strf_data = NULL;
|
|
||||||
if (strf) {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"depth", G_TYPE_INT, (gint) strf->bit_cnt, NULL);
|
|
||||||
} else {
|
|
||||||
gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
|
|
||||||
}
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Microsoft RLE");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('X', 'x', 'a', 'n'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-xan",
|
|
||||||
"wcversion", G_TYPE_INT, 4, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Xan Wing Commander 4");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_MAKE_FOURCC ('I', 'V', '5', '0'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-intel",
|
|
||||||
"ivversion", G_TYPE_INT, 5, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Intel Video 5");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
GST_WARNING ("Unknown video fourcc " GST_FOURCC_FORMAT,
|
|
||||||
GST_FOURCC_ARGS (codec_fcc));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strh != NULL) {
|
|
||||||
gdouble fps = 1. * strh->rate / strh->scale;
|
|
||||||
|
|
||||||
gst_caps_set_simple (caps, "framerate", G_TYPE_DOUBLE, fps, NULL);
|
|
||||||
} else {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"framerate", GST_TYPE_DOUBLE_RANGE, 0., G_MAXDOUBLE, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strf != NULL) {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"width", G_TYPE_INT, strf->width,
|
|
||||||
"height", G_TYPE_INT, strf->height, NULL);
|
|
||||||
} else {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"width", GST_TYPE_INT_RANGE, 16, 4096,
|
|
||||||
"height", GST_TYPE_INT_RANGE, 16, 4096, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* extradata */
|
|
||||||
if (strf_data || strd_data) {
|
|
||||||
gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER,
|
|
||||||
strf_data ? strf_data : strd_data, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* palette */
|
|
||||||
if (palette && GST_BUFFER_SIZE (palette) >= 256 * 4) {
|
|
||||||
GstBuffer *copy = gst_buffer_copy (palette);
|
|
||||||
|
|
||||||
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
|
||||||
gint n;
|
|
||||||
guint32 *data = (guint32 *) GST_BUFFER_DATA (copy);
|
|
||||||
|
|
||||||
/* own endianness */
|
|
||||||
for (n = 0; n < 256; n++)
|
|
||||||
data[n] = GUINT32_FROM_LE (data[n]);
|
|
||||||
#endif
|
|
||||||
gst_caps_set_simple (caps, "palette_data", GST_TYPE_BUFFER, copy, NULL);
|
|
||||||
gst_buffer_unref (copy);
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_video_caps (guint32 codec_fcc,
|
|
||||||
gst_riff_strh * strh, gst_riff_strf_vids * strf, char **codec_name)
|
|
||||||
{
|
|
||||||
return gst_riff_create_video_caps_with_data (codec_fcc,
|
|
||||||
strh, strf, NULL, NULL, codec_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_audio_caps_with_data (guint16 codec_id,
|
|
||||||
gst_riff_strh * strh, gst_riff_strf_auds * strf,
|
|
||||||
GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
|
|
||||||
{
|
|
||||||
gboolean block_align = FALSE, rate_chan = TRUE;
|
|
||||||
GstCaps *caps = NULL;
|
|
||||||
gint rate_min = 1000, rate_max = 96000;
|
|
||||||
gint channels_max = 2;
|
|
||||||
|
|
||||||
switch (codec_id) {
|
|
||||||
case GST_RIFF_WAVE_FORMAT_MPEGL3: /* mp3 */
|
|
||||||
caps = gst_caps_new_simple ("audio/mpeg",
|
|
||||||
"mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("MPEG 1 layer 3");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_WAVE_FORMAT_MPEGL12: /* mp1 or mp2 */
|
|
||||||
caps = gst_caps_new_simple ("audio/mpeg",
|
|
||||||
"mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("MPEG 1 layer 2");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_WAVE_FORMAT_PCM: /* PCM */
|
|
||||||
if (strf != NULL) {
|
|
||||||
gint ba = strf->blockalign;
|
|
||||||
gint ch = strf->channels;
|
|
||||||
gint ws = strf->size;
|
|
||||||
|
|
||||||
caps = gst_caps_new_simple ("audio/x-raw-int",
|
|
||||||
"endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
|
|
||||||
"width", G_TYPE_INT, (int) (ba * 8 / ch),
|
|
||||||
"depth", G_TYPE_INT, ws, "signed", G_TYPE_BOOLEAN, ws != 8, NULL);
|
|
||||||
} else {
|
|
||||||
caps = gst_caps_from_string ("audio/x-raw-int, "
|
|
||||||
"endianness = (int) LITTLE_ENDIAN, "
|
|
||||||
"signed = (boolean) { true, false }, "
|
|
||||||
"width = (int) { 8, 16 }, " "depth = (int) { 8, 16 }");
|
|
||||||
}
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Uncompressed PCM audio");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_WAVE_FORMAT_ADPCM:
|
|
||||||
caps = gst_caps_new_simple ("audio/x-adpcm",
|
|
||||||
"layout", G_TYPE_STRING, "microsoft", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("ADPCM audio");
|
|
||||||
block_align = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_WAVE_FORMAT_DVI_ADPCM:
|
|
||||||
caps = gst_caps_new_simple ("audio/x-adpcm",
|
|
||||||
"layout", G_TYPE_STRING, "dvi", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("DVI ADPCM audio");
|
|
||||||
block_align = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_WAVE_FORMAT_MULAW:
|
|
||||||
if (strf != NULL && strf->size != 8) {
|
|
||||||
GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
|
|
||||||
strf->size);
|
|
||||||
strf->size = 8;
|
|
||||||
strf->av_bps = 8;
|
|
||||||
strf->blockalign = strf->av_bps * strf->channels;
|
|
||||||
}
|
|
||||||
if (strf != NULL && (strf->av_bps == 0 || strf->blockalign == 0)) {
|
|
||||||
GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of mulaw audio",
|
|
||||||
strf->av_bps, strf->blockalign);
|
|
||||||
strf->av_bps = strf->size;
|
|
||||||
strf->blockalign = strf->av_bps * strf->channels;
|
|
||||||
}
|
|
||||||
caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Mulaw");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_WAVE_FORMAT_ALAW:
|
|
||||||
if (strf != NULL && strf->size != 8) {
|
|
||||||
GST_WARNING ("invalid depth (%d) of alaw audio, overwriting.",
|
|
||||||
strf->size);
|
|
||||||
strf->size = 8;
|
|
||||||
strf->av_bps = 8;
|
|
||||||
strf->blockalign = strf->av_bps * strf->channels;
|
|
||||||
}
|
|
||||||
if (strf != NULL && (strf->av_bps == 0 || strf->blockalign == 0)) {
|
|
||||||
GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of alaw audio",
|
|
||||||
strf->av_bps, strf->blockalign);
|
|
||||||
strf->av_bps = strf->size;
|
|
||||||
strf->blockalign = strf->av_bps * strf->channels;
|
|
||||||
}
|
|
||||||
caps = gst_caps_new_simple ("audio/x-alaw", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Alaw");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_WAVE_FORMAT_VORBIS1: /* ogg/vorbis mode 1 */
|
|
||||||
case GST_RIFF_WAVE_FORMAT_VORBIS2: /* ogg/vorbis mode 2 */
|
|
||||||
case GST_RIFF_WAVE_FORMAT_VORBIS3: /* ogg/vorbis mode 3 */
|
|
||||||
case GST_RIFF_WAVE_FORMAT_VORBIS1PLUS: /* ogg/vorbis mode 1+ */
|
|
||||||
case GST_RIFF_WAVE_FORMAT_VORBIS2PLUS: /* ogg/vorbis mode 2+ */
|
|
||||||
case GST_RIFF_WAVE_FORMAT_VORBIS3PLUS: /* ogg/vorbis mode 3+ */
|
|
||||||
caps = gst_caps_new_simple ("audio/x-vorbis", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Vorbis");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_WAVE_FORMAT_A52:
|
|
||||||
channels_max = 6;
|
|
||||||
caps = gst_caps_new_simple ("audio/x-ac3", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("AC3");
|
|
||||||
break;
|
|
||||||
case GST_RIFF_WAVE_FORMAT_WMAV1:
|
|
||||||
case GST_RIFF_WAVE_FORMAT_WMAV2:
|
|
||||||
case GST_RIFF_WAVE_FORMAT_WMAV3:
|
|
||||||
{
|
|
||||||
gint version = (codec_id - GST_RIFF_WAVE_FORMAT_WMAV1) + 1;
|
|
||||||
|
|
||||||
channels_max = 6;
|
|
||||||
|
|
||||||
block_align = TRUE;
|
|
||||||
|
|
||||||
caps = gst_caps_new_simple ("audio/x-wma",
|
|
||||||
"wmaversion", G_TYPE_INT, version, NULL);
|
|
||||||
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup_printf ("WMA Version %d", version);
|
|
||||||
|
|
||||||
if (strf != NULL) {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"bitrate", G_TYPE_INT, strf->av_bps * 8, NULL);
|
|
||||||
} else {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GST_RIFF_WAVE_FORMAT_SONY_ATRAC3:
|
|
||||||
caps = gst_caps_new_simple ("audio/x-vnd.sony.atrac3", NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Sony ATRAC3");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
GST_WARNING ("Unknown audio tag 0x%04x", codec_id);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strf != NULL) {
|
|
||||||
if (rate_chan) {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"rate", G_TYPE_INT, strf->rate,
|
|
||||||
"channels", G_TYPE_INT, strf->channels, NULL);
|
|
||||||
}
|
|
||||||
if (block_align) {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"block_align", G_TYPE_INT, strf->blockalign, NULL);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (rate_chan) {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"rate", GST_TYPE_INT_RANGE, rate_min, rate_max,
|
|
||||||
"channels", GST_TYPE_INT_RANGE, 1, channels_max, NULL);
|
|
||||||
}
|
|
||||||
if (block_align) {
|
|
||||||
gst_caps_set_simple (caps,
|
|
||||||
"block_align", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* extradata */
|
|
||||||
if (strf_data || strd_data) {
|
|
||||||
gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER,
|
|
||||||
strf_data ? strf_data : strd_data, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_audio_caps (guint16 codec_id,
|
|
||||||
gst_riff_strh * strh, gst_riff_strf_auds * strf, char **codec_name)
|
|
||||||
{
|
|
||||||
return gst_riff_create_audio_caps_with_data (codec_id,
|
|
||||||
strh, strf, NULL, NULL, codec_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_iavs_caps (guint32 codec_fcc,
|
|
||||||
gst_riff_strh * strh, gst_riff_strf_iavs * strf, char **codec_name)
|
|
||||||
{
|
|
||||||
GstCaps *caps = NULL;
|
|
||||||
|
|
||||||
switch (codec_fcc) {
|
|
||||||
/* is this correct? */
|
|
||||||
case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'):
|
|
||||||
case GST_MAKE_FOURCC ('d', 'v', 's', 'd'):
|
|
||||||
caps = gst_caps_new_simple ("video/x-dv",
|
|
||||||
"systemstream", G_TYPE_BOOLEAN, TRUE, NULL);
|
|
||||||
if (codec_name)
|
|
||||||
*codec_name = g_strdup ("Generic DV");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
GST_WARNING ("Unknown IAVS fourcc " GST_FOURCC_FORMAT,
|
|
||||||
GST_FOURCC_ARGS (codec_fcc));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Functions below are for template caps. All is variable.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_video_template_caps (void)
|
|
||||||
{
|
|
||||||
guint32 tags[] = {
|
|
||||||
GST_MAKE_FOURCC ('I', '4', '2', '0'),
|
|
||||||
GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'),
|
|
||||||
GST_MAKE_FOURCC ('M', 'J', 'P', 'G'),
|
|
||||||
GST_MAKE_FOURCC ('D', 'V', 'S', 'D'),
|
|
||||||
GST_MAKE_FOURCC ('W', 'M', 'V', '1'),
|
|
||||||
GST_MAKE_FOURCC ('W', 'M', 'V', '2'),
|
|
||||||
GST_MAKE_FOURCC ('W', 'M', 'V', '3'),
|
|
||||||
GST_MAKE_FOURCC ('M', 'P', 'G', '4'),
|
|
||||||
GST_MAKE_FOURCC ('M', 'P', '4', '2'),
|
|
||||||
GST_MAKE_FOURCC ('M', 'P', '4', '3'),
|
|
||||||
GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'),
|
|
||||||
GST_MAKE_FOURCC ('D', 'I', 'V', '3'),
|
|
||||||
GST_MAKE_FOURCC ('M', 'P', 'E', 'G'),
|
|
||||||
GST_MAKE_FOURCC ('H', '2', '6', '3'),
|
|
||||||
GST_MAKE_FOURCC ('I', '2', '6', '3'),
|
|
||||||
GST_MAKE_FOURCC ('h', '2', '6', '4'),
|
|
||||||
GST_MAKE_FOURCC ('D', 'I', 'V', 'X'),
|
|
||||||
GST_MAKE_FOURCC ('D', 'X', '5', '0'),
|
|
||||||
GST_MAKE_FOURCC ('X', 'V', 'I', 'D'),
|
|
||||||
GST_MAKE_FOURCC ('3', 'I', 'V', '1'),
|
|
||||||
GST_MAKE_FOURCC ('c', 'v', 'i', 'd'),
|
|
||||||
GST_MAKE_FOURCC ('m', 's', 'v', 'c'),
|
|
||||||
GST_MAKE_FOURCC ('R', 'L', 'E', ' '),
|
|
||||||
GST_MAKE_FOURCC ('D', 'I', 'B', ' '),
|
|
||||||
GST_MAKE_FOURCC ('X', 'x', 'a', 'n'),
|
|
||||||
GST_MAKE_FOURCC ('I', 'V', '5', '0'),
|
|
||||||
/* FILL ME */
|
|
||||||
0
|
|
||||||
};
|
|
||||||
guint i;
|
|
||||||
GstCaps *caps, *one;
|
|
||||||
|
|
||||||
caps = gst_caps_new_empty ();
|
|
||||||
for (i = 0; tags[i] != 0; i++) {
|
|
||||||
one = gst_riff_create_video_caps (tags[i], NULL, NULL, NULL);
|
|
||||||
if (one)
|
|
||||||
gst_caps_append (caps, one);
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_audio_template_caps (void)
|
|
||||||
{
|
|
||||||
guint16 tags[] = {
|
|
||||||
GST_RIFF_WAVE_FORMAT_MPEGL3,
|
|
||||||
GST_RIFF_WAVE_FORMAT_MPEGL12,
|
|
||||||
GST_RIFF_WAVE_FORMAT_PCM,
|
|
||||||
GST_RIFF_WAVE_FORMAT_VORBIS1,
|
|
||||||
GST_RIFF_WAVE_FORMAT_A52,
|
|
||||||
GST_RIFF_WAVE_FORMAT_ALAW,
|
|
||||||
GST_RIFF_WAVE_FORMAT_MULAW,
|
|
||||||
GST_RIFF_WAVE_FORMAT_ADPCM,
|
|
||||||
GST_RIFF_WAVE_FORMAT_DVI_ADPCM,
|
|
||||||
GST_RIFF_WAVE_FORMAT_WMAV1,
|
|
||||||
GST_RIFF_WAVE_FORMAT_WMAV2,
|
|
||||||
GST_RIFF_WAVE_FORMAT_WMAV3,
|
|
||||||
/* FILL ME */
|
|
||||||
0
|
|
||||||
};
|
|
||||||
guint i;
|
|
||||||
GstCaps *caps, *one;
|
|
||||||
|
|
||||||
caps = gst_caps_new_empty ();
|
|
||||||
for (i = 0; tags[i] != 0; i++) {
|
|
||||||
one = gst_riff_create_audio_caps (tags[i], NULL, NULL, NULL);
|
|
||||||
if (one)
|
|
||||||
gst_caps_append (caps, one);
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_iavs_template_caps (void)
|
|
||||||
{
|
|
||||||
guint32 tags[] = {
|
|
||||||
GST_MAKE_FOURCC ('D', 'V', 'S', 'D'),
|
|
||||||
/* FILL ME */
|
|
||||||
0
|
|
||||||
};
|
|
||||||
guint i;
|
|
||||||
GstCaps *caps, *one;
|
|
||||||
|
|
||||||
caps = gst_caps_new_empty ();
|
|
||||||
for (i = 0; tags[i] != 0; i++) {
|
|
||||||
one = gst_riff_create_iavs_caps (tags[i], NULL, NULL, NULL);
|
|
||||||
if (one)
|
|
||||||
gst_caps_append (caps, one);
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
|
||||||
}
|
|
|
@ -1,77 +0,0 @@
|
||||||
/* GStreamer RIFF I/O
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* riff-media.h: RIFF-id to/from caps routines
|
|
||||||
*
|
|
||||||
* 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_RIFF_MEDIA_H__
|
|
||||||
#define __GST_RIFF_MEDIA_H__
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include "riff-ids.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create one caps. strh/strf can be NULL (for non-fixed caps).
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstCaps *gst_riff_create_video_caps (guint32 codec_fcc,
|
|
||||||
gst_riff_strh *strh,
|
|
||||||
gst_riff_strf_vids *strf,
|
|
||||||
char **codec_name);
|
|
||||||
GstCaps *gst_riff_create_audio_caps (guint16 codec_id,
|
|
||||||
gst_riff_strh *strh,
|
|
||||||
gst_riff_strf_auds *strf,
|
|
||||||
char **codec_name);
|
|
||||||
GstCaps *gst_riff_create_iavs_caps (guint32 codec_fcc,
|
|
||||||
gst_riff_strh *strh,
|
|
||||||
gst_riff_strf_iavs *strf,
|
|
||||||
char **codec_name);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Extended...
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_video_caps_with_data (guint32 codec_fcc,
|
|
||||||
gst_riff_strh * strh,
|
|
||||||
gst_riff_strf_vids * strf,
|
|
||||||
GstBuffer * strf_data,
|
|
||||||
GstBuffer * strd_data,
|
|
||||||
char ** codec_name);
|
|
||||||
|
|
||||||
GstCaps *
|
|
||||||
gst_riff_create_audio_caps_with_data (guint16 codec_id,
|
|
||||||
gst_riff_strh * strh,
|
|
||||||
gst_riff_strf_auds * strf,
|
|
||||||
GstBuffer * strf_data,
|
|
||||||
GstBuffer * strd_data,
|
|
||||||
char ** codec_name);
|
|
||||||
/*
|
|
||||||
* Create template caps (includes all known types).
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstCaps *gst_riff_create_video_template_caps (void);
|
|
||||||
GstCaps *gst_riff_create_audio_template_caps (void);
|
|
||||||
GstCaps *gst_riff_create_iavs_template_caps (void);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_RIFF_READ_H__ */
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,114 +0,0 @@
|
||||||
/* GStreamer RIFF I/O
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* riff-read.h: function declarations for parsing a RIFF file
|
|
||||||
*
|
|
||||||
* 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_RIFF_READ_H__
|
|
||||||
#define __GST_RIFF_READ_H__
|
|
||||||
|
|
||||||
#include <glib.h>
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/bytestream/bytestream.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_RIFF_READ \
|
|
||||||
(gst_riff_read_get_type ())
|
|
||||||
#define GST_RIFF_READ(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_RIFF_READ, GstRiffRead))
|
|
||||||
#define GST_RIFF_READ_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_RIFF_READ, GstRiffReadClass))
|
|
||||||
#define GST_IS_RIFF_READ(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_RIFF_READ))
|
|
||||||
#define GST_IS_RIFF_READ_CLASS(obj) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_RIFF_READ))
|
|
||||||
#define GST_RIFF_READ_GET_CLASS(obj) \
|
|
||||||
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_RIFF_READ, GstRiffReadClass))
|
|
||||||
|
|
||||||
typedef struct _GstRiffLevel {
|
|
||||||
guint64 start,
|
|
||||||
length;
|
|
||||||
} GstRiffLevel;
|
|
||||||
|
|
||||||
typedef struct _GstRiffRead {
|
|
||||||
GstElement parent;
|
|
||||||
|
|
||||||
GstPad *sinkpad;
|
|
||||||
GstByteStream *bs;
|
|
||||||
|
|
||||||
GList *level;
|
|
||||||
} GstRiffRead;
|
|
||||||
|
|
||||||
typedef struct _GstRiffReadClass {
|
|
||||||
GstElementClass parent;
|
|
||||||
} GstRiffReadClass;
|
|
||||||
|
|
||||||
GType gst_riff_read_get_type (void);
|
|
||||||
|
|
||||||
guint32 gst_riff_peek_tag (GstRiffRead *riff,
|
|
||||||
guint *level_up);
|
|
||||||
guint32 gst_riff_peek_list (GstRiffRead *riff);
|
|
||||||
gboolean gst_riff_peek_head (GstRiffRead *riff,
|
|
||||||
guint32 *tag,
|
|
||||||
guint32 *length,
|
|
||||||
guint *level_up);
|
|
||||||
|
|
||||||
GstEvent *gst_riff_read_seek (GstRiffRead *riff,
|
|
||||||
guint64 offset);
|
|
||||||
gboolean gst_riff_read_skip (GstRiffRead *riff);
|
|
||||||
gboolean gst_riff_read_data (GstRiffRead *riff,
|
|
||||||
guint32 *tag,
|
|
||||||
GstBuffer **buf);
|
|
||||||
gboolean gst_riff_read_ascii (GstRiffRead *riff,
|
|
||||||
guint32 *tag,
|
|
||||||
gchar **str);
|
|
||||||
gboolean gst_riff_read_list (GstRiffRead *riff,
|
|
||||||
guint32 *tag);
|
|
||||||
gboolean gst_riff_read_header (GstRiffRead *read,
|
|
||||||
guint32 *doctype);
|
|
||||||
GstBuffer *gst_riff_read_element_data (GstRiffRead *riff,
|
|
||||||
guint length,
|
|
||||||
guint *got_bytes);
|
|
||||||
GstBuffer *gst_riff_peek_element_data (GstRiffRead *riff,
|
|
||||||
guint length,
|
|
||||||
guint *got_bytes);
|
|
||||||
/*
|
|
||||||
* Utility functions (including byteswapping).
|
|
||||||
*/
|
|
||||||
gboolean gst_riff_read_strh (GstRiffRead *riff,
|
|
||||||
gst_riff_strh **header);
|
|
||||||
gboolean gst_riff_read_strf_vids (GstRiffRead *riff,
|
|
||||||
gst_riff_strf_vids **header);
|
|
||||||
gboolean gst_riff_read_strf_vids_with_data
|
|
||||||
(GstRiffRead *riff,
|
|
||||||
gst_riff_strf_vids **header,
|
|
||||||
GstBuffer **extradata);
|
|
||||||
gboolean gst_riff_read_strf_auds (GstRiffRead *riff,
|
|
||||||
gst_riff_strf_auds **header);
|
|
||||||
gboolean gst_riff_read_strf_auds_with_data
|
|
||||||
(GstRiffRead *riff,
|
|
||||||
gst_riff_strf_auds **header,
|
|
||||||
GstBuffer **extradata);
|
|
||||||
gboolean gst_riff_read_strf_iavs (GstRiffRead *riff,
|
|
||||||
gst_riff_strf_iavs **header);
|
|
||||||
gboolean gst_riff_read_info (GstRiffRead *riff);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_RIFF_READ_H__ */
|
|
|
@ -1,38 +0,0 @@
|
||||||
/* GStreamer RIFF I/O
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* riff.c: plugin registering
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
plugin_init (GstPlugin * plugin)
|
|
||||||
{
|
|
||||||
return gst_library_load ("gstbytestream");
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
||||||
GST_VERSION_MINOR,
|
|
||||||
"riff",
|
|
||||||
"RIFF I/O functions",
|
|
||||||
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN)
|
|
|
@ -1,27 +0,0 @@
|
||||||
EXPORTS
|
|
||||||
gst_plugin_desc
|
|
||||||
gst_riff_read_get_type
|
|
||||||
gst_riff_read_element_data
|
|
||||||
gst_riff_create_video_template_caps
|
|
||||||
gst_riff_create_video_caps
|
|
||||||
gst_riff_create_video_caps_with_data
|
|
||||||
gst_riff_create_audio_template_caps
|
|
||||||
gst_riff_create_audio_caps
|
|
||||||
gst_riff_create_audio_caps_with_data
|
|
||||||
gst_riff_create_iavs_template_caps
|
|
||||||
gst_riff_create_iavs_caps
|
|
||||||
gst_riff_read_header
|
|
||||||
gst_riff_read_data
|
|
||||||
gst_riff_read_seek
|
|
||||||
gst_riff_read_skip
|
|
||||||
gst_riff_read_info
|
|
||||||
gst_riff_read_list
|
|
||||||
gst_riff_read_ascii
|
|
||||||
gst_riff_read_strh
|
|
||||||
gst_riff_read_strf_iavs
|
|
||||||
gst_riff_read_strf_auds
|
|
||||||
gst_riff_read_strf_auds_with_data
|
|
||||||
gst_riff_read_strf_vids_with_data
|
|
||||||
gst_riff_peek_tag
|
|
||||||
gst_riff_peek_list
|
|
||||||
gst_riff_peek_head
|
|
|
@ -1,158 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="riff"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D67890}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;RIFF_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstriff.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="riff.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/riff.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstriff.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;RIFF_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gstriff.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="riff.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gstriff.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\riff-media.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\riff-read.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\riff.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\riff.def">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\riff-ids.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\riff-media.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\riff-read.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,5 +0,0 @@
|
||||||
libgsttagincludedir = \
|
|
||||||
$(includedir)/gstreamer-@GST_MAJORMINOR@/gst/tag
|
|
||||||
|
|
||||||
libgsttaginclude_HEADERS = \
|
|
||||||
tag.h
|
|
|
@ -1,62 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
|
|
||||||
*
|
|
||||||
* 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_TAG_TAG_H__
|
|
||||||
#define __GST_TAG_TAG_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
|
|
||||||
/* functions for vorbis comment manipulation */
|
|
||||||
|
|
||||||
G_CONST_RETURN gchar * gst_tag_from_vorbis_tag (const gchar * vorbis_tag);
|
|
||||||
G_CONST_RETURN gchar * gst_tag_to_vorbis_tag (const gchar * gst_tag);
|
|
||||||
void gst_vorbis_tag_add (GstTagList * list,
|
|
||||||
const gchar * tag,
|
|
||||||
const gchar * value);
|
|
||||||
|
|
||||||
GList * gst_tag_to_vorbis_comments (const GstTagList * list,
|
|
||||||
const gchar * tag);
|
|
||||||
|
|
||||||
/* functions to convert GstBuffers with vorbiscomment contents to GstTagLists and back */
|
|
||||||
GstTagList * gst_tag_list_from_vorbiscomment_buffer (const GstBuffer * buffer,
|
|
||||||
const guint8 * id_data,
|
|
||||||
const guint id_data_length,
|
|
||||||
gchar ** vendor_string);
|
|
||||||
GstBuffer * gst_tag_list_to_vorbiscomment_buffer (const GstTagList * list,
|
|
||||||
const guint8 * id_data,
|
|
||||||
const guint id_data_length,
|
|
||||||
const gchar * vendor_string);
|
|
||||||
|
|
||||||
/* functions for ID3 tag manipulation */
|
|
||||||
|
|
||||||
guint gst_tag_id3_genre_count (void);
|
|
||||||
G_CONST_RETURN gchar * gst_tag_id3_genre_get (const guint id);
|
|
||||||
GstTagList * gst_tag_list_new_from_id3v1 (const guint8 * data);
|
|
||||||
|
|
||||||
G_CONST_RETURN gchar * gst_tag_from_id3_tag (const gchar * vorbis_tag);
|
|
||||||
G_CONST_RETURN gchar * gst_tag_to_id3_tag (const gchar * gst_tag);
|
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_TAG_TAG_H__ */
|
|
|
@ -1,49 +0,0 @@
|
||||||
# variables used for enum/marshal generation
|
|
||||||
glib_enum_headers=$(tuner_headers)
|
|
||||||
glib_enum_define=GST_TUNER
|
|
||||||
glib_enum_prefix=gst_tuner
|
|
||||||
|
|
||||||
libgsttunerincludedir = \
|
|
||||||
$(includedir)/gstreamer-@GST_MAJORMINOR@/gst/tuner
|
|
||||||
|
|
||||||
tuner_headers = \
|
|
||||||
tuner.h \
|
|
||||||
tunernorm.h \
|
|
||||||
tunerchannel.h
|
|
||||||
|
|
||||||
built_sources = \
|
|
||||||
tuner-marshal.c \
|
|
||||||
tuner-enumtypes.c
|
|
||||||
|
|
||||||
built_headers = \
|
|
||||||
tuner-marshal.h \
|
|
||||||
tuner-enumtypes.h
|
|
||||||
|
|
||||||
libgsttunerinclude_HEADERS = \
|
|
||||||
$(tuner_headers)
|
|
||||||
|
|
||||||
nodist_libgsttunerinclude_HEADERS = \
|
|
||||||
tuner-enumtypes.h
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libgsttuner.la
|
|
||||||
|
|
||||||
libgsttuner_la_SOURCES = \
|
|
||||||
tuner.c \
|
|
||||||
tunernorm.c \
|
|
||||||
tunerchannel.c
|
|
||||||
|
|
||||||
nodist_libgsttuner_la_SOURCES = \
|
|
||||||
$(built_sources) \
|
|
||||||
tuner-marshal.h
|
|
||||||
|
|
||||||
libgsttuner_la_CFLAGS = $(GST_CFLAGS)
|
|
||||||
|
|
||||||
BUILT_SOURCES = \
|
|
||||||
$(built_sources) \
|
|
||||||
$(built_headers)
|
|
||||||
|
|
||||||
EXTRA_DIST = tuner-marshal.list
|
|
||||||
|
|
||||||
CLEANFILES = $(BUILT_SOURCES)
|
|
||||||
|
|
||||||
include $(top_srcdir)/common/glib-gen.mak
|
|
|
@ -1,2 +0,0 @@
|
||||||
VOID:OBJECT,ULONG
|
|
||||||
VOID:OBJECT,INT
|
|
|
@ -1,404 +0,0 @@
|
||||||
/* GStreamer Tuner
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* tuner.c: tuner design virtual class function wrappers
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "tuner.h"
|
|
||||||
#include "tuner-marshal.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
NORM_CHANGED,
|
|
||||||
CHANNEL_CHANGED,
|
|
||||||
FREQUENCY_CHANGED,
|
|
||||||
SIGNAL_CHANGED,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_tuner_class_init (GstTunerClass * klass);
|
|
||||||
|
|
||||||
static guint gst_tuner_signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_tuner_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_tuner_type = 0;
|
|
||||||
|
|
||||||
if (!gst_tuner_type) {
|
|
||||||
static const GTypeInfo gst_tuner_info = {
|
|
||||||
sizeof (GstTunerClass),
|
|
||||||
(GBaseInitFunc) gst_tuner_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_tuner_type = g_type_register_static (G_TYPE_INTERFACE,
|
|
||||||
"GstTuner", &gst_tuner_info, 0);
|
|
||||||
g_type_interface_add_prerequisite (gst_tuner_type,
|
|
||||||
GST_TYPE_IMPLEMENTS_INTERFACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_tuner_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_tuner_class_init (GstTunerClass * klass)
|
|
||||||
{
|
|
||||||
static gboolean initialized = FALSE;
|
|
||||||
|
|
||||||
if (!initialized) {
|
|
||||||
gst_tuner_signals[NORM_CHANGED] =
|
|
||||||
g_signal_new ("norm-changed",
|
|
||||||
GST_TYPE_TUNER, G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstTunerClass, norm_changed),
|
|
||||||
NULL, NULL,
|
|
||||||
g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_TUNER_NORM);
|
|
||||||
gst_tuner_signals[CHANNEL_CHANGED] =
|
|
||||||
g_signal_new ("channel-changed",
|
|
||||||
GST_TYPE_TUNER, G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstTunerClass, channel_changed),
|
|
||||||
NULL, NULL,
|
|
||||||
g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1,
|
|
||||||
GST_TYPE_TUNER_CHANNEL);
|
|
||||||
gst_tuner_signals[FREQUENCY_CHANGED] =
|
|
||||||
g_signal_new ("frequency-changed",
|
|
||||||
GST_TYPE_TUNER, G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstTunerClass, frequency_changed),
|
|
||||||
NULL, NULL,
|
|
||||||
gst_tuner_marshal_VOID__OBJECT_ULONG, G_TYPE_NONE, 2,
|
|
||||||
GST_TYPE_TUNER_CHANNEL, G_TYPE_ULONG);
|
|
||||||
gst_tuner_signals[SIGNAL_CHANGED] =
|
|
||||||
g_signal_new ("signal-changed",
|
|
||||||
GST_TYPE_TUNER, G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstTunerClass, signal_changed),
|
|
||||||
NULL, NULL,
|
|
||||||
gst_tuner_marshal_VOID__OBJECT_INT, G_TYPE_NONE, 2,
|
|
||||||
GST_TYPE_TUNER_CHANNEL, G_TYPE_INT);
|
|
||||||
|
|
||||||
initialized = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* default virtual functions */
|
|
||||||
klass->list_channels = NULL;
|
|
||||||
klass->set_channel = NULL;
|
|
||||||
klass->get_channel = NULL;
|
|
||||||
|
|
||||||
klass->list_norms = NULL;
|
|
||||||
klass->set_norm = NULL;
|
|
||||||
klass->get_norm = NULL;
|
|
||||||
|
|
||||||
klass->set_frequency = NULL;
|
|
||||||
klass->get_frequency = NULL;
|
|
||||||
klass->signal_strength = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_tuner_list_channels:
|
|
||||||
* @tuner: the #GstTuner (a #GstElement) to get the channels from.
|
|
||||||
*
|
|
||||||
* Retrieve a list of channels (e.g. 'composite', 's-video', ...)
|
|
||||||
* from the given tuner object.
|
|
||||||
*
|
|
||||||
* Returns: a list of channels available on this tuner.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const GList *
|
|
||||||
gst_tuner_list_channels (GstTuner * tuner)
|
|
||||||
{
|
|
||||||
GstTunerClass *klass = GST_TUNER_GET_CLASS (tuner);
|
|
||||||
|
|
||||||
if (klass->list_channels) {
|
|
||||||
return klass->list_channels (tuner);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_tuner_set_channel:
|
|
||||||
* @tuner: the #GstTuner (a #GstElement) that owns the channel.
|
|
||||||
* @channel: the channel to tune to.
|
|
||||||
*
|
|
||||||
* Tunes the object to the given channel.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_tuner_set_channel (GstTuner * tuner, GstTunerChannel * channel)
|
|
||||||
{
|
|
||||||
GstTunerClass *klass = GST_TUNER_GET_CLASS (tuner);
|
|
||||||
|
|
||||||
if (klass->set_channel) {
|
|
||||||
klass->set_channel (tuner, channel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_Tuner_get_channel:
|
|
||||||
* @tuner: the #GstTuner (a #GstElement) to get the current channel from.
|
|
||||||
*
|
|
||||||
* Retrieve the current channel from the tuner.
|
|
||||||
*
|
|
||||||
* Returns: the current channel of the tuner object.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstTunerChannel *
|
|
||||||
gst_tuner_get_channel (GstTuner * tuner)
|
|
||||||
{
|
|
||||||
GstTunerClass *klass = GST_TUNER_GET_CLASS (tuner);
|
|
||||||
|
|
||||||
if (klass->get_channel) {
|
|
||||||
return klass->get_channel (tuner);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_tuner_get_norms_list:
|
|
||||||
* @tuner: the #GstTuner (*a #GstElement) to get the list of norms from.
|
|
||||||
*
|
|
||||||
* Retrieve a list of available norms on the currently tuned channel
|
|
||||||
* from the given tuner object.
|
|
||||||
*
|
|
||||||
* Returns: A list of norms available on the current channel for this
|
|
||||||
* tuner object.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const GList *
|
|
||||||
gst_tuner_list_norms (GstTuner * tuner)
|
|
||||||
{
|
|
||||||
GstTunerClass *klass = GST_TUNER_GET_CLASS (tuner);
|
|
||||||
|
|
||||||
if (klass->list_norms) {
|
|
||||||
return klass->list_norms (tuner);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_tuner_set_norm:
|
|
||||||
* @tuner: the #GstTuner (a #GstElement) to set the norm on.
|
|
||||||
* @norm: the norm to use for the current channel.
|
|
||||||
*
|
|
||||||
* Changes the video norm on this tuner to the given norm.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_tuner_set_norm (GstTuner * tuner, GstTunerNorm * norm)
|
|
||||||
{
|
|
||||||
GstTunerClass *klass = GST_TUNER_GET_CLASS (tuner);
|
|
||||||
|
|
||||||
if (klass->set_norm) {
|
|
||||||
klass->set_norm (tuner, norm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_tuner_get_norm:
|
|
||||||
* @tuner: the #GstTuner (a #GstElement) to get the current norm from.
|
|
||||||
*
|
|
||||||
* Get the current video norm from the given tuner object for the
|
|
||||||
* currently selected channel.
|
|
||||||
*
|
|
||||||
* Returns: the current norm.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GstTunerNorm *
|
|
||||||
gst_tuner_get_norm (GstTuner * tuner)
|
|
||||||
{
|
|
||||||
GstTunerClass *klass = GST_TUNER_GET_CLASS (tuner);
|
|
||||||
|
|
||||||
if (klass->get_norm) {
|
|
||||||
return klass->get_norm (tuner);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_tuner_set_frequency:
|
|
||||||
* @tuner: the #Gsttuner (a #GstElement) that owns the given channel.
|
|
||||||
* @channel: the #GstTunerChannel to set the frequency on.
|
|
||||||
* @frequency: the frequency to tune in to.
|
|
||||||
*
|
|
||||||
* Sets a tuning frequency on the given tuner/channel. Note that this
|
|
||||||
* requires the given channel to be a "tuning" channel, which can be
|
|
||||||
* checked using GST_TUNER_CHANNEL_HAS_FLAG (), with the proper flag
|
|
||||||
* being GST_TUNER_CHANNEL_FREQUENCY.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_tuner_set_frequency (GstTuner * tuner,
|
|
||||||
GstTunerChannel * channel, gulong frequency)
|
|
||||||
{
|
|
||||||
GstTunerClass *klass = GST_TUNER_GET_CLASS (tuner);
|
|
||||||
|
|
||||||
g_return_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
|
|
||||||
GST_TUNER_CHANNEL_FREQUENCY));
|
|
||||||
|
|
||||||
if (klass->set_frequency) {
|
|
||||||
klass->set_frequency (tuner, channel, frequency);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_tuner_get_frequency:
|
|
||||||
* @tuner: the #GstTuner (a #GstElement) that owns the given channel.
|
|
||||||
* @channel: the #GstTunerChannel to retrieve the frequency from.
|
|
||||||
*
|
|
||||||
* Retrieve the current frequency from the given channel. The same
|
|
||||||
* applies as for set_frequency (): check the flag.
|
|
||||||
*
|
|
||||||
* Returns: the current frequency, or 0 on error.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gulong
|
|
||||||
gst_tuner_get_frequency (GstTuner * tuner, GstTunerChannel * channel)
|
|
||||||
{
|
|
||||||
GstTunerClass *klass = GST_TUNER_GET_CLASS (tuner);
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
|
|
||||||
GST_TUNER_CHANNEL_FREQUENCY), 0);
|
|
||||||
|
|
||||||
if (klass->get_frequency) {
|
|
||||||
return klass->get_frequency (tuner, channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_tuner_get_signal_strength:
|
|
||||||
* @tuner: the #GstTuner (a #GstElement) that owns the given channel.
|
|
||||||
* @channel: the #GstTunerChannel to get the signal strength from.
|
|
||||||
*
|
|
||||||
* get the strength of the signal on this channel. Note that this
|
|
||||||
* requires the current channel to be a "tuning" channel, e.g. a
|
|
||||||
* channel on which frequency can be set. This can be checked using
|
|
||||||
* GST_TUNER_CHANNEL_HAS_FLAG (), and the appropriate flag to check
|
|
||||||
* for is GST_TUNER_CHANNEL_FREQUENCY.
|
|
||||||
*
|
|
||||||
* Returns: signal strength, or 0 on error.
|
|
||||||
*/
|
|
||||||
|
|
||||||
gint
|
|
||||||
gst_tuner_signal_strength (GstTuner * tuner, GstTunerChannel * channel)
|
|
||||||
{
|
|
||||||
GstTunerClass *klass = GST_TUNER_GET_CLASS (tuner);
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
|
|
||||||
GST_TUNER_CHANNEL_FREQUENCY), 0);
|
|
||||||
|
|
||||||
if (klass->signal_strength) {
|
|
||||||
return klass->signal_strength (tuner, channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstTunerNorm *
|
|
||||||
gst_tuner_find_norm_by_name (GstTuner * tuner, gchar * norm)
|
|
||||||
{
|
|
||||||
GList *walk;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_TUNER (tuner), NULL);
|
|
||||||
g_return_val_if_fail (norm != NULL, NULL);
|
|
||||||
|
|
||||||
walk = (GList *) gst_tuner_list_norms (tuner);
|
|
||||||
while (walk) {
|
|
||||||
if (strcmp (GST_TUNER_NORM (walk->data)->label, norm) == 0)
|
|
||||||
return GST_TUNER_NORM (walk->data);
|
|
||||||
walk = g_list_next (walk);
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstTunerChannel *
|
|
||||||
gst_tuner_find_channel_by_name (GstTuner * tuner, gchar * channel)
|
|
||||||
{
|
|
||||||
GList *walk;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_TUNER (tuner), NULL);
|
|
||||||
g_return_val_if_fail (channel != NULL, NULL);
|
|
||||||
|
|
||||||
walk = (GList *) gst_tuner_list_channels (tuner);
|
|
||||||
while (walk) {
|
|
||||||
if (strcmp (GST_TUNER_CHANNEL (walk->data)->label, channel) == 0)
|
|
||||||
return GST_TUNER_CHANNEL (walk->data);
|
|
||||||
walk = g_list_next (walk);
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_tuner_channel_changed (GstTuner * tuner, GstTunerChannel * channel)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GST_IS_TUNER (tuner));
|
|
||||||
g_return_if_fail (GST_IS_TUNER_CHANNEL (channel));
|
|
||||||
|
|
||||||
g_signal_emit (G_OBJECT (tuner),
|
|
||||||
gst_tuner_signals[CHANNEL_CHANGED], 0, channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_tuner_norm_changed (GstTuner * tuner, GstTunerNorm * norm)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GST_IS_TUNER (tuner));
|
|
||||||
g_return_if_fail (GST_IS_TUNER_NORM (norm));
|
|
||||||
|
|
||||||
g_signal_emit (G_OBJECT (tuner), gst_tuner_signals[NORM_CHANGED], 0, norm);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_tuner_frequency_changed (GstTuner * tuner,
|
|
||||||
GstTunerChannel * channel, gulong frequency)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GST_IS_TUNER (tuner));
|
|
||||||
g_return_if_fail (GST_IS_TUNER_CHANNEL (channel));
|
|
||||||
|
|
||||||
g_signal_emit (G_OBJECT (tuner),
|
|
||||||
gst_tuner_signals[FREQUENCY_CHANGED], 0, channel, frequency);
|
|
||||||
|
|
||||||
g_signal_emit_by_name (G_OBJECT (channel), "frequency_changed", frequency);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_tuner_signal_changed (GstTuner * tuner,
|
|
||||||
GstTunerChannel * channel, gint signal)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GST_IS_TUNER (tuner));
|
|
||||||
g_return_if_fail (GST_IS_TUNER_CHANNEL (channel));
|
|
||||||
|
|
||||||
g_signal_emit (G_OBJECT (tuner),
|
|
||||||
gst_tuner_signals[SIGNAL_CHANGED], 0, channel, signal);
|
|
||||||
|
|
||||||
g_signal_emit_by_name (G_OBJECT (channel), "signal_changed", signal);
|
|
||||||
}
|
|
|
@ -1,127 +0,0 @@
|
||||||
/* GStreamer Tuner
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* tuner.h: tuner interface design
|
|
||||||
*
|
|
||||||
* 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_TUNER_H__
|
|
||||||
#define __GST_TUNER_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gst/tuner/tunernorm.h>
|
|
||||||
#include <gst/tuner/tunerchannel.h>
|
|
||||||
#include <gst/tuner/tuner-enumtypes.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_TUNER \
|
|
||||||
(gst_tuner_get_type ())
|
|
||||||
#define GST_TUNER(obj) \
|
|
||||||
(GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TUNER, GstTuner))
|
|
||||||
#define GST_TUNER_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TUNER, GstTunerClass))
|
|
||||||
#define GST_IS_TUNER(obj) \
|
|
||||||
(GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TUNER))
|
|
||||||
#define GST_IS_TUNER_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TUNER))
|
|
||||||
#define GST_TUNER_GET_CLASS(inst) \
|
|
||||||
(G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_TUNER, GstTunerClass))
|
|
||||||
|
|
||||||
typedef struct _GstTuner GstTuner;
|
|
||||||
|
|
||||||
typedef struct _GstTunerClass {
|
|
||||||
GTypeInterface klass;
|
|
||||||
|
|
||||||
/* virtual functions */
|
|
||||||
const GList * (* list_channels) (GstTuner *tuner);
|
|
||||||
void (* set_channel) (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel);
|
|
||||||
GstTunerChannel *
|
|
||||||
(* get_channel) (GstTuner *tuner);
|
|
||||||
|
|
||||||
const GList * (* list_norms) (GstTuner *tuner);
|
|
||||||
void (* set_norm) (GstTuner *tuner,
|
|
||||||
GstTunerNorm *norm);
|
|
||||||
GstTunerNorm *(* get_norm) (GstTuner *tuner);
|
|
||||||
|
|
||||||
void (* set_frequency) (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel,
|
|
||||||
gulong frequency);
|
|
||||||
gulong (* get_frequency) (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel);
|
|
||||||
gint (* signal_strength) (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel);
|
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (*channel_changed) (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel);
|
|
||||||
void (*norm_changed) (GstTuner *tuner,
|
|
||||||
GstTunerNorm *norm);
|
|
||||||
void (*frequency_changed) (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel,
|
|
||||||
gulong frequency);
|
|
||||||
void (*signal_changed) (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel,
|
|
||||||
gint signal);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
} GstTunerClass;
|
|
||||||
|
|
||||||
GType gst_tuner_get_type (void);
|
|
||||||
|
|
||||||
/* virtual class function wrappers */
|
|
||||||
const GList * gst_tuner_list_channels (GstTuner *tuner);
|
|
||||||
void gst_tuner_set_channel (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel);
|
|
||||||
GstTunerChannel *
|
|
||||||
gst_tuner_get_channel (GstTuner *tuner);
|
|
||||||
|
|
||||||
const GList * gst_tuner_list_norms (GstTuner *tuner);
|
|
||||||
void gst_tuner_set_norm (GstTuner *tuner,
|
|
||||||
GstTunerNorm *channel);
|
|
||||||
GstTunerNorm * gst_tuner_get_norm (GstTuner *tuner);
|
|
||||||
|
|
||||||
void gst_tuner_set_frequency (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel,
|
|
||||||
gulong frequency);
|
|
||||||
gulong gst_tuner_get_frequency (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel);
|
|
||||||
gint gst_tuner_signal_strength (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel);
|
|
||||||
|
|
||||||
/* helper functions */
|
|
||||||
GstTunerNorm * gst_tuner_find_norm_by_name (GstTuner *tuner,
|
|
||||||
gchar *norm);
|
|
||||||
GstTunerChannel *gst_tuner_find_channel_by_name (GstTuner *tuner,
|
|
||||||
gchar *channel);
|
|
||||||
|
|
||||||
/* trigger signals */
|
|
||||||
void gst_tuner_channel_changed (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel);
|
|
||||||
void gst_tuner_norm_changed (GstTuner *tuner,
|
|
||||||
GstTunerNorm *norm);
|
|
||||||
void gst_tuner_frequency_changed (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel,
|
|
||||||
gulong frequency);
|
|
||||||
void gst_tuner_signal_changed (GstTuner *tuner,
|
|
||||||
GstTunerChannel *channel,
|
|
||||||
gint signal);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_TUNER_H__ */
|
|
|
@ -1,156 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="tuner"
|
|
||||||
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D6789C}"
|
|
||||||
RootNamespace="tuner"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../../win32/Debug"
|
|
||||||
IntermediateDirectory="../../../win32/Debug"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gsttuner.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Debug;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="tuner.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/tuner.pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
ImportLibrary="$(OutDir)/gsttuner.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../../win32/Release"
|
|
||||||
IntermediateDirectory="../../../win32/Release"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../../gstreamer/win32;../../../../gstreamer;../../../../gstreamer/libs;../../../../glib;../../../../glib/glib;../../../../glib/gmodule;"../../../gst-libs";../../../../popt/include;../../../../libxml2/include/libxml2"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;HAVE_CONFIG_H;_USE_MATH_DEFINES"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
|
|
||||||
OutputFile="$(OutDir)/gsttuner.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="../../../../gstreamer/win32/Release;../../../../glib/glib;../../../../glib/gmodule;../../../../glib/gthread;../../../../glib/gobject;../../../../gettext/lib;../../../../libiconv/lib"
|
|
||||||
ModuleDefinitionFile="tuner.def"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(OutDir)/gsttuner.lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy /Y $(TargetPath) c:\gstreamer\plugins"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\tuner.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\tunerchannel.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\tunernorm.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\tuner.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\tunerchannel.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\tunernorm.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,114 +0,0 @@
|
||||||
/* GStreamer Tuner
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* tunerchannel.c: tuner channel object design
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "tunerchannel.h"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
/* FILL ME */
|
|
||||||
SIGNAL_FREQUENCY_CHANGED,
|
|
||||||
SIGNAL_SIGNAL_CHANGED,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_tuner_channel_class_init (GstTunerChannelClass * klass);
|
|
||||||
static void gst_tuner_channel_init (GstTunerChannel * channel);
|
|
||||||
static void gst_tuner_channel_dispose (GObject * object);
|
|
||||||
|
|
||||||
static GObjectClass *parent_class = NULL;
|
|
||||||
static guint signals[LAST_SIGNAL] = { 0 };
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_tuner_channel_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_tuner_channel_type = 0;
|
|
||||||
|
|
||||||
if (!gst_tuner_channel_type) {
|
|
||||||
static const GTypeInfo tuner_channel_info = {
|
|
||||||
sizeof (GstTunerChannelClass),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(GClassInitFunc) gst_tuner_channel_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstTunerChannel),
|
|
||||||
0,
|
|
||||||
(GInstanceInitFunc) gst_tuner_channel_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_tuner_channel_type =
|
|
||||||
g_type_register_static (G_TYPE_OBJECT,
|
|
||||||
"GstTunerChannel", &tuner_channel_info, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_tuner_channel_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_tuner_channel_class_init (GstTunerChannelClass * klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_klass = (GObjectClass *) klass;
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (G_TYPE_OBJECT);
|
|
||||||
|
|
||||||
signals[SIGNAL_FREQUENCY_CHANGED] =
|
|
||||||
g_signal_new ("frequency-changed", G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstTunerChannelClass,
|
|
||||||
frequency_changed),
|
|
||||||
NULL, NULL, g_cclosure_marshal_VOID__ULONG, G_TYPE_NONE, 1, G_TYPE_ULONG);
|
|
||||||
signals[SIGNAL_SIGNAL_CHANGED] =
|
|
||||||
g_signal_new ("signal-changed", G_TYPE_FROM_CLASS (klass),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET (GstTunerChannelClass,
|
|
||||||
signal_changed),
|
|
||||||
NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
|
|
||||||
|
|
||||||
object_klass->dispose = gst_tuner_channel_dispose;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_tuner_channel_init (GstTunerChannel * channel)
|
|
||||||
{
|
|
||||||
channel->label = NULL;
|
|
||||||
channel->flags = 0;
|
|
||||||
channel->min_frequency = channel->max_frequency = 0;
|
|
||||||
channel->min_signal = channel->max_signal = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_tuner_channel_dispose (GObject * object)
|
|
||||||
{
|
|
||||||
GstTunerChannel *channel = GST_TUNER_CHANNEL (object);
|
|
||||||
|
|
||||||
if (channel->label) {
|
|
||||||
g_free (channel->label);
|
|
||||||
channel->label = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parent_class->dispose)
|
|
||||||
parent_class->dispose (object);
|
|
||||||
}
|
|
|
@ -1,80 +0,0 @@
|
||||||
/* GStreamer Tuner
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* tunerchannel.h: tuner channel object design
|
|
||||||
*
|
|
||||||
* 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_TUNER_CHANNEL_H__
|
|
||||||
#define __GST_TUNER_CHANNEL_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_TUNER_CHANNEL \
|
|
||||||
(gst_tuner_channel_get_type ())
|
|
||||||
#define GST_TUNER_CHANNEL(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TUNER_CHANNEL, \
|
|
||||||
GstTunerChannel))
|
|
||||||
#define GST_TUNER_CHANNEL_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TUNER_CHANNEL, \
|
|
||||||
GstTunerChannelClass))
|
|
||||||
#define GST_IS_TUNER_CHANNEL(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TUNER_CHANNEL))
|
|
||||||
#define GST_IS_TUNER_CHANNEL_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TUNER_CHANNEL))
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
GST_TUNER_CHANNEL_INPUT = (1<<0),
|
|
||||||
GST_TUNER_CHANNEL_OUTPUT = (1<<1),
|
|
||||||
GST_TUNER_CHANNEL_FREQUENCY = (1<<2),
|
|
||||||
GST_TUNER_CHANNEL_AUDIO = (1<<3)
|
|
||||||
} GstTunerChannelFlags;
|
|
||||||
|
|
||||||
#define GST_TUNER_CHANNEL_HAS_FLAG(channel, flag) \
|
|
||||||
((channel)->flags & flag)
|
|
||||||
|
|
||||||
typedef struct _GstTunerChannel {
|
|
||||||
GObject parent;
|
|
||||||
|
|
||||||
gchar *label;
|
|
||||||
GstTunerChannelFlags flags;
|
|
||||||
gfloat freq_multiplicator;
|
|
||||||
gulong min_frequency,
|
|
||||||
max_frequency;
|
|
||||||
gint min_signal,
|
|
||||||
max_signal;
|
|
||||||
} GstTunerChannel;
|
|
||||||
|
|
||||||
typedef struct _GstTunerChannelClass {
|
|
||||||
GObjectClass parent;
|
|
||||||
|
|
||||||
/* signals */
|
|
||||||
void (*frequency_changed) (GstTunerChannel *channel,
|
|
||||||
gulong frequency);
|
|
||||||
void (*signal_changed) (GstTunerChannel *channel,
|
|
||||||
gint signal);
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
} GstTunerChannelClass;
|
|
||||||
|
|
||||||
GType gst_tuner_channel_get_type (void);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_TUNER_CHANNEL_H__ */
|
|
|
@ -1,98 +0,0 @@
|
||||||
/* GStreamer Tuner
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* tunernorm.c: tuner norm object design
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "tunernorm.h"
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
/* FILL ME */
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static void gst_tuner_norm_class_init (GstTunerNormClass * klass);
|
|
||||||
static void gst_tuner_norm_init (GstTunerNorm * norm);
|
|
||||||
static void gst_tuner_norm_dispose (GObject * object);
|
|
||||||
|
|
||||||
static GObjectClass *parent_class = NULL;
|
|
||||||
|
|
||||||
/*static guint signals[LAST_SIGNAL] = { 0 };*/
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_tuner_norm_get_type (void)
|
|
||||||
{
|
|
||||||
static GType gst_tuner_norm_type = 0;
|
|
||||||
|
|
||||||
if (!gst_tuner_norm_type) {
|
|
||||||
static const GTypeInfo tuner_norm_info = {
|
|
||||||
sizeof (GstTunerNormClass),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
(GClassInitFunc) gst_tuner_norm_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstTunerNorm),
|
|
||||||
0,
|
|
||||||
(GInstanceInitFunc) gst_tuner_norm_init,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
gst_tuner_norm_type =
|
|
||||||
g_type_register_static (G_TYPE_OBJECT,
|
|
||||||
"GstTunerNorm", &tuner_norm_info, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return gst_tuner_norm_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_tuner_norm_class_init (GstTunerNormClass * klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_klass = (GObjectClass *) klass;
|
|
||||||
|
|
||||||
parent_class = g_type_class_ref (G_TYPE_OBJECT);
|
|
||||||
|
|
||||||
object_klass->dispose = gst_tuner_norm_dispose;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_tuner_norm_init (GstTunerNorm * norm)
|
|
||||||
{
|
|
||||||
norm->label = NULL;
|
|
||||||
norm->fps = 0.;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_tuner_norm_dispose (GObject * object)
|
|
||||||
{
|
|
||||||
GstTunerNorm *norm = GST_TUNER_NORM (object);
|
|
||||||
|
|
||||||
if (norm->label) {
|
|
||||||
g_free (norm->label);
|
|
||||||
norm->label = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parent_class->dispose)
|
|
||||||
parent_class->dispose (object);
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
/* GStreamer Tuner
|
|
||||||
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
||||||
*
|
|
||||||
* tunernorm.h: tuner norm object design
|
|
||||||
*
|
|
||||||
* 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_TUNER_NORM_H__
|
|
||||||
#define __GST_TUNER_NORM_H__
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define GST_TYPE_TUNER_NORM \
|
|
||||||
(gst_tuner_norm_get_type ())
|
|
||||||
#define GST_TUNER_NORM(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TUNER_NORM, GstTunerNorm))
|
|
||||||
#define GST_TUNER_NORM_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TUNER_NORM, GstTunerNormClass))
|
|
||||||
#define GST_IS_TUNER_NORM(obj) \
|
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TUNER_NORM))
|
|
||||||
#define GST_IS_TUNER_NORM_CLASS(klass) \
|
|
||||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TUNER_NORM))
|
|
||||||
|
|
||||||
typedef struct _GstTunerNorm {
|
|
||||||
GObject parent;
|
|
||||||
|
|
||||||
gchar *label;
|
|
||||||
gfloat fps;
|
|
||||||
} GstTunerNorm;
|
|
||||||
|
|
||||||
typedef struct _GstTunerNormClass {
|
|
||||||
GObjectClass parent;
|
|
||||||
|
|
||||||
gpointer _gst_reserved[GST_PADDING];
|
|
||||||
} GstTunerNormClass;
|
|
||||||
|
|
||||||
GType gst_tuner_norm_get_type (void);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __GST_TUNER_NORM_H__ */
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue