15bc087c573c70c84c6a39946457590b42d392a33Andreas Huber/*
25bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Copyright (C) 2010 The Android Open Source Project
35bc087c573c70c84c6a39946457590b42d392a33Andreas Huber *
45bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
55bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * you may not use this file except in compliance with the License.
65bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * You may obtain a copy of the License at
75bc087c573c70c84c6a39946457590b42d392a33Andreas Huber *
85bc087c573c70c84c6a39946457590b42d392a33Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
95bc087c573c70c84c6a39946457590b42d392a33Andreas Huber *
105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * Unless required by applicable law or agreed to in writing, software
115bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
125bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * See the License for the specific language governing permissions and
145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber * limitations under the License.
155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber */
165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#ifndef NUPLAYER_SOURCE_H_
185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#define NUPLAYER_SOURCE_H_
205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayer.h"
225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
23cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania#include <media/ICrypto.h>
24cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania#include <media/mediaplayer.h>
25b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber#include <media/stagefright/foundation/AMessage.h>
26cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar#include <media/stagefright/MetaData.h>
27cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar#include <utils/Vector.h>
28b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
295bc087c573c70c84c6a39946457590b42d392a33Andreas Hubernamespace android {
305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
315bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstruct ABuffer;
32ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass MediaBuffer;
335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
34b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huberstruct NuPlayer::Source : public AHandler {
35b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    enum Flags {
369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        FLAG_CAN_PAUSE          = 1,
379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        FLAG_CAN_SEEK_BACKWARD  = 2,  // the "10 sec back button"
389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        FLAG_CAN_SEEK_FORWARD   = 4,  // the "10 sec forward button"
399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        FLAG_CAN_SEEK           = 8,  // the "seek bar"
409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        FLAG_DYNAMIC_DURATION   = 16,
41838be3907fc58eab119d7093a3d73be7267bd4d2Hassan Shojania        FLAG_SECURE             = 32, // Secure codec is required.
42838be3907fc58eab119d7093a3d73be7267bd4d2Hassan Shojania        FLAG_PROTECTED          = 64, // The screen needs to be protected (screenshot is disabled).
439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    };
449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    enum {
469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        kWhatPrepared,
479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        kWhatFlagsChanged,
489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        kWhatVideoSizeChanged,
492a3cc9a64330dd36e466fe5e1b634146f2d641c1Chong Zhang        kWhatBufferingUpdate,
50efbb61950db36a5eb789be83f077246172507c67Chong Zhang        kWhatPauseOnBufferingStart,
51efbb61950db36a5eb789be83f077246172507c67Chong Zhang        kWhatResumeOnBufferingEnd,
52efbb61950db36a5eb789be83f077246172507c67Chong Zhang        kWhatCacheStats,
53dcb89b3b505522efde173c105a851c412f947178Chong Zhang        kWhatSubtitleData,
54d3b0bbb8a37f90fba84eb4e95c58aa0fec6c51e7Robert Shih        kWhatTimedTextData,
550852843d304006e3ab333081fddda13b07193de8Robert Shih        kWhatTimedMetaData,
5614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatQueueDecoderShutdown,
57802768790c131f8237364906fd13981a6bb91193Ronghua Wu        kWhatDrmNoLicense,
58fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar        kWhatInstantiateSecureDecoders,
59cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        // Modular DRM
60cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        kWhatDrmInfo,
61b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    };
62b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
63b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    // The provides message is used to notify the player about various
64b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    // events.
65e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh    explicit Source(const sp<AMessage> &notify)
66b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber        : mNotify(notify) {
67b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    }
685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
6948fa06d1e80a872c7495804979256e021e566ae0Wei Jia    virtual status_t getDefaultBufferingSettings(
7048fa06d1e80a872c7495804979256e021e566ae0Wei Jia            BufferingSettings* buffering /* nonnull */) = 0;
7148fa06d1e80a872c7495804979256e021e566ae0Wei Jia    virtual status_t setBufferingSettings(const BufferingSettings& buffering) = 0;
7248fa06d1e80a872c7495804979256e021e566ae0Wei Jia
739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    virtual void prepareAsync() = 0;
749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    virtual void start() = 0;
762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual void stop() {}
77fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson    virtual void pause() {}
78fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson    virtual void resume() {}
795bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
8048296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang    // Explicitly disconnect the underling data source
8148296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang    virtual void disconnect() {}
8248296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang
83eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber    // Returns OK iff more data was available,
84eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber    // an error or ERROR_END_OF_STREAM if not.
85eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber    virtual status_t feedMoreTSData() = 0;
865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
879737d3497f6ef8bf6a1083aabd8a03569944795dWei Jia    // Returns non-NULL format when the specified track exists.
889737d3497f6ef8bf6a1083aabd8a03569944795dWei Jia    // When the format has "err" set to -EWOULDBLOCK, source needs more time to get valid meta data.
899737d3497f6ef8bf6a1083aabd8a03569944795dWei Jia    // Returns NULL if the specified track doesn't exist or is invalid;
90840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    virtual sp<AMessage> getFormat(bool audio);
919737d3497f6ef8bf6a1083aabd8a03569944795dWei Jia
92bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia    virtual sp<MetaData> getFormatMeta(bool /* audio */) { return NULL; }
93f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    virtual sp<MetaData> getFileFormatMeta() const { return NULL; }
945bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
955bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    virtual status_t dequeueAccessUnit(
965bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            bool audio, sp<ABuffer> *accessUnit) = 0;
975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
9884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber    virtual status_t getDuration(int64_t * /* durationUs */) {
9943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return INVALID_OPERATION;
10043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
10143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
102404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    virtual size_t getTrackCount() const {
103404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang        return 0;
104404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    }
105404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang
106404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    virtual sp<AMessage> getTrackInfo(size_t /* trackIndex */) const {
107404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang        return NULL;
108dcb89b3b505522efde173c105a851c412f947178Chong Zhang    }
109dcb89b3b505522efde173c105a851c412f947178Chong Zhang
1107c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih    virtual ssize_t getSelectedTrack(media_track_type /* type */) const {
1117c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih        return INVALID_OPERATION;
1127c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih    }
1137c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih
1146ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih    virtual status_t selectTrack(size_t /* trackIndex */, bool /* select */, int64_t /* timeUs*/) {
115dcb89b3b505522efde173c105a851c412f947178Chong Zhang        return INVALID_OPERATION;
116dcb89b3b505522efde173c105a851c412f947178Chong Zhang    }
117dcb89b3b505522efde173c105a851c412f947178Chong Zhang
118c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    virtual status_t seekTo(
119c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            int64_t /* seekTimeUs */,
120c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            MediaPlayerSeekMode /* mode */ = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) {
12143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        return INVALID_OPERATION;
12243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
12343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
124cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar    virtual status_t setBuffers(bool /* audio */, Vector<MediaBuffer *> &/* buffers */) {
125cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar        return INVALID_OPERATION;
126cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar    }
127cc227036b05f7c2f960a89c567a61f9decefe742Lajos Molnar
128d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    virtual bool isRealTime() const {
129d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber        return false;
130d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber    }
131d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
13202cb98d726b97d8e6dbb9c6c60d32a3cedc7f82dRonghua Wu    virtual bool isStreaming() const {
13302cb98d726b97d8e6dbb9c6c60d32a3cedc7f82dRonghua Wu        return true;
13402cb98d726b97d8e6dbb9c6c60d32a3cedc7f82dRonghua Wu    }
13502cb98d726b97d8e6dbb9c6c60d32a3cedc7f82dRonghua Wu
13614532f2383c3849d0db59a607ed0bd802f57155cWei Jia    virtual void setOffloadAudio(bool /* offload */) {}
13714532f2383c3849d0db59a607ed0bd802f57155cWei Jia
138cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    // Modular DRM
139cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    virtual status_t prepareDrm(
140cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania            const uint8_t /*uuid*/[16], const Vector<uint8_t> &/*drmSessionId*/,
141cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania            sp<ICrypto> */*crypto*/) {
142cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        return INVALID_OPERATION;
143cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    }
144cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
145cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    virtual status_t releaseDrm() {
146cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        return INVALID_OPERATION;
147cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    }
148cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
1495bc087c573c70c84c6a39946457590b42d392a33Andreas Huberprotected:
1505bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    virtual ~Source() {}
1515bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
152b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
153b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
154b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<AMessage> dupNotify() const { return mNotify->dup(); }
155b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
1569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    void notifyFlagsChanged(uint32_t flags);
157ced1c2f8f6c422063092f5cc5c675ccdebb2dc10Chong Zhang    void notifyVideoSizeChanged(const sp<AMessage> &format = NULL);
158fcd3e94c075e964670d946f6ec5d82d059bf9e09Lajos Molnar    void notifyInstantiateSecureDecoders(const sp<AMessage> &reply);
159ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber    void notifyPrepared(status_t err = OK);
160cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    // Modular DRM
161cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    void notifyDrmInfo(const sp<ABuffer> &buffer);
1629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1635bc087c573c70c84c6a39946457590b42d392a33Andreas Huberprivate:
164b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber    sp<AMessage> mNotify;
165b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber
1665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Source);
1675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber};
1685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}  // namespace android
1705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#endif  // NUPLAYER_SOURCE_H_
1725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
173