7#include <packager/media/base/media_handler_test_base.h>
17#include <absl/log/check.h>
18#include <gmock/gmock.h>
19#include <gtest/gtest.h>
21#include <packager/macros/compiler.h>
22#include <packager/media/base/audio_stream_info.h>
23#include <packager/media/base/media_handler.h>
24#include <packager/media/base/media_sample.h>
25#include <packager/media/base/stream_info.h>
26#include <packager/media/base/text_sample.h>
27#include <packager/media/base/text_stream_info.h>
28#include <packager/media/base/video_stream_info.h>
29#include <packager/status.h>
30#include <packager/status/status_test_util.h>
34const int kTrackId = 1;
35const int64_t kDuration = 10000;
36const char kCodecString[] =
"codec string";
37const uint8_t kSampleBits = 1;
38const uint8_t kNumChannels = 2;
39const uint32_t kSamplingFrequency = 48000;
40const uint64_t kSeekPrerollNs = 12345;
41const uint64_t kCodecDelayNs = 56789;
42const uint32_t kMaxBitrate = 13579;
43const uint32_t kAvgBitrate = 13000;
44const char kLanguage[] =
"eng";
45const uint32_t kWidth = 10u;
46const uint32_t kHeight = 20u;
47const uint32_t kPixelWidth = 2u;
48const uint32_t kPixelHeight = 3u;
49const uint8_t kColorPrimaries = 0;
50const uint8_t kMatrixCoefficients = 0;
51const uint8_t kTransferCharacteristics = 0;
53const int16_t kTrickPlayFactor = 0;
54const uint8_t kNaluLengthSize = 1u;
55const bool kEncrypted =
true;
58const uint8_t kCodecConfig[]{
61 0x01, 0x64, 0x00, 0x1e, 0xff,
66 0x67, 0x64, 0x00, 0x1e, 0xac, 0xd9, 0x40, 0xa0, 0x2f, 0xf9, 0x70, 0x11,
67 0x00, 0x00, 0x03, 0x03, 0xe9, 0x00, 0x00, 0xea, 0x60, 0x0f, 0x16, 0x2d,
73 0x68, 0xeb, 0xe3, 0xcb, 0x22, 0xc0,
79 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
87std::string BoolToString(
bool value) {
88 return value ?
"true" :
"false";
91bool TryMatchStreamDataType(
const StreamDataType& actual,
92 const StreamDataType& expected,
93 ::testing::MatchResultListener* listener) {
94 if (actual != expected) {
95 std::string expected_as_string = StreamDataTypeToString(expected);
96 std::string actual_as_string = StreamDataTypeToString(actual);
98 *listener <<
"which is " << actual_as_string <<
" (expected "
99 << expected_as_string <<
")";
106bool TryMatchStreamType(
const StreamType& actual,
107 const StreamType& expected,
108 ::testing::MatchResultListener* listener) {
109 if (actual != expected) {
110 std::string expected_as_string = StreamTypeToString(expected);
111 std::string actual_as_string = StreamTypeToString(actual);
113 *listener <<
"which is " << actual_as_string <<
" (expected "
114 << expected_as_string <<
")";
121std::string ToPrettyString(
const std::string& str) {
132 }
else if (isalnum(c)) {
149bool FakeInputMediaHandler::ValidateOutputStreamIndex(
size_t index)
const {
154Status FakeInputMediaHandler::InitializeInternal() {
158Status FakeInputMediaHandler::Process(std::unique_ptr<StreamData> stream_data) {
160 return Status(error::INTERNAL_ERROR,
161 "FakeInputMediaHandler should never be a downstream handler.");
164Status MockOutputMediaHandler::InitializeInternal() {
168Status MockOutputMediaHandler::Process(
169 std::unique_ptr<StreamData> stream_data) {
170 OnProcess(stream_data.get());
174Status MockOutputMediaHandler::OnFlushRequest(
size_t index) {
179Status CachingMediaHandler::InitializeInternal() {
183Status CachingMediaHandler::Process(std::unique_ptr<StreamData> stream_data) {
184 stream_data_vector_.push_back(std::move(stream_data));
188Status CachingMediaHandler::OnFlushRequest(
size_t input_stream_index) {
189 UNUSED(input_stream_index);
193bool CachingMediaHandler::ValidateOutputStreamIndex(
size_t stream_index)
const {
194 UNUSED(stream_index);
198bool MediaHandlerTestBase::IsVideoCodec(Codec codec)
const {
199 return codec >= kCodecVideo && codec < kCodecVideoMaxPlusOne;
202std::unique_ptr<StreamInfo> MediaHandlerTestBase::GetVideoStreamInfo(
203 int32_t time_scale)
const {
204 return GetVideoStreamInfo(time_scale, kCodecVP9, kWidth, kHeight);
207std::unique_ptr<StreamInfo> MediaHandlerTestBase::GetVideoStreamInfo(
210 uint32_t height)
const {
211 return GetVideoStreamInfo(time_scale, kCodecVP9, width, height);
214std::unique_ptr<StreamInfo> MediaHandlerTestBase::GetVideoStreamInfo(
217 return GetVideoStreamInfo(time_scale, codec, kWidth, kHeight);
220std::unique_ptr<StreamInfo> MediaHandlerTestBase::GetVideoStreamInfo(
224 uint32_t height)
const {
225 return std::unique_ptr<VideoStreamInfo>(
new VideoStreamInfo(
226 kTrackId, time_scale, kDuration, codec, H26xStreamFormat::kUnSpecified,
227 kCodecString, kCodecConfig,
sizeof(kCodecConfig), width, height,
228 kPixelWidth, kPixelHeight, kColorPrimaries, kMatrixCoefficients,
229 kTransferCharacteristics, kTrickPlayFactor, kNaluLengthSize, kLanguage,
233std::unique_ptr<StreamInfo> MediaHandlerTestBase::GetAudioStreamInfo(
234 int32_t time_scale)
const {
235 return GetAudioStreamInfo(time_scale, kCodecAAC);
238std::unique_ptr<StreamInfo> MediaHandlerTestBase::GetAudioStreamInfo(
241 return std::unique_ptr<AudioStreamInfo>(
new AudioStreamInfo(
242 kTrackId, time_scale, kDuration, codec, kCodecString, kCodecConfig,
243 sizeof(kCodecConfig), kSampleBits, kNumChannels, kSamplingFrequency,
244 kSeekPrerollNs, kCodecDelayNs, kMaxBitrate, kAvgBitrate, kLanguage,
248std::shared_ptr<MediaSample> MediaHandlerTestBase::GetMediaSample(
251 bool is_keyframe)
const {
252 return GetMediaSample(timestamp, duration, is_keyframe, kData,
sizeof(kData));
255std::shared_ptr<MediaSample> MediaHandlerTestBase::GetMediaSample(
260 size_t data_length)
const {
261 std::shared_ptr<MediaSample> sample =
263 sample->set_dts(timestamp);
264 sample->set_pts(timestamp);
265 sample->set_duration(duration);
270std::unique_ptr<SegmentInfo> MediaHandlerTestBase::GetSegmentInfo(
271 int64_t start_timestamp,
274 int64_t segment_number)
const {
275 std::unique_ptr<SegmentInfo> info(
new SegmentInfo);
276 info->start_timestamp = start_timestamp;
277 info->duration = duration;
278 info->is_subsegment = is_subsegment;
279 info->segment_number = segment_number;
284std::unique_ptr<StreamInfo> MediaHandlerTestBase::GetTextStreamInfo(
285 int32_t timescale)
const {
288 return std::unique_ptr<StreamInfo>(
289 new TextStreamInfo(0, timescale, 0, kUnknownCodec,
"",
"", 0, 0,
""));
292std::unique_ptr<TextSample> MediaHandlerTestBase::GetTextSample(
293 const std::string&
id,
296 const std::string& payload)
const {
297 return std::unique_ptr<TextSample>{
298 new TextSample(
id, start, end, {}, TextFragment{{}, payload})};
301std::unique_ptr<CueEvent> MediaHandlerTestBase::GetCueEvent(
302 double time_in_seconds)
const {
303 std::unique_ptr<CueEvent> event(
new CueEvent);
304 event->time_in_seconds = time_in_seconds;
309Status MediaHandlerTestBase::SetUpAndInitializeGraph(
310 std::shared_ptr<MediaHandler> handler,
312 size_t output_count) {
314 DCHECK_EQ(
nullptr, handler_);
315 DCHECK(inputs_.empty());
316 DCHECK(outputs_.empty());
318 handler_ = std::move(handler);
323 for (
size_t i = 0; i < input_count; i++) {
324 inputs_.emplace_back(
new FakeInputMediaHandler);
327 for (
auto& input : inputs_) {
328 status.Update(input->AddHandler(handler_));
336 for (
size_t i = 0; i < output_count; i++) {
337 outputs_.emplace_back(
new testing::NiceMock<MockOutputMediaHandler>);
340 for (
auto& output : outputs_) {
341 status.Update(handler_->AddHandler(output));
349 for (
auto& input : inputs_) {
350 status.Update(input->Initialize());
356 if (inputs_.empty()) {
357 status.Update(handler_->Initialize());
363FakeInputMediaHandler* MediaHandlerTestBase::Input(
size_t index) {
364 DCHECK_LT(index, inputs_.size());
365 return inputs_[index].get();
368MockOutputMediaHandler* MediaHandlerTestBase::Output(
size_t index) {
369 DCHECK_LT(index, outputs_.size());
370 return outputs_[index].get();
373MediaHandlerGraphTestBase::MediaHandlerGraphTestBase()
374 : next_handler_(new CachingMediaHandler),
375 some_handler_(new CachingMediaHandler) {}
377void MediaHandlerGraphTestBase::SetUpGraph(
380 std::shared_ptr<MediaHandler> handler) {
383 auto input_handler = std::make_shared<CachingMediaHandler>();
384 for (
size_t i = 0; i < num_inputs; ++i)
385 ASSERT_OK(input_handler->SetHandler(i, handler));
387 for (
size_t i = 0; i < num_outputs; ++i)
388 ASSERT_OK(handler->SetHandler(i, next_handler_));
391const std::vector<std::unique_ptr<StreamData>>&
392MediaHandlerGraphTestBase::GetOutputStreamDataVector()
const {
393 return next_handler_->Cache();
396void MediaHandlerGraphTestBase::ClearOutputStreamDataVector() {
397 next_handler_->Clear();
All the methods that are virtual are virtual for mocking.