Mac Video Capture: Support for Blackmagic DeckLink SDK video capture.
[chromium-blink-merge.git] / media / video / capture / mac / video_capture_device_decklink_mac.h
blobb70191a49789da4be51049401fb46ef1afcb56e0
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Implementation of VideoCaptureDevice class for Blackmagic video capture
6 // devices by using the DeckLink SDK.
8 #ifndef MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_DEVICE_DECKLINK_MAC_H_
9 #define MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_DEVICE_DECKLINK_MAC_H_
11 #include "media/video/capture/video_capture_device.h"
13 #import <Foundation/Foundation.h>
15 #include "base/synchronization/lock.h"
16 #include "base/threading/thread_checker.h"
18 namespace {
19 class DeckLinkCaptureDelegate;
20 } // namespace
22 namespace media {
24 // Extension of VideoCaptureDevice to create and manipulate Blackmagic devices.
25 // Creates a reference counted |decklink_capture_delegate_| that does all the
26 // DeckLink SDK configuration and capture work while holding a weak reference to
27 // us for sending back frames, logs and error messages.
28 class MEDIA_EXPORT VideoCaptureDeviceDeckLinkMac : public VideoCaptureDevice {
29 public:
30 // Gets the names of all DeckLink video capture devices connected to this
31 // computer, as enumerated by the DeckLink SDK. To allow the user to choose
32 // exactly which capture format she wants, we enumerate as many cameras as
33 // capture formats.
34 static void EnumerateDevices(VideoCaptureDevice::Names* device_names);
36 // Gets the supported formats of a particular device attached to the system,
37 // identified by |device|. Formats are retrieved from the DeckLink SDK.
38 // Following the enumeration, each camera will have only one capability.
39 static void EnumerateDeviceCapabilities(
40 const VideoCaptureDevice::Name& device,
41 VideoCaptureFormats* supported_formats);
43 explicit VideoCaptureDeviceDeckLinkMac(const Name& device_name);
44 virtual ~VideoCaptureDeviceDeckLinkMac();
46 // Copy of VideoCaptureDevice::Client::OnIncomingCapturedData(). Used by
47 // |decklink_capture_delegate_| to forward captured frames.
48 void OnIncomingCapturedData(const uint8* data,
49 size_t length,
50 const VideoCaptureFormat& frame_format,
51 int rotation, // Clockwise.
52 base::TimeTicks timestamp);
54 // Forwarder to VideoCaptureDevice::Client::OnError().
55 void SendErrorString(const std::string& reason);
57 // Forwarder to VideoCaptureDevice::Client::OnLog().
58 void SendLogString(const std::string& message);
60 private:
61 // VideoCaptureDevice implementation.
62 virtual void AllocateAndStart(
63 const VideoCaptureParams& params,
64 scoped_ptr<VideoCaptureDevice::Client> client) OVERRIDE;
65 virtual void StopAndDeAllocate() OVERRIDE;
67 // Protects concurrent setting and using of |client_|.
68 base::Lock lock_;
69 scoped_ptr<VideoCaptureDevice::Client> client_;
71 // Reference counted handle to the DeckLink capture delegate, ref counted by
72 // the DeckLink SDK as well.
73 scoped_refptr<DeckLinkCaptureDelegate> decklink_capture_delegate_;
75 // Checks for Device (a.k.a. Audio) thread.
76 base::ThreadChecker thread_checker_;
78 DISALLOW_COPY_AND_ASSIGN(VideoCaptureDeviceDeckLinkMac);
81 } // namespace media
83 #endif // MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_DEVICE_DECKLINK_MAC_H_