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

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

I accidentally broken passion encoding while working around problems with the sholes encoder.

Change-Id: Id91b837ed17083cb21efb08e1c1ab9cc3ff3fa8f
parent e2018ca9
Loading
Loading
Loading
Loading
+58 −8
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ private:

    void *mCodecSpecificData;
    size_t mCodecSpecificDataSize;
    bool mGotAllCodecSpecificData;

    bool mReachedEOS;

@@ -358,6 +359,7 @@ MPEG4Writer::Track::Track(
      mMaxTimeStampUs(0),
      mCodecSpecificData(NULL),
      mCodecSpecificDataSize(0),
      mGotAllCodecSpecificData(false),
      mReachedEOS(false) {
}

@@ -418,14 +420,58 @@ void *MPEG4Writer::Track::ThreadWrapper(void *me) {
    return NULL;
}

#include <ctype.h>
static void hexdump(const void *_data, size_t size) {
    const uint8_t *data = (const uint8_t *)_data;
    size_t offset = 0;
    while (offset < size) {
        printf("0x%04x  ", offset);

        size_t n = size - offset;
        if (n > 16) {
            n = 16;
        }

        for (size_t i = 0; i < 16; ++i) {
            if (i == 8) {
                printf(" ");
            }

            if (offset + i < size) {
                printf("%02x ", data[offset + i]);
            } else {
                printf("   ");
            }
        }

        printf(" ");

        for (size_t i = 0; i < n; ++i) {
            if (isprint(data[offset + i])) {
                printf("%c", data[offset + i]);
            } else {
                printf(".");
            }
        }

        printf("\n");

        offset += 16;
    }
}


status_t MPEG4Writer::Track::makeAVCCodecSpecificData(
        const uint8_t *data, size_t size) {
    // hexdump(data, size);

    if (mCodecSpecificData != NULL) {
        LOGE("Already have codec specific data");
        return ERROR_MALFORMED;
    }

    if (size < 4 || memcmp("\x00\x00\x00\x01", data, 4)) {
        // Must start with a start-code.
        LOGE("Must start with a start code");
        return ERROR_MALFORMED;
    }

@@ -436,7 +482,7 @@ status_t MPEG4Writer::Track::makeAVCCodecSpecificData(
    }

    if (picParamOffset + 3 >= size) {
        // Could not find start-code for pictureParameterSet.
        LOGE("Could not find start-code for pictureParameterSet");
        return ERROR_MALFORMED;
    }

@@ -494,6 +540,8 @@ void MPEG4Writer::Track::threadEntry() {
        int32_t isCodecConfig;
        if (buffer->meta_data()->findInt32(kKeyIsCodecConfig, &isCodecConfig)
                && isCodecConfig) {
            CHECK(!mGotAllCodecSpecificData);

            if (is_avc) {
                status_t err = makeAVCCodecSpecificData(
                        (const uint8_t *)buffer->data()
@@ -505,10 +553,6 @@ void MPEG4Writer::Track::threadEntry() {
                    break;
                }
            } else if (is_mpeg4) {
                if (mCodecSpecificData != NULL) {
                    break;
                }

                mCodecSpecificDataSize = buffer->range_length();
                mCodecSpecificData = malloc(mCodecSpecificDataSize);
                memcpy(mCodecSpecificData,
@@ -520,8 +564,10 @@ void MPEG4Writer::Track::threadEntry() {
            buffer->release();
            buffer = NULL;

            mGotAllCodecSpecificData = true;
            continue;
        } else if (count == 1 && is_mpeg4 && mCodecSpecificData == NULL) {
        } else if (!mGotAllCodecSpecificData &&
                count == 1 && is_mpeg4 && mCodecSpecificData == NULL) {
            // The TI mpeg4 encoder does not properly set the
            // codec-specific-data flag.

@@ -559,7 +605,9 @@ void MPEG4Writer::Track::threadEntry() {

                continue;
            }
        } else if (is_avc && count < 3) {

            mGotAllCodecSpecificData = true;
        } else if (!mGotAllCodecSpecificData && is_avc && count < 3) {
            // The TI video encoder does not flag codec specific data
            // as such and also splits up SPS and PPS across two buffers.

@@ -599,6 +647,8 @@ void MPEG4Writer::Track::threadEntry() {
                    LOGE("failed to parse avc codec specific data.");
                    break;
                }

                mGotAllCodecSpecificData = true;
            }

            continue;