Index: talk/media/webrtc/webrtcvideoframe.cc |
diff --git a/talk/media/webrtc/webrtcvideoframe.cc b/talk/media/webrtc/webrtcvideoframe.cc |
deleted file mode 100644 |
index 911466493a2634975d13714513db3f6ce4cce493..0000000000000000000000000000000000000000 |
--- a/talk/media/webrtc/webrtcvideoframe.cc |
+++ /dev/null |
@@ -1,298 +0,0 @@ |
-/* |
- * libjingle |
- * Copyright 2011 Google Inc. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions are met: |
- * |
- * 1. Redistributions of source code must retain the above copyright notice, |
- * this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright notice, |
- * this list of conditions and the following disclaimer in the documentation |
- * and/or other materials provided with the distribution. |
- * 3. The name of the author may not be used to endorse or promote products |
- * derived from this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "talk/media/webrtc/webrtcvideoframe.h" |
- |
-#include "libyuv/convert.h" |
-#include "talk/media/base/videocapturer.h" |
-#include "talk/media/base/videocommon.h" |
-#include "webrtc/base/logging.h" |
-#include "webrtc/video_frame.h" |
- |
-using webrtc::kYPlane; |
-using webrtc::kUPlane; |
-using webrtc::kVPlane; |
- |
-namespace cricket { |
- |
-WebRtcVideoFrame::WebRtcVideoFrame(): |
- time_stamp_ns_(0), |
- rotation_(webrtc::kVideoRotation_0) {} |
- |
-WebRtcVideoFrame::WebRtcVideoFrame( |
- const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer, |
- int64_t time_stamp_ns, |
- webrtc::VideoRotation rotation) |
- : video_frame_buffer_(buffer), |
- time_stamp_ns_(time_stamp_ns), |
- rotation_(rotation) { |
-} |
- |
-WebRtcVideoFrame::~WebRtcVideoFrame() {} |
- |
-bool WebRtcVideoFrame::Init(uint32_t format, |
- int w, |
- int h, |
- int dw, |
- int dh, |
- uint8_t* sample, |
- size_t sample_size, |
- int64_t time_stamp_ns, |
- webrtc::VideoRotation rotation) { |
- return Reset(format, w, h, dw, dh, sample, sample_size, |
- time_stamp_ns, rotation, |
- true /*apply_rotation*/); |
-} |
- |
-bool WebRtcVideoFrame::Init(const CapturedFrame* frame, int dw, int dh, |
- bool apply_rotation) { |
- return Reset(frame->fourcc, frame->width, frame->height, dw, dh, |
- static_cast<uint8_t*>(frame->data), frame->data_size, |
- frame->time_stamp, |
- frame->rotation, apply_rotation); |
-} |
- |
-bool WebRtcVideoFrame::InitToBlack(int w, int h, |
- int64_t time_stamp_ns) { |
- InitToEmptyBuffer(w, h, time_stamp_ns); |
- return SetToBlack(); |
-} |
- |
-size_t WebRtcVideoFrame::GetWidth() const { |
- return video_frame_buffer_ ? video_frame_buffer_->width() : 0; |
-} |
- |
-size_t WebRtcVideoFrame::GetHeight() const { |
- return video_frame_buffer_ ? video_frame_buffer_->height() : 0; |
-} |
- |
-const uint8_t* WebRtcVideoFrame::GetYPlane() const { |
- return video_frame_buffer_ ? video_frame_buffer_->data(kYPlane) : nullptr; |
-} |
- |
-const uint8_t* WebRtcVideoFrame::GetUPlane() const { |
- return video_frame_buffer_ ? video_frame_buffer_->data(kUPlane) : nullptr; |
-} |
- |
-const uint8_t* WebRtcVideoFrame::GetVPlane() const { |
- return video_frame_buffer_ ? video_frame_buffer_->data(kVPlane) : nullptr; |
-} |
- |
-uint8_t* WebRtcVideoFrame::GetYPlane() { |
- return video_frame_buffer_ ? video_frame_buffer_->MutableData(kYPlane) |
- : nullptr; |
-} |
- |
-uint8_t* WebRtcVideoFrame::GetUPlane() { |
- return video_frame_buffer_ ? video_frame_buffer_->MutableData(kUPlane) |
- : nullptr; |
-} |
- |
-uint8_t* WebRtcVideoFrame::GetVPlane() { |
- return video_frame_buffer_ ? video_frame_buffer_->MutableData(kVPlane) |
- : nullptr; |
-} |
- |
-int32_t WebRtcVideoFrame::GetYPitch() const { |
- return video_frame_buffer_ ? video_frame_buffer_->stride(kYPlane) : 0; |
-} |
- |
-int32_t WebRtcVideoFrame::GetUPitch() const { |
- return video_frame_buffer_ ? video_frame_buffer_->stride(kUPlane) : 0; |
-} |
- |
-int32_t WebRtcVideoFrame::GetVPitch() const { |
- return video_frame_buffer_ ? video_frame_buffer_->stride(kVPlane) : 0; |
-} |
- |
-bool WebRtcVideoFrame::IsExclusive() const { |
- return video_frame_buffer_->HasOneRef(); |
-} |
- |
-void* WebRtcVideoFrame::GetNativeHandle() const { |
- return video_frame_buffer_ ? video_frame_buffer_->native_handle() : nullptr; |
-} |
- |
-rtc::scoped_refptr<webrtc::VideoFrameBuffer> |
-WebRtcVideoFrame::GetVideoFrameBuffer() const { |
- return video_frame_buffer_; |
-} |
- |
-VideoFrame* WebRtcVideoFrame::Copy() const { |
- WebRtcVideoFrame* new_frame = new WebRtcVideoFrame( |
- video_frame_buffer_, time_stamp_ns_, rotation_); |
- return new_frame; |
-} |
- |
-bool WebRtcVideoFrame::MakeExclusive() { |
- RTC_DCHECK(video_frame_buffer_->native_handle() == nullptr); |
- if (IsExclusive()) |
- return true; |
- |
- // Not exclusive already, need to copy buffer. |
- rtc::scoped_refptr<webrtc::VideoFrameBuffer> new_buffer = |
- new rtc::RefCountedObject<webrtc::I420Buffer>( |
- video_frame_buffer_->width(), video_frame_buffer_->height(), |
- video_frame_buffer_->stride(kYPlane), |
- video_frame_buffer_->stride(kUPlane), |
- video_frame_buffer_->stride(kVPlane)); |
- |
- if (!CopyToPlanes( |
- new_buffer->MutableData(kYPlane), new_buffer->MutableData(kUPlane), |
- new_buffer->MutableData(kVPlane), new_buffer->stride(kYPlane), |
- new_buffer->stride(kUPlane), new_buffer->stride(kVPlane))) { |
- return false; |
- } |
- |
- video_frame_buffer_ = new_buffer; |
- return true; |
-} |
- |
-size_t WebRtcVideoFrame::ConvertToRgbBuffer(uint32_t to_fourcc, |
- uint8_t* buffer, |
- size_t size, |
- int stride_rgb) const { |
- RTC_CHECK(video_frame_buffer_); |
- RTC_CHECK(video_frame_buffer_->native_handle() == nullptr); |
- return VideoFrame::ConvertToRgbBuffer(to_fourcc, buffer, size, stride_rgb); |
-} |
- |
-bool WebRtcVideoFrame::Reset(uint32_t format, |
- int w, |
- int h, |
- int dw, |
- int dh, |
- uint8_t* sample, |
- size_t sample_size, |
- int64_t time_stamp_ns, |
- webrtc::VideoRotation rotation, |
- bool apply_rotation) { |
- if (!Validate(format, w, h, sample, sample_size)) { |
- return false; |
- } |
- // Translate aliases to standard enums (e.g., IYUV -> I420). |
- format = CanonicalFourCC(format); |
- |
- // Set up a new buffer. |
- // TODO(fbarchard): Support lazy allocation. |
- int new_width = dw; |
- int new_height = dh; |
- // If rotated swap width, height. |
- if (apply_rotation && (rotation == 90 || rotation == 270)) { |
- new_width = dh; |
- new_height = dw; |
- } |
- |
- InitToEmptyBuffer(new_width, new_height, |
- time_stamp_ns); |
- rotation_ = apply_rotation ? webrtc::kVideoRotation_0 : rotation; |
- |
- int horiz_crop = ((w - dw) / 2) & ~1; |
- // ARGB on Windows has negative height. |
- // The sample's layout in memory is normal, so just correct crop. |
- int vert_crop = ((abs(h) - dh) / 2) & ~1; |
- // Conversion functions expect negative height to flip the image. |
- int idh = (h < 0) ? -dh : dh; |
- int r = libyuv::ConvertToI420( |
- sample, sample_size, |
- GetYPlane(), GetYPitch(), |
- GetUPlane(), GetUPitch(), |
- GetVPlane(), GetVPitch(), |
- horiz_crop, vert_crop, |
- w, h, |
- dw, idh, |
- static_cast<libyuv::RotationMode>( |
- apply_rotation ? rotation : webrtc::kVideoRotation_0), |
- format); |
- if (r) { |
- LOG(LS_ERROR) << "Error parsing format: " << GetFourccName(format) |
- << " return code : " << r; |
- return false; |
- } |
- return true; |
-} |
- |
-VideoFrame* WebRtcVideoFrame::CreateEmptyFrame( |
- int w, int h, |
- int64_t time_stamp_ns) const { |
- WebRtcVideoFrame* frame = new WebRtcVideoFrame(); |
- frame->InitToEmptyBuffer(w, h, time_stamp_ns); |
- return frame; |
-} |
- |
-void WebRtcVideoFrame::InitToEmptyBuffer(int w, int h, |
- int64_t time_stamp_ns) { |
- video_frame_buffer_ = new rtc::RefCountedObject<webrtc::I420Buffer>(w, h); |
- time_stamp_ns_ = time_stamp_ns; |
- rotation_ = webrtc::kVideoRotation_0; |
-} |
- |
-const VideoFrame* WebRtcVideoFrame::GetCopyWithRotationApplied() const { |
- // If the frame is not rotated, the caller should reuse this frame instead of |
- // making a redundant copy. |
- if (GetVideoRotation() == webrtc::kVideoRotation_0) { |
- return this; |
- } |
- |
- // If the video frame is backed up by a native handle, it resides in the GPU |
- // memory which we can't rotate here. The assumption is that the renderers |
- // which uses GPU to render should be able to rotate themselves. |
- RTC_DCHECK(!GetNativeHandle()); |
- |
- if (rotated_frame_) { |
- return rotated_frame_.get(); |
- } |
- |
- int width = static_cast<int>(GetWidth()); |
- int height = static_cast<int>(GetHeight()); |
- |
- int rotated_width = width; |
- int rotated_height = height; |
- if (GetVideoRotation() == webrtc::kVideoRotation_90 || |
- GetVideoRotation() == webrtc::kVideoRotation_270) { |
- rotated_width = height; |
- rotated_height = width; |
- } |
- |
- rotated_frame_.reset(CreateEmptyFrame(rotated_width, rotated_height, |
- GetTimeStamp())); |
- |
- // TODO(guoweis): Add a function in webrtc_libyuv.cc to convert from |
- // VideoRotation to libyuv::RotationMode. |
- int ret = libyuv::I420Rotate( |
- GetYPlane(), GetYPitch(), GetUPlane(), GetUPitch(), GetVPlane(), |
- GetVPitch(), rotated_frame_->GetYPlane(), rotated_frame_->GetYPitch(), |
- rotated_frame_->GetUPlane(), rotated_frame_->GetUPitch(), |
- rotated_frame_->GetVPlane(), rotated_frame_->GetVPitch(), width, height, |
- static_cast<libyuv::RotationMode>(GetVideoRotation())); |
- if (ret == 0) { |
- return rotated_frame_.get(); |
- } |
- return nullptr; |
-} |
- |
-} // namespace cricket |