status_t WifiDisplaySource::onSetParameterRequest( int32_t sessionID, int32_t cseq, const sp<ParsedMessage> &data) { int32_t playbackSessionID; sp<PlaybackSession> playbackSession = findPlaybackSession(data, &playbackSessionID); if (playbackSession == NULL) { sendErrorResponse(sessionID, "454 Session Not Found", cseq); return ERROR_MALFORMED; } if (strstr(data->getContent(), "wfd_idr_request\r\n")) { playbackSession->requestIDRFrame(); } playbackSession->updateLiveness(); AString response = "RTSP/1.0 200 OK\r\n"; AppendCommonResponse(&response, cseq, playbackSessionID); response.append("\r\n"); status_t err = mNetSession->sendRequest(sessionID, response.c_str()); return err; }
status_t WifiDisplaySource::onTeardownRequest( int32_t sessionID, int32_t cseq, const sp<ParsedMessage> &data) { ALOGI("Received TEARDOWN request."); int32_t playbackSessionID; sp<PlaybackSession> playbackSession = findPlaybackSession(data, &playbackSessionID); if (playbackSession == NULL) { sendErrorResponse(sessionID, "454 Session Not Found", cseq); return ERROR_MALFORMED; } AString response = "RTSP/1.0 200 OK\r\n"; AppendCommonResponse(&response, cseq, playbackSessionID); response.append("Connection: close\r\n"); response.append("\r\n"); mNetSession->sendRequest(sessionID, response.c_str()); if (mState == AWAITING_CLIENT_TEARDOWN) { CHECK(mStopReplyID != NULL); finishStop(); } else { mClient->onDisplayError(IRemoteDisplayClient::kDisplayErrorUnknown); } return OK; }
status_t WifiDisplaySource::onOptionsRequest( int32_t sessionID, int32_t cseq, const sp<ParsedMessage> &data) { int32_t playbackSessionID; sp<PlaybackSession> playbackSession = findPlaybackSession(data, &playbackSessionID); if (playbackSession != NULL) { playbackSession->updateLiveness(); } AString response = "RTSP/1.0 200 OK\r\n"; AppendCommonResponse(&response, cseq); response.append( "Public: org.wfa.wfd1.0, SETUP, TEARDOWN, PLAY, PAUSE, " "GET_PARAMETER, SET_PARAMETER\r\n"); response.append("\r\n"); status_t err = mNetSession->sendRequest(sessionID, response.c_str()); if (err == OK) { err = sendM3(sessionID); } return err; }
status_t WifiDisplaySource::onPlayRequest( int32_t sessionID, int32_t cseq, const sp<ParsedMessage> &data) { int32_t playbackSessionID; sp<PlaybackSession> playbackSession = findPlaybackSession(data, &playbackSessionID); if (playbackSession == NULL) { sendErrorResponse(sessionID, "454 Session Not Found", cseq); return ERROR_MALFORMED; } if (mState != AWAITING_CLIENT_PLAY && mState != PAUSED_TO_PLAYING && mState != PAUSED) { ALOGW("Received PLAY request but we're in state %d", mState); sendErrorResponse( sessionID, "455 Method Not Valid in This State", cseq); return INVALID_OPERATION; } ALOGI("Received PLAY request."); if (mPlaybackSessionEstablished) { finishPlay(); } else { ALOGI("deferring PLAY request until session established."); } AString response = "RTSP/1.0 200 OK\r\n"; AppendCommonResponse(&response, cseq, playbackSessionID); response.append("Range: npt=now-\r\n"); response.append("\r\n"); status_t err = mNetSession->sendRequest(sessionID, response.c_str()); if (err != OK) { return err; } if (mState == PAUSED_TO_PLAYING || mPlaybackSessionEstablished) { mState = PLAYING; return OK; } CHECK_EQ(mState, AWAITING_CLIENT_PLAY); mState = ABOUT_TO_PLAY; return OK; }
status_t WifiDisplaySource::onPlayRequest( int32_t sessionID, int32_t cseq, const sp<ParsedMessage> &data) { int32_t playbackSessionID; sp<PlaybackSession> playbackSession = findPlaybackSession(data, &playbackSessionID); if (playbackSession == NULL) { sendErrorResponse(sessionID, "454 Session Not Found", cseq); return ERROR_MALFORMED; } ALOGI("Received PLAY request."); status_t err = playbackSession->play(); CHECK_EQ(err, (status_t)OK); AString response = "RTSP/1.0 200 OK\r\n"; AppendCommonResponse(&response, cseq, playbackSessionID); response.append("Range: npt=now-\r\n"); response.append("\r\n"); err = mNetSession->sendRequest(sessionID, response.c_str()); if (err != OK) { return err; } if (mState == PAUSED_TO_PLAYING) { mState = PLAYING; return OK; } playbackSession->finishPlay(); CHECK_EQ(mState, AWAITING_CLIENT_PLAY); mState = ABOUT_TO_PLAY; return OK; }
status_t WifiDisplaySource::onPauseRequest( int32_t sessionID, int32_t cseq, const sp<ParsedMessage> &data) { int32_t playbackSessionID; sp<PlaybackSession> playbackSession = findPlaybackSession(data, &playbackSessionID); if (playbackSession == NULL) { sendErrorResponse(sessionID, "454 Session Not Found", cseq); return ERROR_MALFORMED; } ALOGI("Received PAUSE request."); if (mState != PLAYING_TO_PAUSED && mState != PLAYING) { return INVALID_OPERATION; } status_t err = playbackSession->pause(); CHECK_EQ(err, (status_t)OK); AString response = "RTSP/1.0 200 OK\r\n"; AppendCommonResponse(&response, cseq, playbackSessionID); response.append("\r\n"); err = mNetSession->sendRequest(sessionID, response.c_str()); if (err != OK) { return err; } mState = PAUSED; return err; }