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> ¬ify, 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