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

Side by Side Diff: media/formats/webm/webm_cluster_parser_unittest.cc

Issue 1018373003: Improving WebM video duration estimation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing try failure, remove unused variable for some builds. Created 5 years, 8 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
« no previous file with comments | « media/formats/webm/webm_cluster_parser.cc ('k') | media/test/pipeline_integration_test.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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include <cstdlib> 6 #include <cstdlib>
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 // Now parse a whole cluster to verify that all the blocks will get parsed. 796 // Now parse a whole cluster to verify that all the blocks will get parsed.
797 result = parser_->Parse(cluster->data(), cluster->size()); 797 result = parser_->Parse(cluster->data(), cluster->size());
798 EXPECT_EQ(cluster->size(), result); 798 EXPECT_EQ(cluster->size(), result);
799 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); 799 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
800 } 800 }
801 801
802 TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsSimpleBlocks) { 802 TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsSimpleBlocks) {
803 InSequence s; 803 InSequence s;
804 804
805 // Absent DefaultDuration information, SimpleBlock durations are derived from 805 // Absent DefaultDuration information, SimpleBlock durations are derived from
806 // inter-buffer track timestamp delta if within the cluster, and are estimated 806 // inter-buffer track timestamp delta if within the cluster. Duration for the
807 // as the lowest non-zero duration seen so far if the last buffer in the track 807 // last block in a cluster is estimated independently for each track in the
808 // in the cluster (independently for each track in the cluster). 808 // cluster. For video tracks we use the maximum seen so far. For audio we use
809 // the the minimum.
810 // TODO(chcunningham): Move audio over to use the maximum.
809 const BlockInfo kBlockInfo1[] = { 811 const BlockInfo kBlockInfo1[] = {
810 {kAudioTrackNum, 0, 23, true, NULL, 0}, 812 {kAudioTrackNum, 0, 23, true, NULL, 0},
811 {kAudioTrackNum, 23, 22, true, NULL, 0}, 813 {kAudioTrackNum, 23, 22, true, NULL, 0},
812 {kVideoTrackNum, 33, 33, true, NULL, 0}, 814 {kVideoTrackNum, 33, 33, true, NULL, 0},
813 {kAudioTrackNum, 45, 23, true, NULL, 0}, 815 {kAudioTrackNum, 45, 23, true, NULL, 0},
814 {kVideoTrackNum, 66, 34, true, NULL, 0}, 816 {kVideoTrackNum, 66, 34, true, NULL, 0},
815 // Estimated from minimum audio dur 817 // Estimated from minimum audio dur
816 {kAudioTrackNum, 68, 22, true, NULL, 0}, 818 {kAudioTrackNum, 68, 22, true, NULL, 0},
817 // Estimated from minimum video dur 819 // Estimated from maximum video dur
818 {kVideoTrackNum, 100, 33, true, NULL, 0}, 820 {kVideoTrackNum, 100, 34, true, NULL, 0},
819 }; 821 };
820 822
821 int block_count1 = arraysize(kBlockInfo1); 823 int block_count1 = arraysize(kBlockInfo1);
822 scoped_ptr<Cluster> cluster1(CreateCluster(0, kBlockInfo1, block_count1)); 824 scoped_ptr<Cluster> cluster1(CreateCluster(0, kBlockInfo1, block_count1));
823 825
824 // Send slightly less than the first full cluster so all but the last video 826 // Send slightly less than the first full cluster so all but the last video
825 // block is parsed. Verify the last fully parsed audio and video buffer are 827 // block is parsed. Verify the last fully parsed audio and video buffer are
826 // both missing from the result (parser should hold them aside for duration 828 // both missing from the result (parser should hold them aside for duration
827 // estimation prior to end of cluster detection in the absence of 829 // estimation prior to end of cluster detection in the absence of
828 // DefaultDurations.) 830 // DefaultDurations.)
(...skipping 10 matching lines...) Expand all
839 result = parser_->Parse(cluster1->data(), cluster1->size()); 841 result = parser_->Parse(cluster1->data(), cluster1->size());
840 EXPECT_EQ(cluster1->size(), result); 842 EXPECT_EQ(cluster1->size(), result);
841 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1)); 843 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1));
842 844
843 // Verify that the estimated frame duration is tracked across clusters for 845 // Verify that the estimated frame duration is tracked across clusters for
844 // each track. 846 // each track.
845 const BlockInfo kBlockInfo2[] = { 847 const BlockInfo kBlockInfo2[] = {
846 // Estimate carries over across clusters 848 // Estimate carries over across clusters
847 {kAudioTrackNum, 200, 22, true, NULL, 0}, 849 {kAudioTrackNum, 200, 22, true, NULL, 0},
848 // Estimate carries over across clusters 850 // Estimate carries over across clusters
849 {kVideoTrackNum, 201, 33, true, NULL, 0}, 851 {kVideoTrackNum, 201, 34, true, NULL, 0},
850 }; 852 };
851 853
852 int block_count2 = arraysize(kBlockInfo2); 854 int block_count2 = arraysize(kBlockInfo2);
853 scoped_ptr<Cluster> cluster2(CreateCluster(0, kBlockInfo2, block_count2)); 855 scoped_ptr<Cluster> cluster2(CreateCluster(0, kBlockInfo2, block_count2));
854 result = parser_->Parse(cluster2->data(), cluster2->size()); 856 result = parser_->Parse(cluster2->data(), cluster2->size());
855 EXPECT_EQ(cluster2->size(), result); 857 EXPECT_EQ(cluster2->size(), result);
856 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo2, block_count2)); 858 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo2, block_count2));
857 } 859 }
858 860
859 TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsBlockGroups) { 861 TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsBlockGroups) {
860 InSequence s; 862 InSequence s;
861 863
862 // Absent DefaultDuration and BlockDuration information, BlockGroup block 864 // Absent DefaultDuration and BlockDuration information, BlockGroup block
863 // durations are derived from inter-buffer track timestamp delta if within the 865 // durations are derived from inter-buffer track timestamp delta if within the
864 // cluster, and are estimated as the lowest non-zero duration seen so far if 866 // cluster. Duration for the last block in a cluster is estimated
865 // the last buffer in the track in the cluster (independently for each track 867 // independently for each track in the cluster. For video tracks we use the
866 // in the cluster). 868 // maximum seen so far. For audio we use the the minimum.
869 // TODO(chcunningham): Move audio over to use the maximum.
867 const BlockInfo kBlockInfo1[] = { 870 const BlockInfo kBlockInfo1[] = {
868 {kAudioTrackNum, 0, -23, false, NULL, 0}, 871 {kAudioTrackNum, 0, -23, false, NULL, 0},
869 {kAudioTrackNum, 23, -22, false, NULL, 0}, 872 {kAudioTrackNum, 23, -22, false, NULL, 0},
870 {kVideoTrackNum, 33, -33, false, NULL, 0}, 873 {kVideoTrackNum, 33, -33, false, NULL, 0},
871 {kAudioTrackNum, 45, -23, false, NULL, 0}, 874 {kAudioTrackNum, 45, -23, false, NULL, 0},
872 {kVideoTrackNum, 66, -34, false, NULL, 0}, 875 {kVideoTrackNum, 66, -34, false, NULL, 0},
873 // Estimated from minimum audio dur 876 // Estimated from minimum audio dur
874 {kAudioTrackNum, 68, -22, false, NULL, 0}, 877 {kAudioTrackNum, 68, -22, false, NULL, 0},
875 // Estimated from minimum video dur 878 // Estimated from maximum video dur
876 {kVideoTrackNum, 100, -33, false, NULL, 0}, 879 {kVideoTrackNum, 100, -34, false, NULL, 0},
877 }; 880 };
878 881
879 int block_count1 = arraysize(kBlockInfo1); 882 int block_count1 = arraysize(kBlockInfo1);
880 scoped_ptr<Cluster> cluster1(CreateCluster(0, kBlockInfo1, block_count1)); 883 scoped_ptr<Cluster> cluster1(CreateCluster(0, kBlockInfo1, block_count1));
881 884
882 // Send slightly less than the first full cluster so all but the last video 885 // Send slightly less than the first full cluster so all but the last video
883 // block is parsed. Verify the last fully parsed audio and video buffer are 886 // block is parsed. Verify the last fully parsed audio and video buffer are
884 // both missing from the result (parser should hold them aside for duration 887 // both missing from the result (parser should hold them aside for duration
885 // estimation prior to end of cluster detection in the absence of 888 // estimation prior to end of cluster detection in the absence of
886 // DefaultDurations.) 889 // DefaultDurations.)
887 int result = parser_->Parse(cluster1->data(), cluster1->size() - 1); 890 int result = parser_->Parse(cluster1->data(), cluster1->size() - 1);
888 EXPECT_GT(result, 0); 891 EXPECT_GT(result, 0);
889 EXPECT_LT(result, cluster1->size()); 892 EXPECT_LT(result, cluster1->size());
890 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1 - 3)); 893 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1 - 3));
891 EXPECT_EQ(3UL, parser_->GetAudioBuffers().size()); 894 EXPECT_EQ(3UL, parser_->GetAudioBuffers().size());
892 EXPECT_EQ(1UL, parser_->GetVideoBuffers().size()); 895 EXPECT_EQ(1UL, parser_->GetVideoBuffers().size());
893 896
894 parser_->Reset(); 897 parser_->Reset();
895 898
896 // Now parse the full first cluster and verify all the blocks are parsed. 899 // Now parse the full first cluster and verify all the blocks are parsed.
897 result = parser_->Parse(cluster1->data(), cluster1->size()); 900 result = parser_->Parse(cluster1->data(), cluster1->size());
898 EXPECT_EQ(cluster1->size(), result); 901 EXPECT_EQ(cluster1->size(), result);
899 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1)); 902 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1));
900 903
901 // Verify that the estimated frame duration is tracked across clusters for 904 // Verify that the estimated frame duration is tracked across clusters for
902 // each track. 905 // each track.
903 const BlockInfo kBlockInfo2[] = { 906 const BlockInfo kBlockInfo2[] = {
904 {kAudioTrackNum, 200, -22, false, NULL, 0}, 907 {kAudioTrackNum, 200, -22, false, NULL, 0},
905 {kVideoTrackNum, 201, -33, false, NULL, 0}, 908 {kVideoTrackNum, 201, -34, false, NULL, 0},
906 }; 909 };
907 910
908 int block_count2 = arraysize(kBlockInfo2); 911 int block_count2 = arraysize(kBlockInfo2);
909 scoped_ptr<Cluster> cluster2(CreateCluster(0, kBlockInfo2, block_count2)); 912 scoped_ptr<Cluster> cluster2(CreateCluster(0, kBlockInfo2, block_count2));
910 result = parser_->Parse(cluster2->data(), cluster2->size()); 913 result = parser_->Parse(cluster2->data(), cluster2->size());
911 EXPECT_EQ(cluster2->size(), result); 914 EXPECT_EQ(cluster2->size(), result);
912 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo2, block_count2)); 915 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo2, block_count2));
913 } 916 }
914 917
915 // TODO(wolenetz): Is parser behavior correct? See http://crbug.com/363433. 918 // TODO(wolenetz): Is parser behavior correct? See http://crbug.com/363433.
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 int block_count = arraysize(kBlockInfo); 1085 int block_count = arraysize(kBlockInfo);
1083 scoped_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); 1086 scoped_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
1084 int result = parser_->Parse(cluster->data(), cluster->size()); 1087 int result = parser_->Parse(cluster->data(), cluster->size());
1085 EXPECT_EQ(cluster->size(), result); 1088 EXPECT_EQ(cluster->size(), result);
1086 1089
1087 // Will verify that duration of buffer matches that of BlockDuration. 1090 // Will verify that duration of buffer matches that of BlockDuration.
1088 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); 1091 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
1089 } 1092 }
1090 1093
1091 } // namespace media 1094 } // namespace media
OLDNEW
« no previous file with comments | « media/formats/webm/webm_cluster_parser.cc ('k') | media/test/pipeline_integration_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698