diff options
author | Andreas Huber <andih@google.com> | 2012-03-26 11:13:27 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-03-26 11:24:04 -0700 |
commit | ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6 (patch) | |
tree | 99d5bb3a2f48f9a3ba3eaaf17e630b589e97bef1 /media/libstagefright/NuMediaExtractor.cpp | |
parent | cc1110dc92e53e9cc0afbb043e6ef8295bd9c5d5 (diff) | |
download | frameworks_av-ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6.zip frameworks_av-ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6.tar.gz frameworks_av-ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6.tar.bz2 |
Provisional support for secure decryption of media streams.
Change-Id: Ib3982a9c960bfdb0cb7e1b174440b141b194cfbe
Diffstat (limited to 'media/libstagefright/NuMediaExtractor.cpp')
-rw-r--r-- | media/libstagefright/NuMediaExtractor.cpp | 57 |
1 files changed, 53 insertions, 4 deletions
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 |