1 /**************************************************************************
2  *
3  * Copyright 2009 Younes Manton.
4  * All Rights Reserved.
5  *
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:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial portions
16  * of the Software.
17  *
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.
25  *
26  **************************************************************************/
27 
28 #ifndef PIPE_VIDEO_CONTEXT_H
29 #define PIPE_VIDEO_CONTEXT_H
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 #include "pipe/p_video_state.h"
36 
37 struct pipe_screen;
38 struct pipe_surface;
39 struct pipe_macroblock;
40 struct pipe_picture_desc;
41 struct pipe_fence_handle;
42 
43 /**
44  * Gallium video decoder for a specific codec/profile
45  */
46 struct pipe_video_decoder
47 {
48    struct pipe_context *context;
49 
50    enum pipe_video_profile profile;
51    enum pipe_video_entrypoint entrypoint;
52    enum pipe_video_chroma_format chroma_format;
53    unsigned width;
54    unsigned height;
55    unsigned max_references;
56 
57    /**
58     * destroy this video decoder
59     */
60    void (*destroy)(struct pipe_video_decoder *decoder);
61 
62    /**
63     * start decoding of a new frame
64     */
65    void (*begin_frame)(struct pipe_video_decoder *decoder,
66                        struct pipe_video_buffer *target,
67                        struct pipe_picture_desc *picture);
68 
69    /**
70     * decode a macroblock
71     */
72    void (*decode_macroblock)(struct pipe_video_decoder *decoder,
73                              struct pipe_video_buffer *target,
74                              struct pipe_picture_desc *picture,
75                              const struct pipe_macroblock *macroblocks,
76                              unsigned num_macroblocks);
77 
78    /**
79     * decode a bitstream
80     */
81    void (*decode_bitstream)(struct pipe_video_decoder *decoder,
82                             struct pipe_video_buffer *target,
83                             struct pipe_picture_desc *picture,
84                             unsigned num_buffers,
85                             const void * const *buffers,
86                             const unsigned *sizes);
87 
88    /**
89     * end decoding of the current frame
90     */
91    void (*end_frame)(struct pipe_video_decoder *decoder,
92                      struct pipe_video_buffer *target,
93                      struct pipe_picture_desc *picture);
94 
95    /**
96     * flush any outstanding command buffers to the hardware
97     * should be called before a video_buffer is acessed by the state tracker again
98     */
99    void (*flush)(struct pipe_video_decoder *decoder);
100 };
101 
102 /**
103  * output for decoding / input for displaying
104  */
105 struct pipe_video_buffer
106 {
107    struct pipe_context *context;
108 
109    enum pipe_format buffer_format;
110    enum pipe_video_chroma_format chroma_format;
111    unsigned width;
112    unsigned height;
113    bool interlaced;
114 
115    /**
116     * destroy this video buffer
117     */
118    void (*destroy)(struct pipe_video_buffer *buffer);
119 
120    /**
121     * get a individual sampler view for each plane
122     */
123    struct pipe_sampler_view **(*get_sampler_view_planes)(struct pipe_video_buffer *buffer);
124 
125    /**
126     * get a individual sampler view for each component
127     */
128    struct pipe_sampler_view **(*get_sampler_view_components)(struct pipe_video_buffer *buffer);
129 
130    /**
131     * get a individual surfaces for each plane
132     */
133    struct pipe_surface **(*get_surfaces)(struct pipe_video_buffer *buffer);
134 
135    /*
136     * auxiliary associated data
137     */
138    void *associated_data;
139 
140    /*
141     * decoder where the associated data came from
142     */
143    struct pipe_video_decoder *decoder;
144 
145    /*
146     * destroy the associated data
147     */
148    void (*destroy_associated_data)(void *associated_data);
149 };
150 
151 #ifdef __cplusplus
152 }
153 #endif
154 
155 #endif /* PIPE_VIDEO_CONTEXT_H */
156