1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include <stdio.h> 12 #include <stdlib.h> 13 14 #include <string> 15 16 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 17 #include "webrtc/system_wrappers/interface/scoped_ptr.h" 18 #include "webrtc/typedefs.h" 19 20 using std::string; 21 22 namespace webrtc { 23 24 int EditFrames(const string& in_path, int width, int height, 25 int first_frame_to_process, int interval, 26 int last_frame_to_process, const string& out_path) { 27 if (last_frame_to_process < first_frame_to_process) { 28 fprintf(stderr, "The set of frames to cut is empty! (l < f)\n"); 29 return -10; 30 } 31 32 FILE* in_fid = fopen(in_path.c_str() , "rb"); 33 if (!in_fid) { 34 fprintf(stderr, "Could not read input file: %s.\n", in_path.c_str()); 35 return -11; 36 } 37 38 // Frame size of I420. 39 int frame_length = CalcBufferSize(kI420, width, height); 40 41 webrtc::scoped_ptr<uint8_t[]> temp_buffer(new uint8_t[frame_length]); 42 43 FILE* out_fid = fopen(out_path.c_str(), "wb"); 44 45 if (!out_fid) { 46 fprintf(stderr, "Could not open output file: %s.\n", out_path.c_str()); 47 fclose(in_fid); 48 return -12; 49 } 50 51 int num_frames_read = 0; 52 int num_frames_read_between = 0; 53 int num_bytes_read; 54 55 while ((num_bytes_read = fread(temp_buffer.get(), 1, frame_length, in_fid)) 56 == frame_length) { 57 num_frames_read++; 58 if ((num_frames_read < first_frame_to_process) || 59 (last_frame_to_process < num_frames_read)) { 60 fwrite(temp_buffer.get(), 1, frame_length, out_fid); 61 } else { 62 num_frames_read_between++; 63 if (interval <= 0) { 64 if (interval == -1) { 65 // Remove all frames. 66 } else { 67 if (((num_frames_read_between - 1) % interval) == 0) { 68 // Keep only every |interval| frame. 69 fwrite(temp_buffer.get(), 1, frame_length, out_fid); 70 } 71 } 72 } else if (interval > 0) { 73 for (int i = 1; i <= interval; ++i) { 74 fwrite(temp_buffer.get(), 1, frame_length, out_fid); 75 } 76 } 77 } 78 } 79 if (num_bytes_read > 0 && num_bytes_read < frame_length) { 80 printf("Frame to small! Last frame truncated.\n"); 81 } 82 fclose(in_fid); 83 fclose(out_fid); 84 85 printf("Done editing!\n"); 86 return 0; 87 } 88 } // namespace webrtc 89