| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/memory/aligned_memory.h" | 10 #include "base/memory/aligned_memory.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 EXPECT_EQ(expect_rgb_color, rgb_row_data[col]); | 81 EXPECT_EQ(expect_rgb_color, rgb_row_data[col]); |
| 82 } | 82 } |
| 83 } | 83 } |
| 84 | 84 |
| 85 base::AlignedFree(rgb_data); | 85 base::AlignedFree(rgb_data); |
| 86 } | 86 } |
| 87 | 87 |
| 88 // Fill each plane to its reported extents and verify accessors report non | 88 // Fill each plane to its reported extents and verify accessors report non |
| 89 // zero values. Additionally, for the first plane verify the rows and | 89 // zero values. Additionally, for the first plane verify the rows and |
| 90 // row_bytes values are correct. | 90 // row_bytes values are correct. |
| 91 void ExpectFrameExtents(VideoFrame::Format format, int planes, | 91 void ExpectFrameExtents(VideoFrame::Format format, const char* expected_hash) { |
| 92 int bytes_per_pixel, const char* expected_hash) { | |
| 93 const unsigned char kFillByte = 0x80; | 92 const unsigned char kFillByte = 0x80; |
| 94 const int kWidth = 61; | 93 const int kWidth = 61; |
| 95 const int kHeight = 31; | 94 const int kHeight = 31; |
| 96 const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337); | 95 const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337); |
| 97 | 96 |
| 98 gfx::Size size(kWidth, kHeight); | 97 gfx::Size size(kWidth, kHeight); |
| 99 scoped_refptr<VideoFrame> frame = VideoFrame::CreateFrame( | 98 scoped_refptr<VideoFrame> frame = VideoFrame::CreateFrame( |
| 100 format, size, gfx::Rect(size), size, kTimestamp); | 99 format, size, gfx::Rect(size), size, kTimestamp); |
| 101 ASSERT_TRUE(frame.get()); | 100 ASSERT_TRUE(frame.get()); |
| 102 | 101 |
| 103 for(int plane = 0; plane < planes; plane++) { | 102 int planes = VideoFrame::NumPlanes(format); |
| 103 for (int plane = 0; plane < planes; plane++) { |
| 104 SCOPED_TRACE(base::StringPrintf("Checking plane %d", plane)); | 104 SCOPED_TRACE(base::StringPrintf("Checking plane %d", plane)); |
| 105 EXPECT_TRUE(frame->data(plane)); | 105 EXPECT_TRUE(frame->data(plane)); |
| 106 EXPECT_TRUE(frame->stride(plane)); | 106 EXPECT_TRUE(frame->stride(plane)); |
| 107 EXPECT_TRUE(frame->rows(plane)); | 107 EXPECT_TRUE(frame->rows(plane)); |
| 108 EXPECT_TRUE(frame->row_bytes(plane)); | 108 EXPECT_TRUE(frame->row_bytes(plane)); |
| 109 | 109 |
| 110 if (plane == 0) { | |
| 111 EXPECT_EQ(frame->rows(plane), kHeight); | |
| 112 EXPECT_EQ(frame->row_bytes(plane), kWidth * bytes_per_pixel); | |
| 113 } | |
| 114 | |
| 115 memset(frame->data(plane), kFillByte, | 110 memset(frame->data(plane), kFillByte, |
| 116 frame->stride(plane) * frame->rows(plane)); | 111 frame->stride(plane) * frame->rows(plane)); |
| 117 } | 112 } |
| 118 | 113 |
| 119 base::MD5Context context; | 114 base::MD5Context context; |
| 120 base::MD5Init(&context); | 115 base::MD5Init(&context); |
| 121 frame->HashFrameForTesting(&context); | 116 frame->HashFrameForTesting(&context); |
| 122 base::MD5Digest digest; | 117 base::MD5Digest digest; |
| 123 base::MD5Final(&digest, &context); | 118 base::MD5Final(&digest, &context); |
| 124 EXPECT_EQ(MD5DigestToBase16(digest), expected_hash); | 119 EXPECT_EQ(MD5DigestToBase16(digest), expected_hash); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 } | 227 } |
| 233 | 228 |
| 234 EXPECT_FALSE(no_longer_needed_triggered); | 229 EXPECT_FALSE(no_longer_needed_triggered); |
| 235 frame = NULL; | 230 frame = NULL; |
| 236 EXPECT_TRUE(no_longer_needed_triggered); | 231 EXPECT_TRUE(no_longer_needed_triggered); |
| 237 } | 232 } |
| 238 | 233 |
| 239 // Ensure each frame is properly sized and allocated. Will trigger OOB reads | 234 // Ensure each frame is properly sized and allocated. Will trigger OOB reads |
| 240 // and writes as well as incorrect frame hashes otherwise. | 235 // and writes as well as incorrect frame hashes otherwise. |
| 241 TEST(VideoFrame, CheckFrameExtents) { | 236 TEST(VideoFrame, CheckFrameExtents) { |
| 242 // Each call consists of a VideoFrame::Format, # of planes, bytes per pixel, | 237 // Each call consists of a VideoFrame::Format and the expected hash of all |
| 243 // and the expected hash of all planes if filled with kFillByte (defined in | 238 // planes if filled with kFillByte (defined in ExpectFrameExtents). |
| 244 // ExpectFrameExtents). | 239 ExpectFrameExtents(VideoFrame::YV12, "8e5d54cb23cd0edca111dd35ffb6ff05"); |
| 245 ExpectFrameExtents( | 240 ExpectFrameExtents(VideoFrame::YV16, "cce408a044b212db42a10dfec304b3ef"); |
| 246 VideoFrame::YV12, 3, 1, "71113bdfd4c0de6cf62f48fb74f7a0b1"); | |
| 247 ExpectFrameExtents( | |
| 248 VideoFrame::YV16, 3, 1, "9bb99ac3ff350644ebff4d28dc01b461"); | |
| 249 } | 241 } |
| 250 | 242 |
| 251 static void TextureCallback(uint32* called_sync_point, | 243 static void TextureCallback(uint32* called_sync_point, |
| 252 scoped_ptr<gpu::MailboxHolder> mailbox_holder) { | 244 scoped_ptr<gpu::MailboxHolder> mailbox_holder) { |
| 253 *called_sync_point = mailbox_holder->sync_point; | 245 *called_sync_point = mailbox_holder->sync_point; |
| 254 } | 246 } |
| 255 | 247 |
| 256 // Verify the gpu::MailboxHolder::ReleaseCallback is called when VideoFrame is | 248 // Verify the gpu::MailboxHolder::ReleaseCallback is called when VideoFrame is |
| 257 // destroyed with the original sync point. | 249 // destroyed with the original sync point. |
| 258 TEST(VideoFrame, TextureNoLongerNeededCallbackIsCalled) { | 250 TEST(VideoFrame, TextureNoLongerNeededCallbackIsCalled) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 EXPECT_EQ(sync_point, mailbox_holder->sync_point); | 293 EXPECT_EQ(sync_point, mailbox_holder->sync_point); |
| 302 | 294 |
| 303 // Finish using the mailbox_holder and drop our reference. | 295 // Finish using the mailbox_holder and drop our reference. |
| 304 sync_point = 10; | 296 sync_point = 10; |
| 305 mailbox_holder->sync_point = sync_point; | 297 mailbox_holder->sync_point = sync_point; |
| 306 } | 298 } |
| 307 EXPECT_EQ(sync_point, called_sync_point); | 299 EXPECT_EQ(sync_point, called_sync_point); |
| 308 } | 300 } |
| 309 | 301 |
| 310 } // namespace media | 302 } // namespace media |
| OLD | NEW |