1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
unit sdlmpegpanel;
interface
{$IFDEF UNIX}
{$DEFINE CLX}
{$ELSE}
{$DEFINE VCL}
{$ENDIF}
uses
SysUtils,
Classes,
{$IFDEF VCL}
Graphics,
Controls,
Forms,
Dialogs,
ExtCtrls,
{$ENDIF}
{$IFDEF CLX}
Types,
QGraphics,
QControls,
QForms,
QDialogs,
QExtCtrls,
{$ENDIF}
sdl,
smpeg;
type
TSDLMPEGPanel = class( TPanel )
private
{ Private declarations }
FSurface : PSDL_Surface;
FSMPEGHandle : PSMPEG;
FMPEGFile : TFileName;
FMPEGInfo : TSMPEG_Info;
FPlaying : Boolean;
FSound : Integer;
function GetSound : Boolean;
procedure SetSound( const Value : Boolean );
protected
{ Protected declarations }
public
{ Public declarations }
procedure Play;
procedure Stop;
procedure Pause;
published
{ Published declarations }
property MPEGFile : TFileName read FMPEGFile write FMPEGFile;
property Sound : Boolean read GetSound write SetSound;
end;
procedure Register;
implementation
{$IFDEF CLX}
uses
Libc,
Qt;
{$ENDIF}
procedure TSDLMPEGPanel.Play;
var
EnvVal : string;
begin
if FPlaying then
Exit;
FPlaying := True;
if SDL_getenv( 'SDL_WINDOWID' ) = '' then
begin
{$IFDEF VCL}
SDL_putenv( 'SDL_VIDEODRIVER=windib' );
EnvVal := 'SDL_WINDOWID=' + inttostr( Integer( Handle ) );
{$ENDIF}
{$IFDEF CLX}
EnvVal := 'SDL_WINDOWID=' + inttostr( QWidget_WinId( ChildHandle ) );
{$ENDIF}
SDL_putenv( PChar( EnvVal ) );
end;
if SDL_getenv( 'SDL_VIDEO_YUV_HWACCEL' ) = '' then
SDL_putenv( 'SDL_VIDEO_YUV_HWACCEL=0' );
if SDL_Init( SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE ) < 0 then
raise Exception.Create( 'SDL_Init failed' );
{$IFDEF VCL}
FSurface := SDL_SetVideoMode( Width, Height, 16, SDL_SWSURFACE );
{$ENDIF}
{$IFDEF CLX}
FSurface := SDL_SetVideoMode( Width, Height, QPixmap_depth( Bitmap.Handle ), SDL_SWSURFACE );
{$ENDIF}
if FSurface = nil then
raise Exception.Create( 'SDL_SetVideoMode failed' );
FSMPEGHandle := SMPEG_new( PChar( FMPEGFile ), @FMPEGInfo, FSound );
if FSMPEGHandle = nil then
raise Exception.Create( 'Cannot create MPEG stream' );
if FSound = 0 then
SMPEG_enableaudio( FSMPEGHandle, 0 );
SMPEG_scaleXY( FSMPEGHandle, Width, Height );
SMPEG_setdisplay( FSMPEGHandle, FSurface, nil, nil );
SMPEG_play( FSMPEGHandle );
end;
procedure TSDLMPEGPanel.Stop;
begin
if not FPlaying then
Exit;
FPlaying := False;
SMPEG_stop( FSMPEGHandle );
SMPEG_delete( FSMPEGHandle );
SDL_Quit;
end;
procedure TSDLMPEGPanel.Pause;
begin
if FPlaying then
SMPEG_pause( FSMPEGHandle );
end;
function TSDLMPEGPanel.GetSound : Boolean;
begin
Result := Boolean( FSound );
end;
procedure TSDLMPEGPanel.SetSound( const Value : Boolean );
begin
FSound := Integer( Value );
end;
procedure Register;
begin
RegisterComponents( 'SDL', [ TSDLMPEGPanel ] );
end;
end.
|