Index: media/capture/video/mac/video_capture_device_decklink_mac.mm |
diff --git a/media/capture/video/mac/video_capture_device_decklink_mac.mm b/media/capture/video/mac/video_capture_device_decklink_mac.mm |
index 54bb0ccde568fb563bbc9f8faffed7bc44c8fa1f..b6eefdca46210bef6994b6bf795b688c7a848432 100644 |
--- a/media/capture/video/mac/video_capture_device_decklink_mac.mm |
+++ b/media/capture/video/mac/video_capture_device_decklink_mac.mm |
@@ -98,6 +98,8 @@ class DeckLinkCaptureDelegate |
// Checks for Device (a.k.a. Audio) thread. |
base::ThreadChecker thread_checker_; |
+ bool capture_; |
+ |
friend class scoped_refptr<DeckLinkCaptureDelegate>; |
friend class base::RefCountedThreadSafe<DeckLinkCaptureDelegate>; |
@@ -126,7 +128,9 @@ static float GetDisplayModeFrameRate( |
DeckLinkCaptureDelegate::DeckLinkCaptureDelegate( |
const media::VideoCaptureDeviceDescriptor& device_descriptor, |
media::VideoCaptureDeviceDeckLinkMac* frame_receiver) |
- : device_descriptor_(device_descriptor), frame_receiver_(frame_receiver) {} |
+ : device_descriptor_(device_descriptor), |
+ frame_receiver_(frame_receiver), |
+ capture_(false) {} |
DeckLinkCaptureDelegate::~DeckLinkCaptureDelegate() { |
} |
@@ -209,12 +213,18 @@ void DeckLinkCaptureDelegate::AllocateAndStart( |
if (decklink_input_local->StartStreams() != S_OK) |
SendErrorString(FROM_HERE, "Could not start capturing"); |
+ if (frame_receiver_) |
+ frame_receiver_->ReportStarted(); |
+ |
+ capture_ = true; |
+ |
decklink_.swap(decklink_local); |
decklink_input_.swap(decklink_input_local); |
} |
void DeckLinkCaptureDelegate::StopAndDeAllocate() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ capture_ = false; |
if (!decklink_input_.get()) |
return; |
if (decklink_input_->StopStreams() != S_OK) |
@@ -237,6 +247,9 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFormatChanged( |
HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived( |
IDeckLinkVideoInputFrame* video_frame, |
IDeckLinkAudioInputPacket* /* audio_packet */) { |
+ if (!capture_) |
+ return S_OK; |
+ |
// Capture frames are manipulated as an IDeckLinkVideoFrame. |
uint8_t* video_data = NULL; |
video_frame->GetBytes(reinterpret_cast<void**>(&video_data)); |
@@ -494,6 +507,13 @@ void VideoCaptureDeviceDeckLinkMac::SendLogString(const std::string& message) { |
client_->OnLog(message); |
} |
+void VideoCaptureDeviceDeckLinkMac::ReportStarted() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ base::AutoLock lock(lock_); |
+ if (client_) |
+ client_->OnStarted(); |
+} |
+ |
void VideoCaptureDeviceDeckLinkMac::AllocateAndStart( |
const VideoCaptureParams& params, |
std::unique_ptr<VideoCaptureDevice::Client> client) { |