Loading media/libstagefright/DataConverter.cpp +42 −4 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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; } } } } Loading Loading @@ -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; } } Loading Loading
media/libstagefright/DataConverter.cpp +42 −4 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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; } } } } Loading Loading @@ -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; } } Loading