1fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber/*
2fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * Copyright 2012, The Android Open Source Project
3fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber *
4fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * you may not use this file except in compliance with the License.
6fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * You may obtain a copy of the License at
7fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber *
8fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber *     http://www.apache.org/licenses/LICENSE-2.0
9fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber *
10fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * Unless required by applicable law or agreed to in writing, software
11fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * See the License for the specific language governing permissions and
14fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * limitations under the License.
15fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber */
16fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
17fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#ifndef TUNNEL_RENDERER_H_
18fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
19fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#define TUNNEL_RENDERER_H_
20fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
21fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#include <gui/Surface.h>
22fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#include <media/stagefright/foundation/AHandler.h>
23fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
24fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Hubernamespace android {
25fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
26fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct ABuffer;
27fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct SurfaceComposerClient;
28fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct SurfaceControl;
29fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct Surface;
30fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct IMediaPlayer;
31fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct IStreamListener;
32fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
33fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber// This class reassembles incoming RTP packets into the correct order
34fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber// and sends the resulting transport stream to a mediaplayer instance
35fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber// for playback.
36fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct TunnelRenderer : public AHandler {
37fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    TunnelRenderer(
38fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber            const sp<AMessage> &notifyLost,
39fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber            const sp<ISurfaceTexture> &surfaceTex);
40fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
41fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<ABuffer> dequeueBuffer();
42fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
43fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    enum {
44fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber        kWhatQueueBuffer,
45fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    };
46fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
47fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberprotected:
48fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
49fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    virtual ~TunnelRenderer();
50fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
51fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberprivate:
52fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    struct PlayerClient;
53fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    struct StreamSource;
54fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
55fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    mutable Mutex mLock;
56fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
57fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<AMessage> mNotifyLost;
58fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<ISurfaceTexture> mSurfaceTex;
59fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
60fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    List<sp<ABuffer> > mPackets;
61fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int64_t mTotalBytesQueued;
62fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
63fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<SurfaceComposerClient> mComposerClient;
64fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<SurfaceControl> mSurfaceControl;
65fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<Surface> mSurface;
66fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<PlayerClient> mPlayerClient;
67fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<IMediaPlayer> mPlayer;
68fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<StreamSource> mStreamSource;
69fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
70fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int32_t mLastDequeuedExtSeqNo;
71fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int64_t mFirstFailedAttemptUs;
72fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    bool mRequestedRetransmission;
73fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
74fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    void initPlayer();
75fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    void destroyPlayer();
76fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
77fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    void queueBuffer(const sp<ABuffer> &buffer);
78fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
79fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(TunnelRenderer);
80fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber};
81fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
82fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber}  // namespace android
83fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
84fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#endif  // TUNNEL_RENDERER_H_
85