summaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2016-05-16 21:55:52 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2016-05-19 16:55:07 +0300
commit62f0b16f639a9ecb116a79819655bdf44e269443 (patch)
treef66dc07c616b3f387f3ec941537e840fce261322 /data
Initial commit
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'data')
-rw-r--r--data/Makefile12
-rw-r--r--data/frames/.gitignore1
-rw-r--r--data/frames/Makefile9
-rw-r--r--data/frames/frame-reference-1024x768.rgb.gzbin0 -> 21213 bytes
-rw-r--r--data/frames/frame-reference-1024x768.yuv.gzbin0 -> 12518 bytes
-rw-r--r--data/frames/frame-reference-640x480.rgb.gzbin0 -> 9581 bytes
-rw-r--r--data/frames/frame-reference-640x480.yuv.gzbin0 -> 7016 bytes
-rw-r--r--data/frames/frame-scaled-1024x768.rgb.gzbin0 -> 63035 bytes
-rw-r--r--data/frames/frame-scaled-1024x768.yuv.gzbin0 -> 51094 bytes
-rw-r--r--data/frames/frame-scaled-640x480.rgb.gzbin0 -> 16703 bytes
-rw-r--r--data/frames/frame-scaled-640x480.yuv.gzbin0 -> 13513 bytes
-rwxr-xr-xdata/frames/gen-frames.py350
12 files changed, 372 insertions, 0 deletions
diff --git a/data/Makefile b/data/Makefile
new file mode 100644
index 0000000..768a346
--- /dev/null
+++ b/data/Makefile
@@ -0,0 +1,12 @@
+SUBDIRS=frames
+
+recursive=all clean install
+
+all:
+
+$(recursive):
+ @target=$@ ; \
+ for subdir in $(SUBDIRS); do \
+ echo "Making $$target in $$subdir" ; \
+ $(MAKE) -C $$subdir $$target; \
+ done
diff --git a/data/frames/.gitignore b/data/frames/.gitignore
new file mode 100644
index 0000000..a8a0dce
--- /dev/null
+++ b/data/frames/.gitignore
@@ -0,0 +1 @@
+*.bin
diff --git a/data/frames/Makefile b/data/frames/Makefile
new file mode 100644
index 0000000..326e447
--- /dev/null
+++ b/data/frames/Makefile
@@ -0,0 +1,9 @@
+all:
+ @./gen-frames.py
+
+clean:
+ @rm *.bin
+
+install:
+ mkdir -p $(INSTALL_DIR)/frames/
+ cp frame-reference-*.bin $(INSTALL_DIR)/frames/
diff --git a/data/frames/frame-reference-1024x768.rgb.gz b/data/frames/frame-reference-1024x768.rgb.gz
new file mode 100644
index 0000000..480239c
--- /dev/null
+++ b/data/frames/frame-reference-1024x768.rgb.gz
Binary files differ
diff --git a/data/frames/frame-reference-1024x768.yuv.gz b/data/frames/frame-reference-1024x768.yuv.gz
new file mode 100644
index 0000000..55d3e7a
--- /dev/null
+++ b/data/frames/frame-reference-1024x768.yuv.gz
Binary files differ
diff --git a/data/frames/frame-reference-640x480.rgb.gz b/data/frames/frame-reference-640x480.rgb.gz
new file mode 100644
index 0000000..7c5bd16
--- /dev/null
+++ b/data/frames/frame-reference-640x480.rgb.gz
Binary files differ
diff --git a/data/frames/frame-reference-640x480.yuv.gz b/data/frames/frame-reference-640x480.yuv.gz
new file mode 100644
index 0000000..3f27be3
--- /dev/null
+++ b/data/frames/frame-reference-640x480.yuv.gz
Binary files differ
diff --git a/data/frames/frame-scaled-1024x768.rgb.gz b/data/frames/frame-scaled-1024x768.rgb.gz
new file mode 100644
index 0000000..fba101d
--- /dev/null
+++ b/data/frames/frame-scaled-1024x768.rgb.gz
Binary files differ
diff --git a/data/frames/frame-scaled-1024x768.yuv.gz b/data/frames/frame-scaled-1024x768.yuv.gz
new file mode 100644
index 0000000..d3c3aae
--- /dev/null
+++ b/data/frames/frame-scaled-1024x768.yuv.gz
Binary files differ
diff --git a/data/frames/frame-scaled-640x480.rgb.gz b/data/frames/frame-scaled-640x480.rgb.gz
new file mode 100644
index 0000000..08c1be8
--- /dev/null
+++ b/data/frames/frame-scaled-640x480.rgb.gz
Binary files differ
diff --git a/data/frames/frame-scaled-640x480.yuv.gz b/data/frames/frame-scaled-640x480.yuv.gz
new file mode 100644
index 0000000..821919f
--- /dev/null
+++ b/data/frames/frame-scaled-640x480.yuv.gz
Binary files differ
diff --git a/data/frames/gen-frames.py b/data/frames/gen-frames.py
new file mode 100755
index 0000000..4742793
--- /dev/null
+++ b/data/frames/gen-frames.py
@@ -0,0 +1,350 @@
+#!/usr/bin/python
+
+import copy
+import glob
+import gzip
+import itertools
+import operator
+import re
+import struct
+import sys
+
+class FormatRGB:
+ def __init__(self, name, mapping):
+ self.name = name
+ self.mapping = copy.copy(mapping)
+ self.depth = sum(v[1] for v in mapping.values())
+
+ if self.mapping.has_key('a'):
+ self.alpha_bits = self.mapping['a'][1]
+ elif self.mapping.has_key('x'):
+ self.alpha_bits = self.mapping['x'][1]
+ else:
+ self.alpha_bits = 0
+
+ def alpha(self, alpha):
+ if self.mapping.has_key('a'):
+ return (alpha >> (8 - self.mapping['a'][1])) << self.mapping['a'][0]
+ elif self.mapping.has_key('x'):
+ return (alpha >> (8 - self.mapping['x'][1])) << self.mapping['x'][0]
+ else:
+ return 0
+
+ def generate_8(self, width, height, rgb):
+ output = []
+ for i in xrange(width * height):
+ r, g, b = rgb[i]
+ pixel = ((r >> (8 - self.mapping['r'][1])) << self.mapping['r'][0]) \
+ | ((g >> (8 - self.mapping['g'][1])) << self.mapping['g'][0]) \
+ | ((b >> (8 - self.mapping['b'][1])) << self.mapping['b'][0])
+ output.append(struct.pack('B', pixel))
+ return ''.join(output)
+
+ def generate_16(self, width, height, rgb, alpha):
+ output = []
+ for i in xrange(width * height):
+ r, g, b = rgb[i]
+ pixel = ((r >> (8 - self.mapping['r'][1])) << self.mapping['r'][0]) \
+ | ((g >> (8 - self.mapping['g'][1])) << self.mapping['g'][0]) \
+ | ((b >> (8 - self.mapping['b'][1])) << self.mapping['b'][0]) \
+ | self.alpha(alpha)
+ output.append(struct.pack('<H', pixel))
+ return ''.join(output)
+
+ def generate_24(self, width, height, rgb):
+ output = []
+ for i in xrange(width * height):
+ r, g, b = rgb[i]
+ pixel = ((r >> (8 - self.mapping['r'][1])) << self.mapping['r'][0]) \
+ | ((g >> (8 - self.mapping['g'][1])) << self.mapping['g'][0]) \
+ | ((b >> (8 - self.mapping['b'][1])) << self.mapping['b'][0])
+ output.append(struct.pack('<I', pixel)[0:3])
+ return ''.join(output)
+
+ def generate_32(self, width, height, rgb, alpha):
+ output = []
+ for i in xrange(width * height):
+ r, g, b = rgb[i]
+ pixel = ((r >> (8 - self.mapping['r'][1])) << self.mapping['r'][0]) \
+ | ((g >> (8 - self.mapping['g'][1])) << self.mapping['g'][0]) \
+ | ((b >> (8 - self.mapping['b'][1])) << self.mapping['b'][0]) \
+ | self.alpha(alpha)
+ output.append(struct.pack('<I', pixel))
+ return ''.join(output)
+
+ def convert(self, width, height, rgb, alpha):
+ if self.depth == 8:
+ return self.generate_8(width, height, rgb)
+ elif self.depth == 16:
+ return self.generate_16(width, height, rgb, alpha)
+ elif self.depth == 24:
+ return self.generate_24(width, height, rgb)
+ elif self.depth == 32:
+ return self.generate_32(width, height, rgb, alpha)
+ else:
+ raise RuntimeError, 'Invalid depth %s' % self.depth
+
+ def bin(self, bins, val):
+ bins[val >> 2] += 1
+
+ def histogram(self, width, height, rgb):
+ rgb_min = [255, 255, 255]
+ rgb_max = [0, 0, 0]
+ rgb_sum = [0, 0, 0]
+ rgb_bins = [[0] * 64, [0] * 64, [0] * 64]
+
+ for i in xrange(width * height):
+ pixel = rgb[i]
+
+ rgb_min = map(min, pixel, rgb_min)
+ rgb_max = map(max, pixel, rgb_max)
+ rgb_sum = map(operator.add, pixel, rgb_sum)
+
+ map(self.bin, rgb_bins, pixel)
+
+ output = []
+ for i in xrange(len(rgb_min)):
+ output.append(struct.pack('BBBB', rgb_min[i], 0, rgb_max[i], 0))
+ output.append(struct.pack('<3I', *rgb_sum))
+ for i in xrange(len(rgb_bins)):
+ output.append(struct.pack('<64I', *rgb_bins[i]))
+
+ return ''.join(output)
+
+ def compose(self, ninputs, width, height, rgb):
+ output = [(0, 0, 0)] * (width * height)
+ offset = 50
+
+ for input in xrange(ninputs):
+ length = width - offset
+ for y in xrange(height - offset):
+ dst_offset = (y + offset) * width + offset
+ src_offset = y * width
+ output[dst_offset:dst_offset+length] = rgb[src_offset:src_offset+length]
+ offset += 50
+
+ return ''.join(chr(d) for d in list(itertools.chain.from_iterable(output)))
+
+
+class FormatYUVPacked:
+ def __init__(self, name, mapping):
+ self.name = name
+ self.mapping = copy.copy(mapping)
+
+ def convert(self, width, height, yuv):
+ output = []
+ for i in xrange(width * height / 2):
+ pixel = yuv[i*4:(i+1)*4]
+ pixel = (pixel[self.mapping[0]], pixel[self.mapping[1]],
+ pixel[self.mapping[2]], pixel[self.mapping[3]])
+ output.extend(pixel)
+ return ''.join(output)
+
+ def bin(self, bins, val):
+ bins[val >> 2] += 1
+
+ def histogram(self, width, height, yuv):
+ vyu_min = [255, 255, 255]
+ vyu_max = [0, 0, 0]
+ vyu_sum = [0, 0, 0]
+ vyu_bins = [[0] * 64, [0] * 64, [0] * 64]
+
+ for y in xrange(height):
+ for x in xrange(width / 2):
+ offset = y * width * 2 + x * 4
+ u0 = ord(yuv[offset])
+ y0 = ord(yuv[offset+1])
+ v0 = ord(yuv[offset+2])
+ y1 = ord(yuv[offset+3])
+
+ if x != width / 2 - 1:
+ u2 = ord(yuv[offset+4])
+ v2 = ord(yuv[offset+6])
+ u1 = (u0 + u2) / 2
+ v1 = (v0 + v2) / 2
+ else:
+ u1 = u0
+ v1 = v1
+
+ for vyu in ((v0, y0, u0), (v1, y1, u1)):
+ vyu_min = map(min, vyu, vyu_min)
+ vyu_max = map(max, vyu, vyu_max)
+ vyu_sum = map(operator.add, vyu, vyu_sum)
+
+ map(self.bin, vyu_bins, vyu)
+
+ output = []
+ for i in xrange(len(vyu_min)):
+ output.append(struct.pack('BBBB', vyu_min[i], 0, vyu_max[i], 0))
+ output.append(struct.pack('<3I', *vyu_sum))
+ for i in xrange(len(vyu_bins)):
+ output.append(struct.pack('<64I', *vyu_bins[i]))
+
+ return ''.join(output)
+
+ def compose(self, ninputs, width, height, yuv):
+ output = ['\0'] * (width * height * 2)
+ offset = 50
+
+ for input in xrange(ninputs):
+ length = (width - offset) * 2
+ for y in xrange(height - offset):
+ dst_offset = ((y + offset) * width + offset) * 2
+ src_offset = y * width * 2
+ output[dst_offset:dst_offset+length] = yuv[src_offset:src_offset+length]
+ offset += 50
+
+ return ''.join(output)
+
+
+class FormatNV:
+ def __init__(self, name, hsub, vsub, mapping):
+ self.name = name
+ self.hsub = hsub
+ self.vsub = vsub
+ self.mapping = copy.copy(mapping)
+
+ def convert(self, width, height, yuv):
+ output = []
+
+ for i in xrange(width * height):
+ output.append(yuv[2*i+1])
+
+ for y in xrange(height / self.vsub):
+ for x in xrange(width / 2):
+ offset = (y * self.vsub * width * 2) + x * 4
+ uv = (yuv[offset], yuv[offset+2])
+ uv = (uv[self.mapping[0]], uv[self.mapping[1]])
+ output.extend(uv)
+
+ return ''.join(output)
+
+
+class FormatYUVPlanar:
+ def __init__(self, name, hsub, vsub, mapping):
+ self.name = name
+ self.hsub = hsub
+ self.vsub = vsub
+ self.mapping = copy.copy(mapping)
+
+ def convert(self, width, height, yuv):
+ output = []
+
+ for i in xrange(width * height):
+ output.append(yuv[2*i+1])
+
+ for y in xrange(height / self.vsub):
+ for x in xrange(width / 2):
+ offset = (y * self.vsub * width * 2) + x * 4
+ u = yuv[offset + self.mapping[0] * 2]
+ output.append(u)
+
+ for y in xrange(height / self.vsub):
+ for x in xrange(width / 2):
+ offset = (y * self.vsub * width * 2) + x * 4
+ v = yuv[offset + self.mapping[1] * 2]
+ output.append(v)
+
+ return ''.join(output)
+
+
+formats_rgb = {
+ 'rgb332': FormatRGB('rgb332', {'r': (5, 3), 'g': (2, 3), 'b': (0, 2)}),
+ 'rgb565': FormatRGB('rgb565', {'r': (11, 5), 'g': (5, 6), 'b': (0, 5)}),
+ 'bgr24': FormatRGB('bgr24', {'r': (16, 8), 'g': (8, 8), 'b': (0, 8)}),
+ 'rgb24': FormatRGB('rgb24', {'r': (0, 8), 'g': (8, 8), 'b': (16, 8)}),
+}
+
+formats_argb = {
+ 'argb555': FormatRGB('argb555', {'a': (15, 1), 'r': (10, 5), 'g': (5, 5), 'b': (0, 5)}),
+ 'xrgb555': FormatRGB('xrgb555', {'x': (15, 1), 'r': (10, 5), 'g': (5, 5), 'b': (0, 5)}),
+ 'abgr32': FormatRGB('abgr32', {'a': (24, 8), 'r': (16, 8), 'g': (8, 8), 'b': (0, 8)}),
+ 'argb32': FormatRGB('argb32', {'a': (0, 8), 'r': (8, 8), 'g': (16, 8), 'b': (24, 8)}),
+ 'xbgr32': FormatRGB('xbgr32', {'x': (24, 8), 'r': (16, 8), 'g': (8, 8), 'b': (0, 8)}),
+ 'xrgb32': FormatRGB('xrgb32', {'x': (0, 8), 'r': (8, 8), 'g': (16, 8), 'b': (24, 8)}),
+}
+
+formats_yuv = {
+ 'uyvy': FormatYUVPacked('uyvy', (0, 1, 2, 3)),
+ 'vyuy': FormatYUVPacked('vyuy', (2, 1, 0, 3)),
+ 'yuyv': FormatYUVPacked('yuyv', (1, 0, 3, 2)),
+ 'yvyu': FormatYUVPacked('yvyu', (1, 2, 3, 0)),
+ 'nv12m': FormatNV('nv12m', 2, 2, (0, 1)),
+ 'nv21m': FormatNV('nv21m', 2, 2, (1, 0)),
+ 'nv16m': FormatNV('nv16m', 2, 1, (0, 1)),
+ 'nv61m': FormatNV('nv61m', 2, 1, (1, 0)),
+ 'yuv420m': FormatYUVPlanar('yuv420m', 2, 2, (0, 1)),
+}
+
+resolutions = ((640, 480), (1024, 768))
+
+def main(argv):
+ re_fname = re.compile('frame-([a-z]*)-([0-9]*)x([0-9]*).([a-z]*).gz')
+
+ for fname in glob.glob('*.gz'):
+ match = re_fname.match(fname)
+ if not match:
+ continue
+
+ typ = match.group(1)
+ res = (int(match.group(2)), int(match.group(3)))
+ fmt = match.group(4)
+
+ if fmt == 'rgb':
+ rgb = gzip.open(fname, 'rb').read()
+ rgb = [struct.unpack('BBB', rgb[i*3:(i+1)*3]) for i in xrange(len(rgb) / 3)]
+
+ for format in formats_rgb.values():
+ bin_fname = 'frame-%s-%s-%ux%u.bin' % (typ, format.name, res[0], res[1])
+ print 'Generating %s' % bin_fname
+ bin = format.convert(res[0], res[1], rgb, 0)
+ file(bin_fname, 'wb').write(bin)
+
+ for format in formats_argb.values():
+ for alpha in (0, 100, 200, 255):
+ if format.alpha_bits == 1 and alpha not in (0, 255):
+ continue
+ bin_fname = 'frame-%s-%s-%ux%u-alpha%u.bin' % (typ, format.name, res[0], res[1], alpha)
+ print 'Generating %s' % bin_fname
+ bin = format.convert(res[0], res[1], rgb, alpha)
+ file(bin_fname, 'wb').write(bin)
+
+ format = formats_rgb['rgb24']
+
+ bin_fname = 'histo-%s-%s-%ux%u.bin' % (typ, format.name, res[0], res[1])
+ print 'Generating %s' % bin_fname
+ bin = format.histogram(res[0], res[1], rgb)
+ file(bin_fname, 'wb').write(bin)
+
+ if typ == 'reference' and res[0] == 1024 and res[1] == 768:
+ for ninputs in xrange(1, 6):
+ bin_fname = 'frame-composed-%u-%s-%ux%u.bin' % (ninputs, format.name, res[0], res[1])
+ print 'Generating %s' % bin_fname
+ bin = format.compose(ninputs, res[0], res[1], rgb)
+ file(bin_fname, 'wb').write(bin)
+
+ elif fmt == 'yuv':
+ yuv = gzip.open(fname, 'rb').read()
+
+ for format in formats_yuv.values():
+ bin_fname = 'frame-%s-%s-%ux%u.bin' % (typ, format.name, res[0], res[1])
+ print 'Generating %s' % bin_fname
+ bin = format.convert(res[0], res[1], yuv)
+ file(bin_fname, 'wb').write(bin)
+
+ format = formats_yuv['uyvy']
+ bin_fname = 'histo-%s-%s-%ux%u.bin' % (typ, format.name, res[0], res[1])
+ print 'Generating %s' % bin_fname
+ bin = format.histogram(res[0], res[1], yuv)
+ file(bin_fname, 'wb').write(bin)
+
+ if typ == 'reference' and res[0] == 1024 and res[1] == 768:
+ for ninputs in xrange(1, 6):
+ bin_fname = 'frame-composed-%u-%s-%ux%u.bin' % (ninputs, format.name, res[0], res[1])
+ print 'Generating %s' % bin_fname
+ bin = format.compose(ninputs, res[0], res[1], yuv)
+ file(bin_fname, 'wb').write(bin)
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))