This can be used to "reverse engineer" the boot animation in case the source is lost.
Signed-off-by: Sascha Silbe <si...@activitycentral.com> --- v1->v2: - add usage instructions - use directory given on command line instead of current working dir - rename to os-undelta, move to root of project - install (to /usr/bin) Makefile.am | 1 + os-undelta | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 0 deletions(-) create mode 100755 os-undelta diff --git a/Makefile.am b/Makefile.am index 56e261e..5ef2a78 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,6 +8,7 @@ dist_noinst_HEADERS = utils.h sbin_PROGRAMS = boot-anim-start boot-anim-stop boot-anim-helper boot-anim-running ul-warning bin_PROGRAMS = plymouth +dist_bin_SCRIPTS = os-undelta boot-anim-start: utils.c boot-anim-start.c boot-anim-stop: utils.c boot-anim-stop.c diff --git a/os-undelta b/os-undelta new file mode 100755 index 0000000..863652c --- /dev/null +++ b/os-undelta @@ -0,0 +1,78 @@ +#!/usr/bin/env python +import os.path +import struct +import sys + + +LINE = 0 +FIRSTCOL = 1 +LEN = 2 +DATA = 3 + +FB_SIZE = 1200 * 900 +FB_WIDTH = 1200 +FB_HEIGHT = 900 + + +def apply_delta(image, deltas): + if deltas[:4] != 'D565': + raise ValueError('Not a delta!') + + deltas = deltas[4:] + while deltas and deltas[:4] != 'D565': + line, = struct.unpack('<H', deltas[LINE * 2:LINE * 2 + 2]) + first_col, = struct.unpack('<H', deltas[FIRSTCOL * 2:FIRSTCOL * 2 + 2]) + length, = struct.unpack('<H', deltas[LEN * 2:LEN * 2 + 2]) + offset = (FB_WIDTH * line + first_col) * 2 + new_slice = deltas[DATA * 2:DATA * 2 + length * 2] + if len(new_slice) != len(image[offset:offset + length * 2]): + raise ValueError('Incomplete delta!') + + image[offset:offset + length * 2] = new_slice + deltas = deltas[(DATA + length) * 2:] + + return deltas + + +def print_usage(my_name): + print """Usage: %(my_name)s <directory containing frame00.565 and deltas> + Convert olpc-bootanim deltas file back to individual images + + Example: %(my_name)s /usr/share/boot-anim + + The following shell snippet can be used to convert the resulting + raw bitmap files to PNG files: + + for x in $(seq -f %%02.f 1 25) ; do + ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 1200x900 \\ + -i frame"$x".565 -f image2 -vcodec png frame"$x".png + done + """.replace('\n ', '\n') % locals() + + return 1 + + +def main(my_name, args): + if not args or '--help' in args: + return print_usage(my_name) + + directory_name = args[0] + deltas = file(os.path.join(directory_name, 'deltas'), 'rb').read() + frame0 = file(os.path.join(directory_name, 'frame00.565'), 'rb').read() + + header = frame0[:12] + image = list(frame0[12:]) + deltas_left = deltas + frame_nr = 0 + + while deltas_left: + frame_nr += 1 + print 'Processing frame #%d' % (frame_nr, ) + deltas_left = apply_delta(image, deltas_left) + with file('frame%02d.565' % (frame_nr, ), 'wb') as output_file: + output_file.write(header + ''.join(image)) + + return 0 + + +sys.exit(main(sys.argv[0], sys.argv[1:])) -- 1.7.4.1 _______________________________________________ Devel mailing list Devel@lists.laptop.org http://lists.laptop.org/listinfo/devel