diff options
-rw-r--r-- | include/media/stagefright/MediaCodec.h | 4 | ||||
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 44 |
2 files changed, 44 insertions, 4 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/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(); |