// 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); }
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; }