private void ShowMediaInfoFlyout(FrameworkElement elem) { PlayListFile plf = null; if (elem != null && (plf = elem.DataContext as PlayListFile) != null) { MessengerInstance.Send <Message <DecoderTypes> >( new Message <DecoderTypes>(async(decoderType) => { int newIndex = PlayListFileSource.IndexOf(PlayListFileSource.FirstOrDefault(x => x == plf)); _RequestedDecoderType = decoderType; if (SelectedIndex != newIndex) { SelectedIndex = newIndex; } //로딩 패널 표시 MessengerInstance.Send(new Message("IsOpen", true), "ShowLoadingPanel"); await ThreadPool.RunAsync(async handler => { await DispatcherHelper.RunAsync(() => { //재생요청 RequestPlayback(false); }); }, WorkItemPriority.Normal); }) .Add("StorageItemInfo", plf) .Add("ButtonName", "CodecInformation"), "ShowMediaFileInformation"); } }
public void KrakenHeaderTest(byte[] rawData, DecoderTypes type) { fixed(byte *source = rawData) { var header = new KrakenHeader(source); Assert.Equal(type, header.DecoderType); Assert.True(header.RestartDecoder); Assert.False(header.Uncompressed); Assert.False(header.UseChecksums); } }
public void FromXML(string xml) { XmlDocument dom = new XmlDocument(); dom.LoadXml(xml); XmlNode xNode = dom.DocumentElement; if ((xNode.Name == DECODERS_ELEMENT) && (xNode.HasChildNodes)) { foreach (XmlNode jNode in xNode.ChildNodes) { if (jNode.Name == Decoder.DECODER_ELEMENT) { DecoderTypes decoderType = DecoderTypes.Unknown; foreach (XmlAttribute jAttribute in jNode.Attributes) { if (jAttribute.Name == TYPE_ATTRIBUTE) { decoderType = (DecoderTypes)Enum.Parse(typeof(DecoderTypes), jAttribute.Value, true); } } Decoder decoder = null; #if (PocketPC) if (decoderType == DecoderTypes.HTCDiamondTouch) { decoder = new HTCDiamondTouchDecoder(); } else #endif if (decoderType == DecoderTypes.MITes) { decoder = new MITesDecoder(); } else if (decoderType == DecoderTypes.Wockets) { decoder = new WocketsDecoder(); } else if (decoderType == DecoderTypes.Sparkfun) { decoder = new SparkfunDecoder(); } else if (decoderType == DecoderTypes.HTCDiamondTouch) { decoder = new HTCDiamondTouchDecoder(); } decoder.FromXML(jNode.OuterXml); this.Insert(decoder._ID, decoder); } } } }
private async void RequestPlayback(DecoderTypes decoderType, StorageItemInfo storageItemInfo, bool isPrevOrNext) { if (!VersionHelper.IsUnlockNetworkPlay) { MessengerInstance.Send(new Message(), "CheckInterstitialAd"); return; } if (!isPrevOrNext) { MessengerInstance.Send(new Message("IsOpen", true) .Add("LoadingTitle", ResourceLoader.GetForCurrentView().GetString("Loading/Playback/Text")), "ShowLoadingPanel"); } //현재 파일 이후의 파일들을 모두 지금 재생중에 추가 var files = StorageItemGroupSource.Where(x => x.Type == StorageItemTypes.File).SelectMany(x => x.Items).ToList(); PlayListFile currPlayListFile = null; PlayListFile prevPlayListFile = null; PlayListFile nextPlayListFile = null; for (int i = 0; i < files.Count; i++) { var file = await files[i].GetStorageFileAsync(); var orgFile = await storageItemInfo.GetStorageFileAsync(); if (file.FolderRelativeId == orgFile.FolderRelativeId) { currPlayListFile = new PlayListFile(file); if (i > 0) { prevPlayListFile = new PlayListFile(await files[i - 1].GetStorageFileAsync()); } if (i + 1 < files.Count) { nextPlayListFile = new PlayListFile(await files[i + 1].GetStorageFileAsync()); } break; } } MessengerInstance.Send( new Message() .Add("PrevPlayListFile", prevPlayListFile) .Add("CurrPlayListFile", currPlayListFile) .Add("NextPlayListFile", nextPlayListFile) .Add("DecoderType", decoderType), "RequestPlayback"); }
protected override void RegisterMessage() { MessengerInstance.Register <bool>(this, "DLNABackRequested", (val) => { ToUpperTapped(null, null); }); MessengerInstance.Register <Message>(this, "DLNANextPlayListFile", (val) => { DecoderTypes decoderType = val.GetValue <DecoderTypes>("DecoderType"); PlayListFile playListFile = val.GetValue <PlayListFile>("NextPlayListFile"); RequestPlayback(decoderType, playListFile, true); }); }
private async void LoadPlayListFilesAsync(List <PlayListFile> playListFileList) { await ThreadPool.RunAsync(async handler => { if (playListFileList != null) { for (int i = 1; i <= playListFileList.Count; i++) { var playListFile = playListFileList[i - 1]; //파일에 필요한 정보 셋팅 SetPlayListFile(playListFile); //자막 목록 미리 로드 await SetSubtitleList(playListFile); int mod = i % LOAD_ITEM_COUNT; if (mod == 0 || i == playListFileList.Count) { await DispatcherHelper.RunAsync(() => { int j = mod > 0 ? i - mod : i - LOAD_ITEM_COUNT; for (; j < i; j++) { PlayListFileSource.Add(playListFileList[j]); //추가 정보 로드 LoadExtraInfoAsync(playListFileList[j]); } }); } } } //로딩 완료 처리 await DispatcherHelper.RunAsync(() => { IsStopLoadingIndicator = true; if (PlayListFileSource.Any(x => PreparedData?.StorageItemInfo.Path == x.Path)) { _RequestedDecoderType = PreparedData.DecoderType; RequestPlaybackWithLoadingPanel(PreparedData.StorageItemInfo); //초기화 PreparedData = null; } }); }, WorkItemPriority.Low); }
private void RequestPlayback(bool resetDecoder) { var mv = SimpleIoc.Default.GetInstance <MainViewModel>(); if (!mv.AppProtection.IsHideAppLockPanel) { return; } if (SelectedIndex > -1 && SelectedIndex < PlayListFileSource.Count) { PlayListFile prevPlayListFile = null; PlayListFile nextPlayListFile = null; if (SelectedIndex - 1 > -1) { prevPlayListFile = PlayListFileSource[SelectedIndex - 1]; } if (SelectedIndex + 1 < PlayListFileSource.Count) { nextPlayListFile = PlayListFileSource[SelectedIndex + 1]; } //디코더 타입 오버라이드 if (resetDecoder) { _RequestedDecoderType = Settings.Playback.DefaultDecoderType; } var frame = Window.Current.Content as Frame; if (frame != null) { //재생 요청 MessengerInstance.Send( new Message() .Add("CurrPlayListFile", PlayListFileSource[SelectedIndex]) .Add("PrevPlayListFile", prevPlayListFile) .Add("NextPlayListFile", nextPlayListFile) .Add("DecoderType", _RequestedDecoderType) , "RequestPlayback"); } } }
private async void LoadPlayList() { _SubtitlesList.Clear(); //목록 초기화 PlayListFileSource.Clear(); //DB에서 조회 List <PlayListFile> playListFileList = new List <PlayListFile>(); playListDAO.LoadPlayListFiles(CurrentPlayList, playListFileList); if (playListFileList.Count > 0) { IsStopLoadingIndicator = false; int count = playListFileList.Count > PreparedData?.SyncLoadPlayListFileCount ? PreparedData.SyncLoadPlayListFileCount : playListFileList.Count; //재생목록 파일들의 폴더 리스트 foreach (var path in playListFileList.GroupBy(x => x.ParentFolderPath).Select(x => x.Key)) { _SubtitlesList.Add(path, null); } //탐색기에서 파일 선택시 선택한 파일 이후를 모두 지금 재생중에 로딩이 되므로 하나를 먼저 로드할 필요가 있음. await LoadPlayListFiles(playListFileList.GetRange(0, count)); if (PlayListFileSource.Any(x => PreparedData?.StorageItemInfo.Path == x.Path)) { _RequestedDecoderType = PreparedData.DecoderType; RequestPlaybackWithLoadingPanel(PreparedData.StorageItemInfo); //초기화 PreparedData = null; } if (playListFileList.Count == count) { //더이상 로딩할 아이템이 없으면 로딩 표시 정지 IsStopLoadingIndicator = true; } else { //로딩할 아이템이 남았으면 비동기로 로딩 LoadPlayListFilesAsync(playListFileList.GetRange(count, playListFileList.Count - count)); } } _ChangedIndexList.Clear(); }
protected override void RegisterMessage() { MessengerInstance.Register <PlayList>(this, "ChangePlayList", (playList) => { CurrentPlayList = playList; }); MessengerInstance.Register <bool>(this, "ResetSelectionMode", (val) => { SelectedIndex = -1; BackNormalButtonSetTapped(null, null); }); MessengerInstance.Register <Message>(this, "PrepareLoadPlayListFile", (message) => { PreparedData = new PreparedData { //재생목록에서 지금재생중으로 이동 직전에 동기로드 카운트 설정 //지금 재생할 비디오와 다음 재생 프리뷰용으로 총 2개 SyncLoadPlayListFileCount = 2, DecoderType = message.GetValue <DecoderTypes>("DecoderType"), StorageItemInfo = message.GetValue <StorageItemInfo>("StorageItemInfo") }; }); //FileAssociation에서 이미 "지금 재생중"이 선택되어진 상태에서 넘어온다. MessengerInstance.Register <Message>(this, "SelectPlayListFile", async(message) => { BackNormalButtonSetTapped(null, null); _RequestedDecoderType = message.GetValue <DecoderTypes>("DecoderType"); var storageItemInfo = message.GetValue <StorageItemInfo>("StorageItemInfo"); var orderNo = PlayListFileSource.LastOrDefault() != null ? (int)PlayListFileSource.LastOrDefault().OrderNo : 0; //새롭게 추가된 List <PlayListFile> playListFileList = new List <PlayListFile>(); playListDAO.LoadPlayListFiles(CurrentPlayList, orderNo, (playListFile) => { //이벤트 등록 및 표시명 설정 SetPlayListFile(playListFile); //리스트에 바인딩 if (PlayListFileSource.All(x => x.Path != playListFile.Path)) { PlayListFileSource.Add(playListFile); } else if (PlayListFileSource.Any(x => x.Path == playListFile.Path && x.OrderNo != playListFile.OrderNo)) { //기존 리스트에 존재하나 순서가 변경된 경우 var tmp = PlayListFileSource.First(x => x.Path == playListFile.Path && x.OrderNo != playListFile.OrderNo); PlayListFileSource.Remove(tmp); PlayListFileSource.Add(playListFile); } //추가 정보 로드 LoadExtraInfoAsync(playListFile); }); var newIndex = PlayListFileSource.IndexOf(PlayListFileSource.LastOrDefault(x => x.Path == storageItemInfo.Path)); if (newIndex > -1 && newIndex < PlayListFileSource.Count) { SelectedIndex = newIndex; //로딩 패널 표시 MessengerInstance.Send(new Message("IsOpen", true), "ShowLoadingPanel"); await ThreadPool.RunAsync(async handler => { await DispatcherHelper.RunAsync(() => { //재생요청 RequestPlayback(true); }); }, WorkItemPriority.Normal); } }); MessengerInstance.Register <int>(this, "NextPlayListFile", (index) => { var nextIndex = SelectedIndex + index; if (nextIndex > -1 && nextIndex < PlayListFileSource.Count) { SelectedIndex = nextIndex; PlayListFileSource[SelectedIndex].PausedTime = TimeSpan.FromSeconds(0); RequestPlayback(false); } }); MessengerInstance.Register <Message>(this, "SavePlayListFile", (message) => { var file = message.GetValue <PlayListFile>(); playListDAO.UpdatePausedTime(file); //System.Diagnostics.Debug.WriteLine("PlayListViewModel : Message - SavePlayListFile =>" + file.PausedTime); }); }
public void SetResult(DecoderTypes resDecoderType, DecoderStates status) { _Payload.ResDecoderType = resDecoderType; _Payload.Status = status; }
private async void RequestPlayback(DecoderTypes decoderType, NetworkItemInfo networkItemInfo, bool isPrevOrNext) { if (!VersionHelper.IsUnlockNetworkPlay) { MessengerInstance.Send(new Message(), "CheckInterstitialAd"); return; } MessengerInstance.Send(new Message("IsOpen", true) .Add("LoadingTitle", ResourceLoader.GetForCurrentView().GetString("Loading/Playback/Text")), "ShowLoadingPanel"); var items = NetworkItemGroupSource.Where(x => x.Type == StorageItemTypes.File).SelectMany(x => x.Items).ToList(); var item = networkItemInfo; var index = items.IndexOf(item); NetworkItemInfo prevItemInfo = null; NetworkItemInfo currItemInfo = item; NetworkItemInfo nextItemInfo = null; if ((bool)items?.Any()) { if (index > 0) { prevItemInfo = items[index - 1]; } if (index < items.Count - 1) { nextItemInfo = items[index + 1]; } } var msg = new Message() .Add("PrevPlayListFile", prevItemInfo) .Add("CurrPlayListFile", currItemInfo) .Add("NextPlayListFile", nextItemInfo) .Add("DecoderType", decoderType); //Stream videoStream = null; //IItemContentRequest request = null; switch (ConnectedServerType) { case ServerTypes.OneDrive: /* * request = OneDriveClient.Drive.Root.ItemWithPath(GetAbsolutePath(networkItemInfo)).Content.Request(); * // videoStream = await request.GetAsync(); * * var provider = OneDriveClient.AuthenticationProvider as MsaAuthenticationProvider; * var url = request.RequestUrl + "?access_token=" + provider.CurrentAccountSession.AccessToken; * * var webReq = System.Net.WebRequest.Create(url); * var webRes = await webReq.GetResponseAsync(); * //Stream stream = webRes.GetResponseStream(); * url = url.Replace("https://", "http://"); * * // msg.Add("CurrPlayListFileStream", stream.AsRandomAccessStream()); * msg.Add("CurrPlayListFileUrl", url); * msg.Add("CurrPlayListFileContentType", request.ContentType); */ for (int i = 0; i < currItemInfo.SubtitleList?.Count; i++) { currItemInfo.SubtitleList[i] = (await GetStreamingUrlAsync(GetAbsolutePath(currItemInfo.ParentFolderPath, currItemInfo.SubtitleList[i]))).AbsoluteUri; } currItemInfo.Uri = await GetStreamingUrlAsync(GetAbsolutePath(currItemInfo)); break; } MessengerInstance.Send(msg, "RequestPlayback"); }