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

Commit f16a0b73 authored by Andreas Huber's avatar Andreas Huber
Browse files

do not merge: The qcom video decoders always output yuv data after adjusting...

do not merge: The qcom video decoders always output yuv data after adjusting dimensions to be a multiple of 16.

Add a quirk mode to OMXCodec that makes it aware of this fact for proper display. Also integrate back a change from eclair-mr2 that delays releasing an output buffer briefly after posting it to surface flinger, as we don't know how long it'll take it to actually display the buffer's content.
parent 61462b43
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ private:
        kRequiresFlushCompleteEmulation      = 16,
        kRequiresAllocateBufferOnOutputPorts = 32,
        kRequiresFlushBeforeShutdown         = 64,
        kOutputDimensionsAre16Aligned        = 128,
    };

    struct BufferInfo {
+3 −1
Original line number Diff line number Diff line
@@ -210,6 +210,7 @@ sp<OMXCodec> OMXCodec::Create(
    uint32_t quirks = 0;
    if (!strcmp(componentName, "OMX.PV.avcdec")) {
        quirks |= kWantsNALFragments;
        quirks |= kOutputDimensionsAre16Aligned;
    }
    if (!strcmp(componentName, "OMX.TI.MP3.decode")) {
        quirks |= kNeedsFlushBeforeDisable;
@@ -231,6 +232,7 @@ sp<OMXCodec> OMXCodec::Create(
        // XXX Required on P....on only.
        quirks |= kRequiresAllocateBufferOnInputPorts;
        quirks |= kRequiresAllocateBufferOnOutputPorts;
        quirks |= kOutputDimensionsAre16Aligned;
    }

    if (!strncmp(componentName, "OMX.TI.", 7)) {
@@ -2386,7 +2388,7 @@ void OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) {
                CHECK(!"Unknown compression format.");
            }

            if (!strcmp(mComponentName, "OMX.PV.avcdec")) {
            if (mQuirks & kOutputDimensionsAre16Aligned) {
                // This component appears to be lying to me.
                mOutputFormat->setInt32(
                        kKeyWidth, (video_def->nFrameWidth + 15) & -16);
+5 −0
Original line number Diff line number Diff line
@@ -83,6 +83,11 @@ void QComHardwareRenderer::render(
    }

    mISurface->postBuffer(offset);

    // Since we cannot tell how long it'll take until surface flinger
    // has displayed the data onscreen, we'll just have to guess...
    // We must not return the buffer to the decoder before it's been displayed.
    usleep(25000);
}

bool QComHardwareRenderer::getOffset(void *platformPrivate, size_t *offset) {