| /* | 
 |  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #include <stdio.h> | 
 | #include <stdlib.h> | 
 |  | 
 | #include <memory> | 
 | #include <string> | 
 |  | 
 | #include "common_video/libyuv/include/webrtc_libyuv.h" | 
 | #include "rtc_tools/frame_editing/frame_editing_lib.h" | 
 | #include "typedefs.h"  // NOLINT(build/include) | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | int EditFrames(const std::string& in_path, int width, int height, | 
 |                int first_frame_to_process, int interval, | 
 |                int last_frame_to_process, const std::string& out_path) { | 
 |   if (last_frame_to_process < first_frame_to_process) { | 
 |     fprintf(stderr, "The set of frames to cut is empty! (l < f)\n"); | 
 |     return -10; | 
 |   } | 
 |  | 
 |   FILE* in_fid = fopen(in_path.c_str() , "rb"); | 
 |   if (!in_fid) { | 
 |     fprintf(stderr, "Could not read input file: %s.\n", in_path.c_str()); | 
 |     return -11; | 
 |   } | 
 |  | 
 |   // Frame size of I420. | 
 |   size_t frame_length = CalcBufferSize(VideoType::kI420, width, height); | 
 |  | 
 |   std::unique_ptr<uint8_t[]> temp_buffer(new uint8_t[frame_length]); | 
 |  | 
 |   FILE* out_fid = fopen(out_path.c_str(), "wb"); | 
 |  | 
 |   if (!out_fid) { | 
 |     fprintf(stderr, "Could not open output file: %s.\n", out_path.c_str()); | 
 |     fclose(in_fid); | 
 |     return -12; | 
 |   } | 
 |  | 
 |   int num_frames_read = 0; | 
 |   int num_frames_read_between = 0; | 
 |   size_t num_bytes_read; | 
 |  | 
 |   while ((num_bytes_read = fread(temp_buffer.get(), 1, frame_length, in_fid)) | 
 |       == frame_length) { | 
 |     num_frames_read++; | 
 |     if ((num_frames_read < first_frame_to_process) || | 
 |         (last_frame_to_process < num_frames_read)) { | 
 |       fwrite(temp_buffer.get(), 1, frame_length, out_fid); | 
 |     } else { | 
 |       num_frames_read_between++; | 
 |       if (interval <= 0) { | 
 |         if (interval == -1) { | 
 |           // Remove all frames. | 
 |         } else { | 
 |           if (((num_frames_read_between - 1) % interval) == 0) { | 
 |             // Keep only every |interval| frame. | 
 |             fwrite(temp_buffer.get(), 1, frame_length, out_fid); | 
 |           } | 
 |         } | 
 |       } else if (interval > 0) { | 
 |         for (int i = 1; i <= interval; ++i) { | 
 |           fwrite(temp_buffer.get(), 1, frame_length, out_fid); | 
 |         } | 
 |       } | 
 |     } | 
 |   } | 
 |   if (num_bytes_read > 0 && num_bytes_read < frame_length) { | 
 |     printf("Frame to small! Last frame truncated.\n"); | 
 |   } | 
 |   fclose(in_fid); | 
 |   fclose(out_fid); | 
 |  | 
 |   printf("Done editing!\n"); | 
 |   return 0; | 
 | } | 
 | }  // namespace webrtc |