CSourceSeeking (clase)
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
La clase CSourceSeeking es una clase abstracta para implementar la búsqueda en filtros de origen con un pin de salida.
Esta clase admite la interfaz IMediaSeeking . Proporciona implementaciones predeterminadas para todos los métodos IMediaSeeking . Las variables miembro protegidas almacenan la hora de inicio, la hora de detención y la tasa actual. De forma predeterminada, el único formato de hora admitido por la clase es TIME_FORMAT_MEDIA_TIME (unidades de 100 nanosegundos). Vea Comentarios para obtener más información.
Variables miembro protegidas | Descripción |
---|---|
m_rtDuration | Duración de la secuencia. |
m_rtStart | Hora de inicio. |
m_rtStop | Tiempo de detención. |
m_dRateSeeking | Velocidad de reproducción. |
m_dwSeekingCaps | Búsqueda de funcionalidades. |
m_pLock | Puntero a un objeto de sección crítico para el bloqueo. |
Métodos protegidos | Descripción |
CSourceSeeking | Método constructor. |
Métodos virtuales puros | Descripción |
ChangeRate | Se llama cuando cambia la velocidad de reproducción. |
ChangeStart | Se llama cuando cambia la posición inicial. |
ChangeStop | Se llama cuando cambia la posición de detención. |
Métodos IMediaSeeking | Descripción |
IsFormatSupported | Determina si se admite un formato de hora especificado. |
QueryPreferredFormat | Recupera el formato de hora preferido del objeto. |
SetTimeFormat | Establece el formato de hora. |
IsUsingTimeFormat | Determina si un formato de hora especificado es el formato actualmente en uso. |
GetTimeFormat | Recupera el formato de hora actual. |
GetDuration | Recupera la duración de la secuencia. |
GetStopPosition | Recupera la hora en la que se detendrá la reproducción, con respecto a la duración de la secuencia. |
GetCurrentPosition | Recupera la posición actual, en relación con la duración total de la secuencia. |
GetCapabilities | Recupera todas las funcionalidades de búsqueda de la secuencia. |
CheckCapabilities | Consulta si la secuencia ha especificado funcionalidades de búsqueda. |
ConvertTimeFormat | Convierte de un formato de una vez a otro. |
SetPositions | Establece la posición actual y la posición de detención. |
GetPositions | Recupera la posición actual y la posición de detención. |
GetAvailable | Recupera el intervalo de tiempos en los que la búsqueda es eficaz. |
SetRate | Establece la velocidad de reproducción. |
GetRate | Recupera la velocidad de reproducción. |
GetPreroll | Recupera la hora de inscripción previa. |
Observaciones
Cada vez que cambia la posición inicial, la posición de detención o la velocidad de reproducción, el objeto CSourceSeeking llama a un método virtual puro correspondiente:
- Posición de inicio: CSourceSeeking::ChangeStart
- Posición de detención: CSourceSeeking::ChangeStop
- Velocidad de reproducción: CSourceSeeking::ChangeRate
La clase derivada debe implementar estos métodos. Después de cualquier operación de búsqueda, un filtro debe hacer lo siguiente:
- Llame al método IPin::BeginFlush en el pin de entrada de bajada.
- Detenga el subproceso de trabajo que está entregando datos.
- Llame al método IPin::EndFlush en el pin de entrada.
- Reinicie el subproceso de trabajo.
- Llame al método IPin::NewSegment en el pin de entrada.
- Establezca la propiedad discontinuidad en el primer ejemplo. Llame al método IMediaSample::SetDiscontinuity .
La llamada a BeginFlush libera el subproceso de trabajo, si el subproceso está bloqueado en espera de entregar un ejemplo.
En el paso 2, asegúrese de que el subproceso ha dejado de enviar datos. En función de la implementación, es posible que tenga que esperar a que el subproceso salga o que el subproceso indique una respuesta de algún tipo. Si el filtro usa la clase CSourceStream , el método CSourceStream::Stop se bloquea hasta que responda el subproceso de trabajo.
Lo ideal es que el nuevo segmento (paso 5) se entregue desde el subproceso de trabajo. También puede hacerlo el objeto CSourceSeeking , siempre y cuando el filtro lo serialice con los ejemplos.
En el ejemplo siguiente se muestra una posible implementación. Se supone que el pin de salida del filtro de origen se deriva de CSourceSeeking y CSourceStream. En este ejemplo se define un método auxiliar, UpdateFromSeek, que realiza los pasos 1 4. El método CSourceStream::OnThreadStartPlay se invalida para enviar el nuevo segmento y para establecer una marca que indica la discontinuidad. El subproceso de trabajo recoge esta marca y llama al método IMediaSample::SetDiscontinuity :
void CMyStream::UpdateFromSeek()
{
if (ThreadExists())
{
DeliverBeginFlush();
Stop();
DeliverEndFlush();
Run();
}
}
HRESULT CMyStream::OnThreadStartPlay()
{
m_bDiscontinuity = TRUE;
return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}
Compatibilidad con formatos de tiempo adicionales
De forma predeterminada, esta clase solo admite la búsqueda en unidades de tiempo de referencia (TIME_FORMAT_MEDIA_TIME). Para admitir formatos de tiempo adicionales, invalide los métodos IMediaSeeking que tratan con formatos de hora:
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::SetTimeFormat
Además, invalide los métodos IMediaSeeking restantes para realizar las conversiones necesarias entre formatos de tiempo. Después de llamar al método SetTimeFormat , todos los métodos IMediaSeeking deben tratar los parámetros de hora entrante y saliente como en el nuevo formato de hora. Por ejemplo, si la variable m_rtDuration representa la duración en unidades de tiempo de referencia, pero el formato de hora actual es fotogramas, el método GetDuration debe devolver el valor m_rtDuration convertido en fotogramas. Por ejemplo:
STDMETHODIMP GetDuration(LONGLONG *pDuration)
{
HRESULT hr = CSourceSeeking::GetDuration(pDuration);
if (SUCCEEDED(hr))
{
if (m_TimeFormat == TIME_FORMAT_FRAME)
{
// Convert from reference time to frames.
*pDuration = TimeToFrame(*pDuration); // Private method.
}
}
return hr
}
Además, asegúrese de comprobar si hay la marca AM_SEEKING_ReturnTime en el método IMediaSeeking::SetPositions . Si esta marca está presente, convierta los valores de posición en horas de referencia cuando los devuelva al autor de la llamada.
Requisitos
Requisito | Value |
---|---|
Encabezado |
|
Biblioteca |
|