IMediaMetadataRetriever.cpp revision 16afe2fb439cab6125bb46a07a8078d4ce1c1ea5
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright (C) 2008 The Android Open Source Project 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License. 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License. 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/ 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h> 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h> 207562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h> 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <SkBitmap.h> 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaMetadataRetriever.h> 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// The binder is supposed to propagate the scheduler group across 25ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// the binder interface so that remote calls are executed with 26ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// the same priority as local calls. This is currently not working 27ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// so this change puts in a temporary hack to fix the issue with 28ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// metadata retrieval which can be a huge CPU hit if done on a 29ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// foreground thread. 30ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 31ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks 32ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks/* desktop Linux needs a little help with gettid() */ 33ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#if defined(HAVE_GETTID) && !defined(HAVE_ANDROID_OS) 34ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#define __KERNEL__ 35ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks# include <linux/unistd.h> 36ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifdef _syscall0 37ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks_syscall0(pid_t,gettid) 38ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#else 39ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparkspid_t gettid() { return syscall(__NR_gettid);} 40ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 41ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#undef __KERNEL__ 42ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 43ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks 44f311c557729099d002f4aae37c402a8287912369Dave Sparksstatic int myTid() { 45f311c557729099d002f4aae37c402a8287912369Dave Sparks#ifdef HAVE_GETTID 46f311c557729099d002f4aae37c402a8287912369Dave Sparks return gettid(); 47f311c557729099d002f4aae37c402a8287912369Dave Sparks#else 48f311c557729099d002f4aae37c402a8287912369Dave Sparks return getpid(); 49f311c557729099d002f4aae37c402a8287912369Dave Sparks#endif 50f311c557729099d002f4aae37c402a8287912369Dave Sparks} 51f311c557729099d002f4aae37c402a8287912369Dave Sparks 52f311c557729099d002f4aae37c402a8287912369Dave Sparks#undef LOG_TAG 53ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#define LOG_TAG "IMediaMetadataRetriever" 54ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#include <utils/Log.h> 55ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#include <cutils/sched_policy.h> 56ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks 57ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksnamespace android { 58ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks 59ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void sendSchedPolicy(Parcel& data) 60ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{ 61ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks SchedPolicy policy; 62f311c557729099d002f4aae37c402a8287912369Dave Sparks get_sched_policy(myTid(), &policy); 63ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks data.writeInt32(policy); 64ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks} 65ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks 66ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void setSchedPolicy(const Parcel& data) 67ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{ 68ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks SchedPolicy policy = (SchedPolicy) data.readInt32(); 69f311c557729099d002f4aae37c402a8287912369Dave Sparks set_sched_policy(myTid(), policy); 70ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks} 71ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void restoreSchedPolicy() 72ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{ 73f311c557729099d002f4aae37c402a8287912369Dave Sparks set_sched_policy(myTid(), SP_FOREGROUND); 74ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks} 75ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}; // end namespace android 76ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 77ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum { 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_DATA_SOURCE_URL, 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_DATA_SOURCE_FD, 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MODE, 8516afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong GET_FRAME_AT_TIME, 86ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks EXTRACT_ALBUM_ART, 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project EXTRACT_METADATA, 8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaMetadataRetriever: public BpInterface<IMediaMetadataRetriever> 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project BpMediaMetadataRetriever(const sp<IBinder>& impl) 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IMediaMetadataRetriever>(impl) 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // disconnect from media metadata retriever service 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project void disconnect() 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor()); 10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(DISCONNECT, data, &reply); 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t setDataSource(const char* srcUrl) 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor()); 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeCString(srcUrl); 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_DATA_SOURCE_URL, data, &reply); 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t setDataSource(int fd, int64_t offset, int64_t length) 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor()); 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFileDescriptor(fd); 12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt64(offset); 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt64(length); 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_DATA_SOURCE_FD, data, &reply); 12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t setMode(int mode) 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor()); 13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MODE, data, &reply); 13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13516afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong sp<IMemory> getFrameAtTime(int64_t timeUs, int option) 13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 13716afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong LOGV("getTimeAtTime: time(%lld us) and option(%d)", timeUs, option); 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor()); 14016afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong data.writeInt64(timeUs); 14116afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong data.writeInt32(option); 142ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 143ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks sendSchedPolicy(data); 144ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 14516afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong remote()->transact(GET_FRAME_AT_TIME, data, &reply); 14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = reply.readInt32(); 14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret != NO_ERROR) { 14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NULL; 14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return interface_cast<IMemory>(reply.readStrongBinder()); 15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IMemory> extractAlbumArt() 15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor()); 157ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 158ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks sendSchedPolicy(data); 159ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 160ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks remote()->transact(EXTRACT_ALBUM_ART, data, &reply); 16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = reply.readInt32(); 16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret != NO_ERROR) { 16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NULL; 16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return interface_cast<IMemory>(reply.readStrongBinder()); 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const char* extractMetadata(int keyCode) 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor()); 172ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 173ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks sendSchedPolicy(data); 174ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(keyCode); 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(EXTRACT_METADATA, data, &reply); 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = reply.readInt32(); 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ret != NO_ERROR) { 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NULL; 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readCString(); 18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18556f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaMetadataRetriever, "android.media.IMediaMetadataRetriever"); 18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaMetadataRetriever::onTransact( 19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch (code) { 19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case DISCONNECT: { 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaMetadataRetriever, data, reply); 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project disconnect(); 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_DATA_SOURCE_URL: { 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaMetadataRetriever, data, reply); 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const char* srcUrl = data.readCString(); 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(setDataSource(srcUrl)); 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_DATA_SOURCE_FD: { 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaMetadataRetriever, data, reply); 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int fd = dup(data.readFileDescriptor()); 20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int64_t offset = data.readInt64(); 20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int64_t length = data.readInt64(); 20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(setDataSource(fd, offset, length)); 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaMetadataRetriever, data, reply); 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int mode = data.readInt32(); 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(setMode(mode)); 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 21816afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong case GET_FRAME_AT_TIME: { 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaMetadataRetriever, data, reply); 22016afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong int64_t timeUs = data.readInt64(); 22116afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong int option = data.readInt32(); 22216afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong LOGV("getTimeAtTime: time(%lld us) and option(%d)", timeUs, option); 223ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 224ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks setSchedPolicy(data); 225ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 22616afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong sp<IMemory> bitmap = getFrameAtTime(timeUs, option); 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (bitmap != 0) { // Don't send NULL across the binder interface 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(NO_ERROR); 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(bitmap->asBinder()); 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(UNKNOWN_ERROR); 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 233ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 234ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks restoreSchedPolicy(); 235ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 238ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks case EXTRACT_ALBUM_ART: { 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaMetadataRetriever, data, reply); 240ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 241ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks setSchedPolicy(data); 242ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IMemory> albumArt = extractAlbumArt(); 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (albumArt != 0) { // Don't send NULL across the binder interface 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(NO_ERROR); 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(albumArt->asBinder()); 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(UNKNOWN_ERROR); 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 250ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 251ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks restoreSchedPolicy(); 252ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case EXTRACT_METADATA: { 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IMediaMetadataRetriever, data, reply); 257ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 258ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks setSchedPolicy(data); 259ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int keyCode = data.readInt32(); 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const char* value = extractMetadata(keyCode); 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (value != NULL) { // Don't send NULL across the binder interface 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(NO_ERROR); 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeCString(value); 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(UNKNOWN_ERROR); 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 268ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK 269ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks restoreSchedPolicy(); 270ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 281