SimplePlayer.h revision 5778822d86b0337407514b9372562b86edfa91cd
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/*
25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright (C) 2012 The Android Open Source Project
35778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License.
65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at
75778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
85778822d86b0337407514b9372562b86edfa91cdAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
95778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software
115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and
145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License.
155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */
165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
175778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h>
185778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AString.h>
195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/KeyedVector.h>
205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
215778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
235778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer;
245778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ALooper;
255778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AudioTrack;
265778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ISurfaceTexture;
275778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec;
285778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct NativeWindowWrapper;
295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct NuMediaExtractor;
305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
315778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SimplePlayer : public AHandler {
325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SimplePlayer();
335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t setDataSource(const char *path);
355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t setSurface(const sp<ISurfaceTexture> &surfaceTexture);
365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t prepare();
375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t start();
385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t stop();
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t reset();
405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
415778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~SimplePlayer();
435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
465778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum State {
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        UNINITIALIZED,
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        UNPREPARED,
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STOPPED,
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTED
525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
555778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatSetDataSource,
565778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatSetSurface,
575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatPrepare,
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatStart,
595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatStop,
605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatReset,
615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatDoMoreStuff,
625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    struct BufferInfo {
655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t mIndex;
665778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t mOffset;
675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t mSize;
685778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t mPresentationTimeUs;
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t mFlags;
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    struct CodecState
735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    {
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<MediaCodec> mCodec;
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber        Vector<sp<ABuffer> > mCSD;
765778822d86b0337407514b9372562b86edfa91cdAndreas Huber        Vector<sp<ABuffer> > mBuffers[2];
775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
785778822d86b0337407514b9372562b86edfa91cdAndreas Huber        List<size_t> mAvailInputBufferIndices;
795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        List<BufferInfo> mAvailOutputBufferInfos;
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AudioTrack> mAudioTrack;
825778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t mNumFramesWritten;
835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    State mState;
865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    AString mPath;
875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<NativeWindowWrapper> mNativeWindow;
885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<NuMediaExtractor> mExtractor;
905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mCodecLooper;
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    KeyedVector<size_t, CodecState> mStateByTrackIndex;
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDoMoreStuffGeneration;
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t mStartTimeRealUs;
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onPrepare();
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onStart();
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onStop();
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onReset();
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onDoMoreStuff();
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onOutputFormatChanged(size_t trackIndex, CodecState *state);
1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void renderAudio(
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CodecState *state, BufferInfo *info, const sp<ABuffer> &buffer);
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SimplePlayer);
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber};
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
110