Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/media/mediasource/gtest/TestContainerParser.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* This Source Code Form is subject to the terms of the Mozilla Public
3
 * License, v. 2.0. If a copy of the MPL was not distributed with this
4
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6
#include <gtest/gtest.h>
7
#include <stdint.h>
8
9
#include "ContainerParser.h"
10
#include "mozilla/ArrayUtils.h"
11
#include "nsAutoPtr.h"
12
13
using namespace mozilla;
14
15
0
TEST(ContainerParser, MIMETypes) {
16
0
  const char* containerTypes[] = {
17
0
    "video/webm",
18
0
    "audio/webm",
19
0
    "video/mp4",
20
0
    "audio/mp4",
21
0
    "audio/aac"
22
0
  };
23
0
  nsAutoPtr<ContainerParser> parser;
24
0
  for (size_t i = 0; i < ArrayLength(containerTypes); ++i) {
25
0
    Maybe<MediaContainerType> containerType = MakeMediaContainerType(containerTypes[i]);
26
0
    ASSERT_TRUE(containerType.isSome());
27
0
    parser = ContainerParser::CreateForMIMEType(*containerType);
28
0
    ASSERT_NE(parser, nullptr);
29
0
  }
30
0
}
31
32
33
already_AddRefed<MediaByteBuffer> make_adts_header()
34
0
{
35
0
  const uint8_t test[] = { 0xff, 0xf1, 0x50, 0x80, 0x03, 0x1f, 0xfc };
36
0
  RefPtr<MediaByteBuffer> buffer(new MediaByteBuffer);
37
0
  buffer->AppendElements(test, ArrayLength(test));
38
0
  return buffer.forget();
39
0
}
40
41
0
TEST(ContainerParser, ADTSHeader) {
42
0
  nsAutoPtr<ContainerParser> parser;
43
0
  parser = ContainerParser::CreateForMIMEType(MediaContainerType(
44
0
                                                MEDIAMIMETYPE("audio/aac")));
45
0
  ASSERT_NE(parser, nullptr);
46
0
47
0
  // Audio data should have no gaps.
48
0
  EXPECT_EQ(parser->GetRoundingError(), 0);
49
0
50
0
  // Test a valid header.
51
0
  RefPtr<MediaByteBuffer> header = make_adts_header();
52
0
  EXPECT_TRUE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)));
53
0
54
0
  // Test variations.
55
0
  uint8_t save = header->ElementAt(1);
56
0
  for (uint8_t i = 1; i < 3; ++i) {
57
0
    // Set non-zero layer.
58
0
    header->ReplaceElementAt(1, (header->ElementAt(1) & 0xf9) | (i << 1));
59
0
    EXPECT_FALSE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)))
60
0
      << "Accepted non-zero layer in header.";
61
0
  }
62
0
  header->ReplaceElementAt(1, save);
63
0
  save = header->ElementAt(2);
64
0
  header->ReplaceElementAt(2, (header->ElementAt(2) & 0x3b) | (15 << 2));
65
0
  EXPECT_FALSE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)))
66
0
    << "Accepted explicit frequency in header.";
67
0
  header->ReplaceElementAt(2, save);
68
0
69
0
  // Test a short header.
70
0
  header->SetLength(6);
71
0
  EXPECT_FALSE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)))
72
0
    << "Accepted too-short header.";
73
0
  EXPECT_FALSE(NS_SUCCEEDED(parser->IsMediaSegmentPresent(header)))
74
0
    << "Found media segment when there was just a partial header.";
75
0
76
0
  // Test a header with short data.
77
0
  header = make_adts_header();
78
0
  header->AppendElements(1);
79
0
  EXPECT_TRUE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)))
80
0
    << "Rejected a valid header.";
81
0
  EXPECT_TRUE(NS_SUCCEEDED(parser->IsMediaSegmentPresent(header)))
82
0
    << "Rejected a one-byte media segment.";
83
0
84
0
  // Test parse results.
85
0
  header = make_adts_header();
86
0
  EXPECT_FALSE(NS_SUCCEEDED(parser->IsMediaSegmentPresent(header)))
87
0
    << "Found media segment when there was just a header.";
88
0
  int64_t start = 0;
89
0
  int64_t end = 0;
90
0
  EXPECT_TRUE(NS_FAILED(parser->ParseStartAndEndTimestamps(header, start, end)));
91
0
92
0
  EXPECT_TRUE(parser->HasInitData());
93
0
  EXPECT_TRUE(parser->HasCompleteInitData());
94
0
  MediaByteBuffer* init = parser->InitData();
95
0
  ASSERT_NE(init, nullptr);
96
0
  EXPECT_EQ(init->Length(), header->Length());
97
0
98
0
  EXPECT_EQ(parser->InitSegmentRange(), MediaByteRange(0, int64_t(header->Length())));
99
0
  // Media segment range should be empty here.
100
0
  EXPECT_EQ(parser->MediaHeaderRange(), MediaByteRange());
101
0
  EXPECT_EQ(parser->MediaSegmentRange(), MediaByteRange());
102
0
}
103
104
0
TEST(ContainerParser, ADTSBlankMedia) {
105
0
  nsAutoPtr<ContainerParser> parser;
106
0
  parser = ContainerParser::CreateForMIMEType(MediaContainerType(
107
0
                                                MEDIAMIMETYPE("audio/aac")));
108
0
  ASSERT_NE(parser, nullptr);
109
0
110
0
  // Audio data should have no gaps.
111
0
  EXPECT_EQ(parser->GetRoundingError(), 0);
112
0
113
0
  // Test the header only.
114
0
  RefPtr<MediaByteBuffer> header = make_adts_header();
115
0
  EXPECT_TRUE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)));
116
0
117
0
  // Test with the correct length of (invalid) frame data.
118
0
  size_t header_length = header->Length();
119
0
  size_t data_length = 24;
120
0
  size_t frame_length = header_length + data_length;
121
0
  header->AppendElements(data_length);
122
0
  EXPECT_TRUE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)))
123
0
    << "Rejected a valid header.";
124
0
  EXPECT_TRUE(NS_SUCCEEDED(parser->IsMediaSegmentPresent(header)))
125
0
    << "Rejected a full (but zeroed) media segment.";
126
0
  int64_t start = 0;
127
0
  int64_t end = 0;
128
0
  // We don't report timestamps from ADTS.
129
0
  EXPECT_TRUE(NS_FAILED(parser->ParseStartAndEndTimestamps(header, start, end)));
130
0
  EXPECT_EQ(start, 0);
131
0
  EXPECT_EQ(end, 0);
132
0
133
0
  // Verify the parser calculated header and packet data boundaries.
134
0
  EXPECT_TRUE(parser->HasInitData());
135
0
  EXPECT_TRUE(parser->HasCompleteInitData());
136
0
  MediaByteBuffer* init = parser->InitData();
137
0
  ASSERT_NE(init, nullptr);
138
0
  EXPECT_EQ(init->Length(), header_length)
139
0
    << "Found incorrect init segment length.";
140
0
  EXPECT_EQ(parser->InitSegmentRange(),
141
0
      MediaByteRange(0, int64_t(header_length)));
142
0
  // In ADTS the Media Header is the same as the Media Segment.
143
0
  MediaByteRange expected_media =
144
0
    MediaByteRange(int64_t(header_length), int64_t(frame_length));
145
0
  EXPECT_EQ(parser->MediaHeaderRange(), expected_media);
146
0
  EXPECT_EQ(parser->MediaSegmentRange(), expected_media);
147
0
}