xref: /aosp_15_r20/frameworks/av/media/libmedia/IMediaPlayerService.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2008, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker **     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h>
19*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaCodecList.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaHTTPService.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaPlayerService.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaPlayer.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/IMediaRecorder.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/IOMX.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <media/IRemoteDisplay.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <media/IRemoteDisplayClient.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <media/IStreamSource.h>
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h>  // for status_t
34*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h>
35*ec779b8eSAndroid Build Coastguard Worker 
36*ec779b8eSAndroid Build Coastguard Worker namespace android {
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker using android::content::AttributionSourceState;
39*ec779b8eSAndroid Build Coastguard Worker 
40*ec779b8eSAndroid Build Coastguard Worker enum {
41*ec779b8eSAndroid Build Coastguard Worker     CREATE = IBinder::FIRST_CALL_TRANSACTION,
42*ec779b8eSAndroid Build Coastguard Worker     CREATE_MEDIA_RECORDER,
43*ec779b8eSAndroid Build Coastguard Worker     CREATE_METADATA_RETRIEVER,
44*ec779b8eSAndroid Build Coastguard Worker     ADD_BATTERY_DATA,
45*ec779b8eSAndroid Build Coastguard Worker     PULL_BATTERY_DATA,
46*ec779b8eSAndroid Build Coastguard Worker     LISTEN_FOR_REMOTE_DISPLAY,
47*ec779b8eSAndroid Build Coastguard Worker     GET_CODEC_LIST,
48*ec779b8eSAndroid Build Coastguard Worker };
49*ec779b8eSAndroid Build Coastguard Worker 
50*ec779b8eSAndroid Build Coastguard Worker class BpMediaPlayerService: public BpInterface<IMediaPlayerService>
51*ec779b8eSAndroid Build Coastguard Worker {
52*ec779b8eSAndroid Build Coastguard Worker public:
BpMediaPlayerService(const sp<IBinder> & impl)53*ec779b8eSAndroid Build Coastguard Worker     explicit BpMediaPlayerService(const sp<IBinder>& impl)
54*ec779b8eSAndroid Build Coastguard Worker         : BpInterface<IMediaPlayerService>(impl)
55*ec779b8eSAndroid Build Coastguard Worker     {
56*ec779b8eSAndroid Build Coastguard Worker     }
57*ec779b8eSAndroid Build Coastguard Worker 
createMetadataRetriever()58*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IMediaMetadataRetriever> createMetadataRetriever()
59*ec779b8eSAndroid Build Coastguard Worker     {
60*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
61*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
62*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
63*ec779b8eSAndroid Build Coastguard Worker         return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
64*ec779b8eSAndroid Build Coastguard Worker     }
65*ec779b8eSAndroid Build Coastguard Worker 
create(const sp<IMediaPlayerClient> & client,audio_session_t audioSessionId,const AttributionSourceState & attributionSource)66*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IMediaPlayer> create(
67*ec779b8eSAndroid Build Coastguard Worker             const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId,
68*ec779b8eSAndroid Build Coastguard Worker             const AttributionSourceState& attributionSource) {
69*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
70*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
71*ec779b8eSAndroid Build Coastguard Worker         data.writeStrongBinder(IInterface::asBinder(client));
72*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(audioSessionId);
73*ec779b8eSAndroid Build Coastguard Worker         data.writeParcelable(attributionSource);
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(CREATE, data, &reply);
76*ec779b8eSAndroid Build Coastguard Worker         return interface_cast<IMediaPlayer>(reply.readStrongBinder());
77*ec779b8eSAndroid Build Coastguard Worker     }
78*ec779b8eSAndroid Build Coastguard Worker 
createMediaRecorder(const AttributionSourceState & attributionSource)79*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IMediaRecorder> createMediaRecorder(const AttributionSourceState& attributionSource)
80*ec779b8eSAndroid Build Coastguard Worker     {
81*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
82*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
83*ec779b8eSAndroid Build Coastguard Worker         data.writeParcelable(attributionSource);
84*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
85*ec779b8eSAndroid Build Coastguard Worker         return interface_cast<IMediaRecorder>(reply.readStrongBinder());
86*ec779b8eSAndroid Build Coastguard Worker     }
87*ec779b8eSAndroid Build Coastguard Worker 
addBatteryData(uint32_t params)88*ec779b8eSAndroid Build Coastguard Worker     virtual void addBatteryData(uint32_t params) {
89*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
90*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
91*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(params);
92*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(ADD_BATTERY_DATA, data, &reply);
93*ec779b8eSAndroid Build Coastguard Worker     }
94*ec779b8eSAndroid Build Coastguard Worker 
pullBatteryData(Parcel * reply)95*ec779b8eSAndroid Build Coastguard Worker     virtual status_t pullBatteryData(Parcel* reply) {
96*ec779b8eSAndroid Build Coastguard Worker         Parcel data;
97*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
98*ec779b8eSAndroid Build Coastguard Worker         return remote()->transact(PULL_BATTERY_DATA, data, reply);
99*ec779b8eSAndroid Build Coastguard Worker     }
100*ec779b8eSAndroid Build Coastguard Worker 
listenForRemoteDisplay(const String16 & opPackageName,const sp<IRemoteDisplayClient> & client,const String8 & iface)101*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName,
102*ec779b8eSAndroid Build Coastguard Worker             const sp<IRemoteDisplayClient>& client, const String8& iface)
103*ec779b8eSAndroid Build Coastguard Worker     {
104*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
105*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
106*ec779b8eSAndroid Build Coastguard Worker         data.writeString16(opPackageName);
107*ec779b8eSAndroid Build Coastguard Worker         data.writeStrongBinder(IInterface::asBinder(client));
108*ec779b8eSAndroid Build Coastguard Worker         data.writeString8(iface);
109*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);
110*ec779b8eSAndroid Build Coastguard Worker         return interface_cast<IRemoteDisplay>(reply.readStrongBinder());
111*ec779b8eSAndroid Build Coastguard Worker     }
112*ec779b8eSAndroid Build Coastguard Worker 
getCodecList() const113*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IMediaCodecList> getCodecList() const {
114*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
115*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
116*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_CODEC_LIST, data, &reply);
117*ec779b8eSAndroid Build Coastguard Worker         return interface_cast<IMediaCodecList>(reply.readStrongBinder());
118*ec779b8eSAndroid Build Coastguard Worker     }
119*ec779b8eSAndroid Build Coastguard Worker };
120*ec779b8eSAndroid Build Coastguard Worker 
121*ec779b8eSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
122*ec779b8eSAndroid Build Coastguard Worker 
123*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------
124*ec779b8eSAndroid Build Coastguard Worker 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)125*ec779b8eSAndroid Build Coastguard Worker status_t BnMediaPlayerService::onTransact(
126*ec779b8eSAndroid Build Coastguard Worker     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
127*ec779b8eSAndroid Build Coastguard Worker {
128*ec779b8eSAndroid Build Coastguard Worker     switch (code) {
129*ec779b8eSAndroid Build Coastguard Worker         case CREATE: {
130*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayerService, data, reply);
131*ec779b8eSAndroid Build Coastguard Worker             sp<IMediaPlayerClient> client =
132*ec779b8eSAndroid Build Coastguard Worker                 interface_cast<IMediaPlayerClient>(data.readStrongBinder());
133*ec779b8eSAndroid Build Coastguard Worker             audio_session_t audioSessionId = (audio_session_t) data.readInt32();
134*ec779b8eSAndroid Build Coastguard Worker             AttributionSourceState attributionSource;
135*ec779b8eSAndroid Build Coastguard Worker             status_t status = data.readParcelable(&attributionSource);
136*ec779b8eSAndroid Build Coastguard Worker             if (status != NO_ERROR) {
137*ec779b8eSAndroid Build Coastguard Worker                 return status;
138*ec779b8eSAndroid Build Coastguard Worker             }
139*ec779b8eSAndroid Build Coastguard Worker             sp<IMediaPlayer> player = create(client, audioSessionId, attributionSource);
140*ec779b8eSAndroid Build Coastguard Worker             reply->writeStrongBinder(IInterface::asBinder(player));
141*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
142*ec779b8eSAndroid Build Coastguard Worker         } break;
143*ec779b8eSAndroid Build Coastguard Worker         case CREATE_MEDIA_RECORDER: {
144*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayerService, data, reply);
145*ec779b8eSAndroid Build Coastguard Worker             AttributionSourceState attributionSource;
146*ec779b8eSAndroid Build Coastguard Worker             status_t status = data.readParcelable(&attributionSource);
147*ec779b8eSAndroid Build Coastguard Worker             if (status != NO_ERROR) {
148*ec779b8eSAndroid Build Coastguard Worker                 return status;
149*ec779b8eSAndroid Build Coastguard Worker             }
150*ec779b8eSAndroid Build Coastguard Worker             sp<IMediaRecorder> recorder = createMediaRecorder(attributionSource);
151*ec779b8eSAndroid Build Coastguard Worker             reply->writeStrongBinder(IInterface::asBinder(recorder));
152*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
153*ec779b8eSAndroid Build Coastguard Worker         } break;
154*ec779b8eSAndroid Build Coastguard Worker         case CREATE_METADATA_RETRIEVER: {
155*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayerService, data, reply);
156*ec779b8eSAndroid Build Coastguard Worker             sp<IMediaMetadataRetriever> retriever = createMetadataRetriever();
157*ec779b8eSAndroid Build Coastguard Worker             reply->writeStrongBinder(IInterface::asBinder(retriever));
158*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
159*ec779b8eSAndroid Build Coastguard Worker         } break;
160*ec779b8eSAndroid Build Coastguard Worker         case ADD_BATTERY_DATA: {
161*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayerService, data, reply);
162*ec779b8eSAndroid Build Coastguard Worker             uint32_t params = data.readInt32();
163*ec779b8eSAndroid Build Coastguard Worker             addBatteryData(params);
164*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
165*ec779b8eSAndroid Build Coastguard Worker         } break;
166*ec779b8eSAndroid Build Coastguard Worker         case PULL_BATTERY_DATA: {
167*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayerService, data, reply);
168*ec779b8eSAndroid Build Coastguard Worker             pullBatteryData(reply);
169*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
170*ec779b8eSAndroid Build Coastguard Worker         } break;
171*ec779b8eSAndroid Build Coastguard Worker         case LISTEN_FOR_REMOTE_DISPLAY: {
172*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayerService, data, reply);
173*ec779b8eSAndroid Build Coastguard Worker             const String16 opPackageName = data.readString16();
174*ec779b8eSAndroid Build Coastguard Worker             sp<IRemoteDisplayClient> client(
175*ec779b8eSAndroid Build Coastguard Worker                     interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));
176*ec779b8eSAndroid Build Coastguard Worker             if (client == NULL) {
177*ec779b8eSAndroid Build Coastguard Worker                 reply->writeStrongBinder(NULL);
178*ec779b8eSAndroid Build Coastguard Worker                 return NO_ERROR;
179*ec779b8eSAndroid Build Coastguard Worker             }
180*ec779b8eSAndroid Build Coastguard Worker             String8 iface(data.readString8());
181*ec779b8eSAndroid Build Coastguard Worker             sp<IRemoteDisplay> display(listenForRemoteDisplay(opPackageName, client, iface));
182*ec779b8eSAndroid Build Coastguard Worker             reply->writeStrongBinder(IInterface::asBinder(display));
183*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
184*ec779b8eSAndroid Build Coastguard Worker         } break;
185*ec779b8eSAndroid Build Coastguard Worker         case GET_CODEC_LIST: {
186*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IMediaPlayerService, data, reply);
187*ec779b8eSAndroid Build Coastguard Worker             sp<IMediaCodecList> mcl = getCodecList();
188*ec779b8eSAndroid Build Coastguard Worker             reply->writeStrongBinder(IInterface::asBinder(mcl));
189*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
190*ec779b8eSAndroid Build Coastguard Worker         } break;
191*ec779b8eSAndroid Build Coastguard Worker         default:
192*ec779b8eSAndroid Build Coastguard Worker             return BBinder::onTransact(code, data, reply, flags);
193*ec779b8eSAndroid Build Coastguard Worker     }
194*ec779b8eSAndroid Build Coastguard Worker }
195*ec779b8eSAndroid Build Coastguard Worker 
196*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
197*ec779b8eSAndroid Build Coastguard Worker 
198*ec779b8eSAndroid Build Coastguard Worker } // namespace android
199