Esempio n. 1
0
        /// <summary>
        /// Adds the file source filter to the graph.
        /// </summary>
        protected override void AddSourceFilter()
        {
            if (!IsLocalFilesystemResource)
            {
                throw new IllegalCallException("The BluRayPlayer can only play local file system resources");
            }

            // Load source filter, assembly location must be determined here, otherwise LoadFilterFromDll would try to lookup the file relative to VideoPlayer!
            string filterPath = FilterLoader.BuildAssemblyRelativePath("BDReader.ax");

            _fileSource = FilterLoader.LoadFilterFromDll(filterPath, typeof(BDReader).GUID);

            // Init BD Reader
            _bdReader = (IBDReader)_fileSource;
            _bdReader.SetD3DDevice(_device.NativePointer);
            _bdReader.SetBDReaderCallback(this);

            _graphBuilder.AddFilter(_fileSource, BluRayAPI.BDREADER_FILTER_NAME);

            _subtitleRenderer = new SubtitleRenderer(OnTextureInvalidated);
            _subtitleFilter   = _subtitleRenderer.AddSubtitleFilter(_graphBuilder);
            if (_subtitleFilter != null)
            {
                _subtitleRenderer.RenderSubtitles = true;
                _subtitleRenderer.SetPlayer(this);
            }

            // Render the file
            IFileSourceFilter f = (IFileSourceFilter)_fileSource;

            using (((ILocalFsResourceAccessor)_resourceAccessor).EnsureLocalFileSystemAccess())
            {
                string strFile = Path.Combine(((ILocalFsResourceAccessor)_resourceAccessor).LocalFileSystemPath, @"BDMV\index.bdmv");
                f.Load(strFile, null);

                // Init GraphRebuilder
                _graphRebuilder = new GraphRebuilder(_graphBuilder, _fileSource, OnAfterGraphRebuild)
                {
                    PlayerName = PlayerTitle
                };

                // Get the complete BD title information (including all streams, chapters...)
                _titleInfos = GetTitleInfoCollection(_bdReader);

                ulong duration = 0;
                uint  maxIdx   = 0;
                foreach (BluRayAPI.BDTitleInfo bdTitleInfo in _titleInfos)
                {
                    if (bdTitleInfo.Duration > duration)
                    {
                        duration = bdTitleInfo.Duration;
                        maxIdx   = bdTitleInfo.Index;
                    }
                }
                // TEST: play the longest title
                _forceTitle = false;
                if (_forceTitle)
                {
                    _bdReader.ForceTitleBasedPlayback(true, maxIdx);
                    _currentTitle = (int)maxIdx;
                }
                else
                {
                    _bdReader.ForceTitleBasedPlayback(false, 0);
                }

                _bdReader.Start();
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Adds the TsReader filter to the graph.
        /// </summary>
        protected override void AddSourceFilter()
        {
            VideoSettings settings = ServiceRegistration.Get <ISettingsManager>().Load <VideoSettings>() ?? new VideoSettings();

            // Render the file
            _sourceFilter = FilterLoader.LoadFilterFromDll("TsReader.ax", typeof(TsReader).GUID, true);
            var baseFilter = _sourceFilter.GetFilter();

            IFileSourceFilter fileSourceFilter = (IFileSourceFilter)baseFilter;

            _tsReader = (ITsReader)baseFilter;
            _tsReader.SetRelaxedMode(1);
            _tsReader.SetTsReaderCallback(this);
            _tsReader.SetRequestAudioChangeCallback(this);

            _graphBuilder.AddFilter(baseFilter, TSREADER_FILTER_NAME);

            _subtitleRenderer = new SubtitleRenderer(OnTextureInvalidated);
            _subtitleFilter   = _subtitleRenderer.AddSubtitleFilter(_graphBuilder);
            if (_subtitleFilter != null)
            {
                _subtitleRenderer.RenderSubtitles = settings.EnableSubtitles;
                _subtitleRenderer.SetPlayer(this);
            }

            // For supporting CC
            AddClosedCaptionsFilter();

            if (_resourceLocator.NativeResourcePath.IsNetworkResource)
            {
                // _resourceAccessor points to an rtsp:// stream or network file
                var sourcePathOrUrl = SourcePathOrUrl;

                if (sourcePathOrUrl == null)
                {
                    throw new IllegalCallException("The TsVideoPlayer can only play network resources of type INetworkResourceAccessor");
                }

                ServiceRegistration.Get <ILogger>().Debug("{0}: Initializing for stream '{1}'", PlayerTitle, sourcePathOrUrl);

                IDisposable accessEnsurer = null;
                if (IsLocalFilesystemResource)
                {
                    accessEnsurer = ((ILocalFsResourceAccessor)_resourceAccessor).EnsureLocalFileSystemAccess();
                }
                using (accessEnsurer)
                {
                    int hr = fileSourceFilter.Load(SourcePathOrUrl, null);
                    new HRESULT(hr).Throw();
                }
            }
            else
            {
                // _resourceAccessor points to a local or remote mapped .ts file
                _localFsRaHelper = new LocalFsResourceAccessorHelper(_resourceAccessor);
                var localFileSystemResourceAccessor = _localFsRaHelper.LocalFsResourceAccessor;

                if (localFileSystemResourceAccessor == null)
                {
                    throw new IllegalCallException("The TsVideoPlayer can only play file resources of type ILocalFsResourceAccessor");
                }

                using (localFileSystemResourceAccessor.EnsureLocalFileSystemAccess())
                {
                    ServiceRegistration.Get <ILogger>().Debug("{0}: Initializing for stream '{1}'", PlayerTitle, localFileSystemResourceAccessor.LocalFileSystemPath);
                    int hr = fileSourceFilter.Load(localFileSystemResourceAccessor.LocalFileSystemPath, null);
                    new HRESULT(hr).Throw();
                }
            }
            // Init GraphRebuilder
            _graphRebuilder = new GraphRebuilder(_graphBuilder, baseFilter, OnAfterGraphRebuild)
            {
                PlayerName = PlayerTitle
            };
        }
Esempio n. 3
0
        /// <summary>
        /// Adds the TsReader filter to the graph.
        /// </summary>
        protected override void AddSourceFilter()
        {
            var platform = IntPtr.Size > 4 ? "x64" : "x86";

            _sourceFilter = FilterLoader.LoadFilterFromDll($"{platform}\\TsReader.ax", typeof(TsReader).GUID, true);
            var baseFilter = _sourceFilter.GetFilter();

            IFileSourceFilter fileSourceFilter = (IFileSourceFilter)baseFilter;

            _tsReader = (ITsReader)baseFilter;
            _tsReader.SetRelaxedMode(1);
            _tsReader.SetTsReaderCallback(this);
            _tsReader.SetRequestAudioChangeCallback(this);

            _graphBuilder.AddFilter(baseFilter, TSREADER_FILTER_NAME);

            if (_resourceLocator.NativeResourcePath.IsNetworkResource)
            {
                // _resourceAccessor points to an rtsp:// stream or network file
                var sourcePathOrUrl = SourcePathOrUrl;

                if (sourcePathOrUrl == null)
                {
                    throw new IllegalCallException("The TsVideoPlayer can only play network resources of type INetworkResourceAccessor");
                }

                ServiceRegistration.Get <ILogger>().Debug("{0}: Initializing for stream '{1}'", PlayerTitle, sourcePathOrUrl);

                IDisposable accessEnsurer = null;
                if (IsLocalFilesystemResource)
                {
                    accessEnsurer = ((ILocalFsResourceAccessor)_resourceAccessor).EnsureLocalFileSystemAccess();
                }
                using (accessEnsurer)
                {
                    int hr = fileSourceFilter.Load(SourcePathOrUrl, null);
                    new HRESULT(hr).Throw();
                }
            }
            else
            {
                // _resourceAccessor points to a local or remote mapped .ts file
                _localFsRaHelper = new LocalFsResourceAccessorHelper(_resourceAccessor);
                var localFileSystemResourceAccessor = _localFsRaHelper.LocalFsResourceAccessor;

                if (localFileSystemResourceAccessor == null)
                {
                    throw new IllegalCallException("The TsVideoPlayer can only play file resources of type ILocalFsResourceAccessor");
                }

                using (localFileSystemResourceAccessor.EnsureLocalFileSystemAccess())
                {
                    ServiceRegistration.Get <ILogger>().Debug("{0}: Initializing for stream '{1}'", PlayerTitle, localFileSystemResourceAccessor.LocalFileSystemPath);
                    int hr = fileSourceFilter.Load(localFileSystemResourceAccessor.LocalFileSystemPath, null);
                    new HRESULT(hr).Throw();
                }
            }
            // Init GraphRebuilder
            _graphRebuilder = new GraphRebuilder(_graphBuilder, baseFilter, OnAfterGraphRebuild)
            {
                PlayerName = PlayerTitle
            };
        }