1d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber/*
2d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Copyright 2012, The Android Open Source Project
3d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
4d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * you may not use this file except in compliance with the License.
6d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * You may obtain a copy of the License at
7d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
8d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *     http://www.apache.org/licenses/LICENSE-2.0
9d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
10d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * See the License for the specific language governing permissions and
14d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * limitations under the License.
15d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber */
16d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
17d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#ifndef PLAYBACK_SESSION_H_
18d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
19d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#define PLAYBACK_SESSION_H_
20d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
21a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include "MediaSender.h"
2294a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber#include "VideoFormats.h"
23d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include "WifiDisplaySource.h"
24d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
25be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov#include <utils/String16.h>
26be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov
27d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubernamespace android {
28d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
29d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct ABuffer;
30b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huberstruct IHDCP;
31ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IGraphicBufferProducer;
32e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huberstruct MediaPuller;
33e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huberstruct MediaSource;
34a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huberstruct MediaSender;
350b530f1050150bb751ae642d5a9dce34141d9475Andreas Huberstruct NuMediaExtractor;
36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
37d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Encapsulates the state of an RTP/RTCP session in the context of wifi
38d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// display.
39d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstruct WifiDisplaySource::PlaybackSession : public AHandler {
40d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    PlaybackSession(
41be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 &opPackageName,
420b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber            const sp<ANetworkSession> &netSession,
430b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber            const sp<AMessage> &notify,
44bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber            const struct in_addr &interfaceAddr,
450b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber            const sp<IHDCP> &hdcp,
460b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber            const char *path = NULL);
47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t init(
492aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber            const char *clientIP,
502aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber            int32_t clientRtp,
512aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber            RTPSender::TransportMode rtpMode,
522aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber            int32_t clientRtcp,
532aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber            RTPSender::TransportMode rtcpMode,
5494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            bool enableAudio,
5594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            bool usePCMAudio,
5694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            bool enableVideo,
5794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            VideoFormats::ResolutionType videoResolutionType,
58308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            size_t videoResolutionIndex,
59308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            VideoFormats::ProfileType videoProfileType,
60308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            VideoFormats::LevelType videoLevelType);
61d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
6296fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    void destroyAsync();
63a438123bd96c7faf145683876702387efe5628d9Andreas Huber
64d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int32_t getRTPPort() const;
65d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
66d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int64_t getLastLifesignUs() const;
67d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void updateLiveness();
68d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
69d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t play();
70bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber    status_t finishPlay();
71d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t pause();
72d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
738ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    sp<IGraphicBufferProducer> getSurfaceTexture();
740b73d4730202fcad53aefc4314a06e7b95f442f0Andreas Huber
75496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    void requestIDRFrame();
76496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
77d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    enum {
78d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatSessionDead,
79d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatBinaryData,
80bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber        kWhatSessionEstablished,
8196fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber        kWhatSessionDestroyed,
82d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
83d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
84d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprotected:
85d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
86d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    virtual ~PlaybackSession();
87d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
88d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprivate:
89d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    struct Track;
90d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
91d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    enum {
92207e18540fefbaf530a4fdf506d266f34ddec84fAndreas Huber        kWhatMediaPullerNotify,
93d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatConverterNotify,
9496fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber        kWhatTrackNotify,
95d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatUpdateSurface,
965131d127a042ee88f903370be88845dc8c9f8578Andreas Huber        kWhatPause,
975131d127a042ee88f903370be88845dc8c9f8578Andreas Huber        kWhatResume,
98a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        kWhatMediaSenderNotify,
990b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber        kWhatPullExtractorSample,
100d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
101d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
102be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov    String16 mOpPackageName;
103be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov
104d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<ANetworkSession> mNetSession;
105d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<AMessage> mNotify;
106bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber    in_addr mInterfaceAddr;
107b8c7bd418f0ee5b88923b0e0817e3a4acc53cf8dAndreas Huber    sp<IHDCP> mHDCP;
1080b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    AString mMediaPath;
109a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
110a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    sp<MediaSender> mMediaSender;
111a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    int32_t mLocalRTPPort;
112a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
113ef7d3793fa9bbfb25253626ede9a020ee9280a17Andreas Huber    bool mWeAreDead;
1145131d127a042ee88f903370be88845dc8c9f8578Andreas Huber    bool mPaused;
115d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
116d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int64_t mLastLifesignUs;
117d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1185205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza    sp<IGraphicBufferProducer> mProducer;
119d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
120d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    KeyedVector<size_t, sp<Track> > mTracks;
121e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber    ssize_t mVideoTrackIndex;
122d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
123d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int64_t mPrevTimeUs;
124d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1250b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    sp<NuMediaExtractor> mExtractor;
1260b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    KeyedVector<size_t, size_t> mExtractorTrackToInternalTrack;
1270b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    bool mPullExtractorPending;
1280b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    int32_t mPullExtractorGeneration;
1290b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    int64_t mFirstSampleTimeRealUs;
1300b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    int64_t mFirstSampleTimeUs;
1310b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber
1320b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    status_t setupMediaPacketizer(bool enableAudio, bool enableVideo);
1330b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber
13494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber    status_t setupPacketizer(
13594a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            bool enableAudio,
13694a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            bool usePCMAudio,
13794a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            bool enableVideo,
13894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            VideoFormats::ResolutionType videoResolutionType,
139308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            size_t videoResolutionIndex,
140308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            VideoFormats::ProfileType videoProfileType,
141308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            VideoFormats::LevelType videoLevelType);
142d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
143e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber    status_t addSource(
144e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber            bool isVideo,
145e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber            const sp<MediaSource> &source,
1464a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            bool isRepeaterSource,
147e7bd24af08ef0722fb124a550662bcec48c56f86Andreas Huber            bool usePCMAudio,
148308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            unsigned profileIdc,
149308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            unsigned levelIdc,
150308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            unsigned contraintSet,
151e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber            size_t *numInputBuffers);
152e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber
15394a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber    status_t addVideoSource(
15494a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber            VideoFormats::ResolutionType videoResolutionType,
155308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            size_t videoResolutionIndex,
156308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            VideoFormats::ProfileType videoProfileType,
157308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            VideoFormats::LevelType videoLevelType);
15894a483bf2bd699275673d9cd57cb125d48572f30Andreas Huber
159e7bd24af08ef0722fb124a550662bcec48c56f86Andreas Huber    status_t addAudioSource(bool usePCMAudio);
160e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber
161a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    status_t onMediaSenderInitialized();
16228e17ed7e2fbb254fb99481b74db85e427c905eeAndreas Huber
163ef7d3793fa9bbfb25253626ede9a020ee9280a17Andreas Huber    void notifySessionDead();
164ef7d3793fa9bbfb25253626ede9a020ee9280a17Andreas Huber
1650b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    void schedulePullExtractor();
1660b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber    void onPullExtractor();
1670b530f1050150bb751ae642d5a9dce34141d9475Andreas Huber
1682aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber    void onSinkFeedback(const sp<AMessage> &msg);
1692aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber
170d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PlaybackSession);
171d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber};
172d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
173d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}  // namespace android
174d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
175d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif  // PLAYBACK_SESSION_H_
176d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
177