1 /* RealAudio wrapper plugin
3 * Copyright (C) 2006 Lutz Mueller <lutz@topfrose.de>
4 * Copyright (C) 2006 Edward Hervey <bilboed@bilboed.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
27 #include "gstrealaudiodec.h"
31 GST_DEBUG_CATEGORY_STATIC (real_audio_dec_debug);
32 #define GST_CAT_DEFAULT real_audio_dec_debug
34 static GstStaticPadTemplate snk_t =
35 GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
36 GST_STATIC_CAPS ("audio/x-pn-realaudio, "
37 "raversion = { 3, 4, 5, 6, 8 }; " "audio/x-sipro "));
39 static GstStaticPadTemplate src_t =
40 GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
41 GST_STATIC_CAPS ("audio/x-raw-int, "
42 "width = (int) [ 1, MAX ], "
43 "depth = (int) [ 1, MAX ], "
44 "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]"));
46 #define DEFAULT_RACOOK_NAMES "cook.so:cook.so.6.0"
47 #define DEFAULT_RAATRK_NAMES "atrc.so:atrc.so.6.0"
48 #define DEFAULT_RA14_4_NAMES "14_4.so.6.0"
49 #define DEFAULT_RA28_8_NAMES "28_8.so.6.0"
50 #define DEFAULT_RASIPR_NAMES "sipr.so:sipr.so.6.0"
51 #define DEFAULT_PWD "Ardubancel Quazanga"
56 PROP_REAL_CODECS_PATH,
67 GST_REAL_AUDIO_DEC_VERSION_ATRK = 3,
68 GST_REAL_AUDIO_DEC_VERSION_14_4 = 4,
69 GST_REAL_AUDIO_DEC_VERSION_28_8 = 5,
70 GST_REAL_AUDIO_DEC_VERSION_SIPR = 6,
71 GST_REAL_AUDIO_DEC_VERSION_COOK = 8
72 } GstRealAudioDecVersion;
79 /* Used by the REAL library. */
82 guint16 (*RADecode) (gpointer, guint8 *, guint32, guint8 *, guint32 *,
84 guint16 (*RACloseCodec) (gpointer);
85 guint16 (*RAFreeDecoder) (gpointer);
86 guint16 (*RAInitDecoder) (gpointer, gpointer);
87 guint16 (*RAOpenCodec2) (gpointer, const gchar *);
88 guint16 (*RASetFlavor) (gpointer, guint16);
89 void (*SetDLLAccessPath) (gchar *);
90 void (*RASetPwd) (gpointer, const gchar *);
105 struct _GstRealAudioDec
112 guint width, height, leaf_size;
117 gboolean checked_modules;
118 gchar *real_codecs_path;
122 gboolean valid_ra14_4;
124 gboolean valid_ra28_8;
132 struct _GstRealAudioDecClass
134 GstElementClass parent_class;
137 GST_BOILERPLATE (GstRealAudioDec, gst_real_audio_dec, GstElement,
141 gst_real_audio_dec_chain (GstPad * pad, GstBuffer * in)
143 GstRealAudioDec *dec = GST_REAL_AUDIO_DEC (GST_PAD_PARENT (pad));
145 GstClockTime timestamp;
146 GstBuffer *out = NULL;
150 if (G_UNLIKELY (dec->lib.RADecode == NULL || dec->lib.module == NULL))
153 timestamp = GST_BUFFER_TIMESTAMP (in);
155 flow = gst_pad_alloc_buffer (dec->src, GST_BUFFER_OFFSET_NONE,
156 dec->width * dec->leaf_size * dec->height * 16,
157 GST_PAD_CAPS (dec->src), &out);
159 if (flow != GST_FLOW_OK)
162 res = dec->lib.RADecode (dec->lib.context, GST_BUFFER_DATA (in),
163 GST_BUFFER_SIZE (in), GST_BUFFER_DATA (out), &len, -1);
166 goto could_not_decode;
168 GST_BUFFER_SIZE (out) = len;
169 GST_BUFFER_TIMESTAMP (out) = timestamp;
171 flow = gst_pad_push (dec->src, out);
174 gst_buffer_unref (in);
180 gst_buffer_unref (out);
181 GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL),
182 ("Could not decode buffer (%i).", res));
183 flow = GST_FLOW_ERROR;
188 GST_WARNING_OBJECT (dec, "decoder not open, probably no input caps set "
189 "yet, caps on input buffer: %" GST_PTR_FORMAT, GST_BUFFER_CAPS (in));
190 flow = GST_FLOW_NOT_NEGOTIATED;
196 close_library (GstRealAudioDec * dec, GstRADecLibrary * lib)
199 GST_LOG_OBJECT (dec, "closing library");
200 if (lib->RACloseCodec)
201 lib->RACloseCodec (lib->context);
202 /* lib->RAFreeDecoder (lib->context); */
205 GST_LOG_OBJECT (dec, "closing library module");
206 g_module_close (lib->module);
208 memset (lib, 0, sizeof (GstRADecLibrary));
212 open_library (GstRealAudioDec * dec, gint version, GstRADecLibrary * lib)
214 const gchar *path, *names;
215 gchar **split_names, **split_path;
217 gpointer ra_close_codec, ra_decode, ra_free_decoder;
218 gpointer ra_open_codec2, ra_init_decoder, ra_set_flavor;
219 gpointer set_dll_access_path = NULL, ra_set_pwd = NULL;
220 gchar *tmppath = NULL;
223 path = dec->real_codecs_path ? dec->real_codecs_path :
224 DEFAULT_REAL_CODECS_PATH;
227 case GST_REAL_AUDIO_DEC_VERSION_COOK:
228 names = dec->racook_names ? dec->racook_names : DEFAULT_RACOOK_NAMES;
230 case GST_REAL_AUDIO_DEC_VERSION_ATRK:
231 names = dec->raatrk_names ? dec->raatrk_names : DEFAULT_RAATRK_NAMES;
233 case GST_REAL_AUDIO_DEC_VERSION_14_4:
234 names = dec->ra14_4_names ? dec->ra14_4_names : DEFAULT_RA14_4_NAMES;
236 case GST_REAL_AUDIO_DEC_VERSION_28_8:
237 names = dec->ra28_8_names ? dec->ra28_8_names : DEFAULT_RA28_8_NAMES;
239 case GST_REAL_AUDIO_DEC_VERSION_SIPR:
240 names = dec->rasipr_names ? dec->rasipr_names : DEFAULT_RASIPR_NAMES;
243 goto unknown_version;
246 GST_LOG_OBJECT (dec, "splitting paths %s, names %s", path, names);
248 split_path = g_strsplit (path, ":", 0);
249 split_names = g_strsplit (names, ":", 0);
251 for (i = 0; split_path[i]; i++) {
252 for (j = 0; split_names[j]; j++) {
253 gchar *codec = g_strconcat (split_path[i], "/", split_names[j], NULL);
255 GST_LOG_OBJECT (dec, "opening module %s", codec);
257 /* This is racy, but it doesn't matter here; would be nice if GModule
258 * gave us a GError instead of an error string, but it doesn't, so.. */
259 if (g_file_test (codec, G_FILE_TEST_EXISTS)) {
260 lib->module = g_module_open (codec, G_MODULE_BIND_LAZY);
261 if (lib->module == NULL) {
262 GST_ERROR_OBJECT (dec, "Could not open codec library '%s': %s",
263 codec, g_module_error ());
266 GST_DEBUG_OBJECT (dec, "%s does not exist", codec);
270 goto codec_search_done;
275 /* we keep the path for a while to set the dll access path */
276 g_strfreev (split_names);
278 if (lib->module == NULL)
281 GST_LOG_OBJECT (dec, "finding symbols");
283 if (!g_module_symbol (lib->module, "RACloseCodec", &ra_close_codec) ||
284 !g_module_symbol (lib->module, "RADecode", &ra_decode) ||
285 !g_module_symbol (lib->module, "RAFreeDecoder", &ra_free_decoder) ||
286 !g_module_symbol (lib->module, "RAOpenCodec2", &ra_open_codec2) ||
287 !g_module_symbol (lib->module, "RAInitDecoder", &ra_init_decoder) ||
288 !g_module_symbol (lib->module, "RASetFlavor", &ra_set_flavor)) {
292 g_module_symbol (lib->module, "RASetPwd", &ra_set_pwd);
293 g_module_symbol (lib->module, "SetDLLAccessPath", &set_dll_access_path);
295 lib->RACloseCodec = (guint16 (*)(gpointer)) ra_close_codec;
297 (guint16 (*)(gpointer, guint8 *, guint32, guint8 *, guint32 *, guint32))
299 lib->RAFreeDecoder = (guint16 (*)(gpointer)) ra_free_decoder;
300 lib->RAOpenCodec2 = (guint16 (*)(gpointer, const gchar *)) ra_open_codec2;
301 lib->RAInitDecoder = (guint16 (*)(gpointer, gpointer)) ra_init_decoder;
302 lib->RASetFlavor = (guint16 (*)(gpointer, guint16)) ra_set_flavor;
303 lib->RASetPwd = (void (*)(gpointer, const gchar *)) ra_set_pwd;
304 lib->SetDLLAccessPath = (void (*)(gchar *)) set_dll_access_path;
306 if (lib->SetDLLAccessPath)
307 lib->SetDLLAccessPath (split_path[i]);
309 tmppath = g_strdup_printf ("%s/", split_path[i]);
310 if ((res = lib->RAOpenCodec2 (&lib->context, tmppath))) {
312 goto could_not_initialize;
316 /* now we are done with the split paths, so free them */
317 g_strfreev (split_path);
324 GST_DEBUG_OBJECT (dec, "Cannot handle version %i.", version);
329 g_strfreev (split_path);
330 GST_DEBUG_OBJECT (dec, "Could not find library '%s' in '%s'", names, path);
335 g_strfreev (split_path);
336 close_library (dec, lib);
337 GST_DEBUG_OBJECT (dec, "Could not load all symbols: %s", g_module_error ());
340 could_not_initialize:
342 close_library (dec, lib);
343 GST_WARNING_OBJECT (dec, "Initialization of REAL driver failed (%i).", res);
349 gst_real_audio_dec_probe_modules (GstRealAudioDec * dec)
351 GstRADecLibrary dummy = { NULL };
353 if ((dec->valid_atrk =
354 open_library (dec, GST_REAL_AUDIO_DEC_VERSION_ATRK, &dummy)))
355 close_library (dec, &dummy);
356 if ((dec->valid_ra14_4 =
357 open_library (dec, GST_REAL_AUDIO_DEC_VERSION_14_4, &dummy)))
358 close_library (dec, &dummy);
359 if ((dec->valid_ra28_8 =
360 open_library (dec, GST_REAL_AUDIO_DEC_VERSION_28_8, &dummy)))
361 close_library (dec, &dummy);
362 #ifdef HAVE_CPU_X86_64
363 /* disabled because it does not seem to work on 64 bits */
364 dec->valid_sipr = FALSE;
366 if ((dec->valid_sipr =
367 open_library (dec, GST_REAL_AUDIO_DEC_VERSION_SIPR, &dummy)))
368 close_library (dec, &dummy);
370 if ((dec->valid_cook =
371 open_library (dec, GST_REAL_AUDIO_DEC_VERSION_COOK, &dummy)))
372 close_library (dec, &dummy);
376 gst_real_audio_dec_getcaps (GstPad * pad)
378 GstRealAudioDec *dec = GST_REAL_AUDIO_DEC (GST_PAD_PARENT (pad));
381 if (dec->checked_modules) {
382 GValue versions = { 0 };
383 GValue version = { 0 };
385 GST_LOG_OBJECT (dec, "constructing caps");
387 g_value_init (&versions, GST_TYPE_LIST);
388 g_value_init (&version, G_TYPE_INT);
390 if (dec->valid_atrk) {
391 g_value_set_int (&version, GST_REAL_AUDIO_DEC_VERSION_ATRK);
392 gst_value_list_append_value (&versions, &version);
394 if (dec->valid_ra14_4) {
395 g_value_set_int (&version, GST_REAL_AUDIO_DEC_VERSION_14_4);
396 gst_value_list_append_value (&versions, &version);
398 if (dec->valid_ra28_8) {
399 g_value_set_int (&version, GST_REAL_AUDIO_DEC_VERSION_28_8);
400 gst_value_list_append_value (&versions, &version);
402 if (dec->valid_sipr) {
403 g_value_set_int (&version, GST_REAL_AUDIO_DEC_VERSION_SIPR);
404 gst_value_list_append_value (&versions, &version);
406 if (dec->valid_cook) {
407 g_value_set_int (&version, GST_REAL_AUDIO_DEC_VERSION_COOK);
408 gst_value_list_append_value (&versions, &version);
411 if (gst_value_list_get_size (&versions) > 0) {
412 res = gst_caps_new_simple ("audio/x-pn-realaudio", NULL);
413 gst_structure_set_value (gst_caps_get_structure (res, 0),
414 "raversion", &versions);
416 res = gst_caps_new_empty ();
419 if (dec->valid_sipr) {
420 gst_caps_append (res, gst_caps_new_simple ("audio/x-sipro", NULL));
422 g_value_unset (&versions);
423 g_value_unset (&version);
425 GST_LOG_OBJECT (dec, "returning padtemplate caps");
426 res = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
428 GST_LOG_OBJECT (dec, "returning caps %" GST_PTR_FORMAT, res);
434 gst_real_audio_dec_setcaps (GstPad * pad, GstCaps * caps)
436 GstRealAudioDec *dec = GST_REAL_AUDIO_DEC (GST_PAD_PARENT (pad));
437 GstStructure *s = gst_caps_get_structure (caps, 0);
438 gint version, flavor, channels, rate, leaf_size, packet_size, width, height;
443 GstBuffer *buf = NULL;
444 const gchar *name = gst_structure_get_name (s);
446 if (!strcmp (name, "audio/x-sipro")) {
447 version = GST_REAL_AUDIO_DEC_VERSION_SIPR;
449 if (!gst_structure_get_int (s, "raversion", &version))
453 if (!gst_structure_get_int (s, "flavor", &flavor) ||
454 !gst_structure_get_int (s, "channels", &channels) ||
455 !gst_structure_get_int (s, "width", &width) ||
456 !gst_structure_get_int (s, "rate", &rate) ||
457 !gst_structure_get_int (s, "height", &height) ||
458 !gst_structure_get_int (s, "leaf_size", &leaf_size) ||
459 !gst_structure_get_int (s, "packet_size", &packet_size))
462 if ((v = gst_structure_get_value (s, "codec_data")))
463 buf = g_value_peek_pointer (v);
465 GST_LOG_OBJECT (dec, "opening code for version %d", version);
467 /* first close existing decoder */
468 close_library (dec, &dec->lib);
470 if (!open_library (dec, version, &dec->lib))
473 /* we have the module, no initialize with the caps data */
474 data.samplerate = rate;
476 data.channels = channels;
478 data.leaf_size = leaf_size;
479 data.packet_size = packet_size;
480 data.datalen = buf ? GST_BUFFER_SIZE (buf) : 0;
481 data.data = buf ? GST_BUFFER_DATA (buf) : NULL;
483 if ((res = dec->lib.RAInitDecoder (dec->lib.context, &data))) {
484 GST_WARNING_OBJECT (dec, "RAInitDecoder() failed");
485 goto could_not_initialize;
488 if (dec->lib.RASetPwd) {
489 dec->lib.RASetPwd (dec->lib.context, dec->pwd ? dec->pwd : DEFAULT_PWD);
492 if ((res = dec->lib.RASetFlavor (dec->lib.context, flavor))) {
493 GST_WARNING_OBJECT (dec, "RASetFlavor(%d) failed", flavor);
494 goto could_not_initialize;
497 caps = gst_caps_new_simple ("audio/x-raw-int",
498 "endianness", G_TYPE_INT, G_BYTE_ORDER,
499 "width", G_TYPE_INT, width,
500 "depth", G_TYPE_INT, width,
501 "rate", G_TYPE_INT, rate,
502 "channels", G_TYPE_INT, channels, "signed", G_TYPE_BOOLEAN, TRUE, NULL);
503 bres = gst_pad_set_caps (GST_PAD (dec->src), caps);
504 gst_caps_unref (caps);
506 goto could_not_set_caps;
509 dec->height = height;
510 dec->leaf_size = leaf_size;
512 GST_LOG_OBJECT (dec, "opened module");
518 GST_DEBUG_OBJECT (dec, "Could not find all necessary keys in structure.");
523 GST_DEBUG_OBJECT (dec, "Could not find decoder");
526 could_not_initialize:
528 close_library (dec, &dec->lib);
529 GST_WARNING_OBJECT (dec, "Initialization of REAL driver failed (%i).", res);
534 /* should normally not fail */
535 close_library (dec, &dec->lib);
536 GST_DEBUG_OBJECT (dec, "Could not convince peer to accept caps.");
542 gst_real_audio_dec_init (GstRealAudioDec * dec, GstRealAudioDecClass * klass)
544 dec->snk = gst_pad_new_from_static_template (&snk_t, "sink");
545 gst_pad_set_setcaps_function (dec->snk,
546 GST_DEBUG_FUNCPTR (gst_real_audio_dec_setcaps));
547 gst_pad_set_getcaps_function (dec->snk,
548 GST_DEBUG_FUNCPTR (gst_real_audio_dec_getcaps));
549 gst_pad_set_chain_function (dec->snk,
550 GST_DEBUG_FUNCPTR (gst_real_audio_dec_chain));
551 gst_element_add_pad (GST_ELEMENT (dec), dec->snk);
553 dec->src = gst_pad_new_from_static_template (&src_t, "src");
554 gst_pad_use_fixed_caps (dec->src);
555 gst_element_add_pad (GST_ELEMENT (dec), dec->src);
559 gst_real_audio_dec_base_init (gpointer g_class)
561 GstElementClass *ec = GST_ELEMENT_CLASS (g_class);
563 gst_element_class_add_static_pad_template (ec, &snk_t);
564 gst_element_class_add_static_pad_template (ec, &src_t);
565 gst_element_class_set_details_simple (ec, "RealAudio decoder",
566 "Codec/Decoder/Audio", "Decoder for RealAudio streams",
567 "Lutz Mueller <lutz@topfrose.de>");
570 static GstStateChangeReturn
571 gst_real_audio_dec_change_state (GstElement * element,
572 GstStateChange transition)
574 GstStateChangeReturn ret;
575 GstRealAudioDec *dec = GST_REAL_AUDIO_DEC (element);
577 switch (transition) {
578 case GST_STATE_CHANGE_NULL_TO_READY:
579 gst_real_audio_dec_probe_modules (dec);
580 dec->checked_modules = TRUE;
586 ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
588 switch (transition) {
589 case GST_STATE_CHANGE_PAUSED_TO_READY:
590 close_library (dec, &dec->lib);
592 case GST_STATE_CHANGE_READY_TO_NULL:
593 dec->checked_modules = FALSE;
602 gst_real_audio_dec_finalize (GObject * object)
604 GstRealAudioDec *dec = GST_REAL_AUDIO_DEC (object);
606 close_library (dec, &dec->lib);
608 if (dec->real_codecs_path) {
609 g_free (dec->real_codecs_path);
610 dec->real_codecs_path = NULL;
612 if (dec->racook_names) {
613 g_free (dec->racook_names);
614 dec->racook_names = NULL;
616 if (dec->raatrk_names) {
617 g_free (dec->raatrk_names);
618 dec->raatrk_names = NULL;
620 if (dec->ra14_4_names) {
621 g_free (dec->ra14_4_names);
622 dec->ra14_4_names = NULL;
624 if (dec->ra28_8_names) {
625 g_free (dec->ra28_8_names);
626 dec->ra28_8_names = NULL;
628 if (dec->rasipr_names) {
629 g_free (dec->rasipr_names);
630 dec->rasipr_names = NULL;
633 G_OBJECT_CLASS (parent_class)->finalize (object);
637 gst_real_audio_dec_set_property (GObject * object, guint prop_id,
638 const GValue * value, GParamSpec * pspec)
640 GstRealAudioDec *dec = GST_REAL_AUDIO_DEC (object);
643 case PROP_REAL_CODECS_PATH:
644 if (dec->real_codecs_path)
645 g_free (dec->real_codecs_path);
646 dec->real_codecs_path = g_value_dup_string (value);
648 case PROP_RACOOK_NAMES:
649 if (dec->racook_names)
650 g_free (dec->racook_names);
651 dec->racook_names = g_value_dup_string (value);
653 case PROP_RAATRK_NAMES:
654 if (dec->raatrk_names)
655 g_free (dec->raatrk_names);
656 dec->raatrk_names = g_value_dup_string (value);
658 case PROP_RA14_4_NAMES:
659 if (dec->ra14_4_names)
660 g_free (dec->ra14_4_names);
661 dec->ra14_4_names = g_value_dup_string (value);
663 case PROP_RA28_8_NAMES:
664 if (dec->ra28_8_names)
665 g_free (dec->ra28_8_names);
666 dec->ra28_8_names = g_value_dup_string (value);
668 case PROP_RASIPR_NAMES:
669 if (dec->rasipr_names)
670 g_free (dec->rasipr_names);
671 dec->rasipr_names = g_value_dup_string (value);
676 dec->pwd = g_value_dup_string (value);
679 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
685 gst_real_audio_dec_get_property (GObject * object, guint prop_id,
686 GValue * value, GParamSpec * pspec)
688 GstRealAudioDec *dec = GST_REAL_AUDIO_DEC (object);
691 case PROP_REAL_CODECS_PATH:
692 g_value_set_string (value, dec->real_codecs_path ? dec->real_codecs_path
693 : DEFAULT_REAL_CODECS_PATH);
695 case PROP_RACOOK_NAMES:
696 g_value_set_string (value, dec->racook_names ? dec->racook_names :
697 DEFAULT_RACOOK_NAMES);
699 case PROP_RAATRK_NAMES:
700 g_value_set_string (value, dec->raatrk_names ? dec->raatrk_names :
701 DEFAULT_RAATRK_NAMES);
703 case PROP_RA14_4_NAMES:
704 g_value_set_string (value, dec->ra14_4_names ? dec->ra14_4_names :
705 DEFAULT_RA14_4_NAMES);
707 case PROP_RA28_8_NAMES:
708 g_value_set_string (value, dec->ra28_8_names ? dec->ra28_8_names :
709 DEFAULT_RA28_8_NAMES);
711 case PROP_RASIPR_NAMES:
712 g_value_set_string (value, dec->rasipr_names ? dec->rasipr_names :
713 DEFAULT_RASIPR_NAMES);
716 g_value_set_string (value, dec->pwd ? dec->pwd : DEFAULT_PWD);
719 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
725 gst_real_audio_dec_class_init (GstRealAudioDecClass * klass)
727 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
728 GObjectClass *object_class = G_OBJECT_CLASS (klass);
730 object_class->set_property = gst_real_audio_dec_set_property;
731 object_class->get_property = gst_real_audio_dec_get_property;
732 object_class->finalize = gst_real_audio_dec_finalize;
734 element_class->change_state = gst_real_audio_dec_change_state;
736 g_object_class_install_property (object_class, PROP_REAL_CODECS_PATH,
737 g_param_spec_string ("real-codecs-path",
738 "Path where to search for RealPlayer codecs",
739 "Path where to search for RealPlayer codecs",
740 DEFAULT_REAL_CODECS_PATH,
741 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
742 g_object_class_install_property (object_class, PROP_RACOOK_NAMES,
743 g_param_spec_string ("racook-names", "Names of cook driver",
744 "Names of cook driver", DEFAULT_RACOOK_NAMES,
745 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
746 g_object_class_install_property (object_class, PROP_RAATRK_NAMES,
747 g_param_spec_string ("raatrk-names", "Names of atrk driver",
748 "Names of atrk driver", DEFAULT_RAATRK_NAMES,
749 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
750 g_object_class_install_property (object_class, PROP_RA14_4_NAMES,
751 g_param_spec_string ("ra14-4-names", "Names of 14_4 driver",
752 "Names of 14_4 driver", DEFAULT_RA14_4_NAMES,
753 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
754 g_object_class_install_property (object_class, PROP_RA28_8_NAMES,
755 g_param_spec_string ("ra28-8-names", "Names of 28_8 driver",
756 "Names of 28_8 driver", DEFAULT_RA28_8_NAMES,
757 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
758 g_object_class_install_property (object_class, PROP_RASIPR_NAMES,
759 g_param_spec_string ("rasipr-names", "Names of sipr driver",
760 "Names of sipr driver", DEFAULT_RASIPR_NAMES,
761 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
762 g_object_class_install_property (object_class, PROP_PASSWORD,
763 g_param_spec_string ("password", "Password", "Password",
764 DEFAULT_PWD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
766 GST_DEBUG_CATEGORY_INIT (real_audio_dec_debug, "realaudiodec", 0,
767 "RealAudio decoder");