NuPlayer.h revision 1aef211b4e5dc952081727bfd2318b2cb5ca4506
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;
28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
29f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct NuPlayer : public AHandler {
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    NuPlayer();
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setListener(const wp<MediaPlayerBase> &listener);
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setDataSource(const sp<IStreamSource> &source);
355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
365bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    void setDataSource(
375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            const char *url, const KeyedVector<String8, String8> *headers);
385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setVideoSurface(const sp<Surface> &surface);
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink);
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void start();
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Will notify the listener that reset() has completed
441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // with code MEDIA_RESET_COMPLETE.
451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void resetAsync();
461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual ~NuPlayer();
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    struct Decoder;
545bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct HTTPLiveSource;
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    struct NuPlayerStreamListener;
565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct Renderer;
575bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct Source;
585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    struct StreamingSource;
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum {
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetDataSource,
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetVideoSurface,
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatSetAudioSink,
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatMoreDataQueued,
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatStart,
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatScanSources,
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatVideoNotify,
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatAudioNotify,
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        kWhatRendererNotify,
701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        kWhatReset,
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    wp<MediaPlayerBase> mListener;
745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<Source> mSource;
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Surface> mSurface;
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<MediaPlayerBase::AudioSink> mAudioSink;
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Decoder> mVideoDecoder;
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Decoder> mAudioDecoder;
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<Renderer> mRenderer;
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool mAudioEOS;
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool mVideoEOS;
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    bool mScanSourcesPending;
851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    int32_t mScanSourcesGeneration;
865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum FlushStatus {
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        NONE,
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        AWAITING_DISCONTINUITY,
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        FLUSHING_DECODER,
911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        FLUSHING_DECODER_SHUTDOWN,
923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        SHUTTING_DOWN_DECODER,
933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        FLUSHED,
943831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        SHUT_DOWN,
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    FlushStatus mFlushingAudio;
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    FlushStatus mFlushingVideo;
991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    bool mResetInProgress;
1001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    bool mResetPostponed;
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    status_t instantiateDecoder(bool audio, sp<Decoder> *decoder);
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg);
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void renderBuffer(bool audio, const sp<AMessage> &msg);
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void notifyListener(int msg, int ext1, int ext2);
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    void finishFlushIfPossible();
1103831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
1111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void flushDecoder(bool audio, bool needShutdown);
1121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    static bool IsFlushingState(FlushStatus state, bool *needShutdown = NULL);
1141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void finishReset();
1161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    void postScanSources();
11753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif  // NU_PLAYER_H_
124