|  | /* | 
|  | *  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 <cstdint> | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "common_types.h"  // NOLINT(build/include) | 
|  | #include "common_video/libyuv/include/webrtc_libyuv.h" | 
|  | #include "rtc_tools/frame_editing/frame_editing_lib.h" | 
|  |  | 
|  | 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 |