NuPlayer.h revision 43c3e6ce02215ca99d506458f596cb1211639f29
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/*
2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License.
6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at
7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and
14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License.
15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */
16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#ifndef NU_PLAYER_H_
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define NU_PLAYER_H_
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/MediaPlayerInterface.h>
22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AHandler.h>
23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
24f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec;
27f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct MetaData;
2843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstruct NuPlayerDriver;
29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct NuPlayer : public AHandler {
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    NuPlayer();
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void setDriver(const wp<NuPlayerDriver> &driver);
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setDataSource(const sp<IStreamSource> &source);
365bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    void setDataSource(
385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            const char *url, const KeyedVector<String8, String8> *headers);
395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setVideoSurface(const sp<Surface> &surface);
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink);
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void start();
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void pause();
4543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void resume();
4643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
4743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // Will notify the driver through "notifyResetComplete" once finished.
481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void resetAsync();
491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // Will notify the driver through "notifySeekComplete" once finished.
5143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void seekToAsync(int64_t seekTimeUs);
5243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual ~NuPlayer();
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    struct Decoder;
605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct HTTPLiveSource;
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    struct NuPlayerStreamListener;
625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct Renderer;
635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct Source;
645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct StreamingSource;
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum {
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetDataSource,
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetVideoSurface,
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetAudioSink,
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatMoreDataQueued,
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatStart,
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatScanSources,
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatVideoNotify,
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatAudioNotify,
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatRendererNotify,
761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        kWhatReset,
7743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        kWhatSeek,
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    wp<NuPlayerDriver> mDriver;
815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<Source> mSource;
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Surface> mSurface;
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<MediaPlayerBase::AudioSink> mAudioSink;
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Decoder> mVideoDecoder;
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Decoder> mAudioDecoder;
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Renderer> mRenderer;
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool mAudioEOS;
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool mVideoEOS;
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    bool mScanSourcesPending;
921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    int32_t mScanSourcesGeneration;
935bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum FlushStatus {
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        NONE,
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        AWAITING_DISCONTINUITY,
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        FLUSHING_DECODER,
981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        FLUSHING_DECODER_SHUTDOWN,
993831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        SHUTTING_DOWN_DECODER,
1003831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        FLUSHED,
1013831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        SHUT_DOWN,
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    FlushStatus mFlushingAudio;
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    FlushStatus mFlushingVideo;
1061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    bool mResetInProgress;
1071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    bool mResetPostponed;
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    status_t instantiateDecoder(bool audio, sp<Decoder> *decoder);
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg);
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void renderBuffer(bool audio, const sp<AMessage> &msg);
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void notifyListener(int msg, int ext1, int ext2);
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1163831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    void finishFlushIfPossible();
1173831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
1181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void flushDecoder(bool audio, bool needShutdown);
1191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    static bool IsFlushingState(FlushStatus state, bool *needShutdown = NULL);
1211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void finishReset();
1231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void postScanSources();
12453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif  // NU_PLAYER_H_
131