public void ShowMacroblock(Macroblock mb) { m_Mb = mb; int xFracL, yFracL; H264Mb mbH264 = (m_Mb.Mb as H264Mb); for (int i = 0; i < 16; ++i) { xFracL = mbH264.mvL0[i].x & 3; yFracL = mbH264.mvL0[i].y & 3; m_TextBlocks[i].Text = "---List0---"; m_TextBlocks[i].Text += String.Format("\nMV({0}, {1})\nMVD({2}, {3})", mbH264.mvL0[i].x, mbH264.mvL0[i].y, mbH264.mvd_l0[i].x, mbH264.mvd_l0[i].y); m_TextBlocks[i].Text += String.Format("\nFrac({0}, {1})", xFracL != 0 ? (xFracL == 2 ? "Half" : "Quater") : "Integer", yFracL != 0 ? (xFracL == 2 ? "Half" : "Quater") : "Integer"); m_TextBlocks[i].Text += String.Format("\nPOC={0}, RefIdx={1}", mbH264.POC0[H264Mb.BLK4x4ToBLK8x8[i]], mbH264.ref_idx_L0[H264Mb.BLK4x4ToBLK8x8[i]]); } if (mbH264.SliceType == SliceType.B_SLICE) { for (int i = 0; i < 16; ++i) { xFracL = mbH264.mvL1[i].x & 3; yFracL = mbH264.mvL1[i].y & 3; m_TextBlocks[i].Text += "\n---List1---"; m_TextBlocks[i].Text += String.Format("\nMV({0}, {1})\nMVD({2}, {3})", mbH264.mvL1[i].x, mbH264.mvL1[i].y, mbH264.mvd_l1[i].x, mbH264.mvd_l1[i].y); m_TextBlocks[i].Text += String.Format("\nFrac({0}, {1})", xFracL != 0 ? (xFracL == 2 ? "Half" : "Quater") : "Integer", yFracL != 0 ? (xFracL == 2 ? "Half" : "Quater") : "Integer"); m_TextBlocks[i].Text += String.Format("\nPOC={0}, RefIdx={1}", mbH264.POC1[H264Mb.BLK4x4ToBLK8x8[i]], mbH264.ref_idx_L1[H264Mb.BLK4x4ToBLK8x8[i]]); } } }
public void ShowMacroblock(Macroblock mb) { H264Mb mbH264 = (mb.Mb as H264Mb); m_TextBlockAddress.Text = String.Format("{0}({1},{2})", mb.Mb.Address, mb.Mb.X, mb.Mb.Y); m_TextBlockLocation.Text = String.Format("({0},{1})", mb.Mb.X << 4, mb.Mb.Y << 4); m_TextBlockType.Text = mbH264.TypeDescription; m_TextBlockPicture.Text = String.Format("{0} (DQId={1})", mb.PictureId, mb.LayerId); m_TextBlockSlice.Text = String.Format("{0}\n{1}", mb.SliceId, mbH264.SliceType); m_TextBlockBitsStart.Text = String.IsNullOrEmpty(mb.Mb.BitsStart) ? "-" : mb.Mb.BitsStart; m_TextBlockBitsCount.Text = mb.Mb.BitsCount.ToString(); m_TextBlockQP.Text = mbH264.QP.ToString(); m_TextBlockQPC.Text = mbH264.QPC.ToString(); m_TextBlockCBP.Text = String.Format("{0}: L={1},C={2}", mbH264.CBP, mbH264.CBP & 15, mbH264.CBP >> 4); m_TextBlockMbPartNum.Text = mbH264.NumMbPart.ToString(); m_TextBlockMbPartSize.Text = String.Format("({0},{1})", mbH264.MbPartSize.Width, mbH264.MbPartSize.Height); if (mbH264.IsIntra) { m_TextBlockMbIntraChromaMode.Text = String.Format("[{0}] {1}", (int)mbH264.IntraChromaPredMode, mbH264.IntraChromaPredMode); } else { m_TextBlockMbIntraChromaMode.Text = "-"; } m_TextBlockMD5.Text = String.Format("Y\t= {0}\nU\t= {1}\nV\t= {2}", mb.MD5Y, mb.MD5U, mb.MD5V).ToUpper(); }
void m_Image_MouseMove(object sender, MouseEventArgs e) { lock (this) { if (m_Picture != null && m_Image.Source != null && m_numberOfMbInRow > 0 && m_numberOfMbInCol > 0) { double mbWidth, mbHeight; int mbX, mbY, mbAddress; Point mousePosition = e.GetPosition(m_Image); GetMbPosition(mousePosition, out mbX, out mbY, out mbAddress, out mbWidth, out mbHeight); Macroblock mb = m_Picture.GetMacroblockByLocation((UInt32)mbX, (UInt32)mbY); m_TextBlockImageToolTip.Text = String.Format("MB {0}({1},{2})", mbAddress, mbX, mbY); if (mb != null) { m_TextBlockImageToolTip.Text += String.Format("\nSlice: {0}, {1}", mb.SliceId, (mb.Mb as H264Mb).SliceType); m_TextBlockImageToolTip.Text += String.Format("\nType: {0}", (mb.Mb as H264Mb).TypeDescription); } m_FloatingToolTip.HorizontalOffset = mousePosition.X + 20; m_FloatingToolTip.VerticalOffset = mousePosition.Y; m_FloatingToolTip.IsOpen = true; if (m_LastHoverMacroblockAddress != mbAddress) { RaiseMbSelectionEvent((UInt32)mbX, (UInt32)mbY, MacroblockEventArgs.MacroblockEventType_t.MacroblockEventType_Hover); m_LastHoverMacroblockAddress = mbAddress; } } } }
protected Intra16X16LumaAbstractPredictor(int x, int y, Macroblock macroblock, IAlgorithmFactory algorithms) { this.x = x; this.y = y; access = macroblock.MacroblockAccess; info = new MacroblockInfo(macroblock); transform = algorithms.CreateTransform(); quantizer = algorithms.CreateQuantizer(); distortion = algorithms.CreateDistortionMetric(); scanner = algorithms.CreateScanner(); mOrig = new int[mbHeight][]; for (var i = 0; i < mOrig.Length; i++) mOrig[i] = new int[mbWidth]; mResd = new int[mbHeight][]; for (var i = 0; i < mResd.Length; i++) mResd[i] = new int[mbWidth]; mPred = new int[mbHeight][]; for (var i = 0; i < mPred.Length; i++) mPred[i] = new int[mbWidth]; mDc = new int[dcHeight][]; for (var i = 0; i < mDc.Length; i++) mDc[i] = new int[dcWidth]; }
protected MacroblockAccess(Macroblock macroblock) { macroblockX = macroblock; mbNr = macroblockX.MbNr; frameWidth = macroblockX.Slice.Picture.Width; picWidthInMbs = frameWidth / Macroblock.MbWidth; picSizeInMbs = macroblockX.Slice.Picture.PicSizeInMbs; }
public void ShowMacroblock(Macroblock mb) { H264Mb mbH264 = (mb.Mb as H264Mb); m_TextBlockInCropWindow.Text = mbH264.IsInCropWindow ? "True" : "False"; m_TextBlockResidualPredictionFlag.Text = mbH264.IsResidualPredictionFlag ? "1" : "0"; m_TextBlockBLSkippedFlag.Text = mbH264.IsBLSkippedFlag ? "1" : "0"; }
public void ShowMacroblock(Macroblock mb) { lock (this) { if ((m_Mb != mb) && mb != null) { m_Mb = mb; Int32[] bits4x4; UInt32 YCount = 0, UCount = 0, VCount = 0; m_DataSourceY.Clear(); m_DataSourceU.Clear(); m_DataSourceV.Clear(); m_TextBlockMacroblockInfo.Text = String.Format("{0} / MB {1}({2}, {3}) / Slice:{4} / Picture:{5} / Layer:{6}", m_Title, mb.Mb.Address, mb.Mb.X << 4, mb.Mb.Y << 4, mb.SliceId, mb.PictureId, mb.LayerId); for (uint y = 0; y < 4; y++) { MbBits4x4Row rowY = new MbBits4x4Row(); MbBits4x4Row rowU = new MbBits4x4Row(); MbBits4x4Row rowV = new MbBits4x4Row(); for (uint x = 0; x < 4; x++) { // Y bits4x4 = m_Mb.Mb.GetMbBits4x4(CommonYuvLine_t.CommonYuvLine_Y, m_DataType, x, y); if (bits4x4 != null) { rowY.Add(new MbBits4x4(YCount++, x, y, bits4x4)); } // U bits4x4 = m_Mb.Mb.GetMbBits4x4(CommonYuvLine_t.CommonYuvLine_U, m_DataType, x, y); if (bits4x4 != null) { rowU.Add(new MbBits4x4(UCount++, x, y, bits4x4)); } // V bits4x4 = m_Mb.Mb.GetMbBits4x4(CommonYuvLine_t.CommonYuvLine_V, m_DataType, x, y); if (bits4x4 != null) { rowV.Add(new MbBits4x4(VCount++, x, y, bits4x4)); } } if (rowY.Row.Count > 0) { m_DataSourceY.Add(rowY); } if (rowU.Row.Count > 0) { m_DataSourceU.Add(rowU); } if (rowV.Row.Count > 0) { m_DataSourceV.Add(rowV); } } } } }
public void ShowMacroblock(Macroblock mb) { m_Mb = mb; H264Mb mbH264 = (m_Mb.Mb as H264Mb); for (int i = 0; i < 16; ++i) { m_TextBlocks[i].Text = String.Format("[{0}] {1}", (int)mbH264.Intra4x4PredMode[i], Utils.GetIntra4x4PredModeName(mbH264.Intra4x4PredMode[i])); } }
public void ShowMacroblock(Macroblock mb) { m_Mb = mb; H264Mb mbH264 = (m_Mb.Mb as H264Mb); m_TextBlock0.Text = mbH264.BlkModes[0].ToString(); m_TextBlock1.Text = mbH264.BlkModes[1].ToString(); m_TextBlock2.Text = mbH264.BlkModes[2].ToString(); m_TextBlock3.Text = mbH264.BlkModes[3].ToString(); }
public MacroblockPosition(Macroblock macroblock) { var mbNr = macroblock.MbNr; var frameWidth = macroblock.Slice.Picture.Width; var picWidthInMbs = frameWidth / Macroblock.MbWidth; MbX = mbNr % picWidthInMbs; MbY = mbNr / picWidthInMbs; PixelX = MbX * Macroblock.MbWidth; PixelY = MbY * Macroblock.MbHeight; PixelChromaX = (MbX * Macroblock.MbChromaWidth); PixelChromaY = (MbY * Macroblock.MbChromaHeight); }
void ShowHeadersFromSelectedMb(Macroblock selectMb) { if (m_Engine.Decoder.FileInput.EncodingType == EncodingType.H264) { H264Picture h264Picture = (m_SelectedPicture as H264Picture); Debug.Assert(h264Picture != null); H264Slice h264Slice = h264Picture.Slices[selectMb.SliceId]; Debug.Assert(h264Slice != null); ShowH264Headers(new[] { h264Slice.PicParamSet.Nalu }, new[] { h264Slice.SeqParamSet.Nalu }, new[] { h264Slice.Nalu }); } }
void RaiseMbSelectionEvent(UInt32 mbX, UInt32 mbY, MacroblockEventArgs.MacroblockEventType_t selectionType) { lock (this) { if (OnMacroblockEvent != null) { Macroblock mbObject = m_Picture.GetMacroblockByLocation((UInt32)mbX, (UInt32)mbY); if (mbObject != null) { EventHandlerTrigger.TriggerEvent <MacroblockEventArgs>(OnMacroblockEvent, this, new MacroblockEventArgs(selectionType, mbObject)); } } } }
public IpcmEncodingMode(Macroblock macroblock) : base(macroblock, MacroblockType.Ipcm) { bufferY = new int[Macroblock.MbWidth][]; for (var i = 0; i < bufferY.Length; i++) bufferY[i] = new int[Macroblock.MbHeight]; bufferU = new int[Macroblock.MbChromaWidth][]; for (var i = 0; i < bufferU.Length; i++) bufferU[i] = new int[Macroblock.MbChromaHeight]; bufferV = new int[Macroblock.MbChromaWidth][]; for (var i = 0; i < bufferV.Length; i++) bufferV[i] = new int[Macroblock.MbChromaHeight]; }
public Intra8X8ChromaHorizontalPredictor(int x, int y, Macroblock macroblock, IAlgorithmFactory algorithms) : base(x, y, macroblock, algorithms) { }
private void Window_Loaded(object sender, RoutedEventArgs e) { //m_Engine = Engine.CreateRawH264("C:\\Projects\\toulde\\videos\\AUD_MW_E\\AUD_MW_E.264", "AUD_MW_E.yuv"); //m_Engine = Engine.CreateRawH264("C:\\Projects\\toulde\\videos\\FM1_BT_B\\FM1_BT_B.264", "FM1_BT_B.yuv"); // multiple slices + deblocking m_Engine = Engine.CreateRawH264("C:\\Projects\\toulde\\videos\\SVCBS-1\\SVCBS-1\\SVCBS-1.264", "SVCBS-1.yuv"); // Vidyo //m_Engine = Engine.CreateRawH264("C:\\Projects\\toulde\\videos\\freh1_b\\Freh1_B.264", "Freh1_B.yuv"); //m_Engine = Engine.CreateRawH264("C:\\Projects\\hl78965\\clean\\hartallo\\encoderSVC.264", "encoderSVC.yuv"); //m_Engine = Engine.CreateRawH264("C:\\Projects\\hl78965\\clean\\hartallo\\encoderAVC.264", "encoder.yuv"); //m_Engine = Engine.CreateRawH264("C:\\Projects\\hl78965\\clean\\hartallo\\encoder.264", "encoder.yuv"); // New Hartallo //m_Engine = Engine.CreateRawH264("C:\\Projects\\hl78965\\clean\\hartallo\\encoder_avc_10frms_noearlyterm.264", "encoder.yuv"); // Old Hartallo //m_Engine = Engine.CreateRawH264("C:\\tmp\\x264_104\\output.264", "encoder.yuv"); // x264 //m_Engine = Engine.CreateRawH264("C:\\Projects\\JM\\output.264", "encoder.yuv"); // JM //m_Engine = Engine.CreateRawH264("C:\\Projects\\hartallo\\tests\\TestH264\\bourne.264", "bourne.yuv");// bourne // Screen Previews m_ScreenPictureViews = new ScreenPictureView[Utils.GetMaxEnumValue<CommonEltMbDataType_t>()]; for (int k = 0; k < m_ScreenPictureViews.Length; ++k ) { m_ScreenPictureViews[k] = new ScreenPictureView((CommonEltMbDataType_t)k); ScreenBase.AddToTabControl(m_ScreenPictureViews[k], tabControlPictureView); m_ScreenPictureViews[k].OnMacroblockEvent += (_sender, _e) => { switch (_e.Type) { // Screen Macroblocks case MacroblockEventArgs.MacroblockEventType_t.MacroblockEventType_Selected: { m_SelectedMacroblock = _e.Macroblock; // Macroblock Bits if (m_ScreenMbBits == null) { m_ScreenMbBits = new ScreenMbBits[Utils.GetMaxEnumValue<CommonEltMbDataType_t>()]; for (int i = 0; i < m_ScreenMbBits.Length; ++i) { m_ScreenMbBits[i] = new ScreenMbBits((CommonEltMbDataType_t)i); ScreenBase.AddToTabControl(m_ScreenMbBits[i], tabControlMacroblockBits); } tabControlMacroblockBits.SelectedIndex = (int)CommonEltMbDataType_t.CommonEltMbDataType_Final; } if (tabControlMacroblockBits.SelectedIndex != -1) { m_ScreenMbBits[tabControlMacroblockBits.SelectedIndex].ShowMacroblock(_e.Macroblock); } // Macroblock Info if (m_ScreenScreenMbInfo == null) { m_ScreenScreenMbInfo = new ScreenMbInfo(); ScreenBase.AddToTabControl(m_ScreenScreenMbInfo, tabControlInfo); } m_ScreenScreenMbInfo.ShowMacroblock(_e.Macroblock); // Headers(PPS, SPS, SLICE) associated to this Macroblock ShowHeadersFromSelectedMb(_e.Macroblock); break; } } }; } (m_Engine.Decoder as DecoderVideo).OnPictureEvent += (_sender, _e) => { switch (_e.Type) { case PictureEventArgs.PictureEventType_t.PictureEventType_Added: { if (!m_ScreenThumbnails.ContainsKey(_e.Picture.LayerId)) { m_ScreenThumbnails[_e.Picture.LayerId] = new ScreenThumbnails(_e.Picture.LayerId); ScreenBase.AddToTabControl(m_ScreenThumbnails[_e.Picture.LayerId], tabControlThumbs); m_ScreenThumbnails[_e.Picture.LayerId].OnPictureEvent += new EventHandler<PictureEventArgs>(Thumbnails_OnPictureEvent); } m_ScreenThumbnails[_e.Picture.LayerId].AddPicture(_e.Picture); break; } } }; // TabControls selection changed events tabControlPictureView.SelectionChanged += (_sender, _e) => { m_ScreenPictureViews[tabControlPictureView.SelectedIndex].ShowPicture(m_SelectedPicture); }; tabControlMacroblockBits.SelectionChanged += (_sender, _e) => { m_ScreenMbBits[tabControlMacroblockBits.SelectedIndex].ShowMacroblock(m_SelectedMacroblock); }; //FIXME: /*http://stackoverflow.com/questions/5480372/whats-the-best-way-to-update-an-observablecollection-from-another-thread*/ //this.Dispatcher.BeginInvoke((Action)(() => { mEngine.Decoder.Decode(uint.MaxValue); })); // FIXME new Thread(delegate() { m_Engine.Decoder.Decode(/*uint.MaxValue*/200); }) .Start(); }
public Intra16X16LumaPlanePredictor(int x, int y, Macroblock macroblock, IAlgorithmFactory algorithms) : base(x, y, macroblock, algorithms) { }
public MacroblockAccessNonMbaff(Macroblock macroblock) : base(macroblock) { }
public void ShowMacroblock(Macroblock mb) { m_Mb = mb; H264Mb mbH264 = m_Mb.Mb as H264Mb; if (mbH264 != null) // For now only H.264 is supported { // General if (m_ScreenGeneral == null) { m_ScreenGeneral = new ScreenMbInfoGeneral(); AddToTabControl(m_ScreenGeneral, tabControl); } m_ScreenGeneral.ShowMacroblock(m_Mb); // Intra4x4PredMode if (mbH264.Mode == MbMode.INTRA_4X4) { if (m_ScreenMbInfoI4x4PredMode == null) { m_ScreenMbInfoI4x4PredMode = new ScreenMbInfoI4x4PredMode(); m_ScreenMbInfoI4x4PredMode.Tag = false; } if (!(m_ScreenMbInfoI4x4PredMode.Tag as Boolean?).Value) { AddToTabControl(m_ScreenMbInfoI4x4PredMode, tabControl); m_ScreenMbInfoI4x4PredMode.Tag = true; } m_ScreenMbInfoI4x4PredMode.ShowMacroblock(m_Mb); } else { if (m_ScreenMbInfoI4x4PredMode != null && (m_ScreenMbInfoI4x4PredMode.Tag as Boolean?).Value) { RemoveFromTabControl(m_ScreenMbInfoI4x4PredMode, tabControl); m_ScreenMbInfoI4x4PredMode.Tag = false; } } // SubBlocks if (mbH264.IsInter8x8) { if (m_ScreenMbInfoSubBlocks == null) { m_ScreenMbInfoSubBlocks = new ScreenMbInfoSubBlocks(); m_ScreenMbInfoSubBlocks.Tag = false; } if (!(m_ScreenMbInfoSubBlocks.Tag as Boolean?).Value) { AddToTabControl(m_ScreenMbInfoSubBlocks, tabControl); m_ScreenMbInfoSubBlocks.Tag = true; } m_ScreenMbInfoSubBlocks.ShowMacroblock(m_Mb); } else { if (m_ScreenMbInfoSubBlocks != null && (m_ScreenMbInfoSubBlocks.Tag as Boolean?).Value) { RemoveFromTabControl(m_ScreenMbInfoSubBlocks, tabControl); m_ScreenMbInfoSubBlocks.Tag = false; } } // InterPred if (!mbH264.IsIntra) { if (m_ScreenMbInfoInterPred == null) { m_ScreenMbInfoInterPred = new ScreenMbInfoInterPred(); m_ScreenMbInfoInterPred.Tag = false; } if (!(m_ScreenMbInfoInterPred.Tag as Boolean?).Value) { AddToTabControl(m_ScreenMbInfoInterPred, tabControl); m_ScreenMbInfoInterPred.Tag = true; } m_ScreenMbInfoInterPred.ShowMacroblock(m_Mb); } else { if (m_ScreenMbInfoInterPred != null && (m_ScreenMbInfoInterPred.Tag as Boolean?).Value) { RemoveFromTabControl(m_ScreenMbInfoInterPred, tabControl); m_ScreenMbInfoInterPred.Tag = false; } } // SVC if (m_ScreenMbInfoSVC == null) { m_ScreenMbInfoSVC = new ScreenMbInfoSVC(); AddToTabControl(m_ScreenMbInfoSVC, tabControl); } m_ScreenMbInfoSVC.ShowMacroblock(m_Mb); } }
protected YuvFrameBuffer outputFrameBuffer; // encoded frame #endregion Fields #region Constructors protected AbstractEncodingMode(Macroblock macroblock, MacroblockType mbType) { this.macroblock = macroblock; this.mbType = mbType; }
public MacroblockEventArgs(MacroblockEventType_t type, Macroblock macroblock) : base() { m_Type = type; m_Macroblock = macroblock; }
private void Window_Loaded(object sender, RoutedEventArgs e) { //m_Engine = Engine.CreateRawH264("C:\\Projects\\toulde\\videos\\AUD_MW_E\\AUD_MW_E.264", "AUD_MW_E.yuv"); //m_Engine = Engine.CreateRawH264("C:\\Projects\\toulde\\videos\\FM1_BT_B\\FM1_BT_B.264", "FM1_BT_B.yuv"); // multiple slices + deblocking m_Engine = Engine.CreateRawH264("C:\\Projects\\toulde\\videos\\SVCBS-1\\SVCBS-1\\SVCBS-1.264", "SVCBS-1.yuv"); // Vidyo //m_Engine = Engine.CreateRawH264("C:\\Projects\\toulde\\videos\\freh1_b\\Freh1_B.264", "Freh1_B.yuv"); //m_Engine = Engine.CreateRawH264("C:\\Projects\\hl78965\\clean\\hartallo\\encoderSVC.264", "encoderSVC.yuv"); //m_Engine = Engine.CreateRawH264("C:\\Projects\\hl78965\\clean\\hartallo\\encoderAVC.264", "encoder.yuv"); //m_Engine = Engine.CreateRawH264("C:\\Projects\\hl78965\\clean\\hartallo\\encoder.264", "encoder.yuv"); // New Hartallo //m_Engine = Engine.CreateRawH264("C:\\Projects\\hl78965\\clean\\hartallo\\encoder_avc_10frms_noearlyterm.264", "encoder.yuv"); // Old Hartallo //m_Engine = Engine.CreateRawH264("C:\\tmp\\x264_104\\output.264", "encoder.yuv"); // x264 //m_Engine = Engine.CreateRawH264("C:\\Projects\\JM\\output.264", "encoder.yuv"); // JM //m_Engine = Engine.CreateRawH264("C:\\Projects\\hartallo\\tests\\TestH264\\bourne.264", "bourne.yuv");// bourne // Screen Previews m_ScreenPictureViews = new ScreenPictureView[Utils.GetMaxEnumValue <CommonEltMbDataType_t>()]; for (int k = 0; k < m_ScreenPictureViews.Length; ++k) { m_ScreenPictureViews[k] = new ScreenPictureView((CommonEltMbDataType_t)k); ScreenBase.AddToTabControl(m_ScreenPictureViews[k], tabControlPictureView); m_ScreenPictureViews[k].OnMacroblockEvent += (_sender, _e) => { switch (_e.Type) { // Screen Macroblocks case MacroblockEventArgs.MacroblockEventType_t.MacroblockEventType_Selected: { m_SelectedMacroblock = _e.Macroblock; // Macroblock Bits if (m_ScreenMbBits == null) { m_ScreenMbBits = new ScreenMbBits[Utils.GetMaxEnumValue <CommonEltMbDataType_t>()]; for (int i = 0; i < m_ScreenMbBits.Length; ++i) { m_ScreenMbBits[i] = new ScreenMbBits((CommonEltMbDataType_t)i); ScreenBase.AddToTabControl(m_ScreenMbBits[i], tabControlMacroblockBits); } tabControlMacroblockBits.SelectedIndex = (int)CommonEltMbDataType_t.CommonEltMbDataType_Final; } if (tabControlMacroblockBits.SelectedIndex != -1) { m_ScreenMbBits[tabControlMacroblockBits.SelectedIndex].ShowMacroblock(_e.Macroblock); } // Macroblock Info if (m_ScreenScreenMbInfo == null) { m_ScreenScreenMbInfo = new ScreenMbInfo(); ScreenBase.AddToTabControl(m_ScreenScreenMbInfo, tabControlInfo); } m_ScreenScreenMbInfo.ShowMacroblock(_e.Macroblock); // Headers(PPS, SPS, SLICE) associated to this Macroblock ShowHeadersFromSelectedMb(_e.Macroblock); break; } } }; } (m_Engine.Decoder as DecoderVideo).OnPictureEvent += (_sender, _e) => { switch (_e.Type) { case PictureEventArgs.PictureEventType_t.PictureEventType_Added: { if (!m_ScreenThumbnails.ContainsKey(_e.Picture.LayerId)) { m_ScreenThumbnails[_e.Picture.LayerId] = new ScreenThumbnails(_e.Picture.LayerId); ScreenBase.AddToTabControl(m_ScreenThumbnails[_e.Picture.LayerId], tabControlThumbs); m_ScreenThumbnails[_e.Picture.LayerId].OnPictureEvent += new EventHandler <PictureEventArgs>(Thumbnails_OnPictureEvent); } m_ScreenThumbnails[_e.Picture.LayerId].AddPicture(_e.Picture); break; } } }; // TabControls selection changed events tabControlPictureView.SelectionChanged += (_sender, _e) => { m_ScreenPictureViews[tabControlPictureView.SelectedIndex].ShowPicture(m_SelectedPicture); }; tabControlMacroblockBits.SelectionChanged += (_sender, _e) => { m_ScreenMbBits[tabControlMacroblockBits.SelectedIndex].ShowMacroblock(m_SelectedMacroblock); }; //FIXME: /*http://stackoverflow.com/questions/5480372/whats-the-best-way-to-update-an-observablecollection-from-another-thread*/ //this.Dispatcher.BeginInvoke((Action)(() => { mEngine.Decoder.Decode(uint.MaxValue); })); // FIXME new Thread(delegate() { m_Engine.Decoder.Decode(/*uint.MaxValue*/ 200); }) .Start(); }