Example #1
0
        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)
                }
            }
        }
Example #2
0
        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);
        }