forked from harrisonpartch/spasim
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFilmLoop.Mod
More file actions
executable file
·118 lines (108 loc) · 2.44 KB
/
FilmLoop.Mod
File metadata and controls
executable file
·118 lines (108 loc) · 2.44 KB
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
MODULE FilmLoop;
IMPORT MPEG, Kernel, Codec := Codecs, Raster, Base, Files, Strings, Objects, Out:=KernelLog;
TYPE Name=Base.Name;
TYPE floop*=OBJECT(Base.V);
VAR
alive:BOOLEAN;
demux: MPEG.Demuxer;
decoder: MPEG.Decoder;
file: Files.File;
fileinputstream: Codec.FileInputStream;
vstream: Codec.DemuxStream;
result: LONGINT;
filename:Name;
W*,H*,ms:LONGINT;
img: Raster.Image;
mode: Raster.Mode;
go:BOOLEAN;
PROCEDURE&init*(fname:Name);
BEGIN
filename:=fname;
file := Files.Old(filename);
IF file = NIL THEN
Out.String("Couldn't open File "); Out.String(filename);
Out.Ln()
ELSE
alive:=TRUE
END;
register
END init;
PROCEDURE stop*;
BEGIN
alive:=FALSE
END stop;
PROCEDURE shade*(VAR x,y: REAL; VAR c:Base.Color);
VAR
w,h:LONGINT;
red,green,blue,alpha:LONGINT;
pix: Raster.Pixel;
BEGIN
IF alive THEN
w:= ENTIER(x*img.width) MOD img.width;
y:=1-y;
h:= ENTIER(y*img.height) MOD img.height;
Raster.Get(img,w,h, pix, mode);
Raster.GetRGBA(pix,red,green,blue,alpha);
c.red:=red/256;
c.green:=green/256;
c.blue:=blue/256
END
END shade;
PROCEDURE tick*;
BEGIN{EXCLUSIVE}
go:=TRUE
END tick;
VAR
timer: Kernel.Timer
BEGIN{ACTIVE, PRIORITY(Objects.Low)}
IF alive THEN
Raster.InitMode(mode, Raster.srcCopy);
NEW(timer);
NEW(fileinputstream, file, 0);
NEW(demux);
demux.Open(fileinputstream, result);
IF result # Codec.ResOk THEN
Out.String("error opening the demultiplexer"); Out.Ln;
ELSE
vstream := demux.GetStream(0);
NEW(decoder);
decoder.Open(vstream, result);
ASSERT(result=Codec.ResOk);
decoder.GetVideoInfo(W,H,ms);
NEW(img);
Raster.Create(img,W,H,Raster.BGR888);
Out.Int(W,6); Out.Ln;
Out.Int(H,6); Out.Ln;
REPEAT
REPEAT
BEGIN{EXCLUSIVE}
AWAIT(go);
go:=FALSE
END;
IF ~decoder.loop THEN
decoder.Next();
decoder.Render(img)
END
UNTIL decoder.loop;
decoder.loop:=FALSE;
file := Files.Old(filename);
IF file = NIL THEN
Out.String("Couldn't open File "); Out.String(filename);
Out.Ln();
file := Files.New(filename);
alive:=FALSE;
END;
NEW(fileinputstream, file, 0);
NEW(demux);
demux.Open(fileinputstream, result);
ASSERT(result=Codec.ResOk);
vstream := demux.GetStream(0);
NEW(decoder);
decoder.Open(vstream, result);
ASSERT(result=Codec.ResOk);
decoder.GetVideoInfo(W,H,ms);
UNTIL ~alive;
END
END
END floop;
END FilmLoop.