Index: content/renderer/media/webrtc/webrtc_video_frame_adapter.cc |
diff --git a/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc b/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc |
index b75b454bda3c1d0af7d180f575ce602da692c9cb..eaeec889a6e61d56dbc5436cf252ad2f79880a99 100644 |
--- a/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc |
+++ b/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc |
@@ -6,12 +6,32 @@ |
#include "base/logging.h" |
+namespace { |
+ |
+void IsValidFrame(const scoped_refptr<media::VideoFrame>& frame) { |
+ // Paranoia checks. |
+ DCHECK(frame); |
+ DCHECK(media::VideoFrame::IsValidConfig( |
+ frame->format(), frame->storage_type(), frame->coded_size(), |
+ frame->visible_rect(), frame->natural_size())); |
+ DCHECK(media::PIXEL_FORMAT_I420 == frame->format() || |
+ media::PIXEL_FORMAT_YV12 == frame->format()); |
+ CHECK(reinterpret_cast<void*>(frame->data(media::VideoFrame::kYPlane))); |
+ CHECK(reinterpret_cast<void*>(frame->data(media::VideoFrame::kUPlane))); |
+ CHECK(reinterpret_cast<void*>(frame->data(media::VideoFrame::kVPlane))); |
+ CHECK(frame->stride(media::VideoFrame::kYPlane)); |
+ CHECK(frame->stride(media::VideoFrame::kUPlane)); |
+ CHECK(frame->stride(media::VideoFrame::kVPlane)); |
+} |
+ |
+} // anonymous namespace |
+ |
namespace content { |
WebRtcVideoFrameAdapter::WebRtcVideoFrameAdapter( |
- const scoped_refptr<media::VideoFrame>& frame) |
- : frame_(frame) { |
-} |
+ const scoped_refptr<media::VideoFrame>& frame, |
+ const CopyTextureFrameCallback& copy_texture_callback) |
+ : frame_(frame), copy_texture_callback_(copy_texture_callback) {} |
WebRtcVideoFrameAdapter::~WebRtcVideoFrameAdapter() { |
} |
@@ -45,6 +65,8 @@ int WebRtcVideoFrameAdapter::StrideV() const { |
} |
void* WebRtcVideoFrameAdapter::native_handle() const { |
+ // Keep native handle for shared memory backed frames, so that we can use |
+ // the existing handle to share for hw encode. |
if (frame_->HasTextures() || |
frame_->storage_type() == media::VideoFrame::STORAGE_SHMEM) |
return frame_.get(); |
@@ -53,17 +75,28 @@ void* WebRtcVideoFrameAdapter::native_handle() const { |
rtc::scoped_refptr<webrtc::VideoFrameBuffer> |
WebRtcVideoFrameAdapter::NativeToI420Buffer() { |
- CHECK(media::VideoFrame::IsValidConfig( |
- frame_->format(), frame_->storage_type(), frame_->coded_size(), |
- frame_->visible_rect(), frame_->natural_size())); |
- CHECK_EQ(media::PIXEL_FORMAT_I420, frame_->format()); |
- CHECK(reinterpret_cast<void*>(frame_->data(media::VideoFrame::kYPlane))); |
- CHECK(reinterpret_cast<void*>(frame_->data(media::VideoFrame::kUPlane))); |
- CHECK(reinterpret_cast<void*>(frame_->data(media::VideoFrame::kVPlane))); |
- CHECK(frame_->stride(media::VideoFrame::kYPlane)); |
- CHECK(frame_->stride(media::VideoFrame::kUPlane)); |
- CHECK(frame_->stride(media::VideoFrame::kVPlane)); |
- return this; |
+ if (frame_->storage_type() == media::VideoFrame::STORAGE_SHMEM) { |
+ IsValidFrame(frame_); |
+ return this; |
+ } |
+ |
+ if (frame_->HasTextures()) { |
+ if (copy_texture_callback_.is_null()) { |
+ DLOG(ERROR) << "Texture backed frame cannot be copied."; |
+ return nullptr; |
+ } |
+ |
+ scoped_refptr<media::VideoFrame> new_frame; |
+ copy_texture_callback_.Run(frame_, &new_frame); |
+ if (!new_frame) |
+ return nullptr; |
+ frame_ = new_frame; |
+ IsValidFrame(frame_); |
+ return this; |
+ } |
+ |
+ NOTREACHED(); |
+ return nullptr; |
} |
} // namespace content |