NuPlayer.h revision 1173118eace0e9e347cb007f0da817cee87579ed
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>
231173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <media/stagefright/NativeWindowWrapper.h>
241173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h>
251173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <surfaceflinger/Surface.h>
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
27f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
29f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec;
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct MetaData;
3143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huberstruct NuPlayerDriver;
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct NuPlayer : public AHandler {
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    NuPlayer();
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void setDriver(const wp<NuPlayerDriver> &driver);
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setDataSource(const sp<IStreamSource> &source);
395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    void setDataSource(
415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            const char *url, const KeyedVector<String8, String8> *headers);
425bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setVideoSurface(const sp<Surface> &surface);
441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    void setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture);
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink);
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void start();
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void pause();
4943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void resume();
5043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
5143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // Will notify the driver through "notifyResetComplete" once finished.
521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void resetAsync();
531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // Will notify the driver through "notifySeekComplete" once finished.
5543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void seekToAsync(int64_t seekTimeUs);
5643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual ~NuPlayer();
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    struct Decoder;
645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct HTTPLiveSource;
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    struct NuPlayerStreamListener;
665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct Renderer;
675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct Source;
685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct StreamingSource;
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum {
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetDataSource,
721173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        kWhatSetVideoNativeWindow,
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetAudioSink,
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatMoreDataQueued,
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatStart,
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatScanSources,
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatVideoNotify,
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatAudioNotify,
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatRendererNotify,
801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        kWhatReset,
8143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        kWhatSeek,
82b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        kWhatPause,
83b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        kWhatResume,
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    wp<NuPlayerDriver> mDriver;
875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<Source> mSource;
881173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<NativeWindowWrapper> mNativeWindow;
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<MediaPlayerBase::AudioSink> mAudioSink;
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Decoder> mVideoDecoder;
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Decoder> mAudioDecoder;
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Renderer> mRenderer;
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool mAudioEOS;
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool mVideoEOS;
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    bool mScanSourcesPending;
981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    int32_t mScanSourcesGeneration;
995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum FlushStatus {
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        NONE,
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        AWAITING_DISCONTINUITY,
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        FLUSHING_DECODER,
1041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        FLUSHING_DECODER_SHUTDOWN,
1053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        SHUTTING_DOWN_DECODER,
1063831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        FLUSHED,
1073831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        SHUT_DOWN,
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    FlushStatus mFlushingAudio;
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    FlushStatus mFlushingVideo;
1121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    bool mResetInProgress;
1131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    bool mResetPostponed;
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    status_t instantiateDecoder(bool audio, sp<Decoder> *decoder);
116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg);
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void renderBuffer(bool audio, const sp<AMessage> &msg);
119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void notifyListener(int msg, int ext1, int ext2);
121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1223831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    void finishFlushIfPossible();
1233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
1241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void flushDecoder(bool audio, bool needShutdown);
1251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    static bool IsFlushingState(FlushStatus state, bool *needShutdown = NULL);
1271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void finishReset();
1291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void postScanSources();
13053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif  // NU_PLAYER_H_
137