barcode_decoder.py revision 8400246fcecc3515052faa66238036bc2aaaeac5
1400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org#!/usr/bin/env python 2400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org# 4400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org# Use of this source code is governed by a BSD-style license 5400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org# that can be found in the LICENSE file in the root of the source 6400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org# tree. An additional intellectual property rights grant can be found 7400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org# in the file PATENTS. All contributing project authors may 8400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org# be found in the AUTHORS file in the root of the source tree. 9400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 10400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgimport optparse 11400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgimport os 12400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgimport sys 13400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 14400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgimport helper_functions 15400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 16400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 178400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org# Chrome browsertests will throw away stderr; avoid that output gets lost. 188400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.orgsys.stderr = sys.stdout 198400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org 208400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org 21400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgdef convert_yuv_to_png_files(yuv_file_name, yuv_frame_width, yuv_frame_height, 2238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org output_directory, ffmpeg_dir=None): 23400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Converts a YUV video file into PNG frames. 24400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 25400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org The function uses ffmpeg to convert the YUV file. The output of ffmpeg is in 26400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org the form frame_xxxx.png, where xxxx is the frame number, starting from 0001. 27400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 28400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Args: 29400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org yuv_file_name(string): The name of the YUV file. 30400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org yuv_frame_width(int): The width of one YUV frame. 31400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org yuv_frame_height(int): The height of one YUV frame. 32400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org output_directory(string): The output directory where the PNG frames will be 33400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org stored. 3438ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org ffmpeg_dir(string): The directory containing the ffmpeg executable. If 3538ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org omitted, the PATH will be searched for it. 36400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 37400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Return: 38400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org (bool): True if the conversion was OK. 39400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 40400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org size_string = str(yuv_frame_width) + 'x' + str(yuv_frame_height) 41400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org output_files_pattern = os.path.join(output_directory, 'frame_%04d.png') 4238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org ffmpeg_executable = 'ffmpeg.exe' if sys.platform == 'win32' else 'ffmpeg' 4338ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org if ffmpeg_dir: 4438ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org ffmpeg_executable = os.path.join(ffmpeg_dir, ffmpeg_executable) 45b13dfbffd75f1bd12b096f0489bdd77b34124feckjellander@webrtc.org command = [ffmpeg_executable, '-s', '%s' % size_string, '-i', '%s' 46400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org % yuv_file_name, '-f', 'image2', '-vcodec', 'png', 47400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org '%s' % output_files_pattern] 48400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org try: 4938ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org print 'Converting YUV file to PNG images (may take a while)...' 5038ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org print ' '.join(command) 51400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org helper_functions.run_shell_command( 5238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org command, fail_msg='Error during YUV to PNG conversion') 53400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org except helper_functions.HelperError, err: 548400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org print 'Error executing command: %s. Error: %s' % (command, err) 558400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org return False 568400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org except OSError: 578400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org print ('Did not find %s. Have you installed it?' % ffmpeg_executable) 58400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return False 59400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return True 60400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 61400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 6238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.orgdef decode_frames(input_directory, zxing_dir=None): 63400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Decodes the barcodes overlaid in each frame. 64400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 6538ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org The function uses the Zxing command-line tool from the Zxing C++ distribution 6638ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org to decode the barcode in every PNG frame from the input directory. The frames 6738ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org should be named frame_xxxx.png, where xxxx is the frame number. The frame 6838ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org numbers should be consecutive and should start from 0001. 69400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org The decoding results in a frame_xxxx.txt file for every successfully decoded 70400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org barcode. This file contains the decoded barcode as 12-digit string (UPC-A 71400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org format: 11 digits content + one check digit). 72400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 73400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Args: 74400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org input_directory(string): The input directory from where the PNG frames are 75400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org read. 7638ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org zxing_dir(string): The directory containing the zxing executable. If 7738ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org omitted, the PATH will be searched for it. 78400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Return: 79400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org (bool): True if the decoding went without errors. 80400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 8138ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org zxing_executable = 'zxing.exe' if sys.platform == 'win32' else 'zxing' 8238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org if zxing_dir: 8338ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org zxing_executable = os.path.join(zxing_dir, zxing_executable) 8438ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org print 'Decoding barcodes from PNG files with %s...' % zxing_executable 85400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return helper_functions.perform_action_on_all_files( 86400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org directory=input_directory, file_pattern='frame_', 87400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org file_extension='png', start_number=1, action=_decode_barcode_in_file, 8838ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org command_line_decoder=zxing_executable) 89400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 90400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 9138ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.orgdef _decode_barcode_in_file(file_name, command_line_decoder): 92400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Decodes the barcode in the upper left corner of a PNG file. 93400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 94400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Args: 95400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org file_name(string): File name of the PNG file. 96400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org command_line_decoder(string): The ZXing command-line decoding tool. 97400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 98400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Return: 99400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org (bool): True upon success, False otherwise. 100400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 10138ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org command = [command_line_decoder, '--try-harder', '--dump-raw', file_name] 102400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org try: 103400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org out = helper_functions.run_shell_command( 10438ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org command, fail_msg='Error during decoding of %s' % file_name) 10538ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org print 'Image %s : decoded barcode: %s' % (file_name, out) 10638ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org text_file = open('%s.txt' % file_name[:-4], 'w') 10738ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org text_file.write(out) 10838ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org text_file.close() 109400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org except helper_functions.HelperError, err: 1108400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org print 'Barcode in %s cannot be decoded.' % file_name 1118400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org print err 1128400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org return False 1138400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org except OSError: 1148400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org print ('Did not find %s. Have you installed it?' % command_line_decoder) 115400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return False 116400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return True 117400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 118400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 119400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgdef _generate_stats_file(stats_file_name, input_directory='.'): 120400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Generate statistics file. 121400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 122400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org The function generates a statistics file. The contents of the file are in the 123400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org format <frame_name> <barcode>, where frame name is the name of every frame 124400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org (effectively the frame number) and barcode is the decoded barcode. The frames 125400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org and the helper .txt files are removed after they have been used. 126400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 127400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org file_prefix = os.path.join(input_directory, 'frame_') 128400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org stats_file = open(stats_file_name, 'w') 129400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 13038ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org print 'Generating stats file: %s' % stats_file_name 131400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org for i in range(1, _count_frames_in(input_directory=input_directory) + 1): 132400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org frame_number = helper_functions.zero_pad(i) 133400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org barcode_file_name = file_prefix + frame_number + '.txt' 134400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org png_frame = file_prefix + frame_number + '.png' 135400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org entry_frame_number = helper_functions.zero_pad(i-1) 136400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org entry = 'frame_' + entry_frame_number + ' ' 137400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 138400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org if os.path.isfile(barcode_file_name): 139400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org barcode = _read_barcode_from_text_file(barcode_file_name) 1401b0a02e12e4ebec15903b6573db9f8b1bb75701dvspasova@webrtc.org os.remove(barcode_file_name) 141400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 142400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org if _check_barcode(barcode): 143400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org entry += (helper_functions.zero_pad(int(barcode[0:11])) + '\n') 144400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org else: 145400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org entry += 'Barcode error\n' # Barcode is wrongly detected. 146400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org else: # Barcode file doesn't exist. 147400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org entry += 'Barcode error\n' 148400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 149400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org stats_file.write(entry) 1501b0a02e12e4ebec15903b6573db9f8b1bb75701dvspasova@webrtc.org os.remove(png_frame) 151400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 152400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org stats_file.close() 153400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 154400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 155400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgdef _read_barcode_from_text_file(barcode_file_name): 156400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Reads the decoded barcode for a .txt file. 157400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 158400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Args: 159400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org barcode_file_name(string): The name of the .txt file. 160400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Return: 161400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org (string): The decoded barcode. 162400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 163400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org barcode_file = open(barcode_file_name, 'r') 164400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org barcode = barcode_file.read() 165400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org barcode_file.close() 166400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return barcode 167400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 168400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 169400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgdef _check_barcode(barcode): 170400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Check weather the UPC-A barcode was decoded correctly. 171400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 172400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org This function calculates the check digit of the provided barcode and compares 173400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org it to the check digit that was decoded. 174400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 175400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Args: 176400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org barcode(string): The barcode (12-digit). 177400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Return: 178400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org (bool): True if the barcode was decoded correctly. 179400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 180400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org if len(barcode) != 12: 181400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return False 182400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 183400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org r1 = range(0, 11, 2) # Odd digits 184400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org r2 = range(1, 10, 2) # Even digits except last 185400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org dsum = 0 186400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org # Sum all the even digits 187400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org for i in r1: 188400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org dsum += int(barcode[i]) 189400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org # Multiply the sum by 3 190400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org dsum *= 3 191400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org # Add all the even digits except the check digit (12th digit) 192400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org for i in r2: 193400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org dsum += int(barcode[i]) 194400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org # Get the modulo 10 195400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org dsum = dsum % 10 196400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org # If not 0 substract from 10 197400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org if dsum != 0: 198400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org dsum = 10 - dsum 199400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org # Compare result and check digit 200400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return dsum == int(barcode[11]) 201400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 202400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 203400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgdef _count_frames_in(input_directory = '.'): 204400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Calculates the number of frames in the input directory. 205400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 206400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org The function calculates the number of frames in the input directory. The 207400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org frames should be named frame_xxxx.png, where xxxx is the number of the frame. 208400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org The numbers should start from 1 and should be consecutive. 209400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 210400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Args: 211400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org input_directory(string): The input directory. 212400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Return: 213400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org (int): The number of frames. 214400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 215400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org file_prefix = os.path.join(input_directory, 'frame_') 216400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org file_exists = True 217400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org num = 1 218400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 219400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org while file_exists: 220400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org file_name = (file_prefix + helper_functions.zero_pad(num) + '.png') 221400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org if os.path.isfile(file_name): 222400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org num += 1 223400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org else: 224400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org file_exists = False 225400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return num - 1 226400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 227400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 228400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgdef _parse_args(): 229400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Registers the command-line options.""" 230400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org usage = "usage: %prog [options]" 231400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org parser = optparse.OptionParser(usage=usage) 232400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 23338ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org parser.add_option('--zxing_dir', type='string', 23438ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org help=('The path to the directory where the zxing executable' 23538ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org 'is located. If omitted, it will be assumed to be ' 23638ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org 'present in the PATH.')) 23738ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org parser.add_option('--ffmpeg_dir', type='string', default=None, 23838ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org help=('The path to the directory where the ffmpeg ' 23938ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org 'executable is located. If omitted, it will be ' 24038ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org 'assumed to be present in the PATH.')) 24138ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org parser.add_option('--yuv_frame_width', type='int', default=640, 24238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org help='Width of the YUV file\'s frames. Default: %default') 24338ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org parser.add_option('--yuv_frame_height', type='int', default=480, 24438ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org help='Height of the YUV file\'s frames. Default: %default') 245400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org parser.add_option('--yuv_file', type='string', default='output.yuv', 24638ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org help='The YUV file to be decoded. Default: %default') 247400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org parser.add_option('--stats_file', type='string', default='stats.txt', 24838ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org help='The output stats file. Default: %default') 24938ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org parser.add_option('--png_working_dir', type='string', default='.', 25038ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org help=('The directory for temporary PNG images to be stored ' 25138ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org 'in when decoding from YUV before they\'re barcode ' 25238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org 'decoded. If using Windows and a Cygwin-compiled ' 25338ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org 'zxing.exe, you should keep the default value to ' 25438ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org 'avoid problems. Default: %default')) 25538ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org options, _args = parser.parse_args() 256400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return options 257400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 258400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 259400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgdef _main(): 260400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """The main function. 261400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 262400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org A simple invocation is: 263a6ff84503ed5a8ed799c12625759dee84f9b2d39kjellander@webrtc.org ./webrtc/tools/barcode_tools/barcode_decoder.py 264400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org --yuv_file=<path_and_name_of_overlaid_yuv_video> 26538ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org --yuv_frame_width=640 --yuv_frame_height=480 266400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org --stats_file=<path_and_name_to_stats_file> 267400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 268400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org options = _parse_args() 269400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 270400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org # Convert the overlaid YUV video into a set of PNG frames. 271ccb52c29613a67fdb68dc4434c022986671d8efakjellander@webrtc.org if not convert_yuv_to_png_files(options.yuv_file, options.yuv_frame_width, 272ccb52c29613a67fdb68dc4434c022986671d8efakjellander@webrtc.org options.yuv_frame_height, 27338ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org output_directory=options.png_working_dir, 27438ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org ffmpeg_dir=options.ffmpeg_dir): 2758400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org print 'An error occurred converting from YUV to PNG frames.' 276ccb52c29613a67fdb68dc4434c022986671d8efakjellander@webrtc.org return -1 277ccb52c29613a67fdb68dc4434c022986671d8efakjellander@webrtc.org 278400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org # Decode the barcodes from the PNG frames. 27938ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org if not decode_frames(input_directory=options.png_working_dir, 28038ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org zxing_dir=options.zxing_dir): 2818400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org print 'An error occurred decoding barcodes from PNG frames.' 282ccb52c29613a67fdb68dc4434c022986671d8efakjellander@webrtc.org return -2 283ccb52c29613a67fdb68dc4434c022986671d8efakjellander@webrtc.org 284400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org # Generate statistics file. 285400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org _generate_stats_file(options.stats_file, 28638ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org input_directory=options.png_working_dir) 28738ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org print 'Completed barcode decoding.' 288ccb52c29613a67fdb68dc4434c022986671d8efakjellander@webrtc.org return 0 289400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 290400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgif __name__ == '__main__': 291400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org sys.exit(_main()) 292