| Index: webrtc/media/engine/webrtcvideoframe.cc
|
| diff --git a/webrtc/media/engine/webrtcvideoframe.cc b/webrtc/media/engine/webrtcvideoframe.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c478c0a74daff6f3f487c6d43f02c9e243e9eee0
|
| --- /dev/null
|
| +++ b/webrtc/media/engine/webrtcvideoframe.cc
|
| @@ -0,0 +1,154 @@
|
| +/*
|
| + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#include "webrtc/media/engine/webrtcvideoframe.h"
|
| +
|
| +#include "libyuv/convert.h"
|
| +#include "webrtc/base/logging.h"
|
| +#include "webrtc/media/base/videocapturer.h"
|
| +#include "webrtc/media/base/videocommon.h"
|
| +#include "webrtc/video_frame.h"
|
| +
|
| +namespace cricket {
|
| +
|
| +WebRtcVideoFrame::WebRtcVideoFrame()
|
| + : timestamp_us_(0), rotation_(webrtc::kVideoRotation_0) {}
|
| +
|
| +WebRtcVideoFrame::WebRtcVideoFrame(
|
| + const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer,
|
| + webrtc::VideoRotation rotation,
|
| + int64_t timestamp_us,
|
| + uint32_t transport_frame_id)
|
| + : video_frame_buffer_(buffer),
|
| + timestamp_us_(timestamp_us),
|
| + transport_frame_id_(transport_frame_id),
|
| + rotation_(rotation) {}
|
| +
|
| +WebRtcVideoFrame::WebRtcVideoFrame(
|
| + const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer,
|
| + webrtc::VideoRotation rotation,
|
| + int64_t timestamp_us)
|
| + : WebRtcVideoFrame(buffer, rotation, timestamp_us, 0) {};
|
| +
|
| +WebRtcVideoFrame::WebRtcVideoFrame(
|
| + const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer,
|
| + int64_t time_stamp_ns,
|
| + webrtc::VideoRotation rotation)
|
| + : WebRtcVideoFrame(buffer,
|
| + rotation,
|
| + time_stamp_ns / rtc::kNumNanosecsPerMicrosec,
|
| + 0) {}
|
| +
|
| +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 / rtc::kNumNanosecsPerMicrosec, rotation,
|
| + true /*apply_rotation*/);
|
| +}
|
| +
|
| +int WebRtcVideoFrame::width() const {
|
| + return video_frame_buffer_ ? video_frame_buffer_->width() : 0;
|
| +}
|
| +
|
| +int WebRtcVideoFrame::height() const {
|
| + return video_frame_buffer_ ? video_frame_buffer_->height() : 0;
|
| +}
|
| +
|
| +const rtc::scoped_refptr<webrtc::VideoFrameBuffer>&
|
| +WebRtcVideoFrame::video_frame_buffer() const {
|
| + return video_frame_buffer_;
|
| +}
|
| +
|
| +uint32_t WebRtcVideoFrame::transport_frame_id() const {
|
| + return transport_frame_id_;
|
| +}
|
| +
|
| +int64_t WebRtcVideoFrame::timestamp_us() const {
|
| + return timestamp_us_;
|
| +}
|
| +
|
| +void WebRtcVideoFrame::set_timestamp_us(int64_t time_us) {
|
| + timestamp_us_ = time_us;
|
| +}
|
| +
|
| +webrtc::VideoRotation WebRtcVideoFrame::rotation() const {
|
| + return rotation_;
|
| +}
|
| +
|
| +bool WebRtcVideoFrame::Reset(uint32_t format,
|
| + int w,
|
| + int h,
|
| + int dw,
|
| + int dh,
|
| + uint8_t* sample,
|
| + size_t sample_size,
|
| + int64_t timestamp_us,
|
| + 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;
|
| + }
|
| +
|
| + rtc::scoped_refptr<webrtc::I420Buffer> buffer =
|
| + webrtc::I420Buffer::Create(new_width, new_height);
|
| + video_frame_buffer_ = buffer;
|
| + 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,
|
| + buffer->MutableDataY(), buffer->StrideY(),
|
| + buffer->MutableDataU(), buffer->StrideU(),
|
| + buffer->MutableDataV(), buffer->StrideV(),
|
| + 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;
|
| + }
|
| + timestamp_us_ = timestamp_us;
|
| + return true;
|
| +}
|
| +
|
| +void WebRtcVideoFrame::InitToEmptyBuffer(int w, int h) {
|
| + video_frame_buffer_ = webrtc::I420Buffer::Create(w, h);
|
| + rotation_ = webrtc::kVideoRotation_0;
|
| +}
|
| +
|
| +} // namespace cricket
|
|
|