+ for (i = 0; i < stream->events->len; i++) {
+ struct bt_event *event = g_ptr_array_index(stream->events, i);
+
+ assert(event);
+ ret = visit_event_update_clock_value(event, &cur_clock_value);
+ if (ret) {
+ BT_LOGW("Cannot automatically update clock value "
+ "in stream's packet context: "
+ "stream-addr=%p, stream-name=\"%s\", "
+ "index=%" PRIu64 ", event-addr=%p, "
+ "event-class-id=%" PRId64 ", "
+ "event-class-name=\"%s\"",
+ stream, bt_stream_get_name(stream),
+ i, event,
+ bt_event_class_get_id(event->event_class),
+ bt_event_class_get_name(event->event_class));
+ goto end;
+ }
+ }
+
+ /*
+ * Everything is visited, thus the current clock value
+ * corresponds to the ending timestamp. Validate this value
+ * against the provided value of `timestamp_end`, if any,
+ * otherwise set it.
+ */
+ if (ts_end_field && bt_field_is_set(ts_end_field)) {
+ ret = bt_field_unsigned_integer_get_value(ts_end_field, &val);
+ assert(ret == 0);
+
+ if (val < cur_clock_value) {
+ BT_LOGW("Packet's final timestamp is less than "
+ "computed packet's final timestamp: "
+ "stream-addr=%p, stream-name=\"%s\", "
+ "cur-packet-ts-end=%" PRIu64 ", "
+ "computed-packet-ts-end=%" PRIu64,
+ stream, bt_stream_get_name(stream),
+ val, cur_clock_value);
+ ret = -1;
+ goto end;
+ }
+
+ stream->last_ts_end = val;
+ }
+
+ if (ts_end_field && !bt_field_is_set(ts_end_field)) {
+ ret = set_integer_field_value(ts_end_field, cur_clock_value);
+ assert(ret == 0);
+ stream->last_ts_end = cur_clock_value;
+ }
+
+ if (!ts_end_field) {
+ stream->last_ts_end = cur_clock_value;
+ }
+
+ /* Set `timestamp_begin` field to initial clock value */
+ if (ts_begin_field && !bt_field_is_set(ts_begin_field)) {
+ ret = set_integer_field_value(ts_begin_field, init_clock_value);
+ assert(ret == 0);
+ }