From 1381d4b5c0385aec3741073e5998773b064c1fb0 Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Thu, 7 Aug 2014 15:18:35 -0700 Subject: [PATCH] media/playerservice: add getCodecList() to MediaPlayerService Bug: 11990470 Change-Id: I8fa45946fd9b76f9b975fc59062819c57e6881ef --- include/media/IMediaPlayerService.h | 2 ++ media/libmedia/IMediaPlayerService.cpp | 15 +++++++++++++++ media/libmediaplayerservice/MediaPlayerService.cpp | 5 +++++ media/libmediaplayerservice/MediaPlayerService.h | 1 + media/libstagefright/MediaCodecList.cpp | 17 ++++++++++++++++- 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/include/media/IMediaPlayerService.h b/include/media/IMediaPlayerService.h index 5b45376065..d7e584a6e5 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 makeCrypto() = 0; virtual sp makeDrm() = 0; virtual sp makeHDCP(bool createEncryptionModule) = 0; + virtual sp 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 d116b14906..2e02d1770a 100644 --- a/media/libmedia/IMediaPlayerService.cpp +++ b/media/libmedia/IMediaPlayerService.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,7 @@ enum { ADD_BATTERY_DATA, PULL_BATTERY_DATA, LISTEN_FOR_REMOTE_DISPLAY, + GET_CODEC_LIST, }; class BpMediaPlayerService: public BpInterface @@ -191,6 +193,13 @@ public: remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply); return interface_cast(reply.readStrongBinder()); } + + virtual sp getCodecList() const { + Parcel data, reply; + data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); + remote()->transact(GET_CODEC_LIST, data, &reply); + return interface_cast(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 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 735344c9c5..a706987f97 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -54,6 +54,7 @@ #include #include #include +#include #include #include #include @@ -345,6 +346,10 @@ sp MediaPlayerService::create(const sp& client return c; } +sp MediaPlayerService::getCodecList() const { + return MediaCodecList::getLocalInstance(); +} + sp MediaPlayerService::getOMX() { Mutex::Autolock autoLock(mLock); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 2eca6a0762..406e3f6965 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& heap, size_t *pSize); + virtual sp getCodecList() const; virtual sp getOMX(); virtual sp makeCrypto(); virtual sp makeDrm(); diff --git a/media/libstagefright/MediaCodecList.cpp b/media/libstagefright/MediaCodecList.cpp index 60809c1fdb..7f8b7f5697 100644 --- a/media/libstagefright/MediaCodecList.cpp +++ b/media/libstagefright/MediaCodecList.cpp @@ -64,7 +64,22 @@ sp MediaCodecList::sRemoteList; // static sp MediaCodecList::getInstance() { - return getLocalInstance(); + Mutex::Autolock _l(sRemoteInitMutex); + if (sRemoteList == NULL) { + sp binder = + defaultServiceManager()->getService(String16("media.player")); + sp service = + interface_cast(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() -- 2.11.0