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