Improve EOS detection and fix push mode for the last pushed in buffer
This commit is contained in:
parent
707136fe5d
commit
02769b4a4d
@ -385,6 +385,28 @@ gst_mxf_demux_push_src_event (GstMXFDemux * demux, GstEvent * event)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstMXFDemuxPad *
|
||||||
|
gst_mxf_demux_get_earliest_pad (GstMXFDemux * demux)
|
||||||
|
{
|
||||||
|
guint i;
|
||||||
|
GstClockTime earliest = GST_CLOCK_TIME_NONE;
|
||||||
|
GstMXFDemuxPad *pad = NULL;
|
||||||
|
|
||||||
|
if (!demux->src)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < demux->src->len; i++) {
|
||||||
|
GstMXFDemuxPad *p = g_ptr_array_index (demux->src, i);
|
||||||
|
|
||||||
|
if (!p->eos && p->last_flow < earliest) {
|
||||||
|
earliest = p->last_flow;
|
||||||
|
pad = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pad;
|
||||||
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
gst_mxf_demux_partition_compare (GstMXFDemuxPartition * a,
|
gst_mxf_demux_partition_compare (GstMXFDemuxPartition * a,
|
||||||
GstMXFDemuxPartition * b)
|
GstMXFDemuxPartition * b)
|
||||||
@ -1492,7 +1514,6 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
|
|||||||
|
|
||||||
for (i = 0; i < demux->src->len; i++) {
|
for (i = 0; i < demux->src->len; i++) {
|
||||||
GstMXFDemuxPad *pad = g_ptr_array_index (demux->src, i);
|
GstMXFDemuxPad *pad = g_ptr_array_index (demux->src, i);
|
||||||
guint j;
|
|
||||||
|
|
||||||
if (pad->current_essence_track != etrack)
|
if (pad->current_essence_track != etrack)
|
||||||
continue;
|
continue;
|
||||||
@ -1507,18 +1528,15 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0; j < demux->src->len; j++) {
|
{
|
||||||
GstMXFDemuxPad *opad = g_ptr_array_index (demux->src, j);
|
GstMXFDemuxPad *earliest = gst_mxf_demux_get_earliest_pad (demux);
|
||||||
|
|
||||||
if (!opad->eos && opad->last_stop < pad->last_stop &&
|
if (earliest && earliest != pad && earliest->last_stop < pad->last_stop &&
|
||||||
pad->last_stop - opad->last_stop > 500 * GST_MSECOND) {
|
pad->last_stop - earliest->last_stop > 500 * GST_MSECOND) {
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (j != demux->src->len) {
|
|
||||||
GST_DEBUG_OBJECT (demux, "Pad is too far ahead of time");
|
GST_DEBUG_OBJECT (demux, "Pad is too far ahead of time");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Create another subbuffer to have writable metadata */
|
/* Create another subbuffer to have writable metadata */
|
||||||
outbuf = gst_buffer_create_sub (inbuf, 0, GST_BUFFER_SIZE (inbuf));
|
outbuf = gst_buffer_create_sub (inbuf, 0, GST_BUFFER_SIZE (inbuf));
|
||||||
@ -1612,20 +1630,7 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
|
|||||||
GST_DEBUG_OBJECT (demux, "EOS for track");
|
GST_DEBUG_OBJECT (demux, "EOS for track");
|
||||||
pad->eos = TRUE;
|
pad->eos = TRUE;
|
||||||
gst_pad_push_event (GST_PAD_CAST (pad), gst_event_new_eos ());
|
gst_pad_push_event (GST_PAD_CAST (pad), gst_event_new_eos ());
|
||||||
|
|
||||||
for (i = 0; i < demux->src->len; i++) {
|
|
||||||
GstMXFDemuxPad *opad = g_ptr_array_index (demux->src, i);
|
|
||||||
|
|
||||||
if (!opad->eos) {
|
|
||||||
ret = GST_FLOW_OK;
|
ret = GST_FLOW_OK;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret == GST_FLOW_UNEXPECTED) {
|
|
||||||
GST_DEBUG_OBJECT (demux, "All tracks are EOS");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret != GST_FLOW_OK)
|
if (ret != GST_FLOW_OK)
|
||||||
@ -2302,17 +2307,31 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux)
|
|||||||
GstFlowReturn ret = GST_FLOW_OK;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
guint read = 0;
|
guint read = 0;
|
||||||
|
|
||||||
|
if (demux->src) {
|
||||||
|
if (!gst_mxf_demux_get_earliest_pad (demux)) {
|
||||||
|
ret = GST_FLOW_UNEXPECTED;
|
||||||
|
GST_DEBUG_OBJECT (demux, "All tracks are EOS");
|
||||||
|
goto beach;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret =
|
ret =
|
||||||
gst_mxf_demux_pull_klv_packet (demux, demux->offset, &key, &buffer,
|
gst_mxf_demux_pull_klv_packet (demux, demux->offset, &key, &buffer,
|
||||||
&read);
|
&read);
|
||||||
|
|
||||||
if (ret == GST_FLOW_UNEXPECTED && demux->src) {
|
if (ret == GST_FLOW_UNEXPECTED && demux->src) {
|
||||||
guint i;
|
guint i;
|
||||||
|
GstMXFDemuxPad *p = NULL;
|
||||||
|
|
||||||
for (i = 0; i < demux->src->len; i++) {
|
for (i = 0; i < demux->essence_tracks->len; i++) {
|
||||||
GstMXFDemuxPad *p = g_ptr_array_index (demux->src, i);
|
GstMXFDemuxEssenceTrack *t =
|
||||||
|
&g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
|
||||||
|
|
||||||
if (!p->eos) {
|
if (t->position != -1)
|
||||||
|
t->duration = t->position;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((p = gst_mxf_demux_get_earliest_pad (demux))) {
|
||||||
guint64 offset;
|
guint64 offset;
|
||||||
gint64 position;
|
gint64 position;
|
||||||
|
|
||||||
@ -2343,7 +2362,6 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux)
|
|||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||||
goto beach;
|
goto beach;
|
||||||
@ -2354,21 +2372,15 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux)
|
|||||||
if (ret == GST_FLOW_OK && demux->src && demux->essence_tracks) {
|
if (ret == GST_FLOW_OK && demux->src && demux->essence_tracks) {
|
||||||
guint i;
|
guint i;
|
||||||
GstMXFDemuxPad *earliest = NULL;
|
GstMXFDemuxPad *earliest = NULL;
|
||||||
GstClockTime earliest_last_stop = demux->segment.last_stop;
|
|
||||||
guint64 offset;
|
guint64 offset;
|
||||||
gint64 position;
|
gint64 position;
|
||||||
|
|
||||||
for (i = 0; i < demux->src->len; i++) {
|
earliest = gst_mxf_demux_get_earliest_pad (demux);
|
||||||
GstMXFDemuxPad *p = g_ptr_array_index (demux->src, i);
|
if (!earliest)
|
||||||
|
goto beach;
|
||||||
if (!p->eos && p->last_stop < earliest_last_stop) {
|
|
||||||
earliest = p;
|
|
||||||
earliest_last_stop = p->last_stop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We allow time drifts of at most 500ms */
|
/* We allow time drifts of at most 500ms */
|
||||||
if (demux->segment.last_stop - earliest_last_stop <= 500 * GST_MSECOND)
|
if (demux->segment.last_stop - earliest->last_stop <= 500 * GST_MSECOND)
|
||||||
goto beach;
|
goto beach;
|
||||||
|
|
||||||
GST_WARNING_OBJECT (demux,
|
GST_WARNING_OBJECT (demux,
|
||||||
@ -2533,6 +2545,14 @@ gst_mxf_demux_chain (GstPad * pad, GstBuffer * inbuf)
|
|||||||
GST_LOG_OBJECT (demux, "received buffer of %u bytes at offset %"
|
GST_LOG_OBJECT (demux, "received buffer of %u bytes at offset %"
|
||||||
G_GUINT64_FORMAT, GST_BUFFER_SIZE (inbuf), GST_BUFFER_OFFSET (inbuf));
|
G_GUINT64_FORMAT, GST_BUFFER_SIZE (inbuf), GST_BUFFER_OFFSET (inbuf));
|
||||||
|
|
||||||
|
if (demux->src) {
|
||||||
|
if (!gst_mxf_demux_get_earliest_pad (demux)) {
|
||||||
|
ret = GST_FLOW_UNEXPECTED;
|
||||||
|
GST_DEBUG_OBJECT (demux, "All tracks are EOS");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (G_UNLIKELY (GST_BUFFER_OFFSET (inbuf) == 0)) {
|
if (G_UNLIKELY (GST_BUFFER_OFFSET (inbuf) == 0)) {
|
||||||
GST_DEBUG_OBJECT (demux, "beginning of file, expect header");
|
GST_DEBUG_OBJECT (demux, "beginning of file, expect header");
|
||||||
demux->run_in = -1;
|
demux->run_in = -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user