Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9a9c8da3 authored by Zhuoyao Zhang's avatar Zhuoyao Zhang Committed by Android (Google) Code Review
Browse files

Merge "Omx vts test." into oc-dev

parents fd8da20e ccc194cf
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ subdirs = [
    "1.0",
    "omx/1.0",
    "omx/1.0/vts/functional/audio",
    "omx/1.0/vts/functional/common",
    "omx/1.0/vts/functional/component",
    "omx/1.0/vts/functional/master",
    "omx/1.0/vts/functional/video",
+4 −2
Original line number Diff line number Diff line
@@ -34,7 +34,8 @@ cc_test {
        "android.hidl.memory@1.0",
        "android.hardware.media.omx@1.0",
    ],
    static_libs: ["VtsHalHidlTargetTestBase"],
    static_libs: ["VtsHalHidlTargetTestBase",
                  "VtsHalMediaOmxV1_0CommonUtil"],
    cflags: [
        "-O0",
        "-g",
@@ -65,7 +66,8 @@ cc_test {
        "android.hidl.memory@1.0",
        "android.hardware.media.omx@1.0",
    ],
    static_libs: ["VtsHalHidlTargetTestBase"],
    static_libs: ["VtsHalHidlTargetTestBase",
                  "VtsHalMediaOmxV1_0CommonUtil"],
    cflags: [
        "-O0",
        "-g",
+45 −50
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ using ::android::hardware::media::omx::V1_0::IOmxObserver;
using ::android::hardware::media::omx::V1_0::IOmxNode;
using ::android::hardware::media::omx::V1_0::Message;
using ::android::hardware::media::omx::V1_0::CodecBuffer;
using ::android::hardware::media::omx::V1_0::PortMode;
using ::android::hidl::allocator::V1_0::IAllocator;
using ::android::hidl::memory::V1_0::IMemory;
using ::android::hidl::memory::V1_0::IMapper;
@@ -136,7 +137,9 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
            gEnv->getInstance());
        ASSERT_NE(omx, nullptr);
        observer =
            new CodecObserver([this](Message msg) { handleMessage(msg); });
            new CodecObserver([this](Message msg, const BufferInfo* buffer) {
                handleMessage(msg, buffer);
            });
        ASSERT_NE(observer, nullptr);
        if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0)
            disableTest = true;
@@ -218,7 +221,8 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {

    // callback function to process messages received by onMessages() from IL
    // client.
    void handleMessage(Message msg) {
    void handleMessage(Message msg, const BufferInfo* buffer) {
        (void)buffer;
        if (msg.type == Message::Type::FILL_BUFFER_DONE) {
            if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) {
                eosFlag = true;
@@ -254,12 +258,25 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
                        }
                    }
                }
#define WRITE_OUTPUT 0
#if WRITE_OUTPUT
                static int count = 0;
                FILE* ofp = nullptr;
                if (count)
                    ofp = fopen("out.bin", "ab");
                else
                    ofp = fopen("out.bin", "wb");
                if (ofp != nullptr) {
                    fwrite(static_cast<void*>(buffer->mMemory->getPointer()),
                           sizeof(char),
                           msg.data.extendedBufferData.rangeLength, ofp);
                    fclose(ofp);
                    count++;
                }
#endif
            }
        }
    }

    void testEOS(android::Vector<BufferInfo>* iBuffer,
                 android::Vector<BufferInfo>* oBuffer, bool signalEOS = false);

    enum standardComp {
        mp3,
@@ -294,44 +311,6 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
    }
};

// end of stream test for audio decoder components
void AudioDecHidlTest::testEOS(android::Vector<BufferInfo>* iBuffer,
                               android::Vector<BufferInfo>* oBuffer,
                               bool signalEOS) {
    android::hardware::media::omx::V1_0::Status status;
    size_t i = 0;
    if (signalEOS) {
        if ((i = getEmptyBufferID(iBuffer)) < iBuffer->size()) {
            // signal an empty buffer with flag set to EOS
            dispatchInputBuffer(omxNode, iBuffer, i, 0, OMX_BUFFERFLAG_EOS, 0);
        } else {
            ASSERT_TRUE(false);
        }
    }
    // Dispatch all client owned output buffers to recover remaining frames
    while (1) {
        if ((i = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
            dispatchOutputBuffer(omxNode, oBuffer, i);
        } else {
            break;
        }
    }
    while (1) {
        Message msg;
        status =
            observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
        EXPECT_EQ(status,
                  android::hardware::media::omx::V1_0::Status::TIMED_OUT);
        for (; i < iBuffer->size(); i++) {
            if ((*iBuffer)[i].owner != client) break;
        }
        if (i == iBuffer->size()) break;
    }
    // test for flag
    EXPECT_EQ(eosFlag, true);
    eosFlag = false;
}

// Set Default port param.
void setDefaultPortParam(
    sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding,
@@ -580,8 +559,9 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                            OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput) {
    android::hardware::media::omx::V1_0::Status status;
    Message msg;
    int timeOut = TIMEOUT_COUNTER;

    while (1) {
    while (timeOut--) {
        size_t i = 0;
        status =
            observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
@@ -603,6 +583,7 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
        if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
            dispatchOutputBuffer(omxNode, oBuffer, index);
        }
        timeOut--;
    }
}

@@ -642,6 +623,8 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
        frameID++;
    }

    int timeOut = TIMEOUT_COUNTER;
    bool stall = false;
    while (1) {
        status =
            observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
@@ -672,9 +655,21 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                                (*Info)[frameID].bytesCount, flags,
                                (*Info)[frameID].timestamp);
            frameID++;
        }
            stall = false;
        } else
            stall = true;
        if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
            dispatchOutputBuffer(omxNode, oBuffer, index);
            stall = false;
        } else
            stall = true;
        if (stall)
            timeOut--;
        else
            timeOut = TIMEOUT_COUNTER;
        if (timeOut == 0) {
            EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite";
            break;
        }
    }
}
@@ -778,7 +773,7 @@ TEST_F(AudioDecHidlTest, DecodeTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
                           kPortIndexInput, kPortIndexOutput);
    testEOS(&iBuffer, &oBuffer);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag);
    EXPECT_EQ(timestampUslist.empty(), true);
    // set state to idle
    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
@@ -825,7 +820,7 @@ TEST_F(AudioDecHidlTest, EOSTest_M) {
    changeStateIdletoExecute(omxNode, observer);

    // request EOS at the start
    testEOS(&iBuffer, &oBuffer, true);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    EXPECT_GE(framesReceived, 0U);
@@ -908,7 +903,7 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
                           kPortIndexInput, kPortIndexOutput);
    testEOS(&iBuffer, &oBuffer);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    EXPECT_GE(framesReceived, 1U);
@@ -924,7 +919,7 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
                           kPortIndexInput, kPortIndexOutput);
    testEOS(&iBuffer, &oBuffer, true);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    EXPECT_GE(framesReceived, 1U);
@@ -1004,7 +999,7 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
                           kPortIndexInput, kPortIndexOutput);
    testEOS(&iBuffer, &oBuffer);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    framesReceived = 0;
+98 −12
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ using ::android::hardware::media::omx::V1_0::IOmxObserver;
using ::android::hardware::media::omx::V1_0::IOmxNode;
using ::android::hardware::media::omx::V1_0::Message;
using ::android::hardware::media::omx::V1_0::CodecBuffer;
using ::android::hardware::media::omx::V1_0::PortMode;
using ::android::hidl::allocator::V1_0::IAllocator;
using ::android::hidl::memory::V1_0::IMemory;
using ::android::hidl::memory::V1_0::IMapper;
@@ -135,7 +136,10 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
        omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>(
            gEnv->getInstance());
        ASSERT_NE(omx, nullptr);
        observer = new CodecObserver([this](Message msg) { (void)msg; });
        observer =
            new CodecObserver([this](Message msg, const BufferInfo* buffer) {
                handleMessage(msg, buffer);
            });
        ASSERT_NE(observer, nullptr);
        if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0)
            disableTest = true;
@@ -191,6 +195,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
            }
        }
        if (i == kNumCompToCoding) disableTest = true;
        eosFlag = false;
        if (disableTest) std::cerr << "[          ] Warning !  Test Disabled\n";
    }

@@ -201,6 +206,36 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
        }
    }

    // callback function to process messages received by onMessages() from IL
    // client.
    void handleMessage(Message msg, const BufferInfo* buffer) {
        (void)buffer;

        if (msg.type == Message::Type::FILL_BUFFER_DONE) {
            if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) {
                eosFlag = true;
            }
            if (msg.data.extendedBufferData.rangeLength != 0) {
#define WRITE_OUTPUT 0
#if WRITE_OUTPUT
                static int count = 0;
                FILE* ofp = nullptr;
                if (count)
                    ofp = fopen("out.bin", "ab");
                else
                    ofp = fopen("out.bin", "wb");
                if (ofp != nullptr) {
                    fwrite(static_cast<void*>(buffer->mMemory->getPointer()),
                           sizeof(char),
                           msg.data.extendedBufferData.rangeLength, ofp);
                    fclose(ofp);
                    count++;
                }
#endif
            }
        }
    }

    enum standardComp {
        amrnb,
        amrwb,
@@ -215,6 +250,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
    standardComp compName;
    OMX_AUDIO_CODINGTYPE eEncoding;
    bool disableTest;
    bool eosFlag;

   protected:
    static void description(const std::string& description) {
@@ -289,12 +325,44 @@ void GetURLForComponent(AudioEncHidlTest::standardComp comp, char* mURL) {
    }
}

// blocking call to ensures application to Wait till all the inputs are consumed
void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                            android::Vector<BufferInfo>* iBuffer,
                            android::Vector<BufferInfo>* oBuffer) {
    android::hardware::media::omx::V1_0::Status status;
    Message msg;
    int timeOut = TIMEOUT_COUNTER;

    while (timeOut--) {
        size_t i = 0;
        status =
            observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
        EXPECT_EQ(status,
                  android::hardware::media::omx::V1_0::Status::TIMED_OUT);
        // status == TIMED_OUT, it could be due to process time being large
        // than DEFAULT_TIMEOUT or component needs output buffers to start
        // processing.
        for (; i < iBuffer->size(); i++) {
            if ((*iBuffer)[i].owner != client) break;
        }
        if (i == iBuffer->size()) break;

        // Dispatch an output buffer assuming outQueue.empty() is true
        size_t index;
        if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
            dispatchOutputBuffer(omxNode, oBuffer, index);
        }
        timeOut--;
    }
}

// Encode N Frames
void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                   android::Vector<BufferInfo>* iBuffer,
                   android::Vector<BufferInfo>* oBuffer, uint32_t nFrames,
                   int32_t samplesPerFrame, int32_t nChannels,
                   int32_t nSampleRate, std::ifstream& eleStream) {
                   int32_t nSampleRate, std::ifstream& eleStream,
                   bool signalEOS = true) {
    android::hardware::media::omx::V1_0::Status status;
    Message msg;

@@ -307,6 +375,7 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
    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<char*>(
            static_cast<void*>((*iBuffer)[i].mMemory->getPointer()));
@@ -314,11 +383,14 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                  static_cast<int>((*iBuffer)[i].mMemory->getSize()));
        eleStream.read(ipBuffer, bytesCount);
        if (eleStream.gcount() != bytesCount) break;
        dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, 0, timestamp);
        if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS;
        dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, timestamp);
        timestamp += timestampIncr;
        nFrames--;
    }

    int timeOut = TIMEOUT_COUNTER;
    bool stall = false;
    while (1) {
        status =
            observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
@@ -337,14 +409,27 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                      static_cast<int>((*iBuffer)[index].mMemory->getSize()));
            eleStream.read(ipBuffer, bytesCount);
            if (eleStream.gcount() != bytesCount) break;
            dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, 0,
            if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS;
            dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags,
                                timestamp);
            timestamp += timestampIncr;
            nFrames--;
        }
            stall = false;
        } else
            stall = true;
        // Dispatch output buffer
        if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
            dispatchOutputBuffer(omxNode, oBuffer, index);
            stall = false;
        } else
            stall = true;
        if (stall)
            timeOut--;
        else
            timeOut = TIMEOUT_COUNTER;
        if (timeOut == 0) {
            EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite";
            break;
        }
    }
}
@@ -380,8 +465,8 @@ TEST_F(AudioEncHidlTest, EnumeratePortFormat) {
}

// test raw stream encode
TEST_F(AudioEncHidlTest, EncodeTest) {
    description("Tests Encode");
TEST_F(AudioEncHidlTest, SimpleEncodeTest) {
    description("Tests Basic encoding and EOS");
    if (disableTest) return;
    android::hardware::media::omx::V1_0::Status status;
    uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
@@ -399,8 +484,6 @@ TEST_F(AudioEncHidlTest, EncodeTest) {
    GetURLForComponent(compName, mURL);

    std::ifstream eleStream;
    eleStream.open(mURL, std::ifstream::binary);
    ASSERT_EQ(eleStream.is_open(), true);

    // Configure input port
    int32_t nChannels = 2;
@@ -449,16 +532,19 @@ TEST_F(AudioEncHidlTest, EncodeTest) {
    // set state to executing
    changeStateIdletoExecute(omxNode, observer);

    encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 1024, samplesPerFrame,
    eleStream.open(mURL, std::ifstream::binary);
    ASSERT_EQ(eleStream.is_open(), true);
    encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 128, samplesPerFrame,
                  nChannels, nSampleRate, eleStream);
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag);

    // set state to idle
    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
    // set state to executing
    changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
                            kPortIndexInput, kPortIndexOutput);

    eleStream.close();
}

int main(int argc, char** argv) {
+1 −271

File changed.

Preview size limit exceeded, changes collapsed.

Loading