diff options
-rw-r--r-- | include/media/stagefright/MediaCodec.h | 4 | ||||
-rw-r--r-- | include/media/stagefright/MediaExtractor.h | 2 | ||||
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 2 | ||||
-rw-r--r-- | media/libstagefright/MP3Extractor.cpp | 6 | ||||
-rw-r--r-- | media/libstagefright/MPEG4Extractor.cpp | 22 | ||||
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 44 | ||||
-rw-r--r-- | media/libstagefright/StagefrightMediaScanner.cpp | 2 | ||||
-rw-r--r-- | media/libstagefright/StagefrightMetadataRetriever.cpp | 2 | ||||
-rw-r--r-- | media/libstagefright/WVMExtractor.cpp | 13 | ||||
-rw-r--r-- | media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s | 6 | ||||
-rw-r--r-- | media/libstagefright/id3/ID3.cpp | 4 | ||||
-rw-r--r-- | media/libstagefright/include/ID3.h | 2 | ||||
-rw-r--r-- | media/libstagefright/rtsp/ARTSPConnection.cpp | 1 | ||||
-rw-r--r-- | media/libstagefright/rtsp/MyHandler.h | 4 |
14 files changed, 83 insertions, 31 deletions
diff --git a/include/media/stagefright/MediaCodec.h b/include/media/stagefright/MediaCodec.h index cacfa54..b1e57cf 100644 --- a/include/media/stagefright/MediaCodec.h +++ b/include/media/stagefright/MediaCodec.h @@ -113,6 +113,8 @@ struct MediaCodec : public AHandler { // pending, an error is pending. void requestActivityNotification(const sp<AMessage> ¬ify); + status_t getName(AString *componentName) const; + protected: virtual ~MediaCodec(); virtual void onMessageReceived(const sp<AMessage> &msg); @@ -154,6 +156,7 @@ private: kWhatCodecNotify = 'codc', kWhatRequestIDRFrame = 'ridr', kWhatRequestActivityNotification = 'racN', + kWhatGetName = 'getN', }; enum { @@ -178,6 +181,7 @@ private: sp<ALooper> mLooper; sp<ALooper> mCodecLooper; sp<ACodec> mCodec; + AString mComponentName; uint32_t mReplyID; uint32_t mFlags; sp<SurfaceTextureClient> mNativeWindow; diff --git a/include/media/stagefright/MediaExtractor.h b/include/media/stagefright/MediaExtractor.h index 94090ee..3076a96 100644 --- a/include/media/stagefright/MediaExtractor.h +++ b/include/media/stagefright/MediaExtractor.h @@ -67,7 +67,7 @@ public: } protected: - MediaExtractor() {} + MediaExtractor() : mIsDrm(false) {} virtual ~MediaExtractor() {} private: diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 362d022..aec8c4a 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -1441,7 +1441,7 @@ status_t AudioTrack::dump(int fd, const Vector<String16>& args) const result.append(" AudioTrack::dump\n"); snprintf(buffer, 255, " stream type(%d), left - right volume(%f, %f)\n", mStreamType, mVolume[0], mVolume[1]); result.append(buffer); - snprintf(buffer, 255, " format(%d), channel count(%d), frame count(%d)\n", mFormat, mChannelCount, mCblk->frameCount); + snprintf(buffer, 255, " format(%d), channel count(%d), frame count(%d)\n", mFormat, mChannelCount, (mCblk == 0) ? 0 : mCblk->frameCount); result.append(buffer); snprintf(buffer, 255, " sample rate(%d), status(%d), muted(%d)\n", (mCblk == 0) ? 0 : mCblk->sampleRate, mStatus, mMuted); result.append(buffer); diff --git a/media/libstagefright/MP3Extractor.cpp b/media/libstagefright/MP3Extractor.cpp index d94054b..380dab4 100644 --- a/media/libstagefright/MP3Extractor.cpp +++ b/media/libstagefright/MP3Extractor.cpp @@ -350,8 +350,10 @@ MP3Extractor::MP3Extractor( mInitCheck = OK; - // get iTunes-style gapless info if present - ID3 id3(mDataSource); + // Get iTunes-style gapless info if present. + // When getting the id3 tag, skip the V1 tags to prevent the source cache + // from being iterated to the end of the file. + ID3 id3(mDataSource, true); if (id3.isValid()) { ID3::Iterator *com = new ID3::Iterator(id3, "COM"); if (com->done()) { diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index dc8e4a3..b2afec7 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -30,6 +30,7 @@ #include <string.h> #include <media/stagefright/foundation/ABitReader.h> +#include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/DataSource.h> @@ -1221,18 +1222,15 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('a', 'v', 'c', 'C'): { - char buffer[256]; - if (chunk_data_size > (off64_t)sizeof(buffer)) { - return ERROR_BUFFER_TOO_SMALL; - } + sp<ABuffer> buffer = new ABuffer(chunk_data_size); if (mDataSource->readAt( - data_offset, buffer, chunk_data_size) < chunk_data_size) { + data_offset, buffer->data(), chunk_data_size) < chunk_data_size) { return ERROR_IO; } mLastTrack->meta->setData( - kKeyAVCC, kTypeAVCC, buffer, chunk_data_size); + kKeyAVCC, kTypeAVCC, buffer->data(), chunk_data_size); *offset += chunk_size; break; @@ -1633,8 +1631,9 @@ status_t MPEG4Extractor::parseMetaData(off64_t offset, size_t size) { { if (size == 16 && flags == 0) { char tmp[16]; - sprintf(tmp, "%d/%d", - (int)buffer[size - 5], (int)buffer[size - 3]); + uint16_t* pTrack = (uint16_t*)&buffer[10]; + uint16_t* pTotalTracks = (uint16_t*)&buffer[12]; + sprintf(tmp, "%d/%d", ntohs(*pTrack), ntohs(*pTotalTracks)); mFileMetaData->setCString(kKeyCDTrackNumber, tmp); } @@ -1642,10 +1641,11 @@ status_t MPEG4Extractor::parseMetaData(off64_t offset, size_t size) { } case FOURCC('d', 'i', 's', 'k'): { - if (size == 14 && flags == 0) { + if ((size == 14 || size == 16) && flags == 0) { char tmp[16]; - sprintf(tmp, "%d/%d", - (int)buffer[size - 3], (int)buffer[size - 1]); + uint16_t* pDisc = (uint16_t*)&buffer[10]; + uint16_t* pTotalDiscs = (uint16_t*)&buffer[12]; + sprintf(tmp, "%d/%d", ntohs(*pDisc), ntohs(*pTotalDiscs)); mFileMetaData->setCString(kKeyDiscNumber, tmp); } diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index 56e6df0..cb8a651 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -302,6 +302,20 @@ status_t MediaCodec::getOutputFormat(sp<AMessage> *format) const { return OK; } +status_t MediaCodec::getName(AString *name) const { + sp<AMessage> msg = new AMessage(kWhatGetName, id()); + + sp<AMessage> response; + status_t err; + if ((err = PostAndAwaitResponse(msg, &response)) != OK) { + return err; + } + + CHECK(response->findString("name", name)); + + return OK; +} + status_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const { sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); msg->setInt32("portIndex", kPortIndexInput); @@ -534,16 +548,15 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { CHECK_EQ(mState, INITIALIZING); setState(INITIALIZED); - AString componentName; - CHECK(msg->findString("componentName", &componentName)); + CHECK(msg->findString("componentName", &mComponentName)); - if (componentName.startsWith("OMX.google.")) { + if (mComponentName.startsWith("OMX.google.")) { mFlags |= kFlagIsSoftwareCodec; } else { mFlags &= ~kFlagIsSoftwareCodec; } - if (componentName.endsWith(".secure")) { + if (mComponentName.endsWith(".secure")) { mFlags |= kFlagIsSecure; } else { mFlags &= ~kFlagIsSecure; @@ -1171,6 +1184,25 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { break; } + case kWhatGetName: + { + uint32_t replyID; + CHECK(msg->senderAwaitsResponse(&replyID)); + + if (mComponentName.empty()) { + sp<AMessage> response = new AMessage; + response->setInt32("err", INVALID_OPERATION); + + response->postReply(replyID); + break; + } + + sp<AMessage> response = new AMessage; + response->setString("name", mComponentName.c_str()); + response->postReply(replyID); + break; + } + default: TRESPASS(); } @@ -1240,6 +1272,10 @@ void MediaCodec::setState(State newState) { mActivityNotify.clear(); } + if (newState == UNINITIALIZED) { + mComponentName.clear(); + } + mState = newState; cancelPendingDequeueOperations(); diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp index b7cf96e..bccffd8 100644 --- a/media/libstagefright/StagefrightMediaScanner.cpp +++ b/media/libstagefright/StagefrightMediaScanner.cpp @@ -42,7 +42,7 @@ static bool FileHasAcceptableExtension(const char *extension) { ".mpeg", ".ogg", ".mid", ".smf", ".imy", ".wma", ".aac", ".wav", ".amr", ".midi", ".xmf", ".rtttl", ".rtx", ".ota", ".mkv", ".mka", ".webm", ".ts", ".fl", ".flac", ".mxmf", - ".avi", ".mpeg", ".mpg" + ".avi", ".mpeg", ".mpg", ".mpga" }; static const size_t kNumValidExtensions = sizeof(kValidExtensions) / sizeof(kValidExtensions[0]); diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp index a2f3f13..19af4fb 100644 --- a/media/libstagefright/StagefrightMetadataRetriever.cpp +++ b/media/libstagefright/StagefrightMetadataRetriever.cpp @@ -433,7 +433,7 @@ const char *StagefrightMetadataRetriever::extractMetadata(int keyCode) { return NULL; } - return strdup(mMetaData.valueAt(index).string()); + return mMetaData.valueAt(index).string(); } void StagefrightMetadataRetriever::parseMetaData() { diff --git a/media/libstagefright/WVMExtractor.cpp b/media/libstagefright/WVMExtractor.cpp index 31b2bcf..5ae80cc 100644 --- a/media/libstagefright/WVMExtractor.cpp +++ b/media/libstagefright/WVMExtractor.cpp @@ -72,15 +72,18 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source) } } -bool WVMExtractor::getVendorLibHandle() +static void init_routine() { - if (gVendorLibHandle == NULL) { - gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW); - } - + gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW); if (gVendorLibHandle == NULL) { ALOGE("Failed to open libwvm.so"); } +} + +bool WVMExtractor::getVendorLibHandle() +{ + static pthread_once_t sOnceControl = PTHREAD_ONCE_INIT; + pthread_once(&sOnceControl, init_routine); return gVendorLibHandle != NULL; } diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s index e0b338d..ac2dd13 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s @@ -44,7 +44,9 @@ pred_lt4_asm: SUBLT r5, r5, #2 @x-- SUB r5, r5, #30 @x -= 15 RSB r4, r2, #3 @k = 3 - frac - LDR r6, Table + ADRL r8, Table + LDR r6, [r8] + ADD r6, r8 MOV r8, r4, LSL #6 @MOV r7, #0 @j = 0 ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0]) @@ -451,7 +453,7 @@ pred_lt4_end: LDMFD r13!, {r4 - r12, r15} Table: - .word inter4_2 + .word inter4_2-Table @ENDFUNC .END diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp index 69274ca..22c2f5a 100644 --- a/media/libstagefright/id3/ID3.cpp +++ b/media/libstagefright/id3/ID3.cpp @@ -30,7 +30,7 @@ namespace android { static const size_t kMaxMetadataSize = 3 * 1024 * 1024; -ID3::ID3(const sp<DataSource> &source) +ID3::ID3(const sp<DataSource> &source, bool ignoreV1) : mIsValid(false), mData(NULL), mSize(0), @@ -38,7 +38,7 @@ ID3::ID3(const sp<DataSource> &source) mVersion(ID3_UNKNOWN) { mIsValid = parseV2(source); - if (!mIsValid) { + if (!mIsValid && !ignoreV1) { mIsValid = parseV1(source); } } diff --git a/media/libstagefright/include/ID3.h b/media/libstagefright/include/ID3.h index 8714008..3028f56 100644 --- a/media/libstagefright/include/ID3.h +++ b/media/libstagefright/include/ID3.h @@ -35,7 +35,7 @@ struct ID3 { ID3_V2_4, }; - ID3(const sp<DataSource> &source); + ID3(const sp<DataSource> &source, bool ignoreV1 = false); ~ID3(); bool isValid() const; diff --git a/media/libstagefright/rtsp/ARTSPConnection.cpp b/media/libstagefright/rtsp/ARTSPConnection.cpp index 539a888..161bd4f 100644 --- a/media/libstagefright/rtsp/ARTSPConnection.cpp +++ b/media/libstagefright/rtsp/ARTSPConnection.cpp @@ -830,6 +830,7 @@ status_t ARTSPConnection::findPendingRequest( if (i < 0) { // This is an unsolicited server->client message. + *index = -1; return OK; } diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index deee30f..96c7683 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -1091,6 +1091,10 @@ struct MyHandler : public AHandler { void parsePlayResponse(const sp<ARTSPResponse> &response) { mSeekable = false; + if (mTracks.size() == 0) { + ALOGV("parsePlayResponse: late packets ignored."); + return; + } ssize_t i = response->mHeaders.indexOfKey("range"); if (i < 0) { |