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

Unified Diff: content/renderer/media/webrtc/webrtc_video_capturer_adapter.cc

Issue 1212133002: Passing Texture backed VideoFrame through WebRTC wrappers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: mcasas@ comments. Created 5 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: content/renderer/media/webrtc/webrtc_video_capturer_adapter.cc
diff --git a/content/renderer/media/webrtc/webrtc_video_capturer_adapter.cc b/content/renderer/media/webrtc/webrtc_video_capturer_adapter.cc
index cb1a832fbfe25a29684623266dd12c6fa5c3168a..91c5aab391ed56aeab697d954410e4600383b067 100644
--- a/content/renderer/media/webrtc/webrtc_video_capturer_adapter.cc
+++ b/content/renderer/media/webrtc/webrtc_video_capturer_adapter.cc
@@ -71,6 +71,17 @@ class WebRtcVideoCapturerAdapter::MediaVideoFrameFactory
DCHECK(input_frame == &captured_frame_);
DCHECK(frame_.get());
+ const int64_t timestamp_ns = frame_->timestamp().InMicroseconds() *
+ base::Time::kNanosecondsPerMicrosecond;
+
+ // Return |frame_| directly if it is texture backed, because there is no
+ // cropping support for texture yet. See http://crbug/503653.
+ if (frame_->HasTextures()) {
+ return new cricket::WebRtcVideoFrame(
+ new rtc::RefCountedObject<WebRtcVideoFrameAdapter>(frame_),
+ captured_frame_.elapsed_time, timestamp_ns);
+ }
+
// Create a centered cropped visible rect that preservers aspect ratio for
// cropped natural size.
gfx::Rect visible_rect = frame_->visible_rect();
@@ -84,9 +95,6 @@ class WebRtcVideoCapturerAdapter::MediaVideoFrameFactory
video_frame->AddDestructionObserver(
base::Bind(&ReleaseOriginalFrame, frame_));
- const int64_t timestamp_ns = frame_->timestamp().InMicroseconds() *
- base::Time::kNanosecondsPerMicrosecond;
-
// If no scaling is needed, return a wrapped version of |frame_| directly.
if (video_frame->natural_size() == video_frame->visible_rect().size()) {
return new cricket::WebRtcVideoFrame(
@@ -137,11 +145,10 @@ class WebRtcVideoCapturerAdapter::MediaVideoFrameFactory
WebRtcVideoCapturerAdapter::WebRtcVideoCapturerAdapter(bool is_screencast)
: is_screencast_(is_screencast),
running_(false),
- first_frame_timestamp_(media::kNoTimestamp()),
- frame_factory_(new MediaVideoFrameFactory) {
+ first_frame_timestamp_(media::kNoTimestamp()) {
mcasas 2015/06/27 01:03:38 Not your problem but kNoTimestamp() is a misleadin
thread_checker_.DetachFromThread();
// The base class takes ownership of the frame factory.
- set_frame_factory(frame_factory_);
+ set_frame_factory(new MediaVideoFrameFactory);
}
WebRtcVideoCapturerAdapter::~WebRtcVideoCapturerAdapter() {
@@ -208,11 +215,11 @@ void WebRtcVideoCapturerAdapter::OnFrameCaptured(
const scoped_refptr<media::VideoFrame>& frame) {
DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("video", "WebRtcVideoCapturerAdapter::OnFrameCaptured");
- if (!(media::VideoFrame::I420 == frame->format() ||
- media::VideoFrame::YV12 == frame->format())) {
- // Some types of sources support textures as output. Since connecting
- // sources and sinks do not check the format, we need to just ignore
- // formats that we can not handle.
+ if (!((frame->IsMappable() && (frame->format() == media::VideoFrame::I420 ||
+ frame->format() == media::VideoFrame::YV12)) ||
+ frame->HasTextures())) {
+ // Since connecting sources and sinks do not check the format, we need to
+ // just ignore formats that we can not handle.
NOTREACHED();
return;
}
@@ -224,14 +231,15 @@ void WebRtcVideoCapturerAdapter::OnFrameCaptured(
(frame->timestamp() - first_frame_timestamp_).InMicroseconds() *
base::Time::kNanosecondsPerMicrosecond;
- // Inject the frame via the VideoFrameFractory.
- DCHECK(frame_factory_ == frame_factory());
- frame_factory_->SetFrame(frame, elapsed_time);
+ // Inject the frame via the VideoFrameFactory of base class.
+ MediaVideoFrameFactory* media_video_frame_factory =
mcasas 2015/06/27 01:03:38 MediaVideoFrameFactory* const ? :-)
+ reinterpret_cast<MediaVideoFrameFactory*>(frame_factory());
+ media_video_frame_factory->SetFrame(frame, elapsed_time);
// This signals to libJingle that a new VideoFrame is available.
- SignalFrameCaptured(this, frame_factory_->GetCapturedFrame());
+ SignalFrameCaptured(this, media_video_frame_factory->GetCapturedFrame());
- frame_factory_->ReleaseFrame(); // Release the frame ASAP.
+ media_video_frame_factory->ReleaseFrame(); // Release the frame ASAP.
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698