blob: 85362fd8d8300d18c1a4e97cec68bc6e0468806d [file] [log] [blame]
Marco Nelissenb2487f02015-09-01 13:23:23 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_NDEBUG 0
18#define LOG_TAG "BpMediaExtractor"
19#include <utils/Log.h>
20
21#include <stdint.h>
22#include <sys/types.h>
23
24#include <binder/Parcel.h>
25#include <media/IMediaExtractor.h>
26#include <media/stagefright/MetaData.h>
27
28namespace android {
29
30enum {
31 COUNTTRACKS = IBinder::FIRST_CALL_TRANSACTION,
32 GETTRACK,
33 GETTRACKMETADATA,
34 GETMETADATA,
35 FLAGS,
36 SETDRMFLAG,
37 GETDRMFLAG,
38 GETDRMTRACKINFO,
39 SETUID,
40 NAME
41};
42
43class BpMediaExtractor : public BpInterface<IMediaExtractor> {
44public:
45 BpMediaExtractor(const sp<IBinder>& impl)
46 : BpInterface<IMediaExtractor>(impl)
47 {
48 }
49
50 virtual size_t countTracks() {
51 ALOGV("countTracks");
52 Parcel data, reply;
53 data.writeInterfaceToken(BpMediaExtractor::getInterfaceDescriptor());
54 status_t ret = remote()->transact(COUNTTRACKS, data, &reply);
55 size_t numTracks = 0;
56 if (ret == NO_ERROR) {
57 numTracks = reply.readUint32();
58 }
59 return numTracks;
60 }
61 virtual sp<IMediaSource> getTrack(size_t index) {
62 ALOGV("getTrack(%zu)", index);
63 Parcel data, reply;
64 data.writeInterfaceToken(BpMediaExtractor::getInterfaceDescriptor());
65 data.writeUint32(index);
66 status_t ret = remote()->transact(GETTRACK, data, &reply);
67 if (ret == NO_ERROR) {
68 return interface_cast<IMediaSource>(reply.readStrongBinder());
69 }
70 return NULL;
71 }
72
73 virtual sp<MetaData> getTrackMetaData(
74 size_t index, uint32_t flags) {
75 ALOGV("getTrackMetaData(%zu, %u)", index, flags);
76 Parcel data, reply;
77 data.writeInterfaceToken(BpMediaExtractor::getInterfaceDescriptor());
78 data.writeUint32(index);
79 data.writeUint32(flags);
80 status_t ret = remote()->transact(GETTRACKMETADATA, data, &reply);
81 if (ret == NO_ERROR) {
82 return MetaData::createFromParcel(reply);
83 }
84 return NULL;
85 }
86
87 virtual sp<MetaData> getMetaData() {
88 ALOGV("getMetaData");
89 Parcel data, reply;
90 data.writeInterfaceToken(BpMediaExtractor::getInterfaceDescriptor());
91 status_t ret = remote()->transact(GETMETADATA, data, &reply);
92 if (ret == NO_ERROR) {
93 return MetaData::createFromParcel(reply);
94 }
95 return NULL;
96 }
97
98 virtual uint32_t flags() const {
99 ALOGV("flags NOT IMPLEMENTED");
100 return 0;
101 }
102
103 virtual void setDrmFlag(bool flag __unused) {
104 ALOGV("setDrmFlag NOT IMPLEMENTED");
105 }
106 virtual bool getDrmFlag() {
107 ALOGV("getDrmFlag NOT IMPLEMENTED");
108 return false;
109 }
110 virtual char* getDrmTrackInfo(size_t trackID __unused, int *len __unused) {
111 ALOGV("getDrmTrackInfo NOT IMPLEMENTED");
112 return NULL;
113 }
114 virtual void setUID(uid_t uid __unused) {
115 ALOGV("setUID NOT IMPLEMENTED");
116 }
117
118 virtual const char * name() {
119 ALOGV("name NOT IMPLEMENTED");
120 return NULL;
121 }
122};
123
124IMPLEMENT_META_INTERFACE(MediaExtractor, "android.media.IMediaExtractor");
125
126#undef LOG_TAG
127#define LOG_TAG "BnMediaExtractor"
128
129status_t BnMediaExtractor::onTransact(
130 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
131{
132 switch (code) {
133 case COUNTTRACKS: {
134 ALOGV("countTracks");
135 CHECK_INTERFACE(IMediaExtractor, data, reply);
136 size_t numTracks = countTracks();
137 if (numTracks > INT32_MAX) {
138 numTracks = 0;
139 }
140 reply->writeUint32(uint32_t(numTracks));
141 return NO_ERROR;
142 }
143 case GETTRACK: {
144 ALOGV("getTrack()");
145 CHECK_INTERFACE(IMediaExtractor, data, reply);
146 uint32_t idx;
147 if (data.readUint32(&idx) == NO_ERROR) {
148 return reply->writeStrongBinder(IInterface::asBinder(getTrack((size_t(idx)))));
149 }
150 return UNKNOWN_ERROR;
151 }
152 case GETTRACKMETADATA: {
153 ALOGV("getTrackMetaData");
154 CHECK_INTERFACE(IMediaExtractor, data, reply);
155 uint32_t idx;
156 uint32_t flags;
157 if (data.readUint32(&idx) == NO_ERROR &&
158 data.readUint32(&flags) == NO_ERROR) {
159 sp<MetaData> meta = getTrackMetaData(idx, flags);
160 meta->writeToParcel(*reply);
161 return NO_ERROR;
162 }
163 return UNKNOWN_ERROR;
164 }
165 case GETMETADATA: {
166 ALOGV("getMetaData");
167 CHECK_INTERFACE(IMediaExtractor, data, reply);
168 sp<MetaData> meta = getMetaData();
169 if (meta != NULL) {
170 meta->writeToParcel(*reply);
171 return NO_ERROR;
172 }
173 return UNKNOWN_ERROR;
174 }
175 default:
176 return BBinder::onTransact(code, data, reply, flags);
177 }
178}
179
180
181} // namespace android
182