int id;
GstPad *pad;
GstFlowReturn last_flow;
+ gboolean discont;
int timescale;
int sample_index;
rmdemux->adapter = gst_adapter_new ();
rmdemux->first_ts = GST_CLOCK_TIME_NONE;
+ rmdemux->base_ts = GST_CLOCK_TIME_NONE;
rmdemux->need_newsegment = TRUE;
}
break;
}
}
+ stream->discont = TRUE;
}
return ret;
}
gst_segment_init (&rmdemux->segment, GST_FORMAT_UNDEFINED);
rmdemux->first_ts = GST_CLOCK_TIME_NONE;
+ rmdemux->base_ts = GST_CLOCK_TIME_NONE;
rmdemux->need_newsegment = TRUE;
}
GstRMDemux *rmdemux = GST_RMDEMUX (GST_PAD_PARENT (pad));
+ if (rmdemux->base_ts == -1) {
+ rmdemux->base_ts = GST_BUFFER_TIMESTAMP (buffer);
+ GST_LOG_OBJECT (rmdemux, "base_ts %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (rmdemux->base_ts));
+ }
+
gst_adapter_push (rmdemux->adapter, buffer);
GST_LOG_OBJECT (rmdemux, "Chaining buffer of size %d",
stream->last_ts = -1;
stream->next_ts = -1;
stream->last_flow = GST_FLOW_OK;
+ stream->discont = TRUE;
stream->adapter = gst_adapter_new ();
GST_LOG_OBJECT (rmdemux, "stream_number=%d", stream->id);
GstBuffer *subbuf;
subbuf = gst_buffer_create_sub (outbuf, p * packet_size, packet_size);
+
+ GST_LOG_OBJECT (rmdemux, "pushing buffer timestamp %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (subbuf)));
+
+ if (stream->discont) {
+ GST_BUFFER_FLAG_SET (subbuf, GST_BUFFER_FLAG_DISCONT);
+ stream->discont = FALSE;
+ }
+
gst_buffer_set_caps (subbuf, GST_PAD_CAPS (stream->pad));
ret = gst_pad_push (stream->pad, subbuf);
if (ret != GST_FLOW_OK)
g_ptr_array_set_size (stream->subpackets, 0);
buf = gst_rm_utils_descramble_dnet_buffer (buf);
+
+ if (stream->discont) {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ stream->discont = FALSE;
+ }
return gst_pad_push (stream->pad, buf);
}
timestamp =
gst_rmdemux_fix_timestamp (rmdemux, stream, outdata, timestamp);
- if (timestamp > rmdemux->first_ts)
+ if (rmdemux->first_ts != -1 && timestamp > rmdemux->first_ts)
timestamp -= rmdemux->first_ts;
else
timestamp = 0;
+ if (rmdemux->base_ts != -1)
+ timestamp += rmdemux->base_ts;
+
GST_BUFFER_TIMESTAMP (out) = timestamp;
+ GST_LOG_OBJECT (rmdemux, "pushing timestamp %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+
+ if (stream->discont) {
+ GST_BUFFER_FLAG_SET (out, GST_BUFFER_FLAG_DISCONT);
+ stream->discont = FALSE;
+ }
+
ret = gst_pad_push (stream->pad, out);
ret = gst_rmdemux_combine_flows (rmdemux, stream, ret);
if (ret != GST_FLOW_OK)
memcpy (GST_BUFFER_DATA (buffer), (guint8 *) data, size);
- if (timestamp > rmdemux->first_ts)
+ if (rmdemux->first_ts != -1 && timestamp > rmdemux->first_ts)
timestamp -= rmdemux->first_ts;
else
timestamp = 0;
+ if (rmdemux->base_ts != -1)
+ timestamp += rmdemux->base_ts;
+
GST_BUFFER_TIMESTAMP (buffer) = timestamp;
if (stream->needs_descrambling) {
+ GST_LOG_OBJECT (rmdemux, "descramble timestamp %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
ret = gst_rmdemux_handle_scrambled_packet (rmdemux, stream, buffer, key);
} else {
- GST_LOG_OBJECT (rmdemux, "Pushing buffer of size %d to pad %s",
- GST_BUFFER_SIZE (buffer), GST_PAD_NAME (stream->pad));
-
+ GST_LOG_OBJECT (rmdemux,
+ "Pushing buffer of size %d, timestamp %" GST_TIME_FORMAT "to pad %s",
+ GST_BUFFER_SIZE (buffer), GST_TIME_ARGS (timestamp),
+ GST_PAD_NAME (stream->pad));
+
+ if (stream->discont) {
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ stream->discont = FALSE;
+ }
ret = gst_pad_push (stream->pad, buffer);
}
return ret;