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

📄 pe_istreamctrl_interface.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
PE_STATUS PEiStreamCtrlDemuxRemoveIG(PE_HANDLE handle)
{
    /* verify input */
    if (NULL == handle)
    {
        return (PE_INVALID_HANDLE);
    }

    return ( peiStrmSendMessage( ((PEHANDLE *)handle)->iStreamCtrl, PE_REMOVE_IG, 0, 0, 0, 0, 0, PE_ASYNC) );
}

/**
 * Detaches the bdrom subtext PID from the de-multiplexer.
 *
 * @param handle - iStrmCtrl handle.
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiStreamCtrlDemuxRemoveSubtext(PE_HANDLE handle)
{
    /* verify input */
    if (NULL == handle)
    {
        return (PE_INVALID_HANDLE);
    }

    return ( peiStrmSendMessage( ((PEHANDLE *)handle)->iStreamCtrl, PE_REMOVE_SUBTEXT, 0, 0, 0, 0, 0, PE_ASYNC) );
}

/**
 * Detaches the bdrom subtext PID from the de-multiplexer.
 *
 * @param handle - iStrmCtrl handle.
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiStreamCtrlDemuxRemoveSecondaryAudio(PE_HANDLE handle)
{
    /* verify input */
    if (NULL == handle)
    {
        return (PE_INVALID_HANDLE);
    }

    return ( peiStrmSendMessage( ((PEHANDLE *)handle)->iStreamCtrl, PE_REMOVE_SECONDARY_AUDIO, 0, 0, 0, 0, 0, PE_ASYNC) );
}

/**
 * Returns the current primary audio stream type and the audio attributes.
 *
 * @param handle - iStrmCtrl handle.
 *
 * @return PE_STATUS - Error code.
 */
PE_ISTREAMCTRL_AUDIO_TYPE PEiStreamCtrlGetAudioType(PE_HANDLE handle, PE_ISTREAMCTRL_AUDIO_ATTRIBUTES *pAudioAttr)
{
    /* verify input */
    if ( (NULL == handle) || (pAudioAttr == NULL) )
    {
        return (AUDIO_TYPE_INVALID);
    }

    /* fill in the audio attributes */
    pAudioAttr->sampling_frequency = ((PEHANDLE *)handle)->iStreamCtrl->AudioSamplingFrequency;
    pAudioAttr->n_channels         = ((PEHANDLE *)handle)->iStreamCtrl->AudioChannels;

    return (((PEHANDLE *)handle)->iStreamCtrl->AudioType);
}

/**
 * Returns the current primary video codec type.
 *
 * @param handle - iStrmCtrl handle.
 *
 * @return PE_STATUS - Error code.
 */
PE_ISTREAMCTRL_VIDEO_TYPE PEiStreamCtrlGetVideoType(PE_HANDLE handle)
{
    /* verify input */
    if (NULL == handle)
    {
        return (VIDEO_TYPE_INVALID);
    }

    return (((PEHANDLE *)handle)->iStreamCtrl->VideoType);
}

/**
 * Informs the PE of the source resolution of the video. This is used to properly configure
 * graphics scaling.
 *
 * @param ulWidth  - video width
 * @param ulHeight - video height
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiStreamCtrlSetVideoSrcResolution(PE_HANDLE handle, ULONG ulWidth, ULONG ulHeight)
{
    /* verify input */
    if (NULL == handle)
    {
        return (PE_INVALID_HANDLE);
    }

    return ( peiStrmSendMessage( ((PEHANDLE *)handle)->iStreamCtrl, PE_SET_VID_SRC_RES, ulWidth, ulHeight, 0, 0, 0, PE_ASYNC) );
}

/**
 * Informs the PE of the source frame rate of the video. This is used to properly configure
 * graphics animations.
 *
 * @param ucFrameRate  - video frame rate
 *
 * @return PE_STATUS - Error code.
 *
 * @todo   (Added JCA - 2006/09/22) Input parameter to this function should be
 *         an enumerated type and not a hardcoded number.
 */
PE_STATUS PEiStreamCtrlSetVideoSrcFrameRate(PE_HANDLE handle, UCHAR ucFrameRate)
{
    /* verify input */
    if (NULL == handle)
    {
        return (PE_INVALID_HANDLE);
    }

    return ( peiStrmSendMessage( ((PEHANDLE *)handle)->iStreamCtrl, PE_SET_VID_SRC_FRAMERATE, ucFrameRate, 0, 0, 0, 0, PE_ASYNC) );
}

/**
 * Informs the PE of the source aspect ratio of the video. This is used to properly configure
 * graphics.
 *
 * @param aspect_ratio  - video aspect ratio
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiStreamCtrlSetVideoSrcAspectRatio(PE_HANDLE handle, PE_ISTREAMCTRL_SOURCE_ASPECT_RATIO aspect_ratio)
{
    /* verify input */
    if (NULL == handle)
    {
        return (PE_INVALID_HANDLE);
    }

    return ( peiStrmSendMessage( ((PEHANDLE *)handle)->iStreamCtrl, PE_SET_VID_SRC_ASPECT_RATIO, aspect_ratio, 0, 0, 0, 0, PE_ASYNC) );
}

/**
 * Sets the playback rate.
 *
 * @param handle    - iStrmCtrl handle.
 * @param pscprRate - Play rate.
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiStreamCtrlSetRate(PE_HANDLE handle, PE_ISTREAMCTRL_PLAYRATE *pPlayRate)
{
    /* verify input */
    if (NULL == handle)
    {
        return (PE_INVALID_HANDLE);
    }

    return ( peiStrmSendMessage( ((PEHANDLE *)handle)->iStreamCtrl, PE_SET_RATE, (ULONG)pPlayRate, 0, 0, 0, 0, PE_SYNC) );
}

/**
 * Returns the current playback rate.
 *
 * @param handle - iStrmCtrl handle.
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiStreamCtrlGetRate(PE_HANDLE handle, PE_ISTREAMCTRL_PLAYRATE *pPlayRate)
{
    /* verify input */
    if (NULL == handle)
    {
        return (PE_INVALID_HANDLE);
    }

    return (peiStrmSendMessage( ((PEHANDLE *)handle)->iStreamCtrl, PE_GET_RATE, (ULONG)pPlayRate,
        sizeof(PE_ISTREAMCTRL_PLAYRATE), 0, 0, 0, PE_SYNC));
}

/**
 * Fills in the PE_ISTREAMCTRL_PLAY_RATE with the proper settings to achieve the requested decode rate.
 * The UI should look at the info to determine if the DR should be placed in a discontinuous read mode, then
 * pass the structure unmodified to PEiStreamCtrlSetRate().
 *
 * @param handle       - iStrmCtrl handle.
 * @param ulTargetRate - The target decode rate.
 * @param fDirection   - The target decode direction (forward or rewind).
 * @param pPlayRate    - Pointer to the play rate structure.
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiStreamCtrlConfigPlayRateParam(PE_HANDLE handle, ULONG ulTargetRate,
    PE_ISTREAMCTRL_DIRECTION direction, PE_ISTREAMCTRL_PLAYRATE *pPlayRate)
{
    /*
     * NOTE
     * For DVD discontiguous mode FF/REW the frame persistance is controlled
     * by navpacks. We run the decoder in a starved manner, and throttle the
     * data based on nav pack PTS. In order for this to work the frame
     * persistance has to be one for all FF/REW modes.
     */

    pPlayRate->rate          = ulTargetRate;
    pPlayRate->direction     = direction;
    pPlayRate->display_skip  = 0;

    if (ulTargetRate == PLAY_RATE_PAUSE)
    {
        pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_ALL;
        pPlayRate->discontiguous = FALSE;
        pPlayRate->read_skip     = 0;
        pPlayRate->persistence   = 0;
    }
    else if (ulTargetRate == PLAY_RATE_STEP)
    {
        pPlayRate->read_skip     = 0;
        pPlayRate->persistence   = 0;
        if (pPlayRate->direction == PE_ISTREAMCTRL_DIRECTION_FORWARD)
        {
            pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_ALL;
            pPlayRate->discontiguous = FALSE;
        }
        else
        {
            pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_I;
            pPlayRate->discontiguous = TRUE;
            if ( ((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG2_VOB )
            {
                /* special case for DVD - decoder doesn't handle single step */
                pPlayRate->persistence = 1;
            }
        }
    }
    else if (ulTargetRate == PLAY_RATE_NORMAL)
    {
        pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_ALL;
        pPlayRate->discontiguous = FALSE;
        pPlayRate->read_skip     = 0;
        pPlayRate->persistence   = 1;
    }
    else if (ulTargetRate < PLAY_RATE_NORMAL)   /* slow forward/rewind */
    {
        pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_ALL;
        pPlayRate->discontiguous = FALSE;
        pPlayRate->read_skip     = 0;
        pPlayRate->persistence   = PLAY_RATE_NORMAL/ulTargetRate;
    }
    else if (ulTargetRate <= PLAY_RATE_NORMAL*2)    /* fast forward/rewind 2X */
    {
        pPlayRate->read_skip = 0;

        if ( (((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG1_SS ) ||
             (((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG2_PS )  )
        {
            /* special case for VCD */
            pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_IP;
            pPlayRate->discontiguous = FALSE;
            pPlayRate->persistence   = 1;
        }
        else if ( ((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG2_VOB )
        {
            /* special case for DVD */
            if ((direction == PE_ISTREAMCTRL_DIRECTION_FORWARD))
            {
                pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_ALL;
                pPlayRate->discontiguous = FALSE;
                pPlayRate->display_skip  = 1;
            }
            else
            {
                pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_I;
                pPlayRate->discontiguous = TRUE;
            }
            pPlayRate->persistence = 1;
        }
        else
        {
            pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_I;
            pPlayRate->discontiguous = TRUE;
            pPlayRate->persistence   = 8;
        }
    }
    else if (ulTargetRate <= PLAY_RATE_NORMAL*4)    /* fast forward/rewind 4X */
    {
        pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_I;
        pPlayRate->discontiguous = TRUE;
        if (((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG2_VOB)
        {
            pPlayRate->read_skip     = 0; /* read every one */
            pPlayRate->persistence   = 1;
        }
        else
        {
            pPlayRate->read_skip     = 1; /* read every 2nd one */
            pPlayRate->persistence   = 8;
        }
    }
    else if (ulTargetRate <= PLAY_RATE_NORMAL*8)    /* fast forward/rewind 8X */
    {
        pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_I;
        pPlayRate->discontiguous = TRUE;
        if (((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG2_VOB)
        {
            pPlayRate->read_skip     = 2; /* FWDI 2 (see DVD spec) */
            pPlayRate->persistence   = 1;
        }
        else
        {
            pPlayRate->read_skip     = 3; /* read every 4th one */
            pPlayRate->persistence   = 8;
        }
    }
    else if (ulTargetRate <= PLAY_RATE_NORMAL*16)   /* fast forward/rewind 16X */
    {
        pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_I;
        pPlayRate->discontiguous = TRUE;
        if (((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG2_VOB)
        {
            pPlayRate->read_skip     = 5; /* FWDI 5 (see DVD spec) */
            pPlayRate->persistence   = 1;
        }
        else
        {
            pPlayRate->read_skip     = 7; /* read every 8th one */
            pPlayRate->persistence   = 8;
        }
    }
    else if (ulTargetRate <= PLAY_RATE_NORMAL*32)   /* fast forward/rewind 32X */
    {
        pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_I;
        pPlayRate->discontiguous = TRUE;
        if (((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG2_VOB)
        {
            pPlayRate->read_skip     = 9; /* FWDI 9 (see DVD spec) */
            pPlayRate->persistence   = 1;
        }
        else
        {
            pPlayRate->read_skip     = 15; /* read every 16th one */
            pPlayRate->persistence   = 8;
        }
    }
    else if (ulTargetRate <= PLAY_RATE_NORMAL*64)   /* fast forward/rewind 64X */
    {
        pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_I;
        pPlayRate->discontiguous = TRUE;
        if (((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG2_VOB)
        {
            pPlayRate->read_skip     = 15; /* FWDI 15 (see DVD spec) */
            pPlayRate->persistence   = 1;
        }
        else
        {
            pPlayRate->read_skip     = 31; /* read every 32nd one */
            pPlayRate->persistence   = 8;
        }
    }
    else /* fast forward/rewind 128X */
    {
        pPlayRate->mode          = PE_ISTREAMCTRL_DEC_MODE_I;
        pPlayRate->discontiguous = TRUE;
        if (((PEHANDLE *)handle)->iStreamCtrl->StreamType == STREAM_TYPE_MPEG2_VOB)
        {
            pPlayRate->read_skip     = 20; /* FWDI 20 (see DVD spec) */
            pPlayRate->persistence   = 1;
        }
        else
        {
            pPlayRate->read_skip     = 63; /* read every 64th one */
            pPlayRate->persistence   = 8;
        }
    }

    return (PE_SUCCESS);
}

/**
 * Enable, Disable, and Refresh DVD button highlights.
 *
 * @param handle   - iStrmCtrl handle.
 * @param pButton  - Describes button to be highlighted.
 *
 * @return PE_STATUS - Error code.
 */
PE_STATUS PEiStreamCtrlSendDVDButtonCmd(PE_HANDLE handle, PE_ISTREAMCTRL_DVD_BUTTON *pButton)
{
    PE_STATUS status;

    /* verify input */
    if (NULL == handle)
    {
        return (PE_INVALID_HANDLE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -