diff options
Diffstat (limited to 'media/libstagefright')
-rw-r--r-- | media/libstagefright/ACodec.cpp | 53 | ||||
-rw-r--r-- | media/libstagefright/Android.mk | 13 | ||||
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 112 | ||||
-rw-r--r-- | media/libstagefright/NuMediaExtractor.cpp | 57 | ||||
-rwxr-xr-x | media/libstagefright/OMXCodec.cpp | 31 | ||||
-rw-r--r-- | media/libstagefright/TimedEventQueue.cpp | 21 | ||||
-rw-r--r-- | media/libstagefright/chromium_http/Android.mk | 2 | ||||
-rw-r--r-- | media/libstagefright/codecs/aacdec/SoftAAC.cpp | 49 | ||||
-rw-r--r-- | media/libstagefright/codecs/aacdec/SoftAAC.h | 1 | ||||
-rw-r--r-- | media/libstagefright/foundation/AString.cpp | 10 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/AnotherPacketSource.cpp | 6 |
11 files changed, 303 insertions, 52 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index e5ad4b7..db2beda 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -427,24 +427,34 @@ status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); CHECK(mem.get() != NULL); - IOMX::buffer_id buffer; + BufferInfo info; + info.mStatus = BufferInfo::OWNED_BY_US; uint32_t requiresAllocateBufferBit = (portIndex == kPortIndexInput) ? OMXCodec::kRequiresAllocateBufferOnInputPorts : OMXCodec::kRequiresAllocateBufferOnOutputPorts; - if (mQuirks & requiresAllocateBufferBit) { + if (portIndex == kPortIndexInput && (mFlags & kFlagIsSecure)) { + mem.clear(); + + void *ptr; + err = mOMX->allocateBuffer( + mNode, portIndex, def.nBufferSize, &info.mBufferID, + &ptr); + + info.mData = new ABuffer(ptr, def.nBufferSize); + } else if (mQuirks & requiresAllocateBufferBit) { err = mOMX->allocateBufferWithBackup( - mNode, portIndex, mem, &buffer); + mNode, portIndex, mem, &info.mBufferID); } else { - err = mOMX->useBuffer(mNode, portIndex, mem, &buffer); + err = mOMX->useBuffer(mNode, portIndex, mem, &info.mBufferID); + } + + if (mem != NULL) { + info.mData = new ABuffer(mem->pointer(), def.nBufferSize); } - BufferInfo info; - info.mBufferID = buffer; - info.mStatus = BufferInfo::OWNED_BY_US; - info.mData = new ABuffer(mem->pointer(), def.nBufferSize); mBuffers[portIndex].push(info); } } @@ -840,7 +850,13 @@ status_t ACodec::configureCodec( || !msg->findInt32("sample-rate", &sampleRate)) { err = INVALID_OPERATION; } else { - err = setupAACCodec(encoder, numChannels, sampleRate, bitRate); + int32_t isADTS; + if (!msg->findInt32("is-adts", &isADTS)) { + isADTS = 0; + } + + err = setupAACCodec( + encoder, numChannels, sampleRate, bitRate, isADTS != 0); } } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) { err = setupAMRCodec(encoder, false /* isWAMR */, bitRate); @@ -934,7 +950,11 @@ status_t ACodec::selectAudioPortFormat( status_t ACodec::setupAACCodec( bool encoder, - int32_t numChannels, int32_t sampleRate, int32_t bitRate) { + int32_t numChannels, int32_t sampleRate, int32_t bitRate, bool isADTS) { + if (encoder && isADTS) { + return -EINVAL; + } + status_t err = setupRawAudioFormat( encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, @@ -1021,7 +1041,11 @@ status_t ACodec::setupAACCodec( profile.nChannels = numChannels; profile.nSampleRate = sampleRate; - profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS; + + profile.eAACStreamFormat = + isADTS + ? OMX_AUDIO_AACStreamFormatMP4ADTS + : OMX_AUDIO_AACStreamFormatMP4FF; return mOMX->setParameter( mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); @@ -2653,6 +2677,12 @@ bool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { observer->setNotificationMessage(notify); mCodec->mComponentName = componentName; + mCodec->mFlags = 0; + + if (componentName.endsWith(".secure")) { + mCodec->mFlags |= kFlagIsSecure; + } + mCodec->mQuirks = quirks; mCodec->mOMX = omx; mCodec->mNode = node; @@ -2701,6 +2731,7 @@ void ACodec::LoadedState::onShutdown(bool keepComponentAllocated) { mCodec->mNode = NULL; mCodec->mOMX.clear(); mCodec->mQuirks = 0; + mCodec->mFlags = 0; mCodec->mComponentName.clear(); mCodec->changeState(mCodec->mUninitializedState); diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk index 65a947a..8948abb 100644 --- a/media/libstagefright/Android.mk +++ b/media/libstagefright/Android.mk @@ -68,7 +68,6 @@ LOCAL_C_INCLUDES:= \ LOCAL_SHARED_LIBRARIES := \ libbinder \ libcamera_client \ - libchromium_net \ libcrypto \ libcutils \ libdl \ @@ -101,14 +100,18 @@ LOCAL_STATIC_LIBRARIES := \ libstagefright_httplive \ libstagefright_id3 \ libFLAC \ - libstagefright_chromium_http \ + +ifneq ($(TARGET_BUILD_PDK), true) +LOCAL_STATIC_LIBRARIES += \ + libstagefright_chromium_http +LOCAL_SHARED_LIBRARIES += \ + libchromium_net +LOCAL_CPPFLAGS += -DCHROMIUM_AVAILABLE=1 +endif LOCAL_SHARED_LIBRARIES += libstlport include external/stlport/libstlport.mk -# TODO: Chromium is always available, so this flag can be removed. -LOCAL_CPPFLAGS += -DCHROMIUM_AVAILABLE=1 - LOCAL_SHARED_LIBRARIES += \ libstagefright_enc_common \ libstagefright_avc_common \ diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index a9e7f360..42b5c7e 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -22,10 +22,14 @@ #include "include/SoftwareRenderer.h" +#include <binder/IServiceManager.h> #include <gui/SurfaceTextureClient.h> +#include <media/ICrypto.h> +#include <media/IMediaPlayerService.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> +#include <media/stagefright/foundation/hexdump.h> #include <media/stagefright/ACodec.h> #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MetaData.h> @@ -528,6 +532,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { info.mOwnedByClient = false; CHECK(msg->findBuffer(name.c_str(), &info.mData)); + if (portIndex == kPortIndexInput + && (mFlags & kFlagIsSecure)) { + info.mEncryptedData = + new ABuffer(info.mData->capacity()); + } + buffers->push_back(info); } @@ -742,6 +752,59 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { format->setInt32("encoder", true); } + if (flags & CONFIGURE_FLAG_SECURE) { + mFlags |= kFlagIsSecure; + + sp<IServiceManager> sm = defaultServiceManager(); + + sp<IBinder> binder = + sm->getService(String16("media.player")); + + sp<IMediaPlayerService> service = + interface_cast<IMediaPlayerService>(binder); + + CHECK(service != NULL); + + mCrypto = service->makeCrypto(); + + status_t err = mCrypto->initialize(); + + if (err == OK) { + sp<ABuffer> emm; + if (format->findBuffer("emm", &emm)) { + err = mCrypto->setEntitlementKey( + emm->data(), emm->size()); + } + } + + if (err == OK) { + sp<ABuffer> ecm; + if (format->findBuffer("ecm", &ecm)) { + CHECK_EQ(ecm->size(), 80u); + + // bytes 16..47 of the original ecm stream data. + err = mCrypto->setEntitlementControlMessage( + ecm->data() + 16, 32); + } + } + + if (err != OK) { + ALOGE("failed to instantiate crypto service."); + + mCrypto.clear(); + + setState(INITIALIZED); + + sp<AMessage> response = new AMessage; + response->setInt32("err", UNKNOWN_ERROR); + + response->postReply(mReplyID); + break; + } + } else { + mFlags &= ~kFlagIsSecure; + } + mCodec->initiateConfigureComponent(format); break; } @@ -983,7 +1046,10 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { for (size_t i = 0; i < srcBuffers.size(); ++i) { const BufferInfo &info = srcBuffers.itemAt(i); - dstBuffers->push_back(info.mData); + dstBuffers->push_back( + (portIndex == kPortIndexInput + && (mFlags & kFlagIsSecure)) + ? info.mEncryptedData : info.mData); } (new AMessage)->postReply(replyID); @@ -1037,10 +1103,15 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { } void MediaCodec::setState(State newState) { - if (newState == UNINITIALIZED) { + if (newState == INITIALIZED) { delete mSoftRenderer; mSoftRenderer = NULL; + if (mCrypto != NULL) { + mCrypto->terminate(); + mCrypto.clear(); + } + mNativeWindow.clear(); mOutputFormat.clear(); @@ -1150,6 +1221,43 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { info->mData->meta()->setInt32("csd", true); } + if (mFlags & kFlagIsSecure) { + uint8_t iv[16]; + memset(iv, 0, sizeof(iv)); + + ssize_t outLength; + + if (mFlags & kFlagIsSoftwareCodec) { + outLength = mCrypto->decryptAudio( + (flags & BUFFER_FLAG_ENCRYPTED) ? iv : NULL, + (flags & BUFFER_FLAG_ENCRYPTED) ? sizeof(iv) : 0, + info->mEncryptedData->base() + offset, + size, + info->mData->base(), + info->mData->capacity()); + } else { + outLength = mCrypto->decryptVideo( + (flags & BUFFER_FLAG_ENCRYPTED) ? iv : NULL, + (flags & BUFFER_FLAG_ENCRYPTED) ? sizeof(iv) : 0, + info->mEncryptedData->base() + offset, + size, + info->mData->base(), + 0 /* offset */); + } + + if (outLength < 0) { + return outLength; + } + + if ((size_t)outLength > info->mEncryptedData->capacity()) { + return -ERANGE; + } + + info->mData->setRange(0, outLength); + } else if (flags & BUFFER_FLAG_ENCRYPTED) { + return -EINVAL; + } + reply->setBuffer("buffer", info->mData); reply->post(); diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp index afd4763..224ec33 100644 --- a/media/libstagefright/NuMediaExtractor.cpp +++ b/media/libstagefright/NuMediaExtractor.cpp @@ -107,6 +107,11 @@ status_t NuMediaExtractor::getTrackFormat( msg->setInt32("channel-count", numChannels); msg->setInt32("sample-rate", sampleRate); + + int32_t isADTS; + if (meta->findInt32(kKeyIsADTS, &isADTS)) { + msg->setInt32("is-adts", true); + } } int32_t maxInputSize; @@ -232,6 +237,20 @@ status_t NuMediaExtractor::getTrackFormat( msg->setBuffer("csd-1", buffer); } + if (meta->findData(kKeyEMM, &type, &data, &size)) { + sp<ABuffer> emm = new ABuffer(size); + memcpy(emm->data(), data, size); + + msg->setBuffer("emm", emm); + } + + if (meta->findData(kKeyECM, &type, &data, &size)) { + sp<ABuffer> ecm = new ABuffer(size); + memcpy(ecm->data(), data, size); + + msg->setBuffer("ecm", ecm); + } + *format = msg; return OK; @@ -267,13 +286,14 @@ status_t NuMediaExtractor::selectTrack(size_t index) { info->mFinalResult = OK; info->mSample = NULL; info->mSampleTimeUs = -1ll; - info->mFlags = 0; + info->mSampleFlags = 0; + info->mTrackFlags = 0; const char *mime; CHECK(source->getFormat()->findCString(kKeyMIMEType, &mime)); if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { - info->mFlags |= kIsVorbis; + info->mTrackFlags |= kIsVorbis; } return OK; @@ -288,6 +308,7 @@ void NuMediaExtractor::releaseTrackSamples() { info->mSample = NULL; info->mSampleTimeUs = -1ll; + info->mSampleFlags = 0; } } } @@ -306,6 +327,7 @@ ssize_t NuMediaExtractor::fetchTrackSamples(int64_t seekTimeUs) { info->mSample->release(); info->mSample = NULL; info->mSampleTimeUs = -1ll; + info->mSampleFlags = 0; } } else if (info->mFinalResult != OK) { continue; @@ -323,11 +345,25 @@ ssize_t NuMediaExtractor::fetchTrackSamples(int64_t seekTimeUs) { info->mFinalResult = err; info->mSampleTimeUs = -1ll; + info->mSampleFlags = 0; continue; } else { CHECK(info->mSample != NULL); CHECK(info->mSample->meta_data()->findInt64( kKeyTime, &info->mSampleTimeUs)); + + info->mSampleFlags = 0; + + int32_t val; + if (info->mSample->meta_data()->findInt32( + kKeyIsSyncFrame, &val) && val != 0) { + info->mSampleFlags |= SAMPLE_FLAG_SYNC; + } + + if (info->mSample->meta_data()->findInt32( + kKeyScrambling, &val) && val != 0) { + info->mSampleFlags |= SAMPLE_FLAG_ENCRYPTED; + } } } @@ -371,7 +407,7 @@ status_t NuMediaExtractor::readSampleData(const sp<ABuffer> &buffer) { size_t sampleSize = info->mSample->range_length(); - if (info->mFlags & kIsVorbis) { + if (info->mTrackFlags & kIsVorbis) { // Each sample's data is suffixed by the number of page samples // or -1 if not available. sampleSize += sizeof(int32_t); @@ -387,7 +423,7 @@ status_t NuMediaExtractor::readSampleData(const sp<ABuffer> &buffer) { memcpy((uint8_t *)buffer->data(), src, info->mSample->range_length()); - if (info->mFlags & kIsVorbis) { + if (info->mTrackFlags & kIsVorbis) { int32_t numPageSamples; if (!info->mSample->meta_data()->findInt32( kKeyValidSamples, &numPageSamples)) { @@ -430,4 +466,17 @@ status_t NuMediaExtractor::getSampleTime(int64_t *sampleTimeUs) { return OK; } +status_t NuMediaExtractor::getSampleFlags(uint32_t *sampleFlags) { + ssize_t minIndex = fetchTrackSamples(); + + if (minIndex < 0) { + return ERROR_END_OF_STREAM; + } + + TrackInfo *info = &mSelectedTracks.editItemAt(minIndex); + *sampleFlags = info->mSampleFlags; + + return OK; +} + } // namespace android diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 8b6e9d5..9769f21 100755 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -515,7 +515,12 @@ status_t OMXCodec::configureCodec(const sp<MetaData> &meta) { CHECK(meta->findInt32(kKeyChannelCount, &numChannels)); CHECK(meta->findInt32(kKeySampleRate, &sampleRate)); - status_t err = setAACFormat(numChannels, sampleRate, bitRate); + int32_t isADTS; + if (!meta->findInt32(kKeyIsADTS, &isADTS)) { + isADTS = false; + } + + status_t err = setAACFormat(numChannels, sampleRate, bitRate, isADTS); if (err != OK) { CODEC_LOGE("setAACFormat() failed (err = %d)", err); return err; @@ -3386,11 +3391,17 @@ void OMXCodec::setAMRFormat(bool isWAMR, int32_t bitRate) { } } -status_t OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate, int32_t bitRate) { - if (numChannels > 2) +status_t OMXCodec::setAACFormat( + int32_t numChannels, int32_t sampleRate, int32_t bitRate, bool isADTS) { + if (numChannels > 2) { ALOGW("Number of channels: (%d) \n", numChannels); + } if (mIsEncoder) { + if (isADTS) { + return -EINVAL; + } + //////////////// input port //////////////////// setRawAudioFormat(kPortIndexInput, sampleRate, numChannels); @@ -3445,7 +3456,9 @@ status_t OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate, int32_t &profile, sizeof(profile)); if (err != OK) { - CODEC_LOGE("setParameter('OMX_IndexParamAudioAac') failed (err = %d)", err); + CODEC_LOGE("setParameter('OMX_IndexParamAudioAac') failed " + "(err = %d)", + err); return err; } } else { @@ -3459,13 +3472,19 @@ status_t OMXCodec::setAACFormat(int32_t numChannels, int32_t sampleRate, int32_t profile.nChannels = numChannels; profile.nSampleRate = sampleRate; - profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS; + + profile.eAACStreamFormat = + isADTS + ? OMX_AUDIO_AACStreamFormatMP4ADTS + : OMX_AUDIO_AACStreamFormatMP4FF; err = mOMX->setParameter( mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); if (err != OK) { - CODEC_LOGE("setParameter('OMX_IndexParamAudioAac') failed (err = %d)", err); + CODEC_LOGE("setParameter('OMX_IndexParamAudioAac') failed " + "(err = %d)", + err); return err; } } diff --git a/media/libstagefright/TimedEventQueue.cpp b/media/libstagefright/TimedEventQueue.cpp index 6d345bb..9df15eb 100644 --- a/media/libstagefright/TimedEventQueue.cpp +++ b/media/libstagefright/TimedEventQueue.cpp @@ -31,10 +31,6 @@ #include <media/stagefright/foundation/ADebug.h> -#ifdef ANDROID_SIMULATOR -#include <jni.h> -#endif - namespace android { TimedEventQueue::TimedEventQueue() @@ -193,27 +189,10 @@ int64_t TimedEventQueue::getRealTimeUs() { // static void *TimedEventQueue::ThreadWrapper(void *me) { -#ifdef ANDROID_SIMULATOR - // The simulator runs everything as one process, so any - // Binder calls happen on this thread instead of a thread - // in another process. We therefore need to make sure that - // this thread can do calls into interpreted code. - // On the device this is not an issue because the remote - // thread will already be set up correctly for this. - JavaVM *vm; - int numvms; - JNI_GetCreatedJavaVMs(&vm, 1, &numvms); - JNIEnv *env; - vm->AttachCurrentThread(&env, NULL); -#endif - androidSetThreadPriority(0, ANDROID_PRIORITY_FOREGROUND); static_cast<TimedEventQueue *>(me)->threadEntry(); -#ifdef ANDROID_SIMULATOR - vm->DetachCurrentThread(); -#endif return NULL; } diff --git a/media/libstagefright/chromium_http/Android.mk b/media/libstagefright/chromium_http/Android.mk index 6d5dcfb..d595686 100644 --- a/media/libstagefright/chromium_http/Android.mk +++ b/media/libstagefright/chromium_http/Android.mk @@ -1,5 +1,6 @@ LOCAL_PATH:= $(call my-dir) +ifneq ($(TARGET_BUILD_PDK), true) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ @@ -21,3 +22,4 @@ include external/stlport/libstlport.mk LOCAL_MODULE:= libstagefright_chromium_http include $(BUILD_STATIC_LIBRARY) +endif diff --git a/media/libstagefright/codecs/aacdec/SoftAAC.cpp b/media/libstagefright/codecs/aacdec/SoftAAC.cpp index ea6c360..90f96c6 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC.cpp +++ b/media/libstagefright/codecs/aacdec/SoftAAC.cpp @@ -23,6 +23,7 @@ #include "pvmp4audiodecoder_api.h" #include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/foundation/hexdump.h> namespace android { @@ -42,6 +43,7 @@ SoftAAC::SoftAAC( OMX_COMPONENTTYPE **component) : SimpleSoftOMXComponent(name, callbacks, appData, component), mConfig(new tPVMP4AudioDecoderExternal), + mIsADTS(false), mDecoderBuf(NULL), mInputBufferCount(0), mUpsamplingFactor(2), @@ -140,7 +142,12 @@ OMX_ERRORTYPE SoftAAC::internalGetParameter( aacParams->nAACtools = 0; aacParams->nAACERtools = 0; aacParams->eAACProfile = OMX_AUDIO_AACObjectMain; - aacParams->eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4FF; + + aacParams->eAACStreamFormat = + mIsADTS + ? OMX_AUDIO_AACStreamFormatMP4ADTS + : OMX_AUDIO_AACStreamFormatMP4FF; + aacParams->eChannelMode = OMX_AUDIO_ChannelModeStereo; if (!isConfigured()) { @@ -215,6 +222,15 @@ OMX_ERRORTYPE SoftAAC::internalSetParameter( return OMX_ErrorUndefined; } + if (aacParams->eAACStreamFormat == OMX_AUDIO_AACStreamFormatMP4FF) { + mIsADTS = false; + } else if (aacParams->eAACStreamFormat + == OMX_AUDIO_AACStreamFormatMP4ADTS) { + mIsADTS = true; + } else { + return OMX_ErrorUndefined; + } + return OMX_ErrorNone; } @@ -299,8 +315,35 @@ void SoftAAC::onQueueFilled(OMX_U32 portIndex) { mNumSamplesOutput = 0; } - mConfig->pInputBuffer = inHeader->pBuffer + inHeader->nOffset; - mConfig->inputBufferCurrentLength = inHeader->nFilledLen; + if (mIsADTS) { + // skip 30 bits, aac_frame_length follows. + // ssssssss ssssiiip ppffffPc ccohCCll llllllll lll????? + + const uint8_t *adtsHeader = inHeader->pBuffer + inHeader->nOffset; + + CHECK_GE(inHeader->nFilledLen, 7); + + bool protectionAbsent = (adtsHeader[1] & 1); + + unsigned aac_frame_length = + ((adtsHeader[3] & 3) << 11) + | (adtsHeader[4] << 3) + | (adtsHeader[5] >> 5); + + CHECK_GE(inHeader->nFilledLen, aac_frame_length); + + size_t headerSize = (protectionAbsent ? 7 : 9); + + mConfig->pInputBuffer = (UChar *)adtsHeader + headerSize; + mConfig->inputBufferCurrentLength = aac_frame_length - headerSize; + + inHeader->nOffset += headerSize; + inHeader->nFilledLen -= headerSize; + } else { + mConfig->pInputBuffer = inHeader->pBuffer + inHeader->nOffset; + mConfig->inputBufferCurrentLength = inHeader->nFilledLen; + } + mConfig->inputBufferMaxLength = 0; mConfig->inputBufferUsedLength = 0; mConfig->remainderBits = 0; diff --git a/media/libstagefright/codecs/aacdec/SoftAAC.h b/media/libstagefright/codecs/aacdec/SoftAAC.h index 963fd27..da0b8ed 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC.h +++ b/media/libstagefright/codecs/aacdec/SoftAAC.h @@ -49,6 +49,7 @@ private: }; tPVMP4AudioDecoderExternal *mConfig; + bool mIsADTS; void *mDecoderBuf; size_t mInputBufferCount; diff --git a/media/libstagefright/foundation/AString.cpp b/media/libstagefright/foundation/AString.cpp index 61b76cf..dee786d 100644 --- a/media/libstagefright/foundation/AString.cpp +++ b/media/libstagefright/foundation/AString.cpp @@ -310,6 +310,16 @@ bool AString::startsWith(const char *prefix) const { return !strncmp(mData, prefix, strlen(prefix)); } +bool AString::endsWith(const char *suffix) const { + size_t suffixLen = strlen(suffix); + + if (mSize < suffixLen) { + return false; + } + + return !strcmp(mData + mSize - suffixLen, suffix); +} + AString StringPrintf(const char *format, ...) { va_list ap; va_start(ap, format); diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp index d708ba6..e1ac53c 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp @@ -117,6 +117,12 @@ status_t AnotherPacketSource::read( mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs); + int32_t scrambling; + if (buffer->meta()->findInt32("scrambling", &scrambling) + && scrambling != 0) { + mediaBuffer->meta_data()->setInt32(kKeyScrambling, scrambling); + } + *out = mediaBuffer; return OK; } |