2 * Copyright (C) 2017 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #define LOG_TAG "media_omx_hidl_component_test"
19 #define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS
22 #include <android-base/logging.h>
24 #include <android/hardware/media/omx/1.0/IOmx.h>
25 #include <android/hardware/media/omx/1.0/IOmxNode.h>
26 #include <android/hardware/media/omx/1.0/IOmxObserver.h>
27 #include <android/hardware/media/omx/1.0/types.h>
28 #include <android/hidl/allocator/1.0/IAllocator.h>
29 #include <android/hidl/memory/1.0/IMapper.h>
30 #include <android/hidl/memory/1.0/IMemory.h>
32 using ::android::hardware::media::omx::V1_0::IOmx;
33 using ::android::hardware::media::omx::V1_0::IOmxObserver;
34 using ::android::hardware::media::omx::V1_0::IOmxNode;
35 using ::android::hardware::media::omx::V1_0::Message;
36 using ::android::hardware::media::omx::V1_0::CodecBuffer;
37 using ::android::hardware::media::omx::V1_0::PortMode;
38 using ::android::hidl::allocator::V1_0::IAllocator;
39 using ::android::hidl::memory::V1_0::IMemory;
40 using ::android::hidl::memory::V1_0::IMapper;
41 using ::android::hardware::Return;
42 using ::android::hardware::Void;
43 using ::android::hardware::hidl_vec;
44 using ::android::hardware::hidl_string;
47 #include <VtsHalHidlTargetTestBase.h>
49 #include <media_hidl_test_common.h>
51 // A class for test environment setup
52 class ComponentTestEnvironment : public ::testing::Environment {
54 virtual void SetUp() {}
55 virtual void TearDown() {}
57 ComponentTestEnvironment() : instance("default") {}
59 void setInstance(const char* _instance) { instance = _instance; }
61 void setComponent(const char* _component) { component = _component; }
63 void setRole(const char* _role) { role = _role; }
65 const hidl_string getInstance() const { return instance; }
67 const hidl_string getComponent() const { return component; }
69 const hidl_string getRole() const { return role; }
71 int initFromOptions(int argc, char** argv) {
72 static struct option options[] = {
73 {"instance", required_argument, 0, 'I'},
74 {"component", required_argument, 0, 'C'},
75 {"role", required_argument, 0, 'R'},
80 int c = getopt_long(argc, argv, "I:C:R:", options, &index);
102 "unrecognized option: %s\n\n"
103 "usage: %s <gtest options> <test options>\n\n"
104 "test options are:\n\n"
105 "-I, --instance: HAL instance to test\n"
106 "-C, --component: OMX component to test\n"
107 "-R, --Role: OMX component Role\n",
108 argv[optind ?: 1], argv[0]);
115 hidl_string instance;
116 hidl_string component;
120 static ComponentTestEnvironment* gEnv = nullptr;
122 // generic component test fixture class
123 class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase {
125 typedef ::testing::VtsHalHidlTargetTestBase Super;
127 ::std::string getTestCaseInfo() const override {
128 return ::std::string() +
129 "Component: " + gEnv->getComponent().c_str() + " | " +
130 "Role: " + gEnv->getRole().c_str() + " | " +
131 "Instance: " + gEnv->getInstance().c_str();
134 virtual void SetUp() override {
137 android::hardware::media::omx::V1_0::Status status;
138 omx = Super::getService<IOmx>(gEnv->getInstance());
139 ASSERT_NE(omx, nullptr);
140 observer = new CodecObserver(nullptr);
141 ASSERT_NE(observer, nullptr);
142 if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0)
144 EXPECT_TRUE(omx->allocateNode(
145 gEnv->getComponent(), observer,
146 [&](android::hardware::media::omx::V1_0::Status _s,
147 sp<IOmxNode> const& _nl) {
152 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
153 ASSERT_NE(omxNode, nullptr);
154 ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role";
155 struct StringToClass {
157 standardCompClass CompClass;
159 const StringToClass kStringToClass[] = {
160 {"audio_decoder", audio_decoder},
161 {"audio_encoder", audio_encoder},
162 {"video_decoder", video_decoder},
163 {"video_encoder", video_encoder},
165 const size_t kNumStringToClass =
166 sizeof(kStringToClass) / sizeof(kStringToClass[0]);
168 char substring[OMX_MAX_STRINGNAME_SIZE];
169 strcpy(substring, gEnv->getRole().c_str());
170 pch = strchr(substring, '.');
171 ASSERT_NE(pch, nullptr) << "Invalid Component Role";
172 substring[pch - substring] = '\0';
173 compClass = unknown_class;
174 for (size_t i = 0; i < kNumStringToClass; ++i) {
175 if (!strcasecmp(substring, kStringToClass[i].Class)) {
176 compClass = kStringToClass[i].CompClass;
180 if (compClass == unknown_class) disableTest = true;
182 size_t suffixLen = strlen(".secure");
183 if (strlen(gEnv->getComponent().c_str()) >= suffixLen) {
185 !strcmp(gEnv->getComponent().c_str() +
186 strlen(gEnv->getComponent().c_str()) - suffixLen,
189 if (disableTest) std::cout << "[ WARN ] Test Disabled \n";
192 virtual void TearDown() override {
193 if (omxNode != nullptr) {
194 EXPECT_TRUE((omxNode->freeNode()).isOk());
200 enum standardCompClass {
209 sp<CodecObserver> observer;
210 sp<IOmxNode> omxNode;
211 standardCompClass compClass;
216 static void description(const std::string& description) {
217 RecordProperty("description", description);
221 void initPortMode(PortMode* pm, bool isSecure,
222 ComponentHidlTest::standardCompClass compClass) {
223 pm[0] = PortMode::PRESET_BYTE_BUFFER;
224 pm[1] = PortMode::PRESET_BYTE_BUFFER;
227 case ComponentHidlTest::video_decoder:
228 pm[0] = PortMode::PRESET_SECURE_BUFFER;
230 case ComponentHidlTest::video_encoder:
231 pm[1] = PortMode::PRESET_SECURE_BUFFER;
239 // test dispatch message API call
240 TEST_F(ComponentHidlTest, dispatchMsg) {
241 description("test dispatch message API call");
242 if (disableTest) return;
243 android::hardware::media::omx::V1_0::Status status;
244 Message msgin, msgout;
246 msgin.type = Message::Type::EVENT;
247 msgin.data.eventData.event = OMX_EventError;
248 msgin.data.eventData.data1 = 0xdeaf;
249 msgin.data.eventData.data2 = 0xd00d;
250 msgin.data.eventData.data3 = 0x01ce;
251 msgin.data.eventData.data4 = 0xfa11;
252 status = omxNode->dispatchMessage(msgin);
253 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
254 status = observer->dequeueMessage(&msgout, DEFAULT_TIMEOUT);
255 EXPECT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
256 EXPECT_EQ(msgout.type, msgin.type);
257 EXPECT_EQ(msgout.data.eventData.event, msgin.data.eventData.event);
258 EXPECT_EQ(msgout.data.eventData.data1, msgin.data.eventData.data1);
259 EXPECT_EQ(msgout.data.eventData.data2, msgin.data.eventData.data2);
260 EXPECT_EQ(msgout.data.eventData.data3, msgin.data.eventData.data3);
261 EXPECT_EQ(msgout.data.eventData.data4, msgin.data.eventData.data4);
264 // set component role
265 TEST_F(ComponentHidlTest, SetRole) {
266 description("Test Set Component Role");
267 if (disableTest) return;
268 android::hardware::media::omx::V1_0::Status status;
269 status = setRole(omxNode, gEnv->getRole().c_str());
270 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
273 // port indices enumeration
274 TEST_F(ComponentHidlTest, DISABLED_GetPortIndices) {
275 description("Test Component on Mandatory Port Parameters (Port Indices)");
276 if (disableTest) return;
277 android::hardware::media::omx::V1_0::Status status;
278 OMX_PORT_PARAM_TYPE params;
280 status = setRole(omxNode, gEnv->getRole().c_str());
281 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
283 // Get Number of Ports and their Indices for all Domains
284 // (Audio/Video/Image/Other)
285 // All standard OMX components shall support following OMX Index types
286 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
287 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
288 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
289 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
290 status = getParam(omxNode, OMX_IndexParamImageInit, ¶ms);
291 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
292 status = getParam(omxNode, OMX_IndexParamOtherInit, ¶ms);
293 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
296 // port format enumeration
297 TEST_F(ComponentHidlTest, EnumeratePortFormat) {
298 description("Test Component on Mandatory Port Parameters (Port Format)");
299 if (disableTest) return;
300 android::hardware::media::omx::V1_0::Status status;
301 uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
303 status = setRole(omxNode, gEnv->getRole().c_str());
304 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
305 OMX_PORT_PARAM_TYPE params;
306 if (compClass == audio_decoder || compClass == audio_encoder) {
307 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
309 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
311 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
312 ASSERT_EQ(params.nPorts, 2U);
313 kPortIndexInput = params.nStartPortNumber;
314 kPortIndexOutput = kPortIndexInput + 1;
317 OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
318 OMX_U32 xFramerate = 24U << 16;
320 // Enumerate Port Format
321 if (compClass == audio_encoder) {
323 setAudioPortFormat(omxNode, kPortIndexInput, OMX_AUDIO_CodingPCM);
324 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
325 status = setAudioPortFormat(omxNode, kPortIndexOutput,
326 OMX_AUDIO_CodingAutoDetect);
327 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
328 } else if (compClass == audio_decoder) {
329 status = setAudioPortFormat(omxNode, kPortIndexInput,
330 OMX_AUDIO_CodingAutoDetect);
331 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
333 setAudioPortFormat(omxNode, kPortIndexOutput, OMX_AUDIO_CodingPCM);
334 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
335 } else if (compClass == video_encoder) {
337 setVideoPortFormat(omxNode, kPortIndexInput, OMX_VIDEO_CodingUnused,
338 eColorFormat, xFramerate);
339 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
340 status = setVideoPortFormat(omxNode, kPortIndexOutput,
341 OMX_VIDEO_CodingAutoDetect,
342 OMX_COLOR_FormatUnused, 0U);
343 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
345 status = setVideoPortFormat(omxNode, kPortIndexInput,
346 OMX_VIDEO_CodingAutoDetect,
347 OMX_COLOR_FormatUnused, 0U);
348 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
349 status = setVideoPortFormat(omxNode, kPortIndexOutput,
350 OMX_VIDEO_CodingUnused, eColorFormat,
352 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
356 // get/set default port settings of a component
357 TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) {
359 "Test Component on Mandatory Port Parameters (Port Definition)");
360 if (disableTest) return;
361 android::hardware::media::omx::V1_0::Status status;
362 uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
364 status = setRole(omxNode, gEnv->getRole().c_str());
365 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
366 OMX_PORT_PARAM_TYPE params;
367 if (compClass == audio_decoder || compClass == audio_encoder) {
368 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
370 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
372 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
373 ASSERT_EQ(params.nPorts, 2U);
374 kPortIndexInput = params.nStartPortNumber;
375 kPortIndexOutput = kPortIndexInput + 1;
378 for (size_t i = kPortIndexInput; i <= kPortIndexOutput; i++) {
379 OMX_PARAM_PORTDEFINITIONTYPE portDef;
381 getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
382 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
383 if (status == android::hardware::media::omx::V1_0::Status::OK) {
384 EXPECT_EQ(portDef.eDir, i - kPortIndexInput); // OMX_DirInput
385 EXPECT_EQ(portDef.bEnabled, OMX_TRUE);
386 EXPECT_EQ(portDef.bPopulated, OMX_FALSE);
387 EXPECT_GE(portDef.nBufferCountMin, 1U);
388 EXPECT_GE(portDef.nBufferCountActual, portDef.nBufferCountMin);
389 if (compClass == audio_encoder || compClass == audio_decoder) {
390 EXPECT_EQ(portDef.eDomain, OMX_PortDomainAudio);
391 } else if (compClass == video_encoder ||
392 compClass == video_decoder) {
393 EXPECT_EQ(portDef.eDomain, OMX_PortDomainVideo);
395 OMX_PARAM_PORTDEFINITIONTYPE mirror = portDef;
397 // nBufferCountActual >= nBufferCountMin
398 portDef.nBufferCountActual = portDef.nBufferCountMin - 1;
399 status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i,
402 ::android::hardware::media::omx::V1_0::Status::OK);
404 // Port Direction - Read Only
406 portDef.eDir = static_cast<OMX_DIRTYPE>(RANDOM_INDEX);
407 setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
408 getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
409 if (portDef.eDir != mirror.eDir) {
410 std::cerr << "[ ERROR ] port direction has to be read only "
411 "but is changeable \n";
413 EXPECT_EQ(portDef.eDir, mirror.eDir);
414 setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror);
416 // Port Min BufferCount - Read Only
418 portDef.nBufferCountMin += 1;
419 setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
420 getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
421 if (portDef.nBufferCountMin != mirror.nBufferCountMin) {
422 std::cerr << "[ ERROR ] port Min BufferCount has to be "
423 "read only but is changeable \n";
425 EXPECT_EQ(portDef.nBufferCountMin, mirror.nBufferCountMin);
426 setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror);
428 // Port Actual BufferCount
430 portDef.nBufferCountActual += 1;
431 status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i,
433 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
434 status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i,
436 EXPECT_EQ(portDef.nBufferCountActual,
437 mirror.nBufferCountActual + 1);
439 setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror);
441 // Port BufferSize is although read only as per OMX-IL 1.2, android
442 // doesnt abide by this.
443 // Decrease buffer size
445 OMX_U32 nBufferSize = portDef.nBufferSize >> 1;
446 if (nBufferSize != 0) {
447 if (!strncmp(gEnv->getComponent().c_str(), "OMX.google.", 11)) {
448 portDef.nBufferSize = nBufferSize;
450 // Probable alignment requirements of vendor component
451 portDef.nBufferSize = ALIGN_POWER_OF_TWO(nBufferSize, 12);
452 nBufferSize = portDef.nBufferSize;
455 ASSERT_TRUE(false) << "Unexpected buffer size";
457 setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
458 getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
459 // SPECIAL CASE: For video decoder, allow configuration of input
460 // buffer size even if it is less than minimum requirement and
461 // similarly for encoder allow configuration of output port buffer
463 if ((compClass == video_encoder && i == kPortIndexOutput) ||
464 (compClass == video_decoder && i == kPortIndexInput)) {
465 double dev = (portDef.nBufferSize / (double)nBufferSize);
467 if (dev < 0 || dev > 0.1) {
468 std::cerr << "[ ERROR ] port buffer size deviation "
469 "larger than expected \n";
472 EXPECT_EQ(portDef.nBufferSize, mirror.nBufferSize);
474 setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror);
476 // Increase buffer size
478 portDef.nBufferSize = mirror.nBufferSize << 1;
479 setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
480 getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef);
481 EXPECT_EQ(portDef.nBufferSize, (mirror.nBufferSize << 1));
486 // populate port test
487 TEST_F(ComponentHidlTest, DISABLED_PopulatePort) {
488 description("Verify bPopulated field of a component port");
489 if (disableTest || isSecure) return;
490 android::hardware::media::omx::V1_0::Status status;
491 OMX_U32 portBase = 0;
493 status = setRole(omxNode, gEnv->getRole().c_str());
494 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
495 OMX_PORT_PARAM_TYPE params;
496 if (compClass == audio_decoder || compClass == audio_encoder) {
497 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
499 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
501 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
502 ASSERT_EQ(params.nPorts, 2U);
503 portBase = params.nStartPortNumber;
507 status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
509 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
511 OMX_PARAM_PORTDEFINITIONTYPE portDef;
513 getPortParam(omxNode, OMX_IndexParamPortDefinition, portBase, &portDef);
514 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
515 ASSERT_EQ(portDef.bPopulated, OMX_FALSE);
517 android::Vector<BufferInfo> pBuffer;
519 uint32_t nBufferSize = portDef.nBufferSize >> 1;
521 for (size_t i = 0; i < portDef.nBufferCountActual; i++) {
523 ASSERT_NO_FATAL_FAILURE(allocateBuffer(omxNode, &buffer, portBase,
525 PortMode::PRESET_BYTE_BUFFER));
526 pBuffer.push(buffer);
530 getPortParam(omxNode, OMX_IndexParamPortDefinition, portBase, &portDef);
531 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
532 // A port is populated when all of the buffers indicated by
533 // nBufferCountActual with a size of at least nBufferSizehave been
534 // allocated on the port.
535 ASSERT_EQ(portDef.bPopulated, OMX_FALSE);
539 TEST_F(ComponentHidlTest, Flush) {
540 description("Test Flush");
541 if (disableTest) return;
542 android::hardware::media::omx::V1_0::Status status;
543 uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
546 status = setRole(omxNode, gEnv->getRole().c_str());
547 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
548 OMX_PORT_PARAM_TYPE params;
549 if (compClass == audio_decoder || compClass == audio_encoder) {
550 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
552 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
554 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
555 ASSERT_EQ(params.nPorts, 2U);
556 kPortIndexInput = params.nStartPortNumber;
557 kPortIndexOutput = kPortIndexInput + 1;
560 android::Vector<BufferInfo> iBuffer, oBuffer;
563 PortMode portMode[2];
564 initPortMode(portMode, isSecure, compClass);
565 status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
566 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
567 status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
568 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
571 ASSERT_NO_FATAL_FAILURE(
572 changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
573 kPortIndexInput, kPortIndexOutput, portMode));
574 // set state to executing
575 ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer));
577 for (size_t i = 0; i < oBuffer.size(); i++) {
578 ASSERT_NO_FATAL_FAILURE(
579 dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]));
582 ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer,
583 kPortIndexInput, kPortIndexOutput));
585 // TODO: Sending empty input buffers is slightly tricky.
586 // Components sometimes process input buffers even when output buffers are
587 // not dispatched. For instance Parsing sequence header does not require
588 // output buffers. In such instances sending 0 size input buffers might
589 // make component to send error events. so lets skip this aspect of testing.
591 for (size_t i = 0; i < iBuffer.size(); i++) {
592 ASSERT_NO_FATAL_FAILURE(
593 dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0]));
596 ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer,
597 kPortIndexInput, kPortIndexOutput));
601 ASSERT_NO_FATAL_FAILURE(
602 changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer));
603 // set state to loaded
604 ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer,
605 &oBuffer, kPortIndexInput,
609 // Flush test - monkeying
610 TEST_F(ComponentHidlTest, Flush_M) {
611 description("Test Flush monkeying");
612 if (disableTest) return;
613 android::hardware::media::omx::V1_0::Status status;
614 uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
617 status = setRole(omxNode, gEnv->getRole().c_str());
618 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
619 OMX_PORT_PARAM_TYPE params;
620 if (compClass == audio_decoder || compClass == audio_encoder) {
621 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
623 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
625 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
626 ASSERT_EQ(params.nPorts, 2U);
627 kPortIndexInput = params.nStartPortNumber;
628 kPortIndexOutput = kPortIndexInput + 1;
631 android::Vector<BufferInfo> iBuffer, oBuffer;
634 PortMode portMode[2];
635 initPortMode(portMode, isSecure, compClass);
636 status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
637 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
638 status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
639 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
641 // // Flush all ports ; receive error OMX_ErrorIncorrectStateOperation
642 // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush),
644 // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
647 ASSERT_NO_FATAL_FAILURE(
648 changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
649 kPortIndexInput, kPortIndexOutput, portMode));
651 // // Flush all ports ; receive error OMX_ErrorIncorrectStateOperation
652 // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush),
654 // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
656 // set state to executing
657 ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer));
660 for (size_t i = 0; i < oBuffer.size(); i++) {
661 ASSERT_NO_FATAL_FAILURE(
662 dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]));
665 // // flush invalid port, expecting OMX_ErrorBadPortIndex
666 // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush),
668 // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
671 status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), OMX_ALL);
672 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
674 for (int j = 0; j < 2; j++) {
675 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, &iBuffer,
677 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
678 ASSERT_EQ(msg.type, Message::Type::EVENT);
679 ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
680 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandFlush);
681 if (msg.data.eventData.data2 == kPortIndexInput) {
682 // test if client got all its buffers back
683 for (size_t i = 0; i < iBuffer.size(); ++i) {
684 EXPECT_EQ(iBuffer[i].owner, client);
686 } else if (msg.data.eventData.data2 == kPortIndexOutput) {
687 // test if client got all its buffers back
688 for (size_t i = 0; i < oBuffer.size(); ++i) {
689 EXPECT_EQ(oBuffer[i].owner, client);
692 EXPECT_TRUE(false) << "Bad port Index";
696 // SPECIAL CASE: When OMX_ALL is used as argument, Android OMX Core sends
697 // an additional flush event with argument OMX_ALL. This we believe is
698 // not recognized by OMX-IL Spec. So read this event and ignore it
700 observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, &iBuffer, &oBuffer);
701 if (status == android::hardware::media::omx::V1_0::Status::OK) {
702 ASSERT_EQ(msg.type, Message::Type::EVENT);
703 ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
704 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandFlush);
705 ASSERT_EQ(msg.data.eventData.data2, OMX_ALL);
709 ASSERT_NO_FATAL_FAILURE(
710 changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer));
711 // set state to loaded
712 ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer,
713 &oBuffer, kPortIndexInput,
717 // test port mode configuration when the component is in various states
718 TEST_F(ComponentHidlTest, PortModeConfig) {
719 description("Test Port Mode Configuration");
720 if (disableTest) return;
721 android::hardware::media::omx::V1_0::Status status;
722 uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
725 status = setRole(omxNode, gEnv->getRole().c_str());
726 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
727 OMX_PORT_PARAM_TYPE params;
728 if (compClass == audio_decoder || compClass == audio_encoder) {
729 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
731 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
733 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
734 ASSERT_EQ(params.nPorts, 2U);
735 kPortIndexInput = params.nStartPortNumber;
736 kPortIndexOutput = kPortIndexInput + 1;
739 android::Vector<BufferInfo> iBuffer, oBuffer;
742 PortMode portMode[2];
743 initPortMode(portMode, isSecure, compClass);
744 status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
745 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
746 status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
747 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
750 ASSERT_NO_FATAL_FAILURE(
751 changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
752 kPortIndexInput, kPortIndexOutput, portMode));
753 // Only Allow Port Mode configuration in loaded state
754 status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
755 EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK);
756 status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
757 EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK);
759 // set state to executing
760 ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer));
761 // Only Allow Port Mode configuration in loaded state
762 status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
763 EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK);
764 status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
765 EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK);
768 ASSERT_NO_FATAL_FAILURE(
769 changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer));
770 // set state to loaded
771 ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer,
772 &oBuffer, kPortIndexInput,
775 status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
776 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
777 status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
778 EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
781 // state transitions test
782 TEST_F(ComponentHidlTest, StateTransitions) {
783 description("Test State Transitions Loaded<->Idle<->Execute");
784 if (disableTest) return;
785 android::hardware::media::omx::V1_0::Status status;
786 uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
787 OMX_U32 portBase = 0;
789 status = setRole(omxNode, gEnv->getRole().c_str());
790 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
791 OMX_PORT_PARAM_TYPE params;
792 if (compClass == audio_decoder || compClass == audio_encoder) {
793 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
795 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
797 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
798 ASSERT_EQ(params.nPorts, 2U);
799 portBase = params.nStartPortNumber;
801 kPortIndexInput = portBase;
802 kPortIndexOutput = portBase + 1;
804 android::Vector<BufferInfo> pBuffer[2];
807 PortMode portMode[2];
808 initPortMode(portMode, isSecure, compClass);
809 status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
810 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
811 status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
812 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
815 status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
817 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
819 for (size_t j = portBase; j < portBase + 2; j++) {
820 pBuffer[j - portBase].clear();
822 OMX_PARAM_PORTDEFINITIONTYPE def;
823 status = getPortParam(omxNode, OMX_IndexParamPortDefinition, j, &def);
824 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
826 for (size_t i = 0; i < def.nBufferCountActual; i++) {
827 // Dont switch states until the ports are populated
828 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
829 &pBuffer[0], &pBuffer[1]);
831 android::hardware::media::omx::V1_0::Status::TIMED_OUT);
834 ASSERT_NO_FATAL_FAILURE(allocateBuffer(
835 omxNode, &buffer, j, def.nBufferSize, portMode[j - portBase]));
836 pBuffer[j - portBase].push(buffer);
840 // As the ports are populated, check if the state transition is complete
841 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0],
843 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
844 ASSERT_EQ(msg.type, Message::Type::EVENT);
845 ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
846 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandStateSet);
847 ASSERT_EQ(msg.data.eventData.data2, OMX_StateIdle);
849 // set state to executing
850 ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer));
852 for (size_t i = 0; i < pBuffer[1].size(); i++) {
853 ASSERT_NO_FATAL_FAILURE(
854 dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1]));
857 ASSERT_NO_FATAL_FAILURE(
858 changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]));
860 // set state to executing
861 ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer));
862 // TODO: Sending empty input buffers is slightly tricky.
864 for (size_t i = 0; i < pBuffer[0].size(); i++) {
865 ASSERT_NO_FATAL_FAILURE(
866 dispatchInputBuffer(omxNode, &pBuffer[0], i, 0, 0, 0, portMode[0]));
869 ASSERT_NO_FATAL_FAILURE(
870 changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]));
873 // set state to loaded
874 status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
876 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
878 for (size_t j = portBase; j < portBase + 2; j++) {
879 for (size_t i = 0; i < pBuffer[j].size(); ++i) {
880 // Dont switch states until the ports are populated
881 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
882 &pBuffer[0], &pBuffer[1]);
884 android::hardware::media::omx::V1_0::Status::TIMED_OUT);
886 status = omxNode->freeBuffer(j, pBuffer[j][i].id);
887 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
891 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0],
893 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
894 ASSERT_EQ(msg.type, Message::Type::EVENT);
895 ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
896 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandStateSet);
897 ASSERT_EQ(msg.data.eventData.data2, OMX_StateLoaded);
900 // state transitions test - monkeying
901 TEST_F(ComponentHidlTest, DISABLED_StateTransitions_M) {
902 description("Test State Transitions monkeying");
903 if (disableTest || isSecure) return;
904 android::hardware::media::omx::V1_0::Status status;
905 uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
908 status = setRole(omxNode, gEnv->getRole().c_str());
909 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
910 OMX_PORT_PARAM_TYPE params;
911 if (compClass == audio_decoder || compClass == audio_encoder) {
912 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
914 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
916 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
917 ASSERT_EQ(params.nPorts, 2U);
918 kPortIndexInput = params.nStartPortNumber;
919 kPortIndexOutput = kPortIndexInput + 1;
922 android::Vector<BufferInfo> iBuffer, oBuffer;
924 // set state to loaded ; receive error OMX_ErrorSameState
925 status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
927 EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
929 // set state to executing ; receive error OMX_ErrorIncorrectStateTransition
930 status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
932 EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
935 ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer,
936 &oBuffer, kPortIndexInput,
939 // set state to idle ; receive error OMX_ErrorSameState
940 status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
942 EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
944 // set state to executing
945 ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer));
947 // set state to executing ; receive error OMX_ErrorSameState
948 status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
950 EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
952 // set state to Loaded ; receive error OMX_ErrorIncorrectStateTransition
953 status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet),
955 EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
958 ASSERT_NO_FATAL_FAILURE(
959 changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer));
960 // set state to loaded
961 ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer,
962 &oBuffer, kPortIndexInput,
966 // port enable disable test
967 TEST_F(ComponentHidlTest, DISABLED_PortEnableDisable_Loaded) {
968 description("Test Port Enable and Disable (Component State :: Loaded)");
969 if (disableTest) return;
970 android::hardware::media::omx::V1_0::Status status;
971 OMX_U32 portBase = 0;
973 status = setRole(omxNode, gEnv->getRole().c_str());
974 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
975 OMX_PORT_PARAM_TYPE params;
976 if (compClass == audio_decoder || compClass == audio_encoder) {
977 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
979 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
981 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
982 ASSERT_EQ(params.nPorts, 2U);
983 portBase = params.nStartPortNumber;
986 for (size_t i = portBase; i < portBase + 2; i++) {
988 omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i);
989 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
990 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT);
991 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
992 ASSERT_EQ(msg.type, Message::Type::EVENT);
993 if (msg.data.eventData.event == OMX_EventCmdComplete) {
994 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
995 ASSERT_EQ(msg.data.eventData.data2, i);
996 // If you can disable a port, then you should be able to enable it
998 status = omxNode->sendCommand(
999 toRawCommandType(OMX_CommandPortEnable), i);
1000 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1001 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT);
1002 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1003 ASSERT_EQ(msg.type, Message::Type::EVENT);
1004 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
1005 ASSERT_EQ(msg.data.eventData.data2, i);
1006 } else if (msg.data.eventData.event == OMX_EventError) {
1007 ALOGE("Port %d Disabling failed with error %d", (int)i,
1008 (int)msg.data.eventData.event);
1010 // something unexpected happened
1016 // port enable disable test
1017 TEST_F(ComponentHidlTest, PortEnableDisable_Idle) {
1018 description("Test Port Enable and Disable (Component State :: Idle)");
1019 if (disableTest) return;
1020 android::hardware::media::omx::V1_0::Status status;
1021 uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
1022 OMX_U32 portBase = 0;
1024 status = setRole(omxNode, gEnv->getRole().c_str());
1025 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
1026 OMX_PORT_PARAM_TYPE params;
1027 if (compClass == audio_decoder || compClass == audio_encoder) {
1028 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
1030 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
1032 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
1033 ASSERT_EQ(params.nPorts, 2U);
1034 portBase = params.nStartPortNumber;
1036 kPortIndexInput = portBase;
1037 kPortIndexOutput = portBase + 1;
1039 // Component State :: Idle
1040 android::Vector<BufferInfo> pBuffer[2];
1043 PortMode portMode[2];
1044 initPortMode(portMode, isSecure, compClass);
1045 status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
1046 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
1047 status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
1048 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
1050 // set state to idle
1051 ASSERT_NO_FATAL_FAILURE(
1052 changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1],
1053 kPortIndexInput, kPortIndexOutput, portMode));
1054 for (size_t i = portBase; i < portBase + 2; i++) {
1056 omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i);
1057 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1059 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0],
1061 if (status == android::hardware::media::omx::V1_0::Status::OK) {
1062 ASSERT_EQ(msg.type, Message::Type::EVENT);
1063 if (msg.data.eventData.event == OMX_EventCmdComplete) {
1064 // do not disable the port until all the buffers are freed
1066 } else if (msg.data.eventData.event == OMX_EventError) {
1067 ALOGE("Port %d Disabling failed with error %d", (int)i,
1068 (int)msg.data.eventData.event);
1070 // something unexpected happened
1073 } else if (status ==
1074 android::hardware::media::omx::V1_0::Status::TIMED_OUT) {
1075 for (size_t j = 0; j < pBuffer[i - portBase].size(); ++j) {
1076 status = omxNode->freeBuffer(i, pBuffer[i - portBase][j].id);
1078 android::hardware::media::omx::V1_0::Status::OK);
1081 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
1082 &pBuffer[0], &pBuffer[1]);
1083 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1084 ASSERT_EQ(msg.type, Message::Type::EVENT);
1085 ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
1086 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
1087 ASSERT_EQ(msg.data.eventData.data2, i);
1089 // If you can disable a port, then you should be able to enable it
1091 status = omxNode->sendCommand(
1092 toRawCommandType(OMX_CommandPortEnable), i);
1093 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1095 // do not enable the port until all the buffers are supplied
1096 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
1097 &pBuffer[0], &pBuffer[1]);
1099 android::hardware::media::omx::V1_0::Status::TIMED_OUT);
1101 ASSERT_NO_FATAL_FAILURE(allocatePortBuffers(
1102 omxNode, &pBuffer[i - portBase], i, portMode[i - portBase]));
1103 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
1104 &pBuffer[0], &pBuffer[1]);
1105 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1106 ASSERT_EQ(msg.type, Message::Type::EVENT);
1107 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
1108 ASSERT_EQ(msg.data.eventData.data2, i);
1110 // something unexpected happened
1115 // set state to Loaded
1116 ASSERT_NO_FATAL_FAILURE(
1117 changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1],
1118 kPortIndexInput, kPortIndexOutput));
1121 // port enable disable test
1122 TEST_F(ComponentHidlTest, PortEnableDisable_Execute) {
1123 description("Test Port Enable and Disable (Component State :: Execute)");
1124 if (disableTest) return;
1125 android::hardware::media::omx::V1_0::Status status;
1126 uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
1127 OMX_U32 portBase = 0;
1129 status = setRole(omxNode, gEnv->getRole().c_str());
1130 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
1131 OMX_PORT_PARAM_TYPE params;
1132 if (compClass == audio_decoder || compClass == audio_encoder) {
1133 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
1135 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
1137 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
1138 ASSERT_EQ(params.nPorts, 2U);
1139 portBase = params.nStartPortNumber;
1141 kPortIndexInput = portBase;
1142 kPortIndexOutput = portBase + 1;
1144 // Component State :: Idle
1145 android::Vector<BufferInfo> pBuffer[2];
1148 PortMode portMode[2];
1149 initPortMode(portMode, isSecure, compClass);
1150 status = omxNode->setPortMode(kPortIndexInput, portMode[0]);
1151 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
1152 status = omxNode->setPortMode(kPortIndexOutput, portMode[1]);
1153 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
1155 // set state to idle
1156 ASSERT_NO_FATAL_FAILURE(
1157 changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1],
1158 kPortIndexInput, kPortIndexOutput, portMode));
1159 // set state to executing
1160 ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer));
1162 for (size_t i = 0; i < pBuffer[1].size(); i++) {
1163 ASSERT_NO_FATAL_FAILURE(
1164 dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1]));
1167 for (size_t i = portBase; i < portBase + 2; i++) {
1169 omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i);
1170 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1172 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0],
1174 if (status == android::hardware::media::omx::V1_0::Status::OK) {
1175 ASSERT_EQ(msg.type, Message::Type::EVENT);
1176 if (msg.data.eventData.event == OMX_EventCmdComplete) {
1177 // do not disable the port until all the buffers are freed
1179 } else if (msg.data.eventData.event == OMX_EventError) {
1180 ALOGE("Port %d Disabling failed with error %d", (int)i,
1181 (int)msg.data.eventData.event);
1183 // something unexpected happened
1186 } else if (status ==
1187 android::hardware::media::omx::V1_0::Status::TIMED_OUT) {
1188 for (size_t j = 0; j < pBuffer[i - portBase].size(); ++j) {
1189 // test if client got all its buffers back
1190 EXPECT_EQ(pBuffer[i - portBase][j].owner, client);
1192 status = omxNode->freeBuffer(i, pBuffer[i - portBase][j].id);
1194 android::hardware::media::omx::V1_0::Status::OK);
1197 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
1198 &pBuffer[0], &pBuffer[1]);
1199 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1200 ASSERT_EQ(msg.type, Message::Type::EVENT);
1201 ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
1202 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
1203 ASSERT_EQ(msg.data.eventData.data2, i);
1205 // If you can disable a port, then you should be able to enable it
1207 status = omxNode->sendCommand(
1208 toRawCommandType(OMX_CommandPortEnable), i);
1209 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1211 // do not enable the port until all the buffers are supplied
1212 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
1213 &pBuffer[0], &pBuffer[1]);
1215 android::hardware::media::omx::V1_0::Status::TIMED_OUT);
1217 ASSERT_NO_FATAL_FAILURE(allocatePortBuffers(
1218 omxNode, &pBuffer[i - portBase], i, portMode[i - portBase]));
1219 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
1220 &pBuffer[0], &pBuffer[1]);
1221 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1222 ASSERT_EQ(msg.type, Message::Type::EVENT);
1223 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
1224 ASSERT_EQ(msg.data.eventData.data2, i);
1226 // something unexpected happened
1231 // set state to idle
1232 ASSERT_NO_FATAL_FAILURE(
1233 changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]));
1234 // set state to loaded
1235 ASSERT_NO_FATAL_FAILURE(
1236 changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1],
1237 kPortIndexInput, kPortIndexOutput));
1240 // port enable disable test - monkeying
1241 TEST_F(ComponentHidlTest, DISABLED_PortEnableDisable_M) {
1243 "Test Port Enable and Disable Monkeying (Component State :: Loaded)");
1244 if (disableTest || isSecure) return;
1245 android::hardware::media::omx::V1_0::Status status;
1246 OMX_U32 portBase = 0;
1248 status = setRole(omxNode, gEnv->getRole().c_str());
1249 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
1250 OMX_PORT_PARAM_TYPE params;
1251 if (compClass == audio_decoder || compClass == audio_encoder) {
1252 status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms);
1254 status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms);
1256 if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
1257 ASSERT_EQ(params.nPorts, 2U);
1258 portBase = params.nStartPortNumber;
1261 // disable invalid port, expecting OMX_ErrorBadPortIndex
1262 status = omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable),
1264 ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
1266 // enable invalid port, expecting OMX_ErrorBadPortIndex
1267 status = omxNode->sendCommand(toRawCommandType(OMX_CommandPortEnable),
1269 ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK);
1271 // disable all ports
1273 omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), OMX_ALL);
1274 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1275 for (size_t i = 0; i < 2; i++) {
1276 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT);
1277 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1278 ASSERT_EQ(msg.type, Message::Type::EVENT);
1279 if (msg.data.eventData.event == OMX_EventCmdComplete) {
1280 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
1281 if (msg.data.eventData.data2 != portBase ||
1282 msg.data.eventData.data2 != portBase + 1)
1284 } else if (msg.data.eventData.event == OMX_EventError) {
1285 ALOGE("Port %d Disabling failed with error %d", (int)i,
1286 (int)msg.data.eventData.event);
1288 // something unexpected happened
1295 omxNode->sendCommand(toRawCommandType(OMX_CommandPortEnable), OMX_ALL);
1296 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1297 for (size_t i = 0; i < 2; i++) {
1298 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT);
1299 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
1300 ASSERT_EQ(msg.type, Message::Type::EVENT);
1301 if (msg.data.eventData.event == OMX_EventCmdComplete) {
1302 ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
1303 if (msg.data.eventData.data2 != portBase ||
1304 msg.data.eventData.data2 != portBase + 1)
1306 } else if (msg.data.eventData.event == OMX_EventError) {
1307 ALOGE("Port %d Enabling failed with error %d", (int)i,
1308 (int)msg.data.eventData.event);
1310 // something unexpected happened
1316 int main(int argc, char** argv) {
1317 gEnv = new ComponentTestEnvironment();
1318 ::testing::AddGlobalTestEnvironment(gEnv);
1319 ::testing::InitGoogleTest(&argc, argv);
1320 int status = gEnv->initFromOptions(argc, argv);
1322 status = RUN_ALL_TESTS();
1323 ALOGI("Test result = %d", status);