Que représentent les nombres et les couleurs pour -vismv et vis_mb_type dans ffmpeg?

0

Après la -vismvcommande, j'ai vu un certain nombre de valeurs différentes. Je ne trouve aucune explication sur ce que le nombre fait et en le changeant - je ne vois aucune différence!

De plus, je travaille avec la -debug vis_mb_typecommande et je peux visualiser les types de bloc. Le rouge étant nouveau, mais que représentent le vert et incolore? J'ai aussi vu du violet dans certains fichiers quand sur un I-frame!

Exemple de commande sur un fichier MP4:

ffmpeg -debug vis_mb_type -vismv 1 -i inputfile.mp4 -vcodec mjpeg -q:v 0 output.avi

Edit: Faire un peu plus de recherches là-dessus .... Je pense que les blocs verts sont prédits mais non déplacés, puis que les blocs monochromes non colorés sont inchangés par rapport à la trame I. Je n'arrive toujours pas à comprendre le rouge / violet!

Spreadys
la source
Voir la mise à jour de ma réponse.
slhck
Joli! Cela aidera ... Je vais faire un peu plus de recherches maintenant sur les différentes conditions.
Spreadys

Réponses:

3

vismv options

Il n'y a pas de nombres à passer -vismvcomme arguments. Seuls ceux-ci sont pris en charge:

  • pf - MV prédites en avant des images P
  • bf - MV prédites en avant des trames B
  • bb - MV prédites en arrière des images B

Je suppose que si vous utilisez des entiers, ceux-ci sont mappés à 1, 2 et 3, respectivement.

vis_mb_type

J'ai parcouru le code et trouvé la pièce correspondante dans mpegvideo.c, à partir de la ligne 2029. Elle convertit les COLOR(theta, r)valeurs en valeurs U et V à partir d'un espace colorimétrique YUV à l'aide de la fonction suivante:

#define COLOR(theta, r) \
    u = (int)(128 + r * cos(theta * 3.141592 / 180)); \
    v = (int)(128 + r * sin(theta * 3.141592 / 180));

Voici les valeurs de couleur par type de macrobloc, y compris leurs valeurs UV et la couleur RVB correspondante à Y = 128 .


  • COLOR(120, 48), UV(104, 169.57), RGB(184, 107, 86)
    État: IS_PCM (== MB_TYPE_INTRA_PCM)


  • COLOR(30, 48), UV(169.57, 152), RGB(160, 97, 200)
    État: IS_INTRA && IS_ACPRED) || IS_INTRA16x16


  • COLOR(90, 48), UV(128, 176), RGB(193, 94, 128)
    État: IS_INTRA4x4


  • COLOR(150, 48), UV(86.43, 152), RGB(160, 125, 55)
    État: IS_DIRECT


  • COLOR(170, 48), UV(80.73, 136.34), RGB(139, 138, 46)
    État: IS_GMC && IS_SKIP


  • COLOR(190, 48), UV(80.73, 119.66), RGB(116, 149, 46)
    État: IS_GMC


  • COLOR(240, 48), UV(104, 86.43), RGB(71, 165, 86)
    État: !USES_LIST(mb_type, 1))


  • COLOR(0, 48), UV(176, 128), RGB(128, 111, 211)
    État: !USES_LIST(mb_type, 0))


  • COLOR(300,48), UV(152, 86.43), RGB(71, 148, 169)
    Condition: USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1))- il s'agit assertdonc d' un processus qui peut ou non abandonner l'exécution du programme lorsque l'assertion échoue.

Je n'ai pas testé cela, mais cela me semble correct. Des informations sur les commutateurs de débogage et les couleurs de macroblocs sont également expliquées sur le wiki FFmpeg .

slhck
la source