private void OpenPlaybackSession()
 {
     if (_viewItemManager.SelectedCamera != null)
     {
         _selectedItem = Configuration.Instance.GetItem(_viewItemManager.SelectedCamera.FQID);
         if (_selectedItem != null)
         {
             labelName.Text = _selectedItem.Name;
             lock (_bitmapVideoSourceNextLock)
             {
                 _bitmapVideoSourceNext        = new BitmapVideoSource(_selectedItem);
                 _bitmapVideoSourceNext.Width  = pictureBox.Width;
                 _bitmapVideoSourceNext.Height = pictureBox.Height;
                 _bitmapVideoSourceNext.SetKeepAspectRatio(true, true);
             }
             _nextToFetchTime = DateTime.UtcNow;
             _stopPlayback    = false;
         }
     }
 }
        private void BitmapFetchThread()
        {
            bool errorRecovery = false;
            BitmapVideoSource _bitmapVideoSource = null;

            while (!_stop)
            {
                if (_performCloseVideoSource)
                {
                    if (_bitmapVideoSource != null)
                    {
                        _bitmapVideoSource.Close();
                        _bitmapVideoSource = null;
                    }
                    _performCloseVideoSource = false;
                }

                if (_newlySelectedItem != null)
                {
                    _selectedItem             = _newlySelectedItem;
                    _bitmapVideoSource        = new BitmapVideoSource(_selectedItem);
                    _bitmapVideoSource.Width  = pictureBox.Width;
                    _bitmapVideoSource.Height = pictureBox.Height;
                    _bitmapVideoSource.SetKeepAspectRatio(true, true);

                    try
                    {
                        _bitmapVideoSource.Init();

                        BitmapData bitmapData = _bitmapVideoSource.GetAtOrBefore(DateTime.Now) as BitmapData;
                        if (bitmapData != null)
                        {
                            ShowBitmap(bitmapData);
                        }
                        else
                        {
                            ShowError("");      // Clear any error messages
                        }
                        _newlySelectedItem = null;
                        errorRecovery      = false;

                        BeginInvoke(new MethodInvoker(delegate() { groupBoxPlayback.Enabled = true; }));
                    } catch (Exception ex)
                    {
                        if (ex is CommunicationMIPException)
                        {
                            ShowError("Connection lost to server ...");
                        }
                        else
                        {
                            ShowError(ex.Message);
                        }
                        errorRecovery      = true;
                        _bitmapVideoSource = null;
                        _newlySelectedItem = _selectedItem;     // Redo the Initialization
                    }
                }

                if (errorRecovery || _bitmapVideoSource == null)
                {
                    if (this.IsHandleCreated)
                    {
                        BeginInvoke(new MethodInvoker(delegate() { groupBoxPlayback.Enabled = false; }));
                    }
                    if (_mode != PlaybackData.PlayStop)
                    {
                        buttonStop_Click(null, null);
                    }
                    Thread.Sleep(3000);
                    continue;
                }

                if (_performReSize)
                {
                    _bitmapVideoSource.Width  = _reSizeWidth;
                    _bitmapVideoSource.Height = _reSizeHeight;
                    _bitmapVideoSource.SetWidthHeight();
                    if (_mode == PlaybackPlayModeData.Stop)
                    {
                        _nextToFetchTime = _currentShownTime;
                        _redisplay       = true;
                    }
                }

                if (_nextCommand != MyPlayCommand.None && _requestInProgress == false)
                {
                    try
                    {
                        BitmapData bitmapData = null;
                        switch (_nextCommand)
                        {
                        case MyPlayCommand.Start:
                            bitmapData = _bitmapVideoSource.GetBegin();
                            break;

                        case MyPlayCommand.End:
                            bitmapData = _bitmapVideoSource.GetEnd();
                            break;

                        case MyPlayCommand.PrevSequence:
                            bitmapData = _bitmapVideoSource.GetPreviousSequence();
                            break;

                        case MyPlayCommand.NextSequence:
                            bitmapData = _bitmapVideoSource.GetNextSequence();
                            break;

                        case MyPlayCommand.PrevFrame:
                            bitmapData = _bitmapVideoSource.GetPrevious();
                            break;

                        case MyPlayCommand.NextFrame:
                            bitmapData = _bitmapVideoSource.GetNext() as BitmapData;
                            break;
                        }
                        if (bitmapData != null)
                        {
                            ShowBitmap(bitmapData);
                            bitmapData.Dispose();
                        }
                    }
                    catch (Exception ex)
                    {
                        if (ex is CommunicationMIPException)
                        {
                            ShowError("Connection lost to server ...");
                        }
                        else
                        {
                            ShowError(ex.Message);
                        }
                        errorRecovery      = true;
                        _bitmapVideoSource = null;
                        _newlySelectedItem = _selectedItem;     // Redo the Initialization
                        _nextCommand       = MyPlayCommand.None;
                        Thread.Sleep(3000);
                        continue;
                    }
                    _nextCommand = MyPlayCommand.None;
                }

                if (_nextToFetchTime != DateTime.MinValue && _requestInProgress == false)
                {
                    Debug.WriteLine("NextToFetch = " + _nextToFetchTime.ToString());

                    DateTime time      = _nextToFetchTime;
                    DateTime localTime = time.Kind == DateTimeKind.Local ? time : time.ToLocalTime();
                    DateTime utcTime   = time.Kind == DateTimeKind.Local ? time.ToUniversalTime() : time;

                    // Next 10 lines new for MIPSDK 2014
                    bool willResultInSameFrame = false;
                    // Lets validate if we are just asking for the same frame
                    if (_currentTimeInformation != null)
                    {
                        if (_mode == PlaybackPlayModeData.Forward &&
                            _currentTimeInformation.NextTime > utcTime)
                        {
                            willResultInSameFrame = true;
                        }
                        if (_mode == PlaybackPlayModeData.Reverse &&
                            _currentTimeInformation.PreviousTime < utcTime)
                        {
                            willResultInSameFrame = true;
                        }
                    }
                    _nextToFetchTime = DateTime.MinValue;

                    if (willResultInSameFrame)
                    {
                        // Same frame -> Ignore request
                    }
                    else
                    {
                        try
                        {
                            BeginInvoke(
                                new MethodInvoker(delegate() { textBoxAsked.Text = localTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); }));

                            BitmapData bitmapData = null;
                            switch (_mode)
                            {
                            case PlaybackPlayModeData.Stop:
                                bitmapData = _bitmapVideoSource.GetAtOrBefore(utcTime) as BitmapData;

                                // Next 2 lines new for MIPSDK 2014
                                if (bitmapData != null && bitmapData.IsPreviousAvailable == false)
                                {
                                    bitmapData.PreviousDateTime = bitmapData.DateTime - TimeSpan.FromMilliseconds(10);
                                }
                                break;

                            case PlaybackPlayModeData.Forward:
                                _bitmapVideoSource.GoTo(utcTime, _mode);
                                bitmapData = _bitmapVideoSource.GetNext() as BitmapData;

                                // Next 2 lines new for MIPSDK 2014
                                if (bitmapData != null && bitmapData.IsPreviousAvailable == false)
                                {
                                    if (utcTime - TimeSpan.FromMilliseconds(10) < bitmapData.DateTime)
                                    {
                                        bitmapData.PreviousDateTime = utcTime - TimeSpan.FromMilliseconds(10);
                                    }
                                    else
                                    {
                                        bitmapData.PreviousDateTime = bitmapData.DateTime;
                                    }
                                }
                                break;

                            case PlaybackPlayModeData.Reverse:
                                _bitmapVideoSource.GoTo(utcTime, _mode);
                                bitmapData = _bitmapVideoSource.GetPrevious();
                                // Next 2 lines new for MIPSDK 2014
                                if (bitmapData != null && bitmapData.IsPreviousAvailable == false)
                                {
                                    bitmapData.PreviousDateTime = bitmapData.DateTime - TimeSpan.FromMilliseconds(10);
                                }
                                break;
                            }

                            if (bitmapData != null)
                            {
                                ShowBitmap(bitmapData);
                                bitmapData.Dispose();
                            }
                        }
                        catch (Exception ex)
                        {
                            if (ex is CommunicationMIPException)
                            {
                                ShowError("Connection lost to server ...");
                            }
                            else
                            {
                                ShowError(ex.Message);
                            }
                            errorRecovery      = true;
                            _bitmapVideoSource = null;
                            _nextCommand       = MyPlayCommand.None;
                            _newlySelectedItem = _selectedItem;                             // Redo the Initialization
                        }
                    }
                }
            }
            _fetchThread = null;
        }