summaryrefslogtreecommitdiffstats
path: root/gst/mxf
diff options
context:
space:
mode:
Diffstat (limited to 'gst/mxf')
-rw-r--r--gst/mxf/mxfaes-bwf.c22
-rw-r--r--gst/mxf/mxfalaw.c11
-rw-r--r--gst/mxf/mxfd10.c22
-rw-r--r--gst/mxf/mxfdemux.c314
-rw-r--r--gst/mxf/mxfdemux.h10
-rw-r--r--gst/mxf/mxfdv-dif.c3
-rw-r--r--gst/mxf/mxfjpeg2000.c11
-rw-r--r--gst/mxf/mxfmpeg.c22
-rw-r--r--gst/mxf/mxfparse.h2
-rw-r--r--gst/mxf/mxfup.c27
-rw-r--r--gst/mxf/mxfvc3.c11
11 files changed, 272 insertions, 183 deletions
diff --git a/gst/mxf/mxfaes-bwf.c b/gst/mxf/mxfaes-bwf.c
index 01c8ce08..ca9234f3 100644
--- a/gst/mxf/mxfaes-bwf.c
+++ b/gst/mxf/mxfaes-bwf.c
@@ -576,8 +576,7 @@ static GstFlowReturn
mxf_bwf_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps,
MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
*outbuf = buffer;
@@ -595,8 +594,7 @@ mxf_bwf_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
static GstFlowReturn
mxf_aes3_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps, MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
*outbuf = buffer;
@@ -816,24 +814,24 @@ mxf_aes_bwf_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
if (!track->parent.descriptor[i])
continue;
- if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
- descriptor[i])
+ if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->
+ parent.descriptor[i])
&& (track->parent.descriptor[i]->essence_container.u[14] == 0x01
|| track->parent.descriptor[i]->essence_container.u[14] == 0x02
|| track->parent.descriptor[i]->essence_container.u[14] == 0x08)) {
- s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent.
- descriptor[i];
+ s = (MXFMetadataGenericSoundEssenceDescriptor *) track->
+ parent.descriptor[i];
bwf = TRUE;
break;
} else
- if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
- descriptor[i])
+ if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->
+ parent.descriptor[i])
&& (track->parent.descriptor[i]->essence_container.u[14] == 0x03
|| track->parent.descriptor[i]->essence_container.u[14] == 0x04
|| track->parent.descriptor[i]->essence_container.u[14] == 0x09)) {
- s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent.
- descriptor[i];
+ s = (MXFMetadataGenericSoundEssenceDescriptor *) track->
+ parent.descriptor[i];
bwf = FALSE;
break;
}
diff --git a/gst/mxf/mxfalaw.c b/gst/mxf/mxfalaw.c
index b14f5b79..074f1a48 100644
--- a/gst/mxf/mxfalaw.c
+++ b/gst/mxf/mxfalaw.c
@@ -65,8 +65,7 @@ static GstFlowReturn
mxf_alaw_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps,
MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
*outbuf = buffer;
@@ -100,10 +99,10 @@ mxf_alaw_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
if (!track->parent.descriptor[i])
continue;
- if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->
- parent.descriptor[i])) {
- s = (MXFMetadataGenericSoundEssenceDescriptor *) track->
- parent.descriptor[i];
+ if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
+ descriptor[i])) {
+ s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent.
+ descriptor[i];
break;
}
}
diff --git a/gst/mxf/mxfd10.c b/gst/mxf/mxfd10.c
index b37fc56c..c24d163c 100644
--- a/gst/mxf/mxfd10.c
+++ b/gst/mxf/mxfd10.c
@@ -71,8 +71,7 @@ static GstFlowReturn
mxf_d10_picture_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps,
MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
*outbuf = buffer;
@@ -89,8 +88,7 @@ static GstFlowReturn
mxf_d10_sound_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps,
MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
guint i, j, nsamples;
const guint8 *indata;
@@ -173,15 +171,15 @@ mxf_d10_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
if (!track->parent.descriptor[i])
continue;
- if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
- parent.descriptor[i])) {
- p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
- descriptor[i];
+ if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
+ descriptor[i])) {
+ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
+ parent.descriptor[i];
break;
- } else if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->
- parent.descriptor[i])) {
- s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent.
- descriptor[i];
+ } else if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
+ descriptor[i])) {
+ s = (MXFMetadataGenericSoundEssenceDescriptor *) track->
+ parent.descriptor[i];
break;
}
}
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
index 0473b696..b3ba872b 100644
--- a/gst/mxf/mxfdemux.c
+++ b/gst/mxf/mxfdemux.c
@@ -188,7 +188,9 @@ gst_mxf_demux_reset_mxf_state (GstMXFDemux * demux)
GstMXFDemuxEssenceTrack *t =
&g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
- g_free (t->offsets);
+ if (t->offsets)
+ g_array_free (t->offsets, TRUE);
+
g_free (t->mapping_data);
if (t->tags)
@@ -384,6 +386,13 @@ gst_mxf_demux_push_src_event (GstMXFDemux * demux, GstEvent * event)
return ret;
}
+static gint
+gst_mxf_demux_partition_compare (GstMXFDemuxPartition * a,
+ GstMXFDemuxPartition * b)
+{
+ return (a->partition.this_partition - b->partition.this_partition);
+}
+
static GstFlowReturn
gst_mxf_demux_handle_partition_pack (GstMXFDemux * demux, const MXFUL * key,
GstBuffer * buffer)
@@ -402,6 +411,7 @@ gst_mxf_demux_handle_partition_pack (GstMXFDemux * demux, const MXFUL * key,
if (tmp->partition.this_partition + demux->run_in == demux->offset &&
tmp->partition.major_version == 0x0001) {
GST_DEBUG_OBJECT (demux, "Partition already parsed");
+ p = tmp;
goto out;
}
}
@@ -436,7 +446,21 @@ gst_mxf_demux_handle_partition_pack (GstMXFDemux * demux, const MXFUL * key,
} else {
p = g_new0 (GstMXFDemuxPartition, 1);
memcpy (&p->partition, &partition, sizeof (MXFPartitionPack));
- demux->partitions = g_list_prepend (demux->partitions, p);
+ demux->partitions =
+ g_list_insert_sorted (demux->partitions, p,
+ (GCompareFunc) gst_mxf_demux_partition_compare);
+ }
+
+ for (l = demux->partitions; l; l = l->next) {
+ GstMXFDemuxPartition *a, *b;
+
+ if (l->next == NULL);
+ break;
+
+ a = l->data;
+ b = l->next->data;
+
+ b->partition.prev_partition = a->partition.this_partition;
}
out:
@@ -692,22 +716,9 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
goto next;
}
- if (track->parent.sequence->duration > etrack->duration) {
- guint64 old_duration = etrack->duration;
-
+ if (track->parent.sequence->duration > etrack->duration)
etrack->duration = track->parent.sequence->duration;
- if (etrack->offsets) {
- etrack->offsets =
- g_realloc (etrack->offsets,
- etrack->duration * sizeof (GstMXFDemuxIndex));
- memset (&etrack->offsets[old_duration - 1], 0,
- etrack->duration - old_duration);
- } else {
- etrack->offsets = g_new0 (GstMXFDemuxIndex, etrack->duration);
- }
- }
-
g_free (etrack->mapping_data);
etrack->mapping_data = NULL;
etrack->handler = NULL;
@@ -740,7 +751,12 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
} else if (!caps) {
GST_WARNING_OBJECT (demux, "Couldn't create updated caps for stream");
} else if (!etrack->caps || !gst_caps_is_equal (etrack->caps, caps)) {
- gst_caps_replace (&etrack->caps, caps);
+ if (etrack->caps)
+ gst_caps_unref (etrack->caps);
+ etrack->caps = caps;
+ } else {
+ gst_caps_unref (caps);
+ caps = NULL;
}
etrack->source_package = package;
@@ -975,7 +991,6 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
/* If we just added the pad initialize for the current component */
if (first_run && MXF_IS_METADATA_MATERIAL_PACKAGE (current_package)) {
pad->current_component_index = 0;
- pad->current_component_position = 0;
pad->current_component_start = source_track->origin;
if (track->edit_rate.n != source_track->edit_rate.n ||
track->edit_rate.n != source_track->edit_rate.n) {
@@ -987,6 +1002,7 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
} else {
pad->current_component_start += component->start_position;
}
+ pad->current_component_position = pad->current_component_start;
}
/* NULL iff playing a source package */
@@ -1212,6 +1228,11 @@ gst_mxf_demux_handle_generic_container_system_item (GstMXFDemux * demux,
"Handling generic container system item of size %u"
" at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), demux->offset);
+ if (demux->current_partition->essence_container_offset == 0)
+ demux->current_partition->essence_container_offset =
+ demux->offset - demux->current_partition->partition.this_partition -
+ demux->run_in;
+
/* TODO: parse this */
return GST_FLOW_OK;
}
@@ -1301,7 +1322,6 @@ gst_mxf_demux_pad_next_component (GstMXFDemux * demux, GstMXFDemuxPad * pad)
return GST_FLOW_ERROR;
}
- pad->current_component_position = 0;
pad->current_component_start = source_track->origin;
if (pad->material_track->edit_rate.n != source_track->edit_rate.n ||
pad->material_track->edit_rate.n != source_track->edit_rate.n) {
@@ -1313,6 +1333,7 @@ gst_mxf_demux_pad_next_component (GstMXFDemux * demux, GstMXFDemuxPad * pad)
} else {
pad->current_component_start += pad->current_component->start_position;
}
+ pad->current_component_position = pad->current_component_start;
if (!gst_caps_is_equal (GST_PAD_CAPS (pad), pad->current_essence_track->caps)) {
@@ -1331,7 +1352,6 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
guint i;
GstBuffer *inbuf;
GstBuffer *outbuf = NULL;
- GstMXFDemuxPad *pad = NULL;
GstMXFDemuxEssenceTrack *etrack = NULL;
GST_DEBUG_OBJECT (demux,
@@ -1343,6 +1363,12 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
GST_DEBUG_OBJECT (demux, " essence element type = 0x%02x", key->u[14]);
GST_DEBUG_OBJECT (demux, " essence element number = 0x%02x", key->u[15]);
+ if (demux->current_partition->essence_container_offset == 0)
+ demux->current_partition->essence_container_offset =
+ demux->offset - demux->current_partition->partition.this_partition -
+ demux->run_in;
+
+
if (!demux->current_package) {
GST_ERROR_OBJECT (demux, "No package selected yet");
return GST_FLOW_ERROR;
@@ -1358,11 +1384,6 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
return GST_FLOW_ERROR;
}
- if (GST_BUFFER_SIZE (buffer) == 0) {
- GST_DEBUG_OBJECT (demux, "Zero sized essence element, ignoring");
- return GST_FLOW_OK;
- }
-
track_number = GST_READ_UINT32_BE (&key->u[12]);
for (i = 0; i < demux->essence_tracks->len; i++) {
@@ -1382,51 +1403,44 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
return GST_FLOW_OK;
}
- /* TODO update essence tracks offsets, position, etc... */
-
- for (i = 0; i < demux->src->len; i++) {
- GstMXFDemuxPad *tmp = g_ptr_array_index (demux->src, i);
-
- if (tmp->current_essence_track == etrack) {
- pad = tmp;
- break;
+ if (etrack->position == -1) {
+ GST_DEBUG_OBJECT (demux,
+ "Unknown essence track position, looking into index");
+ if (etrack->offsets) {
+ for (i = 0; i < etrack->offsets->len; i++) {
+ GstMXFDemuxIndex *idx =
+ &g_array_index (etrack->offsets, GstMXFDemuxIndex, i);
+
+ if (idx->offset != 0 && idx->offset == demux->offset - demux->run_in) {
+ etrack->position = i;
+ break;
+ }
+ }
}
- }
-
- if (!pad) {
- GST_DEBUG_OBJECT (demux, "No pad for essence track found");
- return GST_FLOW_OK;
- }
- if (pad->eos) {
- GST_DEBUG_OBJECT (demux, "Pad is already EOS");
- return GST_FLOW_OK;
- }
-
- if (pad->current_component &&
- pad->current_component_position < pad->current_component_start) {
- GST_DEBUG_OBJECT (demux, "Before current component's start position");
- pad->current_component_position++;
- return GST_FLOW_OK;
+ if (etrack->position == -1) {
+ GST_WARNING_OBJECT (demux, "Essence track position not in index");
+ return GST_FLOW_OK;
+ }
}
/* Create subbuffer to be able to change metadata */
inbuf = gst_buffer_create_sub (buffer, 0, GST_BUFFER_SIZE (buffer));
- GST_BUFFER_TIMESTAMP (inbuf) = pad->last_stop;
- GST_BUFFER_DURATION (inbuf) =
- gst_util_uint64_scale (GST_SECOND, pad->material_track->edit_rate.d,
- pad->material_track->edit_rate.n);
- GST_BUFFER_OFFSET (inbuf) = GST_BUFFER_OFFSET_NONE;
- GST_BUFFER_OFFSET_END (inbuf) = GST_BUFFER_OFFSET_NONE;
- gst_buffer_set_caps (inbuf, etrack->caps);
+ if (etrack->offsets && etrack->offsets->len > etrack->position) {
+ if (!g_array_index (etrack->offsets, GstMXFDemuxIndex,
+ etrack->position).keyframe)
+ GST_BUFFER_FLAG_SET (inbuf, GST_BUFFER_FLAG_DELTA_UNIT);
+ }
+
+ if (etrack->duration <= etrack->position)
+ etrack->duration = etrack->position + 1;
if (etrack->handle_func) {
/* Takes ownership of inbuf */
ret =
etrack->handle_func (key, inbuf, etrack->caps,
- etrack->source_track, pad->current_component, etrack->mapping_data,
- &outbuf);
+ etrack->source_track, etrack->mapping_data, &outbuf);
inbuf = NULL;
} else {
outbuf = inbuf;
@@ -1440,25 +1454,87 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
gst_buffer_unref (outbuf);
outbuf = NULL;
}
+ return ret;
}
- if (pad->need_segment) {
- gst_pad_push_event (GST_PAD_CAST (pad),
- gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0));
- pad->need_segment = FALSE;
+ if (!etrack->offsets)
+ etrack->offsets = g_array_new (FALSE, TRUE, sizeof (GstMXFDemuxIndex));
+
+ {
+ if (etrack->offsets->len > etrack->position) {
+ GstMXFDemuxIndex *index =
+ &g_array_index (etrack->offsets, GstMXFDemuxIndex, etrack->position);
+
+ index->offset = demux->offset - demux->run_in;
+ index->keyframe =
+ (outbuf) ? !GST_BUFFER_FLAG_IS_SET (outbuf,
+ GST_BUFFER_FLAG_DELTA_UNIT) : TRUE;
+ } else {
+ GstMXFDemuxIndex index;
+
+ index.offset = demux->offset - demux->run_in;
+ index.keyframe =
+ (outbuf) ? !GST_BUFFER_FLAG_IS_SET (outbuf,
+ GST_BUFFER_FLAG_DELTA_UNIT) : TRUE;
+ g_array_insert_val (etrack->offsets, etrack->position, index);
+ }
}
- if (pad->tags) {
- gst_element_found_tags_for_pad (GST_ELEMENT_CAST (demux),
- GST_PAD_CAST (pad), pad->tags);
- pad->tags = NULL;
+ if (!outbuf) {
+ GST_DEBUG_OBJECT (demux, "No output buffer created");
+ goto out;
}
+ inbuf = outbuf;
+ outbuf = NULL;
+
+ gst_buffer_set_caps (inbuf, etrack->caps);
+
+ for (i = 0; i < demux->src->len; i++) {
+ GstMXFDemuxPad *pad = g_ptr_array_index (demux->src, i);
+
+ if (pad->current_essence_track != etrack)
+ continue;
+
+ if (pad->eos) {
+ GST_DEBUG_OBJECT (demux, "Pad is already EOS");
+ continue;
+ }
+ if (pad->current_component &&
+ etrack->position < pad->current_component_position) {
+ GST_DEBUG_OBJECT (demux, "Before current component's position");
+ continue;
+ }
+
+ /* Create another subbuffer to have writable metadata */
+ outbuf = gst_buffer_create_sub (inbuf, 0, GST_BUFFER_SIZE (inbuf));
+
+ GST_BUFFER_TIMESTAMP (outbuf) = pad->last_stop;
+ /* FIXME: What about tracks with source track edit rate != material
+ * track edit rate? Use one of them and set the relative rate
+ * to the other one as "rate" for the segment?
+ */
+ GST_BUFFER_DURATION (outbuf) =
+ gst_util_uint64_scale (GST_SECOND, pad->material_track->edit_rate.d,
+ pad->material_track->edit_rate.n);
+ GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_NONE;
+
+ if (pad->need_segment) {
+ gst_pad_push_event (GST_PAD_CAST (pad),
+ gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1,
+ GST_BUFFER_TIMESTAMP (outbuf)));
+ pad->need_segment = FALSE;
+ }
+
+ if (pad->tags) {
+ gst_element_found_tags_for_pad (GST_ELEMENT_CAST (demux),
+ GST_PAD_CAST (pad), pad->tags);
+ pad->tags = NULL;
+ }
- if (outbuf)
pad->last_stop += GST_BUFFER_DURATION (outbuf);
- if (outbuf) {
GST_DEBUG_OBJECT (demux,
"Pushing buffer of size %u for track %u: timestamp %" GST_TIME_FORMAT
" duration %" GST_TIME_FORMAT, GST_BUFFER_SIZE (outbuf),
@@ -1473,48 +1549,52 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
ret = gst_pad_push (GST_PAD_CAST (pad), outbuf);
ret = gst_mxf_demux_combine_flows (demux, pad, ret);
- } else {
- GST_DEBUG_OBJECT (demux, "Dropping buffer for track %u",
- pad->material_track->parent.track_id);
- }
-
- if (ret != GST_FLOW_OK)
- return ret;
-
- if (pad->current_component) {
- pad->current_component_position++;
- if (pad->current_component->parent.duration != -1 &&
- pad->current_component_position - pad->current_component_start
- >= pad->current_component->parent.duration) {
- GST_DEBUG_OBJECT (demux, "Switching to next component");
- if ((ret = gst_mxf_demux_pad_next_component (demux, pad)) != GST_FLOW_OK) {
- if (ret == GST_FLOW_UNEXPECTED) {
- gboolean eos = TRUE;
-
- GST_DEBUG_OBJECT (demux, "EOS for track");
- pad->eos = TRUE;
-
- for (i = 0; i < demux->src->len; i++) {
- GstMXFDemuxPad *opad = g_ptr_array_index (demux->src, i);
-
- eos &= opad->eos;
- }
+ if (ret != GST_FLOW_OK)
+ break;
- if (eos) {
- GST_DEBUG_OBJECT (demux, "All tracks are EOS");
- return GST_FLOW_UNEXPECTED;
+ if (pad->current_component) {
+ pad->current_component_position++;
+ if (pad->current_component->parent.duration != -1 &&
+ pad->current_component_position - pad->current_component_start
+ >= pad->current_component->parent.duration) {
+ GST_DEBUG_OBJECT (demux, "Switching to next component");
+
+ if ((ret =
+ gst_mxf_demux_pad_next_component (demux, pad)) != GST_FLOW_OK) {
+ if (ret == GST_FLOW_UNEXPECTED) {
+ gboolean eos = TRUE;
+
+ GST_DEBUG_OBJECT (demux, "EOS for track");
+ pad->eos = TRUE;
+
+ for (i = 0; i < demux->src->len; i++) {
+ GstMXFDemuxPad *opad = g_ptr_array_index (demux->src, i);
+
+ eos &= opad->eos;
+ }
+
+ if (eos) {
+ GST_DEBUG_OBJECT (demux, "All tracks are EOS");
+ ret = GST_FLOW_UNEXPECTED;
+ break;
+ } else {
+ ret = GST_FLOW_OK;
+ }
} else {
- return GST_FLOW_OK;
+ GST_ERROR_OBJECT (demux, "Switching component failed");
+ break;
}
- } else {
- GST_ERROR_OBJECT (demux, "Switching component failed");
- return ret;
}
}
}
}
+out:
+ gst_buffer_unref (inbuf);
+
+ etrack->position++;
+
return ret;
}
@@ -1523,6 +1603,7 @@ gst_mxf_demux_handle_random_index_pack (GstMXFDemux * demux, const MXFUL * key,
GstBuffer * buffer)
{
guint i;
+ GList *l;
GST_DEBUG_OBJECT (demux,
"Handling random index pack of size %u at offset %"
@@ -1540,7 +1621,6 @@ gst_mxf_demux_handle_random_index_pack (GstMXFDemux * demux, const MXFUL * key,
}
for (i = 0; i < demux->random_index_pack->len; i++) {
- GList *l;
GstMXFDemuxPartition *p = NULL;
MXFRandomIndexPackEntry *e =
&g_array_index (demux->random_index_pack, MXFRandomIndexPackEntry, i);
@@ -1563,10 +1643,24 @@ gst_mxf_demux_handle_random_index_pack (GstMXFDemux * demux, const MXFUL * key,
p = g_new0 (GstMXFDemuxPartition, 1);
p->partition.this_partition = e->offset - demux->run_in;
p->partition.body_sid = e->body_sid;
- demux->partitions = g_list_prepend (demux->partitions, p);
+ demux->partitions =
+ g_list_insert_sorted (demux->partitions, p,
+ (GCompareFunc) gst_mxf_demux_partition_compare);
}
}
+ for (l = demux->partitions; l; l = l->next) {
+ GstMXFDemuxPartition *a, *b;
+
+ if (l->next == NULL);
+ break;
+
+ a = l->data;
+ b = l->next->data;
+
+ b->partition.prev_partition = a->partition.this_partition;
+ }
+
return GST_FLOW_OK;
}
@@ -1884,6 +1978,12 @@ next_try:
demux->offset += read;
gst_buffer_unref (buffer);
buffer = NULL;
+ } else if (mxf_is_generic_container_system_item (&key) ||
+ mxf_is_generic_container_essence_element (&key)) {
+ demux->offset += read;
+ gst_buffer_unref (buffer);
+ buffer = NULL;
+ break;
} else {
demux->offset += read;
gst_buffer_unref (buffer);
@@ -1921,9 +2021,11 @@ gst_mxf_demux_handle_klv_packet (GstMXFDemux * demux, const MXFUL * key,
if (demux->update_metadata
&& demux->preface
- && demux->offset >=
- demux->run_in + demux->current_partition->primer.offset +
- demux->current_partition->partition.header_byte_count) {
+ && (demux->offset >=
+ demux->run_in + demux->current_partition->primer.offset +
+ demux->current_partition->partition.header_byte_count ||
+ mxf_is_generic_container_system_item (key) ||
+ mxf_is_generic_container_essence_element (key))) {
demux->current_partition->parsed_metadata = TRUE;
if ((ret = gst_mxf_demux_resolve_references (demux)) != GST_FLOW_OK)
goto beach;
diff --git a/gst/mxf/mxfdemux.h b/gst/mxf/mxfdemux.h
index e76f5e14..e431e306 100644
--- a/gst/mxf/mxfdemux.h
+++ b/gst/mxf/mxfdemux.h
@@ -54,6 +54,7 @@ typedef struct
MXFPartitionPack partition;
MXFPrimerPack primer;
gboolean parsed_metadata;
+ guint64 essence_container_offset;
} GstMXFDemuxPartition;
typedef struct
@@ -67,13 +68,10 @@ typedef struct
guint32 body_sid;
guint32 track_number;
- guint64 position;
- guint64 duration;
+ gint64 position;
+ gint64 duration;
- GstMXFDemuxIndex *offsets;
-
- guint64 last_offset;
- guint64 last_indexed_offset;
+ GArray *offsets;
MXFMetadataSourcePackage *source_package;
MXFMetadataTimelineTrack *source_track;
diff --git a/gst/mxf/mxfdv-dif.c b/gst/mxf/mxfdv-dif.c
index 67610e3b..256bddac 100644
--- a/gst/mxf/mxfdv-dif.c
+++ b/gst/mxf/mxfdv-dif.c
@@ -70,8 +70,7 @@ static GstFlowReturn
mxf_dv_dif_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps,
MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
*outbuf = buffer;
diff --git a/gst/mxf/mxfjpeg2000.c b/gst/mxf/mxfjpeg2000.c
index 84680bc0..c9d7b2aa 100644
--- a/gst/mxf/mxfjpeg2000.c
+++ b/gst/mxf/mxfjpeg2000.c
@@ -70,8 +70,7 @@ static GstFlowReturn
mxf_jpeg2000_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps,
MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
*outbuf = buffer;
@@ -106,10 +105,10 @@ mxf_jpeg2000_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
if (!track->parent.descriptor[i])
continue;
- if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
- parent.descriptor[i])) {
- p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
- descriptor[i];
+ if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
+ descriptor[i])) {
+ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
+ parent.descriptor[i];
f = track->parent.descriptor[i];
break;
} else if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->parent.descriptor[i]) &&
diff --git a/gst/mxf/mxfmpeg.c b/gst/mxf/mxfmpeg.c
index 86a5b1f1..5bfa4562 100644
--- a/gst/mxf/mxfmpeg.c
+++ b/gst/mxf/mxfmpeg.c
@@ -256,8 +256,7 @@ mxf_is_mpeg_essence_track (const MXFMetadataTimelineTrack * track)
static GstFlowReturn
mxf_mpeg_video_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps, MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
*outbuf = buffer;
@@ -274,8 +273,7 @@ mxf_mpeg_video_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
static GstFlowReturn
mxf_mpeg_audio_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps, MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
*outbuf = buffer;
@@ -488,17 +486,17 @@ mxf_mpeg_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
if (!track->parent.descriptor[i])
continue;
- if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
- parent.descriptor[i])) {
+ if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
+ descriptor[i])) {
f = track->parent.descriptor[i];
- p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
- descriptor[i];
+ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
+ parent.descriptor[i];
break;
- } else if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->
- parent.descriptor[i])) {
+ } else if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
+ descriptor[i])) {
f = track->parent.descriptor[i];
- s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent.
- descriptor[i];
+ s = (MXFMetadataGenericSoundEssenceDescriptor *) track->
+ parent.descriptor[i];
break;
}
}
diff --git a/gst/mxf/mxfparse.h b/gst/mxf/mxfparse.h
index 3e6e91b2..9c024803 100644
--- a/gst/mxf/mxfparse.h
+++ b/gst/mxf/mxfparse.h
@@ -27,7 +27,7 @@
#include "mxftypes.h"
#include "mxfmetadata.h"
-typedef GstFlowReturn (*MXFEssenceElementHandleFunc) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataTimelineTrack *track, MXFMetadataSourceClip *component, gpointer mapping_data, GstBuffer **outbuf);
+typedef GstFlowReturn (*MXFEssenceElementHandleFunc) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataTimelineTrack *track, gpointer mapping_data, GstBuffer **outbuf);
typedef struct {
gboolean (*handles_track) (const MXFMetadataTimelineTrack *track);
diff --git a/gst/mxf/mxfup.c b/gst/mxf/mxfup.c
index 7ab8659a..d109b9ed 100644
--- a/gst/mxf/mxfup.c
+++ b/gst/mxf/mxfup.c
@@ -80,8 +80,7 @@ static GstFlowReturn
mxf_up_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps,
MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
MXFUPMappingData *data = mapping_data;
@@ -222,19 +221,19 @@ mxf_up_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
if (!track->parent.descriptor[i])
continue;
- if (MXF_IS_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
- descriptor[i])) {
- p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
- descriptor[i];
- r = (MXFMetadataRGBAPictureEssenceDescriptor *) track->parent.
- descriptor[i];
- break;
- } else if (MXF_IS_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (track->
+ if (MXF_IS_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (track->
parent.descriptor[i])) {
- p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
- descriptor[i];
- c = (MXFMetadataCDCIPictureEssenceDescriptor *) track->parent.
- descriptor[i];
+ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
+ parent.descriptor[i];
+ r = (MXFMetadataRGBAPictureEssenceDescriptor *) track->
+ parent.descriptor[i];
+ break;
+ } else if (MXF_IS_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
+ descriptor[i])) {
+ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
+ parent.descriptor[i];
+ c = (MXFMetadataCDCIPictureEssenceDescriptor *) track->
+ parent.descriptor[i];
}
}
diff --git a/gst/mxf/mxfvc3.c b/gst/mxf/mxfvc3.c
index 48cf50ac..497355ef 100644
--- a/gst/mxf/mxfvc3.c
+++ b/gst/mxf/mxfvc3.c
@@ -65,8 +65,7 @@ static GstFlowReturn
mxf_vc3_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
GstCaps * caps,
MXFMetadataTimelineTrack * track,
- MXFMetadataSourceClip * component, gpointer mapping_data,
- GstBuffer ** outbuf)
+ gpointer mapping_data, GstBuffer ** outbuf)
{
*outbuf = buffer;
@@ -100,10 +99,10 @@ mxf_vc3_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
if (!track->parent.descriptor[i])
continue;
- if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
- descriptor[i])) {
- p = (MXFMetadataGenericPictureEssenceDescriptor *) track->
- parent.descriptor[i];
+ if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
+ parent.descriptor[i])) {
+ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
+ descriptor[i];
f = track->parent.descriptor[i];
break;
} else if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->parent.descriptor[i]) &&