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
1834fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn#include <inttypes.h>
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2134fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn
227562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h>
2399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <media/IDataSource.h>
241b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaMetadataRetriever.h>
26af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber#include <utils/String8.h>
27d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee#include <utils/KeyedVector.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// The binder is supposed to propagate the scheduler group across
30ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// the binder interface so that remote calls are executed with
31ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// the same priority as local calls. This is currently not working
32ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// so this change puts in a temporary hack to fix the issue with
33ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// metadata retrieval which can be a huge CPU hit if done on a
34ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// foreground thread.
35ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
36ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
37f311c557729099d002f4aae37c402a8287912369Dave Sparks#undef LOG_TAG
38ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#define LOG_TAG "IMediaMetadataRetriever"
39ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#include <utils/Log.h>
40ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#include <cutils/sched_policy.h>
41ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
42ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksnamespace android {
43ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
44ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void sendSchedPolicy(Parcel& data)
45ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{
46ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    SchedPolicy policy;
470512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten    get_sched_policy(gettid(), &policy);
48ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    data.writeInt32(policy);
49ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}
50ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
51ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void setSchedPolicy(const Parcel& data)
52ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{
53ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    SchedPolicy policy = (SchedPolicy) data.readInt32();
540512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten    set_sched_policy(gettid(), policy);
55ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}
56ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void restoreSchedPolicy()
57ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{
580512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten    set_sched_policy(gettid(), SP_FOREGROUND);
59ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}
60ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}; // end namespace android
61ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
62ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_DATA_SOURCE_URL,
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_DATA_SOURCE_FD,
6999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    SET_DATA_SOURCE_CALLBACK,
7016afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong    GET_FRAME_AT_TIME,
71d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang    GET_IMAGE_AT_INDEX,
720c1407f79ef36422330c2003a608d37df714256bChong Zhang    GET_IMAGE_RECT_AT_INDEX,
73d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang    GET_FRAME_AT_INDEX,
74ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    EXTRACT_ALBUM_ART,
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EXTRACT_METADATA,
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaMetadataRetriever: public BpInterface<IMediaMetadataRetriever>
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
81090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpMediaMetadataRetriever(const sp<IBinder>& impl)
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaMetadataRetriever>(impl)
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // disconnect from media metadata retriever service
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void disconnect()
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
94af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber    status_t setDataSource(
951b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
961b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const char *srcUrl,
971b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const KeyedVector<String8, String8> *headers)
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1011b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        data.writeInt32(httpService != NULL);
1021b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        if (httpService != NULL) {
10306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            data.writeStrongBinder(IInterface::asBinder(httpService));
1041b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        }
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeCString(srcUrl);
106af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
107af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        if (headers == NULL) {
108af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            data.writeInt32(0);
109af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        } else {
110af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            // serialize the headers
111e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            data.writeInt64(headers->size());
112af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            for (size_t i = 0; i < headers->size(); ++i) {
113af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                data.writeString8(headers->keyAt(i));
114af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                data.writeString8(headers->valueAt(i));
115af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            }
116af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        }
117af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setDataSource(int fd, int64_t offset, int64_t length)
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFileDescriptor(fd);
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(offset);
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(length);
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13324c15776247c46e34562100213035bb7aaffe013Chong Zhang    status_t setDataSource(const sp<IDataSource>& source, const char *mime)
13499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    {
13599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        Parcel data, reply;
13699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
13799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeStrongBinder(IInterface::asBinder(source));
13824c15776247c46e34562100213035bb7aaffe013Chong Zhang
13924c15776247c46e34562100213035bb7aaffe013Chong Zhang        if (mime != NULL) {
14024c15776247c46e34562100213035bb7aaffe013Chong Zhang            data.writeInt32(1);
14124c15776247c46e34562100213035bb7aaffe013Chong Zhang            data.writeCString(mime);
14224c15776247c46e34562100213035bb7aaffe013Chong Zhang        } else {
14324c15776247c46e34562100213035bb7aaffe013Chong Zhang            data.writeInt32(0);
14424c15776247c46e34562100213035bb7aaffe013Chong Zhang        }
14599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
14699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        return reply.readInt32();
14799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
14899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
14924c15776247c46e34562100213035bb7aaffe013Chong Zhang    sp<IMemory> getFrameAtTime(int64_t timeUs, int option, int colorFormat, bool metaOnly)
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
15124c15776247c46e34562100213035bb7aaffe013Chong Zhang        ALOGV("getTimeAtTime: time(%" PRId64 " us), option(%d), colorFormat(%d) metaOnly(%d)",
15224c15776247c46e34562100213035bb7aaffe013Chong Zhang                timeUs, option, colorFormat, metaOnly);
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
15516afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        data.writeInt64(timeUs);
15616afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        data.writeInt32(option);
15724c15776247c46e34562100213035bb7aaffe013Chong Zhang        data.writeInt32(colorFormat);
15824c15776247c46e34562100213035bb7aaffe013Chong Zhang        data.writeInt32(metaOnly);
159ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
160ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
161ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
16216afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        remote()->transact(GET_FRAME_AT_TIME, data, &reply);
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
170d5fa357ddff0589d8a331583a56e62712af471beChong Zhang    sp<IMemory> getImageAtIndex(int index, int colorFormat, bool metaOnly, bool thumbnail)
171d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang    {
172d5fa357ddff0589d8a331583a56e62712af471beChong Zhang        ALOGV("getImageAtIndex: index %d, colorFormat(%d) metaOnly(%d) thumbnail(%d)",
173d5fa357ddff0589d8a331583a56e62712af471beChong Zhang                index, colorFormat, metaOnly, thumbnail);
174d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        Parcel data, reply;
175d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
176d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        data.writeInt32(index);
177d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        data.writeInt32(colorFormat);
178d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        data.writeInt32(metaOnly);
179d5fa357ddff0589d8a331583a56e62712af471beChong Zhang        data.writeInt32(thumbnail);
180d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#ifndef DISABLE_GROUP_SCHEDULE_HACK
181d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        sendSchedPolicy(data);
182d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#endif
183d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        remote()->transact(GET_IMAGE_AT_INDEX, data, &reply);
184d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        status_t ret = reply.readInt32();
185d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        if (ret != NO_ERROR) {
186d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            return NULL;
187d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        }
188d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        return interface_cast<IMemory>(reply.readStrongBinder());
189d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang    }
190d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang
1910c1407f79ef36422330c2003a608d37df714256bChong Zhang    sp<IMemory> getImageRectAtIndex(
1920c1407f79ef36422330c2003a608d37df714256bChong Zhang            int index, int colorFormat, int left, int top, int right, int bottom)
1930c1407f79ef36422330c2003a608d37df714256bChong Zhang    {
1940c1407f79ef36422330c2003a608d37df714256bChong Zhang        ALOGV("getImageRectAtIndex: index %d, colorFormat(%d) rect {%d, %d, %d, %d}",
1950c1407f79ef36422330c2003a608d37df714256bChong Zhang                index, colorFormat, left, top, right, bottom);
1960c1407f79ef36422330c2003a608d37df714256bChong Zhang        Parcel data, reply;
1970c1407f79ef36422330c2003a608d37df714256bChong Zhang        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
1980c1407f79ef36422330c2003a608d37df714256bChong Zhang        data.writeInt32(index);
1990c1407f79ef36422330c2003a608d37df714256bChong Zhang        data.writeInt32(colorFormat);
2000c1407f79ef36422330c2003a608d37df714256bChong Zhang        data.writeInt32(left);
2010c1407f79ef36422330c2003a608d37df714256bChong Zhang        data.writeInt32(top);
2020c1407f79ef36422330c2003a608d37df714256bChong Zhang        data.writeInt32(right);
2030c1407f79ef36422330c2003a608d37df714256bChong Zhang        data.writeInt32(bottom);
2040c1407f79ef36422330c2003a608d37df714256bChong Zhang#ifndef DISABLE_GROUP_SCHEDULE_HACK
2050c1407f79ef36422330c2003a608d37df714256bChong Zhang        sendSchedPolicy(data);
2060c1407f79ef36422330c2003a608d37df714256bChong Zhang#endif
2070c1407f79ef36422330c2003a608d37df714256bChong Zhang        remote()->transact(GET_IMAGE_RECT_AT_INDEX, data, &reply);
2080c1407f79ef36422330c2003a608d37df714256bChong Zhang        status_t ret = reply.readInt32();
2090c1407f79ef36422330c2003a608d37df714256bChong Zhang        if (ret != NO_ERROR) {
2100c1407f79ef36422330c2003a608d37df714256bChong Zhang            return NULL;
2110c1407f79ef36422330c2003a608d37df714256bChong Zhang        }
2120c1407f79ef36422330c2003a608d37df714256bChong Zhang        return interface_cast<IMemory>(reply.readStrongBinder());
2130c1407f79ef36422330c2003a608d37df714256bChong Zhang    }
2140c1407f79ef36422330c2003a608d37df714256bChong Zhang
215d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang    status_t getFrameAtIndex(std::vector<sp<IMemory> > *frames,
216d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            int frameIndex, int numFrames, int colorFormat, bool metaOnly)
217d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang    {
218d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        ALOGV("getFrameAtIndex: frameIndex(%d), numFrames(%d), colorFormat(%d) metaOnly(%d)",
219d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                frameIndex, numFrames, colorFormat, metaOnly);
220d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        Parcel data, reply;
221d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
222d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        data.writeInt32(frameIndex);
223d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        data.writeInt32(numFrames);
224d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        data.writeInt32(colorFormat);
225d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        data.writeInt32(metaOnly);
226d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#ifndef DISABLE_GROUP_SCHEDULE_HACK
227d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        sendSchedPolicy(data);
228d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#endif
229d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        remote()->transact(GET_FRAME_AT_INDEX, data, &reply);
230d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        status_t ret = reply.readInt32();
231d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        if (ret != NO_ERROR) {
232d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            return ret;
233d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        }
234d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        int retNumFrames = reply.readInt32();
235d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        if (retNumFrames < numFrames) {
236d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            numFrames = retNumFrames;
237d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        }
238d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        for (int i = 0; i < numFrames; i++) {
239d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            frames->push_back(interface_cast<IMemory>(reply.readStrongBinder()));
240d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        }
241d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        return OK;
242d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang    }
243d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMemory> extractAlbumArt()
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
248ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
249ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
250ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
251ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        remote()->transact(EXTRACT_ALBUM_ART, data, &reply);
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const char* extractMetadata(int keyCode)
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
263ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
264ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
265ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(keyCode);
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(EXTRACT_METADATA, data, &reply);
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
272d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        const char* str = reply.readCString();
273d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        if (str != NULL) {
274d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            String8 value(str);
275d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            if (mMetadata.indexOfKey(keyCode) < 0) {
276d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee                mMetadata.add(keyCode, value);
277d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            } else {
278d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee                mMetadata.replaceValueFor(keyCode, value);
279d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            }
280d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            return mMetadata.valueFor(keyCode).string();
281d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        } else {
282d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            return NULL;
283d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        }
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
285d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee
286d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Leeprivate:
287d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee    KeyedVector<int, String8> mMetadata;
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29056f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaMetadataRetriever, "android.media.IMediaMetadataRetriever");
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaMetadataRetriever::onTransact(
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch (code) {
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DISCONNECT: {
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            disconnect();
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_DATA_SOURCE_URL: {
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
3051b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
3061b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            sp<IMediaHTTPService> httpService;
3071b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            if (data.readInt32()) {
3081b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                httpService =
3091b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    interface_cast<IMediaHTTPService>(data.readStrongBinder());
3101b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            }
3111b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* srcUrl = data.readCString();
313af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
3142afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (httpService == NULL || srcUrl == NULL) {
3152afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
3162afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                return NO_ERROR;
3172afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
3182afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia
319af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            KeyedVector<String8, String8> headers;
320e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t numHeaders = (size_t) data.readInt64();
321e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            for (size_t i = 0; i < numHeaders; ++i) {
322af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                String8 key = data.readString8();
323af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                String8 value = data.readString8();
324af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                headers.add(key, value);
325af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            }
326af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
327af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            reply->writeInt32(
3281b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    setDataSource(
3291b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                        httpService, srcUrl, numHeaders > 0 ? &headers : NULL));
330af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_DATA_SOURCE_FD: {
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
33555203e2e29428c2c7bd830d731f5e6ed890d9a10Taiju Tsuiki            int fd = data.readFileDescriptor();
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t offset = data.readInt64();
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t length = data.readInt64();
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(setDataSource(fd, offset, length));
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
34199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        case SET_DATA_SOURCE_CALLBACK: {
34299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
34399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            sp<IDataSource> source =
34499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins                interface_cast<IDataSource>(data.readStrongBinder());
3452afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (source == NULL) {
3462afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
3472afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            } else {
34824c15776247c46e34562100213035bb7aaffe013Chong Zhang                int32_t hasMime = data.readInt32();
34924c15776247c46e34562100213035bb7aaffe013Chong Zhang                const char *mime = NULL;
35024c15776247c46e34562100213035bb7aaffe013Chong Zhang                if (hasMime) {
35124c15776247c46e34562100213035bb7aaffe013Chong Zhang                    mime = data.readCString();
35224c15776247c46e34562100213035bb7aaffe013Chong Zhang                }
35324c15776247c46e34562100213035bb7aaffe013Chong Zhang                reply->writeInt32(setDataSource(source, mime));
3542afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
35599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return NO_ERROR;
35699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        } break;
35716afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        case GET_FRAME_AT_TIME: {
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
35916afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            int64_t timeUs = data.readInt64();
36016afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            int option = data.readInt32();
36124c15776247c46e34562100213035bb7aaffe013Chong Zhang            int colorFormat = data.readInt32();
36224c15776247c46e34562100213035bb7aaffe013Chong Zhang            bool metaOnly = (data.readInt32() != 0);
36324c15776247c46e34562100213035bb7aaffe013Chong Zhang            ALOGV("getTimeAtTime: time(%" PRId64 " us), option(%d), colorFormat(%d), metaOnly(%d)",
36424c15776247c46e34562100213035bb7aaffe013Chong Zhang                    timeUs, option, colorFormat, metaOnly);
365ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
366ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
367ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
36824c15776247c46e34562100213035bb7aaffe013Chong Zhang            sp<IMemory> bitmap = getFrameAtTime(timeUs, option, colorFormat, metaOnly);
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (bitmap != 0) {  // Don't send NULL across the binder interface
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
37106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen                reply->writeStrongBinder(IInterface::asBinder(bitmap));
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
375ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
376ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
377ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
380d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        case GET_IMAGE_AT_INDEX: {
381d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
382d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            int index = data.readInt32();
383d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            int colorFormat = data.readInt32();
384d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            bool metaOnly = (data.readInt32() != 0);
385d5fa357ddff0589d8a331583a56e62712af471beChong Zhang            bool thumbnail = (data.readInt32() != 0);
386d5fa357ddff0589d8a331583a56e62712af471beChong Zhang            ALOGV("getImageAtIndex: index(%d), colorFormat(%d), metaOnly(%d), thumbnail(%d)",
387d5fa357ddff0589d8a331583a56e62712af471beChong Zhang                    index, colorFormat, metaOnly, thumbnail);
388d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#ifndef DISABLE_GROUP_SCHEDULE_HACK
389d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            setSchedPolicy(data);
390d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#endif
391d5fa357ddff0589d8a331583a56e62712af471beChong Zhang            sp<IMemory> bitmap = getImageAtIndex(index, colorFormat, metaOnly, thumbnail);
392d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            if (bitmap != 0) {  // Don't send NULL across the binder interface
393d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                reply->writeInt32(NO_ERROR);
394d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                reply->writeStrongBinder(IInterface::asBinder(bitmap));
395d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            } else {
396d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                reply->writeInt32(UNKNOWN_ERROR);
397d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            }
398d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#ifndef DISABLE_GROUP_SCHEDULE_HACK
399d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            restoreSchedPolicy();
400d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#endif
401d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            return NO_ERROR;
402d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        } break;
4030c1407f79ef36422330c2003a608d37df714256bChong Zhang
4040c1407f79ef36422330c2003a608d37df714256bChong Zhang        case GET_IMAGE_RECT_AT_INDEX: {
4050c1407f79ef36422330c2003a608d37df714256bChong Zhang            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
4060c1407f79ef36422330c2003a608d37df714256bChong Zhang            int index = data.readInt32();
4070c1407f79ef36422330c2003a608d37df714256bChong Zhang            int colorFormat = data.readInt32();
4080c1407f79ef36422330c2003a608d37df714256bChong Zhang            int left = data.readInt32();
4090c1407f79ef36422330c2003a608d37df714256bChong Zhang            int top = data.readInt32();
4100c1407f79ef36422330c2003a608d37df714256bChong Zhang            int right = data.readInt32();
4110c1407f79ef36422330c2003a608d37df714256bChong Zhang            int bottom = data.readInt32();
4120c1407f79ef36422330c2003a608d37df714256bChong Zhang            ALOGV("getImageRectAtIndex: index(%d), colorFormat(%d), rect {%d, %d, %d, %d}",
4130c1407f79ef36422330c2003a608d37df714256bChong Zhang                    index, colorFormat, left, top, right, bottom);
4140c1407f79ef36422330c2003a608d37df714256bChong Zhang#ifndef DISABLE_GROUP_SCHEDULE_HACK
4150c1407f79ef36422330c2003a608d37df714256bChong Zhang            setSchedPolicy(data);
4160c1407f79ef36422330c2003a608d37df714256bChong Zhang#endif
4170c1407f79ef36422330c2003a608d37df714256bChong Zhang            sp<IMemory> bitmap = getImageRectAtIndex(
4180c1407f79ef36422330c2003a608d37df714256bChong Zhang                    index, colorFormat, left, top, right, bottom);
4190c1407f79ef36422330c2003a608d37df714256bChong Zhang            if (bitmap != 0) {  // Don't send NULL across the binder interface
4200c1407f79ef36422330c2003a608d37df714256bChong Zhang                reply->writeInt32(NO_ERROR);
4210c1407f79ef36422330c2003a608d37df714256bChong Zhang                reply->writeStrongBinder(IInterface::asBinder(bitmap));
4220c1407f79ef36422330c2003a608d37df714256bChong Zhang            } else {
4230c1407f79ef36422330c2003a608d37df714256bChong Zhang                reply->writeInt32(UNKNOWN_ERROR);
4240c1407f79ef36422330c2003a608d37df714256bChong Zhang            }
4250c1407f79ef36422330c2003a608d37df714256bChong Zhang#ifndef DISABLE_GROUP_SCHEDULE_HACK
4260c1407f79ef36422330c2003a608d37df714256bChong Zhang            restoreSchedPolicy();
4270c1407f79ef36422330c2003a608d37df714256bChong Zhang#endif
4280c1407f79ef36422330c2003a608d37df714256bChong Zhang            return NO_ERROR;
4290c1407f79ef36422330c2003a608d37df714256bChong Zhang        } break;
4300c1407f79ef36422330c2003a608d37df714256bChong Zhang
431d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        case GET_FRAME_AT_INDEX: {
432d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
433d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            int frameIndex = data.readInt32();
434d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            int numFrames = data.readInt32();
435d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            int colorFormat = data.readInt32();
436d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            bool metaOnly = (data.readInt32() != 0);
437d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            ALOGV("getFrameAtIndex: frameIndex(%d), numFrames(%d), colorFormat(%d), metaOnly(%d)",
438d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                    frameIndex, numFrames, colorFormat, metaOnly);
439d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#ifndef DISABLE_GROUP_SCHEDULE_HACK
440d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            setSchedPolicy(data);
441d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#endif
442d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            std::vector<sp<IMemory> > frames;
443d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            status_t err = getFrameAtIndex(
444d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                    &frames, frameIndex, numFrames, colorFormat, metaOnly);
445d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            reply->writeInt32(err);
446d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            if (OK == err) {
447d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                reply->writeInt32(frames.size());
448d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                for (size_t i = 0; i < frames.size(); i++) {
449d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                    reply->writeStrongBinder(IInterface::asBinder(frames[i]));
450d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang                }
451d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            }
452d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#ifndef DISABLE_GROUP_SCHEDULE_HACK
453d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            restoreSchedPolicy();
454d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#endif
455d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang            return NO_ERROR;
456d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang        } break;
457ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        case EXTRACT_ALBUM_ART: {
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
459ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
460ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
461ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> albumArt = extractAlbumArt();
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (albumArt != 0) {  // Don't send NULL across the binder interface
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
46506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen                reply->writeStrongBinder(IInterface::asBinder(albumArt));
46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
469ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
470ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
471ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case EXTRACT_METADATA: {
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
476ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
477ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
478ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int keyCode = data.readInt32();
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* value = extractMetadata(keyCode);
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (value != NULL) {  // Don't send NULL across the binder interface
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeCString(value);
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
487ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
488ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
489ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
49940bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
500