• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GStreamer byte writer
2  *
3  * Copyright (C) 2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20 
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24 
25 #define GST_BYTE_WRITER_DISABLE_INLINES
26 #include "gstbytewriter.h"
27 
28 #include "gst/glib-compat-private.h"
29 
30 /**
31  * SECTION:gstbytewriter
32  * @title: GstByteWriter
33  * @short_description: Writes different integer, string and floating point
34  *     types to a memory buffer and allows reading
35  * @symbols:
36  * - gst_byte_writer_put_uint8_unchecked
37  * - gst_byte_writer_put_uint16_be_unchecked
38  * - gst_byte_writer_put_uint24_be_unchecked
39  * - gst_byte_writer_put_uint32_be_unchecked
40  * - gst_byte_writer_put_uint64_be_unchecked
41  * - gst_byte_writer_put_uint16_le_unchecked
42  * - gst_byte_writer_put_uint24_le_unchecked
43  * - gst_byte_writer_put_uint32_le_unchecked
44  * - gst_byte_writer_put_uint64_le_unchecked
45  * - gst_byte_writer_put_int8_unchecked
46  * - gst_byte_writer_put_int16_be_unchecked
47  * - gst_byte_writer_put_int24_be_unchecked
48  * - gst_byte_writer_put_int32_be_unchecked
49  * - gst_byte_writer_put_int64_be_unchecked
50  * - gst_byte_writer_put_int16_le_unchecked
51  * - gst_byte_writer_put_int24_le_unchecked
52  * - gst_byte_writer_put_int32_le_unchecked
53  * - gst_byte_writer_put_int64_le_unchecked
54  * - gst_byte_writer_put_float32_be_unchecked
55  * - gst_byte_writer_put_float64_be_unchecked
56  * - gst_byte_writer_put_float32_le_unchecked
57  * - gst_byte_writer_put_float64_le_unchecked
58  * - gst_byte_writer_put_data_unchecked
59  * - gst_byte_writer_fill_unchecked
60  *
61  * #GstByteWriter provides a byte writer and reader that can write/read different
62  * integer and floating point types to/from a memory buffer. It provides functions
63  * for writing/reading signed/unsigned, little/big endian integers of 8, 16, 24,
64  * 32 and 64 bits and functions for reading little/big endian floating points numbers of
65  * 32 and 64 bits. It also provides functions to write/read NUL-terminated strings
66  * in various character encodings.
67  */
68 
69 /**
70  * gst_byte_writer_new: (skip)
71  *
72  * Creates a new, empty #GstByteWriter instance
73  *
74  * Free-function: gst_byte_writer_free
75  *
76  * Returns: (transfer full): a new, empty #GstByteWriter instance
77  */
78 GstByteWriter *
gst_byte_writer_new(void)79 gst_byte_writer_new (void)
80 {
81   GstByteWriter *ret = g_slice_new0 (GstByteWriter);
82 
83   ret->owned = TRUE;
84   return ret;
85 }
86 
87 /**
88  * gst_byte_writer_new_with_size: (skip)
89  * @size: Initial size of data
90  * @fixed: If %TRUE the data can't be reallocated
91  *
92  * Creates a new #GstByteWriter instance with the given
93  * initial data size.
94  *
95  * Free-function: gst_byte_writer_free
96  *
97  * Returns: (transfer full): a new #GstByteWriter instance
98  */
99 GstByteWriter *
gst_byte_writer_new_with_size(guint size,gboolean fixed)100 gst_byte_writer_new_with_size (guint size, gboolean fixed)
101 {
102   GstByteWriter *ret = gst_byte_writer_new ();
103 
104   ret->alloc_size = size;
105   ret->parent.data = g_malloc (ret->alloc_size);
106   ret->fixed = fixed;
107   ret->owned = TRUE;
108 
109   return ret;
110 }
111 
112 /**
113  * gst_byte_writer_new_with_data: (skip)
114  * @data: Memory area for writing
115  * @size: Size of @data in bytes
116  * @initialized: If %TRUE the complete data can be read from the beginning
117  *
118  * Creates a new #GstByteWriter instance with the given
119  * memory area. If @initialized is %TRUE it is possible to
120  * read @size bytes from the #GstByteWriter from the beginning.
121  *
122  * Free-function: gst_byte_writer_free
123  *
124  * Returns: (transfer full): a new #GstByteWriter instance
125  */
126 GstByteWriter *
gst_byte_writer_new_with_data(guint8 * data,guint size,gboolean initialized)127 gst_byte_writer_new_with_data (guint8 * data, guint size, gboolean initialized)
128 {
129   GstByteWriter *ret = gst_byte_writer_new ();
130 
131   ret->parent.data = data;
132   ret->parent.size = (initialized) ? size : 0;
133   ret->alloc_size = size;
134   ret->fixed = TRUE;
135   ret->owned = FALSE;
136 
137   return ret;
138 }
139 
140 /**
141  * gst_byte_writer_init:
142  * @writer: #GstByteWriter instance
143  *
144  * Initializes @writer to an empty instance
145  */
146 void
gst_byte_writer_init(GstByteWriter * writer)147 gst_byte_writer_init (GstByteWriter * writer)
148 {
149   g_return_if_fail (writer != NULL);
150 
151   memset (writer, 0, sizeof (GstByteWriter));
152 
153   writer->owned = TRUE;
154 }
155 
156 /**
157  * gst_byte_writer_init_with_size:
158  * @writer: #GstByteWriter instance
159  * @size: Initial size of data
160  * @fixed: If %TRUE the data can't be reallocated
161  *
162  * Initializes @writer with the given initial data size.
163  */
164 void
gst_byte_writer_init_with_size(GstByteWriter * writer,guint size,gboolean fixed)165 gst_byte_writer_init_with_size (GstByteWriter * writer, guint size,
166     gboolean fixed)
167 {
168   g_return_if_fail (writer != NULL);
169 
170   gst_byte_writer_init (writer);
171 
172   writer->parent.data = g_malloc (size);
173   writer->alloc_size = size;
174   writer->fixed = fixed;
175   writer->owned = TRUE;
176 }
177 
178 /**
179  * gst_byte_writer_init_with_data:
180  * @writer: #GstByteWriter instance
181  * @data: (array length=size) (transfer none): Memory area for writing
182  * @size: Size of @data in bytes
183  * @initialized: If %TRUE the complete data can be read from the beginning
184  *
185  * Initializes @writer with the given
186  * memory area. If @initialized is %TRUE it is possible to
187  * read @size bytes from the #GstByteWriter from the beginning.
188  */
189 void
gst_byte_writer_init_with_data(GstByteWriter * writer,guint8 * data,guint size,gboolean initialized)190 gst_byte_writer_init_with_data (GstByteWriter * writer, guint8 * data,
191     guint size, gboolean initialized)
192 {
193   g_return_if_fail (writer != NULL);
194 
195   gst_byte_writer_init (writer);
196 
197   writer->parent.data = data;
198   writer->parent.size = (initialized) ? size : 0;
199   writer->alloc_size = size;
200   writer->fixed = TRUE;
201   writer->owned = FALSE;
202 }
203 
204 /**
205  * gst_byte_writer_reset:
206  * @writer: #GstByteWriter instance
207  *
208  * Resets @writer and frees the data if it's
209  * owned by @writer.
210  */
211 void
gst_byte_writer_reset(GstByteWriter * writer)212 gst_byte_writer_reset (GstByteWriter * writer)
213 {
214   g_return_if_fail (writer != NULL);
215 
216   if (writer->owned)
217     g_free ((guint8 *) writer->parent.data);
218   memset (writer, 0, sizeof (GstByteWriter));
219 }
220 
221 /**
222  * gst_byte_writer_reset_and_get_data:
223  * @writer: #GstByteWriter instance
224  *
225  * Resets @writer and returns the current data.
226  *
227  * Free-function: g_free
228  *
229  * Returns: (array) (transfer full): the current data. g_free() after
230  * usage.
231  */
232 guint8 *
gst_byte_writer_reset_and_get_data(GstByteWriter * writer)233 gst_byte_writer_reset_and_get_data (GstByteWriter * writer)
234 {
235   guint8 *data;
236 
237   g_return_val_if_fail (writer != NULL, NULL);
238 
239   data = (guint8 *) writer->parent.data;
240   if (!writer->owned)
241     data = g_memdup2 (data, writer->parent.size);
242   writer->parent.data = NULL;
243   gst_byte_writer_reset (writer);
244 
245   return data;
246 }
247 
248 /**
249  * gst_byte_writer_reset_and_get_buffer:
250  * @writer: #GstByteWriter instance
251  *
252  * Resets @writer and returns the current data as buffer.
253  *
254  * Free-function: gst_buffer_unref
255  *
256  * Returns: (transfer full): the current data as buffer. gst_buffer_unref()
257  *     after usage.
258  */
259 GstBuffer *
gst_byte_writer_reset_and_get_buffer(GstByteWriter * writer)260 gst_byte_writer_reset_and_get_buffer (GstByteWriter * writer)
261 {
262   GstBuffer *buffer;
263   gpointer data;
264   gsize size;
265 
266   g_return_val_if_fail (writer != NULL, NULL);
267 
268   size = writer->parent.size;
269   data = gst_byte_writer_reset_and_get_data (writer);
270 
271   buffer = gst_buffer_new ();
272   if (data != NULL) {
273     gst_buffer_append_memory (buffer,
274         gst_memory_new_wrapped (0, data, size, 0, size, data, g_free));
275   }
276 
277   return buffer;
278 }
279 
280 /**
281  * gst_byte_writer_free:
282  * @writer: (in) (transfer full): #GstByteWriter instance
283  *
284  * Frees @writer and all memory allocated by it.
285  */
286 void
gst_byte_writer_free(GstByteWriter * writer)287 gst_byte_writer_free (GstByteWriter * writer)
288 {
289   g_return_if_fail (writer != NULL);
290 
291   gst_byte_writer_reset (writer);
292   g_slice_free (GstByteWriter, writer);
293 }
294 
295 /**
296  * gst_byte_writer_free_and_get_data:
297  * @writer: (in) (transfer full): #GstByteWriter instance
298  *
299  * Frees @writer and all memory allocated by it except
300  * the current data, which is returned.
301  *
302  * Free-function: g_free
303  *
304  * Returns: (transfer full): the current data. g_free() after usage.
305  */
306 guint8 *
gst_byte_writer_free_and_get_data(GstByteWriter * writer)307 gst_byte_writer_free_and_get_data (GstByteWriter * writer)
308 {
309   guint8 *data;
310 
311   g_return_val_if_fail (writer != NULL, NULL);
312 
313   data = gst_byte_writer_reset_and_get_data (writer);
314   g_slice_free (GstByteWriter, writer);
315 
316   return data;
317 }
318 
319 /**
320  * gst_byte_writer_free_and_get_buffer:
321  * @writer: (in) (transfer full): #GstByteWriter instance
322  *
323  * Frees @writer and all memory allocated by it except
324  * the current data, which is returned as #GstBuffer.
325  *
326  * Free-function: gst_buffer_unref
327  *
328  * Returns: (transfer full): the current data as buffer. gst_buffer_unref()
329  *     after usage.
330  */
331 GstBuffer *
gst_byte_writer_free_and_get_buffer(GstByteWriter * writer)332 gst_byte_writer_free_and_get_buffer (GstByteWriter * writer)
333 {
334   GstBuffer *buffer;
335 
336   g_return_val_if_fail (writer != NULL, NULL);
337 
338   buffer = gst_byte_writer_reset_and_get_buffer (writer);
339   g_slice_free (GstByteWriter, writer);
340 
341   return buffer;
342 }
343 
344 /**
345  * gst_byte_writer_get_remaining:
346  * @writer: #GstByteWriter instance
347  *
348  * Returns the remaining size of data that can still be written. If
349  * -1 is returned the remaining size is only limited by system resources.
350  *
351  * Returns: the remaining size of data that can still be written
352  */
353 guint
gst_byte_writer_get_remaining(const GstByteWriter * writer)354 gst_byte_writer_get_remaining (const GstByteWriter * writer)
355 {
356   g_return_val_if_fail (writer != NULL, -1);
357 
358   if (!writer->fixed)
359     return -1;
360   else
361     return writer->alloc_size - writer->parent.byte;
362 }
363 
364 /**
365  * gst_byte_writer_ensure_free_space:
366  * @writer: #GstByteWriter instance
367  * @size: Number of bytes that should be available
368  *
369  * Checks if enough free space from the current write cursor is
370  * available and reallocates if necessary.
371  *
372  * Returns: %TRUE if at least @size bytes are still available
373  */
374 gboolean
gst_byte_writer_ensure_free_space(GstByteWriter * writer,guint size)375 gst_byte_writer_ensure_free_space (GstByteWriter * writer, guint size)
376 {
377   return _gst_byte_writer_ensure_free_space_inline (writer, size);
378 }
379 
380 
381 #define CREATE_WRITE_FUNC(bits,type,name,write_func) \
382 gboolean \
383 gst_byte_writer_put_##name (GstByteWriter *writer, type val) \
384 { \
385   return _gst_byte_writer_put_##name##_inline (writer, val); \
386 }
387 
388 CREATE_WRITE_FUNC (8, guint8, uint8, GST_WRITE_UINT8);
389 CREATE_WRITE_FUNC (8, gint8, int8, GST_WRITE_UINT8);
390 CREATE_WRITE_FUNC (16, guint16, uint16_le, GST_WRITE_UINT16_LE);
391 CREATE_WRITE_FUNC (16, guint16, uint16_be, GST_WRITE_UINT16_BE);
392 CREATE_WRITE_FUNC (16, gint16, int16_le, GST_WRITE_UINT16_LE);
393 CREATE_WRITE_FUNC (16, gint16, int16_be, GST_WRITE_UINT16_BE);
394 CREATE_WRITE_FUNC (24, guint32, uint24_le, GST_WRITE_UINT24_LE);
395 CREATE_WRITE_FUNC (24, guint32, uint24_be, GST_WRITE_UINT24_BE);
396 CREATE_WRITE_FUNC (24, gint32, int24_le, GST_WRITE_UINT24_LE);
397 CREATE_WRITE_FUNC (24, gint32, int24_be, GST_WRITE_UINT24_BE);
398 CREATE_WRITE_FUNC (32, guint32, uint32_le, GST_WRITE_UINT32_LE);
399 CREATE_WRITE_FUNC (32, guint32, uint32_be, GST_WRITE_UINT32_BE);
400 CREATE_WRITE_FUNC (32, gint32, int32_le, GST_WRITE_UINT32_LE);
401 CREATE_WRITE_FUNC (32, gint32, int32_be, GST_WRITE_UINT32_BE);
402 CREATE_WRITE_FUNC (64, guint64, uint64_le, GST_WRITE_UINT64_LE);
403 CREATE_WRITE_FUNC (64, guint64, uint64_be, GST_WRITE_UINT64_BE);
404 CREATE_WRITE_FUNC (64, gint64, int64_le, GST_WRITE_UINT64_LE);
405 CREATE_WRITE_FUNC (64, gint64, int64_be, GST_WRITE_UINT64_BE);
406 
407 CREATE_WRITE_FUNC (32, gfloat, float32_be, GST_WRITE_FLOAT_BE);
408 CREATE_WRITE_FUNC (32, gfloat, float32_le, GST_WRITE_FLOAT_LE);
409 CREATE_WRITE_FUNC (64, gdouble, float64_be, GST_WRITE_DOUBLE_BE);
410 CREATE_WRITE_FUNC (64, gdouble, float64_le, GST_WRITE_DOUBLE_LE);
411 
412 gboolean
gst_byte_writer_put_data(GstByteWriter * writer,const guint8 * data,guint size)413 gst_byte_writer_put_data (GstByteWriter * writer, const guint8 * data,
414     guint size)
415 {
416   return _gst_byte_writer_put_data_inline (writer, data, size);
417 }
418 
419 gboolean
gst_byte_writer_fill(GstByteWriter * writer,guint8 value,guint size)420 gst_byte_writer_fill (GstByteWriter * writer, guint8 value, guint size)
421 {
422   return _gst_byte_writer_fill_inline (writer, value, size);
423 }
424 
425 #define CREATE_WRITE_STRING_FUNC(bits,type) \
426 gboolean \
427 gst_byte_writer_put_string_utf##bits (GstByteWriter *writer, const type * data) \
428 { \
429   guint size = 0; \
430   \
431   g_return_val_if_fail (writer != NULL, FALSE); \
432   \
433   /* endianness does not matter if we are looking for a NUL terminator */ \
434   while (data[size] != 0) { \
435     /* have prevent overflow */ \
436     if (G_UNLIKELY (size == G_MAXUINT)) \
437       return FALSE; \
438     ++size; \
439   } \
440   ++size; \
441   \
442   if (G_UNLIKELY (!_gst_byte_writer_ensure_free_space_inline(writer, size * (bits / 8)))) \
443     return FALSE; \
444   \
445   _gst_byte_writer_put_data_inline (writer, (const guint8 *) data, size * (bits / 8)); \
446   \
447   return TRUE; \
448 }
449 
450 CREATE_WRITE_STRING_FUNC (8, gchar);
451 CREATE_WRITE_STRING_FUNC (16, guint16);
452 CREATE_WRITE_STRING_FUNC (32, guint32);
453 /**
454  * gst_byte_writer_put_uint8:
455  * @writer: #GstByteWriter instance
456  * @val: Value to write
457  *
458  * Writes a unsigned 8 bit integer to @writer.
459  *
460  * Returns: %TRUE if the value could be written
461  */
462 /**
463  * gst_byte_writer_put_uint16_be:
464  * @writer: #GstByteWriter instance
465  * @val: Value to write
466  *
467  * Writes a unsigned big endian 16 bit integer to @writer.
468  *
469  * Returns: %TRUE if the value could be written
470  */
471 /**
472  * gst_byte_writer_put_uint24_be:
473  * @writer: #GstByteWriter instance
474  * @val: Value to write
475  *
476  * Writes a unsigned big endian 24 bit integer to @writer.
477  *
478  * Returns: %TRUE if the value could be written
479  */
480 /**
481  * gst_byte_writer_put_uint32_be:
482  * @writer: #GstByteWriter instance
483  * @val: Value to write
484  *
485  * Writes a unsigned big endian 32 bit integer to @writer.
486  *
487  * Returns: %TRUE if the value could be written
488  */
489 /**
490  * gst_byte_writer_put_uint64_be:
491  * @writer: #GstByteWriter instance
492  * @val: Value to write
493  *
494  * Writes a unsigned big endian 64 bit integer to @writer.
495  *
496  * Returns: %TRUE if the value could be written
497  */
498 /**
499  * gst_byte_writer_put_uint16_le:
500  * @writer: #GstByteWriter instance
501  * @val: Value to write
502  *
503  * Writes a unsigned little endian 16 bit integer to @writer.
504  *
505  * Returns: %TRUE if the value could be written
506  */
507 /**
508  * gst_byte_writer_put_uint24_le:
509  * @writer: #GstByteWriter instance
510  * @val: Value to write
511  *
512  * Writes a unsigned little endian 24 bit integer to @writer.
513  *
514  * Returns: %TRUE if the value could be written
515  */
516 /**
517  * gst_byte_writer_put_uint32_le:
518  * @writer: #GstByteWriter instance
519  * @val: Value to write
520  *
521  * Writes a unsigned little endian 32 bit integer to @writer.
522  *
523  * Returns: %TRUE if the value could be written
524  */
525 /**
526  * gst_byte_writer_put_uint64_le:
527  * @writer: #GstByteWriter instance
528  * @val: Value to write
529  *
530  * Writes a unsigned little endian 64 bit integer to @writer.
531  *
532  * Returns: %TRUE if the value could be written
533  */
534 /**
535  * gst_byte_writer_put_int8:
536  * @writer: #GstByteWriter instance
537  * @val: Value to write
538  *
539  * Writes a signed 8 bit integer to @writer.
540  *
541  * Returns: %TRUE if the value could be written
542  */
543 /**
544  * gst_byte_writer_put_int16_be:
545  * @writer: #GstByteWriter instance
546  * @val: Value to write
547  *
548  * Writes a signed big endian 16 bit integer to @writer.
549  *
550  * Returns: %TRUE if the value could be written
551  */
552 /**
553  * gst_byte_writer_put_int24_be:
554  * @writer: #GstByteWriter instance
555  * @val: Value to write
556  *
557  * Writes a signed big endian 24 bit integer to @writer.
558  *
559  * Returns: %TRUE if the value could be written
560  */
561 /**
562  * gst_byte_writer_put_int32_be:
563  * @writer: #GstByteWriter instance
564  * @val: Value to write
565  *
566  * Writes a signed big endian 32 bit integer to @writer.
567  *
568  * Returns: %TRUE if the value could be written
569  */
570 /**
571  * gst_byte_writer_put_int64_be:
572  * @writer: #GstByteWriter instance
573  * @val: Value to write
574  *
575  * Writes a signed big endian 64 bit integer to @writer.
576  *
577  * Returns: %TRUE if the value could be written
578  */
579 /**
580  * gst_byte_writer_put_int16_le:
581  * @writer: #GstByteWriter instance
582  * @val: Value to write
583  *
584  * Writes a signed little endian 16 bit integer to @writer.
585  *
586  * Returns: %TRUE if the value could be written
587  */
588 /**
589  * gst_byte_writer_put_int24_le:
590  * @writer: #GstByteWriter instance
591  * @val: Value to write
592  *
593  * Writes a signed little endian 24 bit integer to @writer.
594  *
595  * Returns: %TRUE if the value could be written
596  */
597 /**
598  * gst_byte_writer_put_int32_le:
599  * @writer: #GstByteWriter instance
600  * @val: Value to write
601  *
602  * Writes a signed little endian 32 bit integer to @writer.
603  *
604  * Returns: %TRUE if the value could be written
605  */
606 /**
607  * gst_byte_writer_put_int64_le:
608  * @writer: #GstByteWriter instance
609  * @val: Value to write
610  *
611  * Writes a signed little endian 64 bit integer to @writer.
612  *
613  * Returns: %TRUE if the value could be written
614  */
615 /**
616  * gst_byte_writer_put_float32_be:
617  * @writer: #GstByteWriter instance
618  * @val: Value to write
619  *
620  * Writes a big endian 32 bit float to @writer.
621  *
622  * Returns: %TRUE if the value could be written
623  */
624 /**
625  * gst_byte_writer_put_float64_be:
626  * @writer: #GstByteWriter instance
627  * @val: Value to write
628  *
629  * Writes a big endian 64 bit float to @writer.
630  *
631  * Returns: %TRUE if the value could be written
632  */
633 /**
634  * gst_byte_writer_put_float32_le:
635  * @writer: #GstByteWriter instance
636  * @val: Value to write
637  *
638  * Writes a little endian 32 bit float to @writer.
639  *
640  * Returns: %TRUE if the value could be written
641  */
642 /**
643  * gst_byte_writer_put_float64_le:
644  * @writer: #GstByteWriter instance
645  * @val: Value to write
646  *
647  * Writes a little endian 64 bit float to @writer.
648  *
649  * Returns: %TRUE if the value could be written
650  */
651 /**
652  * gst_byte_writer_put_string_utf8:
653  * @writer: #GstByteWriter instance
654  * @data: (transfer none): UTF8 string to write
655  *
656  * Writes a NUL-terminated UTF8 string to @writer (including the terminator).
657  *
658  * Returns: %TRUE if the value could be written
659  */
660 /**
661  * gst_byte_writer_put_string_utf16:
662  * @writer: #GstByteWriter instance
663  * @data: (transfer none) (array zero-terminated=1): UTF16 string to write
664  *
665  * Writes a NUL-terminated UTF16 string to @writer (including the terminator).
666  *
667  * Returns: %TRUE if the value could be written
668  */
669 /**
670  * gst_byte_writer_put_string_utf32:
671  * @writer: #GstByteWriter instance
672  * @data: (transfer none) (array zero-terminated=1): UTF32 string to write
673  *
674  * Writes a NUL-terminated UTF32 string to @writer (including the terminator).
675  *
676  * Returns: %TRUE if the value could be written
677  */
678 /**
679  * gst_byte_writer_put_data:
680  * @writer: #GstByteWriter instance
681  * @data: (transfer none) (array length=size): Data to write
682  * @size: Size of @data in bytes
683  *
684  * Writes @size bytes of @data to @writer.
685  *
686  * Returns: %TRUE if the value could be written
687  */
688 /**
689  * gst_byte_writer_fill:
690  * @writer: #GstByteWriter instance
691  * @value: Value to be written
692  * @size: Number of bytes to be written
693  *
694  * Writes @size bytes containing @value to @writer.
695  *
696  * Returns: %TRUE if the value could be written
697  */
698 
699 /**
700  * gst_byte_writer_put_buffer:
701  * @writer: #GstByteWriter instance
702  * @buffer: (transfer none): source #GstBuffer
703  * @offset: offset to copy from
704  * @size: total size to copy. If -1, all data is copied
705  *
706  * Writes @size bytes of @data to @writer.
707  *
708  * Returns: %TRUE if the data could be written
709  *
710  */
711