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

Commit 41c76670 authored by Manish Dewangan's avatar Manish Dewangan Committed by Linux Build Service Account
Browse files

audio: Dataconverter changes to support pcm 24bit

-Dataconverter changes to support pcm 24bit playback.
-Corresponding Nuplayer changes to configure MediaCodec with
 proper PCM Encoding format.

Change-Id: I6479e9fb34c27cda912106a9165bf3a6631c2d80
parent 63938cea
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ enum AudioEncoding {
    kAudioEncodingPcm16bit = 2,
    kAudioEncodingPcm8bit = 3,
    kAudioEncodingPcmFloat = 4,
    kAudioEncodingPcm24bitPacked = 100,
};

}  // namespace android
+1 −6
Original line number Diff line number Diff line
@@ -1356,8 +1356,6 @@ void NuPlayer::onStart(int64_t startPositionUs) {
    sp<MetaData> audioMeta = mSource->getFormatMeta(true /* audio */);
    ALOGV_IF(audioMeta == NULL, "no metadata for audio source");  // video only stream

    AVNuUtils::get()->setSourcePCMFormat(audioMeta);

    audio_stream_type_t streamType = AUDIO_STREAM_MUSIC;

    if (mAudioSink != NULL) {
@@ -1644,15 +1642,12 @@ status_t NuPlayer::instantiateDecoder(
        if (mOffloadAudio)
            mSource->setOffloadAudio(true /* offload */);

        if (AVNuUtils::get()->isRAWFormat(format)) {
            AVNuUtils::get()->setPCMFormat(format,
                    AVNuUtils::get()->getKeyPCMFormat(mSource->getFormatMeta(true /* audio */)));
        }
        if (mOffloadAudio) {
            const bool hasVideo = (mSource->getFormat(false /*audio */) != NULL);
            format->setInt32("has-video", hasVideo);
            *decoder = AVNuFactory::get()->createPassThruDecoder(notify, mSource, mRenderer);
        } else {
            AVNuUtils::get()->setCodecOutputFormat(format);
            mSource->setOffloadAudio(false /* offload */);
            *decoder = AVNuFactory::get()->createDecoder(notify, mSource, mPID, mRenderer);
        }
+0 −2
Original line number Diff line number Diff line
@@ -581,8 +581,6 @@ bool NuPlayer::Decoder::handleAnOutputBuffer(
    buffer->setRange(offset, size);
    buffer->meta()->clear();
    buffer->meta()->setInt64("timeUs", timeUs);
    AVNuUtils::get()->addFlagsInMeta(buffer, flags, mIsAudio);
    setPcmFormat(buffer->meta());

    bool eos = flags & MediaCodec::BUFFER_FLAG_EOS;
    // we do not expect CODECCONFIG or SYNCFRAME for decoder
+9 −5
Original line number Diff line number Diff line
@@ -2946,6 +2946,10 @@ status_t ACodec::setupRawAudioFormat(
            pcmParams.eNumData = OMX_NumericalDataSigned;
            pcmParams.nBitPerSample = 16;
            break;
        case kAudioEncodingPcm24bitPacked:
            pcmParams.eNumData = OMX_NumericalDataSigned;
            pcmParams.nBitPerSample = 24;
            break;
        default:
            return BAD_VALUE;
    }
@@ -4952,8 +4956,10 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> &notify) {
                    } else if (params.eNumData == OMX_NumericalDataFloat
                            && params.nBitPerSample == 32u) {
                        encoding = kAudioEncodingPcmFloat;
                    } else if ((params.nBitPerSample != 16u
                            && params.nBitPerSample != 24u )// we support 16/24 bit s/w decoding
                    } else if (params.eNumData == OMX_NumericalDataSigned
                            && params.nBitPerSample == 24u) {
                        encoding = kAudioEncodingPcm24bitPacked;
                    } else if (params.nBitPerSample != 16u
                            || params.eNumData != OMX_NumericalDataSigned) {
                        ALOGE("unsupported PCM port: %s(%d), %s(%d) mode ",
                                asString(params.eNumData), params.eNumData,
@@ -4962,8 +4968,6 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> &notify) {
                    }
                    notify->setInt32("pcm-encoding", encoding);

                    notify->setInt32("bit-width", params.nBitPerSample);

                    if (mChannelMaskPresent) {
                        notify->setInt32("channel-mask", mChannelMask);
                    }
@@ -5245,7 +5249,7 @@ void ACodec::onOutputFormatChanged(sp<const AMessage> expectedFormat) {
        AudioEncoding pcmEncoding = kAudioEncodingPcm16bit;
        (void)mConfigFormat->findInt32("pcm-encoding", (int32_t*)&pcmEncoding);
        AudioEncoding codecPcmEncoding = kAudioEncodingPcm16bit;
        (void)mOutputFormat->findInt32("pcm-encoding", (int32_t*)&pcmEncoding);
        (void)mOutputFormat->findInt32("pcm-encoding", (int32_t*)&codecPcmEncoding);

        mConverter[kPortIndexOutput] = AudioConverter::Create(codecPcmEncoding, pcmEncoding);
        if (mConverter[kPortIndexOutput] != NULL) {
+37 −4
Original line number Diff line number Diff line
@@ -24,6 +24,9 @@
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AUtils.h>
#include <system/audio.h>
#include <audio_utils/primitives.h>
#include <audio_utils/format.h>

namespace android {

@@ -80,12 +83,34 @@ size_t SampleConverterBase::targetSize(size_t sourceSize) {
    return numSamples * mTargetSampleSize;
}

static audio_format_t getAudioFormat(AudioEncoding e) {
    audio_format_t format = AUDIO_FORMAT_INVALID;
    switch (e) {
        case kAudioEncodingPcm16bit:
            format = AUDIO_FORMAT_PCM_16_BIT;
            break;
        case kAudioEncodingPcm8bit:
            format = AUDIO_FORMAT_PCM_8_BIT;
            break;
        case kAudioEncodingPcmFloat:
            format = AUDIO_FORMAT_PCM_FLOAT;
            break;
       case kAudioEncodingPcm24bitPacked:
            format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
            break;
        default:
            ALOGE("Invalid AudioEncoding %d", e);
        }
        return format;
}

static size_t getAudioSampleSize(AudioEncoding e) {
    switch (e) {
        case kAudioEncodingPcm16bit: return 2;
        case kAudioEncodingPcm8bit:  return 1;
        case kAudioEncodingPcmFloat: return 4;
        case kAudioEncodingPcm16bit:
        case kAudioEncodingPcm8bit:
        case kAudioEncodingPcmFloat:
        case kAudioEncodingPcm24bitPacked:
            return audio_bytes_per_sample(getAudioFormat(e));
        default: return 0;
    }
}
@@ -115,7 +140,15 @@ status_t AudioConverter::safeConvert(const sp<ABuffer> &src, sp<ABuffer> &tgt) {
    } else if (mTo == kAudioEncodingPcmFloat && mFrom == kAudioEncodingPcm16bit) {
        memcpy_to_float_from_i16((float*)tgt->base(), (const int16_t*)src->data(), src->size() / 2);
    } else {
        audio_format_t srcFormat = getAudioFormat(mFrom);
        audio_format_t dstFormat = getAudioFormat(mTo);

        if ((srcFormat == AUDIO_FORMAT_INVALID) || (dstFormat == AUDIO_FORMAT_INVALID))
            return INVALID_OPERATION;

        size_t frames = src->size() / audio_bytes_per_sample(srcFormat);
        memcpy_by_audio_format((void*)tgt->base(), dstFormat, (void*)src->data(),
                srcFormat, frames);
    }
    return OK;
}