MatroskaExtractor::MatroskaExtractor(const sp<DataSource> &source) : mDataSource(source), mReader(new DataSourceReader(mDataSource)), mSegment(NULL), mExtractedThumbnails(false), mIsWebm(false), mSeekPreRollNs(0) { off64_t size; mIsLiveStreaming = (mDataSource->flags() & (DataSource::kWantsPrefetching | DataSource::kIsCachingDataSource)) && mDataSource->getSize(&size) != OK; mkvparser::EBMLHeader ebmlHeader; long long pos; if (ebmlHeader.Parse(mReader, pos) < 0) { return; } if (ebmlHeader.m_docType && !strcmp("webm", ebmlHeader.m_docType)) { mIsWebm = true; } long long ret = mkvparser::Segment::CreateInstance(mReader, pos, mSegment); if (ret) { CHECK(mSegment == NULL); return; } // from mkvparser::Segment::Load(), but stop at first cluster ret = mSegment->ParseHeaders(); if (ret == 0) { long len; ret = mSegment->LoadCluster(pos, len); if (ret >= 1) { // no more clusters ret = 0; } } else if (ret > 0) { ret = mkvparser::E_BUFFER_NOT_FULL; } if (ret < 0) { ALOGW("Corrupt %s source: %s", mIsWebm ? "webm" : "matroska", uriDebugString(mDataSource->getUri()).c_str()); delete mSegment; mSegment = NULL; return; } #if 0 const mkvparser::SegmentInfo *info = mSegment->GetInfo(); ALOGI("muxing app: %s, writing app: %s", info->GetMuxingAppAsUTF8(), info->GetWritingAppAsUTF8()); #endif addTracks(); }
void ARTSPConnection::onConnect(const sp<AMessage> &msg) { ++mConnectionID; if (mState != DISCONNECTED) { if (mUIDValid) { HTTPBase::UnRegisterSocketUserTag(mSocket); HTTPBase::UnRegisterSocketUserMark(mSocket); } close(mSocket); mSocket = -1; flushPendingRequests(); } mState = CONNECTING; AString url; CHECK(msg->findString("url", &url)); sp<AMessage> reply; CHECK(msg->findMessage("reply", &reply)); AString host, path; unsigned port; if (!ParseURL(url.c_str(), &host, &port, &path, &mUser, &mPass) || (mUser.size() > 0 && mPass.size() == 0)) { // If we have a user name but no password we have to give up // right here, since we currently have no way of asking the user // for this information. ALOGE("Malformed rtsp url %s", uriDebugString(url).c_str()); reply->setInt32("result", ERROR_MALFORMED); reply->post(); mState = DISCONNECTED; return; } if (mUser.size() > 0) { ALOGV("user = '******', pass = '******'", mUser.c_str(), mPass.c_str()); } struct addrinfo hints; memset(&hints, 0, sizeof (hints)); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; mConnectionTimes = 0; int err = getaddrinfo(host.c_str(), NULL, &hints, (struct addrinfo **)(&mAddrHeader)); if (err != 0 || mAddrHeader == NULL) { ALOGE("Unknown host, err %d (%s)", err, gai_strerror(err)); reply->setInt32("result", -ENOENT); reply->post(); mState = DISCONNECTED; if (mAddrHeader != NULL) { freeaddrinfo((struct addrinfo *)mAddrHeader); mAddrHeader = NULL; } return; } if (!createSocketAndConnect(mAddrHeader, port, reply)) { ALOGV("Failed to connect to %s", host.c_str()); reply->setInt32("result", -errno); mState = DISCONNECTED; mSocket = -1; reply->post(); freeaddrinfo((struct addrinfo *)mAddrHeader); mAddrHeader = NULL; } }