| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_capturer_adapter.h" | 5 #include "content/renderer/media/webrtc/webrtc_video_capturer_adapter.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/memory/aligned_memory.h" | 9 #include "base/memory/aligned_memory.h" |
| 10 #include "media/base/video_frame.h" | 10 #include "media/base/video_frame.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 public: | 31 public: |
| 32 VideoFrameWrapper(const scoped_refptr<media::VideoFrame>& frame, | 32 VideoFrameWrapper(const scoped_refptr<media::VideoFrame>& frame, |
| 33 int64 elapsed_time) | 33 int64 elapsed_time) |
| 34 : frame_(media::VideoFrame::WrapVideoFrame( | 34 : frame_(media::VideoFrame::WrapVideoFrame( |
| 35 frame, | 35 frame, |
| 36 frame->visible_rect(), | 36 frame->visible_rect(), |
| 37 frame->natural_size(), | 37 frame->natural_size(), |
| 38 base::Bind(&ReleaseOriginalFrame, frame))), | 38 base::Bind(&ReleaseOriginalFrame, frame))), |
| 39 elapsed_time_(elapsed_time) {} | 39 elapsed_time_(elapsed_time) {} |
| 40 | 40 |
| 41 virtual VideoFrame* Copy() const override { | 41 VideoFrame* Copy() const override { |
| 42 DCHECK(thread_checker_.CalledOnValidThread()); | 42 DCHECK(thread_checker_.CalledOnValidThread()); |
| 43 return new VideoFrameWrapper(frame_, elapsed_time_); | 43 return new VideoFrameWrapper(frame_, elapsed_time_); |
| 44 } | 44 } |
| 45 | 45 |
| 46 virtual size_t GetWidth() const override { | 46 size_t GetWidth() const override { |
| 47 DCHECK(thread_checker_.CalledOnValidThread()); | 47 DCHECK(thread_checker_.CalledOnValidThread()); |
| 48 return static_cast<size_t>(frame_->visible_rect().width()); | 48 return static_cast<size_t>(frame_->visible_rect().width()); |
| 49 } | 49 } |
| 50 | 50 |
| 51 virtual size_t GetHeight() const override { | 51 size_t GetHeight() const override { |
| 52 DCHECK(thread_checker_.CalledOnValidThread()); | 52 DCHECK(thread_checker_.CalledOnValidThread()); |
| 53 return static_cast<size_t>(frame_->visible_rect().height()); | 53 return static_cast<size_t>(frame_->visible_rect().height()); |
| 54 } | 54 } |
| 55 | 55 |
| 56 virtual const uint8* GetYPlane() const override { | 56 const uint8* GetYPlane() const override { |
| 57 DCHECK(thread_checker_.CalledOnValidThread()); | 57 DCHECK(thread_checker_.CalledOnValidThread()); |
| 58 return frame_->visible_data(media::VideoFrame::kYPlane); | 58 return frame_->visible_data(media::VideoFrame::kYPlane); |
| 59 } | 59 } |
| 60 | 60 |
| 61 virtual const uint8* GetUPlane() const override { | 61 const uint8* GetUPlane() const override { |
| 62 DCHECK(thread_checker_.CalledOnValidThread()); | 62 DCHECK(thread_checker_.CalledOnValidThread()); |
| 63 return frame_->visible_data(media::VideoFrame::kUPlane); | 63 return frame_->visible_data(media::VideoFrame::kUPlane); |
| 64 } | 64 } |
| 65 | 65 |
| 66 virtual const uint8* GetVPlane() const override { | 66 const uint8* GetVPlane() const override { |
| 67 DCHECK(thread_checker_.CalledOnValidThread()); | 67 DCHECK(thread_checker_.CalledOnValidThread()); |
| 68 return frame_->visible_data(media::VideoFrame::kVPlane); | 68 return frame_->visible_data(media::VideoFrame::kVPlane); |
| 69 } | 69 } |
| 70 | 70 |
| 71 virtual uint8* GetYPlane() override { | 71 uint8* GetYPlane() override { |
| 72 DCHECK(thread_checker_.CalledOnValidThread()); | 72 DCHECK(thread_checker_.CalledOnValidThread()); |
| 73 return frame_->visible_data(media::VideoFrame::kYPlane); | 73 return frame_->visible_data(media::VideoFrame::kYPlane); |
| 74 } | 74 } |
| 75 | 75 |
| 76 virtual uint8* GetUPlane() override { | 76 uint8* GetUPlane() override { |
| 77 DCHECK(thread_checker_.CalledOnValidThread()); | 77 DCHECK(thread_checker_.CalledOnValidThread()); |
| 78 return frame_->visible_data(media::VideoFrame::kUPlane); | 78 return frame_->visible_data(media::VideoFrame::kUPlane); |
| 79 } | 79 } |
| 80 | 80 |
| 81 virtual uint8* GetVPlane() override { | 81 uint8* GetVPlane() override { |
| 82 DCHECK(thread_checker_.CalledOnValidThread()); | 82 DCHECK(thread_checker_.CalledOnValidThread()); |
| 83 return frame_->visible_data(media::VideoFrame::kVPlane); | 83 return frame_->visible_data(media::VideoFrame::kVPlane); |
| 84 } | 84 } |
| 85 | 85 |
| 86 virtual int32 GetYPitch() const override { | 86 int32 GetYPitch() const override { |
| 87 DCHECK(thread_checker_.CalledOnValidThread()); | 87 DCHECK(thread_checker_.CalledOnValidThread()); |
| 88 return frame_->stride(media::VideoFrame::kYPlane); | 88 return frame_->stride(media::VideoFrame::kYPlane); |
| 89 } | 89 } |
| 90 | 90 |
| 91 virtual int32 GetUPitch() const override { | 91 int32 GetUPitch() const override { |
| 92 DCHECK(thread_checker_.CalledOnValidThread()); | 92 DCHECK(thread_checker_.CalledOnValidThread()); |
| 93 return frame_->stride(media::VideoFrame::kUPlane); | 93 return frame_->stride(media::VideoFrame::kUPlane); |
| 94 } | 94 } |
| 95 | 95 |
| 96 virtual int32 GetVPitch() const override { | 96 int32 GetVPitch() const override { |
| 97 DCHECK(thread_checker_.CalledOnValidThread()); | 97 DCHECK(thread_checker_.CalledOnValidThread()); |
| 98 return frame_->stride(media::VideoFrame::kVPlane); | 98 return frame_->stride(media::VideoFrame::kVPlane); |
| 99 } | 99 } |
| 100 | 100 |
| 101 virtual void* GetNativeHandle() const override { | 101 void* GetNativeHandle() const override { |
| 102 DCHECK(thread_checker_.CalledOnValidThread()); | 102 DCHECK(thread_checker_.CalledOnValidThread()); |
| 103 return NULL; | 103 return NULL; |
| 104 } | 104 } |
| 105 | 105 |
| 106 virtual size_t GetPixelWidth() const override { | 106 size_t GetPixelWidth() const override { |
| 107 DCHECK(thread_checker_.CalledOnValidThread()); | 107 DCHECK(thread_checker_.CalledOnValidThread()); |
| 108 return 1; | 108 return 1; |
| 109 } | 109 } |
| 110 virtual size_t GetPixelHeight() const override { | 110 size_t GetPixelHeight() const override { |
| 111 DCHECK(thread_checker_.CalledOnValidThread()); | 111 DCHECK(thread_checker_.CalledOnValidThread()); |
| 112 return 1; | 112 return 1; |
| 113 } | 113 } |
| 114 | 114 |
| 115 virtual int64 GetElapsedTime() const override { | 115 int64 GetElapsedTime() const override { |
| 116 DCHECK(thread_checker_.CalledOnValidThread()); | 116 DCHECK(thread_checker_.CalledOnValidThread()); |
| 117 return elapsed_time_; | 117 return elapsed_time_; |
| 118 } | 118 } |
| 119 | 119 |
| 120 virtual int64 GetTimeStamp() const override { | 120 int64 GetTimeStamp() const override { |
| 121 DCHECK(thread_checker_.CalledOnValidThread()); | 121 DCHECK(thread_checker_.CalledOnValidThread()); |
| 122 return frame_->timestamp().InMicroseconds() * | 122 return frame_->timestamp().InMicroseconds() * |
| 123 base::Time::kNanosecondsPerMicrosecond; | 123 base::Time::kNanosecondsPerMicrosecond; |
| 124 } | 124 } |
| 125 | 125 |
| 126 virtual void SetElapsedTime(int64 elapsed_time) override { | 126 void SetElapsedTime(int64 elapsed_time) override { |
| 127 DCHECK(thread_checker_.CalledOnValidThread()); | 127 DCHECK(thread_checker_.CalledOnValidThread()); |
| 128 elapsed_time_ = elapsed_time; | 128 elapsed_time_ = elapsed_time; |
| 129 } | 129 } |
| 130 | 130 |
| 131 virtual void SetTimeStamp(int64 time_stamp) override { | 131 void SetTimeStamp(int64 time_stamp) override { |
| 132 DCHECK(thread_checker_.CalledOnValidThread()); | 132 DCHECK(thread_checker_.CalledOnValidThread()); |
| 133 // Round to closest microsecond. | 133 // Round to closest microsecond. |
| 134 frame_->set_timestamp(base::TimeDelta::FromMicroseconds( | 134 frame_->set_timestamp(base::TimeDelta::FromMicroseconds( |
| 135 (time_stamp + base::Time::kNanosecondsPerMicrosecond / 2) / | 135 (time_stamp + base::Time::kNanosecondsPerMicrosecond / 2) / |
| 136 base::Time::kNanosecondsPerMicrosecond)); | 136 base::Time::kNanosecondsPerMicrosecond)); |
| 137 } | 137 } |
| 138 | 138 |
| 139 virtual int GetRotation() const override { | 139 int GetRotation() const override { |
| 140 DCHECK(thread_checker_.CalledOnValidThread()); | 140 DCHECK(thread_checker_.CalledOnValidThread()); |
| 141 return 0; | 141 return 0; |
| 142 } | 142 } |
| 143 | 143 |
| 144 // TODO(magjed): Refactor into base class. | 144 // TODO(magjed): Refactor into base class. |
| 145 virtual size_t ConvertToRgbBuffer(uint32 to_fourcc, | 145 size_t ConvertToRgbBuffer(uint32 to_fourcc, |
| 146 uint8* buffer, | 146 uint8* buffer, |
| 147 size_t size, | 147 size_t size, |
| 148 int stride_rgb) const override { | 148 int stride_rgb) const override { |
| 149 DCHECK(thread_checker_.CalledOnValidThread()); | 149 DCHECK(thread_checker_.CalledOnValidThread()); |
| 150 const size_t needed = std::abs(stride_rgb) * GetHeight(); | 150 const size_t needed = std::abs(stride_rgb) * GetHeight(); |
| 151 if (size < needed) { | 151 if (size < needed) { |
| 152 DLOG(WARNING) << "RGB buffer is not large enough"; | 152 DLOG(WARNING) << "RGB buffer is not large enough"; |
| 153 return needed; | 153 return needed; |
| 154 } | 154 } |
| 155 | 155 |
| 156 if (libyuv::ConvertFromI420(GetYPlane(), | 156 if (libyuv::ConvertFromI420(GetYPlane(), |
| 157 GetYPitch(), | 157 GetYPitch(), |
| 158 GetUPlane(), | 158 GetUPlane(), |
| 159 GetUPitch(), | 159 GetUPitch(), |
| 160 GetVPlane(), | 160 GetVPlane(), |
| 161 GetVPitch(), | 161 GetVPitch(), |
| 162 buffer, | 162 buffer, |
| 163 stride_rgb, | 163 stride_rgb, |
| 164 static_cast<int>(GetWidth()), | 164 static_cast<int>(GetWidth()), |
| 165 static_cast<int>(GetHeight()), | 165 static_cast<int>(GetHeight()), |
| 166 to_fourcc)) { | 166 to_fourcc)) { |
| 167 DLOG(ERROR) << "RGB type not supported: " << to_fourcc; | 167 DLOG(ERROR) << "RGB type not supported: " << to_fourcc; |
| 168 return 0; // 0 indicates error | 168 return 0; // 0 indicates error |
| 169 } | 169 } |
| 170 return needed; | 170 return needed; |
| 171 } | 171 } |
| 172 | 172 |
| 173 // The rest of the public methods are NOTIMPLEMENTED. | 173 // The rest of the public methods are NOTIMPLEMENTED. |
| 174 virtual bool InitToBlack(int w, | 174 bool InitToBlack(int w, |
| 175 int h, | 175 int h, |
| 176 size_t pixel_width, | 176 size_t pixel_width, |
| 177 size_t pixel_height, | 177 size_t pixel_height, |
| 178 int64 elapsed_time, | 178 int64 elapsed_time, |
| 179 int64 time_stamp) override { | 179 int64 time_stamp) override { |
| 180 NOTIMPLEMENTED(); | 180 NOTIMPLEMENTED(); |
| 181 return false; | 181 return false; |
| 182 } | 182 } |
| 183 | 183 |
| 184 virtual bool Reset(uint32 fourcc, | 184 bool Reset(uint32 fourcc, |
| 185 int w, | 185 int w, |
| 186 int h, | 186 int h, |
| 187 int dw, | 187 int dw, |
| 188 int dh, | 188 int dh, |
| 189 uint8* sample, | 189 uint8* sample, |
| 190 size_t sample_size, | 190 size_t sample_size, |
| 191 size_t pixel_width, | 191 size_t pixel_width, |
| 192 size_t pixel_height, | 192 size_t pixel_height, |
| 193 int64 elapsed_time, | 193 int64 elapsed_time, |
| 194 int64 time_stamp, | 194 int64 time_stamp, |
| 195 int rotation) override { | 195 int rotation) override { |
| 196 NOTIMPLEMENTED(); | 196 NOTIMPLEMENTED(); |
| 197 return false; | 197 return false; |
| 198 } | 198 } |
| 199 | 199 |
| 200 virtual bool MakeExclusive() override { | 200 bool MakeExclusive() override { |
| 201 NOTIMPLEMENTED(); | 201 NOTIMPLEMENTED(); |
| 202 return false; | 202 return false; |
| 203 } | 203 } |
| 204 | 204 |
| 205 virtual size_t CopyToBuffer(uint8* buffer, size_t size) const override { | 205 size_t CopyToBuffer(uint8* buffer, size_t size) const override { |
| 206 NOTIMPLEMENTED(); | 206 NOTIMPLEMENTED(); |
| 207 return 0; | 207 return 0; |
| 208 } | 208 } |
| 209 | 209 |
| 210 protected: | 210 protected: |
| 211 // TODO(magjed): Refactor as a static method in WebRtcVideoFrame. | 211 // TODO(magjed): Refactor as a static method in WebRtcVideoFrame. |
| 212 virtual VideoFrame* CreateEmptyFrame(int w, | 212 VideoFrame* CreateEmptyFrame(int w, |
| 213 int h, | 213 int h, |
| 214 size_t pixel_width, | 214 size_t pixel_width, |
| 215 size_t pixel_height, | 215 size_t pixel_height, |
| 216 int64 elapsed_time, | 216 int64 elapsed_time, |
| 217 int64 time_stamp) const override { | 217 int64 time_stamp) const override { |
| 218 DCHECK(thread_checker_.CalledOnValidThread()); | 218 DCHECK(thread_checker_.CalledOnValidThread()); |
| 219 VideoFrame* frame = new cricket::WebRtcVideoFrame(); | 219 VideoFrame* frame = new cricket::WebRtcVideoFrame(); |
| 220 frame->InitToBlack( | 220 frame->InitToBlack( |
| 221 w, h, pixel_width, pixel_height, elapsed_time, time_stamp); | 221 w, h, pixel_width, pixel_height, elapsed_time, time_stamp); |
| 222 return frame; | 222 return frame; |
| 223 } | 223 } |
| 224 | 224 |
| 225 private: | 225 private: |
| 226 scoped_refptr<media::VideoFrame> frame_; | 226 scoped_refptr<media::VideoFrame> frame_; |
| 227 int64 elapsed_time_; | 227 int64 elapsed_time_; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 257 | 257 |
| 258 frame_ = frame; | 258 frame_ = frame; |
| 259 } | 259 } |
| 260 | 260 |
| 261 void ReleaseFrame() { frame_ = NULL; } | 261 void ReleaseFrame() { frame_ = NULL; } |
| 262 | 262 |
| 263 const cricket::CapturedFrame* GetCapturedFrame() const { | 263 const cricket::CapturedFrame* GetCapturedFrame() const { |
| 264 return &captured_frame_; | 264 return &captured_frame_; |
| 265 } | 265 } |
| 266 | 266 |
| 267 virtual cricket::VideoFrame* CreateAliasedFrame( | 267 cricket::VideoFrame* CreateAliasedFrame( |
| 268 const cricket::CapturedFrame* captured_frame, | 268 const cricket::CapturedFrame* captured_frame, |
| 269 int dst_width, | 269 int dst_width, |
| 270 int dst_height) const override { | 270 int dst_height) const override { |
| 271 // Check that captured_frame is actually our frame. | 271 // Check that captured_frame is actually our frame. |
| 272 DCHECK(captured_frame == &captured_frame_); | 272 DCHECK(captured_frame == &captured_frame_); |
| 273 DCHECK(frame_.get()); | 273 DCHECK(frame_.get()); |
| 274 | 274 |
| 275 scoped_refptr<media::VideoFrame> video_frame = frame_; | 275 scoped_refptr<media::VideoFrame> video_frame = frame_; |
| 276 // Check if scaling is needed. | 276 // Check if scaling is needed. |
| 277 if (dst_width != frame_->visible_rect().width() || | 277 if (dst_width != frame_->visible_rect().width() || |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 DCHECK(frame_factory_ == frame_factory()); | 407 DCHECK(frame_factory_ == frame_factory()); |
| 408 frame_factory_->SetFrame(frame, elapsed_time); | 408 frame_factory_->SetFrame(frame, elapsed_time); |
| 409 | 409 |
| 410 // This signals to libJingle that a new VideoFrame is available. | 410 // This signals to libJingle that a new VideoFrame is available. |
| 411 SignalFrameCaptured(this, frame_factory_->GetCapturedFrame()); | 411 SignalFrameCaptured(this, frame_factory_->GetCapturedFrame()); |
| 412 | 412 |
| 413 frame_factory_->ReleaseFrame(); // Release the frame ASAP. | 413 frame_factory_->ReleaseFrame(); // Release the frame ASAP. |
| 414 } | 414 } |
| 415 | 415 |
| 416 } // namespace content | 416 } // namespace content |
| OLD | NEW |