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 <media/IMediaMetadataRetriever.h>
22af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber#include <utils/String8.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
32f311c557729099d002f4aae37c402a8287912369Dave Sparks#undef LOG_TAG
33ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#define LOG_TAG "IMediaMetadataRetriever"
34ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#include <utils/Log.h>
35ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#include <cutils/sched_policy.h>
36ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
37ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksnamespace android {
38ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
39ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void sendSchedPolicy(Parcel& data)
40ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{
41ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    SchedPolicy policy;
420512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten    get_sched_policy(gettid(), &policy);
43ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    data.writeInt32(policy);
44ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}
45ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
46ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void setSchedPolicy(const Parcel& data)
47ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{
48ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    SchedPolicy policy = (SchedPolicy) data.readInt32();
490512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten    set_sched_policy(gettid(), policy);
50ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}
51ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void restoreSchedPolicy()
52ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{
530512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten    set_sched_policy(gettid(), SP_FOREGROUND);
54ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}
55ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}; // end namespace android
56ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
57ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_DATA_SOURCE_URL,
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_DATA_SOURCE_FD,
6416afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong    GET_FRAME_AT_TIME,
65ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    EXTRACT_ALBUM_ART,
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EXTRACT_METADATA,
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaMetadataRetriever: public BpInterface<IMediaMetadataRetriever>
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpMediaMetadataRetriever(const sp<IBinder>& impl)
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaMetadataRetriever>(impl)
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // disconnect from media metadata retriever service
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void disconnect()
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
85af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber    status_t setDataSource(
86af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            const char *srcUrl, const KeyedVector<String8, String8> *headers)
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeCString(srcUrl);
91af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
92af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        if (headers == NULL) {
93af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            data.writeInt32(0);
94af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        } else {
95af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            // serialize the headers
96af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            data.writeInt32(headers->size());
97af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            for (size_t i = 0; i < headers->size(); ++i) {
98af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                data.writeString8(headers->keyAt(i));
99af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                data.writeString8(headers->valueAt(i));
100af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            }
101af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        }
102af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setDataSource(int fd, int64_t offset, int64_t length)
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFileDescriptor(fd);
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(offset);
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(length);
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11816afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong    sp<IMemory> getFrameAtTime(int64_t timeUs, int option)
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
1203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("getTimeAtTime: time(%lld us) and option(%d)", timeUs, option);
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
12316afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        data.writeInt64(timeUs);
12416afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        data.writeInt32(option);
125ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
126ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
127ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
12816afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        remote()->transact(GET_FRAME_AT_TIME, data, &reply);
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMemory> extractAlbumArt()
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
140ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
141ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
142ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
143ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        remote()->transact(EXTRACT_ALBUM_ART, data, &reply);
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const char* extractMetadata(int keyCode)
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
155ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
156ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
157ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(keyCode);
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(EXTRACT_METADATA, data, &reply);
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readCString();
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16856f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaMetadataRetriever, "android.media.IMediaMetadataRetriever");
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaMetadataRetriever::onTransact(
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch (code) {
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DISCONNECT: {
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            disconnect();
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_DATA_SOURCE_URL: {
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* srcUrl = data.readCString();
184af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
185af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            KeyedVector<String8, String8> headers;
186af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            int32_t numHeaders = data.readInt32();
187af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            for (int i = 0; i < numHeaders; ++i) {
188af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                String8 key = data.readString8();
189af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                String8 value = data.readString8();
190af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                headers.add(key, value);
191af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            }
192af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
193af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            reply->writeInt32(
194af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                    setDataSource(srcUrl, numHeaders > 0 ? &headers : NULL));
195af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_DATA_SOURCE_FD: {
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int fd = dup(data.readFileDescriptor());
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t offset = data.readInt64();
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t length = data.readInt64();
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(setDataSource(fd, offset, length));
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
20616afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        case GET_FRAME_AT_TIME: {
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
20816afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            int64_t timeUs = data.readInt64();
20916afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            int option = data.readInt32();
2103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("getTimeAtTime: time(%lld us) and option(%d)", timeUs, option);
211ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
212ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
213ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
21416afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            sp<IMemory> bitmap = getFrameAtTime(timeUs, option);
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (bitmap != 0) {  // Don't send NULL across the binder interface
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeStrongBinder(bitmap->asBinder());
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
221ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
222ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
223ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
226ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        case EXTRACT_ALBUM_ART: {
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
228ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
229ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
230ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> albumArt = extractAlbumArt();
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (albumArt != 0) {  // Don't send NULL across the binder interface
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeStrongBinder(albumArt->asBinder());
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
238ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
239ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
240ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case EXTRACT_METADATA: {
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
245ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
246ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
247ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int keyCode = data.readInt32();
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* value = extractMetadata(keyCode);
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (value != NULL) {  // Don't send NULL across the binder interface
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeCString(value);
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
256ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
257ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
258ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
269