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 |