ssize_t ChromiumHTTPDataSource::readAt(off64_t offset, void *data, size_t size) {
    Mutex::Autolock autoLock(mLock);

    if (mState != CONNECTED) {
        return INVALID_OPERATION;
    }

#if 0
    char value[PROPERTY_VALUE_MAX];
    if (property_get("media.stagefright.disable-net", value, 0)
            && (!strcasecmp(value, "true") || !strcmp(value, "1"))) {
        LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Simulating that the network is down.");
        disconnect_l();
        return ERROR_IO;
    }
#endif

    if (offset != mCurrentOffset) {
        AString tmp = mURI;
        KeyedVector<String8, String8> tmpHeaders = mHeaders;

        disconnect_l();

        status_t err = connect_l(tmp.c_str(), &tmpHeaders, offset);

        if (err != OK) {
            return err;
        }
    }

    mState = READING;

    int64_t startTimeUs = ALooper::GetNowUs();

    mDelegate->initiateRead(data, size);

    int32_t bandwidth_bps;
	estimateBandwidth(&bandwidth_bps);
	int64_t readTimeoutUs = 0;
	if(bandwidth_bps > 0) {
		readTimeoutUs = (size * 8000000ll)/bandwidth_bps;
	}

	readTimeoutUs += mReadTimeoutUs;

    while (mState == READING) {
        //mCondition.wait(mLock);
        status_t err = mCondition.waitRelative(mLock, readTimeoutUs *1000ll);

        if(mForceDisconnect) {
          LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "disconnected, read return");
          return ERROR_IO;
        }
        
		if(err == -ETIMEDOUT) {
			LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Read data timeout,"
					"maybe server didn't response us, return %d", err);

			return err;
		}
    }

    if (mIOResult < OK) {
        return mIOResult;
    }

    if (mState == CONNECTED) {
        int64_t delayUs = ALooper::GetNowUs() - startTimeUs;

        // The read operation was successful, mIOResult contains
        // the number of bytes read.
        addBandwidthMeasurement(mIOResult, delayUs);

        mCurrentOffset += mIOResult;
        return mIOResult;
    }

    return ERROR_IO;
}
Example #2
0
/**
 *  Computes the min, max, mean, and median values of an array
 *  T[0:n-1] of 'n' long doubles.
 */
static void printStats (FILE* fp, long double* T, size_t ntrials, size_t ncorrect, size_t nelements){
  long double t_min, t_max, t_mean, t_median;

  assert (ntrials > 0);

  t_min = T[0];
  t_max = T[0];
  t_mean = T[0];
  t_median = T[0];

  for (size_t i = 1; i < ntrials; ++i) {
    if (T[i] < t_min) t_min = T[i];
    if (T[i] > t_max) t_max = T[i];
    t_mean += T[i];
  }
  t_mean /= ntrials;
  std::nth_element(T, T + ntrials/2, T + ntrials);
  t_median = T[ntrials/2];

  fprintf(fp,"{\"ntrials\": %lu, "
              "\"ncorrect\": %lu, "
              "\"nelements\": %lu, "
              "\"min\": %Lf, "
              "\"max\": %Lf, "
              "\"mean\": %Lf, "
              "\"median\": %Lf, "
              "\"bandwidth\": %Lf}\n", ntrials, ncorrect, nelements, t_min, t_max, t_mean, t_median, estimateBandwidth(nelements, t_mean));

}