summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/rtsp/ARTPSession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/rtsp/ARTPSession.cpp')
-rw-r--r--media/libstagefright/rtsp/ARTPSession.cpp242
1 files changed, 0 insertions, 242 deletions
diff --git a/media/libstagefright/rtsp/ARTPSession.cpp b/media/libstagefright/rtsp/ARTPSession.cpp
deleted file mode 100644
index ba4e33c..0000000
--- a/media/libstagefright/rtsp/ARTPSession.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "ARTPSession"
-#include <utils/Log.h>
-
-#include "ARTPSession.h"
-
-#include <media/stagefright/foundation/ABuffer.h>
-#include <media/stagefright/foundation/ADebug.h>
-#include <media/stagefright/foundation/AMessage.h>
-#include <media/stagefright/foundation/hexdump.h>
-
-#include <ctype.h>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-
-#include "APacketSource.h"
-#include "ARTPConnection.h"
-#include "ASessionDescription.h"
-
-namespace android {
-
-ARTPSession::ARTPSession()
- : mInitCheck(NO_INIT) {
-}
-
-status_t ARTPSession::setup(const sp<ASessionDescription> &desc) {
- CHECK_EQ(mInitCheck, (status_t)NO_INIT);
-
- mDesc = desc;
-
- mRTPConn = new ARTPConnection(ARTPConnection::kRegularlyRequestFIR);
-
- looper()->registerHandler(mRTPConn);
-
- for (size_t i = 1; i < mDesc->countTracks(); ++i) {
- AString connection;
- if (!mDesc->findAttribute(i, "c=", &connection)) {
- // No per-stream connection information, try global fallback.
- if (!mDesc->findAttribute(0, "c=", &connection)) {
- ALOGE("Unable to find connection attribute.");
- return mInitCheck;
- }
- }
- if (!(connection == "IN IP4 127.0.0.1")) {
- ALOGE("We only support localhost connections for now.");
- return mInitCheck;
- }
-
- unsigned port;
- if (!validateMediaFormat(i, &port) || (port & 1) != 0) {
- ALOGE("Invalid media format.");
- return mInitCheck;
- }
-
- sp<APacketSource> source = new APacketSource(mDesc, i);
- if (source->initCheck() != OK) {
- ALOGE("Unsupported format.");
- return mInitCheck;
- }
-
- int rtpSocket = MakeUDPSocket(port);
- int rtcpSocket = MakeUDPSocket(port + 1);
-
- mTracks.push(TrackInfo());
- TrackInfo *info = &mTracks.editItemAt(mTracks.size() - 1);
- info->mRTPSocket = rtpSocket;
- info->mRTCPSocket = rtcpSocket;
-
- sp<AMessage> notify = new AMessage(kWhatAccessUnitComplete, id());
- notify->setSize("track-index", mTracks.size() - 1);
-
- mRTPConn->addStream(
- rtpSocket, rtcpSocket, mDesc, i, notify, false /* injected */);
-
- info->mPacketSource = source;
- }
-
- mInitCheck = OK;
-
- return OK;
-}
-
-// static
-int ARTPSession::MakeUDPSocket(unsigned port) {
- int s = socket(AF_INET, SOCK_DGRAM, 0);
- CHECK_GE(s, 0);
-
- struct sockaddr_in addr;
- memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = INADDR_ANY;
- addr.sin_port = htons(port);
-
- CHECK_EQ(0, bind(s, (const struct sockaddr *)&addr, sizeof(addr)));
-
- return s;
-}
-
-ARTPSession::~ARTPSession() {
- for (size_t i = 0; i < mTracks.size(); ++i) {
- TrackInfo *info = &mTracks.editItemAt(i);
-
- info->mPacketSource->signalEOS(UNKNOWN_ERROR);
-
- close(info->mRTPSocket);
- close(info->mRTCPSocket);
- }
-}
-
-void ARTPSession::onMessageReceived(const sp<AMessage> &msg) {
- switch (msg->what()) {
- case kWhatAccessUnitComplete:
- {
- int32_t firstRTCP;
- if (msg->findInt32("first-rtcp", &firstRTCP)) {
- // There won't be an access unit here, it's just a notification
- // that the data communication worked since we got the first
- // rtcp packet.
- break;
- }
-
- size_t trackIndex;
- CHECK(msg->findSize("track-index", &trackIndex));
-
- int32_t eos;
- if (msg->findInt32("eos", &eos) && eos) {
- TrackInfo *info = &mTracks.editItemAt(trackIndex);
- info->mPacketSource->signalEOS(ERROR_END_OF_STREAM);
- break;
- }
-
- sp<ABuffer> accessUnit;
- CHECK(msg->findBuffer("access-unit", &accessUnit));
-
- uint64_t ntpTime;
- CHECK(accessUnit->meta()->findInt64(
- "ntp-time", (int64_t *)&ntpTime));
-
-#if 0
-#if 0
- printf("access unit complete size=%d\tntp-time=0x%016llx\n",
- accessUnit->size(), ntpTime);
-#else
- ALOGI("access unit complete, size=%d, ntp-time=%llu",
- accessUnit->size(), ntpTime);
- hexdump(accessUnit->data(), accessUnit->size());
-#endif
-#endif
-
-#if 0
- CHECK_GE(accessUnit->size(), 5u);
- CHECK(!memcmp("\x00\x00\x00\x01", accessUnit->data(), 4));
- unsigned x = accessUnit->data()[4];
-
- ALOGI("access unit complete: nalType=0x%02x, nalRefIdc=0x%02x",
- x & 0x1f, (x & 0x60) >> 5);
-#endif
-
- accessUnit->meta()->setInt64("ntp-time", ntpTime);
- accessUnit->meta()->setInt64("timeUs", 0);
-
-#if 0
- int32_t damaged;
- if (accessUnit->meta()->findInt32("damaged", &damaged)
- && damaged != 0) {
- ALOGI("ignoring damaged AU");
- } else
-#endif
- {
- TrackInfo *info = &mTracks.editItemAt(trackIndex);
- info->mPacketSource->queueAccessUnit(accessUnit);
- }
- break;
- }
-
- default:
- TRESPASS();
- break;
- }
-}
-
-bool ARTPSession::validateMediaFormat(size_t index, unsigned *port) const {
- AString format;
- mDesc->getFormat(index, &format);
-
- ssize_t i = format.find(" ");
- if (i < 0) {
- return false;
- }
-
- ++i;
- size_t j = i;
- while (isdigit(format.c_str()[j])) {
- ++j;
- }
- if (format.c_str()[j] != ' ') {
- return false;
- }
-
- AString portString(format, i, j - i);
-
- char *end;
- unsigned long x = strtoul(portString.c_str(), &end, 10);
- if (end == portString.c_str() || *end != '\0') {
- return false;
- }
-
- if (x == 0 || x > 65535) {
- return false;
- }
-
- *port = x;
-
- return true;
-}
-
-size_t ARTPSession::countTracks() {
- return mTracks.size();
-}
-
-sp<MediaSource> ARTPSession::trackAt(size_t index) {
- CHECK_LT(index, mTracks.size());
- return mTracks.editItemAt(index).mPacketSource;
-}
-
-} // namespace android