Chromium Code Reviews| 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 eaeec889a6e61d56dbc5436cf252ad2f79880a99..a08ba89ca33c657bd5c53b1bc54031d62cdb749c 100644 |
| --- a/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc |
| +++ b/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc |
| @@ -8,6 +8,42 @@ |
| namespace { |
| +class I420Adapter : public webrtc::I420BufferInterface { |
| + public: |
| + explicit I420Adapter(const scoped_refptr<media::VideoFrame>& frame) |
| + : frame_(frame) {} |
| + |
| + private: |
| + int width() const override { return frame_->visible_rect().width(); } |
| + int height() const override { return frame_->visible_rect().height(); } |
| + |
| + const uint8_t* DataY() const override { |
| + return frame_->visible_data(media::VideoFrame::kYPlane); |
| + } |
| + |
| + const uint8_t* DataU() const override { |
| + return frame_->visible_data(media::VideoFrame::kUPlane); |
| + } |
| + |
| + const uint8_t* DataV() const override { |
| + return frame_->visible_data(media::VideoFrame::kVPlane); |
| + } |
| + |
| + int StrideY() const override { |
| + return frame_->stride(media::VideoFrame::kYPlane); |
| + } |
| + |
| + int StrideU() const override { |
| + return frame_->stride(media::VideoFrame::kUPlane); |
| + } |
| + |
| + int StrideV() const override { |
| + return frame_->stride(media::VideoFrame::kVPlane); |
| + } |
| + |
| + scoped_refptr<media::VideoFrame> frame_; |
| +}; |
| + |
| void IsValidFrame(const scoped_refptr<media::VideoFrame>& frame) { |
| // Paranoia checks. |
| DCHECK(frame); |
| @@ -36,6 +72,10 @@ WebRtcVideoFrameAdapter::WebRtcVideoFrameAdapter( |
| WebRtcVideoFrameAdapter::~WebRtcVideoFrameAdapter() { |
| } |
| +webrtc::VideoFrameBuffer::Type WebRtcVideoFrameAdapter::type() const { |
| + return Type::kNative; |
| +} |
| + |
| int WebRtcVideoFrameAdapter::width() const { |
| return frame_->visible_rect().width(); |
| } |
| @@ -73,13 +113,8 @@ void* WebRtcVideoFrameAdapter::native_handle() const { |
| return nullptr; |
| } |
| -rtc::scoped_refptr<webrtc::VideoFrameBuffer> |
| -WebRtcVideoFrameAdapter::NativeToI420Buffer() { |
| - if (frame_->storage_type() == media::VideoFrame::STORAGE_SHMEM) { |
| - IsValidFrame(frame_); |
| - return this; |
| - } |
| - |
| +rtc::scoped_refptr<webrtc::I420BufferInterface> |
| +WebRtcVideoFrameAdapter::ToI420() { |
| if (frame_->HasTextures()) { |
|
emircan
2017/06/10 00:09:27
DCHECK(media::VideoFrame::STORAGE_SHMEM == frame_-
magjed_chromium
2017/06/10 15:45:00
ToI420 is allowed to be called for any storage typ
|
| if (copy_texture_callback_.is_null()) { |
| DLOG(ERROR) << "Texture backed frame cannot be copied."; |
| @@ -91,12 +126,10 @@ WebRtcVideoFrameAdapter::NativeToI420Buffer() { |
| if (!new_frame) |
| return nullptr; |
| frame_ = new_frame; |
| - IsValidFrame(frame_); |
| - return this; |
| } |
| - NOTREACHED(); |
| - return nullptr; |
| + IsValidFrame(frame_); |
| + return new rtc::RefCountedObject<I420Adapter>(frame_); |
| } |
| } // namespace content |