summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2015-12-26 23:19:21 +0100
committerWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2015-12-26 23:19:21 +0100
commitb5b73768b74d369f47cafd5371a5eaf2ac3d9373 (patch)
tree3faae9e49501046ea65fe59b28e56ac1a4e434db /media/libstagefright
parent18a7135624cd16f57157a9761964f1ca088dae25 (diff)
parent54cdb1f0ce7d03a75499d5ae258fd278de27462d (diff)
downloadframeworks_av-b5b73768b74d369f47cafd5371a5eaf2ac3d9373.zip
frameworks_av-b5b73768b74d369f47cafd5371a5eaf2ac3d9373.tar.gz
frameworks_av-b5b73768b74d369f47cafd5371a5eaf2ac3d9373.tar.bz2
Merge remote-tracking branch 'cyanogenmod/cm-13.0' into replicant-6.0
Diffstat (limited to 'media/libstagefright')
-rw-r--r--media/libstagefright/ACodec.cpp11
-rw-r--r--media/libstagefright/FFMPEGSoftCodec.cpp49
2 files changed, 29 insertions, 31 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index c84601d..6d26173 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -2065,6 +2065,7 @@ status_t ACodec::configureCodec(
int32_t sbrMode;
int32_t maxOutputChannelCount;
int32_t pcmLimiterEnable;
+ int32_t bitsPerSample = 16;
drcParams_t drc;
if (!msg->findInt32("is-adts", &isADTS)) {
isADTS = 0;
@@ -2103,11 +2104,12 @@ status_t ACodec::configureCodec(
// value is unknown
drc.targetRefLevel = -1;
}
+ msg->findInt32("bits-per-sample", &bitsPerSample);
err = setupAACCodec(
encoder, numChannels, sampleRate, bitRate, aacProfile,
isADTS != 0, sbrMode, maxOutputChannelCount, drc,
- pcmLimiterEnable);
+ pcmLimiterEnable, bitsPerSample);
}
} else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) {
err = setupAMRCodec(encoder, false /* isWAMR */, bitRate);
@@ -2367,15 +2369,16 @@ status_t ACodec::setupAACCodec(
bool encoder, int32_t numChannels, int32_t sampleRate,
int32_t bitRate, int32_t aacProfile, bool isADTS, int32_t sbrMode,
int32_t maxOutputChannelCount, const drcParams_t& drc,
- int32_t pcmLimiterEnable) {
+ int32_t pcmLimiterEnable, int32_t bitsPerSample) {
if (encoder && isADTS) {
return -EINVAL;
}
- status_t err = setupRawAudioFormat(
+ status_t err = setupRawAudioFormatInternal(
encoder ? kPortIndexInput : kPortIndexOutput,
sampleRate,
- numChannels);
+ numChannels,
+ bitsPerSample);
if (err != OK) {
return err;
diff --git a/media/libstagefright/FFMPEGSoftCodec.cpp b/media/libstagefright/FFMPEGSoftCodec.cpp
index 5ee168e..20c8359 100644
--- a/media/libstagefright/FFMPEGSoftCodec.cpp
+++ b/media/libstagefright/FFMPEGSoftCodec.cpp
@@ -223,37 +223,32 @@ const char* FFMPEGSoftCodec::overrideComponentName(
}
}
- return componentName;
-}
-
-void FFMPEGSoftCodec::overrideComponentName(
- uint32_t /*quirks*/, const sp<AMessage> &msg, AString* componentName, AString* mime, int32_t isEncoder) {
-
- int32_t wmvVersion = 0;
- if (!strncasecmp(mime->c_str(), MEDIA_MIMETYPE_VIDEO_WMV, strlen(MEDIA_MIMETYPE_VIDEO_WMV)) &&
- msg->findInt32(getMsgKey(kKeyWMVVersion), &wmvVersion)) {
- ALOGD("Found WMV version key %d", wmvVersion);
- if (wmvVersion != 2) {
- ALOGD("Use FFMPEG for unsupported WMV track");
- componentName->setTo("OMX.ffmpeg.wmv.decoder");
+ // Use FFMPEG for high-res formats which other decoders can't handle
+ int32_t bits = 16;
+ if (!isEncoder && meta->findInt32(kKeyBitsPerSample, &bits)) {
+ if (bits > 16) {
+ if (!strncasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC, strlen(MEDIA_MIMETYPE_AUDIO_AAC))) {
+ componentName = "OMX.ffmpeg.aac.decoder";
+ ALOGD("Use FFMPEG for high-res AAC format");
+ } else if (!strncasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC, strlen(MEDIA_MIMETYPE_AUDIO_FLAC))) {
+ componentName = "OMX.ffmpeg.flac.decoder";
+ ALOGD("Use FFMPEG for high-res FLAC format");
+ }
}
}
- int32_t encodeOptions = 0;
- if (!isEncoder && !strncasecmp(mime->c_str(), MEDIA_MIMETYPE_AUDIO_WMA, strlen(MEDIA_MIMETYPE_AUDIO_WMA)) &&
- !msg->findInt32(getMsgKey(kKeyWMAEncodeOpt), &encodeOptions)) {
- ALOGD("Use FFMPEG for unsupported WMA track");
- componentName->setTo("OMX.ffmpeg.wma.decoder");
- }
+ return componentName;
+}
- // Google's decoder doesn't support MAIN profile
- int32_t aacProfile = 0;
- if (!isEncoder && !strncasecmp(mime->c_str(), MEDIA_MIMETYPE_AUDIO_AAC, strlen(MEDIA_MIMETYPE_AUDIO_AAC)) &&
- msg->findInt32(getMsgKey(kKeyAACAOT), &aacProfile)) {
- if ((aacProfile == OMX_AUDIO_AACObjectMain) || (aacProfile == OMX_AUDIO_AACObjectLTP)) {
- ALOGD("Use FFMPEG for AAC Main/LTP profile");
- componentName->setTo("OMX.ffmpeg.aac.decoder");
- }
+void FFMPEGSoftCodec::overrideComponentName(
+ uint32_t quirks, const sp<AMessage> &msg, AString* componentName, AString* mime, int32_t isEncoder) {
+
+ sp<MetaData> meta = new MetaData;
+ convertMessageToMetaData(msg, meta);
+ const char *updated = overrideComponentName(
+ quirks, meta, mime->c_str(), isEncoder);
+ if (updated != NULL) {
+ componentName->setTo(updated);
}
}