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,
71ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks    EXTRACT_ALBUM_ART,
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    EXTRACT_METADATA,
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpMediaMetadataRetriever: public BpInterface<IMediaMetadataRetriever>
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
78090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpMediaMetadataRetriever(const sp<IBinder>& impl)
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IMediaMetadataRetriever>(impl)
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // disconnect from media metadata retriever service
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void disconnect()
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(DISCONNECT, data, &reply);
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
91af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber    status_t setDataSource(
921b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
931b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const char *srcUrl,
941b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const KeyedVector<String8, String8> *headers)
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
981b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        data.writeInt32(httpService != NULL);
991b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        if (httpService != NULL) {
10006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            data.writeStrongBinder(IInterface::asBinder(httpService));
1011b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        }
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeCString(srcUrl);
103af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
104af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        if (headers == NULL) {
105af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            data.writeInt32(0);
106af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        } else {
107af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            // serialize the headers
108e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            data.writeInt64(headers->size());
109af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            for (size_t i = 0; i < headers->size(); ++i) {
110af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                data.writeString8(headers->keyAt(i));
111af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                data.writeString8(headers->valueAt(i));
112af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            }
113af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber        }
114af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_URL, data, &reply);
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t setDataSource(int fd, int64_t offset, int64_t length)
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFileDescriptor(fd);
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(offset);
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(length);
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_DATA_SOURCE_FD, data, &reply);
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    status_t setDataSource(const sp<IDataSource>& source)
13199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    {
13299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        Parcel data, reply;
13399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
13499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeStrongBinder(IInterface::asBinder(source));
13599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        remote()->transact(SET_DATA_SOURCE_CALLBACK, data, &reply);
13699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        return reply.readInt32();
13799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
13899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
13916afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong    sp<IMemory> getFrameAtTime(int64_t timeUs, int option)
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14134fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn        ALOGV("getTimeAtTime: time(%" PRId64 " us) and option(%d)", timeUs, option);
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
14416afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        data.writeInt64(timeUs);
14516afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        data.writeInt32(option);
146ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
147ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
148ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
14916afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        remote()->transact(GET_FRAME_AT_TIME, data, &reply);
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMemory> extractAlbumArt()
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
161ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
162ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
163ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
164ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        remote()->transact(EXTRACT_ALBUM_ART, data, &reply);
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IMemory>(reply.readStrongBinder());
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    const char* extractMetadata(int keyCode)
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
176ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
177ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        sendSchedPolicy(data);
178ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(keyCode);
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(EXTRACT_METADATA, data, &reply);
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = reply.readInt32();
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (ret != NO_ERROR) {
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NULL;
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
185d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        const char* str = reply.readCString();
186d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        if (str != NULL) {
187d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            String8 value(str);
188d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            if (mMetadata.indexOfKey(keyCode) < 0) {
189d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee                mMetadata.add(keyCode, value);
190d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            } else {
191d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee                mMetadata.replaceValueFor(keyCode, value);
192d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            }
193d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            return mMetadata.valueFor(keyCode).string();
194d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        } else {
195d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee            return NULL;
196d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee        }
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
198d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee
199d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Leeprivate:
200d01c148195283d6bc68e2bd1486380f118d89e00Sangkyu Lee    KeyedVector<int, String8> mMetadata;
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20356f0cc533a38bdb84bc03adcb43515614ab21baenikoIMPLEMENT_META_INTERFACE(MediaMetadataRetriever, "android.media.IMediaMetadataRetriever");
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnMediaMetadataRetriever::onTransact(
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch (code) {
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case DISCONNECT: {
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            disconnect();
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_DATA_SOURCE_URL: {
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
2181b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
2191b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            sp<IMediaHTTPService> httpService;
2201b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            if (data.readInt32()) {
2211b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                httpService =
2221b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    interface_cast<IMediaHTTPService>(data.readStrongBinder());
2231b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            }
2241b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* srcUrl = data.readCString();
226af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
2272afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (httpService == NULL || srcUrl == NULL) {
2282afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
2292afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                return NO_ERROR;
2302afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
2312afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia
232af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            KeyedVector<String8, String8> headers;
233e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t numHeaders = (size_t) data.readInt64();
234e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            for (size_t i = 0; i < numHeaders; ++i) {
235af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                String8 key = data.readString8();
236af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                String8 value = data.readString8();
237af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber                headers.add(key, value);
238af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            }
239af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
240af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber            reply->writeInt32(
2411b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                    setDataSource(
2421b86fe063badb5f28c467ade39be0f4008688947Andreas Huber                        httpService, srcUrl, numHeaders > 0 ? &headers : NULL));
243af8791e112c8072452bd14ef3c43a47511d19542Andreas Huber
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_DATA_SOURCE_FD: {
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
24855203e2e29428c2c7bd830d731f5e6ed890d9a10Taiju Tsuiki            int fd = data.readFileDescriptor();
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t offset = data.readInt64();
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int64_t length = data.readInt64();
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(setDataSource(fd, offset, length));
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
25499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        case SET_DATA_SOURCE_CALLBACK: {
25599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
25699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            sp<IDataSource> source =
25799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins                interface_cast<IDataSource>(data.readStrongBinder());
2582afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            if (source == NULL) {
2592afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(BAD_VALUE);
2602afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            } else {
2612afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                reply->writeInt32(setDataSource(source));
2622afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia            }
26399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return NO_ERROR;
26499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        } break;
26516afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong        case GET_FRAME_AT_TIME: {
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
26716afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            int64_t timeUs = data.readInt64();
26816afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            int option = data.readInt32();
26934fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn            ALOGV("getTimeAtTime: time(%" PRId64 " us) and option(%d)", timeUs, option);
270ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
271ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
272ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
27316afe2fb439cab6125bb46a07a8078d4ce1c1ea5James Dong            sp<IMemory> bitmap = getFrameAtTime(timeUs, option);
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (bitmap != 0) {  // Don't send NULL across the binder interface
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
27606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen                reply->writeStrongBinder(IInterface::asBinder(bitmap));
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
280ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
281ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
282ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
285ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks        case EXTRACT_ALBUM_ART: {
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
287ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
288ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
289ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> albumArt = extractAlbumArt();
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (albumArt != 0) {  // Don't send NULL across the binder interface
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
29306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen                reply->writeStrongBinder(IInterface::asBinder(albumArt));
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
297ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
298ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
299ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case EXTRACT_METADATA: {
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
304ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
305ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            setSchedPolicy(data);
306ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int keyCode = data.readInt32();
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const char* value = extractMetadata(keyCode);
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (value != NULL) {  // Don't send NULL across the binder interface
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(NO_ERROR);
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeCString(value);
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                reply->writeInt32(UNKNOWN_ERROR);
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
315ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#ifndef DISABLE_GROUP_SCHEDULE_HACK
316ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks            restoreSchedPolicy();
317ec4dde75955f87e5afea3f59ef991130257f3f3aDave Sparks#endif
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32740bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
328