1a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber/* 2a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * Copyright 2013, The Android Open Source Project 3a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * 4a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * you may not use this file except in compliance with the License. 6a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * You may obtain a copy of the License at 7a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * 8a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * 10a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * Unless required by applicable law or agreed to in writing, software 11a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * See the License for the specific language governing permissions and 14a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber * limitations under the License. 15a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber */ 16a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 17a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber//#define LOG_NDEBUG 0 18a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#define LOG_TAG "MediaSender" 19a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include <utils/Log.h> 20a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 21a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include "MediaSender.h" 22a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 23a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include "rtp/RTPSender.h" 24a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include "source/TSPacketizer.h" 25a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 26a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include "include/avc_utils.h" 27a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 28a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include <media/IHDCP.h> 29308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang#include <media/stagefright/MediaBuffer.h> 30a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 31a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include <media/stagefright/foundation/ADebug.h> 32a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber#include <media/stagefright/foundation/AMessage.h> 338060060217ff16cd67c8f6a15c649f44c343acf0Andreas Huber#include <media/stagefright/foundation/ANetworkSession.h> 34308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang#include <ui/GraphicBuffer.h> 35a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 36a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Hubernamespace android { 37a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 38a556c4822fc205db0d27834ba5b637c351d73ffaAndreas HuberMediaSender::MediaSender( 39a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber const sp<ANetworkSession> &netSession, 40a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber const sp<AMessage> ¬ify) 41a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber : mNetSession(netSession), 42a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mNotify(notify), 43a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mMode(MODE_UNDEFINED), 44a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mGeneration(0), 45a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mPrevTimeUs(-1ll), 46bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber mInitDoneCount(0), 47bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber mLogFile(NULL) { 48bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber // mLogFile = fopen("/data/misc/log.ts", "wb"); 49a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 50a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 51a556c4822fc205db0d27834ba5b637c351d73ffaAndreas HuberMediaSender::~MediaSender() { 52bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber if (mLogFile != NULL) { 53bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber fclose(mLogFile); 54bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber mLogFile = NULL; 55bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber } 56a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 57a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 58a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huberstatus_t MediaSender::setHDCP(const sp<IHDCP> &hdcp) { 59a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mMode != MODE_UNDEFINED) { 60a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return INVALID_OPERATION; 61a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 62a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 63a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mHDCP = hdcp; 64a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 65a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return OK; 66a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 67a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 68a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huberssize_t MediaSender::addTrack(const sp<AMessage> &format, uint32_t flags) { 69a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mMode != MODE_UNDEFINED) { 70a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return INVALID_OPERATION; 71a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 72a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 73a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber TrackInfo info; 74a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info.mFormat = format; 75a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info.mFlags = flags; 76a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info.mPacketizerTrackIndex = -1; 77a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 78a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber AString mime; 79a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber CHECK(format->findString("mime", &mime)); 80a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info.mIsAudio = !strncasecmp("audio/", mime.c_str(), 6); 81a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 82a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber size_t index = mTrackInfos.size(); 83a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mTrackInfos.push_back(info); 84a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 85a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return index; 86a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 87a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 88a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huberstatus_t MediaSender::initAsync( 89a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber ssize_t trackIndex, 90a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber const char *remoteHost, 91a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int32_t remoteRTPPort, 922aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber RTPSender::TransportMode rtpMode, 93a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int32_t remoteRTCPPort, 942aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber RTPSender::TransportMode rtcpMode, 95a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int32_t *localRTPPort) { 96a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (trackIndex < 0) { 97a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mMode != MODE_UNDEFINED) { 98a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return INVALID_OPERATION; 99a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 100a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 101bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber uint32_t flags = 0; 102bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber if (mHDCP != NULL) { 103bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber // XXX Determine proper HDCP version. 104bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber flags |= TSPacketizer::EMIT_HDCP20_DESCRIPTOR; 105bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber } 106bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber mTSPacketizer = new TSPacketizer(flags); 107a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 108a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber status_t err = OK; 109a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber for (size_t i = 0; i < mTrackInfos.size(); ++i) { 110a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber TrackInfo *info = &mTrackInfos.editItemAt(i); 111a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 112a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber ssize_t packetizerTrackIndex = 113bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber mTSPacketizer->addTrack(info->mFormat); 114a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 115a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (packetizerTrackIndex < 0) { 116a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber err = packetizerTrackIndex; 117a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber break; 118a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 119a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 120a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info->mPacketizerTrackIndex = packetizerTrackIndex; 121a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 122a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 123a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (err == OK) { 124a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber sp<AMessage> notify = new AMessage(kWhatSenderNotify, id()); 125a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notify->setInt32("generation", mGeneration); 126a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mTSSender = new RTPSender(mNetSession, notify); 127a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber looper()->registerHandler(mTSSender); 128a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 129a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber err = mTSSender->initAsync( 130a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber remoteHost, 131a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber remoteRTPPort, 1322aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber rtpMode, 133a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber remoteRTCPPort, 1342aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber rtcpMode, 135a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber localRTPPort); 136a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 137a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (err != OK) { 138a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber looper()->unregisterHandler(mTSSender->id()); 139a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mTSSender.clear(); 140a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 141a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 142a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 143a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (err != OK) { 144a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber for (size_t i = 0; i < mTrackInfos.size(); ++i) { 145a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber TrackInfo *info = &mTrackInfos.editItemAt(i); 146a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info->mPacketizerTrackIndex = -1; 147a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 148a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 149a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mTSPacketizer.clear(); 150a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return err; 151a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 152a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 153a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mMode = MODE_TRANSPORT_STREAM; 154a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mInitDoneCount = 1; 155a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 156a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return OK; 157a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 158a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 159a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mMode == MODE_TRANSPORT_STREAM) { 160a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return INVALID_OPERATION; 161a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 162a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 163a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if ((size_t)trackIndex >= mTrackInfos.size()) { 164a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return -ERANGE; 165a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 166a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 167a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber TrackInfo *info = &mTrackInfos.editItemAt(trackIndex); 168a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 169a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (info->mSender != NULL) { 170a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return INVALID_OPERATION; 171a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 172a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 173a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber sp<AMessage> notify = new AMessage(kWhatSenderNotify, id()); 174a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notify->setInt32("generation", mGeneration); 175a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notify->setSize("trackIndex", trackIndex); 176a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 177a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info->mSender = new RTPSender(mNetSession, notify); 178a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber looper()->registerHandler(info->mSender); 179a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 180a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber status_t err = info->mSender->initAsync( 181a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber remoteHost, 182a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber remoteRTPPort, 1832aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber rtpMode, 184a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber remoteRTCPPort, 1852aea9552aeba92bbaf9e56c666049ea2d14057b5Andreas Huber rtcpMode, 186a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber localRTPPort); 187a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 188a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (err != OK) { 189a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber looper()->unregisterHandler(info->mSender->id()); 190a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info->mSender.clear(); 191a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 192a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return err; 193a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 194a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 195a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mMode == MODE_UNDEFINED) { 196a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mInitDoneCount = mTrackInfos.size(); 197a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 198a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 199a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mMode = MODE_ELEMENTARY_STREAMS; 200a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 201a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return OK; 202a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 203a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 204a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huberstatus_t MediaSender::queueAccessUnit( 205a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber size_t trackIndex, const sp<ABuffer> &accessUnit) { 206a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mMode == MODE_UNDEFINED) { 207a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return INVALID_OPERATION; 208a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 209a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 210a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (trackIndex >= mTrackInfos.size()) { 211a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return -ERANGE; 212a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 213a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 214a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mMode == MODE_TRANSPORT_STREAM) { 215a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber TrackInfo *info = &mTrackInfos.editItemAt(trackIndex); 216a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info->mAccessUnits.push_back(accessUnit); 217a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 218a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mTSPacketizer->extractCSDIfNecessary(info->mPacketizerTrackIndex); 219a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 220a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber for (;;) { 221a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber ssize_t minTrackIndex = -1; 222a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int64_t minTimeUs = -1ll; 223a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 224a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber for (size_t i = 0; i < mTrackInfos.size(); ++i) { 225a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber const TrackInfo &info = mTrackInfos.itemAt(i); 226a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 227a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (info.mAccessUnits.empty()) { 228a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber minTrackIndex = -1; 229a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber minTimeUs = -1ll; 230a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber break; 231a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 232a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 233a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int64_t timeUs; 234a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber const sp<ABuffer> &accessUnit = *info.mAccessUnits.begin(); 235a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &timeUs)); 236a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 237a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (minTrackIndex < 0 || timeUs < minTimeUs) { 238a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber minTrackIndex = i; 239a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber minTimeUs = timeUs; 240a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 241a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 242a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 243a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (minTrackIndex < 0) { 244a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return OK; 245a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 246a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 247a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber TrackInfo *info = &mTrackInfos.editItemAt(minTrackIndex); 248a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber sp<ABuffer> accessUnit = *info->mAccessUnits.begin(); 249a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info->mAccessUnits.erase(info->mAccessUnits.begin()); 250a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 251a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber sp<ABuffer> tsPackets; 252a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber status_t err = packetizeAccessUnit( 253a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber minTrackIndex, accessUnit, &tsPackets); 254a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 255a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (err == OK) { 256bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber if (mLogFile != NULL) { 257bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber fwrite(tsPackets->data(), 1, tsPackets->size(), mLogFile); 258bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber } 259bfd79f2a8e795f304062e22756c72d995af7a0e6Andreas Huber 260a239dd722e760fe4fd7379b454d7722e1f312928Andreas Huber int64_t timeUs; 261a239dd722e760fe4fd7379b454d7722e1f312928Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &timeUs)); 262a239dd722e760fe4fd7379b454d7722e1f312928Andreas Huber tsPackets->meta()->setInt64("timeUs", timeUs); 263a239dd722e760fe4fd7379b454d7722e1f312928Andreas Huber 264a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber err = mTSSender->queueBuffer( 265a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber tsPackets, 266a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 33 /* packetType */, 267a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber RTPSender::PACKETIZATION_TRANSPORT_STREAM); 268a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 269a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 270a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (err != OK) { 271a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return err; 272a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 273a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 274a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 275a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 276a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber TrackInfo *info = &mTrackInfos.editItemAt(trackIndex); 277a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 278a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return info->mSender->queueBuffer( 279a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber accessUnit, 280a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info->mIsAudio ? 96 : 97 /* packetType */, 281a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info->mIsAudio 282a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber ? RTPSender::PACKETIZATION_AAC : RTPSender::PACKETIZATION_H264); 283a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 284a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 285a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Hubervoid MediaSender::onMessageReceived(const sp<AMessage> &msg) { 286a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber switch (msg->what()) { 287a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber case kWhatSenderNotify: 288a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber { 289a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int32_t generation; 290a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber CHECK(msg->findInt32("generation", &generation)); 291a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (generation != mGeneration) { 292a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber break; 293a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 294a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 295a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber onSenderNotify(msg); 296a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber break; 297a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 298a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 299a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber default: 300a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber TRESPASS(); 301a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 302a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 303a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 304a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Hubervoid MediaSender::onSenderNotify(const sp<AMessage> &msg) { 305a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int32_t what; 306a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber CHECK(msg->findInt32("what", &what)); 307a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 308a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber switch (what) { 309a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber case RTPSender::kWhatInitDone: 310a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber { 311a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber --mInitDoneCount; 312a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 313a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int32_t err; 314a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber CHECK(msg->findInt32("err", &err)); 315a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 316a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (err != OK) { 317a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notifyInitDone(err); 318a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber ++mGeneration; 319a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber break; 320a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 321a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 322a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mInitDoneCount == 0) { 323a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notifyInitDone(OK); 324a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 325a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber break; 326a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 327a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 328a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber case RTPSender::kWhatError: 329a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber { 330a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int32_t err; 331a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber CHECK(msg->findInt32("err", &err)); 332a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 333a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notifyError(err); 334a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber break; 335a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 336a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 337126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber case kWhatNetworkStall: 338126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber { 339126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber size_t numBytesQueued; 340126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber CHECK(msg->findSize("numBytesQueued", &numBytesQueued)); 341126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber 342126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber notifyNetworkStall(numBytesQueued); 343126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber break; 344126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber } 345126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber 346c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber case kWhatInformSender: 347c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber { 348c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber int64_t avgLatencyUs; 349c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber CHECK(msg->findInt64("avgLatencyUs", &avgLatencyUs)); 350c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber 351c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber int64_t maxLatencyUs; 352c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber CHECK(msg->findInt64("maxLatencyUs", &maxLatencyUs)); 353c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber 354c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber sp<AMessage> notify = mNotify->dup(); 355c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber notify->setInt32("what", kWhatInformSender); 356c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber notify->setInt64("avgLatencyUs", avgLatencyUs); 357c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber notify->setInt64("maxLatencyUs", maxLatencyUs); 358c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber notify->post(); 359c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber break; 360c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber } 361c86ef45279185b474bd6af0a7ae407f8ab577f13Andreas Huber 362a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber default: 363a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber TRESPASS(); 364a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 365a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 366a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 367a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Hubervoid MediaSender::notifyInitDone(status_t err) { 368a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber sp<AMessage> notify = mNotify->dup(); 369a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notify->setInt32("what", kWhatInitDone); 370a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notify->setInt32("err", err); 371a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notify->post(); 372a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 373a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 374a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Hubervoid MediaSender::notifyError(status_t err) { 375a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber sp<AMessage> notify = mNotify->dup(); 376a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notify->setInt32("what", kWhatError); 377a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notify->setInt32("err", err); 378a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber notify->post(); 379a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 380a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 381126568c7aeeb5570789e70a310477f44dbdbd885Andreas Hubervoid MediaSender::notifyNetworkStall(size_t numBytesQueued) { 382126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber sp<AMessage> notify = mNotify->dup(); 383126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber notify->setInt32("what", kWhatNetworkStall); 384126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber notify->setSize("numBytesQueued", numBytesQueued); 385126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber notify->post(); 386126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber} 387126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber 388a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huberstatus_t MediaSender::packetizeAccessUnit( 389a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber size_t trackIndex, 390a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber sp<ABuffer> accessUnit, 391a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber sp<ABuffer> *tsPackets) { 392a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber const TrackInfo &info = mTrackInfos.itemAt(trackIndex); 393a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 394a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber uint32_t flags = 0; 395a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 396a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber bool isHDCPEncrypted = false; 397a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber uint64_t inputCTR; 398a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber uint8_t HDCP_private_data[16]; 399a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 400a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber bool manuallyPrependSPSPPS = 401a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber !info.mIsAudio 402a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber && (info.mFlags & FLAG_MANUALLY_PREPEND_SPS_PPS) 403a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber && IsIDR(accessUnit); 404a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 405a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mHDCP != NULL && !info.mIsAudio) { 406a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber isHDCPEncrypted = true; 407a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 408a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (manuallyPrependSPSPPS) { 409a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber accessUnit = mTSPacketizer->prependCSD( 410a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info.mPacketizerTrackIndex, accessUnit); 411a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 412a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 413308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang status_t err; 414308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang native_handle_t* handle; 415308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (accessUnit->meta()->findPointer("handle", (void**)&handle) 416308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && handle != NULL) { 417308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t rangeLength, rangeOffset; 418308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang sp<AMessage> notify; 419308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang CHECK(accessUnit->meta()->findInt32("rangeOffset", &rangeOffset)); 420308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang CHECK(accessUnit->meta()->findInt32("rangeLength", &rangeLength)); 421308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang CHECK(accessUnit->meta()->findMessage("notify", ¬ify) 422308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && notify != NULL); 423308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang CHECK_GE(accessUnit->size(), rangeLength); 424308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 425308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang sp<GraphicBuffer> grbuf(new GraphicBuffer( 426308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang rangeOffset + rangeLength, 1, HAL_PIXEL_FORMAT_Y8, 427308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang GRALLOC_USAGE_HW_VIDEO_ENCODER, rangeOffset + rangeLength, 428308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang handle, false)); 429308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 430308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang err = mHDCP->encryptNative( 431308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang grbuf, rangeOffset, rangeLength, 432308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang trackIndex /* streamCTR */, 433308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang &inputCTR, 434308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang accessUnit->data()); 435308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang notify->post(); 436308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 437308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang err = mHDCP->encrypt( 438308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang accessUnit->data(), accessUnit->size(), 439308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang trackIndex /* streamCTR */, 440308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang &inputCTR, 441308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang accessUnit->data()); 442308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 443a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 444a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (err != OK) { 445a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber ALOGE("Failed to HDCP-encrypt media data (err %d)", 446a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber err); 447a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 448a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return err; 449a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 450a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 451a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[0] = 0x00; 452a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 453a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[1] = 454a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber (((trackIndex >> 30) & 3) << 1) | 1; 455a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 456a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[2] = (trackIndex >> 22) & 0xff; 457a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 458a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[3] = 459a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber (((trackIndex >> 15) & 0x7f) << 1) | 1; 460a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 461a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[4] = (trackIndex >> 7) & 0xff; 462a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 463a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[5] = 464a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber ((trackIndex & 0x7f) << 1) | 1; 465a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 466a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[6] = 0x00; 467a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 468a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[7] = 469a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber (((inputCTR >> 60) & 0x0f) << 1) | 1; 470a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 471a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[8] = (inputCTR >> 52) & 0xff; 472a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 473a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[9] = 474a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber (((inputCTR >> 45) & 0x7f) << 1) | 1; 475a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 476a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[10] = (inputCTR >> 37) & 0xff; 477a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 478a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[11] = 479a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber (((inputCTR >> 30) & 0x7f) << 1) | 1; 480a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 481a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[12] = (inputCTR >> 22) & 0xff; 482a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 483a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[13] = 484a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber (((inputCTR >> 15) & 0x7f) << 1) | 1; 485a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 486a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[14] = (inputCTR >> 7) & 0xff; 487a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 488a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber HDCP_private_data[15] = 489a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber ((inputCTR & 0x7f) << 1) | 1; 490a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 491a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber flags |= TSPacketizer::IS_ENCRYPTED; 492a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } else if (manuallyPrependSPSPPS) { 493a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber flags |= TSPacketizer::PREPEND_SPS_PPS_TO_IDR_FRAMES; 494a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 495a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 496a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber int64_t timeUs = ALooper::GetNowUs(); 497a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber if (mPrevTimeUs < 0ll || mPrevTimeUs + 100000ll <= timeUs) { 498a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber flags |= TSPacketizer::EMIT_PCR; 499a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber flags |= TSPacketizer::EMIT_PAT_AND_PMT; 500a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 501a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mPrevTimeUs = timeUs; 502a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber } 503a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 504a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber mTSPacketizer->packetize( 505a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info.mPacketizerTrackIndex, 506a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber accessUnit, 507a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber tsPackets, 508a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber flags, 509a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber !isHDCPEncrypted ? NULL : HDCP_private_data, 510a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber !isHDCPEncrypted ? 0 : sizeof(HDCP_private_data), 511a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber info.mIsAudio ? 2 : 0 /* numStuffingBytes */); 512a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 513a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber return OK; 514a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} 515a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 516a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber} // namespace android 517a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber 518