RTSPSource.cpp revision 1906e5c7492b9cbc88601365536a69e9a490c963
12bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/*
22bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Copyright (C) 2010 The Android Open Source Project
32bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber *
42bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
52bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * you may not use this file except in compliance with the License.
62bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * You may obtain a copy of the License at
72bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber *
82bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
92bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber *
102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Unless required by applicable law or agreed to in writing, software
112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * See the License for the specific language governing permissions and
142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * limitations under the License.
152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber */
162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber//#define LOG_NDEBUG 0
182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#define LOG_TAG "RTSPSource"
192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <utils/Log.h>
202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "RTSPSource.h"
222bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
232bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "AnotherPacketSource.h"
242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "MyHandler.h"
252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <media/stagefright/MetaData.h>
272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
282bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubernamespace android {
292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
302bfdd428c56c7524d1a11979f200a1762866032dAndreas HuberNuPlayer::RTSPSource::RTSPSource(
312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        const char *url,
322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        const KeyedVector<String8, String8> *headers,
332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        bool uidValid,
342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        uid_t uid)
352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    : mURL(url),
362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber      mUIDValid(uidValid),
372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber      mUID(uid),
382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber      mFlags(0),
392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber      mState(DISCONNECTED),
402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber      mFinalResult(OK),
412bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber      mDisconnectReplyID(0) {
422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (headers) {
432bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mExtraHeaders = *headers;
442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        ssize_t index =
462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mExtraHeaders.indexOfKey(String8("x-hide-urls-from-log"));
472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        if (index >= 0) {
492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mFlags |= kFlagIncognito;
502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mExtraHeaders.removeItemsAt(index);
522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
562bfdd428c56c7524d1a11979f200a1762866032dAndreas HuberNuPlayer::RTSPSource::~RTSPSource() {
572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mLooper != NULL) {
582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mLooper->stop();
592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
622bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubervoid NuPlayer::RTSPSource::start() {
632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mLooper == NULL) {
642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mLooper = new ALooper;
652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mLooper->setName("rtsp");
662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mLooper->start();
672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mReflector = new AHandlerReflector<RTSPSource>(this);
692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mLooper->registerHandler(mReflector);
702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    CHECK(mHandler == NULL);
732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AMessage> notify = new AMessage(kWhatNotify, mReflector->id());
752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mHandler = new MyHandler(mURL.c_str(), notify, mUIDValid, mUID);
772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mLooper->registerHandler(mHandler);
782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    CHECK_EQ(mState, (int)DISCONNECTED);
802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mState = CONNECTING;
812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mHandler->connect();
832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
852bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubervoid NuPlayer::RTSPSource::stop() {
862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDisconnect, mReflector->id());
872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AMessage> dummy;
892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    msg->postAndAwaitResponse(&dummy);
902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstatus_t NuPlayer::RTSPSource::feedMoreTSData() {
932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    return mFinalResult;
942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
962bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubersp<MetaData> NuPlayer::RTSPSource::getFormat(bool audio) {
972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AnotherPacketSource> source = getSource(audio);
982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (source == NULL) {
1002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return NULL;
1012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    return source->getFormat();
1042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
1052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstatus_t NuPlayer::RTSPSource::dequeueAccessUnit(
1072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        bool audio, sp<ABuffer> *accessUnit) {
1082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AnotherPacketSource> source = getSource(audio);
1092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (source == NULL) {
1112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return -EWOULDBLOCK;
1122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    status_t finalResult;
1152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (!source->hasBufferAvailable(&finalResult)) {
1162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return finalResult == OK ? -EWOULDBLOCK : finalResult;
1172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    return source->dequeueAccessUnit(accessUnit);
1202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
1212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1222bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubersp<AnotherPacketSource> NuPlayer::RTSPSource::getSource(bool audio) {
1232bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    return audio ? mAudioTrack : mVideoTrack;
1242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
1252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstatus_t NuPlayer::RTSPSource::getDuration(int64_t *durationUs) {
1272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    *durationUs = 0ll;
1282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    int64_t audioDurationUs;
1302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mAudioTrack != NULL
1312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            && mAudioTrack->getFormat()->findInt64(
1322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                kKeyDuration, &audioDurationUs)
1332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            && audioDurationUs > *durationUs) {
1342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        *durationUs = audioDurationUs;
1352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    int64_t videoDurationUs;
1382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mVideoTrack != NULL
1392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            && mVideoTrack->getFormat()->findInt64(
1402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                kKeyDuration, &videoDurationUs)
1412bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            && videoDurationUs > *durationUs) {
1422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        *durationUs = videoDurationUs;
1432bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    return OK;
1462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
1472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstatus_t NuPlayer::RTSPSource::seekTo(int64_t seekTimeUs) {
1492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mState != CONNECTED) {
1502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return UNKNOWN_ERROR;
1512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mState = SEEKING;
1542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mHandler->seek(seekTimeUs);
1552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    return OK;
1572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
1582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberbool NuPlayer::RTSPSource::isSeekable() {
1602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    return true;
1612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
1622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1632bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubervoid NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
1642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (msg->what() == kWhatDisconnect) {
1652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        uint32_t replyID;
1662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        CHECK(msg->senderAwaitsResponse(&replyID));
1672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mDisconnectReplyID = replyID;
1692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        finishDisconnectIfPossible();
1702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return;
1712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
1722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    CHECK_EQ(msg->what(), (int)kWhatNotify);
1742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    int32_t what;
1762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    CHECK(msg->findInt32("what", &what));
1772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    switch (what) {
1792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        case MyHandler::kWhatConnected:
1802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            onConnected();
1812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            break;
1822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        case MyHandler::kWhatDisconnected:
1842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            onDisconnected(msg);
1852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            break;
1862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        case MyHandler::kWhatSeekDone:
1882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        {
1892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            mState = CONNECTED;
1902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            break;
1912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
1922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        case MyHandler::kWhatAccessUnit:
1942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        {
1952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            size_t trackIndex;
1962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK(msg->findSize("trackIndex", &trackIndex));
1972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK_LT(trackIndex, mTracks.size());
1982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            sp<RefBase> obj;
2002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK(msg->findObject("accessUnit", &obj));
2012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            sp<ABuffer> accessUnit = static_cast<ABuffer *>(obj.get());
2032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            int32_t damaged;
2052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            if (accessUnit->meta()->findInt32("damaged", &damaged)
2062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                    && damaged) {
2072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                LOGI("dropping damaged access unit.");
2082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                break;
2092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            }
2102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2111906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber            TrackInfo *info = &mTracks.editItemAt(trackIndex);
2121906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber
2131906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber            sp<AnotherPacketSource> source = info->mSource;
2142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            if (source != NULL) {
2152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                uint32_t rtpTime;
2162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                CHECK(accessUnit->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
2172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2181906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                if (!info->mNPTMappingValid) {
2191906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                    // This is a live stream, we didn't receive any normal
2201906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                    // playtime mapping. Assume the first packets correspond
2211906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                    // to time 0.
2221906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber
2231906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                    LOGV("This is a live stream, assuming time = 0");
2241906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber
2251906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                    info->mRTPTime = rtpTime;
2261906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                    info->mNormalPlaytimeUs = 0ll;
2271906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                    info->mNPTMappingValid = true;
2281906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                }
2291906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber
2302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                int64_t nptUs =
2311906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                    ((double)rtpTime - (double)info->mRTPTime)
2321906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                        / info->mTimeScale
2332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                        * 1000000ll
2341906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber                        + info->mNormalPlaytimeUs;
2352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                accessUnit->meta()->setInt64("timeUs", nptUs);
2372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                source->queueAccessUnit(accessUnit);
2392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            }
2402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            break;
2412bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
2422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2432bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        case MyHandler::kWhatEOS:
2442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        {
2452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            size_t trackIndex;
2462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK(msg->findSize("trackIndex", &trackIndex));
2472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK_LT(trackIndex, mTracks.size());
2482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            int32_t finalResult;
2502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK(msg->findInt32("finalResult", &finalResult));
2512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK_NE(finalResult, (status_t)OK);
2522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            TrackInfo *info = &mTracks.editItemAt(trackIndex);
2542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            sp<AnotherPacketSource> source = info->mSource;
2552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            if (source != NULL) {
2562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                source->signalEOS(finalResult);
2572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            }
2582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            break;
2602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
2612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        case MyHandler::kWhatSeekDiscontinuity:
2632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        {
2642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            size_t trackIndex;
2652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK(msg->findSize("trackIndex", &trackIndex));
2662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK_LT(trackIndex, mTracks.size());
2672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            TrackInfo *info = &mTracks.editItemAt(trackIndex);
2692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            sp<AnotherPacketSource> source = info->mSource;
2702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            if (source != NULL) {
2712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                source->queueDiscontinuity(ATSParser::DISCONTINUITY_SEEK, NULL);
2722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            }
2732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            break;
2752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
2762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        case MyHandler::kWhatNormalPlayTimeMapping:
2782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        {
2792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            size_t trackIndex;
2802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK(msg->findSize("trackIndex", &trackIndex));
2812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK_LT(trackIndex, mTracks.size());
2822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            uint32_t rtpTime;
2842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK(msg->findInt32("rtpTime", (int32_t *)&rtpTime));
2852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            int64_t nptUs;
2872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            CHECK(msg->findInt64("nptUs", &nptUs));
2882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            TrackInfo *info = &mTracks.editItemAt(trackIndex);
2902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            info->mRTPTime = rtpTime;
2912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            info->mNormalPlaytimeUs = nptUs;
2921906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber            info->mNPTMappingValid = true;
2932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            break;
2942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
2952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
2962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        default:
2972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            TRESPASS();
2982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
2992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
3002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3012bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubervoid NuPlayer::RTSPSource::onConnected() {
3022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    CHECK(mAudioTrack == NULL);
3032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    CHECK(mVideoTrack == NULL);
3042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    size_t numTracks = mHandler->countTracks();
3062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    for (size_t i = 0; i < numTracks; ++i) {
3072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        int32_t timeScale;
3082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        sp<MetaData> format = mHandler->getTrackFormat(i, &timeScale);
3092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        const char *mime;
3112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        CHECK(format->findCString(kKeyMIMEType, &mime));
3122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        bool isAudio = !strncasecmp(mime, "audio/", 6);
3142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        bool isVideo = !strncasecmp(mime, "video/", 6);
3152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        TrackInfo info;
3172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        info.mTimeScale = timeScale;
3182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        info.mRTPTime = 0;
3192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        info.mNormalPlaytimeUs = 0ll;
3201906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber        info.mNPTMappingValid = false;
3212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3222bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        if ((isAudio && mAudioTrack == NULL)
3232bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                || (isVideo && mVideoTrack == NULL)) {
3242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            sp<AnotherPacketSource> source = new AnotherPacketSource(format);
3252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            if (isAudio) {
3272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                mAudioTrack = source;
3282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            } else {
3292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                mVideoTrack = source;
3302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            }
3312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            info.mSource = source;
3332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        }
3342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mTracks.push(info);
3362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mState = CONNECTED;
3392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
3402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3412bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubervoid NuPlayer::RTSPSource::onDisconnected(const sp<AMessage> &msg) {
3422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    status_t err;
3432bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    CHECK(msg->findInt32("result", &err));
3442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    CHECK_NE(err, (status_t)OK);
3452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mLooper->unregisterHandler(mHandler->id());
3472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mHandler.clear();
3482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mState = DISCONNECTED;
3502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mFinalResult = err;
3512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mDisconnectReplyID != 0) {
3532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        finishDisconnectIfPossible();
3542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
3562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3572bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubervoid NuPlayer::RTSPSource::finishDisconnectIfPossible() {
3582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mState != DISCONNECTED) {
3592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mHandler->disconnect();
3602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        return;
3612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
3622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    (new AMessage)->postReply(mDisconnectReplyID);
3642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mDisconnectReplyID = 0;
3652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}
3662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
3672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}  // namespace android
368