OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/base/video_frame.h" | 5 #include "media/base/video_frame.h" |
6 | 6 |
7 namespace media { | 7 namespace media { |
8 | 8 |
9 // static | 9 // static |
10 void VideoFrame::CreateFrame(VideoFrame::Format format, | 10 void VideoFrame::CreateFrame(VideoFrame::Format format, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 size_t bytes_per_row = RoundUp(width_ * bytes_per_pixel, 8); | 123 size_t bytes_per_row = RoundUp(width_ * bytes_per_pixel, 8); |
124 planes_ = VideoFrame::kNumRGBPlanes; | 124 planes_ = VideoFrame::kNumRGBPlanes; |
125 strides_[VideoFrame::kRGBPlane] = bytes_per_row; | 125 strides_[VideoFrame::kRGBPlane] = bytes_per_row; |
126 data_[VideoFrame::kRGBPlane] = new uint8[bytes_per_row * height_]; | 126 data_[VideoFrame::kRGBPlane] = new uint8[bytes_per_row * height_]; |
127 DCHECK(data_[VideoFrame::kRGBPlane]); | 127 DCHECK(data_[VideoFrame::kRGBPlane]); |
128 DCHECK(!(reinterpret_cast<intptr_t>(data_[VideoFrame::kRGBPlane]) & 7)); | 128 DCHECK(!(reinterpret_cast<intptr_t>(data_[VideoFrame::kRGBPlane]) & 7)); |
129 COMPILE_ASSERT(0 == VideoFrame::kRGBPlane, RGB_data_must_be_index_0); | 129 COMPILE_ASSERT(0 == VideoFrame::kRGBPlane, RGB_data_must_be_index_0); |
130 return (NULL != data_[VideoFrame::kRGBPlane]); | 130 return (NULL != data_[VideoFrame::kRGBPlane]); |
131 } | 131 } |
132 | 132 |
| 133 static const int kFramePadBytes = 15; // allows faster SIMD YUV convert |
| 134 |
133 bool VideoFrame::AllocateYUV() { | 135 bool VideoFrame::AllocateYUV() { |
134 DCHECK(format_ == VideoFrame::YV12 || | 136 DCHECK(format_ == VideoFrame::YV12 || |
135 format_ == VideoFrame::YV16); | 137 format_ == VideoFrame::YV16); |
136 // Align Y rows at 32-bit (4 byte) boundaries. The stride for both YV12 and | 138 // Align Y rows at 32-bit (4 byte) boundaries. The stride for both YV12 and |
137 // YV16 is 1/2 of the stride of Y. For YV12, every row of bytes for U and V | 139 // YV16 is 1/2 of the stride of Y. For YV12, every row of bytes for U and V |
138 // applies to two rows of Y (one byte of UV for 4 bytes of Y), so in the | 140 // applies to two rows of Y (one byte of UV for 4 bytes of Y), so in the |
139 // case of YV12 the strides are identical for the same width surface, but the | 141 // case of YV12 the strides are identical for the same width surface, but the |
140 // number of bytes allocated for YV12 is 1/2 the amount for U & V as YV16. | 142 // number of bytes allocated for YV12 is 1/2 the amount for U & V as YV16. |
141 // We also round the height of the surface allocated to be an even number | 143 // We also round the height of the surface allocated to be an even number |
142 // to avoid any potential of faulting by code that attempts to access the Y | 144 // to avoid any potential of faulting by code that attempts to access the Y |
143 // values of the final row, but assumes that the last row of U & V applies to | 145 // values of the final row, but assumes that the last row of U & V applies to |
144 // a full two rows of Y. | 146 // a full two rows of Y. |
145 size_t alloc_height = RoundUp(height_, 2); | 147 size_t alloc_height = RoundUp(height_, 2); |
146 size_t y_bytes_per_row = RoundUp(width_, 4); | 148 size_t y_bytes_per_row = RoundUp(width_, 4); |
147 size_t uv_stride = RoundUp(y_bytes_per_row / 2, 4); | 149 size_t uv_stride = RoundUp(y_bytes_per_row / 2, 4); |
148 size_t y_bytes = alloc_height * y_bytes_per_row; | 150 size_t y_bytes = alloc_height * y_bytes_per_row; |
149 size_t uv_bytes = alloc_height * uv_stride; | 151 size_t uv_bytes = alloc_height * uv_stride; |
150 if (format_ == VideoFrame::YV12) { | 152 if (format_ == VideoFrame::YV12) { |
151 uv_bytes /= 2; | 153 uv_bytes /= 2; |
152 } | 154 } |
153 uint8* data = new uint8[y_bytes + (uv_bytes * 2)]; | 155 uint8* data = new uint8[y_bytes + (uv_bytes * 2) + kFramePadBytes]; |
154 if (data) { | 156 if (data) { |
155 planes_ = VideoFrame::kNumYUVPlanes; | 157 planes_ = VideoFrame::kNumYUVPlanes; |
156 COMPILE_ASSERT(0 == VideoFrame::kYPlane, y_plane_data_must_be_index_0); | 158 COMPILE_ASSERT(0 == VideoFrame::kYPlane, y_plane_data_must_be_index_0); |
157 data_[VideoFrame::kYPlane] = data; | 159 data_[VideoFrame::kYPlane] = data; |
158 data_[VideoFrame::kUPlane] = data + y_bytes; | 160 data_[VideoFrame::kUPlane] = data + y_bytes; |
159 data_[VideoFrame::kVPlane] = data + y_bytes + uv_bytes; | 161 data_[VideoFrame::kVPlane] = data + y_bytes + uv_bytes; |
160 strides_[VideoFrame::kYPlane] = y_bytes_per_row; | 162 strides_[VideoFrame::kYPlane] = y_bytes_per_row; |
161 strides_[VideoFrame::kUPlane] = uv_stride; | 163 strides_[VideoFrame::kUPlane] = uv_stride; |
162 strides_[VideoFrame::kVPlane] = uv_stride; | 164 strides_[VideoFrame::kVPlane] = uv_stride; |
163 return true; | 165 return true; |
(...skipping 21 matching lines...) Expand all Loading... |
185 // on the heap, and other |data| pointers point inside the same, single block | 187 // on the heap, and other |data| pointers point inside the same, single block |
186 // so just delete index 0. | 188 // so just delete index 0. |
187 delete[] data_[0]; | 189 delete[] data_[0]; |
188 } | 190 } |
189 | 191 |
190 bool VideoFrame::IsEndOfStream() const { | 192 bool VideoFrame::IsEndOfStream() const { |
191 return format_ == VideoFrame::EMPTY; | 193 return format_ == VideoFrame::EMPTY; |
192 } | 194 } |
193 | 195 |
194 } // namespace media | 196 } // namespace media |
OLD | NEW |