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

Unified Diff: media/video/capture/mac/video_capture_device_decklink_mac.h

Issue 535983002: Mac Video Capture: Support for Blackmagic DeckLink SDK video capture. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@crbug408493__1__Enumerate_blackmagic_devices__2__branched_from_master
Patch Set: Created 6 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 side-by-side diff with in-line comments
Download patch
Index: media/video/capture/mac/video_capture_device_decklink_mac.h
diff --git a/media/video/capture/mac/video_capture_device_decklink_mac.h b/media/video/capture/mac/video_capture_device_decklink_mac.h
index 17f6b2775d7bda2c2a83ee4383bd073705b8b08f..d77227ddb7eaa97e1904fa7b8596a296e2647f8e 100644
--- a/media/video/capture/mac/video_capture_device_decklink_mac.h
+++ b/media/video/capture/mac/video_capture_device_decklink_mac.h
@@ -12,11 +12,45 @@
#import <Foundation/Foundation.h>
+#include "third_party/decklink/mac/include/DeckLinkAPI.h"
+
+namespace {
+
+// DeckLink SDK uses ScopedComPtr-style APIs. Chrome ScopedComPtr is only
+// available for Windows builds. This is a verbatim knock-off of the needed
+// parts of base::win::ScopedComPtr<> for ref counting.
+template <class T>
+class ScopedDeckLinkPtr : public scoped_refptr<T> {
+ public:
+ using scoped_refptr<T>::ptr_;
+
+ T** Receive() {
+ DCHECK(!ptr_) << "Object leak. Pointer must be NULL";
+ return &ptr_;
+ }
+
+ void** ReceiveVoid() {
+ return reinterpret_cast<void**>(Receive());
+ }
+
+ void Release() {
+ if (ptr_ != NULL) {
+ ptr_->Release();
+ ptr_ = NULL;
+ }
+ }
+};
+
+} // namespace
+
+
namespace media {
// Extension of VideoCaptureDevice to create and manipulate Blackmagic devices
// via DeckLink SDK.
-class MEDIA_EXPORT VideoCaptureDeviceDeckLinkMac : public VideoCaptureDevice {
+class MEDIA_EXPORT VideoCaptureDeviceDeckLinkMac :
+ public VideoCaptureDevice,
+ public IDeckLinkInputCallback {
public:
// Gets the names of all DeckLink video capture devices connected to this
// computer, as enumerated by the DeckLink SDK.
@@ -36,7 +70,38 @@ class MEDIA_EXPORT VideoCaptureDeviceDeckLinkMac : public VideoCaptureDevice {
scoped_ptr<VideoCaptureDevice::Client> client) OVERRIDE;
virtual void StopAndDeAllocate() OVERRIDE;
+ // IDeckLinkInputCallback interface implementation.
+ virtual HRESULT VideoInputFormatChanged (
+ BMDVideoInputFormatChangedEvents notification_events,
+ IDeckLinkDisplayMode *new_display_mode,
+ BMDDetectedVideoInputFormatFlags detected_signal_flags) OVERRIDE;
+ virtual HRESULT VideoInputFrameArrived (
+ IDeckLinkVideoInputFrame* video_frame,
+ IDeckLinkAudioInputPacket* audio_packet) OVERRIDE;
+
+ // IUnknown interface implementation.
+ virtual HRESULT QueryInterface (REFIID iid, LPVOID *ppv) OVERRIDE;
+ virtual ULONG AddRef() OVERRIDE;
+ virtual ULONG Release() OVERRIDE;
+
+ // Forwarder to VideoCaptureDevice::Client::OnError().
+ void SetErrorState(const std::string& reason);
+
+ // Forwarder to VideoCaptureDevice::Client::OnLog().
+ void LogMessage(const std::string& message);
+
private:
+ scoped_ptr<VideoCaptureDevice::Client> client_;
+
+ // This is used to control the video capturing device input interface.
+ ScopedDeckLinkPtr<IDeckLinkInput> decklink_input_;
+ // |decklink_| represents a physical device attached to the host.
+ ScopedDeckLinkPtr<IDeckLink> decklink_;
+
+ // Internal counter for IUnknown interface implementation.
+ int32_t ref_count_;
+ const Name device_name_;
+
DISALLOW_COPY_AND_ASSIGN(VideoCaptureDeviceDeckLinkMac);
};

Powered by Google App Engine
This is Rietveld 408576698