diff options
author | Jean-Michel Trivi <jmtrivi@google.com> | 2012-04-30 10:38:58 -0700 |
---|---|---|
committer | Jean-Michel Trivi <jmtrivi@google.com> | 2012-05-09 18:50:18 -0700 |
commit | 2f74ef3cdc192f817ee1121f41765f0852c1d81e (patch) | |
tree | a088a328c59fc8fba57269e9b0dc899eb5182b35 /media/libstagefright/ACodec.cpp | |
parent | c150ca7dda844891fa684f6898da7f7e0c40329d (diff) | |
download | frameworks_av-2f74ef3cdc192f817ee1121f41765f0852c1d81e.zip frameworks_av-2f74ef3cdc192f817ee1121f41765f0852c1d81e.tar.gz frameworks_av-2f74ef3cdc192f817ee1121f41765f0852c1d81e.tar.bz2 |
OMX IL wrapper for FLAC encoder
Add wrapper around libFLAC for FLAC encoding in OpenMAX IL.
Declare FLAC encoder in OMX component roles.
Bug 5525503
Change-Id: I19bbce41c216870669d09365693f4ea89f8bc0f7
Diffstat (limited to 'media/libstagefright/ACodec.cpp')
-rw-r--r-- | media/libstagefright/ACodec.cpp | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 1e00c5d..3fd6cef 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -774,6 +774,8 @@ status_t ACodec::setComponentRole( "video_decoder.vpx", "video_encoder.vpx" }, { MEDIA_MIMETYPE_AUDIO_RAW, "audio_decoder.raw", "audio_encoder.raw" }, + { MEDIA_MIMETYPE_AUDIO_FLAC, + "audio_decoder.flac", "audio_encoder.flac" }, }; static const size_t kNumMimeToRole = @@ -834,7 +836,9 @@ status_t ACodec::configureCodec( } int32_t bitRate = 0; - if (encoder && !msg->findInt32("bitrate", &bitRate)) { + // FLAC encoder doesn't need a bitrate, other encoders do + if (encoder && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) + && !msg->findInt32("bitrate", &bitRate)) { return INVALID_OPERATION; } @@ -882,6 +886,27 @@ status_t ACodec::configureCodec( } else { err = setupG711Codec(encoder, numChannels); } + } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) { + int32_t numChannels, sampleRate, compressionLevel = -1; + if (encoder && + (!msg->findInt32("channel-count", &numChannels) + || !msg->findInt32("sample-rate", &sampleRate))) { + ALOGE("missing channel count or sample rate for FLAC encoder"); + err = INVALID_OPERATION; + } else { + if (encoder) { + if (!msg->findInt32("flac-compression-level", &compressionLevel)) { + compressionLevel = 5;// default FLAC compression level + } else if (compressionLevel < 0) { + ALOGW("compression level %d outside [0..8] range, using 0", compressionLevel); + compressionLevel = 0; + } else if (compressionLevel > 8) { + ALOGW("compression level %d outside [0..8] range, using 8", compressionLevel); + compressionLevel = 8; + } + } + err = setupFlacCodec(encoder, numChannels, sampleRate, compressionLevel); + } } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { int32_t numChannels, sampleRate; if (encoder @@ -1163,6 +1188,34 @@ status_t ACodec::setupG711Codec(bool encoder, int32_t numChannels) { kPortIndexInput, 8000 /* sampleRate */, numChannels); } +status_t ACodec::setupFlacCodec( + bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel) { + + if (encoder) { + OMX_AUDIO_PARAM_FLACTYPE def; + InitOMXParams(&def); + def.nPortIndex = kPortIndexOutput; + + // configure compression level + status_t err = mOMX->getParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); + if (err != OK) { + ALOGE("setupFlacCodec(): Error %d getting OMX_IndexParamAudioFlac parameter", err); + return err; + } + def.nCompressionLevel = compressionLevel; + err = mOMX->setParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); + if (err != OK) { + ALOGE("setupFlacCodec(): Error %d setting OMX_IndexParamAudioFlac parameter", err); + return err; + } + } + + return setupRawAudioFormat( + encoder ? kPortIndexInput : kPortIndexOutput, + sampleRate, + numChannels); +} + status_t ACodec::setupRawAudioFormat( OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { OMX_PARAM_PORTDEFINITIONTYPE def; |