summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp')
-rw-r--r--media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp244
1 files changed, 172 insertions, 72 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..28616e21 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,156 @@ 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 EXPECT_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 EXPECT_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 int32_t nStride;
323 buffer->owner = client;
324 buffer->omxBuffer.type = CodecBuffer::Type::ANW_BUFFER;
325 allocateGraphicBuffers(omxNode, portIndex, buffer,
326 portDef.format.video.nFrameWidth,
327 portDef.format.video.nFrameHeight, &nStride,
328 portDef.format.video.eColorFormat);
329 omxNode->useBuffer(
330 portIndex, buffer->omxBuffer,
331 [&status, &buffer](android::hardware::media::omx::V1_0::Status _s,
332 uint32_t id) {
333 status = _s;
334 buffer->id = id;
335 });
336 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
337 }
338}
339
189// allocate buffers needed on a component port 340// allocate buffers needed on a component port
190void allocatePortBuffers(sp<IOmxNode> omxNode, 341void allocatePortBuffers(sp<IOmxNode> omxNode,
191 android::Vector<BufferInfo>* buffArray, 342 android::Vector<BufferInfo>* buffArray,
192 OMX_U32 portIndex, PortMode portMode) { 343 OMX_U32 portIndex, PortMode portMode, bool allocGrap) {
193 android::hardware::media::omx::V1_0::Status status; 344 android::hardware::media::omx::V1_0::Status status;
194 OMX_PARAM_PORTDEFINITIONTYPE portDef; 345 OMX_PARAM_PORTDEFINITIONTYPE portDef;
195 346
@@ -199,70 +350,18 @@ void allocatePortBuffers(sp<IOmxNode> omxNode,
199 &portDef); 350 &portDef);
200 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 351 ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
201 352
202 if (portMode == PortMode::PRESET_SECURE_BUFFER) { 353 for (size_t i = 0; i < portDef.nBufferCountActual; i++) {
203 for (size_t i = 0; i < portDef.nBufferCountActual; i++) { 354 BufferInfo buffer;
204 BufferInfo buffer; 355 allocateBuffer(omxNode, &buffer, portIndex, portDef.nBufferSize,
205 buffer.owner = client; 356 portMode);
206 buffer.omxBuffer.type = CodecBuffer::Type::NATIVE_HANDLE; 357 if (allocGrap && portMode == PortMode::DYNAMIC_ANW_BUFFER) {
207 omxNode->allocateSecureBuffer( 358 int32_t nStride;
208 portIndex, portDef.nBufferSize, 359 allocateGraphicBuffers(omxNode, portIndex, &buffer,
209 [&status, &buffer]( 360 portDef.format.video.nFrameWidth,
210 android::hardware::media::omx::V1_0::Status _s, uint32_t id, 361 portDef.format.video.nFrameHeight, &nStride,
211 ::android::hardware::hidl_handle const& nativeHandle) { 362 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 } 363 }
364 buffArray->push(buffer);
266 } 365 }
267} 366}
268 367
@@ -273,7 +372,7 @@ void changeStateLoadedtoIdle(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
273 android::Vector<BufferInfo>* iBuffer, 372 android::Vector<BufferInfo>* iBuffer,
274 android::Vector<BufferInfo>* oBuffer, 373 android::Vector<BufferInfo>* oBuffer,
275 OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, 374 OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
276 PortMode* portMode) { 375 PortMode* portMode, bool allocGrap) {
277 android::hardware::media::omx::V1_0::Status status; 376 android::hardware::media::omx::V1_0::Status status;
278 Message msg; 377 Message msg;
279 PortMode defaultPortMode[2], *pm; 378 PortMode defaultPortMode[2], *pm;
@@ -292,14 +391,14 @@ void changeStateLoadedtoIdle(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
292 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); 391 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT);
293 392
294 // allocate buffers on input port 393 // allocate buffers on input port
295 allocatePortBuffers(omxNode, iBuffer, kPortIndexInput, pm[0]); 394 allocatePortBuffers(omxNode, iBuffer, kPortIndexInput, pm[0], allocGrap);
296 395
297 // Dont switch states until the ports are populated 396 // Dont switch states until the ports are populated
298 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); 397 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
299 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); 398 ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT);
300 399
301 // allocate buffers on output port 400 // allocate buffers on output port
302 allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, pm[1]); 401 allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, pm[1], allocGrap);
303 402
304 // As the ports are populated, check if the state transition is complete 403 // As the ports are populated, check if the state transition is complete
305 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); 404 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
@@ -439,6 +538,7 @@ void dispatchOutputBuffer(sp<IOmxNode> omxNode,
439 status = 538 status =
440 omxNode->fillBuffer((*buffArray)[bufferIndex].id, t, fenceNh); 539 omxNode->fillBuffer((*buffArray)[bufferIndex].id, t, fenceNh);
441 break; 540 break;
541 case PortMode::PRESET_ANW_BUFFER:
442 case PortMode::PRESET_SECURE_BUFFER: 542 case PortMode::PRESET_SECURE_BUFFER:
443 case PortMode::PRESET_BYTE_BUFFER: 543 case PortMode::PRESET_BYTE_BUFFER:
444 t.sharedMemory = android::hardware::hidl_memory(); 544 t.sharedMemory = android::hardware::hidl_memory();
@@ -551,7 +651,7 @@ void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
551 } 651 }
552 } 652 }
553 653
554 int timeOut = TIMEOUT_COUNTER; 654 int timeOut = TIMEOUT_COUNTER_PE;
555 while (timeOut--) { 655 while (timeOut--) {
556 // Dispatch all client owned output buffers to recover remaining frames 656 // Dispatch all client owned output buffers to recover remaining frames
557 while (1) { 657 while (1) {
@@ -560,15 +660,15 @@ void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
560 // if dispatch is successful, perhaps there is a latency 660 // if dispatch is successful, perhaps there is a latency
561 // in the component. Dont be in a haste to leave. reset timeout 661 // in the component. Dont be in a haste to leave. reset timeout
562 // counter 662 // counter
563 timeOut = TIMEOUT_COUNTER; 663 timeOut = TIMEOUT_COUNTER_PE;
564 } else { 664 } else {
565 break; 665 break;
566 } 666 }
567 } 667 }
568 668
569 Message msg; 669 Message msg;
570 status = 670 status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, iBuffer,
571 observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); 671 oBuffer);
572 if (status == android::hardware::media::omx::V1_0::Status::OK) { 672 if (status == android::hardware::media::omx::V1_0::Status::OK) {
573 if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { 673 if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
574 if (fptr) { 674 if (fptr) {