OLD | NEW |
---|---|
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 20 matching lines...) Expand all Loading... | |
31 #define TALK_MEDIA_BASE_VIDEOCAPTURER_H_ | 31 #define TALK_MEDIA_BASE_VIDEOCAPTURER_H_ |
32 | 32 |
33 #include <algorithm> | 33 #include <algorithm> |
34 #include <string> | 34 #include <string> |
35 #include <vector> | 35 #include <vector> |
36 | 36 |
37 #include "talk/media/base/mediachannel.h" | 37 #include "talk/media/base/mediachannel.h" |
38 #include "talk/media/base/videoadapter.h" | 38 #include "talk/media/base/videoadapter.h" |
39 #include "talk/media/base/videocommon.h" | 39 #include "talk/media/base/videocommon.h" |
40 #include "talk/media/base/videoframefactory.h" | 40 #include "talk/media/base/videoframefactory.h" |
41 #include "talk/media/base/videosourcebase.h" | |
41 #include "talk/media/devices/devicemanager.h" | 42 #include "talk/media/devices/devicemanager.h" |
42 #include "webrtc/base/basictypes.h" | 43 #include "webrtc/base/basictypes.h" |
43 #include "webrtc/base/criticalsection.h" | 44 #include "webrtc/base/criticalsection.h" |
45 #include "webrtc/media/base/videosourceinterface.h" | |
44 #include "webrtc/base/messagehandler.h" | 46 #include "webrtc/base/messagehandler.h" |
45 #include "webrtc/base/rollingaccumulator.h" | 47 #include "webrtc/base/rollingaccumulator.h" |
46 #include "webrtc/base/scoped_ptr.h" | 48 #include "webrtc/base/scoped_ptr.h" |
47 #include "webrtc/base/sigslot.h" | 49 #include "webrtc/base/sigslot.h" |
48 #include "webrtc/base/thread.h" | 50 #include "webrtc/base/thread.h" |
49 #include "webrtc/base/timing.h" | 51 #include "webrtc/base/timing.h" |
50 | 52 |
51 | 53 |
52 namespace cricket { | 54 namespace cricket { |
53 | 55 |
(...skipping 29 matching lines...) Expand all Loading... | |
83 // fourcc, pixel_width, and pixel_height should keep the same over frames. | 85 // fourcc, pixel_width, and pixel_height should keep the same over frames. |
84 int width; // in number of pixels | 86 int width; // in number of pixels |
85 int height; // in number of pixels | 87 int height; // in number of pixels |
86 uint32_t fourcc; // compression | 88 uint32_t fourcc; // compression |
87 uint32_t pixel_width; // width of a pixel, default is 1 | 89 uint32_t pixel_width; // width of a pixel, default is 1 |
88 uint32_t pixel_height; // height of a pixel, default is 1 | 90 uint32_t pixel_height; // height of a pixel, default is 1 |
89 int64_t time_stamp; // timestamp of when the frame was captured, in unix | 91 int64_t time_stamp; // timestamp of when the frame was captured, in unix |
90 // time with nanosecond units. | 92 // time with nanosecond units. |
91 uint32_t data_size; // number of bytes of the frame data | 93 uint32_t data_size; // number of bytes of the frame data |
92 | 94 |
93 webrtc::VideoRotation rotation; // rotation in degrees of the frame. | 95 webrtc::VideoRotation rotation; // rotation in degrees of the frame. |
94 | 96 |
95 void* data; // pointer to the frame data. This object allocates the | 97 void* data; // pointer to the frame data. This object allocates the |
96 // memory or points to an existing memory. | 98 // memory or points to an existing memory. |
97 | 99 |
98 private: | 100 private: |
99 RTC_DISALLOW_COPY_AND_ASSIGN(CapturedFrame); | 101 RTC_DISALLOW_COPY_AND_ASSIGN(CapturedFrame); |
100 }; | 102 }; |
101 | 103 |
102 // VideoCapturer is an abstract class that defines the interfaces for video | 104 // VideoCapturer is an abstract class that defines the interfaces for video |
103 // capturing. The subclasses implement the video capturer for various types of | 105 // capturing. The subclasses implement the video capturer for various types of |
(...skipping 14 matching lines...) Expand all Loading... | |
118 // video_adapter()->OnOutputFormatRequest(desired_encoding_format) | 120 // video_adapter()->OnOutputFormatRequest(desired_encoding_format) |
119 // Start() | 121 // Start() |
120 // GetCaptureFormat() optionally | 122 // GetCaptureFormat() optionally |
121 // Stop() | 123 // Stop() |
122 // | 124 // |
123 // Assumption: | 125 // Assumption: |
124 // The Start() and Stop() methods are called by a single thread (E.g., the | 126 // The Start() and Stop() methods are called by a single thread (E.g., the |
125 // media engine thread). Hence, the VideoCapture subclasses dont need to be | 127 // media engine thread). Hence, the VideoCapture subclasses dont need to be |
126 // thread safe. | 128 // thread safe. |
127 // | 129 // |
128 class VideoCapturer | 130 class VideoCapturer : public sigslot::has_slots<>, |
129 : public sigslot::has_slots<>, | 131 public rtc::MessageHandler, |
130 public rtc::MessageHandler { | 132 public rtc::VideoSourceBase { |
pthatcher1
2016/02/03 15:38:35
Can we try making this "has a muxer" rather than "
| |
131 public: | 133 public: |
132 // All signals are marshalled to |thread| or the creating thread if | 134 // All signals are marshalled to |thread| or the creating thread if |
133 // none is provided. | 135 // none is provided. |
134 VideoCapturer(); | 136 VideoCapturer(); |
135 explicit VideoCapturer(rtc::Thread* thread); | 137 explicit VideoCapturer(rtc::Thread* thread); |
136 virtual ~VideoCapturer() {} | 138 virtual ~VideoCapturer() {} |
137 | 139 |
138 // Gets the id of the underlying device, which is available after the capturer | 140 // Gets the id of the underlying device, which is available after the capturer |
139 // is initialized. Can be used to determine if two capturers reference the | 141 // is initialized. Can be used to determine if two capturers reference the |
140 // same device. | 142 // same device. |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
207 // When muting, produce black frames then pause the camera. | 209 // When muting, produce black frames then pause the camera. |
208 // When unmuting, start the camera. Camera starts unmuted. | 210 // When unmuting, start the camera. Camera starts unmuted. |
209 virtual bool MuteToBlackThenPause(bool muted); | 211 virtual bool MuteToBlackThenPause(bool muted); |
210 virtual bool IsMuted() const { | 212 virtual bool IsMuted() const { |
211 return muted_; | 213 return muted_; |
212 } | 214 } |
213 CaptureState capture_state() const { | 215 CaptureState capture_state() const { |
214 return capture_state_; | 216 return capture_state_; |
215 } | 217 } |
216 | 218 |
217 // Tells videocapturer whether to apply the pending rotation. By default, the | 219 void OnSinkCapabilitiesChanged( |
218 // rotation is applied and the generated frame is up right. When set to false, | 220 const rtc::VideoSinkCapabilities& capabilities) override; |
219 // generated frames will carry the rotation information from | 221 |
220 // SetCaptureRotation. Return value indicates whether this operation succeeds. | |
221 virtual bool SetApplyRotation(bool enable); | |
222 virtual bool GetApplyRotation() { return apply_rotation_; } | 222 virtual bool GetApplyRotation() { return apply_rotation_; } |
223 | 223 |
224 // Returns true if the capturer is screencasting. This can be used to | 224 // Returns true if the capturer is screencasting. This can be used to |
225 // implement screencast specific behavior. | 225 // implement screencast specific behavior. |
226 virtual bool IsScreencast() const = 0; | 226 virtual bool IsScreencast() const = 0; |
227 | 227 |
228 // Caps the VideoCapturer's format according to max_format. It can e.g. be | 228 // Caps the VideoCapturer's format according to max_format. It can e.g. be |
229 // used to prevent cameras from capturing at a resolution or framerate that | 229 // used to prevent cameras from capturing at a resolution or framerate that |
230 // the capturer is capable of but not performing satisfactorily at. | 230 // the capturer is capable of but not performing satisfactorily at. |
231 // The capping is an upper bound for each component of the capturing format. | 231 // The capping is an upper bound for each component of the capturing format. |
(...skipping 18 matching lines...) Expand all Loading... | |
250 // Signal all capture state changes that are not a direct result of calling | 250 // Signal all capture state changes that are not a direct result of calling |
251 // Start(). | 251 // Start(). |
252 sigslot::signal2<VideoCapturer*, CaptureState> SignalStateChange; | 252 sigslot::signal2<VideoCapturer*, CaptureState> SignalStateChange; |
253 // Frame callbacks are multithreaded to allow disconnect and connect to be | 253 // Frame callbacks are multithreaded to allow disconnect and connect to be |
254 // called concurrently. It also ensures that it is safe to call disconnect | 254 // called concurrently. It also ensures that it is safe to call disconnect |
255 // at any time which is needed since the signal may be called from an | 255 // at any time which is needed since the signal may be called from an |
256 // unmarshalled thread owned by the VideoCapturer. | 256 // unmarshalled thread owned by the VideoCapturer. |
257 // Signal the captured frame to downstream. | 257 // Signal the captured frame to downstream. |
258 sigslot::signal2<VideoCapturer*, const CapturedFrame*, | 258 sigslot::signal2<VideoCapturer*, const CapturedFrame*, |
259 sigslot::multi_threaded_local> SignalFrameCaptured; | 259 sigslot::multi_threaded_local> SignalFrameCaptured; |
260 // Signal the captured and possibly adapted frame to downstream consumers | |
261 // such as the encoder. | |
262 sigslot::signal2<VideoCapturer*, const VideoFrame*, | |
263 sigslot::multi_threaded_local> SignalVideoFrame; | |
264 | 260 |
265 // If true, run video adaptation. By default, video adaptation is enabled | 261 // If true, run video adaptation. By default, video adaptation is enabled |
266 // and users must call video_adapter()->OnOutputFormatRequest() | 262 // and users must call video_adapter()->OnOutputFormatRequest() |
267 // to receive frames. | 263 // to receive frames. |
268 bool enable_video_adapter() const { return enable_video_adapter_; } | 264 bool enable_video_adapter() const { return enable_video_adapter_; } |
269 void set_enable_video_adapter(bool enable_video_adapter) { | 265 void set_enable_video_adapter(bool enable_video_adapter) { |
270 enable_video_adapter_ = enable_video_adapter; | 266 enable_video_adapter_ = enable_video_adapter; |
271 } | 267 } |
272 | 268 |
273 CoordinatedVideoAdapter* video_adapter() { return &video_adapter_; } | 269 CoordinatedVideoAdapter* video_adapter() { return &video_adapter_; } |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
376 | 372 |
377 // Whether capturer should apply rotation to the frame before signaling it. | 373 // Whether capturer should apply rotation to the frame before signaling it. |
378 bool apply_rotation_; | 374 bool apply_rotation_; |
379 | 375 |
380 RTC_DISALLOW_COPY_AND_ASSIGN(VideoCapturer); | 376 RTC_DISALLOW_COPY_AND_ASSIGN(VideoCapturer); |
381 }; | 377 }; |
382 | 378 |
383 } // namespace cricket | 379 } // namespace cricket |
384 | 380 |
385 #endif // TALK_MEDIA_BASE_VIDEOCAPTURER_H_ | 381 #endif // TALK_MEDIA_BASE_VIDEOCAPTURER_H_ |
OLD | NEW |