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

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

Issue 2315663002: Make cricket::VideoFrame inherit webrtc::VideoFrame. (Closed)
Patch Set: Created 4 years, 3 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 using webrtc::kYPlane;
20 using webrtc::kUPlane;
21 using webrtc::kVPlane;
22
23 namespace cricket {
24
25 WebRtcVideoFrame::WebRtcVideoFrame()
26 : timestamp_us_(0), rotation_(webrtc::kVideoRotation_0) {}
27
28 WebRtcVideoFrame::WebRtcVideoFrame(
29 const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer,
30 webrtc::VideoRotation rotation,
31 int64_t timestamp_us,
32 uint32_t transport_frame_id)
33 : video_frame_buffer_(buffer),
34 timestamp_us_(timestamp_us),
35 transport_frame_id_(transport_frame_id),
36 rotation_(rotation) {}
37
38 WebRtcVideoFrame::WebRtcVideoFrame(
39 const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer,
40 webrtc::VideoRotation rotation,
41 int64_t timestamp_us)
42 : WebRtcVideoFrame(buffer, rotation, timestamp_us, 0) {};
43
44 WebRtcVideoFrame::WebRtcVideoFrame(
45 const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer,
46 int64_t time_stamp_ns,
47 webrtc::VideoRotation rotation)
48 : WebRtcVideoFrame(buffer,
49 rotation,
50 time_stamp_ns / rtc::kNumNanosecsPerMicrosec,
51 0) {}
52
53 WebRtcVideoFrame::~WebRtcVideoFrame() {}
54
55 bool WebRtcVideoFrame::Init(uint32_t format,
56 int w,
57 int h,
58 int dw,
59 int dh,
60 uint8_t* sample,
61 size_t sample_size,
62 int64_t time_stamp_ns,
63 webrtc::VideoRotation rotation) {
64 return Reset(format, w, h, dw, dh, sample, sample_size,
65 time_stamp_ns / rtc::kNumNanosecsPerMicrosec, rotation,
66 true /*apply_rotation*/);
67 }
68
69 bool WebRtcVideoFrame::Init(const CapturedFrame* frame, int dw, int dh,
70 bool apply_rotation) {
71 return Reset(frame->fourcc, frame->width, frame->height, dw, dh,
72 static_cast<uint8_t*>(frame->data), frame->data_size,
73 frame->time_stamp / rtc::kNumNanosecsPerMicrosec,
74 frame->rotation, apply_rotation);
75 }
76
77 int WebRtcVideoFrame::width() const {
78 return video_frame_buffer_ ? video_frame_buffer_->width() : 0;
79 }
80
81 int WebRtcVideoFrame::height() const {
82 return video_frame_buffer_ ? video_frame_buffer_->height() : 0;
83 }
84
85 const rtc::scoped_refptr<webrtc::VideoFrameBuffer>&
86 WebRtcVideoFrame::video_frame_buffer() const {
87 return video_frame_buffer_;
88 }
89
90 uint32_t WebRtcVideoFrame::transport_frame_id() const {
91 return transport_frame_id_;
92 }
93
94 int64_t WebRtcVideoFrame::timestamp_us() const {
95 return timestamp_us_;
96 }
97
98 void WebRtcVideoFrame::set_timestamp_us(int64_t time_us) {
99 timestamp_us_ = time_us;
100 }
101
102 webrtc::VideoRotation WebRtcVideoFrame::rotation() const {
103 return rotation_;
104 }
105
106 bool WebRtcVideoFrame::Reset(uint32_t format,
107 int w,
108 int h,
109 int dw,
110 int dh,
111 uint8_t* sample,
112 size_t sample_size,
113 int64_t timestamp_us,
114 webrtc::VideoRotation rotation,
115 bool apply_rotation) {
116 if (!Validate(format, w, h, sample, sample_size)) {
117 return false;
118 }
119 // Translate aliases to standard enums (e.g., IYUV -> I420).
120 format = CanonicalFourCC(format);
121
122 // Set up a new buffer.
123 // TODO(fbarchard): Support lazy allocation.
124 int new_width = dw;
125 int new_height = dh;
126 // If rotated swap width, height.
127 if (apply_rotation && (rotation == 90 || rotation == 270)) {
128 new_width = dh;
129 new_height = dw;
130 }
131
132 InitToEmptyBuffer(new_width, new_height);
133 rotation_ = apply_rotation ? webrtc::kVideoRotation_0 : rotation;
134
135 int horiz_crop = ((w - dw) / 2) & ~1;
136 // ARGB on Windows has negative height.
137 // The sample's layout in memory is normal, so just correct crop.
138 int vert_crop = ((abs(h) - dh) / 2) & ~1;
139 // Conversion functions expect negative height to flip the image.
140 int idh = (h < 0) ? -dh : dh;
141 int r = libyuv::ConvertToI420(
142 sample, sample_size,
143 video_frame_buffer_->MutableDataY(),
144 video_frame_buffer_->StrideY(),
145 video_frame_buffer_->MutableDataU(),
146 video_frame_buffer_->StrideU(),
147 video_frame_buffer_->MutableDataV(),
148 video_frame_buffer_->StrideV(),
149 horiz_crop, vert_crop,
150 w, h,
151 dw, idh,
152 static_cast<libyuv::RotationMode>(
153 apply_rotation ? rotation : webrtc::kVideoRotation_0),
154 format);
155 if (r) {
156 LOG(LS_ERROR) << "Error parsing format: " << GetFourccName(format)
157 << " return code : " << r;
158 return false;
159 }
160 timestamp_us_ = timestamp_us;
161 return true;
162 }
163
164 void WebRtcVideoFrame::InitToEmptyBuffer(int w, int h) {
165 video_frame_buffer_ = new rtc::RefCountedObject<webrtc::I420Buffer>(w, h);
166 rotation_ = webrtc::kVideoRotation_0;
167 }
168
169 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698