Name

    NV_stream_metadata

Name Strings

    EGL_NV_stream_metadata

Contributors

    Daniel Kartch
    Gajanan Bhat
    Laszlo Weber
    Lawrence Ibarria
    Miguel A. Vico

Contacts

    Daniel Kartch, NVIDIA (dkartch 'at' nvidia 'dot' com)

Status

    Complete

Version

    Version 8 - July 31, 2015

Number

    EGL Extension #93


Extension Type

    EGL display extension

Dependencies

    Requires EGL_KHR_stream

    Interacts with EGL_EXT_device_base

Overview

    Application suites which make use of streams to transmit images may
    need to communicate additional data between the producer and
    consumer, synchronized with the frame updates. This data may change
    infrequently, such as a movie title and track number to be displayed
    to the user, or every frame, such as a focal length and exposure
    time used to process the image. Transmitting this data outside the
    scope of the stream may be inconvenient, particularly in the case of
    cross-process streams. But the nature of the data is highly
    application-dependent, so it is not feasible for an EGL
    implementation to define specific extensions for a broad range of
    application data.

    This extension provides a means for an application (or application
    suite in the cross-process case) to associate arbitrary metadata
    with a stream. Multiple metadata fields are available, allowing them
    to be updated and used independently by separate subcomponents of
    producers and consumers, respectively. The format of the data is
    determined by the application, which is responsible for writing and
    reading it correctly.

New Types

    None

New Functions

    EGLBoolean eglQueryDisplayAttribNV(
        EGLDisplay   dpy,
        EGLint       attribute,
        EGLAttrib*   value);

    EGLBoolean eglSetStreamMetadataNV(
        EGLDisplay   dpy,
        EGLStreamKHR stream,
        EGLint       n,
        EGLint       offset,
        EGLint       size,
        const void*  data);

    EGLBoolean eglQueryStreamMetadataNV(
        EGLDisplay   dpy,
        EGLStreamKHR stream,
        EGLenum      name,
        EGLint       n,
        EGLint       offset,
        EGLint       size,
        void*        data);

New Tokens

    Accepted as <attribute> by eglQueryDisplayAttribNV:

        EGL_MAX_STREAM_METADATA_BLOCKS_NV            0x3250
        EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV        0x3251
        EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV        0x3252

    Accepted as <name> by eglQueryStreamMetatdataNV:

        EGL_PRODUCER_METADATA_NV                     0x3253
        EGL_CONSUMER_METADATA_NV                     0x3254
        EGL_PENDING_METADATA_NV                      0x3328

    Accepted in <attrib_list> by eglCreateStreamKHR and as <attribute>
    by eglQueryStreamKHR:

        EGL_METADATA0_SIZE_NV                        0x3255
        EGL_METADATA1_SIZE_NV                        0x3256
        EGL_METADATA2_SIZE_NV                        0x3257
        EGL_METADATA3_SIZE_NV                        0x3258

        EGL_METADATA0_TYPE_NV                        0x3259
        EGL_METADATA1_TYPE_NV                        0x325A
        EGL_METADATA2_TYPE_NV                        0x325B
        EGL_METADATA3_TYPE_NV                        0x325C


Add to section "3.3 EGL Queries"

    To query attributes of an initialized display, call

        EGLBoolean eglQueryDisplayAttribNV(
            EGLDisplay   dpy,
            EGLint       attribute,
            EGLAttrib*   value)

    On success, EGL_TRUE is returned, and the value associated with
    attribute <name> is returned in <value>.

    If <name> is EGL_MAX_STREAM_METADATA_BLOCKS_NV, the total number
    of independent metadata blocks supported by each stream is returned.
    If <name> is EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV, the maximum size
    supported for an individual metadata block is returned. If <name> is
    EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV, the maximum combined size of
    all metadata blocks supported by a single stream is returned.

    On failure, EGL_FALSE is returned.  An EGL_BAD_DISPLAY error is
    generated if <dpy> is not a valid initialized display. An
    EGL_BAD_ATTRIBUTE error is generated if <name> is not a valid
    attribute name.

If EGL_EXT_device_base is present, eglQueryDisplayAttribNV is equivalent
to eglQueryDisplayAttribEXT, and calls to either will return the same
values.

Add to table "3.10.4.4 EGLStream Attributes" in EGL_KHR_stream

        Attribute                 Read/Write    Type    Section
        ------------------------  ----------   ------   ----------
        EGL_METADATA<n>_SIZE_NV       io       EGLint   3.10.4.x
        EGL_METADATA<n>_TYPE_NV       io       EGLint   3.10.4.x+1

Add new subsections to section "3.10.4 EGLStream Attributes" of
EGL_KHR_stream

    3.10.4.x EGL_METADATA<n>_SIZE_NV

    The EGL_METADATA<n>_SIZE_NV attribute indicates the size of the
    <n>th metadata block associated with a stream. If <n> is not less
    than the value of EGL_MAX_STREAM_METADATA_BLOCKS_NV for the parent
    EGLDisplay, the attribute is treated as unknown.

    These attributes may only be set when the stream is created. The
    default value is 0. The value may not exceed that of
    EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV for the parent EGLDisplay.
    Furthermore, the total size of all metadata blocks may not exceed
    the value of EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV. If either of
    these restrictions are exceeded, an EGL_BAD_PARAMETER error is
    generated.

    3.10.4.x+1 EGL_METADATA<n>_TYPE_NV

    The EGL_METADATA<n>_TYPE_NV attribute indicates an optional
    application-defined type associated with the stream's <n>th metadata
    block. If <n> is not less than the value of
    EGL_MAX_STREAM_METADATA_BLOCKS_NV for the parent EGLDisplay, the
    attribute is treated as unknown.

    These attributes may only be set when the stream is created. The
    default value is 0. It is not required that a type be provided for
    every metadata block for which a size has been specified. These may
    be used to help separate application components coordinate their use
    of the stream's metadata blocks.

Add new section to "3.10 EGLStreams" of EGL_KHR_stream

    3.10.y EGLStream metadata

    An application may associate arbitrary blocks of additional data
    with the stream, to be updated in sync with the frames. The contents
    and format of these data blocks are left to the application, subject
    to size restrictions imposed by the implementation. The application
    must specify the sizes of its metadata blocks at the time the stream
    is created. The contents may be completely or partially modified
    every frame or less frequently, as the application chooses. When a
    new frame is inserted into the stream, a snapshot of the current
    metadata contents are associated with the frame, and may then be
    queried from the stream.

    The contents of all metadata blocks of non-zero size are initialized
    to zeroes. To modify the contents of a portion of a metadata block,
    call

        EGLBoolean eglSetStreamMetadataNV(
            EGLDisplay   dpy,
            EGLStreamKHR stream,
            EGLint       n,
            EGLint       offset,
            EGLint       size,
            const void*  data)

    On success, EGL_TRUE is returned and the first <size> bytes pointed
    to by <data> will be copied to the <n>th metadata block of <stream>,
    starting at <offset> bytes from the beginning of the block. This
    data will be associated with all subsequent frames inserted into the
    stream until the contents are next modified.

    On failure, EGL_FALSE is returned
        - An EGL_BAD_DISPLAY error is generated if <dpy> is not a valid
          display.
        - An EGL_BAD_STREAM_KHR error is generated if <stream> is not a
          valid stream associated with <dpy>.
        - An EGL_BAD_STATE_KHR error is generated if the state of
          <stream> is not EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR,
          EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR, or
          EGL_STREAM_STATE_EMPTY_KHR.
        - An EGL_BAD_ACCESS error is generated if the producer and
          consumer endpoints of the stream are represented by separate
          EGLStream objects, and the producer is not attached to
          <stream>.
        - An EGL_BAD_PARAMETER error is generated if <n> is negative or
          is equal to or greather than the value of
          EGL_MAX_STREAM_METADATA_BLOCKS_NV for <dpy>.
        - An EGL_BAD_PARAMETER error is generated if <offset> or <size>
          are negative, or if <offset>+<size> is greater than the value
          of EGL_METADATA<n>_SIZE_NV for <stream>.

    If <data> does not point to valid readable memory of at least <size>
    bytes, undefined behavior will result. If the value of <size> is
    zero, no error will occur, but the function will have no effect.

    To query the contents of a metadata block for a frame, call

        EGLBoolean eglQueryStreamMetadataNV(
            EGLDisplay   dpy,
            EGLStreamKHR stream,
            EGLenum      name,
            EGLint       n,
            EGLint       offset,
            EGLint       size,
            void*        data)

    On success, EGL_TRUE is returned and <size> bytes starting from the
    <offset>th byte of the <n>th metadata block of <stream> will be
    copied into the memory pointed to by <data>. If <name> is
    EGL_PRODUCER_METADATA_NV, the metadata will be taken from the frame
    most recently inserted into the stream by the producer. If <name> is
    EGL_CONSUMER_METADATA_NV, the metadata will be taken from the frame
    most recently acquired by the consumer. If <name> is
    EGL_PENDING_METADATA_NV, the metadata will be taken from the frame
    which would be obtained if an acquire operation were performed at
    the time of the query.

    On failure, EGL_FALSE is returned
        - An EGL_BAD_DISPLAY error is generated if <dpy> is not a valid
          display.
        - An EGL_BAD_STREAM_KHR error is generated if <stream> is not a
          valid stream associated with <dpy>.
        - An EGL_BAD_STATE_KHR error is generated if the state of
          <stream> is not EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR or
          EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR.
        - An EGL_BAD_ATTRIBUTE error is generated if <name> is not
          EGL_PRODUCER_METADATA_NV, EGL_CONSUMER_METADATA_NV, or
          EGL_PENDING_METADATA_NV.
        - An EGL_BAD_PARAMETER error is generated if <n> is negative or
          is equal to or greater than the value of
          EGL_MAX_STREAM_METADATA_BLOCKS_NV for <dpy>.
        - An EGL_BAD_PARAMETER error is generated if <offset> or <size>
          are negative, or if <offset>+<size> is greater than the value
          of EGL_METADATA<n>_SIZE_NV for <stream>.

    If <data> does not point to valid writeable memory of at least
    <size> bytes, undefined behavior will result. If the value of <size>
    is zero, no error will occur, but the function will have no effect.

Issues

    1.  What happens if multiple calls are made to
        eglSetStreamMetadataNV without presenting a new frame?

        RESOLVED: If the calls specify overlapping ranges of the same
        metadata block, the earlier data in the overlapped portion is
        overwritten. Only the most recent values are associated with
        the next frame when it is inserted into the stream.

    2.  What happens if multiple frames are presented without calling
        eglSetStreamMetadataNV?

        RESOLVED: The most recently provided data is reused.

Revision History

    #8  (July 31, 2015) Daniel Kartch
        - Cleaned up and added contact info for publication.

    #7  (April 2, 2015) Miguel A. Vico
        - Assigned enumerated value for metadata of pending frame.

    #6  (March 20, 2015) Daniel Kartch
        - Add query for metadata of pending frame.

    #5  (January 15, 2015) Daniel Kartch
        - Add paragraph of supported attributes to description of
          eglQueryDisplayAttribNV.
        - Added/updated error conditions to set/query functions.
        - Fixed errors in prototypes.

    #4  (January 6, 2015) Daniel Kartch
        - Fixed errors in prototypes.
        - Added enum values.

    #3  (December 12, 2014) Daniel Kartch
        - Clarified language on how metadata becomes associated with
          frames inserted into the stream.
        - Fixed typos.

    #2  (December 12, 2014) Daniel Kartch
        - Added offset and size to Set and Query functions.

    #1  (December 11, 2014) Daniel Kartch
        - Initial draft
