1/*
2 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_INCOMING_VIDEO_STREAM_H_
12#define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_INCOMING_VIDEO_STREAM_H_
13
14#include "webrtc/modules/video_render/include/video_render.h"
15
16namespace webrtc {
17class CriticalSectionWrapper;
18class EventWrapper;
19class ThreadWrapper;
20class VideoRenderCallback;
21class VideoRenderFrames;
22
23struct VideoMirroring {
24  VideoMirroring() : mirror_x_axis(false), mirror_y_axis(false) {}
25  bool mirror_x_axis;
26  bool mirror_y_axis;
27};
28
29class IncomingVideoStream : public VideoRenderCallback {
30 public:
31  IncomingVideoStream(const int32_t module_id,
32                      const uint32_t stream_id);
33  ~IncomingVideoStream();
34
35  int32_t ChangeModuleId(const int32_t id);
36
37  // Get callback to deliver frames to the module.
38  VideoRenderCallback* ModuleCallback();
39  virtual int32_t RenderFrame(const uint32_t stream_id,
40                              I420VideoFrame& video_frame);
41
42  // Set callback to the platform dependent code.
43  int32_t SetRenderCallback(VideoRenderCallback* render_callback);
44
45  // Callback for file recording, snapshot, ...
46  int32_t SetExternalCallback(VideoRenderCallback* render_object);
47
48  // Start/Stop.
49  int32_t Start();
50  int32_t Stop();
51
52  // Clear all buffers.
53  int32_t Reset();
54
55  // Properties.
56  uint32_t StreamId() const;
57  uint32_t IncomingRate() const;
58
59  int32_t GetLastRenderedFrame(I420VideoFrame& video_frame) const;
60
61  int32_t SetStartImage(const I420VideoFrame& video_frame);
62
63  int32_t SetTimeoutImage(const I420VideoFrame& video_frame,
64                          const uint32_t timeout);
65
66  int32_t EnableMirroring(const bool enable,
67                          const bool mirror_xaxis,
68                          const bool mirror_yaxis);
69
70  int32_t SetExpectedRenderDelay(int32_t delay_ms);
71
72 protected:
73  static bool IncomingVideoStreamThreadFun(void* obj);
74  bool IncomingVideoStreamProcess();
75
76 private:
77  enum { KEventStartupTimeMS = 10 };
78  enum { KEventMaxWaitTimeMs = 100 };
79  enum { KFrameRatePeriodMs = 1000 };
80
81  int32_t module_id_;
82  uint32_t stream_id_;
83  // Critsects in allowed to enter order.
84  CriticalSectionWrapper& stream_critsect_;
85  CriticalSectionWrapper& thread_critsect_;
86  CriticalSectionWrapper& buffer_critsect_;
87  ThreadWrapper* incoming_render_thread_;
88  EventWrapper& deliver_buffer_event_;
89  bool running_;
90
91  VideoRenderCallback* external_callback_;
92  VideoRenderCallback* render_callback_;
93  VideoRenderFrames& render_buffers_;
94
95  RawVideoType callbackVideoType_;
96  uint32_t callbackWidth_;
97  uint32_t callbackHeight_;
98
99  uint32_t incoming_rate_;
100  int64_t last_rate_calculation_time_ms_;
101  uint16_t num_frames_since_last_calculation_;
102  I420VideoFrame last_rendered_frame_;
103  I420VideoFrame temp_frame_;
104  I420VideoFrame start_image_;
105  I420VideoFrame timeout_image_;
106  uint32_t timeout_time_;
107
108  bool mirror_frames_enabled_;
109  VideoMirroring mirroring_;
110  I420VideoFrame transformed_video_frame_;
111};
112
113}  // namespace webrtc
114
115#endif  // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_INCOMING_VIDEO_STREAM_H_
116