+ /*
+ * If the packet is empty (contains only headers or is of size 0), the
+ * caller has to know that we can't read the current event and we need
+ * to do a bt_iter_next.
+ */
+ if (file_stream->pos.data_offset == file_stream->pos.content_size
+ || file_stream->pos.content_size == 0) {
+ /* More events may come. */
+ ret = NULL;
+ if (flags)
+ *flags |= BT_ITER_FLAG_RETRY;
+ goto end;
+ }
+
+ stream = &file_stream->parent;
+ if (iter->parent.end_pos &&
+ iter->parent.end_pos->type == BT_SEEK_TIME &&
+ stream->real_timestamp > iter->parent.end_pos->u.seek_time) {
+ goto stop;
+ }
+ ret->parent = g_ptr_array_index(stream->events_by_id,
+ stream->event_id);
+
+ if (!file_stream->pos.packet_index)
+ packet_index = NULL;
+ else
+ packet_index = &g_array_index(file_stream->pos.packet_index,
+ struct packet_index, file_stream->pos.cur_index);
+ iter->events_lost = 0;
+ if (packet_index && packet_index->events_discarded >
+ file_stream->pos.last_events_discarded) {
+ if (flags)
+ *flags |= BT_ITER_FLAG_LOST_EVENTS;
+ iter->events_lost += packet_index->events_discarded -
+ file_stream->pos.last_events_discarded;
+ file_stream->pos.last_events_discarded =
+ packet_index->events_discarded;
+ }
+
+ if (ret->parent->stream->stream_id > iter->callbacks->len)