| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/webm/cluster_builder.h" | 5 #include "media/webm/cluster_builder.h" |
| 6 #include "media/webm/webm_constants.h" | 6 #include "media/webm/webm_constants.h" |
| 7 #include "media/webm/webm_parser.h" | 7 #include "media/webm/webm_parser.h" |
| 8 #include "testing/gmock/include/gmock/gmock.h" | 8 #include "testing/gmock/include/gmock/gmock.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 10 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 | 53 |
| 54 for (int i = 0; i < block_count; i++) | 54 for (int i = 0; i < block_count; i++) |
| 55 AddSimpleBlock(&cb, block_info[i].track_num, block_info[i].timestamp); | 55 AddSimpleBlock(&cb, block_info[i].track_num, block_info[i].timestamp); |
| 56 | 56 |
| 57 return cb.Finish(); | 57 return cb.Finish(); |
| 58 } | 58 } |
| 59 | 59 |
| 60 static void CreateClusterExpectations(int timecode, | 60 static void CreateClusterExpectations(int timecode, |
| 61 const SimpleBlockInfo* block_info, | 61 const SimpleBlockInfo* block_info, |
| 62 int block_count, | 62 int block_count, |
| 63 bool is_complete_cluster, | |
| 64 MockWebMParserClient* client) { | 63 MockWebMParserClient* client) { |
| 65 | 64 |
| 66 InSequence s; | 65 InSequence s; |
| 67 EXPECT_CALL(*client, OnListStart(kWebMIdCluster)).WillOnce(Return(true)); | 66 EXPECT_CALL(*client, OnListStart(kWebMIdCluster)).WillOnce(Return(true)); |
| 68 EXPECT_CALL(*client, OnUInt(kWebMIdTimecode, timecode)) | 67 EXPECT_CALL(*client, OnUInt(kWebMIdTimecode, 0)).WillOnce(Return(true)); |
| 69 .WillOnce(Return(true)); | |
| 70 | 68 |
| 71 for (int i = 0; i < block_count; i++) { | 69 for (int i = 0; i < block_count; i++) { |
| 72 EXPECT_CALL(*client, OnSimpleBlock(block_info[i].track_num, | 70 EXPECT_CALL(*client, OnSimpleBlock(block_info[i].track_num, |
| 73 block_info[i].timestamp, | 71 block_info[i].timestamp, |
| 74 _, _, _)) | 72 _, _, _)) |
| 75 .WillOnce(Return(true)); | 73 .WillOnce(Return(true)); |
| 76 } | 74 } |
| 77 | 75 |
| 78 if (is_complete_cluster) | 76 EXPECT_CALL(*client, OnListEnd(kWebMIdCluster)).WillOnce(Return(true)); |
| 79 EXPECT_CALL(*client, OnListEnd(kWebMIdCluster)).WillOnce(Return(true)); | |
| 80 } | 77 } |
| 81 | 78 |
| 82 TEST_F(WebMParserTest, EmptyCluster) { | 79 TEST_F(WebMParserTest, EmptyCluster) { |
| 83 const uint8 kEmptyCluster[] = { | 80 const uint8 kEmptyCluster[] = { |
| 84 0x1F, 0x43, 0xB6, 0x75, 0x80 // CLUSTER (size = 0) | 81 0x1F, 0x43, 0xB6, 0x75, 0x80 // CLUSTER (size = 0) |
| 85 }; | 82 }; |
| 86 int size = sizeof(kEmptyCluster); | 83 int size = sizeof(kEmptyCluster); |
| 87 | 84 |
| 88 InSequence s; | 85 InSequence s; |
| 89 EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(true)); | 86 EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(true)); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 const SimpleBlockInfo kBlockInfo[] = { | 204 const SimpleBlockInfo kBlockInfo[] = { |
| 208 { 0, 1 }, | 205 { 0, 1 }, |
| 209 { 1, 2 }, | 206 { 1, 2 }, |
| 210 { 0, 3 }, | 207 { 0, 3 }, |
| 211 { 0, 4 }, | 208 { 0, 4 }, |
| 212 { 1, 4 }, | 209 { 1, 4 }, |
| 213 }; | 210 }; |
| 214 int block_count = arraysize(kBlockInfo); | 211 int block_count = arraysize(kBlockInfo); |
| 215 | 212 |
| 216 scoped_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); | 213 scoped_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); |
| 217 CreateClusterExpectations(0, kBlockInfo, block_count, true, &client_); | 214 CreateClusterExpectations(0, kBlockInfo, block_count, &client_); |
| 218 | 215 |
| 219 WebMListParser parser(kWebMIdCluster); | 216 WebMListParser parser(kWebMIdCluster); |
| 220 int result = parser.Parse(cluster->data(), cluster->size(), &client_); | 217 int result = parser.Parse(cluster->data(), cluster->size(), &client_); |
| 221 EXPECT_EQ(cluster->size(), result); | 218 EXPECT_EQ(cluster->size(), result); |
| 222 EXPECT_TRUE(parser.IsParsingComplete()); | 219 EXPECT_TRUE(parser.IsParsingComplete()); |
| 223 } | 220 } |
| 224 | 221 |
| 225 TEST_F(WebMParserTest, ParseListElementWithMultipleCalls) { | 222 TEST_F(WebMParserTest, ParseListElementWithMultipleCalls) { |
| 226 const SimpleBlockInfo kBlockInfo[] = { | 223 const SimpleBlockInfo kBlockInfo[] = { |
| 227 { 0, 1 }, | 224 { 0, 1 }, |
| 228 { 1, 2 }, | 225 { 1, 2 }, |
| 229 { 0, 3 }, | 226 { 0, 3 }, |
| 230 { 0, 4 }, | 227 { 0, 4 }, |
| 231 { 1, 4 }, | 228 { 1, 4 }, |
| 232 }; | 229 }; |
| 233 int block_count = arraysize(kBlockInfo); | 230 int block_count = arraysize(kBlockInfo); |
| 234 | 231 |
| 235 scoped_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); | 232 scoped_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); |
| 236 CreateClusterExpectations(0, kBlockInfo, block_count, true, &client_); | 233 CreateClusterExpectations(0, kBlockInfo, block_count, &client_); |
| 237 | 234 |
| 238 const uint8* data = cluster->data(); | 235 const uint8* data = cluster->data(); |
| 239 int size = cluster->size(); | 236 int size = cluster->size(); |
| 240 int default_parse_size = 3; | 237 int default_parse_size = 3; |
| 241 WebMListParser parser(kWebMIdCluster); | 238 WebMListParser parser(kWebMIdCluster); |
| 242 int parse_size = std::min(default_parse_size, size); | 239 int parse_size = std::min(default_parse_size, size); |
| 243 | 240 |
| 244 while (size > 0) { | 241 while (size > 0) { |
| 245 int result = parser.Parse(data, parse_size, &client_); | 242 int result = parser.Parse(data, parse_size, &client_); |
| 246 EXPECT_GE(result, 0); | 243 EXPECT_GE(result, 0); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 257 parse_size = default_parse_size; | 254 parse_size = default_parse_size; |
| 258 | 255 |
| 259 data += result; | 256 data += result; |
| 260 size -= result; | 257 size -= result; |
| 261 | 258 |
| 262 EXPECT_EQ((size == 0), parser.IsParsingComplete()); | 259 EXPECT_EQ((size == 0), parser.IsParsingComplete()); |
| 263 } | 260 } |
| 264 EXPECT_TRUE(parser.IsParsingComplete()); | 261 EXPECT_TRUE(parser.IsParsingComplete()); |
| 265 } | 262 } |
| 266 | 263 |
| 267 TEST_F(WebMParserTest, TestReset) { | |
| 268 InSequence s; | |
| 269 | |
| 270 const SimpleBlockInfo kBlockInfo[] = { | |
| 271 { 0, 1 }, | |
| 272 { 1, 2 }, | |
| 273 { 0, 3 }, | |
| 274 { 0, 4 }, | |
| 275 { 1, 4 }, | |
| 276 }; | |
| 277 int block_count = arraysize(kBlockInfo); | |
| 278 | |
| 279 scoped_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); | |
| 280 | |
| 281 // First expect all but the last block. | |
| 282 CreateClusterExpectations(0, kBlockInfo, block_count - 1, false, &client_); | |
| 283 | |
| 284 // Now expect all blocks. | |
| 285 CreateClusterExpectations(0, kBlockInfo, block_count, true, &client_); | |
| 286 | |
| 287 WebMListParser parser(kWebMIdCluster); | |
| 288 | |
| 289 // Send slightly less than the full cluster so all but the last block is | |
| 290 // parsed. | |
| 291 int result = parser.Parse(cluster->data(), cluster->size() - 1, &client_); | |
| 292 EXPECT_GT(result, 0); | |
| 293 EXPECT_LT(result, cluster->size()); | |
| 294 EXPECT_FALSE(parser.IsParsingComplete()); | |
| 295 | |
| 296 parser.Reset(); | |
| 297 | |
| 298 // Now parse a whole cluster to verify that all the blocks will get parsed. | |
| 299 result = parser.Parse(cluster->data(), cluster->size(), &client_); | |
| 300 EXPECT_EQ(result, cluster->size()); | |
| 301 EXPECT_TRUE(parser.IsParsingComplete()); | |
| 302 } | |
| 303 | |
| 304 } // namespace media | 264 } // namespace media |
| OLD | NEW |