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 35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberenum { 36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber // IStreamSource 37e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber SET_LISTENER = IBinder::FIRST_CALL_TRANSACTION, 38e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber SET_BUFFERS, 39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber ON_BUFFER_AVAILABLE, 40da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber FLAGS, 41e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 42e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber // IStreamListener 43e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber QUEUE_BUFFER, 4414acc736e336cbd6026df781d4f411e908831815Andreas Huber ISSUE_COMMAND, 45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 47e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamSource : public BpInterface<IStreamSource> { 48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber BpStreamSource(const sp<IBinder> &impl) 49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber : BpInterface<IStreamSource>(impl) { 50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void setListener(const sp<IStreamListener> &listener) { 53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor()); 55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeStrongBinder(listener->asBinder()); 56e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber remote()->transact(SET_LISTENER, data, &reply); 57e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 58e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 59e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void setBuffers(const Vector<sp<IMemory> > &buffers) { 60e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 61e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor()); 62e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInt32(static_cast<int32_t>(buffers.size())); 63e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber for (size_t i = 0; i < buffers.size(); ++i) { 64e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeStrongBinder(buffers.itemAt(i)->asBinder()); 65e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 66e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber remote()->transact(SET_BUFFERS, data, &reply); 67e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 68e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 69e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void onBufferAvailable(size_t index) { 70e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 71e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor()); 72e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInt32(static_cast<int32_t>(index)); 73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber remote()->transact( 74e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber ON_BUFFER_AVAILABLE, data, &reply, IBinder::FLAG_ONEWAY); 75e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 76da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber 77da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber virtual uint32_t flags() const { 78da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber Parcel data, reply; 79da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor()); 80da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber remote()->transact(FLAGS, data, &reply); 81da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber 82da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber return reply.readInt32(); 83da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber } 84e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 85e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 86e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamSource, "android.hardware.IStreamSource"); 87e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 88e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamSource::onTransact( 89e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 90e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber switch (code) { 91e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case SET_LISTENER: 92e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 93e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamSource, data, reply); 94e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber setListener( 95e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber interface_cast<IStreamListener>(data.readStrongBinder())); 96e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 97e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 98e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 99e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case SET_BUFFERS: 100e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 101e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamSource, data, reply); 102e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber size_t n = static_cast<size_t>(data.readInt32()); 103e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Vector<sp<IMemory> > buffers; 104e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber for (size_t i = 0; i < n; ++i) { 105e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber sp<IMemory> mem = 106e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber interface_cast<IMemory>(data.readStrongBinder()); 107e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 108e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber buffers.push(mem); 109e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber setBuffers(buffers); 111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 114e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case ON_BUFFER_AVAILABLE: 115e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 116e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamSource, data, reply); 117e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber onBufferAvailable(static_cast<size_t>(data.readInt32())); 118e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 120e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 121da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber case FLAGS: 122da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber { 123da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber CHECK_INTERFACE(IStreamSource, data, reply); 124da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber reply->writeInt32(this->flags()); 125da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber break; 126da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber } 127da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber 128e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber default: 129e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return BBinder::onTransact(code, data, reply, flags); 130e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 131e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 132e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return OK; 133e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 134e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 135e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber//////////////////////////////////////////////////////////////////////////////// 136e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 137e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamListener : public BpInterface<IStreamListener> { 138e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber BpStreamListener(const sp<IBinder> &impl) 139e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber : BpInterface<IStreamListener>(impl) { 140e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 141e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 142e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void queueBuffer(size_t index, size_t size) { 143e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 144e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor()); 145e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInt32(static_cast<int32_t>(index)); 146e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInt32(static_cast<int32_t>(size)); 147e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 148e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber remote()->transact(QUEUE_BUFFER, data, &reply, IBinder::FLAG_ONEWAY); 149e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 150e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 15114acc736e336cbd6026df781d4f411e908831815Andreas Huber virtual void issueCommand( 15214acc736e336cbd6026df781d4f411e908831815Andreas Huber Command cmd, bool synchronous, const sp<AMessage> &msg) { 153e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Parcel data, reply; 154e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor()); 155e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber data.writeInt32(static_cast<int32_t>(cmd)); 15614acc736e336cbd6026df781d4f411e908831815Andreas Huber data.writeInt32(static_cast<int32_t>(synchronous)); 157e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 15814acc736e336cbd6026df781d4f411e908831815Andreas Huber if (msg != NULL) { 15914acc736e336cbd6026df781d4f411e908831815Andreas Huber data.writeInt32(1); 16014acc736e336cbd6026df781d4f411e908831815Andreas Huber msg->writeToParcel(&data); 16114acc736e336cbd6026df781d4f411e908831815Andreas Huber } else { 16214acc736e336cbd6026df781d4f411e908831815Andreas Huber data.writeInt32(0); 16314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 16414acc736e336cbd6026df781d4f411e908831815Andreas Huber 16514acc736e336cbd6026df781d4f411e908831815Andreas Huber remote()->transact(ISSUE_COMMAND, data, &reply, IBinder::FLAG_ONEWAY); 166e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 167e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 168e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 169e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamListener, "android.hardware.IStreamListener"); 170e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 171e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamListener::onTransact( 172e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 173e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber switch (code) { 174e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case QUEUE_BUFFER: 175e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 176e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamListener, data, reply); 177e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber size_t index = static_cast<size_t>(data.readInt32()); 178e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber size_t size = static_cast<size_t>(data.readInt32()); 179e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 180e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber queueBuffer(index, size); 181e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 182e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 183e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 18414acc736e336cbd6026df781d4f411e908831815Andreas Huber case ISSUE_COMMAND: 185e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber { 186e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_INTERFACE(IStreamListener, data, reply); 187e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Command cmd = static_cast<Command>(data.readInt32()); 188e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 18914acc736e336cbd6026df781d4f411e908831815Andreas Huber bool synchronous = static_cast<bool>(data.readInt32()); 19014acc736e336cbd6026df781d4f411e908831815Andreas Huber 19114acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> msg; 19214acc736e336cbd6026df781d4f411e908831815Andreas Huber 19314acc736e336cbd6026df781d4f411e908831815Andreas Huber if (data.readInt32()) { 19414acc736e336cbd6026df781d4f411e908831815Andreas Huber msg = AMessage::FromParcel(data); 19514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 19614acc736e336cbd6026df781d4f411e908831815Andreas Huber 19714acc736e336cbd6026df781d4f411e908831815Andreas Huber issueCommand(cmd, synchronous, msg); 198e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 199e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 200e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 201e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber default: 202e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return BBinder::onTransact(code, data, reply, flags); 203e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 204e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 205e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return OK; 206e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 207e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 208e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} // namespace android 209