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