summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp')
-rw-r--r--[-rwxr-xr-x]media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp263
1 files changed, 184 insertions, 79 deletions
diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp
index 1f67e2b6..34a96a0c 100755..100644
--- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp
+++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp
@@ -15,13 +15,15 @@
15 */ 15 */
16 16
17#define LOG_TAG "media_omx_hidl_video_test_common" 17#define LOG_TAG "media_omx_hidl_video_test_common"
18
19#ifdef __LP64__ 18#ifdef __LP64__
20#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS 19#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS
21#endif 20#endif
22 21
23#include <android-base/logging.h> 22#include <android-base/logging.h>
24 23
24#include <android/hardware/graphics/allocator/2.0/IAllocator.h>
25#include <android/hardware/graphics/mapper/2.0/IMapper.h>
26#include <android/hardware/graphics/mapper/2.0/types.h>
25#include <android/hardware/media/omx/1.0/IOmx.h> 27#include <android/hardware/media/omx/1.0/IOmx.h>
26#include <android/hardware/media/omx/1.0/IOmxNode.h> 28#include <android/hardware/media/omx/1.0/IOmxNode.h>
27#include <android/hardware/media/omx/1.0/IOmxObserver.h> 29#include <android/hardware/media/omx/1.0/IOmxObserver.h>
@@ -29,7 +31,10 @@
29#include <android/hidl/allocator/1.0/IAllocator.h> 31#include <android/hidl/allocator/1.0/IAllocator.h>
30#include <android/hidl/memory/1.0/IMapper.h> 32#include <android/hidl/memory/1.0/IMapper.h>
31#include <android/hidl/memory/1.0/IMemory.h> 33#include <android/hidl/memory/1.0/IMemory.h>
34#include <cutils/atomic.h>
32 35
36using ::android::hardware::graphics::common::V1_0::BufferUsage;
37using ::android::hardware::graphics::common::V1_0::PixelFormat;
33using ::android::hardware::media::omx::V1_0::IOmx; 38using ::android::hardware::media::omx::V1_0::IOmx;
34using ::android::hardware::media::omx::V1_0::IOmxObserver; 39using ::android::hardware::media::omx::V1_0::IOmxObserver;
35using ::android::hardware::media::omx::V1_0::IOmxNode; 40using ::android::hardware::media::omx::V1_0::IOmxNode;
@@ -186,10 +191,157 @@ Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat(
186 return status; 191 return status;
187} 192}
188 193
194void allocateGraphicBuffers(sp<IOmxNode> omxNode, OMX_U32 portIndex,
195 BufferInfo* buffer, uint32_t nFrameWidth,
196 uint32_t nFrameHeight, int32_t* nStride,
197 int format) {
198 android::hardware::media::omx::V1_0::Status status;
199 sp<android::hardware::graphics::allocator::V2_0::IAllocator> allocator =
200 android::hardware::graphics::allocator::V2_0::IAllocator::getService();
201 ASSERT_NE(nullptr, allocator.get());
202
203 sp<android::hardware::graphics::mapper::V2_0::IMapper> mapper =
204 android::hardware::graphics::mapper::V2_0::IMapper::getService();
205 ASSERT_NE(mapper.get(), nullptr);
206
207 android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo
208 descriptorInfo;
209 uint32_t usage;
210
211 descriptorInfo.width = nFrameWidth;
212 descriptorInfo.height = nFrameHeight;
213 descriptorInfo.layerCount = 1;
214 descriptorInfo.format = static_cast<PixelFormat>(format);
215 descriptorInfo.usage = static_cast<uint64_t>(BufferUsage::CPU_READ_OFTEN);
216 omxNode->getGraphicBufferUsage(
217 portIndex,
218 [&status, &usage](android::hardware::media::omx::V1_0::Status _s,
219 uint32_t _n1) {
220 status = _s;
221 usage = _n1;
222 });
223 if (status == android::hardware::media::omx::V1_0::Status::OK) {
224 descriptorInfo.usage |= usage;
225 }
226
227 ::android::hardware::hidl_vec<uint32_t> descriptor;
228 android::hardware::graphics::mapper::V2_0::Error error;
229 mapper->createDescriptor(
230 descriptorInfo, [&error, &descriptor](
231 android::hardware::graphics::mapper::V2_0::Error _s,
232 ::android::hardware::hidl_vec<uint32_t> _n1) {
233 error = _s;
234 descriptor = _n1;
235 });
236 ASSERT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE);
237
238 static volatile int32_t nextId = 0;
239 uint64_t id = static_cast<uint64_t>(getpid()) << 32;
240 allocator->allocate(
241 descriptor, 1,
242 [&](android::hardware::graphics::mapper::V2_0::Error _s, uint32_t _n1,
243 const ::android::hardware::hidl_vec<
244 ::android::hardware::hidl_handle>& _n2) {
245 ASSERT_EQ(android::hardware::graphics::mapper::V2_0::Error::NONE,
246 _s);
247 *nStride = _n1;
248 buffer->omxBuffer.nativeHandle = _n2[0];
249 buffer->omxBuffer.attr.anwBuffer.width = nFrameWidth;
250 buffer->omxBuffer.attr.anwBuffer.height = nFrameHeight;
251 buffer->omxBuffer.attr.anwBuffer.stride = _n1;
252 buffer->omxBuffer.attr.anwBuffer.format = descriptorInfo.format;
253 buffer->omxBuffer.attr.anwBuffer.usage = descriptorInfo.usage;
254 buffer->omxBuffer.attr.anwBuffer.layerCount =
255 descriptorInfo.layerCount;
256 buffer->omxBuffer.attr.anwBuffer.id =
257 id | static_cast<uint32_t>(android_atomic_inc(&nextId));
258 });
259}
260
261// allocate buffers needed on a component port
262void allocateBuffer(sp<IOmxNode> omxNode, BufferInfo* buffer, OMX_U32 portIndex,
263 OMX_U32 nBufferSize, PortMode portMode) {
264 android::hardware::media::omx::V1_0::Status status;
265
266 if (portMode == PortMode::PRESET_SECURE_BUFFER) {
267 buffer->owner = client;
268 buffer->omxBuffer.type = CodecBuffer::Type::NATIVE_HANDLE;
269 omxNode->allocateSecureBuffer(
270 portIndex, nBufferSize,
271 [&status, &buffer](
272 android::hardware::media::omx::V1_0::Status _s, uint32_t id,
273 ::android::hardware::hidl_handle const& nativeHandle) {
274 status = _s;
275 buffer->id = id;
276 buffer->omxBuffer.nativeHandle = nativeHandle;
277 });
278 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
279 } else if (portMode == PortMode::PRESET_BYTE_BUFFER ||
280 portMode == PortMode::DYNAMIC_ANW_BUFFER) {
281 sp<IAllocator> allocator = IAllocator::getService("ashmem");
282 ASSERT_NE(allocator.get(), nullptr);
283
284 buffer->owner = client;
285 buffer->omxBuffer.type = CodecBuffer::Type::SHARED_MEM;
286 buffer->omxBuffer.attr.preset.rangeOffset = 0;
287 buffer->omxBuffer.attr.preset.rangeLength = 0;
288 bool success = false;
289 if (portMode != PortMode::PRESET_BYTE_BUFFER) {
290 nBufferSize = sizeof(android::VideoNativeMetadata);
291 }
292 allocator->allocate(
293 nBufferSize,
294 [&success, &buffer](bool _s,
295 ::android::hardware::hidl_memory const& mem) {
296 success = _s;
297 buffer->omxBuffer.sharedMemory = mem;
298 });
299 ASSERT_EQ(success, true);
300 ASSERT_EQ(buffer->omxBuffer.sharedMemory.size(), nBufferSize);
301 buffer->mMemory = mapMemory(buffer->omxBuffer.sharedMemory);
302 ASSERT_NE(buffer->mMemory, nullptr);
303 if (portMode == PortMode::DYNAMIC_ANW_BUFFER) {
304 android::VideoNativeMetadata* metaData =
305 static_cast<android::VideoNativeMetadata*>(
306 static_cast<void*>(buffer->mMemory->getPointer()));
307 metaData->nFenceFd = -1;
308 buffer->slot = -1;
309 }
310 omxNode->useBuffer(
311 portIndex, buffer->omxBuffer,
312 [&status, &buffer](android::hardware::media::omx::V1_0::Status _s,
313 uint32_t id) {
314 status = _s;
315 buffer->id = id;
316 });
317 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
318 } else if (portMode == PortMode::PRESET_ANW_BUFFER) {
319 OMX_PARAM_PORTDEFINITIONTYPE portDef;
320 status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex,
321 &portDef);
322 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
323 int32_t nStride;
324 buffer->owner = client;
325 buffer->omxBuffer.type = CodecBuffer::Type::ANW_BUFFER;
326 ASSERT_NO_FATAL_FAILURE(allocateGraphicBuffers(
327 omxNode, portIndex, buffer, portDef.format.video.nFrameWidth,
328 portDef.format.video.nFrameHeight, &nStride,
329 portDef.format.video.eColorFormat));
330 omxNode->useBuffer(
331 portIndex, buffer->omxBuffer,
332 [&status, &buffer](android::hardware::media::omx::V1_0::Status _s,
333 uint32_t id) {
334 status = _s;
335 buffer->id = id;
336 });
337 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
338 }
339}
340
189// allocate buffers needed on a component port 341// allocate buffers needed on a component port
190void allocatePortBuffers(sp<IOmxNode> omxNode, 342void allocatePortBuffers(sp<IOmxNode> omxNode,
191 android::Vector<BufferInfo>* buffArray, 343 android::Vector<BufferInfo>* buffArray,
192 OMX_U32 portIndex, PortMode portMode) { 344 OMX_U32 portIndex, PortMode portMode, bool allocGrap) {
193 android::hardware::media::omx::V1_0::Status status; 345 android::hardware::media::omx::V1_0::Status status;
194 OMX_PARAM_PORTDEFINITIONTYPE portDef; 346 OMX_PARAM_PORTDEFINITIONTYPE portDef;
195 347
@@ -199,70 +351,18 @@ void allocatePortBuffers(sp<IOmxNode> omxNode,
199 &portDef); 351 &portDef);
200 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 352 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
201 353
202 if (portMode == PortMode::PRESET_SECURE_BUFFER) { 354 for (size_t i = 0; i < portDef.nBufferCountActual; i++) {
203 for (size_t i = 0; i < portDef.nBufferCountActual; i++) { 355 BufferInfo buffer;
204 BufferInfo buffer; 356 ASSERT_NO_FATAL_FAILURE(allocateBuffer(omxNode, &buffer, portIndex,
205 buffer.owner = client; 357 portDef.nBufferSize, portMode));
206 buffer.omxBuffer.type = CodecBuffer::Type::NATIVE_HANDLE; 358 if (allocGrap && portMode == PortMode::DYNAMIC_ANW_BUFFER) {
207 omxNode->allocateSecureBuffer( 359 int32_t nStride;
208 portIndex, portDef.nBufferSize, 360 ASSERT_NO_FATAL_FAILURE(allocateGraphicBuffers(
209 [&status, &buffer]( 361 omxNode, portIndex, &buffer, portDef.format.video.nFrameWidth,
210 android::hardware::media::omx::V1_0::Status _s, uint32_t id, 362 portDef.format.video.nFrameHeight, &nStride,
211 ::android::hardware::hidl_handle const& nativeHandle) { 363 portDef.format.video.eColorFormat));
212 status = _s;
213 buffer.id = id;
214 buffer.omxBuffer.nativeHandle = nativeHandle;
215 });
216 buffArray->push(buffer);
217 ASSERT_EQ(status,
218 ::android::hardware::media::omx::V1_0::Status::OK);
219 }
220 } else if (portMode == PortMode::PRESET_BYTE_BUFFER ||
221 portMode == PortMode::DYNAMIC_ANW_BUFFER) {
222 sp<IAllocator> allocator = IAllocator::getService("ashmem");
223 EXPECT_NE(allocator.get(), nullptr);
224
225 for (size_t i = 0; i < portDef.nBufferCountActual; i++) {
226 BufferInfo buffer;
227 buffer.owner = client;
228 buffer.omxBuffer.type = CodecBuffer::Type::SHARED_MEM;
229 buffer.omxBuffer.attr.preset.rangeOffset = 0;
230 buffer.omxBuffer.attr.preset.rangeLength = 0;
231 bool success = false;
232 if (portMode != PortMode::PRESET_BYTE_BUFFER) {
233 portDef.nBufferSize = sizeof(android::VideoNativeMetadata);
234 }
235 allocator->allocate(
236 portDef.nBufferSize,
237 [&success, &buffer](
238 bool _s, ::android::hardware::hidl_memory const& mem) {
239 success = _s;
240 buffer.omxBuffer.sharedMemory = mem;
241 });
242 ASSERT_EQ(success, true);
243 ASSERT_EQ(buffer.omxBuffer.sharedMemory.size(),
244 portDef.nBufferSize);
245 buffer.mMemory = mapMemory(buffer.omxBuffer.sharedMemory);
246 ASSERT_NE(buffer.mMemory, nullptr);
247 if (portMode == PortMode::DYNAMIC_ANW_BUFFER) {
248 android::VideoNativeMetadata* metaData =
249 static_cast<android::VideoNativeMetadata*>(
250 static_cast<void*>(buffer.mMemory->getPointer()));
251 metaData->nFenceFd = -1;
252 buffer.slot = -1;
253 }
254 omxNode->useBuffer(
255 portIndex, buffer.omxBuffer,
256 [&status, &buffer](
257 android::hardware::media::omx::V1_0::Status _s,
258 uint32_t id) {
259 status = _s;
260 buffer.id = id;
261 });
262 buffArray->push(buffer);
263 ASSERT_EQ(status,
264 ::android::hardware::media::omx::V1_0::Status::OK);
265 } 364 }
365 buffArray->push(buffer);
266 } 366 }
267} 367}
268 368
@@ -273,7 +373,7 @@ void changeStateLoadedtoIdle(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
273 android::Vector<BufferInfo>* iBuffer, 373 android::Vector<BufferInfo>* iBuffer,
274 android::Vector<BufferInfo>* oBuffer, 374 android::Vector<BufferInfo>* oBuffer,
275 OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, 375 OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
276 PortMode* portMode) { 376 PortMode* portMode, bool allocGrap) {
277 android::hardware::media::omx::V1_0::Status status; 377 android::hardware::media::omx::V1_0::Status status;
278 Message msg; 378 Message msg;
279 PortMode defaultPortMode[2], *pm; 379 PortMode defaultPortMode[2], *pm;
@@ -292,14 +392,16 @@ void changeStateLoadedtoIdle(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
292 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); 392 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT);
293 393
294 // allocate buffers on input port 394 // allocate buffers on input port
295 allocatePortBuffers(omxNode, iBuffer, kPortIndexInput, pm[0]); 395 ASSERT_NO_FATAL_FAILURE(allocatePortBuffers(
396 omxNode, iBuffer, kPortIndexInput, pm[0], allocGrap));
296 397
297 // Dont switch states until the ports are populated 398 // Dont switch states until the ports are populated
298 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); 399 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
299 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); 400 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT);
300 401
301 // allocate buffers on output port 402 // allocate buffers on output port
302 allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, pm[1]); 403 ASSERT_NO_FATAL_FAILURE(allocatePortBuffers(
404 omxNode, oBuffer, kPortIndexOutput, pm[1], allocGrap));
303 405
304 // As the ports are populated, check if the state transition is complete 406 // As the ports are populated, check if the state transition is complete
305 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); 407 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
@@ -439,6 +541,7 @@ void dispatchOutputBuffer(sp<IOmxNode> omxNode,
439 status = 541 status =
440 omxNode->fillBuffer((*buffArray)[bufferIndex].id, t, fenceNh); 542 omxNode->fillBuffer((*buffArray)[bufferIndex].id, t, fenceNh);
441 break; 543 break;
544 case PortMode::PRESET_ANW_BUFFER:
442 case PortMode::PRESET_SECURE_BUFFER: 545 case PortMode::PRESET_SECURE_BUFFER:
443 case PortMode::PRESET_BYTE_BUFFER: 546 case PortMode::PRESET_BYTE_BUFFER:
444 t.sharedMemory = android::hardware::hidl_memory(); 547 t.sharedMemory = android::hardware::hidl_memory();
@@ -545,43 +648,45 @@ void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
545 if (signalEOS) { 648 if (signalEOS) {
546 if ((i = getEmptyBufferID(iBuffer)) < iBuffer->size()) { 649 if ((i = getEmptyBufferID(iBuffer)) < iBuffer->size()) {
547 // signal an empty buffer with flag set to EOS 650 // signal an empty buffer with flag set to EOS
548 dispatchInputBuffer(omxNode, iBuffer, i, 0, OMX_BUFFERFLAG_EOS, 0); 651 ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer(omxNode, iBuffer, i, 0,
652 OMX_BUFFERFLAG_EOS, 0));
549 } else { 653 } else {
550 ASSERT_TRUE(false); 654 ASSERT_TRUE(false);
551 } 655 }
552 } 656 }
553 657
554 int timeOut = TIMEOUT_COUNTER; 658 int timeOut = TIMEOUT_COUNTER_PE;
555 while (timeOut--) { 659 while (timeOut--) {
556 // Dispatch all client owned output buffers to recover remaining frames 660 // Dispatch all client owned output buffers to recover remaining frames
557 while (1) { 661 while (1) {
558 if ((i = getEmptyBufferID(oBuffer)) < oBuffer->size()) { 662 if ((i = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
559 dispatchOutputBuffer(omxNode, oBuffer, i, pm[1]); 663 ASSERT_NO_FATAL_FAILURE(
664 dispatchOutputBuffer(omxNode, oBuffer, i, pm[1]));
560 // if dispatch is successful, perhaps there is a latency 665 // if dispatch is successful, perhaps there is a latency
561 // in the component. Dont be in a haste to leave. reset timeout 666 // in the component. Dont be in a haste to leave. reset timeout
562 // counter 667 // counter
563 timeOut = TIMEOUT_COUNTER; 668 timeOut = TIMEOUT_COUNTER_PE;
564 } else { 669 } else {
565 break; 670 break;
566 } 671 }
567 } 672 }
568 673
569 Message msg; 674 Message msg;
570 status = 675 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, iBuffer,
571 observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); 676 oBuffer);
572 if (status == android::hardware::media::omx::V1_0::Status::OK) { 677 if (status == android::hardware::media::omx::V1_0::Status::OK) {
573 if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { 678 if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
574 if (fptr) { 679 if (fptr) {
575 (*fptr)(omxNode, observer, iBuffer, oBuffer, 680 ASSERT_NO_FATAL_FAILURE((*fptr)(
576 kPortIndexInput, kPortIndexOutput, msg, pm[1], 681 omxNode, observer, iBuffer, oBuffer, kPortIndexInput,
577 args); 682 kPortIndexOutput, msg, pm[1], args));
578 } else { 683 } else {
579 // something unexpected happened 684 // something unexpected happened
580 EXPECT_TRUE(false); 685 ASSERT_TRUE(false);
581 } 686 }
582 } else { 687 } else {
583 // something unexpected happened 688 // something unexpected happened
584 EXPECT_TRUE(false); 689 ASSERT_TRUE(false);
585 } 690 }
586 } 691 }
587 if (eosFlag == true) break; 692 if (eosFlag == true) break;