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

Unified Diff: media/gpu/video_encode_accelerator_unittest.cc

Issue 2270713002: VEA unittest: align input buffers to 128-byte boundary on ARM only. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compilation error Created 4 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/gpu/video_encode_accelerator_unittest.cc
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc
index 7ba3fe8d83e6ef8be99a1efb7b94f6d108a7a73a..447255693f6f8ae28d918e2e4461e353aa255bc7 100644
--- a/media/gpu/video_encode_accelerator_unittest.cc
+++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -156,6 +156,22 @@ VideoEncodeAcceleratorTestEnvironment* g_env;
// "--num_frames_to_encode". Ignored if 0.
int g_num_frames_to_encode = 0;
+#ifdef ARCH_CPU_ARMEL
+// ARM performs CPU cache management with CPU cache line granularity. We thus
+// need to ensure our buffers are CPU cache line-aligned (64 byte-aligned).
+// Otherwise newer kernels will refuse to accept them, and on older kernels
+// we'll be treating ourselves to random corruption.
+// Moreover, some hardware codecs require 128-byte alignment for physical
+// buffers.
+const size_t kPlatformBufferAlignment = 128;
+#else
+const size_t kPlatformBufferAlignment = 1;
+#endif
+
+inline static size_t AlignToPlatformRequirements(size_t value) {
+ return base::bits::Align(value, kPlatformBufferAlignment);
+}
+
// An aligned STL allocator.
template <typename T, size_t ByteAlignment>
class AlignedAllocator : public std::allocator<T> {
@@ -206,8 +222,10 @@ struct TestStream {
std::string in_filename;
// A vector used to prepare aligned input buffers of |in_filename|. This
- // makes sure starting address of YUV planes are 64 bytes-aligned.
- std::vector<char, AlignedAllocator<char, 64>> aligned_in_file_data;
+ // makes sure starting addresses of YUV planes are aligned to
+ // kPlatformBufferAlignment bytes.
+ std::vector<char, AlignedAllocator<char, kPlatformBufferAlignment>>
+ aligned_in_file_data;
// Byte size of a frame of |aligned_in_file_data|.
size_t aligned_buffer_size;
@@ -223,10 +241,6 @@ struct TestStream {
unsigned int requested_subsequent_framerate;
};
-inline static size_t Align64Bytes(size_t value) {
- return base::bits::Align(value, 64);
-}
-
// Return the |percentile| from a sorted vector.
static base::TimeDelta Percentile(
const std::vector<base::TimeDelta>& sorted_values,
@@ -267,14 +281,11 @@ static std::string FilePathStringTypeToString(
#endif // defined(OS_WIN)
}
-// ARM performs CPU cache management with CPU cache line granularity. We thus
-// need to ensure our buffers are CPU cache line-aligned (64 byte-aligned).
-// Otherwise newer kernels will refuse to accept them, and on older kernels
-// we'll be treating ourselves to random corruption.
+// Some platforms may have requirements on physical memory buffer alignment.
// Since we are just mapping and passing chunks of the input file directly to
-// the VEA as input frames to avoid copying large chunks of raw data on each
-// frame and thus affecting performance measurements, we have to prepare a
-// temporary file with all planes aligned to 64-byte boundaries beforehand.
+// the VEA as input frames, to avoid copying large chunks of raw data on each
+// frame, and thus affecting performance measurements, we have to prepare a
+// temporary file with all planes aligned to the required alignment beforehand.
static void CreateAlignedInputStreamFile(const gfx::Size& coded_size,
TestStream* test_stream) {
// Test case may have many encoders and memory should be prepared once.
@@ -295,15 +306,17 @@ static void CreateAlignedInputStreamFile(const gfx::Size& coded_size,
std::vector<size_t> visible_plane_rows(num_planes);
// Calculate padding in bytes to be added after each plane required to keep
- // starting addresses of all planes at a 64 byte boudnary. This padding will
- // be added after each plane when copying to the temporary file.
+ // starting addresses of all planes at a byte boundary required by the
+ // platform. This padding will be added after each plane when copying to the
+ // temporary file.
// At the same time we also need to take into account coded_size requested by
// the VEA; each row of visible_bpl bytes in the original file needs to be
// copied into a row of coded_bpl bytes in the aligned file.
for (size_t i = 0; i < num_planes; i++) {
const size_t size =
VideoFrame::PlaneSize(kInputFormat, i, coded_size).GetArea();
- test_stream->aligned_plane_size.push_back(Align64Bytes(size));
+ test_stream->aligned_plane_size.push_back(
+ AlignToPlatformRequirements(size));
test_stream->aligned_buffer_size += test_stream->aligned_plane_size.back();
coded_bpl[i] = VideoFrame::RowBytes(i, kInputFormat, coded_size.width());
@@ -314,7 +327,8 @@ static void CreateAlignedInputStreamFile(const gfx::Size& coded_size,
const size_t padding_rows =
VideoFrame::Rows(i, kInputFormat, coded_size.height()) -
visible_plane_rows[i];
- padding_sizes[i] = padding_rows * coded_bpl[i] + Align64Bytes(size) - size;
+ padding_sizes[i] =
+ padding_rows * coded_bpl[i] + AlignToPlatformRequirements(size) - size;
}
base::FilePath src_file(StringToFilePathStringType(test_stream->in_filename));
@@ -342,9 +356,9 @@ static void CreateAlignedInputStreamFile(const gfx::Size& coded_size,
static_cast<int>(visible_buffer_size));
const char* src_ptr = &src_data[0];
for (size_t i = 0; i < num_planes; i++) {
- // Assert that each plane of frame starts at 64 byte boundary.
- ASSERT_EQ(dest_offset & 63, 0)
- << "Planes of frame should be mapped at a 64 byte boundary";
+ // Assert that each plane of frame starts at required byte boundary.
+ ASSERT_EQ(dest_offset & (kPlatformBufferAlignment - 1), 0u)
+ << "Planes of frame should be mapped per platform requirements";
for (size_t j = 0; j < visible_plane_rows[i]; j++) {
memcpy(&test_stream->aligned_in_file_data[dest_offset], src_ptr,
visible_bpl[i]);
@@ -357,14 +371,6 @@ static void CreateAlignedInputStreamFile(const gfx::Size& coded_size,
}
src.Close();
-#if defined(OS_POSIX)
- // Assert that memory mapped of file starts at 64 byte boundary. So each
- // plane of frames also start at 64 byte boundary.
- ASSERT_EQ(reinterpret_cast<off_t>(&test_stream->aligned_in_file_data[0]) & 63,
- 0)
- << "File should be mapped at a 64 byte boundary";
-#endif // defined(OS_POSIX)
-
LOG_ASSERT(test_stream->num_frames > 0UL);
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698