gst/gststructure.c: Convert function to use gst_value_serialize().

Original commit message from CVS:
* gst/gststructure.c: (gst_structure_to_string):
Convert function to use gst_value_serialize().
* gst/gstvalue.c: (gst_value_serialize_list),
(gst_value_serialize_fourcc), (gst_value_serialize_int_range),
(gst_value_serialize_double_range), (gst_value_serialize_boolean),
(gst_value_serialize_int), (gst_value_serialize_double),
(gst_string_wrap), (gst_value_serialize_string),
(gst_value_serialize), (gst_value_deserialize):
* gst/gstvalue.h:
Add implementations for serialize.
This commit is contained in:
David Schleef 2004-01-20 09:14:25 +00:00
parent 05202e6ac7
commit 134e00d543
4 changed files with 154 additions and 77 deletions

View file

@ -1,3 +1,16 @@
2004-01-20 David Schleef <ds@schleef.org>
* gst/gststructure.c: (gst_structure_to_string):
Convert function to use gst_value_serialize().
* gst/gstvalue.c: (gst_value_serialize_list),
(gst_value_serialize_fourcc), (gst_value_serialize_int_range),
(gst_value_serialize_double_range), (gst_value_serialize_boolean),
(gst_value_serialize_int), (gst_value_serialize_double),
(gst_string_wrap), (gst_value_serialize_string),
(gst_value_serialize), (gst_value_deserialize):
* gst/gstvalue.h:
Add implementations for serialize.
2004-01-20 Julien MOUTTE <julien@moutte.net> 2004-01-20 Julien MOUTTE <julien@moutte.net>
* gst/gsterror.h: xvidenc.c needs GST_LIBRARY_ERROR_ENCODE. Dunno if * gst/gsterror.h: xvidenc.c needs GST_LIBRARY_ERROR_ENCODE. Dunno if

View file

@ -955,55 +955,6 @@ static const char *_gst_structure_to_abbr(GType type)
((c) == '-') || ((c) == '+') || ((c) == '/') || ((c) == ':') || \ ((c) == '-') || ((c) == '+') || ((c) == '/') || ((c) == ':') || \
((c) == '.')) ((c) == '.'))
static gchar *
_gst_structure_wrap_string(gchar *s)
{
gchar *t;
int len;
gchar *d, *e;
gboolean wrap = FALSE;
len = 0;
t = s;
while (*t) {
if(GST_ASCII_IS_STRING(*t)) {
len++;
} else if(*t < 0x20 || *t >= 0x7f) {
wrap = TRUE;
len += 4;
} else {
wrap = TRUE;
len += 2;
}
t++;
}
if (!wrap) return s;
e = d = g_malloc(len + 3);
*e++ = '\"';
t = s;
while (*t) {
if(GST_ASCII_IS_STRING(*t)) {
*e++ = *t++;
} else if(*t < 0x20 || *t >= 0x7f) {
*e++ = '\\';
*e++ = '0' + ((*t)>>6);
*e++ = '0' + (((*t)>>3)&0x7);
*e++ = '0' + ((*t++)&0x7);
} else {
*e++ = '\\';
*e++ = *t++;
}
}
*e++ = '\"';
*e = 0;
g_free(s);
return d;
}
/** /**
* gst_structure_to_string: * gst_structure_to_string:
* @structure: a #GstStructure * @structure: a #GstStructure
@ -1017,7 +968,6 @@ gst_structure_to_string(const GstStructure *structure)
{ {
GstStructureField *field; GstStructureField *field;
GString *s; GString *s;
char *t;
int i; int i;
g_return_val_if_fail(structure != NULL, NULL); g_return_val_if_fail(structure != NULL, NULL);
@ -1026,14 +976,12 @@ gst_structure_to_string(const GstStructure *structure)
/* FIXME this string may need to be escaped */ /* FIXME this string may need to be escaped */
g_string_append_printf(s, "%s", g_quark_to_string(structure->name)); g_string_append_printf(s, "%s", g_quark_to_string(structure->name));
for(i=0;i<structure->fields->len;i++) { for(i=0;i<structure->fields->len;i++) {
GValue s_val = { 0 }; char *t;
GType type; GType type;
field = GST_STRUCTURE_FIELD(structure, i); field = GST_STRUCTURE_FIELD(structure, i);
g_value_init(&s_val, G_TYPE_STRING); t = gst_value_serialize (&field->value);
g_value_transform (&field->value, &s_val);
type = G_VALUE_TYPE (&field->value); type = G_VALUE_TYPE (&field->value);
if (type == GST_TYPE_LIST) { if (type == GST_TYPE_LIST) {
@ -1045,21 +993,14 @@ gst_structure_to_string(const GstStructure *structure)
} else { } else {
type = G_TYPE_INT; type = G_TYPE_INT;
} }
t = g_strdup(g_value_get_string(&s_val));
} else if (G_VALUE_TYPE(&field->value) == GST_TYPE_INT_RANGE) { } else if (G_VALUE_TYPE(&field->value) == GST_TYPE_INT_RANGE) {
type = G_TYPE_INT; type = G_TYPE_INT;
t = g_strdup(g_value_get_string(&s_val));
} else if (G_VALUE_TYPE(&field->value) == GST_TYPE_DOUBLE_RANGE) { } else if (G_VALUE_TYPE(&field->value) == GST_TYPE_DOUBLE_RANGE) {
type = G_TYPE_DOUBLE; type = G_TYPE_DOUBLE;
t = g_strdup(g_value_get_string(&s_val));
} else {
t = _gst_structure_wrap_string(g_strdup(g_value_get_string(&s_val)));
} }
g_string_append_printf(s, ", %s=(%s)%s", g_quark_to_string(field->name), g_string_append_printf(s, ", %s=(%s)%s", g_quark_to_string(field->name),
_gst_structure_to_abbr(type), t); _gst_structure_to_abbr(type), t);
g_free(t); g_free(t);
g_value_unset (&s_val);
} }
return g_string_free(s, FALSE); return g_string_free(s, FALSE);
} }

View file

@ -283,8 +283,24 @@ gst_value_compare_list (const GValue *value1, const GValue *value2)
static char * static char *
gst_value_serialize_list (const GValue *value) gst_value_serialize_list (const GValue *value)
{ {
g_warning("unimplemented"); int i;
return NULL; GArray *array = value->data[0].v_pointer;
GString *s;
GValue *v;
gchar *s_val;
s = g_string_new("{ ");
for(i=0;i<array->len;i++){
v = &g_array_index (array, GValue, i);
s_val = gst_value_serialize (v);
g_string_append (s, s_val);
g_free (s_val);
if (i<array->len - 1) {
g_string_append (s, ", ");
}
}
g_string_append (s, " }");
return g_string_free (s, FALSE);
} }
static gboolean static gboolean
@ -384,8 +400,16 @@ gst_value_compare_fourcc (const GValue *value1, const GValue *value2)
static char * static char *
gst_value_serialize_fourcc (const GValue *value) gst_value_serialize_fourcc (const GValue *value)
{ {
g_warning("unimplemented"); guint32 fourcc = value->data[0].v_int;
return NULL;
if (g_ascii_isalnum ((fourcc>>0) & 0xff) &&
g_ascii_isalnum ((fourcc>>8) & 0xff) &&
g_ascii_isalnum ((fourcc>>16) & 0xff) &&
g_ascii_isalnum ((fourcc>>24) & 0xff)){
return g_strdup_printf(GST_FOURCC_FORMAT, GST_FOURCC_ARGS(fourcc));
} else {
return g_strdup_printf("0x%08x", fourcc);
}
} }
static gboolean static gboolean
@ -499,8 +523,8 @@ gst_value_compare_int_range (const GValue *value1, const GValue *value2)
static char * static char *
gst_value_serialize_int_range (const GValue *value) gst_value_serialize_int_range (const GValue *value)
{ {
g_warning("unimplemented"); return g_strdup_printf ("[ %d, %d ]", value->data[0].v_int,
return NULL; value->data[1].v_int);
} }
static gboolean static gboolean
@ -619,8 +643,11 @@ gst_value_compare_double_range (const GValue *value1, const GValue *value2)
static char * static char *
gst_value_serialize_double_range (const GValue *value) gst_value_serialize_double_range (const GValue *value)
{ {
g_warning("unimplemented"); char d1[G_ASCII_DTOSTR_BUF_SIZE];
return NULL; char d2[G_ASCII_DTOSTR_BUF_SIZE];
g_ascii_dtostr(d1, G_ASCII_DTOSTR_BUF_SIZE, value->data[0].v_double);
g_ascii_dtostr(d2, G_ASCII_DTOSTR_BUF_SIZE, value->data[1].v_double);
return g_strdup_printf ("[ %s, %s ]", d1, d2);
} }
static gboolean static gboolean
@ -671,8 +698,10 @@ gst_value_compare_boolean (const GValue *value1, const GValue *value2)
static char * static char *
gst_value_serialize_boolean (const GValue *value) gst_value_serialize_boolean (const GValue *value)
{ {
g_warning("unimplemented"); if (value->data[0].v_int) {
return NULL; return g_strdup ("true");
}
return g_strdup ("false");
} }
static gboolean static gboolean
@ -698,8 +727,7 @@ gst_value_compare_int (const GValue *value1, const GValue *value2)
static char * static char *
gst_value_serialize_int (const GValue *value) gst_value_serialize_int (const GValue *value)
{ {
g_warning("unimplemented"); return g_strdup_printf ("%d", value->data[0].v_int);
return NULL;
} }
static gboolean static gboolean
@ -727,8 +755,9 @@ gst_value_compare_double (const GValue *value1, const GValue *value2)
static char * static char *
gst_value_serialize_double (const GValue *value) gst_value_serialize_double (const GValue *value)
{ {
g_warning("unimplemented"); char d[G_ASCII_DTOSTR_BUF_SIZE];
return NULL; g_ascii_dtostr(d, G_ASCII_DTOSTR_BUF_SIZE, value->data[0].v_double);
return g_strdup (d);
} }
static gboolean static gboolean
@ -750,11 +779,62 @@ gst_value_compare_string (const GValue *value1, const GValue *value2)
return GST_VALUE_EQUAL; return GST_VALUE_EQUAL;
} }
#define GST_ASCII_IS_STRING(c) (g_ascii_isalnum((c)) || ((c) == '_') || \
((c) == '-') || ((c) == '+') || ((c) == '/') || ((c) == ':') || \
((c) == '.'))
static gchar *
gst_string_wrap (const char *s)
{
const gchar *t;
int len;
gchar *d, *e;
gboolean wrap = FALSE;
len = 0;
t = s;
while (*t) {
if(GST_ASCII_IS_STRING(*t)) {
len++;
} else if(*t < 0x20 || *t >= 0x7f) {
wrap = TRUE;
len += 4;
} else {
wrap = TRUE;
len += 2;
}
t++;
}
if (!wrap) return strdup (s);
e = d = g_malloc(len + 3);
*e++ = '\"';
t = s;
while (*t) {
if(GST_ASCII_IS_STRING(*t)) {
*e++ = *t++;
} else if(*t < 0x20 || *t >= 0x7f) {
*e++ = '\\';
*e++ = '0' + ((*t)>>6);
*e++ = '0' + (((*t)>>3)&0x7);
*e++ = '0' + ((*t++)&0x7);
} else {
*e++ = '\\';
*e++ = *t++;
}
}
*e++ = '\"';
*e = 0;
return d;
}
static char * static char *
gst_value_serialize_string (const GValue *value) gst_value_serialize_string (const GValue *value)
{ {
g_warning("unimplemented"); return gst_string_wrap (value->data[0].v_pointer);
return NULL;
} }
static gboolean static gboolean
@ -1102,6 +1182,45 @@ gst_value_init_and_copy (GValue *dest, const GValue *src)
g_value_copy (src, dest); g_value_copy (src, dest);
} }
/**
* gst_value_serialize:
*
*/
gchar *
gst_value_serialize (const GValue *value)
{
int i;
GValue s_val = { 0 };
GstValueTable *table;
char *s;
for(i=0;i<gst_value_table->len;i++){
table = &g_array_index(gst_value_table, GstValueTable, i);
if(table->type != G_VALUE_TYPE(value) ||
table->serialize == NULL) continue;
return table->serialize(value);
}
g_value_init (&s_val, G_TYPE_STRING);
g_value_transform (value, &s_val);
s = gst_string_wrap (g_value_get_string (&s_val));
g_value_unset (&s_val);
return s;
}
/**
* gst_value_deserialize:
*
*/
gboolean
gst_value_deserialize (GValue *dest, const gchar *src)
{
g_warning("unimplemented");
return FALSE;
}
void void
_gst_value_initialize (void) _gst_value_initialize (void)
{ {

View file

@ -129,6 +129,10 @@ void gst_value_register (const GstValueTable *table);
void gst_value_init_and_copy (GValue *dest, const GValue *src); void gst_value_init_and_copy (GValue *dest, const GValue *src);
void _gst_value_initialize (void); void _gst_value_initialize (void);
gchar * gst_value_serialize (const GValue *value);
gboolean gst_value_deserialize (GValue *dest, const gchar *src);
G_END_DECLS G_END_DECLS
#endif #endif