protected override bool EnumerateStreams(bool forceRefresh) { bool refreshed = base.EnumerateStreams(forceRefresh); if (refreshed) { ISubtitleStream subtitleStream = _tsReader as ISubtitleStream; int subtitleStreamCount = 0; subtitleStream?.GetSubtitleStreamCount(ref subtitleStreamCount); if (subtitleStreamCount >= 1) { _streamInfoSubtitles = new TsReaderStreamInfoHandler(subtitleStream); SetPreferredSubtitle(); return(true); } ITeletextSource teletextSource = _tsReader as ITeletextSource; int teletextStreamCount = 0; teletextSource?.GetTeletextStreamCount(ref teletextStreamCount); if (teletextStreamCount >= 1) { _streamInfoSubtitles = new TsReaderTeletextInfoHandler(teletextSource); SetPreferredSubtitle(); return(true); } } return(false); }
protected override void SetPreferredSubtitle() { ISubtitleStream subtitleStream = _tsReader as ISubtitleStream; ITeletextSource teletextSource = _tsReader as ITeletextSource; if (_streamInfoSubtitles == null || (subtitleStream == null && teletextSource == null)) { return; } VideoSettings settings = ServiceRegistration.Get <ISettingsManager>().Load <VideoSettings>() ?? new VideoSettings(); // first try to find a stream by it's exact LCID. StreamInfo streamInfo = _streamInfoSubtitles.FindStream(settings.PreferredSubtitleLanguage) ?? _streamInfoSubtitles.FindSimilarStream(settings.PreferredSubtitleStreamName); if (streamInfo == null || !settings.EnableDvbSubtitles || !settings.EnableTeletextSubtitles) { // Tell the renderer it should not render subtitles if (_subtitleRenderer != null) { _subtitleRenderer.RenderSubtitles = false; } } else { _streamInfoSubtitles.EnableStream(streamInfo.Name); } }
protected override void SetPreferredSubtitle() { ISubtitleStream subtitleStream = _tsReader as ISubtitleStream; ITeletextSource teletextSource = _tsReader as ITeletextSource; if (_streamInfoSubtitles == null || (subtitleStream == null && teletextSource == null)) { ServiceRegistration.Get <ILogger>().Debug("SetPreferredSubtitle: no valid subtitles stream."); return; } VideoSettings settings = ServiceRegistration.Get <ISettingsManager>().Load <VideoSettings>() ?? new VideoSettings(); // first try to find a stream by it's exact LCID. int preferredSubtitleLanguage = settings.PreferredSubtitleLanguage; IUserManagement userManagement = ServiceRegistration.Get <IUserManagement>(); if (userManagement?.CurrentUser != null) { preferredSubtitleLanguage = 0; var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures); if (userManagement.CurrentUser.TryGetAdditionalData(UserDataKeysKnown.KEY_PREFERRED_SUBTITLE_LANGUAGE, 0, out string subLang)) { int langId = cultures?.FirstOrDefault(c => c.TwoLetterISOLanguageName == subLang)?.LCID ?? 0; if (_streamInfoSubtitles.Any(s => s.LCID == langId)) { preferredSubtitleLanguage = langId; } } if (preferredSubtitleLanguage == 0 && userManagement.CurrentUser.TryGetAdditionalData(UserDataKeysKnown.KEY_PREFERRED_SUBTITLE_LANGUAGE, 1, out string subLang2)) { int langId = cultures?.FirstOrDefault(c => c.TwoLetterISOLanguageName == subLang2)?.LCID ?? 0; if (_streamInfoSubtitles.Any(s => s.LCID == langId)) { preferredSubtitleLanguage = langId; } } if (preferredSubtitleLanguage == 0) { preferredSubtitleLanguage = settings.PreferredSubtitleLanguage; } } StreamInfo streamInfo = _streamInfoSubtitles.FindStream(preferredSubtitleLanguage) ?? _streamInfoSubtitles.FindSimilarStream(settings.PreferredSubtitleStreamName); if (streamInfo == null || !settings.EnableDvbSubtitles || !settings.EnableTeletextSubtitles) { // Tell the renderer it should not render subtitles if (_subtitleRenderer != null) { _subtitleRenderer.RenderSubtitles = false; ServiceRegistration.Get <ILogger>().Debug("SetPreferredSubtitle: set RenderSubtitles to false."); } } else { ServiceRegistration.Get <ILogger>().Debug("SetPreferredSubtitle: enable stream for {0}", streamInfo.Name); _streamInfoSubtitles.EnableStream(streamInfo.Name); } }
public async Task ExtractSubtitles(string format, string expectedFormat, bool checkOutputLanguage) { string outputPath = Path.ChangeExtension(Path.GetTempFileName(), format); IMediaInfo info = await MediaInfo.Get(Resources.MultipleStream); ISubtitleStream subtitleStream = info.SubtitleStreams.FirstOrDefault(x => x.Language == "spa"); Assert.NotNull(subtitleStream); IConversionResult result = await Conversion.New() .AddStream(subtitleStream) .SetOutput(outputPath) .Start(); Assert.True(result.Success); IMediaInfo resultInfo = await MediaInfo.Get(outputPath); Assert.Equal(0, resultInfo.VideoStreams.Count()); Assert.Equal(0, resultInfo.AudioStreams.Count()); Assert.Equal(1, resultInfo.SubtitleStreams.Count()); Assert.Equal(expectedFormat, resultInfo.SubtitleStreams.First().Format); if (checkOutputLanguage) { Assert.Equal("spa", resultInfo.SubtitleStreams.First().Language); } }
public TsReaderStreamInfoHandler(ISubtitleStream subtitleStream) { if (subtitleStream == null) { return; } int count = 0; _subtitleStream = subtitleStream; subtitleStream.GetSubtitleStreamCount(ref count); if (count > 0) { StreamInfo subStream = new StreamInfo(null, NO_STREAM_INDEX, VideoPlayer.NO_SUBTITLES, 0); AddUnique(subStream); } for (int i = 0; i < count; ++i) { //FIXME: language should be passed back also as LCID SubtitleLanguage language = new SubtitleLanguage(); subtitleStream.GetSubtitleStreamLanguage(i, ref language); int lcid = BaseDXPlayer.LookupLcidFromName(language.lang); // Note: the "type" is no longer considered in MP1 code as well, so I guess DVBSub3 only supports Bitmap subs at all. string name = language.lang; StreamInfo subStream = new StreamInfo(null, i, name, lcid); AddUnique(subStream); } }
public async Task ExtractSubtitles(string extension, string expectedFormat, bool checkOutputLanguage) { string outputPath = _storageFixture.GetTempFileName(extension); IMediaInfo info = await FFmpeg.GetMediaInfo(Resources.MultipleStream); ISubtitleStream subtitleStream = info.SubtitleStreams.FirstOrDefault(x => x.Language == "spa"); Assert.NotNull(subtitleStream); IConversionResult result = await FFmpeg.Conversions.New() .AddStream(subtitleStream) .SetOutput(outputPath) .Start(); IMediaInfo resultInfo = await FFmpeg.GetMediaInfo(outputPath); Assert.Empty(resultInfo.VideoStreams); Assert.Empty(resultInfo.AudioStreams); Assert.Single(resultInfo.SubtitleStreams); Assert.Equal(expectedFormat, resultInfo.SubtitleStreams.First().Codec); if (checkOutputLanguage) { Assert.Equal("spa", resultInfo.SubtitleStreams.First().Language); } Assert.Equal(0, resultInfo.SubtitleStreams.First().Default.Value); Assert.Equal(0, resultInfo.SubtitleStreams.First().Forced.Value); }
protected override bool EnumerateStreams(bool forceRefresh) { //FIXME: TSReader only offers Audio in IAMStreamSelect, it would be cleaner to expose subs as well. bool refreshed = base.EnumerateStreams(forceRefresh); if (refreshed) { // If base class has refreshed the stream infos, then update the subtitle streams. ISubtitleStream subtitleStream = _sourceFilter as ISubtitleStream; int count = 0; if (subtitleStream != null) { _streamInfoSubtitles = new StreamInfoHandler(); subtitleStream.GetSubtitleStreamCount(ref count); if (count > 0) { StreamInfo subStream = new StreamInfo(null, NO_STREAM_INDEX, NO_SUBTITLES, 0); _streamInfoSubtitles.AddUnique(subStream); } for (int i = 0; i < count; ++i) { //FIXME: language should be passed back also as LCID SubtitleLanguage language = new SubtitleLanguage(); subtitleStream.GetSubtitleStreamLanguage(i, ref language); int lcid = LookupLcidFromName(language.lang); // Note: the "type" is no longer considered in MP1 code as well, so I guess DVBSub3 only supports Bitmap subs at all. string name = language.lang; StreamInfo subStream = new StreamInfo(null, i, name, lcid); _streamInfoSubtitles.AddUnique(subStream); } } } return(refreshed); }
public override void SetSubtitle(string subtitle) { EnumerateStreams(); ISubtitleStream subtitleStream = _sourceFilter as ISubtitleStream; if (_streamInfoSubtitles == null || subtitleStream == null) { return; } // First try to find a stream by it's exact LCID. StreamInfo streamInfo = _streamInfoSubtitles.FindStream(subtitle); if (streamInfo != null) { // Tell the renderer if it should render subtitles _selectedSubtitleIndex = streamInfo.StreamIndex; _subtitleRenderer.RenderSubtitles = _selectedSubtitleIndex != NO_STREAM_INDEX; if (_selectedSubtitleIndex != NO_STREAM_INDEX) { subtitleStream.SetSubtitleStream(_selectedSubtitleIndex); } SaveSubtitlePreference(); } }
protected override void SetPreferredSubtitle() { EnumerateStreams(); ISubtitleStream subtitleStream = _sourceFilter as ISubtitleStream; if (_streamInfoSubtitles == null || subtitleStream == null) { return; } VideoSettings settings = ServiceRegistration.Get <ISettingsManager>().Load <VideoSettings>() ?? new VideoSettings(); // first try to find a stream by it's exact LCID. StreamInfo streamInfo = _streamInfoSubtitles.FindStream(settings.PreferredSubtitleLanguage) ?? _streamInfoSubtitles.FindSimilarStream(settings.PreferredSubtitleStreamName); if (streamInfo == null || !settings.EnableSubtitles) { // Tell the renderer it should not render subtitles if (_subtitleRenderer != null) { _subtitleRenderer.RenderSubtitles = false; } } else { subtitleStream.SetSubtitleStream(streamInfo.StreamIndex); } }
/// <summary> /// Add subtitle to file. It will be added as new stream so if you want to burn subtitles into video you should use /// SetSubtitles method. /// </summary> /// <param name="inputPath">Input path</param> /// <param name="outputPath">Output path</param> /// <param name="subtitlePath">Path to subtitle file in .srt format</param> /// <param name="subtitleCodec">The Subtitle Codec to Use to Encode the Subtitles</param> /// <param name="language">Language code in ISO 639. Example: "eng", "pol", "pl", "de", "ger"</param> /// <returns>Conversion result</returns> internal static IConversion AddSubtitle(string inputPath, string outputPath, string subtitlePath, SubtitleCodec subtitleCodec, string language = null) { IMediaInfo mediaInfo = FFmpeg.GetMediaInfo(inputPath).GetAwaiter().GetResult(); IMediaInfo subtitleInfo = FFmpeg.GetMediaInfo(subtitlePath).GetAwaiter().GetResult(); ISubtitleStream subtitleStream = subtitleInfo.SubtitleStreams.First() .SetLanguage(language); return(New() .AddStream(mediaInfo.VideoStreams) .AddStream(mediaInfo.AudioStreams) .AddStream(subtitleStream.SetCodec(subtitleCodec)) .SetOutput(outputPath)); }
/// <summary> /// Add subtitle to file. It will be added as new stream so if you want to burn subtitles into video you should use /// SetSubtitles method. /// </summary> /// <param name="inputPath">Input path</param> /// <param name="outputPath">Output path</param> /// <param name="subtitlePath">Path to subtitle file in .srt format</param> /// <param name="language">Language code in ISO 639. Example: "eng", "pol", "pl", "de", "ger"</param> /// <returns>Conversion result</returns> public static IConversion AddSubtitle(string inputPath, string outputPath, string subtitlePath, string language = null) { IMediaInfo mediaInfo = AsyncHelper.RunSync(() => MediaInfo.Get(inputPath)); IMediaInfo subtitleInfo = AsyncHelper.RunSync(() => MediaInfo.Get(subtitlePath)); ISubtitleStream subtitleStream = subtitleInfo.SubtitleStreams.First() .SetLanguage(language); return(New() .AddStream(mediaInfo.VideoStreams.ToArray()) .AddStream(mediaInfo.AudioStreams.ToArray()) .AddStream(subtitleStream) .SetOutput(outputPath)); }
protected override bool EnumerateStreams(bool forceRefresh) { //FIXME: TSReader only offers Audio in IAMStreamSelect, it would be cleaner to expose subs as well. bool refreshed = base.EnumerateStreams(forceRefresh); if (refreshed) { // If base class has refreshed the stream infos, then update the subtitle streams. ISubtitleStream subtitleStream = _tsReader as ISubtitleStream; if (subtitleStream != null) { _streamInfoSubtitles = new TsReaderStreamInfoHandler(subtitleStream); } } return(refreshed); }
private void button1_Click(object sender, EventArgs e) { PlayerState state = VideoPlayerAPIFactory.CreateVideoPlayerAPI().GetPlayerState(); if (state.position == -1) { return; } var result = Task.Run(async() => await FFmpeg.GetMediaInfo(state.filePath)); StreamSelector streamSelector = new StreamSelector(result.Result); var formResult = streamSelector.ShowDialog(); if (formResult == DialogResult.OK) { selectedAudio = streamSelector.GetSelectedAudio(); selectedSubtitle = streamSelector.GetSelectedSub(); } }
protected override void AddSubtitleFilter(bool isSourceFilterPresent) { VideoSettings settings = ServiceRegistration.Get <ISettingsManager>().Load <VideoSettings>() ?? new VideoSettings(); ISubtitleStream subtitleStream = _tsReader as ISubtitleStream; int subtitleStreamCount = 0; subtitleStream?.GetSubtitleStreamCount(ref subtitleStreamCount); ITeletextSource teletextSource = _tsReader as ITeletextSource; int teletextStreamCount = 0; teletextSource?.GetTeletextStreamCount(ref teletextStreamCount); bool shouldAddDvbFilter = isSourceFilterPresent && subtitleStreamCount >= 1 && settings.EnableDvbSubtitles; bool shouldRenderTeletextSubtitles = isSourceFilterPresent && teletextStreamCount >= 1 && settings.EnableTeletextSubtitles; bool shouldAddClosedCaptionsFilter = settings.EnableAtscClosedCaptions && (subtitleStreamCount == 0 && teletextStreamCount == 0); if (shouldAddDvbFilter) { _subtitleRenderer.SetPlayer(this); _subtitleFilter = _subtitleRenderer.AddDvbSubtitleFilter(_graphBuilder); if (_subtitleFilter != null) { _subtitleRenderer.RenderSubtitles = true; } } else if (shouldRenderTeletextSubtitles) { _subtitleRenderer.AddTeletextSubtitleDecoder(teletextSource); _subtitleRenderer.SetPlayer(this); _subtitleRenderer.RenderSubtitles = true; } else if (shouldAddClosedCaptionsFilter) { _subtitleRenderer.AddClosedCaptionsFilter(_graphBuilder); } ServiceRegistration.Get <ILogger>().Debug("TsVideoPlayer.AddSubtitleFilter: shouldAddDvbFilter: {0}, shouldRenderTeletextSubtitles: {1}, " + "shouldAddClosedCaptionsFilter: {2}, RenderSubtitles is: {3}, subtitleStreamCount: {4}, teletextStreamCount: {5}", shouldAddDvbFilter.ToString(), shouldRenderTeletextSubtitles.ToString(), shouldAddClosedCaptionsFilter.ToString(), _subtitleRenderer.RenderSubtitles.ToString(), subtitleStreamCount.ToString(), teletextStreamCount.ToString()); }
public async Task ConvertTest(Format format, string extension, string expectedFormat) { string outputPath = _storageFixture.GetTempFileName(extension); IMediaInfo info = await FFmpeg.GetMediaInfo(Resources.SubtitleSrt); ISubtitleStream subtitleStream = info.SubtitleStreams.FirstOrDefault(); IConversionResult result = await FFmpeg.Conversions.New() .AddStream(subtitleStream) .SetOutput(outputPath) .SetOutputFormat(format) .Start(); IMediaInfo resultInfo = await FFmpeg.GetMediaInfo(outputPath); Assert.Single(resultInfo.SubtitleStreams); ISubtitleStream resultSteam = resultInfo.SubtitleStreams.First(); Assert.Equal(expectedFormat, resultSteam.Codec.ToLower()); }
public async Task ConvertTest(string format, string extension, string expectedFormat) { string outputPath = Path.ChangeExtension(Path.GetTempFileName(), extension); IMediaInfo info = await MediaInfo.Get(Resources.SubtitleSrt); ISubtitleStream subtitleStream = info.SubtitleStreams.FirstOrDefault() .SetFormat(new SubtitleFormat(format)); IConversionResult result = await Conversion.New() .AddStream(subtitleStream) .SetOutput(outputPath) .Start(); Assert.True(result.Success); IMediaInfo resultInfo = await MediaInfo.Get(outputPath); Assert.Equal(1, resultInfo.SubtitleStreams.Count()); ISubtitleStream resultSteam = resultInfo.SubtitleStreams.First(); Assert.Equal(expectedFormat, resultSteam.Format.ToLower()); }
protected override bool EnumerateStreams(bool forceRefresh) { //FIXME: TSReader only offers Audio in IAMStreamSelect, it would be cleaner to expose subs as well. bool refreshed = base.EnumerateStreams(forceRefresh); if (refreshed) { // If base class has refreshed the stream infos, then update the subtitle streams. ISubtitleStream subtitleStream = _fileSource as ISubtitleStream; int count = 0; if (subtitleStream != null) { _streamInfoSubtitles = new StreamInfoHandler(); subtitleStream.GetSubtitleStreamCount(ref count); if (count > 0) { StreamInfo subStream = new StreamInfo(null, NO_STREAM_INDEX, NO_SUBTITLES, 0); _streamInfoSubtitles.AddUnique(subStream); } for (int i = 0; i < count; ++i) { //FIXME: language should be passed back also as LCID SubtitleLanguage language = new SubtitleLanguage(); int type = 0; subtitleStream.GetSubtitleStreamLanguage(i, ref language); subtitleStream.GetSubtitleStreamType(i, ref type); int lcid = LookupLcidFromName(language.lang); string name = type == 0 ? String.Format("{0} (DVB)", language.lang) : String.Format("{0} (Teletext)", language.lang); StreamInfo subStream = new StreamInfo(null, i, name, lcid); _streamInfoSubtitles.AddUnique(subStream); } } } return(refreshed); }
public SubtitleSelector(ISubtitleStream dvbStreams, SubtitleRenderer subRender, TeletextSubtitleDecoder subDecoder) { Log.Debug("SubtitleSelector ctor"); if (subRender == null) { throw new Exception("Nullpointer input not allowed ( SubtitleRenderer)"); } else { this.dvbStreams = dvbStreams; this.subRender = subRender; } // load preferences using (MediaPortal.Profile.Settings reader = new MediaPortal.Profile.Settings(MediaPortal.Configuration.Config.GetFile(MediaPortal.Configuration.Config.Dir.Config, "MediaPortal.xml"))) { preferedLanguages = new List <string>(); string languages = reader.GetValueAsString("tvservice", "preferredsublanguages", ""); Log.Debug("SubtitleSelector: sublangs entry content: " + languages); StringTokenizer st = new StringTokenizer(languages, ";"); while (st.HasMore) { string lang = st.NextToken(); if (lang.Length != 3) { Log.Warn("Language {0} is not in the correct format!", lang); } else { preferedLanguages.Add(lang); Log.Info("Prefered language {0} is {1}", preferedLanguages.Count, lang); } } } pageEntries = new Dictionary <int, TeletextPageEntry>(); bitmapSubtitleCache = new List <SubtitleOption>(); lock (syncLock) { if (subDecoder != null) { subDecoder.SetPageInfoCallback(new MediaPortal.Player.Subtitles.TeletextSubtitleDecoder.PageInfoCallback(OnPageInfo)); } if (dvbStreams != null) { RetrieveBitmapSubtitles(); subStreamCallback = new SubtitleStreamEventCallback(OnSubtitleReset); IntPtr pSubStreamCallback = Marshal.GetFunctionPointerForDelegate(subStreamCallback); Log.Debug("Calling SetSubtitleStreamEventCallback"); dvbStreams.SetSubtitleResetCallback(pSubStreamCallback); } if (preferedLanguages.Count > 0) { autoSelectOption = new SubtitleOption(); autoSelectOption.language = "None"; autoSelectOption.isAuto = true; autoSelectOption.type = SubtitleType.None; SetOption(0); // the autoselect mode will have index 0 (ugly) } } Log.Debug("End SubtitleSelector ctor"); }
/// <summary> create the used COM components and get the interfaces. </summary> protected override bool GetInterfaces(string filename) { Log.Info("TSReaderPlayer: GetInterfaces()"); try { string strAudioRenderer = ""; int intFilters = 0; // FlipGer: count custom filters string strFilters = ""; // FlipGer: collect custom filters LoadMyTvFilterSettings(ref intFilters, ref strFilters, ref strVideoCodec, ref strAudioCodec, ref strAACAudioCodec, ref strDDPLUSAudioCodec, ref strH264VideoCodec, ref strAudioRenderer, ref enableDVBBitmapSubtitles, ref enableDVBTtxtSubtitles, ref relaxTsReader); _graphBuilder = (IGraphBuilder) new FilterGraph(); _rotEntry = new DsROTEntry((IFilterGraph)_graphBuilder); if (strAudioRenderer.Length > 0) //audio renderer must be in graph before audio switcher { _audioRendererFilter = DirectShowUtil.AddAudioRendererToGraph(_graphBuilder, strAudioRenderer, true); } #region add AudioSwitcher if (enableMPAudioSwitcher) //audio switcher must be in graph before tsreader audiochangecallback { _audioSwitcherFilter = DirectShowUtil.AddFilterToGraph(_graphBuilder, "MediaPortal AudioSwitcher"); if (_audioSwitcherFilter == null) { Log.Error("TSReaderPlayer: Failed to add AudioSwitcher to graph"); } } #endregion #region add TsReader TsReader reader = new TsReader(); _fileSource = (IBaseFilter)reader; _ireader = (ITSReader)reader; _interfaceTSReader = _fileSource; _ireader.SetRelaxedMode(relaxTsReader); // enable/disable continousity filtering _ireader.SetTsReaderCallback(this); _ireader.SetRequestAudioChangeCallback(this); Log.Info("TSReaderPlayer: Add TsReader to graph"); int hr = _graphBuilder.AddFilter((IBaseFilter)_fileSource, "TsReader"); DsError.ThrowExceptionForHR(hr); #endregion #region load file in TsReader IFileSourceFilter interfaceFile = (IFileSourceFilter)_fileSource; if (interfaceFile == null) { Log.Error("TSReaderPlayer: Failed to get IFileSourceFilter"); Cleanup(); return(false); } Log.Info("TSReaderPlayer: Open file: {0}", filename); hr = interfaceFile.Load(filename, null); if (hr != 0) { Log.Error("TSReaderPlayer: Failed to open file:{0} :0x{1:x}", filename, hr); Cleanup(); return(false); } #endregion #region add codecs Log.Info("TSReaderPlayer: Add codecs"); // add preferred video & audio codecs MatchFilters("Video"); MatchFilters("Audio"); // does .ts file contain video? // default is _isRadio=false which prevents recorded radio file playing if (!_videoFormat.IsValid) { _isRadio = true; } if (!_isRadio) { _vmr9 = new VMR9Util(); _vmr9.AddVMR9(_graphBuilder); _vmr9.Enable(false); DirectShowUtil.AddFilterToGraph(_graphBuilder, videoFilter); if (enableDVBBitmapSubtitles) { try { SubtitleRenderer.GetInstance().AddSubtitleFilter(_graphBuilder); } catch (Exception e) { Log.Error(e); } } } DirectShowUtil.AddFilterToGraph(_graphBuilder, audioFilter); // FlipGer: add custom filters to graph string[] arrFilters = strFilters.Split(';'); for (int i = 0; i < intFilters; i++) { DirectShowUtil.AddFilterToGraph(_graphBuilder, arrFilters[i]); } #endregion #region PostProcessingEngine Detection IPostProcessingEngine postengine = PostProcessingEngine.GetInstance(true); if (!postengine.LoadPostProcessing(_graphBuilder)) { PostProcessingEngine.engine = new PostProcessingEngine.DummyEngine(); } #endregion #region render TsReader output pins Log.Info("TSReaderPlayer: Render TsReader outputs"); if (_isRadio) { IEnumPins enumPins; hr = _fileSource.EnumPins(out enumPins); DsError.ThrowExceptionForHR(hr); IPin[] pins = new IPin[1]; int fetched = 0; while (enumPins.Next(1, pins, out fetched) == 0) { if (fetched != 1) { break; } PinDirection direction; pins[0].QueryDirection(out direction); if (direction == PinDirection.Output) { IEnumMediaTypes enumMediaTypes; pins[0].EnumMediaTypes(out enumMediaTypes); AMMediaType[] mediaTypes = new AMMediaType[20]; int fetchedTypes; enumMediaTypes.Next(20, mediaTypes, out fetchedTypes); for (int i = 0; i < fetchedTypes; ++i) { if (mediaTypes[i].majorType == MediaType.Audio) { hr = _graphBuilder.Render(pins[0]); DsError.ThrowExceptionForHR(hr); break; } } } DirectShowUtil.ReleaseComObject(pins[0]); } DirectShowUtil.ReleaseComObject(enumPins); } else { DirectShowUtil.RenderGraphBuilderOutputPins(_graphBuilder, _fileSource); } DirectShowUtil.RemoveUnusedFiltersFromGraph(_graphBuilder); #endregion _mediaCtrl = (IMediaControl)_graphBuilder; _mediaEvt = (IMediaEventEx)_graphBuilder; _mediaSeeking = (IMediaSeeking)_graphBuilder; if (_mediaSeeking == null) { Log.Error("TSReaderPlayer: Unable to get IMediaSeeking interface"); } _audioStream = (IAudioStream)_fileSource; if (_audioStream == null) { Log.Error("TSReaderPlayer: Unable to get IAudioStream interface"); } _audioSelector = new AudioSelector(_audioStream); if (!_isRadio) { if (enableDVBTtxtSubtitles || enableDVBBitmapSubtitles) { try { SubtitleRenderer.GetInstance().SetPlayer(this); _dvbSubRenderer = SubtitleRenderer.GetInstance(); } catch (Exception e) { Log.Error(e); } } if (enableDVBBitmapSubtitles) { _subtitleStream = (ISubtitleStream)_fileSource; if (_subtitleStream == null) { Log.Error("TSReaderPlayer: Unable to get ISubtitleStream interface"); } } if (enableDVBTtxtSubtitles) { //Log.Debug("TSReaderPlayer: Obtaining TeletextSource"); _teletextSource = (ITeletextSource)_fileSource; if (_teletextSource == null) { Log.Error("TSReaderPlayer: Unable to get ITeletextSource interface"); } Log.Debug("TSReaderPlayer: Creating Teletext Receiver"); TeletextSubtitleDecoder ttxtDecoder = new TeletextSubtitleDecoder(_dvbSubRenderer); _ttxtReceiver = new TeletextReceiver(_teletextSource, ttxtDecoder); // regardless of whether dvb subs are enabled, the following call is okay // if _subtitleStream is null the subtitle will just not setup for bitmap subs _subSelector = new SubtitleSelector(_subtitleStream, _dvbSubRenderer, ttxtDecoder); } else if (enableDVBBitmapSubtitles) { // if only dvb subs are enabled, pass null for ttxtDecoder _subSelector = new SubtitleSelector(_subtitleStream, _dvbSubRenderer, null); } } if (_audioRendererFilter != null) { //Log.Info("TSReaderPlayer:set reference clock"); IMediaFilter mp = (IMediaFilter)_graphBuilder; IReferenceClock clock = (IReferenceClock)_audioRendererFilter; hr = mp.SetSyncSource(null); hr = mp.SetSyncSource(clock); //Log.Info("TSReaderPlayer:set reference clock:{0:X}", hr); _basicAudio = (IBasicAudio)_graphBuilder; } if (!_isRadio) { IBaseFilter basefilter; _graphBuilder.FindFilterByName("Line 21 Decoder", out basefilter); if (basefilter == null) { _graphBuilder.FindFilterByName("Line21 Decoder", out basefilter); } if (basefilter == null) { _graphBuilder.FindFilterByName("Line 21 Decoder 2", out basefilter); } if (basefilter != null) { Log.Info("TSreaderPlayer: Line21 Decoder (Closed Captions), in use"); //: {0}", showClosedCaptions); _line21Decoder = (IAMLine21Decoder)basefilter; if (_line21Decoder != null) { AMLine21CCState state = AMLine21CCState.Off; hr = _line21Decoder.SetServiceState(state); if (hr == 0) { Log.Info("TSReaderPlayer: Closed Captions state change successful"); } else { Log.Info("TSReaderPlayer: Failed to change Closed Captions state"); } } } if (!_vmr9.IsVMR9Connected) { Log.Error("TSReaderPlayer: Failed vmr9 not connected"); Cleanup(); return(false); } DirectShowUtil.EnableDeInterlace(_graphBuilder); _vmr9.SetDeinterlaceMode(); } using (MPSettings xmlreader = new MPSettings()) { int lastSubIndex = xmlreader.GetValueAsInt("tvservice", "lastsubtitleindex", 0); Log.Debug("TSReaderPlayer: Last subtitle index: {0}", lastSubIndex); CurrentSubtitleStream = lastSubIndex; } return(true); } catch (Exception ex) { Log.Error("TSReaderPlayer: Exception while creating DShow graph {0}", ex.Message); Cleanup(); return(false); } }
async private void CutGif(int from, int to, String filePath, String[] additionalFilter = null, bool subtitles = false, bool fullResolution = false, bool keepAudio = false) { if (from > to) { int t = from; from = to; to = t; } if (from == to) { ShowMessage(MessageType.Warning, "Start and end markers have same position"); return; } if (TimeSpan.FromMilliseconds(to - from) > TimeSpan.FromMinutes(kWarningTresholdMin)) { if (MessageBox.Show("You selected timespan longer than 5 minutes. Do you want proceed?", "Gifer", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; } } var subpath = Path.ChangeExtension(Path.GetTempFileName(), "ass"); var escapedPath = subpath.Replace("\\", "\\\\").Replace(":", "\\:").Replace("[", "\\[").Replace("]", "\\]"); var mediaInfo = await FFmpeg.GetMediaInfo(filePath); bool isDVDsubs = false; if (subtitles) { if (selectedSubtitle == null) { selectedSubtitle = mediaInfo.SubtitleStreams.First(); } if (selectedSubtitle.Codec == "dvd_subtitle") { isDVDsubs = true; } else { var subconv = FFmpeg.Conversions.New().AddStream(selectedSubtitle).SetOutput(subpath); WriteToLog(subconv.Build()); await subconv.Start(); } } var videoStream = mediaInfo.VideoStreams.First(); var fileName = Path.GetFileNameWithoutExtension(filePath); var resultName = fileName + "_" + from + "_" + to + ".mp4"; var videoPath = Environment.GetFolderPath(Environment.SpecialFolder.MyVideos); var resultPath = Path.Combine(videoPath, resultName); var resizeVf = "scale=iw*sar:ih, scale='min(800,ceil(iw/2)*2)':-2"; var roundVf = "pad=ceil(iw/2)*2:ceil(ih/2)*2"; var subtitlesVf = FormattableString.Invariant($"subtitles='{escapedPath}':original_size={videoStream.Width}x{videoStream.Height}:force_style='FontName=Open Sans Semibold,PrimaryColour=&H00FFFFFF,Bold=1,ScaleX={Configuration.SubtitlesScale:F1},ScaleY={Configuration.SubtitlesScale:F1}'"); var vfs = new List <String>(); if (additionalFilter != null) { vfs.AddRange(additionalFilter); } if (!fullResolution) { vfs.Add(resizeVf); } else { vfs.Add(roundVf); } if (subtitles) { if (isDVDsubs) { var dvdSubsVf = FormattableString.Invariant($"scale[vidi];[sub][vidi]scale2ref[subrs][vidio];[vidio][subrs]overlay;[0:{selectedSubtitle.Index}]fps=fps={videoStream.Framerate}[sub]"); vfs.Add(dvdSubsVf); } else { vfs.Add(subtitlesVf); } } var crf = Configuration.CRF; var conv = new Conversion().AddStream(videoStream).AddParameter($"-ss {from}ms -to {to}ms -copyts", ParameterPosition.PreInput) .SetPixelFormat(PixelFormat.yuv420p) .AddParameter($"-filter_complex \"[0:v]{BuildVF(vfs)}\" -map -0:s -c:v libx264 -crf {crf} -profile:v baseline -ss {from}ms") .SetOutput(resultPath).SetOverwriteOutput(true); if (keepAudio) { if (selectedAudio == null) { selectedAudio = mediaInfo.AudioStreams.First(); } conv = conv.AddStream(selectedAudio); } if (isDVDsubs) { conv = conv.AddStream(selectedSubtitle); } WriteToLog(conv.Build()); try { var convProcess = await conv.Start(); } catch (Exception ex) { WriteToLog(ex.ToString()); ShowMessage(MessageType.Error, "Building gif failed"); return; } ShowMessage(MessageType.Success, "Finished building gif"); StringCollection resultList = new StringCollection { resultPath }; Clipboard.SetFileDropList(resultList); if (subtitles) { File.Delete(subpath); } }
/// <summary> create the used COM components and get the interfaces. </summary> protected override bool GetInterfaces(string filename) { Log.Info("TSReaderPlayer: GetInterfaces()"); try { _graphBuilder = (IGraphBuilder)new FilterGraphNoThread(); _rotEntry = new DsROTEntry((IFilterGraph)_graphBuilder); //Get filterCodecName and filterConfig filterConfig = GetFilterConfiguration(); filterCodec = GetFilterCodec(); #region add AudioRenderer //Add Audio Renderer AudioRendererAdd(); #endregion #region add AudioSwitcher MPAudioSwitcherAdd(); #endregion #region add TsReader TsReader reader = new TsReader(); _fileSource = (IBaseFilter)reader; _ireader = (ITSReader)reader; _interfaceTSReader = _fileSource; if (filterConfig != null) _ireader.SetRelaxedMode(filterConfig.relaxTsReader); // enable/disable continousity filtering _ireader.SetTsReaderCallback(this); _ireader.SetRequestAudioChangeCallback(this); Log.Info("TSReaderPlayer: Add TsReader to graph"); int hr = _graphBuilder.AddFilter((IBaseFilter)_fileSource, "TsReader"); DsError.ThrowExceptionForHR(hr); #endregion #region load file in TsReader IFileSourceFilter interfaceFile = (IFileSourceFilter)_fileSource; if (interfaceFile == null) { Log.Error("TSReaderPlayer: Failed to get IFileSourceFilter"); Cleanup(); return false; } Log.Info("TSReaderPlayer: Open file: {0}", filename); hr = interfaceFile.Load(filename, null); if (hr != 0) { Log.Error("TSReaderPlayer: Failed to open file:{0} :0x{1:x}", filename, hr); Cleanup(); return false; } #endregion #region add codecs Log.Info("TSReaderPlayer: Add codecs"); // does .ts file contain video? // default is _isRadio=false which prevents recorded radio file playing if (!_videoFormat.IsValid && g_Player.AudioStreams == 1) { Log.Debug("TSReaderPlayer: Stream is Radio"); _isRadio = true; } if (!_isRadio) { if (_videoFormat.IsValid) { _vmr9 = VMR9Util.g_vmr9 = new VMR9Util(); bool AddVMR9 = VMR9Util.g_vmr9.AddVMR9(_graphBuilder); if (!AddVMR9) { Log.Error("TSReaderPlayer:Failed to add VMR9 to graph"); return false; } VMR9Util.g_vmr9.Enable(false); } // Add preferred video filters UpdateFilters("Video"); Log.Debug("TSReaderPlayer: UpdateFilters Video done"); if (filterConfig != null && filterConfig.enableDVBBitmapSubtitles) { try { SubtitleRenderer.GetInstance().AddSubtitleFilter(_graphBuilder); Log.Debug("TSReaderPlayer: SubtitleRenderer AddSubtitleFilter"); } catch (Exception e) { Log.Error(e); } } } // Add preferred audio filters UpdateFilters("Audio"); Log.Debug("TSReaderPlayer: UpdateFilters Audio done"); #endregion #region PostProcessingEngine Detection IPostProcessingEngine postengine = PostProcessingEngine.GetInstance(true); if (!postengine.LoadPostProcessing(_graphBuilder)) { PostProcessingEngine.engine = new PostProcessingEngine.DummyEngine(); Log.Debug("TSReaderPlayer: PostProcessingEngine to DummyEngine"); } #endregion #region render TsReader output pins Log.Info("TSReaderPlayer: Render TsReader outputs"); if (_isRadio && g_Player.AudioStreams == 1) { IEnumPins enumPins; hr = _fileSource.EnumPins(out enumPins); DsError.ThrowExceptionForHR(hr); IPin[] pins = new IPin[1]; int fetched = 0; while (enumPins.Next(1, pins, out fetched) == 0) { if (fetched != 1) { break; } PinDirection direction; pins[0].QueryDirection(out direction); if (direction == PinDirection.Output) { IEnumMediaTypes enumMediaTypes; pins[0].EnumMediaTypes(out enumMediaTypes); AMMediaType[] mediaTypes = new AMMediaType[20]; int fetchedTypes; enumMediaTypes.Next(20, mediaTypes, out fetchedTypes); for (int i = 0; i < fetchedTypes; ++i) { if (mediaTypes[i].majorType == MediaType.Audio) { hr = _graphBuilder.Render(pins[0]); DsError.ThrowExceptionForHR(hr); break; } } } DirectShowUtil.ReleaseComObject(pins[0]); } DirectShowUtil.ReleaseComObject(enumPins); } else { DirectShowUtil.RenderGraphBuilderOutputPins(_graphBuilder, _fileSource); if (filterConfig != null && !filterConfig.enableCCSubtitles) { CleanupCC(); Log.Debug("TSReaderPlayer: CleanupCC filter (Tv/Recorded Stream Detected)"); } } DirectShowUtil.RemoveUnusedFiltersFromGraph(_graphBuilder); #endregion _mediaCtrl = (IMediaControl)_graphBuilder; _mediaEvt = (IMediaEventEx)_graphBuilder; _mediaSeeking = (IMediaSeeking)_graphBuilder; if (_mediaSeeking == null) { Log.Error("TSReaderPlayer: Unable to get IMediaSeeking interface"); } _audioStream = (IAudioStream)_fileSource; if (_audioStream == null) { Log.Error("TSReaderPlayer: Unable to get IAudioStream interface"); } _audioSelector = new AudioSelector(_audioStream); if (!_isRadio) { if (filterConfig != null && (filterConfig != null && filterConfig.enableDVBTtxtSubtitles || filterConfig.enableDVBBitmapSubtitles)) { try { SubtitleRenderer.GetInstance().SetPlayer(this); _dvbSubRenderer = SubtitleRenderer.GetInstance(); } catch (Exception e) { Log.Error(e); } } if (filterConfig != null && filterConfig.enableDVBBitmapSubtitles) { _subtitleStream = (ISubtitleStream)_fileSource; if (_subtitleStream == null) { Log.Error("TSReaderPlayer: Unable to get ISubtitleStream interface"); } } if (filterConfig != null && filterConfig.enableDVBTtxtSubtitles) { //Log.Debug("TSReaderPlayer: Obtaining TeletextSource"); _teletextSource = (ITeletextSource)_fileSource; if (_teletextSource == null) { Log.Error("TSReaderPlayer: Unable to get ITeletextSource interface"); } Log.Debug("TSReaderPlayer: Creating Teletext Receiver"); try { using (MPSettings xmlreader = new MPSettings()) xmlreader.SetValue("tvservice", "dvbdefttxtsubtitles", "999;999"); } catch { } TeletextSubtitleDecoder ttxtDecoder = new TeletextSubtitleDecoder(_dvbSubRenderer); _ttxtReceiver = new TeletextReceiver(_teletextSource, ttxtDecoder); // regardless of whether dvb subs are enabled, the following call is okay // if _subtitleStream is null the subtitle will just not setup for bitmap subs _subSelector = new SubtitleSelector(_subtitleStream, _dvbSubRenderer, ttxtDecoder); } else if (filterConfig != null && filterConfig.enableDVBBitmapSubtitles) { // if only dvb subs are enabled, pass null for ttxtDecoder _subSelector = new SubtitleSelector(_subtitleStream, _dvbSubRenderer, null); } } if (filterCodec._audioRendererFilter != null) { //Log.Info("TSReaderPlayer:set reference clock"); /*IMediaFilter mp = (IMediaFilter)_graphBuilder; IReferenceClock clock = (IReferenceClock)filterCodec._audioRendererFilter; hr = mp.SetSyncSource(null); hr = mp.SetSyncSource(clock);*/ //Log.Info("TSReaderPlayer:set reference clock:{0:X}", hr); SyncAudioRenderer(); _basicAudio = (IBasicAudio)_graphBuilder; } if (!_isRadio) { if (VMR9Util.g_vmr9 != null && filterConfig != null && filterConfig.enableCCSubtitles) { CleanupCC(); ReleaseCC(); ReleaseCC2(); CoreCCParserCheck(); DirectShowUtil.RenderUnconnectedOutputPins(_graphBuilder, filterCodec.VideoCodec); Log.Debug("TSReaderPlayer: Render VideoCodec filter (Tv/Recorded Stream Detected)"); EnableCC(); Log.Debug("TSReaderPlayer: EnableCC"); if (CoreCCPresent) { DirectShowUtil.RenderUnconnectedOutputPins(_graphBuilder, filterCodec.CoreCCParser); Log.Debug("TSReaderPlayer: Render CoreCCParser filter (Tv/Recorded Stream Detected)"); EnableCC2(); Log.Debug("TSReaderPlayer: EnableCC2"); } } if (VMR9Util.g_vmr9 != null && !VMR9Util.g_vmr9.IsVMR9Connected) { Log.Error("TSReaderPlayer: Failed vmr9 not connected"); Cleanup(); return false; } DirectShowUtil.EnableDeInterlace(_graphBuilder); if (VMR9Util.g_vmr9 != null) { VMR9Util.g_vmr9.SetDeinterlaceMode(); } } using (MPSettings xmlreader = new MPSettings()) { if (filterConfig.autoShowSubWhenTvStarts && SupportsCC && CurrentSubtitleStream == 0) { CurrentSubtitleStream = -1; } else { int lastSubIndex = xmlreader.GetValueAsInt("tvservice", "lastsubtitleindex", 0); Log.Debug("TSReaderPlayer: Last subtitle index: {0}", lastSubIndex); CurrentSubtitleStream = lastSubIndex; } } if (filterConfig != null && !filterConfig.autoShowSubWhenTvStarts) { Log.Debug("TSReaderPlayer: Automatically show subtitles when TV starts is set to {0}", filterConfig.autoShowSubWhenTvStarts); EnableSubtitle = filterConfig.autoShowSubWhenTvStarts; } return true; } catch (Exception ex) { Log.Error("TSReaderPlayer: Exception while creating DShow graph {0}", ex.Message); Cleanup(); return false; } }
public SubtitleSelector(ISubtitleStream dvbStreams, SubtitleRenderer subRender, TeletextSubtitleDecoder subDecoder) { Log.Debug("SubtitleSelector ctor"); if (subRender == null) { throw new Exception("Nullpointer input not allowed ( SubtitleRenderer)"); } else { this.dvbStreams = dvbStreams; this.subRender = subRender; } // load preferences using (MediaPortal.Profile.Settings reader = new MediaPortal.Profile.Settings(MediaPortal.Configuration.Config.GetFile(MediaPortal.Configuration.Config.Dir.Config, "MediaPortal.xml"))) { preferedLanguages = new List<string>(); string languages = reader.GetValueAsString("tvservice", "preferredsublanguages", ""); Log.Debug("SubtitleSelector: sublangs entry content: " + languages); StringTokenizer st = new StringTokenizer(languages, ";"); while (st.HasMore) { string lang = st.NextToken(); if (lang.Length != 3) { Log.Warn("Language {0} is not in the correct format!", lang); } else { preferedLanguages.Add(lang); Log.Info("Prefered language {0} is {1}", preferedLanguages.Count, lang); } } } pageEntries = new Dictionary<int, TeletextPageEntry>(); bitmapSubtitleCache = new List<SubtitleOption>(); lock (syncLock) { if (subDecoder != null) { subDecoder.SetPageInfoCallback(new MediaPortal.Player.Subtitles.TeletextSubtitleDecoder.PageInfoCallback(OnPageInfo)); } if (dvbStreams != null) { RetrieveBitmapSubtitles(); subStreamCallback = new SubtitleStreamEventCallback(OnSubtitleReset); IntPtr pSubStreamCallback = Marshal.GetFunctionPointerForDelegate(subStreamCallback); Log.Debug("Calling SetSubtitleStreamEventCallback"); dvbStreams.SetSubtitleResetCallback(pSubStreamCallback); } if (preferedLanguages.Count > 0) { autoSelectOption = new SubtitleOption(); autoSelectOption.language = "None"; autoSelectOption.isAuto = true; autoSelectOption.type = SubtitleType.None; SetOption(0); // the autoselect mode will have index 0 (ugly) } } Log.Debug("End SubtitleSelector ctor"); }
/// <summary> create the used COM components and get the interfaces. </summary> protected override bool GetInterfaces(string filename) { Log.Info("TSReaderPlayer: GetInterfaces()"); try { string strAudioRenderer = ""; int intFilters = 0; // FlipGer: count custom filters string strFilters = ""; // FlipGer: collect custom filters LoadMyTvFilterSettings(ref intFilters, ref strFilters, ref strVideoCodec, ref strAudioCodec, ref strAACAudioCodec, ref strDDPLUSAudioCodec, ref strH264VideoCodec, ref strAudioRenderer, ref enableDVBBitmapSubtitles, ref enableDVBTtxtSubtitles, ref relaxTsReader); _graphBuilder = (IGraphBuilder)new FilterGraph(); _rotEntry = new DsROTEntry((IFilterGraph)_graphBuilder); if (strAudioRenderer.Length > 0) //audio renderer must be in graph before audio switcher { _audioRendererFilter = DirectShowUtil.AddAudioRendererToGraph(_graphBuilder, strAudioRenderer, true); } #region add AudioSwitcher if (enableMPAudioSwitcher) //audio switcher must be in graph before tsreader audiochangecallback { _audioSwitcherFilter = DirectShowUtil.AddFilterToGraph(_graphBuilder, "MediaPortal AudioSwitcher"); if (_audioSwitcherFilter == null) { Log.Error("TSReaderPlayer: Failed to add AudioSwitcher to graph"); } } #endregion #region add TsReader TsReader reader = new TsReader(); _fileSource = (IBaseFilter)reader; _ireader = (ITSReader)reader; _interfaceTSReader = _fileSource; _ireader.SetRelaxedMode(relaxTsReader); // enable/disable continousity filtering _ireader.SetTsReaderCallback(this); _ireader.SetRequestAudioChangeCallback(this); Log.Info("TSReaderPlayer: Add TsReader to graph"); int hr = _graphBuilder.AddFilter((IBaseFilter)_fileSource, "TsReader"); DsError.ThrowExceptionForHR(hr); #endregion #region load file in TsReader IFileSourceFilter interfaceFile = (IFileSourceFilter)_fileSource; if (interfaceFile == null) { Log.Error("TSReaderPlayer: Failed to get IFileSourceFilter"); Cleanup(); return false; } Log.Info("TSReaderPlayer: Open file: {0}", filename); hr = interfaceFile.Load(filename, null); if (hr != 0) { Log.Error("TSReaderPlayer: Failed to open file:{0} :0x{1:x}", filename, hr); Cleanup(); return false; } #endregion #region add codecs Log.Info("TSReaderPlayer: Add codecs"); // add preferred video & audio codecs MatchFilters("Video"); MatchFilters("Audio"); // does .ts file contain video? // default is _isRadio=false which prevents recorded radio file playing if (!_videoFormat.IsValid) _isRadio = true; if (!_isRadio) { _vmr9 = new VMR9Util(); _vmr9.AddVMR9(_graphBuilder); _vmr9.Enable(false); DirectShowUtil.AddFilterToGraph(_graphBuilder, videoFilter); if (enableDVBBitmapSubtitles) { try { SubtitleRenderer.GetInstance().AddSubtitleFilter(_graphBuilder); } catch (Exception e) { Log.Error(e); } } } DirectShowUtil.AddFilterToGraph(_graphBuilder, audioFilter); // FlipGer: add custom filters to graph string[] arrFilters = strFilters.Split(';'); for (int i = 0; i < intFilters; i++) { DirectShowUtil.AddFilterToGraph(_graphBuilder, arrFilters[i]); } #endregion #region PostProcessingEngine Detection IPostProcessingEngine postengine = PostProcessingEngine.GetInstance(true); if (!postengine.LoadPostProcessing(_graphBuilder)) { PostProcessingEngine.engine = new PostProcessingEngine.DummyEngine(); } #endregion #region render TsReader output pins Log.Info("TSReaderPlayer: Render TsReader outputs"); if (_isRadio) { IEnumPins enumPins; hr = _fileSource.EnumPins(out enumPins); DsError.ThrowExceptionForHR(hr); IPin[] pins = new IPin[1]; int fetched = 0; while (enumPins.Next(1, pins, out fetched) == 0) { if (fetched != 1) { break; } PinDirection direction; pins[0].QueryDirection(out direction); if (direction == PinDirection.Output) { IEnumMediaTypes enumMediaTypes; pins[0].EnumMediaTypes(out enumMediaTypes); AMMediaType[] mediaTypes = new AMMediaType[20]; int fetchedTypes; enumMediaTypes.Next(20, mediaTypes, out fetchedTypes); for (int i = 0; i < fetchedTypes; ++i) { if (mediaTypes[i].majorType == MediaType.Audio) { hr = _graphBuilder.Render(pins[0]); DsError.ThrowExceptionForHR(hr); break; } } } DirectShowUtil.ReleaseComObject(pins[0]); } DirectShowUtil.ReleaseComObject(enumPins); } else { DirectShowUtil.RenderGraphBuilderOutputPins(_graphBuilder, _fileSource); } DirectShowUtil.RemoveUnusedFiltersFromGraph(_graphBuilder); #endregion _mediaCtrl = (IMediaControl)_graphBuilder; _mediaEvt = (IMediaEventEx)_graphBuilder; _mediaSeeking = (IMediaSeeking)_graphBuilder; if (_mediaSeeking == null) { Log.Error("TSReaderPlayer: Unable to get IMediaSeeking interface"); } _audioStream = (IAudioStream)_fileSource; if (_audioStream == null) { Log.Error("TSReaderPlayer: Unable to get IAudioStream interface"); } _audioSelector = new AudioSelector(_audioStream); if (!_isRadio) { if (enableDVBTtxtSubtitles || enableDVBBitmapSubtitles) { try { SubtitleRenderer.GetInstance().SetPlayer(this); _dvbSubRenderer = SubtitleRenderer.GetInstance(); } catch (Exception e) { Log.Error(e); } } if (enableDVBBitmapSubtitles) { _subtitleStream = (ISubtitleStream)_fileSource; if (_subtitleStream == null) { Log.Error("TSReaderPlayer: Unable to get ISubtitleStream interface"); } } if (enableDVBTtxtSubtitles) { //Log.Debug("TSReaderPlayer: Obtaining TeletextSource"); _teletextSource = (ITeletextSource)_fileSource; if (_teletextSource == null) { Log.Error("TSReaderPlayer: Unable to get ITeletextSource interface"); } Log.Debug("TSReaderPlayer: Creating Teletext Receiver"); try { using (MPSettings xmlreader = new MPSettings()) xmlreader.SetValue("tvservice", "dvbdefttxtsubtitles", "999;999"); } catch { } TeletextSubtitleDecoder ttxtDecoder = new TeletextSubtitleDecoder(_dvbSubRenderer); _ttxtReceiver = new TeletextReceiver(_teletextSource, ttxtDecoder); // regardless of whether dvb subs are enabled, the following call is okay // if _subtitleStream is null the subtitle will just not setup for bitmap subs _subSelector = new SubtitleSelector(_subtitleStream, _dvbSubRenderer, ttxtDecoder); } else if (enableDVBBitmapSubtitles) { // if only dvb subs are enabled, pass null for ttxtDecoder _subSelector = new SubtitleSelector(_subtitleStream, _dvbSubRenderer, null); } } if (_audioRendererFilter != null) { //Log.Info("TSReaderPlayer:set reference clock"); IMediaFilter mp = (IMediaFilter)_graphBuilder; IReferenceClock clock = (IReferenceClock)_audioRendererFilter; hr = mp.SetSyncSource(null); hr = mp.SetSyncSource(clock); //Log.Info("TSReaderPlayer:set reference clock:{0:X}", hr); _basicAudio = (IBasicAudio)_graphBuilder; } if (!_isRadio) { IBaseFilter basefilter; _graphBuilder.FindFilterByName("Line 21 Decoder", out basefilter); if (basefilter == null) { _graphBuilder.FindFilterByName("Line21 Decoder", out basefilter); } if (basefilter == null) { _graphBuilder.FindFilterByName("Line 21 Decoder 2", out basefilter); } if (basefilter != null) { Log.Info("TSreaderPlayer: Line21 Decoder (Closed Captions), in use"); //: {0}", showClosedCaptions); _line21Decoder = (IAMLine21Decoder)basefilter; if (_line21Decoder != null) { AMLine21CCState state = AMLine21CCState.Off; hr = _line21Decoder.SetServiceState(state); if (hr == 0) { Log.Info("TSReaderPlayer: Closed Captions state change successful"); } else { Log.Info("TSReaderPlayer: Failed to change Closed Captions state"); } } } if (!_vmr9.IsVMR9Connected) { Log.Error("TSReaderPlayer: Failed vmr9 not connected"); Cleanup(); return false; } DirectShowUtil.EnableDeInterlace(_graphBuilder); _vmr9.SetDeinterlaceMode(); } using (MPSettings xmlreader = new MPSettings()) { int lastSubIndex = xmlreader.GetValueAsInt("tvservice", "lastsubtitleindex", 0); Log.Debug("TSReaderPlayer: Last subtitle index: {0}", lastSubIndex); CurrentSubtitleStream = lastSubIndex; } return true; } catch (Exception ex) { Log.Error("TSReaderPlayer: Exception while creating DShow graph {0}", ex.Message); Cleanup(); return false; } }