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> &notify)
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) {
1241d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar            sp<AMessage> notify = new AMessage(kWhatSenderNotify, this);
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
1731d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> notify = new AMessage(kWhatSenderNotify, this);
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", &notify)
422308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang                    && notify != NULL);
423308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            CHECK_GE(accessUnit->size(), rangeLength);
424308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang
425308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            sp<GraphicBuffer> grbuf(new GraphicBuffer(
4264b2f81808a3d6600ead4d51d0f5a0eba4a7ee6feCraig Donner                    rangeOffset + rangeLength /* width */, 1 /* height */,
4274b2f81808a3d6600ead4d51d0f5a0eba4a7ee6feCraig Donner                    HAL_PIXEL_FORMAT_Y8, 1 /* layerCount */,
4284b2f81808a3d6600ead4d51d0f5a0eba4a7ee6feCraig Donner                    GRALLOC_USAGE_HW_VIDEO_ENCODER,
4294b2f81808a3d6600ead4d51d0f5a0eba4a7ee6feCraig Donner                    rangeOffset + rangeLength /* stride */, handle,
4304b2f81808a3d6600ead4d51d0f5a0eba4a7ee6feCraig Donner                    false /* keepOwnership */));
431308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang
432308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            err = mHDCP->encryptNative(
433308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang                    grbuf, rangeOffset, rangeLength,
434308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang                    trackIndex  /* streamCTR */,
435308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang                    &inputCTR,
436308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang                    accessUnit->data());
437308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            notify->post();
438308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang        } else {
439308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang            err = mHDCP->encrypt(
440308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang                    accessUnit->data(), accessUnit->size(),
441308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang                    trackIndex  /* streamCTR */,
442308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang                    &inputCTR,
443308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang                    accessUnit->data());
444308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang        }
445a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
446a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        if (err != OK) {
447a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            ALOGE("Failed to HDCP-encrypt media data (err %d)",
448a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber                  err);
449a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
450a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            return err;
451a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        }
452a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
453a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[0] = 0x00;
454a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
455a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[1] =
456a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            (((trackIndex >> 30) & 3) << 1) | 1;
457a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
458a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[2] = (trackIndex >> 22) & 0xff;
459a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
460a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[3] =
461a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            (((trackIndex >> 15) & 0x7f) << 1) | 1;
462a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
463a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[4] = (trackIndex >> 7) & 0xff;
464a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
465a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[5] =
466a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            ((trackIndex & 0x7f) << 1) | 1;
467a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
468a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[6] = 0x00;
469a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
470a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[7] =
471a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            (((inputCTR >> 60) & 0x0f) << 1) | 1;
472a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
473a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[8] = (inputCTR >> 52) & 0xff;
474a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
475a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[9] =
476a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            (((inputCTR >> 45) & 0x7f) << 1) | 1;
477a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
478a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[10] = (inputCTR >> 37) & 0xff;
479a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
480a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[11] =
481a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            (((inputCTR >> 30) & 0x7f) << 1) | 1;
482a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
483a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[12] = (inputCTR >> 22) & 0xff;
484a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
485a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[13] =
486a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            (((inputCTR >> 15) & 0x7f) << 1) | 1;
487a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
488a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[14] = (inputCTR >> 7) & 0xff;
489a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
490a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        HDCP_private_data[15] =
491a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            ((inputCTR & 0x7f) << 1) | 1;
492a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
493a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        flags |= TSPacketizer::IS_ENCRYPTED;
494a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    } else if (manuallyPrependSPSPPS) {
495a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        flags |= TSPacketizer::PREPEND_SPS_PPS_TO_IDR_FRAMES;
496a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    }
497a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
498a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    int64_t timeUs = ALooper::GetNowUs();
499a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    if (mPrevTimeUs < 0ll || mPrevTimeUs + 100000ll <= timeUs) {
500a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        flags |= TSPacketizer::EMIT_PCR;
501a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        flags |= TSPacketizer::EMIT_PAT_AND_PMT;
502a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
503a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber        mPrevTimeUs = timeUs;
504a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    }
505a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
506a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    mTSPacketizer->packetize(
507a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            info.mPacketizerTrackIndex,
508a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            accessUnit,
509a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            tsPackets,
510a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            flags,
511a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            !isHDCPEncrypted ? NULL : HDCP_private_data,
512a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            !isHDCPEncrypted ? 0 : sizeof(HDCP_private_data),
513a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber            info.mIsAudio ? 2 : 0 /* numStuffingBytes */);
514a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
515a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber    return OK;
516a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber}
517a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
518a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber}  // namespace android
519a556c4822fc205db0d27834ba5b637c351d73ffaAndreas Huber
520