Example #1
0
        public void Stop()
        {
            _videoWin.put_Visible(OABool.False);
            _mediaCtrl.Stop();

            if (_pinAudio != null)
            {
                Release.ComObject(_pinAudio);
                _pinAudio = null;
            }
            if (_pinVideo != null)
            {
                Release.ComObject(_pinVideo);
                _pinVideo = null;
            }
            if (_mpegDemux != null)
            {
                Release.ComObject(_mpegDemux);
                _mpegDemux = null;
            }
            if (_tsFileSource != null)
            {
                Release.ComObject(_tsFileSource);
                _tsFileSource = null;
            }
            if (_rotEntry != null)
            {
                _rotEntry.Dispose();
                _rotEntry = null;
            }

            if (_graphBuilder != null)
            {
                Release.ComObject(_graphBuilder);
                _graphBuilder = null;
            }
        }
Example #2
0
        public bool Play(string fileName, Form form)
        {
            fileName += ".tsbuffer";
            Log.WriteFile("play:{0}", fileName);
            _graphBuilder = (IFilterGraph2) new FilterGraph();
            _rotEntry     = new DsROTEntry(_graphBuilder);


            Log.WriteFile("add tsfilesource");
            _tsFileSource = new TsFileSource();
            _graphBuilder.AddFilter((IBaseFilter)_tsFileSource, "TsFileSource");

            #region add mpeg-2 demux filter

            Log.WriteFile("add mpeg-2 demux");
            MPEG2Demultiplexer demux = new MPEG2Demultiplexer();
            _mpegDemux = (IBaseFilter)demux;
            int hr = _graphBuilder.AddFilter(_mpegDemux, "MPEG-2 Demultiplexer");

            #endregion

            #region create mpeg2 demux pins

            Log.WriteFile("create mpeg-2 demux pins");
            //create mpeg-2 demux output pins
            IMpeg2Demultiplexer demuxer = _mpegDemux as IMpeg2Demultiplexer;


            if (demuxer != null)
            {
                hr = demuxer.CreateOutputPin(GetAudioMpg2Media(), "Audio", out _pinAudio);
            }
            if (hr != 0)
            {
                Log.WriteFile("unable to create audio pin");
                return(false);
            }
            if (demuxer != null)
            {
                hr = demuxer.CreateOutputPin(GetVideoMpg2Media(), "Video", out _pinVideo);
            }
            if (hr != 0)
            {
                Log.WriteFile("unable to create video pin");
                return(false);
            }

            #endregion

            #region load file in tsfilesource

            Log.WriteFile("load file in tsfilesource");
            IFileSourceFilter interfaceFile = (IFileSourceFilter)_tsFileSource;
            if (interfaceFile == null)
            {
                Log.WriteFile("TSStreamBufferPlayer9:Failed to get IFileSourceFilter");
                return(false);
            }

            AMMediaType mpeg2ProgramStream = new AMMediaType();
            mpeg2ProgramStream.majorType = MediaType.Stream;
            mpeg2ProgramStream.subType   = MediaSubType.Mpeg2Program;

            mpeg2ProgramStream.unkPtr              = IntPtr.Zero;
            mpeg2ProgramStream.sampleSize          = 0;
            mpeg2ProgramStream.temporalCompression = false;
            mpeg2ProgramStream.fixedSizeSamples    = true;
            mpeg2ProgramStream.formatType          = FormatType.None;
            mpeg2ProgramStream.formatSize          = 0;
            mpeg2ProgramStream.formatPtr           = IntPtr.Zero;
            hr = interfaceFile.Load(fileName, mpeg2ProgramStream);

            if (hr != 0)
            {
                Log.WriteFile("TSStreamBufferPlayer9:Failed to load file");
                return(false);
            }

            #region connect tsfilesource->demux

            Log.WriteFile("connect tsfilesource->demux");
            Log.WriteFile("TSStreamBufferPlayer9:connect tsfilesource->mpeg2 demux");
            IPin pinTsOut = DsFindPin.ByDirection((IBaseFilter)_tsFileSource, PinDirection.Output, 0);
            if (pinTsOut == null)
            {
                Log.WriteFile("TSStreamBufferPlayer9:failed to find output pin of tsfilesource");
                return(false);
            }
            IPin pinDemuxIn = DsFindPin.ByDirection(_mpegDemux, PinDirection.Input, 0);
            if (pinDemuxIn == null)
            {
                Log.WriteFile("TSStreamBufferPlayer9:failed to find output pin of tsfilesource");
                return(false);
            }

            hr = _graphBuilder.Connect(pinTsOut, pinDemuxIn);
            if (hr != 0)
            {
                Log.WriteFile("TSStreamBufferPlayer9:failed to connect tsfilesource->mpeg2 demux:{0:X}", hr);
                return(false);
            }
            Release.ComObject(pinTsOut);
            Release.ComObject(pinDemuxIn);

            #endregion

            #region map demux pids

            Log.WriteFile("map mpeg2 pids");
            IMPEG2StreamIdMap pStreamId = (IMPEG2StreamIdMap)_pinVideo;
            hr = pStreamId.MapStreamId(0xe0, MPEG2Program.ElementaryStream, 0, 0);
            if (hr != 0)
            {
                Log.WriteFile("TSStreamBufferPlayer9: failed to map pid 0xe0->video pin");
                return(false);
            }
            pStreamId = (IMPEG2StreamIdMap)_pinAudio;
            hr        = pStreamId.MapStreamId(0xc0, MPEG2Program.ElementaryStream, 0, 0);
            if (hr != 0)
            {
                Log.WriteFile("TSStreamBufferPlayer9: failed  to map pid 0xc0->audio pin");
                return(false);
            }

            #endregion

            #region render demux audio/video pins

            Log.WriteFile("render pins");
            hr = _graphBuilder.Render(_pinAudio);
            if (hr != 0)
            {
                Log.WriteFile("TSStreamBufferPlayer9:failed to render video output pin:{0:X}", hr);
            }

            hr = _graphBuilder.Render(_pinVideo);
            if (hr != 0)
            {
                Log.WriteFile("TSStreamBufferPlayer9:failed to render audio output pin:{0:X}", hr);
            }

            #endregion

            #endregion

            _videoWin = _graphBuilder as IVideoWindow;
            if (_videoWin != null)
            {
                _videoWin.put_Visible(OABool.True);
                _videoWin.put_Owner(form.Handle);
                _videoWin.put_WindowStyle(
                    (WindowStyle)((int)WindowStyle.Child + (int)WindowStyle.ClipSiblings + (int)WindowStyle.ClipChildren));
                _videoWin.put_MessageDrain(form.Handle);
                _videoWin.SetWindowPosition(190, 250, 150, 150);
            }

            Log.WriteFile("run graph");
            _mediaCtrl = (IMediaControl)_graphBuilder;
            hr         = _mediaCtrl.Run();
            Log.WriteFile("TSStreamBufferPlayer9:running:{0:X}", hr);

            return(true);
        }
Example #3
0
    public void Stop()
    {
      _videoWin.put_Visible(OABool.False);
      _mediaCtrl.Stop();

      if (_pinAudio != null)
      {
        Release.ComObject(_pinAudio);
        _pinAudio = null;
      }
      if (_pinVideo != null)
      {
        Release.ComObject(_pinVideo);
        _pinVideo = null;
      }
      if (_mpegDemux != null)
      {
        Release.ComObject(_mpegDemux);
        _mpegDemux = null;
      }
      if (_tsFileSource != null)
      {
        Release.ComObject(_tsFileSource);
        _tsFileSource = null;
      }
      if (_rotEntry != null)
      {
        _rotEntry.Dispose();
        _rotEntry = null;
      }

      if (_graphBuilder != null)
      {
        Release.ComObject(_graphBuilder);
        _graphBuilder = null;
      }
    }
Example #4
0
    public bool Play(string fileName, Form form)
    {
      fileName += ".tsbuffer";
      Log.WriteFile("play:{0}", fileName);
      _graphBuilder = (IFilterGraph2)new FilterGraph();
      _rotEntry = new DsROTEntry(_graphBuilder);


      Log.WriteFile("add tsfilesource");
      _tsFileSource = new TsFileSource();
      _graphBuilder.AddFilter((IBaseFilter)_tsFileSource, "TsFileSource");

      #region add mpeg-2 demux filter

      Log.WriteFile("add mpeg-2 demux");
      MPEG2Demultiplexer demux = new MPEG2Demultiplexer();
      _mpegDemux = (IBaseFilter)demux;
      int hr = _graphBuilder.AddFilter(_mpegDemux, "MPEG-2 Demultiplexer");

      #endregion

      #region create mpeg2 demux pins

      Log.WriteFile("create mpeg-2 demux pins");
      //create mpeg-2 demux output pins
      IMpeg2Demultiplexer demuxer = _mpegDemux as IMpeg2Demultiplexer;


      if (demuxer != null)
        hr = demuxer.CreateOutputPin(GetAudioMpg2Media(), "Audio", out _pinAudio);
      if (hr != 0)
      {
        Log.WriteFile("unable to create audio pin");
        return false;
      }
      if (demuxer != null)
        hr = demuxer.CreateOutputPin(GetVideoMpg2Media(), "Video", out _pinVideo);
      if (hr != 0)
      {
        Log.WriteFile("unable to create video pin");
        return false;
      }

      #endregion

      #region load file in tsfilesource

      Log.WriteFile("load file in tsfilesource");
      IFileSourceFilter interfaceFile = (IFileSourceFilter)_tsFileSource;
      if (interfaceFile == null)
      {
        Log.WriteFile("TSStreamBufferPlayer9:Failed to get IFileSourceFilter");
        return false;
      }

      AMMediaType mpeg2ProgramStream = new AMMediaType();
      mpeg2ProgramStream.majorType = MediaType.Stream;
      mpeg2ProgramStream.subType = MediaSubType.Mpeg2Program;

      mpeg2ProgramStream.unkPtr = IntPtr.Zero;
      mpeg2ProgramStream.sampleSize = 0;
      mpeg2ProgramStream.temporalCompression = false;
      mpeg2ProgramStream.fixedSizeSamples = true;
      mpeg2ProgramStream.formatType = FormatType.None;
      mpeg2ProgramStream.formatSize = 0;
      mpeg2ProgramStream.formatPtr = IntPtr.Zero;
      hr = interfaceFile.Load(fileName, mpeg2ProgramStream);

      if (hr != 0)
      {
        Log.WriteFile("TSStreamBufferPlayer9:Failed to load file");
        return false;
      }

      #region connect tsfilesource->demux

      Log.WriteFile("connect tsfilesource->demux");
      Log.WriteFile("TSStreamBufferPlayer9:connect tsfilesource->mpeg2 demux");
      IPin pinTsOut = DsFindPin.ByDirection((IBaseFilter)_tsFileSource, PinDirection.Output, 0);
      if (pinTsOut == null)
      {
        Log.WriteFile("TSStreamBufferPlayer9:failed to find output pin of tsfilesource");
        return false;
      }
      IPin pinDemuxIn = DsFindPin.ByDirection(_mpegDemux, PinDirection.Input, 0);
      if (pinDemuxIn == null)
      {
        Log.WriteFile("TSStreamBufferPlayer9:failed to find output pin of tsfilesource");
        return false;
      }

      hr = _graphBuilder.Connect(pinTsOut, pinDemuxIn);
      if (hr != 0)
      {
        Log.WriteFile("TSStreamBufferPlayer9:failed to connect tsfilesource->mpeg2 demux:{0:X}", hr);
        return false;
      }
      Release.ComObject(pinTsOut);
      Release.ComObject(pinDemuxIn);

      #endregion

      #region map demux pids

      Log.WriteFile("map mpeg2 pids");
      IMPEG2StreamIdMap pStreamId = (IMPEG2StreamIdMap)_pinVideo;
      hr = pStreamId.MapStreamId(0xe0, MPEG2Program.ElementaryStream, 0, 0);
      if (hr != 0)
      {
        Log.WriteFile("TSStreamBufferPlayer9: failed to map pid 0xe0->video pin");
        return false;
      }
      pStreamId = (IMPEG2StreamIdMap)_pinAudio;
      hr = pStreamId.MapStreamId(0xc0, MPEG2Program.ElementaryStream, 0, 0);
      if (hr != 0)
      {
        Log.WriteFile("TSStreamBufferPlayer9: failed  to map pid 0xc0->audio pin");
        return false;
      }

      #endregion

      #region render demux audio/video pins

      Log.WriteFile("render pins");
      hr = _graphBuilder.Render(_pinAudio);
      if (hr != 0)
      {
        Log.WriteFile("TSStreamBufferPlayer9:failed to render video output pin:{0:X}", hr);
      }

      hr = _graphBuilder.Render(_pinVideo);
      if (hr != 0)
      {
        Log.WriteFile("TSStreamBufferPlayer9:failed to render audio output pin:{0:X}", hr);
      }

      #endregion

      #endregion

      _videoWin = _graphBuilder as IVideoWindow;
      if (_videoWin != null)
      {
        _videoWin.put_Visible(OABool.True);
        _videoWin.put_Owner(form.Handle);
        _videoWin.put_WindowStyle(
          (WindowStyle)((int)WindowStyle.Child + (int)WindowStyle.ClipSiblings + (int)WindowStyle.ClipChildren));
        _videoWin.put_MessageDrain(form.Handle);
        _videoWin.SetWindowPosition(190, 250, 150, 150);
      }

      Log.WriteFile("run graph");
      _mediaCtrl = (IMediaControl)_graphBuilder;
      hr = _mediaCtrl.Run();
      Log.WriteFile("TSStreamBufferPlayer9:running:{0:X}", hr);

      return true;
    }
Example #5
0
        public override void BuildGraph()
        {
            try
            {
                useWPF = Settings.UseWPF;

                int hr = 0;

                this.graphBuilder = (IFilterGraph2) new FilterGraph();
                rot = new DsROTEntry(this.graphBuilder);

                string extension = Path.GetExtension(this.fileName).ToLower();

                if (extension == ".ts")
                {
                    TsFileSource fileSource = new TsFileSource();
                    this.filterSource = fileSource as IBaseFilter;
                    if (this.filterSource != null)
                    {
                        this.graphBuilder.AddFilter(this.filterSource, "TsFileSource");

                        IFileSourceFilter interFaceFile = (IFileSourceFilter)fileSource;
                        interFaceFile.Load(this.fileName, null);

                        ITSFileSource tsFileSource = fileSource as ITSFileSource;
                        ushort        audioPid     = 0;
                        tsFileSource.GetAudioPid(ref audioPid);

                        ushort videoPid = 0;
                        tsFileSource.GetVideoPid(ref videoPid);

                        byte[] videoPidTypeByteBuffer = new byte[16];
                        tsFileSource.GetVideoPidType(videoPidTypeByteBuffer);

                        int posCharZero = 0;
                        for (; posCharZero < videoPidTypeByteBuffer.Length; posCharZero++)
                        {
                            if (videoPidTypeByteBuffer[posCharZero] == 0)
                            {
                                break;
                            }
                        }

                        char[] videoPidTypeCharBuffer = new char[posCharZero];
                        Array.Copy(videoPidTypeByteBuffer, 0, videoPidTypeCharBuffer, 0, posCharZero);
                        string videoPidType = new string(videoPidTypeCharBuffer);
                        // "MPEG 2", "H.264"


                        AddMPEG2DemuxFilter();

                        //IMpeg2Demultiplexer mpeg2Demultiplexer = this.mpeg2Demux as IMpeg2Demultiplexer;

                        ////Log.WriteFile(Log.LogType.Log, false, "DVBGraphBDA: create mpg4 video pin");
                        //AMMediaType mediaMPG4 = new AMMediaType();
                        //mediaMPG4.majorType = MediaType.Video;
                        //mediaMPG4.subType = new Guid(0x8d2d71cb, 0x243f, 0x45e3, 0xb2, 0xd8, 0x5f, 0xd7, 0x96, 0x7e, 0xc0, 0x9b);
                        //mediaMPG4.sampleSize = 0;
                        //mediaMPG4.temporalCompression = false;
                        //mediaMPG4.fixedSizeSamples = false;
                        //mediaMPG4.unkPtr = IntPtr.Zero;
                        //mediaMPG4.formatType = FormatType.Mpeg2Video;
                        //mediaMPG4.formatSize = Mpeg2ProgramVideo.GetLength(0);
                        //mediaMPG4.formatPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(mediaMPG4.formatSize);
                        //System.Runtime.InteropServices.Marshal.Copy(Mpeg2ProgramVideo, 0, mediaMPG4.formatPtr, mediaMPG4.formatSize);

                        //int hr = mpeg2Demultiplexer.CreateOutputPin(mediaMPG4, "MPG4", out this.pinDemuxerVideoMPEG4);
                        //if (this.pinDemuxerVideoMPEG4 != null)
                        //{
                        //    IMPEG2PIDMap mpeg2PIDMap = this.pinDemuxerVideoMPEG4 as IMPEG2PIDMap;
                        //    if (mpeg2PIDMap != null)
                        //        hr = mpeg2PIDMap.MapPID(1, new int[] { 0x00a2 }, MediaSampleContent.ElementaryStream);
                        //    Marshal.ReleaseComObject(this.pinDemuxerVideoMPEG4);
                        //}
                        ////if (hr < 0 || this.pinDemuxerVideoMPEG4 == null)
                        ////{

                        ////    _lastError = String.Format("failed to add mpg4 video pin");
                        ////    Log.WriteFile(Log.LogType.Log, true, "DVBGraphBDA:FAILED to create MPG4 pin:0x{0:X}", hr);
                        ////}


                        //DsDevice[] tunDevices = DeviceEnumerator.GetH264Devices();
                        //if (tunDevices.Length > 0)
                        //{
                        //    IBaseFilter elecardMPEG4VideoDecoder;
                        //    hr = this.graphBuilder.AddSourceFilterForMoniker(tunDevices[0].Mon, null, tunDevices[0].Name, out elecardMPEG4VideoDecoder);
                        //    DsError.ThrowExceptionForHR(hr);
                        //}

                        AddRenderers();
                        if (!useWPF)
                        {
                            ConfigureVMR9InWindowlessMode(2);
                        }

                        //IVMRMixerControl9 vmrMixerControl9 = this.videoRenderer as IVMRMixerControl9;
                        //vmrMixerControl9.SetZOrder(0, 1);



                        //// Connect the MPEG-2 Demux output pin for the "BDA MPEG2 Transport Information Filter"
                        //IPin pinOut = DsFindPin.ByDirection(this.filterSource, PinDirection.Output, 0);
                        //if (pinOut != null)
                        //{
                        //    hr = this.graphBuilder.Render(pinOut);
                        //    //DsError.ThrowExceptionForHR(hr);
                        //    // In fact the last pin don't render since i havn't added the BDA MPE Filter...
                        //    Marshal.ReleaseComObject(pinOut);
                        //}

                        //ConnectFilters();
                        //IPin pinOut = DsFindPin.ByDirection(this.mpeg2Demux, PinDirection.Output, 0);
                        //if (pinOut != null)
                        //{
                        //    hr = this.graphBuilder.Render(pinOut);
                        //    //DsError.ThrowExceptionForHR(hr);
                        //    // In fact the last pin don't render since i havn't added the BDA MPE Filter...
                        //    Marshal.ReleaseComObject(pinOut);
                        //}

                        //pinOut = DsFindPin.ByDirection(this.mpeg2Demux, PinDirection.Output, 1);
                        //if (pinOut != null)
                        //{
                        //    hr = this.graphBuilder.Render(pinOut);
                        //    //DsError.ThrowExceptionForHR(hr);
                        //    // In fact the last pin don't render since i havn't added the BDA MPE Filter...
                        //    Marshal.ReleaseComObject(pinOut);
                        //}

                        IPin pinOut = DsFindPin.ByDirection(this.filterSource, PinDirection.Output, 0);
                        if (pinOut != null)
                        {
                            hr = this.graphBuilder.Render(pinOut);
                            //DsError.ThrowExceptionForHR(hr);
                            // In fact the last pin don't render since i havn't added the BDA MPE Filter...
                            Marshal.ReleaseComObject(pinOut);
                        }

                        AddAndConnectNullRendererForWPF();

                        this.hostingControl.CurrentGraphBuilder = this;

                        OnGraphStarted();

                        return;
                    }
                }



                AddRenderers();
                if (!useWPF)
                {
                    ConfigureVMR9InWindowlessMode();
                }

                this.graphBuilder.RenderFile(this.fileName, null);

                //AddAndConnectNullRendererForWPF();
                if (useWPF)
                {
                    // In order to keep the audio/video synchro, we need the NullRenderer
                    IBaseFilter nullRenderer = new NullRenderer() as IBaseFilter;
                    hr = graphBuilder.AddFilter(nullRenderer, "NullRenderer");
                    ThrowExceptionForHR("Adding the NullRenderer: ", hr);

                    IPin pinOutFromFilterOut = DsFindPin.ByDirection(this.videoRenderer, PinDirection.Output, 0);
                    if (pinOutFromFilterOut != null)
                    {
                        UnRender(pinOutFromFilterOut);
                        try
                        {
                            IPin pinInFromFilterOut = DsFindPin.ByDirection(nullRenderer, PinDirection.Input, 0);
                            if (pinInFromFilterOut != null)
                            {
                                try
                                {
                                    hr = this.graphBuilder.Connect(pinOutFromFilterOut, pinInFromFilterOut);
                                }
                                finally
                                {
                                    Marshal.ReleaseComObject(pinInFromFilterOut);
                                }
                            }
                        }
                        finally
                        {
                            Marshal.ReleaseComObject(pinOutFromFilterOut);
                        }
                    }

                    //IPin pinOutFromFilterOut = DsFindPin.ByDirection(this.videoRenderer, PinDirection.Output, 0);
                    //if (pinOutFromFilterOut != null)
                    //{
                    //    hr = this.graphBuilder.Render(pinOutFromFilterOut);
                    //    Marshal.ReleaseComObject(pinOutFromFilterOut);
                    //}

                    WpfUpdateVideoSize();                     //WPF
                }

                this.hostingControl.CurrentGraphBuilder = this;

                OnGraphStarted();
            }
            catch (Exception ex)
            {
                Decompose();
                throw ex;
            }
        }
Example #6
0
        public override void BuildGraph()
        {
            try
            {
                useWPF = Settings.UseWPF;

                int hr = 0;

                this.graphBuilder = (IFilterGraph2)new FilterGraph();
                rot = new DsROTEntry(this.graphBuilder);

                string extension = Path.GetExtension(this.fileName).ToLower();

                if (extension == ".ts")
                {
                    TsFileSource fileSource = new TsFileSource();
                    this.filterSource = fileSource as IBaseFilter;
                    if (this.filterSource != null)
                    {
                        this.graphBuilder.AddFilter(this.filterSource, "TsFileSource");

                        IFileSourceFilter interFaceFile = (IFileSourceFilter)fileSource;
                        interFaceFile.Load(this.fileName, null);

                        ITSFileSource tsFileSource = fileSource as ITSFileSource;
                        ushort audioPid = 0;
                        tsFileSource.GetAudioPid(ref audioPid);

                        ushort videoPid = 0;
                        tsFileSource.GetVideoPid(ref videoPid);

                        byte[] videoPidTypeByteBuffer = new byte[16];
                        tsFileSource.GetVideoPidType(videoPidTypeByteBuffer);

                        int posCharZero = 0;
                        for (; posCharZero < videoPidTypeByteBuffer.Length; posCharZero++) if (videoPidTypeByteBuffer[posCharZero] == 0) break;

                        char[] videoPidTypeCharBuffer = new char[posCharZero];
                        Array.Copy(videoPidTypeByteBuffer, 0, videoPidTypeCharBuffer, 0, posCharZero);
                        string videoPidType = new string(videoPidTypeCharBuffer);
                        // "MPEG 2", "H.264"

                        AddMPEG2DemuxFilter();

                        //IMpeg2Demultiplexer mpeg2Demultiplexer = this.mpeg2Demux as IMpeg2Demultiplexer;

                        ////Log.WriteFile(Log.LogType.Log, false, "DVBGraphBDA: create mpg4 video pin");
                        //AMMediaType mediaMPG4 = new AMMediaType();
                        //mediaMPG4.majorType = MediaType.Video;
                        //mediaMPG4.subType = new Guid(0x8d2d71cb, 0x243f, 0x45e3, 0xb2, 0xd8, 0x5f, 0xd7, 0x96, 0x7e, 0xc0, 0x9b);
                        //mediaMPG4.sampleSize = 0;
                        //mediaMPG4.temporalCompression = false;
                        //mediaMPG4.fixedSizeSamples = false;
                        //mediaMPG4.unkPtr = IntPtr.Zero;
                        //mediaMPG4.formatType = FormatType.Mpeg2Video;
                        //mediaMPG4.formatSize = Mpeg2ProgramVideo.GetLength(0);
                        //mediaMPG4.formatPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(mediaMPG4.formatSize);
                        //System.Runtime.InteropServices.Marshal.Copy(Mpeg2ProgramVideo, 0, mediaMPG4.formatPtr, mediaMPG4.formatSize);

                        //int hr = mpeg2Demultiplexer.CreateOutputPin(mediaMPG4, "MPG4", out this.pinDemuxerVideoMPEG4);
                        //if (this.pinDemuxerVideoMPEG4 != null)
                        //{
                        //    IMPEG2PIDMap mpeg2PIDMap = this.pinDemuxerVideoMPEG4 as IMPEG2PIDMap;
                        //    if (mpeg2PIDMap != null)
                        //        hr = mpeg2PIDMap.MapPID(1, new int[] { 0x00a2 }, MediaSampleContent.ElementaryStream);
                        //    Marshal.ReleaseComObject(this.pinDemuxerVideoMPEG4);
                        //}
                        ////if (hr < 0 || this.pinDemuxerVideoMPEG4 == null)
                        ////{

                        ////    _lastError = String.Format("failed to add mpg4 video pin");
                        ////    Log.WriteFile(Log.LogType.Log, true, "DVBGraphBDA:FAILED to create MPG4 pin:0x{0:X}", hr);
                        ////}

                        //DsDevice[] tunDevices = DeviceEnumerator.GetH264Devices();
                        //if (tunDevices.Length > 0)
                        //{
                        //    IBaseFilter elecardMPEG4VideoDecoder;
                        //    hr = this.graphBuilder.AddSourceFilterForMoniker(tunDevices[0].Mon, null, tunDevices[0].Name, out elecardMPEG4VideoDecoder);
                        //    DsError.ThrowExceptionForHR(hr);
                        //}

                        AddRenderers();
                        if (!useWPF)
                            ConfigureVMR9InWindowlessMode(2);

                        //IVMRMixerControl9 vmrMixerControl9 = this.videoRenderer as IVMRMixerControl9;
                        //vmrMixerControl9.SetZOrder(0, 1);

                        //// Connect the MPEG-2 Demux output pin for the "BDA MPEG2 Transport Information Filter"
                        //IPin pinOut = DsFindPin.ByDirection(this.filterSource, PinDirection.Output, 0);
                        //if (pinOut != null)
                        //{
                        //    hr = this.graphBuilder.Render(pinOut);
                        //    //DsError.ThrowExceptionForHR(hr);
                        //    // In fact the last pin don't render since i havn't added the BDA MPE Filter...
                        //    Marshal.ReleaseComObject(pinOut);
                        //}

                        //ConnectFilters();
                        //IPin pinOut = DsFindPin.ByDirection(this.mpeg2Demux, PinDirection.Output, 0);
                        //if (pinOut != null)
                        //{
                        //    hr = this.graphBuilder.Render(pinOut);
                        //    //DsError.ThrowExceptionForHR(hr);
                        //    // In fact the last pin don't render since i havn't added the BDA MPE Filter...
                        //    Marshal.ReleaseComObject(pinOut);
                        //}

                        //pinOut = DsFindPin.ByDirection(this.mpeg2Demux, PinDirection.Output, 1);
                        //if (pinOut != null)
                        //{
                        //    hr = this.graphBuilder.Render(pinOut);
                        //    //DsError.ThrowExceptionForHR(hr);
                        //    // In fact the last pin don't render since i havn't added the BDA MPE Filter...
                        //    Marshal.ReleaseComObject(pinOut);
                        //}

                        IPin pinOut = DsFindPin.ByDirection(this.filterSource, PinDirection.Output, 0);
                        if (pinOut != null)
                        {
                            hr = this.graphBuilder.Render(pinOut);
                            //DsError.ThrowExceptionForHR(hr);
                            // In fact the last pin don't render since i havn't added the BDA MPE Filter...
                            Marshal.ReleaseComObject(pinOut);
                        }

                        AddAndConnectNullRendererForWPF();

                        this.hostingControl.CurrentGraphBuilder = this;

                        OnGraphStarted();

                        return;
                    }
                }

                AddRenderers();
                if (!useWPF)
                    ConfigureVMR9InWindowlessMode();

                this.graphBuilder.RenderFile(this.fileName, null);

                //AddAndConnectNullRendererForWPF();
                if (useWPF)
                {
                    // In order to keep the audio/video synchro, we need the NullRenderer
                    IBaseFilter nullRenderer = new NullRenderer() as IBaseFilter;
                    hr = graphBuilder.AddFilter(nullRenderer, "NullRenderer");
                    ThrowExceptionForHR("Adding the NullRenderer: ", hr);

                    IPin pinOutFromFilterOut = DsFindPin.ByDirection(this.videoRenderer, PinDirection.Output, 0);
                    if (pinOutFromFilterOut != null)
                    {
                        UnRender(pinOutFromFilterOut);
                        try
                        {
                            IPin pinInFromFilterOut = DsFindPin.ByDirection(nullRenderer, PinDirection.Input, 0);
                            if (pinInFromFilterOut != null)
                            {
                                try
                                {
                                    hr = this.graphBuilder.Connect(pinOutFromFilterOut, pinInFromFilterOut);
                                }
                                finally
                                {
                                    Marshal.ReleaseComObject(pinInFromFilterOut);
                                }
                            }
                        }
                        finally
                        {
                            Marshal.ReleaseComObject(pinOutFromFilterOut);
                        }
                    }

                    //IPin pinOutFromFilterOut = DsFindPin.ByDirection(this.videoRenderer, PinDirection.Output, 0);
                    //if (pinOutFromFilterOut != null)
                    //{
                    //    hr = this.graphBuilder.Render(pinOutFromFilterOut);
                    //    Marshal.ReleaseComObject(pinOutFromFilterOut);
                    //}

                    WpfUpdateVideoSize(); //WPF
                }

                this.hostingControl.CurrentGraphBuilder = this;

                OnGraphStarted();
            }
            catch (Exception ex)
            {
                Decompose();
                throw ex;
            }
        }