From 0cf6b3df5ba7cb5bd56f88377401286f157cc7d9 Mon Sep 17 00:00:00 2001 From: Ram Mohan M Date: Thu, 24 Aug 2017 17:03:56 +0530 Subject: [PATCH] Signal eof flag for each input buffer As the client sends single frame worth of data for processing all the time, at the time of dispatch, signal eof flag for each buffer. Also code that was repititive and doesnt serve any need is removed. Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \ && vts-tradefed run commandAndExit vts \ --skip-all-system-status-check --primary-abi-only \ --skip-preconditions --module VtsHalMediaOmxV1_0Host \ -l INFO Bug: 63796949 Change-Id: I530cbe69c27f5e4b1fae56ab808ef63107586275 --- .../audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp | 35 ++++---------- .../audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp | 27 ++--------- .../video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp | 35 ++++---------- .../video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp | 53 +++++----------------- 4 files changed, 35 insertions(+), 115 deletions(-) diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 85207577..062bed4c 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -628,39 +628,16 @@ void decodeNFrames(sp omxNode, sp observer, AudioDecHidlTest::standardComp comp, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); - } - // dispatch input buffers + size_t index; uint32_t flags = 0; int frameID = offset; - for (size_t i = 0; (i < iBuffer->size()) && (frameID < (int)Info->size()) && - (frameID < (offset + range)); - i++) { - char* ipBuffer = static_cast( - static_cast((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE((*Info)[frameID].bytesCount, - static_cast((*iBuffer)[i].mMemory->getSize())); - eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); - ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); - flags = (*Info)[frameID].flags; - if (signalEOS && ((frameID == (int)Info->size() - 1) || - (frameID == (offset + range - 1)))) - flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, (*Info)[frameID].bytesCount, - flags, (*Info)[frameID].timestamp); - frameID++; - } - int timeOut = TIMEOUT_COUNTER_Q; bool iQueued, oQueued; + while (1) { iQueued = oQueued = false; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK && msg.type == Message::Type::EVENT) { @@ -673,7 +650,6 @@ void decodeNFrames(sp omxNode, sp observer, if (frameID == (int)Info->size() || frameID == (offset + range)) break; // Dispatch input buffer - size_t index = 0; if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { char* ipBuffer = static_cast( static_cast((*iBuffer)[index].mMemory->getPointer())); @@ -682,6 +658,11 @@ void decodeNFrames(sp omxNode, sp observer, eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); flags = (*Info)[frameID].flags; + // Indicate to omx core that the buffer contains a full frame worth + // of data + flags |= OMX_BUFFERFLAG_ENDOFFRAME; + // Indicate the omx core that this is the last buffer it needs to + // process if (signalEOS && ((frameID == (int)Info->size() - 1) || (frameID == (offset + range - 1)))) flags |= OMX_BUFFERFLAG_EOS; @@ -691,10 +672,12 @@ void decodeNFrames(sp omxNode, sp observer, frameID++; iQueued = true; } + // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); oQueued = true; } + // Reset Counters when either input or output buffer is dispatched if (iQueued || oQueued) timeOut = TIMEOUT_COUNTER_Q; else diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp index 038830dc..278e1962 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp @@ -376,44 +376,25 @@ void encodeNFrames(sp omxNode, sp observer, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); - } - // dispatch input buffers + size_t index; int bytesCount = samplesPerFrame * nChannels * 2; int32_t timestampIncr = (int)(((float)samplesPerFrame / nSampleRate) * 1000000); uint64_t timestamp = 0; uint32_t flags = 0; - for (size_t i = 0; i < iBuffer->size() && nFrames != 0; i++) { - char* ipBuffer = static_cast( - static_cast((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE(bytesCount, - static_cast((*iBuffer)[i].mMemory->getSize())); - eleStream.read(ipBuffer, bytesCount); - if (eleStream.gcount() != bytesCount) break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, timestamp); - timestamp += timestampIncr; - nFrames--; - } - int timeOut = TIMEOUT_COUNTER_Q; bool iQueued, oQueued; + while (1) { iQueued = oQueued = false; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - if (status == android::hardware::media::omx::V1_0::Status::OK) ASSERT_TRUE(false); if (nFrames == 0) break; // Dispatch input buffer - size_t index = 0; if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { char* ipBuffer = static_cast( static_cast((*iBuffer)[index].mMemory->getPointer())); @@ -421,7 +402,8 @@ void encodeNFrames(sp omxNode, sp observer, static_cast((*iBuffer)[index].mMemory->getSize())); eleStream.read(ipBuffer, bytesCount); if (eleStream.gcount() != bytesCount) break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; + flags = OMX_BUFFERFLAG_ENDOFFRAME; + if (signalEOS && (nFrames == 1)) flags |= OMX_BUFFERFLAG_EOS; dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, timestamp); timestamp += timestampIncr; @@ -433,6 +415,7 @@ void encodeNFrames(sp omxNode, sp observer, dispatchOutputBuffer(omxNode, oBuffer, index); oQueued = true; } + // Reset Counters when either input or output buffer is dispatched if (iQueued || oQueued) timeOut = TIMEOUT_COUNTER_Q; else diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index a5b5524b..6c588dd0 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -674,39 +674,16 @@ void decodeNFrames(sp omxNode, sp observer, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode); - } - // dispatch input buffers + size_t index; uint32_t flags = 0; int frameID = offset; - for (size_t i = 0; (i < iBuffer->size()) && (frameID < (int)Info->size()) && - (frameID < (offset + range)); - i++) { - char* ipBuffer = static_cast( - static_cast((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE((*Info)[frameID].bytesCount, - static_cast((*iBuffer)[i].mMemory->getSize())); - eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); - ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); - flags = (*Info)[frameID].flags; - if (signalEOS && ((frameID == (int)Info->size() - 1) || - (frameID == (offset + range - 1)))) - flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, (*Info)[frameID].bytesCount, - flags, (*Info)[frameID].timestamp); - frameID++; - } - int timeOut = TIMEOUT_COUNTER_Q; bool iQueued, oQueued; + while (1) { iQueued = oQueued = false; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK && msg.type == Message::Type::EVENT) { @@ -718,7 +695,6 @@ void decodeNFrames(sp omxNode, sp observer, if (frameID == (int)Info->size() || frameID == (offset + range)) break; // Dispatch input buffer - size_t index = 0; if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { char* ipBuffer = static_cast( static_cast((*iBuffer)[index].mMemory->getPointer())); @@ -727,6 +703,11 @@ void decodeNFrames(sp omxNode, sp observer, eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); flags = (*Info)[frameID].flags; + // Indicate to omx core that the buffer contains a full frame worth + // of data + flags |= OMX_BUFFERFLAG_ENDOFFRAME; + // Indicate the omx core that this is the last buffer it needs to + // process if (signalEOS && ((frameID == (int)Info->size() - 1) || (frameID == (offset + range - 1)))) flags |= OMX_BUFFERFLAG_EOS; @@ -736,10 +717,12 @@ void decodeNFrames(sp omxNode, sp observer, frameID++; iQueued = true; } + // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode); oQueued = true; } + // Reset Counters when either input or output buffer is dispatched if (iQueued || oQueued) timeOut = TIMEOUT_COUNTER_Q; else diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp index 23f051d8..74b995b9 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp @@ -983,58 +983,25 @@ void encodeNFrames(sp omxNode, sp observer, sp listener = nullptr) { android::hardware::media::omx::V1_0::Status status; Message msg; - uint32_t ipCount = 0; + uint64_t timestamp = 0; + uint32_t flags = 0; + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; + uint32_t ipCount = 0; if (ipCount == 0) { status = changeFrameRate(omxNode, portIndexOutput, (24U << 16)); if (status == ::android::hardware::media::omx::V1_0::Status::OK) xFramerate = (24U << 16); } - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); - } - // dispatch input buffers int32_t timestampIncr = (int)((float)1000000 / (xFramerate >> 16)); - // timestamp scale = Nano sec - if (inputDataIsMeta) timestampIncr *= 1000; - uint64_t timestamp = 0; - uint32_t flags = 0; - for (size_t i = 0; i < iBuffer->size() && nFrames != 0; i++) { - if (inputDataIsMeta) { - if (listener->freeBuffers > listener->minUnDequeuedCount) { - if (dispatchGraphicBuffer(omxNode, producer, listener, iBuffer, - portIndexInput, eleStream, timestamp)) - break; - timestamp += timestampIncr; - nFrames--; - ipCount++; - } - } else { - char* ipBuffer = static_cast( - static_cast((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE(bytesCount, - static_cast((*iBuffer)[i].mMemory->getSize())); - if (fillByteBuffer(omxNode, ipBuffer, portIndexInput, eleStream)) - break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, - timestamp); - if (timestampUslist) timestampUslist->push_back(timestamp); - timestamp += timestampIncr; - nFrames--; - ipCount++; - } - } + if (inputDataIsMeta) timestampIncr *= 1000; // timestamp scale: Nano sec - int timeOut = TIMEOUT_COUNTER_Q; - bool iQueued, oQueued; while (1) { iQueued = oQueued = false; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); - + // Port Reconfiguration if (status == android::hardware::media::omx::V1_0::Status::OK) { ASSERT_EQ(msg.type, Message::Type::EVENT); if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { @@ -1076,7 +1043,8 @@ void encodeNFrames(sp omxNode, sp observer, if (fillByteBuffer(omxNode, ipBuffer, portIndexInput, eleStream)) break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; + flags = OMX_BUFFERFLAG_ENDOFFRAME; + if (signalEOS && (nFrames == 1)) flags |= OMX_BUFFERFLAG_EOS; dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, timestamp); if (timestampUslist) timestampUslist->push_back(timestamp); @@ -1086,10 +1054,12 @@ void encodeNFrames(sp omxNode, sp observer, iQueued = true; } } + // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); oQueued = true; } + // Reset Counters when either input or output buffer is dispatched if (iQueued || oQueued) timeOut = TIMEOUT_COUNTER_Q; else @@ -1098,6 +1068,7 @@ void encodeNFrames(sp omxNode, sp observer, EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; } + // Runtime Param Configuration if (ipCount == 15) { changeBitrate(omxNode, portIndexOutput, 768000); requestIDR(omxNode, portIndexOutput); -- 2.11.0