CodeTV.GraphBuilderBDAMosaic.BuildMosaicGraph C# (CSharp) Method

BuildMosaicGraph() private method

private BuildMosaicGraph ( ITuningSpace tuningSpace, ArrayList programs ) : void
tuningSpace ITuningSpace
programs System.Collections.ArrayList
return void
        private void BuildMosaicGraph(ITuningSpace tuningSpace, ArrayList programs)
        {
            this.graphBuilder = (IFilterGraph2)new FilterGraph();
            rot = new DsROTEntry(this.graphBuilder);

            // Method names should be self explanatory
            AddNetworkProviderFilter(tuningSpace);
            AddMPEG2DemuxFilter();

            AddAndConnectBDABoardFilters();
            AddTransportStreamFiltersToGraph();
            AddRenderers();

            //unsafe
            //{
                IntPtr formatPtr = Marshal.AllocHGlobal(g_Mpeg2ProgramVideo.Length);
                Marshal.Copy(g_Mpeg2ProgramVideo, 0, formatPtr, g_Mpeg2ProgramVideo.Length);

                IMpeg2Demultiplexer mpeg2Demultiplexer = this.mpeg2Demux as IMpeg2Demultiplexer;

                for(int p = 1; p < programs.Count; p++)
                {
                    PSI.PSIPMT pmt = (PSI.PSIPMT)programs[p];
                    PSI.PSIPMT.Data stream = (PSI.PSIPMT.Data)pmt.GetStreamByType(CodeTV.PSI.STREAM_TYPES.STREAMTYPE_13818_VIDEO);

                    AMMediaType mediaType = new AMMediaType();
                    mediaType.majorType = MediaType.Video;
                    mediaType.subType = MediaSubType.Mpeg2Video;
                    mediaType.fixedSizeSamples = false;
                    mediaType.temporalCompression = false;
                    mediaType.sampleSize = 0;
                    mediaType.formatType = FormatType.Mpeg2Video;
                    mediaType.unkPtr = IntPtr.Zero;

                    mediaType.formatSize = g_Mpeg2ProgramVideo.Length;
                    mediaType.formatPtr = formatPtr;

                    //mediaType.formatType = FormatType.Mpeg2Video;
                    //mediaType.formatSize = 0;
                    //mediaType.formatPtr = IntPtr.Zero;

                    string pinName = "video" + p;
                    IPin outputPin;
                    int hr = mpeg2Demultiplexer.CreateOutputPin(mediaType, pinName, out outputPin);
                    if (outputPin != null)
                    {
                        IMPEG2PIDMap mpeg2PIDMap = outputPin as IMPEG2PIDMap;
                        if (mpeg2PIDMap != null)
                            hr = mpeg2PIDMap.MapPID(1, new int[] { stream.Pid }, MediaSampleContent.ElementaryStream);
                        Marshal.ReleaseComObject(outputPin);
                    }
                }
                Marshal.FreeHGlobal(formatPtr);
            //}

            ConfigureVMR9InWindowlessMode(programs.Count);
            ConnectAllOutputFilters();

            int numberColumn = 4;
            int numberRow = 4;
            float widthPadding = 0.01f;
            float heightPadding = 0.01f;

            float width = (1.0f / numberColumn) - 2.0f * widthPadding;
            float height = (1.0f / numberRow) - 2.0f * heightPadding;

            IVMRMixerControl9 vmrMixerControl9 = this.videoRenderer as IVMRMixerControl9;
            for (int p = 1; p < programs.Count; p++)
            {
                int column, row = Math.DivRem(p - 1, numberColumn, out column);
                NormalizedRect rect = new NormalizedRect();
                rect.left = (float)column / (float)numberColumn + widthPadding;
                rect.top = (float)row / (float)numberRow + heightPadding;
                rect.right = rect.left + width;
                rect.bottom = rect.top + height;
                vmrMixerControl9.SetOutputRect(p, ref rect);
            }
        }