DGDecode

Résumé

auteurs: MarcFD, Nic, trbarry, Sh0dan, Graft et d'autres
version: 1.4.0
catégorie: Plugins (source) décodeurs MPEG
téléchargement: http://neuron2.net/dgmpgdec/dgmpgdec.html
outils nécessaires:
licence: GPL

Table des matières

Description

DGDecode fait partie du package DGMPGDec. C'est un plugin de décodage MPEG-1/2 conçu pour AviSynth v2.5 et supérieures. Il est capable de décoder n'importe quel flux MPEG-1 ou MPEG-2 lu par DGIndex. Il dispose, entre autres, des fonctions suivantes: gère l'espace de couleurs de sortie YV12, I420 et YUY2 (ainsi que RGB24 via DGVfapi), des iDCT optimisés, un post traitement de type deblocking et deringing, filtrage sur la luminosité.

DGDecode est basé sur MPEG2Dec3 v1.10, qui était lui même basé sur MPEG2Dec2 issu du projet SourceForge "save-oe".

Note importante: Ce filtre fût renommé en DGDecode pour éviter les confusions et pour le mettre clairement en relation avec les versions de DVD2AVI de neuron2 renommées en DGIndex. Neuron2 fait beaucoup d'efforts pour que la reconnaissance aille également à ceux qui sont à l'origine de DGDecode. Neuron2 a fait évolué DVD2AVI et à corrigé des bugs, mais il se place dans la continuité des "géants" cités dans la section Remerciements de cette aide.

Vous pouvez obtenir la dernière version des exécutables et des sources sur la page suivantes: http://neuron2.net/dgmpgdec/dgmpgdec.html

Ce filtre est un logiciel libre distribué sous les termes de la licence GNU GPL v2. Vous devez être d'accord avec les termes de cette licence avant d'utiliser ce plugin ou son code source. Reportez vous à la section Licence pour plus de détails.

Syntaxe du filtre

MPEG2Source()

MPEG2Source (string "d2v", int "idct", int "cpu", bool "iPP", int "moderate_h", int "moderate_v", str "cpu2", bool "upConv", bool "i420", int "info", bool "showQ", bool "fastMC")

Bien que DGDecode décode maintenant aussi bien le MPEG-1 et le MPEG-2, la fonction s'appelle toujours MPEG2Source() pour des raisons de compatibilité avec les scripts existants. Vous pouvez l'utiliser pour décoder les flux MPEG-1 et MPEG-2.

d2v: "[CHEMIN\]project.d2v"

C'est le fichier de projet créé par DGIndex.
Paramètre obligatoire!
Note 1: CHEMIN peu être ignoré si le fichier "project.d2v" est dans le même répertoire que le fichier AviSynth (*.avs).

idct: de 0 à 7 (par défaut: 0)

C'est l'algorithme iDCT utilisé pour le décodage.
Pour plus d'informations sur l'iDCT, reportez vous à l'annexe B.
Reportez vous à l'annexe C pour connaitres les CPU supportés.
- 0: Utilise les valeurs indiquées par DGIndex (iDCTs 6 et 7 non disponibles dans DGIndex)
- 1: 32-bit MMX
- 2: 32-bit SSEMMX
- 3: 64-bit SSE2MMX
- 4: 32-bit Floating Point
- 5: 64-bit IEEE-1180 Reference
- 6: 32-bit SSEMMX (Skal)
- 7: 32-bit Simple MMX (XviD)

cpu: de 0 à 6 (par défaut: 0)

Paramètres de post-traitement rapides.
(Y=luma, C=chroma, H=horizontal, V=vertical)
- 0: DESACTIVE LE POST-TRAITEMENT
- 1: DEBLOCK_Y_H
- 2: DEBLOCK_Y_H, DEBLOCK_Y_V
- 3: DEBLOCK_Y_H, DEBLOCK_Y_V, DEBLOCK_C_H
- 4: DEBLOCK_Y_H, DEBLOCK_Y_V, DEBLOCK_C_H, DEBLOCK_C_V
- 5: DEBLOCK_Y_H, DEBLOCK_Y_V, DEBLOCK_C_H, DEBLOCK_C_V, DERING_Y
- 6: DEBLOCK_Y_H, DEBLOCK_Y_V, DEBLOCK_C_H, DEBLOCK_C_V, DERING_Y, DERING_C

iPP: true/false (vrai/faux) (par défaut: auto)

Post-traitement basé sur les champs.
DGDecode utilise le drapeau PROGRESSIVE_FRAME pour changer entre les modes de post-traitement basées sur des champs ou sur des images, ceci pour chaque image.
Vous devez utiliser le paramètre iPP uniquement si vous souhaitez forcer DGDecode à utiliser un mode particulier de post-traitement.
- true: force le mode de post-traitement basé sur les champs (pour source entrelacées)
- false: force le mode de post-traitement basé sur les images (pour les sources progressives)

moderate_h, moderate_v: de 0 à 255 (par défaut: moderate_h=20, moderate_v=40)

Sensibilité de détection des blocs.
(moderate_h=horizontal, moderate_v=vertical)
Des valeurs plus faibles produisent un filtrage plus important. Utilisez ce paramètre avec précautions.

cpu2: (par défaut: "")

Paramètres de post-traitement personnalisés.
Indique une chaîne de six caractères de x et de o se référant à la liste suivante (sensible à la casse).
Chaque "x" active le paramètre de post-traitement  correspondant.
Chaque "o" désactive le paramètre de post-traitement correspondant.
caractère 1: réduction de l'effet de bloc horizontalement sur la luminance
caractère 2: luma vertical deblocking (réduction de l'effet de bloc verticalement sur la luminance
caractère 3: réduction de l'effet de bloc horizontalement sur la chrominance
caractère 4: réduction de l'effet de bloc verticalement sur la chrominance
caractère 5: réduction de l'effet de fourmillement des contours (contours baveux) sur la luminance
caractère 6: réduction de l'effet de fourmillement des contours (contours baveux) sur la chrominance

Par exemple, pour activer un post traitement sur le paramètre chrominance seulement, utilisez:

MPEG2Source("project.d2v", cpu2="ooxxox")

upConv: true/false (vrai/faux) (par défaut: false)

Convertit une source YV12 (4:2:0) en YUY2 (4:2:2) en se basant sur le drapeau PROGRESSIVE_FRAME.
Ignoré si la source n'est pas en YV12 (4:2:0)
Utilisez les filtres de conversion AviSynth pour forcer un mode de reéchantillonnage constant.
- true: Effectue la conversion en se basant sur le drapeau PROGRESSIVE_FRAME
- false: N'effectue pas de conversion

i420: true/false (vrai/faux) (par défaut: false)

Renvoie une image dans l'espace de couleur I420.
Peut être utile pour des raisons de compatibilité avec certaines applications.
Ignoré si la source n'est pas en YV12 (4:2:0), ou si upConv=true.
- true: renvoie une image dans l'espace de couleur I420
- false: renvoie une image dans l'espace de couleur YV12

info: de 0 à 3 (par défaut: 0)

Informations de débugage.
- 0: Ne crée par d'infos de débugage.
- 1: Superpose les infos de débugage à la video.
- 2: Renvoie les infos de débugage avec OutputDebugString()
- 3: Renvoie des conseils sur la video (comme défini dans le fichier utilities.cpp/utilities.h)

showQ: true/false (vrai/faux) (par défaut: false)

Affiche les quantificateurs des macro blocs.
- true: Affiche les quantificateurs
- false: N'affiche pas les quantificateurs

fastMC: true/false (vrai/faux) (par défaut: false)

Compensation de mouvement rapide par Vlad.
Un léger gain de vitesse, mais avec une précision moindre.
A utiliser seulement pour des tests. Sera peut être supprimé dans des version ultérieures.
Nécessite SSE or 3DNow!, reportez vous à l'annexe C pour voir les CPUs supportés.

LumaYV12()

LumaYV12 (clip, int "lumoff", float "lumgain")

Cette fonction n'a aucun lien avec le filtre de luminance de DGIndex.
La transformation appliquée est la suivante: Y = (y * lumgain) + lumoff avec lumgain=gain de luminance et lumoff=décalage de luminance.

LumaYV12() renvoie une image dans la plage de couleur YUV 0->255, et pas dans la plage 16->235 de la norme CCIR-601. Utilisez le filtre intégré à AviSynth ColorYUV() si vous souhaitez forcer l'utilisation de la plage de couleur 16->235. La fonction de LumaYV12() peut être obtenue par le filtre ColorYUV(), qui dispose de plus de fonctions. Mais LumaYV12() est optimisé pour la vitesse dans ses légères manipulations des informations de luminance.

lumoff: de -255 à 255 (par défaut: 0)

Décalage de luminance
Ajuste la luminance de tout les pixels d'une valeur donnée.

lumgain: de 0.0 à 2.0 (par défaut: 1.0)

Gain de luminance.
Ajuste la luminance de tout les pixels par une valeur proportionnelle.

BlindPP()

BlindPP (clip, int "quant", int "cpu", bool "iPP", int "moderate_h", int "moderate_v", string "cpu2")

Pour supprimer les effets de blocs et de contours baveux (deblocking et deringing) d'une video.
Nécessite une video d'entrée en YUY2 ou YV12.
Reportez vous à l'annexe A pour des explications sur son utilisation.

quant: de 0 à 31 (par défaut: 2)

Quantificateur émulé.
Indique la force du traitement d'atténuation des blocs.

cpu: de 0 à 6 (par défaut: 6)

Même fonction que dans MPEG2Source(), mais avec des valeurs par défaut différentes.

iPP: true/false (vrai/faux) (par défaut: false)

Même fonction que dans MPEG2Source(), mais avec des valeurs par défaut différentes.
Mode automatique NON disponible.

moderate_h, moderate_v, cpu2: (par défaut: moderate_h=20, moderate_v=40, cpu2="")

Même fonction que dans MPEG2Source(), mais avec des valeurs par défaut différentes.

DeBlock()

Deblock (clip, int "quant", int "aOffset", int "bOffset", bool "mmx", bool "isse")

Filtre d'atténuation de bloc H.264 de Manao. (v0.9.5)
Nécessite une entrée en YV12.
(quant + aOffset) ET (quant + bOffset) doivent tout les deux être >= 16 ou le filtre n'a aucune action.

quant: de 0 à 51 (par défaut: 25)

Quantificateur émulé.
Indique la force du traitement d'atténuation de blocs.

aOffset: (par défaut: 0)

Modifie la limite de détection des blocs.
Une valeur élevée signifie que plus de blocs seront traitées.

bOffset: (par défaut: 0)

Modifie la limite de détection des blocs ainsi que le force du processus d'atténuation des blocs.
De la même manière, une valeur élevée provoquera un filtrage fort.

mmx: true/false (vrai/faux) (par défaut: true)

Désactivée par défaut si le processeur ne supporte pas cette fonction.
- true: Active les optimisations MMX
- false: Désactive les optimisations MMX

isse: true/false (vrai/faux) (par défaut: true)

Désactivée par défaut si le processeur ne supporte pas cette fonction.
Reportez vous à l'annexe C pour voir les processeurs supportés.
- true: Active les optimisations SSE
- false: Désactive les optimisations SSE

Exemples d'utilisation

AviSynth LoadPlugin()

La fonctions  LoadPlugin() d'AviSynth doit être invoquée avant que la fonction DGDecode ne puisse être utilisée.
Pour cela, rajoutez la ligne suivante au début de votre script AviSynth (*.avs):

LoadPlugin("[PATH\]DGDecode.dll")

Note: PATH est facultatif si DGDecode.dll se trouve dans le répertoire de plugin par défaut d'AviSynth, sinon PATH doit être indiqué.

MPEG2Source()

MPEG2Source() ne doit être utilisé que pour des sources MPEG-1 et MPEG-2.

Pour effectuer un décodage en YV12:

MPEG2Source("[PATH\]project.d2v")

Note: PATH est facultatif si "project.d2v" se trouve dans le même répertoire que votre script AviSynth (*.avs).

Pour atténuer un effet de blocs sur une image (deblocking):

MPEG2Source("project.d2v", cpu=4)

Pour atténuer un effet de blocs sur une source entrelacée, avec une sensibilité verticale accrue:

MPEG2Source("project.d2v", cpu=4, iPP=true, moderate_v=20)

Pour atténuer les contours baveux d'une image (deringing):

MPEG2Source("project.d2v", cpu2="ooooxx")

Pour sélectionner l'iDCT optimisée 32bit SSE2 et renvoyer une image dans l'espace de couleur I420:

MPEG2Source("project.d2v", idct=5, i420=true)

Pour convertir une source en YUY2 en se basant sur le drapeau PROGRESSIVE_FRAME:

MPEG2Source("project.d2v", upConv=true)

Pour superposer sur l'image des informations à propos de la video:

MPEG2Source("project.d2v", info=1)

LumaYV12()

Les exemples suivant de LumaYV12() sont complètements subjectifs.
Ajustez les paramètres en fonction de vos besoins.

Pour assombrir la video:

MPEG2Source("project.d2v")
LumaYV12(lumoff=-10, lumgain=0.9)

Pour éclairer la video:

MPEG2Source("project.d2v")
LumaYV12(lumoff=10, lumgain=1.1)

BlindPP()

BlindPP() ne devrait pas être utilisé quand vous utilisez la fonction MPEG2Source(), parce que ses options de post-traitements sont meilleures. En principe, BlindPP() peut être utilisé quand vous ouvrez une video avec les filtres AviSource() ou DirectShowSource() qui ne dispose pas de paramètres de post-traitement.

Pour faire un deblocking et un deringing de base:

AVISource("my_video.avi")
BlindPP()

Pour faire du deblocking seulement:

AVISource("my_video.avi")
BlindPP(cpu=4)

Pour faire du deblocking avec une sensibilité horizontale accrue:

AVISource("my_video.avi")
BlindPP(cpu=4, iPP=true, moderate_h=10)

Pour faire un deblocking et un deringing plus fort:

DirectShowSource("my_video.mpg")
BlindPP(quant=12)

Pour faire du deringing seulement:

DirectShowSource("my_video.mpg")
BlindPP(cpu2="ooooxx")

Deblock()

Deblock() ne devrait pas être utilisé avec des sources MPEG-2.
Il est plus souvent utiles quand on ouvre une video avec les filtres AviSource() ou DirectShowSource().

Pour faire un deblocking par défaut:

AVISource("my_video.avi")
Deblock()

Pour faire un deblocking fort avec une sensibilité accrue:

DirectShowSource("my_video.mpg")
Deblock(quant=32, aOffset=16, bOffset=24)

ANNEXE A: Notes sur BlindPP()

Les blocs sont le résultat de la DCT de 8x8 pixels utilisée par les encodeur MPEG.  Vous devez donc être sûr que les blocs que vous voulez supprimer sont encore alignés avec les bord de l'image. Cela veut dire que vous ne devez effectuer aucun découpage (crop) ni redimenssionnement (resize) avant d'appliquer BlindPP(). Si votre source est entrelacée, indiquez le paramètre iPP=true, si vous avez une source progressive, le paramètre par défaut est correct (iPP=false).

Les paramètres sont: quant, cpu2, moderate_h, et moderate_v.

quant indique la force à laquelle le processus d'atténuation de bloc (deblocking) doit être fait.

Paramétrez cpu2 à "xxxxoo" pour un deblocking horizontal et vertical sur la luminance et la chrominance, à "xooxoo" pour un deblocking horizontal sur la luminance et vertical sur la chromiannce, etc.

moderate_h et moderate_v indiquent les sensibilités horizontales et verticales, c'est à dire, où appliquer le deblocking, et où ne pas l'appliquer. Ils contrôle la sensibilité de détection d'un bloc.

quant=2, moderate_h=35-45, moderate_v=45-55 effectuera un deblocking léger sur les bloc clairement visibles seulement. Le clip conservera tout son détail et sa précision, mais laissera identiques les blocs peu visibles, et effacera seulement légèrement les blocs clairement visibles.

quant=16, moderate_h=15-20, moderate_v=20-30 effectuera un deblocking fort sur tout ce qui pourrait peut être être un bloc. Cela a pour effet de supprimer une grande quantité de détail et de précision.

Le reste dépend de ce que vous souhaitez obtenir et de votre source.

Un autre exemple. Puisque l'excellent débruiteur PixieDust() produit quelquefois des blocs dans les zones en mouvement, je fais quelquefois ceci:

PixieDust(2)
BlindPP(quant=8, cpu2="xxxxoo", moderate_h=45, moderate_v=55)

Cela élimine une bonne partie des blocs visibles, si et seulement si PixieDust() en a ajouté. Sur les 99.8% où PixieDust() n'a pas produit de blocs, cela ne fera rien.

ANNEXE B: Notes sur l'algorithme iDCT

Le fichier "Lisez-moi" de FlasKMPEG contient une excellente description technique de ce qu'est l'iDCTs. Il est écrit:

" Les informations video à l'intérieur d'un fichier MPEG sont enregistrés dans le domaine de fréquence plutôt que dans le domaine spatial (les images que nous voyons). De cette manière, les informations sont compactées et ce compactage permet de compresser (réduire) la quantité d'information à transmettre par le canal de transmission. MPEG utilise la DCT (Discrete Cosine Transform - Transformée en cosinus discrète) pour transformer les informations spatiales en informations de fréquences. Pour ramener les informations spatiale d'un flux MPEG, il faut donc appliquer une iDCT, c'est à dire une Inverse Discrete Cosine Transform (Transformée en cosinus discrète inverse), qui défait la DCT qui à été faites pendant l'encodage."

"Biens que MPEG soit déterministe (étant donnée un flux MPEG, la sortie doit être identique quelque soit le décodeur utilisé), le standard laisse un degré de liberté quant au choix de l'iDCT pour le décodage. De cette manière, un décodeur peut être plus facilement implémenté en fonction de l'équipement sur lequel il est utilisé. Ce que le standard exige, c'est que l'iDCT soit conforme au spécifications de la norme IEEE-1180. Cela signifie que l'erreur produite par l'iDCT ne doit pas dépasser les limites fixées par l'IEEE-1180."

L'iDCT que vous devez utiliser dépend principalement du CPU que vous utilisez et dans une moindre mesure de la précision de l'iDCT que vous souhaitez obtenir. La plupart des gens ne seront pas capable de faire la différence de qualité entre ces algorithmes mais on peut facilement mettre en évidences ces différences en combinant les filtres AviSynth Subtract() et Levels(). Toute les options proposées sont compatibles avec la norme IEEE-1180, à l'exception de SSE/MMX (Skal).

En terme de qualité: IEEE-1180 Reference > 64-bit Floating Point > Simple MMX (XviD) > les autres iDCT.

En terme de vitesse: SSE2/MMX et SSE/MMX (Skal) sont habituellement les plus rapides. L'iDCT IEEE-1180 Reference est de loin la plus lente.

ANNEXE C: Instructions SIMD

SIMD est l'acronyme de Single Instruction, Multiple Data ( instruction unique, données multiples). C'est un terme qui se réfère à un ensemble d'opérations pour manipuler efficacement de grandes quantités de données en parallèle. Ceci est particulièrement efficace dans les applications ou la video et l'audio sont manipulées. Ce qui nécessite habituellement des répétitions et des successions d'instructions peut maintenant être effectuer en une seule instruction.

Il existe sept ensembles d'instructions SIMD disponibles pour les processeurs Intel et AMD, mais pas tout les processeurs ne supportent ces ensembles d'instructions. C'est pourquoi beaucoup de fonction de DGDecode fournissent une option qui permet de choisir le jeux d'instruction à utiliser. Le tableau suivant liste les instructions SIMD supportées par DGDecode, et les processeurs capables d'utiliser ces instructions.

Historique des versions

Basé sur MPEG2Dec2 (save-oe CVS 28.09.2002), et sur MPEG2Dec3 (MarcFD).

Renommé en DGDecode (neuron2)

Remerciements

Mathias Born, auteur de MPEG2Dec
Donald Graft ("neuron2"), correction pour les images perdues, indexage précis, support du PVA, ...
Peter Gubanov, auteur de l'iDCT MMX/SSEMMX
Chia-chen Kuo ("jackei"), auteur de DVD2AVI
"MarcFD", support du YV12 et autre
"Nic", post-traitement et autre
Miha Peternel, auteur de Floating Point iDCT et Reference iDCT
Dmitry Rozhdestvensky, auteur de l'iDCT SSE2
"sh0dan", optimisations du code
"Skal", pour l'iDCT SSEMMX
"trbarry", analyse des flux de transport (TS: transport streams), et optimisations du code
"tritical", rééchantillonnage, superposition des infos, améliorations de VFAPI, beaucoup de corrections de bug
"Manao", pour son filtre Deblock()
"ARDA", pour le filtre LumaYV12()
"Didée", pour l'annexe A: Notes sur l'utilisation de BlindPP()
"Cyberia", pour les annexes B et C, et la mise à jour de l'aide

$English date: 2005/08/11 21:11:50 $
French translation: 2005/10/31 JasonFly macpaille@users.sourceforge.net