OLD | NEW |
| (Empty) |
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 <memory> | |
15 #include <string> | |
16 | |
17 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | |
18 #include "webrtc/tools/frame_editing/frame_editing_lib.h" | |
19 #include "webrtc/typedefs.h" | |
20 | |
21 namespace webrtc { | |
22 | |
23 int EditFrames(const std::string& in_path, int width, int height, | |
24 int first_frame_to_process, int interval, | |
25 int last_frame_to_process, const std::string& out_path) { | |
26 if (last_frame_to_process < first_frame_to_process) { | |
27 fprintf(stderr, "The set of frames to cut is empty! (l < f)\n"); | |
28 return -10; | |
29 } | |
30 | |
31 FILE* in_fid = fopen(in_path.c_str() , "rb"); | |
32 if (!in_fid) { | |
33 fprintf(stderr, "Could not read input file: %s.\n", in_path.c_str()); | |
34 return -11; | |
35 } | |
36 | |
37 // Frame size of I420. | |
38 size_t frame_length = CalcBufferSize(VideoType::kI420, width, height); | |
39 | |
40 std::unique_ptr<uint8_t[]> temp_buffer(new uint8_t[frame_length]); | |
41 | |
42 FILE* out_fid = fopen(out_path.c_str(), "wb"); | |
43 | |
44 if (!out_fid) { | |
45 fprintf(stderr, "Could not open output file: %s.\n", out_path.c_str()); | |
46 fclose(in_fid); | |
47 return -12; | |
48 } | |
49 | |
50 int num_frames_read = 0; | |
51 int num_frames_read_between = 0; | |
52 size_t num_bytes_read; | |
53 | |
54 while ((num_bytes_read = fread(temp_buffer.get(), 1, frame_length, in_fid)) | |
55 == frame_length) { | |
56 num_frames_read++; | |
57 if ((num_frames_read < first_frame_to_process) || | |
58 (last_frame_to_process < num_frames_read)) { | |
59 fwrite(temp_buffer.get(), 1, frame_length, out_fid); | |
60 } else { | |
61 num_frames_read_between++; | |
62 if (interval <= 0) { | |
63 if (interval == -1) { | |
64 // Remove all frames. | |
65 } else { | |
66 if (((num_frames_read_between - 1) % interval) == 0) { | |
67 // Keep only every |interval| frame. | |
68 fwrite(temp_buffer.get(), 1, frame_length, out_fid); | |
69 } | |
70 } | |
71 } else if (interval > 0) { | |
72 for (int i = 1; i <= interval; ++i) { | |
73 fwrite(temp_buffer.get(), 1, frame_length, out_fid); | |
74 } | |
75 } | |
76 } | |
77 } | |
78 if (num_bytes_read > 0 && num_bytes_read < frame_length) { | |
79 printf("Frame to small! Last frame truncated.\n"); | |
80 } | |
81 fclose(in_fid); | |
82 fclose(out_fid); | |
83 | |
84 printf("Done editing!\n"); | |
85 return 0; | |
86 } | |
87 } // namespace webrtc | |
OLD | NEW |