GStreamer und FFT

Der Wolf

Erfahrenes Mitglied
Hallo Freunde,

hat jemand von euch schonmal mit GStreamer gearbeitet und vielleicht ein eigenes Plugin geschrieben? Ich versuche gerade ein kleines Plugin zu schreiben, mit dem ich eine FFT (eigentlich lieber ein Spektrogramm) auf dem Audiosignal berechnen kann und wollte dafür die libgstfft verwenden. Laut der Synopsis soll man die dafür die flags benutzten die pkg-config --cflags --lib gstreamer-plugins-base-0.10 liefert und zusätzlich noch ein -lgstfft-0.10 verwenden.
Wenn ich allerdings das Plugin dann in meiner Gstreamer Kette verwenden will bekomme ich ein undefined symbol und ein ldd -r liefert mir die gleiche Meldung. Allerdings weiss ich mittlerweile nicht mehr, was mir noch fehlen könnte.

Ich verwende gst-launch-0.10 version 0.10.18

Und die ldd Ausgabe zu dem Plugin ist:

Code:
ldd -r libgstaudioanalyse.so 
undefined symbol: _Z15gst_fft_f32_newii	(./libgstaudioanalyse.so)
	linux-gate.so.1 =>  (0xb7f7f000)
	libgstfft-0.10.so.0 => /usr/lib/libgstfft-0.10.so.0 (0xb7f3e000)
	libgstreamer-0.10.so.0 => /usr/lib/libgstreamer-0.10.so.0 (0xb7e9a000)
	libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb7e5d000)
	libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb7e59000)
	libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7e55000)
	libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb7e50000)
	librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7e47000)
	libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7d27000)
	libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb7c75000)
	libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7c50000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7b5d000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7b52000)
	libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7b3a000)
	libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb79eb000)
	/lib/ld-linux.so.2 (0xb7f80000)
	libz.so.1 => /usr/lib/libz.so.1 (0xb79d5000)
	libpcre.so.3 => /usr/lib/libpcre.so.3 (0xb79ae000)

Hat vielleicht jemand eine Idee für mich?

Gruß
Der Wolf
 
Hi.

Bash:
c++filt <<<_Z15gst_fft_f32_newii
gst_fft_f32_new(int, int)
Also fehlt dir die gst_fft_f32_new Funktion, als C++ (!) Funktion.

Wolltest du evtl. die C Funktion gst_fft_f32_new einbinden?

Gruß
 
Ja, dass kann gut sein. Immerhin verwende ich die Funktion in einer cpp Klasse.
Allerdings verwende ich schon die ganze Zeit gstreamer Funktionen in der Klasse und hatte bisher keine Probleme.

C++:
/** ==========================================================================
 *
 * @file  			main.cc --
 * @brief 			Source file for audio analyse tool.
 *
 *
 * ==========================================================================
 */

#include "AudioAnalyse.h"

// ==========================================================================
// Public methods.
// ==========================================================================

AudioAnalyse::AudioAnalyse() {

	gint tmp1 = (gint) 1024;
	gboolean inverse = (gboolean) false;
	GstFFTF32 *plan = gst_fft_f32_new(tmp1, inverse);

}

AudioAnalyse::~AudioAnalyse() {

}

void
AudioAnalyse::processData(GstBuffer *buffer) {

	gst_buffer_ref(buffer);
	
	std::cout << getMimeType(buffer) << std::endl;

//	std::cout << gst_fft_next_fast_length(buffer->size) << std::endl;

	gst_buffer_unref(buffer);
	
}

// ==========================================================================
// Private methods.
// ==========================================================================

std::string
AudioAnalyse::getMimeType(const GstBuffer *buffer) {
	GstStructure *properties = gst_caps_get_structure(GST_BUFFER_CAPS(buffer), 0);
	return std::string(gst_structure_get_name(properties));
}

int 
AudioAnalyse::getIntValue(const GstBuffer *buffer, const char *varname) {
	GstStructure *properties = gst_caps_get_structure(GST_BUFFER_CAPS(buffer), 0);
	
	int value = 0, value2 = 0;
	gboolean success = gst_structure_get_int(properties, varname, &value);	
	if (!success) std::cout << "Int value not readable." << std::endl;

	return value;

}

bool
AudioAnalyse::getBoolValue(const GstBuffer *buffer, const char *varname) {
	GstStructure *properties = gst_caps_get_structure(GST_BUFFER_CAPS(buffer), 0);
	
	gboolean value = 0;
	gboolean success = gst_structure_get_boolean(properties, varname, &value);
	if (!success) std::cout << "Bool value not readable." << std::endl;
	return value;

}
 
Du bekommst doch bestimmt Compiler-Warnungen (mit -Wall)?

Hast du den gst/fft/gstfftf32.h Header eingebunden?

Oder hast du die gst_fft_f32_new Funktion irgendwo selbst deklariert?

Gruß
 
Der Kompiler warnt nur davor, dass einige Variablen unused sind. Und die Header-Datei hab ich eingebunden. Ich hänge das Plugin mal an. Ich kompiliere es mit cmake 2.6.
 

Anhänge

Es scheint das die Autoren des GStreamer Plugins nichts unternehmen um den Code von C++ aus nutzbar zu machen.

Du mußt die Header so einbinden:
C++:
extern "C" {
#include ...
}
Gruß
 
Und eine weitere Frage ... (langsam geht mir GStreamer auf den Keks)

Ich versuche gerade die caps für einen Buffer zu generieren, den ich weiter reichen will. Allerdings bekomme ich da Fehlermeldungen, die mir so leider nicht viel sagen. Der Code der die Meldungen zur Laufzeit produziert scheint folgendener zu sein.

C:
std::cout << "Bis hierhin noch ok." << std::endl;

	GstBuffer *outputBuffer = gst_buffer_new_and_alloc(2 * plugin->analyse->getSignal().size()); // 4bytes for 32bit float
	outputBuffer->timestamp = buffer->timestamp;
	outputBuffer->duration = buffer->duration;
	static GstCaps *caps = gst_caps_new_simple(
			"audio/x-raw-int",
			"width", G_TYPE_INT, 16,
			"depth", G_TYPE_INT, 16
			);

	std::cout << "Hier auch noch." << std::endl;

und zwar scheint es in der Funktion gst_caps_new_simple(...) zu passieren. Die Fehlermeldung sieht folgendermaßen aus.

Code:
Bis hierhin noch ok.

(gst-launch-0.10:7968): GLib-GObject-WARNING **: can't peek value table for type `(null)' which is not currently referenced

(gst-launch-0.10:7968): GLib-GObject-WARNING **: /build/buildd/glib2.0-2.16.6/gobject/gvalue.c:96: cannot initialize GValue with type `(null)', this type has no GTypeValueTable implementation

(gst-launch-0.10:7968): GLib-GObject-WARNING **: /build/buildd/glib2.0-2.16.6/gobject/gtype.c:3362: type id `0' is invalid

(gst-launch-0.10:7968): GLib-GObject-WARNING **: can't peek value table for type `<invalid>' which is not currently referenced
Caught SIGSEGV accessing address 0x10
#0  0xb7f5e410 in __kernel_vsyscall ()
#1  0xb7cfac07 in poll () from /lib/tls/i686/cmov/libc.so.6
#2  0xb7dd00e6 in **** () from /usr/lib/libglib-2.0.so.0
#3  0xb7dd0497 in g_main_loop_run () from /usr/lib/libglib-2.0.so.0
#4  0xb7eae859 in gst_bus_poll () from /usr/lib/libgstreamer-0.10.so.0
#5  0x0804a4e3 in **** ()
#6  0x0804b966 in **** ()
#7  0xb7c44450 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
#8  0x0804a201 in **** ()

Gruß
Der Wolf
 
Zurück