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

Side by Side Diff: media/filters/chunk_demuxer_unittest.cc

Issue 21536004: Drop redundant "TEST" prefix from test names in media code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/ffmpeg/ffmpeg_common_unittest.cc ('k') | media/mp4/aac_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <algorithm> 5 #include <algorithm>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_split.h" 10 #include "base/strings/string_split.h"
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 879
880 base::MessageLoop message_loop_; 880 base::MessageLoop message_loop_;
881 MockDemuxerHost host_; 881 MockDemuxerHost host_;
882 882
883 scoped_ptr<ChunkDemuxer> demuxer_; 883 scoped_ptr<ChunkDemuxer> demuxer_;
884 884
885 private: 885 private:
886 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); 886 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
887 }; 887 };
888 888
889 TEST_F(ChunkDemuxerTest, TestInit) { 889 TEST_F(ChunkDemuxerTest, Init) {
890 // Test no streams, audio-only, video-only, and audio & video scenarios. 890 // Test no streams, audio-only, video-only, and audio & video scenarios.
891 // Audio and video streams can be encrypted or not encrypted. 891 // Audio and video streams can be encrypted or not encrypted.
892 for (int i = 0; i < 16; i++) { 892 for (int i = 0; i < 16; i++) {
893 bool has_audio = (i & 0x1) != 0; 893 bool has_audio = (i & 0x1) != 0;
894 bool has_video = (i & 0x2) != 0; 894 bool has_video = (i & 0x2) != 0;
895 bool is_audio_encrypted = (i & 0x4) != 0; 895 bool is_audio_encrypted = (i & 0x4) != 0;
896 bool is_video_encrypted = (i & 0x8) != 0; 896 bool is_video_encrypted = (i & 0x8) != 0;
897 897
898 // No test on invalid combination. 898 // No test on invalid combination.
899 if ((!has_audio && is_audio_encrypted) || 899 if ((!has_audio && is_audio_encrypted) ||
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 EXPECT_FALSE(video_stream); 941 EXPECT_FALSE(video_stream);
942 } 942 }
943 943
944 ShutdownDemuxer(); 944 ShutdownDemuxer();
945 demuxer_.reset(); 945 demuxer_.reset();
946 } 946 }
947 } 947 }
948 948
949 // Make sure that the demuxer reports an error if Shutdown() 949 // Make sure that the demuxer reports an error if Shutdown()
950 // is called before all the initialization segments are appended. 950 // is called before all the initialization segments are appended.
951 TEST_F(ChunkDemuxerTest, TestShutdownBeforeAllInitSegmentsAppended) { 951 TEST_F(ChunkDemuxerTest, ShutdownBeforeAllInitSegmentsAppended) {
952 EXPECT_CALL(*this, DemuxerOpened()); 952 EXPECT_CALL(*this, DemuxerOpened());
953 demuxer_->Initialize( 953 demuxer_->Initialize(
954 &host_, CreateInitDoneCB( 954 &host_, CreateInitDoneCB(
955 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN)); 955 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN));
956 956
957 EXPECT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk); 957 EXPECT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk);
958 EXPECT_EQ(AddId("video", false, true), ChunkDemuxer::kOk); 958 EXPECT_EQ(AddId("video", false, true), ChunkDemuxer::kOk);
959 959
960 AppendInitSegmentWithSourceId("audio", true, false); 960 AppendInitSegmentWithSourceId("audio", true, false);
961 } 961 }
962 962
963 // Test that Seek() completes successfully when the first cluster 963 // Test that Seek() completes successfully when the first cluster
964 // arrives. 964 // arrives.
965 TEST_F(ChunkDemuxerTest, TestAppendDataAfterSeek) { 965 TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) {
966 ASSERT_TRUE(InitDemuxer(true, true)); 966 ASSERT_TRUE(InitDemuxer(true, true));
967 AppendCluster(kDefaultFirstCluster()); 967 AppendCluster(kDefaultFirstCluster());
968 968
969 InSequence s; 969 InSequence s;
970 970
971 EXPECT_CALL(*this, Checkpoint(1)); 971 EXPECT_CALL(*this, Checkpoint(1));
972 972
973 Seek(base::TimeDelta::FromMilliseconds(46)); 973 Seek(base::TimeDelta::FromMilliseconds(46));
974 974
975 EXPECT_CALL(*this, Checkpoint(2)); 975 EXPECT_CALL(*this, Checkpoint(2));
976 976
977 Checkpoint(1); 977 Checkpoint(1);
978 978
979 AppendCluster(kDefaultSecondCluster()); 979 AppendCluster(kDefaultSecondCluster());
980 980
981 message_loop_.RunUntilIdle(); 981 message_loop_.RunUntilIdle();
982 982
983 Checkpoint(2); 983 Checkpoint(2);
984 } 984 }
985 985
986 // Test that parsing errors are handled for clusters appended after init. 986 // Test that parsing errors are handled for clusters appended after init.
987 TEST_F(ChunkDemuxerTest, TestErrorWhileParsingClusterAfterInit) { 987 TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) {
988 ASSERT_TRUE(InitDemuxer(true, true)); 988 ASSERT_TRUE(InitDemuxer(true, true));
989 AppendCluster(kDefaultFirstCluster()); 989 AppendCluster(kDefaultFirstCluster());
990 990
991 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 991 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
992 AppendGarbage(); 992 AppendGarbage();
993 } 993 }
994 994
995 // Test the case where a Seek() is requested while the parser 995 // Test the case where a Seek() is requested while the parser
996 // is in the middle of cluster. This is to verify that the parser 996 // is in the middle of cluster. This is to verify that the parser
997 // does not reset itself on a seek. 997 // does not reset itself on a seek.
998 TEST_F(ChunkDemuxerTest, TestSeekWhileParsingCluster) { 998 TEST_F(ChunkDemuxerTest, SeekWhileParsingCluster) {
999 ASSERT_TRUE(InitDemuxer(true, true)); 999 ASSERT_TRUE(InitDemuxer(true, true));
1000 1000
1001 InSequence s; 1001 InSequence s;
1002 1002
1003 scoped_ptr<Cluster> cluster_a(GenerateCluster(0, 6)); 1003 scoped_ptr<Cluster> cluster_a(GenerateCluster(0, 6));
1004 1004
1005 // Split the cluster into two appends at an arbitrary point near the end. 1005 // Split the cluster into two appends at an arbitrary point near the end.
1006 int first_append_size = cluster_a->size() - 11; 1006 int first_append_size = cluster_a->size() - 11;
1007 int second_append_size = cluster_a->size() - first_append_size; 1007 int second_append_size = cluster_a->size() - first_append_size;
1008 1008
(...skipping 13 matching lines...) Expand all
1022 // Append the rest of the cluster. 1022 // Append the rest of the cluster.
1023 AppendData(cluster_a->data() + first_append_size, second_append_size); 1023 AppendData(cluster_a->data() + first_append_size, second_append_size);
1024 1024
1025 // Append the new cluster and verify that only the blocks 1025 // Append the new cluster and verify that only the blocks
1026 // in the new cluster are returned. 1026 // in the new cluster are returned.
1027 AppendCluster(GenerateCluster(5000, 6)); 1027 AppendCluster(GenerateCluster(5000, 6));
1028 GenerateExpectedReads(5000, 6); 1028 GenerateExpectedReads(5000, 6);
1029 } 1029 }
1030 1030
1031 // Test the case where AppendData() is called before Init(). 1031 // Test the case where AppendData() is called before Init().
1032 TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) { 1032 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) {
1033 scoped_ptr<uint8[]> info_tracks; 1033 scoped_ptr<uint8[]> info_tracks;
1034 int info_tracks_size = 0; 1034 int info_tracks_size = 0;
1035 CreateInitSegment(true, true, false, false, &info_tracks, &info_tracks_size); 1035 CreateInitSegment(true, true, false, false, &info_tracks, &info_tracks_size);
1036 1036
1037 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size); 1037 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size);
1038 } 1038 }
1039 1039
1040 // Make sure Read() callbacks are dispatched with the proper data. 1040 // Make sure Read() callbacks are dispatched with the proper data.
1041 TEST_F(ChunkDemuxerTest, TestRead) { 1041 TEST_F(ChunkDemuxerTest, Read) {
1042 ASSERT_TRUE(InitDemuxer(true, true)); 1042 ASSERT_TRUE(InitDemuxer(true, true));
1043 1043
1044 AppendCluster(kDefaultFirstCluster()); 1044 AppendCluster(kDefaultFirstCluster());
1045 1045
1046 bool audio_read_done = false; 1046 bool audio_read_done = false;
1047 bool video_read_done = false; 1047 bool video_read_done = false;
1048 ReadAudio(base::Bind(&OnReadDone, 1048 ReadAudio(base::Bind(&OnReadDone,
1049 base::TimeDelta::FromMilliseconds(0), 1049 base::TimeDelta::FromMilliseconds(0),
1050 &audio_read_done)); 1050 &audio_read_done));
1051 ReadVideo(base::Bind(&OnReadDone, 1051 ReadVideo(base::Bind(&OnReadDone,
1052 base::TimeDelta::FromMilliseconds(0), 1052 base::TimeDelta::FromMilliseconds(0),
1053 &video_read_done)); 1053 &video_read_done));
1054 1054
1055 EXPECT_TRUE(audio_read_done); 1055 EXPECT_TRUE(audio_read_done);
1056 EXPECT_TRUE(video_read_done); 1056 EXPECT_TRUE(video_read_done);
1057 } 1057 }
1058 1058
1059 TEST_F(ChunkDemuxerTest, TestOutOfOrderClusters) { 1059 TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
1060 ASSERT_TRUE(InitDemuxer(true, true)); 1060 ASSERT_TRUE(InitDemuxer(true, true));
1061 AppendCluster(kDefaultFirstCluster()); 1061 AppendCluster(kDefaultFirstCluster());
1062 AppendCluster(GenerateCluster(10, 4)); 1062 AppendCluster(GenerateCluster(10, 4));
1063 1063
1064 // Make sure that AppendCluster() does not fail with a cluster that has 1064 // Make sure that AppendCluster() does not fail with a cluster that has
1065 // overlaps with the previously appended cluster. 1065 // overlaps with the previously appended cluster.
1066 AppendCluster(GenerateCluster(5, 4)); 1066 AppendCluster(GenerateCluster(5, 4));
1067 1067
1068 // Verify that AppendData() can still accept more data. 1068 // Verify that AppendData() can still accept more data.
1069 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2)); 1069 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2));
1070 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size()); 1070 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size());
1071 } 1071 }
1072 1072
1073 TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) { 1073 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
1074 ASSERT_TRUE(InitDemuxer(true, true)); 1074 ASSERT_TRUE(InitDemuxer(true, true));
1075 AppendCluster(kDefaultFirstCluster()); 1075 AppendCluster(kDefaultFirstCluster());
1076 1076
1077 ClusterBuilder cb; 1077 ClusterBuilder cb;
1078 1078
1079 // Test the case where block timecodes are not monotonically 1079 // Test the case where block timecodes are not monotonically
1080 // increasing but stay above the cluster timecode. 1080 // increasing but stay above the cluster timecode.
1081 cb.SetClusterTimecode(5); 1081 cb.SetClusterTimecode(5);
1082 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1082 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1083 AddSimpleBlock(&cb, kVideoTrackNum, 10); 1083 AddSimpleBlock(&cb, kVideoTrackNum, 10);
1084 AddSimpleBlock(&cb, kAudioTrackNum, 7); 1084 AddSimpleBlock(&cb, kAudioTrackNum, 7);
1085 AddSimpleBlock(&cb, kVideoTrackNum, 15); 1085 AddSimpleBlock(&cb, kVideoTrackNum, 15);
1086 1086
1087 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1087 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1088 AppendCluster(cb.Finish()); 1088 AppendCluster(cb.Finish());
1089 1089
1090 // Verify that AppendData() ignores data after the error. 1090 // Verify that AppendData() ignores data after the error.
1091 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2)); 1091 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2));
1092 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size()); 1092 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size());
1093 } 1093 }
1094 1094
1095 TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) { 1095 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
1096 ASSERT_TRUE(InitDemuxer(true, true)); 1096 ASSERT_TRUE(InitDemuxer(true, true));
1097 AppendCluster(kDefaultFirstCluster()); 1097 AppendCluster(kDefaultFirstCluster());
1098 1098
1099 ClusterBuilder cb; 1099 ClusterBuilder cb;
1100 1100
1101 // Test timecodes going backwards and including values less than the cluster 1101 // Test timecodes going backwards and including values less than the cluster
1102 // timecode. 1102 // timecode.
1103 cb.SetClusterTimecode(5); 1103 cb.SetClusterTimecode(5);
1104 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1104 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1105 AddSimpleBlock(&cb, kVideoTrackNum, 5); 1105 AddSimpleBlock(&cb, kVideoTrackNum, 5);
1106 AddSimpleBlock(&cb, kAudioTrackNum, 3); 1106 AddSimpleBlock(&cb, kAudioTrackNum, 3);
1107 AddSimpleBlock(&cb, kVideoTrackNum, 3); 1107 AddSimpleBlock(&cb, kVideoTrackNum, 3);
1108 1108
1109 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1109 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1110 AppendCluster(cb.Finish()); 1110 AppendCluster(cb.Finish());
1111 1111
1112 // Verify that AppendData() ignores data after the error. 1112 // Verify that AppendData() ignores data after the error.
1113 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2)); 1113 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2));
1114 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size()); 1114 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size());
1115 } 1115 }
1116 1116
1117 1117
1118 TEST_F(ChunkDemuxerTest, TestPerStreamMonotonicallyIncreasingTimestamps) { 1118 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) {
1119 ASSERT_TRUE(InitDemuxer(true, true)); 1119 ASSERT_TRUE(InitDemuxer(true, true));
1120 AppendCluster(kDefaultFirstCluster()); 1120 AppendCluster(kDefaultFirstCluster());
1121 1121
1122 ClusterBuilder cb; 1122 ClusterBuilder cb;
1123 1123
1124 // Test monotonic increasing timestamps on a per stream 1124 // Test monotonic increasing timestamps on a per stream
1125 // basis. 1125 // basis.
1126 cb.SetClusterTimecode(5); 1126 cb.SetClusterTimecode(5);
1127 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1127 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1128 AddSimpleBlock(&cb, kVideoTrackNum, 5); 1128 AddSimpleBlock(&cb, kVideoTrackNum, 5);
1129 AddSimpleBlock(&cb, kAudioTrackNum, 4); 1129 AddSimpleBlock(&cb, kAudioTrackNum, 4);
1130 AddSimpleBlock(&cb, kVideoTrackNum, 7); 1130 AddSimpleBlock(&cb, kVideoTrackNum, 7);
1131 1131
1132 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1132 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1133 AppendCluster(cb.Finish()); 1133 AppendCluster(cb.Finish());
1134 } 1134 }
1135 1135
1136 // Test the case where a cluster is passed to AppendCluster() before 1136 // Test the case where a cluster is passed to AppendCluster() before
1137 // INFO & TRACKS data. 1137 // INFO & TRACKS data.
1138 TEST_F(ChunkDemuxerTest, TestClusterBeforeInitSegment) { 1138 TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) {
1139 EXPECT_CALL(*this, DemuxerOpened()); 1139 EXPECT_CALL(*this, DemuxerOpened());
1140 demuxer_->Initialize( 1140 demuxer_->Initialize(
1141 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 1141 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
1142 1142
1143 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1143 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1144 1144
1145 AppendCluster(GenerateCluster(0, 1)); 1145 AppendCluster(GenerateCluster(0, 1));
1146 } 1146 }
1147 1147
1148 // Test cases where we get an MarkEndOfStream() call during initialization. 1148 // Test cases where we get an MarkEndOfStream() call during initialization.
1149 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) { 1149 TEST_F(ChunkDemuxerTest, EOSDuringInit) {
1150 EXPECT_CALL(*this, DemuxerOpened()); 1150 EXPECT_CALL(*this, DemuxerOpened());
1151 demuxer_->Initialize( 1151 demuxer_->Initialize(
1152 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 1152 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
1153 MarkEndOfStream(PIPELINE_OK); 1153 MarkEndOfStream(PIPELINE_OK);
1154 } 1154 }
1155 1155
1156 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoAppend) { 1156 TEST_F(ChunkDemuxerTest, EndOfStreamWithNoAppend) {
1157 EXPECT_CALL(*this, DemuxerOpened()); 1157 EXPECT_CALL(*this, DemuxerOpened());
1158 demuxer_->Initialize( 1158 demuxer_->Initialize(
1159 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 1159 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
1160 1160
1161 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1161 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1162 1162
1163 CheckExpectedRanges("{ }"); 1163 CheckExpectedRanges("{ }");
1164 MarkEndOfStream(PIPELINE_OK); 1164 MarkEndOfStream(PIPELINE_OK);
1165 ShutdownDemuxer(); 1165 ShutdownDemuxer();
1166 CheckExpectedRanges("{ }"); 1166 CheckExpectedRanges("{ }");
1167 demuxer_->RemoveId(kSourceId); 1167 demuxer_->RemoveId(kSourceId);
1168 demuxer_.reset(); 1168 demuxer_.reset();
1169 } 1169 }
1170 1170
1171 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) { 1171 TEST_F(ChunkDemuxerTest, EndOfStreamWithNoMediaAppend) {
1172 ASSERT_TRUE(InitDemuxer(true, true)); 1172 ASSERT_TRUE(InitDemuxer(true, true));
1173 1173
1174 CheckExpectedRanges("{ }"); 1174 CheckExpectedRanges("{ }");
1175 MarkEndOfStream(PIPELINE_OK); 1175 MarkEndOfStream(PIPELINE_OK);
1176 CheckExpectedRanges("{ }"); 1176 CheckExpectedRanges("{ }");
1177 } 1177 }
1178 1178
1179 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) { 1179 TEST_F(ChunkDemuxerTest, DecodeErrorEndOfStream) {
1180 ASSERT_TRUE(InitDemuxer(true, true)); 1180 ASSERT_TRUE(InitDemuxer(true, true));
1181 1181
1182 AppendCluster(kDefaultFirstCluster()); 1182 AppendCluster(kDefaultFirstCluster());
1183 CheckExpectedRanges(kDefaultFirstClusterRange); 1183 CheckExpectedRanges(kDefaultFirstClusterRange);
1184 1184
1185 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1185 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1186 MarkEndOfStream(PIPELINE_ERROR_DECODE); 1186 MarkEndOfStream(PIPELINE_ERROR_DECODE);
1187 CheckExpectedRanges(kDefaultFirstClusterRange); 1187 CheckExpectedRanges(kDefaultFirstClusterRange);
1188 } 1188 }
1189 1189
1190 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) { 1190 TEST_F(ChunkDemuxerTest, NetworkErrorEndOfStream) {
1191 ASSERT_TRUE(InitDemuxer(true, true)); 1191 ASSERT_TRUE(InitDemuxer(true, true));
1192 1192
1193 AppendCluster(kDefaultFirstCluster()); 1193 AppendCluster(kDefaultFirstCluster());
1194 CheckExpectedRanges(kDefaultFirstClusterRange); 1194 CheckExpectedRanges(kDefaultFirstClusterRange);
1195 1195
1196 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); 1196 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK));
1197 MarkEndOfStream(PIPELINE_ERROR_NETWORK); 1197 MarkEndOfStream(PIPELINE_ERROR_NETWORK);
1198 } 1198 }
1199 1199
1200 // Helper class to reduce duplicate code when testing end of stream 1200 // Helper class to reduce duplicate code when testing end of stream
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1240 1240
1241 Demuxer* demuxer_; 1241 Demuxer* demuxer_;
1242 bool audio_read_done_; 1242 bool audio_read_done_;
1243 bool video_read_done_; 1243 bool video_read_done_;
1244 1244
1245 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); 1245 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper);
1246 }; 1246 };
1247 1247
1248 // Make sure that all pending reads that we don't have media data for get an 1248 // Make sure that all pending reads that we don't have media data for get an
1249 // "end of stream" buffer when MarkEndOfStream() is called. 1249 // "end of stream" buffer when MarkEndOfStream() is called.
1250 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { 1250 TEST_F(ChunkDemuxerTest, EndOfStreamWithPendingReads) {
1251 ASSERT_TRUE(InitDemuxer(true, true)); 1251 ASSERT_TRUE(InitDemuxer(true, true));
1252 1252
1253 AppendCluster(GenerateCluster(0, 2)); 1253 AppendCluster(GenerateCluster(0, 2));
1254 1254
1255 bool audio_read_done_1 = false; 1255 bool audio_read_done_1 = false;
1256 bool video_read_done_1 = false; 1256 bool video_read_done_1 = false;
1257 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 1257 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
1258 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 1258 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
1259 1259
1260 ReadAudio(base::Bind(&OnReadDone, 1260 ReadAudio(base::Bind(&OnReadDone,
(...skipping 14 matching lines...) Expand all
1275 MarkEndOfStream(PIPELINE_OK); 1275 MarkEndOfStream(PIPELINE_OK);
1276 1276
1277 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true); 1277 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
1278 1278
1279 end_of_stream_helper_2.RequestReads(); 1279 end_of_stream_helper_2.RequestReads();
1280 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 1280 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
1281 } 1281 }
1282 1282
1283 // Make sure that all Read() calls after we get an MarkEndOfStream() 1283 // Make sure that all Read() calls after we get an MarkEndOfStream()
1284 // call return an "end of stream" buffer. 1284 // call return an "end of stream" buffer.
1285 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { 1285 TEST_F(ChunkDemuxerTest, ReadsAfterEndOfStream) {
1286 ASSERT_TRUE(InitDemuxer(true, true)); 1286 ASSERT_TRUE(InitDemuxer(true, true));
1287 1287
1288 AppendCluster(GenerateCluster(0, 2)); 1288 AppendCluster(GenerateCluster(0, 2));
1289 1289
1290 bool audio_read_done_1 = false; 1290 bool audio_read_done_1 = false;
1291 bool video_read_done_1 = false; 1291 bool video_read_done_1 = false;
1292 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 1292 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
1293 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 1293 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
1294 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get()); 1294 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get());
1295 1295
(...skipping 18 matching lines...) Expand all
1314 1314
1315 // Request a few more reads and make sure we immediately get 1315 // Request a few more reads and make sure we immediately get
1316 // end of stream buffers. 1316 // end of stream buffers.
1317 end_of_stream_helper_2.RequestReads(); 1317 end_of_stream_helper_2.RequestReads();
1318 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 1318 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
1319 1319
1320 end_of_stream_helper_3.RequestReads(); 1320 end_of_stream_helper_3.RequestReads();
1321 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); 1321 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true);
1322 } 1322 }
1323 1323
1324 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringCanceledSeek) { 1324 TEST_F(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) {
1325 ASSERT_TRUE(InitDemuxer(true, true)); 1325 ASSERT_TRUE(InitDemuxer(true, true));
1326 1326
1327 AppendCluster(0, 10); 1327 AppendCluster(0, 10);
1328 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138))); 1328 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138)));
1329 MarkEndOfStream(PIPELINE_OK); 1329 MarkEndOfStream(PIPELINE_OK);
1330 1330
1331 // Start the first seek. 1331 // Start the first seek.
1332 Seek(base::TimeDelta::FromMilliseconds(20)); 1332 Seek(base::TimeDelta::FromMilliseconds(20));
1333 1333
1334 // Simulate another seek being requested before the first 1334 // Simulate another seek being requested before the first
(...skipping 10 matching lines...) Expand all
1345 // Make sure audio can reach end of stream. 1345 // Make sure audio can reach end of stream.
1346 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 1346 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
1347 ASSERT_EQ(status, DemuxerStream::kOk); 1347 ASSERT_EQ(status, DemuxerStream::kOk);
1348 1348
1349 // Make sure video can reach end of stream. 1349 // Make sure video can reach end of stream.
1350 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 1350 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
1351 ASSERT_EQ(status, DemuxerStream::kOk); 1351 ASSERT_EQ(status, DemuxerStream::kOk);
1352 } 1352 }
1353 1353
1354 // Make sure AppendData() will accept elements that span multiple calls. 1354 // Make sure AppendData() will accept elements that span multiple calls.
1355 TEST_F(ChunkDemuxerTest, TestAppendingInPieces) { 1355 TEST_F(ChunkDemuxerTest, AppendingInPieces) {
1356 EXPECT_CALL(*this, DemuxerOpened()); 1356 EXPECT_CALL(*this, DemuxerOpened());
1357 demuxer_->Initialize( 1357 demuxer_->Initialize(
1358 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 1358 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
1359 1359
1360 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1360 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1361 1361
1362 scoped_ptr<uint8[]> info_tracks; 1362 scoped_ptr<uint8[]> info_tracks;
1363 int info_tracks_size = 0; 1363 int info_tracks_size = 0;
1364 CreateInitSegment(true, true, false, false, &info_tracks, &info_tracks_size); 1364 CreateInitSegment(true, true, false, false, &info_tracks, &info_tracks_size);
1365 1365
(...skipping 10 matching lines...) Expand all
1376 dst += cluster_a->size(); 1376 dst += cluster_a->size();
1377 1377
1378 memcpy(dst, cluster_b->data(), cluster_b->size()); 1378 memcpy(dst, cluster_b->data(), cluster_b->size());
1379 dst += cluster_b->size(); 1379 dst += cluster_b->size();
1380 1380
1381 AppendDataInPieces(buffer.get(), buffer_size); 1381 AppendDataInPieces(buffer.get(), buffer_size);
1382 1382
1383 GenerateExpectedReads(0, 9); 1383 GenerateExpectedReads(0, 9);
1384 } 1384 }
1385 1385
1386 TEST_F(ChunkDemuxerTest, TestWebMFile_AudioAndVideo) { 1386 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) {
1387 struct BufferTimestamps buffer_timestamps[] = { 1387 struct BufferTimestamps buffer_timestamps[] = {
1388 {0, 0}, 1388 {0, 0},
1389 {33, 3}, 1389 {33, 3},
1390 {67, 6}, 1390 {67, 6},
1391 {100, 9}, 1391 {100, 9},
1392 {133, 12}, 1392 {133, 12},
1393 {kSkip, kSkip}, 1393 {kSkip, kSkip},
1394 }; 1394 };
1395 1395
1396 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps, 1396 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps,
1397 base::TimeDelta::FromMilliseconds(2744))); 1397 base::TimeDelta::FromMilliseconds(2744)));
1398 } 1398 }
1399 1399
1400 TEST_F(ChunkDemuxerTest, TestWebMFile_LiveAudioAndVideo) { 1400 TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) {
1401 struct BufferTimestamps buffer_timestamps[] = { 1401 struct BufferTimestamps buffer_timestamps[] = {
1402 {0, 0}, 1402 {0, 0},
1403 {33, 3}, 1403 {33, 3},
1404 {67, 6}, 1404 {67, 6},
1405 {100, 9}, 1405 {100, 9},
1406 {133, 12}, 1406 {133, 12},
1407 {kSkip, kSkip}, 1407 {kSkip, kSkip},
1408 }; 1408 };
1409 1409
1410 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps, 1410 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps,
1411 kInfiniteDuration())); 1411 kInfiniteDuration()));
1412 } 1412 }
1413 1413
1414 TEST_F(ChunkDemuxerTest, TestWebMFile_AudioOnly) { 1414 TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) {
1415 struct BufferTimestamps buffer_timestamps[] = { 1415 struct BufferTimestamps buffer_timestamps[] = {
1416 {kSkip, 0}, 1416 {kSkip, 0},
1417 {kSkip, 3}, 1417 {kSkip, 3},
1418 {kSkip, 6}, 1418 {kSkip, 6},
1419 {kSkip, 9}, 1419 {kSkip, 9},
1420 {kSkip, 12}, 1420 {kSkip, 12},
1421 {kSkip, kSkip}, 1421 {kSkip, kSkip},
1422 }; 1422 };
1423 1423
1424 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps, 1424 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps,
1425 base::TimeDelta::FromMilliseconds(2744), 1425 base::TimeDelta::FromMilliseconds(2744),
1426 true, false)); 1426 true, false));
1427 } 1427 }
1428 1428
1429 TEST_F(ChunkDemuxerTest, TestWebMFile_VideoOnly) { 1429 TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) {
1430 struct BufferTimestamps buffer_timestamps[] = { 1430 struct BufferTimestamps buffer_timestamps[] = {
1431 {0, kSkip}, 1431 {0, kSkip},
1432 {33, kSkip}, 1432 {33, kSkip},
1433 {67, kSkip}, 1433 {67, kSkip},
1434 {100, kSkip}, 1434 {100, kSkip},
1435 {133, kSkip}, 1435 {133, kSkip},
1436 {kSkip, kSkip}, 1436 {kSkip, kSkip},
1437 }; 1437 };
1438 1438
1439 ASSERT_TRUE(ParseWebMFile("bear-320x240-video-only.webm", buffer_timestamps, 1439 ASSERT_TRUE(ParseWebMFile("bear-320x240-video-only.webm", buffer_timestamps,
1440 base::TimeDelta::FromMilliseconds(2703), 1440 base::TimeDelta::FromMilliseconds(2703),
1441 false, true)); 1441 false, true));
1442 } 1442 }
1443 1443
1444 TEST_F(ChunkDemuxerTest, TestWebMFile_AltRefFrames) { 1444 TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) {
1445 struct BufferTimestamps buffer_timestamps[] = { 1445 struct BufferTimestamps buffer_timestamps[] = {
1446 {0, 0}, 1446 {0, 0},
1447 {33, 3}, 1447 {33, 3},
1448 {33, 6}, 1448 {33, 6},
1449 {67, 9}, 1449 {67, 9},
1450 {100, 12}, 1450 {100, 12},
1451 {kSkip, kSkip}, 1451 {kSkip, kSkip},
1452 }; 1452 };
1453 1453
1454 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps, 1454 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps,
1455 base::TimeDelta::FromMilliseconds(2767))); 1455 base::TimeDelta::FromMilliseconds(2767)));
1456 } 1456 }
1457 1457
1458 // Verify that we output buffers before the entire cluster has been parsed. 1458 // Verify that we output buffers before the entire cluster has been parsed.
1459 TEST_F(ChunkDemuxerTest, TestIncrementalClusterParsing) { 1459 TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) {
1460 ASSERT_TRUE(InitDemuxer(true, true)); 1460 ASSERT_TRUE(InitDemuxer(true, true));
1461 AppendEmptyCluster(0); 1461 AppendEmptyCluster(0);
1462 1462
1463 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6)); 1463 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6));
1464 1464
1465 bool audio_read_done = false; 1465 bool audio_read_done = false;
1466 bool video_read_done = false; 1466 bool video_read_done = false;
1467 ReadAudio(base::Bind(&OnReadDone, 1467 ReadAudio(base::Bind(&OnReadDone,
1468 base::TimeDelta::FromMilliseconds(0), 1468 base::TimeDelta::FromMilliseconds(0),
1469 &audio_read_done)); 1469 &audio_read_done));
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1512 // Append the remaining data. 1512 // Append the remaining data.
1513 ASSERT_LT(i, cluster->size()); 1513 ASSERT_LT(i, cluster->size());
1514 AppendData(cluster->data() + i, cluster->size() - i); 1514 AppendData(cluster->data() + i, cluster->size() - i);
1515 1515
1516 message_loop_.RunUntilIdle(); 1516 message_loop_.RunUntilIdle();
1517 1517
1518 EXPECT_TRUE(audio_read_done); 1518 EXPECT_TRUE(audio_read_done);
1519 EXPECT_TRUE(video_read_done); 1519 EXPECT_TRUE(video_read_done);
1520 } 1520 }
1521 1521
1522 TEST_F(ChunkDemuxerTest, TestParseErrorDuringInit) { 1522 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) {
1523 EXPECT_CALL(*this, DemuxerOpened()); 1523 EXPECT_CALL(*this, DemuxerOpened());
1524 demuxer_->Initialize( 1524 demuxer_->Initialize(
1525 &host_, CreateInitDoneCB( 1525 &host_, CreateInitDoneCB(
1526 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN)); 1526 kNoTimestamp(), DEMUXER_ERROR_COULD_NOT_OPEN));
1527 1527
1528 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1528 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1529 1529
1530 uint8 tmp = 0; 1530 uint8 tmp = 0;
1531 demuxer_->AppendData(kSourceId, &tmp, 1); 1531 demuxer_->AppendData(kSourceId, &tmp, 1);
1532 } 1532 }
1533 1533
1534 TEST_F(ChunkDemuxerTest, TestAVHeadersWithAudioOnlyType) { 1534 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
1535 EXPECT_CALL(*this, DemuxerOpened()); 1535 EXPECT_CALL(*this, DemuxerOpened());
1536 demuxer_->Initialize( 1536 demuxer_->Initialize(
1537 &host_, CreateInitDoneCB(kNoTimestamp(), 1537 &host_, CreateInitDoneCB(kNoTimestamp(),
1538 DEMUXER_ERROR_COULD_NOT_OPEN)); 1538 DEMUXER_ERROR_COULD_NOT_OPEN));
1539 1539
1540 std::vector<std::string> codecs(1); 1540 std::vector<std::string> codecs(1);
1541 codecs[0] = "vorbis"; 1541 codecs[0] = "vorbis";
1542 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), 1542 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs),
1543 ChunkDemuxer::kOk); 1543 ChunkDemuxer::kOk);
1544 1544
1545 AppendInitSegment(true, true); 1545 AppendInitSegment(true, true);
1546 } 1546 }
1547 1547
1548 TEST_F(ChunkDemuxerTest, TestAVHeadersWithVideoOnlyType) { 1548 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) {
1549 EXPECT_CALL(*this, DemuxerOpened()); 1549 EXPECT_CALL(*this, DemuxerOpened());
1550 demuxer_->Initialize( 1550 demuxer_->Initialize(
1551 &host_, CreateInitDoneCB(kNoTimestamp(), 1551 &host_, CreateInitDoneCB(kNoTimestamp(),
1552 DEMUXER_ERROR_COULD_NOT_OPEN)); 1552 DEMUXER_ERROR_COULD_NOT_OPEN));
1553 1553
1554 std::vector<std::string> codecs(1); 1554 std::vector<std::string> codecs(1);
1555 codecs[0] = "vp8"; 1555 codecs[0] = "vp8";
1556 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), 1556 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
1557 ChunkDemuxer::kOk); 1557 ChunkDemuxer::kOk);
1558 1558
1559 AppendInitSegment(true, true); 1559 AppendInitSegment(true, true);
1560 } 1560 }
1561 1561
1562 TEST_F(ChunkDemuxerTest, TestMultipleHeaders) { 1562 TEST_F(ChunkDemuxerTest, MultipleHeaders) {
1563 ASSERT_TRUE(InitDemuxer(true, true)); 1563 ASSERT_TRUE(InitDemuxer(true, true));
1564 1564
1565 AppendCluster(kDefaultFirstCluster()); 1565 AppendCluster(kDefaultFirstCluster());
1566 1566
1567 // Append another identical initialization segment. 1567 // Append another identical initialization segment.
1568 AppendInitSegment(true, true); 1568 AppendInitSegment(true, true);
1569 1569
1570 AppendCluster(kDefaultSecondCluster()); 1570 AppendCluster(kDefaultSecondCluster());
1571 1571
1572 GenerateExpectedReads(0, 9); 1572 GenerateExpectedReads(0, 9);
1573 } 1573 }
1574 1574
1575 TEST_F(ChunkDemuxerTest, TestAddSeparateSourcesForAudioAndVideo) { 1575 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) {
1576 std::string audio_id = "audio1"; 1576 std::string audio_id = "audio1";
1577 std::string video_id = "video1"; 1577 std::string video_id = "video1";
1578 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1578 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1579 1579
1580 // Append audio and video data into separate source ids. 1580 // Append audio and video data into separate source ids.
1581 AppendCluster(audio_id, 1581 AppendCluster(audio_id,
1582 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 1582 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1583 GenerateAudioStreamExpectedReads(0, 4); 1583 GenerateAudioStreamExpectedReads(0, 4);
1584 AppendCluster(video_id, 1584 AppendCluster(video_id,
1585 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 1585 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
1586 GenerateVideoStreamExpectedReads(0, 4); 1586 GenerateVideoStreamExpectedReads(0, 4);
1587 } 1587 }
1588 1588
1589 TEST_F(ChunkDemuxerTest, TestAddIdFailures) { 1589 TEST_F(ChunkDemuxerTest, AddIdFailures) {
1590 EXPECT_CALL(*this, DemuxerOpened()); 1590 EXPECT_CALL(*this, DemuxerOpened());
1591 demuxer_->Initialize( 1591 demuxer_->Initialize(
1592 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 1592 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
1593 1593
1594 std::string audio_id = "audio1"; 1594 std::string audio_id = "audio1";
1595 std::string video_id = "video1"; 1595 std::string video_id = "video1";
1596 1596
1597 ASSERT_EQ(AddId(audio_id, true, false), ChunkDemuxer::kOk); 1597 ASSERT_EQ(AddId(audio_id, true, false), ChunkDemuxer::kOk);
1598 1598
1599 // Adding an id with audio/video should fail because we already added audio. 1599 // Adding an id with audio/video should fail because we already added audio.
1600 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); 1600 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit);
1601 1601
1602 AppendInitSegmentWithSourceId(audio_id, true, false); 1602 AppendInitSegmentWithSourceId(audio_id, true, false);
1603 1603
1604 // Adding an id after append should fail. 1604 // Adding an id after append should fail.
1605 ASSERT_EQ(AddId(video_id, false, true), ChunkDemuxer::kReachedIdLimit); 1605 ASSERT_EQ(AddId(video_id, false, true), ChunkDemuxer::kReachedIdLimit);
1606 } 1606 }
1607 1607
1608 // Test that Read() calls after a RemoveId() return "end of stream" buffers. 1608 // Test that Read() calls after a RemoveId() return "end of stream" buffers.
1609 TEST_F(ChunkDemuxerTest, TestRemoveId) { 1609 TEST_F(ChunkDemuxerTest, RemoveId) {
1610 std::string audio_id = "audio1"; 1610 std::string audio_id = "audio1";
1611 std::string video_id = "video1"; 1611 std::string video_id = "video1";
1612 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1612 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1613 1613
1614 // Append audio and video data into separate source ids. 1614 // Append audio and video data into separate source ids.
1615 AppendCluster(audio_id, 1615 AppendCluster(audio_id,
1616 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 1616 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1617 AppendCluster(video_id, 1617 AppendCluster(video_id,
1618 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 1618 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
1619 1619
1620 // Read() from audio should return normal buffers. 1620 // Read() from audio should return normal buffers.
1621 GenerateAudioStreamExpectedReads(0, 4); 1621 GenerateAudioStreamExpectedReads(0, 4);
1622 1622
1623 // Remove the audio id. 1623 // Remove the audio id.
1624 demuxer_->RemoveId(audio_id); 1624 demuxer_->RemoveId(audio_id);
1625 1625
1626 // Read() from audio should return "end of stream" buffers. 1626 // Read() from audio should return "end of stream" buffers.
1627 bool audio_read_done = false; 1627 bool audio_read_done = false;
1628 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); 1628 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
1629 message_loop_.RunUntilIdle(); 1629 message_loop_.RunUntilIdle();
1630 EXPECT_TRUE(audio_read_done); 1630 EXPECT_TRUE(audio_read_done);
1631 1631
1632 // Read() from video should still return normal buffers. 1632 // Read() from video should still return normal buffers.
1633 GenerateVideoStreamExpectedReads(0, 4); 1633 GenerateVideoStreamExpectedReads(0, 4);
1634 } 1634 }
1635 1635
1636 // Test that removing an ID immediately after adding it does not interfere with 1636 // Test that removing an ID immediately after adding it does not interfere with
1637 // quota for new IDs in the future. 1637 // quota for new IDs in the future.
1638 TEST_F(ChunkDemuxerTest, TestRemoveAndAddId) { 1638 TEST_F(ChunkDemuxerTest, RemoveAndAddId) {
1639 std::string audio_id_1 = "audio1"; 1639 std::string audio_id_1 = "audio1";
1640 ASSERT_TRUE(AddId(audio_id_1, true, false) == ChunkDemuxer::kOk); 1640 ASSERT_TRUE(AddId(audio_id_1, true, false) == ChunkDemuxer::kOk);
1641 demuxer_->RemoveId(audio_id_1); 1641 demuxer_->RemoveId(audio_id_1);
1642 1642
1643 std::string audio_id_2 = "audio2"; 1643 std::string audio_id_2 = "audio2";
1644 ASSERT_TRUE(AddId(audio_id_2, true, false) == ChunkDemuxer::kOk); 1644 ASSERT_TRUE(AddId(audio_id_2, true, false) == ChunkDemuxer::kOk);
1645 } 1645 }
1646 1646
1647 TEST_F(ChunkDemuxerTest, TestSeekCanceled) { 1647 TEST_F(ChunkDemuxerTest, SeekCanceled) {
1648 ASSERT_TRUE(InitDemuxer(true, true)); 1648 ASSERT_TRUE(InitDemuxer(true, true));
1649 1649
1650 // Append cluster at the beginning of the stream. 1650 // Append cluster at the beginning of the stream.
1651 AppendCluster(GenerateCluster(0, 4)); 1651 AppendCluster(GenerateCluster(0, 4));
1652 1652
1653 // Seek to an unbuffered region. 1653 // Seek to an unbuffered region.
1654 Seek(base::TimeDelta::FromSeconds(50)); 1654 Seek(base::TimeDelta::FromSeconds(50));
1655 1655
1656 // Attempt to read in unbuffered area; should not fulfill the read. 1656 // Attempt to read in unbuffered area; should not fulfill the read.
1657 bool audio_read_done = false; 1657 bool audio_read_done = false;
1658 bool video_read_done = false; 1658 bool video_read_done = false;
1659 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); 1659 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
1660 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); 1660 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
1661 EXPECT_FALSE(audio_read_done); 1661 EXPECT_FALSE(audio_read_done);
1662 EXPECT_FALSE(video_read_done); 1662 EXPECT_FALSE(video_read_done);
1663 1663
1664 // Now cancel the pending seek, which should flush the reads with empty 1664 // Now cancel the pending seek, which should flush the reads with empty
1665 // buffers. 1665 // buffers.
1666 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); 1666 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
1667 demuxer_->CancelPendingSeek(seek_time); 1667 demuxer_->CancelPendingSeek(seek_time);
1668 message_loop_.RunUntilIdle(); 1668 message_loop_.RunUntilIdle();
1669 EXPECT_TRUE(audio_read_done); 1669 EXPECT_TRUE(audio_read_done);
1670 EXPECT_TRUE(video_read_done); 1670 EXPECT_TRUE(video_read_done);
1671 1671
1672 // A seek back to the buffered region should succeed. 1672 // A seek back to the buffered region should succeed.
1673 Seek(seek_time); 1673 Seek(seek_time);
1674 GenerateExpectedReads(0, 4); 1674 GenerateExpectedReads(0, 4);
1675 } 1675 }
1676 1676
1677 TEST_F(ChunkDemuxerTest, TestSeekCanceledWhileWaitingForSeek) { 1677 TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) {
1678 ASSERT_TRUE(InitDemuxer(true, true)); 1678 ASSERT_TRUE(InitDemuxer(true, true));
1679 1679
1680 // Append cluster at the beginning of the stream. 1680 // Append cluster at the beginning of the stream.
1681 AppendCluster(GenerateCluster(0, 4)); 1681 AppendCluster(GenerateCluster(0, 4));
1682 1682
1683 // Start waiting for a seek. 1683 // Start waiting for a seek.
1684 base::TimeDelta seek_time1 = base::TimeDelta::FromSeconds(50); 1684 base::TimeDelta seek_time1 = base::TimeDelta::FromSeconds(50);
1685 base::TimeDelta seek_time2 = base::TimeDelta::FromSeconds(0); 1685 base::TimeDelta seek_time2 = base::TimeDelta::FromSeconds(0);
1686 demuxer_->StartWaitingForSeek(seek_time1); 1686 demuxer_->StartWaitingForSeek(seek_time1);
1687 1687
1688 // Now cancel the upcoming seek to an unbuffered region. 1688 // Now cancel the upcoming seek to an unbuffered region.
1689 demuxer_->CancelPendingSeek(seek_time2); 1689 demuxer_->CancelPendingSeek(seek_time2);
1690 demuxer_->Seek(seek_time1, NewExpectedStatusCB(PIPELINE_OK)); 1690 demuxer_->Seek(seek_time1, NewExpectedStatusCB(PIPELINE_OK));
1691 1691
1692 // Read requests should be fulfilled with empty buffers. 1692 // Read requests should be fulfilled with empty buffers.
1693 bool audio_read_done = false; 1693 bool audio_read_done = false;
1694 bool video_read_done = false; 1694 bool video_read_done = false;
1695 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); 1695 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
1696 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); 1696 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
1697 EXPECT_TRUE(audio_read_done); 1697 EXPECT_TRUE(audio_read_done);
1698 EXPECT_TRUE(video_read_done); 1698 EXPECT_TRUE(video_read_done);
1699 1699
1700 // A seek back to the buffered region should succeed. 1700 // A seek back to the buffered region should succeed.
1701 Seek(seek_time2); 1701 Seek(seek_time2);
1702 GenerateExpectedReads(0, 4); 1702 GenerateExpectedReads(0, 4);
1703 } 1703 }
1704 1704
1705 // Test that Seek() successfully seeks to all source IDs. 1705 // Test that Seek() successfully seeks to all source IDs.
1706 TEST_F(ChunkDemuxerTest, TestSeekAudioAndVideoSources) { 1706 TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) {
1707 std::string audio_id = "audio1"; 1707 std::string audio_id = "audio1";
1708 std::string video_id = "video1"; 1708 std::string video_id = "video1";
1709 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1709 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1710 1710
1711 AppendCluster( 1711 AppendCluster(
1712 audio_id, 1712 audio_id,
1713 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 1713 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1714 AppendCluster( 1714 AppendCluster(
1715 video_id, 1715 video_id,
1716 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 1716 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1753 1753
1754 // Read() should return buffers at 3. 1754 // Read() should return buffers at 3.
1755 EXPECT_TRUE(audio_read_done); 1755 EXPECT_TRUE(audio_read_done);
1756 EXPECT_TRUE(video_read_done); 1756 EXPECT_TRUE(video_read_done);
1757 } 1757 }
1758 1758
1759 // Test that Seek() completes successfully when EndOfStream 1759 // Test that Seek() completes successfully when EndOfStream
1760 // is called before data is available for that seek point. 1760 // is called before data is available for that seek point.
1761 // This scenario might be useful if seeking past the end of stream 1761 // This scenario might be useful if seeking past the end of stream
1762 // of either audio or video (or both). 1762 // of either audio or video (or both).
1763 TEST_F(ChunkDemuxerTest, TestEndOfStreamAfterPastEosSeek) { 1763 TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) {
1764 ASSERT_TRUE(InitDemuxer(true, true)); 1764 ASSERT_TRUE(InitDemuxer(true, true));
1765 1765
1766 AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10)); 1766 AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10));
1767 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5)); 1767 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5));
1768 1768
1769 // Seeking past the end of video. 1769 // Seeking past the end of video.
1770 // Note: audio data is available for that seek point. 1770 // Note: audio data is available for that seek point.
1771 bool seek_cb_was_called = false; 1771 bool seek_cb_was_called = false;
1772 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(110); 1772 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(110);
1773 demuxer_->StartWaitingForSeek(seek_time); 1773 demuxer_->StartWaitingForSeek(seek_time);
1774 demuxer_->Seek(seek_time, 1774 demuxer_->Seek(seek_time,
1775 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); 1775 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called));
1776 message_loop_.RunUntilIdle(); 1776 message_loop_.RunUntilIdle();
1777 1777
1778 EXPECT_FALSE(seek_cb_was_called); 1778 EXPECT_FALSE(seek_cb_was_called);
1779 1779
1780 EXPECT_CALL(host_, SetDuration( 1780 EXPECT_CALL(host_, SetDuration(
1781 base::TimeDelta::FromMilliseconds(120))); 1781 base::TimeDelta::FromMilliseconds(120)));
1782 MarkEndOfStream(PIPELINE_OK); 1782 MarkEndOfStream(PIPELINE_OK);
1783 message_loop_.RunUntilIdle(); 1783 message_loop_.RunUntilIdle();
1784 1784
1785 EXPECT_TRUE(seek_cb_was_called); 1785 EXPECT_TRUE(seek_cb_was_called);
1786 1786
1787 ShutdownDemuxer(); 1787 ShutdownDemuxer();
1788 } 1788 }
1789 1789
1790 // Test that EndOfStream is ignored if coming during a pending seek 1790 // Test that EndOfStream is ignored if coming during a pending seek
1791 // whose seek time is before some existing ranges. 1791 // whose seek time is before some existing ranges.
1792 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringPendingSeek) { 1792 TEST_F(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) {
1793 ASSERT_TRUE(InitDemuxer(true, true)); 1793 ASSERT_TRUE(InitDemuxer(true, true));
1794 1794
1795 AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10)); 1795 AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10));
1796 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5)); 1796 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5));
1797 AppendCluster(GenerateSingleStreamCluster(200, 300, kAudioTrackNum, 10)); 1797 AppendCluster(GenerateSingleStreamCluster(200, 300, kAudioTrackNum, 10));
1798 AppendCluster(GenerateSingleStreamCluster(200, 300, kVideoTrackNum, 5)); 1798 AppendCluster(GenerateSingleStreamCluster(200, 300, kVideoTrackNum, 5));
1799 1799
1800 bool seek_cb_was_called = false; 1800 bool seek_cb_was_called = false;
1801 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160); 1801 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(160);
1802 demuxer_->StartWaitingForSeek(seek_time); 1802 demuxer_->StartWaitingForSeek(seek_time);
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1935 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 100)); 1935 AppendCluster(GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 100));
1936 1936
1937 CheckExpectedRanges("{ [0,90) }"); 1937 CheckExpectedRanges("{ [0,90) }");
1938 1938
1939 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(100))); 1939 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(100)));
1940 MarkEndOfStream(PIPELINE_OK); 1940 MarkEndOfStream(PIPELINE_OK);
1941 1941
1942 CheckExpectedRanges("{ [0,100) }"); 1942 CheckExpectedRanges("{ [0,100) }");
1943 } 1943 }
1944 1944
1945 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodes) { 1945 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) {
1946 ASSERT_TRUE(InitDemuxer(true, true)); 1946 ASSERT_TRUE(InitDemuxer(true, true));
1947 1947
1948 // Create a cluster where the video timecode begins 25ms after the audio. 1948 // Create a cluster where the video timecode begins 25ms after the audio.
1949 AppendCluster(GenerateCluster(0, 25, 8)); 1949 AppendCluster(GenerateCluster(0, 25, 8));
1950 1950
1951 Seek(base::TimeDelta::FromSeconds(0)); 1951 Seek(base::TimeDelta::FromSeconds(0));
1952 GenerateExpectedReads(0, 25, 8); 1952 GenerateExpectedReads(0, 25, 8);
1953 1953
1954 // Seek to 5 seconds. 1954 // Seek to 5 seconds.
1955 Seek(base::TimeDelta::FromSeconds(5)); 1955 Seek(base::TimeDelta::FromSeconds(5));
1956 1956
1957 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms 1957 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms
1958 // after the video. 1958 // after the video.
1959 AppendCluster(GenerateCluster(5025, 5000, 8)); 1959 AppendCluster(GenerateCluster(5025, 5000, 8));
1960 GenerateExpectedReads(5025, 5000, 8); 1960 GenerateExpectedReads(5025, 5000, 8);
1961 } 1961 }
1962 1962
1963 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodesSeparateSources) { 1963 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) {
1964 std::string audio_id = "audio1"; 1964 std::string audio_id = "audio1";
1965 std::string video_id = "video1"; 1965 std::string video_id = "video1";
1966 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1966 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1967 1967
1968 // Generate two streams where the video stream starts 5ms after the audio 1968 // Generate two streams where the video stream starts 5ms after the audio
1969 // stream and append them. 1969 // stream and append them.
1970 AppendCluster(audio_id, GenerateSingleStreamCluster( 1970 AppendCluster(audio_id, GenerateSingleStreamCluster(
1971 25, 4 * kAudioBlockDuration + 25, kAudioTrackNum, kAudioBlockDuration)); 1971 25, 4 * kAudioBlockDuration + 25, kAudioTrackNum, kAudioBlockDuration));
1972 AppendCluster(video_id, GenerateSingleStreamCluster( 1972 AppendCluster(video_id, GenerateSingleStreamCluster(
1973 30, 4 * kVideoBlockDuration + 30, kVideoTrackNum, kVideoBlockDuration)); 1973 30, 4 * kVideoBlockDuration + 30, kVideoTrackNum, kVideoBlockDuration));
1974 1974
1975 // Both streams should be able to fulfill a seek to 25. 1975 // Both streams should be able to fulfill a seek to 25.
1976 Seek(base::TimeDelta::FromMilliseconds(25)); 1976 Seek(base::TimeDelta::FromMilliseconds(25));
1977 GenerateAudioStreamExpectedReads(25, 4); 1977 GenerateAudioStreamExpectedReads(25, 4);
1978 GenerateVideoStreamExpectedReads(30, 4); 1978 GenerateVideoStreamExpectedReads(30, 4);
1979 } 1979 }
1980 1980
1981 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodesOutOfRange) { 1981 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) {
1982 std::string audio_id = "audio1"; 1982 std::string audio_id = "audio1";
1983 std::string video_id = "video1"; 1983 std::string video_id = "video1";
1984 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1984 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1985 1985
1986 // Generate two streams where the video stream starts 10s after the audio 1986 // Generate two streams where the video stream starts 10s after the audio
1987 // stream and append them. 1987 // stream and append them.
1988 AppendCluster(audio_id, GenerateSingleStreamCluster(0, 1988 AppendCluster(audio_id, GenerateSingleStreamCluster(0,
1989 4 * kAudioBlockDuration + 0, kAudioTrackNum, kAudioBlockDuration)); 1989 4 * kAudioBlockDuration + 0, kAudioTrackNum, kAudioBlockDuration));
1990 AppendCluster(video_id, GenerateSingleStreamCluster(10000, 1990 AppendCluster(video_id, GenerateSingleStreamCluster(10000,
1991 4 * kVideoBlockDuration + 10000, kVideoTrackNum, kVideoBlockDuration)); 1991 4 * kVideoBlockDuration + 10000, kVideoTrackNum, kVideoBlockDuration));
1992 1992
1993 // Should not be able to fulfill a seek to 0. 1993 // Should not be able to fulfill a seek to 0.
1994 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(0); 1994 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(0);
1995 demuxer_->StartWaitingForSeek(seek_time); 1995 demuxer_->StartWaitingForSeek(seek_time);
1996 demuxer_->Seek(seek_time, 1996 demuxer_->Seek(seek_time,
1997 NewExpectedStatusCB(PIPELINE_ERROR_ABORT)); 1997 NewExpectedStatusCB(PIPELINE_ERROR_ABORT));
1998 ExpectRead(DemuxerStream::AUDIO, 0); 1998 ExpectRead(DemuxerStream::AUDIO, 0);
1999 ExpectEndOfStream(DemuxerStream::VIDEO); 1999 ExpectEndOfStream(DemuxerStream::VIDEO);
2000 } 2000 }
2001 2001
2002 TEST_F(ChunkDemuxerTest, TestClusterWithNoBuffers) { 2002 TEST_F(ChunkDemuxerTest, ClusterWithNoBuffers) {
2003 ASSERT_TRUE(InitDemuxer(true, true)); 2003 ASSERT_TRUE(InitDemuxer(true, true));
2004 2004
2005 // Generate and append an empty cluster beginning at 0. 2005 // Generate and append an empty cluster beginning at 0.
2006 AppendEmptyCluster(0); 2006 AppendEmptyCluster(0);
2007 2007
2008 // Sanity check that data can be appended after this cluster correctly. 2008 // Sanity check that data can be appended after this cluster correctly.
2009 AppendCluster(GenerateCluster(0, 2)); 2009 AppendCluster(GenerateCluster(0, 2));
2010 ExpectRead(DemuxerStream::AUDIO, 0); 2010 ExpectRead(DemuxerStream::AUDIO, 0);
2011 ExpectRead(DemuxerStream::VIDEO, 0); 2011 ExpectRead(DemuxerStream::VIDEO, 0);
2012 } 2012 }
2013 2013
2014 TEST_F(ChunkDemuxerTest, TestCodecPrefixMatching) { 2014 TEST_F(ChunkDemuxerTest, CodecPrefixMatching) {
2015 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; 2015 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported;
2016 2016
2017 #if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS) 2017 #if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS)
2018 expected = ChunkDemuxer::kOk; 2018 expected = ChunkDemuxer::kOk;
2019 #endif 2019 #endif
2020 2020
2021 std::vector<std::string> codecs; 2021 std::vector<std::string> codecs;
2022 codecs.push_back("avc1.4D4041"); 2022 codecs.push_back("avc1.4D4041");
2023 2023
2024 EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs), expected); 2024 EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs), expected);
2025 } 2025 }
2026 2026
2027 // Test codec ID's that are not compliant with RFC6381, but have been 2027 // Test codec ID's that are not compliant with RFC6381, but have been
2028 // seen in the wild. 2028 // seen in the wild.
2029 TEST_F(ChunkDemuxerTest, TestCodecIDsThatAreNotRFC6381Compliant) { 2029 TEST_F(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) {
2030 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; 2030 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported;
2031 2031
2032 #if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS) 2032 #if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS)
2033 expected = ChunkDemuxer::kOk; 2033 expected = ChunkDemuxer::kOk;
2034 #endif 2034 #endif
2035 const char* codec_ids[] = { 2035 const char* codec_ids[] = {
2036 // GPAC places leading zeros on the audio object type. 2036 // GPAC places leading zeros on the audio object type.
2037 "mp4a.40.02", 2037 "mp4a.40.02",
2038 "mp4a.40.05" 2038 "mp4a.40.05"
2039 }; 2039 };
2040 2040
2041 for (size_t i = 0; i < arraysize(codec_ids); ++i) { 2041 for (size_t i = 0; i < arraysize(codec_ids); ++i) {
2042 std::vector<std::string> codecs; 2042 std::vector<std::string> codecs;
2043 codecs.push_back(codec_ids[i]); 2043 codecs.push_back(codec_ids[i]);
2044 2044
2045 ChunkDemuxer::Status result = 2045 ChunkDemuxer::Status result =
2046 demuxer_->AddId("source_id", "audio/mp4", codecs); 2046 demuxer_->AddId("source_id", "audio/mp4", codecs);
2047 2047
2048 EXPECT_EQ(result, expected) 2048 EXPECT_EQ(result, expected)
2049 << "Fail to add codec_id '" << codec_ids[i] << "'"; 2049 << "Fail to add codec_id '" << codec_ids[i] << "'";
2050 2050
2051 if (result == ChunkDemuxer::kOk) 2051 if (result == ChunkDemuxer::kOk)
2052 demuxer_->RemoveId("source_id"); 2052 demuxer_->RemoveId("source_id");
2053 } 2053 }
2054 } 2054 }
2055 2055
2056 TEST_F(ChunkDemuxerTest, TestEndOfStreamStillSetAfterSeek) { 2056 TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) {
2057 ASSERT_TRUE(InitDemuxer(true, true)); 2057 ASSERT_TRUE(InitDemuxer(true, true));
2058 2058
2059 EXPECT_CALL(host_, SetDuration(_)) 2059 EXPECT_CALL(host_, SetDuration(_))
2060 .Times(AnyNumber()); 2060 .Times(AnyNumber());
2061 2061
2062 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92); 2062 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92);
2063 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99); 2063 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99);
2064 2064
2065 AppendCluster(kDefaultFirstCluster()); 2065 AppendCluster(kDefaultFirstCluster());
2066 AppendCluster(kDefaultSecondCluster()); 2066 AppendCluster(kDefaultSecondCluster());
(...skipping 16 matching lines...) Expand all
2083 2083
2084 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2084 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2085 EXPECT_EQ(DemuxerStream::kOk, status); 2085 EXPECT_EQ(DemuxerStream::kOk, status);
2086 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); 2086 EXPECT_EQ(kLastAudioTimestamp, last_timestamp);
2087 2087
2088 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 2088 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
2089 EXPECT_EQ(DemuxerStream::kOk, status); 2089 EXPECT_EQ(DemuxerStream::kOk, status);
2090 EXPECT_EQ(kLastVideoTimestamp, last_timestamp); 2090 EXPECT_EQ(kLastVideoTimestamp, last_timestamp);
2091 } 2091 }
2092 2092
2093 TEST_F(ChunkDemuxerTest, TestGetBufferedRangesBeforeInitSegment) { 2093 TEST_F(ChunkDemuxerTest, GetBufferedRangesBeforeInitSegment) {
2094 EXPECT_CALL(*this, DemuxerOpened()); 2094 EXPECT_CALL(*this, DemuxerOpened());
2095 demuxer_->Initialize(&host_, CreateInitDoneCB(PIPELINE_OK)); 2095 demuxer_->Initialize(&host_, CreateInitDoneCB(PIPELINE_OK));
2096 ASSERT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk); 2096 ASSERT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk);
2097 ASSERT_EQ(AddId("video", false, true), ChunkDemuxer::kOk); 2097 ASSERT_EQ(AddId("video", false, true), ChunkDemuxer::kOk);
2098 2098
2099 CheckExpectedRanges("audio", "{ }"); 2099 CheckExpectedRanges("audio", "{ }");
2100 CheckExpectedRanges("video", "{ }"); 2100 CheckExpectedRanges("video", "{ }");
2101 } 2101 }
2102 2102
2103 // Test that Seek() completes successfully when the first cluster 2103 // Test that Seek() completes successfully when the first cluster
2104 // arrives. 2104 // arrives.
2105 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringSeek) { 2105 TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) {
2106 InSequence s; 2106 InSequence s;
2107 2107
2108 ASSERT_TRUE(InitDemuxer(true, true)); 2108 ASSERT_TRUE(InitDemuxer(true, true));
2109 2109
2110 AppendCluster(kDefaultFirstCluster()); 2110 AppendCluster(kDefaultFirstCluster());
2111 2111
2112 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); 2112 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
2113 demuxer_->StartWaitingForSeek(seek_time); 2113 demuxer_->StartWaitingForSeek(seek_time);
2114 2114
2115 AppendCluster(kDefaultSecondCluster()); 2115 AppendCluster(kDefaultSecondCluster());
2116 EXPECT_CALL(host_, SetDuration( 2116 EXPECT_CALL(host_, SetDuration(
2117 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); 2117 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp)));
2118 MarkEndOfStream(PIPELINE_OK); 2118 MarkEndOfStream(PIPELINE_OK);
2119 2119
2120 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); 2120 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK));
2121 2121
2122 GenerateExpectedReads(0, 4); 2122 GenerateExpectedReads(0, 4);
2123 GenerateExpectedReads(46, 66, 5); 2123 GenerateExpectedReads(46, 66, 5);
2124 2124
2125 EndOfStreamHelper end_of_stream_helper(demuxer_.get()); 2125 EndOfStreamHelper end_of_stream_helper(demuxer_.get());
2126 end_of_stream_helper.RequestReads(); 2126 end_of_stream_helper.RequestReads();
2127 end_of_stream_helper.CheckIfReadDonesWereCalled(true); 2127 end_of_stream_helper.CheckIfReadDonesWereCalled(true);
2128 } 2128 }
2129 2129
2130 TEST_F(ChunkDemuxerTest, TestConfigChange_Video) { 2130 TEST_F(ChunkDemuxerTest, ConfigChange_Video) {
2131 InSequence s; 2131 InSequence s;
2132 2132
2133 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2133 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2134 2134
2135 DemuxerStream::Status status; 2135 DemuxerStream::Status status;
2136 base::TimeDelta last_timestamp; 2136 base::TimeDelta last_timestamp;
2137 2137
2138 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); 2138 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
2139 2139
2140 // Fetch initial video config and verify it matches what we expect. 2140 // Fetch initial video config and verify it matches what we expect.
(...skipping 26 matching lines...) Expand all
2167 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); 2167 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
2168 2168
2169 ExpectRead(DemuxerStream::VIDEO, 801); 2169 ExpectRead(DemuxerStream::VIDEO, 801);
2170 2170
2171 // Read until the end of the stream just to make sure there aren't any other 2171 // Read until the end of the stream just to make sure there aren't any other
2172 // config changes. 2172 // config changes.
2173 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 2173 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
2174 ASSERT_EQ(status, DemuxerStream::kOk); 2174 ASSERT_EQ(status, DemuxerStream::kOk);
2175 } 2175 }
2176 2176
2177 TEST_F(ChunkDemuxerTest, TestConfigChange_Audio) { 2177 TEST_F(ChunkDemuxerTest, ConfigChange_Audio) {
2178 InSequence s; 2178 InSequence s;
2179 2179
2180 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2180 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2181 2181
2182 DemuxerStream::Status status; 2182 DemuxerStream::Status status;
2183 base::TimeDelta last_timestamp; 2183 base::TimeDelta last_timestamp;
2184 2184
2185 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); 2185 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO);
2186 2186
2187 // Fetch initial audio config and verify it matches what we expect. 2187 // Fetch initial audio config and verify it matches what we expect.
(...skipping 26 matching lines...) Expand all
2214 ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config())); 2214 ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config()));
2215 2215
2216 ExpectRead(DemuxerStream::AUDIO, 779); 2216 ExpectRead(DemuxerStream::AUDIO, 779);
2217 2217
2218 // Read until the end of the stream just to make sure there aren't any other 2218 // Read until the end of the stream just to make sure there aren't any other
2219 // config changes. 2219 // config changes.
2220 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 2220 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
2221 ASSERT_EQ(status, DemuxerStream::kOk); 2221 ASSERT_EQ(status, DemuxerStream::kOk);
2222 } 2222 }
2223 2223
2224 TEST_F(ChunkDemuxerTest, TestConfigChange_Seek) { 2224 TEST_F(ChunkDemuxerTest, ConfigChange_Seek) {
2225 InSequence s; 2225 InSequence s;
2226 2226
2227 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); 2227 ASSERT_TRUE(InitDemuxerWithConfigChangeData());
2228 2228
2229 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); 2229 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO);
2230 2230
2231 // Fetch initial video config and verify it matches what we expect. 2231 // Fetch initial video config and verify it matches what we expect.
2232 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); 2232 const VideoDecoderConfig& video_config_1 = video->video_decoder_config();
2233 ASSERT_TRUE(video_config_1.IsValidConfig()); 2233 ASSERT_TRUE(video_config_1.IsValidConfig());
2234 EXPECT_EQ(video_config_1.natural_size().width(), 320); 2234 EXPECT_EQ(video_config_1.natural_size().width(), 320);
(...skipping 26 matching lines...) Expand all
2261 // seek to a new location that has the same configuration as 2261 // seek to a new location that has the same configuration as
2262 // the start of the file without a Read() in the middle. 2262 // the start of the file without a Read() in the middle.
2263 Seek(base::TimeDelta::FromMilliseconds(527)); 2263 Seek(base::TimeDelta::FromMilliseconds(527));
2264 Seek(base::TimeDelta::FromMilliseconds(801)); 2264 Seek(base::TimeDelta::FromMilliseconds(801));
2265 2265
2266 // Verify that no config change is signalled. 2266 // Verify that no config change is signalled.
2267 ExpectRead(DemuxerStream::VIDEO, 801); 2267 ExpectRead(DemuxerStream::VIDEO, 801);
2268 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); 2268 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
2269 } 2269 }
2270 2270
2271 TEST_F(ChunkDemuxerTest, TestTimestampPositiveOffset) { 2271 TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) {
2272 ASSERT_TRUE(InitDemuxer(true, true)); 2272 ASSERT_TRUE(InitDemuxer(true, true));
2273 2273
2274 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2274 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2275 kSourceId, base::TimeDelta::FromSeconds(30))); 2275 kSourceId, base::TimeDelta::FromSeconds(30)));
2276 AppendCluster(GenerateCluster(0, 2)); 2276 AppendCluster(GenerateCluster(0, 2));
2277 2277
2278 Seek(base::TimeDelta::FromMilliseconds(30000)); 2278 Seek(base::TimeDelta::FromMilliseconds(30000));
2279 2279
2280 GenerateExpectedReads(30000, 2); 2280 GenerateExpectedReads(30000, 2);
2281 } 2281 }
2282 2282
2283 TEST_F(ChunkDemuxerTest, TestTimestampNegativeOffset) { 2283 TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) {
2284 ASSERT_TRUE(InitDemuxer(true, true)); 2284 ASSERT_TRUE(InitDemuxer(true, true));
2285 2285
2286 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2286 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2287 kSourceId, base::TimeDelta::FromSeconds(-1))); 2287 kSourceId, base::TimeDelta::FromSeconds(-1)));
2288 AppendCluster(GenerateCluster(1000, 2)); 2288 AppendCluster(GenerateCluster(1000, 2));
2289 2289
2290 GenerateExpectedReads(0, 2); 2290 GenerateExpectedReads(0, 2);
2291 } 2291 }
2292 2292
2293 TEST_F(ChunkDemuxerTest, TestTimestampOffsetSeparateStreams) { 2293 TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) {
2294 std::string audio_id = "audio1"; 2294 std::string audio_id = "audio1";
2295 std::string video_id = "video1"; 2295 std::string video_id = "video1";
2296 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2296 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2297 2297
2298 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2298 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2299 audio_id, base::TimeDelta::FromMilliseconds(-2500))); 2299 audio_id, base::TimeDelta::FromMilliseconds(-2500)));
2300 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2300 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2301 video_id, base::TimeDelta::FromMilliseconds(-2500))); 2301 video_id, base::TimeDelta::FromMilliseconds(-2500)));
2302 AppendCluster(audio_id, GenerateSingleStreamCluster(2500, 2302 AppendCluster(audio_id, GenerateSingleStreamCluster(2500,
2303 2500 + kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); 2303 2500 + kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration));
2304 AppendCluster(video_id, GenerateSingleStreamCluster(2500, 2304 AppendCluster(video_id, GenerateSingleStreamCluster(2500,
2305 2500 + kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); 2305 2500 + kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration));
2306 GenerateAudioStreamExpectedReads(0, 4); 2306 GenerateAudioStreamExpectedReads(0, 4);
2307 GenerateVideoStreamExpectedReads(0, 4); 2307 GenerateVideoStreamExpectedReads(0, 4);
2308 2308
2309 Seek(base::TimeDelta::FromMilliseconds(27300)); 2309 Seek(base::TimeDelta::FromMilliseconds(27300));
2310 2310
2311 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2311 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2312 audio_id, base::TimeDelta::FromMilliseconds(27300))); 2312 audio_id, base::TimeDelta::FromMilliseconds(27300)));
2313 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2313 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2314 video_id, base::TimeDelta::FromMilliseconds(27300))); 2314 video_id, base::TimeDelta::FromMilliseconds(27300)));
2315 AppendCluster(audio_id, GenerateSingleStreamCluster( 2315 AppendCluster(audio_id, GenerateSingleStreamCluster(
2316 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); 2316 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration));
2317 AppendCluster(video_id, GenerateSingleStreamCluster( 2317 AppendCluster(video_id, GenerateSingleStreamCluster(
2318 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); 2318 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration));
2319 GenerateVideoStreamExpectedReads(27300, 4); 2319 GenerateVideoStreamExpectedReads(27300, 4);
2320 GenerateAudioStreamExpectedReads(27300, 4); 2320 GenerateAudioStreamExpectedReads(27300, 4);
2321 } 2321 }
2322 2322
2323 TEST_F(ChunkDemuxerTest, TestTimestampOffsetMidParse) { 2323 TEST_F(ChunkDemuxerTest, TimestampOffsetMidParse) {
2324 ASSERT_TRUE(InitDemuxer(true, true)); 2324 ASSERT_TRUE(InitDemuxer(true, true));
2325 2325
2326 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); 2326 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2);
2327 // Append only part of the cluster data. 2327 // Append only part of the cluster data.
2328 AppendData(cluster->data(), cluster->size() - 13); 2328 AppendData(cluster->data(), cluster->size() - 13);
2329 2329
2330 // Setting a timestamp should fail because we're in the middle of a cluster. 2330 // Setting a timestamp should fail because we're in the middle of a cluster.
2331 ASSERT_FALSE(demuxer_->SetTimestampOffset( 2331 ASSERT_FALSE(demuxer_->SetTimestampOffset(
2332 kSourceId, base::TimeDelta::FromSeconds(25))); 2332 kSourceId, base::TimeDelta::FromSeconds(25)));
2333 2333
2334 demuxer_->Abort(kSourceId); 2334 demuxer_->Abort(kSourceId);
2335 // After Abort(), setting a timestamp should succeed since we're no longer 2335 // After Abort(), setting a timestamp should succeed since we're no longer
2336 // in the middle of a cluster 2336 // in the middle of a cluster
2337 ASSERT_TRUE(demuxer_->SetTimestampOffset( 2337 ASSERT_TRUE(demuxer_->SetTimestampOffset(
2338 kSourceId, base::TimeDelta::FromSeconds(25))); 2338 kSourceId, base::TimeDelta::FromSeconds(25)));
2339 } 2339 }
2340 2340
2341 TEST_F(ChunkDemuxerTest, TestDurationChange) { 2341 TEST_F(ChunkDemuxerTest, DurationChange) {
2342 ASSERT_TRUE(InitDemuxer(true, true)); 2342 ASSERT_TRUE(InitDemuxer(true, true));
2343 static const int kStreamDuration = kDefaultDuration().InMilliseconds(); 2343 static const int kStreamDuration = kDefaultDuration().InMilliseconds();
2344 2344
2345 // Add data leading up to the currently set duration. 2345 // Add data leading up to the currently set duration.
2346 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration, 2346 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration,
2347 kStreamDuration - kVideoBlockDuration, 2347 kStreamDuration - kVideoBlockDuration,
2348 2)); 2348 2));
2349 2349
2350 CheckExpectedRanges(kSourceId, "{ [201191,201224) }"); 2350 CheckExpectedRanges(kSourceId, "{ [201191,201224) }");
2351 2351
2352 // Add data at the currently set duration. The duration should not increase. 2352 // Add data at the currently set duration. The duration should not increase.
2353 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2)); 2353 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2));
2354 2354
2355 // Range should not be affected. 2355 // Range should not be affected.
2356 CheckExpectedRanges(kSourceId, "{ [201191,201224) }"); 2356 CheckExpectedRanges(kSourceId, "{ [201191,201224) }");
2357 2357
2358 // Now add data past the duration and expect a new duration to be signalled. 2358 // Now add data past the duration and expect a new duration to be signalled.
2359 static const int kNewStreamDuration = 2359 static const int kNewStreamDuration =
2360 kStreamDuration + kAudioBlockDuration * 2; 2360 kStreamDuration + kAudioBlockDuration * 2;
2361 EXPECT_CALL(host_, SetDuration( 2361 EXPECT_CALL(host_, SetDuration(
2362 base::TimeDelta::FromMilliseconds(kNewStreamDuration))); 2362 base::TimeDelta::FromMilliseconds(kNewStreamDuration)));
2363 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration, 2363 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration,
2364 kStreamDuration + kVideoBlockDuration, 2364 kStreamDuration + kVideoBlockDuration,
2365 2)); 2365 2));
2366 2366
2367 // See that the range has increased appropriately. 2367 // See that the range has increased appropriately.
2368 CheckExpectedRanges(kSourceId, "{ [201191,201270) }"); 2368 CheckExpectedRanges(kSourceId, "{ [201191,201270) }");
2369 } 2369 }
2370 2370
2371 TEST_F(ChunkDemuxerTest, TestDurationChangeTimestampOffset) { 2371 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) {
2372 ASSERT_TRUE(InitDemuxer(true, true)); 2372 ASSERT_TRUE(InitDemuxer(true, true));
2373 2373
2374 ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, kDefaultDuration())); 2374 ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, kDefaultDuration()));
2375 2375
2376 EXPECT_CALL(host_, SetDuration( 2376 EXPECT_CALL(host_, SetDuration(
2377 kDefaultDuration() + base::TimeDelta::FromMilliseconds( 2377 kDefaultDuration() + base::TimeDelta::FromMilliseconds(
2378 kAudioBlockDuration * 2))); 2378 kAudioBlockDuration * 2)));
2379 AppendCluster(GenerateCluster(0, 4)); 2379 AppendCluster(GenerateCluster(0, 4));
2380 } 2380 }
2381 2381
2382 TEST_F(ChunkDemuxerTest, TestEndOfStreamTruncateDuration) { 2382 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) {
2383 ASSERT_TRUE(InitDemuxer(true, true)); 2383 ASSERT_TRUE(InitDemuxer(true, true));
2384 2384
2385 AppendCluster(kDefaultFirstCluster()); 2385 AppendCluster(kDefaultFirstCluster());
2386 2386
2387 EXPECT_CALL(host_, SetDuration( 2387 EXPECT_CALL(host_, SetDuration(
2388 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); 2388 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp)));
2389 MarkEndOfStream(PIPELINE_OK); 2389 MarkEndOfStream(PIPELINE_OK);
2390 } 2390 }
2391 2391
2392 2392
2393 TEST_F(ChunkDemuxerTest, TestZeroLengthAppend) { 2393 TEST_F(ChunkDemuxerTest, ZeroLengthAppend) {
2394 ASSERT_TRUE(InitDemuxer(true, true)); 2394 ASSERT_TRUE(InitDemuxer(true, true));
2395 AppendData(NULL, 0); 2395 AppendData(NULL, 0);
2396 } 2396 }
2397 2397
2398 TEST_F(ChunkDemuxerTest, TestAppendAfterEndOfStream) { 2398 TEST_F(ChunkDemuxerTest, AppendAfterEndOfStream) {
2399 ASSERT_TRUE(InitDemuxer(true, true)); 2399 ASSERT_TRUE(InitDemuxer(true, true));
2400 2400
2401 EXPECT_CALL(host_, SetDuration(_)) 2401 EXPECT_CALL(host_, SetDuration(_))
2402 .Times(AnyNumber()); 2402 .Times(AnyNumber());
2403 2403
2404 AppendCluster(kDefaultFirstCluster()); 2404 AppendCluster(kDefaultFirstCluster());
2405 MarkEndOfStream(PIPELINE_OK); 2405 MarkEndOfStream(PIPELINE_OK);
2406 2406
2407 demuxer_->UnmarkEndOfStream(); 2407 demuxer_->UnmarkEndOfStream();
2408 2408
2409 AppendCluster(kDefaultSecondCluster()); 2409 AppendCluster(kDefaultSecondCluster());
2410 MarkEndOfStream(PIPELINE_OK); 2410 MarkEndOfStream(PIPELINE_OK);
2411 } 2411 }
2412 2412
2413 // Test receiving a Shutdown() call before we get an Initialize() 2413 // Test receiving a Shutdown() call before we get an Initialize()
2414 // call. This can happen if video element gets destroyed before 2414 // call. This can happen if video element gets destroyed before
2415 // the pipeline has a chance to initialize the demuxer. 2415 // the pipeline has a chance to initialize the demuxer.
2416 TEST_F(ChunkDemuxerTest, TestShutdownBeforeInitialize) { 2416 TEST_F(ChunkDemuxerTest, ShutdownBeforeInitialize) {
2417 demuxer_->Shutdown(); 2417 demuxer_->Shutdown();
2418 demuxer_->Initialize( 2418 demuxer_->Initialize(
2419 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 2419 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN));
2420 message_loop_.RunUntilIdle(); 2420 message_loop_.RunUntilIdle();
2421 } 2421 }
2422 2422
2423 TEST_F(ChunkDemuxerTest, ReadAfterAudioDisabled) { 2423 TEST_F(ChunkDemuxerTest, ReadAfterAudioDisabled) {
2424 ASSERT_TRUE(InitDemuxer(true, true)); 2424 ASSERT_TRUE(InitDemuxer(true, true));
2425 AppendCluster(kDefaultFirstCluster()); 2425 AppendCluster(kDefaultFirstCluster());
2426 2426
2427 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 2427 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
2428 ASSERT_TRUE(stream); 2428 ASSERT_TRUE(stream);
2429 2429
2430 // The stream should no longer be present. 2430 // The stream should no longer be present.
2431 demuxer_->OnAudioRendererDisabled(); 2431 demuxer_->OnAudioRendererDisabled();
2432 ASSERT_FALSE(demuxer_->GetStream(DemuxerStream::AUDIO)); 2432 ASSERT_FALSE(demuxer_->GetStream(DemuxerStream::AUDIO));
2433 2433
2434 // Normally this would return an audio buffer at timestamp zero, but 2434 // Normally this would return an audio buffer at timestamp zero, but
2435 // all reads should return EOS buffers when disabled. 2435 // all reads should return EOS buffers when disabled.
2436 bool audio_read_done = false; 2436 bool audio_read_done = false;
2437 stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); 2437 stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
2438 message_loop_.RunUntilIdle(); 2438 message_loop_.RunUntilIdle();
2439 2439
2440 EXPECT_TRUE(audio_read_done); 2440 EXPECT_TRUE(audio_read_done);
2441 } 2441 }
2442 2442
2443 // Verifies that signalling end of stream while stalled at a gap 2443 // Verifies that signalling end of stream while stalled at a gap
2444 // boundary does not trigger end of stream buffers to be returned. 2444 // boundary does not trigger end of stream buffers to be returned.
2445 TEST_F(ChunkDemuxerTest, TestEndOfStreamWhileWaitingForGapToBeFilled) { 2445 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) {
2446 ASSERT_TRUE(InitDemuxer(true, true)); 2446 ASSERT_TRUE(InitDemuxer(true, true));
2447 2447
2448 AppendCluster(0, 10); 2448 AppendCluster(0, 10);
2449 AppendCluster(300, 10); 2449 AppendCluster(300, 10);
2450 CheckExpectedRanges(kSourceId, "{ [0,132) [300,432) }"); 2450 CheckExpectedRanges(kSourceId, "{ [0,132) [300,432) }");
2451 2451
2452 2452
2453 GenerateExpectedReads(0, 10); 2453 GenerateExpectedReads(0, 10);
2454 2454
2455 bool audio_read_done = false; 2455 bool audio_read_done = false;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2498 // Verify that the reads don't complete. 2498 // Verify that the reads don't complete.
2499 EXPECT_FALSE(audio_read_done); 2499 EXPECT_FALSE(audio_read_done);
2500 EXPECT_FALSE(video_read_done); 2500 EXPECT_FALSE(video_read_done);
2501 2501
2502 MarkEndOfStream(PIPELINE_OK); 2502 MarkEndOfStream(PIPELINE_OK);
2503 2503
2504 EXPECT_TRUE(audio_read_done); 2504 EXPECT_TRUE(audio_read_done);
2505 EXPECT_TRUE(video_read_done); 2505 EXPECT_TRUE(video_read_done);
2506 } 2506 }
2507 2507
2508 TEST_F(ChunkDemuxerTest, TestCanceledSeekDuringInitialPreroll) { 2508 TEST_F(ChunkDemuxerTest, CanceledSeekDuringInitialPreroll) {
2509 ASSERT_TRUE(InitDemuxer(true, true)); 2509 ASSERT_TRUE(InitDemuxer(true, true));
2510 2510
2511 // Cancel preroll. 2511 // Cancel preroll.
2512 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200); 2512 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200);
2513 demuxer_->CancelPendingSeek(seek_time); 2513 demuxer_->CancelPendingSeek(seek_time);
2514 2514
2515 // Initiate the seek to the new location. 2515 // Initiate the seek to the new location.
2516 Seek(seek_time); 2516 Seek(seek_time);
2517 2517
2518 // Append data to satisfy the seek. 2518 // Append data to satisfy the seek.
2519 AppendCluster(seek_time.InMilliseconds(), 10); 2519 AppendCluster(seek_time.InMilliseconds(), 10);
2520 } 2520 }
2521 2521
2522 TEST_F(ChunkDemuxerTest, TestGCDuringSeek) { 2522 TEST_F(ChunkDemuxerTest, GCDuringSeek) {
2523 ASSERT_TRUE(InitDemuxer(true, false)); 2523 ASSERT_TRUE(InitDemuxer(true, false));
2524 2524
2525 demuxer_->SetMemoryLimitsForTesting(5 * kBlockSize); 2525 demuxer_->SetMemoryLimitsForTesting(5 * kBlockSize);
2526 2526
2527 base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(1000); 2527 base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(1000);
2528 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(500); 2528 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(500);
2529 2529
2530 // Initiate a seek to |seek_time1|. 2530 // Initiate a seek to |seek_time1|.
2531 Seek(seek_time1); 2531 Seek(seek_time1);
2532 2532
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2606 2606
2607 TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) { 2607 TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) {
2608 ASSERT_TRUE(InitDemuxer(true, true)); 2608 ASSERT_TRUE(InitDemuxer(true, true));
2609 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 2609 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
2610 AppendGarbage(); 2610 AppendGarbage();
2611 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50); 2611 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50);
2612 demuxer_->StartWaitingForSeek(seek_time); 2612 demuxer_->StartWaitingForSeek(seek_time);
2613 } 2613 }
2614 2614
2615 } // namespace media 2615 } // namespace media
OLDNEW
« no previous file with comments | « media/ffmpeg/ffmpeg_common_unittest.cc ('k') | media/mp4/aac_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698