Home | History | Annotate | Download | only in nuplayer
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef NU_PLAYER_H_
     18 
     19 #define NU_PLAYER_H_
     20 
     21 #include <media/MediaPlayerInterface.h>
     22 #include <media/stagefright/foundation/AHandler.h>
     23 #include <media/stagefright/NativeWindowWrapper.h>
     24 
     25 namespace android {
     26 
     27 struct ABuffer;
     28 struct AMessage;
     29 struct MetaData;
     30 struct NuPlayerDriver;
     31 
     32 struct NuPlayer : public AHandler {
     33     NuPlayer();
     34 
     35     void setUID(uid_t uid);
     36 
     37     void setDriver(const wp<NuPlayerDriver> &driver);
     38 
     39     void setDataSourceAsync(const sp<IStreamSource> &source);
     40 
     41     void setDataSourceAsync(
     42             const sp<IMediaHTTPService> &httpService,
     43             const char *url,
     44             const KeyedVector<String8, String8> *headers);
     45 
     46     void setDataSourceAsync(int fd, int64_t offset, int64_t length);
     47 
     48     void prepareAsync();
     49 
     50     void setVideoSurfaceTextureAsync(
     51             const sp<IGraphicBufferProducer> &bufferProducer);
     52 
     53     void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink);
     54     void start();
     55 
     56     void pause();
     57     void resume();
     58 
     59     // Will notify the driver through "notifyResetComplete" once finished.
     60     void resetAsync();
     61 
     62     // Will notify the driver through "notifySeekComplete" once finished
     63     // and needNotify is true.
     64     void seekToAsync(int64_t seekTimeUs, bool needNotify = false);
     65 
     66     status_t setVideoScalingMode(int32_t mode);
     67     status_t getTrackInfo(Parcel* reply) const;
     68     status_t getSelectedTrack(int32_t type, Parcel* reply) const;
     69     status_t selectTrack(size_t trackIndex, bool select);
     70     status_t getCurrentPosition(int64_t *mediaUs);
     71     void getStats(int64_t *mNumFramesTotal, int64_t *mNumFramesDropped);
     72 
     73     sp<MetaData> getFileMeta();
     74 
     75     static const size_t kAggregateBufferSizeBytes;
     76 
     77 protected:
     78     virtual ~NuPlayer();
     79 
     80     virtual void onMessageReceived(const sp<AMessage> &msg);
     81 
     82 public:
     83     struct NuPlayerStreamListener;
     84     struct Source;
     85 
     86 private:
     87     struct Decoder;
     88     struct DecoderPassThrough;
     89     struct CCDecoder;
     90     struct GenericSource;
     91     struct HTTPLiveSource;
     92     struct Renderer;
     93     struct RTSPSource;
     94     struct StreamingSource;
     95     struct Action;
     96     struct SeekAction;
     97     struct SetSurfaceAction;
     98     struct ShutdownDecoderAction;
     99     struct PostMessageAction;
    100     struct SimpleAction;
    101 
    102     enum {
    103         kWhatSetDataSource              = '=DaS',
    104         kWhatPrepare                    = 'prep',
    105         kWhatSetVideoNativeWindow       = '=NaW',
    106         kWhatSetAudioSink               = '=AuS',
    107         kWhatMoreDataQueued             = 'more',
    108         kWhatStart                      = 'strt',
    109         kWhatScanSources                = 'scan',
    110         kWhatVideoNotify                = 'vidN',
    111         kWhatAudioNotify                = 'audN',
    112         kWhatClosedCaptionNotify        = 'capN',
    113         kWhatRendererNotify             = 'renN',
    114         kWhatReset                      = 'rset',
    115         kWhatSeek                       = 'seek',
    116         kWhatPause                      = 'paus',
    117         kWhatResume                     = 'rsme',
    118         kWhatPollDuration               = 'polD',
    119         kWhatSourceNotify               = 'srcN',
    120         kWhatGetTrackInfo               = 'gTrI',
    121         kWhatGetSelectedTrack           = 'gSel',
    122         kWhatSelectTrack                = 'selT',
    123     };
    124 
    125     wp<NuPlayerDriver> mDriver;
    126     bool mUIDValid;
    127     uid_t mUID;
    128     sp<Source> mSource;
    129     uint32_t mSourceFlags;
    130     sp<NativeWindowWrapper> mNativeWindow;
    131     sp<MediaPlayerBase::AudioSink> mAudioSink;
    132     sp<Decoder> mVideoDecoder;
    133     bool mVideoIsAVC;
    134     bool mOffloadAudio;
    135     sp<Decoder> mAudioDecoder;
    136     sp<CCDecoder> mCCDecoder;
    137     sp<Renderer> mRenderer;
    138     sp<ALooper> mRendererLooper;
    139     int32_t mAudioDecoderGeneration;
    140     int32_t mVideoDecoderGeneration;
    141     int32_t mRendererGeneration;
    142 
    143     List<sp<Action> > mDeferredActions;
    144 
    145     bool mAudioEOS;
    146     bool mVideoEOS;
    147 
    148     bool mScanSourcesPending;
    149     int32_t mScanSourcesGeneration;
    150 
    151     int32_t mPollDurationGeneration;
    152     int32_t mTimedTextGeneration;
    153 
    154     enum FlushStatus {
    155         NONE,
    156         FLUSHING_DECODER,
    157         FLUSHING_DECODER_SHUTDOWN,
    158         SHUTTING_DOWN_DECODER,
    159         FLUSHED,
    160         SHUT_DOWN,
    161     };
    162 
    163     // Once the current flush is complete this indicates whether the
    164     // notion of time has changed.
    165     bool mTimeDiscontinuityPending;
    166 
    167     // Status of flush responses from the decoder and renderer.
    168     bool mFlushComplete[2][2];
    169 
    170     // Used by feedDecoderInputData to aggregate small buffers into
    171     // one large buffer.
    172     sp<ABuffer> mPendingAudioAccessUnit;
    173     status_t    mPendingAudioErr;
    174     sp<ABuffer> mAggregateBuffer;
    175 
    176     FlushStatus mFlushingAudio;
    177     FlushStatus mFlushingVideo;
    178 
    179     int64_t mSkipRenderingAudioUntilMediaTimeUs;
    180     int64_t mSkipRenderingVideoUntilMediaTimeUs;
    181 
    182     int64_t mNumFramesTotal, mNumFramesDropped;
    183 
    184     int32_t mVideoScalingMode;
    185 
    186     bool mStarted;
    187 
    188     inline const sp<Decoder> &getDecoder(bool audio) {
    189         return audio ? mAudioDecoder : mVideoDecoder;
    190     }
    191 
    192     inline void clearFlushComplete() {
    193         mFlushComplete[0][0] = false;
    194         mFlushComplete[0][1] = false;
    195         mFlushComplete[1][0] = false;
    196         mFlushComplete[1][1] = false;
    197     }
    198 
    199     void openAudioSink(const sp<AMessage> &format, bool offloadOnly);
    200     void closeAudioSink();
    201 
    202     status_t instantiateDecoder(bool audio, sp<Decoder> *decoder);
    203 
    204     void updateVideoSize(
    205             const sp<AMessage> &inputFormat,
    206             const sp<AMessage> &outputFormat = NULL);
    207 
    208     status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg);
    209     void renderBuffer(bool audio, const sp<AMessage> &msg);
    210 
    211     void notifyListener(int msg, int ext1, int ext2, const Parcel *in = NULL);
    212 
    213     void handleFlushComplete(bool audio, bool isDecoder);
    214     void finishFlushIfPossible();
    215 
    216     bool audioDecoderStillNeeded();
    217 
    218     void flushDecoder(
    219             bool audio, bool needShutdown, const sp<AMessage> &newFormat = NULL);
    220     void updateDecoderFormatWithoutFlush(bool audio, const sp<AMessage> &format);
    221 
    222     void postScanSources();
    223 
    224     void schedulePollDuration();
    225     void cancelPollDuration();
    226 
    227     void processDeferredActions();
    228 
    229     void performSeek(int64_t seekTimeUs, bool needNotify);
    230     void performDecoderFlush();
    231     void performDecoderShutdown(bool audio, bool video);
    232     void performReset();
    233     void performScanSources();
    234     void performSetSurface(const sp<NativeWindowWrapper> &wrapper);
    235 
    236     void onSourceNotify(const sp<AMessage> &msg);
    237     void onClosedCaptionNotify(const sp<AMessage> &msg);
    238 
    239     void queueDecoderShutdown(
    240             bool audio, bool video, const sp<AMessage> &reply);
    241 
    242     void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex);
    243     void sendTimedTextData(const sp<ABuffer> &buffer);
    244 
    245     void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const;
    246 
    247     DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
    248 };
    249 
    250 }  // namespace android
    251 
    252 #endif  // NU_PLAYER_H_
    253