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 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This sub-API supports the following functionalities: 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// - Specify render destinations for incoming video streams, capture devices 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// and files. 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// - Configuring render streams. 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_RENDER_H_ 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_RENDER_H_ 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/common_types.h" 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VideoEngine; 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VideoRender; 253051951c0e66a04914085e9fa0d28c6564642ba9pbos@webrtc.orgclass VideoRenderCallback; 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This class declares an abstract interface to be used for external renderers. 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The user implemented derived class is registered using AddRenderer(). 294673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.orgclass ExternalRenderer { 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This method will be called when the stream to be rendered changes in 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // resolution or number of streams mixed in the image. 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int FrameSizeChange(unsigned int width, 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int height, 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int number_of_streams) = 0; 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This method is called when a new frame should be rendered. 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int DeliverFrame(unsigned char* buffer, 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int buffer_size, 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // RTP timestamp in 90kHz. 419d10769e109601915022fea44ec392645c3b0704wu@webrtc.org uint32_t timestamp, 429d10769e109601915022fea44ec392645c3b0704wu@webrtc.org // NTP time of the capture time in local timebase 439d10769e109601915022fea44ec392645c3b0704wu@webrtc.org // in milliseconds. 449d10769e109601915022fea44ec392645c3b0704wu@webrtc.org int64_t ntp_time_ms, 459d10769e109601915022fea44ec392645c3b0704wu@webrtc.org // Wallclock render time in milliseconds. 469d10769e109601915022fea44ec392645c3b0704wu@webrtc.org int64_t render_time_ms, 479d10769e109601915022fea44ec392645c3b0704wu@webrtc.org // Handle of the underlying video frame. 48ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org void* handle) = 0; 49ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org 50ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org // Returns true if the renderer supports textures. DeliverFrame can be called 51ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org // with NULL |buffer| and non-NULL |handle|. 52ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org virtual bool IsTextureSupported() = 0; 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected: 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~ExternalRenderer() {} 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 584673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.orgclass ViERender { 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Factory for the ViERender sub‐API and increases an internal reference 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // counter if successful. Returns NULL if the API is not supported or if 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // construction fails. 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static ViERender* GetInterface(VideoEngine* video_engine); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Releases the ViERender sub-API and decreases an internal reference 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // counter. Returns the new reference count. This value should be zero 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // for all sub-API:s before the VideoEngine object can be safely deleted. 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int Release() = 0; 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Registers render module. 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int RegisterVideoRenderModule(VideoRender& render_module) = 0; 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Deregisters render module. 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int DeRegisterVideoRenderModule(VideoRender& render_module) = 0; 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Sets the render destination for a given render ID. 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int AddRenderer(const int render_id, 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void* window, 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const unsigned int z_order, 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float left, 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float top, 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float right, 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float bottom) = 0; 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Removes the renderer for a stream. 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int RemoveRenderer(const int render_id) = 0; 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Starts rendering a render stream. 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int StartRender(const int render_id) = 0; 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Stops rendering a render stream. 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int StopRender(const int render_id) = 0; 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set expected render time needed by graphics card or external renderer, i.e. 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // the number of ms a frame will be sent to rendering before the actual render 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // time. 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int SetExpectedRenderDelay(int render_id, int render_delay) = 0; 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Configures an already added render stream. 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int ConfigureRender(int render_id, 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const unsigned int z_order, 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float left, 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float top, 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float right, 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float bottom) = 0; 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This function mirrors the rendered stream left and right or up and down. 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int MirrorRenderStream(const int render_id, 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const bool enable, 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const bool mirror_xaxis, 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const bool mirror_yaxis) = 0; 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // External render. 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int AddRenderer(const int render_id, 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RawVideoType video_input_format, 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ExternalRenderer* renderer) = 0; 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1183051951c0e66a04914085e9fa0d28c6564642ba9pbos@webrtc.org // Propagating VideoRenderCallback down to the VideoRender module for new API. 1193051951c0e66a04914085e9fa0d28c6564642ba9pbos@webrtc.org // Contains default-implementation not to break code mocking this interface. 1203051951c0e66a04914085e9fa0d28c6564642ba9pbos@webrtc.org // (Ugly, but temporary.) 1213051951c0e66a04914085e9fa0d28c6564642ba9pbos@webrtc.org virtual int AddRenderCallback(int render_id, VideoRenderCallback* callback) { 1223051951c0e66a04914085e9fa0d28c6564642ba9pbos@webrtc.org return 0; 1233051951c0e66a04914085e9fa0d28c6564642ba9pbos@webrtc.org } 1243051951c0e66a04914085e9fa0d28c6564642ba9pbos@webrtc.org 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected: 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViERender() {} 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~ViERender() {} 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_RENDER_H_ 133