NuPlayerSource.h revision 9737d3497f6ef8bf6a1083aabd8a03569944795d
1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2010 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License.
6ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * You may obtain a copy of the License at
7fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski *
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
92c72b6822debb08fe997926eedc110f62d287d34Adam Lesinski *
102c72b6822debb08fe997926eedc110f62d287d34Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License.
152c72b6822debb08fe997926eedc110f62d287d34Adam Lesinski */
162c72b6822debb08fe997926eedc110f62d287d34Adam Lesinski
172c72b6822debb08fe997926eedc110f62d287d34Adam Lesinski#ifndef NUPLAYER_SOURCE_H_
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
192c72b6822debb08fe997926eedc110f62d287d34Adam Lesinski#define NUPLAYER_SOURCE_H_
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
212c72b6822debb08fe997926eedc110f62d287d34Adam Lesinski#include "NuPlayer.h"
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <media/stagefright/foundation/AMessage.h>
242c72b6822debb08fe997926eedc110f62d287d34Adam Lesinski#include <media/stagefright/MetaData.h>
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <media/mediaplayer.h>
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/Vector.h>
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
28ad751224401564dcc8338df3d5c4c5de7722be8fAdam Lesinskinamespace android {
29ad751224401564dcc8338df3d5c4c5de7722be8fAdam Lesinski
30ad751224401564dcc8338df3d5c4c5de7722be8fAdam Lesinskistruct ABuffer;
31ad751224401564dcc8338df3d5c4c5de7722be8fAdam Lesinskiclass MediaBuffer;
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskistruct NuPlayer::Source : public AHandler {
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    enum Flags {
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FLAG_CAN_PAUSE          = 1,
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FLAG_CAN_SEEK_BACKWARD  = 2,  // the "10 sec back button"
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FLAG_CAN_SEEK_FORWARD   = 4,  // the "10 sec forward button"
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FLAG_CAN_SEEK           = 8,  // the "seek bar"
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FLAG_DYNAMIC_DURATION   = 16,
40ad751224401564dcc8338df3d5c4c5de7722be8fAdam Lesinski        FLAG_SECURE             = 32,
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        FLAG_PROTECTED          = 64,
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    enum {
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatPrepared,
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatFlagsChanged,
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatVideoSizeChanged,
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatBufferingUpdate,
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatPauseOnBufferingStart,
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatResumeOnBufferingEnd,
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatCacheStats,
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatSubtitleData,
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatTimedTextData,
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatTimedMetaData,
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatQueueDecoderShutdown,
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatDrmNoLicense,
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kWhatInstantiateSecureDecoders,
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // The provides message is used to notify the player about various
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // events.
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    explicit Source(const sp<AMessage> &notify)
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        : mNotify(notify) {
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void prepareAsync() = 0;
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void start() = 0;
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void stop() {}
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void pause() {}
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void resume() {}
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Explicitly disconnect the underling data source
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void disconnect() {}
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Returns OK iff more data was available,
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // an error or ERROR_END_OF_STREAM if not.
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual status_t feedMoreTSData() = 0;
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Returns non-NULL format when the specified track exists.
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // When the format has "err" set to -EWOULDBLOCK, source needs more time to get valid meta data.
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // Returns NULL if the specified track doesn't exist or is invalid;
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual sp<AMessage> getFormat(bool audio);
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual sp<MetaData> getFormatMeta(bool /* audio */) { return NULL; }
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual sp<MetaData> getFileFormatMeta() const { return NULL; }
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual status_t dequeueAccessUnit(
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            bool audio, sp<ABuffer> *accessUnit) = 0;
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual status_t getDuration(int64_t * /* durationUs */) {
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return INVALID_OPERATION;
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual size_t getTrackCount() const {
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual sp<AMessage> getTrackInfo(size_t /* trackIndex */) const {
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return NULL;
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ssize_t getSelectedTrack(media_track_type /* type */) const {
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return INVALID_OPERATION;
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual status_t selectTrack(size_t /* trackIndex */, bool /* select */, int64_t /* timeUs*/) {
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return INVALID_OPERATION;
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual status_t seekTo(
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int64_t /* seekTimeUs */,
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            MediaPlayerSeekMode /* mode */ = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) {
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return INVALID_OPERATION;
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual status_t setBuffers(bool /* audio */, Vector<MediaBuffer *> &/* buffers */) {
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return INVALID_OPERATION;
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool isRealTime() const {
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool isStreaming() const {
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void setOffloadAudio(bool /* offload */) {}
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprotected:
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~Source() {}
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void onMessageReceived(const sp<AMessage> &msg);
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AMessage> dupNotify() const { return mNotify->dup(); }
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void notifyFlagsChanged(uint32_t flags);
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void notifyVideoSizeChanged(const sp<AMessage> &format = NULL);
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void notifyInstantiateSecureDecoders(const sp<AMessage> &reply);
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void notifyPrepared(status_t err = OK);
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    sp<AMessage> mNotify;
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    DISALLOW_EVIL_CONSTRUCTORS(Source);
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}  // namespace android
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif  // NUPLAYER_SOURCE_H_
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski