Update offset in push mode and handle events properly

This commit is contained in:
Sebastian Dröge 2009-02-01 16:58:01 +01:00
parent 58a3220dde
commit 43ade6cf71

View file

@ -123,22 +123,6 @@ static gboolean gst_mxf_demux_src_query (GstPad * pad, GstQuery * query);
GST_BOILERPLATE (GstMXFDemux, gst_mxf_demux, GstElement, GST_TYPE_ELEMENT); GST_BOILERPLATE (GstMXFDemux, gst_mxf_demux, GstElement, GST_TYPE_ELEMENT);
static void
gst_mxf_demux_flush (GstMXFDemux * demux, gboolean discont)
{
GST_DEBUG_OBJECT (demux, "flushing queued data in the MXF demuxer");
gst_adapter_clear (demux->adapter);
demux->flushing = FALSE;
/* Only in push mode */
if (!demux->random_access) {
/* We reset the offset and will get one from first push */
demux->offset = -1;
}
}
static void static void
gst_mxf_demux_remove_pad (GstMXFDemuxPad * pad, GstMXFDemux * demux) gst_mxf_demux_remove_pad (GstMXFDemuxPad * pad, GstMXFDemux * demux)
{ {
@ -655,11 +639,11 @@ gst_mxf_demux_choose_package (GstMXFDemux * demux)
for (i = 0; i < demux->preface->content_storage->n_packages; i++) { for (i = 0; i < demux->preface->content_storage->n_packages; i++) {
if (demux->preface->content_storage->packages[i] && if (demux->preface->content_storage->packages[i] &&
MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface-> MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface->content_storage->
content_storage->packages[i])) { packages[i])) {
ret = ret =
MXF_METADATA_GENERIC_PACKAGE (demux->preface-> MXF_METADATA_GENERIC_PACKAGE (demux->preface->content_storage->
content_storage->packages[i]); packages[i]);
break; break;
} }
} }
@ -1304,8 +1288,8 @@ gst_mxf_demux_pad_set_component (GstMXFDemux * demux, GstMXFDemuxPad * pad,
pad->current_component_index); pad->current_component_index);
pad->current_component = pad->current_component =
MXF_METADATA_SOURCE_CLIP (sequence-> MXF_METADATA_SOURCE_CLIP (sequence->structural_components[pad->
structural_components[pad->current_component_index]); current_component_index]);
if (pad->current_component == NULL) { if (pad->current_component == NULL) {
GST_ERROR_OBJECT (demux, "No such structural component"); GST_ERROR_OBJECT (demux, "No such structural component");
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
@ -1313,8 +1297,8 @@ gst_mxf_demux_pad_set_component (GstMXFDemux * demux, GstMXFDemuxPad * pad,
if (!pad->current_component->source_package if (!pad->current_component->source_package
|| !pad->current_component->source_package->top_level || !pad->current_component->source_package->top_level
|| !MXF_METADATA_GENERIC_PACKAGE (pad-> || !MXF_METADATA_GENERIC_PACKAGE (pad->current_component->
current_component->source_package)->tracks) { source_package)->tracks) {
GST_ERROR_OBJECT (demux, "Invalid component"); GST_ERROR_OBJECT (demux, "Invalid component");
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
@ -2650,11 +2634,13 @@ gst_mxf_demux_chain (GstPad * pad, GstBuffer * inbuf)
break; break;
} }
gst_adapter_flush (demux->adapter, 1); gst_adapter_flush (demux->adapter, 1);
demux->offset++;
} }
} else if (demux->offset < demux->run_in) { } else if (demux->offset < demux->run_in) {
gst_adapter_flush (demux->adapter, guint64 flush = MIN (gst_adapter_available (demux->adapter),
MIN (gst_adapter_available (demux->adapter), demux->run_in - demux->offset);
demux->run_in - demux->offset)); gst_adapter_flush (demux->adapter, flush);
demux->offset += flush;
continue; continue;
} }
@ -2726,10 +2712,15 @@ gst_mxf_demux_chain (GstPad * pad, GstBuffer * inbuf)
break; break;
gst_adapter_flush (demux->adapter, offset); gst_adapter_flush (demux->adapter, offset);
buffer = gst_adapter_take_buffer (demux->adapter, length);
ret = gst_mxf_demux_handle_klv_packet (demux, &key, buffer, FALSE); if (length > 0) {
gst_buffer_unref (buffer); buffer = gst_adapter_take_buffer (demux->adapter, length);
ret = gst_mxf_demux_handle_klv_packet (demux, &key, buffer, FALSE);
gst_buffer_unref (buffer);
}
demux->offset += offset + length;
} }
gst_object_unref (demux); gst_object_unref (demux);
@ -2768,8 +2759,8 @@ gst_mxf_demux_pad_set_position (GstMXFDemux * demux, GstMXFDemuxPad * p,
for (i = 0; i < p->material_track->parent.sequence->n_structural_components; for (i = 0; i < p->material_track->parent.sequence->n_structural_components;
i++) { i++) {
clip = clip =
MXF_METADATA_SOURCE_CLIP (p->material_track->parent. MXF_METADATA_SOURCE_CLIP (p->material_track->parent.sequence->
sequence->structural_components[i]); structural_components[i]);
sum += sum +=
gst_util_uint64_scale (clip->parent.duration, gst_util_uint64_scale (clip->parent.duration,
@ -3148,7 +3139,11 @@ gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event)
ret = gst_mxf_demux_push_src_event (demux, event); ret = gst_mxf_demux_push_src_event (demux, event);
break; break;
case GST_EVENT_FLUSH_STOP: case GST_EVENT_FLUSH_STOP:
gst_mxf_demux_flush (demux, TRUE); GST_DEBUG_OBJECT (demux, "flushing queued data in the MXF demuxer");
gst_adapter_clear (demux->adapter);
demux->flushing = FALSE;
demux->offset = 0;
ret = gst_mxf_demux_push_src_event (demux, event); ret = gst_mxf_demux_push_src_event (demux, event);
break; break;
case GST_EVENT_EOS: case GST_EVENT_EOS:
@ -3156,11 +3151,21 @@ gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event)
GST_WARNING_OBJECT (pad, "failed pushing EOS on streams"); GST_WARNING_OBJECT (pad, "failed pushing EOS on streams");
ret = TRUE; ret = TRUE;
break; break;
case GST_EVENT_NEWSEGMENT: case GST_EVENT_NEWSEGMENT:{
/* TODO: handle this */ guint i;
if (demux->essence_tracks) {
for (i = 0; i < demux->essence_tracks->len; i++) {
GstMXFDemuxEssenceTrack *t =
&g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack,
i);
t->position = -1;
}
}
gst_event_unref (event); gst_event_unref (event);
ret = FALSE; ret = TRUE;
break; break;
}
default: default:
ret = gst_mxf_demux_push_src_event (demux, event); ret = gst_mxf_demux_push_src_event (demux, event);
break; break;