private void thread_DoWork(CancellationToken token) { while (!token.IsCancellationRequested) { if (start && path != null) { MFFrame pFrame = null; m_objReader.SourceFrameGet(-1, out pFrame, ""); M_TIME timeF; pFrame.MFTimeGet(out timeF); if (TC) { GetTC(timeF); } m_objPrev.ReceiverFramePut(pFrame, -1, ""); Marshal.ReleaseComObject(pFrame); } } }
private void thread_DoWork(CancellationToken token) { while (!token.IsCancellationRequested) { if (start && path != null) { MFFrame pFrame = null; MFFrame pFrameResize = null; m_objReader.SourceFrameGet(-1, out pFrame, ""); if (Resize_chb.Checked) { pFrame.MFResize(eMFCC.eMFCC_RGB32, 256, 144, 0, out pFrameResize, "", ""); m_objPrevResize.ReceiverFramePut(pFrameResize, -1, ""); } M_TIME timeF; pFrame.MFTimeGet(out timeF); if (TC) { GetTC(timeF); } m_objPrev.ReceiverFramePut(pFrame, -1, ""); Marshal.ReleaseComObject(pFrame); if (pFrameResize != null) { Marshal.ReleaseComObject(pFrameResize); } } } }
private bool NextFrame() { // Get request pos and set pause and reverse flags double dblRequest = -1.0; string strParams = string.Empty; // Update player state lock (m_playerState.stateLock) { if (m_playerState.state == eState.eST_Pause) { strParams = " pause=true"; } else if (m_playerState.state == eState.eST_PlayRev || m_playerState.state == eState.eST_StepRev) { strParams = " reverse=true"; } // Update player state if (m_playerState.state == eState.eST_StepFwd || m_playerState.state == eState.eST_StepRev) { // Pause on next iteration - because single frame was requested m_playerState.state = eState.eST_Pause; } // Get request time and set next cycle request to next frame // -1 as first parameter means "give me next frame", -5 means "give me next next 5th frame" etc, // this works accordingly when the reverse=true parameter is set. // positive values are uninterpreted as "give me frame at position" dblRequest = m_playerState.dblFrameRequest; m_playerState.dblFrameRequest = -1 * (int)(m_playerState.dblRate); } // Next frame cycle: // Get frame from reader and send to preview // Note: Preview keep frame according to frame time MFFrame pFrame = null; lock (m_objLock) // For prevent reader replace in OpenFile() and overlay change { // Get next frame or frame by position // -1 as first parameter means "give me next frame", -5 means "give me next next 5th frame" etc, // this works accordingly when the reverse=true parameter is set. // positive values are uninterpreted as "give me frame at position" try { if (m_objMFReader != null) { m_objMFReader.SourceFrameConvertedGetByTime(ref m_avProps, dblRequest, -1, out pFrame, strParams + " rate=0.1"); } int samples; pFrame.MFAVPropsGet(out currentProps, out samples); } catch (System.Exception ex) { MessageBox.Show("Error occurs during file decoding:\n\n" + ex.Message, m_playerState.strFileName, MessageBoxButtons.OK, MessageBoxIcon.Warning); return(false); } } if (pFrame == null) { Thread.Sleep(5); return(true); } try { // Demonstrate overlay - overlay another frame if any if (m_frOverlay != null) { pFrame.MFOverlay(m_frOverlay, null, 50, 100, 0.5, "", ""); } // Show CG object if (checkBoxCG.Checked) { ShowPluggin(m_objCharGen, ref pFrame); if (cgEditor != null) { cgEditor.m_objEditor_FrameProcessed(pFrame, null); } } // Show CC if (checkBoxCC.Checked) { if (m_objCCDisplay != null) { ShowPluggin(m_objCCDisplay, ref pFrame); } } // Show HTML if (checkBoxHTML.Checked) { lock (m_objHTMLLock) { if (m_objOverlayHTML != null) { ShowPluggin(m_objOverlayHTML, ref pFrame); if (overlayHTMLWind != null && !overlayHTMLWind.IsDisposed) { overlayHTMLWind.UpdatePreview(pFrame); } } } } mAudioMeter1.pFrame = pFrame; mAudioMeter1.SetValues(); // Get frame timings pFrame.MFTimeGet(out mTime); double dblDur = 0; m_objMFReader.ReaderDurationGet(out dblDur); if (m_playerState.dblDuration != dblDur) { m_playerState.dblDuration = dblDur; } // Send frame to Renderer SendToRenderer(pFrame); //Send frame to the preview m_objPreview.ReceiverFramePut(pFrame, checkBoxRenderer.Checked ? 0 : -1, ""); //Send to Sink SendToSink(pFrame); //Release frame - DO NOT FORGOT TO DO THIS !!! releaseComObj(pFrame); } catch (System.Exception ex) { MessageBox.Show("Error occurs during frame processing:\n\n" + ex.Message, m_playerState.strFileName, MessageBoxButtons.OK, MessageBoxIcon.Warning); return(false); } // Check for the last frame if ((mTime.eFFlags & eMFrameFlags.eMFF_Last) != 0) { lock (m_playerState.stateLock) { // Pause playback at the end of the file if loop is disabled if (!m_playerState.bLoop) { pause(); } if (m_playerState.state == eState.eST_PlayRev) { // Rewind to end in case of reverse playback rewindToEnd(); } else if (m_playerState.state == eState.eST_PlayFwd) { // Rewind to start in case of direct playback rewindToStart(); } } } return(true); }