1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 117a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org#ifndef WEBRTC_VIDEO_ENGINE_TEST_LIBVIETEST_INCLUDE_VIE_TO_FILE_RENDERER_H_ 127a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org#define WEBRTC_VIDEO_ENGINE_TEST_LIBVIETEST_INCLUDE_VIE_TO_FILE_RENDERER_H_ 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 143f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdio.h> 153f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <string.h> 163f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org 177a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org#include <list> 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string> 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20774b3d38a4a0f1a8ec08972a3c543cb5d607ce13henrike@webrtc.org#include "webrtc/base/constructormagic.h" 217a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 22281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/include/vie_render.h" 237a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org 247a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.orgnamespace webrtc { 257a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.orgclass CriticalSectionWrapper; 267a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.orgclass EventWrapper; 277a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.orgclass ThreadWrapper; 287a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org}; // namespace webrtc 297a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org 307a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.orgnamespace test { 317a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.orgstruct Frame; 327a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org}; // namespace test 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEToFileRenderer: public webrtc::ExternalRenderer { 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViEToFileRenderer(); 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~ViEToFileRenderer(); 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Returns false if we fail opening the output filename for writing. 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool PrepareForRendering(const std::string& output_path, 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string& output_filename); 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Closes the output file. 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void StopRendering(); 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Deletes the closed output file from the file system. This is one option 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // after calling StopRendering, the other being KeepOutputFile. This file 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // renderer will forget about the file after this call and can be used again. 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool DeleteOutputFile(); 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Renames the closed output file to its previous name with the provided 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // prefix prepended. This file renderer will forget about the file after this 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // call and can be used again. 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool SaveOutputFile(const std::string& prefix); 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Implementation of ExternalRenderer: 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int FrameSizeChange(unsigned int width, unsigned int height, 58ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org unsigned int number_of_streams) OVERRIDE; 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int DeliverFrame(unsigned char* buffer, 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int buffer_size, 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org uint32_t time_stamp, 639d10769e109601915022fea44ec392645c3b0704wu@webrtc.org int64_t ntp_time_ms, 64ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org int64_t render_time, 65ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org void* handle) OVERRIDE; 66ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org 67ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org bool IsTextureSupported() OVERRIDE; 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string GetFullOutputPath() const; 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private: 727a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org typedef std::list<test::Frame*> FrameQueue; 737a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org 747a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org static bool RunRenderThread(void* obj); 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void ForgetOutputFile(); 767a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org bool ProcessRenderQueue(); 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 783f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org FILE* output_file_; 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string output_path_; 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string output_filename_; 817a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org webrtc::scoped_ptr<webrtc::ThreadWrapper> thread_; 827a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org webrtc::scoped_ptr<webrtc::CriticalSectionWrapper> frame_queue_cs_; 837a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org webrtc::scoped_ptr<webrtc::EventWrapper> frame_render_event_; 847a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org FrameQueue render_queue_; 857a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org FrameQueue free_frame_queue_; 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 887a7d2346e951684ce48baddf70dff7dd9b06566fstefan@webrtc.org#endif // WEBRTC_VIDEO_ENGINE_TEST_LIBVIETEST_INCLUDE_VIE_TO_FILE_RENDERER_H_ 89