* forever */
GST_PAD_STREAM_LOCK (demux->sinkpad);
- /* we now can stop flushing, since we have the stream lock now */
- fevent = gst_event_new_flush_stop (TRUE);
- gst_event_set_seqnum (fevent, seqnum);
- gst_pad_push_event (demux->sinkpad, gst_event_ref (fevent));
-
- if (G_LIKELY (flush))
+ if (G_LIKELY (flush)) {
+ /* we now can stop flushing, since we have the stream lock now */
+ fevent = gst_event_new_flush_stop (TRUE);
+ gst_event_set_seqnum (fevent, seqnum);
+ gst_pad_push_event (demux->sinkpad, gst_event_ref (fevent));
gst_asf_demux_send_event_unlocked (demux, fevent);
- else
- gst_event_unref (fevent);
+ }
/* operating on copy of segment until we know the seek worked */
segment = demux->segment;
- if (G_UNLIKELY (demux->segment_running && !flush)) {
- GstSegment newsegment;
- GstEvent *newseg;
-
- /* create the segment event to close the current segment */
- gst_segment_copy_into (&segment, &newsegment);
- newseg = gst_event_new_segment (&newsegment);
- gst_event_set_seqnum (newseg, seqnum);
-
- gst_asf_demux_send_event_unlocked (demux, newseg);
- }
-
gst_segment_do_seek (&segment, rate, format, flags, cur_type,
cur, stop_type, stop, &only_need_update);
{
GstClockTime preroll_time;
guint i, num_no_data = 0;
+ AsfStreamType prerolled_types = 0, all_types = 0;
/* Allow at least 500ms of preroll_time */
preroll_time = MAX (demux->preroll, 500 * GST_MSECOND);
gint last_idx;
stream = &demux->stream[i];
+
+ all_types |= stream->type;
+
if (G_UNLIKELY (stream->payloads->len == 0)) {
++num_no_data;
GST_LOG_OBJECT (stream->pad, "no data queued");
continue;
}
+ prerolled_types |= stream->type;
+
/* find last payload with timestamp */
for (last_idx = stream->payloads->len - 1;
last_idx >= 0 && (last_payload == NULL
}
}
+ GST_LOG_OBJECT (demux, "all_types:%d prerolled_types:%d",
+ all_types, prerolled_types);
+
+ /* If streams of each present type have prerolled, we are good to go */
+ if (all_types != 0 && prerolled_types == all_types)
+ return TRUE;
+
if (G_UNLIKELY (num_no_data > 0))
return FALSE;
}
static gboolean
-gst_asf_demux_check_first_ts (GstASFDemux * demux, gboolean force)
+gst_asf_demux_get_first_ts (GstASFDemux * demux)
{
if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (demux->first_ts))) {
GstClockTime first_ts = GST_CLOCK_TIME_NONE;
from it. I havent found a better way to distinguish between these two, except to set an arbitrary boundary
and disregard the first 0 timestamp if the second timestamp is bigger than the boundary) */
- if (stream_min_ts == 0 && stream_min_ts2 == GST_CLOCK_TIME_NONE && !force) /* still waiting for the second timestamp */
- return FALSE;
+ GST_DEBUG_OBJECT (demux,
+ "stream #%u stream_min_ts %" GST_TIME_FORMAT " stream_min_ts2 %"
+ GST_TIME_FORMAT, stream->id, GST_TIME_ARGS (stream_min_ts),
+ GST_TIME_ARGS (stream_min_ts2));
if (stream_min_ts == 0 && stream_min_ts2 > GST_SECOND) /* first timestamp is 0 and second is significantly larger, disregard the 0 */
stream_min_ts = stream_min_ts2;
- /* if we don't have timestamp for this stream, wait for more data */
- if (!GST_CLOCK_TIME_IS_VALID (stream_min_ts) && !force)
- return FALSE;
-
if (GST_CLOCK_TIME_IS_VALID (stream_min_ts) &&
(!GST_CLOCK_TIME_IS_VALID (first_ts) || first_ts > stream_min_ts))
first_ts = stream_min_ts;
}
- if (!GST_CLOCK_TIME_IS_VALID (first_ts)) /* can happen with force = TRUE */
+ if (!GST_CLOCK_TIME_IS_VALID (first_ts)) /* can happen */
first_ts = 0;
demux->first_ts = first_ts;
if (demux->activated_streams)
return TRUE;
- if (G_UNLIKELY (!gst_asf_demux_check_first_ts (demux, force)))
- return FALSE;
-
if (!all_streams_prerolled (demux) && !force) {
GST_DEBUG_OBJECT (demux, "not all streams with data beyond preroll yet");
return FALSE;
}
+ if (G_UNLIKELY (!gst_asf_demux_get_first_ts (demux)))
+ return FALSE;
+
for (i = 0; i < demux->num_streams; ++i) {
AsfStream *stream = &demux->stream[i];
if (G_UNLIKELY (GST_CLOCK_TIME_IS_VALID (payload->ts) &&
(payload->ts < demux->segment.start))) {
- if (G_UNLIKELY ((!demux->keyunit_sync) && (!demux->accurate)
+ if (G_UNLIKELY ((demux->keyunit_sync) && (!demux->accurate)
&& payload->keyframe)) {
GST_DEBUG_OBJECT (stream->pad,
"Found keyframe, updating segment start to %" GST_TIME_FORMAT,
}
/* FIXME : only if ACCURATE ! */
- if (G_LIKELY (!demux->keyunit_sync && !demux->accurate
+ if (G_LIKELY (demux->keyunit_sync && !demux->accurate
&& (GST_CLOCK_TIME_IS_VALID (payload->ts)))
&& !GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) {
GST_DEBUG ("Adjusting newsegment start to %" GST_TIME_FORMAT,
streamheader = gst_buffer_ref (buf);
gst_asf_demux_add_stream_headers_to_caps (demux, buf, caps_s);
gst_structure_remove_field (caps_s, "codec_data");
+ gst_structure_set (caps_s, "stream-format", G_TYPE_STRING,
+ "byte-stream", NULL);
+ } else {
+ gst_structure_set (caps_s, "stream-format", G_TYPE_STRING, "avc",
+ NULL);
}
gst_buffer_unmap (buf, &mapinfo);
}
+ } else {
+ gst_structure_set (caps_s, "stream-format", G_TYPE_STRING, "byte-stream",
+ NULL);
}
}
break;
}
- if (stream)
+ if (stream) {
stream->inspect_payload = inspect_payload;
+ stream->type = stream_type;
+ }
return stream;
not_enough_data:
switch (obj.id) {
case ASF_OBJ_STREAM:
gst_asf_demux_parse_stream_object (demux, *p_data, obj_data_size);
-#ifdef TIZEN_FEATURE_ASFDEMUX_MODIFICATION
+#ifdef TIZEN_FEATURE_ASFDEMUX_DISABLE_UNSUPPORTED_FORMAT
if (demux->is_supported_format == FALSE) {
ret = GST_FLOW_NOT_SUPPORTED;
break;