NuPlayer.h revision 095248375e29adde961ec2a44989ecb3a6dda6a2
1cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar/*
2cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * Copyright (C) 2010 The Android Open Source Project
3cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar *
4cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * Licensed under the Apache License, Version 2.0 (the "License");
5cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * you may not use this file except in compliance with the License.
6cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * You may obtain a copy of the License at
7cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar *
8cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar *      http://www.apache.org/licenses/LICENSE-2.0
9cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar *
10cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * Unless required by applicable law or agreed to in writing, software
11cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * distributed under the License is distributed on an "AS IS" BASIS,
12cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * See the License for the specific language governing permissions and
14cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar * limitations under the License.
15cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar */
16cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
17cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#ifndef NU_PLAYER_H_
18cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
19cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#define NU_PLAYER_H_
20cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
21cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#include <media/MediaPlayerInterface.h>
22cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#include <media/stagefright/foundation/AHandler.h>
23cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar#include <media/stagefright/NativeWindowWrapper.h>
24cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
25cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarnamespace android {
26cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
27cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarstruct ABuffer;
28cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarstruct MetaData;
29cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarstruct NuPlayerDriver;
30cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
31cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarstruct NuPlayer : public AHandler {
32cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    NuPlayer();
33cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
34cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void setUID(uid_t uid);
35cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
36cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void setDriver(const wp<NuPlayerDriver> &driver);
37cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
38cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void setDataSourceAsync(const sp<IStreamSource> &source);
39cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
40cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void setDataSourceAsync(
41cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar            const sp<IMediaHTTPService> &httpService,
42cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar            const char *url,
43cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar            const KeyedVector<String8, String8> *headers);
44cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
45cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void setDataSourceAsync(int fd, int64_t offset, int64_t length);
46cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
47cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void prepareAsync();
48cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
49cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void setVideoSurfaceTextureAsync(
50cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar            const sp<IGraphicBufferProducer> &bufferProducer);
51cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
52cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink);
53cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void start();
54cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
55cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void pause();
56cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void resume();
57b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar
58b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar    // Will notify the driver through "notifyResetComplete" once finished.
59cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void resetAsync();
60cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
61cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    // Will notify the driver through "notifySeekComplete" once finished.
62cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void seekToAsync(int64_t seekTimeUs);
63cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
64cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    status_t setVideoScalingMode(int32_t mode);
65cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    status_t getTrackInfo(Parcel* reply) const;
66cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    status_t selectTrack(size_t trackIndex, bool select);
67cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
68cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarprotected:
69b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar    virtual ~NuPlayer();
70b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar
71b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar    virtual void onMessageReceived(const sp<AMessage> &msg);
72b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar
73cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarpublic:
74cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct NuPlayerStreamListener;
75cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct Source;
76b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar
77cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbarprivate:
78cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct Decoder;
79cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct DecoderPassThrough;
80cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct CCDecoder;
81cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct GenericSource;
82cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct HTTPLiveSource;
83cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct Renderer;
84cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct RTSPSource;
85cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct StreamingSource;
86cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct Action;
87cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct SeekAction;
88cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct SetSurfaceAction;
89cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct ShutdownDecoderAction;
90cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    struct PostMessageAction;
91b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar    struct SimpleAction;
92b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar
93cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    enum {
94b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar        kWhatSetDataSource              = '=DaS',
95b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar        kWhatPrepare                    = 'prep',
96cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatSetVideoNativeWindow       = '=NaW',
97cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatSetAudioSink               = '=AuS',
98cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatMoreDataQueued             = 'more',
99cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatStart                      = 'strt',
100cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatScanSources                = 'scan',
101cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatVideoNotify                = 'vidN',
102cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatAudioNotify                = 'audN',
103cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatClosedCaptionNotify        = 'capN',
104cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatRendererNotify             = 'renN',
105cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatReset                      = 'rset',
106cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatSeek                       = 'seek',
107cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatPause                      = 'paus',
108cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatResume                     = 'rsme',
109cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatPollDuration               = 'polD',
110cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatSourceNotify               = 'srcN',
111cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatGetTrackInfo               = 'gTrI',
112cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        kWhatSelectTrack                = 'selT',
113cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    };
114cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
115cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    wp<NuPlayerDriver> mDriver;
116cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    bool mUIDValid;
117cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    uid_t mUID;
118b5cd41e26f89aad2f2dc4f5dc37577f7abf8528aDaniel Dunbar    sp<Source> mSource;
119cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    uint32_t mSourceFlags;
120cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    sp<NativeWindowWrapper> mNativeWindow;
121cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    sp<MediaPlayerBase::AudioSink> mAudioSink;
122cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    sp<Decoder> mVideoDecoder;
123cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    bool mVideoIsAVC;
124cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    bool mOffloadAudio;
125cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    sp<Decoder> mAudioDecoder;
126cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    sp<CCDecoder> mCCDecoder;
127cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    sp<Renderer> mRenderer;
128cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    sp<ALooper> mRendererLooper;
129cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
130cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    List<sp<Action> > mDeferredActions;
131cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
132cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    bool mAudioEOS;
133cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    bool mVideoEOS;
134cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
135cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    bool mScanSourcesPending;
136cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    int32_t mScanSourcesGeneration;
137cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
138cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    int32_t mPollDurationGeneration;
139cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
140cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    enum FlushStatus {
141cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        NONE,
142cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        AWAITING_DISCONTINUITY,
143cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        FLUSHING_DECODER,
144cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        FLUSHING_DECODER_SHUTDOWN,
145cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        SHUTTING_DOWN_DECODER,
146cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        FLUSHED,
147cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar        SHUT_DOWN,
148cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    };
149cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
150cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    // Once the current flush is complete this indicates whether the
151cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    // notion of time has changed.
152cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    bool mTimeDiscontinuityPending;
153cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
154cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    FlushStatus mFlushingAudio;
155cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    FlushStatus mFlushingVideo;
156cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
157cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    int64_t mSkipRenderingAudioUntilMediaTimeUs;
158cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    int64_t mSkipRenderingVideoUntilMediaTimeUs;
159cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
160cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    int64_t mVideoLateByUs;
161cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    int64_t mNumFramesTotal, mNumFramesDropped;
162cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
163cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    int32_t mVideoScalingMode;
164cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
165cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    bool mStarted;
166cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
167cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    status_t instantiateDecoder(bool audio, sp<Decoder> *decoder);
168cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
169cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg);
170cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void renderBuffer(bool audio, const sp<AMessage> &msg);
171cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
172cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void notifyListener(int msg, int ext1, int ext2, const Parcel *in = NULL);
173cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
174cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void finishFlushIfPossible();
175cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
176cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void flushDecoder(bool audio, bool needShutdown);
177cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
178cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    static bool IsFlushingState(FlushStatus state, bool *needShutdown = NULL);
179cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
180b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne    void postScanSources();
181b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne
182cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void schedulePollDuration();
183cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void cancelPollDuration();
184cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
185cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void processDeferredActions();
186cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
187cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void performSeek(int64_t seekTimeUs);
188cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void performDecoderFlush();
189cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void performDecoderShutdown(bool audio, bool video);
190cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void performReset();
191cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void performScanSources();
192cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void performSetSurface(const sp<NativeWindowWrapper> &wrapper);
19340d65dc3058e8d58426953d44e2ea0eccf996371Daniel Dunbar
19440d65dc3058e8d58426953d44e2ea0eccf996371Daniel Dunbar    void onSourceNotify(const sp<AMessage> &msg);
19540d65dc3058e8d58426953d44e2ea0eccf996371Daniel Dunbar    void onClosedCaptionNotify(const sp<AMessage> &msg);
196cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
197b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne    void queueDecoderShutdown(
198cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar            bool audio, bool video, const sp<AMessage> &reply);
199cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
200cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void sendSubtitleData(const sp<ABuffer> &buffer, int32_t baseIndex);
201cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
202cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    void writeTrackInfo(Parcel* reply, const sp<AMessage> format) const;
203cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
204cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar    DISALLOW_EVIL_CONSTRUCTORS(NuPlayer);
205cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar};
206cb497b888aabebe13de431c8a6e7c7d31f4dea0cDaniel Dunbar
20740d65dc3058e8d58426953d44e2ea0eccf996371Daniel Dunbar}  // namespace android
208b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne
209b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne#endif  // NU_PLAYER_H_
210b56900aa86aa535fb1f060f5935d1e209e45d907Peter Collingbourne