| 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/filters/source_buffer_stream.h" | 5 #include "media/filters/source_buffer_stream.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 using ::testing::HasSubstr; | 27 using ::testing::HasSubstr; |
| 28 using ::testing::InSequence; | 28 using ::testing::InSequence; |
| 29 using ::testing::StrictMock; | 29 using ::testing::StrictMock; |
| 30 | 30 |
| 31 namespace media { | 31 namespace media { |
| 32 | 32 |
| 33 typedef StreamParser::BufferQueue BufferQueue; | 33 typedef StreamParser::BufferQueue BufferQueue; |
| 34 | 34 |
| 35 static const int kDefaultFramesPerSecond = 30; | 35 static const int kDefaultFramesPerSecond = 30; |
| 36 static const int kDefaultKeyframesPerSecond = 6; | 36 static const int kDefaultKeyframesPerSecond = 6; |
| 37 static const uint8 kDataA = 0x11; | 37 static const uint8_t kDataA = 0x11; |
| 38 static const uint8 kDataB = 0x33; | 38 static const uint8_t kDataB = 0x33; |
| 39 static const int kDataSize = 1; | 39 static const int kDataSize = 1; |
| 40 | 40 |
| 41 // Matchers for verifying common media log entry strings. | 41 // Matchers for verifying common media log entry strings. |
| 42 MATCHER(ContainsMissingKeyframeLog, "") { | 42 MATCHER(ContainsMissingKeyframeLog, "") { |
| 43 return CONTAINS_STRING(arg, | 43 return CONTAINS_STRING(arg, |
| 44 "Media segment did not begin with key frame. Support " | 44 "Media segment did not begin with key frame. Support " |
| 45 "for such segments will be available in a future " | 45 "for such segments will be available in a future " |
| 46 "version. Please see https://crbug.com/229412."); | 46 "version. Please see https://crbug.com/229412."); |
| 47 } | 47 } |
| 48 | 48 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 | 111 |
| 112 // Equivalent to 2ms per frame. | 112 // Equivalent to 2ms per frame. |
| 113 SetStreamInfo(500, 500); | 113 SetStreamInfo(500, 500); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void NewSegmentAppend(int starting_position, int number_of_buffers) { | 116 void NewSegmentAppend(int starting_position, int number_of_buffers) { |
| 117 AppendBuffers(starting_position, number_of_buffers, true, | 117 AppendBuffers(starting_position, number_of_buffers, true, |
| 118 base::TimeDelta(), true, &kDataA, kDataSize); | 118 base::TimeDelta(), true, &kDataA, kDataSize); |
| 119 } | 119 } |
| 120 | 120 |
| 121 void NewSegmentAppend(int starting_position, int number_of_buffers, | 121 void NewSegmentAppend(int starting_position, |
| 122 const uint8* data) { | 122 int number_of_buffers, |
| 123 const uint8_t* data) { |
| 123 AppendBuffers(starting_position, number_of_buffers, true, | 124 AppendBuffers(starting_position, number_of_buffers, true, |
| 124 base::TimeDelta(), true, data, kDataSize); | 125 base::TimeDelta(), true, data, kDataSize); |
| 125 } | 126 } |
| 126 | 127 |
| 127 void NewSegmentAppend_OffsetFirstBuffer( | 128 void NewSegmentAppend_OffsetFirstBuffer( |
| 128 int starting_position, int number_of_buffers, | 129 int starting_position, int number_of_buffers, |
| 129 base::TimeDelta first_buffer_offset) { | 130 base::TimeDelta first_buffer_offset) { |
| 130 AppendBuffers(starting_position, number_of_buffers, true, | 131 AppendBuffers(starting_position, number_of_buffers, true, |
| 131 first_buffer_offset, true, &kDataA, kDataSize); | 132 first_buffer_offset, true, &kDataA, kDataSize); |
| 132 } | 133 } |
| 133 | 134 |
| 134 void NewSegmentAppend_ExpectFailure( | 135 void NewSegmentAppend_ExpectFailure( |
| 135 int starting_position, int number_of_buffers) { | 136 int starting_position, int number_of_buffers) { |
| 136 AppendBuffers(starting_position, number_of_buffers, true, | 137 AppendBuffers(starting_position, number_of_buffers, true, |
| 137 base::TimeDelta(), false, &kDataA, kDataSize); | 138 base::TimeDelta(), false, &kDataA, kDataSize); |
| 138 } | 139 } |
| 139 | 140 |
| 140 void AppendBuffers(int starting_position, int number_of_buffers) { | 141 void AppendBuffers(int starting_position, int number_of_buffers) { |
| 141 AppendBuffers(starting_position, number_of_buffers, false, | 142 AppendBuffers(starting_position, number_of_buffers, false, |
| 142 base::TimeDelta(), true, &kDataA, kDataSize); | 143 base::TimeDelta(), true, &kDataA, kDataSize); |
| 143 } | 144 } |
| 144 | 145 |
| 145 void AppendBuffers(int starting_position, int number_of_buffers, | 146 void AppendBuffers(int starting_position, |
| 146 const uint8* data) { | 147 int number_of_buffers, |
| 148 const uint8_t* data) { |
| 147 AppendBuffers(starting_position, number_of_buffers, false, | 149 AppendBuffers(starting_position, number_of_buffers, false, |
| 148 base::TimeDelta(), true, data, kDataSize); | 150 base::TimeDelta(), true, data, kDataSize); |
| 149 } | 151 } |
| 150 | 152 |
| 151 void NewSegmentAppend(const std::string& buffers_to_append) { | 153 void NewSegmentAppend(const std::string& buffers_to_append) { |
| 152 AppendBuffers(buffers_to_append, true, kNoTimestamp(), false, true); | 154 AppendBuffers(buffers_to_append, true, kNoTimestamp(), false, true); |
| 153 } | 155 } |
| 154 | 156 |
| 155 void NewSegmentAppend(base::TimeDelta start_timestamp, | 157 void NewSegmentAppend(base::TimeDelta start_timestamp, |
| 156 const std::string& buffers_to_append) { | 158 const std::string& buffers_to_append) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 *removal_end = removal_end_timestamp.InMilliseconds(); | 215 *removal_end = removal_end_timestamp.InMilliseconds(); |
| 214 return bytes_removed; | 216 return bytes_removed; |
| 215 } | 217 } |
| 216 | 218 |
| 217 void CheckExpectedRanges(const std::string& expected) { | 219 void CheckExpectedRanges(const std::string& expected) { |
| 218 Ranges<base::TimeDelta> r = stream_->GetBufferedTime(); | 220 Ranges<base::TimeDelta> r = stream_->GetBufferedTime(); |
| 219 | 221 |
| 220 std::stringstream ss; | 222 std::stringstream ss; |
| 221 ss << "{ "; | 223 ss << "{ "; |
| 222 for (size_t i = 0; i < r.size(); ++i) { | 224 for (size_t i = 0; i < r.size(); ++i) { |
| 223 int64 start = (r.start(i) / frame_duration_); | 225 int64_t start = (r.start(i) / frame_duration_); |
| 224 int64 end = (r.end(i) / frame_duration_) - 1; | 226 int64_t end = (r.end(i) / frame_duration_) - 1; |
| 225 ss << "[" << start << "," << end << ") "; | 227 ss << "[" << start << "," << end << ") "; |
| 226 } | 228 } |
| 227 ss << "}"; | 229 ss << "}"; |
| 228 EXPECT_EQ(expected, ss.str()); | 230 EXPECT_EQ(expected, ss.str()); |
| 229 } | 231 } |
| 230 | 232 |
| 231 void CheckExpectedRangesByTimestamp(const std::string& expected) { | 233 void CheckExpectedRangesByTimestamp(const std::string& expected) { |
| 232 Ranges<base::TimeDelta> r = stream_->GetBufferedTime(); | 234 Ranges<base::TimeDelta> r = stream_->GetBufferedTime(); |
| 233 | 235 |
| 234 std::stringstream ss; | 236 std::stringstream ss; |
| 235 ss << "{ "; | 237 ss << "{ "; |
| 236 for (size_t i = 0; i < r.size(); ++i) { | 238 for (size_t i = 0; i < r.size(); ++i) { |
| 237 int64 start = r.start(i).InMilliseconds(); | 239 int64_t start = r.start(i).InMilliseconds(); |
| 238 int64 end = r.end(i).InMilliseconds(); | 240 int64_t end = r.end(i).InMilliseconds(); |
| 239 ss << "[" << start << "," << end << ") "; | 241 ss << "[" << start << "," << end << ") "; |
| 240 } | 242 } |
| 241 ss << "}"; | 243 ss << "}"; |
| 242 EXPECT_EQ(expected, ss.str()); | 244 EXPECT_EQ(expected, ss.str()); |
| 243 } | 245 } |
| 244 | 246 |
| 245 void CheckExpectedBuffers( | 247 void CheckExpectedBuffers( |
| 246 int starting_position, int ending_position) { | 248 int starting_position, int ending_position) { |
| 247 CheckExpectedBuffers(starting_position, ending_position, false, NULL, 0); | 249 CheckExpectedBuffers(starting_position, ending_position, false, NULL, 0); |
| 248 } | 250 } |
| 249 | 251 |
| 250 void CheckExpectedBuffers( | 252 void CheckExpectedBuffers( |
| 251 int starting_position, int ending_position, bool expect_keyframe) { | 253 int starting_position, int ending_position, bool expect_keyframe) { |
| 252 CheckExpectedBuffers(starting_position, ending_position, expect_keyframe, | 254 CheckExpectedBuffers(starting_position, ending_position, expect_keyframe, |
| 253 NULL, 0); | 255 NULL, 0); |
| 254 } | 256 } |
| 255 | 257 |
| 256 void CheckExpectedBuffers( | 258 void CheckExpectedBuffers(int starting_position, |
| 257 int starting_position, int ending_position, const uint8* data) { | 259 int ending_position, |
| 260 const uint8_t* data) { |
| 258 CheckExpectedBuffers(starting_position, ending_position, false, data, | 261 CheckExpectedBuffers(starting_position, ending_position, false, data, |
| 259 kDataSize); | 262 kDataSize); |
| 260 } | 263 } |
| 261 | 264 |
| 262 void CheckExpectedBuffers( | 265 void CheckExpectedBuffers(int starting_position, |
| 263 int starting_position, int ending_position, const uint8* data, | 266 int ending_position, |
| 264 bool expect_keyframe) { | 267 const uint8_t* data, |
| 268 bool expect_keyframe) { |
| 265 CheckExpectedBuffers(starting_position, ending_position, expect_keyframe, | 269 CheckExpectedBuffers(starting_position, ending_position, expect_keyframe, |
| 266 data, kDataSize); | 270 data, kDataSize); |
| 267 } | 271 } |
| 268 | 272 |
| 269 void CheckExpectedBuffers( | 273 void CheckExpectedBuffers(int starting_position, |
| 270 int starting_position, int ending_position, bool expect_keyframe, | 274 int ending_position, |
| 271 const uint8* expected_data, int expected_size) { | 275 bool expect_keyframe, |
| 276 const uint8_t* expected_data, |
| 277 int expected_size) { |
| 272 int current_position = starting_position; | 278 int current_position = starting_position; |
| 273 for (; current_position <= ending_position; current_position++) { | 279 for (; current_position <= ending_position; current_position++) { |
| 274 scoped_refptr<StreamParserBuffer> buffer; | 280 scoped_refptr<StreamParserBuffer> buffer; |
| 275 SourceBufferStream::Status status = stream_->GetNextBuffer(&buffer); | 281 SourceBufferStream::Status status = stream_->GetNextBuffer(&buffer); |
| 276 | 282 |
| 277 EXPECT_NE(status, SourceBufferStream::kConfigChange); | 283 EXPECT_NE(status, SourceBufferStream::kConfigChange); |
| 278 if (status != SourceBufferStream::kSuccess) | 284 if (status != SourceBufferStream::kSuccess) |
| 279 break; | 285 break; |
| 280 | 286 |
| 281 if (expect_keyframe && current_position == starting_position) | 287 if (expect_keyframe && current_position == starting_position) |
| 282 EXPECT_TRUE(buffer->is_key_frame()); | 288 EXPECT_TRUE(buffer->is_key_frame()); |
| 283 | 289 |
| 284 if (expected_data) { | 290 if (expected_data) { |
| 285 const uint8* actual_data = buffer->data(); | 291 const uint8_t* actual_data = buffer->data(); |
| 286 const int actual_size = buffer->data_size(); | 292 const int actual_size = buffer->data_size(); |
| 287 EXPECT_EQ(expected_size, actual_size); | 293 EXPECT_EQ(expected_size, actual_size); |
| 288 for (int i = 0; i < std::min(actual_size, expected_size); i++) { | 294 for (int i = 0; i < std::min(actual_size, expected_size); i++) { |
| 289 EXPECT_EQ(expected_data[i], actual_data[i]); | 295 EXPECT_EQ(expected_data[i], actual_data[i]); |
| 290 } | 296 } |
| 291 } | 297 } |
| 292 | 298 |
| 293 EXPECT_EQ(buffer->GetDecodeTimestamp() / frame_duration_, | 299 EXPECT_EQ(buffer->GetDecodeTimestamp() / frame_duration_, |
| 294 current_position); | 300 current_position); |
| 295 } | 301 } |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 base::TimeDelta ConvertToFrameDuration(int frames_per_second) { | 433 base::TimeDelta ConvertToFrameDuration(int frames_per_second) { |
| 428 return base::TimeDelta::FromMicroseconds( | 434 return base::TimeDelta::FromMicroseconds( |
| 429 base::Time::kMicrosecondsPerSecond / frames_per_second); | 435 base::Time::kMicrosecondsPerSecond / frames_per_second); |
| 430 } | 436 } |
| 431 | 437 |
| 432 void AppendBuffers(int starting_position, | 438 void AppendBuffers(int starting_position, |
| 433 int number_of_buffers, | 439 int number_of_buffers, |
| 434 bool begin_media_segment, | 440 bool begin_media_segment, |
| 435 base::TimeDelta first_buffer_offset, | 441 base::TimeDelta first_buffer_offset, |
| 436 bool expect_success, | 442 bool expect_success, |
| 437 const uint8* data, | 443 const uint8_t* data, |
| 438 int size) { | 444 int size) { |
| 439 if (begin_media_segment) | 445 if (begin_media_segment) |
| 440 stream_->OnNewMediaSegment(DecodeTimestamp::FromPresentationTime( | 446 stream_->OnNewMediaSegment(DecodeTimestamp::FromPresentationTime( |
| 441 starting_position * frame_duration_)); | 447 starting_position * frame_duration_)); |
| 442 | 448 |
| 443 int keyframe_interval = frames_per_second_ / keyframes_per_second_; | 449 int keyframe_interval = frames_per_second_ / keyframes_per_second_; |
| 444 | 450 |
| 445 BufferQueue queue; | 451 BufferQueue queue; |
| 446 for (int i = 0; i < number_of_buffers; i++) { | 452 for (int i = 0; i < number_of_buffers; i++) { |
| 447 int position = starting_position + i; | 453 int position = starting_position + i; |
| (...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1052 | 1058 |
| 1053 // Seek back to beginning; all data should be new. | 1059 // Seek back to beginning; all data should be new. |
| 1054 Seek(5); | 1060 Seek(5); |
| 1055 CheckExpectedBuffers(5, 14, &kDataB); | 1061 CheckExpectedBuffers(5, 14, &kDataB); |
| 1056 | 1062 |
| 1057 // Check range continues to be correct. | 1063 // Check range continues to be correct. |
| 1058 CheckExpectedRanges("{ [5,14) }"); | 1064 CheckExpectedRanges("{ [5,14) }"); |
| 1059 } | 1065 } |
| 1060 | 1066 |
| 1061 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_Multiple) { | 1067 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_Multiple) { |
| 1062 static const uint8 kDataC = 0x55; | 1068 static const uint8_t kDataC = 0x55; |
| 1063 static const uint8 kDataD = 0x77; | 1069 static const uint8_t kDataD = 0x77; |
| 1064 | 1070 |
| 1065 // Append 5 buffers at positions 5 through 9. | 1071 // Append 5 buffers at positions 5 through 9. |
| 1066 NewSegmentAppend(5, 5, &kDataA); | 1072 NewSegmentAppend(5, 5, &kDataA); |
| 1067 | 1073 |
| 1068 // Seek to buffer at position 5 and get next buffer. | 1074 // Seek to buffer at position 5 and get next buffer. |
| 1069 Seek(5); | 1075 Seek(5); |
| 1070 CheckExpectedBuffers(5, 5, &kDataA); | 1076 CheckExpectedBuffers(5, 5, &kDataA); |
| 1071 | 1077 |
| 1072 // Replace existing data with new data. | 1078 // Replace existing data with new data. |
| 1073 NewSegmentAppend(5, 5, &kDataB); | 1079 NewSegmentAppend(5, 5, &kDataB); |
| (...skipping 3538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4612 CheckNoNextBuffer(); | 4618 CheckNoNextBuffer(); |
| 4613 } | 4619 } |
| 4614 | 4620 |
| 4615 // TODO(vrk): Add unit tests where keyframes are unaligned between streams. | 4621 // TODO(vrk): Add unit tests where keyframes are unaligned between streams. |
| 4616 // (crbug.com/133557) | 4622 // (crbug.com/133557) |
| 4617 | 4623 |
| 4618 // TODO(vrk): Add unit tests with end of stream being called at interesting | 4624 // TODO(vrk): Add unit tests with end of stream being called at interesting |
| 4619 // times. | 4625 // times. |
| 4620 | 4626 |
| 4621 } // namespace media | 4627 } // namespace media |
| OLD | NEW |