blob: 966267acb8c2d206c3438645cf6b1b8e838d9eb6 [file] [log] [blame]
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001/*
2**
3** Copyright 2008, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
John Grossmanc795b642012-02-22 15:38:35 -080018#include <arpa/inet.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080019#include <stdint.h>
20#include <sys/types.h>
21
Mathias Agopian75624082009-05-19 19:08:10 -070022#include <binder/Parcel.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080023
Lajos Molnar3a474aa2015-04-24 17:10:07 -070024#include <media/AudioResamplerPublic.h>
25#include <media/AVSyncSettings.h>
Wei Jiad399e7e2016-10-26 15:49:11 -070026#include <media/BufferingSettings.h>
Lajos Molnar3a474aa2015-04-24 17:10:07 -070027
Chris Watkins99f31602015-03-20 13:06:33 -070028#include <media/IDataSource.h>
Andreas Huber1b86fe02014-01-29 11:13:26 -080029#include <media/IMediaHTTPService.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080030#include <media/IMediaPlayer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010031#include <media/IStreamSource.h>
32
Andy McFadden8ba01022012-12-18 09:46:54 -080033#include <gui/IGraphicBufferProducer.h>
Dave Burked681bbb2011-08-30 14:39:17 +010034#include <utils/String8.h>
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080035
36namespace android {
37
38enum {
39 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
Dave Burked681bbb2011-08-30 14:39:17 +010040 SET_DATA_SOURCE_URL,
41 SET_DATA_SOURCE_FD,
42 SET_DATA_SOURCE_STREAM,
Chris Watkins99f31602015-03-20 13:06:33 -070043 SET_DATA_SOURCE_CALLBACK,
Wei Jiad399e7e2016-10-26 15:49:11 -070044 SET_BUFFERING_SETTINGS,
45 GET_DEFAULT_BUFFERING_SETTINGS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080046 PREPARE_ASYNC,
47 START,
48 STOP,
49 IS_PLAYING,
Lajos Molnar3a474aa2015-04-24 17:10:07 -070050 SET_PLAYBACK_SETTINGS,
51 GET_PLAYBACK_SETTINGS,
52 SET_SYNC_SETTINGS,
53 GET_SYNC_SETTINGS,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080054 PAUSE,
55 SEEK_TO,
56 GET_CURRENT_POSITION,
57 GET_DURATION,
58 RESET,
59 SET_AUDIO_STREAM_TYPE,
60 SET_LOOPING,
Nicolas Catania1d187f12009-05-12 23:25:55 -070061 SET_VOLUME,
62 INVOKE,
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -070063 SET_METADATA_FILTER,
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -070064 GET_METADATA,
Eric Laurent2beeb502010-07-16 07:43:46 -070065 SET_AUX_EFFECT_SEND_LEVEL,
Glenn Kasten11731182011-02-08 17:26:17 -080066 ATTACH_AUX_EFFECT,
67 SET_VIDEO_SURFACETEXTURE,
Gloria Wang4f9e47f2011-04-25 17:28:22 -070068 SET_PARAMETER,
69 GET_PARAMETER,
John Grossmanc795b642012-02-22 15:38:35 -080070 SET_RETRANSMIT_ENDPOINT,
John Grossman44a7e422012-06-21 17:29:24 -070071 GET_RETRANSMIT_ENDPOINT,
Marco Nelissen6b74d672012-02-28 16:07:44 -080072 SET_NEXT_PLAYER,
Hassan Shojania071437a2017-01-23 09:19:40 -080073 // ModDrm
74 PREPARE_DRM,
75 RELEASE_DRM,
76 GET_KEY_REQUEST,
77 PROVIDE_KEY_RESPONSE,
78 RESTORE_KEYS,
79 GET_DRM_PROPERTY_STRING,
80 SET_DRM_PROPERTY_STRING,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080081};
82
Hassan Shojania071437a2017-01-23 09:19:40 -080083// ModDrm helpers
84static void readVector(const Parcel& reply, Vector<uint8_t>& vector) {
85 uint32_t size = reply.readUint32();
86 vector.insertAt((size_t)0, size);
87 reply.read(vector.editArray(), size);
88}
89
90static void writeVector(Parcel& data, Vector<uint8_t> const& vector) {
91 data.writeUint32(vector.size());
92 data.write(vector.array(), vector.size());
93}
94
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080095class BpMediaPlayer: public BpInterface<IMediaPlayer>
96{
97public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -070098 explicit BpMediaPlayer(const sp<IBinder>& impl)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080099 : BpInterface<IMediaPlayer>(impl)
100 {
101 }
102
103 // disconnect from media player service
104 void disconnect()
105 {
106 Parcel data, reply;
107 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
108 remote()->transact(DISCONNECT, data, &reply);
109 }
110
Andreas Huber1b86fe02014-01-29 11:13:26 -0800111 status_t setDataSource(
112 const sp<IMediaHTTPService> &httpService,
113 const char* url,
Dave Burked681bbb2011-08-30 14:39:17 +0100114 const KeyedVector<String8, String8>* headers)
115 {
116 Parcel data, reply;
117 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Andreas Huber1b86fe02014-01-29 11:13:26 -0800118 data.writeInt32(httpService != NULL);
119 if (httpService != NULL) {
Marco Nelissen06b46062014-11-14 07:58:25 -0800120 data.writeStrongBinder(IInterface::asBinder(httpService));
Andreas Huber1b86fe02014-01-29 11:13:26 -0800121 }
Dave Burked681bbb2011-08-30 14:39:17 +0100122 data.writeCString(url);
123 if (headers == NULL) {
124 data.writeInt32(0);
125 } else {
126 // serialize the headers
127 data.writeInt32(headers->size());
128 for (size_t i = 0; i < headers->size(); ++i) {
129 data.writeString8(headers->keyAt(i));
130 data.writeString8(headers->valueAt(i));
131 }
132 }
133 remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
134 return reply.readInt32();
135 }
136
137 status_t setDataSource(int fd, int64_t offset, int64_t length) {
138 Parcel data, reply;
139 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
140 data.writeFileDescriptor(fd);
141 data.writeInt64(offset);
142 data.writeInt64(length);
143 remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
144 return reply.readInt32();
145 }
146
147 status_t setDataSource(const sp<IStreamSource> &source) {
148 Parcel data, reply;
149 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800150 data.writeStrongBinder(IInterface::asBinder(source));
Glenn Kasten8d655102011-09-07 14:40:23 -0700151 remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
Dave Burked681bbb2011-08-30 14:39:17 +0100152 return reply.readInt32();
153 }
154
Chris Watkins99f31602015-03-20 13:06:33 -0700155 status_t setDataSource(const sp<IDataSource> &source) {
156 Parcel data, reply;
157 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
158 data.writeStrongBinder(IInterface::asBinder(source));
159 remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
160 return reply.readInt32();
161 }
162
Andy McFadden8ba01022012-12-18 09:46:54 -0800163 // pass the buffered IGraphicBufferProducer to the media player service
164 status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
Glenn Kasten11731182011-02-08 17:26:17 -0800165 {
166 Parcel data, reply;
167 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800168 sp<IBinder> b(IInterface::asBinder(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800169 data.writeStrongBinder(b);
170 remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
171 return reply.readInt32();
172 }
173
Wei Jiad399e7e2016-10-26 15:49:11 -0700174 status_t setBufferingSettings(const BufferingSettings& buffering)
175 {
176 Parcel data, reply;
177 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
178 buffering.writeToParcel(&data);
179 remote()->transact(SET_BUFFERING_SETTINGS, data, &reply);
180 return reply.readInt32();
181 }
182
183 status_t getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */)
184 {
185 if (buffering == nullptr) {
186 return BAD_VALUE;
187 }
188 Parcel data, reply;
189 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
190 remote()->transact(GET_DEFAULT_BUFFERING_SETTINGS, data, &reply);
191 status_t err = reply.readInt32();
192 if (err == OK) {
193 err = buffering->readFromParcel(&reply);
194 }
195 return err;
196 }
197
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800198 status_t prepareAsync()
199 {
200 Parcel data, reply;
201 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
202 remote()->transact(PREPARE_ASYNC, data, &reply);
203 return reply.readInt32();
204 }
205
206 status_t start()
207 {
208 Parcel data, reply;
209 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
210 remote()->transact(START, data, &reply);
211 return reply.readInt32();
212 }
213
214 status_t stop()
215 {
216 Parcel data, reply;
217 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
218 remote()->transact(STOP, data, &reply);
219 return reply.readInt32();
220 }
221
222 status_t isPlaying(bool* state)
223 {
224 Parcel data, reply;
225 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
226 remote()->transact(IS_PLAYING, data, &reply);
227 *state = reply.readInt32();
228 return reply.readInt32();
229 }
230
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700231 status_t setPlaybackSettings(const AudioPlaybackRate& rate)
Wei Jia98160162015-02-04 17:01:11 -0800232 {
233 Parcel data, reply;
234 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700235 data.writeFloat(rate.mSpeed);
236 data.writeFloat(rate.mPitch);
237 data.writeInt32((int32_t)rate.mFallbackMode);
238 data.writeInt32((int32_t)rate.mStretchMode);
239 remote()->transact(SET_PLAYBACK_SETTINGS, data, &reply);
Wei Jia98160162015-02-04 17:01:11 -0800240 return reply.readInt32();
241 }
242
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700243 status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
244 {
245 Parcel data, reply;
246 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
247 remote()->transact(GET_PLAYBACK_SETTINGS, data, &reply);
248 status_t err = reply.readInt32();
249 if (err == OK) {
250 *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
251 rate->mSpeed = reply.readFloat();
252 rate->mPitch = reply.readFloat();
253 rate->mFallbackMode = (AudioTimestretchFallbackMode)reply.readInt32();
254 rate->mStretchMode = (AudioTimestretchStretchMode)reply.readInt32();
255 }
256 return err;
257 }
258
259 status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
260 {
261 Parcel data, reply;
262 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
263 data.writeInt32((int32_t)sync.mSource);
264 data.writeInt32((int32_t)sync.mAudioAdjustMode);
265 data.writeFloat(sync.mTolerance);
266 data.writeFloat(videoFpsHint);
267 remote()->transact(SET_SYNC_SETTINGS, data, &reply);
268 return reply.readInt32();
269 }
270
271 status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
272 {
273 Parcel data, reply;
274 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
275 remote()->transact(GET_SYNC_SETTINGS, data, &reply);
276 status_t err = reply.readInt32();
277 if (err == OK) {
278 AVSyncSettings settings;
279 settings.mSource = (AVSyncSource)reply.readInt32();
280 settings.mAudioAdjustMode = (AVSyncAudioAdjustMode)reply.readInt32();
281 settings.mTolerance = reply.readFloat();
282 *sync = settings;
283 *videoFps = reply.readFloat();
284 }
285 return err;
286 }
287
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800288 status_t pause()
289 {
290 Parcel data, reply;
291 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
292 remote()->transact(PAUSE, data, &reply);
293 return reply.readInt32();
294 }
295
Wei Jiac5de0912016-11-18 10:22:14 -0800296 status_t seekTo(int msec, MediaPlayerSeekMode mode)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800297 {
298 Parcel data, reply;
299 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
300 data.writeInt32(msec);
Wei Jiac5de0912016-11-18 10:22:14 -0800301 data.writeInt32(mode);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800302 remote()->transact(SEEK_TO, data, &reply);
303 return reply.readInt32();
304 }
305
306 status_t getCurrentPosition(int* msec)
307 {
308 Parcel data, reply;
309 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
310 remote()->transact(GET_CURRENT_POSITION, data, &reply);
311 *msec = reply.readInt32();
312 return reply.readInt32();
313 }
314
315 status_t getDuration(int* msec)
316 {
317 Parcel data, reply;
318 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
319 remote()->transact(GET_DURATION, data, &reply);
320 *msec = reply.readInt32();
321 return reply.readInt32();
322 }
323
324 status_t reset()
325 {
326 Parcel data, reply;
327 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
328 remote()->transact(RESET, data, &reply);
329 return reply.readInt32();
330 }
331
Glenn Kastenfff6d712012-01-12 16:38:12 -0800332 status_t setAudioStreamType(audio_stream_type_t stream)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800333 {
334 Parcel data, reply;
335 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800336 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800337 remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
338 return reply.readInt32();
339 }
340
341 status_t setLooping(int loop)
342 {
343 Parcel data, reply;
344 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
345 data.writeInt32(loop);
346 remote()->transact(SET_LOOPING, data, &reply);
347 return reply.readInt32();
348 }
349
350 status_t setVolume(float leftVolume, float rightVolume)
351 {
352 Parcel data, reply;
Dave Sparks172fb9a2009-05-26 14:39:29 -0700353 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800354 data.writeFloat(leftVolume);
355 data.writeFloat(rightVolume);
356 remote()->transact(SET_VOLUME, data, &reply);
357 return reply.readInt32();
358 }
Nicolas Catania1d187f12009-05-12 23:25:55 -0700359
360 status_t invoke(const Parcel& request, Parcel *reply)
James Dong040e4a12011-04-06 18:29:01 -0700361 {
362 // Avoid doing any extra copy. The interface descriptor should
363 // have been set by MediaPlayer.java.
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700364 return remote()->transact(INVOKE, request, reply);
Nicolas Catania1d187f12009-05-12 23:25:55 -0700365 }
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700366
367 status_t setMetadataFilter(const Parcel& request)
368 {
369 Parcel reply;
370 // Avoid doing any extra copy of the request. The interface
371 // descriptor should have been set by MediaPlayer.java.
372 remote()->transact(SET_METADATA_FILTER, request, &reply);
373 return reply.readInt32();
374 }
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700375
376 status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
377 {
378 Parcel request;
379 request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
380 // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
381 request.writeInt32(update_only);
382 request.writeInt32(apply_filter);
383 remote()->transact(GET_METADATA, request, reply);
384 return reply->readInt32();
385 }
Andreas Huber4e92c7e2010-02-12 12:35:58 -0800386
Eric Laurent2beeb502010-07-16 07:43:46 -0700387 status_t setAuxEffectSendLevel(float level)
388 {
389 Parcel data, reply;
390 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
391 data.writeFloat(level);
392 remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
393 return reply.readInt32();
394 }
395
396 status_t attachAuxEffect(int effectId)
397 {
398 Parcel data, reply;
399 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
400 data.writeInt32(effectId);
401 remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
402 return reply.readInt32();
403 }
Glenn Kasten11731182011-02-08 17:26:17 -0800404
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700405 status_t setParameter(int key, const Parcel& request)
406 {
407 Parcel data, reply;
408 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
409 data.writeInt32(key);
410 if (request.dataSize() > 0) {
411 data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
412 }
413 remote()->transact(SET_PARAMETER, data, &reply);
414 return reply.readInt32();
415 }
416
417 status_t getParameter(int key, Parcel *reply)
418 {
419 Parcel data;
420 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
421 data.writeInt32(key);
422 return remote()->transact(GET_PARAMETER, data, reply);
423 }
424
John Grossman44a7e422012-06-21 17:29:24 -0700425 status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
426 {
John Grossmanc795b642012-02-22 15:38:35 -0800427 Parcel data, reply;
428 status_t err;
429
430 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
431 if (NULL != endpoint) {
432 data.writeInt32(sizeof(*endpoint));
433 data.write(endpoint, sizeof(*endpoint));
434 } else {
435 data.writeInt32(0);
436 }
437
438 err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
439 if (OK != err) {
440 return err;
441 }
Marco Nelissen6b74d672012-02-28 16:07:44 -0800442 return reply.readInt32();
443 }
John Grossmanc795b642012-02-22 15:38:35 -0800444
Marco Nelissen6b74d672012-02-28 16:07:44 -0800445 status_t setNextPlayer(const sp<IMediaPlayer>& player) {
446 Parcel data, reply;
447 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800448 sp<IBinder> b(IInterface::asBinder(player));
Marco Nelissen6b74d672012-02-28 16:07:44 -0800449 data.writeStrongBinder(b);
450 remote()->transact(SET_NEXT_PLAYER, data, &reply);
John Grossmanc795b642012-02-22 15:38:35 -0800451 return reply.readInt32();
452 }
John Grossman44a7e422012-06-21 17:29:24 -0700453
454 status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
455 {
456 Parcel data, reply;
457 status_t err;
458
459 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
460 err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
461
462 if ((OK != err) || (OK != (err = reply.readInt32()))) {
463 return err;
464 }
465
466 data.read(endpoint, sizeof(*endpoint));
467
468 return err;
469 }
Hassan Shojania071437a2017-01-23 09:19:40 -0800470
471 // ModDrm
472 status_t prepareDrm(const uint8_t uuid[16], const int mode)
473 {
474 Parcel data, reply;
475 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
476
477 data.write(uuid, 16);
478 data.writeInt32(mode);
479
480 status_t status = remote()->transact(PREPARE_DRM, data, &reply);
481 if (status != OK) {
482 ALOGE("prepareDrm: binder call failed: %d", status);
483 return status;
484 }
485
486 return reply.readInt32();
487 }
488
489 status_t releaseDrm()
490 {
491 Parcel data, reply;
492 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
493
494 status_t status = remote()->transact(RELEASE_DRM, data, &reply);
495 if (status != OK) {
496 ALOGE("releaseDrm: binder call failed: %d", status);
497 return status;
498 }
499
500 return reply.readInt32();
501 }
502
503 status_t getKeyRequest(Vector<uint8_t> const& scope, String8 const& mimeType,
504 DrmPlugin::KeyType keyType, KeyedVector<String8, String8>& optionalParameters,
505 Vector<uint8_t>& request, String8& defaultUrl,
506 DrmPlugin::KeyRequestType& keyRequestType)
507 {
508 Parcel data, reply;
509 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
510
511 writeVector(data, scope);
512 data.writeString8(mimeType);
513 data.writeInt32((int32_t)keyType);
514
515 data.writeUint32(optionalParameters.size());
516 for (size_t i = 0; i < optionalParameters.size(); ++i) {
517 data.writeString8(optionalParameters.keyAt(i));
518 data.writeString8(optionalParameters.valueAt(i));
519 }
520
521 status_t status = remote()->transact(GET_KEY_REQUEST, data, &reply);
522 if (status != OK) {
523 ALOGE("getKeyRequest: binder call failed: %d", status);
524 return status;
525 }
526
527 readVector(reply, request);
528 defaultUrl = reply.readString8();
529 keyRequestType = (DrmPlugin::KeyRequestType)reply.readInt32();
530
531 return reply.readInt32();
532 }
533
534 status_t provideKeyResponse(Vector<uint8_t>& releaseKeySetId, Vector<uint8_t>& response,
535 Vector<uint8_t> &keySetId)
536 {
537 Parcel data, reply;
538 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
539
540 writeVector(data, releaseKeySetId);
541 writeVector(data, response);
542
543 status_t status = remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
544 if (status != OK) {
545 ALOGE("provideKeyResponse: binder call failed: %d", status);
546 return status;
547 }
548
549 readVector(reply, keySetId);
550
551 return reply.readInt32();
552 }
553
554 status_t restoreKeys(Vector<uint8_t> const& keySetId)
555 {
556 Parcel data, reply;
557 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
558
559 writeVector(data, keySetId);
560
561 status_t status = remote()->transact(RESTORE_KEYS, data, &reply);
562 if (status != OK) {
563 ALOGE("restoreKeys: binder call failed: %d", status);
564 return status;
565 }
566
567 return reply.readInt32();
568 }
569
570 status_t getDrmPropertyString(String8 const& name, String8& value)
571 {
572 Parcel data, reply;
573 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
574
575 data.writeString8(name);
576 status_t status = remote()->transact(GET_DRM_PROPERTY_STRING, data, &reply);
577 if (status != OK) {
578 ALOGE("getDrmPropertyString: binder call failed: %d", status);
579 return status;
580 }
581
582 value = reply.readString8();
583 return reply.readInt32();
584 }
585
586 status_t setDrmPropertyString(String8 const& name, String8 const& value)
587 {
588 Parcel data, reply;
589 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
590
591 data.writeString8(name);
592 data.writeString8(value);
593 status_t status = remote()->transact(SET_DRM_PROPERTY_STRING, data, &reply);
594 if (status != OK) {
595 ALOGE("setDrmPropertyString: binder call failed: %d", status);
596 return status;
597 }
598
599 return reply.readInt32();
600 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800601};
602
niko56f0cc52009-06-22 08:49:52 -0700603IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800604
605// ----------------------------------------------------------------------
606
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800607status_t BnMediaPlayer::onTransact(
608 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
609{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700610 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800611 case DISCONNECT: {
612 CHECK_INTERFACE(IMediaPlayer, data, reply);
613 disconnect();
614 return NO_ERROR;
615 } break;
Dave Burked681bbb2011-08-30 14:39:17 +0100616 case SET_DATA_SOURCE_URL: {
617 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andreas Huber1b86fe02014-01-29 11:13:26 -0800618
619 sp<IMediaHTTPService> httpService;
620 if (data.readInt32()) {
621 httpService =
622 interface_cast<IMediaHTTPService>(data.readStrongBinder());
623 }
624
Dave Burked681bbb2011-08-30 14:39:17 +0100625 const char* url = data.readCString();
Wei Jia0ca02a02016-01-14 13:14:31 -0800626 if (url == NULL) {
Wei Jia2afac0c2016-01-07 12:13:07 -0800627 reply->writeInt32(BAD_VALUE);
628 return NO_ERROR;
629 }
Dave Burked681bbb2011-08-30 14:39:17 +0100630 KeyedVector<String8, String8> headers;
631 int32_t numHeaders = data.readInt32();
632 for (int i = 0; i < numHeaders; ++i) {
633 String8 key = data.readString8();
634 String8 value = data.readString8();
635 headers.add(key, value);
636 }
Andreas Huber1b86fe02014-01-29 11:13:26 -0800637 reply->writeInt32(setDataSource(
638 httpService, url, numHeaders > 0 ? &headers : NULL));
Dave Burked681bbb2011-08-30 14:39:17 +0100639 return NO_ERROR;
640 } break;
641 case SET_DATA_SOURCE_FD: {
642 CHECK_INTERFACE(IMediaPlayer, data, reply);
643 int fd = data.readFileDescriptor();
644 int64_t offset = data.readInt64();
645 int64_t length = data.readInt64();
646 reply->writeInt32(setDataSource(fd, offset, length));
647 return NO_ERROR;
648 }
649 case SET_DATA_SOURCE_STREAM: {
650 CHECK_INTERFACE(IMediaPlayer, data, reply);
651 sp<IStreamSource> source =
652 interface_cast<IStreamSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800653 if (source == NULL) {
654 reply->writeInt32(BAD_VALUE);
655 } else {
656 reply->writeInt32(setDataSource(source));
657 }
Dave Burked681bbb2011-08-30 14:39:17 +0100658 return NO_ERROR;
659 }
Chris Watkins99f31602015-03-20 13:06:33 -0700660 case SET_DATA_SOURCE_CALLBACK: {
661 CHECK_INTERFACE(IMediaPlayer, data, reply);
662 sp<IDataSource> source =
663 interface_cast<IDataSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800664 if (source == NULL) {
665 reply->writeInt32(BAD_VALUE);
666 } else {
667 reply->writeInt32(setDataSource(source));
668 }
Chris Watkins99f31602015-03-20 13:06:33 -0700669 return NO_ERROR;
670 }
Glenn Kasten11731182011-02-08 17:26:17 -0800671 case SET_VIDEO_SURFACETEXTURE: {
672 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andy McFadden8ba01022012-12-18 09:46:54 -0800673 sp<IGraphicBufferProducer> bufferProducer =
674 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
675 reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800676 return NO_ERROR;
677 } break;
Wei Jiad399e7e2016-10-26 15:49:11 -0700678 case SET_BUFFERING_SETTINGS: {
679 CHECK_INTERFACE(IMediaPlayer, data, reply);
680 BufferingSettings buffering;
681 buffering.readFromParcel(&data);
682 reply->writeInt32(setBufferingSettings(buffering));
683 return NO_ERROR;
684 } break;
685 case GET_DEFAULT_BUFFERING_SETTINGS: {
686 CHECK_INTERFACE(IMediaPlayer, data, reply);
687 BufferingSettings buffering;
688 status_t err = getDefaultBufferingSettings(&buffering);
689 reply->writeInt32(err);
690 if (err == OK) {
691 buffering.writeToParcel(reply);
692 }
693 return NO_ERROR;
694 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800695 case PREPARE_ASYNC: {
696 CHECK_INTERFACE(IMediaPlayer, data, reply);
697 reply->writeInt32(prepareAsync());
698 return NO_ERROR;
699 } break;
700 case START: {
701 CHECK_INTERFACE(IMediaPlayer, data, reply);
702 reply->writeInt32(start());
703 return NO_ERROR;
704 } break;
705 case STOP: {
706 CHECK_INTERFACE(IMediaPlayer, data, reply);
707 reply->writeInt32(stop());
708 return NO_ERROR;
709 } break;
710 case IS_PLAYING: {
711 CHECK_INTERFACE(IMediaPlayer, data, reply);
712 bool state;
713 status_t ret = isPlaying(&state);
714 reply->writeInt32(state);
715 reply->writeInt32(ret);
716 return NO_ERROR;
717 } break;
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700718 case SET_PLAYBACK_SETTINGS: {
Wei Jia98160162015-02-04 17:01:11 -0800719 CHECK_INTERFACE(IMediaPlayer, data, reply);
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700720 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
721 rate.mSpeed = data.readFloat();
722 rate.mPitch = data.readFloat();
723 rate.mFallbackMode = (AudioTimestretchFallbackMode)data.readInt32();
724 rate.mStretchMode = (AudioTimestretchStretchMode)data.readInt32();
725 reply->writeInt32(setPlaybackSettings(rate));
726 return NO_ERROR;
727 } break;
728 case GET_PLAYBACK_SETTINGS: {
729 CHECK_INTERFACE(IMediaPlayer, data, reply);
730 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
731 status_t err = getPlaybackSettings(&rate);
732 reply->writeInt32(err);
733 if (err == OK) {
734 reply->writeFloat(rate.mSpeed);
735 reply->writeFloat(rate.mPitch);
736 reply->writeInt32((int32_t)rate.mFallbackMode);
737 reply->writeInt32((int32_t)rate.mStretchMode);
738 }
739 return NO_ERROR;
740 } break;
741 case SET_SYNC_SETTINGS: {
742 CHECK_INTERFACE(IMediaPlayer, data, reply);
743 AVSyncSettings sync;
744 sync.mSource = (AVSyncSource)data.readInt32();
745 sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)data.readInt32();
746 sync.mTolerance = data.readFloat();
747 float videoFpsHint = data.readFloat();
748 reply->writeInt32(setSyncSettings(sync, videoFpsHint));
749 return NO_ERROR;
750 } break;
751 case GET_SYNC_SETTINGS: {
752 CHECK_INTERFACE(IMediaPlayer, data, reply);
753 AVSyncSettings sync;
754 float videoFps;
755 status_t err = getSyncSettings(&sync, &videoFps);
756 reply->writeInt32(err);
757 if (err == OK) {
758 reply->writeInt32((int32_t)sync.mSource);
759 reply->writeInt32((int32_t)sync.mAudioAdjustMode);
760 reply->writeFloat(sync.mTolerance);
761 reply->writeFloat(videoFps);
762 }
Wei Jia98160162015-02-04 17:01:11 -0800763 return NO_ERROR;
764 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800765 case PAUSE: {
766 CHECK_INTERFACE(IMediaPlayer, data, reply);
767 reply->writeInt32(pause());
768 return NO_ERROR;
769 } break;
770 case SEEK_TO: {
771 CHECK_INTERFACE(IMediaPlayer, data, reply);
Wei Jia67b6dcc2016-10-31 17:01:37 -0700772 int msec = data.readInt32();
Wei Jiac5de0912016-11-18 10:22:14 -0800773 MediaPlayerSeekMode mode = (MediaPlayerSeekMode)data.readInt32();
774 reply->writeInt32(seekTo(msec, mode));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800775 return NO_ERROR;
776 } break;
777 case GET_CURRENT_POSITION: {
778 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700779 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800780 status_t ret = getCurrentPosition(&msec);
781 reply->writeInt32(msec);
782 reply->writeInt32(ret);
783 return NO_ERROR;
784 } break;
785 case GET_DURATION: {
786 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700787 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800788 status_t ret = getDuration(&msec);
789 reply->writeInt32(msec);
790 reply->writeInt32(ret);
791 return NO_ERROR;
792 } break;
793 case RESET: {
794 CHECK_INTERFACE(IMediaPlayer, data, reply);
795 reply->writeInt32(reset());
796 return NO_ERROR;
797 } break;
798 case SET_AUDIO_STREAM_TYPE: {
799 CHECK_INTERFACE(IMediaPlayer, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800800 reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800801 return NO_ERROR;
802 } break;
803 case SET_LOOPING: {
804 CHECK_INTERFACE(IMediaPlayer, data, reply);
805 reply->writeInt32(setLooping(data.readInt32()));
806 return NO_ERROR;
807 } break;
808 case SET_VOLUME: {
Dave Sparks172fb9a2009-05-26 14:39:29 -0700809 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700810 float leftVolume = data.readFloat();
811 float rightVolume = data.readFloat();
812 reply->writeInt32(setVolume(leftVolume, rightVolume));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800813 return NO_ERROR;
814 } break;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700815 case INVOKE: {
816 CHECK_INTERFACE(IMediaPlayer, data, reply);
James Dong040e4a12011-04-06 18:29:01 -0700817 status_t result = invoke(data, reply);
818 return result;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700819 } break;
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700820 case SET_METADATA_FILTER: {
821 CHECK_INTERFACE(IMediaPlayer, data, reply);
822 reply->writeInt32(setMetadataFilter(data));
823 return NO_ERROR;
824 } break;
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700825 case GET_METADATA: {
826 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700827 bool update_only = static_cast<bool>(data.readInt32());
828 bool apply_filter = static_cast<bool>(data.readInt32());
829 const status_t retcode = getMetadata(update_only, apply_filter, reply);
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700830 reply->setDataPosition(0);
831 reply->writeInt32(retcode);
832 reply->setDataPosition(0);
833 return NO_ERROR;
834 } break;
Eric Laurent2beeb502010-07-16 07:43:46 -0700835 case SET_AUX_EFFECT_SEND_LEVEL: {
836 CHECK_INTERFACE(IMediaPlayer, data, reply);
837 reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
838 return NO_ERROR;
839 } break;
840 case ATTACH_AUX_EFFECT: {
841 CHECK_INTERFACE(IMediaPlayer, data, reply);
842 reply->writeInt32(attachAuxEffect(data.readInt32()));
843 return NO_ERROR;
844 } break;
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700845 case SET_PARAMETER: {
846 CHECK_INTERFACE(IMediaPlayer, data, reply);
847 int key = data.readInt32();
848
849 Parcel request;
850 if (data.dataAvail() > 0) {
851 request.appendFrom(
852 const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
853 }
854 request.setDataPosition(0);
855 reply->writeInt32(setParameter(key, request));
856 return NO_ERROR;
857 } break;
858 case GET_PARAMETER: {
859 CHECK_INTERFACE(IMediaPlayer, data, reply);
860 return getParameter(data.readInt32(), reply);
861 } break;
John Grossmanc795b642012-02-22 15:38:35 -0800862 case SET_RETRANSMIT_ENDPOINT: {
863 CHECK_INTERFACE(IMediaPlayer, data, reply);
864
865 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700866 memset(&endpoint, 0, sizeof(endpoint));
John Grossmanc795b642012-02-22 15:38:35 -0800867 int amt = data.readInt32();
868 if (amt == sizeof(endpoint)) {
869 data.read(&endpoint, sizeof(struct sockaddr_in));
870 reply->writeInt32(setRetransmitEndpoint(&endpoint));
871 } else {
872 reply->writeInt32(setRetransmitEndpoint(NULL));
873 }
John Grossman44a7e422012-06-21 17:29:24 -0700874
875 return NO_ERROR;
876 } break;
877 case GET_RETRANSMIT_ENDPOINT: {
878 CHECK_INTERFACE(IMediaPlayer, data, reply);
879
880 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700881 memset(&endpoint, 0, sizeof(endpoint));
John Grossman44a7e422012-06-21 17:29:24 -0700882 status_t res = getRetransmitEndpoint(&endpoint);
883
884 reply->writeInt32(res);
885 reply->write(&endpoint, sizeof(endpoint));
886
Marco Nelissen6b74d672012-02-28 16:07:44 -0800887 return NO_ERROR;
888 } break;
889 case SET_NEXT_PLAYER: {
890 CHECK_INTERFACE(IMediaPlayer, data, reply);
891 reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
John Grossman44a7e422012-06-21 17:29:24 -0700892
John Grossmanc795b642012-02-22 15:38:35 -0800893 return NO_ERROR;
894 } break;
Hassan Shojania071437a2017-01-23 09:19:40 -0800895
896 // ModDrm
897 case PREPARE_DRM: {
898 CHECK_INTERFACE(IMediaPlayer, data, reply);
899 uint8_t uuid[16];
900 data.read(uuid, sizeof(uuid));
901
902 int mode = data.readInt32();
903
904 uint32_t result = prepareDrm(uuid, mode);
905 reply->writeInt32(result);
906 return OK;
907 }
908 case RELEASE_DRM: {
909 CHECK_INTERFACE(IMediaPlayer, data, reply);
910
911 uint32_t result = releaseDrm();
912 reply->writeInt32(result);
913 return OK;
914 }
915 case GET_KEY_REQUEST: {
916 CHECK_INTERFACE(IMediaPlayer, data, reply);
917
918 Vector<uint8_t> scope;
919 readVector(data, scope);
920 String8 mimeType = data.readString8();
921 DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
922
923 KeyedVector<String8, String8> optionalParameters;
924 uint32_t count = data.readUint32();
925 for (size_t i = 0; i < count; ++i) {
926 String8 key, value;
927 key = data.readString8();
928 value = data.readString8();
929 optionalParameters.add(key, value);
930 }
931
932 Vector<uint8_t> request;
933 String8 defaultUrl;
934 DrmPlugin::KeyRequestType keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
935
936 status_t result = getKeyRequest(scope, mimeType, keyType, optionalParameters,
937 request, defaultUrl, keyRequestType);
938
939 writeVector(*reply, request);
940 reply->writeString8(defaultUrl);
941 reply->writeInt32(keyRequestType);
942 reply->writeInt32(result);
943 return OK;
944 }
945 case PROVIDE_KEY_RESPONSE: {
946 CHECK_INTERFACE(IMediaPlayer, data, reply);
947 Vector<uint8_t> releaseKeySetId, response, keySetId;
948 readVector(data, releaseKeySetId);
949 readVector(data, response);
950 uint32_t result = provideKeyResponse(releaseKeySetId, response, keySetId);
951 writeVector(*reply, keySetId);
952 reply->writeInt32(result);
953 return OK;
954 }
955 case RESTORE_KEYS: {
956 CHECK_INTERFACE(IMediaPlayer, data, reply);
957
958 Vector<uint8_t> keySetId;
959 readVector(data, keySetId);
960 uint32_t result = restoreKeys(keySetId);
961 reply->writeInt32(result);
962 return OK;
963 }
964 case GET_DRM_PROPERTY_STRING: {
965 CHECK_INTERFACE(IMediaPlayer, data, reply);
966 String8 name, value;
967 name = data.readString8();
968 uint32_t result = getDrmPropertyString(name, value);
969 reply->writeString8(value);
970 reply->writeInt32(result);
971 return OK;
972 }
973 case SET_DRM_PROPERTY_STRING: {
974 CHECK_INTERFACE(IMediaPlayer, data, reply);
975 String8 name, value;
976 name = data.readString8();
977 value = data.readString8();
978 uint32_t result = setDrmPropertyString(name, value);
979 reply->writeInt32(result);
980 return OK;
981 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800982 default:
983 return BBinder::onTransact(code, data, reply, flags);
984 }
985}
986
987// ----------------------------------------------------------------------------
988
Glenn Kasten40bc9062015-03-20 09:09:33 -0700989} // namespace android