Skip to content

Latest commit

 

History

History
503 lines (419 loc) · 15.2 KB

SDL_phyuv.c

File metadata and controls

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