Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
510 lines (425 loc) · 15.5 KB

SDL_phyuv.c

File metadata and controls

510 lines (425 loc) · 15.5 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Feb 1, 2006
Feb 1, 2006
3
Copyright (C) 1997-2006 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
Apr 26, 2001
Apr 26, 2001
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
Apr 26, 2001
Apr 26, 2001
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Apr 26, 2001
Apr 26, 2001
14
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Apr 26, 2001
Apr 26, 2001
18
19
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Apr 26, 2001
Apr 26, 2001
21
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
23
Aug 4, 2003
Aug 4, 2003
24
/* This is the QNX Realtime Platform version of SDL YUV video overlays */
Apr 26, 2001
Apr 26, 2001
25
26
27
28
29
30
31
32
#include <errno.h>
#include <Ph.h>
#include <Pt.h>
#include "SDL_video.h"
#include "SDL_phyuv_c.h"
Feb 16, 2006
Feb 16, 2006
33
#include "../SDL_yuvfuncs.h"
Apr 26, 2001
Apr 26, 2001
34
Jan 20, 2003
Jan 20, 2003
35
#define OVERLAY_STATE_UNINIT 0
Apr 26, 2001
Apr 26, 2001
36
37
#define OVERLAY_STATE_ACTIVE 1
May 6, 2004
May 6, 2004
38
/* The functions are used to manipulate software video overlays */
May 28, 2006
May 28, 2006
39
static struct private_yuvhwfuncs ph_yuvfuncs = {
Jan 20, 2003
Jan 20, 2003
40
41
42
43
ph_LockYUVOverlay,
ph_UnlockYUVOverlay,
ph_DisplayYUVOverlay,
ph_FreeYUVOverlay
Apr 26, 2001
Apr 26, 2001
44
45
};
May 28, 2006
May 28, 2006
46
int
May 29, 2006
May 29, 2006
47
grab_ptrs2(PgVideoChannel_t * channel, FRAMEDATA * Frame0, FRAMEDATA * Frame1)
Apr 26, 2001
Apr 26, 2001
48
{
Jan 20, 2003
Jan 20, 2003
49
50
51
int planes = 0;
/* Buffers have moved; re-obtain the pointers */
May 29, 2006
May 29, 2006
52
53
54
55
56
57
Frame0->Y = (unsigned char *) PdGetOffscreenContextPtr(channel->yplane1);
Frame1->Y = (unsigned char *) PdGetOffscreenContextPtr(channel->yplane2);
Frame0->U = (unsigned char *) PdGetOffscreenContextPtr(channel->vplane1);
Frame1->U = (unsigned char *) PdGetOffscreenContextPtr(channel->vplane2);
Frame0->V = (unsigned char *) PdGetOffscreenContextPtr(channel->uplane1);
Frame1->V = (unsigned char *) PdGetOffscreenContextPtr(channel->uplane2);
Jan 20, 2003
Jan 20, 2003
58
59
60
61
62
63
if (Frame0->Y)
planes++;
if (Frame0->U)
planes++;
Apr 26, 2001
Apr 26, 2001
64
Jan 20, 2003
Jan 20, 2003
65
66
if (Frame0->V)
planes++;
Apr 26, 2001
Apr 26, 2001
67
Jan 20, 2003
Jan 20, 2003
68
return planes;
Apr 26, 2001
Apr 26, 2001
69
70
}
May 28, 2006
May 28, 2006
71
SDL_Overlay *
May 29, 2006
May 29, 2006
72
73
ph_CreateYUVOverlay(_THIS, int width, int height, Uint32 format,
SDL_Surface * display)
Apr 26, 2001
Apr 26, 2001
74
{
May 28, 2006
May 28, 2006
75
76
SDL_Overlay *overlay;
struct private_yuvhwdata *hwdata;
Aug 4, 2003
Aug 4, 2003
77
int vidport;
Jan 20, 2003
Jan 20, 2003
78
79
int rtncode;
int planes;
May 28, 2006
May 28, 2006
80
int i = 0;
Jan 20, 2003
Jan 20, 2003
81
82
83
PhPoint_t pos;
/* Create the overlay structure */
May 29, 2006
May 29, 2006
84
overlay = SDL_calloc(1, sizeof(SDL_Overlay));
Jan 20, 2003
Jan 20, 2003
85
May 28, 2006
May 28, 2006
86
if (overlay == NULL) {
May 29, 2006
May 29, 2006
87
SDL_OutOfMemory();
Aug 4, 2003
Aug 4, 2003
88
return NULL;
Jan 20, 2003
Jan 20, 2003
89
90
91
92
93
94
}
/* Fill in the basic members */
overlay->format = format;
overlay->w = width;
overlay->h = height;
Aug 4, 2003
Aug 4, 2003
95
overlay->hwdata = NULL;
May 28, 2006
May 28, 2006
96
Jan 20, 2003
Jan 20, 2003
97
98
99
100
/* Set up the YUV surface function structure */
overlay->hwfuncs = &ph_yuvfuncs;
/* Create the pixel data and lookup tables */
May 29, 2006
May 29, 2006
101
hwdata = SDL_calloc(1, sizeof(struct private_yuvhwdata));
Jan 20, 2003
Jan 20, 2003
102
May 28, 2006
May 28, 2006
103
if (hwdata == NULL) {
May 29, 2006
May 29, 2006
104
105
SDL_OutOfMemory();
SDL_FreeYUVOverlay(overlay);
Aug 4, 2003
Aug 4, 2003
106
return NULL;
Jan 20, 2003
Jan 20, 2003
107
108
}
Aug 4, 2003
Aug 4, 2003
109
110
overlay->hwdata = hwdata;
May 29, 2006
May 29, 2006
111
PhDCSetCurrent(0);
May 28, 2006
May 28, 2006
112
113
if (overlay->hwdata->channel == NULL) {
if ((overlay->hwdata->channel =
May 29, 2006
May 29, 2006
114
PgCreateVideoChannel(Pg_VIDEO_CHANNEL_SCALER, 0)) == NULL) {
May 28, 2006
May 28, 2006
115
116
SDL_SetError
("ph_CreateYUVOverlay(): Create channel failed: %s\n",
May 29, 2006
May 29, 2006
117
118
strerror(errno));
SDL_FreeYUVOverlay(overlay);
Aug 4, 2003
Aug 4, 2003
119
return NULL;
Jan 20, 2003
Jan 20, 2003
120
May 19, 2002
May 19, 2002
121
122
123
}
}
May 28, 2006
May 28, 2006
124
overlay->hwdata->forcedredraw = 0;
Aug 4, 2003
Aug 4, 2003
125
May 29, 2006
May 29, 2006
126
PtGetAbsPosition(window, &pos.x, &pos.y);
Aug 4, 2003
Aug 4, 2003
127
128
129
130
131
132
overlay->hwdata->CurrentWindowPos.x = pos.x;
overlay->hwdata->CurrentWindowPos.y = pos.y;
overlay->hwdata->CurrentViewPort.pos.x = 0;
overlay->hwdata->CurrentViewPort.pos.y = 0;
overlay->hwdata->CurrentViewPort.size.w = width;
overlay->hwdata->CurrentViewPort.size.h = height;
May 19, 2002
May 19, 2002
133
overlay->hwdata->State = OVERLAY_STATE_UNINIT;
May 28, 2006
May 28, 2006
134
overlay->hwdata->FrameData0 =
May 29, 2006
May 29, 2006
135
(FRAMEDATA *) SDL_calloc(1, sizeof(FRAMEDATA));
May 28, 2006
May 28, 2006
136
overlay->hwdata->FrameData1 =
May 29, 2006
May 29, 2006
137
(FRAMEDATA *) SDL_calloc(1, sizeof(FRAMEDATA));
Apr 26, 2001
Apr 26, 2001
138
Aug 4, 2003
Aug 4, 2003
139
vidport = -1;
May 28, 2006
May 28, 2006
140
141
142
i = 0;
overlay->hwdata->ischromakey = 0;
Jan 20, 2003
Jan 20, 2003
143
144
do {
May 29, 2006
May 29, 2006
145
146
SDL_memset(&overlay->hwdata->caps, 0x00, sizeof(PgScalerCaps_t));
overlay->hwdata->caps.size = sizeof(PgScalerCaps_t);
May 28, 2006
May 28, 2006
147
rtncode =
May 29, 2006
May 29, 2006
148
149
PgGetScalerCapabilities(overlay->hwdata->channel, i,
&overlay->hwdata->caps);
May 28, 2006
May 28, 2006
150
151
152
153
154
155
156
157
158
if (rtncode == 0) {
if (overlay->hwdata->caps.format == format) {
if ((overlay->hwdata->caps.
flags & Pg_SCALER_CAP_DST_CHROMA_KEY) ==
Pg_SCALER_CAP_DST_CHROMA_KEY) {
overlay->hwdata->ischromakey = 1;
}
vidport = 1;
break;
Jan 20, 2003
Jan 20, 2003
159
}
May 28, 2006
May 28, 2006
160
161
} else {
break;
Jan 20, 2003
Jan 20, 2003
162
163
}
i++;
May 28, 2006
May 28, 2006
164
165
}
while (1);
May 19, 2002
May 19, 2002
166
Apr 26, 2001
Apr 26, 2001
167
May 28, 2006
May 28, 2006
168
if (vidport == -1) {
May 29, 2006
May 29, 2006
169
170
SDL_SetError("No available video ports for requested format\n");
SDL_FreeYUVOverlay(overlay);
Aug 4, 2003
Aug 4, 2003
171
return NULL;
Jan 20, 2003
Jan 20, 2003
172
}
Aug 4, 2003
Aug 4, 2003
173
Jan 20, 2003
Jan 20, 2003
174
175
overlay->hwdata->format = format;
overlay->hwdata->props.format = format;
May 29, 2006
May 29, 2006
176
overlay->hwdata->props.size = sizeof(PgScalerProps_t);
Aug 4, 2003
Aug 4, 2003
177
178
overlay->hwdata->props.src_dim.w = width;
overlay->hwdata->props.src_dim.h = height;
Apr 26, 2001
Apr 26, 2001
179
Dec 10, 2003
Dec 10, 2003
180
/* overlay->hwdata->chromakey = PgGetOverlayChromaColor(); */
May 29, 2006
May 29, 2006
181
overlay->hwdata->chromakey = PgRGB(12, 6, 12); /* very dark pink color */
Dec 10, 2003
Dec 10, 2003
182
overlay->hwdata->props.color_key = overlay->hwdata->chromakey;
Aug 4, 2003
Aug 4, 2003
183
May 29, 2006
May 29, 2006
184
185
PhAreaToRect(&overlay->hwdata->CurrentViewPort,
&overlay->hwdata->props.viewport);
Apr 26, 2001
Apr 26, 2001
186
Jan 20, 2003
Jan 20, 2003
187
overlay->hwdata->props.flags = Pg_SCALER_PROP_DOUBLE_BUFFER;
Apr 26, 2001
Apr 26, 2001
188
May 28, 2006
May 28, 2006
189
if ((overlay->hwdata->ischromakey) && (overlay->hwdata->chromakey)) {
Jan 20, 2003
Jan 20, 2003
190
overlay->hwdata->props.flags |= Pg_SCALER_PROP_CHROMA_ENABLE;
May 28, 2006
May 28, 2006
191
192
193
overlay->hwdata->props.flags |=
Pg_SCALER_PROP_CHROMA_SPECIFY_KEY_MASK;
} else {
Jan 20, 2003
Jan 20, 2003
194
195
overlay->hwdata->props.flags &= ~Pg_SCALER_PROP_CHROMA_ENABLE;
}
Apr 26, 2001
Apr 26, 2001
196
May 28, 2006
May 28, 2006
197
rtncode =
May 29, 2006
May 29, 2006
198
199
PgConfigScalerChannel(overlay->hwdata->channel,
&overlay->hwdata->props);
Apr 26, 2001
Apr 26, 2001
200
May 28, 2006
May 28, 2006
201
202
switch (rtncode) {
case -1:
May 29, 2006
May 29, 2006
203
204
SDL_SetError("PgConfigScalerChannel failed\n");
SDL_FreeYUVOverlay(overlay);
May 28, 2006
May 28, 2006
205
206
207
208
209
return NULL;
case 1:
case 0:
default:
break;
Jan 20, 2003
Jan 20, 2003
210
}
Apr 26, 2001
Apr 26, 2001
211
May 28, 2006
May 28, 2006
212
planes =
May 29, 2006
May 29, 2006
213
214
grab_ptrs2(overlay->hwdata->channel, overlay->hwdata->FrameData0,
overlay->hwdata->FrameData1);
Apr 26, 2001
Apr 26, 2001
215
May 28, 2006
May 28, 2006
216
if (overlay->hwdata->channel->yplane1 != NULL)
Jan 20, 2003
Jan 20, 2003
217
overlay->hwdata->YStride = overlay->hwdata->channel->yplane1->pitch;
May 28, 2006
May 28, 2006
218
if (overlay->hwdata->channel->vplane1 != NULL)
Jan 29, 2006
Jan 29, 2006
219
overlay->hwdata->UStride = overlay->hwdata->channel->vplane1->pitch;
May 28, 2006
May 28, 2006
220
if (overlay->hwdata->channel->uplane1 != NULL)
Jan 29, 2006
Jan 29, 2006
221
overlay->hwdata->VStride = overlay->hwdata->channel->uplane1->pitch;
Apr 26, 2001
Apr 26, 2001
222
Aug 4, 2003
Aug 4, 2003
223
224
225
/* check for the validness of all planes */
if ((overlay->hwdata->channel->yplane1 == NULL) &&
(overlay->hwdata->channel->uplane1 == NULL) &&
May 28, 2006
May 28, 2006
226
(overlay->hwdata->channel->vplane1 == NULL)) {
May 29, 2006
May 29, 2006
227
228
SDL_FreeYUVOverlay(overlay);
SDL_SetError("PgConfigScaler() returns all planes equal NULL\n");
May 28, 2006
May 28, 2006
229
return NULL;
Aug 4, 2003
Aug 4, 2003
230
231
}
/*
Jan 20, 2003
Jan 20, 2003
232
overlay->hwdata->current = PgNextVideoFrame(overlay->hwdata->channel);
Apr 26, 2001
Apr 26, 2001
233
Aug 4, 2003
Aug 4, 2003
234
235
if (overlay->hwdata->current==0)
{
Jan 20, 2003
Jan 20, 2003
236
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;
Aug 4, 2003
Aug 4, 2003
237
}
Jan 20, 2003
Jan 20, 2003
238
else
Aug 4, 2003
Aug 4, 2003
239
{
Jan 20, 2003
Jan 20, 2003
240
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData1;
Aug 4, 2003
Aug 4, 2003
241
242
243
}
*/
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;
Apr 26, 2001
Apr 26, 2001
244
Aug 4, 2003
Aug 4, 2003
245
/*
Jan 20, 2003
Jan 20, 2003
246
overlay->hwdata->locked = 1;
Aug 4, 2003
Aug 4, 2003
247
*/
Apr 26, 2001
Apr 26, 2001
248
Jan 20, 2003
Jan 20, 2003
249
250
/* Find the pitch and offset values for the overlay */
overlay->planes = planes;
May 29, 2006
May 29, 2006
251
252
overlay->pitches = SDL_calloc(overlay->planes, sizeof(Uint16));
overlay->pixels = SDL_calloc(overlay->planes, sizeof(Uint8 *));
May 28, 2006
May 28, 2006
253
if (!overlay->pitches || !overlay->pixels) {
May 29, 2006
May 29, 2006
254
255
SDL_OutOfMemory();
SDL_FreeYUVOverlay(overlay);
May 28, 2006
May 28, 2006
256
return (NULL);
Jan 20, 2003
Jan 20, 2003
257
}
Apr 26, 2001
Apr 26, 2001
258
May 28, 2006
May 28, 2006
259
if (overlay->planes > 0) {
Jan 20, 2003
Jan 20, 2003
260
overlay->pitches[0] = overlay->hwdata->channel->yplane1->pitch;
May 28, 2006
May 28, 2006
261
overlay->pixels[0] = overlay->hwdata->CurrentFrameData->Y;
Jan 20, 2003
Jan 20, 2003
262
}
May 28, 2006
May 28, 2006
263
if (overlay->planes > 1) {
Jan 29, 2006
Jan 29, 2006
264
overlay->pitches[1] = overlay->hwdata->channel->vplane1->pitch;
May 28, 2006
May 28, 2006
265
overlay->pixels[1] = overlay->hwdata->CurrentFrameData->U;
Jan 20, 2003
Jan 20, 2003
266
}
May 28, 2006
May 28, 2006
267
if (overlay->planes > 2) {
Jan 29, 2006
Jan 29, 2006
268
overlay->pitches[2] = overlay->hwdata->channel->uplane1->pitch;
May 28, 2006
May 28, 2006
269
overlay->pixels[2] = overlay->hwdata->CurrentFrameData->V;
Jan 20, 2003
Jan 20, 2003
270
}
Apr 26, 2001
Apr 26, 2001
271
Jan 20, 2003
Jan 20, 2003
272
273
274
overlay->hwdata->State = OVERLAY_STATE_ACTIVE;
overlay->hwdata->scaler_on = 0;
overlay->hw_overlay = 1;
Apr 26, 2001
Apr 26, 2001
275
May 28, 2006
May 28, 2006
276
current_overlay = overlay;
Aug 4, 2003
Aug 4, 2003
277
278
return overlay;
Jan 20, 2003
Jan 20, 2003
279
}
Apr 26, 2001
Apr 26, 2001
280
May 28, 2006
May 28, 2006
281
int
May 29, 2006
May 29, 2006
282
ph_LockYUVOverlay(_THIS, SDL_Overlay * overlay)
Jan 20, 2003
Jan 20, 2003
283
{
May 28, 2006
May 28, 2006
284
if (overlay == NULL) {
Dec 10, 2003
Dec 10, 2003
285
return -1;
Aug 4, 2003
Aug 4, 2003
286
}
Apr 26, 2001
Apr 26, 2001
287
Aug 4, 2003
Aug 4, 2003
288
289
290
overlay->hwdata->locked = 1;
/* overlay->hwdata->current = PgNextVideoFrame(overlay->hwdata->channel);
Jan 20, 2003
Jan 20, 2003
291
292
if (overlay->hwdata->current == -1)
{
Aug 4, 2003
Aug 4, 2003
293
SDL_SetError("ph_LockYUVOverlay: PgNextFrame() failed, bailing out\n");
Jan 20, 2003
Jan 20, 2003
294
SDL_FreeYUVOverlay(overlay);
Aug 4, 2003
Aug 4, 2003
295
return 0;
Jan 20, 2003
Jan 20, 2003
296
}
Apr 26, 2001
Apr 26, 2001
297
Jan 20, 2003
Jan 20, 2003
298
if (overlay->hwdata->current == 0)
Aug 4, 2003
Aug 4, 2003
299
{
Jan 20, 2003
Jan 20, 2003
300
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;
Aug 4, 2003
Aug 4, 2003
301
}
Jan 20, 2003
Jan 20, 2003
302
else
Aug 4, 2003
Aug 4, 2003
303
{
Jan 20, 2003
Jan 20, 2003
304
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData1;
Aug 4, 2003
Aug 4, 2003
305
}
Apr 26, 2001
Apr 26, 2001
306
Jan 20, 2003
Jan 20, 2003
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
if (overlay->planes > 0)
{
overlay->pitches[0] = overlay->hwdata->channel->yplane1->pitch;
overlay->pixels[0] = overlay->hwdata->CurrentFrameData->Y;
}
if (overlay->planes > 1)
{
overlay->pitches[1] = overlay->hwdata->channel->uplane1->pitch;
overlay->pixels[1] = overlay->hwdata->CurrentFrameData->U;
}
if (overlay->planes > 2)
{
overlay->pitches[2] = overlay->hwdata->channel->vplane1->pitch;
overlay->pixels[2] = overlay->hwdata->CurrentFrameData->V;
}
Aug 4, 2003
Aug 4, 2003
322
*/
Apr 26, 2001
Apr 26, 2001
323
May 28, 2006
May 28, 2006
324
return (0);
Apr 26, 2001
Apr 26, 2001
325
326
}
May 28, 2006
May 28, 2006
327
void
May 29, 2006
May 29, 2006
328
ph_UnlockYUVOverlay(_THIS, SDL_Overlay * overlay)
Apr 26, 2001
Apr 26, 2001
329
{
May 28, 2006
May 28, 2006
330
if (overlay == NULL) {
Dec 10, 2003
Dec 10, 2003
331
return;
Jan 20, 2003
Jan 20, 2003
332
333
}
Aug 4, 2003
Aug 4, 2003
334
overlay->hwdata->locked = 0;
Apr 26, 2001
Apr 26, 2001
335
336
}
May 28, 2006
May 28, 2006
337
int
May 29, 2006
May 29, 2006
338
339
ph_DisplayYUVOverlay(_THIS, SDL_Overlay * overlay, SDL_Rect * src,
SDL_Rect * dst)
Apr 26, 2001
Apr 26, 2001
340
{
Jan 20, 2003
Jan 20, 2003
341
342
int rtncode;
PhPoint_t pos;
Aug 4, 2003
Aug 4, 2003
343
344
SDL_Rect backrect;
PhRect_t windowextent;
May 28, 2006
May 28, 2006
345
int winchanged = 0;
Jan 20, 2003
Jan 20, 2003
346
May 28, 2006
May 28, 2006
347
if ((overlay == NULL) || (overlay->hwdata == NULL)) {
Jan 20, 2003
Jan 20, 2003
348
return -1;
Aug 4, 2003
Aug 4, 2003
349
350
}
May 28, 2006
May 28, 2006
351
if (overlay->hwdata->State == OVERLAY_STATE_UNINIT) {
Aug 4, 2003
Aug 4, 2003
352
353
354
return -1;
}
May 29, 2006
May 29, 2006
355
PtGetAbsPosition(window, &pos.x, &pos.y);
May 28, 2006
May 28, 2006
356
357
358
359
360
if ((pos.x != overlay->hwdata->CurrentWindowPos.x) ||
(pos.y != overlay->hwdata->CurrentWindowPos.y)) {
winchanged = 1;
overlay->hwdata->CurrentWindowPos.x = pos.x;
overlay->hwdata->CurrentWindowPos.y = pos.y;
Aug 4, 2003
Aug 4, 2003
361
}
Jan 20, 2003
Jan 20, 2003
362
Aug 4, 2003
Aug 4, 2003
363
/* If CurrentViewPort position/size has been changed, then move/resize the viewport */
Apr 17, 2006
Apr 17, 2006
364
365
366
367
if ((overlay->hwdata->CurrentViewPort.pos.x != dst->x) ||
(overlay->hwdata->CurrentViewPort.pos.y != dst->y) ||
(overlay->hwdata->CurrentViewPort.size.w != dst->w) ||
(overlay->hwdata->CurrentViewPort.size.h != dst->h) ||
May 28, 2006
May 28, 2006
368
369
(overlay->hwdata->scaler_on == 0) || (winchanged == 1) ||
(overlay->hwdata->forcedredraw == 1)) {
Aug 4, 2003
Aug 4, 2003
370
May 28, 2006
May 28, 2006
371
if (overlay->hwdata->ischromakey == 1) {
Aug 4, 2003
Aug 4, 2003
372
/* restore screen behind the overlay/chroma color. */
May 28, 2006
May 28, 2006
373
374
375
376
backrect.x = overlay->hwdata->CurrentViewPort.pos.x;
backrect.y = overlay->hwdata->CurrentViewPort.pos.y;
backrect.w = overlay->hwdata->CurrentViewPort.size.w;
backrect.h = overlay->hwdata->CurrentViewPort.size.h;
May 29, 2006
May 29, 2006
377
this->UpdateRects(this, 1, &backrect);
Aug 4, 2003
Aug 4, 2003
378
379
/* Draw the new rectangle of the chroma color at the viewport position */
May 29, 2006
May 29, 2006
380
381
382
383
PgSetFillColor(overlay->hwdata->chromakey);
PgDrawIRect(dst->x, dst->y, dst->x + dst->w - 1,
dst->y + dst->h - 1, Pg_DRAW_FILL);
PgFlush();
Aug 4, 2003
Aug 4, 2003
384
}
Apr 26, 2001
Apr 26, 2001
385
Jan 20, 2003
Jan 20, 2003
386
387
overlay->hwdata->props.flags |= Pg_SCALER_PROP_SCALER_ENABLE;
overlay->hwdata->scaler_on = 1;
Apr 26, 2001
Apr 26, 2001
388
May 29, 2006
May 29, 2006
389
390
PhWindowQueryVisible(Ph_QUERY_CONSOLE, 0, PtWidgetRid(window),
&windowextent);
May 28, 2006
May 28, 2006
391
392
393
394
overlay->hwdata->CurrentViewPort.pos.x =
pos.x - windowextent.ul.x + dst->x;
overlay->hwdata->CurrentViewPort.pos.y =
pos.y - windowextent.ul.y + dst->y;
Apr 17, 2006
Apr 17, 2006
395
396
overlay->hwdata->CurrentViewPort.size.w = dst->w;
overlay->hwdata->CurrentViewPort.size.h = dst->h;
May 29, 2006
May 29, 2006
397
398
PhAreaToRect(&overlay->hwdata->CurrentViewPort,
&overlay->hwdata->props.viewport);
Apr 17, 2006
Apr 17, 2006
399
400
overlay->hwdata->CurrentViewPort.pos.x = dst->x;
overlay->hwdata->CurrentViewPort.pos.y = dst->y;
Apr 26, 2001
Apr 26, 2001
401
May 28, 2006
May 28, 2006
402
rtncode =
May 29, 2006
May 29, 2006
403
404
PgConfigScalerChannel(overlay->hwdata->channel,
&(overlay->hwdata->props));
Apr 26, 2001
Apr 26, 2001
405
May 28, 2006
May 28, 2006
406
407
switch (rtncode) {
case -1:
May 29, 2006
May 29, 2006
408
409
SDL_SetError("PgConfigScalerChannel() function failed\n");
SDL_FreeYUVOverlay(overlay);
May 28, 2006
May 28, 2006
410
411
return -1;
case 1:
May 29, 2006
May 29, 2006
412
413
414
grab_ptrs2(overlay->hwdata->channel,
overlay->hwdata->FrameData0,
overlay->hwdata->FrameData1);
May 28, 2006
May 28, 2006
415
416
417
418
break;
case 0:
default:
break;
Jan 20, 2003
Jan 20, 2003
419
420
}
}
Apr 26, 2001
Apr 26, 2001
421
Aug 4, 2003
Aug 4, 2003
422
423
424
/*
if (overlay->hwdata->locked==0)
Jan 20, 2003
Jan 20, 2003
425
426
427
428
{
overlay->hwdata->current = PgNextVideoFrame(overlay->hwdata->channel);
if (overlay->hwdata->current == -1)
{
Aug 4, 2003
Aug 4, 2003
429
SDL_SetError("ph_LockYUVOverlay: PgNextFrame() failed, bailing out\n");
Jan 20, 2003
Jan 20, 2003
430
431
432
SDL_FreeYUVOverlay(overlay);
return 0;
}
Aug 4, 2003
Aug 4, 2003
433
Jan 20, 2003
Jan 20, 2003
434
if (overlay->hwdata->current == 0)
Aug 4, 2003
Aug 4, 2003
435
{
Jan 20, 2003
Jan 20, 2003
436
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;
Aug 4, 2003
Aug 4, 2003
437
}
Jan 20, 2003
Jan 20, 2003
438
else
Aug 4, 2003
Aug 4, 2003
439
{
Jan 20, 2003
Jan 20, 2003
440
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData1;
Aug 4, 2003
Aug 4, 2003
441
}
Apr 26, 2001
Apr 26, 2001
442
Jan 20, 2003
Jan 20, 2003
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
if (overlay->planes > 0)
{
overlay->pitches[0] = overlay->hwdata->channel->yplane1->pitch;
overlay->pixels[0] = overlay->hwdata->CurrentFrameData->Y;
}
if (overlay->planes > 1)
{
overlay->pitches[1] = overlay->hwdata->channel->uplane1->pitch;
overlay->pixels[1] = overlay->hwdata->CurrentFrameData->U;
}
if (overlay->planes > 2)
{
overlay->pitches[2] = overlay->hwdata->channel->vplane1->pitch;
overlay->pixels[2] = overlay->hwdata->CurrentFrameData->V;
}
}
Aug 4, 2003
Aug 4, 2003
459
*/
May 28, 2006
May 28, 2006
460
Jan 20, 2003
Jan 20, 2003
461
return 0;
Apr 26, 2001
Apr 26, 2001
462
463
}
May 28, 2006
May 28, 2006
464
void
May 29, 2006
May 29, 2006
465
ph_FreeYUVOverlay(_THIS, SDL_Overlay * overlay)
Apr 26, 2001
Apr 26, 2001
466
{
Aug 4, 2003
Aug 4, 2003
467
468
SDL_Rect backrect;
May 28, 2006
May 28, 2006
469
if (overlay == NULL) {
Jan 20, 2003
Jan 20, 2003
470
return;
Aug 4, 2003
Aug 4, 2003
471
}
Apr 26, 2001
Apr 26, 2001
472
May 28, 2006
May 28, 2006
473
if (overlay->hwdata == NULL) {
Jan 20, 2003
Jan 20, 2003
474
return;
Aug 4, 2003
Aug 4, 2003
475
476
}
May 28, 2006
May 28, 2006
477
current_overlay = NULL;
Aug 4, 2003
Aug 4, 2003
478
479
/* restore screen behind the overlay/chroma color. */
May 28, 2006
May 28, 2006
480
481
482
483
backrect.x = overlay->hwdata->CurrentViewPort.pos.x;
backrect.y = overlay->hwdata->CurrentViewPort.pos.y;
backrect.w = overlay->hwdata->CurrentViewPort.size.w;
backrect.h = overlay->hwdata->CurrentViewPort.size.h;
May 29, 2006
May 29, 2006
484
this->UpdateRects(this, 1, &backrect);
Apr 26, 2001
Apr 26, 2001
485
Jan 20, 2003
Jan 20, 2003
486
487
488
/* it is need for some buggy drivers, that can't hide overlay before */
/* freeing buffer, so we got trash on the srceen */
overlay->hwdata->props.flags &= ~Pg_SCALER_PROP_SCALER_ENABLE;
May 29, 2006
May 29, 2006
489
490
PgConfigScalerChannel(overlay->hwdata->channel,
&(overlay->hwdata->props));
Apr 26, 2001
Apr 26, 2001
491
Jan 20, 2003
Jan 20, 2003
492
493
overlay->hwdata->scaler_on = 0;
overlay->hwdata->State = OVERLAY_STATE_UNINIT;
Apr 26, 2001
Apr 26, 2001
494
May 28, 2006
May 28, 2006
495
if (overlay->hwdata->channel != NULL) {
May 29, 2006
May 29, 2006
496
PgDestroyVideoChannel(overlay->hwdata->channel);
Jan 20, 2003
Jan 20, 2003
497
498
overlay->hwdata->channel = NULL;
return;
May 28, 2006
May 28, 2006
499
500
501
}
overlay->hwdata->CurrentFrameData = NULL;
Apr 26, 2001
Apr 26, 2001
502
May 29, 2006
May 29, 2006
503
504
SDL_free(overlay->hwdata->FrameData0);
SDL_free(overlay->hwdata->FrameData1);
Jan 20, 2003
Jan 20, 2003
505
506
overlay->hwdata->FrameData0 = NULL;
overlay->hwdata->FrameData1 = NULL;
May 29, 2006
May 29, 2006
507
SDL_free(overlay->hwdata);
Apr 26, 2001
Apr 26, 2001
508
}
May 28, 2006
May 28, 2006
509
510
/* vi: set ts=4 sw=4 expandtab: */