Classe CSourceSeeking

csourceseeking class hierarchy

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 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 Parar o tempo.
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 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 tempo 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 recursos de busca.
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 tempos em que a busca é eficiente.
Setrate Define a taxa de reprodução.
GetRate Recupera a taxa de reprodução.
GetPreroll Recupera a hora 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 pino de entrada downstream.
  2. Interrompa o thread de trabalho que está fornecendo dados.
  3. Chame o método IPin::EndFlush no pino de entrada.
  4. Reinicie o thread de trabalho.
  5. Chame o método IPin::NewSegment no pino 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.

Idealmente, o novo segmento (etapa 5) deve ser 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 apenas à busca 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 formatos de tempo. Depois que o método SetTimeFormat for chamado, todos os métodos IMediaSeeking deverão tratar os parâmetros de tempo de entrada e saída como sendo no novo formato de tempo. 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, verifique se há 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 Fluxos.h)
Biblioteca
Strmbase.lib (builds de varejo);
Strmbasd.lib (builds de depuração)

Confira também

Suporte à busca em um filtro de origem