mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-27 02:30:35 +00:00
113 lines
3.7 KiB
Text
113 lines
3.7 KiB
Text
Video Acceleration
|
|
------------------
|
|
|
|
Status:
|
|
|
|
DRAFT. Outdated for 1.0, we want to use video/x-raw in order to
|
|
interoperate with all elements that handle video. Optimized handling of
|
|
the VA surfaces can be done with the metadata.
|
|
|
|
Purpose:
|
|
|
|
Provide an standardized generic way to introduce Video Acceleration APIs in
|
|
already available elements instead of duplicating those into specialized ones.
|
|
|
|
Provide a mechanism for a light GstBuffer subclassing in order to be able
|
|
exchange VA related context and surfaces between elements.
|
|
|
|
Provide some basic primitives to be used in the elements keeping
|
|
the implementation of those in the backends of the helper library.
|
|
|
|
The motivation of this proposal is:
|
|
- to avoid multiple duplicty of code
|
|
- to avoid the use of GstBuffer subclassing and be more close to GstBuffer2
|
|
- to avoid the overhead that's introduced with subclassing/GType checks
|
|
- to permit multiple elements interact having a common standard
|
|
|
|
Proposal:
|
|
|
|
video/x-raw-va
|
|
|
|
Light subclassing embedding an structure in the data field of a standard
|
|
GstBuffer.
|
|
|
|
struct {
|
|
context;
|
|
surface;
|
|
flags;
|
|
subpicture, x, y, w, h;
|
|
parent *
|
|
...
|
|
} VASurface
|
|
|
|
GstVA helper library
|
|
--------------------
|
|
|
|
Common API that it's implemented by a backend for each VA API.
|
|
|
|
+-------+ +---------------+
|
|
| |----> | VDPAU backend |
|
|
| GstVA | +---------------+
|
|
| | +---------------+
|
|
| |----> | VAAPI backend |
|
|
+-------+ +---------------+
|
|
|
|
gst_va_init () : Iterate in the backends and try to initialize those, stops
|
|
when a backend is able to be created.
|
|
|
|
bool gst_va_available() : permit to query if there's VA available in runtime.
|
|
|
|
GstBuffer * gst_va_buffer_new (vacontext, vasurface, vaflags, parent*,
|
|
free_func*):
|
|
Create a new GstBuffer with the proper light subclass and store on it
|
|
the provided context, surface, flags...
|
|
- parent* and free_func* to implement a mechanism to return surfaces in
|
|
the pool driven by parent.
|
|
|
|
gst_va_buffer_get_context (GstBuffer *)
|
|
gst_va_buffer_get_surface (GstBuffer *)
|
|
gst_va_buffer_get_flags (GstBuffer *)
|
|
....
|
|
Some public/private? accessors to be able recover fields from a VA GstBuffer
|
|
internal structure.
|
|
|
|
Primitives:
|
|
|
|
gst_va_render_display (GstBuffer * va, display, x, y, w, h, ...)
|
|
Put a surface in the screen at the specified position.
|
|
|
|
gst_va_render_pixmap (GstBuffer * va, pixmap *, w, h, ...)
|
|
Put a surface in a pixmap, to be used paired with GLX_texture_from_pixmap to
|
|
upload into a OpenGL texture.
|
|
|
|
gst_va_render_memory (GstBuffer * va, planes *, strides *, w, h, ...)
|
|
To pull back into main memory a VA surface.
|
|
|
|
gst_va_buffer_associate_subpicture (GstBuffer * va, GstBuffer * subpicture,
|
|
x, y, w, h,...)
|
|
Take a reference of subpicture and keep it in va internal structure.
|
|
|
|
Use cases:
|
|
|
|
Instead of create a new specialized element for each API just change
|
|
a generic element once.
|
|
|
|
To add support for a new API just have to create a new backend.
|
|
|
|
xvimagesink
|
|
-----------
|
|
|
|
- In _setcaps negotiate accept VA kind of stream when gst_va_init and
|
|
gst_va_available tell us that we have hardware capable of it.
|
|
|
|
- In _render when the buffers have the VA flag render display it with
|
|
gst_va_render_display()
|
|
|
|
videomixer, dvdspu, textoverlay, ...
|
|
------------------------------------
|
|
|
|
- In _setcaps negotiate accept VA kind of stream when gst_va_init and
|
|
gst_va_available tell us that we have hardware capable of it.
|
|
|
|
- Use gst_va_buffer_associate_subpicture () where necessary.
|
|
|