📄 file_capture_decoder.cpp
字号:
default:
extension = "dat";
m_statusUpdateThreshold = FILE_CAPTURE_DECODER_MPEG_STATUS_THRESHOLD_IN_BYTES;
break;
}
if ( settings->streamType == DECODER_STREAM_TYPE_PCM )
{
DbgPrint(("FileCaptureDecoder::Setup PCM Stream (bits/sample=%d, channels=%d, sample rate=%d)\n",settings->pcm.bits_per_sample,settings->pcm.channels,settings->pcm.sample_rate));
}
m_decoderSettings = *settings;
// close previous decode capture file
VDVD_RAISE_ERROR( CloseOutputFile() );
// open new file and prepare to receive data
if (( m_name != NULL ) && ( strlen(m_name) > 0))
{
snprintf(filename,sizeof(filename), "%s%ssequence%d.%s",FILE_CAPTURE_ROOT_DIRECTORY, m_name, m_sequenceNumber++,extension);
}
else
{
snprintf(filename,sizeof(filename), "%ssequence%d.%s",FILE_CAPTURE_ROOT_DIRECTORY, m_sequenceNumber++,extension);
}
m_fileHandle = FILE_OPEN(filename, ( FILE_MODE_WRITEONLY | FILE_MODE_BINARY | FILE_MODE_TRUNCATE) );
if ( m_fileHandle==-1)
{
m_fileHandle = FILE_CREATE(filename);
VDVD_ASSERT_ERROR( (m_fileHandle==-1), VDVD_ERROR_PLATFORM_FAILED );
// unfortunately windows creates files only in text mode, we need binary mode
result = FILE_CLOSE( m_fileHandle );
VDVD_ASSERT_ERROR( (result==-1), VDVD_ERROR_PLATFORM_FAILED );
m_fileHandle = FILE_OPEN(filename, ( FILE_MODE_WRITEONLY | FILE_MODE_BINARY | FILE_MODE_TRUNCATE) );
VDVD_ASSERT_ERROR( (m_fileHandle==-1), VDVD_ERROR_PLATFORM_FAILED );
}
result = FILE_SEEK(m_fileHandle ,0,SEEK_SET);
VDVD_ASSERT_ERROR( (result==-1), VDVD_ERROR_PLATFORM_FAILED );
m_numberOfBytesReceived = 0;
m_numberOfBytesReceviedSinceLastUserNotification = 0;
m_numberOfBuffersAvailableToRelease = 0;
m_numberOfBuffersReceived = 0;
DBGPRINT(DBG_ON(DBG_VERBOSE),("FileCaptureDecoder::Setup opening file \"%s\"\n",filename));
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::SetPlayRate sets speed of playback
*
* @param playRate speed of playback
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::SetPlayRate( PE_ISTREAMCTRL_PLAYRATE* playRate )
{
UNUSED_PARAM(playRate);
AutoMutex autoMutex(&m_mutex);
VDVD_ASSERT_ERROR( (IsReferenced()==FALSE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
VDVD_ASSERT_ERROR( (playRate==NULL), VDVD_ERROR_INVALID_PARAMETER );
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::Flush flushes the decoder
*
* @param decoderType audio or video
* @param flushMode flushing mode
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::Flush ( DECODER_TYPE decoderType, DECODE_FLUSH_MODE flushMode )
{
UNUSED_PARAM(decoderType);
UNUSED_PARAM(flushMode);
AutoMutex autoMutex(&m_mutex);
VDVD_ASSERT_ERROR( (IsReferenced()==FALSE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
VDVD_RAISE_ERROR( CloseOutputFile() );
VDVD_RAISE_ERROR( Setup( &m_decoderSettings ));
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::Stop stops the decoder
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::Stop ( BOOLEAN holdPicture )
{
UNUSED_PARAM(holdPicture);
AutoMutex autoMutex(&m_mutex);
VDVD_ASSERT_ERROR( (IsReferenced()==FALSE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
VDVD_RAISE_ERROR( CloseOutputFile() );
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::Pause pause the decoder
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::Pause ( void )
{
AutoMutex autoMutex(&m_mutex);
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::Resume resume the decoder
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::Resume ( void )
{
AutoMutex autoMutex(&m_mutex);
VDVD_ASSERT_ERROR( (IsReferenced()==FALSE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::SendData Sends buffer to the decoder for processing
*
* @param buffer pointer to buffer containing decode data
* @param bufferSize size of buffer to be decoded
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::SendData( void* buffer, uint32 bufferSize )
{
AutoMutex autoMutex(&m_mutex);
int result = 0;
if (( bufferSize == 0 ) || ( buffer == NULL ))
{
return ( VDVD_SUCCESS );
}
VDVD_ASSERT_ERROR( (IsReferenced()==FALSE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
VDVD_ASSERT_ERROR( (m_fileHandle==0), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
// inform background thread we have received data
m_receivedDataFlag = TRUE;
// update statistics
m_numberOfBuffersReceived++;
m_numberOfBytesReceived += bufferSize;
m_numberOfBytesReceviedSinceLastUserNotification += bufferSize;
// write data to capture file
result = FILE_WRITE( m_fileHandle, buffer, bufferSize );
VDVD_ASSERT_ERROR( (result==-1), VDVD_ERROR_PLATFORM_FAILED );
result = FILE_FLUSH(m_fileHandle);
VDVD_ASSERT_ERROR( (result==-1), VDVD_ERROR_PLATFORM_FAILED );
m_numberOfBuffersAvailableToRelease++;
if ( m_numberOfBytesReceviedSinceLastUserNotification > m_statusUpdateThreshold)
{
DBGPRINT(DBG_ON(DBG_VERBOSE),("FileCaptureDecoder::SendData received %3.1fmb so far\n", (float)(m_numberOfBytesReceived)/(1024*1024)));
m_numberOfBytesReceviedSinceLastUserNotification = 0;
}
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::ProcessEndOfStream process end of stream notification
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::ProcessEndOfStream( void )
{
AutoMutex autoMutex(&m_mutex);
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::GetStatus Retrieves current video STC
* Not implemented
*
* @param status pointer to status structure to fill in
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::GetStatus ( DECODE_STATUS_TYPE* status )
{
AutoMutex autoMutex(&m_mutex);
VDVD_ASSERT_ERROR( (IsReferenced()==FALSE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
VDVD_ASSERT_ERROR( (status==NULL), VDVD_ERROR_INVALID_PARAMETER );
status->audio_pts = 0;
status->audio_stc = 0;
status->video_pts = 0;
status->video_stc = 0;
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::SelectVideoStream selects video stream
* Not implemented
*
* @param parameters video stream parameters
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::SelectVideoStream( DECODE_VIDEO_PARAMETERS* parameters )
{
AutoMutex autoMutex(&m_mutex);
VDVD_ASSERT_ERROR( (IsReferenced()==FALSE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
VDVD_ASSERT_ERROR( (parameters==NULL), VDVD_ERROR_INVALID_PARAMETER );
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* FileCaptureDecoder::SelectAudioStream selects audio stream
* Not implemented
*
* @param parameters audio stream parameters
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR FileCaptureDecoder::SelectAudioStream( DECODE_AUDIO_PARAMETERS* parameters )
{
AutoMutex autoMutex(&m_mutex);
VDVD_ASSERT_ERROR( (IsReferenced()==FALSE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
VDVD_ASSERT_ERROR( (parameters==NULL), VDVD_ERROR_INVALID_PARAMETER );
return ( VDVD_SUCCESS );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -