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 143260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.orgif __name__ == '__main__': 153260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org # Make sure we always can import helper_functions. 163260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org sys.path.append(os.path.dirname(__file__)) 17400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 183260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.orgimport helper_functions 19400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 208400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org# Chrome browsertests will throw away stderr; avoid that output gets lost. 218400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.orgsys.stderr = sys.stdout 228400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org 238400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org 24400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.orgdef convert_yuv_to_png_files(yuv_file_name, yuv_frame_width, yuv_frame_height, 253260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org output_directory, ffmpeg_path): 26400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Converts a YUV video file into PNG frames. 27400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 28400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org The function uses ffmpeg to convert the YUV file. The output of ffmpeg is in 29400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org the form frame_xxxx.png, where xxxx is the frame number, starting from 0001. 30400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 31400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Args: 32400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org yuv_file_name(string): The name of the YUV file. 33400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org yuv_frame_width(int): The width of one YUV frame. 34400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org yuv_frame_height(int): The height of one YUV frame. 35400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org output_directory(string): The output directory where the PNG frames will be 36400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org stored. 373260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org ffmpeg_path(string): The path to the ffmpeg executable. If None, the PATH 383260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org will be searched for it. 39400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 40400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Return: 41400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org (bool): True if the conversion was OK. 42400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 43400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org size_string = str(yuv_frame_width) + 'x' + str(yuv_frame_height) 44400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org output_files_pattern = os.path.join(output_directory, 'frame_%04d.png') 453260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org if not ffmpeg_path: 463260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org ffmpeg_path = 'ffmpeg.exe' if sys.platform == 'win32' else 'ffmpeg' 473260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org command = [ffmpeg_path, '-s', '%s' % size_string, '-i', '%s' 48400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org % yuv_file_name, '-f', 'image2', '-vcodec', 'png', 49400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org '%s' % output_files_pattern] 50400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org try: 5138ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org print 'Converting YUV file to PNG images (may take a while)...' 5238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org print ' '.join(command) 53400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org helper_functions.run_shell_command( 5438ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org command, fail_msg='Error during YUV to PNG conversion') 55400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org except helper_functions.HelperError, err: 568400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org print 'Error executing command: %s. Error: %s' % (command, err) 578400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org return False 588400246fcecc3515052faa66238036bc2aaaeac5phoglund@webrtc.org except OSError: 5957e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander print 'Did not find %s. Have you installed it?' % ffmpeg_path 60400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return False 61400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return True 62400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 63400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 643260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.orgdef decode_frames(input_directory, zxing_path): 65400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Decodes the barcodes overlaid in each frame. 66400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 6738ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org The function uses the Zxing command-line tool from the Zxing C++ distribution 6838ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org to decode the barcode in every PNG frame from the input directory. The frames 6938ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org should be named frame_xxxx.png, where xxxx is the frame number. The frame 7038ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org numbers should be consecutive and should start from 0001. 71400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org The decoding results in a frame_xxxx.txt file for every successfully decoded 72400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org barcode. This file contains the decoded barcode as 12-digit string (UPC-A 73400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org format: 11 digits content + one check digit). 74400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 75400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Args: 76400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org input_directory(string): The input directory from where the PNG frames are 77400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org read. 783260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org zxing_path(string): The path to the zxing binary. If specified as None, 793260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org the PATH will be searched for it. 80400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Return: 813260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org (bool): True if the decoding succeeded. 82400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 833260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org if not zxing_path: 843260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org zxing_path = 'zxing.exe' if sys.platform == 'win32' else 'zxing' 853260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org print 'Decoding barcodes from PNG files with %s...' % zxing_path 86400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org return helper_functions.perform_action_on_all_files( 87400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org directory=input_directory, file_pattern='frame_', 88400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org file_extension='png', start_number=1, action=_decode_barcode_in_file, 893260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org command_line_decoder=zxing_path) 90400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 91400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 9238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.orgdef _decode_barcode_in_file(file_name, command_line_decoder): 93400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """Decodes the barcode in the upper left corner of a PNG file. 94400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 95400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Args: 96400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org file_name(string): File name of the PNG file. 97400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org command_line_decoder(string): The ZXing command-line decoding tool. 98400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org 99400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org Return: 100400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org (bool): True upon success, False otherwise. 101400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org """ 10238ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org command = [command_line_decoder, '--try-harder', '--dump-raw', file_name] 103400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org try: 104400e7da51b618f3696fb74535fffd8973f6e84ffvspasova@webrtc.org out = helper_functions.run_shell_command( 10538ebf98c2a7ed1871f1e32087efddce81023eb20kjellander@webrtc.org command, fail_msg='Error during decoding of %s' % file_name) 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: 11457e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander 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 20357e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellanderdef _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 2333260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org parser.add_option('--zxing_path', type='string', 2343260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org help=('The path to where the zxing executable is located. ' 2353260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org 'If omitted, it will be assumed to be present in the ' 2363260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org 'PATH with the name zxing[.exe].')) 2373260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org parser.add_option('--ffmpeg_path', type='string', 2383260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org help=('The path to where the ffmpeg executable is located. ' 2393260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org 'If omitted, it will be assumed to be present in the ' 2403260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org 'PATH with the name ffmpeg[.exe].')) 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')) 25557e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander options, _ = 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, 2743260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org ffmpeg_path=options.ffmpeg_path): 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, 2803260f109e3042809c5a67651bb7755f3adb34cf4phoglund@webrtc.org zxing_path=options.zxing_path): 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