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