mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 08:11:16 +00:00
mxftypes: Add function to serialize an index table segment to a buffer
This commit is contained in:
parent
01f0d16db3
commit
47da7565ce
2 changed files with 121 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue