Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/webrtc/webrtc_video_frame_adapter.h" | 5 #include "content/renderer/media/webrtc/webrtc_video_frame_adapter.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| 11 class I420Adapter : public webrtc::I420BufferInterface { | |
| 12 public: | |
| 13 explicit I420Adapter(const scoped_refptr<media::VideoFrame>& frame) | |
| 14 : frame_(frame) {} | |
| 15 | |
| 16 private: | |
| 17 int width() const override { return frame_->visible_rect().width(); } | |
| 18 int height() const override { return frame_->visible_rect().height(); } | |
| 19 | |
| 20 const uint8_t* DataY() const override { | |
| 21 return frame_->visible_data(media::VideoFrame::kYPlane); | |
| 22 } | |
| 23 | |
| 24 const uint8_t* DataU() const override { | |
| 25 return frame_->visible_data(media::VideoFrame::kUPlane); | |
| 26 } | |
| 27 | |
| 28 const uint8_t* DataV() const override { | |
| 29 return frame_->visible_data(media::VideoFrame::kVPlane); | |
| 30 } | |
| 31 | |
| 32 int StrideY() const override { | |
| 33 return frame_->stride(media::VideoFrame::kYPlane); | |
| 34 } | |
| 35 | |
| 36 int StrideU() const override { | |
| 37 return frame_->stride(media::VideoFrame::kUPlane); | |
| 38 } | |
| 39 | |
| 40 int StrideV() const override { | |
| 41 return frame_->stride(media::VideoFrame::kVPlane); | |
| 42 } | |
| 43 | |
| 44 scoped_refptr<media::VideoFrame> frame_; | |
| 45 }; | |
| 46 | |
| 11 void IsValidFrame(const scoped_refptr<media::VideoFrame>& frame) { | 47 void IsValidFrame(const scoped_refptr<media::VideoFrame>& frame) { |
| 12 // Paranoia checks. | 48 // Paranoia checks. |
| 13 DCHECK(frame); | 49 DCHECK(frame); |
| 14 DCHECK(media::VideoFrame::IsValidConfig( | 50 DCHECK(media::VideoFrame::IsValidConfig( |
| 15 frame->format(), frame->storage_type(), frame->coded_size(), | 51 frame->format(), frame->storage_type(), frame->coded_size(), |
| 16 frame->visible_rect(), frame->natural_size())); | 52 frame->visible_rect(), frame->natural_size())); |
| 17 DCHECK(media::PIXEL_FORMAT_I420 == frame->format() || | 53 DCHECK(media::PIXEL_FORMAT_I420 == frame->format() || |
| 18 media::PIXEL_FORMAT_YV12 == frame->format()); | 54 media::PIXEL_FORMAT_YV12 == frame->format()); |
| 19 CHECK(reinterpret_cast<void*>(frame->data(media::VideoFrame::kYPlane))); | 55 CHECK(reinterpret_cast<void*>(frame->data(media::VideoFrame::kYPlane))); |
| 20 CHECK(reinterpret_cast<void*>(frame->data(media::VideoFrame::kUPlane))); | 56 CHECK(reinterpret_cast<void*>(frame->data(media::VideoFrame::kUPlane))); |
| 21 CHECK(reinterpret_cast<void*>(frame->data(media::VideoFrame::kVPlane))); | 57 CHECK(reinterpret_cast<void*>(frame->data(media::VideoFrame::kVPlane))); |
| 22 CHECK(frame->stride(media::VideoFrame::kYPlane)); | 58 CHECK(frame->stride(media::VideoFrame::kYPlane)); |
| 23 CHECK(frame->stride(media::VideoFrame::kUPlane)); | 59 CHECK(frame->stride(media::VideoFrame::kUPlane)); |
| 24 CHECK(frame->stride(media::VideoFrame::kVPlane)); | 60 CHECK(frame->stride(media::VideoFrame::kVPlane)); |
| 25 } | 61 } |
| 26 | 62 |
| 27 } // anonymous namespace | 63 } // anonymous namespace |
| 28 | 64 |
| 29 namespace content { | 65 namespace content { |
| 30 | 66 |
| 31 WebRtcVideoFrameAdapter::WebRtcVideoFrameAdapter( | 67 WebRtcVideoFrameAdapter::WebRtcVideoFrameAdapter( |
| 32 const scoped_refptr<media::VideoFrame>& frame, | 68 const scoped_refptr<media::VideoFrame>& frame, |
| 33 const CopyTextureFrameCallback& copy_texture_callback) | 69 const CopyTextureFrameCallback& copy_texture_callback) |
| 34 : frame_(frame), copy_texture_callback_(copy_texture_callback) {} | 70 : frame_(frame), copy_texture_callback_(copy_texture_callback) {} |
| 35 | 71 |
| 36 WebRtcVideoFrameAdapter::~WebRtcVideoFrameAdapter() { | 72 WebRtcVideoFrameAdapter::~WebRtcVideoFrameAdapter() { |
| 37 } | 73 } |
| 38 | 74 |
| 75 webrtc::VideoFrameBuffer::Type WebRtcVideoFrameAdapter::type() const { | |
| 76 return Type::kNative; | |
| 77 } | |
| 78 | |
| 39 int WebRtcVideoFrameAdapter::width() const { | 79 int WebRtcVideoFrameAdapter::width() const { |
| 40 return frame_->visible_rect().width(); | 80 return frame_->visible_rect().width(); |
| 41 } | 81 } |
| 42 | 82 |
| 43 int WebRtcVideoFrameAdapter::height() const { | 83 int WebRtcVideoFrameAdapter::height() const { |
| 44 return frame_->visible_rect().height(); | 84 return frame_->visible_rect().height(); |
| 45 } | 85 } |
| 46 | 86 |
| 47 const uint8_t* WebRtcVideoFrameAdapter::DataY() const { | 87 const uint8_t* WebRtcVideoFrameAdapter::DataY() const { |
| 48 return frame_->visible_data(media::VideoFrame::kYPlane); | 88 return frame_->visible_data(media::VideoFrame::kYPlane); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 66 | 106 |
| 67 void* WebRtcVideoFrameAdapter::native_handle() const { | 107 void* WebRtcVideoFrameAdapter::native_handle() const { |
| 68 // Keep native handle for shared memory backed frames, so that we can use | 108 // Keep native handle for shared memory backed frames, so that we can use |
| 69 // the existing handle to share for hw encode. | 109 // the existing handle to share for hw encode. |
| 70 if (frame_->HasTextures() || | 110 if (frame_->HasTextures() || |
| 71 frame_->storage_type() == media::VideoFrame::STORAGE_SHMEM) | 111 frame_->storage_type() == media::VideoFrame::STORAGE_SHMEM) |
| 72 return frame_.get(); | 112 return frame_.get(); |
| 73 return nullptr; | 113 return nullptr; |
| 74 } | 114 } |
| 75 | 115 |
| 76 rtc::scoped_refptr<webrtc::VideoFrameBuffer> | 116 rtc::scoped_refptr<webrtc::I420BufferInterface> |
| 77 WebRtcVideoFrameAdapter::NativeToI420Buffer() { | 117 WebRtcVideoFrameAdapter::ToI420() { |
| 78 if (frame_->storage_type() == media::VideoFrame::STORAGE_SHMEM) { | |
| 79 IsValidFrame(frame_); | |
| 80 return this; | |
| 81 } | |
| 82 | |
| 83 if (frame_->HasTextures()) { | 118 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
| |
| 84 if (copy_texture_callback_.is_null()) { | 119 if (copy_texture_callback_.is_null()) { |
| 85 DLOG(ERROR) << "Texture backed frame cannot be copied."; | 120 DLOG(ERROR) << "Texture backed frame cannot be copied."; |
| 86 return nullptr; | 121 return nullptr; |
| 87 } | 122 } |
| 88 | 123 |
| 89 scoped_refptr<media::VideoFrame> new_frame; | 124 scoped_refptr<media::VideoFrame> new_frame; |
| 90 copy_texture_callback_.Run(frame_, &new_frame); | 125 copy_texture_callback_.Run(frame_, &new_frame); |
| 91 if (!new_frame) | 126 if (!new_frame) |
| 92 return nullptr; | 127 return nullptr; |
| 93 frame_ = new_frame; | 128 frame_ = new_frame; |
| 94 IsValidFrame(frame_); | |
| 95 return this; | |
| 96 } | 129 } |
| 97 | 130 |
| 98 NOTREACHED(); | 131 IsValidFrame(frame_); |
| 99 return nullptr; | 132 return new rtc::RefCountedObject<I420Adapter>(frame_); |
| 100 } | 133 } |
| 101 | 134 |
| 102 } // namespace content | 135 } // namespace content |
| OLD | NEW |