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 <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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |