NuPlayerSource.h revision 866e028bbe30b1ba0b9d8903c88bbe8525b81a37
16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/*
26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * Copyright (C) 2010 The Android Open Source Project
36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *
46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * you may not use this file except in compliance with the License.
66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * You may obtain a copy of the License at
76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *
86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *
10f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Unless required by applicable law or agreed to in writing, software
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines * See the License for the specific language governing permissions and
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines * limitations under the License.
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines */
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifndef NUPLAYER_SOURCE_H_
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define NUPLAYER_SOURCE_H_
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "NuPlayer.h"
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <media/stagefright/foundation/AMessage.h>
24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <media/stagefright/MetaData.h>
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <media/mediaplayer.h>
266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <utils/Vector.h>
276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesnamespace android {
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstruct ABuffer;
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstruct MetaData;
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstruct MediaBuffer;
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstruct NuPlayer::Source : public AHandler {
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    enum Flags {
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        FLAG_CAN_PAUSE          = 1,
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines        FLAG_CAN_SEEK_BACKWARD  = 2,  // the "10 sec back button"
38cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines        FLAG_CAN_SEEK_FORWARD   = 4,  // the "10 sec forward button"
39cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines        FLAG_CAN_SEEK           = 8,  // the "seek bar"
40cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines        FLAG_DYNAMIC_DURATION   = 16,
41cfcb22478ca64c308df58f9abe6fa2dedb213c16Stephen Hines        FLAG_SECURE             = 32,
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    };
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    enum {
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        kWhatPrepared,
46551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        kWhatFlagsChanged,
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        kWhatVideoSizeChanged,
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        kWhatBufferingUpdate,
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        kWhatBufferingStart,
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines        kWhatBufferingEnd,
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        kWhatSubtitleData,
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        kWhatTimedTextData,
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        kWhatQueueDecoderShutdown,
54551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        kWhatDrmNoLicense,
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    };
56551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    // The provides message is used to notify the player about various
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    // events.
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    Source(const sp<AMessage> &notify)
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        : mNotify(notify) {
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    }
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    virtual void prepareAsync() = 0;
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    virtual void start() = 0;
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    virtual void stop() {}
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    virtual void pause() {}
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    virtual void resume() {}
69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    // Explicitly disconnect the underling data source
71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    virtual void disconnect() {}
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    // Returns OK iff more data was available,
74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    // an error or ERROR_END_OF_STREAM if not.
75551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    virtual status_t feedMoreTSData() = 0;
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    virtual sp<AMessage> getFormat(bool audio);
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    virtual sp<MetaData> getFormatMeta(bool /* audio */) { return NULL; }
796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    virtual sp<MetaData> getFileFormatMeta() const { return NULL; }
80551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
81551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    virtual status_t dequeueAccessUnit(
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines            bool audio, sp<ABuffer> *accessUnit) = 0;
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    virtual status_t getDuration(int64_t * /* durationUs */) {
856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        return INVALID_OPERATION;
866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    }
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
88551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    virtual size_t getTrackCount() const {
89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return 0;
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
92551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    virtual sp<AMessage> getTrackInfo(size_t /* trackIndex */) const {
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return NULL;
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines
96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    virtual ssize_t getSelectedTrack(media_track_type /* type */) const {
97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return INVALID_OPERATION;
98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    virtual status_t selectTrack(size_t /* trackIndex */, bool /* select */) {
101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return INVALID_OPERATION;
102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    virtual status_t seekTo(int64_t /* seekTimeUs */) {
105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return INVALID_OPERATION;
106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
107f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    virtual status_t setBuffers(bool /* audio */, Vector<MediaBuffer *> &/* buffers */) {
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines        return INVALID_OPERATION;
110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    virtual bool isRealTime() const {
113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return false;
114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
116f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected:
117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    virtual ~Source() {}
118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    virtual void onMessageReceived(const sp<AMessage> &msg);
120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    sp<AMessage> dupNotify() const { return mNotify->dup(); }
122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    void notifyFlagsChanged(uint32_t flags);
124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    void notifyVideoSizeChanged(const sp<AMessage> &format = NULL);
125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    void notifyPrepared(status_t err = OK);
126551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
127551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesprivate:
128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    sp<AMessage> mNotify;
129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
130f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    DISALLOW_EVIL_CONSTRUCTORS(Source);
13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines};
132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}  // namespace android
13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
135f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#endif  // NUPLAYER_SOURCE_H_
13637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines