diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-12-07 19:34:25 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-12-08 10:14:41 +0200 |
commit | 47da7565ce9b177d364d3ec6858755d86dd84a73 (patch) | |
tree | 85b7ed196a651da3b28a0a4aa1abc5481912b008 /gst/mxf | |
parent | 01f0d16db3998746739e26a85648df32e51cdb3b (diff) | |
download | gstreamer-plugins-bad-47da7565ce9b177d364d3ec6858755d86dd84a73.tar.gz |
mxftypes: Add function to serialize an index table segment to a buffer
Diffstat (limited to 'gst/mxf')
-rw-r--r-- | gst/mxf/mxftypes.c | 120 | ||||
-rw-r--r-- | gst/mxf/mxftypes.h | 1 |
2 files changed, 121 insertions, 0 deletions
diff --git a/gst/mxf/mxftypes.c b/gst/mxf/mxftypes.c index 60e96ca81..9ef3294d4 100644 --- a/gst/mxf/mxftypes.c +++ b/gst/mxf/mxftypes.c @@ -22,6 +22,7 @@ #endif #include <gst/gst.h> +#include <gst/base/gstbytewriter.h> #include <string.h> #include "mxftypes.h" @@ -1299,6 +1300,125 @@ mxf_index_table_segment_reset (MXFIndexTableSegment * segment) memset (segment, 0, sizeof (MXFIndexTableSegment)); } +GstBuffer * +mxf_index_table_segment_to_buffer (const MXFIndexTableSegment * segment) +{ + guint len, slen, i; + guint8 ber[9]; + GstBuffer *ret; + GstMapInfo map; + GstByteWriter bw; + + g_return_val_if_fail (segment != NULL, NULL); + g_return_val_if_fail (segment->n_delta_entries * 6 < G_MAXUINT16, NULL); + g_return_val_if_fail (segment->n_index_entries * (11 + + 4 * segment->slice_count + 8 * segment->pos_table_count) < + G_MAXUINT16, NULL); + + len = + 16 + 4 + 8 + 4 + 8 + 4 + 8 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 1 + 4 + 1 + 4 + + 4 + 8 + segment->n_delta_entries * 6 + 4 + 8 + + segment->n_index_entries * (11 + 4 * segment->slice_count + + 8 * segment->pos_table_count); + slen = mxf_ber_encode_size (len, ber); + + ret = gst_buffer_new_and_alloc (16 + slen + len); + gst_buffer_map (ret, &map, GST_MAP_WRITE); + + gst_byte_writer_init_with_data (&bw, map.data, map.size, FALSE); + + gst_byte_writer_put_data_unchecked (&bw, + (const guint8 *) MXF_UL (INDEX_TABLE_SEGMENT), 16); + gst_byte_writer_put_data_unchecked (&bw, ber, slen); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3c0a); + gst_byte_writer_put_uint16_be_unchecked (&bw, 16); + gst_byte_writer_put_data_unchecked (&bw, + (const guint8 *) &segment->instance_id, 16); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0b); + gst_byte_writer_put_uint16_be_unchecked (&bw, 8); + gst_byte_writer_put_uint32_be_unchecked (&bw, segment->index_edit_rate.n); + gst_byte_writer_put_uint32_be_unchecked (&bw, segment->index_edit_rate.d); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0c); + gst_byte_writer_put_uint16_be_unchecked (&bw, 8); + gst_byte_writer_put_uint64_be_unchecked (&bw, segment->index_start_position); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0d); + gst_byte_writer_put_uint16_be_unchecked (&bw, 8); + gst_byte_writer_put_uint64_be_unchecked (&bw, segment->index_duration); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f05); + gst_byte_writer_put_uint16_be_unchecked (&bw, 4); + gst_byte_writer_put_uint32_be_unchecked (&bw, segment->edit_unit_byte_count); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f06); + gst_byte_writer_put_uint16_be_unchecked (&bw, 4); + gst_byte_writer_put_uint32_be_unchecked (&bw, segment->index_sid); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f07); + gst_byte_writer_put_uint16_be_unchecked (&bw, 4); + gst_byte_writer_put_uint32_be_unchecked (&bw, segment->body_sid); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f08); + gst_byte_writer_put_uint16_be_unchecked (&bw, 1); + gst_byte_writer_put_uint8 (&bw, segment->slice_count); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0e); + gst_byte_writer_put_uint16_be_unchecked (&bw, 1); + gst_byte_writer_put_uint8 (&bw, segment->pos_table_count); + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f09); + gst_byte_writer_put_uint16_be_unchecked (&bw, + 8 + segment->n_delta_entries * 6); + gst_byte_writer_put_uint32_be_unchecked (&bw, segment->n_delta_entries); + gst_byte_writer_put_uint32_be_unchecked (&bw, 6); + for (i = 0; i < segment->n_delta_entries; i++) { + gst_byte_writer_put_uint8_unchecked (&bw, + segment->delta_entries[i].pos_table_index); + gst_byte_writer_put_uint8_unchecked (&bw, segment->delta_entries[i].slice); + gst_byte_writer_put_uint32_be_unchecked (&bw, + segment->delta_entries[i].element_delta); + } + + gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0a); + gst_byte_writer_put_uint16_be_unchecked (&bw, + 8 + segment->n_index_entries * (11 + 4 * segment->slice_count + + 8 * segment->pos_table_count)); + gst_byte_writer_put_uint32_be_unchecked (&bw, segment->n_index_entries); + gst_byte_writer_put_uint32_be_unchecked (&bw, + (11 + 4 * segment->slice_count + 8 * segment->pos_table_count)); + for (i = 0; i < segment->n_index_entries; i++) { + guint j; + + gst_byte_writer_put_uint8_unchecked (&bw, + segment->index_entries[i].temporal_offset); + gst_byte_writer_put_uint8_unchecked (&bw, + segment->index_entries[i].key_frame_offset); + gst_byte_writer_put_uint8_unchecked (&bw, segment->index_entries[i].flags); + gst_byte_writer_put_uint64_be_unchecked (&bw, + segment->index_entries[i].stream_offset); + + for (j = 0; j < segment->slice_count; j++) + gst_byte_writer_put_uint32_be_unchecked (&bw, + segment->index_entries[i].slice_offset[j]); + + for (j = 0; j < segment->pos_table_count; j++) { + gst_byte_writer_put_uint32_be_unchecked (&bw, + segment->index_entries[i].pos_table[j].n); + gst_byte_writer_put_uint32_be_unchecked (&bw, + segment->index_entries[i].pos_table[j].d); + } + } + + g_assert (gst_byte_writer_get_pos (&bw) == map.size); + + gst_buffer_unmap (ret, &map); + + return ret; +} + /* SMPTE 377M 8.2 Table 1 and 2 */ static void diff --git a/gst/mxf/mxftypes.h b/gst/mxf/mxftypes.h index b91651c46..b75bb4674 100644 --- a/gst/mxf/mxftypes.h +++ b/gst/mxf/mxftypes.h @@ -257,6 +257,7 @@ GstBuffer * mxf_random_index_pack_to_buffer (const GArray *array); gboolean mxf_index_table_segment_parse (const MXFUL *ul, MXFIndexTableSegment *segment, const guint8 *data, guint size); void mxf_index_table_segment_reset (MXFIndexTableSegment *segment); +GstBuffer * mxf_index_table_segment_to_buffer (const MXFIndexTableSegment *segment); gboolean mxf_local_tag_parse (const guint8 * data, guint size, guint16 * tag, guint16 * tag_size, const guint8 ** tag_data); |