mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
mxfdemux: Keep track of component start positions and material track positions
This allows us to know exactly where in the material track we are, and how to convert from a PTS for a source track to the actual PTS of the material track (i.e. by adding the component start position). https://bugzilla.gnome.org/show_bug.cgi?id=785119
This commit is contained in:
parent
819406b563
commit
c2ef63a3bc
2 changed files with 60 additions and 37 deletions
|
@ -108,6 +108,7 @@ static void
|
||||||
gst_mxf_demux_pad_init (GstMXFDemuxPad * pad)
|
gst_mxf_demux_pad_init (GstMXFDemuxPad * pad)
|
||||||
{
|
{
|
||||||
pad->position = 0;
|
pad->position = 0;
|
||||||
|
pad->current_material_track_position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
@ -1010,7 +1011,7 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
|
||||||
MXF_METADATA_SOURCE_CLIP (sequence->structural_components
|
MXF_METADATA_SOURCE_CLIP (sequence->structural_components
|
||||||
[component_index]);
|
[component_index]);
|
||||||
if (!component) {
|
if (!component) {
|
||||||
GST_WARNING_OBJECT (demux, "NULL conponent in non source package");
|
GST_WARNING_OBJECT (demux, "NULL component in non-source package");
|
||||||
if (!pad) {
|
if (!pad) {
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1160,6 +1161,7 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
|
||||||
if (first_run && MXF_IS_METADATA_MATERIAL_PACKAGE (current_package)) {
|
if (first_run && MXF_IS_METADATA_MATERIAL_PACKAGE (current_package)) {
|
||||||
pad->current_component_index = 0;
|
pad->current_component_index = 0;
|
||||||
pad->current_component_start = source_track->origin;
|
pad->current_component_start = source_track->origin;
|
||||||
|
pad->current_component_start_position = 0;
|
||||||
|
|
||||||
if (component->parent.duration >= -1)
|
if (component->parent.duration >= -1)
|
||||||
pad->current_component_duration = component->parent.duration;
|
pad->current_component_duration = component->parent.duration;
|
||||||
|
@ -1569,7 +1571,13 @@ gst_mxf_demux_pad_set_component (GstMXFDemux * demux, GstMXFDemuxPad * pad,
|
||||||
return GST_FLOW_ERROR;
|
return GST_FLOW_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
pad->current_component_start = source_track->origin;
|
pad->current_component_start_position = 0;
|
||||||
|
for (k = 0; k < i; k++) {
|
||||||
|
pad->current_component_start_position +=
|
||||||
|
MXF_METADATA_SOURCE_CLIP (sequence->structural_components[k])->
|
||||||
|
parent.duration;
|
||||||
|
}
|
||||||
|
|
||||||
if (pad->current_component->parent.duration >= -1)
|
if (pad->current_component->parent.duration >= -1)
|
||||||
pad->current_component_duration = pad->current_component->parent.duration;
|
pad->current_component_duration = pad->current_component->parent.duration;
|
||||||
else
|
else
|
||||||
|
@ -1592,7 +1600,6 @@ gst_mxf_demux_pad_set_component (GstMXFDemux * demux, GstMXFDemuxPad * pad,
|
||||||
}
|
}
|
||||||
pad->current_essence_track_position = pad->current_component_start;
|
pad->current_essence_track_position = pad->current_component_start;
|
||||||
|
|
||||||
|
|
||||||
pad_caps = gst_pad_get_current_caps (GST_PAD_CAST (pad));
|
pad_caps = gst_pad_get_current_caps (GST_PAD_CAST (pad));
|
||||||
if (!gst_caps_is_equal (pad_caps, pad->current_essence_track->caps)) {
|
if (!gst_caps_is_equal (pad_caps, pad->current_essence_track->caps)) {
|
||||||
gst_pad_set_caps (GST_PAD_CAST (pad), pad->current_essence_track->caps);
|
gst_pad_set_caps (GST_PAD_CAST (pad), pad->current_essence_track->caps);
|
||||||
|
@ -1852,14 +1859,19 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
|
||||||
gst_buffer_get_size (inbuf));
|
gst_buffer_get_size (inbuf));
|
||||||
|
|
||||||
GST_BUFFER_DTS (outbuf) = pad->position;
|
GST_BUFFER_DTS (outbuf) = pad->position;
|
||||||
if (etrack->intra_only)
|
if (etrack->intra_only) {
|
||||||
GST_BUFFER_PTS (outbuf) = pad->position;
|
GST_BUFFER_PTS (outbuf) = pad->position;
|
||||||
else if (pts != G_MAXUINT64)
|
} else if (pts != G_MAXUINT64) {
|
||||||
GST_BUFFER_PTS (outbuf) = gst_util_uint64_scale (pts * GST_SECOND,
|
GST_BUFFER_PTS (outbuf) = gst_util_uint64_scale (pts * GST_SECOND,
|
||||||
pad->current_essence_track->source_track->edit_rate.d,
|
pad->current_essence_track->source_track->edit_rate.d,
|
||||||
pad->current_essence_track->source_track->edit_rate.n);
|
pad->current_essence_track->source_track->edit_rate.n);
|
||||||
else
|
GST_BUFFER_PTS (outbuf) +=
|
||||||
|
gst_util_uint64_scale (pad->current_component_start_position *
|
||||||
|
GST_SECOND, pad->current_essence_track->source_track->edit_rate.d,
|
||||||
|
pad->current_essence_track->source_track->edit_rate.n);
|
||||||
|
} else {
|
||||||
GST_BUFFER_PTS (outbuf) = GST_CLOCK_TIME_NONE;
|
GST_BUFFER_PTS (outbuf) = GST_CLOCK_TIME_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
GST_BUFFER_DURATION (outbuf) =
|
GST_BUFFER_DURATION (outbuf) =
|
||||||
gst_util_uint64_scale (GST_SECOND,
|
gst_util_uint64_scale (GST_SECOND,
|
||||||
|
@ -1901,6 +1913,7 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
|
||||||
}
|
}
|
||||||
|
|
||||||
pad->position += GST_BUFFER_DURATION (outbuf);
|
pad->position += GST_BUFFER_DURATION (outbuf);
|
||||||
|
pad->current_material_track_position++;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (demux,
|
GST_DEBUG_OBJECT (demux,
|
||||||
"Pushing buffer of size %" G_GSIZE_FORMAT " for track %u: pts %"
|
"Pushing buffer of size %" G_GSIZE_FORMAT " for track %u: pts %"
|
||||||
|
@ -3350,7 +3363,7 @@ gst_mxf_demux_pad_set_position (GstMXFDemux * demux, GstMXFDemuxPad * p,
|
||||||
GstClockTime start)
|
GstClockTime start)
|
||||||
{
|
{
|
||||||
guint i;
|
guint i;
|
||||||
GstClockTime sum = 0;
|
guint64 sum = 0;
|
||||||
MXFMetadataSourceClip *clip = NULL;
|
MXFMetadataSourceClip *clip = NULL;
|
||||||
|
|
||||||
if (!p->current_component) {
|
if (!p->current_component) {
|
||||||
|
@ -3369,6 +3382,7 @@ gst_mxf_demux_pad_set_position (GstMXFDemux * demux, GstMXFDemuxPad * p,
|
||||||
p->position = start;
|
p->position = start;
|
||||||
}
|
}
|
||||||
p->position_accumulated_error = 0.0;
|
p->position_accumulated_error = 0.0;
|
||||||
|
p->current_material_track_position = p->current_essence_track_position;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3382,30 +3396,30 @@ gst_mxf_demux_pad_set_position (GstMXFDemux * demux, GstMXFDemuxPad * p,
|
||||||
if (clip->parent.duration <= 0)
|
if (clip->parent.duration <= 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
sum +=
|
sum += clip->parent.duration;
|
||||||
gst_util_uint64_scale (clip->parent.duration,
|
|
||||||
p->material_track->edit_rate.d * GST_SECOND,
|
|
||||||
p->material_track->edit_rate.n);
|
|
||||||
|
|
||||||
if (sum > start)
|
if (gst_util_uint64_scale (sum, p->material_track->edit_rate.d * GST_SECOND,
|
||||||
|
p->material_track->edit_rate.n) > start)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == p->material_track->parent.sequence->n_structural_components) {
|
if (i == p->material_track->parent.sequence->n_structural_components) {
|
||||||
p->position = sum;
|
p->position =
|
||||||
|
gst_util_uint64_scale (sum, p->material_track->edit_rate.d * GST_SECOND,
|
||||||
|
p->material_track->edit_rate.n);
|
||||||
p->position_accumulated_error = 0.0;
|
p->position_accumulated_error = 0.0;
|
||||||
|
p->current_material_track_position = sum;
|
||||||
|
|
||||||
gst_mxf_demux_pad_set_component (demux, p, i);
|
gst_mxf_demux_pad_set_component (demux, p, i);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clip->parent.duration > 0)
|
if (clip->parent.duration > 0)
|
||||||
sum -=
|
sum -= clip->parent.duration;
|
||||||
gst_util_uint64_scale (clip->parent.duration,
|
|
||||||
p->material_track->edit_rate.d * GST_SECOND,
|
|
||||||
p->material_track->edit_rate.n);
|
|
||||||
|
|
||||||
start -= sum;
|
start -=
|
||||||
|
gst_util_uint64_scale (sum, p->material_track->edit_rate.d * GST_SECOND,
|
||||||
|
p->material_track->edit_rate.n);
|
||||||
|
|
||||||
gst_mxf_demux_pad_set_component (demux, p, i);
|
gst_mxf_demux_pad_set_component (demux, p, i);
|
||||||
|
|
||||||
|
@ -3416,19 +3430,25 @@ gst_mxf_demux_pad_set_position (GstMXFDemux * demux, GstMXFDemuxPad * p,
|
||||||
|
|
||||||
p->current_essence_track_position += essence_offset;
|
p->current_essence_track_position += essence_offset;
|
||||||
|
|
||||||
p->position = sum + gst_util_uint64_scale (essence_offset,
|
p->position = gst_util_uint64_scale (sum,
|
||||||
GST_SECOND * p->material_track->edit_rate.d,
|
GST_SECOND * p->material_track->edit_rate.d,
|
||||||
p->material_track->edit_rate.n);
|
p->material_track->edit_rate.n) + gst_util_uint64_scale (essence_offset,
|
||||||
|
GST_SECOND * p->current_essence_track->source_track->edit_rate.d,
|
||||||
|
p->current_essence_track->source_track->edit_rate.n);
|
||||||
p->position_accumulated_error = 0.0;
|
p->position_accumulated_error = 0.0;
|
||||||
|
p->current_material_track_position = sum + essence_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->current_essence_track_position >= p->current_essence_track->duration
|
if (p->current_essence_track_position >= p->current_essence_track->duration
|
||||||
&& p->current_essence_track->duration > 0) {
|
&& p->current_essence_track->duration > 0) {
|
||||||
p->current_essence_track_position = p->current_essence_track->duration;
|
p->current_essence_track_position = p->current_essence_track->duration;
|
||||||
p->position =
|
p->position =
|
||||||
sum + gst_util_uint64_scale (p->current_component->parent.duration,
|
gst_util_uint64_scale (sum + p->current_component->parent.duration,
|
||||||
p->material_track->edit_rate.d * GST_SECOND,
|
p->material_track->edit_rate.d * GST_SECOND,
|
||||||
p->material_track->edit_rate.n);
|
p->material_track->edit_rate.n);
|
||||||
|
p->position_accumulated_error = 0.0;
|
||||||
|
p->current_material_track_position =
|
||||||
|
sum + p->current_component->parent.duration;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3823,6 +3843,14 @@ gst_mxf_demux_seek_pull (GstMXFDemux * demux, GstEvent * event)
|
||||||
position,
|
position,
|
||||||
GST_SECOND * p->current_essence_track->source_track->edit_rate.d,
|
GST_SECOND * p->current_essence_track->source_track->edit_rate.d,
|
||||||
p->current_essence_track->source_track->edit_rate.n);
|
p->current_essence_track->source_track->edit_rate.n);
|
||||||
|
p->position_accumulated_error = 0.0;
|
||||||
|
p->current_material_track_position -=
|
||||||
|
gst_util_uint64_scale (p->current_essence_track_position -
|
||||||
|
position,
|
||||||
|
p->material_track->edit_rate.n *
|
||||||
|
p->current_essence_track->source_track->edit_rate.d,
|
||||||
|
p->material_track->edit_rate.d *
|
||||||
|
p->current_essence_track->source_track->edit_rate.n);
|
||||||
}
|
}
|
||||||
p->current_essence_track_position = position;
|
p->current_essence_track_position = position;
|
||||||
|
|
||||||
|
@ -3970,22 +3998,10 @@ gst_mxf_demux_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
|
||||||
if (format != GST_FORMAT_TIME && format != GST_FORMAT_DEFAULT)
|
if (format != GST_FORMAT_TIME && format != GST_FORMAT_DEFAULT)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
pos = mxfpad->position;
|
|
||||||
|
|
||||||
g_rw_lock_reader_lock (&demux->metadata_lock);
|
|
||||||
if (format == GST_FORMAT_DEFAULT && pos != GST_CLOCK_TIME_NONE) {
|
|
||||||
if (!mxfpad->material_track || mxfpad->material_track->edit_rate.n == 0
|
|
||||||
|| mxfpad->material_track->edit_rate.d == 0) {
|
|
||||||
g_rw_lock_reader_unlock (&demux->metadata_lock);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos =
|
pos =
|
||||||
gst_util_uint64_scale (pos,
|
format ==
|
||||||
mxfpad->material_track->edit_rate.n,
|
GST_FORMAT_DEFAULT ? mxfpad->current_material_track_position :
|
||||||
mxfpad->material_track->edit_rate.d * GST_SECOND);
|
mxfpad->position;
|
||||||
}
|
|
||||||
g_rw_lock_reader_unlock (&demux->metadata_lock);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pad,
|
GST_DEBUG_OBJECT (pad,
|
||||||
"Returning position %" G_GINT64_FORMAT " in format %s", pos,
|
"Returning position %" G_GINT64_FORMAT " in format %s", pos,
|
||||||
|
|
|
@ -116,6 +116,9 @@ struct _GstMXFDemuxPad
|
||||||
|
|
||||||
GstClockTime position;
|
GstClockTime position;
|
||||||
gdouble position_accumulated_error;
|
gdouble position_accumulated_error;
|
||||||
|
/* Current position in the material track */
|
||||||
|
gint64 current_material_track_position;
|
||||||
|
|
||||||
gboolean eos, discont;
|
gboolean eos, discont;
|
||||||
|
|
||||||
GstTagList *tags;
|
GstTagList *tags;
|
||||||
|
@ -126,6 +129,10 @@ struct _GstMXFDemuxPad
|
||||||
guint current_component_index;
|
guint current_component_index;
|
||||||
MXFMetadataSourceClip *current_component;
|
MXFMetadataSourceClip *current_component;
|
||||||
|
|
||||||
|
/* Position in the material track where this component started */
|
||||||
|
gint64 current_component_start_position;
|
||||||
|
|
||||||
|
/* Position/duration in the source track */
|
||||||
gint64 current_component_start;
|
gint64 current_component_start;
|
||||||
gint64 current_component_duration;
|
gint64 current_component_duration;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue