1992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org#!/usr/bin/env python
2992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org#
4992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org# Use of this source code is governed by a BSD-style license
5992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org# that can be found in the LICENSE file in the root of the source
6992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org# tree. An additional intellectual property rights grant can be found
7992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org# in the file PATENTS.  All contributing project authors may
8992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org# be found in the AUTHORS file in the root of the source tree.
9992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
10992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.orgimport optparse
11992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.orgimport os
12992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.orgimport sys
13992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
14992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
15992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.orgdef _crop_one_frame(yuv_file, output_file, component_sizes):
16992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  """Crops one frame.
17992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
18992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  This function crops one frame going through all the YUV planes and cropping
19992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  respective amount of rows.
20992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
21992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  Args:
22992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    yuv_file(file): The opened (for binary reading) YUV file.
23992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    output_file(file): The opened (for binary writing) file.
24992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    component_sizes(list of 3 3-ples): The list contains the sizes for all the
25992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      planes (Y, U, V) of the YUV file plus the crop_height scaled for every
26992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      plane. The sizes equal width, height and crop_height for the Y plane,
27992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      and are equal to width/2, height/2 and crop_height/2 for the U and V
28992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      planes.
29992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  Return:
30992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    (bool): True if there are more frames to crop, False otherwise.
31992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  """
32992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  for comp_width, comp_height, comp_crop_height in component_sizes:
33992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    for row in range(comp_height):
34992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      # Read the plane data for this row.
35992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      yuv_plane = yuv_file.read(comp_width)
36992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
37992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      # If the plane is empty, we have reached the end of the file.
38992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      if yuv_plane == "":
39992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org        return False
40992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
41992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      # Only write the plane data for the rows bigger than crop_height.
42992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      if row >= comp_crop_height:
43992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org        output_file.write(yuv_plane)
44992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  return True
45992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
46992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
47992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.orgdef crop_frames(yuv_file_name, output_file_name, width, height, crop_height):
48992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  """Crops rows of pixels from the top of the YUV frames.
49992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
50992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  This function goes through all the frames in a video and crops the crop_height
51992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  top pixel rows of every frame.
52992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
53992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  Args:
54992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    yuv_file_name(string): The name of the YUV file to be cropped.
55992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    output_file_name(string): The name of the output file where the result will
56992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      be written.
57992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    width(int): The width of the original YUV file.
58992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    height(int): The height of the original YUV file.
59992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    crop_height(int): The height (the number of pixel rows) to be cropped from
60992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org      the frames.
61992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  """
62992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  # Component sizes = [Y_sizes, U_sizes, V_sizes].
63992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  component_sizes = [(width, height, crop_height),
64992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                     (width/2, height/2, crop_height/2),
65992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                     (width/2, height/2, crop_height/2)]
66992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
67992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  yuv_file = open(yuv_file_name, 'rb')
68992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  output_file = open(output_file_name, 'wb')
69992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
70992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  data_left = True
71992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  while data_left:
72992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    data_left = _crop_one_frame(yuv_file, output_file, component_sizes)
73992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
74992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  yuv_file.close()
75992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  output_file.close()
76992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
77992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
78992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.orgdef _parse_args():
79992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  """Registers the command-line options."""
80992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  usage = "usage: %prog [options]"
81992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  parser = optparse.OptionParser(usage=usage)
82992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
83992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  parser.add_option('--width', type='int',
84992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                    default=352,
85992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                    help=('Width of the YUV file\'s frames. '
86992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                          'Default: %default'))
87992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  parser.add_option('--height', type='int', default=288,
88992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                    help=('Height of the YUV file\'s frames. '
89992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                          'Default: %default'))
90992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  parser.add_option('--crop_height', type='int', default=32,
91992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                    help=('How much of the top of the YUV file to crop. '
92992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                          'Has to be module of 2. Default: %default'))
93992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  parser.add_option('--yuv_file', type='string',
94992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                    help=('The YUV file to be cropped.'))
95992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  parser.add_option('--output_file', type='string', default='output.yuv',
96992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                    help=('The output YUV file containing the cropped YUV. '
97992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                          'Default: %default'))
98992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  options = parser.parse_args()[0]
99992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  if not options.yuv_file:
100992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    parser.error('yuv_file argument missing. Please specify input YUV file!')
101992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  return options
102992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
103992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
104992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.orgdef _main():
105992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  """A tool to crop rows of pixels from the top part of a YUV file.
106992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
107992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  A simple invocation will be:
108992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  ./yuv_cropper.py --width=640 --height=480 --crop_height=32
109992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  --yuv_file=<path_and_name_of_yuv_file>
110992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  --output_yuv=<path and name_of_output_file>
111992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  """
112992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  options = _parse_args()
113992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
114992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  if os.path.getsize(options.yuv_file) == 0:
115992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    sys.stderr.write('Error: The YUV file you have passed has size 0. The '
116992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org                     'produced output will also have size 0.\n')
117992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org    return -1
118992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
119992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  crop_frames(options.yuv_file, options.output_file, options.width,
120992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org              options.height, options.crop_height)
121992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org  return 0
122992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
123992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.org
124992da29c75f84f6877f44f961809fedec99954cevspasova@webrtc.orgif __name__ == '__main__':
12557e5fd2e604ff7e60425c3f7654b40da03fc763cHenrik Kjellander  sys.exit(_main())
126