1 /**************************************************************************
3 * Copyright 2009 Younes Manton.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
28 #ifndef PIPE_VIDEO_CONTEXT_H
29 #define PIPE_VIDEO_CONTEXT_H
35 #include <pipe/p_video_state.h>
39 struct pipe_macroblock
;
40 struct pipe_picture_desc
;
41 struct pipe_fence_handle
;
44 * Gallium video rendering context
46 struct pipe_video_context
48 struct pipe_screen
*screen
;
50 void *priv
; /**< context private data (for DRI for example) */
53 * destroy context, all objects created from this context
54 * (buffers, decoders, compositors etc...) must be freed before calling this
56 void (*destroy
)(struct pipe_video_context
*context
);
59 * Query an integer-valued capability/parameter/limit
60 * \param param one of PIPE_CAP_x
62 int (*get_param
)(struct pipe_video_context
*context
, int param
);
65 * Check if the given pipe_format is supported as a video buffer
67 boolean (*is_format_supported
)(struct pipe_video_context
*context
,
68 enum pipe_format format
,
69 enum pipe_video_profile profile
);
72 * create a surface of a texture
74 struct pipe_surface
*(*create_surface
)(struct pipe_video_context
*context
,
75 struct pipe_resource
*resource
,
76 const struct pipe_surface
*templ
);
79 * sampler view handling, used for subpictures for example
84 * create a sampler view of a texture, for subpictures for example
86 struct pipe_sampler_view
*(*create_sampler_view
)(struct pipe_video_context
*context
,
87 struct pipe_resource
*resource
,
88 const struct pipe_sampler_view
*templ
);
91 * upload image data to a sampler
93 void (*upload_sampler
)(struct pipe_video_context
*context
,
94 struct pipe_sampler_view
*dst
,
95 const struct pipe_box
*dst_box
,
96 const void *src
, unsigned src_stride
,
97 unsigned src_x
, unsigned src_y
);
100 * clear a sampler with a specific rgba color
102 void (*clear_sampler
)(struct pipe_video_context
*context
,
103 struct pipe_sampler_view
*dst
,
104 const struct pipe_box
*dst_box
,
110 * create a decoder for a specific video profile
112 struct pipe_video_decoder
*(*create_decoder
)(struct pipe_video_context
*context
,
113 enum pipe_video_profile profile
,
114 enum pipe_video_entrypoint entrypoint
,
115 enum pipe_video_chroma_format chroma_format
,
116 unsigned width
, unsigned height
);
119 * Creates a buffer as decoding target
121 struct pipe_video_buffer
*(*create_buffer
)(struct pipe_video_context
*context
,
122 enum pipe_format buffer_format
,
123 enum pipe_video_chroma_format chroma_format
,
124 unsigned width
, unsigned height
);
127 * Creates a video compositor
129 struct pipe_video_compositor
*(*create_compositor
)(struct pipe_video_context
*context
);
133 * decoder for a specific video codec
135 struct pipe_video_decoder
137 struct pipe_video_context
*context
;
139 enum pipe_video_profile profile
;
140 enum pipe_video_entrypoint entrypoint
;
141 enum pipe_video_chroma_format chroma_format
;
146 * destroy this video decoder
148 void (*destroy
)(struct pipe_video_decoder
*decoder
);
151 * Creates a buffer as decoding input
153 struct pipe_video_decode_buffer
*(*create_buffer
)(struct pipe_video_decoder
*decoder
);
156 * flush decoder buffer to video hardware
158 void (*flush_buffer
)(struct pipe_video_decode_buffer
*decbuf
,
159 unsigned num_ycbcr_blocks
[3],
160 struct pipe_video_buffer
*ref_frames
[2],
161 struct pipe_video_buffer
*dst
);
165 * input buffer for a decoder
167 struct pipe_video_decode_buffer
169 struct pipe_video_decoder
*decoder
;
172 * destroy this decode buffer
174 void (*destroy
)(struct pipe_video_decode_buffer
*decbuf
);
177 * map the input buffer into memory before starting decoding
179 void (*begin_frame
)(struct pipe_video_decode_buffer
*decbuf
);
182 * set the quantification matrixes
184 void (*set_quant_matrix
)(struct pipe_video_decode_buffer
*decbuf
,
185 const uint8_t intra_matrix
[64],
186 const uint8_t non_intra_matrix
[64]);
189 * get the pointer where to put the ycbcr blocks of a component
191 struct pipe_ycbcr_block
*(*get_ycbcr_stream
)(struct pipe_video_decode_buffer
*, int component
);
194 * get the pointer where to put the ycbcr dct block data of a component
196 short *(*get_ycbcr_buffer
)(struct pipe_video_decode_buffer
*, int component
);
199 * get the stride of the mv buffer
201 unsigned (*get_mv_stream_stride
)(struct pipe_video_decode_buffer
*decbuf
);
204 * get the pointer where to put the motion vectors of a ref frame
206 struct pipe_motionvector
*(*get_mv_stream
)(struct pipe_video_decode_buffer
*decbuf
, int ref_frame
);
211 void (*decode_bitstream
)(struct pipe_video_decode_buffer
*decbuf
,
212 unsigned num_bytes
, const void *data
,
213 struct pipe_mpeg12_picture_desc
*picture
,
214 unsigned num_ycbcr_blocks
[3]);
217 * unmap decoder buffer before flushing
219 void (*end_frame
)(struct pipe_video_decode_buffer
*decbuf
);
223 * output for decoding / input for displaying
225 struct pipe_video_buffer
227 struct pipe_video_context
*context
;
229 enum pipe_format buffer_format
;
230 enum pipe_video_chroma_format chroma_format
;
235 * destroy this video buffer
237 void (*destroy
)(struct pipe_video_buffer
*buffer
);
240 * get a individual sampler view for each plane
242 struct pipe_sampler_view
**(*get_sampler_view_planes
)(struct pipe_video_buffer
*buffer
);
245 * get a individual sampler view for each component
247 struct pipe_sampler_view
**(*get_sampler_view_components
)(struct pipe_video_buffer
*buffer
);
250 * get a individual surfaces for each plane
252 struct pipe_surface
**(*get_surfaces
)(struct pipe_video_buffer
*buffer
);
256 * composing and displaying of image data
258 struct pipe_video_compositor
260 struct pipe_video_context
*context
;
263 * destroy this compositor
265 void (*destroy
)(struct pipe_video_compositor
*compositor
);
268 * set yuv -> rgba conversion matrix
270 void (*set_csc_matrix
)(struct pipe_video_compositor
*compositor
, const float mat
[16]);
273 * reset dirty area, so it's cleared with the clear colour
275 void (*reset_dirty_area
)(struct pipe_video_compositor
*compositor
);
278 * set the clear color
280 void (*set_clear_color
)(struct pipe_video_compositor
*compositor
, float color
[4]);
283 * set overlay samplers
288 * reset all currently set layers
290 void (*clear_layers
)(struct pipe_video_compositor
*compositor
);
293 * set a video buffer as a layer to render
295 void (*set_buffer_layer
)(struct pipe_video_compositor
*compositor
,
297 struct pipe_video_buffer
*buffer
,
298 struct pipe_video_rect
*src_rect
,
299 struct pipe_video_rect
*dst_rect
);
302 * set a paletted sampler as a layer to render
304 void (*set_palette_layer
)(struct pipe_video_compositor
*compositor
,
306 struct pipe_sampler_view
*indexes
,
307 struct pipe_sampler_view
*palette
,
308 struct pipe_video_rect
*src_rect
,
309 struct pipe_video_rect
*dst_rect
);
312 * set a rgba sampler as a layer to render
314 void (*set_rgba_layer
)(struct pipe_video_compositor
*compositor
,
316 struct pipe_sampler_view
*rgba
,
317 struct pipe_video_rect
*src_rect
,
318 struct pipe_video_rect
*dst_rect
);
323 * render the layers to the frontbuffer
325 void (*render_picture
)(struct pipe_video_compositor
*compositor
,
326 enum pipe_mpeg12_picture_type picture_type
,
327 struct pipe_surface
*dst_surface
,
328 struct pipe_video_rect
*dst_area
,
329 struct pipe_fence_handle
**fence
);
337 #endif /* PIPE_VIDEO_CONTEXT_H */