IMediaMetadataRetriever.cpp revision 40bc906252974d0b389ae4a147232d0c9a97193f
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>
231b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaMetadataRetriever.h>
25af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber#include <utils/String8.h>
26d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee#include <utils/KeyedVector.h>
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// The binder is supposed to propagate the scheduler group across
29ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// the binder interface so that remote calls are executed with
30ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// the same priority as local calls. This is currently not working
31ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// so this change puts in a temporary hack to fix the issue with
32ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// metadata retrieval which can be a huge CPU hit if done on a
33ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks// foreground thread.
34ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
35ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
36f311c557729099d002f4aae37c402a8287912369Dave Sparks#undef LOG_TAG
37ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#define LOG_TAG "IMediaMetadataRetriever"
38ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#include <utils/Log.h>
39ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#include <cutils/sched_policy.h>
40ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
41ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksnamespace android {
42ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
43ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void sendSchedPolicy(Parcel& data)
44ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{
45ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    SchedPolicy policy;
460512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten    get_sched_policy(gettid(), &policy);
47ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    data.writeInt32(policy);
48ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}
49ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
50ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void setSchedPolicy(const Parcel& data)
51ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{
52ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    SchedPolicy policy = (SchedPolicy) data.readInt32();
530512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten    set_sched_policy(gettid(), policy);
54ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}
55ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparksstatic void restoreSchedPolicy()
56ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks{
570512ab559d4670c2204078470d7ef5d376811c57Glenn Kasten    set_sched_policy(gettid(), SP_FOREGROUND);
58ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}
59ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks}; // end namespace android
60ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
61ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_DATA_SOURCE_URL,
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_DATA_SOURCE_FD,
6816afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong    GET_FRAME_AT_TIME,
69ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    EXTRACT_ALBUM_ART,
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EXTRACT_METADATA,
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaMetadataRetriever: public BpInterface<IMediaMetadataRetriever>
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpMediaMetadataRetriever(const sp<IBinder>& impl)
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaMetadataRetriever>(impl)
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // disconnect from media metadata retriever service
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void disconnect()
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
89af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber    status_t setDataSource(
901b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
911b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const char *srcUrl,
921b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const KeyedVector<String8, String8> *headers)
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
961b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        data.writeInt32(httpService != NULL);
971b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        if (httpService != NULL) {
9806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            data.writeStrongBinder(IInterface::asBinder(httpService));
991b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        }
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeCString(srcUrl);
101af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
102af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        if (headers == NULL) {
103af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            data.writeInt32(0);
104af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        } else {
105af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            // serialize the headers
106e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            data.writeInt64(headers->size());
107af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            for (size_t i = 0; i < headers->size(); ++i) {
108af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                data.writeString8(headers->keyAt(i));
109af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                data.writeString8(headers->valueAt(i));
110af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            }
111af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        }
112af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setDataSource(int fd, int64_t offset, int64_t length)
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFileDescriptor(fd);
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(offset);
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(length);
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12816afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong    sp<IMemory> getFrameAtTime(int64_t timeUs, int option)
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
13034fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn        ALOGV("getTimeAtTime: time(%" PRId64 " us) and option(%d)", timeUs, option);
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
13316afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        data.writeInt64(timeUs);
13416afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        data.writeInt32(option);
135ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
136ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
137ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
13816afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        remote()->transact(GET_FRAME_AT_TIME, data, &reply);
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMemory> extractAlbumArt()
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
150ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
151ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
152ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
153ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        remote()->transact(EXTRACT_ALBUM_ART, data, &reply);
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const char* extractMetadata(int keyCode)
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
165ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
166ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
167ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(keyCode);
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(EXTRACT_METADATA, data, &reply);
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
174d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        const char* str = reply.readCString();
175d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        if (str != NULL) {
176d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            String8 value(str);
177d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            if (mMetadata.indexOfKey(keyCode) < 0) {
178d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee                mMetadata.add(keyCode, value);
179d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            } else {
180d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee                mMetadata.replaceValueFor(keyCode, value);
181d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            }
182d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            return mMetadata.valueFor(keyCode).string();
183d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        } else {
184d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            return NULL;
185d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        }
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
187d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee
188d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Leeprivate:
189d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee    KeyedVector<int, String8> mMetadata;
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19256f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaMetadataRetriever, "android.media.IMediaMetadataRetriever");
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaMetadataRetriever::onTransact(
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch (code) {
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DISCONNECT: {
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            disconnect();
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_DATA_SOURCE_URL: {
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2071b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
2081b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            sp<IMediaHTTPService> httpService;
2091b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            if (data.readInt32()) {
2101b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                httpService =
2111b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    interface_cast<IMediaHTTPService>(data.readStrongBinder());
2121b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            }
2131b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* srcUrl = data.readCString();
215af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
216af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            KeyedVector<String8, String8> headers;
217e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t numHeaders = (size_t) data.readInt64();
218e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            for (size_t i = 0; i < numHeaders; ++i) {
219af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                String8 key = data.readString8();
220af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                String8 value = data.readString8();
221af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                headers.add(key, value);
222af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            }
223af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
224af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            reply->writeInt32(
2251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    setDataSource(
2261b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                        httpService, srcUrl, numHeaders > 0 ? &headers : NULL));
227af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_DATA_SOURCE_FD: {
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int fd = dup(data.readFileDescriptor());
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t offset = data.readInt64();
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t length = data.readInt64();
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(setDataSource(fd, offset, length));
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
23816afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        case GET_FRAME_AT_TIME: {
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
24016afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            int64_t timeUs = data.readInt64();
24116afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            int option = data.readInt32();
24234fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn            ALOGV("getTimeAtTime: time(%" PRId64 " us) and option(%d)", timeUs, option);
243ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
244ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
245ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
24616afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            sp<IMemory> bitmap = getFrameAtTime(timeUs, option);
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (bitmap != 0) {  // Don't send NULL across the binder interface
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
24906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen                reply->writeStrongBinder(IInterface::asBinder(bitmap));
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
253ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
254ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
255ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
258ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        case EXTRACT_ALBUM_ART: {
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
260ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
261ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
262ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> albumArt = extractAlbumArt();
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (albumArt != 0) {  // Don't send NULL across the binder interface
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
26606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen                reply->writeStrongBinder(IInterface::asBinder(albumArt));
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
270ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
271ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
272ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case EXTRACT_METADATA: {
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
277ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
278ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
279ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int keyCode = data.readInt32();
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* value = extractMetadata(keyCode);
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (value != NULL) {  // Don't send NULL across the binder interface
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeCString(value);
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
288ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
289ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
290ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30040bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
301