diff options
author | Lajos Molnar <lajos@google.com> | 2014-08-07 15:18:35 -0700 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2014-08-07 17:40:13 -0700 |
commit | 1381d4b5c0385aec3741073e5998773b064c1fb0 (patch) | |
tree | 6087b737255d34703a90d1952d48bb97646e492a | |
parent | 60b1c0e79d12a1c70758bc8d060156924635f8ba (diff) | |
download | frameworks_av-1381d4b5c0385aec3741073e5998773b064c1fb0.zip frameworks_av-1381d4b5c0385aec3741073e5998773b064c1fb0.tar.gz frameworks_av-1381d4b5c0385aec3741073e5998773b064c1fb0.tar.bz2 |
media/playerservice: add getCodecList() to MediaPlayerService
Bug: 11990470
Change-Id: I8fa45946fd9b76f9b975fc59062819c57e6881ef
-rw-r--r-- | include/media/IMediaPlayerService.h | 2 | ||||
-rw-r--r-- | media/libmedia/IMediaPlayerService.cpp | 15 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 5 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 1 | ||||
-rw-r--r-- | media/libstagefright/MediaCodecList.cpp | 17 |
5 files changed, 39 insertions, 1 deletions
diff --git a/include/media/IMediaPlayerService.h b/include/media/IMediaPlayerService.h index 5b45376..d7e584a 100644 --- a/include/media/IMediaPlayerService.h +++ b/include/media/IMediaPlayerService.h @@ -34,6 +34,7 @@ namespace android { struct ICrypto; struct IDrm; struct IHDCP; +struct IMediaCodecList; struct IMediaHTTPService; class IMediaRecorder; class IOMX; @@ -65,6 +66,7 @@ public: virtual sp<ICrypto> makeCrypto() = 0; virtual sp<IDrm> makeDrm() = 0; virtual sp<IHDCP> makeHDCP(bool createEncryptionModule) = 0; + virtual sp<IMediaCodecList> getCodecList() const = 0; // Connects to a remote display. // 'iface' specifies the address of the local interface on which to listen for diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp index d116b14..2e02d17 100644 --- a/media/libmedia/IMediaPlayerService.cpp +++ b/media/libmedia/IMediaPlayerService.cpp @@ -23,6 +23,7 @@ #include <media/ICrypto.h> #include <media/IDrm.h> #include <media/IHDCP.h> +#include <media/IMediaCodecList.h> #include <media/IMediaHTTPService.h> #include <media/IMediaPlayerService.h> #include <media/IMediaRecorder.h> @@ -49,6 +50,7 @@ enum { ADD_BATTERY_DATA, PULL_BATTERY_DATA, LISTEN_FOR_REMOTE_DISPLAY, + GET_CODEC_LIST, }; class BpMediaPlayerService: public BpInterface<IMediaPlayerService> @@ -191,6 +193,13 @@ public: remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply); return interface_cast<IRemoteDisplay>(reply.readStrongBinder()); } + + virtual sp<IMediaCodecList> getCodecList() const { + Parcel data, reply; + data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); + remote()->transact(GET_CODEC_LIST, data, &reply); + return interface_cast<IMediaCodecList>(reply.readStrongBinder()); + } }; IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService"); @@ -318,6 +327,12 @@ status_t BnMediaPlayerService::onTransact( reply->writeStrongBinder(display->asBinder()); return NO_ERROR; } break; + case GET_CODEC_LIST: { + CHECK_INTERFACE(IMediaPlayerService, data, reply); + sp<IMediaCodecList> mcl = getCodecList(); + reply->writeStrongBinder(mcl->asBinder()); + return NO_ERROR; + } break; default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 735344c..a706987 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -54,6 +54,7 @@ #include <media/Metadata.h> #include <media/AudioTrack.h> #include <media/MemoryLeakTrackUtil.h> +#include <media/stagefright/MediaCodecList.h> #include <media/stagefright/MediaErrors.h> #include <media/stagefright/AudioPlayer.h> #include <media/stagefright/foundation/ADebug.h> @@ -345,6 +346,10 @@ sp<IMediaPlayer> MediaPlayerService::create(const sp<IMediaPlayerClient>& client return c; } +sp<IMediaCodecList> MediaPlayerService::getCodecList() const { + return MediaCodecList::getLocalInstance(); +} + sp<IOMX> MediaPlayerService::getOMX() { Mutex::Autolock autoLock(mLock); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 2eca6a0..406e3f6 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -273,6 +273,7 @@ public: uint32_t *pSampleRate, int* pNumChannels, audio_format_t* pFormat, const sp<IMemoryHeap>& heap, size_t *pSize); + virtual sp<IMediaCodecList> getCodecList() const; virtual sp<IOMX> getOMX(); virtual sp<ICrypto> makeCrypto(); virtual sp<IDrm> makeDrm(); diff --git a/media/libstagefright/MediaCodecList.cpp b/media/libstagefright/MediaCodecList.cpp index 60809c1..7f8b7f5 100644 --- a/media/libstagefright/MediaCodecList.cpp +++ b/media/libstagefright/MediaCodecList.cpp @@ -64,7 +64,22 @@ sp<IMediaCodecList> MediaCodecList::sRemoteList; // static sp<IMediaCodecList> MediaCodecList::getInstance() { - return getLocalInstance(); + Mutex::Autolock _l(sRemoteInitMutex); + if (sRemoteList == NULL) { + sp<IBinder> binder = + defaultServiceManager()->getService(String16("media.player")); + sp<IMediaPlayerService> service = + interface_cast<IMediaPlayerService>(binder); + if (service.get() != NULL) { + sRemoteList = service->getCodecList(); + } + + if (sRemoteList == NULL) { + // if failed to get remote list, create local list + sRemoteList = getLocalInstance(); + } + } + return sRemoteList; } MediaCodecList::MediaCodecList() |