blob: e4bef17aa58a8588939d94fcbf9dd0d372a86203 [file] [log] [blame]
Paulina Hensmanb671d462018-09-14 11:32:00 +02001/*
2 * Copyright (c) 2018 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 "rtc_tools/video_file_writer.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <stdint.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020014
Yves Gerey3e707812018-11-28 16:47:49 +010015#include <cstdio>
Paulina Hensmanb671d462018-09-14 11:32:00 +020016#include <string>
17
Steve Anton68586e82018-12-13 17:41:25 -080018#include "absl/strings/match.h"
Yves Gerey3e707812018-11-28 16:47:49 +010019#include "api/video/video_frame_buffer.h"
Paulina Hensmanb671d462018-09-14 11:32:00 +020020#include "rtc_base/logging.h"
Paulina Hensmanb671d462018-09-14 11:32:00 +020021
22namespace webrtc {
23namespace test {
Yves Gerey3cb5e5b2019-03-21 11:22:42 +010024namespace {
Paulina Hensmanb671d462018-09-14 11:32:00 +020025
26void WriteVideoToFile(const rtc::scoped_refptr<Video>& video,
27 const std::string& file_name,
Yves Gerey3cb5e5b2019-03-21 11:22:42 +010028 int fps,
29 bool isY4m) {
30 RTC_CHECK(video);
Paulina Hensmanb671d462018-09-14 11:32:00 +020031 FILE* output_file = fopen(file_name.c_str(), "wb");
32 if (output_file == nullptr) {
33 RTC_LOG(LS_ERROR) << "Could not open file for writing: " << file_name;
34 return;
35 }
36
Paulina Hensmanb671d462018-09-14 11:32:00 +020037 if (isY4m) {
38 fprintf(output_file, "YUV4MPEG2 W%d H%d F%d:1 C420\n", video->width(),
39 video->height(), fps);
40 }
41 for (size_t i = 0; i < video->number_of_frames(); ++i) {
42 if (isY4m) {
43 std::string frame = "FRAME\n";
44 fwrite(frame.c_str(), 1, 6, output_file);
45 }
46 rtc::scoped_refptr<I420BufferInterface> buffer = video->GetFrame(i);
Yves Gerey3cb5e5b2019-03-21 11:22:42 +010047 RTC_CHECK(buffer) << "Frame: " << i
48 << "\nWhile trying to create: " << file_name;
Paulina Hensmanb671d462018-09-14 11:32:00 +020049 const uint8_t* data_y = buffer->DataY();
50 int stride = buffer->StrideY();
51 for (int i = 0; i < video->height(); ++i) {
52 fwrite(data_y + i * stride, /*size=*/1, stride, output_file);
53 }
54 const uint8_t* data_u = buffer->DataU();
55 stride = buffer->StrideU();
56 for (int i = 0; i < buffer->ChromaHeight(); ++i) {
57 fwrite(data_u + i * stride, /*size=*/1, stride, output_file);
58 }
59 const uint8_t* data_v = buffer->DataV();
60 stride = buffer->StrideV();
61 for (int i = 0; i < buffer->ChromaHeight(); ++i) {
62 fwrite(data_v + i * stride, /*size=*/1, stride, output_file);
63 }
64 }
65 if (ferror(output_file) != 0) {
66 RTC_LOG(LS_ERROR) << "Error writing to file " << file_name;
67 }
68 fclose(output_file);
69}
70
Yves Gerey3cb5e5b2019-03-21 11:22:42 +010071} // Anonymous namespace
72
73void WriteVideoToFile(const rtc::scoped_refptr<Video>& video,
74 const std::string& file_name,
75 int fps) {
76 WriteVideoToFile(video, file_name, fps,
77 /*isY4m=*/absl::EndsWith(file_name, ".y4m"));
78}
79
80void WriteY4mVideoToFile(const rtc::scoped_refptr<Video>& video,
81 const std::string& file_name,
82 int fps) {
83 WriteVideoToFile(video, file_name, fps, /*isY4m=*/true);
84}
85
86void WriteYuvVideoToFile(const rtc::scoped_refptr<Video>& video,
87 const std::string& file_name,
88 int fps) {
89 WriteVideoToFile(video, file_name, fps, /*isY4m=*/false);
90}
91
Paulina Hensmanb671d462018-09-14 11:32:00 +020092} // namespace test
93} // namespace webrtc