Mulitimedia-pause(RTSP)

来源:互联网 发布:java高性能并发框架 编辑:程序博客网 时间:2024/06/09 18:33

>>MediaPlayerService.cpp


status_t MediaPlayerService::Client::pause()

{
    ALOGV("[%d] pause", mConnId);
    sp<MediaPlayerBase> p = getPlayer();
    if (p == 0) return UNKNOWN_ERROR;


    MM_LOGI("[%d] pause", mConnId);


    return p->pause();

}

>>NuPlayer.cpp

void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {

......

        case kWhatPause:
        {

            if (mSource != NULL) {
                mSource->pause();
            } else {
                ALOGW("pause called when source is gone or not set");
            }
            if (mRenderer != NULL) {
                mRenderer->pause();
            } else {
                ALOGW("pause called when renderer is gone or not set");
            }
            break;
        }

......

}

>>NuPlayer.cpp

void NuPlayer::pause() {
    (new AMessage(kWhatPause, id()))->post();
}

>>RTSPSource.cpp

void NuPlayer::RTSPSource::pause() {

    int64_t mediaDurationUs = 0;
    getDuration(&mediaDurationUs);
    for (size_t index = 0; index < mTracks.size(); index++) {
        TrackInfo *info = &mTracks.editItemAt(index);
        sp<AnotherPacketSource> source = info->mSource;


        // Check if EOS or ERROR is received
        if (source != NULL && source->isFinished(mediaDurationUs)) {
            return;
        }
    }

    mHandler->pause();
}

>>MyHandler.h

    void pause() {
        sp<AMessage> msg = new AMessage('paus', id());
        mPauseGeneration++;
        msg->setInt32("pausecheck", mPauseGeneration);
        msg->post(kPauseDelayUs);

    }

>>MyHandler.h

virtual void onMessageReceived(const sp<AMessage> &msg) {

......

   case 'paus':
            {
                int32_t generation;
                CHECK(msg->findInt32("pausecheck", &generation));
                if (generation != mPauseGeneration) {
                    ALOGV("Ignoring outdated pause message.");

                    break;
                }
                if (!mSeekable) {

                    ALOGW("This is a live stream, ignoring pause request.");
                    break;
                }
                mCheckPending = true;
                ++mCheckGeneration;
                mPausing = true;
                AString request = "PAUSE ";
                request.append(mControlURL);
                request.append(" RTSP/1.0\r\n");
                request.append("Session: ");
                request.append(mSessionID);
                request.append("\r\n");
                request.append("\r\n");
                sp<AMessage> reply = new AMessage('pau2', id());
                mConn->
sendRequest(request.c_str(), reply);
                break;
            }

......

}

>>ARTSPConnection.cpp

void ARTSPConnection::sendRequest(
        const char *request, const sp<AMessage> &reply) {
    sp<AMessage> msg = new AMessage(
kWhatSendRequest, id());
    msg->setString("request", request);
    msg->setMessage("reply", reply);
    msg->post();
}

>>ARTSPConnection.cpp

void ARTSPConnection::onMessageReceived(const sp<AMessage> &msg) {

        case kWhatSendRequest:
            onSendRequest(msg);
            break;

......

}

void ARTSPConnection::onSendRequest(const sp<AMessage> &msg) {

    sp<AMessage> reply;
    CHECK(msg->findMessage("reply", &reply));

    if (mState != CONNECTED) {
        reply->setInt32("result", -ENOTCONN);
        reply->post();
        return;
    }

    AString request;
    CHECK(msg->findString("request", &request));

    // Just in case we need to re-issue the request with proper authentication
    // later, stash it away.
    reply->setString("original-request", request.c_str(), request.size());

    addAuthentication(&request);
    addUserAgent(&request);

    // Find the boundary between headers and the body.

    ssize_t i = request.find("\r\n\r\n");
    CHECK_GE(i, 0);

    int32_t cseq = mNextCSeq++;

    AString cseqHeader = "CSeq: ";
    cseqHeader.append(cseq);
    cseqHeader.append("\r\n");

    request.insert(cseqHeader, i + 2);


    ALOGV("request: '%s'", request.c_str());


    size_t numBytesSent = 0;
    while (numBytesSent < request.size()) {
        ssize_t n =

            send(mSocket, request.c_str() + numBytesSent,
                 request.size() - numBytesSent, 0);


        if (n < 0 && errno == EINTR) {
            continue;
        }

        if (n <= 0) {
            performDisconnect();

            if (n == 0) {
                // Server closed the connection.
                ALOGE("Server unexpectedly closed the connection.");

                reply->setInt32("result", ERROR_IO);
                reply->post();
            } else {
                ALOGE("Error sending rtsp request. (%s)", strerror(errno));
                reply->setInt32("result", -errno);
                reply->post();
            }

            return;
        }

        numBytesSent += (size_t)n;
    }

    mPendingRequests.add(cseq, reply);

}

0 0
原创粉丝点击