Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(306)

Side by Side Diff: webrtc/media/base/videocapturer.h

Issue 2357113002: Revert of Delete VideoFrameFactory, CapturedFrame, and related code. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/media/base/videoadapter_unittest.cc ('k') | webrtc/media/base/videocapturer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 10 matching lines...) Expand all
21 #include "webrtc/base/basictypes.h" 21 #include "webrtc/base/basictypes.h"
22 #include "webrtc/base/constructormagic.h" 22 #include "webrtc/base/constructormagic.h"
23 #include "webrtc/base/criticalsection.h" 23 #include "webrtc/base/criticalsection.h"
24 #include "webrtc/media/base/videosourceinterface.h" 24 #include "webrtc/media/base/videosourceinterface.h"
25 #include "webrtc/base/sigslot.h" 25 #include "webrtc/base/sigslot.h"
26 #include "webrtc/base/thread_checker.h" 26 #include "webrtc/base/thread_checker.h"
27 #include "webrtc/base/timestampaligner.h" 27 #include "webrtc/base/timestampaligner.h"
28 #include "webrtc/media/base/videoadapter.h" 28 #include "webrtc/media/base/videoadapter.h"
29 #include "webrtc/media/base/videobroadcaster.h" 29 #include "webrtc/media/base/videobroadcaster.h"
30 #include "webrtc/media/base/videocommon.h" 30 #include "webrtc/media/base/videocommon.h"
31 #include "webrtc/media/base/videoframefactory.h"
31 32
32 33
33 namespace cricket { 34 namespace cricket {
34 35
35 // Current state of the capturer. 36 // Current state of the capturer.
36 enum CaptureState { 37 enum CaptureState {
37 CS_STOPPED, // The capturer has been stopped or hasn't started yet. 38 CS_STOPPED, // The capturer has been stopped or hasn't started yet.
38 CS_STARTING, // The capturer is in the process of starting. Note, it may 39 CS_STARTING, // The capturer is in the process of starting. Note, it may
39 // still fail to start. 40 // still fail to start.
40 CS_RUNNING, // The capturer has been started successfully and is now 41 CS_RUNNING, // The capturer has been started successfully and is now
41 // capturing. 42 // capturing.
42 CS_FAILED, // The capturer failed to start. 43 CS_FAILED, // The capturer failed to start.
43 }; 44 };
44 45
45 class VideoFrame; 46 class VideoFrame;
46 47
48 struct CapturedFrame {
49 static const uint32_t kFrameHeaderSize = 40; // Size from width to data_size.
50 static const uint32_t kUnknownDataSize = 0xFFFFFFFF;
51
52 CapturedFrame();
53
54 // Get the number of bytes of the frame data. If data_size is known, return
55 // it directly. Otherwise, calculate the size based on width, height, and
56 // fourcc. Return true if succeeded.
57 bool GetDataSize(uint32_t* size) const;
58
59 // The width and height of the captured frame could be different from those
60 // of VideoFormat. Once the first frame is captured, the width, height,
61 // fourcc, pixel_width, and pixel_height should keep the same over frames.
62 int width; // in number of pixels
63 int height; // in number of pixels
64 uint32_t fourcc; // compression
65 uint32_t pixel_width; // width of a pixel, default is 1
66 uint32_t pixel_height; // height of a pixel, default is 1
67 int64_t time_stamp; // timestamp of when the frame was captured, in unix
68 // time with nanosecond units.
69 uint32_t data_size; // number of bytes of the frame data
70
71 webrtc::VideoRotation rotation; // rotation in degrees of the frame.
72
73 void* data; // pointer to the frame data. This object allocates the
74 // memory or points to an existing memory.
75
76 private:
77 RTC_DISALLOW_COPY_AND_ASSIGN(CapturedFrame);
78 };
79
47 // VideoCapturer is an abstract class that defines the interfaces for video 80 // VideoCapturer is an abstract class that defines the interfaces for video
48 // capturing. The subclasses implement the video capturer for various types of 81 // capturing. The subclasses implement the video capturer for various types of
49 // capturers and various platforms. 82 // capturers and various platforms.
50 // 83 //
51 // The captured frames may need to be adapted (for example, cropping). 84 // The captured frames may need to be adapted (for example, cropping).
52 // Video adaptation is built into and enabled by default. After a frame has 85 // Video adaptation is built into and enabled by default. After a frame has
53 // been captured from the device, it is sent to the video adapter, then out to 86 // been captured from the device, it is sent to the video adapter, then out to
54 // the sinks. 87 // the sinks.
55 // 88 //
56 // Programming model: 89 // Programming model:
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 void set_enable_camera_list(bool enable_camera_list) { 197 void set_enable_camera_list(bool enable_camera_list) {
165 enable_camera_list_ = enable_camera_list; 198 enable_camera_list_ = enable_camera_list;
166 } 199 }
167 bool enable_camera_list() { 200 bool enable_camera_list() {
168 return enable_camera_list_; 201 return enable_camera_list_;
169 } 202 }
170 203
171 // Signal all capture state changes that are not a direct result of calling 204 // Signal all capture state changes that are not a direct result of calling
172 // Start(). 205 // Start().
173 sigslot::signal2<VideoCapturer*, CaptureState> SignalStateChange; 206 sigslot::signal2<VideoCapturer*, CaptureState> SignalStateChange;
207 // Frame callbacks are multithreaded to allow disconnect and connect to be
208 // called concurrently. It also ensures that it is safe to call disconnect
209 // at any time which is needed since the signal may be called from an
210 // unmarshalled thread owned by the VideoCapturer.
211 // Signal the captured frame to downstream.
212 sigslot::signal2<VideoCapturer*, const CapturedFrame*,
213 sigslot::multi_threaded_local> SignalFrameCaptured;
174 214
175 // If true, run video adaptation. By default, video adaptation is enabled 215 // If true, run video adaptation. By default, video adaptation is enabled
176 // and users must call video_adapter()->OnOutputFormatRequest() 216 // and users must call video_adapter()->OnOutputFormatRequest()
177 // to receive frames. 217 // to receive frames.
178 bool enable_video_adapter() const { return enable_video_adapter_; } 218 bool enable_video_adapter() const { return enable_video_adapter_; }
179 void set_enable_video_adapter(bool enable_video_adapter) { 219 void set_enable_video_adapter(bool enable_video_adapter) {
180 enable_video_adapter_ = enable_video_adapter; 220 enable_video_adapter_ = enable_video_adapter;
181 } 221 }
182 222
223 // Takes ownership.
224 void set_frame_factory(VideoFrameFactory* frame_factory);
225
183 bool GetInputSize(int* width, int* height); 226 bool GetInputSize(int* width, int* height);
184 227
185 // Implements VideoSourceInterface 228 // Implements VideoSourceInterface
186 void AddOrUpdateSink(rtc::VideoSinkInterface<cricket::VideoFrame>* sink, 229 void AddOrUpdateSink(rtc::VideoSinkInterface<cricket::VideoFrame>* sink,
187 const rtc::VideoSinkWants& wants) override; 230 const rtc::VideoSinkWants& wants) override;
188 void RemoveSink(rtc::VideoSinkInterface<cricket::VideoFrame>* sink) override; 231 void RemoveSink(rtc::VideoSinkInterface<cricket::VideoFrame>* sink) override;
189 232
190 protected: 233 protected:
191 // OnSinkWantsChanged can be overridden to change the default behavior 234 // OnSinkWantsChanged can be overridden to change the default behavior
192 // when a sink changes its VideoSinkWants by calling AddOrUpdateSink. 235 // when a sink changes its VideoSinkWants by calling AddOrUpdateSink.
(...skipping 20 matching lines...) Expand all
213 int64_t camera_time_us, 256 int64_t camera_time_us,
214 int64_t system_time_us, 257 int64_t system_time_us,
215 int* out_width, 258 int* out_width,
216 int* out_height, 259 int* out_height,
217 int* crop_width, 260 int* crop_width,
218 int* crop_height, 261 int* crop_height,
219 int* crop_x, 262 int* crop_x,
220 int* crop_y, 263 int* crop_y,
221 int64_t* translated_camera_time_us); 264 int64_t* translated_camera_time_us);
222 265
266 // Callback attached to SignalFrameCaptured where SignalVideoFrames is called.
267 void OnFrameCaptured(VideoCapturer* video_capturer,
268 const CapturedFrame* captured_frame);
269
223 // Called when a frame has been captured and converted to a 270 // Called when a frame has been captured and converted to a
224 // VideoFrame. OnFrame can be called directly by an implementation 271 // VideoFrame. OnFrame can be called directly by an implementation
225 // that does not use SignalFrameCaptured or OnFrameCaptured. The 272 // that does not use SignalFrameCaptured or OnFrameCaptured. The
226 // orig_width and orig_height are used only to produce stats. 273 // orig_width and orig_height are used only to produce stats.
227 void OnFrame(const VideoFrame& frame, int orig_width, int orig_height); 274 void OnFrame(const VideoFrame& frame, int orig_width, int orig_height);
228 275
229 VideoAdapter* video_adapter() { return &video_adapter_; } 276 VideoAdapter* video_adapter() { return &video_adapter_; }
230 277
231 void SetCaptureState(CaptureState state); 278 void SetCaptureState(CaptureState state);
232 279
233 // subclasses override this virtual method to provide a vector of fourccs, in 280 // subclasses override this virtual method to provide a vector of fourccs, in
234 // order of preference, that are expected by the media engine. 281 // order of preference, that are expected by the media engine.
235 virtual bool GetPreferredFourccs(std::vector<uint32_t>* fourccs) = 0; 282 virtual bool GetPreferredFourccs(std::vector<uint32_t>* fourccs) = 0;
236 283
237 // mutators to set private attributes 284 // mutators to set private attributes
238 void SetId(const std::string& id) { 285 void SetId(const std::string& id) {
239 id_ = id; 286 id_ = id;
240 } 287 }
241 288
242 void SetCaptureFormat(const VideoFormat* format) { 289 void SetCaptureFormat(const VideoFormat* format) {
243 capture_format_.reset(format ? new VideoFormat(*format) : NULL); 290 capture_format_.reset(format ? new VideoFormat(*format) : NULL);
244 } 291 }
245 292
246 void SetSupportedFormats(const std::vector<VideoFormat>& formats); 293 void SetSupportedFormats(const std::vector<VideoFormat>& formats);
294 VideoFrameFactory* frame_factory() { return frame_factory_.get(); }
247 295
248 private: 296 private:
249 void Construct(); 297 void Construct();
250 // Get the distance between the desired format and the supported format. 298 // Get the distance between the desired format and the supported format.
251 // Return the max distance if they mismatch. See the implementation for 299 // Return the max distance if they mismatch. See the implementation for
252 // details. 300 // details.
253 int64_t GetFormatDistance(const VideoFormat& desired, 301 int64_t GetFormatDistance(const VideoFormat& desired,
254 const VideoFormat& supported); 302 const VideoFormat& supported);
255 303
304 // Convert captured frame to readable string for LOG messages.
305 std::string ToString(const CapturedFrame* frame) const;
306
256 // Updates filtered_supported_formats_ so that it contains the formats in 307 // Updates filtered_supported_formats_ so that it contains the formats in
257 // supported_formats_ that fulfill all applied restrictions. 308 // supported_formats_ that fulfill all applied restrictions.
258 void UpdateFilteredSupportedFormats(); 309 void UpdateFilteredSupportedFormats();
259 // Returns true if format doesn't fulfill all applied restrictions. 310 // Returns true if format doesn't fulfill all applied restrictions.
260 bool ShouldFilterFormat(const VideoFormat& format) const; 311 bool ShouldFilterFormat(const VideoFormat& format) const;
261 312
262 void UpdateInputSize(int width, int height); 313 void UpdateInputSize(int width, int height);
263 314
264 rtc::ThreadChecker thread_checker_; 315 rtc::ThreadChecker thread_checker_;
265 std::string id_; 316 std::string id_;
266 CaptureState capture_state_; 317 CaptureState capture_state_;
318 std::unique_ptr<VideoFrameFactory> frame_factory_;
267 std::unique_ptr<VideoFormat> capture_format_; 319 std::unique_ptr<VideoFormat> capture_format_;
268 std::vector<VideoFormat> supported_formats_; 320 std::vector<VideoFormat> supported_formats_;
269 std::unique_ptr<VideoFormat> max_format_; 321 std::unique_ptr<VideoFormat> max_format_;
270 std::vector<VideoFormat> filtered_supported_formats_; 322 std::vector<VideoFormat> filtered_supported_formats_;
271 323
272 bool enable_camera_list_; 324 bool enable_camera_list_;
273 int scaled_width_; // Current output size from ComputeScale. 325 int scaled_width_; // Current output size from ComputeScale.
274 int scaled_height_; 326 int scaled_height_;
275 327
276 rtc::VideoBroadcaster broadcaster_; 328 rtc::VideoBroadcaster broadcaster_;
277 bool enable_video_adapter_; 329 bool enable_video_adapter_;
278 VideoAdapter video_adapter_; 330 VideoAdapter video_adapter_;
279 331
280 rtc::CriticalSection frame_stats_crit_; 332 rtc::CriticalSection frame_stats_crit_;
281 // The captured frame size before potential adapation. 333 // The captured frame size before potential adapation.
282 bool input_size_valid_ GUARDED_BY(frame_stats_crit_) = false; 334 bool input_size_valid_ GUARDED_BY(frame_stats_crit_) = false;
283 int input_width_ GUARDED_BY(frame_stats_crit_); 335 int input_width_ GUARDED_BY(frame_stats_crit_);
284 int input_height_ GUARDED_BY(frame_stats_crit_); 336 int input_height_ GUARDED_BY(frame_stats_crit_);
285 337
286 // Whether capturer should apply rotation to the frame before 338 // Whether capturer should apply rotation to the frame before signaling it.
287 // passing it on to the registered sinks.
288 bool apply_rotation_; 339 bool apply_rotation_;
289 340
290 // State for the timestamp translation. 341 // State for the timestamp translation.
291 rtc::TimestampAligner timestamp_aligner_; 342 rtc::TimestampAligner timestamp_aligner_;
292 RTC_DISALLOW_COPY_AND_ASSIGN(VideoCapturer); 343 RTC_DISALLOW_COPY_AND_ASSIGN(VideoCapturer);
293 }; 344 };
294 345
295 } // namespace cricket 346 } // namespace cricket
296 347
297 #endif // WEBRTC_MEDIA_BASE_VIDEOCAPTURER_H_ 348 #endif // WEBRTC_MEDIA_BASE_VIDEOCAPTURER_H_
OLDNEW
« no previous file with comments | « webrtc/media/base/videoadapter_unittest.cc ('k') | webrtc/media/base/videocapturer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698