// TOP LEVEL
        internal bool GetSegment(int recurseLevel, int index, int SegmentNumber, ref byte[] Data, ref string txtError) // wrapped because of the stackoverflow variable
        {
            //lock (createNewRunnerLock)  // Mustnt try to retrieve a segment while we're restarting the runner
            {
                SendDebugMessage("Segment " + index + "-" + SegmentNumber.ToString() + " requested: trying to get...");
                Segment retrievedSegment = null; SegmentAvailabilities availability = SegmentAvailabilities.IsAvailable;
                if (TryGetSegment(index, SegmentNumber, ref retrievedSegment, ref availability))
                {
                    Data = retrievedSegment.Data;
                    SendDebugMessage("RETURNING segment " + index + "-" + SegmentNumber.ToString());
                    return(true);
                }
                else
                {
                    // What happened
                    if (availability == SegmentAvailabilities.IsError)
                    {
                        SendDebugMessage("Segment " + index + "-" + SegmentNumber.ToString() + " errored.");
                        txtError = "Segment could not be retrieved due to an error.";
                        return(false);
                    }
                    else if (availability == SegmentAvailabilities.Cancelled)
                    {
                        SendDebugMessage("Segment " + index + "-" + SegmentNumber.ToString() + " cancelled.");
                        txtError = "Segment was cancelled, possibly due to a seek request.";
                        return(false);
                    }
                    else if (availability == SegmentAvailabilities.RequiresSeek)
                    {
                        SendDebugMessage("Segment " + index + "-" + SegmentNumber.ToString() + " requires a seek - (re)starting runner.");

                        // Create a new runner and start it  (cancels any waiting segments)
                        string txtResult = "";
                        if (!Start(SegmentNumber, ref txtResult, index))
                        {
                            SendDebugMessage("Segment could not be retrieved due to the FFRunner failing to start : " + txtResult);
                            txtError = "Segment could not be retrieved due to the FFRunner failing to start : " + txtResult;
                            return(false);
                        }

                        // RUNNER re-started, so let's recurse as the segment availability will now be 'coming soon'
                        // Recurse
                        if ((recurseLevel++) < 4)
                        {
                            SendDebugMessage("GetSegment recursing level: " + recurseLevel);
                            return(GetSegment(recurseLevel, index, SegmentNumber, ref Data, ref txtError));
                        }
                        else
                        {
                            txtError = "Recursion level overflow.";
                            return(false);
                        }
                    }

                    // Shouldnt get here
                    return(false);
                }
            }
        }
        bool TryGetSegment(int segmentNumber, ref Segment retrievedSegment, ref SegmentAvailabilities segAvailability)
        {
            if (store.HasSegment(segmentNumber))
            {
                SendDebugMessage("Broker] Segment " + segmentNumber.ToString() + " is available in store - retrieving");
                bool foo = store.TryGetSegmentByNumber(segmentNumber, ref retrievedSegment); // shouldn't block, as it's in the store
                segAvailability = SegmentAvailabilities.IsAvailable;
                return(true);
            }


            // Is there a runner
            if (Runner == null)
            {
                SendDebugMessage("Broker] require seek (runner stopped)");
                segAvailability = SegmentAvailabilities.RequiresSeek;  // require, in fact!
                return(false);
            }


            // Store does not have segment.  Is it coming soon?
            int difference = (segmentNumber - Runner.AwaitingSegmentNumber);

            if (difference < 0) // requested segment is in past
            {
                SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " is in the past - require seek.");
                segAvailability = SegmentAvailabilities.RequiresSeek;
                return(false);
            }
            if (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON)
            {
                SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " is a huge " + difference + " segs away from arrival - require seek.");
                segAvailability = SegmentAvailabilities.RequiresSeek;
                return(false);
            }

            // WAIT FOR A SEGMENT **************************************************************
            SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " is only " + difference + " away from arrival - requesting from store, which will block...");

            bool didGet = (store.TryGetSegmentByNumber(segmentNumber, ref retrievedSegment));

            segAvailability = didGet ? SegmentAvailabilities.IsAvailable : SegmentAvailabilities.Cancelled;
            return(didGet);
        }
Example #3
0
        bool TryGetSegment(int index, int segmentNumber, ref Segment retrievedSegment, ref SegmentAvailabilities segAvailability, bool doTranscode)
        {
            if (store.HasSegment(index, segmentNumber) || !doTranscode)
            {
                //                SendDebugMessage("Broker] Segment " + index + "-" + segmentNumber.ToString() + " is available in store - retrieving");
                SendDebugMessage("Broker] Segment " + segmentNumber.ToString() + " is available in store - retrieving");
                bool foo = store.TryGetSegmentByNumber(index, segmentNumber, ref retrievedSegment, doTranscode);
                // shouldn't block, as it's in the store
                segAvailability = SegmentAvailabilities.IsAvailable;
                return(true);
            }


            // Is there a runner
            if (Runner == null)
            {
                SendDebugMessage("Broker] require seek (runner stopped)");
                segAvailability = SegmentAvailabilities.RequiresSeek;  // require, in fact!
                return(false);
            }


            // Store does not have segment.  Is it coming soon?
            //int difference2 = (index - Runner.AwaitingFileIndex);
//            int difference = (segmentNumber - Runner.AwaitingSegmentNumber);
            int difference = (segmentNumber - Runner.AwaitingSegmentNumber);

            //            if (difference2 < 0 || (difference2 == 0 && difference < 0)) // requested segment is in past
            if (difference < 0)// requested segment is in past
            {
                //                SendDebugMessage("Broker] Seg " + index + "-" + segmentNumber.ToString() + " is in the past - require seek.");
                SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " is in the past - require seek.");
                segAvailability = SegmentAvailabilities.RequiresSeek;
                return(false);
            }

            //            if (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON)
            //if (Request.NewLiveTV) && (difference2 >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON_NEWLIVETV))
            //{
            //    //                SendDebugMessage("Broker] Seg " + index + "-" + segmentNumber.ToString() + " is a huge " + difference2 + " indexfiles away from arrival - require seek.");
            //    SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " is a huge " + difference2 + " indexfiles away from arrival - require seek.");
            //    segAvailability = SegmentAvailabilities.RequiresSeek;
            //    return false;
            //}
            //else
            if ((!Request.LiveTV && !Request.NewLiveTV && (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON)) ||
                (Request.LiveTV && Request.NewLiveTV && (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON_LIVETV)))
            {
                //SendDebugMessage("Broker] Seg " + index + "-" + segmentNumber.ToString() + " is a huge " + difference + " segs away from arrival - require seek.");
                SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " is a huge " + difference + " segs away from arrival - require seek.");
                segAvailability = SegmentAvailabilities.RequiresSeek;
                return(false);
            }

            // WAIT FOR A SEGMENT **************************************************************
            //             SendDebugMessage("Broker] Seg " + index + "-" + segmentNumber.ToString() + " is only " + difference2 + " indexfiles away from arrival - requesting from store, which will block...");
            SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " - requesting from store, which will block...");

            bool didGet = (store.TryGetSegmentByNumber(index, segmentNumber, ref retrievedSegment, doTranscode));

            segAvailability = didGet ? SegmentAvailabilities.IsAvailable : SegmentAvailabilities.Cancelled;
            SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " did get = " + didGet);
            //segAvailability = segmentNumber == 99999 ? SegmentAvailabilities.IsAvailable : segAvailability;  //NewLiveTV hack, s.t. non available waitsscreen gets displayed
            //return (didGet || segmentNumber==99999);//99999 is newlivtv hack
            return(didGet);
        }
        bool TryGetSegment(int index, int segmentNumber, ref Segment retrievedSegment, ref SegmentAvailabilities segAvailability)
        {
            if (store.HasSegment(index, segmentNumber))
            {
                SendDebugMessage("Broker] Segment " + index+"-"+segmentNumber.ToString() + " is available in store - retrieving");
                bool foo = store.TryGetSegmentByNumber(index, segmentNumber, ref retrievedSegment); // shouldn't block, as it's in the store
                segAvailability = SegmentAvailabilities.IsAvailable;
                return true;
            }

            // Is there a runner
            if ( Runner == null)
            {
                SendDebugMessage("Broker] require seek (runner stopped)");
                segAvailability = SegmentAvailabilities.RequiresSeek;  // require, in fact!
                return false;
            }

            // Store does not have segment.  Is it coming soon?
            int difference2 = (index - Runner.AwaitingFileIndex);
            int difference = (segmentNumber - Runner.AwaitingSegmentNumber);
            if (difference2 < 0 || (difference2 ==0 && difference < 0)) // requested segment is in past
            {
                SendDebugMessage("Broker] Seg " + index + "-" + segmentNumber.ToString() + " is in the past - require seek.");
                segAvailability = SegmentAvailabilities.RequiresSeek;
                return false;
            }
            //            if (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON)
             if   (Request.NewLiveTV && (difference2 >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON_NEWLIVETV))
            {
                    SendDebugMessage("Broker] Seg " + index + "-" + segmentNumber.ToString() + " is a huge " + difference2 + " indexfiles away from arrival - require seek.");
                segAvailability = SegmentAvailabilities.RequiresSeek;
                return false;
            }
            else if ((!Request.LiveTV && !Request.NewLiveTV && (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON)) ||
                (Request.LiveTV && Request.NewLiveTV && (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON_LIVETV)))
                {
                    SendDebugMessage("Broker] Seg " + index + "-" + segmentNumber.ToString() + " is a huge " + difference + " segs away from arrival - require seek.");
                segAvailability = SegmentAvailabilities.RequiresSeek;
                return false;
            }

            // WAIT FOR A SEGMENT **************************************************************
                SendDebugMessage("Broker] Seg " + index + "-" + segmentNumber.ToString() + " is only " + difference2 + " indexfiles away from arrival - requesting from store, which will block...");

            bool didGet = (store.TryGetSegmentByNumber(index, segmentNumber, ref retrievedSegment));
            segAvailability = didGet ? SegmentAvailabilities.IsAvailable : SegmentAvailabilities.Cancelled;
            //segAvailability = segmentNumber == 99999 ? SegmentAvailabilities.IsAvailable : segAvailability;  //NewLiveTV hack, s.t. non available waitsscreen gets displayed
            //return (didGet || segmentNumber==99999);//99999 is newlivtv hack
            return didGet;
        }
        bool TryGetSegment(int segmentNumber, ref Segment retrievedSegment, ref SegmentAvailabilities segAvailability)
        {
            if (store.HasSegment(segmentNumber))
            {
                SendDebugMessage("Broker] Segment " + segmentNumber.ToString() + " is available in store - retrieving");
                bool foo = store.TryGetSegmentByNumber(segmentNumber, ref retrievedSegment); // shouldn't block, as it's in the store
                segAvailability = SegmentAvailabilities.IsAvailable;
                return true;
            }

            // Is there a runner
            if ( Runner == null)
            {
                SendDebugMessage("Broker] require seek (runner stopped)");
                segAvailability = SegmentAvailabilities.RequiresSeek;  // require, in fact!
                return false;
            }

            // Store does not have segment.  Is it coming soon?
            int difference = (segmentNumber - Runner.AwaitingSegmentNumber);
            if (difference < 0) // requested segment is in past
            {
                SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " is in the past - require seek.");
                segAvailability = SegmentAvailabilities.RequiresSeek;
                return false;
            }
            //            if (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON)
                if ((!Request.LiveTV && (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON)) || (Request.LiveTV && (difference >= NUMBER_OF_SEGMENTS_CONSIDERED_COMING_SOON_LIVETV)))
                {
                SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " is a huge " + difference + " segs away from arrival - require seek.");
                segAvailability = SegmentAvailabilities.RequiresSeek;
                return false;
            }

            // WAIT FOR A SEGMENT **************************************************************
            SendDebugMessage("Broker] Seg " + segmentNumber.ToString() + " is only " + difference + " away from arrival - requesting from store, which will block...");

            bool didGet = (store.TryGetSegmentByNumber(segmentNumber, ref retrievedSegment));
            segAvailability = didGet ? SegmentAvailabilities.IsAvailable : SegmentAvailabilities.Cancelled;
            return didGet;
        }