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#ifndef WEBRTC_VIDEO_ENGINE_VIE_FRAME_PROVIDER_BASE_H_ 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VIDEO_ENGINE_VIE_FRAME_PROVIDER_BASE_H_ 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <vector> 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/common_types.h" 17281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 18281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/typedefs.h" 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper; 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VideoEncoder; 243bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.orgclass I420VideoFrame; 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// ViEFrameCallback shall be implemented by all classes receiving frames from a 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// frame provider. 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEFrameCallback { 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void DeliverFrame(int id, 313bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org I420VideoFrame* video_frame, 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int num_csrcs = 0, 3367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org const uint32_t CSRC[kRtpCsrcSize] = NULL) = 0; 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // The capture delay has changed from the provider. |frame_delay| is given in 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // ms. 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void DelayChanged(int id, int frame_delay) = 0; 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get the width, height and frame rate preferred by this observer. 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int GetPreferedFrameSettings(int* width, 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int* height, 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int* frame_rate) = 0; 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // ProviderDestroyed is called when the frame is about to be destroyed. There 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // must not be any more calls to the frame provider after this. 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ProviderDestroyed(int id) = 0; 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~ViEFrameCallback() {} 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// ViEFrameProviderBase is a base class that will deliver frames to all 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// registered ViEFrameCallbacks. 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEFrameProviderBase { 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public: 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViEFrameProviderBase(int Id, int engine_id); 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~ViEFrameProviderBase(); 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Returns the frame provider id. 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int Id(); 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Register frame callbacks, i.e. a receiver of the captured frame. 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int RegisterFrameCallback(int observer_id, 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViEFrameCallback* callback_object); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int DeregisterFrameCallback(const ViEFrameCallback* callback_object); 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool IsFrameCallbackRegistered( 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const ViEFrameCallback* callback_object); 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int NumberOfRegisteredFrameCallbacks(); 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // FrameCallbackChanged 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Inherited classes should check for new frame_settings and reconfigure 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // output if possible. 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int FrameCallbackChanged() = 0; 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected: 783bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org void DeliverFrame(I420VideoFrame* video_frame, 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int num_csrcs = 0, 8067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org const uint32_t CSRC[kRtpCsrcSize] = NULL); 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void SetFrameDelay(int frame_delay); 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int FrameDelay(); 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int GetBestFormat(int* best_width, 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int* best_height, 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int* best_frame_rate); 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int id_; 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int engine_id_; 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Frame callbacks. 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org typedef std::vector<ViEFrameCallback*> FrameCallbacks; 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org FrameCallbacks frame_callbacks_; 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org scoped_ptr<CriticalSectionWrapper> provider_cs_; 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private: 963bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org scoped_ptr<I420VideoFrame> extra_frame_; 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int frame_delay_; 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_VIDEO_ENGINE_VIE_FRAME_PROVIDER_BASE_H_ 103