blob: 34ebc1398db31e8234570f6c9f7a507389bf7de9 [file] [log] [blame]
Name
KHR_stream
KHR_stream_attrib
Name Strings
EGL_KHR_stream
EGL_KHR_stream_attrib
Contributors
Marcus Lorentzon
Acorn Pooley
Robert Palmer
Greg Prisament
Daniel Kartch
Miguel A. Vico Moya
Contacts
Acorn Pooley, NVIDIA (apooley 'at' nvidia.com)
Marcus Lorentzon, ST-Ericsson AB (marcus.xm.lorentzon 'at' stericsson.com)
Daniel Kartch, NVIDIA (dkartch 'at' nvidia.com)
Notice
Copyright (c) 2009-2016 The Khronos Group Inc. Copyright terms at
http://www.khronos.org/registry/speccopyright.html
Status
Complete.
Approved by the Khronos Board of Promoters on December 2, 2011.
Version
Version 27 - May 23, 2016
Number
EGL Extension #32
Dependencies
EGL_KHR_stream requires EGL 1.2.
EGL_KHR_stream_attrib requires EGL_KHR_stream and EGL 1.5.
EGL_KHR_stream_attrib interacts with
EGL_KHR_stream_consumer_gltexture.
This extension is written based on the wording of the EGL 1.2
specification.
Overview
This extension defines a new object, the EGLStream, that can be
used to efficiently transfer a sequence of image frames from one
API to another. The EGLStream has mechanisms that can help keep
audio data synchronized to video data.
Each EGLStream is associated with a "producer" that generates
image frames and inserts them into the EGLStream. The producer is
responsible for inserting each image frame into the EGLStream at
the correct time so that the consumer can display the image frame
for the appropriate period of time.
Each EGLStream is also associated with a "consumer" that
retrieves image frames from the EGLStream. The consumer is
responsible for noticing that an image frame is available and
displaying it (or otherwise consuming it). The consumer is also
responsible for indicating the latency when that is possible (the
latency is the time that elapses between the time it is retrieved
from the EGLStream until the time it is displayed to the user).
Some APIs are stream oriented (examples: OpenMAX IL, OpenMAX AL).
These APIs may be connected directly to an EGLStream as a producer
or consumer. Once a stream oriented producer is "connected" to an
EGLStream and "started" it may insert image frames into the
EGLStream automatically with no further interaction from the
application. Likewise, once a stream oriented consumer is
"connected" to an EGLStream and "started" it may retrieve image
frames from the EGLStream automatically with no further interaction
from the application.
Some APIs are rendering oriented and require interaction with the
application during the rendering of each frame (examples: OpenGL,
OpenGL ES, OpenVG). These APIs will not automatically insert or
retrieve image frames into/from the EGLStream. Instead the
application must take explicit action to cause a rendering
oriented producer to insert an image frame or to cause a rendering
oriented consumer to retrieve an image frame.
The EGLStream conceptually operates as a mailbox. When the
producer has a new image frame it empties the mailbox (discards
the old contents) and inserts the new image frame into the
mailbox. The consumer retrieves the image frame from the mailbox
and examines it. When the consumer is finished examining the
image frame it is either placed back in the mailbox (if the
mailbox is empty) or discarded (if the mailbox is not empty).
Timing is mainly controlled by the producer. The consumer
operated with a fixed latency that it indicates to the producer
through the EGL_CONSUMER_LATENCY_USEC_KHR attribute. The consumer
is expected to notice when a new image frame is available in the
EGLStream, retrieve it, and display it to the user in the time
indicated by EGL_CONSUMER_LATENCY_USEC_KHR. The producer controls
when the image frame will be displayed by inserting it into the
stream at time
T - EGL_CONSUMER_LATENCY_USEC_KHR
where T is the time that the image frame is intended to appear to
the user.
This extension does not cover the details of how a producer or a
consumer works or is "connected" to an EGLStream. Different kinds
of producers and consumers work differently and are described in
additional extension specifications. (Examples of producer
specifications:
EGL_KHR_stream_producer_eglsurface
EGL_KHR_stream_producer_aldatalocator
OpenMAX_AL_EGLStream_DataLocator
Example of consumer extension specification:
EGL_KHR_stream_consumer_gltexture
)
Glossary
EGLStream
An EGL object that transfers a sequence of image frames from one
API to another (e.g. video frames from OpenMAX AL to OpenGL ES).
Image frame
A single image in a sequence of images. The sequence may be
frames of video data decoded from a video file, images output by a
camera sensor, surfaces rendered using OpenGL ES commands, or
generated in some other manner. An image frame has a period of
time during which it is intended to be displayed on the screen
(starting with the "Image Frame Display Time" and ending with the
"Image Frame Display Time" of the next image frame in the
sequence).
Image Frame Insertion Time
The point in time when the producer inserts the image frame into
the EGLStream. This is the "Image Frame Intended Display Time"
minus the "Consumer Latency".
Image Frame Intended Display Time
The point in time when the user should first see the image frame
on the display screen.
Image Frame Actual Display Time
The point in time when the user actually first sees the image frame
on the display screen.
Consumer Latency
The elapsed time between an image frame's "Image Frame Insertion
Time" and its "Image Frame Actual Display Time". The consumer is
responsible for predicting this and indicating its value to the
EGLStream. The producer is responsible for using this value to
calculate the "Image Frame Insertion Time" for each image frame.
The application has access to this value through the
EGL_CONSUMER_LATENCY_USEC attribute.
Producer
The entity that inserts image frames into the EGLStream. The
producer is responsible for timing: it must insert image frames at
a point in time equal to the "Image Frame Intended Display Time"
minus the "Consumer Latency".
Consumer
The entity that retrieves image frames from the EGLStream. When
the image frames are to be displayed to the user the consumer is
responsible for calculating the "Consumer Latency" and reporting
it to the EGLSteam.
State (stream state)
At any given time an EGLStream is in one of several states. See
section "3.10.4.3 EGL_STREAM_STATE_KHR Attribute" in this
extension for a description of the states and what transitions
occur between them.
New Types
This is the type of a handle that represents an EGLStream object.
typedef void* EGLStreamKHR;
This is a 64 bit unsigned integer.
typedef khronos_uint64_t EGLuint64KHR;
New functions defined by EGL_KHR_stream
EGLStreamKHR eglCreateStreamKHR(
EGLDisplay dpy,
const EGLint *attrib_list);
EGLBoolean eglDestroyStreamKHR(
EGLDisplay dpy,
EGLStreamKHR stream);
EGLBoolean eglStreamAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum attribute,
EGLint value);
EGLBoolean eglQueryStreamKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum attribute,
EGLint *value);
EGLBoolean eglQueryStreamu64KHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum attribute,
EGLuint64KHR *value);
New functions defined by EGL_KHR_stream_attrib
EGLStreamKHR eglCreateStreamAttribKHR(
EGLDisplay dpy,
const EGLAttrib *attrib_list);
EGLBoolean eglSetStreamAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum attribute,
EGLAttrib value);
EGLBoolean eglQueryStreamAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum attribute,
EGLAttrib *value);
EGLBoolean eglStreamConsumerAcquireAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream
const EGLAttrib *attrib_list);
EGLBoolean eglStreamConsumerReleaseAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
const EGLAttrib *attrib_list);
New Tokens
This value is returned from eglCreateStreamKHR in the case of an
error. It is an error to attempt to use this value as a parameter
to any EGL or client API function.
EGL_NO_STREAM_KHR ((EGLStreamKHR)0)
This enum is accepted as an attribute in the <attrib_list> parameter
of eglCreateStreamKHR and as the <attribute> parameter of
eglStreamAttribKHR, eglSetStreamAttribKHR, eglQueryStreamKHR and
eglQueryStreamAttribKHR.
EGL_CONSUMER_LATENCY_USEC_KHR 0x3210
These enums are accepted as the <attribute> parameter of
eglQueryStreamu64KHR.
EGL_PRODUCER_FRAME_KHR 0x3212
EGL_CONSUMER_FRAME_KHR 0x3213
This enum is accepted as the <attribute> parameter of
eglQueryStreamKHR and eglQueryStreamAttribKHR.
EGL_STREAM_STATE_KHR 0x3214
Returned in the <value> parameter of eglQueryStreamKHR or
eglQueryStreamAttribKHR when <attribute> is EGL_STREAM_STATE.
EGL_STREAM_STATE_CREATED_KHR 0x3215
EGL_STREAM_STATE_CONNECTING_KHR 0x3216
EGL_STREAM_STATE_EMPTY_KHR 0x3217
EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218
EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219
EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A
These errors may be generated by EGLStream calls.
EGL_BAD_STREAM_KHR 0x321B
EGL_BAD_STATE_KHR 0x321C
Add a new section "2.5 Streams" after section "2.4 Shared State"
EGL allows efficient interoperation between APIs through the
EGLStream object. An EGLStream represents a sequence of image
frames.
Each EGLStream is associated with a producer that generates image
frames and inserts them into the EGLStream. Each EGLStream is
also associated with a consumer that retrieves image frames from
the EGLStream.
Add a new section "3.10 EGLStreams" after section "3.9 Posting the
Color Buffer"
3.10 EGLStreams
EGL provides functions to create and destroy EGLStreams, for
querying and setting attributes of EGLStreams, and for connecting
EGLStreams to producers and consumers.
Each EGLStream may be connected to only one producer and one
consumer. Once an EGLStream is connected to a consumer, it will
be connected to that consumer until the EGLStream is destroyed.
Likewise, once an EGLStream is connected to a producer it will be
connected to that producer until the EGLStream is destroyed.
Further semantics are described for each type of consumer and
producer that can be connected.
Add subsection 3.10.1 to section "3.10 EGLStreams"
3.10.1 Creating an EGLStream
Call
EGLStreamKHR eglCreateStreamKHR(
EGLDisplay dpy,
const EGLint *attrib_list);
to create a new EGLStream. <dpy> specifies the EGLDisplay used for
this operation. The function returns a handle to the created
EGLStream.
The EGLStream cannot be used until it has been connected to a
consumer and then to a producer (refer to section "3.10.2
Connecting an EGLStream to a consumer" and section "3.10.3
Connecting an EGLStream to a producer"). It must be connected to
a consumer before being connected to a producer.
There is no way for the application to query the size,
colorformat, or number of buffers used in the EGLStream (although
these attributes may be available from the producer's API or the
consumer's API depending on what type of producer/consumer is
connected to the EGLStream).
The parameter <attrib_list> contains a list of attributes and
values to set for the EGLStream. Attributes not in the list are
set to default values. EGLStream attributes are described in
section "3.10.4 EGLStream Attributes".
If an error occurs eglCreateStreamKHR will return
EGL_NO_STREAM_KHR and generate an error.
- EGL_BAD_ATTRIBUTE is generated if any of the parameters in
attrib_list is not a valid EGLStream attribute.
- EGL_BAD_ACCESS is generated if any of the parameters in
attrib_list is read only.
- EGL_BAD_PARAMETER is generated if any of the values in
attrib_list is outside the valid range for the attribute.
- EGL_BAD_ALLOC is generated if not enough resources are
available to create the EGLStream.
- EGL_BAD_DISPLAY is generated if <dpy> is not a valid,
initialized EGLDisplay.
If EGL_KHR_stream_attrib is present, add to the end of this section
Streams may also be created by calling
EGLStreamKHR eglCreateStreamAttribKHR(
EGLDisplay dpy,
const EGLAttrib *attrib_list);
This is equivalent to eglCreateStreamKHR, but allows pointer
and handle attributes to be provided on 64-bit systems.
Add section 3.10.2 to section "3.10 EGLStreams"
3.10.2 Connecting an EGLStream to a consumer.
Before using an EGLStream it must be connected to a consumer.
Refer to sections 3.10.2.1 and following for different ways to
connect a consumer to an EGLStream.
Once an EGLStream is connected to a consumer it will remain
connected to the same consumer until the EGLStream is destroyed.
If the consumer is destroyed then the EGLStream's state will
become EGL_STREAM_STATE_DISCONNECTED_KHR.
Any attempt to connect an EGLStream which is not in state
EGL_STREAM_STATE_CREATED_KHR will fail and generate an
EGL_BAD_STATE_KHR error.
When an EGLStream is connected to a consumer its state becomes
EGL_STREAM_STATE_CONNECTING_KHR.
3.10.2.1 No way to connect consumer to EGLStream
EGL does not currently define any mechanisms to connect a consumer
to an EGLStream. These will be added via additional extensions.
(Example: See extension specification
EGL_KHR_stream_consumer_gltexture)
If EGL_KHR_stream_attrib is present, add to the end of this section
3.10.2.2 Acquiring and releasing consumer frames
Methods for acquiring frames from a stream and releasing them back
to a stream are dependent on the type of consumer. Some consumers
support calling
EGLBoolean eglStreamConsumerAcquireAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream
const EGLAttrib *attrib_list);
to acquire the next available frame in <stream> and
EGLBoolean eglStreamConsumerReleaseAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
const EGLAttrib *attrib_list);
to release a frame back to the stream.
Not all consumers are required to support either or both of these
functions. Where supported, the specific behavior is defined by the
consumer type, and may be affected by the contents of <attrib_list>.
<attrib_list> must either be NULL or a pointer to a list of
name/value pairs terminated by EGL_NONE. Valid attributes are
listed in tables 3.10.2.1 and 3.10.2.2.
Attribute Type Section
------------------------ ---------- -------
Currently no acquire attributes are defined
Table 3.10.2.1 EGLStream Consumer Acquire Attributes
Attribute Type Section
------------------------ ---------- -------
Currently no release attributes are defined
Table 3.10.2.2 EGLStream Consumer Release Attributes
If no new image frame is available in the stream,
eglStreamConsumerAcquireAtrribKHR may block, retrieve an old frame,
or return an error, as defined by the type of consumer. If one or
more image frames are already acquired by the consumer when
eglStreamConsumerAcquireAttribKHR is called, the behavior is
determined by the type of consumer.
If successful, eglStreamConsumerAcquireAttribKHR returns EGL_TRUE
and an image frame from <stream> will be bound into the address
space of the consumer as defined for its type.
On failure, the function returns EGL_FALSE and generates an error.
Additionally, image objects in the consumer's address space may
become invalid, as determined by the consumer type.
- EGL_BAD_ACCESS is generated if the consumer of <stream> does
not support acquiring frames through
eglStreamConsumerAcquireAttribKHR.
- EGL_BAD_STATE_KHR is no frame is available for acquisition
after any timeout determined by the consumer.
- EGL_BAD_ATTRIBUTE is generated if an attribute name in
<attrib_list> is not recognized or is not supported by the
consumer.
- EGL_BAD_STREAM_KHR is generated if <stream> is not a valid
EGLStream created for <dpy>.
- EGL_BAD_DISPLAY is generated if <dpy> is not a valid
EGLDisplay.
- EGL_NOT_INITIALIZED is generated if <dpy> is not initialized.
Calling eglStreamConsumerReleaseAttribKHR will release a frame held
by the consumer back to the stream. If more than one frame is held
by the consumer, the frame returned is determined by the consumer
type and the contents of <attrib_list>. If no frames are currently
held, the behavior is determined by the consumer type. Once
returned, the consumer may no longer access the contents of the
frame, and attempts to do so will result in errors as determined by
the consumer type. Upon success, eglStreamConsumerReleaseAttribKHR
returns EGL_TRUE.
If eglStreamConsumerReleaseAttribKHR fails, EGL_FALSE is returned
and an error is generated.
- EGL_BAD_ACCESS is generated if the consumer of <stream> does
not support releasing frames through
eglStreamConsumerReleaseAttribKHR.
- EGL_BAD_STATE_KHR is generated if <stream> is not in state
EGL_STREAM_STATE_EMPTY_KHR,
EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR or
EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR.
- EGL_BAD_ATTRIBUTE is generated if an attribute name in
<attrib_list> is not recognized or is not supported by the
consumer.
- EGL_BAD_STREAM_KHR is generated if <stream> is not a valid
EGLStream created for <dpy>.
- EGL_BAD_DISPLAY is generated if <dpy> is not a valid
EGLDisplay.
- EGL_NOT_INITIALIZED is generated if <dpy> is not initialized.
If EGL_KHR_stream_consumer_gltexture is present in addition to
EGL_KHR_stream_attrib, the eglStreamConsumerAcquireKHR function is
equivalent to eglStreamConsumerAcquireAttribKHR with <attrib_list> set
to NULL, the eglStreamConsumerReleaseKHR function is equivalent to
eglStreamConsumerReleaseAttribKHR with <attrib_list> set to NULL, and
the definitions provided for those functions define their behavior for
a GL texture consumer.
Add section 3.10.3 to section "3.10 EGLStreams"
3.10.3 Connecting an EGLStream to a producer.
Before using an EGLStream it must be connected to a producer. The
EGLStream must be connected to a consumer before it may be
connected to a producer.
The size and colorformat of the images in the EGLStream are
determined by the EGL implementation based on the requirements of
the producer and the consumer. The EGL implementation may
determine these at the time the producer is connected to the
EGLStream, at the time that the first image frame is inserted into
the EGLStream, or any time in between (this is left up to the
implementation).
It is the responsibility of the producer to convert the images to
a form that the consumer can consume. The producer may negotiate
with the consumer as to what formats and sizes the consumer is
able to consume, but this negotiation (whether it occurs and how
it works) is an implementation detail. If the producer is unable
to convert the images to a form that the consumer can consume then
the attempt to connect the producer to the EGLStream will fail and
generate an EGL_BAD_MATCH error.
Refer to sections 3.10.3.1 and following for different ways to
connect a producer to an EGLStream.
Once an EGLStream is connected to a producer it will remain
connected to the same producer until the EGLStream is destroyed.
If the producer is destroyed then the EGLStream's state will
become EGL_STREAM_STATE_DISCONNECTED_KHR (refer to "3.10.4.3
EGL_STREAM_STATE_KHR Attribute").
Any attempt to connect an EGLStream which is not in state
EGL_STREAM_STATE_CONNECTING_KHR will fail and generate an
EGL_BAD_STATE_KHR error.
When an EGLStream is connected to a producer its state becomes
EGL_STREAM_STATE_EMPTY_KHR. At this point the producer may begin
inserting image frames and the consumer may begin consuming image
frames, so the state may immediately change to
EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR and/or
EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR.
3.10.3.1 No way to connect producer to EGLStream
EGL does not currently define any mechanisms to connect a producer
to an EGLStream. These will be added via additional extensions.
(For example see extension specifications
EGL_KHR_stream_producer_eglsurface
EGL_KHR_stream_producer_aldatalocator
OpenMAX_AL_EGLStream_DataLocator
.)
Add section 3.10.4 to section "3.10 EGLStreams"
3.10.4 EGLStream Attributes
Each EGLStream contains a set of attributes and values as
described in table 3.10.4.4. Each attribute has a type and a
value and is either read-only (ro), read/write (rw) or initialize
only (io - meaning it may be set in the attrib_list but not
changed once the EGLStream is created).
Attribute Read/Write Type Section
-------------------------- ---------- ------ --------
EGL_STREAM_STATE_KHR ro EGLint 3.10.4.3
EGL_PRODUCER_FRAME_KHR ro EGLuint64KHR 3.10.4.4
EGL_CONSUMER_FRAME_KHR ro EGLuint64KHR 3.10.4.5
EGL_CONSUMER_LATENCY_USEC_KHR rw EGLint 3.10.4.6
Table 3.10.4.4 EGLStream Attributes
3.10.4.1 Setting EGLStream Attributes
Call
EGLBoolean eglStreamAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLint attribute,
EGLint value);
to set the value of an attribute for an EGLStream. The <value> is
the new value for <attribute>. Only read/write (rw) attributes
with type EGLint may be set with eglStreamAttribKHR (see "Table
3.10.4.4 EGLStream Attributes").
If an error occurs, EGL_FALSE is returned and an error is
generated.
- EGL_BAD_STATE_KHR is generated if <stream> is in
EGL_STREAM_STATE_DISCONNECTED_KHR state.
- EGL_BAD_ATTRIBUTE is generated if <attribute> is not a valid
EGLStream attribute.
- EGL_BAD_ACCESS is generated if <attribute> is read only.
- EGL_BAD_PARAMETER is generated if value is outside the valid
range for <attribute>.
- EGL_BAD_STREAM_KHR is generated if <stream> is not a valid
EGLStream created for <dpy>.
- EGL_BAD_DISPLAY is generated if <dpy> is not a valid,
initialized EGLDisplay.
3.10.4.2 Querying EGLStream Attributes
Call
EGLBoolean eglQueryStreamKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLint attribute,
EGLint *value);
to query the value of an EGLStream's attribute with type EGLint
and call
EGLBoolean eglQueryStreamu64KHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum attribute,
EGLuint64KHR *value);
to query the value of an EGLStream's attribute with type
EGLuint64KHR.
If an error occurs EGL_FALSE is returned and an error is
generated.
- EGL_BAD_STREAM_KHR is generated if <stream> is not a valid
EGLStream created for <dpy>.
- EGL_BAD_ATTRIBUTE is generated by eglQueryStreamKHR if
<attribute> is not a valid EGLStream attribute with type
EGLint.
- EGL_BAD_ATTRIBUTE is generated by eglQueryStreamu64KHR if
<attribute> is not a valid EGLStream attribute with type
EGLuint64KHR.
3.10.4.3 EGL_STREAM_STATE_KHR Attribute
The EGL_STREAM_STATE_KHR attribute is read only. It indicates the
state of the EGLStream. The EGLStream may be in one of the
following states:
- EGL_STREAM_STATE_CREATED_KHR - The EGLStream has been created
but not yet connected to a producer or a consumer.
- EGL_STREAM_STATE_CONNECTING_KHR - The EGLStream has been
connected to a consumer but not yet connected to a producer.
- EGL_STREAM_STATE_EMPTY_KHR - the EGLStream has been connected
to a consumer and a producer, but the producer has not yet
inserted any image frames.
- EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR - the producer has
inserted at least one image frame that the consumer has not
yet retrieved.
- EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR - the producer has
inserted at least one image frame, and the consumer has
already retrieved the most recently inserted image frame.
- EGL_STREAM_STATE_DISCONNECTED_KHR - either the producer or the
consumer (or both) are no longer connected to the EGLStream
(e.g. because they have been destroyed). Once the
EGLStream is in this state it will remain in this state
until the EGLStream is destroyed. In this state only
eglQueryStreamKHR and eglDestroyStreamKHR are valid
operations.
Only the following state transitions may occur:
-> EGL_STREAM_STATE_CREATED_KHR
A new EGLStream is created in this state.
EGL_STREAM_STATE_CREATED_KHR ->
EGL_STREAM_STATE_CONNECTING_KHR
Occurs when a consumer is connected to the EGLStream.
EGL_STREAM_STATE_CONNECTING_KHR ->
EGL_STREAM_STATE_EMPTY_KHR
Occurs when a producer is connected to the EGLStream.
EGL_STREAM_STATE_EMPTY_KHR ->
EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR
Occurs the first time the producer inserts an image frame.
EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR ->
EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR
Occurs when the consumer begins examining a newly inserted
image frame.
EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR ->
EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR
Occurs when the producer inserts a new image frame.
* ->
EGL_STREAM_STATE_DISCONNECTED_KHR
Occurs when the producer or consumer is destroyed or is
otherwise unable to function normally.
3.10.4.4 EGL_PRODUCER_FRAME_KHR Attribute
The EGL_PRODUCER_FRAME_KHR attribute indicates how many image
frames have been inserted into the EGLStream by the producer.
This is also known as the "frame number" of the most recently
inserted frame (where the first frame inserted has a frame number
of 1). When EGL_STREAM_STATE_KHR is EGL_STREAM_STATE_CREATED_KHR,
EGL_STREAM_STATE_CONNECTING_KHR, or EGL_STREAM_STATE_EMPTY_KHR
then this value is 0. This value will wrap back to 0 after
about 10 million millennia.
3.10.4.4 EGL_CONSUMER_FRAME_KHR Attribute
The EGL_CONSUMER_FRAME_KHR attribute indicates the frame number of
the image frame that the consumer most recently retrieved. This is
the value that EGL_PRODUCER_FRAME_KHR contained just after this
image frame was inserted into the EGLStream.
3.10.4.5 EGL_CONSUMER_LATENCY_USEC_KHR Attribute
This attribute indicates the number of microseconds that elapse (on
average) from the time that an image frame is inserted into the
EGLStream by the producer until the image frame is visible to the
user.
It is the responsibility of the consumer to set this value. Some
types of consumers may simply set this value to zero or an
implementation constant value. Other consumers may adjust this
value dynamically as conditions change.
It is the responsibility of the producer to use this information to
insert image frames into the EGLStream at an appropriate time.
The producer should insert each image frame into the stream at the
time that frame should appear to the user MINUS the
EGL_CONSUMER_LATENCY_USEC_KHR value. Some types of producers may
ignore this value.
The application may modify this value to adjust the timing of the
stream (e.g. to make video frames coincide with an audio track
under direction from a user). However the value set by the
application may be overridden by some consumers that dynamically
adjust the value. This will be noted in the description of
consumers which do this.
If EGL_KHR_stream_attrib is present, add to the end of section "3.10.4.1
Setting EGLStream Attributes"
Attributes may also be set by calling
EGLBoolean eglSetStreamAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum attribute,
EGLAttrib value);
This is equivalent to eglStreamAttribKHR, but allows attributes
with pointer and handle types, in addition to EGLint.
If EGL_KHR_stream_attrib is present, add to the end of section "3.10.4.2
Querying EGLStream Attributes"
Attributes may also be queried by calling
EGLBoolean eglQueryStreamAttribKHR(
EGLDisplay dpy,
EGLStreamKHR stream,
EGLenum attribute,
EGLAttrib *value);
This is equivalent to eglQueryStreamKHR, but allows attributes with
pointer and handle types, in addition to EGLint.
Add sections 3.10.5 and 3.10.6 to section "3.10 EGLStreams"
3.10.5 EGLStream operation
3.10.5.1 EGLStream operation in mailbox mode
The EGLStream conceptually operates as a mailbox.
When the producer has a new image frame it empties the mailbox and
inserts the new image frame into the mailbox. If the image frame
is intended to be displayed at time T then the producer must
insert it into the EGLStream at time
T - EGL_CONSUMER_LATENCY_USEC_KHR
The consumer retrieves the image frame from the mailbox and
examines it. When the consumer is finished examining the image
frame it is either placed back in the mailbox (if the mailbox is
empty) or discarded (if the mailbox is not empty).
This operation implies 2 things:
- If the consumer consumes frames slower than the producer
inserts frames, then some frames may be lost (never seen by
the consumer).
- If the consumer consumes frames faster than the producer
inserts frames, then the consumer may see some frames more
than once.
Some details of EGLStream operation are dependent on the type of
producer and consumer that are connected to it. Refer to the
documentation for the producer and consumer for more details
(section 3.10.2.* and 3.10.3.*).
3.10.6 Destroying an EGLStream
Call
EGLBoolean eglDestroyStreamKHR(
EGLDisplay dpy,
EGLStreamKHR stream);
to mark an EGLStream for deletion. After this call returns the
<stream> will no longer be a valid stream handle. The resources
associated with the EGLStream may not be deleted until the
producer and consumer have released their references to the
resources (if any). Exactly how this is done is dependent on the
type of consumer and producer that is connected to the EGLStream.
If an error occurs, EGL_FALSE is returned and an error is
generated.
- EGL_BAD_STREAM_KHR is generated if <stream> is not a valid
EGLStream created for <dpy>.
Issues
1. Are EGL_WIDTH and EGL_HEIGHT parameters needed?
RESOLVED: No. The width and height of images managed by the
stream are determined by the producer. No application access
to the size is currently required.
2. Is EGL_BUFFER_SHOW_ALL_KHR required, or should the stream always
act as EGL_BUFFER_REPLACE_KHR?
RESOLVED: this has been removed. The old
EGL_BUFFER_SHOW_ALL_KHR behavior is described in a separate
extension: EGL_KHR_stream_fifo
3. What are the exact semantics of the producer?
RESOLVED: The exact semantics vary depending on the type of
producer. Refer to the extension that defines the type of
producer for more information.
In general, the producer is responsible for inserting image
frames into the EGLStream at the correct time. The correct
time depends on how the image frames are being created and on
the value of EGL_CONSUMER_LATENCY_USEC_KHR.
4. What are the exact semantics of the consumer?
RESOLVED: The exact semantics vary depending on the type of
consumer. Refer to the extension that defines the type of
consumer for more information.
In general, the consumer is responsible for retrieving image
frames from the EGLStream when they become available. The
consumer is also responsible for setting the
EGL_CONSUMER_LATENCY_USEC_KHR when that is possible.
5. When will the EGLStream resources be deleted?
RESOLVED: this depends on the type of consumer and producer.
Refer to the description of the consumer and producer (e.g. in
the extension that describes them).
6. How does A/V sync work?
RESOLVED: The producer is responsible for A/V sync, but the
consumer needs to help. The consumer indicates the latency
(the average time that it takes the consumer to retrieve an
image from the EGLStream and place it on the display screen)
by setting the EGL_CONSUMER_LATENCY_USEC_KHR. The producer
uses knowledge about the audio stream to determine the correct
time to display an image frame, and inserts the image frame at
that time MINUS the EGL_CONSUMER_LATENCY_USEC_KHR.
7. What if the consumer cannot determine the latency?
RESOLVED: If the consumer does not set the
EGL_CONSUMER_LATENCY_USEC_KHR attribute then its default value
will be used. This default value is implementation defined
and may be zero. See the description of the specific type of
consumer you are using (e.g. the extension that defines it)
for more details related to that consumer.
8. What colorformats are supported by EGLStream
RESOLVED: No specific formats are required, but it is expected
that this work with the main YUV formats supported by the
platform's video HW and the main RGB(A) formats supported by
the platform's OpenGL (ES) hardware. It is the responsibility
of the producer to negotiate a format that will work with the
consumer. If the internal formats supported by the producer
do not coincide with the internal formats supported by the
consumer then the producer may choose to convert to a format
that the consumer understands, or it may choose to fail and
generate an error when an attempt is made to connect it to the
EGLStream. Exactly which it does for which formats is further
discussed in the producer endpoint documentation (refer to the
extension that describes the producer endpoint).
9. Is any EGLImage extension required by this extension?
RESOLVED: No. This extension may be implemented using some of
the same code that is used to implement EGLImages, but there
is no dependency on EGLImages.
10. Why describe the "io" attribute type if no attributes use it.
RESOLVED: Future extensions will add attributes of "io" type
(initialize only - meaning they can be set in the attribute
list when creating the EGLStream, but not modified once the
EGLStream is created). Rather than requiring each such
extension to describe the "io" type (and possibly getting
slightly different definitions or types in different
extensions) the "io" type is defined here so that other
extensions can easily use it. This helps layered
extensions to all use the same language.
Revision History
#27 (May 23, 2016) Daniel Kartch
- For compatibility with EGL 1.5 and support of 64-bit
platforms, add EGL_KHR_stream_attrib extension with variants
of original functions that accept attributes of type
EGLAttrib.
- Corrected line length violations.
#26 (July 12, 2012) Acorn Pooley
- Fix error in description of consumer latency.
#25 (October 12, 2011) Acorn Pooley
- Add issue 10
#24 (October 11, 2011) Acorn Pooley
- add error condition to eglDestroyStreamKHR
#23 (October 5, 2011) Acorn Pooley
- refer to related EGL_KHR_... extension specs rather than
EGL_NV_... ones.
#22 (September 27, 2011) Acorn Pooley
- Fix enum value for EGL_STREAM_STATE_KHR (bug 8064)
#21 (September 27, 2011) Acorn Pooley
- Assign enum values (bug 8064)
#20 (September 23, 2011) Acorn Pooley
- Rename EGL_NO_IMAGE_STREAM_KHR to EGL_NO_STREAM_KHR
#19 (Aug 3, 2011) Acorn Pooley
- fix some error conditions
#18 (Aug 2, 2011) Acorn Pooley
- Add eglQueryStreamu64KHR
- add EGLuint64KHR
- make EGL_PRODUCER_FRAME_KHR and EGL_CONSUMER_FRAME_KHR 64
bit.
#17 (Aug 2, 2011) Acorn Pooley
- fix grammar
#16 (July 6, 2011) Acorn Pooley
- rename from EGL_KHR_image_stream to EGL_KHR_stream
#15 (June 29, 2011) Acorn Pooley
- major re-write
- remove EGL_SWAP_MODE_KHR and EGL_BUFFER_SHOW_ALL_KHR
- add new functions:
eglStreamAttribKHR
eglQueryStreamKHR
- add new attributes:
EGL_CONSUMER_LATENCY_USEC_KHR
EGL_PRODUCER_FRAME_KHR
EGL_CONSUMER_FRAME_KHR
EGL_STREAM_STATE_KHR
- add concept of EGL_STREAM_STATE_KHR
- add new error:
EGL_BAD_STATE_KHR
- add more thorough overview section
- add description of buffering
- place the functions in section 3 of the spec (were in
section 2)
- mention some of the consumer and producer specs that may be
needed to make use of this extension.
- remove very old issues that no longer make any sense
- add new issues and resolutions
#14 (June 4, 2010) Greg Prisament
- fix minor typo
#13 (June 2, 2010) Marcus Lorentzon
- add EGL enum values
#12 (May 21, 2010) Marcus Lorentzon
- add clarifications on swap modes
#11 (April 13, 2010) Marcus Lorentzon
- fix tyops
- make eglDestroyStream return EGLBoolean, not void
#10 (March 17, 2010) Marcus Lorentzon
- fix typo
- remove obsolete text
- update issue 2 resolution
#9 (December 15, 2009) Marcus Lorentzon
- move EGL_IMAGE_USE_* attributes to the endpoint extension
- resolved issue 5
#8 (December 6, 2009) Marcus Lorentzon
- remove EGL_INIT_COLOR_KHR
- relax the definition of the Producer to allow not only video
frames to be generated
- clean up the language of recently produced, supplied, pending
images
#7 (October 19, 2009) Acorn Pooley
- Update based on comments from Robert and Bruce
- remove mention of OpenWF
- make EGL_BUFFER_REPLACE_KHR be the default EGL_SWAP_MODE_KHR
- add issue 5
- remove EGLAPI and EGLAPIENTRY
#6 (September 16, 2009) Acorn Pooley
- remove EGL_WIDTH and EGL_HEIGHT parameters
- add issue 4
- clarify swap modes
- other clarifications and simplifications
#5 (July 2, 2009) Acorn Pooley
- remove reference to no-longer-existing <images> parameter.
- mention dependancy on EGL_KHR_image_uses extension.
- add description of EGL_IMAGE_USE_AS_* enums.
#4 (June 3, 2009) Acorn Pooley
- Fix typos: change old EGLImageStream occurances to EGLStream
#3 (April 22, 2009) Marcus Lorentzon
- Updated revide comments
- Removed external image support
#2 (March 30, 2009) Marcus Lorentzon
- Replaced image surface with image stream
#1 (February 21, 2009) Marcus Lorentzon
- Initial draft
# vim:ai:ts=4:sts=4:expandtab:textwidth=70