Skip to content

Commit 9f07fa5

Browse files
committed
added some testing for video assembly
1 parent db1d797 commit 9f07fa5

File tree

6 files changed

+179
-19
lines changed

6 files changed

+179
-19
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@
55
*.svg
66
*.data
77
*.old
8-
/output
8+
/output
9+
/.vscode
10+
*.mp4

default.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
image_width = 1920
22
image_height = 1080
3-
frames = 50
4-
export = "kfb"
3+
frames = 9999
4+
export = "colour"
55
rotate = 0
6-
glitch_tolerance = 0.000001
6+
glitch_tolerance = 0.000001
7+
approximation_order = "32"

segments.txt

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
file 'segment_00000078.mp4'
2+
file 'segment_00000077.mp4'
3+
file 'segment_00000076.mp4'
4+
file 'segment_00000075.mp4'
5+
file 'segment_00000074.mp4'
6+
file 'segment_00000073.mp4'
7+
file 'segment_00000072.mp4'
8+
file 'segment_00000071.mp4'
9+
file 'segment_00000070.mp4'
10+
file 'segment_00000069.mp4'
11+
file 'segment_00000068.mp4'
12+
file 'segment_00000067.mp4'
13+
file 'segment_00000066.mp4'
14+
file 'segment_00000065.mp4'
15+
file 'segment_00000064.mp4'
16+
file 'segment_00000063.mp4'
17+
file 'segment_00000062.mp4'
18+
file 'segment_00000061.mp4'
19+
file 'segment_00000060.mp4'
20+
file 'segment_00000059.mp4'
21+
file 'segment_00000058.mp4'
22+
file 'segment_00000057.mp4'
23+
file 'segment_00000056.mp4'
24+
file 'segment_00000055.mp4'
25+
file 'segment_00000054.mp4'
26+
file 'segment_00000053.mp4'
27+
file 'segment_00000052.mp4'
28+
file 'segment_00000051.mp4'
29+
file 'segment_00000050.mp4'
30+
file 'segment_00000049.mp4'
31+
file 'segment_00000048.mp4'
32+
file 'segment_00000047.mp4'
33+
file 'segment_00000046.mp4'
34+
file 'segment_00000045.mp4'
35+
file 'segment_00000044.mp4'
36+
file 'segment_00000043.mp4'
37+
file 'segment_00000042.mp4'
38+
file 'segment_00000041.mp4'
39+
file 'segment_00000040.mp4'
40+
file 'segment_00000039.mp4'
41+
file 'segment_00000038.mp4'
42+
file 'segment_00000037.mp4'
43+
file 'segment_00000036.mp4'
44+
file 'segment_00000035.mp4'
45+
file 'segment_00000034.mp4'
46+
file 'segment_00000033.mp4'
47+
file 'segment_00000032.mp4'
48+
file 'segment_00000031.mp4'
49+
file 'segment_00000030.mp4'
50+
file 'segment_00000029.mp4'
51+
file 'segment_00000028.mp4'
52+
file 'segment_00000027.mp4'
53+
file 'segment_00000026.mp4'
54+
file 'segment_00000025.mp4'
55+
file 'segment_00000024.mp4'
56+
file 'segment_00000023.mp4'
57+
file 'segment_00000022.mp4'
58+
file 'segment_00000021.mp4'
59+
file 'segment_00000020.mp4'
60+
file 'segment_00000019.mp4'
61+
file 'segment_00000018.mp4'
62+
file 'segment_00000017.mp4'
63+
file 'segment_00000016.mp4'
64+
file 'segment_00000015.mp4'
65+
file 'segment_00000014.mp4'
66+
file 'segment_00000013.mp4'
67+
file 'segment_00000012.mp4'
68+
file 'segment_00000011.mp4'
69+
file 'segment_00000010.mp4'
70+
file 'segment_00000009.mp4'
71+
file 'segment_00000008.mp4'
72+
file 'segment_00000007.mp4'
73+
file 'segment_00000006.mp4'
74+
file 'segment_00000005.mp4'
75+
file 'segment_00000004.mp4'
76+
file 'segment_00000003.mp4'
77+
file 'segment_00000002.mp4'
78+
file 'segment_00000001.mp4'
79+
file 'segment_00000000.mp4'

src/util/data_export.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ impl DataExport {
190190
}
191191

192192
fn save_colour(&mut self, filename: &str) {
193-
image::save_buffer(filename.to_owned() + ".jpg", &self.rgb, self.image_width as u32, self.image_height as u32, image::ColorType::Rgb8).unwrap();
193+
image::save_buffer(filename.to_owned() + ".png", &self.rgb, self.image_width as u32, self.image_height as u32, image::ColorType::Rgb8).unwrap();
194194
}
195195

196196
fn save_raw(&mut self, filename: &str) {
@@ -211,27 +211,20 @@ impl DataExport {
211211

212212
file.write_all(b"KFB").unwrap();
213213

214-
let test1 = [self.image_width as u32];
215-
let test2 = [self.image_height as u32];
216-
217-
// iteration division??
218-
let test3 = [1u32];
214+
let test1 = [self.image_width as u32, self.image_height as u32];
219215

220216
// Colours in colourmap
221217
let test5 = DataExport::generate_colour_palette();
222218

223-
// Number of colours in colourmap
224-
let test4 = [test5.len() as u32];
219+
// iteration division??
220+
let test3 = [1u32, test5.len() as u32];
225221

226222
// Maxmimum iteration
227223
let test6 = [maximum_iteration as u32];
228224

229225
file.write_all(unsafe {
230226
slice::from_raw_parts(test1.as_ptr() as *const u8, 4)
231227
}).unwrap();
232-
file.write_all(unsafe {
233-
slice::from_raw_parts(test2.as_ptr() as *const u8, 4)
234-
}).unwrap();
235228

236229
file.write_all(unsafe {
237230
slice::from_raw_parts(self.iterations.as_ptr() as *const u8, self.iterations.len() * 4)
@@ -241,10 +234,6 @@ impl DataExport {
241234
slice::from_raw_parts(test3.as_ptr() as *const u8, 4)
242235
}).unwrap();
243236

244-
file.write_all(unsafe {
245-
slice::from_raw_parts(test4.as_ptr() as *const u8, 4)
246-
}).unwrap();
247-
248237
file.write_all(unsafe {
249238
slice::from_raw_parts(test5.as_ptr() as *const u8, 3 * test5.len())
250239
}).unwrap();

test.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import os
2+
3+
os.system("ffmpeg -y -f concat -safe 0 -i segments.txt -c copy output.mp4")

test2.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import imageio
2+
import numpy as np
3+
import time
4+
import os
5+
6+
from PIL import Image
7+
8+
frames_between_keyframes = 60
9+
maximum_keyframe_number = 783
10+
zoom_scale = 2
11+
12+
# Arguments for ffmpeg
13+
kargs = {
14+
'macro_block_size': 8,
15+
'fps': 60,
16+
'format': 'FFMPEG',
17+
'quality': 5
18+
}
19+
20+
t0 = time.time()
21+
22+
segment = 0
23+
segment_names = []
24+
25+
framebuffer = []
26+
27+
writer = imageio.get_writer(f"segment_{segment:08}.mp4", **kargs)
28+
segment_names.append(f"segment_{segment:08}.mp4")
29+
30+
# We start with the previous image, this is modified
31+
previous_keyframe = Image.open(f"output/output_00000000.png")
32+
33+
(width, height) = (previous_keyframe.width, previous_keyframe.height)
34+
(scaled_width, scaled_height) = (zoom_scale * width, zoom_scale * height)
35+
placement_box = (scaled_width//4, scaled_height//4, scaled_width//4 * 3, scaled_height//4 * 3)
36+
37+
for i in range(0, maximum_keyframe_number):
38+
# Creates 10 second segments
39+
if (i * frames_between_keyframes) % 600 == 0 and i != 0:
40+
for frame in reversed(framebuffer):
41+
writer.append_data(frame)
42+
segment += 1
43+
framebuffer = []
44+
# Writer for adding frames to the video
45+
writer = imageio.get_writer(f"segment_{segment:08}.mp4", **kargs)
46+
segment_names.append(f"segment_{segment:08}.mp4")
47+
48+
next_keyframe = Image.open(f"output/output_{i + 1:08}.png")
49+
50+
scaled_keyframe = next_keyframe.resize((scaled_width, scaled_height), resample=Image.LANCZOS)
51+
52+
scaled_keyframe.paste(previous_keyframe, placement_box)
53+
54+
for j in range(0, frames_between_keyframes):
55+
zoom = zoom_scale**(1.0 - j / frames_between_keyframes)
56+
57+
temp1 = (1.0 - 1.0 / zoom) * width
58+
temp2 = (1.0 - 1.0 / zoom) * height
59+
temp3 = scaled_width - temp1
60+
temp4 = scaled_height - temp2
61+
62+
next_frame = scaled_keyframe.crop((temp1, temp2, temp3, temp4)).resize((width, height), resample=Image.HAMMING)
63+
64+
framebuffer.append(np.array(next_frame))
65+
print(f"{i * frames_between_keyframes + j + 1}/{maximum_keyframe_number * frames_between_keyframes + 1} {time.time() - t0:.2f}s")
66+
67+
previous_keyframe = scaled_keyframe.resize((width, height), resample=Image.LANCZOS)
68+
69+
70+
framebuffer.append(np.array(previous_keyframe))
71+
72+
print(f"{maximum_keyframe_number * frames_between_keyframes + 1}/{maximum_keyframe_number * frames_between_keyframes + 1} {time.time() - t0:.2f}s")
73+
74+
for frame in reversed(framebuffer):
75+
writer.append_data(frame)
76+
77+
# Command to split up into
78+
# ffmpeg -i invid.mp4 -threads 3 -vcodec copy -f segment -segment_time 2 cam_out_h264%04d.mp4
79+
80+
with open('segments.txt', 'w') as f:
81+
for segment in reversed(segment_names):
82+
f.write(f"file '{segment}'\n")
83+
84+
writer.close()
85+
86+
os.system("ffmpeg -y -f concat -safe 0 -i segments.txt -c copy output.mp4")

0 commit comments

Comments
 (0)