📄 pe_istreamctrl_interface.cpp
字号:
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 + -