+
+static
+void bt_ctf_clock_value_destroy(struct bt_object *obj)
+{
+ struct bt_ctf_clock_value *value;
+
+ if (!obj) {
+ return;
+ }
+
+ value = container_of(obj, struct bt_ctf_clock_value, base);
+ bt_put(value->clock_class);
+ g_free(value);
+}
+
+struct bt_ctf_clock_value *bt_ctf_clock_value_create(
+ struct bt_ctf_clock *clock, uint64_t value)
+{
+ struct bt_ctf_clock_value *ret = NULL;
+
+ if (!clock) {
+ goto end;
+ }
+
+ ret = g_new0(struct bt_ctf_clock_value, 1);
+ if (!ret) {
+ goto end;
+ }
+
+ bt_object_init(ret, bt_ctf_clock_value_destroy);
+ ret->clock_class = bt_get(clock);
+ ret->value = value;
+end:
+ return ret;
+}
+
+int bt_ctf_clock_value_get_value(
+ struct bt_ctf_clock_value *clock_value, uint64_t *raw_value)
+{
+ int ret = 0;
+
+ if (!clock_value || !raw_value) {
+ ret = -1;
+ goto end;
+ }
+
+ *raw_value = clock_value->value;
+end:
+ return ret;
+}
+
+int bt_ctf_clock_value_get_value_ns_from_epoch(struct bt_ctf_clock_value *value,
+ int64_t *ret_value_ns)
+{
+ int ret = 0;
+ int64_t ns;
+
+ if (!value || !ret_value_ns) {
+ ret = -1;
+ goto end;
+ }
+
+ /* Initialize nanosecond timestamp to clock's offset in seconds. */
+ ns = value->clock_class->offset_s * 1000000000;
+
+ /* Add offset in cycles, converted to nanoseconds. */
+ ns += ns_from_value(value->clock_class->frequency,
+ value->clock_class->offset);
+
+ /* Add given value, converter to nanoseconds. */
+ ns += ns_from_value(value->clock_class->frequency, value->value);
+
+ *ret_value_ns = ns;
+end:
+ return ret;
+}