2
* Copyright (C) 2016 Canonical, Ltd.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License version 3, as published
6
* by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranties of
10
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11
* PURPOSE. See the GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License along
14
* with this program. If not, see <http://www.gnu.org/licenses/>.
18
#include <gmock/gmock.h>
20
#include <system/window.h>
22
#include "mcs/android/h264encoder.h"
24
#include "mockmedia.h"
26
using namespace ::testing;
29
// From frameworks/native/include/media/openmax/OMX_IVCommon.h
30
const int32_t kOMXColorFormatAndroidOpaque = 0x7F000789;
31
const int32_t kOMXVideoIntraRefreshCyclic = 0;
32
// From frameworks/native/include/media/openmax/OMX_Video.h
33
const int32_t kOMXVideoControlRateConstant = 2;
34
// From frameworks/native/include/media/hardware/MetadataBufferType.h
35
const uint32_t kMetadataBufferTypeGrallocSource = 1;
37
class MockEncoderDelegate : public mcs::video::BaseEncoder::Delegate {
39
MOCK_METHOD1(OnBufferAvailable, void(const mcs::video::Buffer::Ptr&));
40
MOCK_METHOD1(OnBufferWithCodecConfig, void(const mcs::video::Buffer::Ptr&));
41
MOCK_METHOD0(OnBufferReturned, void());
44
class MockBufferDelegate : public mcs::video::Buffer::Delegate {
46
MOCK_METHOD1(OnBufferFinished, void(const mcs::video::Buffer::Ptr&));
49
struct DummyMediaMessageWrapper {
52
struct DummyMediaSourceWrapper {
55
struct DummyMediaMetaDataWrapper {
58
struct DummyMediaCodecSource {
61
struct DummyMediaBufferWrapper {
64
class H264EncoderFixture : public ::testing::Test {
66
void ExpectValidConfiguration(const mcs::video::BaseEncoder::Config &config, const mcs::test::android::MockMedia::Ptr &mock) {
67
auto message = new DummyMediaMessageWrapper;
69
EXPECT_CALL(*mock, media_message_create())
71
.WillRepeatedly(Return(message));
72
EXPECT_CALL(*mock, media_message_release(message))
74
.WillOnce(Invoke([](MediaMessageWrapper *msg) { delete msg; }));
75
EXPECT_CALL(*mock, media_message_set_string(message, _, _, _))
77
EXPECT_CALL(*mock, media_message_set_int32(message, _, _))
80
auto source = new DummyMediaSourceWrapper;
82
EXPECT_CALL(*mock, media_source_create())
84
.WillRepeatedly(Return(source));
85
EXPECT_CALL(*mock, media_source_release(source))
87
.WillOnce(Invoke([](MediaSourceWrapper *source) { delete source; }));
89
auto meta_data = new DummyMediaMetaDataWrapper;
91
EXPECT_CALL(*mock, media_meta_data_create())
93
.WillRepeatedly(Return(meta_data));
94
EXPECT_CALL(*mock, media_meta_data_release(meta_data))
96
.WillOnce(Invoke([](MediaMetaDataWrapper *meta) { delete meta; }));
97
EXPECT_CALL(*mock, media_meta_data_set_cstring(meta_data, _, _))
99
EXPECT_CALL(*mock, media_meta_data_set_int32(meta_data, _, _))
102
EXPECT_CALL(*mock, media_meta_data_get_key_id(_))
104
.WillRepeatedly(Return(0));
106
EXPECT_CALL(*mock, media_source_set_format(source, meta_data))
108
EXPECT_CALL(*mock, media_source_set_start_callback(source, _, _))
110
EXPECT_CALL(*mock, media_source_set_stop_callback(source, _, _))
112
EXPECT_CALL(*mock, media_source_set_pause_callback(source, _, _))
114
EXPECT_CALL(*mock, media_source_set_read_callback(source, _, _))
116
.WillRepeatedly(DoAll(SaveArg<1>(&source_read_callback),
117
SaveArg<2>(&source_read_callback_data)));
119
auto codec_source = new DummyMediaCodecSource;
121
EXPECT_CALL(*mock, media_codec_source_create(message, source, _))
123
.WillRepeatedly(Return(codec_source));
124
EXPECT_CALL(*mock, media_codec_source_release(codec_source))
126
.WillOnce(Invoke([](MediaCodecSourceWrapper *source) { delete source; }));
129
void ExpectValidStartAndStop(const mcs::test::android::MockMedia::Ptr &mock) {
130
EXPECT_CALL(*mock, media_codec_source_start(_))
132
.WillRepeatedly(Return(true));
134
EXPECT_CALL(*mock, media_codec_source_stop(_))
136
.WillRepeatedly(Return(true));
139
MediaSourceReadCallback source_read_callback;
140
void *source_read_callback_data;
144
TEST(H264Encoder, ValidDefaultConfiguration) {
145
auto config = mcs::android::H264Encoder::DefaultConfiguration();
146
EXPECT_EQ(-1, config.framerate);
147
EXPECT_EQ(5000000, config.bitrate);
148
EXPECT_EQ(15, config.i_frame_interval);
149
EXPECT_EQ(0, config.intra_refresh_mode);
150
EXPECT_EQ(0, config.width);
151
EXPECT_EQ(0, config.height);
152
EXPECT_EQ(0, config.profile);
153
EXPECT_EQ(0, config.profile_idc);
154
EXPECT_EQ(0, config.level);
155
EXPECT_EQ(0, config.level_idc);
156
EXPECT_EQ(0, config.constraint_set);
159
TEST(H264Encoder, MediaMessageCreationFails) {
160
auto mock = std::make_shared<mcs::test::android::MockMedia>();
162
auto config = mcs::android::H264Encoder::DefaultConfiguration();
164
EXPECT_CALL(*mock, media_message_create())
166
.WillRepeatedly(Return(nullptr));
168
auto encoder = mcs::android::H264Encoder::Create();
170
EXPECT_FALSE(encoder->Configure(config));
173
TEST(H264Encoder, MediaSourceCreationFails) {
174
auto mock = std::make_shared<mcs::test::android::MockMedia>();
176
auto config = mcs::android::H264Encoder::DefaultConfiguration();
178
auto message = new DummyMediaMessageWrapper;
180
EXPECT_CALL(*mock, media_message_create())
182
.WillRepeatedly(Return(message));
183
EXPECT_CALL(*mock, media_message_release(message))
185
EXPECT_CALL(*mock, media_message_set_string(message, _, _, _))
187
EXPECT_CALL(*mock, media_message_set_int32(message, _, _))
190
EXPECT_CALL(*mock, media_source_create())
192
.WillRepeatedly(Return(nullptr));
194
auto encoder = mcs::android::H264Encoder::Create();
196
EXPECT_FALSE(encoder->Configure(config));
199
TEST(H264Encoder, MediaMetaDataCreationFails) {
200
auto mock = std::make_shared<mcs::test::android::MockMedia>();
202
auto config = mcs::android::H264Encoder::DefaultConfiguration();
204
auto message = new DummyMediaMessageWrapper;
206
EXPECT_CALL(*mock, media_message_create())
208
.WillRepeatedly(Return(message));
209
EXPECT_CALL(*mock, media_message_release(message))
211
EXPECT_CALL(*mock, media_message_set_string(message, _, _, _))
213
EXPECT_CALL(*mock, media_message_set_int32(message, _, _))
216
auto source = new DummyMediaSourceWrapper;
218
EXPECT_CALL(*mock, media_source_create())
220
.WillRepeatedly(Return(source));
221
EXPECT_CALL(*mock, media_source_release(source))
224
EXPECT_CALL(*mock, media_meta_data_create())
226
.WillRepeatedly(Return(nullptr));
228
auto encoder = mcs::android::H264Encoder::Create();
230
EXPECT_FALSE(encoder->Configure(config));
233
TEST(H264Encoder, MediaCodecSourceCreationFails) {
234
auto mock = std::make_shared<mcs::test::android::MockMedia>();
236
auto config = mcs::android::H264Encoder::DefaultConfiguration();
238
auto message = new DummyMediaMessageWrapper;
240
EXPECT_CALL(*mock, media_message_create())
242
.WillRepeatedly(Return(message));
243
EXPECT_CALL(*mock, media_message_release(message))
245
EXPECT_CALL(*mock, media_message_set_string(message, _, _, _))
247
EXPECT_CALL(*mock, media_message_set_int32(message, _, _))
250
auto source = new DummyMediaSourceWrapper;
252
EXPECT_CALL(*mock, media_source_create())
254
.WillRepeatedly(Return(source));
255
EXPECT_CALL(*mock, media_source_release(source))
258
auto meta_data = new DummyMediaMetaDataWrapper;
260
EXPECT_CALL(*mock, media_meta_data_create())
262
.WillRepeatedly(Return(meta_data));
263
EXPECT_CALL(*mock, media_meta_data_release(meta_data))
265
EXPECT_CALL(*mock, media_meta_data_set_cstring(meta_data, _, _))
267
EXPECT_CALL(*mock, media_meta_data_set_int32(meta_data, _, _))
270
EXPECT_CALL(*mock, media_meta_data_get_key_id(_))
272
.WillRepeatedly(Return(0));
274
EXPECT_CALL(*mock, media_source_set_format(source, meta_data))
276
EXPECT_CALL(*mock, media_source_set_start_callback(source, _, _))
278
EXPECT_CALL(*mock, media_source_set_stop_callback(source, _, _))
280
EXPECT_CALL(*mock, media_source_set_pause_callback(source, _, _))
282
EXPECT_CALL(*mock, media_source_set_read_callback(source, _, _))
285
EXPECT_CALL(*mock, media_codec_source_create(message, source, _))
287
.WillRepeatedly(Return(nullptr));
289
auto encoder = mcs::android::H264Encoder::Create();
291
EXPECT_FALSE(encoder->Configure(config));
294
TEST(H264Encoder, CorrectConfiguration) {
295
auto mock = std::make_shared<mcs::test::android::MockMedia>();
297
auto config = mcs::android::H264Encoder::DefaultConfiguration();
300
config.framerate = 30;
301
config.profile_idc = 1;
302
config.level_idc = 2;
303
config.constraint_set = 3;
305
auto format_message = new DummyMediaMessageWrapper;
307
EXPECT_CALL(*mock, media_message_create())
309
.WillRepeatedly(Return(format_message));
310
EXPECT_CALL(*mock, media_message_release(format_message))
312
.WillOnce(Invoke([](MediaMessageWrapper *msg) { delete msg; }));
314
EXPECT_CALL(*mock, media_message_set_string(format_message, StrEq("mime"), StrEq("video/avc"), 0))
316
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("store-metadata-in-buffers"), 1))
318
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("store-metadata-in-buffers-output"), 0))
320
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("width"), config.width))
322
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("height"), config.height))
324
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("stride"), config.width))
326
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("slice-height"), config.width))
328
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("color-format"), kOMXColorFormatAndroidOpaque))
330
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("bitrate"), config.bitrate))
332
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("bitrate-mode"), kOMXVideoControlRateConstant))
334
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("frame-rate"), config.framerate))
336
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("intra-refresh-mode"), config.intra_refresh_mode))
338
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("intra-refresh-CIR-mbs"), 360))
340
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("i-frame-interval"), config.i_frame_interval))
342
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("prepend-sps-pps-to-idr-frames"), 1))
344
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("profile-idc"), 1))
346
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("level-idc"), 2))
348
EXPECT_CALL(*mock, media_message_set_int32(format_message, StrEq("constraint-set"), 3))
351
auto meta_data = new DummyMediaMetaDataWrapper;
353
EXPECT_CALL(*mock, media_meta_data_create())
355
.WillRepeatedly(Return(meta_data));
356
EXPECT_CALL(*mock, media_meta_data_release(meta_data))
358
.WillRepeatedly(Invoke([](MediaMetaDataWrapper *meta) { delete meta; }));
359
EXPECT_CALL(*mock, media_meta_data_set_cstring(meta_data, _, _))
361
EXPECT_CALL(*mock, media_meta_data_set_int32(meta_data, _, _))
364
EXPECT_CALL(*mock, media_meta_data_get_key_id(_))
366
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_MIME))
368
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_COLOR_FORMAT))
370
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_WIDTH))
372
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_HEIGHT))
374
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_STRIDE))
376
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_SLICE_HEIGHT))
378
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_FRAMERATE))
381
auto source = new DummyMediaSourceWrapper;
383
EXPECT_CALL(*mock, media_source_create())
385
.WillRepeatedly(Return(source));
386
EXPECT_CALL(*mock, media_source_release(source))
388
.WillOnce(Invoke([](MediaSourceWrapper *source) { delete source; }));
389
EXPECT_CALL(*mock, media_source_set_format(source, meta_data))
391
EXPECT_CALL(*mock, media_source_set_start_callback(source, _, _))
393
EXPECT_CALL(*mock, media_source_set_stop_callback(source, _, _))
395
EXPECT_CALL(*mock, media_source_set_pause_callback(source, _, _))
397
EXPECT_CALL(*mock, media_source_set_read_callback(source, _, NotNull()))
400
auto codec_source = new DummyMediaCodecSource;
402
EXPECT_CALL(*mock, media_codec_source_create(NotNull(), NotNull(), _))
404
.WillRepeatedly(Return(codec_source));
405
EXPECT_CALL(*mock, media_codec_source_release(codec_source))
407
.WillOnce(Invoke([](MediaCodecSourceWrapper *source) { delete source; }));
409
auto encoder = mcs::android::H264Encoder::Create();
411
EXPECT_TRUE(encoder->Configure(config));
413
// We can configure the encoder only once
414
EXPECT_FALSE(encoder->Configure(config));
416
auto stored_config = encoder->Configuration();
417
EXPECT_EQ(config, stored_config);
420
TEST_F(H264EncoderFixture, CorrectStartAndStopBehavior) {
421
auto mock = std::make_shared<mcs::test::android::MockMedia>();
423
auto config = mcs::android::H264Encoder::DefaultConfiguration();
425
ExpectValidConfiguration(config, mock);
427
auto encoder = mcs::android::H264Encoder::Create();
429
ExpectValidStartAndStop(mock);
431
EXPECT_FALSE(encoder->Start());
432
EXPECT_FALSE(encoder->Stop());
434
EXPECT_TRUE(encoder->Configure(config));
436
EXPECT_TRUE(encoder->Start());
437
EXPECT_TRUE(encoder->Running());
438
EXPECT_FALSE(encoder->Start());
439
EXPECT_TRUE(encoder->Stop());
440
EXPECT_FALSE(encoder->Running());
441
EXPECT_FALSE(encoder->Stop());
444
TEST_F(H264EncoderFixture, StartFailsCorrectly) {
445
auto mock = std::make_shared<mcs::test::android::MockMedia>();
447
auto config = mcs::android::H264Encoder::DefaultConfiguration();
449
ExpectValidConfiguration(config, mock);
451
auto encoder = mcs::android::H264Encoder::Create();
453
EXPECT_TRUE(encoder->Configure(config));
455
EXPECT_CALL(*mock, media_codec_source_start(_))
457
.WillRepeatedly(Return(false));
459
EXPECT_FALSE(encoder->Start());
462
TEST_F(H264EncoderFixture, StopFailsCorrectly) {
463
auto mock = std::make_shared<mcs::test::android::MockMedia>();
465
auto config = mcs::android::H264Encoder::DefaultConfiguration();
467
ExpectValidConfiguration(config, mock);
469
auto encoder = mcs::android::H264Encoder::Create();
471
EXPECT_TRUE(encoder->Configure(config));
473
EXPECT_CALL(*mock, media_codec_source_start(_))
475
.WillRepeatedly(Return(true));
476
EXPECT_CALL(*mock, media_codec_source_stop(_))
477
// Will be called twice as the d'tor also calls Stop to
478
// ensure the encoder is stopped correctly on cleanup.
480
.WillRepeatedly(Return(false));
482
EXPECT_TRUE(encoder->Start());
483
EXPECT_FALSE(encoder->Stop());
486
TEST_F(H264EncoderFixture, ReturnsCorrectNativeWindowHandle) {
487
auto mock = std::make_shared<mcs::test::android::MockMedia>();
489
auto config = mcs::android::H264Encoder::DefaultConfiguration();
491
ExpectValidConfiguration(config, mock);
493
auto encoder = mcs::android::H264Encoder::Create();
495
EXPECT_EQ(nullptr, encoder->NativeWindowHandle());
497
EXPECT_TRUE(encoder->Configure(config));
499
auto expected_handle = reinterpret_cast<void*>(1);
501
EXPECT_CALL(*mock, media_codec_source_get_native_window_handle(_))
503
.WillRepeatedly(Return(expected_handle));
505
EXPECT_EQ(expected_handle, encoder->NativeWindowHandle());
508
TEST_F(H264EncoderFixture, RequestIDRFrame) {
509
auto mock = std::make_shared<mcs::test::android::MockMedia>();
511
auto config = mcs::android::H264Encoder::DefaultConfiguration();
513
ExpectValidConfiguration(config, mock);
515
auto encoder = mcs::android::H264Encoder::Create();
517
encoder->SendIDRFrame();
519
EXPECT_TRUE(encoder->Configure(config));
521
EXPECT_CALL(*mock, media_codec_source_request_idr_frame(_))
524
encoder->SendIDRFrame();
527
TEST_F(H264EncoderFixture, ReturnsPackedBufferAndReleaseProperly) {
528
auto mock = std::make_shared<mcs::test::android::MockMedia>();
530
auto config = mcs::android::H264Encoder::DefaultConfiguration();
532
ExpectValidConfiguration(config, mock);
534
auto encoder = mcs::android::H264Encoder::Create();
536
EXPECT_TRUE(encoder->Configure(config));
537
EXPECT_NE(nullptr, source_read_callback);
538
EXPECT_NE(nullptr, source_read_callback_data);
540
ExpectValidStartAndStop(mock);
542
EXPECT_TRUE(encoder->Start());
544
auto anwb = new ANativeWindowBuffer;
545
anwb->handle = new native_handle_t;
547
auto buffer_delegate = std::make_shared<MockBufferDelegate>();
549
auto input_buffer = mcs::video::Buffer::Create(anwb);
550
input_buffer->SetDelegate(buffer_delegate);
551
auto now = mcs::Utils::GetNowUs();
552
input_buffer->SetTimestamp(now);
554
encoder->QueueBuffer(input_buffer);
556
MediaBufferWrapper *output_buffer = nullptr;
557
auto mbuf = new DummyMediaBufferWrapper;
558
size_t mbuf_size = sizeof(buffer_handle_t) + 4;
559
auto mbuf_data = new uint8_t[mbuf_size];
561
EXPECT_CALL(*mock, media_buffer_create(mbuf_size))
563
.WillRepeatedly(Return(mbuf));
565
EXPECT_CALL(*mock, media_buffer_get_data(mbuf))
567
.WillRepeatedly(Return(mbuf_data));
569
EXPECT_CALL(*mock, media_buffer_ref(mbuf))
572
EXPECT_CALL(*mock, media_buffer_get_meta_data(mbuf))
574
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_TIME))
576
.WillRepeatedly(Return(42));
577
EXPECT_CALL(*mock, media_meta_data_set_int64(_, 42, now));
579
MediaBufferReturnCallback return_callback;
580
void *return_callback_data = nullptr;
582
EXPECT_CALL(*mock, media_buffer_set_return_callback(mbuf, NotNull(), NotNull()))
584
.WillRepeatedly(DoAll(SaveArg<1>(&return_callback),
585
SaveArg<2>(&return_callback_data)));
588
EXPECT_CALL(*mock, media_buffer_set_return_callback(mbuf, nullptr, nullptr))
591
EXPECT_EQ(0, source_read_callback(&output_buffer, source_read_callback_data));
593
EXPECT_EQ(mbuf, output_buffer);
595
EXPECT_CALL(*buffer_delegate, OnBufferFinished(input_buffer))
598
EXPECT_CALL(*mock, media_buffer_release(output_buffer))
601
return_callback(output_buffer, return_callback_data);
603
// Doesn't crash or fail badly when no real buffer is returned
604
return_callback(nullptr, return_callback_data);
606
EXPECT_TRUE(encoder->Stop());
612
TEST_F(H264EncoderFixture, SourceReadFailsForInvalidState) {
613
auto mock = std::make_shared<mcs::test::android::MockMedia>();
615
auto config = mcs::android::H264Encoder::DefaultConfiguration();
617
ExpectValidConfiguration(config, mock);
619
auto encoder = mcs::android::H264Encoder::Create();
621
ExpectValidStartAndStop(mock);
623
EXPECT_TRUE(encoder->Configure(config));
624
EXPECT_NE(nullptr, source_read_callback);
625
EXPECT_NE(nullptr, source_read_callback_data);
627
// Must fail as the encoder isn't started yet
628
EXPECT_GE(0, source_read_callback(reinterpret_cast<MediaBufferWrapper**>(1), source_read_callback_data));
630
// Must also fail when encoder isn't started and when started
631
EXPECT_GE(0, source_read_callback(nullptr, source_read_callback_data));
632
EXPECT_TRUE(encoder->Start());
633
EXPECT_GE(0, source_read_callback(nullptr, source_read_callback_data));
636
TEST_F(H264EncoderFixture, QueueBufferDoesNotCrashWhenInactive) {
637
auto mock = std::make_shared<mcs::test::android::MockMedia>();
639
auto encoder = mcs::android::H264Encoder::Create();
641
auto buffer = mcs::video::Buffer::Create(nullptr);
642
encoder->QueueBuffer(buffer);
645
TEST_F(H264EncoderFixture, ExecuteFailForInvalidState) {
646
auto mock = std::make_shared<mcs::test::android::MockMedia>();
648
auto encoder = mcs::android::H264Encoder::Create();
650
EXPECT_FALSE(encoder->Execute());
653
TEST_F(H264EncoderFixture, ExecuteFailsForFailedSourceRead) {
654
auto mock = std::make_shared<mcs::test::android::MockMedia>();
656
auto config = mcs::android::H264Encoder::DefaultConfiguration();
658
ExpectValidConfiguration(config, mock);
659
ExpectValidStartAndStop(mock);
661
auto encoder = mcs::android::H264Encoder::Create();
663
EXPECT_TRUE(encoder->Configure(config));
665
EXPECT_TRUE(encoder->Start());
667
EXPECT_CALL(*mock, media_codec_source_read(_, _))
669
.WillRepeatedly(Return(false));
671
EXPECT_FALSE(encoder->Execute());
673
EXPECT_TRUE(encoder->Stop());
676
TEST_F(H264EncoderFixture, ExecuteProvidesBuffers) {
677
auto mock = std::make_shared<mcs::test::android::MockMedia>();
679
auto encoder_delegate = std::make_shared<MockEncoderDelegate>();
681
auto config = mcs::android::H264Encoder::DefaultConfiguration();
683
ExpectValidConfiguration(config, mock);
684
ExpectValidStartAndStop(mock);
686
auto encoder = mcs::android::H264Encoder::Create();
687
encoder->SetDelegate(encoder_delegate);
689
EXPECT_TRUE(encoder->Configure(config));
690
EXPECT_TRUE(encoder->Start());
692
auto input_buffer = new DummyMediaBufferWrapper;
693
mcs::TimestampUs input_buffer_timestamp = 23ll;
695
EXPECT_CALL(*mock, media_codec_source_read(_, _))
697
.WillRepeatedly(DoAll(SetArgPointee<1>(input_buffer), Return(true)));
699
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_TIME))
701
.WillRepeatedly(Return(1));
702
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_IS_CODEC_CONFIG))
704
.WillRepeatedly(Return(2));
706
auto meta_data = new DummyMediaMetaDataWrapper;
708
EXPECT_CALL(*mock, media_buffer_get_meta_data(input_buffer))
710
.WillRepeatedly(Return(meta_data));
712
EXPECT_CALL(*mock, media_meta_data_find_int64(meta_data, 1, _))
714
.WillRepeatedly(DoAll(SetArgPointee<2>(input_buffer_timestamp), Return(true)));
715
EXPECT_CALL(*mock, media_meta_data_find_int32(meta_data, 2, _))
717
.WillRepeatedly(DoAll(SetArgPointee<2>(0), Return(true)));
719
EXPECT_CALL(*mock, media_buffer_get_refcount(input_buffer))
721
.WillRepeatedly(Return(0));
723
EXPECT_CALL(*mock, media_buffer_destroy(input_buffer))
726
EXPECT_CALL(*encoder_delegate, OnBufferAvailable(_))
728
EXPECT_CALL(*encoder_delegate, OnBufferWithCodecConfig(_))
731
EXPECT_TRUE(encoder->Execute());
733
EXPECT_TRUE(encoder->Stop());
736
TEST_F(H264EncoderFixture, HandsBuffersWithCodecSpecificDataBack) {
737
auto mock = std::make_shared<mcs::test::android::MockMedia>();
739
auto encoder_delegate = std::make_shared<MockEncoderDelegate>();
741
auto config = mcs::android::H264Encoder::DefaultConfiguration();
743
ExpectValidConfiguration(config, mock);
744
ExpectValidStartAndStop(mock);
746
auto encoder = mcs::android::H264Encoder::Create();
747
encoder->SetDelegate(encoder_delegate);
749
EXPECT_TRUE(encoder->Configure(config));
750
EXPECT_TRUE(encoder->Start());
752
auto input_buffer = new DummyMediaBufferWrapper;
753
mcs::TimestampUs input_buffer_timestamp = 23ll;
755
EXPECT_CALL(*mock, media_codec_source_read(_, _))
757
.WillRepeatedly(DoAll(SetArgPointee<1>(input_buffer), Return(true)));
759
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_TIME))
761
.WillRepeatedly(Return(1));
762
EXPECT_CALL(*mock, media_meta_data_get_key_id(MEDIA_META_DATA_KEY_IS_CODEC_CONFIG))
764
.WillRepeatedly(Return(2));
766
auto meta_data = new DummyMediaMetaDataWrapper;
768
EXPECT_CALL(*mock, media_buffer_get_meta_data(input_buffer))
770
.WillRepeatedly(Return(meta_data));
772
EXPECT_CALL(*mock, media_meta_data_find_int64(meta_data, 1, _))
774
.WillRepeatedly(DoAll(SetArgPointee<2>(input_buffer_timestamp), Return(true)));
775
EXPECT_CALL(*mock, media_meta_data_find_int32(meta_data, 2, _))
777
.WillRepeatedly(DoAll(SetArgPointee<2>(1 /* marks this as a buffer with CSD */), Return(true)));
779
EXPECT_CALL(*mock, media_buffer_get_refcount(input_buffer))
781
.WillRepeatedly(Return(0));
783
EXPECT_CALL(*mock, media_buffer_destroy(input_buffer))
786
EXPECT_CALL(*encoder_delegate, OnBufferWithCodecConfig(_))
788
EXPECT_CALL(*encoder_delegate, OnBufferAvailable(_))
791
EXPECT_TRUE(encoder->Execute());
793
EXPECT_TRUE(encoder->Stop());