Loading [MathJax]/jax/output/HTML-CSS/config.js
  • <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • NVIDIA DRIVE OS Linux SDK API Reference

    6.0.9 Release
    All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
    EGL_KHR_stream
    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
    
    人人超碰97caoporen国产