| 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
|
|
|