示例#1
0
        /// <summary>
        /// Gets the title info collection from the given BDReader object.
        /// </summary>
        /// <param name="reader">IBDReader object</param>
        /// <returns>a collection of titles</returns>
        protected virtual List <BluRayAPI.BDTitleInfo> GetTitleInfoCollection(IBDReader reader)
        {
            uint titleCount = 0;

            reader.GetTitleCount(ref titleCount);

            List <BluRayAPI.BDTitleInfo> titles = new List <BluRayAPI.BDTitleInfo>((int)titleCount);

            BluRayPlayerBuilder.LogDebug("Title count - {0}", titleCount);
            for (int i = 0; i < titleCount; i++)
            {
                BluRayAPI.BDTitleInfo titleInfo = GetTitleInfo(reader, i);
                titles.Add(titleInfo);
            }

            return(titles);
        }
      public TitleInfo(IBDReader reader, int index)
      {
        _reader = reader;
        _nativeTitle = new BDTitleInfo();

        try
        {
          _nativePtr = reader.GetTitleInfo(index);
          _nativeTitle = (BDTitleInfo) Marshal.PtrToStructure(_nativePtr, typeof (BDTitleInfo));
        }
        catch
        {
          Log.Error("BDPlayer: TitleInfo({0}) construction failed.", index);
        }
      }
    /// <summary> do cleanup and release DirectShow. </summary>
    protected void CloseInterfaces()
    {
      if (_graphBuilder == null)
      {
        return;
      }
      int hr;
      Log.Debug("BDPlayer: Cleanup DShow graph {0}", GUIGraphicsContext.InVmr9Render);
      try
      {
        BDOSDRenderer.Release();
        
        if (_mediaCtrl != null)
        {
          int counter = 0;
          FilterState state;
          hr = _mediaCtrl.Stop();
          hr = _mediaCtrl.GetState(10, out state);
          while (state != FilterState.Stopped || GUIGraphicsContext.InVmr9Render)
          {
            Thread.Sleep(100);
            hr = _mediaCtrl.GetState(10, out state);
            counter++;
            if (counter >= 30)
            {
              if (state != FilterState.Stopped)
                Log.Error("BDPlayer: graph still running");
              if (GUIGraphicsContext.InVmr9Render)
                Log.Error("BDPlayer: in renderer");
              break;
            }
          }
          _mediaCtrl = null;
        }

        if (_vmr9 != null)
        {
          _vmr9.Enable(false);
        }

        if (_mediaEvt != null)
        {
          hr = _mediaEvt.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero);
          _mediaEvt = null;
        }

        _videoWin = _graphBuilder as IVideoWindow;
        if (_videoWin != null)
        {
          hr = _videoWin.put_Visible(OABool.False);
          hr = _videoWin.put_Owner(IntPtr.Zero);
          _videoWin = null;
        }

        _mediaSeeking = null;
        _basicAudio = null;
        _basicVideo = null;
        _ireader = null;

        #region Cleanup Sebastiii

        if (VideoCodec != null)
        {
          DirectShowUtil.ReleaseComObject(VideoCodec, 5000);
          VideoCodec = null;
          Log.Info("BDPlayer: Cleanup VideoCodec");
        }

        if (AudioCodec != null)
        {
          DirectShowUtil.ReleaseComObject(AudioCodec, 5000);
          AudioCodec = null;
          Log.Info("BDPlayer: Cleanup AudioCodec");
        }

        if (_audioRendererFilter != null)
        {
          while (DirectShowUtil.ReleaseComObject(_audioRendererFilter) > 0) ;
          _audioRendererFilter = null;
          Log.Info("BDPlayer: Cleanup AudioRenderer");
        }

        //Test to ReleaseComObject from PostProcessFilter list objects.
        if (PostProcessFilterVideo.Count > 0)
        {
          foreach (var ppFilter in PostProcessFilterVideo)
          {
            if (ppFilter.Value != null) DirectShowUtil.ReleaseComObject(ppFilter.Value, 5000);
          }
          PostProcessFilterVideo.Clear();
          Log.Info("BDPlayer: Cleanup PostProcessVideo");
        }

        //Test to ReleaseComObject from PostProcessFilter list objects.
        if (PostProcessFilterAudio.Count > 0)
        {
          foreach (var ppFilter in PostProcessFilterAudio)
          {
            if (ppFilter.Value != null) DirectShowUtil.ReleaseComObject(ppFilter.Value, 5000);
          }
          PostProcessFilterAudio.Clear();
          Log.Info("BDPlayer: Cleanup PostProcessAudio");
        }

        #endregion

        if (_interfaceBDReader != null)
        {
          DirectShowUtil.ReleaseComObject(_interfaceBDReader, 5000);
          _interfaceBDReader = null;
        }

        if (_graphBuilder != null)
        {
          DirectShowUtil.RemoveFilters(_graphBuilder);
          if (_rotEntry != null)
          {
            _rotEntry.SafeDispose();
            _rotEntry = null;
          }
          while ((hr = DirectShowUtil.ReleaseComObject(_graphBuilder)) > 0) ;
          _graphBuilder = null;
        }

        if (_dvbSubRenderer != null)
        {
          _dvbSubRenderer.SetPlayer(null);
          _dvbSubRenderer = null;
        }

        if (_vmr9 != null)
        {
          _vmr9.SafeDispose();
          _vmr9 = null;
        }

        GUIGraphicsContext.form.Invalidate(true);
        _state = PlayState.Init;
      }
      catch (Exception ex)
      {
        Log.Error("BDPlayer: Exception while cleaning DShow graph - {0} {1}", ex.Message, ex.StackTrace);
      }
      //switch back to directx windowed mode
      ExclusiveMode(false);
    }
    protected bool GetInterfaces(string filename, int titleBD)
    {
      try
      {
        Log.Debug("BDPlayer: GetInterfaces()");

        _graphBuilder = (IGraphBuilder)new FilterGraph();
        _rotEntry = new DsROTEntry(_graphBuilder as IFilterGraph);

        filterConfig = GetFilterConfiguration();

        if (filterConfig.AudioRenderer.Length > 0)
        {
          _audioRendererFilter = DirectShowUtil.AddAudioRendererToGraph(_graphBuilder, filterConfig.AudioRenderer, true);
        }

        BDReader reader = new BDReader();
        _interfaceBDReader = reader as IBaseFilter;
        _ireader = reader as IBDReader;

        if (_interfaceBDReader == null || _ireader == null)
        {
          // todo: add exception
          return false;
        }

        // add the BD reader
        int hr = _graphBuilder.AddFilter(_interfaceBDReader, BD_READER_GRAPH_NAME);
        DsError.ThrowExceptionForHR(hr);

        Log.Debug("BDPlayer: Add BDReader to graph");

        IFileSourceFilter interfaceFile = (IFileSourceFilter)_interfaceBDReader;

        LoadSettings(_ireader);
        _ireader.SetD3DDevice(DirectShowUtil.GetUnmanagedDevice(GUIGraphicsContext.DX9Device));
        _ireader.SetBDReaderCallback(this);

        hr = interfaceFile.Load(filename, null);

        DsError.ThrowExceptionForHR(hr);

        Log.Debug("BDPlayer: BDReader loaded: {0}", filename);

        List<TitleInfo> titles = GetTitleInfoCollection(_ireader);

        while (true)
        {
          if (g_Player.ForcePlay && g_Player.SetResumeBDTitleState < g_Player.BdDefaultTitle)
          {
            if (titles.Count == 1)
            {
              _titleToPlay = 0;
              g_Player.SetResumeBDTitleState = g_Player.BdRemuxTitle;
            }
            else
            {
              _titleToPlay = g_Player.SetResumeBDTitleState;
            }
            _forceTitle = true;
            g_Player.ForcePlay = false;
          }
          else
          {
            if (titles.Count == 1)
            {
              // BD has only one title (remux one)
              _forceTitle = true;
              _titleToPlay = 0;
              g_Player.SetResumeBDTitleState = g_Player.BdRemuxTitle;

              if (g_Player.SetResumeBDTitleState == -1)
              {
                // user cancelled dialog
                titles.Dispose();
                g_Player.Stop();
                return false;
              }
            }
            else
            {
              _titleToPlay = SelectTitle(titles);
              g_Player.SetResumeBDTitleState = _titleToPlay;
              Log.Info("BDPlayer: BDReader _titleToPlay : {0}", _titleToPlay);
              if (_titleToPlay > -1)
              {
                // a specific title was selected
                _forceTitle = true;

                if (g_Player.SetResumeBDTitleState == -1)
                {
                  // user cancelled dialog
                  titles.Dispose();
                  g_Player.Stop();
                  return false;
                }
              }
              else
              {
                if (_titleToPlay == -1)
                {
                  // user cancelled dialog
                  g_Player.Stop();
                  titles.Dispose();
                  return false;
                }

                // user choose to display menu
                _forceTitle = false;
              }
            }
          }

          _ireader.ForceTitleBasedPlayback(_forceTitle, (uint)_titleToPlay);

          Log.Debug("BDPlayer: Starting BDReader");
          eventBuffer.Clear();
          hr = _ireader.Start();
          if (hr != 0)
          {

            if (!_forceTitle)
            {
              Log.Error("BDPlayer: Failed to start file:{0} :0x{1:x}", filename, hr);
              continue;
            }

            Log.Error("BDPlayer: Failed to start in title based mode file:{0} :0x{1:x}", filename, hr);
            titles.Dispose();
            return false;
          }
          else
          {
            Log.Info("BDPlayer: BDReader started");
          }

          break;
        }

        titles.Dispose();

        #region Filters

        Log.Info("BDPlayer: Adding filters");

        _vmr9 = new VMR9Util();
        _vmr9.AddVMR9(_graphBuilder);
        _vmr9.Enable(false);

        // Set VideoDecoder and VC1Override before adding filter in graph
        SetVideoDecoder();
        SetVC1Override();

        // Add preferred video filters
        UpdateFilters("Video");

        // Add preferred audio filters
        UpdateFilters("Audio");

        // Let the subtitle engine handle the proper filters
        try
        {
          SubtitleRenderer.GetInstance().AddSubtitleFilter(_graphBuilder);
        }
        catch (Exception e)
        {
          Log.Error(e);
        }
        
        #endregion

        #region PostProcessingEngine Detection

        IPostProcessingEngine postengine = PostProcessingEngine.GetInstance(true);
        if (!postengine.LoadPostProcessing(_graphBuilder))
        {
          PostProcessingEngine.engine = new PostProcessingEngine.DummyEngine();
        }

        #endregion

        #region render BDReader output pins

        Log.Info("BDPlayer: Render BDReader outputs");

        if (_interfaceBDReader != null)
        {
          DirectShowUtil.RenderGraphBuilderOutputPins(_graphBuilder, _interfaceBDReader);
        }
        
        //remove InternalScriptRenderer as it takes subtitle pin
        disableISR();

        //disable Closed Captions!
        disableCC();

        //RemoveAudioR();

        DirectShowUtil.RemoveUnusedFiltersFromGraph(_graphBuilder);

        #endregion

        _mediaCtrl = (IMediaControl)_graphBuilder;
        _mediaEvt = (IMediaEventEx)_graphBuilder;
        _mediaSeeking = (IMediaSeeking)_graphBuilder;

        try
        {
          SubtitleRenderer.GetInstance().SetPlayer(this);
          _dvbSubRenderer = SubtitleRenderer.GetInstance();
        }
        catch (Exception e)
        {
          Log.Error(e);
        }

        _subtitleStream = (Player.TSReaderPlayer.ISubtitleStream)_interfaceBDReader;
        if (_subtitleStream == null)
        {
          Log.Error("BDPlayer: Unable to get ISubtitleStream interface");
        }

        // if only dvb subs are enabled, pass null for ttxtDecoder
        _subSelector = new SubtitleSelector(_subtitleStream, _dvbSubRenderer, null);
        EnableSubtitle = _subtitlesEnabled;

        //Sync Audio Renderer
        SyncAudioRenderer();

        if (!_vmr9.IsVMR9Connected)
        {
          Log.Error("BDPlayer: Failed vmr9 not connected");
          return false;
        }
        _vmr9.SetDeinterlaceMode();
        return true;
      }
      catch (Exception ex)
      {
        Log.Error("BDPlayer: Exception while creating DShow graph {0}", ex.Message);
        return false;
      }
    }
 /// <summary>
 /// Gets the title info for the specified index
 /// </summary>
 /// <param name="reader">IBDReader object</param>
 /// <param name="index">index of the title</param>
 /// <returns></returns>
 protected virtual TitleInfo GetTitleInfo(IBDReader reader, int index)
 {
   TitleInfo titleInfo = new TitleInfo(reader, index);
   return titleInfo;
 }
    /// <summary>
    /// Gets the title info collection from the given BDReader object.
    /// </summary>
    /// <param name="reader">IBDReader object</param>
    /// <returns>a collection of titles</returns>
    protected virtual List<TitleInfo> GetTitleInfoCollection(IBDReader reader)
    {
      List<TitleInfo> titles = new List<TitleInfo>();

      uint titleCount = 0;
      reader.GetTitleCount(ref titleCount);

      Log.Debug("BDPlayer: Title count - {0}", titleCount);

      for (int i = 0; i < titleCount; i++)
      {
        TitleInfo titleInfo = GetTitleInfo(reader, i);
        titles.Add(titleInfo);
      }

      return titles;
    }
    /// <summary>
    /// Loads the setting from the user configuration into the IBDReader object.
    /// </summary>
    /// <param name="reader">IBDReader object</param>
    protected virtual void LoadSettings(IBDReader reader)
    {
      settings = new BDPlayerSettings();

      using (Settings xmlreader = new MPSettings())
      {
        settings.audioLang = xmlreader.GetValueAsString("bdplayer", "audiolanguage", "English");
        settings.audioType = StreamTypetoInt(xmlreader.GetValueAsString("bdplayer", "audiotype", "AC3"));
        settings.subtitleLang = xmlreader.GetValueAsString("bdplayer", "subtitlelanguage", "English");
        settings.parentalControl = xmlreader.GetValueAsInt("bdplayer", "parentalcontrol", 99);
        _subtitlesEnabled = xmlreader.GetValueAsBool("bdplayer", "subtitlesenabled", true);
        string regionCode = xmlreader.GetValueAsString("bdplayer", "regioncode", "B");
        switch (regionCode)
        {
          case "A":
            settings.regionCode = 1;
            break;
          case "B":
            settings.regionCode = 2;
            break;
          case "C":
            settings.regionCode = 4;
            break;
        }
      }

      foreach (CultureInfo cultureInformation in CultureInfo.GetCultures(CultureTypes.NeutralCultures))
      {
        if (String.Compare(cultureInformation.EnglishName, settings.audioLang, true) == 0)
        {
          settings.countryCode = cultureInformation.TwoLetterISOLanguageName;
          settings.audioLang = cultureInformation.ThreeLetterISOLanguageName;
        }
        if (String.Compare(cultureInformation.EnglishName, settings.subtitleLang, true) == 0)
        {
          settings.subtitleLang = cultureInformation.ThreeLetterISOLanguageName;
        }
      }
      settings.menuLang = settings.audioLang;
      reader.SetBDPlayerSettings(settings);
    }
示例#8
0
        /// <summary>
        /// Gets the title info for the specified index
        /// </summary>
        /// <param name="reader">IBDReader object</param>
        /// <param name="index">index of the title</param>
        /// <returns></returns>
        protected virtual BluRayAPI.BDTitleInfo GetTitleInfo(IBDReader reader, int index)
        {
            BluRayAPI.BDTitleInfo titleInfo = new BluRayAPI.BDTitleInfo();
            IntPtr ptr = IntPtr.Zero;

            try
            {
                ptr = reader.GetTitleInfo(index);
                BluRayAPI.UnmanagedBDTitleInfo umTitleInfo = (BluRayAPI.UnmanagedBDTitleInfo)
                                                             Marshal.PtrToStructure(ptr, typeof(BluRayAPI.UnmanagedBDTitleInfo));

                titleInfo = new BluRayAPI.BDTitleInfo
                {
                    AngleCount = umTitleInfo.AngleCount,
                    Duration   = umTitleInfo.Duration,
                    Index      = umTitleInfo.Index,
                    Playlist   = umTitleInfo.Playlist,
                    Clips      = new BluRayAPI.BDClipInfo[umTitleInfo.ClipCount],
                    Chapters   = new BluRayAPI.BDChapter[umTitleInfo.ChapterCount]
                };

                for (int i = 0; i < umTitleInfo.ClipCount; i++)
                {
                    BluRayAPI.UnmanagedBDClipInfo umClipInfo = (BluRayAPI.UnmanagedBDClipInfo)
                                                               Marshal.PtrToStructure(new IntPtr((int)umTitleInfo.Clips + i * Marshal.SizeOf(typeof(BluRayAPI.UnmanagedBDClipInfo))),
                                                                                      typeof(BluRayAPI.UnmanagedBDClipInfo));
                    BluRayAPI.BDClipInfo clipInfo = new BluRayAPI.BDClipInfo
                    {
                        AudioStreams    = new BluRayAPI.BDStreamInfo[umClipInfo.AudioStreamCount],
                        IgStreams       = new BluRayAPI.BDStreamInfo[umClipInfo.IgStreamCount],
                        PgStreams       = new BluRayAPI.BDStreamInfo[umClipInfo.PgStreamCount],
                        RawStreams      = new BluRayAPI.BDStreamInfo[umClipInfo.RawStreamCount],
                        VideoStreams    = new BluRayAPI.BDStreamInfo[umClipInfo.VideoStreamCount],
                        SecAudioStreams = new BluRayAPI.BDStreamInfo[umClipInfo.SecAudioStreamCount],
                        SecVideoStreams = new BluRayAPI.BDStreamInfo[umClipInfo.SecVideoStreamCount],
                        PktCount        = umClipInfo.PktCount,
                        StillMode       = umClipInfo.StillMode,
                        StillTime       = umClipInfo.StillTime
                    };

                    GetStreamInfo(clipInfo.VideoStreams, umClipInfo.VideoStreams);
                    GetStreamInfo(clipInfo.AudioStreams, umClipInfo.AudioStreams);
                    GetStreamInfo(clipInfo.IgStreams, umClipInfo.IgStreams);
                    GetStreamInfo(clipInfo.PgStreams, umClipInfo.PgStreams);
                    GetStreamInfo(clipInfo.RawStreams, umClipInfo.RawStreams);
                    GetStreamInfo(clipInfo.SecAudioStreams, umClipInfo.SecAudioStreams);
                    GetStreamInfo(clipInfo.SecVideoStreams, umClipInfo.SecVideoStreams);
                    titleInfo.Clips[i] = clipInfo;
                }

                for (int i = 0; i < titleInfo.Chapters.Length; i++)
                {
                    BluRayAPI.BDChapter chapter = (BluRayAPI.BDChapter)
                                                  Marshal.PtrToStructure(new IntPtr((int)umTitleInfo.Chapters + i * Marshal.SizeOf(typeof(BluRayAPI.BDChapter))),
                                                                         typeof(BluRayAPI.BDChapter));
                    titleInfo.Chapters[i] = chapter;
                }
            }
            catch
            {
                BluRayPlayerBuilder.LogError("GetTitleInfo({0}) failed.", index);
            }
            finally
            {
                if (ptr != IntPtr.Zero)
                {
                    reader.FreeTitleInfo(ptr);
                }
            }

            return(titleInfo);
        }
示例#9
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);
            var baseFilter = _fileSource.GetFilter();

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

            _graphBuilder.AddFilter(baseFilter, BluRayAPI.BDREADER_FILTER_NAME);
            // TODO: add the correct subtitle filter

            /*   _subtitleRenderer = new SubtitleRenderer(OnTextureInvalidated);
             * _subtitleFilter = _subtitleRenderer.AddSubtitleFilter(_graphBuilder);
             * if (_subtitleFilter != null)
             * {
             *   _subtitleRenderer.RenderSubtitles = true;
             *   _subtitleRenderer.SetPlayer(this);
             * }
             */
            // Prepare event handling
            _eventThread = new Thread(HandleBDEvent);
            _eventThread.Start();

            // 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, baseFilter, 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();

                SetVideoDecoder();
            }
        }
示例#10
0
    /// <summary>
    /// Gets the title info for the specified index
    /// </summary>
    /// <param name="reader">IBDReader object</param>
    /// <param name="index">index of the title</param>
    /// <returns></returns>
    protected virtual BluRayAPI.BDTitleInfo GetTitleInfo(IBDReader reader, int index)
    {
      BluRayAPI.BDTitleInfo titleInfo = new BluRayAPI.BDTitleInfo();
      IntPtr ptr = IntPtr.Zero;
      try
      {
        ptr = reader.GetTitleInfo(index);
        BluRayAPI.UnmanagedBDTitleInfo umTitleInfo = (BluRayAPI.UnmanagedBDTitleInfo)
          Marshal.PtrToStructure(ptr, typeof(BluRayAPI.UnmanagedBDTitleInfo));

        titleInfo = new BluRayAPI.BDTitleInfo
                      {
                        AngleCount = umTitleInfo.AngleCount,
                        Duration = umTitleInfo.Duration,
                        Index = umTitleInfo.Index,
                        Playlist = umTitleInfo.Playlist,
                        Clips = new BluRayAPI.BDClipInfo[umTitleInfo.ClipCount],
                        Chapters = new BluRayAPI.BDChapter[umTitleInfo.ChapterCount]
                      };

        for (int i = 0; i < umTitleInfo.ClipCount; i++)
        {
          BluRayAPI.UnmanagedBDClipInfo umClipInfo = (BluRayAPI.UnmanagedBDClipInfo)
            Marshal.PtrToStructure(new IntPtr((int)umTitleInfo.Clips + i * Marshal.SizeOf(typeof(BluRayAPI.UnmanagedBDClipInfo))),
            typeof(BluRayAPI.UnmanagedBDClipInfo));
          BluRayAPI.BDClipInfo clipInfo = new BluRayAPI.BDClipInfo
                                                        {
                                                          AudioStreams = new BluRayAPI.BDStreamInfo[umClipInfo.AudioStreamCount],
                                                          IgStreams = new BluRayAPI.BDStreamInfo[umClipInfo.IgStreamCount],
                                                          PgStreams = new BluRayAPI.BDStreamInfo[umClipInfo.PgStreamCount],
                                                          RawStreams = new BluRayAPI.BDStreamInfo[umClipInfo.RawStreamCount],
                                                          VideoStreams = new BluRayAPI.BDStreamInfo[umClipInfo.VideoStreamCount],
                                                          SecAudioStreams = new BluRayAPI.BDStreamInfo[umClipInfo.SecAudioStreamCount],
                                                          SecVideoStreams = new BluRayAPI.BDStreamInfo[umClipInfo.SecVideoStreamCount],
                                                          PktCount = umClipInfo.PktCount,
                                                          StillMode = umClipInfo.StillMode,
                                                          StillTime = umClipInfo.StillTime
                                                        };

          GetStreamInfo(clipInfo.VideoStreams, umClipInfo.VideoStreams);
          GetStreamInfo(clipInfo.AudioStreams, umClipInfo.AudioStreams);
          GetStreamInfo(clipInfo.IgStreams, umClipInfo.IgStreams);
          GetStreamInfo(clipInfo.PgStreams, umClipInfo.PgStreams);
          GetStreamInfo(clipInfo.RawStreams, umClipInfo.RawStreams);
          GetStreamInfo(clipInfo.SecAudioStreams, umClipInfo.SecAudioStreams);
          GetStreamInfo(clipInfo.SecVideoStreams, umClipInfo.SecVideoStreams);
          titleInfo.Clips[i] = clipInfo;
        }

        for (int i = 0; i < titleInfo.Chapters.Length; i++)
        {
          BluRayAPI.BDChapter chapter = (BluRayAPI.BDChapter)
            Marshal.PtrToStructure(new IntPtr((int)umTitleInfo.Chapters + i * Marshal.SizeOf(typeof(BluRayAPI.BDChapter))),
            typeof(BluRayAPI.BDChapter));
          titleInfo.Chapters[i] = chapter;
        }
      }
      catch
      {
        BluRayPlayerBuilder.LogError("GetTitleInfo({0}) failed.", index);
      }
      finally
      {
        if (ptr != IntPtr.Zero)
          reader.FreeTitleInfo(ptr);
      }

      return titleInfo;
    }
示例#11
0
    /// <summary>
    /// Gets the title info collection from the given BDReader object.
    /// </summary>
    /// <param name="reader">IBDReader object</param>
    /// <returns>a collection of titles</returns>
    protected virtual List<BluRayAPI.BDTitleInfo> GetTitleInfoCollection(IBDReader reader)
    {
      uint titleCount = 0;
      reader.GetTitleCount(ref titleCount);

      List<BluRayAPI.BDTitleInfo> titles = new List<BluRayAPI.BDTitleInfo>((int)titleCount);
      BluRayPlayerBuilder.LogDebug("Title count - {0}", titleCount);
      for (int i = 0; i < titleCount; i++)
      {
        BluRayAPI.BDTitleInfo titleInfo = GetTitleInfo(reader, i);
        titles.Add(titleInfo);
      }

      return titles;
    }
示例#12
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();
      }
    }
示例#13
0
    /// <summary> do cleanup and release DirectShow. </summary>
    protected void CloseInterfaces()
    {
      if (_graphBuilder == null)
      {
        return;
      }
      Log.Debug("BDPlayer: Cleanup DShow graph {0}", GUIGraphicsContext.InVmr9Render);
      try
      {
        BDOSDRenderer.StopRendering();

        if (VMR9Util.g_vmr9 != null)
        {
          VMR9Util.g_vmr9.Vmr9MediaCtrl(_mediaCtrl);
          VMR9Util.g_vmr9.Enable(false);
        }

        #region Cleanup

        if (VideoCodec != null)
        {
          DirectShowUtil.FinalReleaseComObject(VideoCodec);
          VideoCodec = null;
          Log.Info("BDPlayer: Cleanup VideoCodec");
        }

        if (AudioCodec != null)
        {
          DirectShowUtil.FinalReleaseComObject(AudioCodec);
          AudioCodec = null;
          Log.Info("BDPlayer: Cleanup AudioCodec");
        }

        if (_audioRendererFilter != null)
        {
          DirectShowUtil.FinalReleaseComObject(_audioRendererFilter);
          _audioRendererFilter = null;
          Log.Info("BDPlayer: Cleanup AudioRenderer");
        }

        //Test to ReleaseComObject from PostProcessFilter list objects.
        if (PostProcessFilterVideo.Count > 0)
        {
          foreach (var ppFilter in PostProcessFilterVideo)
          {
            if (ppFilter.Value != null)
            {
              DirectShowUtil.RemoveFilter(_graphBuilder, ppFilter.Value as IBaseFilter);
              DirectShowUtil.FinalReleaseComObject(ppFilter.Value);
            }
          }
          PostProcessFilterVideo.Clear();
          Log.Info("BDPlayer: Cleanup PostProcessVideo");
        }

        //Test to ReleaseComObject from PostProcessFilter list objects.
        if (PostProcessFilterAudio.Count > 0)
        {
          foreach (var ppFilter in PostProcessFilterAudio)
          {
            if (ppFilter.Value != null)
            {
              DirectShowUtil.RemoveFilter(_graphBuilder, ppFilter.Value as IBaseFilter);
              DirectShowUtil.FinalReleaseComObject(ppFilter.Value);
            }
          }
          PostProcessFilterAudio.Clear();
          Log.Info("BDPlayer: Cleanup PostProcessAudio");
        }

        if (_interfaceBDReader != null)
        {
          DirectShowUtil.FinalReleaseComObject(_interfaceBDReader);
          _interfaceBDReader = null;
        }

        if (VMR9Util.g_vmr9 != null && VMR9Util.g_vmr9._vmr9Filter != null)
        {
          //MadvrInterface.EnableExclusiveMode(false, VMR9Util.g_vmr9._vmr9Filter);
          //DirectShowUtil.DisconnectAllPins(_graphBuilder, VMR9Util.g_vmr9._vmr9Filter);
          Log.Info("BDPlayer: Cleanup VMR9");
        }

        #endregion

        _videoWin = _graphBuilder as IVideoWindow;
        if (_videoWin != null && GUIGraphicsContext.VideoRenderer != GUIGraphicsContext.VideoRendererType.madVR)
        {
          _videoWin.put_Owner(IntPtr.Zero);
          _videoWin.put_Visible(OABool.False);
        }

        if (_mediaEvt != null)
        {
          _mediaEvt.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero);
          _mediaEvt = null;
        }

        if (_graphBuilder != null)
        {
          DirectShowUtil.RemoveFilters(_graphBuilder);
          if (_rotEntry != null)
          {
            _rotEntry.SafeDispose();
            _rotEntry = null;
          }
          DirectShowUtil.FinalReleaseComObject(_graphBuilder);
          _graphBuilder = null;
        }

        if (_videoWin != null)
        {
          DirectShowUtil.FinalReleaseComObject(_videoWin);
        }
        if (_basicVideo != null)
        {
          DirectShowUtil.FinalReleaseComObject(_basicVideo);
        }
        _mediaCtrl = null;
        _mediaSeeking = null;
        _videoWin = null;
        _basicAudio = null;
        _basicVideo = null;
        _ireader = null;

        if (VMR9Util.g_vmr9 != null)
        {
          VMR9Util.g_vmr9.SafeDispose();
          VMR9Util.g_vmr9 = null;
        }

        _state = PlayState.Init;
      }
      catch (Exception ex)
      {
        if (VMR9Util.g_vmr9 != null)
        {
          VMR9Util.g_vmr9.RestoreGuiForMadVr();
        }
        Log.Error("BDPlayer: Exception while cleaning DShow graph - {0} {1}", ex.Message, ex.StackTrace);
      }
      //switch back to directx windowed mode
      ExclusiveMode(false);
    }
    /// <summary>
    /// Gets the title info for the specified index
    /// </summary>
    /// <param name="reader">IBDReader object</param>
    /// <param name="index">index of the title</param>
    /// <returns></returns>
    protected virtual BDTitleInfo GetTitleInfo(IBDReader reader, int index)
    {
      BDTitleInfo titleInfo = new BDTitleInfo();
      IntPtr ptr = IntPtr.Zero;
      try
      {
        ptr = reader.GetTitleInfo(index);
        titleInfo = (BDTitleInfo)Marshal.PtrToStructure(ptr, typeof(BDTitleInfo));
      }
      catch
      {
        Log.Error("BDPlayer: GetTitleInfo({0}) failed.", index);
      }
      finally
      {
        if (ptr != IntPtr.Zero)
        {
          reader.FreeTitleInfo(ptr);
        }
      }

      return titleInfo;
    }