Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Side by Side Diff: webrtc/media/engine/webrtcvideoframe.cc

Issue 2411953002: Reland of Make cricket::VideoFrame inherit webrtc::VideoFrame. (Closed)
Patch Set: Fix for windows build. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/media/engine/webrtcvideoframe.h"
12
13 #include "libyuv/convert.h"
14 #include "webrtc/base/logging.h"
15 #include "webrtc/media/base/videocapturer.h"
16 #include "webrtc/media/base/videocommon.h"
17 #include "webrtc/video_frame.h"
18
19 namespace cricket {
20
21 WebRtcVideoFrame::WebRtcVideoFrame()
22 : timestamp_us_(0), rotation_(webrtc::kVideoRotation_0) {}
23
24 WebRtcVideoFrame::WebRtcVideoFrame(
25 const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer,
26 webrtc::VideoRotation rotation,
27 int64_t timestamp_us,
28 uint32_t transport_frame_id)
29 : video_frame_buffer_(buffer),
30 timestamp_us_(timestamp_us),
31 transport_frame_id_(transport_frame_id),
32 rotation_(rotation) {}
33
34 WebRtcVideoFrame::WebRtcVideoFrame(
35 const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer,
36 webrtc::VideoRotation rotation,
37 int64_t timestamp_us)
38 : WebRtcVideoFrame(buffer, rotation, timestamp_us, 0) {};
39
40 WebRtcVideoFrame::WebRtcVideoFrame(
41 const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer,
42 int64_t time_stamp_ns,
43 webrtc::VideoRotation rotation)
44 : WebRtcVideoFrame(buffer,
45 rotation,
46 time_stamp_ns / rtc::kNumNanosecsPerMicrosec,
47 0) {}
48
49 WebRtcVideoFrame::~WebRtcVideoFrame() {}
50
51 bool WebRtcVideoFrame::Init(uint32_t format,
52 int w,
53 int h,
54 int dw,
55 int dh,
56 uint8_t* sample,
57 size_t sample_size,
58 int64_t time_stamp_ns,
59 webrtc::VideoRotation rotation) {
60 return Reset(format, w, h, dw, dh, sample, sample_size,
61 time_stamp_ns / rtc::kNumNanosecsPerMicrosec, rotation,
62 true /*apply_rotation*/);
63 }
64
65 int WebRtcVideoFrame::width() const {
66 return video_frame_buffer_ ? video_frame_buffer_->width() : 0;
67 }
68
69 int WebRtcVideoFrame::height() const {
70 return video_frame_buffer_ ? video_frame_buffer_->height() : 0;
71 }
72
73 const rtc::scoped_refptr<webrtc::VideoFrameBuffer>&
74 WebRtcVideoFrame::video_frame_buffer() const {
75 return video_frame_buffer_;
76 }
77
78 uint32_t WebRtcVideoFrame::transport_frame_id() const {
79 return transport_frame_id_;
80 }
81
82 int64_t WebRtcVideoFrame::timestamp_us() const {
83 return timestamp_us_;
84 }
85
86 void WebRtcVideoFrame::set_timestamp_us(int64_t time_us) {
87 timestamp_us_ = time_us;
88 }
89
90 webrtc::VideoRotation WebRtcVideoFrame::rotation() const {
91 return rotation_;
92 }
93
94 bool WebRtcVideoFrame::Reset(uint32_t format,
95 int w,
96 int h,
97 int dw,
98 int dh,
99 uint8_t* sample,
100 size_t sample_size,
101 int64_t timestamp_us,
102 webrtc::VideoRotation rotation,
103 bool apply_rotation) {
104 if (!Validate(format, w, h, sample, sample_size)) {
105 return false;
106 }
107 // Translate aliases to standard enums (e.g., IYUV -> I420).
108 format = CanonicalFourCC(format);
109
110 // Set up a new buffer.
111 // TODO(fbarchard): Support lazy allocation.
112 int new_width = dw;
113 int new_height = dh;
114 // If rotated swap width, height.
115 if (apply_rotation && (rotation == 90 || rotation == 270)) {
116 new_width = dh;
117 new_height = dw;
118 }
119
120 rtc::scoped_refptr<webrtc::I420Buffer> buffer =
121 webrtc::I420Buffer::Create(new_width, new_height);
122 video_frame_buffer_ = buffer;
123 rotation_ = apply_rotation ? webrtc::kVideoRotation_0 : rotation;
124
125 int horiz_crop = ((w - dw) / 2) & ~1;
126 // ARGB on Windows has negative height.
127 // The sample's layout in memory is normal, so just correct crop.
128 int vert_crop = ((abs(h) - dh) / 2) & ~1;
129 // Conversion functions expect negative height to flip the image.
130 int idh = (h < 0) ? -dh : dh;
131 int r = libyuv::ConvertToI420(
132 sample, sample_size,
133 buffer->MutableDataY(), buffer->StrideY(),
134 buffer->MutableDataU(), buffer->StrideU(),
135 buffer->MutableDataV(), buffer->StrideV(),
136 horiz_crop, vert_crop, w, h, dw, idh,
137 static_cast<libyuv::RotationMode>(
138 apply_rotation ? rotation : webrtc::kVideoRotation_0),
139 format);
140 if (r) {
141 LOG(LS_ERROR) << "Error parsing format: " << GetFourccName(format)
142 << " return code : " << r;
143 return false;
144 }
145 timestamp_us_ = timestamp_us;
146 return true;
147 }
148
149 void WebRtcVideoFrame::InitToEmptyBuffer(int w, int h) {
150 video_frame_buffer_ = webrtc::I420Buffer::Create(w, h);
151 rotation_ = webrtc::kVideoRotation_0;
152 }
153
154 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvideoframe.h ('k') | webrtc/media/engine/webrtcvideoframe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698