summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/ACodec.cpp
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2012-04-30 10:38:58 -0700
committerJean-Michel Trivi <jmtrivi@google.com>2012-05-09 18:50:18 -0700
commit2f74ef3cdc192f817ee1121f41765f0852c1d81e (patch)
treea088a328c59fc8fba57269e9b0dc899eb5182b35 /media/libstagefright/ACodec.cpp
parentc150ca7dda844891fa684f6898da7f7e0c40329d (diff)
downloadframeworks_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.cpp55
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;