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