blob: 5222a429c87026b8fb589765c53af296a05bee88 [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,
Andy Hung9fc8b5c2017-01-24 13:36:48 -080073 APPLY_VOLUME_SHAPER,
74 GET_VOLUME_SHAPER_STATE,
Hassan Shojania071437a2017-01-23 09:19:40 -080075 // ModDrm
76 PREPARE_DRM,
77 RELEASE_DRM,
78 GET_KEY_REQUEST,
79 PROVIDE_KEY_RESPONSE,
80 RESTORE_KEYS,
81 GET_DRM_PROPERTY_STRING,
82 SET_DRM_PROPERTY_STRING,
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080083};
84
Hassan Shojania071437a2017-01-23 09:19:40 -080085// ModDrm helpers
86static void readVector(const Parcel& reply, Vector<uint8_t>& vector) {
87 uint32_t size = reply.readUint32();
88 vector.insertAt((size_t)0, size);
89 reply.read(vector.editArray(), size);
90}
91
92static void writeVector(Parcel& data, Vector<uint8_t> const& vector) {
93 data.writeUint32(vector.size());
94 data.write(vector.array(), vector.size());
95}
96
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -080097class BpMediaPlayer: public BpInterface<IMediaPlayer>
98{
99public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -0700100 explicit BpMediaPlayer(const sp<IBinder>& impl)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800101 : BpInterface<IMediaPlayer>(impl)
102 {
103 }
104
105 // disconnect from media player service
106 void disconnect()
107 {
108 Parcel data, reply;
109 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
110 remote()->transact(DISCONNECT, data, &reply);
111 }
112
Andreas Huber1b86fe02014-01-29 11:13:26 -0800113 status_t setDataSource(
114 const sp<IMediaHTTPService> &httpService,
115 const char* url,
Dave Burked681bbb2011-08-30 14:39:17 +0100116 const KeyedVector<String8, String8>* headers)
117 {
118 Parcel data, reply;
119 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Andreas Huber1b86fe02014-01-29 11:13:26 -0800120 data.writeInt32(httpService != NULL);
121 if (httpService != NULL) {
Marco Nelissen06b46062014-11-14 07:58:25 -0800122 data.writeStrongBinder(IInterface::asBinder(httpService));
Andreas Huber1b86fe02014-01-29 11:13:26 -0800123 }
Dave Burked681bbb2011-08-30 14:39:17 +0100124 data.writeCString(url);
125 if (headers == NULL) {
126 data.writeInt32(0);
127 } else {
128 // serialize the headers
129 data.writeInt32(headers->size());
130 for (size_t i = 0; i < headers->size(); ++i) {
131 data.writeString8(headers->keyAt(i));
132 data.writeString8(headers->valueAt(i));
133 }
134 }
135 remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
136 return reply.readInt32();
137 }
138
139 status_t setDataSource(int fd, int64_t offset, int64_t length) {
140 Parcel data, reply;
141 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
142 data.writeFileDescriptor(fd);
143 data.writeInt64(offset);
144 data.writeInt64(length);
145 remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
146 return reply.readInt32();
147 }
148
149 status_t setDataSource(const sp<IStreamSource> &source) {
150 Parcel data, reply;
151 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800152 data.writeStrongBinder(IInterface::asBinder(source));
Glenn Kasten8d655102011-09-07 14:40:23 -0700153 remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);
Dave Burked681bbb2011-08-30 14:39:17 +0100154 return reply.readInt32();
155 }
156
Chris Watkins99f31602015-03-20 13:06:33 -0700157 status_t setDataSource(const sp<IDataSource> &source) {
158 Parcel data, reply;
159 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
160 data.writeStrongBinder(IInterface::asBinder(source));
161 remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
162 return reply.readInt32();
163 }
164
Andy McFadden8ba01022012-12-18 09:46:54 -0800165 // pass the buffered IGraphicBufferProducer to the media player service
166 status_t setVideoSurfaceTexture(const sp<IGraphicBufferProducer>& bufferProducer)
Glenn Kasten11731182011-02-08 17:26:17 -0800167 {
168 Parcel data, reply;
169 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800170 sp<IBinder> b(IInterface::asBinder(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800171 data.writeStrongBinder(b);
172 remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);
173 return reply.readInt32();
174 }
175
Wei Jiad399e7e2016-10-26 15:49:11 -0700176 status_t setBufferingSettings(const BufferingSettings& buffering)
177 {
178 Parcel data, reply;
179 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
180 buffering.writeToParcel(&data);
181 remote()->transact(SET_BUFFERING_SETTINGS, data, &reply);
182 return reply.readInt32();
183 }
184
185 status_t getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */)
186 {
187 if (buffering == nullptr) {
188 return BAD_VALUE;
189 }
190 Parcel data, reply;
191 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
192 remote()->transact(GET_DEFAULT_BUFFERING_SETTINGS, data, &reply);
193 status_t err = reply.readInt32();
194 if (err == OK) {
195 err = buffering->readFromParcel(&reply);
196 }
197 return err;
198 }
199
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800200 status_t prepareAsync()
201 {
202 Parcel data, reply;
203 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
204 remote()->transact(PREPARE_ASYNC, data, &reply);
205 return reply.readInt32();
206 }
207
208 status_t start()
209 {
210 Parcel data, reply;
211 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
212 remote()->transact(START, data, &reply);
213 return reply.readInt32();
214 }
215
216 status_t stop()
217 {
218 Parcel data, reply;
219 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
220 remote()->transact(STOP, data, &reply);
221 return reply.readInt32();
222 }
223
224 status_t isPlaying(bool* state)
225 {
226 Parcel data, reply;
227 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
228 remote()->transact(IS_PLAYING, data, &reply);
229 *state = reply.readInt32();
230 return reply.readInt32();
231 }
232
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700233 status_t setPlaybackSettings(const AudioPlaybackRate& rate)
Wei Jia98160162015-02-04 17:01:11 -0800234 {
235 Parcel data, reply;
236 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700237 data.writeFloat(rate.mSpeed);
238 data.writeFloat(rate.mPitch);
239 data.writeInt32((int32_t)rate.mFallbackMode);
240 data.writeInt32((int32_t)rate.mStretchMode);
241 remote()->transact(SET_PLAYBACK_SETTINGS, data, &reply);
Wei Jia98160162015-02-04 17:01:11 -0800242 return reply.readInt32();
243 }
244
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700245 status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */)
246 {
247 Parcel data, reply;
248 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
249 remote()->transact(GET_PLAYBACK_SETTINGS, data, &reply);
250 status_t err = reply.readInt32();
251 if (err == OK) {
252 *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
253 rate->mSpeed = reply.readFloat();
254 rate->mPitch = reply.readFloat();
255 rate->mFallbackMode = (AudioTimestretchFallbackMode)reply.readInt32();
256 rate->mStretchMode = (AudioTimestretchStretchMode)reply.readInt32();
257 }
258 return err;
259 }
260
261 status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint)
262 {
263 Parcel data, reply;
264 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
265 data.writeInt32((int32_t)sync.mSource);
266 data.writeInt32((int32_t)sync.mAudioAdjustMode);
267 data.writeFloat(sync.mTolerance);
268 data.writeFloat(videoFpsHint);
269 remote()->transact(SET_SYNC_SETTINGS, data, &reply);
270 return reply.readInt32();
271 }
272
273 status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */)
274 {
275 Parcel data, reply;
276 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
277 remote()->transact(GET_SYNC_SETTINGS, data, &reply);
278 status_t err = reply.readInt32();
279 if (err == OK) {
280 AVSyncSettings settings;
281 settings.mSource = (AVSyncSource)reply.readInt32();
282 settings.mAudioAdjustMode = (AVSyncAudioAdjustMode)reply.readInt32();
283 settings.mTolerance = reply.readFloat();
284 *sync = settings;
285 *videoFps = reply.readFloat();
286 }
287 return err;
288 }
289
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800290 status_t pause()
291 {
292 Parcel data, reply;
293 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
294 remote()->transact(PAUSE, data, &reply);
295 return reply.readInt32();
296 }
297
Wei Jiac5de0912016-11-18 10:22:14 -0800298 status_t seekTo(int msec, MediaPlayerSeekMode mode)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800299 {
300 Parcel data, reply;
301 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
302 data.writeInt32(msec);
Wei Jiac5de0912016-11-18 10:22:14 -0800303 data.writeInt32(mode);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800304 remote()->transact(SEEK_TO, data, &reply);
305 return reply.readInt32();
306 }
307
308 status_t getCurrentPosition(int* msec)
309 {
310 Parcel data, reply;
311 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
312 remote()->transact(GET_CURRENT_POSITION, data, &reply);
313 *msec = reply.readInt32();
314 return reply.readInt32();
315 }
316
317 status_t getDuration(int* msec)
318 {
319 Parcel data, reply;
320 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
321 remote()->transact(GET_DURATION, data, &reply);
322 *msec = reply.readInt32();
323 return reply.readInt32();
324 }
325
326 status_t reset()
327 {
328 Parcel data, reply;
329 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
330 remote()->transact(RESET, data, &reply);
331 return reply.readInt32();
332 }
333
Glenn Kastenfff6d712012-01-12 16:38:12 -0800334 status_t setAudioStreamType(audio_stream_type_t stream)
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800335 {
336 Parcel data, reply;
337 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Glenn Kastenfff6d712012-01-12 16:38:12 -0800338 data.writeInt32((int32_t) stream);
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800339 remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply);
340 return reply.readInt32();
341 }
342
343 status_t setLooping(int loop)
344 {
345 Parcel data, reply;
346 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
347 data.writeInt32(loop);
348 remote()->transact(SET_LOOPING, data, &reply);
349 return reply.readInt32();
350 }
351
352 status_t setVolume(float leftVolume, float rightVolume)
353 {
354 Parcel data, reply;
Dave Sparks172fb9a2009-05-26 14:39:29 -0700355 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800356 data.writeFloat(leftVolume);
357 data.writeFloat(rightVolume);
358 remote()->transact(SET_VOLUME, data, &reply);
359 return reply.readInt32();
360 }
Nicolas Catania1d187f12009-05-12 23:25:55 -0700361
362 status_t invoke(const Parcel& request, Parcel *reply)
James Dong040e4a12011-04-06 18:29:01 -0700363 {
364 // Avoid doing any extra copy. The interface descriptor should
365 // have been set by MediaPlayer.java.
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700366 return remote()->transact(INVOKE, request, reply);
Nicolas Catania1d187f12009-05-12 23:25:55 -0700367 }
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700368
369 status_t setMetadataFilter(const Parcel& request)
370 {
371 Parcel reply;
372 // Avoid doing any extra copy of the request. The interface
373 // descriptor should have been set by MediaPlayer.java.
374 remote()->transact(SET_METADATA_FILTER, request, &reply);
375 return reply.readInt32();
376 }
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700377
378 status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply)
379 {
380 Parcel request;
381 request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
382 // TODO: Burning 2 ints for 2 boolean. Should probably use flags in an int here.
383 request.writeInt32(update_only);
384 request.writeInt32(apply_filter);
385 remote()->transact(GET_METADATA, request, reply);
386 return reply->readInt32();
387 }
Andreas Huber4e92c7e2010-02-12 12:35:58 -0800388
Eric Laurent2beeb502010-07-16 07:43:46 -0700389 status_t setAuxEffectSendLevel(float level)
390 {
391 Parcel data, reply;
392 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
393 data.writeFloat(level);
394 remote()->transact(SET_AUX_EFFECT_SEND_LEVEL, data, &reply);
395 return reply.readInt32();
396 }
397
398 status_t attachAuxEffect(int effectId)
399 {
400 Parcel data, reply;
401 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
402 data.writeInt32(effectId);
403 remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
404 return reply.readInt32();
405 }
Glenn Kasten11731182011-02-08 17:26:17 -0800406
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700407 status_t setParameter(int key, const Parcel& request)
408 {
409 Parcel data, reply;
410 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
411 data.writeInt32(key);
412 if (request.dataSize() > 0) {
413 data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
414 }
415 remote()->transact(SET_PARAMETER, data, &reply);
416 return reply.readInt32();
417 }
418
419 status_t getParameter(int key, Parcel *reply)
420 {
421 Parcel data;
422 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
423 data.writeInt32(key);
424 return remote()->transact(GET_PARAMETER, data, reply);
425 }
426
John Grossman44a7e422012-06-21 17:29:24 -0700427 status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint)
428 {
John Grossmanc795b642012-02-22 15:38:35 -0800429 Parcel data, reply;
430 status_t err;
431
432 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
433 if (NULL != endpoint) {
434 data.writeInt32(sizeof(*endpoint));
435 data.write(endpoint, sizeof(*endpoint));
436 } else {
437 data.writeInt32(0);
438 }
439
440 err = remote()->transact(SET_RETRANSMIT_ENDPOINT, data, &reply);
441 if (OK != err) {
442 return err;
443 }
Marco Nelissen6b74d672012-02-28 16:07:44 -0800444 return reply.readInt32();
445 }
John Grossmanc795b642012-02-22 15:38:35 -0800446
Marco Nelissen6b74d672012-02-28 16:07:44 -0800447 status_t setNextPlayer(const sp<IMediaPlayer>& player) {
448 Parcel data, reply;
449 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800450 sp<IBinder> b(IInterface::asBinder(player));
Marco Nelissen6b74d672012-02-28 16:07:44 -0800451 data.writeStrongBinder(b);
452 remote()->transact(SET_NEXT_PLAYER, data, &reply);
John Grossmanc795b642012-02-22 15:38:35 -0800453 return reply.readInt32();
454 }
John Grossman44a7e422012-06-21 17:29:24 -0700455
456 status_t getRetransmitEndpoint(struct sockaddr_in* endpoint)
457 {
458 Parcel data, reply;
459 status_t err;
460
461 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
462 err = remote()->transact(GET_RETRANSMIT_ENDPOINT, data, &reply);
463
464 if ((OK != err) || (OK != (err = reply.readInt32()))) {
465 return err;
466 }
467
468 data.read(endpoint, sizeof(*endpoint));
469
470 return err;
471 }
Hassan Shojania071437a2017-01-23 09:19:40 -0800472
Andy Hung9fc8b5c2017-01-24 13:36:48 -0800473 virtual VolumeShaper::Status applyVolumeShaper(
474 const sp<VolumeShaper::Configuration>& configuration,
475 const sp<VolumeShaper::Operation>& operation) {
476 Parcel data, reply;
477 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
478
479 status_t tmp;
480 status_t status = configuration.get() == nullptr
481 ? data.writeInt32(0)
482 : (tmp = data.writeInt32(1)) != NO_ERROR
483 ? tmp : configuration->writeToParcel(&data);
484 if (status != NO_ERROR) {
485 return VolumeShaper::Status(status);
486 }
487
488 status = operation.get() == nullptr
489 ? status = data.writeInt32(0)
490 : (tmp = data.writeInt32(1)) != NO_ERROR
491 ? tmp : operation->writeToParcel(&data);
492 if (status != NO_ERROR) {
493 return VolumeShaper::Status(status);
494 }
495
496 int32_t remoteVolumeShaperStatus;
497 status = remote()->transact(APPLY_VOLUME_SHAPER, data, &reply);
498 if (status == NO_ERROR) {
499 status = reply.readInt32(&remoteVolumeShaperStatus);
500 }
501 if (status != NO_ERROR) {
502 return VolumeShaper::Status(status);
503 }
504 return VolumeShaper::Status(remoteVolumeShaperStatus);
505 }
506
507 virtual sp<VolumeShaper::State> getVolumeShaperState(int id) {
508 Parcel data, reply;
509 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
510
511 data.writeInt32(id);
512 status_t status = remote()->transact(GET_VOLUME_SHAPER_STATE, data, &reply);
513 if (status != NO_ERROR) {
514 return nullptr;
515 }
516 sp<VolumeShaper::State> state = new VolumeShaper::State();
517 status = state->readFromParcel(reply);
518 if (status != NO_ERROR) {
519 return nullptr;
520 }
521 return state;
522 }
523
Hassan Shojania071437a2017-01-23 09:19:40 -0800524 // ModDrm
525 status_t prepareDrm(const uint8_t uuid[16], const int mode)
526 {
527 Parcel data, reply;
528 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
529
530 data.write(uuid, 16);
531 data.writeInt32(mode);
532
533 status_t status = remote()->transact(PREPARE_DRM, data, &reply);
534 if (status != OK) {
535 ALOGE("prepareDrm: binder call failed: %d", status);
536 return status;
537 }
538
539 return reply.readInt32();
540 }
541
542 status_t releaseDrm()
543 {
544 Parcel data, reply;
545 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
546
547 status_t status = remote()->transact(RELEASE_DRM, data, &reply);
548 if (status != OK) {
549 ALOGE("releaseDrm: binder call failed: %d", status);
550 return status;
551 }
552
553 return reply.readInt32();
554 }
555
556 status_t getKeyRequest(Vector<uint8_t> const& scope, String8 const& mimeType,
557 DrmPlugin::KeyType keyType, KeyedVector<String8, String8>& optionalParameters,
558 Vector<uint8_t>& request, String8& defaultUrl,
559 DrmPlugin::KeyRequestType& keyRequestType)
560 {
561 Parcel data, reply;
562 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
563
564 writeVector(data, scope);
565 data.writeString8(mimeType);
566 data.writeInt32((int32_t)keyType);
567
568 data.writeUint32(optionalParameters.size());
569 for (size_t i = 0; i < optionalParameters.size(); ++i) {
570 data.writeString8(optionalParameters.keyAt(i));
571 data.writeString8(optionalParameters.valueAt(i));
572 }
573
574 status_t status = remote()->transact(GET_KEY_REQUEST, data, &reply);
575 if (status != OK) {
576 ALOGE("getKeyRequest: binder call failed: %d", status);
577 return status;
578 }
579
580 readVector(reply, request);
581 defaultUrl = reply.readString8();
582 keyRequestType = (DrmPlugin::KeyRequestType)reply.readInt32();
583
584 return reply.readInt32();
585 }
586
587 status_t provideKeyResponse(Vector<uint8_t>& releaseKeySetId, Vector<uint8_t>& response,
588 Vector<uint8_t> &keySetId)
589 {
590 Parcel data, reply;
591 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
592
593 writeVector(data, releaseKeySetId);
594 writeVector(data, response);
595
596 status_t status = remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
597 if (status != OK) {
598 ALOGE("provideKeyResponse: binder call failed: %d", status);
599 return status;
600 }
601
602 readVector(reply, keySetId);
603
604 return reply.readInt32();
605 }
606
607 status_t restoreKeys(Vector<uint8_t> const& keySetId)
608 {
609 Parcel data, reply;
610 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
611
612 writeVector(data, keySetId);
613
614 status_t status = remote()->transact(RESTORE_KEYS, data, &reply);
615 if (status != OK) {
616 ALOGE("restoreKeys: binder call failed: %d", status);
617 return status;
618 }
619
620 return reply.readInt32();
621 }
622
623 status_t getDrmPropertyString(String8 const& name, String8& value)
624 {
625 Parcel data, reply;
626 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
627
628 data.writeString8(name);
629 status_t status = remote()->transact(GET_DRM_PROPERTY_STRING, data, &reply);
630 if (status != OK) {
631 ALOGE("getDrmPropertyString: binder call failed: %d", status);
632 return status;
633 }
634
635 value = reply.readString8();
636 return reply.readInt32();
637 }
638
639 status_t setDrmPropertyString(String8 const& name, String8 const& value)
640 {
641 Parcel data, reply;
642 data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
643
644 data.writeString8(name);
645 data.writeString8(value);
646 status_t status = remote()->transact(SET_DRM_PROPERTY_STRING, data, &reply);
647 if (status != OK) {
648 ALOGE("setDrmPropertyString: binder call failed: %d", status);
649 return status;
650 }
651
652 return reply.readInt32();
653 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800654};
655
niko56f0cc52009-06-22 08:49:52 -0700656IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800657
658// ----------------------------------------------------------------------
659
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800660status_t BnMediaPlayer::onTransact(
661 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
662{
Glenn Kastene53b9ea2012-03-12 16:29:55 -0700663 switch (code) {
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800664 case DISCONNECT: {
665 CHECK_INTERFACE(IMediaPlayer, data, reply);
666 disconnect();
667 return NO_ERROR;
668 } break;
Dave Burked681bbb2011-08-30 14:39:17 +0100669 case SET_DATA_SOURCE_URL: {
670 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andreas Huber1b86fe02014-01-29 11:13:26 -0800671
672 sp<IMediaHTTPService> httpService;
673 if (data.readInt32()) {
674 httpService =
675 interface_cast<IMediaHTTPService>(data.readStrongBinder());
676 }
677
Dave Burked681bbb2011-08-30 14:39:17 +0100678 const char* url = data.readCString();
Wei Jia0ca02a02016-01-14 13:14:31 -0800679 if (url == NULL) {
Wei Jia2afac0c2016-01-07 12:13:07 -0800680 reply->writeInt32(BAD_VALUE);
681 return NO_ERROR;
682 }
Dave Burked681bbb2011-08-30 14:39:17 +0100683 KeyedVector<String8, String8> headers;
684 int32_t numHeaders = data.readInt32();
685 for (int i = 0; i < numHeaders; ++i) {
686 String8 key = data.readString8();
687 String8 value = data.readString8();
688 headers.add(key, value);
689 }
Andreas Huber1b86fe02014-01-29 11:13:26 -0800690 reply->writeInt32(setDataSource(
691 httpService, url, numHeaders > 0 ? &headers : NULL));
Dave Burked681bbb2011-08-30 14:39:17 +0100692 return NO_ERROR;
693 } break;
694 case SET_DATA_SOURCE_FD: {
695 CHECK_INTERFACE(IMediaPlayer, data, reply);
696 int fd = data.readFileDescriptor();
697 int64_t offset = data.readInt64();
698 int64_t length = data.readInt64();
699 reply->writeInt32(setDataSource(fd, offset, length));
700 return NO_ERROR;
701 }
702 case SET_DATA_SOURCE_STREAM: {
703 CHECK_INTERFACE(IMediaPlayer, data, reply);
704 sp<IStreamSource> source =
705 interface_cast<IStreamSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800706 if (source == NULL) {
707 reply->writeInt32(BAD_VALUE);
708 } else {
709 reply->writeInt32(setDataSource(source));
710 }
Dave Burked681bbb2011-08-30 14:39:17 +0100711 return NO_ERROR;
712 }
Chris Watkins99f31602015-03-20 13:06:33 -0700713 case SET_DATA_SOURCE_CALLBACK: {
714 CHECK_INTERFACE(IMediaPlayer, data, reply);
715 sp<IDataSource> source =
716 interface_cast<IDataSource>(data.readStrongBinder());
Wei Jia2afac0c2016-01-07 12:13:07 -0800717 if (source == NULL) {
718 reply->writeInt32(BAD_VALUE);
719 } else {
720 reply->writeInt32(setDataSource(source));
721 }
Chris Watkins99f31602015-03-20 13:06:33 -0700722 return NO_ERROR;
723 }
Glenn Kasten11731182011-02-08 17:26:17 -0800724 case SET_VIDEO_SURFACETEXTURE: {
725 CHECK_INTERFACE(IMediaPlayer, data, reply);
Andy McFadden8ba01022012-12-18 09:46:54 -0800726 sp<IGraphicBufferProducer> bufferProducer =
727 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
728 reply->writeInt32(setVideoSurfaceTexture(bufferProducer));
Glenn Kasten11731182011-02-08 17:26:17 -0800729 return NO_ERROR;
730 } break;
Wei Jiad399e7e2016-10-26 15:49:11 -0700731 case SET_BUFFERING_SETTINGS: {
732 CHECK_INTERFACE(IMediaPlayer, data, reply);
733 BufferingSettings buffering;
734 buffering.readFromParcel(&data);
735 reply->writeInt32(setBufferingSettings(buffering));
736 return NO_ERROR;
737 } break;
738 case GET_DEFAULT_BUFFERING_SETTINGS: {
739 CHECK_INTERFACE(IMediaPlayer, data, reply);
740 BufferingSettings buffering;
741 status_t err = getDefaultBufferingSettings(&buffering);
742 reply->writeInt32(err);
743 if (err == OK) {
744 buffering.writeToParcel(reply);
745 }
746 return NO_ERROR;
747 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800748 case PREPARE_ASYNC: {
749 CHECK_INTERFACE(IMediaPlayer, data, reply);
750 reply->writeInt32(prepareAsync());
751 return NO_ERROR;
752 } break;
753 case START: {
754 CHECK_INTERFACE(IMediaPlayer, data, reply);
755 reply->writeInt32(start());
756 return NO_ERROR;
757 } break;
758 case STOP: {
759 CHECK_INTERFACE(IMediaPlayer, data, reply);
760 reply->writeInt32(stop());
761 return NO_ERROR;
762 } break;
763 case IS_PLAYING: {
764 CHECK_INTERFACE(IMediaPlayer, data, reply);
765 bool state;
766 status_t ret = isPlaying(&state);
767 reply->writeInt32(state);
768 reply->writeInt32(ret);
769 return NO_ERROR;
770 } break;
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700771 case SET_PLAYBACK_SETTINGS: {
Wei Jia98160162015-02-04 17:01:11 -0800772 CHECK_INTERFACE(IMediaPlayer, data, reply);
Lajos Molnar3a474aa2015-04-24 17:10:07 -0700773 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
774 rate.mSpeed = data.readFloat();
775 rate.mPitch = data.readFloat();
776 rate.mFallbackMode = (AudioTimestretchFallbackMode)data.readInt32();
777 rate.mStretchMode = (AudioTimestretchStretchMode)data.readInt32();
778 reply->writeInt32(setPlaybackSettings(rate));
779 return NO_ERROR;
780 } break;
781 case GET_PLAYBACK_SETTINGS: {
782 CHECK_INTERFACE(IMediaPlayer, data, reply);
783 AudioPlaybackRate rate = AUDIO_PLAYBACK_RATE_DEFAULT;
784 status_t err = getPlaybackSettings(&rate);
785 reply->writeInt32(err);
786 if (err == OK) {
787 reply->writeFloat(rate.mSpeed);
788 reply->writeFloat(rate.mPitch);
789 reply->writeInt32((int32_t)rate.mFallbackMode);
790 reply->writeInt32((int32_t)rate.mStretchMode);
791 }
792 return NO_ERROR;
793 } break;
794 case SET_SYNC_SETTINGS: {
795 CHECK_INTERFACE(IMediaPlayer, data, reply);
796 AVSyncSettings sync;
797 sync.mSource = (AVSyncSource)data.readInt32();
798 sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)data.readInt32();
799 sync.mTolerance = data.readFloat();
800 float videoFpsHint = data.readFloat();
801 reply->writeInt32(setSyncSettings(sync, videoFpsHint));
802 return NO_ERROR;
803 } break;
804 case GET_SYNC_SETTINGS: {
805 CHECK_INTERFACE(IMediaPlayer, data, reply);
806 AVSyncSettings sync;
807 float videoFps;
808 status_t err = getSyncSettings(&sync, &videoFps);
809 reply->writeInt32(err);
810 if (err == OK) {
811 reply->writeInt32((int32_t)sync.mSource);
812 reply->writeInt32((int32_t)sync.mAudioAdjustMode);
813 reply->writeFloat(sync.mTolerance);
814 reply->writeFloat(videoFps);
815 }
Wei Jia98160162015-02-04 17:01:11 -0800816 return NO_ERROR;
817 } break;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800818 case PAUSE: {
819 CHECK_INTERFACE(IMediaPlayer, data, reply);
820 reply->writeInt32(pause());
821 return NO_ERROR;
822 } break;
823 case SEEK_TO: {
824 CHECK_INTERFACE(IMediaPlayer, data, reply);
Wei Jia67b6dcc2016-10-31 17:01:37 -0700825 int msec = data.readInt32();
Wei Jiac5de0912016-11-18 10:22:14 -0800826 MediaPlayerSeekMode mode = (MediaPlayerSeekMode)data.readInt32();
827 reply->writeInt32(seekTo(msec, mode));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800828 return NO_ERROR;
829 } break;
830 case GET_CURRENT_POSITION: {
831 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700832 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800833 status_t ret = getCurrentPosition(&msec);
834 reply->writeInt32(msec);
835 reply->writeInt32(ret);
836 return NO_ERROR;
837 } break;
838 case GET_DURATION: {
839 CHECK_INTERFACE(IMediaPlayer, data, reply);
Robert Shih89235432015-09-02 16:46:59 -0700840 int msec = 0;
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800841 status_t ret = getDuration(&msec);
842 reply->writeInt32(msec);
843 reply->writeInt32(ret);
844 return NO_ERROR;
845 } break;
846 case RESET: {
847 CHECK_INTERFACE(IMediaPlayer, data, reply);
848 reply->writeInt32(reset());
849 return NO_ERROR;
850 } break;
851 case SET_AUDIO_STREAM_TYPE: {
852 CHECK_INTERFACE(IMediaPlayer, data, reply);
Glenn Kastenfff6d712012-01-12 16:38:12 -0800853 reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800854 return NO_ERROR;
855 } break;
856 case SET_LOOPING: {
857 CHECK_INTERFACE(IMediaPlayer, data, reply);
858 reply->writeInt32(setLooping(data.readInt32()));
859 return NO_ERROR;
860 } break;
861 case SET_VOLUME: {
Dave Sparks172fb9a2009-05-26 14:39:29 -0700862 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700863 float leftVolume = data.readFloat();
864 float rightVolume = data.readFloat();
865 reply->writeInt32(setVolume(leftVolume, rightVolume));
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -0800866 return NO_ERROR;
867 } break;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700868 case INVOKE: {
869 CHECK_INTERFACE(IMediaPlayer, data, reply);
James Dong040e4a12011-04-06 18:29:01 -0700870 status_t result = invoke(data, reply);
871 return result;
Nicolas Catania1d187f12009-05-12 23:25:55 -0700872 } break;
Nicolas Cataniaa7e0e8b2009-07-08 08:57:42 -0700873 case SET_METADATA_FILTER: {
874 CHECK_INTERFACE(IMediaPlayer, data, reply);
875 reply->writeInt32(setMetadataFilter(data));
876 return NO_ERROR;
877 } break;
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700878 case GET_METADATA: {
879 CHECK_INTERFACE(IMediaPlayer, data, reply);
Gloria Wangde162ff2011-08-01 14:01:29 -0700880 bool update_only = static_cast<bool>(data.readInt32());
881 bool apply_filter = static_cast<bool>(data.readInt32());
882 const status_t retcode = getMetadata(update_only, apply_filter, reply);
Nicolas Catania8e1b6cc2009-07-09 09:21:33 -0700883 reply->setDataPosition(0);
884 reply->writeInt32(retcode);
885 reply->setDataPosition(0);
886 return NO_ERROR;
887 } break;
Eric Laurent2beeb502010-07-16 07:43:46 -0700888 case SET_AUX_EFFECT_SEND_LEVEL: {
889 CHECK_INTERFACE(IMediaPlayer, data, reply);
890 reply->writeInt32(setAuxEffectSendLevel(data.readFloat()));
891 return NO_ERROR;
892 } break;
893 case ATTACH_AUX_EFFECT: {
894 CHECK_INTERFACE(IMediaPlayer, data, reply);
895 reply->writeInt32(attachAuxEffect(data.readInt32()));
896 return NO_ERROR;
897 } break;
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700898 case SET_PARAMETER: {
899 CHECK_INTERFACE(IMediaPlayer, data, reply);
900 int key = data.readInt32();
901
902 Parcel request;
903 if (data.dataAvail() > 0) {
904 request.appendFrom(
905 const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
906 }
907 request.setDataPosition(0);
908 reply->writeInt32(setParameter(key, request));
909 return NO_ERROR;
910 } break;
911 case GET_PARAMETER: {
912 CHECK_INTERFACE(IMediaPlayer, data, reply);
913 return getParameter(data.readInt32(), reply);
914 } break;
John Grossmanc795b642012-02-22 15:38:35 -0800915 case SET_RETRANSMIT_ENDPOINT: {
916 CHECK_INTERFACE(IMediaPlayer, data, reply);
917
918 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700919 memset(&endpoint, 0, sizeof(endpoint));
John Grossmanc795b642012-02-22 15:38:35 -0800920 int amt = data.readInt32();
921 if (amt == sizeof(endpoint)) {
922 data.read(&endpoint, sizeof(struct sockaddr_in));
923 reply->writeInt32(setRetransmitEndpoint(&endpoint));
924 } else {
925 reply->writeInt32(setRetransmitEndpoint(NULL));
926 }
John Grossman44a7e422012-06-21 17:29:24 -0700927
928 return NO_ERROR;
929 } break;
930 case GET_RETRANSMIT_ENDPOINT: {
931 CHECK_INTERFACE(IMediaPlayer, data, reply);
932
933 struct sockaddr_in endpoint;
Nick Kralevich0981df62015-08-20 09:56:39 -0700934 memset(&endpoint, 0, sizeof(endpoint));
John Grossman44a7e422012-06-21 17:29:24 -0700935 status_t res = getRetransmitEndpoint(&endpoint);
936
937 reply->writeInt32(res);
938 reply->write(&endpoint, sizeof(endpoint));
939
Marco Nelissen6b74d672012-02-28 16:07:44 -0800940 return NO_ERROR;
941 } break;
942 case SET_NEXT_PLAYER: {
943 CHECK_INTERFACE(IMediaPlayer, data, reply);
944 reply->writeInt32(setNextPlayer(interface_cast<IMediaPlayer>(data.readStrongBinder())));
John Grossman44a7e422012-06-21 17:29:24 -0700945
John Grossmanc795b642012-02-22 15:38:35 -0800946 return NO_ERROR;
947 } break;
Hassan Shojania071437a2017-01-23 09:19:40 -0800948
Andy Hung9fc8b5c2017-01-24 13:36:48 -0800949 case APPLY_VOLUME_SHAPER: {
950 CHECK_INTERFACE(IMediaPlayer, data, reply);
951 sp<VolumeShaper::Configuration> configuration;
952 sp<VolumeShaper::Operation> operation;
953
954 int32_t present;
955 status_t status = data.readInt32(&present);
956 if (status == NO_ERROR && present != 0) {
957 configuration = new VolumeShaper::Configuration();
958 status = configuration->readFromParcel(data);
959 }
960 if (status == NO_ERROR) {
961 status = data.readInt32(&present);
962 }
963 if (status == NO_ERROR && present != 0) {
964 operation = new VolumeShaper::Operation();
965 status = operation->readFromParcel(data);
966 }
967 if (status == NO_ERROR) {
968 status = (status_t)applyVolumeShaper(configuration, operation);
969 }
970 reply->writeInt32(status);
971 return NO_ERROR;
972 } break;
973 case GET_VOLUME_SHAPER_STATE: {
974 CHECK_INTERFACE(IMediaPlayer, data, reply);
975 int id;
976 status_t status = data.readInt32(&id);
977 if (status == NO_ERROR) {
978 sp<VolumeShaper::State> state = getVolumeShaperState(id);
979 if (state.get() != nullptr) {
980 status = state->writeToParcel(reply);
981 }
982 }
983 return NO_ERROR;
984 } break;
985
Hassan Shojania071437a2017-01-23 09:19:40 -0800986 // ModDrm
987 case PREPARE_DRM: {
988 CHECK_INTERFACE(IMediaPlayer, data, reply);
989 uint8_t uuid[16];
990 data.read(uuid, sizeof(uuid));
991
992 int mode = data.readInt32();
993
994 uint32_t result = prepareDrm(uuid, mode);
995 reply->writeInt32(result);
996 return OK;
997 }
998 case RELEASE_DRM: {
999 CHECK_INTERFACE(IMediaPlayer, data, reply);
1000
1001 uint32_t result = releaseDrm();
1002 reply->writeInt32(result);
1003 return OK;
1004 }
1005 case GET_KEY_REQUEST: {
1006 CHECK_INTERFACE(IMediaPlayer, data, reply);
1007
1008 Vector<uint8_t> scope;
1009 readVector(data, scope);
1010 String8 mimeType = data.readString8();
1011 DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
1012
1013 KeyedVector<String8, String8> optionalParameters;
1014 uint32_t count = data.readUint32();
1015 for (size_t i = 0; i < count; ++i) {
1016 String8 key, value;
1017 key = data.readString8();
1018 value = data.readString8();
1019 optionalParameters.add(key, value);
1020 }
1021
1022 Vector<uint8_t> request;
1023 String8 defaultUrl;
1024 DrmPlugin::KeyRequestType keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
1025
1026 status_t result = getKeyRequest(scope, mimeType, keyType, optionalParameters,
1027 request, defaultUrl, keyRequestType);
1028
1029 writeVector(*reply, request);
1030 reply->writeString8(defaultUrl);
1031 reply->writeInt32(keyRequestType);
1032 reply->writeInt32(result);
1033 return OK;
1034 }
1035 case PROVIDE_KEY_RESPONSE: {
1036 CHECK_INTERFACE(IMediaPlayer, data, reply);
1037 Vector<uint8_t> releaseKeySetId, response, keySetId;
1038 readVector(data, releaseKeySetId);
1039 readVector(data, response);
1040 uint32_t result = provideKeyResponse(releaseKeySetId, response, keySetId);
1041 writeVector(*reply, keySetId);
1042 reply->writeInt32(result);
1043 return OK;
1044 }
1045 case RESTORE_KEYS: {
1046 CHECK_INTERFACE(IMediaPlayer, data, reply);
1047
1048 Vector<uint8_t> keySetId;
1049 readVector(data, keySetId);
1050 uint32_t result = restoreKeys(keySetId);
1051 reply->writeInt32(result);
1052 return OK;
1053 }
1054 case GET_DRM_PROPERTY_STRING: {
1055 CHECK_INTERFACE(IMediaPlayer, data, reply);
1056 String8 name, value;
1057 name = data.readString8();
1058 uint32_t result = getDrmPropertyString(name, value);
1059 reply->writeString8(value);
1060 reply->writeInt32(result);
1061 return OK;
1062 }
1063 case SET_DRM_PROPERTY_STRING: {
1064 CHECK_INTERFACE(IMediaPlayer, data, reply);
1065 String8 name, value;
1066 name = data.readString8();
1067 value = data.readString8();
1068 uint32_t result = setDrmPropertyString(name, value);
1069 reply->writeInt32(result);
1070 return OK;
1071 }
The Android Open Source Project89fa4ad2009-03-03 19:31:44 -08001072 default:
1073 return BBinder::onTransact(code, data, reply, flags);
1074 }
1075}
1076
1077// ----------------------------------------------------------------------------
1078
Glenn Kasten40bc9062015-03-20 09:09:33 -07001079} // namespace android