mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 19:51:11 +00:00
mxfdemux: Fix issue with re-syncing
In case of re-syncing (i.e. moving to another partition to avoid too much of an interleave), there was previously no checks to figure out whether a given partition was already fully handled (i.e. when coming across it again after a previous resync). In order to handle this at least for single-track partitions, check whether we have reached the essence track duration, and if so skip the partition. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2150>
This commit is contained in:
parent
3a77a3c696
commit
25b37c33dd
1 changed files with 10 additions and 3 deletions
|
@ -4136,6 +4136,7 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux)
|
||||||
/* We entered a new partition */
|
/* We entered a new partition */
|
||||||
if (ret == GST_FLOW_OK && mxf_is_partition_pack (&klv.key)) {
|
if (ret == GST_FLOW_OK && mxf_is_partition_pack (&klv.key)) {
|
||||||
GstMXFDemuxPartition *partition = demux->current_partition;
|
GstMXFDemuxPartition *partition = demux->current_partition;
|
||||||
|
gboolean partition_done = FALSE;
|
||||||
|
|
||||||
/* Grab footer metadata if needed */
|
/* Grab footer metadata if needed */
|
||||||
if (demux->pull_footer_metadata
|
if (demux->pull_footer_metadata
|
||||||
|
@ -4178,8 +4179,13 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux)
|
||||||
"Track already at another position : %" G_GINT64_FORMAT,
|
"Track already at another position : %" G_GINT64_FORMAT,
|
||||||
partition->single_track->position);
|
partition->single_track->position);
|
||||||
if (find_edit_entry (demux, partition->single_track,
|
if (find_edit_entry (demux, partition->single_track,
|
||||||
partition->single_track->position, FALSE, &entry))
|
partition->single_track->position, FALSE, &entry)) {
|
||||||
lowest_offset = entry.offset;
|
lowest_offset = entry.offset;
|
||||||
|
} else if (partition->single_track->position >=
|
||||||
|
partition->single_track->duration) {
|
||||||
|
GST_DEBUG_OBJECT (demux, "Track fully consumed, partition done");
|
||||||
|
partition_done = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
guint i;
|
guint i;
|
||||||
|
@ -4207,14 +4213,15 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lowest_offset != G_MAXUINT64) {
|
if (partition_done || lowest_offset != G_MAXUINT64) {
|
||||||
GstMXFDemuxPartition *next_partition = NULL;
|
GstMXFDemuxPartition *next_partition = NULL;
|
||||||
GList *cur_part = g_list_find (demux->partitions, partition);
|
GList *cur_part = g_list_find (demux->partitions, partition);
|
||||||
if (cur_part && cur_part->next)
|
if (cur_part && cur_part->next)
|
||||||
next_partition = (GstMXFDemuxPartition *) cur_part->next->data;
|
next_partition = (GstMXFDemuxPartition *) cur_part->next->data;
|
||||||
|
|
||||||
/* If we have completely processed this partition, skip to next partition */
|
/* If we have completely processed this partition, skip to next partition */
|
||||||
if (lowest_offset > next_partition->partition.this_partition) {
|
if (partition_done
|
||||||
|
|| lowest_offset > next_partition->partition.this_partition) {
|
||||||
GST_DEBUG_OBJECT (demux,
|
GST_DEBUG_OBJECT (demux,
|
||||||
"Partition entirely processed, skipping to next one");
|
"Partition entirely processed, skipping to next one");
|
||||||
demux->offset = next_partition->partition.this_partition;
|
demux->offset = next_partition->partition.this_partition;
|
||||||
|
|
Loading…
Reference in a new issue