Compartilhar via


Classe CSourceSeeking

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

hierarquia da classe csourceseeking

A classe CSourceSeeking é uma classe abstrata para implementar a busca em filtros de origem com um pino de saída.

Essa classe dá suporte à interface IMediaSeeking . Ele fornece implementações padrão para todos os métodos IMediaSeeking . As variáveis de membro protegidas armazenam a hora de início, a hora de parada e a taxa atual. Por padrão, o único formato de tempo compatível com a classe é TIME_FORMAT_MEDIA_TIME (unidades de 100 nanossegundos). Confira Comentários para obter mais informações.

Variáveis de membro protegidas Descrição
m_rtDuration Duração do fluxo.
m_rtStart Hora de início.
m_rtStop Hora de parar.
m_dRateSeeking Taxa de reprodução.
m_dwSeekingCaps Buscando recursos.
m_pLock Ponteiro para um objeto de seção crítico para bloqueio.
Métodos Protegidos Descrição
Csourceseeking Método de construtor.
Métodos virtuais puros Descrição
Changerate Chamado quando a taxa de reprodução é alterada.
Changestart Chamado quando a posição inicial é alterada.
Changestop Chamado quando a posição de parada é alterada.
Métodos IMediaSeeking Descrição
Isformatsupported Determina se há suporte para um formato de hora especificado.
QueryPreferredFormat Recupera o formato de hora preferencial do objeto.
SetTimeFormat Define o formato de hora.
IsUsingTimeFormat Determina se um formato de hora especificado é o formato atualmente em uso.
Gettimeformat Recupera o formato de hora atual.
GetDuration Recupera a duração do fluxo.
GetStopPosition Recupera o tempo em que a reprodução será interrompida, em relação à duração do fluxo.
Getcurrentposition Recupera a posição atual, em relação à duração total do fluxo.
GetCapabilities Recupera todos os recursos de busca do fluxo.
CheckCapabilities Consulta se o fluxo especificou a busca de recursos.
ConvertTimeFormat Converte de um formato de vez em outro.
Setpositions Define a posição atual e a posição de parada.
GetPositions Recupera a posição atual e a posição de parada.
Obter Disponível Recupera o intervalo de vezes em que a busca é eficiente.
Setrate Define a taxa de reprodução.
GetRate Recupera a taxa de reprodução.
GetPreroll Recupera o tempo de pré-registro.

Comentários

Sempre que a posição inicial, a posição de parada ou a taxa de reprodução forem alteradas, o objeto CSourceSeeking chamará um método virtual puro correspondente:

A classe derivada deve implementar esses métodos. Após qualquer operação de busca, um filtro deve fazer o seguinte:

  1. Chame o método IPin::BeginFlush no pin de entrada downstream.
  2. Interrompa o thread de trabalho que está fornecendo dados.
  3. Chame o método IPin::EndFlush no pin de entrada.
  4. Reinicie o thread de trabalho.
  5. Chame o método IPin::NewSegment no pin de entrada.
  6. Defina a propriedade de descontinuidade no primeiro exemplo. Chame o método IMediaSample::SetDiscontinuity .

A chamada para BeginFlush libera o thread de trabalho, se o thread estiver bloqueado aguardando para entregar uma amostra.

Na etapa 2, verifique se o thread parou de enviar dados. Dependendo da implementação, talvez seja necessário aguardar a saída do thread ou para que o thread sinalize uma resposta de algum tipo. Se o filtro usar a classe CSourceStream , o método CSourceStream::Stop será bloqueado até que o thread de trabalho responda.

O ideal é que o novo segmento (etapa 5) seja entregue do thread de trabalho. Ele também pode ser feito pelo objeto CSourceSeeking , desde que o filtro o serialize com os exemplos.

O exemplo a seguir mostra uma possível implementação. Ele pressupõe que o pino de saída do filtro de origem seja derivado de CSourceSeeking e CSourceStream. Este exemplo define um método auxiliar, UpdateFromSeek, que executa as etapas 1 4. O método CSourceStream::OnThreadStartPlay é substituído para enviar o novo segmento e para definir um sinalizador que indica a descontinuidade. O thread de trabalho pega esse sinalizador e chama o 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);
}

Suporte a formatos de tempo adicionais

Por padrão, essa classe dá suporte à busca apenas em unidades de tempo de referência (TIME_FORMAT_MEDIA_TIME). Para dar suporte a formatos de tempo adicionais, substitua os métodos IMediaSeeking que lidam com formatos de tempo:

Além disso, substitua os métodos IMediaSeeking restantes para executar as conversões necessárias entre os formatos de tempo. Depois que o método SetTimeFormat é chamado, todos os métodos IMediaSeeking devem tratar os parâmetros de hora de entrada e saída como estando no novo formato de hora. Por exemplo, se a variável m_rtDuration representar a duração em unidades de tempo de referência, mas o formato de hora atual for quadros, o método GetDuration deverá retornar o valor m_rtDuration convertido em quadros. Por exemplo:

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
} 

Além disso, certifique-se de marcar para o sinalizador AM_SEEKING_ReturnTime no método IMediaSeeking::SetPositions. Se esse sinalizador estiver presente, converta os valores de posição em tempos de referência quando você os retornar ao chamador.

Requisitos

Requisito Valor
parâmetro
Ctlutil.h (inclua Streams.h)
Biblioteca
Strmbase.lib (builds de varejo);
Strmbasd.lib (builds de depuração)

Confira também

Suporte à busca em um filtro de origem