GstPromise

The GstPromise object implements the container for values that may be available later. i.e. a Future or a Promise in https://en.wikipedia.org/wiki/Futures_and_promises.

As with all Future/Promise-like functionality, there is the concept of the producer of the value and the consumer of the value.

A GstPromise is created with gst_promise_new by the consumer and passed to the producer to avoid thread safety issues with the change callback.

A GstPromise can be replied to with a value (or an error) by the producer with gst_promise_reply. The exact value returned is defined by the API contract of the producer and NULL may be a valid reply.

gst_promise_interrupt is for the consumer to indicate to the producer that the value is not needed anymore and producing that value can stop.

The GST_PROMISE_RESULT_EXPIRED state set by a call to gst_promise_expire indicates to the consumer that a value will never be produced and is intended to be called by a third party that implements some notion of message handling such as GstBus.

A callback can also be installed at GstPromise creation for result changes with gst_promise_new_with_change_func. The change callback can be used to chain GstPromise’s together as in the following example.

const GstStructure *reply;
GstPromise *p;
if (gst_promise_wait (promise) != GST_PROMISE_RESULT_REPLIED)
    return; // interrupted or expired value
reply = gst_promise_get_reply (promise);
if (error in reply)
    return; // propagate error
p = gst_promise_new_with_change_func (another_promise_change_func, user_data, notify);
//pass p to promise-using API

Each GstPromise starts out with a GstPromiseResult of GST_PROMISE_RESULT_PENDING and only ever transitions once into one of the other GstPromiseResult’s.

In order to support multi-threaded code, gst_promise_reply, gst_promise_interrupt and gst_promise_expire may all be from different threads with some restrictions and the final result of the promise is whichever call is made first. There are two restrictions on ordering:

That gst_promise_reply and gst_promise_interrupt cannot be called after gst_promise_expire That gst_promise_reply and gst_promise_interrupt cannot be called twice.

The change function set with gst_promise_new_with_change_func is called directly from either the gst_promise_reply, gst_promise_interrupt or gst_promise_expire and can be called from an arbitrary thread. GstPromise using APIs can restrict this to a single thread or a subset of threads but that is entirely up to the API that uses GstPromise.