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