xref: /aosp_15_r20/frameworks/av/media/libmedia/IDataSource.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright 2015 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "IDataSource"
19*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Timers.h>
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker #include <android/IDataSource.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ADebug.h>
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker namespace android {
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker enum {
30*ec779b8eSAndroid Build Coastguard Worker     GET_IMEMORY = IBinder::FIRST_CALL_TRANSACTION,
31*ec779b8eSAndroid Build Coastguard Worker     READ_AT,
32*ec779b8eSAndroid Build Coastguard Worker     GET_SIZE,
33*ec779b8eSAndroid Build Coastguard Worker     CLOSE,
34*ec779b8eSAndroid Build Coastguard Worker     GET_FLAGS,
35*ec779b8eSAndroid Build Coastguard Worker     TO_STRING,
36*ec779b8eSAndroid Build Coastguard Worker };
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker struct BpDataSource : public BpInterface<IDataSource> {
BpDataSourceandroid::BpDataSource39*ec779b8eSAndroid Build Coastguard Worker     explicit BpDataSource(const sp<IBinder>& impl)
40*ec779b8eSAndroid Build Coastguard Worker         : BpInterface<IDataSource>(impl) {}
41*ec779b8eSAndroid Build Coastguard Worker 
getIMemoryandroid::BpDataSource42*ec779b8eSAndroid Build Coastguard Worker     virtual sp<IMemory> getIMemory() {
43*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
44*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
45*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_IMEMORY, data, &reply);
46*ec779b8eSAndroid Build Coastguard Worker         sp<IBinder> binder = reply.readStrongBinder();
47*ec779b8eSAndroid Build Coastguard Worker         return interface_cast<IMemory>(binder);
48*ec779b8eSAndroid Build Coastguard Worker     }
49*ec779b8eSAndroid Build Coastguard Worker 
readAtandroid::BpDataSource50*ec779b8eSAndroid Build Coastguard Worker     virtual ssize_t readAt(off64_t offset, size_t size) {
51*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
52*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
53*ec779b8eSAndroid Build Coastguard Worker         data.writeInt64(offset);
54*ec779b8eSAndroid Build Coastguard Worker         data.writeInt64(size);
55*ec779b8eSAndroid Build Coastguard Worker         status_t err = remote()->transact(READ_AT, data, &reply);
56*ec779b8eSAndroid Build Coastguard Worker         if (err != OK) {
57*ec779b8eSAndroid Build Coastguard Worker             return err;
58*ec779b8eSAndroid Build Coastguard Worker         }
59*ec779b8eSAndroid Build Coastguard Worker         int64_t value = 0;
60*ec779b8eSAndroid Build Coastguard Worker         err = reply.readInt64(&value);
61*ec779b8eSAndroid Build Coastguard Worker         if (err != OK) {
62*ec779b8eSAndroid Build Coastguard Worker             return err;
63*ec779b8eSAndroid Build Coastguard Worker         }
64*ec779b8eSAndroid Build Coastguard Worker         return (ssize_t)value;
65*ec779b8eSAndroid Build Coastguard Worker     }
66*ec779b8eSAndroid Build Coastguard Worker 
getSizeandroid::BpDataSource67*ec779b8eSAndroid Build Coastguard Worker     virtual status_t getSize(off64_t* size) {
68*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
69*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
70*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_SIZE, data, &reply);
71*ec779b8eSAndroid Build Coastguard Worker         status_t err = reply.readInt32();
72*ec779b8eSAndroid Build Coastguard Worker         *size = reply.readInt64();
73*ec779b8eSAndroid Build Coastguard Worker         return err;
74*ec779b8eSAndroid Build Coastguard Worker     }
75*ec779b8eSAndroid Build Coastguard Worker 
closeandroid::BpDataSource76*ec779b8eSAndroid Build Coastguard Worker     virtual void close() {
77*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
78*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
79*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(CLOSE, data, &reply);
80*ec779b8eSAndroid Build Coastguard Worker     }
81*ec779b8eSAndroid Build Coastguard Worker 
getFlagsandroid::BpDataSource82*ec779b8eSAndroid Build Coastguard Worker     virtual uint32_t getFlags() {
83*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
84*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
85*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(GET_FLAGS, data, &reply);
86*ec779b8eSAndroid Build Coastguard Worker         return reply.readUint32();
87*ec779b8eSAndroid Build Coastguard Worker     }
88*ec779b8eSAndroid Build Coastguard Worker 
toStringandroid::BpDataSource89*ec779b8eSAndroid Build Coastguard Worker     virtual String8 toString() {
90*ec779b8eSAndroid Build Coastguard Worker         Parcel data, reply;
91*ec779b8eSAndroid Build Coastguard Worker         data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
92*ec779b8eSAndroid Build Coastguard Worker         remote()->transact(TO_STRING, data, &reply);
93*ec779b8eSAndroid Build Coastguard Worker         return reply.readString8();
94*ec779b8eSAndroid Build Coastguard Worker     }
95*ec779b8eSAndroid Build Coastguard Worker };
96*ec779b8eSAndroid Build Coastguard Worker 
97*ec779b8eSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(DataSource, "android.media.IDataSource");
98*ec779b8eSAndroid Build Coastguard Worker 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)99*ec779b8eSAndroid Build Coastguard Worker status_t BnDataSource::onTransact(
100*ec779b8eSAndroid Build Coastguard Worker     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
101*ec779b8eSAndroid Build Coastguard Worker     switch (code) {
102*ec779b8eSAndroid Build Coastguard Worker         case GET_IMEMORY: {
103*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IDataSource, data, reply);
104*ec779b8eSAndroid Build Coastguard Worker             reply->writeStrongBinder(IInterface::asBinder(getIMemory()));
105*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
106*ec779b8eSAndroid Build Coastguard Worker         } break;
107*ec779b8eSAndroid Build Coastguard Worker         case READ_AT: {
108*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IDataSource, data, reply);
109*ec779b8eSAndroid Build Coastguard Worker             off64_t offset = (off64_t) data.readInt64();
110*ec779b8eSAndroid Build Coastguard Worker             size_t size = (size_t) data.readInt64();
111*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt64(readAt(offset, size));
112*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
113*ec779b8eSAndroid Build Coastguard Worker         } break;
114*ec779b8eSAndroid Build Coastguard Worker         case GET_SIZE: {
115*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IDataSource, data, reply);
116*ec779b8eSAndroid Build Coastguard Worker             off64_t size;
117*ec779b8eSAndroid Build Coastguard Worker             status_t err = getSize(&size);
118*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(err);
119*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt64(size);
120*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
121*ec779b8eSAndroid Build Coastguard Worker         } break;
122*ec779b8eSAndroid Build Coastguard Worker         case CLOSE: {
123*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IDataSource, data, reply);
124*ec779b8eSAndroid Build Coastguard Worker             close();
125*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
126*ec779b8eSAndroid Build Coastguard Worker         } break;
127*ec779b8eSAndroid Build Coastguard Worker         case GET_FLAGS: {
128*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IDataSource, data, reply);
129*ec779b8eSAndroid Build Coastguard Worker             reply->writeUint32(getFlags());
130*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
131*ec779b8eSAndroid Build Coastguard Worker         } break;
132*ec779b8eSAndroid Build Coastguard Worker         case TO_STRING: {
133*ec779b8eSAndroid Build Coastguard Worker             CHECK_INTERFACE(IDataSource, data, reply);
134*ec779b8eSAndroid Build Coastguard Worker             reply->writeString8(toString());
135*ec779b8eSAndroid Build Coastguard Worker             return NO_ERROR;
136*ec779b8eSAndroid Build Coastguard Worker         } break;
137*ec779b8eSAndroid Build Coastguard Worker 
138*ec779b8eSAndroid Build Coastguard Worker         default:
139*ec779b8eSAndroid Build Coastguard Worker             return BBinder::onTransact(code, data, reply, flags);
140*ec779b8eSAndroid Build Coastguard Worker     }
141*ec779b8eSAndroid Build Coastguard Worker }
142*ec779b8eSAndroid Build Coastguard Worker 
143*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
144