1e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber/* 2e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * 4e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * you may not use this file except in compliance with the License. 6e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * You may obtain a copy of the License at 7e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * 8e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * 10e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * See the License for the specific language governing permissions and 14e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * limitations under the License. 15e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber */ 16e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 17e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber//#define LOG_NDEBUG 0 18e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#define LOG_TAG "IStreamSource" 19e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <utils/Log.h> 20e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 21e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/IStreamSource.h> 2214acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h> 23e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 24e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <binder/IMemory.h> 25e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <binder/Parcel.h> 26e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 27e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubernamespace android { 28e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 2932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber// static 3032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huberconst char *const IStreamListener::kKeyResumeAtPTS = "resume-at-PTS"; 3132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 3242e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber// static 33bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huberconst char *const IStreamListener::kKeyDiscontinuityMask = "discontinuity-mask"; 3442e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber 35a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber// static 36a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huberconst char *const IStreamListener::kKeyMediaTimeUs = "media-time-us"; 37a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber 38e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberenum { 39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber // IStreamSource 40e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber SET_LISTENER = IBinder::FIRST_CALL_TRANSACTION, 41e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber SET_BUFFERS, 42e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber ON_BUFFER_AVAILABLE, 43330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber FLAGS, 44e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber // IStreamListener 46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber QUEUE_BUFFER, 4714acc736e336cbd6026df781d4f411e908831815Andreas Huber ISSUE_COMMAND, 48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamSource : public BpInterface<IStreamSource> { 51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber BpStreamSource(const sp<IBinder> &impl) 52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber : BpInterface<IStreamSource>(impl) { 53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void setListener(const sp<IStreamListener> &listener) { 56e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 57e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor()); 58e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeStrongBinder(listener->asBinder()); 59e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber remote()->transact(SET_LISTENER, data, &reply); 60e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 61e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 62e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void setBuffers(const Vector<sp<IMemory> > &buffers) { 63e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 64e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor()); 65e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(static_cast<int64_t>(buffers.size())); 66e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber for (size_t i = 0; i < buffers.size(); ++i) { 67e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeStrongBinder(buffers.itemAt(i)->asBinder()); 68e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 69e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber remote()->transact(SET_BUFFERS, data, &reply); 70e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 71e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 72e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void onBufferAvailable(size_t index) { 73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 74e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor()); 75e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(static_cast<int64_t>(index)); 76e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber remote()->transact( 77e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber ON_BUFFER_AVAILABLE, data, &reply, IBinder::FLAG_ONEWAY); 78e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 79330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber 80330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber virtual uint32_t flags() const { 81330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber Parcel data, reply; 82330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor()); 83330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber remote()->transact(FLAGS, data, &reply); 84330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber 85330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber return reply.readInt32(); 86330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber } 87e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 88e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 89e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamSource, "android.hardware.IStreamSource"); 90e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 91e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamSource::onTransact( 92e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 93e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber switch (code) { 94e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case SET_LISTENER: 95e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 96e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamSource, data, reply); 97e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber setListener( 98e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber interface_cast<IStreamListener>(data.readStrongBinder())); 99e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 100e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 101e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 102e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case SET_BUFFERS: 103e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 104e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamSource, data, reply); 105e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten size_t n = static_cast<size_t>(data.readInt64()); 106e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Vector<sp<IMemory> > buffers; 107e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber for (size_t i = 0; i < n; ++i) { 108e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<IMemory> mem = 109e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber buffers.push(mem); 112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber setBuffers(buffers); 114e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 115e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 116e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 117e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case ON_BUFFER_AVAILABLE: 118e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamSource, data, reply); 120e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten onBufferAvailable(static_cast<size_t>(data.readInt64())); 121e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 122e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 123e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 124330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber case FLAGS: 125330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber { 126330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber CHECK_INTERFACE(IStreamSource, data, reply); 127330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber reply->writeInt32(this->flags()); 128330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber break; 129330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber } 130330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber 131e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber default: 132e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return BBinder::onTransact(code, data, reply, flags); 133e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 134e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 135e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return OK; 136e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 137e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 138e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber//////////////////////////////////////////////////////////////////////////////// 139e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 140e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamListener : public BpInterface<IStreamListener> { 141e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber BpStreamListener(const sp<IBinder> &impl) 142e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber : BpInterface<IStreamListener>(impl) { 143e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 144e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 145e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void queueBuffer(size_t index, size_t size) { 146e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 147e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor()); 148e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(static_cast<int64_t>(index)); 149e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(static_cast<int64_t>(size)); 150e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 151e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber remote()->transact(QUEUE_BUFFER, data, &reply, IBinder::FLAG_ONEWAY); 152e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 153e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 15414acc736e336cbd6026df781d4f411e908831815Andreas Huber virtual void issueCommand( 15514acc736e336cbd6026df781d4f411e908831815Andreas Huber Command cmd, bool synchronous, const sp<AMessage> &msg) { 156e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 157e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor()); 158e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInt32(static_cast<int32_t>(cmd)); 15914acc736e336cbd6026df781d4f411e908831815Andreas Huber data.writeInt32(static_cast<int32_t>(synchronous)); 160e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 16114acc736e336cbd6026df781d4f411e908831815Andreas Huber if (msg != NULL) { 16214acc736e336cbd6026df781d4f411e908831815Andreas Huber data.writeInt32(1); 16314acc736e336cbd6026df781d4f411e908831815Andreas Huber msg->writeToParcel(&data); 16414acc736e336cbd6026df781d4f411e908831815Andreas Huber } else { 16514acc736e336cbd6026df781d4f411e908831815Andreas Huber data.writeInt32(0); 16614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 16714acc736e336cbd6026df781d4f411e908831815Andreas Huber 16814acc736e336cbd6026df781d4f411e908831815Andreas Huber remote()->transact(ISSUE_COMMAND, data, &reply, IBinder::FLAG_ONEWAY); 169e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 170e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 171e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 172e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamListener, "android.hardware.IStreamListener"); 173e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 174e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamListener::onTransact( 175e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 176e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber switch (code) { 177e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case QUEUE_BUFFER: 178e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 179e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamListener, data, reply); 180e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten size_t index = static_cast<size_t>(data.readInt64()); 181e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten size_t size = static_cast<size_t>(data.readInt64()); 182e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 183e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber queueBuffer(index, size); 184e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 185e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 186e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 18714acc736e336cbd6026df781d4f411e908831815Andreas Huber case ISSUE_COMMAND: 188e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 189e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamListener, data, reply); 190e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Command cmd = static_cast<Command>(data.readInt32()); 191e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 19214acc736e336cbd6026df781d4f411e908831815Andreas Huber bool synchronous = static_cast<bool>(data.readInt32()); 19314acc736e336cbd6026df781d4f411e908831815Andreas Huber 19414acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> msg; 19514acc736e336cbd6026df781d4f411e908831815Andreas Huber 19614acc736e336cbd6026df781d4f411e908831815Andreas Huber if (data.readInt32()) { 19714acc736e336cbd6026df781d4f411e908831815Andreas Huber msg = AMessage::FromParcel(data); 19814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 19914acc736e336cbd6026df781d4f411e908831815Andreas Huber 20014acc736e336cbd6026df781d4f411e908831815Andreas Huber issueCommand(cmd, synchronous, msg); 201e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 202e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 203e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 204e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber default: 205e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return BBinder::onTransact(code, data, reply, flags); 206e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 207e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 208e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return OK; 209e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 210e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 211e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} // namespace android 212