Skip to content

Commit 06202e9

Browse files
Merge pull request #314 from nbirkbeck/unit-tests3
Adding unit tests for spherical metadata injection.
2 parents 642ec17 + ac4765b commit 06202e9

File tree

5 files changed

+130
-3
lines changed

5 files changed

+130
-3
lines changed

data/testsrc_320x240_h264.mp4

3.51 KB
Binary file not shown.

data/testsrc_320x240_vp9.mp4

6.09 KB
Binary file not shown.

data/testsrc_32x24_prores.mov

2.04 KB
Binary file not shown.

spatialmedia/__main__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def console(contents):
3434
print(contents)
3535

3636

37-
def main():
37+
def main(main_args):
3838
"""Main function for printing and injecting spatial media metadata."""
3939

4040
parser = argparse.ArgumentParser(
@@ -90,7 +90,7 @@ def main():
9090
"ordering and SN3D normalization")
9191
parser.add_argument("file", nargs="+", help="input/output files")
9292

93-
args = parser.parse_args()
93+
args = parser.parse_args(main_args)
9494

9595
if args.inject:
9696
if len(args.file) != 2:
@@ -141,4 +141,4 @@ def main():
141141

142142

143143
if __name__ == "__main__":
144-
main()
144+
main(sys.argv[1:])

spatialmedia_test.py

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
"""
2+
Unit tests for the spatialmedia CLI tool.
3+
4+
# Test inputs are generated with
5+
ffmpeg -y -f lavfi -i testsrc -vf scale=320:240 -vcodec libx264 -t 0.05 data/testsrc_320x240_h264.mp4
6+
ffmpeg -y -f lavfi -i testsrc -vf scale=320:240 -vcodec libvpx-vp9 -t 0.05 data/testsrc_320x240_vp9.mp4
7+
ffmpeg -y -f lavfi -i testsrc -vf scale=32:24 -vcodec prores -t 0.05 data/testsrc_32x24_prores.mov
8+
9+
"""
10+
import unittest
11+
import os
12+
13+
from spatialmedia.__main__ import main
14+
from spatialmedia import metadata_utils
15+
16+
_OUTPUT_DIR = 'test_output'
17+
18+
def append_contents(contents):
19+
def append(x):
20+
contents = contents + x
21+
return append
22+
23+
class TestAdd(unittest.TestCase):
24+
25+
def inject_metadata(self, args):
26+
self.assertIsNone(main(args))
27+
28+
contents = []
29+
metadata_utils.parse_metadata(args[-1],
30+
lambda x: contents.append(x))
31+
try:
32+
os.remove(args[-1])
33+
except:
34+
return ''
35+
return '\n'.join(contents[2:])
36+
37+
def test_inject_v1_equirect_mono(self):
38+
contents = self.inject_metadata(['-i',
39+
'--projection', 'equirectangular',
40+
'data/testsrc_320x240_h264.mp4',
41+
f'{_OUTPUT_DIR}/equirect_mono_v1.mp4'])
42+
43+
self.assertFalse(contents.find('SV3D') >= 0)
44+
self.assertFalse(contents.find('PRHD') >= 0)
45+
self.assertFalse(contents.find('EQUI') >= 0)
46+
self.assertFalse(contents.find('ST3D') >= 0)
47+
self.assertTrue(contents.find("ProjectionType = equirectangular") > 0)
48+
49+
def test_inject_v1_rectangular_left_right(self):
50+
contents = self.inject_metadata(['-i',
51+
'--stereo', 'left-right',
52+
'--projection', 'none',
53+
'data/testsrc_320x240_h264.mp4',
54+
f'{_OUTPUT_DIR}/rectangular_left_right_v1.mp4'])
55+
56+
self.assertFalse(contents.find('SV3D') >= 0)
57+
self.assertFalse(contents.find('PRHD') >= 0)
58+
self.assertFalse(contents.find('EQUI') >= 0)
59+
self.assertFalse(contents.find('ST3D') >= 0)
60+
self.assertFalse(contents.find("ProjectionType = equirectangular") > 0)
61+
self.assertTrue(contents.find("ProjectionType = rectangular") > 0)
62+
self.assertTrue(contents.find("Spherical = false") > 0)
63+
64+
def test_inject_v2_equirect_mono(self):
65+
contents = self.inject_metadata(['-i',
66+
'--v2', '--projection', 'equirectangular',
67+
'data/testsrc_320x240_h264.mp4',
68+
f'{_OUTPUT_DIR}/equirect_mono.mp4'])
69+
self.assertTrue(contents.find('SV3D') >= 0)
70+
self.assertTrue(contents.find('PRHD') >= 0)
71+
self.assertTrue(contents.find('EQUI') >= 0)
72+
self.assertFalse(contents.find('ST3D') >= 0)
73+
74+
def test_inject_v2_equirect_mono_vp9(self):
75+
contents = self.inject_metadata(['-i',
76+
'--v2', '--projection', 'equirectangular',
77+
'data/testsrc_320x240_vp9.mp4',
78+
f'{_OUTPUT_DIR}/equirect_mono_vp9.mp4'])
79+
80+
self.assertTrue(contents.find('SV3D') >= 0)
81+
self.assertTrue(contents.find('PRHD') >= 0)
82+
self.assertTrue(contents.find('EQUI') >= 0)
83+
self.assertFalse(contents.find('ST3D') >= 0)
84+
85+
def test_inject_v2_equirect_mono_prores(self):
86+
contents = self.inject_metadata(['-i',
87+
'--v2', '--projection', 'equirectangular',
88+
'data/testsrc_32x24_prores.mov',
89+
f'{_OUTPUT_DIR}/equirect_mono_prores.mov'])
90+
self.assertTrue(contents.find('SV3D') >= 0)
91+
self.assertTrue(contents.find('PRHD') >= 0)
92+
self.assertTrue(contents.find('EQUI') >= 0)
93+
self.assertFalse(contents.find('ST3D') >= 0)
94+
95+
96+
def test_inject_v2_rectangular_left_right(self):
97+
contents = self.inject_metadata(['-i',
98+
'--v2', '--stereo', 'left-right',
99+
'--projection', 'none',
100+
'data/testsrc_320x240_h264.mp4',
101+
f'{_OUTPUT_DIR}/rectangular_left_right.mp4'])
102+
self.assertFalse(contents.find('SV3D') >= 0)
103+
self.assertFalse(contents.find('PRHD') >= 0)
104+
self.assertFalse(contents.find('EQUI') >= 0)
105+
self.assertTrue(contents.find('ST3D') >= 0)
106+
self.assertTrue(contents.find('Stereo Mode: 2') >= 0)
107+
108+
def test_inject_v2_rectangular_top_bottom(self):
109+
contents = self.inject_metadata(['-i',
110+
'--v2', '--stereo', 'top-bottom',
111+
'--projection', 'none',
112+
'data/testsrc_320x240_h264.mp4',
113+
f'{_OUTPUT_DIR}/rectangular_top_bottom.mp4'])
114+
115+
self.assertFalse(contents.find('SV3D') >= 0)
116+
self.assertFalse(contents.find('PRHD') >= 0)
117+
self.assertFalse(contents.find('EQUI') >= 0)
118+
self.assertTrue(contents.find('ST3D') >= 0)
119+
self.assertTrue(contents.find('Stereo Mode: 1') >= 0)
120+
121+
122+
if __name__ == '__main__':
123+
try:
124+
os.mkdir('test_output')
125+
except:
126+
pass
127+
unittest.main()

0 commit comments

Comments
 (0)