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

Commit f8a6bddd authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "converter: Support 24bit converter"

parents dc5997e7 4c6a6db0
Loading
Loading
Loading
Loading
+42 −4
Original line number Original line Diff line number Diff line
@@ -24,6 +24,10 @@
#include <media/MediaCodecBuffer.h>
#include <media/MediaCodecBuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AUtils.h>
#include <media/stagefright/foundation/AUtils.h>
#include <system/audio.h>
#include <audio_utils/primitives.h>
#include <audio_utils/format.h>



namespace android {
namespace android {


@@ -81,12 +85,38 @@ size_t SampleConverterBase::targetSize(size_t sourceSize) {
    return numSamples * mTargetSampleSize;
    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;
       case kAudioEncodingPcm32bit:
            format = AUDIO_FORMAT_PCM_32_BIT;
            break;
        default:
            ALOGE("Invalid AudioEncoding %d", e);
        }
        return format;
}


static size_t getAudioSampleSize(AudioEncoding e) {
static size_t getAudioSampleSize(AudioEncoding e) {
    switch (e) {
    switch (e) {
        case kAudioEncodingPcm16bit: return 2;
        case kAudioEncodingPcm16bit:
        case kAudioEncodingPcm8bit:  return 1;
        case kAudioEncodingPcm8bit:
        case kAudioEncodingPcmFloat: return 4;
        case kAudioEncodingPcmFloat:
        case kAudioEncodingPcm24bitPacked:
        case kAudioEncodingPcm32bit:
            return audio_bytes_per_sample(getAudioFormat(e));
        default: return 0;
        default: return 0;
    }
    }
}
}
@@ -116,7 +146,15 @@ status_t AudioConverter::safeConvert(const sp<MediaCodecBuffer> &src, sp<MediaCo
    } else if (mTo == kAudioEncodingPcmFloat && mFrom == kAudioEncodingPcm16bit) {
    } else if (mTo == kAudioEncodingPcmFloat && mFrom == kAudioEncodingPcm16bit) {
        memcpy_to_float_from_i16((float*)tgt->base(), (const int16_t*)src->data(), src->size() / 2);
        memcpy_to_float_from_i16((float*)tgt->base(), (const int16_t*)src->data(), src->size() / 2);
    } else {
    } 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;
            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;
    return OK;
}
}