xref: /aosp_15_r20/external/webrtc/test/testsupport/frame_writer.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef TEST_TESTSUPPORT_FRAME_WRITER_H_
12*d9f75844SAndroid Build Coastguard Worker #define TEST_TESTSUPPORT_FRAME_WRITER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <stdio.h>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include <string>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame.h"
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
21*d9f75844SAndroid Build Coastguard Worker namespace test {
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker // Handles writing of video files.
24*d9f75844SAndroid Build Coastguard Worker class FrameWriter {
25*d9f75844SAndroid Build Coastguard Worker  public:
~FrameWriter()26*d9f75844SAndroid Build Coastguard Worker   virtual ~FrameWriter() {}
27*d9f75844SAndroid Build Coastguard Worker 
28*d9f75844SAndroid Build Coastguard Worker   // Initializes the file handler, i.e. opens the input and output files etc.
29*d9f75844SAndroid Build Coastguard Worker   // This must be called before reading or writing frames has started.
30*d9f75844SAndroid Build Coastguard Worker   // Returns false if an error has occurred, in addition to printing to stderr.
31*d9f75844SAndroid Build Coastguard Worker   virtual bool Init() = 0;
32*d9f75844SAndroid Build Coastguard Worker 
33*d9f75844SAndroid Build Coastguard Worker   // Writes a frame of the configured frame length to the output file.
34*d9f75844SAndroid Build Coastguard Worker   // Returns true if the write was successful, false otherwise.
35*d9f75844SAndroid Build Coastguard Worker   virtual bool WriteFrame(const uint8_t* frame_buffer) = 0;
36*d9f75844SAndroid Build Coastguard Worker 
37*d9f75844SAndroid Build Coastguard Worker   // Closes the output file if open. Essentially makes this class impossible
38*d9f75844SAndroid Build Coastguard Worker   // to use anymore. Will also be invoked by the destructor.
39*d9f75844SAndroid Build Coastguard Worker   virtual void Close() = 0;
40*d9f75844SAndroid Build Coastguard Worker 
41*d9f75844SAndroid Build Coastguard Worker   // Frame length in bytes of a single frame image.
42*d9f75844SAndroid Build Coastguard Worker   virtual size_t FrameLength() = 0;
43*d9f75844SAndroid Build Coastguard Worker };
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker // Writes raw I420 frames in sequence.
46*d9f75844SAndroid Build Coastguard Worker class YuvFrameWriterImpl : public FrameWriter {
47*d9f75844SAndroid Build Coastguard Worker  public:
48*d9f75844SAndroid Build Coastguard Worker   // Creates a file handler. The input file is assumed to exist and be readable
49*d9f75844SAndroid Build Coastguard Worker   // and the output file must be writable.
50*d9f75844SAndroid Build Coastguard Worker   // Parameters:
51*d9f75844SAndroid Build Coastguard Worker   //   output_filename         The file to write. Will be overwritten if already
52*d9f75844SAndroid Build Coastguard Worker   //                           existing.
53*d9f75844SAndroid Build Coastguard Worker   //   width, height           Size of each frame to read.
54*d9f75844SAndroid Build Coastguard Worker   YuvFrameWriterImpl(std::string output_filename, int width, int height);
55*d9f75844SAndroid Build Coastguard Worker   ~YuvFrameWriterImpl() override;
56*d9f75844SAndroid Build Coastguard Worker   bool Init() override;
57*d9f75844SAndroid Build Coastguard Worker   bool WriteFrame(const uint8_t* frame_buffer) override;
58*d9f75844SAndroid Build Coastguard Worker   void Close() override;
59*d9f75844SAndroid Build Coastguard Worker   size_t FrameLength() override;
60*d9f75844SAndroid Build Coastguard Worker 
61*d9f75844SAndroid Build Coastguard Worker  protected:
62*d9f75844SAndroid Build Coastguard Worker   const std::string output_filename_;
63*d9f75844SAndroid Build Coastguard Worker   size_t frame_length_in_bytes_;
64*d9f75844SAndroid Build Coastguard Worker   const int width_;
65*d9f75844SAndroid Build Coastguard Worker   const int height_;
66*d9f75844SAndroid Build Coastguard Worker   FILE* output_file_;
67*d9f75844SAndroid Build Coastguard Worker };
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker // Writes raw I420 frames in sequence, but with Y4M file and frame headers for
70*d9f75844SAndroid Build Coastguard Worker // more convenient playback in external media players.
71*d9f75844SAndroid Build Coastguard Worker class Y4mFrameWriterImpl : public YuvFrameWriterImpl {
72*d9f75844SAndroid Build Coastguard Worker  public:
73*d9f75844SAndroid Build Coastguard Worker   Y4mFrameWriterImpl(std::string output_filename,
74*d9f75844SAndroid Build Coastguard Worker                      int width,
75*d9f75844SAndroid Build Coastguard Worker                      int height,
76*d9f75844SAndroid Build Coastguard Worker                      int frame_rate);
77*d9f75844SAndroid Build Coastguard Worker   ~Y4mFrameWriterImpl() override;
78*d9f75844SAndroid Build Coastguard Worker   bool Init() override;
79*d9f75844SAndroid Build Coastguard Worker   bool WriteFrame(const uint8_t* frame_buffer) override;
80*d9f75844SAndroid Build Coastguard Worker 
81*d9f75844SAndroid Build Coastguard Worker  private:
82*d9f75844SAndroid Build Coastguard Worker   const int frame_rate_;
83*d9f75844SAndroid Build Coastguard Worker };
84*d9f75844SAndroid Build Coastguard Worker 
85*d9f75844SAndroid Build Coastguard Worker // LibJpeg is not available on iOS. This class will do nothing on iOS.
86*d9f75844SAndroid Build Coastguard Worker class JpegFrameWriter {
87*d9f75844SAndroid Build Coastguard Worker  public:
88*d9f75844SAndroid Build Coastguard Worker   JpegFrameWriter(const std::string& output_filename);
89*d9f75844SAndroid Build Coastguard Worker   // Quality can be from 0 (worst) to 100 (best). Best quality is still lossy.
90*d9f75844SAndroid Build Coastguard Worker   // WriteFrame can be called only once. Subsequent calls will fail.
91*d9f75844SAndroid Build Coastguard Worker   bool WriteFrame(const VideoFrame& input_frame, int quality);
92*d9f75844SAndroid Build Coastguard Worker 
93*d9f75844SAndroid Build Coastguard Worker #if !defined(WEBRTC_IOS)
94*d9f75844SAndroid Build Coastguard Worker  private:
95*d9f75844SAndroid Build Coastguard Worker   bool frame_written_;
96*d9f75844SAndroid Build Coastguard Worker   const std::string output_filename_;
97*d9f75844SAndroid Build Coastguard Worker   FILE* output_file_;
98*d9f75844SAndroid Build Coastguard Worker #endif
99*d9f75844SAndroid Build Coastguard Worker };
100*d9f75844SAndroid Build Coastguard Worker 
101*d9f75844SAndroid Build Coastguard Worker }  // namespace test
102*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
103*d9f75844SAndroid Build Coastguard Worker 
104*d9f75844SAndroid Build Coastguard Worker #endif  // TEST_TESTSUPPORT_FRAME_WRITER_H_
105