NuPlayerDriver.h revision 9575c96b6e418914e2ffc6741ecc8d71e3968dbe
13b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy/*
23b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * Copyright (C) 2010 The Android Open Source Project
33b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy *
43b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
53b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * you may not use this file except in compliance with the License.
63b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * You may obtain a copy of the License at
73b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy *
83b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
93b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy *
103b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * Unless required by applicable law or agreed to in writing, software
113b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
123b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * See the License for the specific language governing permissions and
143b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * limitations under the License.
153b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy */
163b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
173b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <media/MediaPlayerInterface.h>
183b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
193b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <media/stagefright/foundation/ABase.h>
203b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guynamespace android {
223b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
233b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guystruct ALooper;
243b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guystruct NuPlayer;
253b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guystruct NuPlayerDriver : public MediaPlayerInterface {
273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    NuPlayerDriver();
283b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
293b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t initCheck();
303b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
313b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t setUID(uid_t uid);
323b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
333b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t setDataSource(
343b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            const char *url, const KeyedVector<String8, String8> *headers);
353b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
363b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t setDataSource(int fd, int64_t offset, int64_t length);
373b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
383b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t setDataSource(const sp<IStreamSource> &source);
393b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
403b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t setVideoSurfaceTexture(
413b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            const sp<IGraphicBufferProducer> &bufferProducer);
423b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t prepare();
433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t prepareAsync();
443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t start();
453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t stop();
463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t pause();
473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual bool isPlaying();
483b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t seekTo(int msec);
493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t getCurrentPosition(int *msec);
503b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t getDuration(int *msec);
513b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t reset();
523b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t setLooping(int loop);
533b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual player_type playerType();
543b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t invoke(const Parcel &request, Parcel *reply);
553b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual void setAudioSink(const sp<AudioSink> &audioSink);
563b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t setParameter(int key, const Parcel &request);
573b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t getParameter(int key, Parcel *reply);
583b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
5936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    virtual status_t getMetadata(
603b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            const media::Metadata::Filter& ids, Parcel *records);
613b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
623b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t dump(int fd, const Vector<String16> &args) const;
633b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
643b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void notifySetDataSourceCompleted(status_t err);
65b2ed04a68913f4d84d7cb7e979b6f0ae96f43058Romain Guy    void notifyPrepareCompleted(status_t err);
66b2ed04a68913f4d84d7cb7e979b6f0ae96f43058Romain Guy    void notifyResetComplete();
67b2ed04a68913f4d84d7cb7e979b6f0ae96f43058Romain Guy    void notifySetSurfaceComplete();
683b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void notifyDuration(int64_t durationUs);
693b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void notifyPosition(int64_t positionUs);
703b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void notifySeekComplete();
713b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void notifyFrameStats(int64_t numFramesTotal, int64_t numFramesDropped);
723b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void notifyListener(int msg, int ext1 = 0, int ext2 = 0);
733b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void notifyFlagsChanged(uint32_t flags);
743b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
753b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyprotected:
763b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual ~NuPlayerDriver();
773b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
783b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyprivate:
793b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    enum State {
8036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        STATE_IDLE,
813b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        STATE_SET_DATASOURCE_PENDING,
823b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        STATE_UNPREPARED,
833b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        STATE_PREPARING,
843b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        STATE_PREPARED,
853b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        STATE_RUNNING,
863b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        STATE_PAUSED,
873b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        STATE_RESET_IN_PROGRESS,
883b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    };
893b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
9036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    mutable Mutex mLock;
913b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    Condition mCondition;
923b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
933b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    State mState;
943b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
953b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    status_t mAsyncResult;
963b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
973b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    // The following are protected through "mLock"
983b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    // >>>
993b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    bool mSetSurfaceInProgress;
1003b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    int64_t mDurationUs;
1013b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    int64_t mPositionUs;
1023b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    int64_t mNumFramesTotal;
1033b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    int64_t mNumFramesDropped;
1043b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    // <<<
1053b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1063b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    sp<ALooper> mLooper;
1073b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    sp<NuPlayer> mPlayer;
1083b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    uint32_t mPlayerFlags;
1093b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1103b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    bool mAtEOS;
1113b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1123b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    int64_t mStartupSeekTimeUs;
1133b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1143b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    status_t prepare_l();
1153b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1163b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    DISALLOW_EVIL_CONSTRUCTORS(NuPlayerDriver);
1173b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy};
1183b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1193b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy}  // namespace android
1203b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1223b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy