private void DownloadThreadAlt(Media media) { lock (waitLockAlt) { while (true) { if (workersActiveAlt.Count >= maxThreads) { Monitor.Wait(waitLockAlt); } if (workersWaitingAlt.Count > 0) { if (FragmentsData[media].Count > MAX_LOADED_GRAGMENTS_IN_QUEUE) { Monitor.Wait(waitLockAlt); // wait for writing downloaded gragments } HDSWorker worker = workersWaitingAlt.Dequeue(); TagsStore tagsStore = new TagsStore(); FragmentsData[media].Enqueue(tagsStore); Thread thread = new Thread(() => worker.DownloadFragment(tagsStore)); lock (workersActiveAlt) { workersActiveAlt[thread.ManagedThreadId] = worker; } thread.Start(); } else if (workersActiveAlt.Count > 0) { Monitor.Wait(waitLockAlt); } Thread.Sleep(1); // thread own quantum time fulfilled (for decrease CPU load) } } }
public void DownloadFragment(TagsStore tagsStore) { string fragmentUrl = media.GetFragmentUrl(fragIndex); Program.DebugLog("Fragment Url: " + fragmentUrl); byte[] data = HTTP.TryGETData(fragmentUrl, out int retCode, out string status); int retries = 0; while (retCode >= 500 && retries <= MaxRetriesLoad) { System.Threading.Thread.Sleep(1000); retries++; data = HTTP.TryGETData(fragmentUrl, out retCode, out status); } if (retCode != 200) { string msg = "Download fragment failed " + fragIndex + "/" + media.TotalFragments + " code: " + retCode + " status: " + status; Program.DebugLog(msg); if (Program.verbose) { Program.Message(msg); } if (media.Bootstrap.live) { //media.CurrentFragmentIndex = media.TotalFragments; tagsStore.Complete = true; Done(media); return; } else { throw new InvalidOperationException(status); } } Program.DebugLog("Downloaded: fragment=" + fragIndex + "/" + media.TotalFragments + " lenght: " + data.Length); var boxes = Box.GetBoxes(data); if (boxes.Find(i => i.Type == F4FConstants.BOX_TYPE_MDAT) is MediaDataBox mdat) { lock (tagsStore) { FLVTag.GetVideoAndAudioTags(tagsStore, mdat.data); tagsStore.ARFA = boxes.Find(i => i.Type == F4FConstants.BOX_TYPE_AFRA) as AdobeFragmentRandomAccessBox; tagsStore.Complete = true; } HDSDownloader.LiveIsStalled = false; } else if (media.Bootstrap.live) { HDSDownloader.LiveIsStalled = true; } else { throw new InvalidOperationException("No found mdat box in fragment " + fragIndex + "/" + media.TotalFragments); } if (Program.verbose) { Program.Message(string.Format("Media: {0} Downloaded: {1} Data size: {2}", media.label, fragIndex, data.Length)); } media.CurrentFragmentIndex++; media.Downloaded++; Done(media); }