Journal Un lecteur vidéo pour regarder Big Buck Bunny sur un Macintosh IIcx de 1989

Posté par  . Licence CC By‑SA.
68
17
sept.
2020

Sommaire

Démonstration du lecteur de vidéo

Introduction

On n’aime pas forcement beaucoup Apple ici. Mais j’espère que vous me pardonnerez vu qu’il s’agit de développement, de bidouillage, d’informatique rétro et que je vais évoquer pas mal de logiciels libres.
Il s’agit ici de mon expérience de développement d’un lecteur vidéo basique qui tourne sur un Macintosh IIcx de 1989 sous Système 7. Beaucoup de logiciels libres ont été utilisés pour parvenir au but : Retro68, Mini vMac, python, OpenCV, ffmpeg…

Vous pouvez visualiser la démonstration du résultats sur Youtube ou en téléchargement direct.
Le code du lecteur est disponible sur GitHub sous licence MIT.

Mais pourquoi faire ça ?

Je me suis récemment pris d’une passion un peu bizarre. Je collectionne et répare les vieux Macintosh des années 80. Je ne suis pourtant pas un adepte d’Apple. Je n’ai jamais eu de Mac moderne et j’utilise uniquement Linux depuis plus de 10 ans. Mais ma nouvelle passion doit être sans doute liée à mes premiers émois avec l’informatique, lorsque mon père ramenait de son travail l’une de ces machines.
Bref, on m’a récemment très gentiment donné un Macintosh IIcx de 1989 qui traînait dans une cave. C’était une machine plutôt haut de gamme à base de CPU Motorola 68000, comme tous les Macs de cette époque. Une de ces particularités est que l’unité centrale était accompagnée d’un CRT monochrome en mode portrait.
La machine ne fonctionnait pas lorsque je l’ai reçue : l’alimentation était instable. Mais après avoir passé la carte mère au lave vaisselle (oui, ça se fait très bien) et avoir changé les condensateurs de la carte mère et de la carte graphique, c’est tombé en marche ! Il est courant pour ces machines que le liquide des condensateurs électrolytiques vieillissants montés en surface fuit. Ces derniers ne fonctionnent alors plus et ça peut créer des court-circuits et de la corrosion sur les pistes du circuit imprimé.

Une fois réparée, l’envie m’est venu de tenter de développer pour cette plateforme. Comme démo, en souvenir de mon travail autour de VLC, j’ai pensé à afficher de la vidéo. C’était un défi car cette machine de 30 ans n’est pas vraiment prévue pour ça. L’écran est monochrome et les ressources de calcul sont limitées.

Le Développement

Retro68 et Mini vMac

La formidable toolchain Retro68 m’a permis de développer le lecteur en C sur Linux. Elle contient un cross-compilateur basé sur GCC et des scripts CMake qui génèrent automagiquement des images de disque pour l’émulateur libre Mini vMac et des exécutables facilement transférables sur un vrai Mac.
Retro68 ne contient pas pour des raisons légales les bibliothèques systèmes mais on peut facilement les ajouter. On peut aussi trouver de la documentation en ligne pour les API systèmes dans des volumes PDF « Inside Macintosh » archivés à différents endroits sur le Web.

Format de la vidéo et du son

Comme la puissance de la machine est limitée, j’ai voulu éviter d’utiliser des algorithmes de compression vidéo et audio. Les données sont lus directement décompressés depuis un fichier au format spécifique. Le lecteur va en fait ne faire que des copies de mémoire au bon moment.

Une limitation, le fait que l’écran soit monochrome, se retrouve être ici un avantage. On peut stocker la valeur d’un pixel sur un bit (blanc ou noir). Ainsi, si l’on joue la vidéo dans la résolution 320x240, on a besoin de 9.4 ko pour stocker chaque image. Si l’on affiche 10 images par seconde, on arrive à une taille de 5.5 Mo pour une minute. Ce sont des ordres de grandeurs acceptables pour le court-métrage que je voulais jouer et le moyen de stockage (sur lequel je reviendrai) dont je disposais sur le Mac réel. ffmpeg m’a donc servi à convertir le film à la résolution et à la fréquence d’affichage dont j’avais besoin.
Pour passer le court-métrage et ses nombreuses couleurs en noir et blanc, j’ai décidé de faire un rendu des contours grâce au détecteur de Canny d’OpenCV. Une amélioration pourrait être de combiner les contours avec différents motifs noir et blanc pour simuler différents niveaux de gris. C’est une technique souvent utilisée sur cette plateforme.

En ce qui concerne le son, il est simplement reéchantillonné à une fréquence de 11KHz en 8 bit mono. Cette opération est aussi réalisée avec ffmpeg. Cela signifie que le son est stocké sur des entiers de 8 bits avec 11000 valeurs par seconde, ce qui représente 645 ko par minute. C’est tout à fait compatible avec mes contraintes de stockage souples.

Pour faire la détection de contours avec OpenCV et multiplexer dans un seul fichier les données vidéos et sonores, j’ai codé un script Python 3.

Lecture

Un point critique dans un lecteur multimédia, et je pense que les développeurs de VLC ne me contrediront pas, est la fiabilité de l’horloge. Il faut afficher au bon moment la bonne image et synchroniser les échantillons sonores avec les images.
Ici, c’était bien sûr beaucoup plus simple car je maîtrisais entièrement les données d’entrée. Pour faciliter la tâche le Mac nous permet d’activer une interruption système (VBL) qui a une fréquence de 60Hz. Cette dernière est normalement prévue pour commiter dans un temps limité les changements à l’écran juste avant l’affichage et ainsi éviter les rafraîchissements partiels. Pour ma part, comme je dois rafraîchir une bonne partie de l’écran, ce temps n’est pas suffisant mais cette interruption me permet de cadencer de manière temporellement stable l’avancement de la vidéo.

Des API systèmes sont exposées pour créer des interfaces graphiques, dessiner sur l’écran et jouer du son. Les interfaces graphiques sont mêmes définies dans des fichiers de ressources.
Un fait que je trouve intéressant et que lorsque l’on tente de dessiner, on se rend bien compte que les temps changent. Un exécutable client peut ainsi dessiner sans limitation partout sur l’écran ; environnement de bureau et autres logiciels. Personnellement, moi qui suis adepte de la méthodologie que je nomme "YOLO programming", je suis assez fan. De la même manière, l’OS est très laxiste au niveau des débordements de tampon et nous laisse aisément écrire un peu où on veut. Revers de la médaille, lorsqu’on a fait trop de caca et que le programme crash, un seul choix nous est laissé : redémarrer… Au revoir toutes les tâches en cours et données non sauvegardées !

L’API sonore est basée sur une queue de commandes à exécuter qui permet d’empiler les paquets d’échantillons sonores. On doit leur ajouter un en-tête spécifique qui décrit le format du paquet. Cette API a tendance à contenir des bugs sur les vieux systèmes. Et des limitations matérielles ou logicielles font qu’il n’est pas possible par exemple d’enchaîner sans coupure les paquets d’échantillons sonores sur les Macintosh Plus et SE. Cela rend le son très haché sur ces machines.

Faire tourner le programme sur un vrai Mac

J’ai développé le logiciel avec l’aide de l’émulateur Mini vMac. Mais l’objectif final était bien sûr que ça fonctionne sur le vrai Mac. Pour transférer le programme, je me suis procuré un adaptateur SD2SCSI qui permet au Mac dont les disques durs sont à norme SCSI de lire des cartes SD formatées en HFS. Pour ne pas avoir de soucis, il est conseillé de ne pas dépasser 2Go comme taille de partition. C’est déjà énorme en comparaison de la taille standard du disque dur intégré à cette machine (80 Mo) et ça laisse suffisamment de place pour stocker les données de la vidéo. Linux permet sans problème de lire et d’écrire les partitions au format HFS.

L’expérience

L’expérience de développement sur cette plateforme était assez amusante et obtenir le résultat escompté fût gratifiant. Cependant, même si le programme représente peu de ligne de code au final, il m’a fallu beaucoup de temps pour arriver au bout.

Lorsque l’on débute aujourd’hui sur cette plateforme, les seules ressources sont quasiment les volumes "Inside Macintosh" d’Apple. Ils sont vraiment très complets. J’admire l’effort qu’ils ont fait pour les rédiger. Cependant de mon point de vue, ils sont aussi très verbeux. J’aurais parfois envie qu’ils aillent plus rapidement droit au but. Naviguer dans ces PDFs de 300, 400, 500 pages sans aucun lien est pénible.

Comme on peut l’imaginer, le "Stack Overflow based programming" (pour le site de questions réponses) qui est une composante du "YOLO programming" que j’affectionne s’applique mal ici. Le fainéant que je suis se retrouve obligé de RTFM ! Hormi des scans de vieux livres ou revues pour développeur, il y a peu d’exemples de code. De plus, certains exemples, notamment pour l’API sonore, peuvent ne pas fonctionner pour le système ciblé avec ses limitations et bugs. Certaines API ont vu leur vie être prolongée jusqu’au premières versions de Mac OS X !
Le dépôt de Retro68 contient aussi quelques programmes d’exemple.

Voilà pour mon premier journal ! J’espère que ce petit retour d’expérience vous aura intéressé.

  • # Au lave-vaisselle ??

    Posté par  . Évalué à 4.

    Mais après avoir passé la carte mère au lave vaisselle (oui, ça se fait très bien) et avoir changé les condensateurs de la carte mère et de la carte graphique, c’est tombé en marche ! Il est courant pour ces machines que le liquide des condensateurs électrolytiques vieillissants montés en surface fuit. Ces derniers ne fonctionnent alors plus et ça peut créer des court-circuits et de la corrosion sur les pistes du circuit imprimé.

    J'avoue que je n'aurais jamais tenté ça et je suis surpris que ça n'ait pas endommagé ladite carte ! Question : si les condensateurs ont coulé, j'imagine que se contenter de nettoyer ce qui a coulé ne suffit pas à rendre les condensateurs à nouveau fonctionnel… => est-ce que tu as aussi déssoudé/remplacé ces condos ?

    • [^] # Re: Au lave-vaisselle ??

      Posté par  . Évalué à 3.

      Oops j'ai lu trop vite et n'ai pas vu que tu avais écrit "et avoir changé les condensateurs de la carte mère"…

      • [^] # Re: Au lave-vaisselle ??

        Posté par  . Évalué à 6.

        Dans ce cas-là, j'ai effectivement changé les condensateurs après avoir passé la carte mère au lave vaisselle.

        Mais le simple fait de la nettoyer peut parfois réparer temporairement ton ordinateur ! Le liquide électrolytique créé en effet des court-circuits entre les pattes des composants et le nettoyage les supprime. Si les condensateurs restent encore un peu fonctionnel malgré leur fuite, ça peut marcher.
        Bien sûr, les fuites continueront et finiront toujours par causer à nouveau des problèmes. La vraie réparation est de changer les condensateurs. Mais je te confirme que le simple passage au lave-vaisselle m'a déjà refait fonctionner une carte-mère de Macintosh Classic.

        Je suis d'accord que le passage d'une carte mère au lave-vaisselle est un peu angoissant mais c'est une pratique courante dans la restauration de vieux ordinateurs.

        • [^] # Re: Au lave-vaisselle ??

          Posté par  . Évalué à 4.

          Ah oui intéressant je n'y aurai jamais pensé. Lave-vaisselle cela fait pas mal radical ! C'est sans produit ou il y a des recommandation ? Il faut quand même que le reste des composants soient en bon état j'imagine.

          • [^] # Re: Au lave-vaisselle ??

            Posté par  . Évalué à 2.

            Personnellement, j'ai mis à chaque fois du détergent pour la vaisselle et j'ai utilisé le programme court. J'ai entendu (mais je n'ai pas vérifié) qu'il y avait des composants dans les détergents pour éviter la corrosion des couverts. Ça serait donc une bonne chose pour nettoyer les traces de corrosion parfois créées par les fuites de condensateurs ou de piles.

            • [^] # Re: Au lave-vaisselle ??

              Posté par  . Évalué à 3. Dernière modification le 18 septembre 2020 à 22:45.

              C'est génial, ce projet.

              Merci pour le truc du lave-vaisselle.

              Sujet complètement différent, le passage au four d'une carte mère ou d'une carte graphique pour un BGA reballing, sais tu précisement quelle température et combien de temps, avec quelle tolérance ?
              Pareil pour un heat gun et un smartphone combien de temps, à quelle température et quelle tolérance pour faire fondre la colle ?
              J'ai un mal -fou- pour avoir des informations précises, peut-être as tu des informations là dessus ? :D :D

              • [^] # Re: Au lave-vaisselle ??

                Posté par  (site web personnel, Mastodon) . Évalué à 3.

                C'est spécifié dans la documentation des composants, normalement (avec courbe de température en fonction du temps). Mais franchement si tu fais ça avec ton four de cuisine sur un composant déjà utilisé et mal soudé, tu n'es plus à 10 degrés près,tu n'as aucune chance de respecter ces spécifications: ton four chauffe et refroidit trop lentement et ne permet pas un contrôle très précis de la température. C'est pour ça que ce genre d'opération ne se fait que sur du matériel hors service quand il n'y a plus grand chose à perdre.

                Pourun rebillage de composant bga, tu dois avoir la fiche techniques des nouvelles billes qui t'indique le profil de température, je pense. Mais s'il s'agit juste de refondre le métal déjà présent, personne n'a prévu ça dans les spécifications.

                Note: c'est une mauvaise idée d'utiliser le même four pour faire la cuisine après…

  • # Chapeau bas

    Posté par  (site web personnel) . Évalué à 5. Dernière modification le 17 septembre 2020 à 17:52.

    Bravo pour ce travail.
    Vous n'êtes pas seul:Je connais quelqu'un qui a aussi la passion du dépannage des très vieux ordi (Mac et autres) : http://libre-en-fete-tregor.fr/programme

  • # Passionnant

    Posté par  (site web personnel) . Évalué à 7.

    Ce genre de demake est vraiment très intéressant à voir.
    Merci du partage !

  • # Ah, les IIcx et IIci

    Posté par  (site web personnel) . Évalué à 2.

    De mémoire c'était très bien conçu pour l'ouverture, démontage, remplacement de pièces.

    Et les sons aux démarrage des macs

    Bon, depuis PC/Linux (mon dernier mac a été un PowerMac 7300) !

    Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

  • # Je veux le source!

    Posté par  . Évalué à 2.

    Désolé, je suis pas adepte du hard, je sais pas faire, mais à la moindre ligne de code lue pour des systèmes exotiques, j'apprend tellement… tu pourrais nous partager le source? Libre ou pas, je m'en fout, je veux juste le lire la, voire comment j'aurais fait selon mes diverses époques de devs, selon le hard, etc etc

    PS: je frétille d'impatience pour ton prochain journal, autant qu'une moule peut le faire (pas facile de le voir, donc, parce que t'as déjà vu une moule frétiller toi?)!

  • # Tu veux regarder un film sur mon Mac ?

    Posté par  . Évalué à 1.

    Il y a de quoi surprendre ! Bravo.

  • # Moi aussi je collectionne les ordinosaures...

    Posté par  (site web personnel) . Évalué à 0.

    surtout les Apple, mon rêve étant d'avoir une station NeXT pleinement fonctionnelle. Je n'ai hélas ni le temps ni les compétences de faire de telles restaurations(j'avoue que je n'ai pas tout compris à tes explications), alors si jamais on pouvait collaborer, faire des échanges… Merci de m'avoir fait découvrir le SCSI2SD en tous cas! Le nettoyage de la CM au lave-vaisselle m'amène à me demander si tu as essayé le re-blanchissement("retrofit") de boîtiers?

    Et du coup au final le fichier faisait quelle taille pour quelle durée? Si j'ai bien compris, ce n'est pas vraiment un fichier de données mais une sorte de programme qui génère la vidéo en envoyant les instructions qui vont bien (ça me rappelle quand on faisait ce genre de choses sur Amstrad CPC)?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.