32460
|
1 /*
|
|
2 * Extended On Screen Display
|
|
3 * Copyright (C) 2010 Nicolas George
|
|
4 *
|
|
5 * This file is part of MPlayer.
|
|
6 *
|
|
7 * MPlayer is free software; you can redistribute it and/or modify
|
|
8 * it under the terms of the GNU General Public License as published by
|
|
9 * the Free Software Foundation; either version 2 of the License, or
|
|
10 * (at your option) any later version.
|
|
11 *
|
|
12 * MPlayer is distributed in the hope that it will be useful,
|
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15 * GNU General Public License for more details.
|
|
16 *
|
|
17 * You should have received a copy of the GNU General Public License along
|
|
18 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
20 */
|
|
21
|
|
22 #ifndef MPLAYER_EOSD_H
|
|
23 #define MPLAYER_EOSD_H
|
|
24
|
|
25 #include <stdint.h>
|
|
26 #include "libmpcodecs/vf.h"
|
|
27
|
|
28 enum {
|
|
29 EOSD_CHANGED_LAYOUT = 0x1,
|
|
30 EOSD_CHANGED_BITMAP = 0x2,
|
|
31 };
|
|
32
|
|
33 struct mp_eosd_settings {
|
|
34 int w, h; ///< screen dimensions, including black borders
|
|
35 int srcw, srch; ///< unscaled source dimensions
|
|
36 int mt, mb, ml, mr; ///< borders (top, bottom, left, right)
|
|
37 int unscaled; ///< EOSD objects are rendered at native resolution
|
|
38 int changed; ///< settings have changed since last update
|
|
39 };
|
|
40
|
|
41 struct mp_eosd_image {
|
|
42 struct mp_eosd_image *next; ///< Next image, or NULL
|
|
43 uint8_t *bitmap; ///< 1bpp stride*h alpha buffer
|
|
44 void *opaque; ///< Arbitrary value for the client's use
|
|
45 int w, h; ///< Bitmap width, height
|
|
46 int stride; ///< Bitmap stride
|
|
47 uint32_t color; ///< Bitmap color and transparency, RGBT
|
|
48 /// T is the complement of A (alpha=opacity).
|
|
49 int dst_x, dst_y; ///< Bitmap placement inside the video frame
|
|
50 };
|
|
51
|
|
52 struct mp_eosd_source {
|
|
53
|
|
54 /**
|
|
55 * Linked list of images element.
|
|
56 * The client is responsible for initializing and maintaining this list.
|
|
57 * It can alter it at any time in the main MPlayer thread.
|
|
58 */
|
|
59 struct mp_eosd_image *images;
|
|
60
|
|
61 /**
|
|
62 * Pointer to the next field of the last image, or to images if the list
|
|
63 * is empty.
|
|
64 * The client is not required to handle this field, but list
|
|
65 * manipulation functions (see below) use it.
|
|
66 */
|
|
67 struct mp_eosd_image **images_tail;
|
|
68
|
|
69 /**
|
|
70 * Callback to update the images. Can be NULL.
|
|
71 */
|
|
72 void (*update)(struct mp_eosd_source *, const struct mp_eosd_settings *,
|
|
73 double);
|
|
74
|
|
75 /**
|
|
76 * Callback to uninit the source. Can be NULL.
|
|
77 */
|
|
78 void (*uninit)(struct mp_eosd_source *);
|
|
79
|
|
80 /**
|
|
81 * Changed flags of the images.
|
|
82 * The client must set it to a combination of EOSD_CHANGED_* whenever
|
|
83 * the images are altered.
|
|
84 * The core EOSD system resets it.
|
|
85 */
|
|
86 int changed;
|
|
87
|
|
88 /**
|
|
89 * Z-index of the images.
|
|
90 * Images with a higher Z-index are rendered on top.
|
|
91 */
|
|
92 int z_index;
|
|
93
|
|
94 /**
|
|
95 * Initialized flag of the source.
|
|
96 * Set by the source, automatically cleared when a source is added,
|
|
97 * removed or reinitialized.
|
|
98 */
|
|
99 int initialized;
|
|
100
|
|
101 struct mp_eosd_source *priv_next;
|
|
102 };
|
|
103
|
|
104 struct mp_eosd_image_list {
|
|
105 struct mp_eosd_source *first_source;
|
|
106 struct mp_eosd_source *source;
|
|
107 struct mp_eosd_image *image;
|
|
108 int changed;
|
|
109 };
|
|
110
|
|
111 /**
|
|
112 * Initialize the EOSD subsystem.
|
|
113 *
|
|
114 * @param vf the video filter chain where the rendering will take place.
|
|
115 */
|
|
116 void eosd_init(vf_instance_t *vf);
|
|
117
|
|
118 /**
|
|
119 * Configure the resolution for EOSD rendering.
|
|
120 * Should be called by the rendering engine whenever the resolution or
|
|
121 * settings change.
|
|
122 *
|
|
123 * @param res resolution and margins of the rendering area.
|
|
124 */
|
|
125 void eosd_configure(struct mp_eosd_settings *res);
|
|
126
|
|
127 /**
|
|
128 * Renders the EOSD elements for the current frame.
|
|
129 * Should be called by the rendering engine when it is about to do or
|
|
130 * prepare the rendering.
|
|
131 *
|
|
132 * @param[in] ts presentation timestamp of the frame.
|
|
133 * @param[out] images list of images to render.
|
|
134 * The list and list elements are only valid until any
|
|
135 * client alter them.
|
|
136 * The renderer should therefore not call anything that
|
|
137 * may alter the EOSD elements.
|
|
138 */
|
|
139 void eosd_render_frame(double ts, struct mp_eosd_image_list *images);
|
|
140
|
|
141 /**
|
|
142 * Shut down the EOSD subsystem and free the associated resources.
|
|
143 */
|
|
144 void eosd_uninit(void);
|
|
145
|
|
146 /**
|
|
147 * Register a source of EOSD images.
|
|
148 */
|
|
149 void eosd_register(struct mp_eosd_source *source);
|
|
150
|
|
151 /**
|
|
152 * Test whether a source has already been registered.
|
|
153 */
|
|
154 int eosd_registered(struct mp_eosd_source *source);
|
|
155
|
|
156 /**
|
|
157 * Allocate a structure for an EOSD image.
|
|
158 */
|
|
159 struct mp_eosd_image *eosd_image_alloc(void);
|
|
160
|
|
161 /**
|
|
162 * Free a previously allocated structure.
|
|
163 */
|
|
164 void eosd_image_free(struct mp_eosd_image *image);
|
|
165
|
|
166 /**
|
|
167 * Append an image to the list of images associated to a source.
|
|
168 * This function requires that the images_tail pointer is correctly set.
|
|
169 */
|
|
170 void eosd_image_append(struct mp_eosd_source *source,
|
|
171 struct mp_eosd_image *image);
|
|
172
|
|
173 /**
|
|
174 * Remove an image from the list of images associated to a source.
|
|
175 * The image structure is freed using eosd_image_free.
|
|
176 *
|
|
177 * @param source source where the image is.
|
|
178 * @param image image to remove.
|
|
179 * @param prev pointeur to the prev field of the previous image,
|
|
180 * or to source->images if this is the first image.
|
|
181 */
|
|
182 void eosd_image_remove(struct mp_eosd_source *source,
|
|
183 struct mp_eosd_image *image,
|
|
184 struct mp_eosd_image **prev);
|
|
185
|
|
186 /**
|
|
187 * Remove all images associated to a source and free the corresponding
|
|
188 * structures.
|
|
189 * This function also resets the images_tail pointer.
|
|
190 */
|
|
191 void eosd_image_remove_all(struct mp_eosd_source *source);
|
|
192
|
|
193 /**
|
|
194 * Reset the cursor of an image list and get the first image.
|
|
195 */
|
|
196 struct mp_eosd_image *eosd_image_first(struct mp_eosd_image_list *images);
|
|
197
|
|
198 /**
|
|
199 * Get the next image in an image list.
|
|
200 * The renderer must NOT use the next field in the image structure.
|
|
201 */
|
|
202 struct mp_eosd_image *eosd_image_next(struct mp_eosd_image_list *images);
|
|
203
|
|
204 #endif /* MPLAYER_EOSD_H */
|