Descrittori di presentazione
Una presentazione è un set di flussi multimediali correlati che condividono un'ora di presentazione comune. Ad esempio, una presentazione può essere costituita dai flussi audio e video di un filmato. Un descrittore di presentazione è un oggetto che contiene la descrizione di una presentazione specifica. I descrittori di presentazione vengono usati per configurare le origini multimediali e alcuni sink multimediali.
Ogni descrittore di presentazione contiene un elenco di uno o più descrittori di flusso. Questi descrivono i flussi nella presentazione. I flussi possono essere selezionati o deselezionati. Solo i flussi selezionati producono dati. I flussi deselezionati non sono attivi e non producono dati. Ogni descrittore di flusso ha un gestore di tipi multimediali, che viene usato per modificare il tipo di supporto del flusso o ottenere il tipo di supporto corrente del flusso. Per altre informazioni sui tipi di supporti, vedere Tipi di supporti.
La tabella seguente illustra le interfacce principali esposte da ognuno di questi oggetti.
Oggetto | Interfaccia |
---|---|
Descrittore di presentazione | IMFPresentationDescriptor |
Descrittore di flusso | IMFStreamDescriptor |
Gestore del tipo di supporto | IMFMediaTypeHandler |
Presentazioni di origine multimediale
Ogni origine multimediale fornisce un descrittore di presentazione che descrive la configurazione predefinita per l'origine. Nella configurazione predefinita è selezionato almeno un flusso e ogni flusso selezionato ha un tipo di supporto. Per ottenere il descrittore di presentazione, chiamare IMFMediaSource::CreatePresentationDescriptor. Il metodo restituisce un puntatore IMFPresentationDescriptor .
È possibile modificare il descrittore di presentazione dell'origine per selezionare un set diverso di flussi. Non modificare il descrittore di presentazione a meno che l'origine multimediale non venga arrestata. Le modifiche vengono applicate quando si chiama IMFMediaSource::Start per avviare l'origine.
Per ottenere il numero di flussi, chiamare IMFPresentationDescriptor::GetStreamDescriptorCount. Per ottenere il descrittore di flusso per un flusso, chiamare IMFPresentationDescriptor::GetStreamDescriptorByIndex e passare l'indice del flusso. I flussi vengono indicizzati da zero. Il metodo GetStreamDescriptorByIndex restituisce un puntatore IMFStreamDescriptor . Restituisce anche un flag booleano che indica se il flusso è selezionato. Se il flusso è selezionato, l'origine multimediale produce dati per tale flusso. In caso contrario, l'origine non produce dati per tale flusso. Per selezionare un flusso, chiamare IMFPresentationDescriptor::SelectStream con l'indice del flusso. Per deselezionare un flusso, chiamare IMFPresentationDescriptor::D eselectStream.
Il codice seguente illustra come ottenere il descrittore di presentazione da un'origine multimediale ed enumerare i flussi.
HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL fSelected = FALSE;
IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;
hr = pSource->CreatePresentationDescriptor(&pPresentation);
if (SUCCEEDED(hr))
{
hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}
if (SUCCEEDED(hr))
{
for (DWORD iStream = 0; iStream < cStreams; iStream++)
{
hr = pPresentation->GetStreamDescriptorByIndex(
iStream, &fSelected, &pStreamDesc);
if (FAILED(hr))
{
break;
}
/* Use the stream descriptor. (Not shown.) */
SAFE_RELEASE(pStreamDesc);
}
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);
Gestori di tipi multimediali
Per modificare il tipo di supporto del flusso o per ottenere il tipo di supporto corrente del flusso, usare il gestore del tipo di supporto del descrittore di flusso. Chiamare IMFStreamDescriptor::GetMediaTypeHandler per ottenere il gestore del tipo di supporto. Questo metodo restituisce un puntatore IMFMediaTypeHandler .
Se si vuole semplicemente sapere che tipo di dati si trova nel flusso, ad esempio audio o video, chiamare IMFMediaTypeHandler::GetMajorTypeType. Questo metodo restituisce il GUID per il tipo di supporto principale. Ad esempio, un'applicazione di riproduzione connette in genere un flusso audio al renderer audio e un flusso video al renderer video. Se si usa la sessione multimediale o il caricatore della topologia per compilare una topologia, il GUID di tipo principale potrebbe essere l'unica informazione di formato necessaria.
Se l'applicazione necessita di informazioni più dettagliate sul formato corrente, chiamare IMFMediaTypeHandler::GetCurrentMediaTypeType. Questo metodo restituisce un puntatore all'interfaccia IMFMediaType del tipo di supporto. Usare questa interfaccia per ottenere i dettagli del formato.
Il gestore del tipo di supporto contiene anche un elenco di tipi di supporti supportati per il flusso. Per ottenere le dimensioni dell'elenco, chiamare IMFMediaTypeHandler::GetMediaTypeCount. Per ottenere un tipo di supporto dall'elenco, chiamare IMFMediaTypeHandler::GetMediaTypeByIndex con l'indice del tipo di supporto. I tipi di supporti vengono restituiti nell'ordine approssimativo delle preferenze. Ad esempio, per i formati audio, le frequenze di campionamento più elevate sono preferibili rispetto alle frequenze di campionamento inferiori. Tuttavia, non esiste alcuna regola definitiva che regola l'ordinamento, quindi è consigliabile considerarla semplicemente come una linea guida.
L'elenco dei tipi supportati potrebbe non contenere tutti i possibili tipi di supporti supportati dal flusso. Per verificare se è supportato un particolare tipo di supporto, chiamare IMFMediaTypeHandler::IsMediaTypeSupported. Per impostare il tipo di supporto, chiamare IMFMediaTypeHandler::SetCurrentMediaType. Se il metodo ha esito positivo, il flusso conterrà dati conformi al formato specificato. Il metodo SetCurrentMediaType non modifica l'elenco dei tipi preferiti.
Il codice seguente illustra come ottenere il gestore del tipo di supporto, enumerare i tipi di supporti preferiti e impostare il tipo di supporto. In questo esempio si presuppone che l'applicazione disponga di un algoritmo, non illustrato qui, per la selezione del tipo di supporto. Le specifiche dipenderanno notevolmente dall'applicazione.
HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL bTypeOK = FALSE;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;
hr = pStreamDesc->GetMediaTypeHandler(&pHandler);
if (SUCCEEDED(hr))
{
hr = pHandler->GetMediaTypeCount(&cTypes);
}
if (SUCCEEDED(hr))
{
for (DWORD iType = 0; iType < cTypes; iType++)
{
hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);
if (FAILED(hr))
{
break;
}
/* Examine the media type. (Not shown.) */
/* If this media type is acceptable, set the media type. */
if (bTypeOK)
{
hr = pHandler->SetCurrentMediaType(pMediaType);
break;
}
SAFE_RELEASE(pMediaType);
}
}
SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);
Argomenti correlati