1 // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2 //
3 // Use of this source code is governed by a BSD-style license
4 // that can be found in the LICENSE file in the root of the source
5 // tree. An additional intellectual property rights grant can be found
6 // in the file PATENTS.  All contributing project authors may
7 // be found in the AUTHORS file in the root of the source tree.
8 #ifndef LIBWEBM_TESTING_TEST_UTIL_H_
9 #define LIBWEBM_TESTING_TEST_UTIL_H_
10 
11 #include <stdint.h>
12 
13 #include <cstddef>
14 #include <string>
15 
16 namespace mkvparser {
17 class IMkvReader;
18 class MkvReader;
19 class Segment;
20 }  // namespace mkvparser
21 
22 namespace test {
23 
24 // constants for muxer and parser tests
25 const char kAppString[] = "mkvmuxer_unit_tests";
26 const char kOpusCodecId[] = "A_OPUS";
27 const char kVorbisCodecId[] = "A_VORBIS";
28 const int kAudioTrackNumber = 2;
29 const int kBitDepth = 2;
30 const int kChannels = 2;
31 const double kDuration = 2.345;
32 const int kFrameLength = 10;
33 const int kHeight = 180;
34 const int kInvalidTrackNumber = 100;
35 const std::uint64_t kOpusCodecDelay = 6500000;
36 const std::size_t kOpusPrivateDataSizeMinimum = 19;
37 const std::uint64_t kOpusSeekPreroll = 80000000;
38 const char kMetadataCodecId[] = "D_WEBVTT/METADATA";
39 const int kMetadataTrackNumber = 3;
40 const int kMetadataTrackType = 0x21;
41 const int kSampleRate = 30;
42 const int kTimeCodeScale = 1000;
43 const char kTrackName[] = "unit_test";
44 const char kVP8CodecId[] = "V_VP8";
45 const char kVP9CodecId[] = "V_VP9";
46 const double kVideoFrameRate = 0.5;
47 const int kVideoTrackNumber = 1;
48 const int kWidth = 320;
49 
50 // Returns the path to the test data directory by reading and returning the
51 // contents the LIBWEBM_TESTDATA_DIR environment variable.
52 std::string GetTestDataDir();
53 
54 // Returns the absolute path to the file of |name| in LIBWEBM_TESTDATA_DIR.
55 std::string GetTestFilePath(const std::string& name);
56 
57 // Byte-wise comparison of two files |file1| and |file2|. Returns true if the
58 // files match exactly, false otherwise.
59 bool CompareFiles(const std::string& file1, const std::string& file2);
60 
61 // Returns true and sets |cues_offset| to the cues location within the MKV file
62 // parsed by |segment| when the MKV file has cue points.
63 bool HasCuePoints(const mkvparser::Segment* segment, std::int64_t* cues_offset);
64 
65 // Validates cue points. Assumes caller has already called Load() on |segment|.
66 // Returns true when:
67 //  All cue points point at clusters, OR
68 //  Data parsed by |segment| has no cue points.
69 bool ValidateCues(mkvparser::Segment* segment, mkvparser::IMkvReader* reader);
70 
71 // Parses |webm_file| using mkvparser and returns true when file parses
72 // successfully (all clusters and blocks can be successfully walked). Second
73 // variant allows further interaction with the parsed file via transferring
74 // ownership of the mkvparser Segment and MkvReader to the caller via
75 // |parser_out|.
76 struct MkvParser {
77   MkvParser() = default;
78   ~MkvParser();
79   mkvparser::Segment* segment = nullptr;
80   mkvparser::MkvReader* reader = nullptr;
81 };
82 bool ParseMkvFile(const std::string& webm_file);
83 bool ParseMkvFileReleaseParser(const std::string& webm_file,
84                                MkvParser* parser_out);
85 
86 }  // namespace test
87 
88 #endif  // LIBWEBM_TESTING_TEST_UTIL_H_