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