/* * 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. */ #ifndef RTC_TOOLS_CONVERTER_CONVERTER_H_ #define RTC_TOOLS_CONVERTER_CONVERTER_H_ #include #include namespace webrtc { namespace test { // Handles a conversion between a set of RGBA frames to a YUV (I420) video. class Converter { public: Converter(int width, int height); // Converts RGBA to YUV video. If the delete_frames argument is true, the // method will delete the input frames after conversion. bool ConvertRGBAToI420Video(std::string frames_dir, std::string output_file_name, bool delete_frames); private: int width_; // Width of the video (respectively of the RGBA frames). int height_; // Height of the video (respectively of the RGBA frames). // Returns the size of the Y plane in bytes. int YPlaneSize() const { return width_ * height_; } // Returns the size of the U plane in bytes. int UPlaneSize() const { return ((width_ + 1) / 2) * ((height_) / 2); } // Returns the size of the V plane in bytes. int VPlaneSize() const { return ((width_ + 1) / 2) * ((height_) / 2); } // Returns the number of bytes per row in the RGBA frame. int SrcStrideFrame() const { return width_ * 4; } // Returns the number of bytes in the Y plane. int DstStrideY() const { return width_; } // Returns the number of bytes in the U plane. int DstStrideU() const { return (width_ + 1) / 2; } // Returns the number of bytes in the V plane. int DstStrideV() const { return (width_ + 1) / 2; } // Returns the size in bytes of the input RGBA frames. int InputFrameSize() const { return width_ * height_ * 4; } // Writes the Y, U and V (in this order) planes to the file, thus adding a // raw YUV frame to the file. bool AddYUVToFile(uint8_t* y_plane, int y_plane_size, uint8_t* u_plane, int u_plane_size, uint8_t* v_plane, int v_plane_size, FILE* output_file); // Adds the Y, U or V plane to the file. bool AddYUVPlaneToFile(uint8_t* yuv_plane, int yuv_plane_size, FILE* file); // Reads a RGBA frame from input_file_name with input_frame_size size in bytes // into the buffer. bool ReadRGBAFrame(const char* input_file_name, int input_frame_size, unsigned char* buffer); // Finds the full path name of the file - concatenates the directory and file // names. std::string FindFullFileName(std::string dir_name, std::string file_name); // Checks if a file exists. bool FileExists(std::string file_name_to_check); // Returns the name of the file in the form frame_, where is // 4 zero padded (i.e. frame_0000, frame_0001, etc.). std::string FormFrameName(int width, int number); }; } // namespace test } // namespace webrtc #endif // RTC_TOOLS_CONVERTER_CONVERTER_H_