1 // Generated by gmmproc 2.50.1 -- DO NOT MODIFY!
2 #ifndef _GSTREAMERMM_STRUCTURE_H
3 #define _GSTREAMERMM_STRUCTURE_H
4 
5 
6 #include <glibmm/ustring.h>
7 #include <sigc++/sigc++.h>
8 
9 /* gstreamermm - a C++ wrapper for gstreamer
10  *
11  * Copyright 2008-2016 The gstreamermm Development Team
12  *
13  * This library is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU Lesser General Public
15  * License as published by the Free Software Foundation; either
16  * version 2.1 of the License, or (at your option) any later version.
17  *
18  * This library is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21  * Lesser General Public License for more details.
22  *
23  * You should have received a copy of the GNU Lesser General Public
24  * License along with this library; if not, write to the Free
25  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26  */
27 
28 #include <gstreamermm/clock.h>
29 #include <gstreamermm/enums.h>
30 #include <gstreamermm/value.h>
31 #include <glibmm/date.h>
32 #include <glibmm/datetime.h>
33 
34 
35 #ifndef DOXYGEN_SHOULD_SKIP_THIS
36 extern "C" { typedef struct _GstStructure GstStructure; }
37 #endif
38 
39 namespace Gst
40 {
41 
42 /**
43  * Generic class containing fields of names and values.
44  * A Gst::Structure is a collection of key/value pairs. The keys are expressed
45  * as GQuarks and the values can be of any GType.
46  *
47  * In addition to the key/value pairs, a Gst::Structure also has a name. The name
48  * starts with a letter and can be filled by letters, numbers and any of "/-_.:".
49  *
50  * Gst::Structure is used by various GStreamer subsystems to store information
51  * in a flexible and extensible way. A Gst::Structure does not have a refcount
52  * because it usually is part of a higher level object such as Gst::Caps,
53  * Gst::Message, Gst::Event, Gst::Query.
54  *
55  * A Gst::Structure can be created with constructor, which take a name
56  * and an optional set of key/value pairs along with the types of the values.
57  *
58  * Field values can be changed with set_field() or set_fields().
59  *
60  * Field values can be retrieved with gst_get_field().
61  *
62  * Fields can be removed with remove_field().
63  *
64  * Strings in structures must be ASCII or UTF-8 encoded.
65  *
66  * Be aware that the current Gst::Caps / Gst::Structure serialization into string
67  * has limited support for nested Gst::Caps / Gst::Structure fields. It can only
68  * support one level of nesting. Using more levels will lead to unexpected
69  * behavior when using serialization features, such as Gst::Caps::to_string() or
70  * gst_value_serialize() and their counterparts.
71  *
72  * Last reviewed on 2016-07-12 (1.8.0)
73  */
74 class Structure
75 {
76  public:
77 #ifndef DOXYGEN_SHOULD_SKIP_THIS
78   using CppObjectType = Structure;
79   using BaseObjectType = GstStructure;
80 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
81 
82   /** Get the GType for this class, for use with the underlying GObject type system.
83    */
84   static GType get_type() G_GNUC_CONST;
85 
86   Structure();
87 
88   explicit Structure(GstStructure* gobject, bool make_a_copy = true);
89 
90   Structure(const Structure& other);
91   Structure& operator=(const Structure& other);
92 
93   Structure(Structure&& other) noexcept;
94   Structure& operator=(Structure&& other) noexcept;
95 
96   ~Structure() noexcept;
97 
98   void swap(Structure& other) noexcept;
99 
100   ///Provides access to the underlying C instance.
gobj()101   GstStructure*       gobj()       { return gobject_; }
102 
103   ///Provides access to the underlying C instance.
gobj()104   const GstStructure* gobj() const { return gobject_; }
105 
106   ///Provides access to the underlying C instance. The caller is responsible for freeing it. Use when directly setting fields in structs.
107   GstStructure* gobj_copy() const;
108 
109 protected:
110   GstStructure* gobject_;
111 
112 private:
113 
114 
115 public:
116   /** Creates a Structure with the given @a name. Parses the list of variable
117    * arguments and sets fields to the values listed. Variable arguments
118    * should be passed as field name and value
119    */
120   template<class ...DataTypes>
121   explicit Structure(const Glib::ustring &name, DataTypes... data);
122 
123   /** Creates a Gst::Structure from a string representation.
124    *
125    * @param the_string A string representation of a Gst::Structure. See to_string().
126    * @return A Structure. This will be invalid (see operator=) when the string
127    * could not be parsed.
128    */
129   static Structure create_from_string(const Glib::ustring& the_string);
130 
131 
132   /** Use this to discover if the Structure is a valid object.
133    */
134   operator const void*() const;
135 
136   /** Release the ownership of underlying GstStructure instance.
137    *
138    * Gst::Structure's underlying instance is set to nullptr, therefore underlying
139    * object can't be accessed through this Gst::Structure anymore.
140    * @return an underlying instance of GstStructure object.
141    *
142    * Most users should not use release(). It can spoil the automatic destruction
143    * of the managed object.
144    */
145   GstStructure* release() noexcept;
146 
147 
148   /** Get the name of @a structure as a string.
149    *
150    * @return The name of the structure.
151    */
152   Glib::ustring get_name() const;
153 
154   /** Checks if the structure has the given name
155    *
156    * @param name Structure name to check for.
157    * @return <tt>true</tt> if @a name matches the name of the structure.
158    */
159   bool has_name(const Glib::ustring& name) const;
160 
161   /** Sets the name of the structure to the given @a name.  The string
162    * provided is copied before being used. It must not be empty, start with a
163    * letter and can be followed by letters, numbers and any of "/-_.:".
164    *
165    * @param name The new name of the structure.
166    */
167   void set_name(const Glib::ustring& name);
168 
169   /** Get the name of @a structure as a GQuark.
170    *
171    * @return The quark representing the name of the structure.
172    */
173   Glib::QueryQuark get_name_id() const;
174 
175   /** Removes all fields in a GstStructure.
176    */
177   void remove_all_fields();
178 
179   /** Finds the field with the given name, and returns the type of the
180    * value it contains.  If the field is not found, G_TYPE_INVALID is
181    * returned.
182    *
183    * @param fieldname The name of the field.
184    * @return The Value of the field.
185    */
186   GType get_field_type(const Glib::ustring& fieldname) const;
187 
188   /** Get the number of fields in the structure.
189    *
190    * @return The number of fields in the structure.
191    */
192   int size() const;
193 
194   /** Get the name of the given field number, counting from 0 onwards.
195    *
196    * @param index The index to get the name of.
197    * @return The name of the given field number.
198    */
199   Glib::ustring get_nth_field_name(guint index) const;
200 
201   /** Converts @a structure to a human-readable string representation.
202    *
203    * For debugging purposes its easier to do something like this:
204    *
205    * [C example ellipted]
206    * This prints the structure in human readable form.
207    *
208    * The current implementation of serialization will lead to unexpected results
209    * when there are nested Gst::Caps / Gst::Structure deeper than one level.
210    *
211    * @return A pointer to string allocated by Glib::malloc().
212    */
213   Glib::ustring to_string() const;
214 
215   /** Fixates a Gst::Structure by changing the given field to the nearest
216    * integer to @a target that is a subset of the existing field.
217    *
218    * @param name A field in @a structure.
219    * @param target The target value of the fixation.
220    * @return <tt>true</tt> if the structure could be fixated.
221    */
222   bool fixate_field_nearest_int(const Glib::ustring& name, int target);
223 
224   /** Fixates a Gst::Structure by changing the given field to the nearest
225    * double to @a target that is a subset of the existing field.
226    *
227    * @param name A field in @a structure.
228    * @param target The target value of the fixation.
229    * @return <tt>true</tt> if the structure could be fixated.
230    */
231   bool fixate_field_nearest_double(const Glib::ustring& name, double target);
232 
233   /** Fixates a Gst::Structure by changing the given @a name field to the given
234    *  @a target string if that field is not fixed yet.
235    *
236    * @param name A field in @a structure.
237    * @param target The target value of the fixation.
238    * @return <tt>true</tt> if the structure could be fixated.
239    */
240   bool fixate_field_string(const Glib::ustring& name, const Glib::ustring& target);
241 
242   /** Fixates a Gst::Structure by changing the given field with its fixated value.
243    *
244    * @param name A field in @a structure.
245    * @return <tt>true</tt> if the structure field could be fixated.
246    */
247   bool fixate_field(const Glib::ustring& name);
248 
249   /** Fixates a Gst::Structure by changing the given @a name field to the given
250    *  @a target boolean if that field is not fixed yet.
251    *
252    * @param name A field in @a structure.
253    * @param target The target value of the fixation.
254    * @return <tt>true</tt> if the structure could be fixated.
255    */
256   bool fixate_field_boolean(const Glib::ustring& name, bool target);
257 
258   /** Intersects @a struct1 and @a struct2 and returns the intersection.
259    *
260    * @param struct2 A Gst::Structure.
261    * @return Intersection of @a struct1 and @a struct2.
262    */
263   Gst::Structure intersect(const Gst::Structure& struct2) const;
264 
265   /** Tests if the two Gst::Structure are equal.
266    *
267    * @param struct2 A Gst::Structure.
268    * @return <tt>true</tt> if the two structures have the same name and field.
269    */
270   bool is_equal(const Gst::Structure& struct2) const;
271 
272   /** Checks if @a subset is a subset of @a superset, i.e.\ has the same
273    * structure name and for all fields that are existing in @a superset,
274    *  @a subset has a value that is a subset of the value in @a superset.
275    *
276    * @param superset A potentially greater Gst::Structure.
277    * @return <tt>true</tt> if @a subset is a subset of @a superset.
278    */
279   bool is_subset(const Gst::Structure& superset) const;
280 
281   /** Tries intersecting @a struct1 and @a struct2 and reports whether the result
282    * would not be empty.
283    *
284    * @param struct2 A Gst::Structure.
285    * @return <tt>true</tt> if intersection would not be empty.
286    */
287   bool can_intersect(const Gst::Structure& struct2) const;
288 
289   /** Fixate all values in @a structure using gst_value_fixate().
290    *  @a structure will be modified in-place and should be writable.
291    */
292   void fixate();
293 
294   /** Read the GstFlagSet flags and mask out of the structure into the
295    * provided pointers.
296    *
297    * @param fieldname The name of a field.
298    * @param value_flags A pointer to a <tt>unsigned int</tt> for the flags field.
299    * @param value_mask A pointer to a <tt>unsigned int</tt> for the mask field.
300    * @return <tt>true</tt> if the values could be set correctly. If there was no field
301    * with @a fieldname or the existing field did not contain a GstFlagSet, this
302    * function returns <tt>false</tt>.
303    */
304   bool get_flagset(const Glib::ustring& fieldname, guint& value_flags, guint& value_mask) const;
305 
306 
307   /** Check if @a structure contains a field named @a fieldname.
308    *
309    * @param fieldname The name of a field.
310    * @return <tt>true</tt> if the structure contains a field with the given name.
311    */
312   bool has_field(const Glib::ustring& fieldname) const;
313 
314 
315   /** Check if @a structure contains a field named @a fieldname and with GType @a type.
316    *
317    * @param fieldname The name of a field.
318    * @param type The type of a value.
319    * @return <tt>true</tt> if the structure contains a field with the given name and type.
320    */
321   bool has_field(const Glib::ustring& fieldname, GType type) const;
322 
323 
324   /** Get the value of the field with name @a fieldname.
325    *
326    * @param fieldname The name of the field to get.
327    * @param value The Value class in which to store the value.
328    */
329   void get_field(const Glib::ustring& fieldname, Glib::ValueBase& value) const;
330 
331   /** Get the value of the field with name @a fieldname.
332    *
333    * @param fieldname The name of the field to get.
334    * @param value The Value class in which to store the value.
335    */
336   template<typename DataType>
337   void get_field(const Glib::ustring& fieldname, Glib::Value<DataType>& value) const;
338 
339     /** Gets the value of field @a fieldname with GType enum type @a enumtype
340    * into integer @a value.  Caller is responsible for making sure the
341    * field exists and has the correct type.  A call to this method would look
342    * like so:
343    * @code
344    * ...
345    * int state;
346    * structure.get_field("state", Glib::Value<Gst::State>::value_type(),
347    * state);
348    * ...
349    * @endcode
350    *
351    * @param fieldname The name of a field.
352    * @param enumtype The enum GType of the field.
353    * @param value An output parameter that will be set with the value.
354    * @return true if @a value could be set correctly. If there was no field
355    * with @a fieldname or the existing field did not contain an enum, this
356    * function returns false.
357    */
358   bool get_field(const Glib::ustring& fieldname, GType enumtype, int& value) const;
359 
360 
361   /** Gets the value of field @a fieldname into DataType @a value.
362    * The caller is responsible for making sure the field exists and has the
363    * correct type.
364    *
365    * @param fieldname The name of a field.
366    * @param value The DataType to set.
367    */
368   template<typename DataType>
369   bool get_field(const Glib::ustring& fieldname, DataType& value) const;
370 
371   // These are ignored because they are useful in the C API but are either
372   // variable argument functions or their functionality is already provided.
373 
374 
375   /** Sets the field with name @a fieldname to value. If the field does not
376    * exist, it is created. If the field exists, the previous value is replaced
377    * and freed.
378    *
379    * @param fieldname The name of the field to set.
380    * @param value The value to set the field to.
381    */
382   void set_field(const Glib::ustring& fieldname, const Glib::ValueBase& value);
383 
384 
385   /** Sets the field with name @a fieldname to value. If the field does not
386    * exist, it is created. If the field exists, the previous value is replaced
387    * and freed.
388    *
389    * @param fieldname The name of the field to set.
390    * @param value The value to set the field to.
391    */
392   template<typename DataType>
393   void set_field(const Glib::ustring& fieldname, const Glib::Value<DataType>& value);
394 
395   /** Sets the field with name @a fieldname to value. If the field does not
396    * exist, it is created. If the field exists, the previous value is replaced
397    * and freed.
398    *
399    * @param fieldname The name of the field to set.
400    * @param value The value to set the field to.
401    */
402   void set_field(const Glib::ustring& fieldname, const char* value);
403 
404   /** Sets the fields with name @a fieldname to values. If one of the fields does not
405    * exist, it is created. If the field exists, the previous value is replaced
406    * and freed.
407    *
408    * @param fieldname The name of the field to set.
409    * @param value The value to set the field to.
410    * @param further_data List of pairs of the format: fieldname, value.
411    */
412   template<class DataType, class ...DataTypes>
413   void set_fields(const Glib::ustring & fieldname, const DataType& value, DataTypes ...further_data);
414 
415   /** Sets the field with name @a fieldname to the value @a value of the enum
416    * type @a enum_type. If the field does not exist, it is created. If the
417    * field exists, the previous value is replaced and freed.  Caller is
418    * responsible for making sure that @a value is a valid @a enumtype.  A call
419    * to this method would look like so:
420    * @code
421    * ...
422    * structure.set_field("state", Glib::Value<Gst::State>::value_type(),
423    * Gst::STATE_PAUSED);
424    * ...
425    * @endcode
426    *
427    * @param fieldname The name of the field to set.
428    * @param enumtype The enum GType that @a value should be treated as.
429    * @param value The value to set the field to.
430    */
431   void set_field(const Glib::ustring& fieldname, GType enumtype, int value);
432 
433   /** Sets the field with name @a fieldname field to the DataType @a value.
434    * If the field does not exist, it is created. If the field exists,
435    * the previous value is replaced and freed. Please note that when setting
436    * fields to special types such as Gst::Fourcc and Gst::Fraction and
437    * Glib::Date they are converted to the GStreamer GTypes and thus when
438    * attempting to get these fields back as GValues, they will have the
439    * GStreamer GType.
440    *
441    * @param fieldname The name of the field to set.
442    * @param value The value to set the field to.
443    */
444   template<typename DataType>
445   void set_field(const Glib::ustring& fieldname, const DataType& value);
446 
447   // These take ownership of the GValue so they are not wrapped.
448 
449 
450   /** Removes the field with name @a fieldname. If the field with the given
451    * name does not exist, the structure is unchanged.
452    *
453    * @param fieldname The name of the field to remove.
454    */
455   void remove_field(const Glib::ustring& fieldname);
456 
457 
458   /** For example,
459    * bool on_foreach(const Glib::ustring& id, const Glib::ValueBase& value);.
460    * The on_foreach function should return true if the foreach operation should
461    * continue, or false if the operation should stop with false.
462    */
463   typedef sigc::slot<bool, const Glib::ustring&, const Glib::ValueBase&> SlotForeach;
464 
465   /** Calls the provided slot once for each field in the Gst::Structure. The
466    * slot must not modify the fields. See also map_in_place().
467    *
468    * @param slot A slot to call for each field.
469    * @return true if the supplied slot returns true For each of the fields,
470    * false otherwise.
471    */
472   bool foreach(const SlotForeach& slot);
473 
474 
475   /** For example,
476    * bool on_map(const Glib::ustring& id, Glib::ValueBase& value);.
477    * The map function should return true if the map operation should continue,
478    * or false if the operation should stop with false.
479    */
480   typedef sigc::slot<bool, const Glib::ustring&, Glib::ValueBase&> SlotMap;
481 
482   /** Calls the provided slot once for each field in the Gst::Structure. In
483    * contrast to foreach(), the function may modify but not delete the fields.
484    * The structure must be mutable.
485    *
486    * @param slot A slot to call for each field.
487    * @return true if the supplied slot returns true For each of the fields,
488    * false otherwise.
489    */
490   bool map_in_place(const SlotMap& slot);
491 
492 
493   /** Fixates a Gst::Structure by changing the given field to the nearest
494    * fraction to given Gst::Fraction that is a subset of the existing field.
495    *
496    * @param field_name A field in structure.
497    * @param target The target value of the fixation.
498    * @return true If the structure could be fixated.
499    */
500   bool fixate_nearest_fraction(const Glib::ustring& field_name, const Gst::Fraction& target);
501 
502 
503   //Variable argument functions are ignored.
504 
505 
506 private:
507   // This method is used for varadic template recursion
set_fields()508   void set_fields() {}
509 
510 
511 };
512 
513 template<class ...DataTypes>
Structure(const Glib::ustring & name,DataTypes...data)514 Structure::Structure(const Glib::ustring &name, DataTypes... data)
515 {
516   gobject_ = gst_structure_new_empty(name.c_str());
517   set_fields(data...);
518 }
519 
520 template<class DataType, class ...DataTypes>
set_fields(const Glib::ustring & name,const DataType & data,DataTypes...further_data)521 void Structure::set_fields(const Glib::ustring & name, const DataType& data, DataTypes ...further_data)
522 {
523   this->set_field(name, data);
524   this->set_fields(further_data...);
525 }
526 
527 template<typename DataType>
get_field(const Glib::ustring & fieldname,DataType & value)528 bool Structure::get_field(const Glib::ustring& fieldname, DataType& value) const
529 {
530   typedef Glib::Value<DataType> ValueType;
531 
532   bool ret = ValueType::value_type() == get_field_type(fieldname);
533 
534   if (ret)
535   {
536     ValueType v;
537     this->get_field(fieldname, reinterpret_cast<Glib::ValueBase&>(v));
538     value = v.get();
539   }
540 
541   return ret;
542 }
543 
544 template<typename DataType>
set_field(const Glib::ustring & fieldname,const DataType & value)545 void Structure::set_field(const Glib::ustring& fieldname, const DataType& value)
546 {
547   typedef Glib::Value<DataType> ValueType;
548   ValueType v;
549   v.init(ValueType::value_type());
550   v.set(value);
551   this->set_field(fieldname, reinterpret_cast<const Glib::ValueBase&>(v));
552 }
553 
554 template<typename DataType>
get_field(const Glib::ustring & fieldname,Glib::Value<DataType> & value)555 void Structure::get_field(const Glib::ustring& fieldname, Glib::Value<DataType>& value) const
556 {
557   get_field(fieldname, reinterpret_cast<Glib::ValueBase&>(value));
558 }
559 
560 template<typename DataType>
set_field(const Glib::ustring & fieldname,const Glib::Value<DataType> & value)561 void Structure::set_field(const Glib::ustring& fieldname, const Glib::Value<DataType>& value)
562 {
563   set_field(fieldname, reinterpret_cast<const Glib::ValueBase&>(value));
564 }
565 
566 } //namespace Gst
567 
568 
569 namespace Gst
570 {
571 
572 /** @relates Gst::Structure
573  * @param lhs The left-hand side
574  * @param rhs The right-hand side
575  */
swap(Structure & lhs,Structure & rhs)576 inline void swap(Structure& lhs, Structure& rhs) noexcept
577   { lhs.swap(rhs); }
578 
579 } // namespace Gst
580 
581 namespace Glib
582 {
583 
584 /** A Glib::wrap() method for this object.
585  *
586  * @param object The C instance.
587  * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref.
588  * @result A C++ instance that wraps this C instance.
589  *
590  * @relates Gst::Structure
591  */
592 Gst::Structure wrap(GstStructure* object, bool take_copy = false);
593 
594 #ifndef DOXYGEN_SHOULD_SKIP_THIS
595 template <>
596 class Value<Gst::Structure> : public Glib::Value_Boxed<Gst::Structure>
597 {};
598 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
599 
600 } // namespace Glib
601 
602 
603 #endif /* _GSTREAMERMM_STRUCTURE_H */
604 
605