diff options
Diffstat (limited to 'media/libstagefright/OMXCodec.cpp')
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 56 |
1 files changed, 46 insertions, 10 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index e7ba1cc..5988061 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -23,6 +23,7 @@ #include <utils/Log.h> #include "include/AACEncoder.h" +#include "include/MP3Decoder.h" #include "include/ESDS.h" @@ -97,6 +98,11 @@ const static int64_t kBufferFilledEventTimeOutNs = 3000000000LL; // component in question is buggy or not. const static uint32_t kMaxColorFormatSupported = 1000; + +#define FACTORY_CREATE(name) \ +static sp<MediaSource> Make##name(const sp<MediaSource> &source) { \ + return new name(source); \ +} #define FACTORY_CREATE_ENCODER(name) \ static sp<MediaSource> Make##name(const sp<MediaSource> &source, const sp<MetaData> &meta) { \ return new name(source, meta); \ @@ -104,6 +110,7 @@ static sp<MediaSource> Make##name(const sp<MediaSource> &source, const sp<MetaDa #define FACTORY_REF(name) { #name, Make##name }, +FACTORY_CREATE(MP3Decoder) FACTORY_CREATE_ENCODER(AACEncoder) static sp<MediaSource> InstantiateSoftwareEncoder( @@ -127,8 +134,29 @@ static sp<MediaSource> InstantiateSoftwareEncoder( return NULL; } +static sp<MediaSource> InstantiateSoftwareDecoder( + const char *name, const sp<MediaSource> &source) { + struct FactoryInfo { + const char *name; + sp<MediaSource> (*CreateFunc)(const sp<MediaSource> &); + }; + + static const FactoryInfo kFactoryInfo[] = { + FACTORY_REF(MP3Decoder) + }; + for (size_t i = 0; + i < sizeof(kFactoryInfo) / sizeof(kFactoryInfo[0]); ++i) { + if (!strcmp(name, kFactoryInfo[i].name)) { + return (*kFactoryInfo[i].CreateFunc)(source); + } + } + + return NULL; +} + #undef FACTORY_CREATE_ENCODER #undef FACTORY_REF +#undef FACTORY_CREATE #define CODEC_LOGI(x, ...) ALOGI("[%s] "x, mComponentName, ##__VA_ARGS__) #define CODEC_LOGV(x, ...) ALOGV("[%s] "x, mComponentName, ##__VA_ARGS__) @@ -173,7 +201,8 @@ static void InitOMXParams(T *params) { } static bool IsSoftwareCodec(const char *componentName) { - if (!strncmp("OMX.google.", componentName, 11)) { + if (!strncmp("OMX.google.", componentName, 11) + || !strncmp("OMX.PV.", componentName, 7)) { return true; } @@ -245,6 +274,7 @@ void OMXCodec::findMatchingCodecs( const char *componentName = list->getCodecName(matchIndex); // If a specific codec is requested, skip the non-matching ones. + ALOGV("matchComponentName %s ",matchComponentName); if (matchComponentName && strcmp(componentName, matchComponentName)) { continue; } @@ -389,15 +419,15 @@ sp<MediaSource> OMXCodec::Create( componentName = tmp.c_str(); } + sp<MediaSource> softwareCodec; if (createEncoder) { - sp<MediaSource> softwareCodec = - InstantiateSoftwareEncoder(componentName, source, meta); - - if (softwareCodec != NULL) { - ALOGV("Successfully allocated software codec '%s'", componentName); - - return softwareCodec; - } + softwareCodec = InstantiateSoftwareEncoder(componentName, source, meta); + } else { + softwareCodec = InstantiateSoftwareDecoder(componentName, source); + } + if (softwareCodec != NULL) { + ALOGE("Successfully allocated software codec '%s'", componentName); + return softwareCodec; } #ifdef QCOM_HARDWARE //quirks = getComponentQuirks(componentNameBase, createEncoder); @@ -562,8 +592,14 @@ status_t OMXCodec::configureCodec(const sp<MetaData> &meta) { esds.getCodecSpecificInfo( &codec_specific_data, &codec_specific_data_size); - addCodecSpecificData( + const char * mime_type; + meta->findCString(kKeyMIMEType, &mime_type); + if (strncmp(mime_type, + MEDIA_MIMETYPE_AUDIO_MPEG, + strlen(MEDIA_MIMETYPE_AUDIO_MPEG))) { + addCodecSpecificData( codec_specific_data, codec_specific_data_size); + } } else if (meta->findData(kKeyAVCC, &type, &data, &size)) { // Parse the AVCDecoderConfigurationRecord |