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 RTP_SINK_H_
18fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
19fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#define RTP_SINK_H_
20fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
21fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#include <media/stagefright/foundation/AHandler.h>
22fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
23fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#include "LinearRegression.h"
24fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
25fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#include <gui/Surface.h>
26fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
27fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Hubernamespace android {
28fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
29fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct ABuffer;
30fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct ANetworkSession;
31fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct TunnelRenderer;
32fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
33fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber// Creates a pair of sockets for RTP/RTCP traffic, instantiates a renderer
34fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber// for incoming transport stream data and occasionally sends statistics over
35fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber// the RTCP channel.
36fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct RTPSink : public AHandler {
37fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    RTPSink(const sp<ANetworkSession> &netSession,
38fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber            const sp<ISurfaceTexture> &surfaceTex);
39fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
40fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    // If TCP interleaving is used, no UDP sockets are created, instead
41fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    // incoming RTP/RTCP packets (arriving on the RTSP control connection)
42fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    // are manually injected by WifiDisplaySink.
43fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    status_t init(bool useTCPInterleaving);
44fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
45fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    status_t connect(
46fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber            const char *host, int32_t remoteRtpPort, int32_t remoteRtcpPort);
47fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
48fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int32_t getRTPPort() const;
49fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
50fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    status_t injectPacket(bool isRTP, const sp<ABuffer> &buffer);
51fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
52fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberprotected:
53fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
54fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    virtual ~RTPSink();
55fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
56fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberprivate:
57fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    enum {
58fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber        kWhatRTPNotify,
59fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber        kWhatRTCPNotify,
60fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber        kWhatSendRR,
61fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber        kWhatPacketLost,
62fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber        kWhatInject,
63fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    };
64fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
65fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    struct Source;
66fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    struct StreamSource;
67fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
68fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<ANetworkSession> mNetSession;
69fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<ISurfaceTexture> mSurfaceTex;
70fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    KeyedVector<uint32_t, sp<Source> > mSources;
71fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
72fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int32_t mRTPPort;
73fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int32_t mRTPSessionID;
74fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int32_t mRTCPSessionID;
75fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
76fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int64_t mFirstArrivalTimeUs;
77fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int64_t mNumPacketsReceived;
78fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    LinearRegression mRegression;
79fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    int64_t mMaxDelayMs;
80fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
81fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    sp<TunnelRenderer> mRenderer;
82fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
83fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    status_t parseRTP(const sp<ABuffer> &buffer);
84fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    status_t parseRTCP(const sp<ABuffer> &buffer);
85fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    status_t parseBYE(const uint8_t *data, size_t size);
86fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    status_t parseSR(const uint8_t *data, size_t size);
87fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
88fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    void addSDES(const sp<ABuffer> &buffer);
89fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    void onSendRR();
90fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    void onPacketLost(const sp<AMessage> &msg);
91fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    void scheduleSendRR();
92fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
93fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(RTPSink);
94fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber};
95fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
96fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber}  // namespace android
97fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber
98fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#endif  // RTP_SINK_H_
99