⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file_capture_decoder.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -