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

Side by Side Diff: webrtc/common_video/video_frame_buffer.cc

Issue 1645543003: H264: Improve FFmpeg decoder performance by using I420BufferPool. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: common_video not unnecessarily depending on webrtc_h264, fixed circular dependency Created 4 years, 10 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
« no previous file with comments | « webrtc/common_video/include/video_frame_buffer.h ('k') | webrtc/modules/video_coding/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/common_video/include/video_frame_buffer.h" 11 #include "webrtc/common_video/include/video_frame_buffer.h"
12 12
13 #include "webrtc/base/checks.h" 13 #include "webrtc/base/checks.h"
14 #include "webrtc/base/keep_ref_until_done.h" 14 #include "webrtc/base/keep_ref_until_done.h"
15 15
16 // Aligning pointer to 64 bytes for improved performance, e.g. use SIMD. 16 // Aligning pointer to 64 bytes for improved performance, e.g. use SIMD.
17 static const int kBufferAlignment = 64; 17 static const int kBufferAlignment = 64;
18 18
19 namespace webrtc { 19 namespace webrtc {
20 20
21 namespace {
22
23 int I420DataSize(int height, int stride_y, int stride_u, int stride_v) {
24 return stride_y * height + (stride_u + stride_v) * ((height + 1) / 2);
25 }
26
27 } // namespace
28
21 uint8_t* VideoFrameBuffer::MutableData(PlaneType type) { 29 uint8_t* VideoFrameBuffer::MutableData(PlaneType type) {
22 RTC_NOTREACHED(); 30 RTC_NOTREACHED();
23 return nullptr; 31 return nullptr;
24 } 32 }
25 33
26 VideoFrameBuffer::~VideoFrameBuffer() {} 34 VideoFrameBuffer::~VideoFrameBuffer() {}
27 35
28 I420Buffer::I420Buffer(int width, int height) 36 I420Buffer::I420Buffer(int width, int height)
29 : I420Buffer(width, height, width, (width + 1) / 2, (width + 1) / 2) { 37 : I420Buffer(width, height, width, (width + 1) / 2, (width + 1) / 2) {
30 } 38 }
31 39
32 I420Buffer::I420Buffer(int width, 40 I420Buffer::I420Buffer(int width,
33 int height, 41 int height,
34 int stride_y, 42 int stride_y,
35 int stride_u, 43 int stride_u,
36 int stride_v) 44 int stride_v)
37 : width_(width), 45 : width_(width),
38 height_(height), 46 height_(height),
39 stride_y_(stride_y), 47 stride_y_(stride_y),
40 stride_u_(stride_u), 48 stride_u_(stride_u),
41 stride_v_(stride_v), 49 stride_v_(stride_v),
42 data_(static_cast<uint8_t*>(AlignedMalloc( 50 data_(static_cast<uint8_t*>(AlignedMalloc(
43 stride_y * height + (stride_u + stride_v) * ((height + 1) / 2), 51 I420DataSize(height, stride_y, stride_u, stride_v),
44 kBufferAlignment))) { 52 kBufferAlignment))) {
45 RTC_DCHECK_GT(width, 0); 53 RTC_DCHECK_GT(width, 0);
46 RTC_DCHECK_GT(height, 0); 54 RTC_DCHECK_GT(height, 0);
47 RTC_DCHECK_GE(stride_y, width); 55 RTC_DCHECK_GE(stride_y, width);
48 RTC_DCHECK_GE(stride_u, (width + 1) / 2); 56 RTC_DCHECK_GE(stride_u, (width + 1) / 2);
49 RTC_DCHECK_GE(stride_v, (width + 1) / 2); 57 RTC_DCHECK_GE(stride_v, (width + 1) / 2);
50 } 58 }
51 59
52 I420Buffer::~I420Buffer() { 60 I420Buffer::~I420Buffer() {
53 } 61 }
54 62
63 void I420Buffer::InitializeData() {
64 memset(data_.get(), 0,
65 I420DataSize(height_, stride_y_, stride_u_, stride_v_));
66 }
67
55 int I420Buffer::width() const { 68 int I420Buffer::width() const {
56 return width_; 69 return width_;
57 } 70 }
58 71
59 int I420Buffer::height() const { 72 int I420Buffer::height() const {
60 return height_; 73 return height_;
61 } 74 }
62 75
63 const uint8_t* I420Buffer::data(PlaneType type) const { 76 const uint8_t* I420Buffer::data(PlaneType type) const {
64 switch (type) { 77 switch (type) {
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 buffer->stride(kVPlane) * uv_offset_y + uv_offset_x; 242 buffer->stride(kVPlane) * uv_offset_y + uv_offset_x;
230 return new rtc::RefCountedObject<WrappedI420Buffer>( 243 return new rtc::RefCountedObject<WrappedI420Buffer>(
231 cropped_width, cropped_height, 244 cropped_width, cropped_height,
232 y_plane, buffer->stride(kYPlane), 245 y_plane, buffer->stride(kYPlane),
233 u_plane, buffer->stride(kUPlane), 246 u_plane, buffer->stride(kUPlane),
234 v_plane, buffer->stride(kVPlane), 247 v_plane, buffer->stride(kVPlane),
235 rtc::KeepRefUntilDone(buffer)); 248 rtc::KeepRefUntilDone(buffer));
236 } 249 }
237 250
238 } // namespace webrtc 251 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/common_video/include/video_frame_buffer.h ('k') | webrtc/modules/video_coding/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698