void element_PlaybackTrackChanged(object sender, TrackChangedEventArgs e) { SourceEventArgs args; for (int i = 0; i < this.tracks.Count; i++) { if (this.tracks[i].Bitrate == e.NewTrack.Bitrate) { args = new SourceEventArgs(i); SourceChanged(this, args); break; } } }
void media_SourceChanged(object sender, SourceEventArgs e) { SendEvent("switchingChangeComplete", "{\"newIndex\":" + e.NewIndex + "}"); }
void element_PlaybackTrackChanged(object sender, TrackChangedEventArgs e) { if (this.tracks != null) { SourceEventArgs args; for (int i = 0; i < this.tracks.Count; i++) { if (this.tracks[i].Bitrate == e.NewTrack.Bitrate) { args = new SourceEventArgs(i); SourceChanged(this, args); break; } } } }
private void AddMarkers(IAsyncResult argAR) { try { if (!Deployment.Current.Dispatcher.CheckAccess()) { Deployment.Current.Dispatcher.BeginInvoke(() => AddMarkers(argAR)); } foreach (SegmentInfo segmentInfo in this.element.ManifestInfo.Segments) { foreach (StreamInfo streamInfo in segmentInfo.SelectedStreams) { if (streamInfo.UniqueId == ((string)argAR.AsyncState)) { foreach (TrackInfo trackInfo in streamInfo.SelectedTracks) { ChunkResult chunkResult = trackInfo.EndGetChunk(argAR); if (chunkResult.Result == ChunkResult.ChunkResultState.Succeeded && currentTextTrack != null) { System.Text.Encoding enc = System.Text.Encoding.UTF8; int length = (int)chunkResult.ChunkData.Length; byte[] rawData = new byte[length]; chunkResult.ChunkData.Read(rawData, 0, length); String text = enc.GetString(rawData, 0, rawData.Length); XElement xElem = XElement.Parse(text); XElement bodyElem = xElem.Elements().FirstOrDefault(e => e.Name.LocalName == "body"); //first received chunk - notify js if (!textTrackLoaded) { XElement copyElement = new XElement(xElem); XElement copyBodyElem = copyElement.Elements().FirstOrDefault(e => e.Name.LocalName == "body"); //we can't send the body elements, they are causing "Eval" exception copyBodyElem.RemoveAll(); SourceEventArgs args = new SourceEventArgs(getCurrentTextIndex()); args.Text = copyElement.ToString(); TextTrackLoaded(this, args); textTrackLoaded = true; } //Get the caption language string langName = ""; currentTextTrack.Attributes.TryGetValue("Name", out langName); //Fix for TTML where div contains begin and end values instead of paragraph node int segId = 0; //Get all div under the body node IEnumerable<XElement> divElements = from div in bodyElem.Descendants() where div.Name.LocalName == "div" select div; //Fix alogorithem: //1. Iterate over each div. //2. Find each begin and end values. //3. Aggregate over each child of a div, concat it text value. //4. Create a new paragraph element with the div begin and end attributes. //5. Clear all the attribute and elements of the original div and replace with new paragraph. foreach (XElement divElem in divElements) { XAttribute begin = divElem.Attributes().FirstOrDefault(e => e.Name.LocalName == "begin"); XAttribute end = divElem.Attributes().FirstOrDefault(e => e.Name.LocalName == "end"); if (begin != null) { IEnumerable<string> textSegs = from seg in divElem.Descendants() where seg.Name.LocalName == "p" select (string)seg; string str = textSegs.Aggregate((x, y) => x + "<br/>" + y); XElement pElem = divElem.Elements().FirstOrDefault(e => e.Name.LocalName == "p"); XAttribute region = pElem.Attributes().FirstOrDefault(e => e.Name.LocalName == "region"); divElem.RemoveAll(); XAttribute idAttr = new XAttribute("id", "p" + segId); XElement newP = new XElement("p", begin, end, region, idAttr); newP.Value = str; divElem.Add(newP); segId++; } } //Turn each caption line to a media marker foreach (XElement el in bodyElem.Elements()) { IEnumerable<XElement> pSegs = from p in el.Descendants() where p.Name.LocalName == "p" select p; foreach (XElement pSeg in pSegs) { TimelineMarker newMarker = new TimelineMarker(); //Create discrete marker points for each segment pSeg.Add(new XAttribute("timestamp", chunkResult.Timestamp.TotalSeconds.ToString())); newMarker.Text = pSeg.ToString(); newMarker.Type = langName; XAttribute begin = pSeg.Attribute("begin"); if (begin.Value != null) { newMarker.Time = chunkResult.Timestamp + TimeSpan.Parse(begin.Value); this.element.Markers.Add(newMarker); } } } } } } } } }catch(Exception ex) { logger.info("Error occur while trying to add marker:" + ex.Message); } }
void media_TextTrackLoaded(object sender, SourceEventArgs e) { SendEvent("textTrackSelected", "{\"index\":" + e.NewIndex + ", \"ttml\":\"" + HttpUtility.HtmlEncode(Uri.EscapeUriString(e.Text)) + "\"}"); }