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#ifndef ANDROID_ISTREAMSOURCE_H_ 18e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 19e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#define ANDROID_ISTREAMSOURCE_H_ 20e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 21e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <binder/IInterface.h> 22e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 23e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubernamespace android { 24e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 2514acc736e336cbd6026df781d4f411e908831815Andreas Huberstruct AMessage; 26ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IMemory; 27e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct IStreamListener; 28e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 29e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct IStreamSource : public IInterface { 30e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber DECLARE_META_INTERFACE(StreamSource); 31e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 32e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void setListener(const sp<IStreamListener> &listener) = 0; 33e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void setBuffers(const Vector<sp<IMemory> > &buffers) = 0; 34e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void onBufferAvailable(size_t index) = 0; 36da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber 37da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber enum { 38da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber // Video PES packets contain exactly one (aligned) access unit. 39da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber kFlagAlignedVideoData = 1, 40d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 41d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber // Timestamps are in ALooper::GetNowUs() units. 42d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber kFlagIsRealTimeData = 2, 43da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber }; 44da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber virtual uint32_t flags() const { return 0; } 45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 47e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct IStreamListener : public IInterface { 48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber DECLARE_META_INTERFACE(StreamListener); 49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber enum Command { 5114acc736e336cbd6026df781d4f411e908831815Andreas Huber EOS, 52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber DISCONTINUITY, 53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber }; 54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual void queueBuffer(size_t index, size_t size) = 0; 5614acc736e336cbd6026df781d4f411e908831815Andreas Huber 5732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber // When signalling a discontinuity you can optionally 5832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber // specify an int64_t PTS timestamp in "msg". 5932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber // If present, rendering of data following the discontinuity 6032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber // will be suppressed until media time reaches this timestamp. 6132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber static const char *const kKeyResumeAtPTS; 6232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6342e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber // When signalling a discontinuity you can optionally 64bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // specify the type(s) of discontinuity, i.e. if the 65bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // audio format has changed, the video format has changed, 66bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // time has jumped or any combination thereof. 67bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // To do so, include a non-zero int32_t value 68bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // under the key "kKeyDiscontinuityMask" when issuing the DISCONTINUITY 6942e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber // command. 70bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // If there is a change in audio/video format, The new logical stream 71bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // must start with proper codec initialization 7242e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber // information for playback to continue, i.e. SPS and PPS in the case 7342e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber // of AVC video etc. 74bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // If this key is not present, only a time discontinuity is assumed. 75bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // The value should be a bitmask of values from 76bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber // ATSParser::DiscontinuityType. 77bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber static const char *const kKeyDiscontinuityMask; 7842e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber 79b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber // Optionally signalled as part of a discontinuity that includes 80b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber // DISCONTINUITY_TIME. It indicates the media time (in us) to be associated 81b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber // with the next PTS occuring in the stream. The value is of type int64_t. 82b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber static const char *const kKeyMediaTimeUs; 83b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 84d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang // Optionally signalled as part of a discontinuity that includes 85d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang // DISCONTINUITY_TIME. It indicates the media time (in us) of a recent 86d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang // sample from the same content, and is used as a hint for the parser to 87d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang // handle PTS wraparound. This is required when a new parser is created 88d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang // to continue parsing content from the same timeline. 89d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang static const char *const kKeyRecentMediaTimeUs; 90d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang 9114acc736e336cbd6026df781d4f411e908831815Andreas Huber virtual void issueCommand( 9214acc736e336cbd6026df781d4f411e908831815Andreas Huber Command cmd, bool synchronous, const sp<AMessage> &msg = NULL) = 0; 93e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 94e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 95e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber//////////////////////////////////////////////////////////////////////////////// 96e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 97e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BnStreamSource : public BnInterface<IStreamSource> { 98e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual status_t onTransact( 99e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 100e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t flags = 0); 101e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 102e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 103e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BnStreamListener : public BnInterface<IStreamListener> { 104e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber virtual status_t onTransact( 105e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, 106e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t flags = 0); 107e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}; 108e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 109e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} // namespace android 110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#endif // ANDROID_ISTREAMSOURCE_H_ 112