Partager via


Implémentation de IWICBitmapCodecProgressNotification (Décodeur)

IWICBitmapCodecProgressNotification

Lorsqu’un codec effectue une opération d’E/S telle que CopyPixels sur une image volumineuse , l’exécution peut prendre plusieurs secondes, voire quelques minutes. Lorsque les utilisateurs finaux ne peuvent pas interrompre une opération de longue durée, ils peuvent penser que l’application s’est bloquée. Les utilisateurs ferment souvent une application, voire redémarrent leurs ordinateurs, pour tenter de reprendre le contrôle de leur ordinateur lorsqu’une application ne répond plus.

Cette interface permet à une application de spécifier une fonction de rappel que le codec peut appeler à des intervalles spécifiés pour informer l’appelant de la progression de l’opération en cours. L’application peut utiliser cette fonction de rappel pour afficher une indication de progression dans l’interface utilisateur afin d’informer l’utilisateur de la status de l’opération. Si un utilisateur clique sur le bouton Annuler dans la boîte de dialogue Progression , l’application retourne WINCODEC_ERR_ABORTED à partir de la fonction de rappel. Dans ce cas, le codec doit annuler l’opération spécifiée et propager ce HRESULT à l’appelant de la méthode qui a effectué l’opération.

Cette interface doit être implémentée sur votre classe de décodeur au niveau du conteneur.

interface IWICBitmapCodecProgressNotification : public IUnknown
{
    HRESULT RegisterProgressNotification ( 
        PFNProgressNotification pfnProgressNotification,
        LPVOID pvData,
        DWORD dwProgressFlags );
}

RegisterProgressNotification

RegisterProgressNotification est appelé par une application pour inscrire une fonction de rappel que le codec peut appeler à des intervalles spécifiés. Le premier paramètre, pfnProgressNotification, est un pointeur vers la fonction de rappel que le codec doit appeler à intervalles réguliers.

Le paramètre pvData pointe vers un objet que l’appelant souhaite que le codec passe à la fonction de rappel chaque fois que la fonction de rappel est appelée. Cet objet peut être n’importe quoi du tout et n’a pas de signification particulière pour le codec.

Le paramètre dwProgressFlags spécifie quand le codec doit appeler la fonction de rappel. Une fonction OR peut être effectuée avec deux énumérations pour ce paramètre. L’énumération WICProgressOperation spécifie s’il faut appeler la fonction de rappel pendant le décodage (WICProgressOperationCopyPixels), l’encodage (WICProgerssOperationWritePixels) ou les deux (WICProgressOperationAll).

enum WICProgressOperation
{
   WICProgressOperationCopyPixels,
   WICProgerssOperationWritePixels,
   WICProgressOperationAll      
};

Le codec doit appeler la fonction de rappel à intervalles réguliers tout au long de l’opération, mais l’appelant peut spécifier certaines exigences. L’énumération WICProgressNotification indique à quel moment de l’opération appeler la fonction de rappel. Si l’appelant spécifie WICProgressNotificationBegin, vous devez l’appeler au début de l’opération (0.0). Si l’appelant ne le spécifie pas, cela est facultatif. De même, si l’appelant spécifie WICProgerssNotificationEnd, vous devez l’appeler lorsque l’opération est terminée (1.0). Si l’appelant spécifie WICProgressNotificationAll, vous devez l’appeler au début et à la fin, ainsi qu’à intervalles réguliers tout au long de l’opération. L’appelant peut également spécifier WICProgerssNotificationFrequent, ce qui indique qu’il souhaite être rappelé à intervalles fréquents, peut-être après chaque couple de lignes d’analyse. (Un appelant utilise généralement cet indicateur uniquement pour une image très grande.) Sinon, vous devez généralement rappeler à intervalles d’environ 10 % du nombre total de lignes d’analyse à traiter.

enum WICProgressNotification
{
   WICProgressNotificationBegin,
   WICProgerssNotificationEnd,
   WICProgerssNotificationFrequent,
   WICProgressNotificationAll
};

Une seule fonction de rappel à la fois peut être inscrite pour un décodeur ou un instance d’encodeur spécifique. Si une application appelle RegisterProgressNotification plusieurs fois, remplacez la fonction de rappel précédemment inscrite par la nouvelle. Pour annuler une inscription de rappel, un appelant définit le paramètre pfnProgressNotification sur NULL.

PFNProgressNotification

PFNProgressNotification est la fonction de rappel avec la signature suivante.

typedef HRESULT (*PFNProgressNotification) ( 
   LPVOID pvData,
   ULONG uFrameNum,
   WICProgressOperation operation,
   double dblProgress );

Lorsque vous appelez la fonction de rappel, utilisez le paramètre pvData pour renvoyer le même pvData que celui spécifié par l’application lors de l’inscription de la fonction de rappel.

Le paramètre uFrameNum doit indiquer l’index du frame en cours de traitement.

Définissez le paramètre d’opération sur WICProgressOperationCopyPixels lors du décodage et WICProgressOperationWritePixels lors de l’encodage .

Le paramètre dblProgress doit être un nombre compris entre 0,0 (début de l’opération) et 1,0 (fin de l’opération). La valeur doit refléter la proportion de lignes d’analyse déjà traitées par rapport au nombre total de lignes de balayage à traiter.

Informations de référence

ProgressNotificationCallback

IWICBitmapCodecProgressNotification

Conceptuel

Implémentation d’IWICBitmapDecoder

Implémentation d’IWICBitmapSource

Comment écrire un codec WIC-Enabled

Vue d’ensemble du composant d’acquisition d’images Windows