NuPlayer.h revision 9b80c2bdb205bc143104f54d0743b6eedd67b14e
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
369b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    void setUID(uid_t uid);
379b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
3843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void setDriver(const wp<NuPlayerDriver> &driver);
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setDataSource(const sp<IStreamSource> &source);
415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
425bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    void setDataSource(
435bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            const char *url, const KeyedVector<String8, String8> *headers);
445bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setVideoSurface(const sp<Surface> &surface);
461173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    void setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture);
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink);
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void start();
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void pause();
5143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void resume();
5243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
5343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // Will notify the driver through "notifyResetComplete" once finished.
541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void resetAsync();
551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // Will notify the driver through "notifySeekComplete" once finished.
5743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    void seekToAsync(int64_t seekTimeUs);
5843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual ~NuPlayer();
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    struct Decoder;
665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct HTTPLiveSource;
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    struct NuPlayerStreamListener;
685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct Renderer;
695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct Source;
705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct StreamingSource;
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum {
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetDataSource,
741173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        kWhatSetVideoNativeWindow,
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetAudioSink,
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatMoreDataQueued,
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatStart,
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatScanSources,
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatVideoNotify,
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatAudioNotify,
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatRendererNotify,
821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        kWhatReset,
8343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        kWhatSeek,
84b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        kWhatPause,
85b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        kWhatResume,
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    wp<NuPlayerDriver> mDriver;
899b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    bool mUIDValid;
909b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    uid_t mUID;
915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<Source> mSource;
921173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<NativeWindowWrapper> mNativeWindow;
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<MediaPlayerBase::AudioSink> mAudioSink;
94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Decoder> mVideoDecoder;
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Decoder> mAudioDecoder;
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Renderer> mRenderer;
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool mAudioEOS;
99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool mVideoEOS;
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    bool mScanSourcesPending;
1021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    int32_t mScanSourcesGeneration;
1035bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum FlushStatus {
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        NONE,
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        AWAITING_DISCONTINUITY,
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        FLUSHING_DECODER,
1081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        FLUSHING_DECODER_SHUTDOWN,
1093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        SHUTTING_DOWN_DECODER,
1103831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        FLUSHED,
1113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        SHUT_DOWN,
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    FlushStatus mFlushingAudio;
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    FlushStatus mFlushingVideo;
1161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    bool mResetInProgress;
1171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    bool mResetPostponed;
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
11932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t mSkipRenderingAudioUntilMediaTimeUs;
12032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t mSkipRenderingVideoUntilMediaTimeUs;
12132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
1225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    status_t instantiateDecoder(bool audio, sp<Decoder> *decoder);
123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg);
125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void renderBuffer(bool audio, const sp<AMessage> &msg);
126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void notifyListener(int msg, int ext1, int ext2);
128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    void finishFlushIfPossible();
1303831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
1311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void flushDecoder(bool audio, bool needShutdown);
1321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    static bool IsFlushingState(FlushStatus state, bool *needShutdown = NULL);
1341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void finishReset();
1361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void postScanSources();
13753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif  // NU_PLAYER_H_
144