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

Commit 335d3d98 authored by Ram Mohan M's avatar Ram Mohan M Committed by Pawin Vongmasa
Browse files

bug fix: handle portReconfiguration in testEOS()

When CSD and sync frame are sent together, component parses the
CSD and allocates buffers internal to the codec and decodes the frame
sent and port reconfiguration event is sent to the client. Now if this
is the only frame in the sequence, the client reaches testEOS(). But
port reconfiguration is not handled here. This is corrected.

bug: 62930419

Change-Id: Ic0c7625e3c2b415330f37734663f0cf7689e8734
parent 99d23a09
Loading
Loading
Loading
Loading
+31 −13
Original line number Diff line number Diff line
@@ -474,15 +474,20 @@ void GetURLForComponent(AudioDecHidlTest::standardComp comp, char* mURL,

// port settings reconfiguration during runtime. reconfigures sample rate and
// number
typedef struct {
    OMX_AUDIO_CODINGTYPE eEncoding;
    AudioDecHidlTest::standardComp comp;
} packedArgs;
void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                         android::Vector<BufferInfo>* iBuffer,
                         android::Vector<BufferInfo>* oBuffer,
                         OMX_AUDIO_CODINGTYPE eEncoding,
                         OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
                         Message msg,
                         AudioDecHidlTest::standardComp comp =
                             AudioDecHidlTest::standardComp::unknown_comp) {
                         Message msg, PortMode oPortMode, void* args) {
    android::hardware::media::omx::V1_0::Status status;
    packedArgs* audioArgs = static_cast<packedArgs*>(args);
    OMX_AUDIO_CODINGTYPE eEncoding = audioArgs->eEncoding;
    AudioDecHidlTest::standardComp comp = audioArgs->comp;
    (void)oPortMode;

    if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
        ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput);
@@ -580,8 +585,10 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
            observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
        if (status == android::hardware::media::omx::V1_0::Status::OK) {
            EXPECT_EQ(msg.type, Message::Type::EVENT);
            portReconfiguration(omxNode, observer, iBuffer, oBuffer, eEncoding,
                                kPortIndexInput, kPortIndexOutput, msg, comp);
            packedArgs audioArgs = {eEncoding, comp};
            portReconfiguration(omxNode, observer, iBuffer, oBuffer,
                                kPortIndexInput, kPortIndexOutput, msg,
                                PortMode::PRESET_BYTE_BUFFER, &audioArgs);
        }
        // status == TIMED_OUT, it could be due to process time being large
        // than DEFAULT_TIMEOUT or component needs output buffers to start
@@ -645,8 +652,10 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
        // Port Reconfiguration
        if (status == android::hardware::media::omx::V1_0::Status::OK &&
            msg.type == Message::Type::EVENT) {
            portReconfiguration(omxNode, observer, iBuffer, oBuffer, eEncoding,
                                kPortIndexInput, kPortIndexOutput, msg, comp);
            packedArgs audioArgs = {eEncoding, comp};
            portReconfiguration(omxNode, observer, iBuffer, oBuffer,
                                kPortIndexInput, kPortIndexOutput, msg,
                                PortMode::PRESET_BYTE_BUFFER, &audioArgs);
        }

        if (frameID == (int)Info->size() || frameID == (offset + range)) break;
@@ -791,7 +800,9 @@ TEST_F(AudioDecHidlTest, DecodeTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
                           kPortIndexInput, kPortIndexOutput, compName);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag);
    packedArgs audioArgs = {eEncoding, compName};
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
    EXPECT_EQ(timestampUslist.empty(), true);
    // set state to idle
    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
@@ -847,7 +858,9 @@ TEST_F(AudioDecHidlTest, DISABLED_EOSTest_M) {
    changeStateIdletoExecute(omxNode, observer);

    // request EOS at the start
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag);
    packedArgs audioArgs = {eEncoding, compName};
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    EXPECT_GE(framesReceived, 0U);
@@ -935,7 +948,9 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
                           kPortIndexInput, kPortIndexOutput, compName);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag);
    packedArgs audioArgs = {eEncoding, compName};
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    EXPECT_GE(framesReceived, 1U);
@@ -951,7 +966,8 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
                           kPortIndexInput, kPortIndexOutput, compName);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    EXPECT_GE(framesReceived, 1U);
@@ -1036,7 +1052,9 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
                           kPortIndexInput, kPortIndexOutput, compName);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag);
    packedArgs audioArgs = {eEncoding, compName};
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    framesReceived = 0;
+12 −2
Original line number Diff line number Diff line
@@ -513,7 +513,8 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
             android::Vector<BufferInfo>* iBuffer,
             android::Vector<BufferInfo>* oBuffer, bool signalEOS,
             bool& eosFlag, PortMode* portMode) {
             bool& eosFlag, PortMode* portMode, portreconfig fptr,
             OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, void* args) {
    android::hardware::media::omx::V1_0::Status status;
    PortMode defaultPortMode[2], *pm;

@@ -550,7 +551,16 @@ void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
        status =
            observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
        if (status == android::hardware::media::omx::V1_0::Status::OK) {
            if (msg.data.eventData.event == OMX_EventBufferFlag) {
            if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
                if (fptr) {
                    (*fptr)(omxNode, observer, iBuffer, oBuffer,
                            kPortIndexInput, kPortIndexOutput, msg, pm[1],
                            args);
                } else {
                    // something unexpected happened
                    EXPECT_TRUE(false);
                }
            } else if (msg.data.eventData.event == OMX_EventBufferFlag) {
                // soft omx components donot send this, we will just ignore it
                // for now
            } else {
+8 −1
Original line number Diff line number Diff line
@@ -312,9 +312,16 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                android::Vector<BufferInfo>* oBuffer, OMX_U32 kPortIndexInput,
                OMX_U32 kPortIndexOutput, int64_t timeoutUs = DEFAULT_TIMEOUT);

typedef void (*portreconfig)(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                             android::Vector<BufferInfo>* iBuffer,
                             android::Vector<BufferInfo>* oBuffer,
                             OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
                             Message msg, PortMode oPortMode, void* args);
void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
             android::Vector<BufferInfo>* iBuffer,
             android::Vector<BufferInfo>* oBuffer, bool signalEOS,
             bool& eosFlag, PortMode* portMode = nullptr);
             bool& eosFlag, PortMode* portMode = nullptr,
             portreconfig fptr = nullptr, OMX_U32 kPortIndexInput = 0,
             OMX_U32 kPortIndexOutput = 1, void* args = nullptr);

#endif  // MEDIA_HIDL_TEST_COMMON_H
+14 −8
Original line number Diff line number Diff line
@@ -474,8 +474,9 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
                         android::Vector<BufferInfo>* iBuffer,
                         android::Vector<BufferInfo>* oBuffer,
                         OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
                         Message msg, PortMode oPortMode) {
                         Message msg, PortMode oPortMode, void* args) {
    android::hardware::media::omx::V1_0::Status status;
    (void)args;

    if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
        ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput);
@@ -602,7 +603,7 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
            EXPECT_EQ(msg.type, Message::Type::EVENT);
            portReconfiguration(omxNode, observer, iBuffer, oBuffer,
                                kPortIndexInput, kPortIndexOutput, msg,
                                oPortMode);
                                oPortMode, nullptr);
        }
        // status == TIMED_OUT, it could be due to process time being large
        // than DEFAULT_TIMEOUT or component needs output buffers to start
@@ -668,7 +669,7 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
            msg.type == Message::Type::EVENT) {
            portReconfiguration(omxNode, observer, iBuffer, oBuffer,
                                kPortIndexInput, kPortIndexOutput, msg,
                                oPortMode);
                                oPortMode, nullptr);
        }

        if (frameID == (int)Info->size() || frameID == (offset + range)) break;
@@ -834,7 +835,8 @@ TEST_F(VideoDecHidlTest, DecodeTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
                           kPortIndexInput, kPortIndexOutput, portMode[1]);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
    EXPECT_EQ(timestampUslist.empty(), true);
    // set state to idle
    changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
@@ -884,7 +886,8 @@ TEST_F(VideoDecHidlTest, EOSTest_M) {
    changeStateIdletoExecute(omxNode, observer);

    // request EOS at the start
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    EXPECT_GE(framesReceived, 0U);
@@ -968,7 +971,8 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
                           kPortIndexInput, kPortIndexOutput, portMode[1]);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    EXPECT_GE(framesReceived, 1U);
@@ -983,7 +987,8 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
                           kPortIndexInput, kPortIndexOutput, portMode[1]);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    EXPECT_GE(framesReceived, 1U);
@@ -1066,7 +1071,8 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) {
    eleStream.close();
    waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
                           kPortIndexInput, kPortIndexOutput, portMode[1]);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode);
    testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
            portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
    flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
               kPortIndexOutput);
    framesReceived = 0;