diff --git a/MediaStreamContext.cpp b/MediaStreamContext.cpp index 476920dcb..ee0b2a7e6 100644 --- a/MediaStreamContext.cpp +++ b/MediaStreamContext.cpp @@ -985,7 +985,14 @@ void MediaStreamContext::OnFragmentDownloadFailed(DownloadInfoPtr dlInfo) } else { - AAMPLOG_WARN("%s StreamAbstractionAAMP_MPD::Already at the lowest profile, skipping segment at pos:%lf dur:%lf disc:%d", name, dlInfo->pts, dlInfo->fragmentDurationSec, dlInfo->isDiscontinuity); + if (context->IsCurrentProfileLowest()) + { + AAMPLOG_WARN("%s StreamAbstractionAAMP_MPD::Already at the lowest profile, skipping segment at pos:%lf dur:%lf disc:%d", name, dlInfo->pts, dlInfo->fragmentDurationSec, dlInfo->isDiscontinuity); + } + else + { + AAMPLOG_WARN("%s StreamAbstractionAAMP_MPD::Rampdown not applied for error:%d; skipping segment at pos:%lf dur:%lf disc:%d", name, httpErrorCode, dlInfo->pts, dlInfo->fragmentDurationSec, dlInfo->isDiscontinuity); + } if (!dlInfo->isInitSegment) updateSkipPoint((dlInfo->pts + dlInfo->fragmentDurationSec), dlInfo->fragmentDurationSec); auto timeBasedBufferManager = GetTimeBasedBufferManager(); diff --git a/priv_aamp.cpp b/priv_aamp.cpp index 2e986f39c..2e0ee897d 100644 --- a/priv_aamp.cpp +++ b/priv_aamp.cpp @@ -4805,6 +4805,7 @@ bool PrivateInstanceAAMP::GetFile( std::string remoteUrl, AampMediaType mediaTyp downloadTimeMS = (int)(tEndTime - tStartTime); bool loopAgain = false; + bool isSingleRetryCurlError = false; if (res == CURLE_OK) { // all data collected if( memcmp(remoteUrl.c_str(), "file:", 5) == 0 ) @@ -4990,10 +4991,17 @@ bool PrivateInstanceAAMP::GetFile( std::string remoteUrl, AampMediaType mediaTyp print_headerResponse(context.allResponseHeaders, mediaType); } + isSingleRetryCurlError = + (res == CURLE_COULDNT_RESOLVE_HOST) || + (res == CURLE_RECV_ERROR) || + (res == CURLE_PARTIAL_FILE) || + (res == CURLE_OPERATION_TIMEDOUT); + if (res == CURLE_COULDNT_CONNECT || IsCurlTimeoutFailure(res) || (isDownloadStalled && (eCURL_ABORT_REASON_LOW_BANDWIDTH_TIMEDOUT != abortReason)) || - res == CURLE_SEND_ERROR) + res == CURLE_SEND_ERROR || + isSingleRetryCurlError) { if(mpStreamAbstractionAAMP) @@ -5057,6 +5065,11 @@ bool PrivateInstanceAAMP::GetFile( std::string remoteUrl, AampMediaType mediaTyp break; } } + if (isSingleRetryCurlError && downloadAttempt >= 2) + { + loopAgain = false; + } + AAMPLOG_WARN("Download failed due to curl error %d or isDownloadStalled:%d Retrying:%d Attempt:%d abortReason:%d", res, isDownloadStalled, loopAgain && (downloadAttempt < maxDownloadAttempt), downloadAttempt, abortReason); } @@ -5204,6 +5217,14 @@ bool PrivateInstanceAAMP::GetFile( std::string remoteUrl, AampMediaType mediaTyp } } + if (loopAgain && (downloadAttempt < maxDownloadAttempt)) + { + if (isSingleRetryCurlError) + { + interruptibleMsSleep(200); + } + } + if(!loopAgain) break; }