static TexParams clamped_mipmapped() { return clamped(TexFilter::Mipmapped); }
static TexParams clamped_nearest() { return clamped(TexFilter::Nearest); }
static TexParams clamped_linear() { return clamped(TexFilter::Linear); }
void SetScreenBrightness(double brightness) { AssertMainThread(); PROXY_IF_SANDBOXED(SetScreenBrightness(clamped(brightness, 0.0, 1.0))); }
double ComputedTimingFunction::GetValue( double aPortion, ComputedTimingFunction::BeforeFlag aBeforeFlag) const { if (HasSpline()) { // Check for a linear curve. // (GetSplineValue(), below, also checks this but doesn't work when // aPortion is outside the range [0.0, 1.0]). if (mTimingFunction.X1() == mTimingFunction.Y1() && mTimingFunction.X2() == mTimingFunction.Y2()) { return aPortion; } // Ensure that we return 0 or 1 on both edges. if (aPortion == 0.0) { return 0.0; } if (aPortion == 1.0) { return 1.0; } // For negative values, try to extrapolate with tangent (p1 - p0) or, // if p1 is coincident with p0, with (p2 - p0). if (aPortion < 0.0) { if (mTimingFunction.X1() > 0.0) { return aPortion * mTimingFunction.Y1() / mTimingFunction.X1(); } else if (mTimingFunction.Y1() == 0 && mTimingFunction.X2() > 0.0) { return aPortion * mTimingFunction.Y2() / mTimingFunction.X2(); } // If we can't calculate a sensible tangent, don't extrapolate at all. return 0.0; } // For values greater than 1, try to extrapolate with tangent (p2 - p3) or, // if p2 is coincident with p3, with (p1 - p3). if (aPortion > 1.0) { if (mTimingFunction.X2() < 1.0) { return 1.0 + (aPortion - 1.0) * (mTimingFunction.Y2() - 1) / (mTimingFunction.X2() - 1); } else if (mTimingFunction.Y2() == 1 && mTimingFunction.X1() < 1.0) { return 1.0 + (aPortion - 1.0) * (mTimingFunction.Y1() - 1) / (mTimingFunction.X1() - 1); } // If we can't calculate a sensible tangent, don't extrapolate at all. return 1.0; } return mTimingFunction.GetSplineValue(aPortion); } // Since we use endpoint-exclusive timing, the output of a steps(start) timing // function when aPortion = 0.0 is the top of the first step. When aPortion is // negative, however, we should use the bottom of the first step. We handle // negative values of aPortion specially here since once we clamp aPortion // to [0,1] below we will no longer be able to distinguish to the two cases. if (aPortion < 0.0) { return 0.0; } // Clamp in case of steps(end) and steps(start) for values greater than 1. aPortion = clamped(aPortion, 0.0, 1.0); return StepTiming(mSteps, aPortion, aBeforeFlag, mType); }
nsresult RtspMediaResource::OnConnected(uint8_t aTrackIdx, nsIStreamingProtocolMetaData *meta) { if (mIsConnected) { for (uint32_t i = 0 ; i < mTrackBuffer.Length(); ++i) { mTrackBuffer[i]->Start(); } return NS_OK; } uint8_t tracks; mMediaStreamController->GetTotalTracks(&tracks); uint64_t duration = 0; for (int i = 0; i < tracks; ++i) { nsCString rtspTrackId("RtspTrack"); rtspTrackId.AppendInt(i); nsCOMPtr<nsIStreamingProtocolMetaData> trackMeta; mMediaStreamController->GetTrackMetaData(i, getter_AddRefs(trackMeta)); MOZ_ASSERT(trackMeta); trackMeta->GetDuration(&duration); // Here is a heuristic to estimate the slot size. // For video track, calculate the width*height. // For audio track, use the BUFFER_SLOT_DEFAULT_SIZE because the w*h is 0. // Finally clamp them into (BUFFER_SLOT_DEFAULT_SIZE,BUFFER_SLOT_MAX_SIZE) uint32_t w, h; uint32_t slotSize; trackMeta->GetWidth(&w); trackMeta->GetHeight(&h); slotSize = clamped((int32_t)(w * h), BUFFER_SLOT_DEFAULT_SIZE, BUFFER_SLOT_MAX_SIZE); mTrackBuffer.AppendElement(new RtspTrackBuffer(rtspTrackId.get(), i, slotSize)); mTrackBuffer[i]->Start(); } if (!mDecoder) { return NS_ERROR_FAILURE; } // If the duration is 0, imply the stream is live stream. if (duration) { // Not live stream. mRealTime = false; bool seekable = true; mDecoder->SetInfinite(false); mDecoder->SetTransportSeekable(seekable); mDecoder->SetDuration(duration); } else { // Live stream. // Check the preference "media.realtime_decoder.enabled". if (!Preferences::GetBool("media.realtime_decoder.enabled", false)) { // Give up, report error to media element. nsCOMPtr<nsIRunnable> event = NS_NewRunnableMethod(mDecoder, &MediaDecoder::DecodeError); NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL); return NS_ERROR_FAILURE; } else { mRealTime = true; bool seekable = false; mDecoder->SetInfinite(true); mDecoder->SetTransportSeekable(seekable); mDecoder->SetMediaSeekable(seekable); } } // Fires an initial progress event and sets up the stall counter so stall events // fire if no download occurs within the required time frame. mDecoder->Progress(false); MediaDecoderOwner* owner = mDecoder->GetMediaOwner(); NS_ENSURE_TRUE(owner, NS_ERROR_FAILURE); dom::HTMLMediaElement* element = owner->GetMediaElement(); NS_ENSURE_TRUE(element, NS_ERROR_FAILURE); element->FinishDecoderSetup(mDecoder, this); mIsConnected = true; return NS_OK; }
double ComputedTimingFunction::GetValue(double aPortion) const { if (HasSpline()) { // Check for a linear curve. // (GetSplineValue(), below, also checks this but doesn't work when // aPortion is outside the range [0.0, 1.0]). if (mTimingFunction.X1() == mTimingFunction.Y1() && mTimingFunction.X2() == mTimingFunction.Y2()) { return aPortion; } // For negative values, try to extrapolate with tangent (p1 - p0) or, // if p1 is coincident with p0, with (p2 - p0). if (aPortion < 0.0) { if (mTimingFunction.X1() > 0.0) { return aPortion * mTimingFunction.Y1() / mTimingFunction.X1(); } else if (mTimingFunction.Y1() == 0 && mTimingFunction.X2() > 0.0) { return aPortion * mTimingFunction.Y2() / mTimingFunction.X2(); } // If we can't calculate a sensible tangent, don't extrapolate at all. return 0.0; } // For values greater than 1, try to extrapolate with tangent (p2 - p3) or, // if p2 is coincident with p3, with (p1 - p3). if (aPortion > 1.0) { if (mTimingFunction.X2() < 1.0) { return 1.0 + (aPortion - 1.0) * (mTimingFunction.Y2() - 1) / (mTimingFunction.X2() - 1); } else if (mTimingFunction.Y2() == 1 && mTimingFunction.X1() < 1.0) { return 1.0 + (aPortion - 1.0) * (mTimingFunction.Y1() - 1) / (mTimingFunction.X1() - 1); } // If we can't calculate a sensible tangent, don't extrapolate at all. return 1.0; } return mTimingFunction.GetSplineValue(aPortion); } // Since we use endpoint-exclusive timing, the output of a steps(start) timing // function when aPortion = 0.0 is the top of the first step. When aPortion is // negative, however, we should use the bottom of the first step. We handle // negative values of aPortion specially here since once we clamp aPortion // to [0,1] below we will no longer be able to distinguish to the two cases. if (aPortion < 0.0) { return 0.0; } // Clamp in case of steps(end) and steps(start) for values greater than 1. aPortion = clamped(aPortion, 0.0, 1.0); if (mType == nsTimingFunction::Type::StepStart) { // There are diagrams in the spec that seem to suggest this check // and the bounds point should not be symmetric with StepEnd, but // should actually step up at rather than immediately after the // fraction points. However, we rely on rounding negative values // up to zero, so we can't do that. And it's not clear the spec // really meant it. return 1.0 - StepEnd(mSteps, 1.0 - aPortion); } MOZ_ASSERT(mType == nsTimingFunction::Type::StepEnd, "bad type"); return StepEnd(mSteps, aPortion); }
Mat clamped(const Mat &m) { return(clamped(m, 1e-7)); }