diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/AMRExtractor.cpp | 12 | ||||
-rw-r--r-- | media/libstagefright/Android.mk | 1 | ||||
-rw-r--r-- | media/libstagefright/AudioPlayer.cpp | 3 | ||||
-rw-r--r-- | media/libstagefright/CameraSource.cpp | 2 | ||||
-rw-r--r-- | media/libstagefright/MP3Extractor.cpp | 5 | ||||
-rw-r--r-- | media/libstagefright/MPEG4Extractor.cpp | 25 | ||||
-rw-r--r-- | media/libstagefright/MPEG4Writer.cpp | 15 | ||||
-rw-r--r-- | media/libstagefright/MediaDefs.cpp | 36 | ||||
-rw-r--r-- | media/libstagefright/MediaExtractor.cpp | 10 | ||||
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 224 | ||||
-rw-r--r-- | media/libstagefright/ShoutcastSource.cpp | 3 |
11 files changed, 238 insertions, 98 deletions
diff --git a/media/libstagefright/AMRExtractor.cpp b/media/libstagefright/AMRExtractor.cpp index 4772aca..8d85ce2 100644 --- a/media/libstagefright/AMRExtractor.cpp +++ b/media/libstagefright/AMRExtractor.cpp @@ -22,6 +22,7 @@ #include <media/stagefright/DataSource.h> #include <media/stagefright/MediaBufferGroup.h> #include <media/stagefright/MediaDebug.h> +#include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> @@ -66,7 +67,7 @@ AMRExtractor::AMRExtractor(const sp<DataSource> &source) float confidence; if (SniffAMR(mDataSource, &mimeType, &confidence)) { mInitCheck = OK; - mIsWide = (mimeType == "audio/amr-wb"); + mIsWide = (mimeType == MEDIA_MIMETYPE_AUDIO_AMR_WB); } } @@ -96,7 +97,10 @@ sp<MetaData> AMRExtractor::getTrackMetaData(size_t index) { // static sp<MetaData> AMRExtractor::makeAMRFormat(bool isWide) { sp<MetaData> meta = new MetaData; - meta->setCString(kKeyMIMEType, isWide ? "audio/amr-wb" : "audio/3gpp"); + meta->setCString( + kKeyMIMEType, isWide ? MEDIA_MIMETYPE_AUDIO_AMR_WB + : MEDIA_MIMETYPE_AUDIO_AMR_NB); + meta->setInt32(kKeyChannelCount, 1); meta->setInt32(kKeySampleRate, isWide ? 16000 : 8000); @@ -221,12 +225,12 @@ bool SniffAMR( } if (!memcmp(header, "#!AMR\n", 6)) { - *mimeType = "audio/3gpp"; + *mimeType = MEDIA_MIMETYPE_AUDIO_AMR_NB; *confidence = 0.5; return true; } else if (!memcmp(header, "#!AMR-WB\n", 9)) { - *mimeType = "audio/amr-wb"; + *mimeType = MEDIA_MIMETYPE_AUDIO_AMR_WB; *confidence = 0.5; return true; diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk index c3a4722..a4f2c79 100644 --- a/media/libstagefright/Android.mk +++ b/media/libstagefright/Android.mk @@ -13,6 +13,7 @@ LOCAL_SRC_FILES:= \ MPEG4Writer.cpp \ MediaBuffer.cpp \ MediaBufferGroup.cpp \ + MediaDefs.cpp \ MediaExtractor.cpp \ MediaPlayerImpl.cpp \ MediaSource.cpp \ diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index 140bc68..319488e 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -20,6 +20,7 @@ #include <media/AudioTrack.h> #include <media/stagefright/AudioPlayer.h> #include <media/stagefright/MediaDebug.h> +#include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> @@ -61,7 +62,7 @@ void AudioPlayer::start() { const char *mime; bool success = format->findCString(kKeyMIMEType, &mime); CHECK(success); - CHECK(!strcasecmp(mime, "audio/raw")); + CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)); success = format->findInt32(kKeySampleRate, &mSampleRate); CHECK(success); diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index f75b173..596ab67 100644 --- a/media/libstagefright/CameraSource.cpp +++ b/media/libstagefright/CameraSource.cpp @@ -155,7 +155,7 @@ status_t CameraSource::stop() { sp<MetaData> CameraSource::getFormat() { sp<MetaData> meta = new MetaData; - meta->setCString(kKeyMIMEType, "video/raw"); + meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420SemiPlanar); meta->setInt32(kKeyWidth, 480); meta->setInt32(kKeyHeight, 320); diff --git a/media/libstagefright/MP3Extractor.cpp b/media/libstagefright/MP3Extractor.cpp index 14f3e0c..7fd699f 100644 --- a/media/libstagefright/MP3Extractor.cpp +++ b/media/libstagefright/MP3Extractor.cpp @@ -23,6 +23,7 @@ #include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MediaBufferGroup.h> #include <media/stagefright/MediaDebug.h> +#include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> @@ -330,7 +331,7 @@ MP3Extractor::MP3Extractor(const sp<DataSource> &source) mMeta = new MetaData; - mMeta->setCString(kKeyMIMEType, "audio/mpeg"); + mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG); mMeta->setInt32(kKeySampleRate, sample_rate); mMeta->setInt32(kKeyBitRate, bitrate); mMeta->setInt32(kKeyChannelCount, num_channels); @@ -510,7 +511,7 @@ bool SniffMP3( return false; } - *mimeType = "audio/mpeg"; + *mimeType = MEDIA_MIMETYPE_AUDIO_MPEG; *confidence = 0.3f; return true; diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 433fb18..9174d19 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -29,6 +29,7 @@ #include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MediaBufferGroup.h> #include <media/stagefright/MediaDebug.h> +#include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/SampleTable.h> @@ -116,25 +117,25 @@ static void hexdump(const void *_data, size_t size) { } } -static const char *const FourCC2MIME(uint32_t fourcc) { +static const char *FourCC2MIME(uint32_t fourcc) { switch (fourcc) { case FOURCC('m', 'p', '4', 'a'): - return "audio/mp4a-latm"; + return MEDIA_MIMETYPE_AUDIO_AAC; case FOURCC('s', 'a', 'm', 'r'): - return "audio/3gpp"; + return MEDIA_MIMETYPE_AUDIO_AMR_NB; case FOURCC('s', 'a', 'w', 'b'): - return "audio/amr-wb"; + return MEDIA_MIMETYPE_AUDIO_AMR_WB; case FOURCC('m', 'p', '4', 'v'): - return "video/mp4v-es"; + return MEDIA_MIMETYPE_VIDEO_MPEG4; case FOURCC('s', '2', '6', '3'): - return "video/3gpp"; + return MEDIA_MIMETYPE_VIDEO_H263; case FOURCC('a', 'v', 'c', '1'): - return "video/avc"; + return MEDIA_MIMETYPE_VIDEO_AVC; default: CHECK(!"should not be here."); @@ -499,8 +500,10 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) { uint16_t data_ref_index = U16_AT(&buffer[6]); uint16_t num_channels = U16_AT(&buffer[16]); - if (!strcasecmp("audio/3gpp", FourCC2MIME(chunk_type)) - || !strcasecmp("audio/amr-wb", FourCC2MIME(chunk_type))) { + if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_NB, + FourCC2MIME(chunk_type)) + || !strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, + FourCC2MIME(chunk_type))) { // AMR audio is always mono. num_channels = 1; } @@ -746,7 +749,7 @@ MPEG4Source::MPEG4Source( success = mFormat->findInt32(kKeyTimeScale, &mTimescale); CHECK(success); - mIsAVC = !strcasecmp(mime, "video/avc"); + mIsAVC = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC); } MPEG4Source::~MPEG4Source() { @@ -978,7 +981,7 @@ bool SniffMPEG4( if (!memcmp(header, "ftyp3gp", 7) || !memcmp(header, "ftypmp42", 8) || !memcmp(header, "ftypisom", 8) || !memcmp(header, "ftypM4V ", 8)) { - *mimeType = "video/mp4"; + *mimeType = MEDIA_MIMETYPE_CONTAINER_MPEG4; *confidence = 0.1; return true; diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index d3da889..fa35768 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -23,6 +23,7 @@ #include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/MediaDebug.h> +#include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/Utils.h> @@ -351,7 +352,7 @@ void MPEG4Writer::Track::threadEntry() { sp<MetaData> meta = mSource->getFormat(); const char *mime; meta->findCString(kKeyMIMEType, &mime); - is_mpeg4 = !strcasecmp(mime, "video/mp4v-es"); + is_mpeg4 = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4); MediaBuffer *buffer; while (!mDone && mSource->read(&buffer) == OK) { @@ -528,9 +529,9 @@ void MPEG4Writer::Track::writeTrackHeader(int32_t trackID) { mOwner->writeInt32(1); // entry count if (is_audio) { const char *fourcc = NULL; - if (!strcasecmp("audio/3gpp", mime)) { + if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_NB, mime)) { fourcc = "samr"; - } else if (!strcasecmp("audio/amr-wb", mime)) { + } else if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, mime)) { fourcc = "sawb"; } else { LOGE("Unknown mime type '%s'.", mime); @@ -555,9 +556,9 @@ void MPEG4Writer::Track::writeTrackHeader(int32_t trackID) { mOwner->writeInt32(samplerate << 16); mOwner->endBox(); } else { - if (!strcasecmp("video/mp4v-es", mime)) { + if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG4, mime)) { mOwner->beginBox("mp4v"); - } else if (!strcasecmp("video/3gpp", mime)) { + } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_H263, mime)) { mOwner->beginBox("s263"); } else { LOGE("Unknown mime type '%s'.", mime); @@ -590,7 +591,7 @@ void MPEG4Writer::Track::writeTrackHeader(int32_t trackID) { CHECK(23 + mCodecSpecificDataSize < 128); - if (!strcasecmp("video/mp4v-es", mime)) { + if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG4, mime)) { mOwner->beginBox("esds"); mOwner->writeInt32(0); // version=0, flags=0 @@ -625,7 +626,7 @@ void MPEG4Writer::Track::writeTrackHeader(int32_t trackID) { mOwner->write(kData2, sizeof(kData2)); mOwner->endBox(); // esds - } else if (!strcasecmp("video/3gpp", mime)) { + } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_H263, mime)) { mOwner->beginBox("d263"); mOwner->writeInt32(0); // vendor diff --git a/media/libstagefright/MediaDefs.cpp b/media/libstagefright/MediaDefs.cpp new file mode 100644 index 0000000..87b5b24 --- /dev/null +++ b/media/libstagefright/MediaDefs.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <media/stagefright/MediaDefs.h> + +namespace android { + +const char *MEDIA_MIMETYPE_IMAGE_JPEG = "image/jpeg"; + +const char *MEDIA_MIMETYPE_VIDEO_AVC = "video/avc"; +const char *MEDIA_MIMETYPE_VIDEO_MPEG4 = "video/mp4v-es"; +const char *MEDIA_MIMETYPE_VIDEO_H263 = "video/3gpp"; +const char *MEDIA_MIMETYPE_VIDEO_RAW = "video/raw"; + +const char *MEDIA_MIMETYPE_AUDIO_AMR_NB = "audio/3gpp"; +const char *MEDIA_MIMETYPE_AUDIO_AMR_WB = "audio/amr-wb"; +const char *MEDIA_MIMETYPE_AUDIO_MPEG = "audio/mpeg"; +const char *MEDIA_MIMETYPE_AUDIO_AAC = "audio/mp4a-latm"; +const char *MEDIA_MIMETYPE_AUDIO_RAW = "audio/raw"; + +const char *MEDIA_MIMETYPE_CONTAINER_MPEG4 = "video/mpeg4"; + +} // namespace android diff --git a/media/libstagefright/MediaExtractor.cpp b/media/libstagefright/MediaExtractor.cpp index 8afa8e1..8535f52 100644 --- a/media/libstagefright/MediaExtractor.cpp +++ b/media/libstagefright/MediaExtractor.cpp @@ -20,6 +20,7 @@ #include <media/stagefright/AMRExtractor.h> #include <media/stagefright/DataSource.h> +#include <media/stagefright/MediaDefs.h> #include <media/stagefright/MP3Extractor.h> #include <media/stagefright/MPEG4Extractor.h> #include <media/stagefright/MediaExtractor.h> @@ -44,12 +45,13 @@ sp<MediaExtractor> MediaExtractor::Create( mime, confidence); } - if (!strcasecmp(mime, "video/mp4") || !strcasecmp(mime, "audio/mp4")) { + if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4) + || !strcasecmp(mime, "audio/mp4")) { return new MPEG4Extractor(source); - } else if (!strcasecmp(mime, "audio/mpeg")) { + } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { return new MP3Extractor(source); - } else if (!strcasecmp(mime, "audio/3gpp") - || !strcasecmp(mime, "audio/amr-wb")) { + } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB) + || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { return new AMRExtractor(source); } diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 034457f..a964d17 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -26,6 +26,7 @@ #include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MediaBufferGroup.h> #include <media/stagefright/MediaDebug.h> +#include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/MmapSource.h> @@ -44,40 +45,40 @@ struct CodecInfo { }; static const CodecInfo kDecoderInfo[] = { - { "image/jpeg", "OMX.TI.JPEG.decode" }, - { "audio/mpeg", "OMX.TI.MP3.decode" }, - { "audio/mpeg", "OMX.PV.mp3dec" }, - { "audio/3gpp", "OMX.TI.AMR.decode" }, - { "audio/3gpp", "OMX.PV.amrdec" }, - { "audio/amr-wb", "OMX.TI.WBAMR.decode" }, - { "audio/amr-wb", "OMX.PV.amrdec" }, - { "audio/mp4a-latm", "OMX.TI.AAC.decode" }, - { "audio/mp4a-latm", "OMX.PV.aacdec" }, - { "video/mp4v-es", "OMX.qcom.video.decoder.mpeg4" }, - { "video/mp4v-es", "OMX.TI.Video.Decoder" }, - { "video/mp4v-es", "OMX.PV.mpeg4dec" }, - { "video/3gpp", "OMX.qcom.video.decoder.h263" }, - { "video/3gpp", "OMX.TI.Video.Decoder" }, - { "video/3gpp", "OMX.PV.h263dec" }, - { "video/avc", "OMX.qcom.video.decoder.avc" }, - { "video/avc", "OMX.TI.Video.Decoder" }, - { "video/avc", "OMX.PV.avcdec" }, + { MEDIA_MIMETYPE_IMAGE_JPEG, "OMX.TI.JPEG.decode" }, + { MEDIA_MIMETYPE_AUDIO_MPEG, "OMX.TI.MP3.decode" }, + { MEDIA_MIMETYPE_AUDIO_MPEG, "OMX.PV.mp3dec" }, + { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.TI.AMR.decode" }, + { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.PV.amrdec" }, + { MEDIA_MIMETYPE_AUDIO_AMR_WB, "OMX.TI.WBAMR.decode" }, + { MEDIA_MIMETYPE_AUDIO_AMR_WB, "OMX.PV.amrdec" }, + { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.TI.AAC.decode" }, + { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.PV.aacdec" }, + { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.qcom.video.decoder.mpeg4" }, + { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.TI.Video.Decoder" }, + { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.PV.mpeg4dec" }, + { MEDIA_MIMETYPE_VIDEO_H263, "OMX.qcom.video.decoder.h263" }, + { MEDIA_MIMETYPE_VIDEO_H263, "OMX.TI.Video.Decoder" }, + { MEDIA_MIMETYPE_VIDEO_H263, "OMX.PV.h263dec" }, + { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.qcom.video.decoder.avc" }, + { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.TI.Video.Decoder" }, + { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.PV.avcdec" }, }; static const CodecInfo kEncoderInfo[] = { - { "audio/3gpp", "OMX.TI.AMR.encode" }, - { "audio/3gpp", "OMX.PV.amrencnb" }, - { "audio/amr-wb", "OMX.TI.WBAMR.encode" }, - { "audio/mp4a-latm", "OMX.TI.AAC.encode" }, - { "audio/mp4a-latm", "OMX.PV.aacenc" }, - { "video/mp4v-es", "OMX.qcom.video.encoder.mpeg4" }, - { "video/mp4v-es", "OMX.TI.Video.encoder" }, - { "video/mp4v-es", "OMX.PV.mpeg4enc" }, - { "video/3gpp", "OMX.qcom.video.encoder.h263" }, - { "video/3gpp", "OMX.TI.Video.encoder" }, - { "video/3gpp", "OMX.PV.h263enc" }, - { "video/avc", "OMX.TI.Video.encoder" }, - { "video/avc", "OMX.PV.avcenc" }, + { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.TI.AMR.encode" }, + { MEDIA_MIMETYPE_AUDIO_AMR_NB, "OMX.PV.amrencnb" }, + { MEDIA_MIMETYPE_AUDIO_AMR_WB, "OMX.TI.WBAMR.encode" }, + { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.TI.AAC.encode" }, + { MEDIA_MIMETYPE_AUDIO_AAC, "OMX.PV.aacenc" }, + { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.qcom.video.encoder.mpeg4" }, + { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.TI.Video.encoder" }, + { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.PV.mpeg4enc" }, + { MEDIA_MIMETYPE_VIDEO_H263, "OMX.qcom.video.encoder.h263" }, + { MEDIA_MIMETYPE_VIDEO_H263, "OMX.TI.Video.encoder" }, + { MEDIA_MIMETYPE_VIDEO_H263, "OMX.PV.h263enc" }, + { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.TI.Video.encoder" }, + { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.PV.avcenc" }, }; #define CODEC_LOGI(x, ...) LOGI("[%s] "x, mComponentName, ##__VA_ARGS__) @@ -169,7 +170,8 @@ static void InitOMXParams(T *params) { sp<OMXCodec> OMXCodec::Create( const sp<IOMX> &omx, const sp<MetaData> &meta, bool createEncoder, - const sp<MediaSource> &source) { + const sp<MediaSource> &source, + const char *matchComponentName) { const char *mime; bool success = meta->findCString(kKeyMIMEType, &mime); CHECK(success); @@ -191,6 +193,11 @@ sp<OMXCodec> OMXCodec::Create( return NULL; } + // If a specific codec is requested, skip the non-matching ones. + if (matchComponentName && strcmp(componentName, matchComponentName)) { + continue; + } + LOGV("Attempting to allocate OMX node '%s'", componentName); status_t err = omx->allocate_node(componentName, &node); @@ -318,13 +325,13 @@ sp<OMXCodec> OMXCodec::Create( } } - if (!strcasecmp("audio/3gpp", mime)) { + if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_NB, mime)) { codec->setAMRFormat(); } - if (!strcasecmp("audio/amr-wb", mime)) { + if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, mime)) { codec->setAMRWBFormat(); } - if (!strcasecmp("audio/mp4a-latm", mime)) { + if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AAC, mime)) { int32_t numChannels, sampleRate; CHECK(meta->findInt32(kKeyChannelCount, &numChannels)); CHECK(meta->findInt32(kKeySampleRate, &sampleRate)); @@ -343,7 +350,7 @@ sp<OMXCodec> OMXCodec::Create( codec->setVideoOutputFormat(mime, width, height); } } - if (!strcasecmp(mime, "image/jpeg") + if (!strcasecmp(mime, MEDIA_MIMETYPE_IMAGE_JPEG) && !strcmp(componentName, "OMX.TI.JPEG.decode")) { OMX_COLOR_FORMATTYPE format = OMX_COLOR_Format32bitARGB8888; @@ -471,11 +478,11 @@ void OMXCodec::setVideoInputFormat( CODEC_LOGI("setVideoInputFormat width=%ld, height=%ld", width, height); OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused; - if (!strcasecmp("video/avc", mime)) { + if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime)) { compressionFormat = OMX_VIDEO_CodingAVC; - } else if (!strcasecmp("video/mp4v-es", mime)) { + } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG4, mime)) { compressionFormat = OMX_VIDEO_CodingMPEG4; - } else if (!strcasecmp("video/3gpp", mime)) { + } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_H263, mime)) { compressionFormat = OMX_VIDEO_CodingH263; } else { LOGE("Not a supported video mime type: %s", mime); @@ -547,11 +554,11 @@ void OMXCodec::setVideoOutputFormat( CODEC_LOGI("setVideoOutputFormat width=%ld, height=%ld", width, height); OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused; - if (!strcasecmp("video/avc", mime)) { + if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime)) { compressionFormat = OMX_VIDEO_CodingAVC; - } else if (!strcasecmp("video/mp4v-es", mime)) { + } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG4, mime)) { compressionFormat = OMX_VIDEO_CodingMPEG4; - } else if (!strcasecmp("video/3gpp", mime)) { + } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_H263, mime)) { compressionFormat = OMX_VIDEO_CodingH263; } else { LOGE("Not a supported video mime type: %s", mime); @@ -670,7 +677,10 @@ OMXCodec::OMXCodec( setComponentRole(); } -void OMXCodec::setComponentRole() { +// static +void OMXCodec::setComponentRole( + const sp<IOMX> &omx, IOMX::node_id node, bool isEncoder, + const char *mime) { struct MimeToRole { const char *mime; const char *decoderRole; @@ -678,13 +688,20 @@ void OMXCodec::setComponentRole() { }; static const MimeToRole kMimeToRole[] = { - { "audio/mpeg", "audio_decoder.mp3", "audio_encoder.mp3" }, - { "audio/3gpp", "audio_decoder.amrnb", "audio_encoder.amrnb" }, - { "audio/amr-wb", "audio_decoder.amrwb", "audio_encoder.amrwb" }, - { "audio/mp4a-latm", "audio_decoder.aac", "audio_encoder.aac" }, - { "video/avc", "video_decoder.avc", "video_encoder.avc" }, - { "video/mp4v-es", "video_decoder.mpeg4", "video_encoder.mpeg4" }, - { "video/3gpp", "video_decoder.h263", "video_encoder.h263" }, + { MEDIA_MIMETYPE_AUDIO_MPEG, + "audio_decoder.mp3", "audio_encoder.mp3" }, + { MEDIA_MIMETYPE_AUDIO_AMR_NB, + "audio_decoder.amrnb", "audio_encoder.amrnb" }, + { MEDIA_MIMETYPE_AUDIO_AMR_WB, + "audio_decoder.amrwb", "audio_encoder.amrwb" }, + { MEDIA_MIMETYPE_AUDIO_AAC, + "audio_decoder.aac", "audio_encoder.aac" }, + { MEDIA_MIMETYPE_VIDEO_AVC, + "video_decoder.avc", "video_encoder.avc" }, + { MEDIA_MIMETYPE_VIDEO_MPEG4, + "video_decoder.mpeg4", "video_encoder.mpeg4" }, + { MEDIA_MIMETYPE_VIDEO_H263, + "video_decoder.h263", "video_encoder.h263" }, }; static const size_t kNumMimeToRole = @@ -692,7 +709,7 @@ void OMXCodec::setComponentRole() { size_t i; for (i = 0; i < kNumMimeToRole; ++i) { - if (!strcasecmp(mMIME, kMimeToRole[i].mime)) { + if (!strcasecmp(mime, kMimeToRole[i].mime)) { break; } } @@ -702,12 +719,10 @@ void OMXCodec::setComponentRole() { } const char *role = - mIsEncoder ? kMimeToRole[i].encoderRole - : kMimeToRole[i].decoderRole; + isEncoder ? kMimeToRole[i].encoderRole + : kMimeToRole[i].decoderRole; if (role != NULL) { - CODEC_LOGV("Setting component role '%s'.", role); - OMX_PARAM_COMPONENTROLETYPE roleParams; InitOMXParams(&roleParams); @@ -716,8 +731,8 @@ void OMXCodec::setComponentRole() { roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; - status_t err = mOMX->set_parameter( - mNode, OMX_IndexParamStandardComponentRole, + status_t err = omx->set_parameter( + node, OMX_IndexParamStandardComponentRole, &roleParams, sizeof(roleParams)); if (err != OK) { @@ -726,6 +741,10 @@ void OMXCodec::setComponentRole() { } } +void OMXCodec::setComponentRole() { + setComponentRole(mOMX, mNode, mIsEncoder, mMIME); +} + OMXCodec::~OMXCodec() { CHECK(mState == LOADED || mState == ERROR); @@ -1359,7 +1378,7 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { size_t size = specific->mSize; - if (!strcasecmp("video/avc", mMIME) + if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mMIME) && !(mQuirks & kWantsNALFragments)) { static const uint8_t kNALStartCode[4] = { 0x00, 0x00, 0x00, 0x01 }; @@ -2250,7 +2269,7 @@ void OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) { OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image; CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingUnused); - mOutputFormat->setCString(kKeyMIMEType, "image/raw"); + mOutputFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); mOutputFormat->setInt32(kKeyColorFormat, imageDef->eColorFormat); mOutputFormat->setInt32(kKeyWidth, imageDef->nFrameWidth); mOutputFormat->setInt32(kKeyHeight, imageDef->nFrameHeight); @@ -2283,7 +2302,8 @@ void OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) { "the input stream contains."); } - mOutputFormat->setCString(kKeyMIMEType, "audio/raw"); + mOutputFormat->setCString( + kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); // Use the codec-advertised number of channels, as some // codecs appear to output stereo even if the input data is @@ -2306,17 +2326,20 @@ void OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) { if (amr.eAMRBandMode >= OMX_AUDIO_AMRBandModeNB0 && amr.eAMRBandMode <= OMX_AUDIO_AMRBandModeNB7) { - mOutputFormat->setCString(kKeyMIMEType, "audio/3gpp"); + mOutputFormat->setCString( + kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AMR_NB); mOutputFormat->setInt32(kKeySampleRate, 8000); } else if (amr.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0 && amr.eAMRBandMode <= OMX_AUDIO_AMRBandModeWB8) { - mOutputFormat->setCString(kKeyMIMEType, "audio/amr-wb"); + mOutputFormat->setCString( + kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AMR_WB); mOutputFormat->setInt32(kKeySampleRate, 16000); } else { CHECK(!"Unknown AMR band mode."); } } else if (audio_def->eEncoding == OMX_AUDIO_CodingAAC) { - mOutputFormat->setCString(kKeyMIMEType, "audio/mp4a-latm"); + mOutputFormat->setCString( + kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC); } else { CHECK(!"Should not be here. Unknown audio encoding."); } @@ -2328,13 +2351,17 @@ void OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) { OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; if (video_def->eCompressionFormat == OMX_VIDEO_CodingUnused) { - mOutputFormat->setCString(kKeyMIMEType, "video/raw"); + mOutputFormat->setCString( + kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingMPEG4) { - mOutputFormat->setCString(kKeyMIMEType, "video/mp4v-es"); + mOutputFormat->setCString( + kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingH263) { - mOutputFormat->setCString(kKeyMIMEType, "video/3gpp"); + mOutputFormat->setCString( + kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263); } else if (video_def->eCompressionFormat == OMX_VIDEO_CodingAVC) { - mOutputFormat->setCString(kKeyMIMEType, "video/avc"); + mOutputFormat->setCString( + kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); } else { CHECK(!"Unknown compression format."); } @@ -2362,4 +2389,67 @@ void OMXCodec::initOutputFormat(const sp<MetaData> &inputFormat) { } } +//////////////////////////////////////////////////////////////////////////////// + +status_t QueryCodecs( + const sp<IOMX> &omx, + const char *mime, bool queryDecoders, + Vector<CodecCapabilities> *results) { + results->clear(); + + for (int index = 0;; ++index) { + const char *componentName; + + if (!queryDecoders) { + componentName = GetCodec( + kEncoderInfo, sizeof(kEncoderInfo) / sizeof(kEncoderInfo[0]), + mime, index); + } else { + componentName = GetCodec( + kDecoderInfo, sizeof(kDecoderInfo) / sizeof(kDecoderInfo[0]), + mime, index); + } + + if (!componentName) { + return OK; + } + + IOMX::node_id node; + status_t err = omx->allocate_node(componentName, &node); + + if (err != OK) { + continue; + } + + OMXCodec::setComponentRole(omx, node, queryDecoders, mime); + + results->push(); + CodecCapabilities *caps = &results->editItemAt(results->size() - 1); + caps->mComponentName = componentName; + + OMX_VIDEO_PARAM_PROFILELEVELTYPE param; + InitOMXParams(¶m); + + param.nPortIndex = queryDecoders ? 0 : 1; + + for (param.nProfileIndex = 0;; ++param.nProfileIndex) { + err = omx->get_parameter( + node, OMX_IndexParamVideoProfileLevelQuerySupported, + ¶m, sizeof(param)); + + if (err != OK) { + break; + } + + CodecProfileLevel profileLevel; + profileLevel.mProfile = param.eProfile; + profileLevel.mLevel = param.eLevel; + + caps->mProfileLevels.push(profileLevel); + } + + CHECK_EQ(omx->free_node(node), OK); + } +} + } // namespace android diff --git a/media/libstagefright/ShoutcastSource.cpp b/media/libstagefright/ShoutcastSource.cpp index 4375f38..8e8f4fa 100644 --- a/media/libstagefright/ShoutcastSource.cpp +++ b/media/libstagefright/ShoutcastSource.cpp @@ -20,6 +20,7 @@ #include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MediaBufferGroup.h> #include <media/stagefright/MediaDebug.h> +#include <media/stagefright/MediaDefs.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/ShoutcastSource.h> #include <media/stagefright/string.h> @@ -77,7 +78,7 @@ status_t ShoutcastSource::stop() { sp<MetaData> ShoutcastSource::getFormat() { sp<MetaData> meta = new MetaData; - meta->setCString(kKeyMIMEType, "audio/mpeg"); + meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MPEG); meta->setInt32(kKeySampleRate, 44100); meta->setInt32(kKeyChannelCount, 2); // XXX |