API Changes.
authorJan Schmidt <thaytan@mad.scientist.com>
Wed, 23 Nov 2005 13:22:21 +0000 (13:22 +0000)
committerJan Schmidt <thaytan@mad.scientist.com>
Wed, 23 Nov 2005 13:22:21 +0000 (13:22 +0000)
Original commit message from CVS:
* gst/gststructure.c: (gst_structure_get_fraction),
(gst_structure_parse_value),
(gst_structure_fixate_field_nearest_fraction):
* gst/gststructure.h:
* gst/gstutils.c: (gst_util_uint64_scale_int):
* gst/gstutils.h:
* scripts/update-funcnames:
API Changes.
Rename gst_util_clock_time_scale to gst_util_uint64_scale_int
Make gst_structure_fixate_field_nearest_fraction take a numerator
and denominator argument instead of a GValue
add gst_structure_get_fraction helper function.

ChangeLog
gst/gststructure.c
gst/gststructure.h
gst/gstutils.c
gst/gstutils.h
scripts/update-funcnames

index 000d307..3a47ac7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2005-11-23  Jan Schmidt  <thaytan@mad.scientist.com>
+
+       * gst/gststructure.c: (gst_structure_get_fraction),
+       (gst_structure_parse_value),
+       (gst_structure_fixate_field_nearest_fraction):
+       * gst/gststructure.h:
+       * gst/gstutils.c: (gst_util_uint64_scale_int):
+       * gst/gstutils.h:
+       * scripts/update-funcnames:
+       API Changes. 
+       Rename gst_util_clock_time_scale to gst_util_uint64_scale_int
+       Make gst_structure_fixate_field_nearest_fraction take a numerator
+       and denominator argument instead of a GValue
+       add gst_structure_get_fraction helper function.
+
 2005-11-23  Wim Taymans  <wim@fluendo.com>
 
        * docs/design/part-TODO.txt:
index 84a8f97..9485e38 100644 (file)
@@ -1169,6 +1169,45 @@ gst_structure_get_enum (const GstStructure * structure,
   return TRUE;
 }
 
+/**
+ * gst_structure_get_fraction:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @value_numerator: a pointer to an int to set
+ * @value_denominator: a pointer to an int to set
+ *
+ * Sets the integers pointed to by @value_numerator and @value_denominator 
+ * corresponding to the value of the given field.  Caller is responsible 
+ * for making sure the field exists and has the correct type.
+ *
+ * Returns: TRUE if the values could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain a GstFraction, this 
+ * function returns FALSE.
+ */
+gboolean
+gst_structure_get_fraction (const GstStructure * structure,
+    const gchar * fieldname, gint * value_numerator, gint * value_denominator)
+{
+  GstStructureField *field;
+
+  g_return_val_if_fail (structure != NULL, FALSE);
+  g_return_val_if_fail (fieldname != NULL, FALSE);
+  g_return_val_if_fail (value_numerator != NULL, FALSE);
+  g_return_val_if_fail (value_denominator != NULL, FALSE);
+
+  field = gst_structure_get_field (structure, fieldname);
+
+  if (field == NULL)
+    return FALSE;
+  if (!GST_VALUE_HOLDS_FRACTION (&field->value))
+    return FALSE;
+
+  *value_numerator = gst_value_get_fraction_numerator (&field->value);
+  *value_denominator = gst_value_get_fraction_denominator (&field->value);
+
+  return TRUE;
+}
+
 typedef struct _GstStructureAbbreviation
 {
   char *type_name;
@@ -1936,22 +1975,24 @@ gst_structure_fixate_field_boolean (GstStructure * structure,
  * gst_structure_fixate_field_nearest_fraction:
  * @structure: a #GstStructure
  * @field_name: a field in @structure
- * @target: A GValue of GST_TYPE_FRACTION with the target value of the fixation
+ * @target_numerator: The numerator of the target value of the fixation
+ * @target_denominator: The denominator of the target value of the fixation
  *
  * Fixates a #GstStructure by changing the given field to the nearest
- * fraction to @target that is a subset of the existing field.
+ * fraction to @target_numerator/@target_denominator that is a subset 
+ * of the existing field.
  *
  * Returns: TRUE if the structure could be fixated
  */
 gboolean
 gst_structure_fixate_field_nearest_fraction (GstStructure * structure,
-    const char *field_name, const GValue * target)
+    const char *field_name, const gint target_numerator,
+    const gint target_denominator)
 {
   const GValue *value;
 
   g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
   g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
-  g_return_val_if_fail (G_VALUE_TYPE (target) == GST_TYPE_FRACTION, FALSE);
 
   value = gst_structure_get_value (structure, field_name);
 
@@ -1959,25 +2000,36 @@ gst_structure_fixate_field_nearest_fraction (GstStructure * structure,
     /* already fixed */
     return FALSE;
   } else if (G_VALUE_TYPE (value) == GST_TYPE_FRACTION_RANGE) {
-    const GValue *x;
+    const GValue *x, *new_value;
+    GValue target = { 0 };
+    g_value_init (&target, GST_TYPE_FRACTION);
+    gst_value_set_fraction (&target, target_numerator, target_denominator);
 
+    new_value = &target;
     x = gst_value_get_fraction_range_min (value);
-    if (gst_value_compare (target, x) == GST_VALUE_LESS_THAN)
-      target = x;
+    if (gst_value_compare (&target, x) == GST_VALUE_LESS_THAN)
+      new_value = x;
     x = gst_value_get_fraction_range_max (value);
-    if (gst_value_compare (target, x) == GST_VALUE_GREATER_THAN)
-      target = x;
-    gst_structure_set_value (structure, field_name, target);
+    if (gst_value_compare (&target, x) == GST_VALUE_GREATER_THAN)
+      new_value = x;
+
+    gst_structure_set_value (structure, field_name, new_value);
+    g_value_unset (&target);
     return TRUE;
   } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
     const GValue *list_value;
     int i, n;
     const GValue *best = NULL;
-    GValue best_diff;
-    GValue cur_diff;
+    GValue best_diff = { 0 };
+    GValue cur_diff = { 0 };
+    GValue target = { 0 };
+    gboolean res = FALSE;
 
     g_value_init (&best_diff, GST_TYPE_FRACTION);
     g_value_init (&cur_diff, GST_TYPE_FRACTION);
+    g_value_init (&target, GST_TYPE_FRACTION);
+
+    gst_value_set_fraction (&target, target_numerator, target_denominator);
 
     n = gst_value_list_get_size (value);
     for (i = 0; i < n; i++) {
@@ -1987,10 +2039,10 @@ gst_structure_fixate_field_nearest_fraction (GstStructure * structure,
           best = list_value;
           gst_value_set_fraction (&best_diff, 0, 1);
         } else {
-          if (gst_value_compare (list_value, target) == GST_VALUE_LESS_THAN)
-            gst_value_fraction_subtract (&cur_diff, target, list_value);
+          if (gst_value_compare (list_value, &target) == GST_VALUE_LESS_THAN)
+            gst_value_fraction_subtract (&cur_diff, &target, list_value);
           else
-            gst_value_fraction_subtract (&cur_diff, list_value, target);
+            gst_value_fraction_subtract (&cur_diff, list_value, &target);
 
           if (gst_value_compare (&cur_diff, &best_diff) == GST_VALUE_LESS_THAN) {
             best = list_value;
@@ -2001,9 +2053,12 @@ gst_structure_fixate_field_nearest_fraction (GstStructure * structure,
     }
     if (best != NULL) {
       gst_structure_set_value (structure, field_name, best);
-      return TRUE;
+      res = TRUE;
     }
-    return FALSE;
+    g_value_unset (&best_diff);
+    g_value_unset (&cur_diff);
+    g_value_unset (&target);
+    return res;
   }
 
   return FALSE;
index 57d8bef..6d97cfc 100644 (file)
@@ -174,6 +174,10 @@ gboolean                gst_structure_get_enum             (const GstStructure
                                                            const gchar             *fieldname,
                                                            GType                    enumtype,
                                                            gint                    *value);
+gboolean                gst_structure_get_fraction         (const GstStructure      *structure,
+                                                           const gchar             *fieldname,
+                                                           gint *value_numerator,
+                                                           gint *value_denominator);
 
 gchar *                 gst_structure_to_string            (const GstStructure      *structure);
 GstStructure *          gst_structure_from_string          (const gchar             *string,
@@ -191,7 +195,8 @@ gboolean                 gst_structure_fixate_field_boolean (GstStructure *struc
                                                                         gboolean        target);
 gboolean                 gst_structure_fixate_field_nearest_fraction (GstStructure *structure,
                                                                         const char   *field_name,
-                                                                        const GValue *target);
+                                                                        const gint target_numerator,
+                                                                        const gint target_denominator);
 
 G_END_DECLS
 
index 62f96c0..4c8900b 100644 (file)
@@ -359,7 +359,7 @@ gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom)
 }
 
 /**
- * gst_util_clock_time_scale:
+ * gst_util_uint64_scale_int:
  * @val: GstClockTime to scale.
  * @num: numerator of the scale factor.
  * @denom: denominator of the scale factor.
@@ -369,8 +369,8 @@ gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom)
  *
  * Returns: @val * @num / @denom, avoiding overflow and loss of precision
  */
-GstClockTime
-gst_util_clock_time_scale (GstClockTime val, gint num, gint denom)
+guint64
+gst_util_uint64_scale_int (guint64 val, gint num, gint denom)
 {
   return val * num / denom;
 }
index f0af12b..5c7045d 100644 (file)
@@ -43,7 +43,7 @@ gdouble         gst_guint64_to_gdouble          (guint64 value);
 
 guint64                gst_util_uint64_scale           (guint64 val, guint64 num, guint64 denom);
 
-GstClockTime    gst_util_clock_time_scale        (GstClockTime val, gint num, gint denom);
+guint64         gst_util_uint64_scale_int       (guint64 val, gint num, gint denom);
 
 void           gst_print_pad_caps              (GString *buf, gint indent, GstPad *pad);
 void           gst_print_element_args          (GString *buf, gint indent, GstElement *element);
index 5cbbe14..adb6310 100755 (executable)
@@ -26,3 +26,4 @@ subst gst_ghost_pad_new_notarget gst_ghost_pad_new_no_target
 subst gst_tag_setter_merge gst_tag_setter_merge_tags
 subst gst_tag_setter_get_list gst_tag_setter_get_tag_list
 subst gst_tag_setter_get_merge_mode gst_tag_setter_get_tag_merge_mode
+subst gst_util_clock_time_scale gst_util_uint64_scale_int