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

Unified Diff: webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc

Issue 2030333003: Revert of Use std::unique_ptr<> to pass frame ownership in DesktopCapturer impls. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 6 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: webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc
diff --git a/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc b/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc
index bdada9e3982244261a4f659ca74b4b5abf2126f3..8a2e77c7563aff84f6411b81887ce2dc17603ca6 100644
--- a/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc
+++ b/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc
@@ -413,27 +413,28 @@
_com_error error = g_container->output1->DuplicateOutput(
static_cast<IUnknown*>(g_container->device),
g_container->duplication.GetAddressOf());
- if (error.Error() != S_OK || !g_container->duplication) {
+ if (error.Error() == S_OK && g_container->duplication) {
+ memset(&g_container->duplication_desc, 0, sizeof(DXGI_OUTDUPL_DESC));
+ g_container->duplication->GetDesc(&g_container->duplication_desc);
+ if (g_container->duplication_desc.ModeDesc.Format !=
+ DXGI_FORMAT_B8G8R8A8_UNORM) {
+ g_container->duplication.Reset();
+ LOG(LS_ERROR) << "IDXGIDuplicateOutput does not use RGBA (8 bit) "
+ "format, which is required by downstream components, "
+ "format is "
+ << g_container->duplication_desc.ModeDesc.Format;
+ return false;
+ }
+ return true;
+ } else {
+ // Make sure we have correct signal and duplicate the output next time.
g_container->duplication.Reset();
LOG(LS_WARNING) << "Failed to duplicate output from IDXGIOutput1, error "
<< error.ErrorMessage() << ", with code "
<< error.Error();
- return false;
- }
-
- memset(&g_container->duplication_desc, 0, sizeof(DXGI_OUTDUPL_DESC));
- g_container->duplication->GetDesc(&g_container->duplication_desc);
- if (g_container->duplication_desc.ModeDesc.Format !=
- DXGI_FORMAT_B8G8R8A8_UNORM) {
- g_container->duplication.Reset();
- LOG(LS_ERROR) << "IDXGIDuplicateOutput does not use RGBA (8 bit) "
- "format, which is required by downstream components, "
- "format is "
- << g_container->duplication_desc.ModeDesc.Format;
- return false;
- }
-
- return true;
+ }
+
+ return false;
}
bool ScreenCapturerWinDirectx::ForceDuplicateOutput() {
@@ -457,8 +458,8 @@
// Texture instance won't change forever.
while (!surfaces_.current_frame()) {
- surfaces_.ReplaceCurrentFrame(std::unique_ptr<rtc::scoped_refptr<Texture>>(
- new rtc::scoped_refptr<Texture>(new Texture())));
+ surfaces_.ReplaceCurrentFrame(
+ new rtc::scoped_refptr<Texture>(new Texture()));
surfaces_.MoveToNextFrame();
}
}
@@ -592,9 +593,9 @@
return std::unique_ptr<DesktopFrame>();
}
frames_.ReplaceCurrentFrame(
- SharedDesktopFrame::Wrap(std::move(new_frame)));
- }
- result = frames_.current_frame()->Share();
+ SharedDesktopFrame::Wrap(new_frame.release()));
+ }
+ result.reset(frames_.current_frame()->Share());
std::unique_ptr<DesktopFrame> frame(
new DxgiDesktopFrame(*surfaces_.current_frame()));
@@ -619,8 +620,9 @@
RTC_DCHECK(callback_);
if (!g_container->duplication && !DuplicateOutput()) {
- // Failed to initialize desktop duplication.
- callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
+ // Receive a capture request when application is shutting down, or between
+ // mode change.
+ callback_->OnCaptureCompleted(nullptr);
return;
}
@@ -654,7 +656,7 @@
if (ForceDuplicateOutput()) {
EmitCurrentFrame();
} else {
- callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
+ callback_->OnCaptureCompleted(nullptr);
}
return;
}
@@ -675,14 +677,14 @@
g_container->duplication->ReleaseFrame();
}
if (!result) {
- callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
+ callback_->OnCaptureCompleted(nullptr);
return;
}
result->set_capture_time_ms(
(rtc::TimeNanos() - capture_start_time_nanos) /
rtc::kNumNanosecsPerMillisec);
- callback_->OnCaptureResult(Result::SUCCESS, std::move(result));
+ callback_->OnCaptureCompleted(result.release());
}
bool ScreenCapturerWinDirectx::GetScreenList(ScreenList* screens) {
@@ -697,7 +699,7 @@
void ScreenCapturerWinDirectx::EmitCurrentFrame() {
if (!surfaces_.current_frame()->get()->bits()) {
// At the very begining, we have not captured any frames.
- callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
+ callback_->OnCaptureCompleted(nullptr);
return;
}
@@ -706,12 +708,12 @@
// queue. If there is not an existing frame (at the very begining), we can
// only return a nullptr.
if (frames_.current_frame()) {
- std::unique_ptr<SharedDesktopFrame> frame =
- frames_.current_frame()->Share();
+ std::unique_ptr<SharedDesktopFrame> frame(
+ frames_.current_frame()->Share());
frame->mutable_updated_region()->Clear();
- callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
+ callback_->OnCaptureCompleted(frame.release());
} else {
- callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
+ callback_->OnCaptureCompleted(nullptr);
}
return;
}
@@ -720,7 +722,7 @@
// queue.
std::unique_ptr<DesktopFrame> frame(
new DxgiDesktopFrame(*surfaces_.current_frame()));
- callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
+ callback_->OnCaptureCompleted(frame.release());
}
} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698