Diffuser en continu les modifications
Le format d’un flux de DVD peut changer à tout moment. Par exemple, le format du flux audio peut changer entre AC3 et LPCM pendant la lecture.
Chaque exemple de données dans le flux contient une structure KSSTREAM_HEADER qui y est ajoutée. Cette structure contient un membre OptionsFlags .
L’exemple de données associé à un en-tête qui contient l’un des indicateurs suivants peut ou non contenir un paquet de données null ou des données valides.
Les valeurs suivantes du membre KSSTREAM_HEADER OptionsFlags sont importantes pour la lecture de DVD :
KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY
Le bit KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY indique que l’exemple qui suit immédiatement appartient à une source (ou un emplacement/position) de données différent de l’exemple précédent. Cela indique que tout traitement en cours à l’aide de l’exemple précédent doit être terminé. Ce bit se trouve souvent au milieu d’une image précédente, ce qui indique que le décodeur doit ignorer la trame précédente et commencer le traitement avec les nouvelles données.
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY
Le bit KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY indique qu’il y aura un intervalle de temps dans les données immédiatement après cet exemple. Par exemple, si le flux DVD contient une trame fixe encodée en tant que trame I unique, le décodeur reçoit toutes les données de l’image I, le dernier exemple contenant l’indicateur KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY. Cela indique que le décodeur doit décoder immédiatement l’image I et ne pas attendre les données de trame B.
KSSTREAM_HEADER_OPTIONSF_TYPECHANGED
Le bit KSSTREAM_HEADER_OPTIONSF_TYPECHANGED indique que l’exemple connecté à l’en-tête sera un nouveau bloc KSDATAFORMAT pour le flux. Cela permet de modifier dynamiquement les types de données. Par exemple, le passage de la vidéo de 4x3 à 16x9, ou le passage de l’audio d’AC3 à PCM. Le décodeur doit apporter toutes les modifications nécessaires au nouveau bloc de format uniquement lorsque toutes les données antérieures au paquet avec le nouveau bloc de format ont été traitées.
Lorsqu’un changement de format de flux se produit, le minidriver reçoit un paquet de données avec le bit KSSTREAM_HEADER_OPTIONSF_TYPECHANGED défini dans le membre OptionsFlags de la structure KSSTREAM_HEADER du paquet de données.
Le minidriver peut ne jamais voir l’indicateur KSSTREAM_HEADER_OPTIONSF_TYPECHANGED s’il n’expose pas correctement les formats de données pris en charge par son flux audio.
L’exposition correcte des formats de données pris en charge par un flux implique deux étapes :
Le gestionnaire de SRB_GET_STREAM_INFO pour le flux doit définir le pointeur StreamFormatsArray pour qu’il pointe vers un tableau de pointeurs NumberOfFormatArrayEntries , chacun pointant vers un bloc de format valide.
Le gestionnaire de SRB_GET_DATA_INTERSECTION doit copier le bloc de format correspondant au format proposé dans la mémoire tampon fournie.
Une modification de format vidéo doit également signaler les événements KSSTREAM à la connexion de port vidéo pour indiquer que le format vidéo a changé. Un minidriver doit utiliser StreamClassStreamNotification(SignalMultipleStreamEvents, pMyHwDevExt-pMyStreamObject>, &MY_KSEVENTSETID_VPNOTIFY, KSEVENT_VPNOTIFY_FORMATCHANGE) à cet effet.
Quand un paramètre du format vidéo change, tel que les proportions de pixels, le décodeur reçoit un bloc de format. Le décodeur doit signaler au port vidéo de renégocier la connexion du port vidéo. Le décodeur appelle StreamClassStreamNotification avec le paramètre SignalMultipleStreamEvents.
Le mini-lecteur du décodeur DVD doit indiquer que la prise en charge de cet événement est fournie dans l’entrée HW_STREAM_INFORMATION pour le flux VideoPort. L’ID du jeu d’événements pour l’événement de port vidéo est KSEVENTSETID_VPNotify et l’ID d’événement est KSEVENT_VPNOTIFY_FORMATCHANGE.