19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright (C) 2008 The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
200795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <SkBitmap.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IMediaMetadataRetriever.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
240f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks// The binder is supposed to propagate the scheduler group across
250f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks// the binder interface so that remote calls are executed with
260f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks// the same priority as local calls. This is currently not working
270f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks// so this change puts in a temporary hack to fix the issue with
280f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks// metadata retrieval which can be a huge CPU hit if done on a
290f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks// foreground thread.
300f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
310f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks
320f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks/* desktop Linux needs a little help with gettid() */
330f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#if defined(HAVE_GETTID) && !defined(HAVE_ANDROID_OS)
340f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#define __KERNEL__
350f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks# include <linux/unistd.h>
360f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifdef _syscall0
370f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks_syscall0(pid_t,gettid)
380f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#else
390f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparkspid_t gettid() { return syscall(__NR_gettid);}
400f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
410f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#undef __KERNEL__
420f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
430f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks
4416cc72bdef471ffeee3f61eba8262783de248b04Dave Sparksstatic int myTid() {
4516cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks#ifdef HAVE_GETTID
4616cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks    return gettid();
4716cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks#else
4816cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks    return getpid();
4916cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks#endif
5016cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks}
5116cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks
5216cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks#undef LOG_TAG
530f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#define LOG_TAG "IMediaMetadataRetriever"
540f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#include <utils/Log.h>
550f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#include <cutils/sched_policy.h>
560f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks
570f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparksnamespace android {
580f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks
590f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparksstatic void sendSchedPolicy(Parcel& data)
600f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks{
610f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks    SchedPolicy policy;
6216cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks    get_sched_policy(myTid(), &policy);
630f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks    data.writeInt32(policy);
640f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks}
650f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks
660f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparksstatic void setSchedPolicy(const Parcel& data)
670f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks{
680f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks    SchedPolicy policy = (SchedPolicy) data.readInt32();
6916cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks    set_sched_policy(myTid(), policy);
700f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks}
710f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparksstatic void restoreSchedPolicy()
720f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks{
7316cc72bdef471ffeee3f61eba8262783de248b04Dave Sparks    set_sched_policy(myTid(), SP_FOREGROUND);
740f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks}
750f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks}; // end namespace android
760f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
770f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_DATA_SOURCE_URL,
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_DATA_SOURCE_FD,
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_MODE,
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GET_MODE,
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CAPTURE_FRAME,
870f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks    EXTRACT_ALBUM_ART,
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EXTRACT_METADATA,
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpMediaMetadataRetriever: public BpInterface<IMediaMetadataRetriever>
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BpMediaMetadataRetriever(const sp<IBinder>& impl)
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        : BpInterface<IMediaMetadataRetriever>(impl)
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // disconnect from media metadata retriever service
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void disconnect()
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setDataSource(const char* srcUrl)
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeCString(srcUrl);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setDataSource(int fd, int64_t offset, int64_t length)
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeFileDescriptor(fd);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt64(offset);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt64(length);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setMode(int mode)
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(mode);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_MODE, data, &reply);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t getMode(int* mode) const
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(GET_MODE, data, &reply);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *mode = reply.readInt32();
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IMemory> captureFrame()
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1490f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
1500f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks        sendSchedPolicy(data);
1510f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(CAPTURE_FRAME, data, &reply);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t ret = reply.readInt32();
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ret != NO_ERROR) {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NULL;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IMemory> extractAlbumArt()
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1640f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
1650f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks        sendSchedPolicy(data);
1660f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
1670f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks        remote()->transact(EXTRACT_ALBUM_ART, data, &reply);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t ret = reply.readInt32();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ret != NO_ERROR) {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NULL;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* extractMetadata(int keyCode)
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1790f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
1800f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks        sendSchedPolicy(data);
1810f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(keyCode);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(EXTRACT_METADATA, data, &reply);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t ret = reply.readInt32();
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ret != NO_ERROR) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NULL;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readCString();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
192dcd810d01394cbcc78905b46e212a49e38f88b8bnikoIMPLEMENT_META_INTERFACE(MediaMetadataRetriever, "android.media.IMediaMetadataRetriever");
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnMediaMetadataRetriever::onTransact(
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (code) {
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DISCONNECT: {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            disconnect();
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_DATA_SOURCE_URL: {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const char* srcUrl = data.readCString();
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(setDataSource(srcUrl));
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_DATA_SOURCE_FD: {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int fd = dup(data.readFileDescriptor());
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int64_t offset = data.readInt64();
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int64_t length = data.readInt64();
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(setDataSource(fd, offset, length));
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_MODE: {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mode = data.readInt32();
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(setMode(mode));
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GET_MODE: {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mode;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t status = getMode(&mode);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(mode);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(status);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case CAPTURE_FRAME: {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2350f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
2360f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks            setSchedPolicy(data);
2370f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory> bitmap = captureFrame();
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bitmap != 0) {  // Don't send NULL across the binder interface
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply->writeInt32(NO_ERROR);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply->writeStrongBinder(bitmap->asBinder());
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2450f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
2460f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks            restoreSchedPolicy();
2470f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2500f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks        case EXTRACT_ALBUM_ART: {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2520f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
2530f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks            setSchedPolicy(data);
2540f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory> albumArt = extractAlbumArt();
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (albumArt != 0) {  // Don't send NULL across the binder interface
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply->writeInt32(NO_ERROR);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply->writeStrongBinder(albumArt->asBinder());
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2620f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
2630f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks            restoreSchedPolicy();
2640f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EXTRACT_METADATA: {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2690f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
2700f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks            setSchedPolicy(data);
2710f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int keyCode = data.readInt32();
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const char* value = extractMetadata(keyCode);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value != NULL) {  // Don't send NULL across the binder interface
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply->writeInt32(NO_ERROR);
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply->writeCString(value);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2800f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
2810f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks            restoreSchedPolicy();
2820f9a53d499b4ff56071c5d7862e00027eb11e9d4Dave Sparks#endif
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
293