blob: dc7a69953e3f071fd5eba32e03cef55951bce7c5 [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>
14#include <cstdio>
Paulina Hensmanb671d462018-09-14 11:32:00 +020015#include <string>
16
Steve Anton68586e82018-12-13 17:41:25 -080017#include "absl/strings/match.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/video/video_frame_buffer.h"
Paulina Hensmanb671d462018-09-14 11:32:00 +020019#include "rtc_base/logging.h"
Paulina Hensmanb671d462018-09-14 11:32:00 +020020
21namespace webrtc {
22namespace test {
Yves Gerey3cb5e5b2019-03-21 11:22:42 +010023namespace {
Paulina Hensmanb671d462018-09-14 11:32:00 +020024
25void WriteVideoToFile(const rtc::scoped_refptr<Video>& video,
26 const std::string& file_name,
Yves Gerey3cb5e5b2019-03-21 11:22:42 +010027 int fps,
28 bool isY4m) {
29 RTC_CHECK(video);
Paulina Hensmanb671d462018-09-14 11:32:00 +020030 FILE* output_file = fopen(file_name.c_str(), "wb");
31 if (output_file == nullptr) {
32 RTC_LOG(LS_ERROR) << "Could not open file for writing: " << file_name;
33 return;
34 }
35
Paulina Hensmanb671d462018-09-14 11:32:00 +020036 if (isY4m) {
37 fprintf(output_file, "YUV4MPEG2 W%d H%d F%d:1 C420\n", video->width(),
38 video->height(), fps);
39 }
40 for (size_t i = 0; i < video->number_of_frames(); ++i) {
41 if (isY4m) {
42 std::string frame = "FRAME\n";
43 fwrite(frame.c_str(), 1, 6, output_file);
44 }
45 rtc::scoped_refptr<I420BufferInterface> buffer = video->GetFrame(i);
Yves Gerey3cb5e5b2019-03-21 11:22:42 +010046 RTC_CHECK(buffer) << "Frame: " << i
47 << "\nWhile trying to create: " << file_name;
Paulina Hensmanb671d462018-09-14 11:32:00 +020048 const uint8_t* data_y = buffer->DataY();
49 int stride = buffer->StrideY();
50 for (int i = 0; i < video->height(); ++i) {
51 fwrite(data_y + i * stride, /*size=*/1, stride, output_file);
52 }
53 const uint8_t* data_u = buffer->DataU();
54 stride = buffer->StrideU();
55 for (int i = 0; i < buffer->ChromaHeight(); ++i) {
56 fwrite(data_u + i * stride, /*size=*/1, stride, output_file);
57 }
58 const uint8_t* data_v = buffer->DataV();
59 stride = buffer->StrideV();
60 for (int i = 0; i < buffer->ChromaHeight(); ++i) {
61 fwrite(data_v + i * stride, /*size=*/1, stride, output_file);
62 }
63 }
64 if (ferror(output_file) != 0) {
65 RTC_LOG(LS_ERROR) << "Error writing to file " << file_name;
66 }
67 fclose(output_file);
68}
69
Yves Gerey3cb5e5b2019-03-21 11:22:42 +010070} // Anonymous namespace
71
72void WriteVideoToFile(const rtc::scoped_refptr<Video>& video,
73 const std::string& file_name,
74 int fps) {
75 WriteVideoToFile(video, file_name, fps,
76 /*isY4m=*/absl::EndsWith(file_name, ".y4m"));
77}
78
79void WriteY4mVideoToFile(const rtc::scoped_refptr<Video>& video,
80 const std::string& file_name,
81 int fps) {
82 WriteVideoToFile(video, file_name, fps, /*isY4m=*/true);
83}
84
85void WriteYuvVideoToFile(const rtc::scoped_refptr<Video>& video,
86 const std::string& file_name,
87 int fps) {
88 WriteVideoToFile(video, file_name, fps, /*isY4m=*/false);
89}
90
Paulina Hensmanb671d462018-09-14 11:32:00 +020091} // namespace test
92} // namespace webrtc