189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2008, The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/Parcel.h>
227562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IMemory.h>
2359451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber#include <media/IHDCP.h>
241381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar#include <media/IMediaCodecList.h>
251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayerService.h>
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaRecorder.h>
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IOMX.h>
292013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown#include <media/IRemoteDisplay.h>
302013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown#include <media/IRemoteDisplayClient.h>
31e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/IStreamSource.h>
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Errors.h>  // for status_t
342013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown#include <utils/String8.h>
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
39d681bbb1767bed09415e050ba78975df214bcd68Dave Burke    CREATE = IBinder::FIRST_CALL_TRANSACTION,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_MEDIA_RECORDER,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_METADATA_RETRIEVER,
42260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen    GET_OMX,
4359451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber    MAKE_HDCP,
447cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    ADD_BATTERY_DATA,
452013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown    PULL_BATTERY_DATA,
462013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown    LISTEN_FOR_REMOTE_DISPLAY,
471381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar    GET_CODEC_LIST,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaPlayerService: public BpInterface<IMediaPlayerService>
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpMediaPlayerService(const sp<IBinder>& impl)
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaPlayerService>(impl)
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
58f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten    virtual sp<IMediaMetadataRetriever> createMetadataRetriever()
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
662db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber    virtual sp<IMediaPlayer> create(
67d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId) {
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
70f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
71a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent        data.writeInt32(audioSessionId);
722db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
73d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        remote()->transact(CREATE, data, &reply);
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaPlayer>(reply.readStrongBinder());
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
77be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov    virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName)
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
81be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        data.writeString16(opPackageName);
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMediaRecorder>(reply.readStrongBinder());
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
86260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen    virtual sp<IOMX> getOMX() {
87260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen        Parcel data, reply;
88260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
89260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen        remote()->transact(GET_OMX, data, &reply);
90260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen        return interface_cast<IOMX>(reply.readStrongBinder());
91260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen    }
927cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
93279dcd89ab1d2de91dfe95e461412a0f577a6891Andreas Huber    virtual sp<IHDCP> makeHDCP(bool createEncryptionModule) {
9459451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        Parcel data, reply;
9559451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
96279dcd89ab1d2de91dfe95e461412a0f577a6891Andreas Huber        data.writeInt32(createEncryptionModule);
9759451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        remote()->transact(MAKE_HDCP, data, &reply);
9859451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        return interface_cast<IHDCP>(reply.readStrongBinder());
9959451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber    }
10059451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber
1017cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    virtual void addBatteryData(uint32_t params) {
1027cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        Parcel data, reply;
1037cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
1047cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        data.writeInt32(params);
1057cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        remote()->transact(ADD_BATTERY_DATA, data, &reply);
1067cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
1077cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1087cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    virtual status_t pullBatteryData(Parcel* reply) {
1097cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        Parcel data;
1107cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
1117cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        return remote()->transact(PULL_BATTERY_DATA, data, reply);
1127cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
1132013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown
114be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov    virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName,
115be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const sp<IRemoteDisplayClient>& client, const String8& iface)
1162013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown    {
1172013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        Parcel data, reply;
1182013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
119be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        data.writeString16(opPackageName);
120f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
1212013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        data.writeString8(iface);
1222013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);
1232013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        return interface_cast<IRemoteDisplay>(reply.readStrongBinder());
1242013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown    }
1251381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar
1261381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar    virtual sp<IMediaCodecList> getCodecList() const {
1271381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar        Parcel data, reply;
1281381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
1291381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar        remote()->transact(GET_CODEC_LIST, data, &reply);
1301381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar        return interface_cast<IMediaCodecList>(reply.readStrongBinder());
1311381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar    }
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13456f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaPlayerService::onTransact(
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
141e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
142d681bbb1767bed09415e050ba78975df214bcd68Dave Burke        case CREATE: {
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
1442db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            sp<IMediaPlayerClient> client =
1452db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber                interface_cast<IMediaPlayerClient>(data.readStrongBinder());
146d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSessionId = (audio_session_t) data.readInt32();
147f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten            sp<IMediaPlayer> player = create(client, audioSessionId);
148f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(player));
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_MEDIA_RECORDER: {
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
153be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 opPackageName = data.readString16();
154be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            sp<IMediaRecorder> recorder = createMediaRecorder(opPackageName);
155f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(recorder));
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_METADATA_RETRIEVER: {
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaPlayerService, data, reply);
160f37971f624164c3ed185d3f976404a6f60f49b9aGlenn Kasten            sp<IMediaMetadataRetriever> retriever = createMetadataRetriever();
161f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(retriever));
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
164260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen        case GET_OMX: {
165260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen            CHECK_INTERFACE(IMediaPlayerService, data, reply);
166260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen            sp<IOMX> omx = getOMX();
167260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(omx));
168260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen            return NO_ERROR;
169260e56c9a17737bf280d776797d6dee411c9b4daMarco Nelissen        } break;
17059451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        case MAKE_HDCP: {
17159451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber            CHECK_INTERFACE(IMediaPlayerService, data, reply);
172279dcd89ab1d2de91dfe95e461412a0f577a6891Andreas Huber            bool createEncryptionModule = data.readInt32();
173279dcd89ab1d2de91dfe95e461412a0f577a6891Andreas Huber            sp<IHDCP> hdcp = makeHDCP(createEncryptionModule);
174f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(hdcp));
17559451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber            return NO_ERROR;
17659451f8ced48874427ff1550391c4f3cd2ba2e35Andreas Huber        } break;
1777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        case ADD_BATTERY_DATA: {
1787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            CHECK_INTERFACE(IMediaPlayerService, data, reply);
1797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            uint32_t params = data.readInt32();
1807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            addBatteryData(params);
1817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            return NO_ERROR;
1827cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        } break;
1837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        case PULL_BATTERY_DATA: {
1847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            CHECK_INTERFACE(IMediaPlayerService, data, reply);
1857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            pullBatteryData(reply);
1867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            return NO_ERROR;
1877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        } break;
1882013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        case LISTEN_FOR_REMOTE_DISPLAY: {
1892013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            CHECK_INTERFACE(IMediaPlayerService, data, reply);
190be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 opPackageName = data.readString16();
1912013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            sp<IRemoteDisplayClient> client(
1922013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown                    interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));
1932afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (client == NULL) {
1942afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeStrongBinder(NULL);
1952afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                return NO_ERROR;
1962afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
1972013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            String8 iface(data.readString8());
198be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            sp<IRemoteDisplay> display(listenForRemoteDisplay(opPackageName, client, iface));
199f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(display));
2002013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown            return NO_ERROR;
2012013a54981d4ffb036dff279b88cc9f08c0ee1c2Jeff Brown        } break;
2021381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar        case GET_CODEC_LIST: {
2031381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar            CHECK_INTERFACE(IMediaPlayerService, data, reply);
2041381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar            sp<IMediaCodecList> mcl = getCodecList();
205f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(mcl));
2061381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar            return NO_ERROR;
2071381d4b5c0385aec3741073e5998773b064c1fb0Lajos Molnar        } break;
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21540bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
216