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

Commit cd72c757 authored by Christopher R. Palmer's avatar Christopher R. Palmer Committed by Zhao Wei Liew
Browse files

libstagefright: Restore AOSP's handling of 24/32-bit wav files

Presumably Steve changed this to make it better, but since it is
broken lets restore the downsampling code from AOSP and at least the
audio tracks won't be corrupted until someone really fixes what he
was trying to backport here.

This fixes, for example, Google Allo's notification sounds being corrupt
(static).

Change-Id: I58a0d4e4ea8650014919c95b6f9895981db93208
(cherry picked from commit e6901199)
parent 7938c6d5
Loading
Loading
Loading
Loading
+16 −27
Original line number Original line Diff line number Diff line
@@ -390,8 +390,8 @@ status_t WAVSource::start(MetaData * /* params */) {
    // some WAV files may have large audio buffers that use shared memory transfer.
    // some WAV files may have large audio buffers that use shared memory transfer.
    mGroup = new MediaBufferGroup(4 /* buffers */, kMaxFrameSize);
    mGroup = new MediaBufferGroup(4 /* buffers */, kMaxFrameSize);


    if (mBitsPerSample == 8 || mBitsPerSample == 24) {
    if (mBitsPerSample == 8) {
        // As a temporary buffer for 8->16/24->32 bit conversion.
        // As a temporary buffer for 8->16 bit conversion.
        mGroup->add_buffer(new MediaBuffer(kMaxFrameSize));
        mGroup->add_buffer(new MediaBuffer(kMaxFrameSize));
    }
    }


@@ -455,13 +455,9 @@ status_t WAVSource::read(
    }
    }


    // make sure that maxBytesToRead is multiple of 3, in 24-bit case
    // make sure that maxBytesToRead is multiple of 3, in 24-bit case
    size_t maxBytesToRead;
    size_t maxBytesToRead =
    if(8 == mBitsPerSample)
        mBitsPerSample == 8 ? kMaxFrameSize / 2 : 
        maxBytesToRead = kMaxFrameSize / 2;
        (mBitsPerSample == 24 ? 3*(kMaxFrameSize/3): kMaxFrameSize);
    else if (24 == mBitsPerSample) {
        maxBytesToRead = 3*(kMaxFrameSize/4);
    } else
        maxBytesToRead = kMaxFrameSize;
    ALOGV("%s mBitsPerSample %d, kMaxFrameSize %zu, ",
    ALOGV("%s mBitsPerSample %d, kMaxFrameSize %zu, ",
          __func__, mBitsPerSample, kMaxFrameSize);
          __func__, mBitsPerSample, kMaxFrameSize);


@@ -513,24 +509,17 @@ status_t WAVSource::read(
            buffer->release();
            buffer->release();
            buffer = tmp;
            buffer = tmp;
        } else if (mBitsPerSample == 24) {
        } else if (mBitsPerSample == 24) {
            // Padding done here to convert to 32-bit samples
            // Convert 24-bit signed samples to 16-bit signed in place
            MediaBuffer *tmp;
            const size_t numSamples = n / 3;
            CHECK_EQ(mGroup->acquire_buffer(&tmp), (status_t)OK);

            ssize_t numBytes = buffer->range_length() / 3;
            memcpy_to_i16_from_p24((int16_t *)buffer->data(), (const uint8_t *)buffer->data(), numSamples);
            tmp->set_range(0, 4 * numBytes);
            buffer->set_range(0, 2 * numSamples);
            int8_t *dst = (int8_t *)tmp->data();
        }  else if (mBitsPerSample == 32) {
            const uint8_t *src = (const uint8_t *)buffer->data();
            // Convert 32-bit signed samples to 16-bit signed in place
            ALOGV("numBytes = %zu", numBytes);
            const size_t numSamples = n / 4;
            while(numBytes-- > 0) {

               *dst++ = 0x0;
            memcpy_to_i16_from_i32((int16_t *)buffer->data(), (const int32_t *)buffer->data(), numSamples);
               *dst++ = src[0];
            buffer->set_range(0, 2 * numSamples);
               *dst++ = src[1];
               *dst++ = src[2];
               src += 3;
            }
            buffer->release();
            buffer = tmp;
            ALOGV("length = %zu", buffer->range_length());
        }
        }
    } else if (mWaveFormat == WAVE_FORMAT_IEEE_FLOAT) {
    } else if (mWaveFormat == WAVE_FORMAT_IEEE_FLOAT) {
        if (mBitsPerSample == 32) {
        if (mBitsPerSample == 32) {