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