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;
26e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct 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,
40da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber    };
41da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber    virtual uint32_t flags() const { return 0; }
42e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
43e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
44e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct IStreamListener : public IInterface {
45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    DECLARE_META_INTERFACE(StreamListener);
46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
47e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    enum Command {
4814acc736e336cbd6026df781d4f411e908831815Andreas Huber        EOS,
49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        DISCONTINUITY,
50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    };
51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void queueBuffer(size_t index, size_t size) = 0;
5314acc736e336cbd6026df781d4f411e908831815Andreas Huber
5432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    // When signalling a discontinuity you can optionally
5532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    // specify an int64_t PTS timestamp in "msg".
5632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    // If present, rendering of data following the discontinuity
5732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    // will be suppressed until media time reaches this timestamp.
5832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    static const char *const kKeyResumeAtPTS;
5932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6042e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber    // When signalling a discontinuity you can optionally
61bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // specify the type(s) of discontinuity, i.e. if the
62bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // audio format has changed, the video format has changed,
63bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // time has jumped or any combination thereof.
64bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // To do so, include a non-zero int32_t value
65bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // under the key "kKeyDiscontinuityMask" when issuing the DISCONTINUITY
6642e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber    // command.
67bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // If there is a change in audio/video format, The new logical stream
68bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // must start with proper codec initialization
6942e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber    // information for playback to continue, i.e. SPS and PPS in the case
7042e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber    // of AVC video etc.
71bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // If this key is not present, only a time discontinuity is assumed.
72bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // The value should be a bitmask of values from
73bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    // ATSParser::DiscontinuityType.
74bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huber    static const char *const kKeyDiscontinuityMask;
7542e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber
7614acc736e336cbd6026df781d4f411e908831815Andreas Huber    virtual void issueCommand(
7714acc736e336cbd6026df781d4f411e908831815Andreas Huber            Command cmd, bool synchronous, const sp<AMessage> &msg = NULL) = 0;
78e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
79e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
80e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber////////////////////////////////////////////////////////////////////////////////
81e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
82e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BnStreamSource : public BnInterface<IStreamSource> {
83e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual status_t onTransact(
84e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
85e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            uint32_t flags = 0);
86e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
87e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
88e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BnStreamListener : public BnInterface<IStreamListener> {
89e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual status_t onTransact(
90e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
91e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            uint32_t flags = 0);
92e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
93e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
94e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}  // namespace android
95e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
96e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#endif  // ANDROID_ISTREAMSOURCE_H_
97