Index: webrtc/tools/barcode_tools/barcode_encoder.py |
diff --git a/webrtc/tools/barcode_tools/barcode_encoder.py b/webrtc/tools/barcode_tools/barcode_encoder.py |
deleted file mode 100755 |
index c0400dfcccdc629db95699408e17d08c79362c4e..0000000000000000000000000000000000000000 |
--- a/webrtc/tools/barcode_tools/barcode_encoder.py |
+++ /dev/null |
@@ -1,372 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
-# |
-# Use of this source code is governed by a BSD-style license |
-# that can be found in the LICENSE file in the root of the source |
-# tree. An additional intellectual property rights grant can be found |
-# in the file PATENTS. All contributing project authors may |
-# be found in the AUTHORS file in the root of the source tree. |
- |
-import optparse |
-import os |
-import sys |
- |
-import helper_functions |
- |
-_DEFAULT_BARCODE_WIDTH = 352 |
-_DEFAULT_BARCODES_FILE = 'barcodes.yuv' |
- |
- |
-def GenerateUpcaBarcodes(number_of_barcodes, barcode_width, barcode_height, |
- output_directory='.', |
- path_to_zxing='zxing-read-only'): |
- """Generates UPC-A barcodes. |
- |
- This function generates a number_of_barcodes UPC-A barcodes. The function |
- calls an example Java encoder from the Zxing library. The barcodes are |
- generated as PNG images. The width of the barcodes shouldn't be less than 102 |
- pixels because otherwise Zxing can't properly generate the barcodes. |
- |
- Args: |
- number_of_barcodes(int): The number of barcodes to generate. |
- barcode_width(int): Width of barcode in pixels. |
- barcode_height(int): Height of barcode in pixels. |
- output_directory(string): Output directory where to store generated |
- barcodes. |
- path_to_zxing(string): The path to Zxing. |
- |
- Return: |
- (bool): True if the conversion is successful. |
- """ |
- base_file_name = os.path.join(output_directory, "barcode_") |
- jars = _FormJarsString(path_to_zxing) |
- command_line_encoder = 'com.google.zxing.client.j2se.CommandLineEncoder' |
- barcode_width = str(barcode_width) |
- barcode_height = str(barcode_height) |
- |
- errors = False |
- for i in range(number_of_barcodes): |
- suffix = helper_functions.ZeroPad(i) |
- # Barcodes starting from 0 |
- content = helper_functions.ZeroPad(i, 11) |
- output_file_name = base_file_name + suffix + ".png" |
- |
- command = ["java", "-cp", jars, command_line_encoder, |
- "--barcode_format=UPC_A", "--height=%s" % barcode_height, |
- "--width=%s" % barcode_width, |
- "--output=%s" % (output_file_name), "%s" % (content)] |
- try: |
- helper_functions.RunShellCommand( |
- command, fail_msg=('Error during barcode %s generation' % content)) |
- except helper_functions.HelperError as err: |
- print >> sys.stderr, err |
- errors = True |
- return not errors |
- |
- |
-def ConvertPngToYuvBarcodes(input_directory='.', output_directory='.'): |
- """Converts PNG barcodes to YUV barcode images. |
- |
- This function reads all the PNG files from the input directory which are in |
- the format frame_xxxx.png, where xxxx is the number of the frame, starting |
- from 0000. The frames should be consecutive numbers. The output YUV file is |
- named frame_xxxx.yuv. The function uses ffmpeg to do the conversion. |
- |
- Args: |
- input_directory(string): The input direcotry to read the PNG barcodes from. |
- output_directory(string): The putput directory to write the YUV files to. |
- Return: |
- (bool): True if the conversion was without errors. |
- """ |
- return helper_functions.PerformActionOnAllFiles( |
- input_directory, 'barcode_', 'png', 0, _ConvertToYuvAndDelete, |
- output_directory=output_directory, pattern='barcode_') |
- |
- |
-def _ConvertToYuvAndDelete(output_directory, file_name, pattern): |
- """Converts a PNG file to a YUV file and deletes the PNG file. |
- |
- Args: |
- output_directory(string): The output directory for the YUV file. |
- file_name(string): The PNG file name. |
- pattern(string): The file pattern of the PNG/YUV file. The PNG/YUV files are |
- named patternxx..x.png/yuv, where xx..x are digits starting from 00..0. |
- Return: |
- (bool): True upon successful conversion, false otherwise. |
- """ |
- # Pattern should be in file name |
- if not pattern in file_name: |
- return False |
- pattern_position = file_name.rfind(pattern) |
- |
- # Strip the path to the PNG file and replace the png extension with yuv |
- yuv_file_name = file_name[pattern_position:-3] + 'yuv' |
- yuv_file_name = os.path.join(output_directory, yuv_file_name) |
- |
- command = ['ffmpeg', '-i', '%s' % (file_name), '-pix_fmt', 'yuv420p', |
- '%s' % (yuv_file_name)] |
- try: |
- helper_functions.RunShellCommand( |
- command, fail_msg=('Error during PNG to YUV conversion of %s' % |
- file_name)) |
- os.remove(file_name) |
- except helper_functions.HelperError as err: |
- print >> sys.stderr, err |
- return False |
- return True |
- |
- |
-def CombineYuvFramesIntoOneFile(output_file_name, input_directory='.'): |
- """Combines several YUV frames into one YUV video file. |
- |
- The function combines the YUV frames from input_directory into one YUV video |
- file. The frames should be named in the format frame_xxxx.yuv where xxxx |
- stands for the frame number. The numbers have to be consecutive and start from |
- 0000. The YUV frames are removed after they have been added to the video. |
- |
- Args: |
- output_file_name(string): The name of the file to produce. |
- input_directory(string): The directory from which the YUV frames are read. |
- Return: |
- (bool): True if the frame stitching went OK. |
- """ |
- output_file = open(output_file_name, "wb") |
- success = helper_functions.PerformActionOnAllFiles( |
- input_directory, 'barcode_', 'yuv', 0, _AddToFileAndDelete, |
- output_file=output_file) |
- output_file.close() |
- return success |
- |
-def _AddToFileAndDelete(output_file, file_name): |
- """Adds the contents of a file to a previously opened file. |
- |
- Args: |
- output_file(file): The ouput file, previously opened. |
- file_name(string): The file name of the file to add to the output file. |
- |
- Return: |
- (bool): True if successful, False otherwise. |
- """ |
- input_file = open(file_name, "rb") |
- input_file_contents = input_file.read() |
- output_file.write(input_file_contents) |
- input_file.close() |
- try: |
- os.remove(file_name) |
- except OSError as e: |
- print >> sys.stderr, 'Error deleting file %s.\nError: %s' % (file_name, e) |
- return False |
- return True |
- |
- |
-def _OverlayBarcodeAndBaseFrames(barcodes_file, base_file, output_file, |
- barcodes_component_sizes, |
- base_component_sizes): |
- """Overlays the next YUV frame from a file with a barcode. |
- |
- Args: |
- barcodes_file(FileObject): The YUV file containing the barcodes (opened). |
- base_file(FileObject): The base YUV file (opened). |
- output_file(FileObject): The output overlaid file (opened). |
- barcodes_component_sizes(list of tuples): The width and height of each Y, U |
- and V plane of the barcodes YUV file. |
- base_component_sizes(list of tuples): The width and height of each Y, U and |
- V plane of the base YUV file. |
- Return: |
- (bool): True if there are more planes (i.e. frames) in the base file, false |
- otherwise. |
- """ |
- # We will loop three times - once for the Y, U and V planes |
- for ((barcode_comp_width, barcode_comp_height), |
- (base_comp_width, base_comp_height)) in zip(barcodes_component_sizes, |
- base_component_sizes): |
- for base_row in range(base_comp_height): |
- barcode_plane_traversed = False |
- if (base_row < barcode_comp_height) and not barcode_plane_traversed: |
- barcode_plane = barcodes_file.read(barcode_comp_width) |
- if barcode_plane == "": |
- barcode_plane_traversed = True |
- else: |
- barcode_plane_traversed = True |
- base_plane = base_file.read(base_comp_width) |
- |
- if base_plane == "": |
- return False |
- |
- if not barcode_plane_traversed: |
- # Substitute part of the base component with the top component |
- output_file.write(barcode_plane) |
- base_plane = base_plane[barcode_comp_width:] |
- output_file.write(base_plane) |
- return True |
- |
- |
-def OverlayYuvFiles(barcode_width, barcode_height, base_width, base_height, |
- barcodes_file_name, base_file_name, output_file_name): |
- """Overlays two YUV files starting from the upper left corner of both. |
- |
- Args: |
- barcode_width(int): The width of the barcode (to be overlaid). |
- barcode_height(int): The height of the barcode (to be overlaid). |
- base_width(int): The width of a frame of the base file. |
- base_height(int): The height of a frame of the base file. |
- barcodes_file_name(string): The name of the YUV file containing the YUV |
- barcodes. |
- base_file_name(string): The name of the base YUV file. |
- output_file_name(string): The name of the output file where the overlaid |
- video will be written. |
- """ |
- # Component sizes = [Y_sizes, U_sizes, V_sizes] |
- barcodes_component_sizes = [(barcode_width, barcode_height), |
- (barcode_width/2, barcode_height/2), |
- (barcode_width/2, barcode_height/2)] |
- base_component_sizes = [(base_width, base_height), |
- (base_width/2, base_height/2), |
- (base_width/2, base_height/2)] |
- |
- barcodes_file = open(barcodes_file_name, 'rb') |
- base_file = open(base_file_name, 'rb') |
- output_file = open(output_file_name, 'wb') |
- |
- data_left = True |
- while data_left: |
- data_left = _OverlayBarcodeAndBaseFrames(barcodes_file, base_file, |
- output_file, |
- barcodes_component_sizes, |
- base_component_sizes) |
- |
- barcodes_file.close() |
- base_file.close() |
- output_file.close() |
- |
- |
-def CalculateFramesNumberFromYuv(yuv_width, yuv_height, file_name): |
- """Calculates the number of frames of a YUV video. |
- |
- Args: |
- yuv_width(int): Width of a frame of the yuv file. |
- yuv_height(int): Height of a frame of the YUV file. |
- file_name(string): The name of the YUV file. |
- Return: |
- (int): The number of frames in the YUV file. |
- """ |
- file_size = os.path.getsize(file_name) |
- |
- y_plane_size = yuv_width * yuv_height |
- u_plane_size = (yuv_width/2) * (yuv_height/2) # Equals to V plane size too |
- frame_size = y_plane_size + (2 * u_plane_size) |
- return int(file_size/frame_size) # Should be int anyway |
- |
- |
-def _FormJarsString(path_to_zxing): |
- """Forms the the Zxing core and javase jars argument. |
- |
- Args: |
- path_to_zxing(string): The path to the Zxing checkout folder. |
- Return: |
- (string): The newly formed jars argument. |
- """ |
- javase_jar = os.path.join(path_to_zxing, "javase", "javase.jar") |
- core_jar = os.path.join(path_to_zxing, "core", "core.jar") |
- delimiter = ':' |
- if os.name != 'posix': |
- delimiter = ';' |
- return javase_jar + delimiter + core_jar |
- |
-def _ParseArgs(): |
- """Registers the command-line options.""" |
- usage = "usage: %prog [options]" |
- parser = optparse.OptionParser(usage=usage) |
- |
- parser.add_option('--barcode_width', type='int', |
- default=_DEFAULT_BARCODE_WIDTH, |
- help=('Width of the barcodes to be overlaid on top of the' |
- ' base file. Default: %default')) |
- parser.add_option('--barcode_height', type='int', default=32, |
- help=('Height of the barcodes to be overlaid on top of the' |
- ' base file. Default: %default')) |
- parser.add_option('--base_frame_width', type='int', default=352, |
- help=('Width of the base YUV file\'s frames. ' |
- 'Default: %default')) |
- parser.add_option('--base_frame_height', type='int', default=288, |
- help=('Height of the top YUV file\'s frames. ' |
- 'Default: %default')) |
- parser.add_option('--barcodes_yuv', type='string', |
- default=_DEFAULT_BARCODES_FILE, |
- help=('The YUV file with the barcodes in YUV. ' |
- 'Default: %default')) |
- parser.add_option('--base_yuv', type='string', default='base.yuv', |
- help=('The base YUV file to be overlaid. ' |
- 'Default: %default')) |
- parser.add_option('--output_yuv', type='string', default='output.yuv', |
- help=('The output YUV file containing the base overlaid' |
- ' with the barcodes. Default: %default')) |
- parser.add_option('--png_barcodes_output_dir', type='string', default='.', |
- help=('Output directory where the PNG barcodes will be ' |
- 'generated. Default: %default')) |
- parser.add_option('--png_barcodes_input_dir', type='string', default='.', |
- help=('Input directory from where the PNG barcodes will be ' |
- 'read. Default: %default')) |
- parser.add_option('--yuv_barcodes_output_dir', type='string', default='.', |
- help=('Output directory where the YUV barcodes will be ' |
- 'generated. Default: %default')) |
- parser.add_option('--yuv_frames_input_dir', type='string', default='.', |
- help=('Input directory from where the YUV will be ' |
- 'read before combination. Default: %default')) |
- parser.add_option('--zxing_dir', type='string', default='zxing', |
- help=('Path to the Zxing barcodes library. ' |
- 'Default: %default')) |
- options = parser.parse_args()[0] |
- return options |
- |
- |
-def main(): |
- """The main function. |
- |
- A simple invocation will be: |
- ./webrtc/tools/barcode_tools/barcode_encoder.py --barcode_height=32 |
- --base_frame_width=352 --base_frame_height=288 |
- --base_yuv=<path_and_name_of_base_file> |
- --output_yuv=<path and name_of_output_file> |
- """ |
- options = _ParseArgs() |
- # The barcodes with will be different than the base frame width only if |
- # explicitly specified at the command line. |
- if options.barcode_width == _DEFAULT_BARCODE_WIDTH: |
- options.barcode_width = options.base_frame_width |
- # If the user provides a value for the barcodes YUV video file, we will keep |
- # it. Otherwise we create a temp file which is removed after it has been used. |
- keep_barcodes_yuv_file = False |
- if options.barcodes_yuv != _DEFAULT_BARCODES_FILE: |
- keep_barcodes_yuv_file = True |
- |
- # Calculate the number of barcodes - it is equal to the number of frames in |
- # the base file. |
- number_of_barcodes = CalculateFramesNumberFromYuv( |
- options.base_frame_width, options.base_frame_height, options.base_yuv) |
- |
- script_dir = os.path.dirname(os.path.abspath(sys.argv[0])) |
- zxing_dir = os.path.join(script_dir, 'third_party', 'zxing') |
- # Generate barcodes - will generate them in PNG. |
- GenerateUpcaBarcodes(number_of_barcodes, options.barcode_width, |
- options.barcode_height, |
- output_directory=options.png_barcodes_output_dir, |
- path_to_zxing=zxing_dir) |
- # Convert the PNG barcodes to to YUV format. |
- ConvertPngToYuvBarcodes(options.png_barcodes_input_dir, |
- options.yuv_barcodes_output_dir) |
- # Combine the YUV barcodes into one YUV file. |
- CombineYuvFramesIntoOneFile(options.barcodes_yuv, |
- input_directory=options.yuv_frames_input_dir) |
- # Overlay the barcodes over the base file. |
- OverlayYuvFiles(options.barcode_width, options.barcode_height, |
- options.base_frame_width, options.base_frame_height, |
- options.barcodes_yuv, options.base_yuv, options.output_yuv) |
- |
- if not keep_barcodes_yuv_file: |
- # Remove the temporary barcodes YUV file |
- os.remove(options.barcodes_yuv) |
- |
- |
-if __name__ == '__main__': |
- sys.exit(main()) |