Uses 2002K of libraries. Compilation Failed (7899L/56K).
1 | !7 |
2 | |
3 | import org.jcodec.api.awt.AWTSequenceEncoder8Bit; |
4 | |
5 | static int framesToEncode = 100000; |
6 | |
7 | p {
|
8 | inputFilePath("Video to modify", voidfunc(final File video) {
|
9 | thread {
|
10 | invertVideo(video); |
11 | } |
12 | }); |
13 | } |
14 | |
15 | svoid invertVideo(File video) {
|
16 | File outFile = prepareProgramFile(addSuffix("inverted-" + video.getName(), ".mp4"));
|
17 | |
18 | final LeftQueue lq = new LeftQueue(video); |
19 | final RightQueue rq = new RightQueue(outFile); |
20 | lq.rightQueue = rq; |
21 | |
22 | stepThreads(1, lq, rq); |
23 | } |
24 | |
25 | svoid stepThreads(final int interval, Steppable... engines) {
|
26 | final EngineGroup group = new EngineGroup(asList(engines)); |
27 | |
28 | new L<Thread> threads; |
29 | for (final Steppable s : engines) {
|
30 | Thread thread = new Thread("Stepper Thread") {
|
31 | public void run() ctex {
|
32 | s.step(); |
33 | while licensed {
|
34 | while (s.shouldStep) {
|
35 | s.shouldStep = false; |
36 | s.step(); |
37 | } |
38 | synchronized(s) { s.wait(interval); }
|
39 | } |
40 | } |
41 | }; |
42 | s.thread = thread; |
43 | threads.add(thread); |
44 | } |
45 | for (Thread t : threads) t.start(); |
46 | } |
47 | |
48 | sclass EngineGroup {
|
49 | L<Steppable> engines; |
50 | |
51 | *(L<Steppable> *engines) {
|
52 | for (Steppable engine : engines) |
53 | engine.group = this; |
54 | } |
55 | |
56 | void shouldStep {
|
57 | for (Steppable engine : engines) |
58 | engine.shouldStepLocally(); |
59 | } |
60 | } |
61 | |
62 | abstract sclass Steppable {
|
63 | volatile bool shouldStep; |
64 | Thread thread; |
65 | EngineGroup group; |
66 | |
67 | void shouldStep() {
|
68 | if (group != null) |
69 | group.shouldStep(); |
70 | else |
71 | shouldStepLocally(); |
72 | } |
73 | |
74 | void shouldStepLocally {
|
75 | shouldStep = true; |
76 | synchronized(this) { notifyAll(); }
|
77 | } |
78 | |
79 | abstract void step(); |
80 | } |
81 | |
82 | // decoding part |
83 | Steppable > LeftQueue {
|
84 | Iterator<BufferedImage> stream; |
85 | RightQueue rightQueue; |
86 | |
87 | *(File video) {
|
88 | stream = framesFromVideo_reordering(video); |
89 | } |
90 | |
91 | void step {
|
92 | if (stream != null && rightQueue.needImage()) |
93 | if (stream.hasNext()) {
|
94 | rightQueue.receive(stream.next()); |
95 | shouldStep(); |
96 | } else {
|
97 | stream = null; |
98 | rightQueue.close(); |
99 | } |
100 | } |
101 | } |
102 | |
103 | // encoding part |
104 | Steppable > RightQueue {
|
105 | File outMP4; |
106 | AWTSequenceEncoder8Bit enc; |
107 | volatile BufferedImage img; |
108 | int frames; |
109 | volatile bool shouldClose; |
110 | |
111 | *(File *outMP4) ctex {
|
112 | enc = AWTSequenceEncoder8Bit.create25Fps(outMP4); |
113 | enc.getEncoder().setKeyInterval(25); |
114 | } |
115 | |
116 | void receive(BufferedImage img) {
|
117 | if (this.img != null) fail(); |
118 | this.img = img; |
119 | shouldStep(); |
120 | } |
121 | |
122 | bool needImage() { ret enc != null && img == null; }
|
123 | |
124 | void step ctex {
|
125 | if (shouldClose) {
|
126 | shouldClose = false; |
127 | close(); |
128 | } |
129 | |
130 | if (img != null && enc != null) {
|
131 | img = invertedImage(img); |
132 | enc.encodeImage(img); |
133 | img = null; |
134 | ++frames; |
135 | print("Frames: " + frames + "/" + framesToEncode);
|
136 | if (frames >= framesToEncode) shouldClose = true; |
137 | else shouldStep(); |
138 | } |
139 | } |
140 | |
141 | void close ctex {
|
142 | if (enc != null) {
|
143 | enc.finish(); |
144 | enc = null; |
145 | print("Wrote " + f2s(outMP4) + " (" + frames + " frames)");
|
146 | } |
147 | } |
148 | } |
Began life as a copy of #1006825
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1006827 |
| Snippet name: | Invert video (output to .mp4), use 2 threads [seems to work] |
| Eternal ID of this version: | #1006827/21 |
| Text MD5: | 0507aa2ada4df98137f8d06598464089 |
| Transpilation MD5: | 6983705742f29aec88d6a65105762a1d |
| Author: | stefan |
| Category: | javax video |
| Type: | JavaX source code |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2017-02-05 06:42:59 |
| Source code size: | 3209 bytes / 148 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 741 / 875 |
| Version history: | 20 change(s) |
| Referenced in: | [show references] |