ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ -...

32
création : shift. / futurorg.com

Upload: trinhthuan

Post on 31-Jan-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

création : shift. / futurorg.comcréation : shift. / futurorg.com

Page 2: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez
Page 3: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

europa est édité par l’association europa production nantessiège social > chemin de la censive, bp 41214, 44312 nantes cedex 3

tel > 09 51 82 31 34mail > [email protected]

Pour contacter un service : redaction/publicite/[email protected]

diffusionnantes / angers / st nazaire / la roche/Yon / le mans

/ cholet / laval / rennes > lieux culturels, centres d’information, médiathèques, universités... toilettes et autres lieux de culte

> tiré à 8 000 exemplaires

imprimé en france / par chiffoleau 19 rue du grand verger, 44100 nantes

issn > 1778-171X - dépôt légal > avril 2009

La rédaction se garde le droit de ne pas restituer les documents qui lui sont envoyés, de quelque nature qu’ils soient (dessins, photos, textes etc.).

Toute reproduction de textes, dessins ou photos, nécessite l’accord des auteurs.

c’est mon choix...

I II ? IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII

Directeur de la Publication ....................................................................................................................Rédacteur en chef ..................................................................................................................Publicité / Abonnements .........................................................................................................Web .................................................................................................................................................Maquette & Graphisme ..............................................................................................................................Stagiaires .........................................................................................

Comité de relecture : Maël Nonet, Lucie Aubin, Élise Montecchio, Sophie GirardOnt participé à ce numéro : Céline Diais, Claire Charrier, Marie Panier, Emma Lecoq, Julien Fournier, Maxence Delorme, Sophie Girard, Timo Euteneuer, Christian Gail, Virginie Bernard, Luca Moniti, Samuel Picas, Antonio CarolaDessins & Illustrations : shift., Clémence Bourdaud, Luca Falcone, Christian Gail, Magali Planès, Nicolas de la CasinièreRemerciements : Un grand merci aux institutions qui nous financent et nous soutiennent ; aux annonceurs qui nous font confiance ; à Anaïg Denis et Stéphane Raimbault, Sandra, Jean Quatremer et Gérard Onesta, à Tanguy Coïc.

| | | | | | || | | | | | | ||Cyril Bérard

Emmanuel LemoineGuillaume Siaudeau

Antonin JourdanCyril Bérard

Andrea Ortner & Saskia Siebeneicher

Mesdames, Messieurs, nous accueillons ce soir sur le plateau de l’édito trois représentants de la rédaction d’Europa. Je me tourne premièrement vers Hector Sirodeau, pouvez-vous nous en dire plus sur cette offre d’abonnement à un magazine gratuit ?Voyez-vous, quand j’étais jeune, j’étais abonné à une revue de géographie dont je tairai le nom et je prenais un réel plaisir tous les deux mois quand le facteur m’apportait le nouveau numéro. S’abonner à un magazine, c’est, je dirais, jouir d’une attente excitante qui procure un délicieux sentiment d’impatience. Je m’explique. Si vous voulez, c’est un peu comme se faire servir le petit-déjeuner au lit. Il y a ceux qui se lèvent tôt et doivent graisser leurs tartines à la force de leurs mains, et il y a ceux qui, comme les abonnés, se font servir sur un plateau. Et puis, bon, vous comprendrez que s’abonner c’est aussi collectionner. Vous savez, je connais des gens qui s’abonnent juste pour récupérer les timbres sur les enveloppes et échanger ceux qu’ils ont en double avec leurs amis. Enfin j’dis ça, j’dis rien... Pour conclure, et là je rejoins l’idée de Pierre de Coubertin : l’important c’est de s’abonner. Vous me direz, pourquoi s’abonner à un magazine gratuit ? Eh bien, figurez-vous que la gratuité a un prix monsieur ! D’ailleurs, pour s’abonner on n’a besoin que d’une paire de ciseaux, d’un crayon, d’une enveloppe, d’un chèque, d’un timbre et d’une boîte aux lettres, alors ne venez pas me dire que s’abonner c’est se compliquer la vie !

Très bien, passons à ce nouveau numéro. Permettez-moi de vous demander, Philémon Lévêque, qu’en est-il de ce dossier libre ? L’information est un nouveau pouvoir, n’est-ce pas ? Elle se marchande, se distille et se travestit. Qui maîtrise les canaux de diffusion a alors le pouvoir de sélectionner ceux qui y auront accès ou non. De plus en plus, ces canaux sont numériques et contrôlés par les constructeurs de matériels informatiques et les éditeurs de logiciels. Des domaines où les logiques commerciales commencent à être mises à mal par la culture libre. Ce phénomène, basé sur l’échange de savoir, la gratuité, la libre circulation de l’information et

des compétences, va à l’encontre des logiques libérales dominantes. Comment s’est

créé Linux ? Ou plutôt, comment sont

arrivés les logiciels propriétaires ? Qui sont ces militants du Pingouin ? Y a-t-il une économie viable basée sur la gratuité ? Quels sont les enjeux d’une indépendance dans le choix du matériel et des logiciels ? Ces questions ne resteront pas sans réponses dans ce dossier.

Mais je vois l’heure qui tourne et m’oblige à conclure en vous demandant, Saïd Béarnais : Qu’en est-il des élec-tions européennes ? Je sais vos lecteurs fébriles sur ce sujet brûlant...Oui bon, c’est vrai que nous parlons de l’Europe, hein. Mais l’Europe, ce n’est pas que Bruxelles, si je ne m’abuse... Je crois qu’il est important de faire la différence. Par le passé, nous avons traité du Caucase, du Bélarus, de la Turquie, et autres. Nous entendons l’Europe au sens géographique du terme, c’est une distinction importante. Vous me direz : les frontières évoluent vite... et vous avez raison ! Depuis le 1er janvier 2007, avec l’intégration de la Roumanie et la Bulgarie, dont nous avons parlé dans nos pages également, les choses ont changé... Aujourd’hui, 12 millions de Roms sont des citoyens européens, et ce n’est pas sans poser problème aux institutions. Aux États membres également, qui se renvoient la balle... Mais je digresse. Donc oui, les élections européennes. Que dire ? Oui, il y a un désintérêt général, c’est sûr. Ça me rappelle une anecdote : il y a quelques temps, alors qu’on distribuait notre dernier numéro sur la Suisse, un lecteur me disait : «Ah oui, la Suisse, c’est original, on n’en parle pas beaucoup... Et le prochain dossier, sur les élections européennes ?» Alors si maintenant les lecteurs sont censés deviner nos sujets, vous comprenez... Bon et puis il y a une contrainte technique : nous imprimerons le prochain numéro début juin, or les élections se déroulent du 4 au 7, donc vous comprenez aisément qu’une semaine après la diffusion le journal sera déjà obsolète. Donc voilà, on fera un dossier sur le web... Même si, c’est bien connu : personne ne s’informe sur le web aujourd’hui, c’est un média complètement révolu. D’ailleurs, mon cousin webmaster me disait l’autre jour que...

Merci Saïd, je crois qu’on va être obligé de rendre l’antenne, les lecteurs demandent à lire ce magazine... ici l’édito, à vous la page 4 !

Édito

| | | | | | ||

europa est un magazine d’information européenne basé sur un modèle de journalisme citoyen. vous pouvez y participer : envoyez vos articles/courriers/billets d’humeur/candidatures à[email protected]

de l’actu, des dossiers, des brèves,des photos,des patrons de tricot... sur www.journaleuropa.info

Prochain numéro en juin :hors-série - Surprise !

abonnements page 15europa est imprimé avec des encres végétales sur un papier labellisé pefc**Label européen de protection des forêts

Europa est édité avec l’indispensable soutien de :

| | | | | | ||

Page 4: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

19

20

21

22

25

27

4 / ? I II III ? V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII......................................................

ON NE PARLERA PAS D’EUROPE ! Afin de cerner les rouages et les enjeux des prochaines élections européennes, rien de mieux qu’un observateur bien placé et un acteur expérimenté.

« En France, il y a un rejet général du mode de fonctionnement de l’Union européenne. C’est devenu un enjeu idéologique. » J. Q.

« Les procédures sont folles, et les mécanismes dingues. On ne vend pas un produit que personne ne comprend. » G. O.

OPEN SOURcE,PhiLOSOPhiE DU LibREDavid, la communauté des défenseurs du logiciel libre, lutte contre Goliath, le géant Microsoft. Plus qu’un combat technique, une lutte philosophique.

| | | | | | || | | | | | | ||

Une révolution en marche...

Trust hard de Microsoft

Libre n’est pas gratuit

Éducation et développe... ment

Vous avez dit bazar ? ... Comme c’est bazar

Black-out

28 v.o. allemandNaming, le commerce du stade

3 ÉditoC’est mon choix

1 Couvertureshift. / futurorg.com

8 face à face Spécial

4SommaireVous êtes ici

5CorrespondancesExtraits de boîte aux lettres

12Reportage photo Errance norvégienne

30FictionSurveillance globale

SommaireL’objet : PC, personnal computerMachine parfois capricieuse, plus ou moins docile, qui mérite pour être un poil (brillant) malléable, qu’on la câline, la bichonne. À éviter : les éclats de voix, les insultes... pire, les coups, meilleur moyen de la braquer. On appelle ça un bug.

6Chargez ! Histoire de la satire : Il Fischietto

L’Europe de comptoir

15AbonnementsC’est pas cher...

18 DOSSIeR Libre

16Planche centraleLuca Falcone / lucafalcone.com

Face à Face spécial élections européennes

Jean Quatremer

Gérard Onesta

Page 5: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

Purée. Maaaaazette. Vous m’avez bluffé. J’ai plongé, couru, sauté. J’ai découvert vos fanzines Europa (nouvelle version), il y a seulement 1 mois. Ouais, je sais, j’ai pas été très réactif là-dessus. Mais pour reprendre un auteur célèbre : «Bordel de cul de chèvre, je t’emmerde». Donc mi février, je lis votre article sur Besson. Halluciné ! Dégouté ! Pourtant me dis-je, ça sent l’arnaque à plein nez ce rachat de Besson. Dix pages en plus de bouses cinématographiques, juste après un article sur la politique répressive au Portugal du sud-est, ça fait tache. Encore de bonnes âmes récupérées par l’argent. Putain... Je n’ai finalement pas trouvé le temps de vous mailer, malgré l’envie. Cependant, j’ai parlé de l’affaire à pas mal d’amis. Ce qui a provoqué pas mal de débats d’ailleurs, autour de Besson, et de la liberté d’expression et tout et tout (plus ou moins constructif, selon la dose d’alcool ingérée, et selon l’heure. Je n’oserai dire selon le sexe, même si les filles ont souvent des avis... féminins, pour ne pas dire bizarre). Il y a 6 jours, je tombe sur votre nouveaux fanzine (celui d’avec les 2 panneaux sens interdit superposés). Je commence à interpeller mon ami, un à qui je n’en avais pas encore parlé, pour lui expliquer l’affaire. Et vlan, que je tombe sur la première phrase «c’était un canular». Ah les con. S’en suit la lecture de l’article, des réponses des lecteurs. Bref, chapeau. Et bravo pour votre fanzine, différent, et sacrément bien écrit. Canularement. Rémi

Salut! J’ai trouve ton email sur le site de rencontre et j’ai decide t’ecrire. Tu ne me connais pas... je ne te connais pas aussi... Mais j’ai confiance en destin et j’espere mon destinme donnera une chance... Je voudrais trouver un homme bon, honete et intelligent. Je m’appele Elena. J’ai 26 ans. C’est difficile de parler de moi. Si tu t’interesse de moi, ecris-moi. J’espere tu m’erciras tres bientot. Je t’ecrirai plus de moi et je t’envoyerai mes photos dans ma lettre prochene. Ecris-moi a mon email personnel: [email protected]. Je t’ecris de mon travail et mon boss ne sait pas de cela. Sincierement, Elena.

Bonjour à toute la rédaction. Je lis Europa depuis quelques temps déjà, et je dois dire que le dernier dossier sur la Suisse était quelque peu virulent, et pas forcément justifié. En effet, vous dénoncez une neutralité ambivalente et «à la carte», alors que c’est, vous l’avez compris je crois, pour la défense de la paix dans le monde. Par ailleurs, comme l’a déjà précisé le premier ministre François Fillon, la Suisse n’est pas un paradis fiscal, et doit donc, à ce titre, être différenciée du Lichestein et autres paradis fiscaux en Europe. Et l’actualité nous le confirme jour après jour. Bravo quand même pour les dernières innovations, le format est beaucoup plus plaisant. Bien à vous. Jean, fidèle lecteur.

Bonjour cher Journal Europa, Merci d’enchanter le paysage journalistique de votre plume bien affûtée, et de vos chroniques européennes sans langue de bois, Pourriez-vous penser à diffuser sur le Mans au delà du Barouf? A deux pas du Barouf il y a le Café Berlin, place de l’Eperon, un café franco allemand où on organise des rencontre entre européens, version allemande, version anglaise, version enfants, version étudiants... Donc c’est THE place to be pour Europa, À bon entendeur, Sandra

Bonsoir à la rédaction d’Europa! C’était hier déjà que se trouvait entre mes mains, pour la première fois, votre journal. Je touchais le numéro 20 et je ne savais pas qu’une telle merveille journalistique pouvait exister. C’est avec la joie et l’enthousiasme d’un enfant de 5 ans devant son bac à sable que je me suis mise à vous lire. Peut-être et même sûrement que j’éxagère un peu, mais étant athée, j’aimerais pouvoir croire en une divinité précise au moins pendant une seconde pour pouvoir la remercier de cette fabuleuse découverte. Plus sérieusement, classiquement et simplement, votre journal est joli, très intéressant, original à souhait, avec une pointe de délicieuse ironie et puis... y’a les moutons! J’ai bien essayé de les compter. Je ne savais pas trop si il fallait compter la tête en haut à droite à chaque fois, alors à dire vrai j’ai surtout compter ces moutons pour le fun, parce qu’il est minuit passé et que c’est cool des moutons colorés, qu’ils sont beaux, que mon frère on l’appelle mouton, que votre journal est génial, que vous êtes sûrement géniaux aussi. Bon je m’emporte un peu. Pour en revenir aux moutons, ce qui me plairait le plus c’est d’avoir le bon chiffre, juste pour avoir le bon chiffre. Donc en résumé je veux juste avoir raison, parce que je compte bien m’abonner et payer les 35 euros, ce qui est un bien minime sacrifice pour une telle qualité. Le résultat selon moi est de 30 moutons. Sur ce, très bonne continuation. Chloé.

bonjour! j’ai eu l’occasion de lire qqfois votre revue et je trouve votre ligne éditoriale beaucoup trop marquée à gauche....voire à l’ewtrême gauche ; et je ne souhaite pas être étiqueté politiquement au niveau de mon activité commerciale. salutations cordiales.

Bonjour ! J’ai compté le nombre de moutons (bêh !) présents dans votre dossier sur la Suisse (dans lequel j’ai appris beaucoup de choses très intéressantes) : il y en a 164. Cordialement, Anne-Lise

Correspondancestoi aussi lecteur, fais-nous partager tes états-d’âme,

ton humeur, tes coups de gueule...écris-nous à : [email protected]

I II III IV ? VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII ...................................................... 5 ? /

de - remi L*** / le - 10 mars / à - 11:26objet - Comme qui dirait, sur Le CuL

de - aLberta W*** / le - 19 janvier / à - 08:42objet - C’est diffiCiLe de parLer de moi

de - sandra d*** / le - 10 février / à - 12:21objet - diffusion sur Le mans

de - anne-Lise d*** / le - 10 mars / à - 07:13objet - nombre de moutons

de - jean t*** / le - 17 mars / à - 22:44objet - sur votre traitement de La suisse

de - jean-joseph b*** / le - 15 février / à - 12:38objet - re: propositions, europa numéro 21

de - ChLoé b*** / le - 12 mars / à - 00:37objet - Le Comptage de moutons C’est drôLe et ça ne fait pas dormir

ce mois-ci, l’humeur de chloé :« [...] c’est cool des moutons colorés, qu’ils sont beaux, que mon frère on l’appelle mouton, que votre journal est génial, que vous êtes sûrement géniaux aussi. Bon je m’emporte un peu. [...] »réponse de la rédaction : « oui, oui, chloé, tu t’emportes un peu. mais puisque tu as l’air sympa, voici le numéro de téléphone personnel du président d’europa : 02 40 37 91 91

Je suis né à Hambourg, mais hollandais d’adoption. J’habite au port d’Amsterdam, où y’a des marins qui chantent. Mes trois jambes sont en haut, mais le cirque Barnum n’a pas voulu de moi pour autant. Pas grave, je vis bien avec. Mais cette difformité me prive aussi de la joie de rouler bio à vélo, porté par les alizés, au retour d’un coffee shop. De plus, je suis trop gros pour voguer sur des canaux. Rendez-vous compte, je mesure 56,50 mètres de long ! Pas grave, moi au moins, je peux prendre l’extra large. D’ailleurs, ma taille tourne autour du quintuple XL. C’est que mes plaquettes d’abdos en feraient pâlir plus d’un : de l’acier, comme ma coque ! Quatorze voiles pour plus de 1000m² en tout. La preuve en photo, là, à gauche. J’approche la centaine, je suis né en 1911. Mais j’ai subi pléthore d’opérations de chirurgie esthétique entre 1987 et 1994, ce qui m’a transformé en un vieux monsieur «de croisière», comme on dit. J’aime voyager : l’Antarctique et le Cap de Bonne-Espérance n’ont plus de secrets pour moi. Je fais aussi partie des seuls voiliers à s’être aventurés dans les eaux froides entourant Ushuaia et la Terre de Feu, à la pointe de l’Argentine. Aujourd’hui, je coule une retraite paisible, à jouer les stations météo pour le compte de l’Institut royal de météorologie de Hollande. Mais je ne chôme pas pour autant ! Je relève la température en mer jusqu’à 4 fois par jour. Travailler plus pour gagner plus, ça me connaît. Je suis… je suis… ?

Carte postale

Réponse : L’eUROPa, voilier 3 mâts barque hollandais

Page 6: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

6 / ? I II III IV V ? VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII......................................................

Chargez !Il y a plus d’un siècle et demi, on riait déjà de la bouffonerie politique. Et même si la censure était omniprésente, les charges (de l’italien caricare, «charger», à l’origine du mot caricature) n’y allaient pas de main morte. Entre interdiction et réédition sous un autre nom, publier un journal était une véritable aventure. Ce mois-ci, celle du Fischietto, journal satirique turinois, impliqué dans l’unité italienne.Illustrations tirées de : La Caricature Art et Manifeste du XVIè siècle à nos jours, Bornemann R, Searle R, Roy CL, Genève, Skira, 1974

Les années du Risorgimento marquent aussi la naissance de la presse satirique italienne : Il Diavolo et Il Fischietto à Turin, L’Arlecchino à Naples, Lo Spirito Folletto à Milan, Il Lampione à Florence, Don Pirlone à Rome. Cette explosion de journaux ne repose pas, comme en France et en Angleterre, sur une tradition caricaturale bien établie ; l’estampe satirique n’existait pas en Italie. Mais les journalistes et les pamphlétaires voient dans la lithographie le meilleur moyen pour faire de la satire l’arme efficace dans la lutte politique. Cavour, propulsé en «libérateur», fait pour-tant peur (figure n° 4 : «Nous devons vraiment dire qu’il nous mangera», Il Fischietto, 1858). Les crayons de Redenti et de son beau-frère Virgilio, tous deux dessinateurs au Fischietto, malmènent le maréchal Radetzky, commandant en chef des troupes autrichiennes en Italie. Cavour, Napoléon III et l’Angleterre deviennent alors des puces et des mouches qui le harcèlent (figure n° 5 : Le pauvre ! Hier, piqué dans l’oreille par des puces, aujourd’hui agaçé par des mouches sur le nez : et demain ?, Il Fischietto, 1858). Ces images s’attachent à la déformation de la physionomie, écho de l’ancienne tradition comique italienne.

De 1848 à 1861, l’unité italienne va devenir une réalité dans laquelle l’action d’un homme aura une place prépondérante : celle du comte de Cavour. Son engagement politique débute en 1847 lorsqu’il fonde à Turin le journal Il Risorgimento (nom qui sera ensuite attribué à toute la période pendant laquelle l’Italie a connu son

unité). En 1852, le roi de Piemont et de Sardaigne, Victor-Emmanuel II, autour duquel se fondent tous les espoirs d’une Italie unie, nomme Cavour président du Conseil. Mais pour lancer son entreprise d’unification de la péninsule, Cavour doit trouver des alliés pour l’aider à chasser les Autrichiens du nord-est de l’Italie. Ce sera chose faite lors de l’entrevue de Plombières avec Napoléon III, qui s’engage aux côtés de Cavour (figure n° 1 : L’adjudant et la recrue, Il Fischietto, 1858). Cavour est souvent décrit comme un diplomate hors-pair, qui jongle avec ses homologues européens pour être sûr que sa cause sera défendue, sinon entendue (figure n° 2 : Divertissements européens, Il Fischietto, 1858). Arrivées en Italie, les troupes françaises font le constat d’un pays morcellé (figure n° 3 : Pauvre botte, Il Fischietto, 1859)

1

54

2

3

Page 7: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

* Authentique, Aristide l’a bien dit ! ** C’est ce qu’il aurait dit aujourd’hui, assurément.

““Une des règles de la politique est de ne jamais croire une

information tant qu’elle n’a pas été officiellement démentie.” *

En tout cas, je me suis abonné à Europa quand j’ai vu les pages 15 et 31... **

Aristide BRIANDNé à Nantes en 1862, mort à Paris en 1932.

Le 5 septembre 1929, alors Président du Conseil, et en accord avec son homologue allemand Stresemann, il lance un projet d’union européenne lors d’un discours à l’Assemblée générale de la Société des Nations. Son Mémorandum sur l’organisation d’un régime d’union fédérale euro-péenne, rédigé par Alexis Léger, a.k.a. Saint-John Perse, n’est pas retenu.

Page 8: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

FAcE à FAcE - SPéciAL éLEctiONS EUROPéENNES

europa : Les forts taux d’abstention des dernières élections européennes sont-ils, selon vous, uniquement dus à des carences de communication de la part des institutions européennes, souvent pointées du doigt ?jean quatremer : Non, je ne crois pas. D’abord je ne pense pas que ce soit aux institutions européennes de faire de la communication, même si elles croient qu’elles en sont capables et qu’elles en ont le devoir. C’est aux États membres d’expliquer que désormais une partie des politiques se décide à Bruxelles, même s’il ne s’agit pas des 80% dont on entend souvent parler. Il y a en-viron 35% des décisions, toutes matières confondues, qui se prennent à Bruxelles. Et c’est aux États membres d’expliquer ça à leurs concitoyens. Notamment qu’il est important de participer aux élections européennes puisqu’ils vont élire une partie du législatif européen, le Parlement, l’autre branche du législatif étant le Conseil des ministres, élu indirectement par le biais des élections nationales. Donc je crois que s’il y a une désaffection des Européens pour les élections européennes, c’est tout simplement parce qu’ils n’en comprennent absolument pas la portée politique. J’ai incriminé les responsables politiques qui n’expliquent pas l’importance des enjeux, mais je crois qu’il faut être plus général, on peut incriminer aussi les médias, notamment audiovisuels, qui ne parlent quasiment jamais des questions européennes. C’est une véritable catastrophe en ce qui concerne la télévision, et comme les gens aujourd’hui s’informent principalement par le biais des médias audiovisuels et pas tellement par les médias écrits, il n’est pas étonnant qu’ils ne sachent pas quelle est l’importance des élections européennes. Dernier élément de la chaîne de responsabilités : les enseignants, qui globalement ne font pas leur travail de transmission du savoir et d’explication de ce qu’est l’Union européenne, et de son importance. Je crois que l’enseignement en France reste autocentré, et c’est un véritable problème. Sorti au lendemain du référendum de 2005, le rapport Herbillon a très bien montré la méconnaissance de l’Europe par les

Français. Herbillon avait été sidéré, en se rendant auprès des enseignants, de découvrir que ceux-ci estimaient que ce n’était pas leur mission d’expliquer ce qu’est l’Union européenne, parce qu’ils considéraient que c’était de la propagande. Pour eux, parler d’Europe c’est faire de la propagande pour l’Union européenne. C’est devenu un enjeu idéologique. Donc tous ces éléments mis bout-à-bout expliquent que les Européens ne se mobilisent pas pour les élections européennes. Et c’est vrai pour la France, mais ça l’est aussi pour l’ensemble des autres États membres.

La Présidence française a pourtant énormément communiqué sur les enjeux européens, y compris avec des médias jeunes et modernes. Est-ce que cela a porté ses fruits ?j. q. : La Présidence française a entraîné très peu de sujets supplémentaires sur les chaînes de télévision et de radio. En plus, si vous regardez la manière dont les médias l’ont traitée, c’était moins la Présidence française en dépla-cement que Nicolas Sarkozy en déplacement. C’était plutôt «Nicolas Sarkozy dirige l’Europe», et quand c’est Nicolas Sarkozy qui dirige l’Europe, ça marche ! Donc c’était encore une fois vu à travers un prisme national. En plus, on donne une vision de cette Europe comme étant quasi présidentielle. Or, pour traduire des volon-tés en textes législatifs, il faut en passer par le Parlement européen. Et ça, on ne l’a pas montré. Ce n’est pas de la faute de Nicolas Sarkozy là non plus. Savez-vous qu’il a été le chef de Gouvernement qui a été le plus souvent au Parlement européen de Strasbourg ? Il a reçu à plusieurs reprises l’ensemble des chefs des groupes politiques, c’est lui qui a invité le président du Parlement européen au défilé du 14 juillet 2007, chose qui n’avait jamais été faite auparavant. Donc on ne peut pas incriminer le président de la République. C’est vraiment de la responsabilité des médias qui ont transformé la présidence de l’Union euro-péenne par la France non pas en opportunité d’expliquer

Jean QuatremerJean Quatremer est journaliste au quotidien Libération depuis

1984. Après avoir enseigné à la faculté de Droit de Paris X Nanterre, il s’est tourné vers le journalisme, et a créé un blog

dédié à l’actualité européenne en décembre 2005.

Propos recueillis par

Céline DiaisÉtudiante en journalisme à l’IJBA (Institut de journalisme de Bordeaux Aquitaine)

et Claire CharrierÉtudiante en Master 2 de Sciences politiques à l’Université de Nantes

/ ? I II III IV V VI VII ? IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII......................................................8

Jean Quatremer couvre l’actualité européenne depuis 1990. Il nous explique pourquoi, selon lui, l’Union européenne suscite encore très peu d’intérêt pour les citoyens, et pas beaucoup plus pour les politiques.

“ ”ON NE PARLERA PAS

D’EUROPE !

Page 9: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

davantage ce qu’est l’Europe, mais plutôt comme étant une sorte de marche triomphale de Sarkozy. Parce que c’est trop compliqué, l’Europe, donc on simplifie. Tout ça n’a pas, à mon avis, accru la connaissance de l’Europe par nos concitoyens, et la prise de conscience des enjeux européens. La Présidence en elle-même n’a pas été une réussite de ce point de vue-là.

Qu’en est-il des derniers entrants d’Europe de l’Est ?j. q. : C’est différent, d’abord parce qu’il y avait une vraie aspiration populaire à l’adhésion. En France, nous sommes un peu des enfants gâtés, gras et ventripotents, contents de nous, et nous ne voyons pas bien ce que l’Europe peut nous apporter. On a le sentiment que la France seule dans le monde peut s’en sortir, ce qui n’est pas le cas des pays de l’Est, qui savent très bien quel est le prix de l’isolement, après 40 ans d’occupation soviétique, et qui savent très bien ce qu’ils doivent aux États-Unis, alors que nous avons l’impression d’avoir été libérés seuls et par nos propres forces, comme dirait le général de Gaulle en 1944 à la libération de Paris. Donc nous ne sommes reconnaissants envers personne. Par ailleurs, les pays de l’Est voient arriver l’argent européen. De notre côté, nous avons oublié ce que c’était, l’argent européen. Ça fait 50 ans qu’on en profite, c’est grâce à ça qu’on a une politique agricole commune qui permet à la France d’être l’un des premiers pays exportateurs de produits agricoles dans le monde. Mais ça, les Français ne le voient absolument pas, alors que les pays de l’Est voient la manne européenne, et comment l’Europe transforme leurs pays. Alors vous allez me dire : «certes, pourtant ils ne votent pas plus que dans les pays d’Europe de l’Ouest». En cela vous avez raison, mais c’est plutôt par désenchantement vis-à-vis de la démocratie, parce que la classe politique des pays de l’Est est totalement démonétisée, donc on ne se mobilise pas pour voter parce qu’on ne croit plus en la politique dans ces pays-là. Il y a un rejet dont l’Europe est en quelque sorte une victime collatérale. Nous, c’est par méconnaissance qu’on s’abstient. Eux, c’est par méfiance à l’égard de leur classe politique.

Doit-on s’attendre à une campagne sur des program-mes européens ou sur de fortes personnalités ?j. q. : La campagne électorale ne sera pas européenne. On ne parlera quasiment pas d’Europe, même pas du tout. Elle sera basée uniquement sur des enjeux nationaux. Pour une raison simple, c’est que nous sommes dans une des plus graves crises économiques qu’on ait connues depuis 1945. Donc c’est le thème qui sera au cœur de la campagne, et ça va se transformer en référendum pour ou contre l’équipe gouvernementale en place. Personne n’a d’intérêt à parler d’Europe. Même le Modem, vous verrez, ne parlera quasiment pas d’Europe. Que fait François Bayrou en ce moment ? Il se pose en meilleur opposant de Sarkozy. L’Europe, tout le monde s’en fiche, et ce sera pareil dans les autres pays.

Donc la liste UMP doit s’attendre à un vote sanction en réponse à la politique gouvernementale...j. q. : Évidemment. Cela étant, ils peuvent le craindre, mais ça ne bénéficiera pas au Parti socialiste. Pour ce qui est de la France, ça bénéficiera plutôt aux petites formations protestataires, de gauche et de droite radicale, qui devraient faire à peu près 30% des voix. Ce sont eux qui tireront les marrons du feu. Ce qui est intéressant, c’est que tous les gouvernements en place, sauf en Italie et en Allemagne, risquent d’être sanctionnés, ce qui peut aboutir à un par-lement qui n’aura jamais été autant à droite.

Comment expliquez-vous que le Parlement européen soit considéré par les politiques français comme un

bagne, alors que c’est une reconnaissance pour les politiques de l’Est notamment ?j. q. : En France, il y a une sous-estimation totale de ce qu’est le Parlement européen par les politiques hexa-gonaux. C’est bien la preuve qu’eux-mêmes ignorent la façon dont ça fonctionne. Ils ignorent que le Parlement européen a des pouvoirs de plus en plus importants, bien plus que ceux de la Commission européenne. C’est vrai-ment l’interlocuteur privilégié du Conseil des ministres et du Conseil européen. Donc on envoie à Bruxelles et à Strasbourg des seconds couteaux. En plus, en France, par tradition, nous avons du mal à comprendre le pou-voir parlementaire, qu’on a oublié. Ça fait 50 ans qu’on vit avec un pouvoir exécutif qui est de plus en plus fort. Aujourd’hui, c’est presque caricatural, mais il n’y a même plus de gouvernement. Pendant 40 ans, nous n’avons plus eu de parlement. Désormais, c’est même le gouvernement qui est supprimé et tout le pouvoir est concentré à l’Élysée. Donc un Parlement, c’est quelque chose qui nous est pro-fondément étranger maintenant. Ça explique aussi que les politiques français ne cherchent pas à aller au Parlement européen, et préfèrent se consacrer à la politique natio-nale. Dernier élément qui explique cette désaffection : les Français aiment bien les affrontements théâtralisés – on a hérité cela de la Révolution française – on aime bien avoir des débats droite/gauche extrêmement simplificateurs, extrêmement violents, alors qu’au Parlement européen, cela fonctionne plutôt sur le mode bipartisan, modèle de la démocratie américaine. C’est-à-dire que vous avez des votes qui peuvent réunir la droite et la gauche selon le sujet. C’est quelque chose qui est profondément étranger à notre culture nationale. La culture du compromis en France est quelque chose qu’on n’accepte pas. Pour un Français, le compromis sonne comme compromission, et comme trahison. C’est un rejet général du mode de fonctionnement de l’Union européenne. Et ça, on l’a bien vu au moment du référendum de 2005 puisqu’on n’a pas réussi à le vendre, à vendre l’Europe, parce qu’on n’arrêtait pas de dire : «c’est un compromis», et donc on avait l’impression de trahir nos convictions.

Pour que les enjeux européens prennent le dessus sur les enjeux nationaux, pensez-vous qu’il serait plus adapté de mettre en place une élection européenne unique à la place des 27 élections nationales ?j. q. : C’est évidemment l’avenir. C’est comme les référendums nationaux : avec un enjeu européen, avoir des référendums nationaux n’a absolument aucun sens. C’est donner un droit de blocage à chaque pays et ce n’est plus possible à l’avenir. Il faudrait de véritables élections transeuropéennes. Mais il faudrait procéder par étapes. On pourrait dans un premier temps créer des circonscriptions transnationales, pour toutes les régions frontalières, nombreuses dans l’Union européenne. Une seconde étape serait par exemple que tous les pays aient l’obligation de prévoir un vote par pré-férence. L’électeur pourrait ainsi choisir ses têtes de liste. Cela permettrait d’amoindrir le pouvoir des partis politiques dans la composition des listes. La dernière étape pourrait être de donner le pouvoir de composition des listes aux partis transeuropéens : le PSE (Parti socialiste européen), le PPE (Parti populaire européen), le parti démocrate, le parti libéral, etc. Mais cela prendra du temps. On pourrait procéder par étapes, et vider ainsi une grande partie de ces dimensions nationales.

«En France, nous sommes un peu des enfants gâtés, gras et ventripotents, contents de nous, et nous ne voyons pas bien ce que l’Europe peut nous apporter.»

I II III IV V VI VII VIII ? X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII ...................................................... 9 ? /

........WWW............................................................ Retrouvez le blog de Jean Quatremer «Les coulisses de Bruxelles» :bruxelles.blogs.liberation.fr

Retrouvez l’intégralité de l’interview de Jean Quatremer sur :www.journaleuropa.infoRubrique «Europdirect»

Page 10: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

10 / ? I II III IV V VI VII VIII IX ? XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII......................................................

europa : Les forts taux d’abstention des dernières élections européennes sont-ils, selon vous, uni-quement dus à des carences de communication de la part des institutions européennes, ou des États membres ?gérard onesta : N’attendez pas les États membres, ils refusent que la politique de l’information devienne une compétence européenne. Ils n’ont pas envie de communi-quer. Parce qu’aucun gouvernement n’a envie de perdre les commandes de son agenda politique. Si tel ou tel État veut faire une grande campagne sur sa politique industrielle, il ne veut pas qu’au même moment, l’Europe décide que la priorité de communication, c’est le commerce ou l’agricul-ture. Quant aux taux de participation, ils déclinent réguliè-rement depuis 1979, année où le Parlement européen a été élu pour la première fois au suffrage universel. De plus de 50%, nous sommes passés à presque 40% de participation. Et on ne peut pas dire que ce soient les anciens pays les plus en cause, parce que chez les nouveaux pays, comme la Bulgarie, la Roumanie ou la Pologne, on a parfois atteint 10% de participation.

Quelles en sont les raisons selon vous ?g. o. : Je pense que les causes de ces abstentions sont mul-tiples. D’abord parce que l’Europe, c’est complexe. Elle gagnerait à être simplifiée. Et n’en déplaise à M. Sarkozy, le prochain traité de Lisbonne, que j’appelle pourtant de mes vœux pour le pouvoir qu’il donne aux citoyens, est tout sauf un traité simplifié. Il est plus épais que le Traité constitutionnel européen qui n’était déjà pas une sinécure en la matière, et il est totalement illisible. Par ailleurs, j’ai l’impression que certains eurocrates (fonctionnaires des institutions européennes, ndlr) ne sont pas mécontents d’être les seuls à comprendre la complexité européenne. Le problème, c’est que cette complexité est devenue folle. Je ne vous parle pas des 400 comités théodules qui entourent les institutions européennes et qui sont chargés de travailler sur les différentes politiques. Là-dedans, les procédures sont

d’une opacité folle, et les mécanismes budgétaires sont ab-solument dingues. Je ne vous parle pas non plus du système de révision des traités, et des systèmes de déclinaison dans les parlements nationaux une fois qu’une directive est arrê-tée... Les calendriers et les procédures sont variables. Donc conclusion : c’est complexe, et on ne vend pas un produit que personne ne comprend. Le football est globalement plus populaire que le rugby parce que les règles sont plus simples, et c’est un Toulousain qui vous le dit !

D’ailleurs, l’Europe est un peu à l’image du rugby, moins médiatisé que le foot...g. o. : C’est vrai, les médias ont du mal à tenir en haleine leur public, à cause du tempo européen qui est très lent. Par exemple, quand le commissaire européen des trans-ports décide de faire une grande consultation dans toute la société civile, qu’il fait les propositions au Conseil... Alors commence le match de ping-pong entre le Parlement et le Conseil pour élaborer le texte... La directive est arrêtée, puis elle est envoyée aux gouvernements nationaux qui ont X années pour la décliner... Certains sont en retard et ont donc des pénalités – d’ailleurs la France est championne d’Europe des pénalités de retard pour non-transposition des directives européennes. Quand la loi est arrêtée au niveau national, il faut encore des décrets d’application. Donc entre le moment où les choses sont décidées à l’échelle européenne et le moment ou elles sont appliquées dans le quotidien des gens, il peut se passer des années, voire des dizaines d’années. Autant vous dire que pour un média, tenir en haleine le public n’est pas chose facile. Après, on vient m’engueuler quand Gaz de France est privatisé ! Mais je réponds aux journalistes : «Chers amis, il y a quatre ou cinq ans, je vous abreuvais de communiqués en vous disant “c’est maintenant que ça se passe”, ça ne vous intéressait pas parce que ça n’impactait pas le quotidien des gens, et c’est maintenant que vous vous y intéressez, mais c’est trop tard, le Parlement est passé à autre chose.» Le Parlement n’est plus en train de parler du gaz, il parle de La Poste, qui débarquera peut-être dans

Propos recueillis par

Andrea OrtnerÉtudiante en Master franco-allemand «culture et médias» à l’Université de Düsseldorf

et Céline DiaisÉtudiante en journalisme à l’IJBA (Institut de journalisme de Bordeaux Aquitaine)

Gérard OnestaDéputé vert et Vice-président du Parlement européen depuis 1999, il termine son 4ème

mandat et ne se représente pas en 2009. Partisan du fédéralisme, il a défendu le Plan A+ suite à la victoire du «non» au référendum de mai 2005. À ne pas confondre avec

Claude Onesta, son cousin, entraîneur de l’équipe de France de handball.

Gérard Onesta fréquente le Parlement européen depuis vingt ans. Il nous explique comment la crise va jouer sur le scrutin et pourquoi il faut avoir peur des populistes des deux bords.

“ ”DES éLEctiONS

DéFOULOiRS

Page 11: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

I II III IV V VI VII VIII IX X ? XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII ...................................................... 11 ? /

votre quotidien dans trois ou quatre ans. Le tempo pose un gros problème à la restitution de l’information.

Quelle est la part de responsabilité des médias ?g. o. : Elle est importante, évidemment. Alors que n’importe quelle chaîne de télévision allemande a deux ou trois perma-nents à Bruxelles, la plus grande chaîne télévisée française – ou qui se croit telle – (TF1), n’a aucun correspondant à Bruxelles. PAS UN SEUL. Alors que les deux tiers des textes votés à l’Assemblée nationale ne sont plus que la simple déclinaison des directives européennes que j’ai votées avec mes collègues au Parlement de Strasbourg.

À vous entendre, l’Europe est omniprésente...g. o. : Mais l’Europe détermine tout ! Regardez autour de vous : l’électricité qui vous éclaire, c’est l’Europe, le télé-phone avec lequel on parle, c’est l’Europe, le droit social ou l’absence de droit social dans le monde de l’entreprise, c’est l’Europe qui fonctionne ou qui ne fonctionne pas, les transports, c’est l’Europe, et ce que vous allez manger ce soir, c’est l’Europe ! L’Europe est partout. Mais à aucun moment on vous dit que le Parlement français est devenu une aimable chambre d’enregistrement provinciale, même si c’est le cas ! Un exemple : le 13 juin 2004, jour des précédentes élections au Parlement européen. Ce soir-là, sur la principale chaîne de télévision française, est invité le premier ministre de l’époque, un certain Raffarin, qui vient pour commenter, à la mi-temps, le match de football France-Angleterre. Il est Premier ministre d’un Gouvernement dont toute la politique est décidée par un machin qui s’appelle l’Europe, et il ne dit pas un mot alors qu’on est en soirée électorale. C’est hallucinant ! Allez ramer derrière pour expliquer l’importance de l’Europe !

L’Europe n’est pas une priorité politique en France ?g. o. : La classe politique n’a pas intégré le fait européen. Elle se renouvelle très lentement en France. Par exemple, pendant la Présidence française de l’UE, le ministre en charge des Affaires européennes était secrétaire d’État auprès du quai d’Orsay, c’est-à-dire auprès du ministre des Affaires étrangères. L’Europe est encore vécue comme «les Affaires étrangères», alors que ce sont deux tiers des textes qui sont votés à l’Assemblée nationale ! Il y a deux ou trois ans, la France et l’Allemagne avaient, à quelques mois de différence, des élections législatives. L’Allemagne comptait 99 dépu-tés européens, dont aucun n’était candidat au Bundestag. Alors que plus d’un tiers des députés européens français étaient candidats pour aller à l’Assemblée nationale. Pour eux, tout se joue à l’Assemblée nationale. Les médias sont présents, donc s’ils veulent exister politiquement, c’est là qu’ils vont.

C’est pour ça que le Parlement européen est vécu comme un bagne par les députés français ?g. o. : Exactement ! C’est un problème français. On envoie au placard européen les ministres dont on ne veut plus. Je ne cite personne, suivez mon regard... Les autres pays vien-nent chercher la fine fleur de leurs politiques au Parlement européen, alors que la France y envoie les canards boiteux dont on veut se débarrasser.

Revenons aux élections. Doit-on s’attendre à une campagne sur des thématiques européennes ou nationales ?g. o. : Je donnerais n’importe quoi pour que la campagne qui vient soit européenne, mais je sais déjà qu’elle ne le sera pas. Parce que le mode de scrutin n’est pas européen, c’est la juxtaposition de 27 scrutins nationaux. On a créé,

avec le Traité de Nice, les partis politiques européens. Les Verts ont été les premiers, en 2004 pour les précédentes élections, à tenter l’expérience d’une même campagne, avec les mêmes affiches et les mêmes slogans, dans les 25 pays à l’époque. Même le Parlement européen, dans sa campagne institutionnelle, ne l’avait pas fait. Cette année et pour la première fois, le Parlement a décidé de faire une campagne uniforme, très pédagogique d’ailleurs. Ce qui changerait, c’est qu’une part des députés soit élue sur une liste transna-tionale. On obligerait ainsi les partis à faire des campagnes européennes. Ça va venir, mais pas tout de suite.

Pourquoi pas tout de suite ?g. o. : Parce qu’on n’a pas le Traité de Lisbonne, qui dit qu’en plus d’élire votre parlementaire européen, vous élisez en même temps le président de la Commission européenne, contrairement à ce qui se fait actuellement, où ce sont les chefs d’États réunis en conclave, à huis clos, de manière totalement déconnectée et sans consulter personne, qui jouent à «ce-sera-toi-qui-t’y-collera». Ce coup-ci, c’est tombé sur le Portugais, ç’aurait pu tomber sur n’importe qui d’autre. Les familles politiques devront donc désigner leurs candidats champions à la présidence de la Commission. Ça va changer la nature du scrutin. Mais malheureusement ce n’est pas pour tout de suite. On sera encore sur une campagne «pour ou contre» Sarko, «pour ou contre» Zapatero, etc. Et ça va être le défouloir, «ces salauds qui s’en mettent plein les poches avec la crise» ! Les élections européennes ont toujours été des élections défouloirs. Il n’y a qu’à regarder dans le rétroviseur : une fois ce sont les fachos qui ont la prime, une fois ce sont les chasseurs, puis les écolos, une fois c’est Bernard Tapie, ce coup-ci ça va être l’extrême gauche. On le sait déjà !

La faute à qui ?g. o. : La faute à «ces salauds de capitalistes qui ont mis la planète sans dessus-dessous»... alors les gens vont voter en conséquence. Mais ce n’est pas le but du jeu, qui est d’élire les parlementaires qui vont décider le droit européen pendant cinq ans. Les populistes de gauche vont dire : «Y’a qu’à, faut qu’on, il suffit de pendre le dernier capitaliste avec les tripes du dernier liberaliste», ce qui me semble un peu simpliste, c’est le moins qu’on puisse dire. Face à ça, on peut craindre un autre bloc émergent, ceux qui disent que «l’Europe, ça ne fonctionne pas, c’est elle qui nous a mis dans la crise, c’est cette garce de Bruxelles qui est complice de la mondialisation rampante, etc.» Alors que l’Europe est le seul outil que l’on a pour contrer les crises globales. On a un macro-chantier, il nous faut un macro-outil.

Donc une poussée des extrêmes, mais pas forcé-ment une vague bleue...g. o. : Ce qu’on appelle la vague bleue est déjà en train de se fractionner. Les conservateurs britanniques ont décidé de quitter le PPE (Parti populaire européen), donc pas loin de 35 députés en moins. Les libéraux sont en train de se fractionner entre les libéraux d’un côté et les démocrates de l’autre. Donc tout ce qui était «la droite bien pensante européenne» risque d’être fractionnée. Par contre, on va avoir une montée des deux populismes : le populisme de gauche et le populisme nationaliste de droite qui ont en commun de détester l’Europe et de vendre gratis des idées simplistes.

«Une fois ce sont les fachos qui ont la prime, puis les chasseurs, les écolos, ou Bernard Tapie. Ce coup-ci ça va être l’extrême gauche, on le sait déjà !»

........WWW............................................................ Retrouvez l’intégralité de l’interview de Gérard Onesta sur :www.journaleuropa.infoRubrique «Europdirect»

FAcE à FAcE - SPéciAL éLEctiONS EUROPéENNES

Page 12: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

Funi

cula

ire

de B

erge

n, ju

in 2

006

norvégienne

Page 13: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

....................................................Photos : Emma Lecoq

série «errance», Norvège, 2006....................................................norvégienne St

ockh

olm

, avr

il 20

06

Page 14: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

Côt

e no

rvég

ienn

e, M

olde

, avr

il 20

06In

the d

eath

car,

Gei

rang

erfjo

rden

, avr

il 20

06.

Page 15: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

Abonneun Anments

tous les Abonnements sont vAlAbles

numéros récemment parus :

juin 2008 : hors-série n°3 / les situationnistes en 66octobre 2008 : n°18 / liberté de la presse en europedécembre 2008 : n°19 / ong : entre idéal et réalitéfévrier 2009 : n°20 / petites et grandes histoires de la suisseavril 2009 : n°21 / vous avez dans les mains : open sourcecalendrier des prochaines parutions :juin 2009 : hors-série n°4 / octobre 2009 : n°22 / décembre 2009 : n°23 / février 2010 : n°24 / avril 2010 : n°25 / juin 2010 : hors-série n°5

à l’unité .............................................................................................................................................................................................................. 35 €[une enveloppe, pour moi et moi seul(e)]

5 exemplaires ............................................................................................................................................................................................. 85 €[un colis pour moi et 4 de mes proches]

15 exemplaires .......................................................................................................................................................................................... 180 €[un colis pour ma famille, mes voisins, etc.]

25 exemplaires ....................................................................................................................................................................................... 275 €[un colis pour mes élèves, mes collègues, etc.]

je m’abonne à partir du n° .....................................................

ma formule :

mon règlement : par chèque, à l’ordre de :europa production nantes, chemin de la censive / bp 4121444312 nantes cedex 3

par virement, nous contacter : tel / 09 51 82 31 34courriel / [email protected]

nom : ..........................................................................................................................................................................................................................................

prénom : ..............................................................................................................................................................................................................................

Adresse postAle : .................................................................................................................................................................................................

.............................................................................................................................................................................................................................................................

code postAl : ...............................................................................................................................................................................................................

ville : .........................................................................................................................................................................................................................................

courriel : ..........................................................................................................................................................................................................................

mes coordonnées :

Page 16: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez
Page 17: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

Illustration : Luca Falcone www.lucafalcone.com / agent : www.valerieoualid.com

Page 18: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

*NULL;****}****return*p_vout;}/********************************************************************************vout_Close:*Close*a*vout*created*by*vout_Create.*********************************************************************************You*HAVE*to*call*it*on*vout*created*by*vout_Create*before*vlc_object_release.***You*should*NEVER*call*it*on*vout*not*obtained*though*vout_Create***(like*with*vout_Request*or*vlc_object_find.)***You*can*use*vout_CloseAndRelease()*as*a*convenient*method.******************************************************************************/void*vout_Close(*vout_thread_t**p_vout*){****assert(*p_vout*);****vlc_object_kill(*p_vout*);****vlc_thread_join(*p_vout*);****module_Unneed(*p_vout,*p_vout*>p_module*);****p_vout*>p_module*=*NULL;}/***/static*void*vout_Destructor(*vlc_object_t***p_this*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****/**Make*sure*the*vout*was*stopped*first**/****assert(*!p_vout*>p_module*);****/***/****spu_Destroy(*p_vout*>p_spu*);****/**Destroy*the*locks**/****vlc_mutex_destroy(*&p_vout*>picture_lock*);****vlc_mutex_destroy(*&p_vout*>change_lock*);****vlc_mutex_destroy(*&p_vout*>vfilter_lock*);****free(*p_vout*>psz_filter_chain*);****config_ChainDestroy(*p_vout*>p_cfg*);#ifndef*__APPLE__****vout_thread_t**p_another_vout;****/**This*is*a*dirty*hack*mostly*for*Linux,*where*there*is*no*way*to*get*the*******GUI*back*if*you*closed*it*while*playing*video.*This*is*solved*in*******Mac*OS*X,*where*we*have*this*novelty*called*menubar,*that*will*always*******allow*you*access*to*the*applications*main*functionality.*They*should*try*******that*on*linux*sometime.**/****p_another_vout*=*vlc_object_find(*p_this*>p_libvlc,**************************************VLC_OBJECT_VOUT,*FIND_ANYWHERE*);****if(*p_another_vout*==*NULL*)********var_SetBool(*p_this*>p_libvlc,*„intf*show“,*true*);****else********vlc_object_release(*p_another_vout*);#endif}/*******InitThread:*initialize*video*output*thread*************This*function*is*called*from*RunThread*and*performs*the*second*step*of*the***initialization.*It*returns*0*on*success.*Note*that*the*thread‘s*flag*are*not***modified*inside*this*function.***XXX*You*have*to*enter*it*with*change_lock*taken.******************************************************************************/static*int*ChromaCreate(*vout_thread_t**p_vout*);static*void*ChromaDestroy(*vout_thread_t**p_vout*);static*bool*ChromaIsEqual(*const*picture_heap_t**p_output,*const*picture_heap_t**p_render*){*****if(*!vout_ChromaCmp(*p_output*>i_chroma,*p_render*>i_chroma*)*)*********return*false;*****if(*p_output*>i_chroma*!=*FOURCC_RV15*&&*********p_output*>i_chroma*!=*FOURCC_RV16*&&*********p_output*>i_chroma*!=*FOURCC_RV24*&&*********p_output*>i_chroma*!=*FOURCC_RV32*)*********return*true;*****return*p_output*>i_rmask*==*p_render*>i_rmask*&&************p_output*>i_gmask*==*p_render*>i_gmask*&&************p_output*>i_bmask*==*p_render*>i_bmask;}static*int*InitThread(*vout_thread_t**p_vout*){****int*i,*i_aspect_x,*i_aspect_y;#ifdef*STATS****p_vout*>c_loops*=*0;#endif****/**Initialize*output*method,*it*allocates*direct*buffers*for*us**/****if(*p_vout*>pf_init(*p_vout*)*)********return*VLC_EGENERIC;****if(*!I_OUTPUTPICTURES*)****{********msg_Err(*p_vout,*„plugin*was*unable*to*allocate*at*least*„*************************„one*direct*buffer“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****if(*I_OUTPUTPICTURES*>*VOUT_MAX_PICTURES*)****{********msg_Err(*p_vout,*„plugin*allocated*too*many*direct*buffers,*„*************************„our*internal*buffers*must*have*overflown.“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****msg_Dbg(*p_vout,*„got*%i*direct*buffer(s)“,*I_OUTPUTPICTURES*);****AspectRatio(*p_vout*>fmt_render.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*in*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_render.i_width,*p_vout*>fmt_render.i_height,*************p_vout*>fmt_render.i_x_offset,*p_vout*>fmt_render.i_y_offset,*************p_vout*>fmt_render.i_visible_width,*************p_vout*>fmt_render.i_visible_height,*************(char*)&p_vout*>fmt_render.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_render.i_sar_num,*p_vout*>fmt_render.i_sar_den*);****AspectRatio(*p_vout*>fmt_in.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*user*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_in.i_width,*p_vout*>fmt_in.i_height,*************p_vout*>fmt_in.i_x_offset,*p_vout*>fmt_in.i_y_offset,*************p_vout*>fmt_in.i_visible_width,*************p_vout*>fmt_in.i_visible_height,*************(char*)&p_vout*>fmt_in.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_in.i_sar_num,*p_vout*>fmt_in.i_sar_den*);****if(*!p_vout*>fmt_out.i_width*||*!p_vout*>fmt_out.i_height*)****{********p_vout*>fmt_out.i_width*=*p_vout*>fmt_out.i_visible_width*=************p_vout*>output.i_width;********p_vout*>fmt_out.i_height*=*p_vout*>fmt_out.i_visible_height*=************p_vout*>output.i_height;********p_vout*>fmt_out.i_x_offset*=**p_vout*>fmt_out.i_y_offset*=*0;********p_vout*>fmt_out.i_aspect*=*p_vout*>output.i_aspect;********p_vout*>fmt_out.i_chroma*=*p_vout*>output.i_chroma;****}****if(*!p_vout*>fmt_out.i_sar_num*||*!p_vout*>fmt_out.i_sar_num*)****{********p_vout*>fmt_out.i_sar_num*=*p_vout*>fmt_out.i_aspect**************p_vout*>fmt_out.i_height;********p_vout*>fmt_out.i_sar_den*=*VOUT_ASPECT_FACTOR**************p_vout*>fmt_out.i_width;****}****vlc_ureduce(*&p_vout*>fmt_out.i_sar_num,*&p_vout*>fmt_out.i_sar_den,*****************p_vout*>fmt_out.i_sar_num,*p_vout*>fmt_out.i_s a r _ d e n , * 0 * ) ; * * * * A s p e c t R a t i o ( * p _ v o u t * > f m t _ o u t . i _ a s p e c t , * & i _ a s p e c t _ x , * & i _ a s p e c t _ y * ) ; * * * * m s g _ D b g ( * p _ v o u t , * „ p i c t u r e * o u t * % i x % i * ( % i , % i , % i x % i ) , * „ * * * * * * * * * * * * * „ c h r o m a * % 4 . 4 s , * a r * % i : % i , * s a r * % i : % i “ , * * * * * * * * * * * * *p_vout*>fmt_out.i_width,*p_vout*>fmt_out.i_height,*************p_vout*>fmt_out.i_x_offset,*p_vout*>fmt_out.i_y_offset,*************p_vout*>fmt_out.i_visible_width,*************p_vout*>fmt_out.i_visible_height,*************(char*)&p_vout*>fmt_out.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_out.i_sar_num,*p_vout*>fmt_out.i_sar_den*);****/**FIXME*removed*the*need*of*both*fmt_**and*heap*infos**/****/**Calculate*shifts*from*system*updated*masks**/****PictureHeapFixRgb(*&p_vout*>render*);****VideoFormatImportRgb(*&p_vout*>fmt_render,*&p_vout*>render*);****PictureHeapFixRgb(*&p_vout*>output*);****VideoFormatImportRgb(*&p_vout*>fmt_out,*&p_vout*>output*);****/**Check*whether*we*managed*to*create*direct*buffers*similar*to*******the*render*buffers,*ie*same*size*and*chroma**/****if(*(*p_vout*>output.i_width*==*p_vout*>render.i_width*)*****&&*(*p_vout*>output.i_height*==*p_vout*>render.i_height*)*****&&*(*ChromaIsEqual(*&p_vout*>output,*&p_vout*>render*)*)*)****{********/**Cool*!*We*have*direct*buffers,*we*can*ask*the*decoder*to***********directly*decode*into*them*!*Map*the*first*render*buffers*to***********the*first*direct*buffers,*but*keep*the*first*direct*buffer***********for*memcpy*operations**/********p_vout*>b_direct*=*1;********for(*i*=*1;*i*<*VOUT_MAX_PICTURES;*i++*)********{************if(*p_vout*>p_picture[*i*].i_type*!=*DIRECT_PICTURE*&&****************I_RENDERPICTURES*>=*VOUT_MIN_DIRECT_PICTURES***1*&&****************p_vout*>p_picture[*i***1*].i_type*==*DIRECT_PICTURE*)************{****************/**We*have*enough*direct*buffers*so*there‘s*no*need*to*******************try*to*use*system*memory*buffers.**/****************break;************}************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;********}********msg_Dbg(*p_vout,*„direct*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*1*%i“,*****************VOUT_MAX_PICTURES***2,*VOUT_MAX_PICTURES***1*);****}****else****{********/**Rats...*Something*is*wrong*here,*we*could*not*find*an*output***********plugin*able*to*directly*render*what*we*decode.*See*if*we*can***********find*a*chroma*plugin*to*do*the*conversion**/********p_vout*>b_direct*=*0;********if(*ChromaCreate(*p_vout*)*)********{********p_vout*>pf_end(*p_vout*);************return*VLC_EGENERIC;********}********msg_Dbg(*p_vout,*„indirect*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*%i*%i“,*****************VOUT_MAX_PICTURES***1,*I_OUTPUTPICTURES,*****************I_OUTPUTPICTURES*+*VOUT_MAX_PICTURES***1*);********/**Append*render*buffers*after*the*direct*buffers**/********for(*i*=*I_OUTPUTPICTURES;*i*<*2***VOUT_MAX_PICTURES;*i++*)********{************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;************/**Check*if*we*have*enough*render*pictures**/************if(*I_RENDERPICTURES*==*VOUT_MAX_PICTURES*)****************break;********}****}****/**Link*pictures*back*to*their*heap**/****for(*i*=*0*;*i*<*I_RENDERPICTURES*;*i++*)****{********PP_RENDERPICTURE[*i*]*>p_heap*=*&p_vout*>render;****}****for(*i*=*0*;*i*<*I_OUTPUTPICTURES*;*i++*)****{********PP_OUTPUTPICTURE[*i*]*>p_heap*=*&p_vout*>output;****}****return*VLC_SUCCESS;}/********************************************************************************RunThread:*video*output*thread*************************************Video*output*thread.*This*function*does*only*returns*when*the*thread*is***terminated.*It*handles*the*pictures*arriving*in*the*video*heap*and*the***display*device*events.***t*******p_last_picture*=*NULL;*******************/**last*picture**/****subpicture_t****p_subpic*=*NULL;*******************/**subpicture*pointer**/****bool************b_drop_late;****int*************i_displayed*=*0,*i_lost*=*0;****/********Initialize*thread******/****vlc_mutex_lock(*&p_vout*>change_lock*);****p_vout*>b_error*=*InitThread(*p_vout*);****b_drop_late*=*var_CreateGetBool(*p_vout,*„drop*late*frames“*);****/**signal*the*creation*of*the*vout**/****vlc_thread_ready(*p_vout*);****if(*p_vout*>b_error*)****{********EndThread(*p_vout*);********vlc_mutex_unlock(*&p_vout*>change_lock*);********return*NULL;****}****vlc_object_lock(*p_vout*);****if(*p_vout*>b_title_show*)********DisplayTitleOnOSD(*p_vout*);****/********Main*loop***it*is*not*executed*if*an*error*occurred*during*******initialization******/****while(*vlc_object_alive(*p_vout*)*&&*!p_vout*>b_error*)****{********/**Initialize*loop*variables**/********const*mtime_t*current_date*=*mdate();********picture_t**p_picture*=*NULL;********picture_t**p_filtered_picture;********mtime_t*display_date*=*0;********picture_t**p_directbuffer;********input_thread_t**p_input;********int*i_index;#if*0********p_vout*>c_loops++;********if(*!(p_vout*>c_loops*%*VOUT_STATS_NB_LOOPS)*)********{************msg_Dbg(*p_vout,*„picture*heap:*%d/%d“,*********************I_RENDERPICTURES,*p_vout*>i_heap_size*);********}#endif********/**Update*statistics**/********p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);********if(*p_input*)********{************vlc_mutex_lock(*&p_input*>p*>counters.counters_lock*);************stats_UpdateInteger(*p_vout,*p_input*>p*>counters.p_lost_pictures,*********************************i_lost*,*NULL);************stats_UpdateInteger(*p_vout,*********************************p_input*>p*>counters.p_displayed_pictures,*********************************i_displayed*,*NULL);************i_displayed*=*i_lost*=*0;************vlc_mutex_unlock(*&p_input*>p*>counters.counters_lock*);************vlc_object_release(*p_input*);********}********/************Find*the*picture*to*display*(the*one*with*the*earliest*date).***********This*operation*does*not*need*lock,*since*only*READY_PICTUREs***********are*handled.**/********for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)********{************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];************if(*p_pic*>i_status*==*READY_PICTURE*&&****************(*p_picture*==*NULL*||*p_pic*>date*<*display_date*)*)************{****************p_picture*=*p_pic;****************display_date*=*p_picture*>date;************}********}********if(*p_picture*)********{************/**If*we*met*the*last*picture,*parse*again*to*see*whether*there*is***************a*more*appropriate*one.**/************if(*p_picture*==*p_last_picture*)************{****************for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)****************{********************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];********************if(*p_pic*>i_status*==*READY_PICTURE*&&************************p_pic*!=*p_last_picture*&&************************(*p_picture*==*p_last_picture*||*p_pic*>date*<*display_date*)*)********************{************************p_picture*=*p_pic;************************display_date*=*p_picture*>date;********************}****************}************}************/**If*we*found*better*than*the*last*picture,*destroy*it**/************if(*p_last_picture*&&*p_picture*!=*p_last_picture*)************{****************DropPicture(*p_vout,*p_last_picture*);****************p_last_picture*=*NULL;************}************/**Compute*FPS*rate**/************p_vout*>p_fps_sample[*p_vout*>c_fps_samples++*%*VOUT_FPS_SAMPLES*]****************=*display_date;************if(*!p_picture*>b_force*&&****************p_picture*!=*p_last_picture*&&****************display_date*<*current_date*+*p_vout*>render_time*&&****************b_drop_late*)************{****************/**Picture*is*late:*it*will*be*destroyed*and*the*thread*******************will*directly*choose*the*next*picture**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„late*picture*skipped*(%“PRId64“)“,**********************************current_date***display_date*);****************continue;************}************if(*display_date*>****************current_date*+*p_vout*>i_pts_delay*+*VOUT_BO-GUS_DELAY*)************{****************/**Picture*is*waaay*too*early:*it*will*be*destroyed**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„vout*warning:*early*picture*skipped*„**************************„(%“PRId64“)“,*display_date***current_date****************************p_vout*>i_pts_delay*);****************continue;************}************if(*display_date*>*current_date*+*VOUT_DISPLAY_DELAY*)************{****************/**A*picture*is*ready*to*be*rendered,*but*its*rendering*date*******************is*far*from*the*current*one*so*the*thread*will*perform*an*******************empty*loop*as*if*no*picture*were*found.*The*picture*state*******************is*unchanged**/****************p_picture****=*NULL;****************display_date*=*0;************}************else*if(*p_picture*==*p_last_picture*)************{****************/**We*are*asked*to*repeat*the*previous*picture,*but*we*first*******************wait*for*a*couple*of*idle*loops**/****************if(*i_idle_loops*<*4*)****************{********************p_picture****=*NULL;********************display_date*=*0;****************}****************else****************{********************/**We*set*the*display*date*to*something*high,*otherwise***we‘ll*have*lots*of*problems*with*late*pictures**/********************display_date*=*current_date*+*p_vout*>render_time;****************}************}********}********if(*p_picture*==*NULL*)************i_idle_loops++;********p_filtered_picture*=*NULL;********if(*p_picture*)************p_filtered_picture*=*filter_chain_VideoFilter(*p_vout*>p_vf2_chain,***********************************************************p_picture*);********if(*p_filtered_picture*&&*p_vout*>b_snapshot*)********{************p_vout*>b_snapshot*=*false;************vout_Snapshot(*p_vout,*p_filtered_picture*);********}********/************Check*for*subpictures*to*display**********/********if(*display_date*>*0*)********{************p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);************p_subpic*=*spu_SortSubpictures(*p_vout*>p_spu,*display_date,********************************************p_input*?*var_GetInteger(*p_input,*„state“*)*==*PAUSE_S*:*false*);************if(*p_input*)****************vlc_object_release(*p_input*);********}********/************Perform*rendering**********/********i_displayed++;********p_directbuffer*=*vout_RenderPicture(*p_vout,*p_filtered_picture,*p_subpic*);********/************Call*the*plugin*specific*rendering*method*if*there*is*one**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*&&*p_vout*>pf_render*)********{************/**Render*the*direct*buffer*returned*by*vout_RenderPicture**/************p_vout*>pf_render(*p_vout,*p_directbuffer*);********}********/************Sleep,*wake*up**********/********if(*display_date*!=*0*&&*p_directbuffer*!=*NULL*)********{************mtime_t*current_render_time*=*mdate()***current_date;************/**if*render*time*is*very*large*we*don‘t*include*it*in*the*mean**/************if(*current_render_time*<*p_vout*>render_time*+****************VOUT_DISPLAY_DELAY*)************{****************/**Store*render*time*using*a*sliding*mean*weighting*to*******************current*value*in*a*3*to*1*ratio*/****************p_vout*>render_time**=*3;****************p_vout*>render_time*+=*current_render_time;****************p_vout*>render_time*>>=*2;************}********}********/**Give*back*change*lock**/********vlc_mutex_unlock(*&p_vout*>change_lock*);********vlc_object_unlock(*p_vout*);********/**Sleep*a*while*or*until*a*given*date**/********if(*display_date*!=*0*)********{************/**If*there*are*filters*in*the*chain,*better*give*them*the*picture***************in*advance**/************if(*!p_vout*>psz_filter_chain*||*!*p_vout*>psz_filter_chain*)************{****************mwait(*display_date***VOUT_MWAIT_TOLERANCE*);************}********}********else********{************msleep(*VOUT_IDLE_SLEEP*);********}********/**On*awakening,*take*back*lock*and*send*immediately*picture***********to*display.**/********vlc_object_lock(*p_vout*);********/**Note:*vlc_object_alive()*could*be*false*here,*and*we***********could*be*dead**/********vlc_mutex_lock(*&p_vout*>change_lock*);********/************Display*the*previously*rendered*picture**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*)********{************/**Display*the*direct*buffer*returned*by*vout_RenderPicture**/************if(*p_vout*>pf_display*)****************p_vout*>pf_display(*p_vout,*p_directbuffer*);************/**Tell*the*vout*this*was*the*last*picture*and*that*it*does*not***************need*to*be*forced*anymore.**/************p_last_picture*=*p_picture;************p_last_picture*>b_force*=*false;********}********/**Drop*the*filtered*picture*if*created*by*video*filters**/********if(*p_filtered_picture*!=*NULL*&&*p_filtered_picture*!=*p_picture*)************DropPicture(*p_vout,*p_filtered_picture*);********if(*p_picture*!=*NULL*)********{************/**Reinitialize*idle*loop*count**/************i_idle_loops*=*0;********}********/************Check*events*and*manage*thread**********/********if(*p_vout*>pf_manage*&&*p_vout*>pf_manage(*p_vout*)*)********{************/**A*fatal*error*occurred,*and*the*thread*must*terminate***************immediately,*without*displaying*anything***setting*b_error*to*1***************causes*the*immediate*end*of*the*main*while()*loop.**/************//*FIXME*pf_end************p_vout*>b_error*=*1;************break;********}********if(*p_vout*>i_changes*&*VOUT_SIZE_CHANGE*)********{************/**this*must*only*happen*when*the*vout*plugin*is*incapable*of***************rescaling*the*picture*itself.*In*this*case*we*need*to*destroy***************the*current*picture*buffers*and*recreate*new*ones*with*the*right***************dimensions**/************int*i;************p_vout*>i_changes*&=*~VOUT_SIZE_CHANGE;************assert(*!p_vout*>b_direct*);************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************for(*i*=*0;*i*<*I_OUTPUTPICTURES;*i++*)*****************p_vout*>p_picture[*i*].i_status*=*FREE_PICTURE;************I_OUTPUTPICTURES*=*0;************if(*p_vout*>pf_init(*p_vout*)*)************{****************msg_Err(*p_vout,*„cannot*resize*display“*);****************/**FIXME:*pf_end*will*be*called*again*in*EndThread()**/****************p_vout*>b_error*=*1;************}************vlc_mutex_unlock(*&p_vout*>picture_lock*);************/**Need*to*reinitialise*the*chroma*plugin.*Since*we*might*need***************resizing*too*and*it‘s*not*sure*that*we*already*had*it,***************recreate*the*chroma*plugin*chain*from*scratch.**/************/**dionoea**/************if(*ChromaCreate(*p_vout*)*)************{****************msg_Err(*p_vout,*„WOW*THIS*SUCKS*BIG*TIME!!!!!“*);****************p_vout*>b_error*=*1;************}************if(*p_vout*>b_error*)****************break;********}********if(*p_vout*>i_changes*&*VOUT_PICTURE_BUFFERS_CHANGE*)********{************/**This*happens*when*the*picture*buffers*need*to*be*recreated.***************This*is*useful*on*multimonitor*displays*for*instance.*****************************Warning:*This*only*works*when*the*vout*creates*only*1*picture***************buffer!!**/************p_vout*>i_changes*&=*~VOUT_PICTURE_BUFFERS_CHANGE;************if(*!p_vout*>b_direct*)****************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************I_OUTPUTPICTURES*=*I_RENDERPICTURES*=*0;************p_vout*>b_error*=*InitThread(*p_vout*);************if(*p_vout*>b_error*)****************msg_Err(*p_vout,*„InitThread*after*VOUT_PICTURE_BUFFERS_CHANGE*failed\n“*);************vlc_mutex_unlock(*&p_vout*>picture_lock*);************if(*p_vout*>b_error*)****************break;********}********/**Check*for*„video*filter2“*changes**/********vlc_mutex_lock(*&p_vout*>vfilter_lock*);********if(*p_vout*>psz_vf2*)********{************es_format_t*fmt;************es_format_Init(*&fmt,*VIDEO_ES,*p_vout*>fmt_render.i_chroma*);************fmt.video*=*p_vout*>fmt_render;************filter_chain_Reset(*p_vout*>p_vf2_chain,*&fmt,*&fmt*);************if(*filter_chain_AppendFromString(*p_vout*>p_vf2_chain,***********************************************p_vout*>psz_vf2*)*<*0*)****************msg_Err(*p_vout,*„Video*filter*chain*creation*failed“*);************free(*p_vout*>psz_vf2*);************p_vout*>psz_vf2*=*NULL;********}********vlc_mutex_unlock(*&p_vout*>vfilter_lock*);****}****/********Error*loop***wait*until*the*thread*destruction*is*requested******/****if(*p_vout*>b_error*)********ErrorThread(*p_vout*);****/**End*of*thread**/****CleanThread(*p_vout*);****EndThread(*p_vout*);****vlc_mutex_unlock(*&p_vout*>change_lock*);****vlc_object_unlock(*p_vout*);****return*NULL;}/********************************************************************************ErrorThread:*RunThread()*error*loop*******This*function*is*called*when*an*error*occurred*during*thread*main‘s*loop.***The*thread*can*still*receive*feed,*but*must*be*ready*to*terminate*as*soon***as*possible.**********/static*void*ErrorThread(*vout_thread_t**p_vout*){****/**Wait*until*a*`die‘*order**/****while(*vlc_object_alive(*p_vout*)*)********vlc_object_wait(*p_vout*);}/********************************************************************************CleanThread:*clean*up*after*InitThread*********This*function*is*called*after*a*sucessful***initialization.*It*frees*all*resources*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**********/static*void*CleanThread(*vout_thread_t**p_vout*){****int*****i_index;****************************************/**index*in*heap**/****if(*!p_vout*>b_direct*)********ChromaDestroy(*p_vout*);****/**Destroy*all*remaining*pictures**/****for(*i_index*=*0;*i_index*<*2***VOUT_MAX_PICTURES*+*1;*i_index++*)****{********if*(*p_vout*>p_picture[i_index].i_type*==*MEMORY_PICTURE*)********{************free(*p_vout*>p_picture[i_index].p_data_orig*);********}****}****/**Destroy*translation*tables**/****if(*!p_vout*>b_error*)********p_vout*>pf_end(*p_vout*);}/****w**********EndThread:*thread*destruction******This*function*is*called*when*the*thread*ends.***It*frees*all*resources*not*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**************/static*void*EndThread(*vout_thread_t**p_vout*){#ifdef*STATS****{********struct*tms*cpu_usage;********times(*&cpu_usage*);********msg_Dbg(*p_vout,*„cpu*usage*(user:*%d,*system:*%d)“,*****************cpu_usage.tms_utime,*cpu_usage.tms_stime*);****}#endif****/**FIXME*does*that*function**really**need*to*be*called*inside*the*thread*?**/****/**Destroy*subpicture*unit**/****spu_Attach(*p_vout*>p_spu,*VLC_OBJECT(p_vout),*false*);****/**Destroy*the*video*filters2**/****filter_chain_Delete(*p_vout*>p_vf2_chain*);}/**Thread*helpers**/static*picture_t**ChromaGetPicture(*filter_t**p_filter*){****picture_t**p_pic*=*(picture_t**)p_filter*>p_owner;****p_filter*>p_owner*=*NULL;****return*p_pic;}static*int*ChromaCreate(*vout_thread_t**p_vout*){****static*const*char*typename[]*=*„chroma“;****filter_t**p_chroma;****/**Choose*the*best*module**/****p_chroma*=*p_vout*>p_chroma*=********vlc_custom_create(*p_vout,*sizeof(filter_t),*VLC_OBJECT_GENERIC,***************************typename*);****vlc_object_attach(*p_chroma,*p_vout*);****/**TODO:*Set*the*fmt_in*and*fmt_out*stuff*here**/****p_chroma*>fmt_in.video*=*p_vout*>fmt_render;****p_chroma*>fmt_out.video*=*p_vout*>fmt_out;****VideoFormatImportRgb(*&p_chroma*>fmt_in.video,*&p_vout*>render*);****VideoFormatImportRgb(*&p_chroma*>fmt_out.video,*&p_vout*>output*);****p_chroma*>p_module*=*module_Need(*p_chroma,*„video*filter2“,*NULL,*0*);****if(*p_chroma*>p_module*==*NULL*)****{********msg_Err(*p_vout,*„no*chroma*module*for*%4.4s*to*%4.4s*i=%dx%d*o=%dx%d“,*****************(char*)&p_vout*>render.i_chroma,*****************(char*)&p_vout*>output.i_chroma,*****************p_chroma*>fmt_in.video.i_width,*p_chroma*>fmt_in.video.i_height,*****************p_chroma*>fmt_out.video.i_width,*p_chroma*>fmt_out.video.i_height*****************);********vlc_object_release(*p_vout*>p_chroma*);********p_vout*>p_chroma*=*NULL;********return*VLC_EGENERIC;****}****p_chroma*>pf_vout_buffer_new*=*ChromaGetPicture;****return*VLC_SUCCESS;}static*void*ChromaDestroy(*vout_thread_t**p_vout*){****assert(*!p_vout*>b_direct*);****if(*!p_vout*>p_chroma*)********return;****module_Unneed(*p_vout*>p_chroma,*p_vout*>p_chroma*>p_module*);****vlc_object_release(*p_vout*>p_chroma*);****p_vout*>p_chroma*=*NULL;}static*void*DropPicture(*vout_thread_t**p_vout,*picture_t**p_picture*){****vlc_mutex_lock(*&p_vout*>picture_lock*);****if(*p_picture*>i_refcount*)****{********/**Pretend*we*displayed*the*picture,*but*don‘t*destroy***********it*since*the*decoder*might*still*need*it.**/********p_picture*>i_status*=*DISPLAYED_PICTURE;****}****else****{********/**Destroy*the*picture*without*displaying*it**/********p_picture*>i_status*=*DESTROYED_PICTURE;********p_vout*>i_heap_size**;****}****vlc_mutex_unlock(*&p_vout*>picture_lock*);}/**following*functions*are*local**/static*int*ReduceHeight(*int*i_ratio*){****int*i_dummy*=*VOUT_ASPECT_FACTOR;****int*i_pgcd**=*1;****if(*!i_ratio*)****{********return*i_pgcd;****}****/**VOUT_ASPECT_FACTOR*is*(2^7***3^3***5^3),*we*just*check*for*2,*3*and*5**/****while(*!(i_ratio*&*1)*&&*!(i_dummy*&*1)*)****{********i_ratio*>>=*1;********i_dummy*>>=*1;********i_pgcd**<<=*1;****}****while(*!(i_ratio*%*3)*&&*!(i_dummy*%*3)*)****{********i_ratio*/=*3;********i_dummy*/=*3;********i_pgcd***=*3;****}****while(*!(i_ratio*%*5)*&&*!(i_dummy*%*5)*)****{********i_ratio*/=*5;********i_dummy*/=*5;********i_pgcd***=*5;****}****return*i_pgcd;}static*void*AspectRatio(*int*i_aspect,*int**i_aspect_x,*int**i_aspect_y*){****unsigned*int*i_pgcd*=*ReduceHeight(*i_aspect*);*****i_aspect_x*=*i_aspect*/*i_pgcd;*****i_aspect_y*=*VOUT_ASPECT_FACTOR*/*i_pgcd;}/*****This*function*copies*all*RGB*informations*from*a*picture_heap_t*into***a*video_format_t**/static*void*VideoFormatImportRgb(*video_format_t**p_fmt,*const*picture_heap_t**p_heap*){****p_fmt*>i_rmask*=*p_heap*>i_rmask;****p_fmt*>i_gmask*=*p_heap*>i_gmask;****p_fmt*>i_bmask*=*p_heap*>i_bmask;****p_fmt*>i_rrshift*=*p_heap*>i_rrshift;****p_fmt*>i_lrshift*=*p_heap*>i_lrshift;****p_fmt*>i_rgshift*=*p_heap*>i_rgshift;****p_fmt*>i_lgshift*=*p_heap*>i_lgshift;****p_fmt*>i_rbshift*=*p_heap*>i_rbshift;****p_fmt*>i_lbshift*=*p_heap*>i_lbshift;}/*****This*funtion*copes*all*RGB*informations*from*a*video_format_t*into***a*picture_heap_t**/static*void*VideoFormatExportRgb(*const*video_format_t**p_fmt,*picture_heap_t**p_heap*){****p_heap*>i_rmask*=*p_fmt*>i_rmask;****p_heap*>i_gmask*=*p_fmt*>i_gmask;****p_heap*>i_bmask*=*p_fmt*>i_bmask;****p_heap*>i_rrshift*=*p_fmt*>i_rrshift;****p_heap*>i_lrshift*=*p_fmt*>i_lrshift;****p_heap*>i_rgshift*=*p_fmt*>i_rgshift;****p_heap*>i_lgshift*=*p_fmt*>i_lgshift;****p_heap*>i_rbshift*=*p_fmt*>i_rbshift;****p_heap*>i_lbshift*=*p_fmt*>i_lbshift;}/*****This*function*computes*rgb*shifts*from*masks**/static*void*PictureHeapFixRgb(*picture_heap_t**p_heap*){****video_format_t*fmt;****/***/****fmt.i_chroma*=*p_heap*>i_chroma;****VideoFormatImportRgb(*&fmt,*p_heap*);****/***/****video_format_FixRgb(*&fmt*);****VideoFormatExportRgb(*&fmt,*p_heap*);}/******Helper*thread*for*object*variables*callbacks.***Only*used*to*avoid*deadlocks*when*using*the*video*embedded*mode.*******/typedef*struct*suxor_thread_t{****VLC_COMMON_MEMBERS****input_thread_t**p_input;}*suxor_thread_t;static*void**SuxorRestartVideoES(*vlc_object_t***p_vlc_t*){****suxor_thread_t**p_this*=*(suxor_thread_t**)*p_vlc_t;****/**Now*restart*current*video*stream**/****int*val*=*var_GetInteger(*p_this*>p_input,*„video*es“*);****if(*val*>=*0*)****{********var_SetInteger(*p_this*>p_input,*„video*es“,**VIDEO_ES*);********var_SetInteger(*p_this*>p_input,*„video*es“,*val*);****}****vlc_object_release(*p_this*>p_input*);****vlc_object_release(*p_this*);****return*NULL;}/******object*variables*callbacks:*a*bunch*of*object*variables*are*used*by*the***interfaces*to*interact*with*the*vout.***-*********/static*int*DeinterlaceCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****input_thread_t**p_input;****vlc_value_t*val;****char**psz_mode*=*newval.psz_string;****char**psz_filter,**psz_deinterlace*=*NULL;****(void)psz_cmd;*(void)oldval;*(void)p_data;****var_Get(*p_vout,*„vout*filter“,*&val*);****psz_filter*=*val.psz_string;****if(*psz_filter*)*psz_deinterlace*=*strstr(*psz_filter,*„deinterlace“*);****if(*!psz_mode*||*!*psz_mode*)****{********if(*psz_deinterlace*)********{************char**psz_src*=*psz_deinterlace*+*sizeof(„deinterlace“)***1;************if(*psz_src[0]*==*‚:‘*)*psz_src++;************memmove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ *NULL;****}****return*p_vout;}/********************************************************************************vout_Close:*Close*a*vout*created*by*vout_Create.*********************************************************************************You*HAVE*to*call*it*on*vout*created*by*vout_Create*before*vlc_object_release.***You*should*NEVER*call*it*on*vout*not*obtained*though*vout_Create***(like*with*vout_Request*or*vlc_object_find.)***You*can*use*vout_CloseAndRelease()*as*a*convenient*method.******************************************************************************/void*vout_Close(*vout_thread_t**p_vout*){****assert(*p_vout*);****vlc_object_kill(*p_vout*);****vlc_thread_join(*p_vout*);****module_Unneed(*p_vout,*p_vout*>p_module*);****p_vout*>p_module*=*NULL;}/***/static*void*vout_Destructor(*vlc_object_t***p_this*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****/**Make*sure*the*vout*was*stopped*first**/****assert(*!p_vout*>p_module*);****/***/****spu_Destroy(*p_vout*>p_spu*);****/**Destroy*the*locks**/****vlc_mutex_destroy(*&p_vout*>picture_lock*);****vlc_mutex_destroy(*&p_vout*>change_lock*);****vlc_mutex_destroy(*&p_vout*>vfilter_lock*);****free(*p_vout*>psz_filter_chain*);****config_ChainDestroy(*p_vout*>p_cfg*);#ifndef*__APPLE__****vout_thread_t**p_another_vout;****/**This*is*a*dirty*hack*mostly*for*Linux,*where*there*is*no*way*to*get*the*******GUI*back*if*you*closed*it*while*playing*video.*This*is*solved*in*******Mac*OS*X,*where*we*have*this*novelty*called*menubar,*that*will*always*******allow*you*access*to*the*applications*main*functionality.*They*should*try*******that*on*linux*sometime.**/****p_another_vout*=*vlc_object_find(*p_this*>p_libvlc,**************************************VLC_OBJECT_VOUT,*FIND_ANYWHERE*);****if(*p_another_vout*==*NULL*)********var_SetBool(*p_this*>p_libvlc,*„intf*show“,*true*);****else********vlc_object_release(*p_another_vout*);#endif}/*******InitThread:*initialize*video*output*thread*************This*function*is*called*from*RunThread*and*performs*the*second*step*of*the***initialization.*It*returns*0*on*success.*Note*that*the*thread‘s*flag*are*not***modified*inside*this*function.***XXX*You*have*to*enter*it*with*change_lock*taken.******************************************************************************/static*int*ChromaCreate(*vout_thread_t**p_vout*);static*void*ChromaDestroy(*vout_thread_t**p_vout*);static*bool*ChromaIsEqual(*const*picture_heap_t**p_output,*const*picture_heap_t**p_render*){*****if(*!vout_ChromaCmp(*p_output*>i_chroma,*p_render*>i_chroma*)*)*********return*false;*****if(*p_output*>i_chroma*!=*FOURCC_RV15*&&*********p_output*>i_chroma*!=*FOURCC_RV16*&&*********p_output*>i_chroma*!=*FOURCC_RV24*&&*********p_output*>i_chroma*!=*FOURCC_RV32*)*********return*true;*****return*p_output*>i_rmask*==*p_render*>i_rmask*&&************p_output*>i_gmask*==*p_render*>i_gmask*&&************p_output*>i_bmask*==*p_render*>i_bmask;}static*int*InitThread(*vout_thread_t**p_vout*){****int*i,*i_aspect_x,*i_aspect_y;#ifdef*STATS****p_vout*>c_loops*=*0;#endif****/**Initialize*output*method,*it*allocates*direct*buffers*for*us**/****if(*p_vout*>pf_init(*p_vout*)*)********return*VLC_EGENERIC;****if(*!I_OUTPUTPICTURES*)****{********msg_Err(*p_vout,*„plugin*was*unable*to*allocate*at*least*„*************************„one*direct*buffer“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****if(*I_OUTPUTPICTURES*>*VOUT_MAX_PICTURES*)****{********msg_Err(*p_vout,*„plugin*allocated*too*many*direct*buffers,*„*************************„our*internal*buffers*must*have*overflown.“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****msg_Dbg(*p_vout,*„got*%i*direct*buffer(s)“,*I_OUTPUTPICTURES*);****AspectRatio(*p_vout*>fmt_render.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*in*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_render.i_width,*p_vout*>fmt_render.i_height,*************p_vout*>fmt_render.i_x_offset,*p_vout*>fmt_render.i_y_offset,*************p_vout*>fmt_render.i_visible_width,*************p_vout*>fmt_render.i_visible_height,*************(char*)&p_vout*>fmt_render.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_render.i_sar_num,*p_vout*>fmt_render.i_sar_den*);****AspectRatio(*p_vout*>fmt_in.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*user*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_in.i_width,*p_vout*>fmt_in.i_height,*************p_vout*>fmt_in.i_x_offset,*p_vout*>fmt_in.i_y_offset,*************p_vout*>fmt_in.i_visible_width,*************p_vout*>fmt_in.i_visible_height,*************(char*)&p_vout*>fmt_in.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_in.i_sar_num,*p_vout*>fmt_in.i_sar_den*);****if(*!p_vout*>fmt_out.i_width*||*!p_vout*>fmt_out.i_height*)****{********p_vout*>fmt_out.i_width*=*p_vout*>fmt_out.i_visible_width*=************p_vout*>output.i_width;********p_vout*>fmt_out.i_height*=*p_vout*>fmt_out.i_visible_height*=************p_vout*>output.i_height;********p_vout*>fmt_out.i_x_offset*=**p_vout*>fmt_out.i_y_offset*=*0;********p_vout*>fmt_out.i_aspect*=*p_vout*>output.i_aspect;********p_vout*>fmt_out.i_chroma*=*p_vout*>output.i_chroma;****}****if(*!p_vout*>fmt_out.i_sar_num*||*!p_vout*>fmt_out.i_sar_num*)****{********p_vout*>fmt_out.i_sar_num*=*p_vout*>fmt_out.i_aspect**************p_vout*>fmt_out.i_height;********p_vout*>fmt_out.i_sar_den*=*VOUT_ASPECT_FACTOR**************p_vout*>fmt_out.i_width;****}****vlc_ureduce(*&p_vout*>fmt_out.i_sar_num,*&p_vout*>fmt_out.i_sar_den,*****************p_vout*>fmt_out.i_sar_n u m , * p _ v o u t * > f m t _ o u t . i _ s a r _ d e n , * 0 * ) ; * * * * A s p e c t R a t i o ( * p _ v o u t * > f m t _ o u t . i _ a s p e c t , * & i _ a s p e c t _ x , * & i _ a s p e c t _ y * ) ; * * * * m s g _ D b g ( * p _ v o u t , * „ p i c t u r e * o u t * % i x % i * ( % i , % i , % i x % i ) , * „ * * * * * * * * * * * * * „ c h r o m a * % 4 . 4 s , * a r * % i : % i , * s a r * % i : % i “ , * * * * * * * * * * * * *p_vout*>fmt_out.i_width,*p_vout*>fmt_out.i_height,*************p_vout*>fmt_out.i_x_offset,*p_vout*>fmt_out.i_y_offset,*************p_vout*>fmt_out.i_visible_width,*************p_vout*>fmt_out.i_visible_height,*************(char*)&p_vout*>fmt_out.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_out.i_sar_num,*p_vout*>fmt_out.i_sar_den*);****/**FIXME*removed*the*need*of*both*fmt_**and*heap*infos**/****/**Calculate*shifts*from*system*updated*masks**/****PictureHeapFixRgb(*&p_vout*>render*);****VideoFormatImportRgb(*&p_vout*>fmt_render,*&p_vout*>render*);****PictureHeapFixRgb(*&p_vout*>output*);****VideoFormatImportRgb(*&p_vout*>fmt_out,*&p_vout*>output*);****/**Check*whether*we*managed*to*create*direct*buffers*similar*to*******the*render*buffers,*ie*same*size*and*chroma**/****if(*(*p_vout*>output.i_width*==*p_vout*>render.i_width*)*****&&*(*p_vout*>output.i_height*==*p_vout*>render.i_height*)*****&&*(*ChromaIsEqual(*&p_vout*>output,*&p_vout*>render*)*)*)****{********/**Cool*!*We*have*direct*buffers,*we*can*ask*the*decoder*to***********directly*decode*into*them*!*Map*the*first*render*buffers*to***********the*first*direct*buffers,*but*keep*the*first*direct*buffer***********for*memcpy*operations**/********p_vout*>b_direct*=*1;********for(*i*=*1;*i*<*VOUT_MAX_PICTURES;*i++*)********{************if(*p_vout*>p_picture[*i*].i_type*!=*DIRECT_PICTURE*&&****************I_RENDERPICTURES*>=*VOUT_MIN_DIRECT_PICTURES***1*&&****************p_vout*>p_picture[*i***1*].i_type*==*DIRECT_PICTURE*)************{****************/**We*have*enough*direct*buffers*so*there‘s*no*need*to*******************try*to*use*system*memory*buffers.**/****************break;************}************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;********}********msg_Dbg(*p_vout,*„direct*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*1*%i“,*****************VOUT_MAX_PICTURES***2,*VOUT_MAX_PICTURES***1*);****}****else****{********/**Rats...*Something*is*wrong*here,*we*could*not*find*an*output***********plugin*able*to*directly*render*what*we*decode.*See*if*we*can***********find*a*chroma*plugin*to*do*the*conversion**/********p_vout*>b_direct*=*0;********if(*ChromaCreate(*p_vout*)*)********{********p_vout*>pf_end(*p_vout*);************return*VLC_EGENERIC;********}********msg_Dbg(*p_vout,*„indirect*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*%i*%i“,*****************VOUT_MAX_PICTURES***1,*I_OUTPUTPICTURES,*****************I_OUTPUTPICTURES*+*VOUT_MAX_PICTURES***1*);********/**Append*render*buffers*after*the*direct*buffers**/********for(*i*=*I_OUTPUTPICTURES;*i*<*2***VOUT_MAX_PICTURES;*i++*)********{************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;************/**Check*if*we*have*enough*render*pictures**/************if(*I_RENDERPICTURES*==*VOUT_MAX_PICTURES*)****************break;********}****}****/**Link*pictures*back*to*their*heap**/****for(*i*=*0*;*i*<*I_RENDERPICTURES*;*i++*)****{********PP_RENDERPICTURE[*i*]*>p_heap*=*&p_vout*>render;****}****for(*i*=*0*;*i*<*I_OUTPUTPICTURES*;*i++*)****{********PP_OUTPUTPICTURE[*i*]*>p_heap*=*&p_vout*>output;****}****return*VLC_SUCCESS;}/********************************************************************************RunThread:*video*output*thread*************************************Video*output*thread.*This*function*does*only*returns*when*the*thread*is***terminated.*It*handles*the*pictures*arriving*in*the*video*heap*and*the***display*device*events.***t*******p_last_picture*=*NULL;*******************/**last*picture**/****subpicture_t****p_subpic*=*NULL;*******************/**subpicture*pointer**/****bool************b_drop_late;****int*************i_displayed*=*0,*i_lost*=*0;****/********Initialize*thread******/****vlc_mutex_lock(*&p_vout*>change_lock*);****p_vout*>b_error*=*InitThread(*p_vout*);****b_drop_late*=*var_CreateGetBool(*p_vout,*„drop*late*frames“*);****/**signal*the*creation*of*the*vout**/****vlc_thread_ready(*p_vout*);****if(*p_vout*>b_error*)****{********EndThread(*p_vout*);********vlc_mutex_unlock(*&p_vout*>change_lock*);********return*NULL;****}****vlc_object_lock(*p_vout*);****if(*p_vout*>b_title_show*)********DisplayTitleOnOSD(*p_vout*);****/********Main*loop***it*is*not*executed*if*an*error*occurred*during*******initialization******/****while(*vlc_object_alive(*p_vout*)*&&*!p_vout*>b_error*)****{********/**Initialize*loop*variables**/********const*mtime_t*current_date*=*mdate();********picture_t**p_picture*=*NULL;********picture_t**p_filtered_picture;********mtime_t*display_date*=*0;********picture_t**p_directbuffer;********input_thread_t**p_input;********int*i_index;#if*0********p_vout*>c_loops++;********if(*!(p_vout*>c_loops*%*VOUT_STATS_NB_LOOPS)*)********{************msg_Dbg(*p_vout,*„picture*heap:*%d/%d“,*********************I_RENDERPICTURES,*p_vout*>i_heap_size*);********}#endif********/**Update*statistics**/********p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);********if(*p_input*)********{************vlc_mutex_lock(*&p_input*>p*>counters.counters_lock*);************stats_UpdateInteger(*p_vout,*p_input*>p*>counters.p_lost_pictures,*********************************i_lost*,*NULL);************stats_UpdateInteger(*p_vout,*********************************p_input*>p*>counters.p_displayed_pictures,*********************************i_displayed*,*NULL);************i_displayed*=*i_lost*=*0;************vlc_mutex_unlock(*&p_input*>p*>counters.counters_lock*);************vlc_object_release(*p_input*);********}********/************Find*the*picture*to*display*(the*one*with*the*earliest*date).***********This*operation*does*not*need*lock,*since*only*READY_PICTUREs***********are*handled.**/********for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)********{************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];************if(*p_pic*>i_status*==*READY_PICTURE*&&****************(*p_picture*==*NULL*||*p_pic*>date*<*display_date*)*)************{****************p_picture*=*p_pic;****************display_date*=*p_picture*>date;************}********}********if(*p_picture*)********{************/**If*we*met*the*last*picture,*parse*again*to*see*whether*there*is***************a*more*appropriate*one.**/************if(*p_picture*==*p_last_picture*)************{****************for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)****************{********************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];********************if(*p_pic*>i_status*==*READY_PICTURE*&&************************p_pic*!=*p_last_picture*&&************************(*p_picture*==*p_last_picture*||*p_pic*>date*<*display_date*)*)********************{************************p_picture*=*p_pic;************************display_date*=*p_picture*>date;********************}****************}************}************/**If*we*found*better*than*the*last*picture,*destroy*it**/************if(*p_last_picture*&&*p_picture*!=*p_last_picture*)************{****************DropPicture(*p_vout,*p_last_picture*);****************p_last_picture*=*NULL;************}************/**Compute*FPS*rate**/************p_vout*>p_fps_sample[*p_vout*>c_fps_samples++*%*VOUT_FPS_SAMPLES*]****************=*display_date;************if(*!p_picture*>b_force*&&****************p_picture*!=*p_last_picture*&&****************display_date*<*current_date*+*p_vout*>render_time*&&****************b_drop_late*)************{****************/**Picture*is*late:*it*will*be*destroyed*and*the*thread*******************will*directly*choose*the*next*picture**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„late*picture*skipped*(%“PRId64“)“,**********************************current_date***display_date*);****************continue;************}************if(*display_date*>****************current_date*+*p_vout*>i_pts_delay*+*VOUT_BO-GUS_DELAY*)************{****************/**Picture*is*waaay*too*early:*it*will*be*destroyed**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„vout*warning:*early*picture*skipped*„**************************„(%“PRId64“)“,*display_date***current_date****************************p_vout*>i_pts_delay*);****************continue;************}************if(*display_date*>*current_date*+*VOUT_DISPLAY_DELAY*)************{****************/**A*picture*is*ready*to*be*rendered,*but*its*rendering*date*******************is*far*from*the*current*one*so*the*thread*will*perform*an*******************empty*loop*as*if*no*picture*were*found.*The*picture*state*******************is*unchanged**/****************p_picture****=*NULL;****************display_date*=*0;************}************else*if(*p_picture*==*p_last_picture*)************{****************/**We*are*asked*to*repeat*the*previous*picture,*but*we*first*******************wait*for*a*couple*of*idle*loops**/****************if(*i_idle_loops*<*4*)****************{********************p_picture****=*NULL;********************display_date*=*0;****************}****************else****************{********************/**We*set*the*display*date*to*something*high,*otherwise***we‘ll*have*lots*of*problems*with*late*pictures**/********************display_date*=*current_date*+*p_vout*>render_time;****************}************}********}********if(*p_picture*==*NULL*)************i_idle_loops++;********p_filtered_picture*=*NULL;********if(*p_picture*)************p_filtered_picture*=*filter_chain_VideoFilter(*p_vout*>p_vf2_chain,***********************************************************p_picture*);********if(*p_filtered_picture*&&*p_vout*>b_snapshot*)********{************p_vout*>b_snapshot*=*false;************vout_Snapshot(*p_vout,*p_filtered_picture*);********}********/************Check*for*subpictures*to*display**********/********if(*display_date*>*0*)********{************p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);************p_subpic*=*spu_SortSubpictures(*p_vout*>p_spu,*display_date,********************************************p_input*?*var_GetInteger(*p_input,*„state“*)*==*PAUSE_S*:*false*);************if(*p_input*)****************vlc_object_release(*p_input*);********}********/************Perform*rendering**********/********i_displayed++;********p_directbuffer*=*vout_RenderPicture(*p_vout,*p_filtered_picture,*p_subpic*);********/************Call*the*plugin*specific*rendering*method*if*there*is*one**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*&&*p_vout*>pf_render*)********{************/**Render*the*direct*buffer*returned*by*vout_RenderPicture**/************p_vout*>pf_render(*p_vout,*p_directbuffer*);********}********/************Sleep,*wake*up**********/********if(*display_date*!=*0*&&*p_directbuffer*!=*NULL*)********{************mtime_t*current_render_time*=*mdate()***current_date;************/**if*render*time*is*very*large*we*don‘t*include*it*in*the*mean**/************if(*current_render_time*<*p_vout*>render_time*+****************VOUT_DISPLAY_DELAY*)************{****************/**Store*render*time*using*a*sliding*mean*weighting*to*******************current*value*in*a*3*to*1*ratio*/****************p_vout*>render_time**=*3;****************p_vout*>render_time*+=*current_render_time;****************p_vout*>render_time*>>=*2;************}********}********/**Give*back*change*lock**/********vlc_mutex_unlock(*&p_vout*>change_lock*);********vlc_object_unlock(*p_vout*);********/**Sleep*a*while*or*until*a*given*date**/********if(*display_date*!=*0*)********{************/**If*there*are*filters*in*the*chain,*better*give*them*the*picture***************in*advance**/************if(*!p_vout*>psz_filter_chain*||*!*p_vout*>psz_filter_chain*)************{****************mwait(*display_date***VOUT_MWAIT_TOLERANCE*);************}********}********else********{************msleep(*VOUT_IDLE_SLEEP*);********}********/**On*awakening,*take*back*lock*and*send*immediately*picture***********to*display.**/********vlc_object_lock(*p_vout*);********/**Note:*vlc_object_alive()*could*be*false*here,*and*we***********could*be*dead**/********vlc_mutex_lock(*&p_vout*>change_lock*);********/************Display*the*previously*rendered*picture**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*)********{************/**Display*the*direct*buffer*returned*by*vout_RenderPicture**/************if(*p_vout*>pf_display*)****************p_vout*>pf_display(*p_vout,*p_directbuffer*);************/**Tell*the*vout*this*was*the*last*picture*and*that*it*does*not***************need*to*be*forced*anymore.**/************p_last_picture*=*p_picture;************p_last_picture*>b_force*=*false;********}********/**Drop*the*filtered*picture*if*created*by*video*filters**/********if(*p_filtered_picture*!=*NULL*&&*p_filtered_picture*!=*p_picture*)************DropPicture(*p_vout,*p_filtered_picture*);********if(*p_picture*!=*NULL*)********{************/**Reinitialize*idle*loop*count**/************i_idle_loops*=*0;********}********/************Check*events*and*manage*thread**********/********if(*p_vout*>pf_manage*&&*p_vout*>pf_manage(*p_vout*)*)********{************/**A*fatal*error*occurred,*and*the*thread*must*terminate***************immediately,*without*displaying*anything***setting*b_error*to*1***************causes*the*immediate*end*of*the*main*while()*loop.**/************//*FIXME*pf_end************p_vout*>b_error*=*1;************break;********}********if(*p_vout*>i_changes*&*VOUT_SIZE_CHANGE*)********{************/**this*must*only*happen*when*the*vout*plugin*is*incapable*of***************rescaling*the*picture*itself.*In*this*case*we*need*to*destroy***************the*current*picture*buffers*and*recreate*new*ones*with*the*right***************dimensions**/************int*i;************p_vout*>i_changes*&=*~VOUT_SIZE_CHANGE;************assert(*!p_vout*>b_direct*);************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************for(*i*=*0;*i*<*I_OUTPUTPICTURES;*i++*)*****************p_vout*>p_picture[*i*].i_status*=*FREE_PICTURE;************I_OUTPUTPICTURES*=*0;************if(*p_vout*>pf_init(*p_vout*)*)************{****************msg_Err(*p_vout,*„cannot*resize*display“*);****************/**FIXME:*pf_end*will*be*called*again*in*EndThread()**/****************p_vout*>b_error*=*1;************}************vlc_mutex_unlock(*&p_vout*>picture_lock*);************/**Need*to*reinitialise*the*chroma*plugin.*Since*we*might*need***************resizing*too*and*it‘s*not*sure*that*we*already*had*it,***************recreate*the*chroma*plugin*chain*from*scratch.**/************/**dionoea**/************if(*ChromaCreate(*p_vout*)*)************{****************msg_Err(*p_vout,*„WOW*THIS*SUCKS*BIG*TIME!!!!!“*);****************p_vout*>b_error*=*1;************}************if(*p_vout*>b_error*)****************break;********}********if(*p_vout*>i_changes*&*VOUT_PICTURE_BUFFERS_CHANGE*)********{************/**This*happens*when*the*picture*buffers*need*to*be*recreated.***************This*is*useful*on*multimonitor*displays*for*instance.*****************************Warning:*This*only*works*when*the*vout*creates*only*1*picture***************buffer!!**/************p_vout*>i_changes*&=*~VOUT_PICTURE_BUFFERS_CHANGE;************if(*!p_vout*>b_direct*)****************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************I_OUTPUTPICTURES*=*I_RENDERPICTURES*=*0;************p_vout*>b_error*=*InitThread(*p_vout*);************if(*p_vout*>b_error*)****************msg_Err(*p_vout,*„InitThread*after*VOUT_PICTURE_BUFFERS_CHANGE*failed\n“*);************vlc_mutex_unlock(*&p_vout*>picture_lock*);************if(*p_vout*>b_error*)****************break;********}********/**Check*for*„video*filter2“*changes**/********vlc_mutex_lock(*&p_vout*>vfilter_lock*);********if(*p_vout*>psz_vf2*)********{************es_format_t*fmt;************es_format_Init(*&fmt,*VIDEO_ES,*p_vout*>fmt_render.i_chroma*);************fmt.video*=*p_vout*>fmt_render;************filter_chain_Reset(*p_vout*>p_vf2_chain,*&fmt,*&fmt*);************if(*filter_chain_AppendFromString(*p_vout*>p_vf2_chain,***********************************************p_vout*>psz_vf2*)*<*0*)****************msg_Err(*p_vout,*„Video*filter*chain*creation*failed“*);************free(*p_vout*>psz_vf2*);************p_vout*>psz_vf2*=*NULL;********}********vlc_mutex_unlock(*&p_vout*>vfilter_lock*);****}****/********Error*loop***wait*until*the*thread*destruction*is*requested******/****if(*p_vout*>b_error*)********ErrorThread(*p_vout*);****/**End*of*thread**/****CleanThread(*p_vout*);****EndThread(*p_vout*);****vlc_mutex_unlock(*&p_vout*>change_lock*);****vlc_object_unlock(*p_vout*);****return*NULL;}/********************************************************************************ErrorThread:*RunThread()*error*loop*******This*function*is*called*when*an*error*occurred*during*thread*main‘s*loop.***The*thread*can*still*receive*feed,*but*must*be*ready*to*terminate*as*soon***as*possible.**********/static*void*ErrorThread(*vout_thread_t**p_vout*){****/**Wait*until*a*`die‘*order**/****while(*vlc_object_alive(*p_vout*)*)********vlc_object_wait(*p_vout*);}/********************************************************************************CleanThread:*clean*up*after*InitThread*********This*function*is*called*after*a*sucessful***initialization.*It*frees*all*resources*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**********/static*void*CleanThread(*vout_thread_t**p_vout*){****int*****i_index;****************************************/**index*in*heap**/****if(*!p_vout*>b_direct*)********ChromaDestroy(*p_vout*);****/**Destroy*all*remaining*pictures**/****for(*i_index*=*0;*i_index*<*2***VOUT_MAX_PICTURES*+*1;*i_index++*)****{********if*(*p_vout*>p_picture[i_index].i_type*==*MEMORY_PICTURE*)********{************free(*p_vout*>p_picture[i_index].p_data_orig*);********}****}****/**Destroy*translation*tables**/****if(*!p_vout*>b_error*)********p_vout*>pf_end(*p_vout*);}/****w**********EndThread:*thread*destruction******This*function*is*called*when*the*thread*ends.***It*frees*all*resources*not*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**************/static*void*EndThread(*vout_thread_t**p_vout*){#ifdef*STATS****{********struct*tms*cpu_usage;********times(*&cpu_usage*);********msg_Dbg(*p_vout,*„cpu*usage*(user:*%d,*system:*%d)“,*****************cpu_usage.tms_utime,*cpu_usage.tms_stime*);****}#endif****/**FIXME*does*that*function**really**need*to*be*called*inside*the*thread*?**/****/**Destroy*subpicture*unit**/****spu_Attach(*p_vout*>p_spu,*VLC_OBJECT(p_vout),*false*);****/**Destroy*the*video*filters2**/****filter_chain_Delete(*p_vout*>p_vf2_chain*);}/**Thread*helpers**/static*picture_t**ChromaGetPicture(*filter_t**p_filter*){****picture_t**p_pic*=*(picture_t**)p_filter*>p_owner;****p_filter*>p_owner*=*NULL;****return*p_pic;}static*int*ChromaCreate(*vout_thread_t**p_vout*){****static*const*char*typename[]*=*„chroma“;****filter_t**p_chroma;****/**Choose*the*best*module**/****p_chroma*=*p_vout*>p_chroma*=********vlc_custom_create(*p_vout,*sizeof(filter_t),*VLC_OBJECT_GENERIC,***************************typename*);****vlc_object_attach(*p_chroma,*p_vout*);****/**TODO:*Set*the*fmt_in*and*fmt_out*stuff*here**/****p_chroma*>fmt_in.video*=*p_vout*>fmt_render;****p_chroma*>fmt_out.video*=*p_vout*>fmt_out;****VideoFormatImportRgb(*&p_chroma*>fmt_in.video,*&p_vout*>render*);****VideoFormatImportRgb(*&p_chroma*>fmt_out.video,*&p_vout*>output*);****p_chroma*>p_module*=*module_Need(*p_chroma,*„video*filter2“,*NULL,*0*);****if(*p_chroma*>p_module*==*NULL*)****{********msg_Err(*p_vout,*„no*chroma*module*for*%4.4s*to*%4.4s*i=%dx%d*o=%dx%d“,*****************(char*)&p_vout*>render.i_chroma,*****************(char*)&p_vout*>output.i_chroma,*****************p_chroma*>fmt_in.video.i_width,*p_chroma*>fmt_in.video.i_height,*****************p_chroma*>fmt_out.video.i_width,*p_chroma*>fmt_out.video.i_height*****************);********vlc_object_release(*p_vout*>p_chroma*);********p_vout*>p_chroma*=*NULL;********return*VLC_EGENERIC;****}****p_chroma*>pf_vout_buffer_new*=*ChromaGetPicture;****return*VLC_SUCCESS;}static*void*ChromaDestroy(*vout_thread_t**p_vout*){****assert(*!p_vout*>b_direct*);****if(*!p_vout*>p_chroma*)********return;****module_Unneed(*p_vout*>p_chroma,*p_vout*>p_chroma*>p_module*);****vlc_object_release(*p_vout*>p_chroma*);****p_vout*>p_chroma*=*NULL;}static*void*DropPicture(*vout_thread_t**p_vout,*picture_t**p_picture*){****vlc_mutex_lock(*&p_vout*>picture_lock*);****if(*p_picture*>i_refcount*)****{********/**Pretend*we*displayed*the*picture,*but*don‘t*destroy***********it*since*the*decoder*might*still*need*it.**/********p_picture*>i_status*=*DISPLAYED_PICTURE;****}****else****{********/**Destroy*the*picture*without*displaying*it**/********p_picture*>i_status*=*DESTROYED_PICTURE;********p_vout*>i_heap_size**;****}****vlc_mutex_unlock(*&p_vout*>picture_lock*);}/**following*functions*are*local**/static*int*ReduceHeight(*int*i_ratio*){****int*i_dummy*=*VOUT_ASPECT_FACTOR;****int*i_pgcd**=*1;****if(*!i_ratio*)****{********return*i_pgcd;****}****/**VOUT_ASPECT_FACTOR*is*(2^7***3^3***5^3),*we*just*check*for*2,*3*and*5**/****while(*!(i_ratio*&*1)*&&*!(i_dummy*&*1)*)****{********i_ratio*>>=*1;********i_dummy*>>=*1;********i_pgcd**<<=*1;****}****while(*!(i_ratio*%*3)*&&*!(i_dummy*%*3)*)****{********i_ratio*/=*3;********i_dummy*/=*3;********i_pgcd***=*3;****}****while(*!(i_ratio*%*5)*&&*!(i_dummy*%*5)*)****{********i_ratio*/=*5;********i_dummy*/=*5;********i_pgcd***=*5;****}****return*i_pgcd;}static*void*AspectRatio(*int*i_aspect,*int**i_aspect_x,*int**i_aspect_y*){****unsigned*int*i_pgcd*=*ReduceHeight(*i_aspect*);*****i_aspect_x*=*i_aspect*/*i_pgcd;*****i_aspect_y*=*VOUT_ASPECT_FACTOR*/*i_pgcd;}/*****This*function*copies*all*RGB*informations*from*a*picture_heap_t*into***a*video_format_t**/static*void*VideoFormatImportRgb(*video_format_t**p_fmt,*const*picture_heap_t**p_heap*){****p_fmt*>i_rmask*=*p_heap*>i_rmask;****p_fmt*>i_gmask*=*p_heap*>i_gmask;****p_fmt*>i_bmask*=*p_heap*>i_bmask;****p_fmt*>i_rrshift*=*p_heap*>i_rrshift;****p_fmt*>i_lrshift*=*p_heap*>i_lrshift;****p_fmt*>i_rgshift*=*p_heap*>i_rgshift;****p_fmt*>i_lgshift*=*p_heap*>i_lgshift;****p_fmt*>i_rbshift*=*p_heap*>i_rbshift;****p_fmt*>i_lbshift*=*p_heap*>i_lbshift;}/*****This*funtion*copes*all*RGB*informations*from*a*video_format_t*into***a*picture_heap_t**/static*void*VideoFormatExportRgb(*const*video_format_t**p_fmt,*picture_heap_t**p_heap*){****p_heap*>i_rmask*=*p_fmt*>i_rmask;****p_heap*>i_gmask*=*p_fmt*>i_gmask;****p_heap*>i_bmask*=*p_fmt*>i_bmask;****p_heap*>i_rrshift*=*p_fmt*>i_rrshift;****p_heap*>i_lrshift*=*p_fmt*>i_lrshift;****p_heap*>i_rgshift*=*p_fmt*>i_rgshift;****p_heap*>i_lgshift*=*p_fmt*>i_lgshift;****p_heap*>i_rbshift*=*p_fmt*>i_rbshift;****p_heap*>i_lbshift*=*p_fmt*>i_lbshift;}/*****This*function*computes*rgb*shifts*from*masks**/static*void*PictureHeapFixRgb(*picture_heap_t**p_heap*){****video_format_t*fmt;****/***/****fmt.i_chroma*=*p_heap*>i_chroma;****VideoFormatImportRgb(*&fmt,*p_heap*);****/***/****video_format_FixRgb(*&fmt*);****VideoFormatExportRgb(*&fmt,*p_heap*);}/******Helper*thread*for*object*variables*callbacks.***Only*used*to*avoid*deadlocks*when*using*the*video*embedded*mode.*******/typedef*struct*suxor_thread_t{****VLC_COMMON_MEMBERS****input_thread_t**p_input;}*suxor_thread_t;static*void**SuxorRestartVideoES(*vlc_object_t***p_vlc_t*){****suxor_thread_t**p_this*=*(suxor_thread_t**)*p_vlc_t;****/**Now*restart*current*video*stream**/****int*val*=*var_GetInteger(*p_this*>p_input,*„video*es“*);****if(*val*>=*0*)****{********var_SetInteger(*p_this*>p_input,*„video*es“,**VIDEO_ES*);********var_SetInteger(*p_this*>p_input,*„video*es“,*val*);****}****vlc_object_release(*p_this*>p_input*);****vlc_object_release(*p_this*);****return*NULL;}/******object*variables*callbacks:*a*bunch*of*object*variables*are*used*by*the***interfaces*to*interact*with*the*vout.***-*********/static*int*DeinterlaceCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****input_thread_t**p_input;****vlc_value_t*val;****char**psz_mode*=*newval.psz_string;****char**psz_filter,**psz_deinterlace*=*NULL;****(void)psz_cmd;*(void)oldval;*(void)p_data;****var_Get(*p_vout,*„vout*filter“,*&val*);****psz_filter*=*val.psz_string;****if(*psz_filter*)*psz_deinterlace*=*strstr(*psz_filter,*„deinterlace“*);****if(*!psz_mode*||*!*psz_mode*)****{********if(*psz_deinterlace*)********{************char**psz_src*=*psz_deinterlace*+*sizeof(„deinterlace“)***1;************if(*psz_src[0]*==*‚:‘*)*psz_src++;************memmove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ *NULL;****}****return*p_vout;}/********************************************************************************vout_Close:*Close*a*vout*created*by*vout_Create.*********************************************************************************You*HAVE*to*call*it*on*vout*created*by*vout_Create*before*vlc_object_release.***You*should*NEVER*call*it*on*vout*not*obtained*though*vout_Create***(like*with*vout_Request*or*vlc_object_find.)***You*can*use*vout_CloseAndRelease()*as*a*convenient*method.******************************************************************************/void*vout_Close(*vout_thread_t**p_vout*){****assert(*p_vout*);****vlc_object_kill(*p_vout*);****vlc_thread_join(*p_vout*);****module_Unneed(*p_vout,*p_vout*>p_module*);****p_vout*>p_module*=*NULL;}/***/static*void*vout_Destructor(*vlc_object_t***p_this*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****/**Make*sure*the*vout*was*stopped*first**/****assert(*!p_vout*>p_module*);****/***/****spu_Destroy(*p_vout*>p_spu*);****/**Destroy*the*locks**/****vlc_mutex_destroy(*&p_vout*>picture_lock*);****vlc_mutex_destroy(*&p_vout*>change_lock*);****vlc_mutex_destroy(*&p_vout*>vfilter_lock*);****free(*p_vout*>psz_filter_chain*);****config_ChainDestroy(*p_vout*>p_cfg*);#ifndef*__APPLE__****vout_thread_t**p_another_vout;****/**This*is*a*dirty*hack*mostly*for*Linux,*where*there*is*no*way*to*get*the*******GUI*back*if*you*closed*it*while*playing*video.*This*is*solved*in*******Mac*OS*X,*where*we*have*this*novelty*called*menubar,*that*will*always*******allow*you*access*to*the*applications*main*functionality.*They*should*try*******that*on*linux*sometime.**/****p_another_vout*=*vlc_object_find(*p_this*>p_libvlc,**************************************VLC_OBJECT_VOUT,*FIND_ANYWHERE*);****if(*p_another_vout*==*NULL*)********var_SetBool(*p_this*>p_libvlc,*„intf*show“,*true*);****else********vlc_object_release(*p_another_vout*);#endif}/*******InitThread:*initialize*video*output*thread*************This*function*is*called*from*RunThread*and*performs*the*second*step*of*the***initialization.*It*returns*0*on*success.*Note*that*the*thread‘s*flag*are*not***modified*inside*this*function.***XXX*You*have*to*enter*it*with*change_lock*taken.******************************************************************************/static*int*ChromaCreate(*vout_thread_t**p_vout*);static*void*ChromaDestroy(*vout_thread_t**p_vout*);static*bool*ChromaIsEqual(*const*picture_heap_t**p_output,*const*picture_heap_t**p_render*){*****if(*!vout_ChromaCmp(*p_output*>i_chroma,*p_render*>i_chroma*)*)*********return*false;*****if(*p_output*>i_chroma*!=*FOURCC_RV15*&&*********p_output*>i_chroma*!=*FOURCC_RV16*&&*********p_output*>i_chroma*!=*FOURCC_RV24*&&*********p_output*>i_chroma*!=*FOURCC_RV32*)*********return*true;*****return*p_output*>i_rmask*==*p_render*>i_rmask*&&************p_output*>i_gmask*==*p_render*>i_gmask*&&************p_output*>i_bmask*==*p_render*>i_bmask;}static*int*InitThread(*vout_thread_t**p_vout*){****int*i,*i_aspect_x,*i_aspect_y;#ifdef*STATS****p_vout*>c_loops*=*0;#endif****/**Initialize*output*method,*it*allocates*direct*buffers*for*us**/****if(*p_vout*>pf_init(*p_vout*)*)********return*VLC_EGENERIC;****if(*!I_OUTPUTPICTURES*)****{********msg_Err(*p_vout,*„plugin*was*unable*to*allocate*at*least*„*************************„one*direct*buffer“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****if(*I_OUTPUTPICTURES*>*VOUT_MAX_PICTURES*)****{********msg_Err(*p_vout,*„plugin*allocated*too*many*direct*buffers,*„*************************„our*internal*buffers*must*have*overflown.“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****msg_Dbg(*p_vout,*„got*%i*direct*buffer(s)“,*I_OUTPUTPICTURES*);****AspectRatio(*p_vout*>fmt_render.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*in*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_render.i_width,*p_vout*>fmt_render.i_height,*************p_vout*>fmt_render.i_x_offset,*p_vout*>fmt_render.i_y_offset,*************p_vout*>fmt_render.i_visible_width,*************p_vout*>fmt_render.i_visible_height,*************(char*)&p_vout*>fmt_render.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_render.i_sar_num,*p_vout*>fmt_render.i_sar_den*);****AspectRatio(*p_vout*>fmt_in.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*user*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_in.i_width,*p_vout*>fmt_in.i_height,*************p_vout*>fmt_in.i_x_offset,*p_vout*>fmt_in.i_y_offset,*************p_vout*>fmt_in.i_visible_width,*************p_vout*>fmt_in.i_visible_height,*************(char*)&p_vout*>fmt_in.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_in.i_sar_num,*p_vout*>fmt_in.i_sar_den*);****if(*!p_vout*>fmt_out.i_width*||*!p_vout*>fmt_out.i_height*)****{********p_vout*>fmt_out.i_width*=*p_vout*>fmt_out.i_visible_width*=************p_vout*>output.i_width;********p_vout*>fmt_out.i_height*=*p_vout*>fmt_out.i_visible_height*=************p_vout*>output.i_height;********p_vout*>fmt_out.i_x_offset*=**p_vout*>fmt_out.i_y_offset*=*0;********p_vout*>fmt_out.i_aspect*=*p_vout*>output.i_aspect;********p_vout*>fmt_out.i_chroma*=*p_vout*>output.i_chroma;****}****if(*!p_vout*>fmt_out.i_sar_num*||*!p_vout*>fmt_out.i_sar_num*)****{********p_vout*>fmt_out.i_sar_num*=*p_vout*>fmt_out.i_aspect**************p_vout*>fmt_out.i_height;********p_vout*>fmt_out.i_sar_den*=*VOUT_ASPECT_FACTOR**************p_vout*>fmt_out.i_width;****}****vlc_ureduce(*&p_vout*>fmt_out.i_sar_num,*&p_vout*>fmt_out.i_sar_den,*****************p_vout*>fmt_out.i_sar_n u m , * p _ v o u t * > f m t _ o u t . i _ s a r _ d e n , * 0 * ) ; * * * * A s p e c t R a t i o ( * p _ v o u t * > f m t _ o u t . i _ a s p e c t , * & i _ a s p e c t _ x , * & i _ a s p e c t _ y * ) ; * * * * m s g _ D b g ( * p _ v o u t , * „ p i c t u r e * o u t * % i x % i * ( % i , % i , % i x % i ) , * „ * * * * * * * * * * * * * „ c h r o m a * % 4 . 4 s , * a r * % i : % i , * s a r * % i : % i “ , * * * * * * * * * * * * *p_vout*>fmt_out.i_width,*p_vout*>fmt_out.i_height,*************p_vout*>fmt_out.i_x_offset,*p_vout*>fmt_out.i_y_offset,*************p_vout*>fmt_out.i_visible_width,*************p_vout*>fmt_out.i_visible_height,*************(char*)&p_vout*>fmt_out.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_out.i_sar_num,*p_vout*>fmt_out.i_sar_den*);****/**FIXME*removed*the*need*of*both*fmt_**and*heap*infos**/****/**Calculate*shifts*from*system*updated*masks**/****PictureHeapFixRgb(*&p_vout*>render*);****VideoFormatImportRgb(*&p_vout*>fmt_render,*&p_vout*>render*);****PictureHeapFixRgb(*&p_vout*>output*);****VideoFormatImportRgb(*&p_vout*>fmt_out,*&p_vout*>output*);****/**Check*whether*we*managed*to*create*direct*buffers*similar*to*******the*render*buffers,*ie*same*size*and*chroma**/****if(*(*p_vout*>output.i_width*==*p_vout*>render.i_width*)*****&&*(*p_vout*>output.i_height*==*p_vout*>render.i_height*)*****&&*(*ChromaIsEqual(*&p_vout*>output,*&p_vout*>render*)*)*)****{********/**Cool*!*We*have*direct*buffers,*we*can*ask*the*decoder*to***********directly*decode*into*them*!*Map*the*first*render*buffers*to***********the*first*direct*buffers,*but*keep*the*first*direct*buffer***********for*memcpy*operations**/********p_vout*>b_direct*=*1;********for(*i*=*1;*i*<*VOUT_MAX_PICTURES;*i++*)********{************if(*p_vout*>p_picture[*i*].i_type*!=*DIRECT_PICTURE*&&****************I_RENDERPICTURES*>=*VOUT_MIN_DIRECT_PICTURES***1*&&****************p_vout*>p_picture[*i***1*].i_type*==*DIRECT_PICTURE*)************{****************/**We*have*enough*direct*buffers*so*there‘s*no*need*to*******************try*to*use*system*memory*buffers.**/****************break;************}************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;********}********msg_Dbg(*p_vout,*„direct*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*1*%i“,*****************VOUT_MAX_PICTURES***2,*VOUT_MAX_PICTURES***1*);****}****else****{********/**Rats...*Something*is*wrong*here,*we*could*not*find*an*output***********plugin*able*to*directly*render*what*we*decode.*See*if*we*can***********find*a*chroma*plugin*to*do*the*conversion**/********p_vout*>b_direct*=*0;********if(*ChromaCreate(*p_vout*)*)********{********p_vout*>pf_end(*p_vout*);************return*VLC_EGENERIC;********}********msg_Dbg(*p_vout,*„indirect*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*%i*%i“,*****************VOUT_MAX_PICTURES***1,*I_OUTPUTPICTURES,*****************I_OUTPUTPICTURES*+*VOUT_MAX_PICTURES***1*);********/**Append*render*buffers*after*the*direct*buffers**/********for(*i*=*I_OUTPUTPICTURES;*i*<*2***VOUT_MAX_PICTURES;*i++*)********{************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;************/**Check*if*we*have*enough*render*pictures**/************if(*I_RENDERPICTURES*==*VOUT_MAX_PICTURES*)****************break;********}****}****/**Link*pictures*back*to*their*heap**/****for(*i*=*0*;*i*<*I_RENDERPICTURES*;*i++*)****{********PP_RENDERPICTURE[*i*]*>p_heap*=*&p_vout*>render;****}****for(*i*=*0*;*i*<*I_OUTPUTPICTURES*;*i++*)****{********PP_OUTPUTPICTURE[*i*]*>p_heap*=*&p_vout*>output;****}****return*VLC_SUCCESS;}/********************************************************************************RunThread:*video*output*thread*************************************Video*output*thread.*This*function*does*only*returns*when*the*thread*is***terminated.*It*handles*the*pictures*arriving*in*the*video*heap*and*the***display*device*events.***t*******p_last_picture*=*NULL;*******************/**last*picture**/****subpicture_t****p_subpic*=*NULL;*******************/**subpicture*pointer**/****bool************b_drop_late;****int*************i_displayed*=*0,*i_lost*=*0;****/********Initialize*thread******/****vlc_mutex_lock(*&p_vout*>change_lock*);****p_vout*>b_error*=*InitThread(*p_vout*);****b_drop_late*=*var_CreateGetBool(*p_vout,*„drop*late*frames“*);****/**signal*the*creation*of*the*vout**/****vlc_thread_ready(*p_vout*);****if(*p_vout*>b_error*)****{********EndThread(*p_vout*);********vlc_mutex_unlock(*&p_vout*>change_lock*);********return*NULL;****}****vlc_object_lock(*p_vout*);****if(*p_vout*>b_title_show*)********DisplayTitleOnOSD(*p_vout*);****/********Main*loop***it*is*not*executed*if*an*error*occurred*during*******initialization******/****while(*vlc_object_alive(*p_vout*)*&&*!p_vout*>b_error*)****{********/**Initialize*loop*variables**/********const*mtime_t*current_date*=*mdate();********picture_t**p_picture*=*NULL;********picture_t**p_filtered_picture;********mtime_t*display_date*=*0;********picture_t**p_directbuffer;********input_thread_t**p_input;********int*i_index;#if*0********p_vout*>c_loops++;********if(*!(p_vout*>c_loops*%*VOUT_STATS_NB_LOOPS)*)********{************msg_Dbg(*p_vout,*„picture*heap:*%d/%d“,*********************I_RENDERPICTURES,*p_vout*>i_heap_size*);********}#endif********/**Update*statistics**/********p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);********if(*p_input*)********{************vlc_mutex_lock(*&p_input*>p*>counters.counters_lock*);************stats_UpdateInteger(*p_vout,*p_input*>p*>counters.p_lost_pictures,*********************************i_lost*,*NULL);************stats_UpdateInteger(*p_vout,*********************************p_input*>p*>counters.p_displayed_pictures,*********************************i_displayed*,*NULL);************i_displayed*=*i_lost*=*0;************vlc_mutex_unlock(*&p_input*>p*>counters.counters_lock*);************vlc_object_release(*p_input*);********}********/************Find*the*picture*to*display*(the*one*with*the*earliest*date).***********This*operation*does*not*need*lock,*since*only*READY_PICTUREs***********are*handled.**/********for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)********{************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];************if(*p_pic*>i_status*==*READY_PICTURE*&&****************(*p_picture*==*NULL*||*p_pic*>date*<*display_date*)*)************{****************p_picture*=*p_pic;****************display_date*=*p_picture*>date;************}********}********if(*p_picture*)********{************/**If*we*met*the*last*picture,*parse*again*to*see*whether*there*is***************a*more*appropriate*one.**/************if(*p_picture*==*p_last_picture*)************{****************for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)****************{********************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];********************if(*p_pic*>i_status*==*READY_PICTURE*&&************************p_pic*!=*p_last_picture*&&************************(*p_picture*==*p_last_picture*||*p_pic*>date*<*display_date*)*)********************{************************p_picture*=*p_pic;************************display_date*=*p_picture*>date;********************}****************}************}************/**If*we*found*better*than*the*last*picture,*destroy*it**/************if(*p_last_picture*&&*p_picture*!=*p_last_picture*)************{****************DropPicture(*p_vout,*p_last_picture*);****************p_last_picture*=*NULL;************}************/**Compute*FPS*rate**/************p_vout*>p_fps_sample[*p_vout*>c_fps_samples++*%*VOUT_FPS_SAMPLES*]****************=*display_date;************if(*!p_picture*>b_force*&&****************p_picture*!=*p_last_picture*&&****************display_date*<*current_date*+*p_vout*>render_time*&&****************b_drop_late*)************{****************/**Picture*is*late:*it*will*be*destroyed*and*the*thread*******************will*directly*choose*the*next*picture**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„late*picture*skipped*(%“PRId64“)“,**********************************current_date***display_date*);****************continue;************}************if(*display_date*>****************current_date*+*p_vout*>i_pts_delay*+*VOUT_BO-GUS_DELAY*)************{****************/**Picture*is*waaay*too*early:*it*will*be*destroyed**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„vout*warning:*early*picture*skipped*„**************************„(%“PRId64“)“,*display_date***current_date****************************p_vout*>i_pts_delay*);****************continue;************}************if(*display_date*>*current_date*+*VOUT_DISPLAY_DELAY*)************{****************/**A*picture*is*ready*to*be*rendered,*but*its*rendering*date*******************is*far*from*the*current*one*so*the*thread*will*perform*an*******************empty*loop*as*if*no*picture*were*found.*The*picture*state*******************is*unchanged**/****************p_picture****=*NULL;****************display_date*=*0;************}************else*if(*p_picture*==*p_last_picture*)************{****************/**We*are*asked*to*repeat*the*previous*picture,*but*we*first*******************wait*for*a*couple*of*idle*loops**/****************if(*i_idle_loops*<*4*)****************{********************p_picture****=*NULL;********************display_date*=*0;****************}****************else****************{********************/**We*set*the*display*date*to*something*high,*otherwise***we‘ll*have*lots*of*problems*with*late*pictures**/********************display_date*=*current_date*+*p_vout*>render_time;****************}************}********}********if(*p_picture*==*NULL*)************i_idle_loops++;********p_filtered_picture*=*NULL;********if(*p_picture*)************p_filtered_picture*=*filter_chain_VideoFilter(*p_vout*>p_vf2_chain,***********************************************************p_picture*);********if(*p_filtered_picture*&&*p_vout*>b_snapshot*)********{************p_vout*>b_snapshot*=*false;************vout_Snapshot(*p_vout,*p_filtered_picture*);********}********/************Check*for*subpictures*to*display**********/********if(*display_date*>*0*)********{************p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);************p_subpic*=*spu_SortSubpictures(*p_vout*>p_spu,*display_date,********************************************p_input*?*var_GetInteger(*p_input,*„state“*)*==*PAUSE_S*:*false*);************if(*p_input*)****************vlc_object_release(*p_input*);********}********/************Perform*rendering**********/********i_displayed++;********p_directbuffer*=*vout_RenderPicture(*p_vout,*p_filtered_picture,*p_subpic*);********/************Call*the*plugin*specific*rendering*method*if*there*is*one**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*&&*p_vout*>pf_render*)********{************/**Render*the*direct*buffer*returned*by*vout_RenderPicture**/************p_vout*>pf_render(*p_vout,*p_directbuffer*);********}********/************Sleep,*wake*up**********/********if(*display_date*!=*0*&&*p_directbuffer*!=*NULL*)********{************mtime_t*current_render_time*=*mdate()***current_date;************/**if*render*time*is*very*large*we*don‘t*include*it*in*the*mean**/************if(*current_render_time*<*p_vout*>render_time*+****************VOUT_DISPLAY_DELAY*)************{****************/**Store*render*time*using*a*sliding*mean*weighting*to*******************current*value*in*a*3*to*1*ratio*/****************p_vout*>render_time**=*3;****************p_vout*>render_time*+=*current_render_time;****************p_vout*>render_time*>>=*2;************}********}********/**Give*back*change*lock**/********vlc_mutex_unlock(*&p_vout*>change_lock*);********vlc_object_unlock(*p_vout*);********/**Sleep*a*while*or*until*a*given*date**/********if(*display_date*!=*0*)********{************/**If*there*are*filters*in*the*chain,*better*give*them*the*picture***************in*advance**/************if(*!p_vout*>psz_filter_chain*||*!*p_vout*>psz_filter_chain*)************{****************mwait(*display_date***VOUT_MWAIT_TOLERANCE*);************}********}********else********{************msleep(*VOUT_IDLE_SLEEP*);********}********/**On*awakening,*take*back*lock*and*send*immediately*picture***********to*display.**/********vlc_object_lock(*p_vout*);********/**Note:*vlc_object_alive()*could*be*false*here,*and*we***********could*be*dead**/********vlc_mutex_lock(*&p_vout*>change_lock*);********/************Display*the*previously*rendered*picture**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*)********{************/**Display*the*direct*buffer*returned*by*vout_RenderPicture**/************if(*p_vout*>pf_display*)****************p_vout*>pf_display(*p_vout,*p_directbuffer*);************/**Tell*the*vout*this*was*the*last*picture*and*that*it*does*not***************need*to*be*forced*anymore.**/************p_last_picture*=*p_picture;************p_last_picture*>b_force*=*false;********}********/**Drop*the*filtered*picture*if*created*by*video*filters**/********if(*p_filtered_picture*!=*NULL*&&*p_filtered_picture*!=*p_picture*)************DropPicture(*p_vout,*p_filtered_picture*);********if(*p_picture*!=*NULL*)********{************/**Reinitialize*idle*loop*count**/************i_idle_loops*=*0;********}********/************Check*events*and*manage*thread**********/********if(*p_vout*>pf_manage*&&*p_vout*>pf_manage(*p_vout*)*)********{************/**A*fatal*error*occurred,*and*the*thread*must*terminate***************immediately,*without*displaying*anything***setting*b_error*to*1***************causes*the*immediate*end*of*the*main*while()*loop.**/************//*FIXME*pf_end************p_vout*>b_error*=*1;************break;********}********if(*p_vout*>i_changes*&*VOUT_SIZE_CHANGE*)********{************/**this*must*only*happen*when*the*vout*plugin*is*incapable*of***************rescaling*the*picture*itself.*In*this*case*we*need*to*destroy***************the*current*picture*buffers*and*recreate*new*ones*with*the*right***************dimensions**/************int*i;************p_vout*>i_changes*&=*~VOUT_SIZE_CHANGE;************assert(*!p_vout*>b_direct*);************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************for(*i*=*0;*i*<*I_OUTPUTPICTURES;*i++*)*****************p_vout*>p_picture[*i*].i_status*=*FREE_PICTURE;************I_OUTPUTPICTURES*=*0;************if(*p_vout*>pf_init(*p_vout*)*)************{****************msg_Err(*p_vout,*„cannot*resize*display“*);****************/**FIXME:*pf_end*will*be*called*again*in*EndThread()**/****************p_vout*>b_error*=*1;************}************vlc_mutex_unlock(*&p_vout*>picture_lock*);************/**Need*to*reinitialise*the*chroma*plugin.*Since*we*might*need***************resizing*too*and*it‘s*not*sure*that*we*already*had*it,***************recreate*the*chroma*plugin*chain*from*scratch.**/************/**dionoea**/************if(*ChromaCreate(*p_vout*)*)************{****************msg_Err(*p_vout,*„WOW*THIS*SUCKS*BIG*TIME!!!!!“*);****************p_vout*>b_error*=*1;************}************if(*p_vout*>b_error*)****************break;********}********if(*p_vout*>i_changes*&*VOUT_PICTURE_BUFFERS_CHANGE*)********{************/**This*happens*when*the*picture*buffers*need*to*be*recreated.***************This*is*useful*on*multimonitor*displays*for*instance.*****************************Warning:*This*only*works*when*the*vout*creates*only*1*picture***************buffer!!**/************p_vout*>i_changes*&=*~VOUT_PICTURE_BUFFERS_CHANGE;************if(*!p_vout*>b_direct*)****************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************I_OUTPUTPICTURES*=*I_RENDERPICTURES*=*0;************p_vout*>b_error*=*InitThread(*p_vout*);************if(*p_vout*>b_error*)****************msg_Err(*p_vout,*„InitThread*after*VOUT_PICTURE_BUFFERS_CHANGE*failed\n“*);************vlc_mutex_unlock(*&p_vout*>picture_lock*);************if(*p_vout*>b_error*)****************break;********}********/**Check*for*„video*filter2“*changes**/********vlc_mutex_lock(*&p_vout*>vfilter_lock*);********if(*p_vout*>psz_vf2*)********{************es_format_t*fmt;************es_format_Init(*&fmt,*VIDEO_ES,*p_vout*>fmt_render.i_chroma*);************fmt.video*=*p_vout*>fmt_render;************filter_chain_Reset(*p_vout*>p_vf2_chain,*&fmt,*&fmt*);************if(*filter_chain_AppendFromString(*p_vout*>p_vf2_chain,***********************************************p_vout*>psz_vf2*)*<*0*)****************msg_Err(*p_vout,*„Video*filter*chain*creation*failed“*);************free(*p_vout*>psz_vf2*);************p_vout*>psz_vf2*=*NULL;********}********vlc_mutex_unlock(*&p_vout*>vfilter_lock*);****}****/********Error*loop***wait*until*the*thread*destruction*is*requested******/****if(*p_vout*>b_error*)********ErrorThread(*p_vout*);****/**End*of*thread**/****CleanThread(*p_vout*);****EndThread(*p_vout*);****vlc_mutex_unlock(*&p_vout*>change_lock*);****vlc_object_unlock(*p_vout*);****return*NULL;}/********************************************************************************ErrorThread:*RunThread()*error*loop*******This*function*is*called*when*an*error*occurred*during*thread*main‘s*loop.***The*thread*can*still*receive*feed,*but*must*be*ready*to*terminate*as*soon***as*possible.**********/static*void*ErrorThread(*vout_thread_t**p_vout*){****/**Wait*until*a*`die‘*order**/****while(*vlc_object_alive(*p_vout*)*)********vlc_object_wait(*p_vout*);}/********************************************************************************CleanThread:*clean*up*after*InitThread*********This*function*is*called*after*a*sucessful***initialization.*It*frees*all*resources*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**********/static*void*CleanThread(*vout_thread_t**p_vout*){****int*****i_index;****************************************/**index*in*heap**/****if(*!p_vout*>b_direct*)********ChromaDestroy(*p_vout*);****/**Destroy*all*remaining*pictures**/****for(*i_index*=*0;*i_index*<*2***VOUT_MAX_PICTURES*+*1;*i_index++*)****{********if*(*p_vout*>p_picture[i_index].i_type*==*MEMORY_PICTURE*)********{************free(*p_vout*>p_picture[i_index].p_data_orig*);********}****}****/**Destroy*translation*tables**/****if(*!p_vout*>b_error*)********p_vout*>pf_end(*p_vout*);}/****w**********EndThread:*thread*destruction******This*function*is*called*when*the*thread*ends.***It*frees*all*resources*not*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**************/static*void*EndThread(*vout_thread_t**p_vout*){#ifdef*STATS****{********struct*tms*cpu_usage;********times(*&cpu_usage*);********msg_Dbg(*p_vout,*„cpu*usage*(user:*%d,*system:*%d)“,*****************cpu_usage.tms_utime,*cpu_usage.tms_stime*);****}#endif****/**FIXME*does*that*function**really**need*to*be*called*inside*the*thread*?**/****/**Destroy*subpicture*unit**/****spu_Attach(*p_vout*>p_spu,*VLC_OBJECT(p_vout),*false*);****/**Destroy*the*video*filters2**/****filter_chain_Delete(*p_vout*>p_vf2_chain*);}/**Thread*helpers**/static*picture_t**ChromaGetPicture(*filter_t**p_filter*){****picture_t**p_pic*=*(picture_t**)p_filter*>p_owner;****p_filter*>p_owner*=*NULL;****return*p_pic;}static*int*ChromaCreate(*vout_thread_t**p_vout*){****static*const*char*typename[]*=*„chroma“;****filter_t**p_chroma;****/**Choose*the*best*module**/****p_chroma*=*p_vout*>p_chroma*=********vlc_custom_create(*p_vout,*sizeof(filter_t),*VLC_OBJECT_GENERIC,***************************typename*);****vlc_object_attach(*p_chroma,*p_vout*);****/**TODO:*Set*the*fmt_in*and*fmt_out*stuff*here**/****p_chroma*>fmt_in.video*=*p_vout*>fmt_render;****p_chroma*>fmt_out.video*=*p_vout*>fmt_out;****VideoFormatImportRgb(*&p_chroma*>fmt_in.video,*&p_vout*>render*);****VideoFormatImportRgb(*&p_chroma*>fmt_out.video,*&p_vout*>output*);****p_chroma*>p_module*=*module_Need(*p_chroma,*„video*filter2“,*NULL,*0*);****if(*p_chroma*>p_module*==*NULL*)****{********msg_Err(*p_vout,*„no*chroma*module*for*%4.4s*to*%4.4s*i=%dx%d*o=%dx%d“,*****************(char*)&p_vout*>render.i_chroma,*****************(char*)&p_vout*>output.i_chroma,*****************p_chroma*>fmt_in.video.i_width,*p_chroma*>fmt_in.video.i_height,*****************p_chroma*>fmt_out.video.i_width,*p_chroma*>fmt_out.video.i_height*****************);********vlc_object_release(*p_vout*>p_chroma*);********p_vout*>p_chroma*=*NULL;********return*VLC_EGENERIC;****}****p_chroma*>pf_vout_buffer_new*=*ChromaGetPicture;****return*VLC_SUCCESS;}static*void*ChromaDestroy(*vout_thread_t**p_vout*){****assert(*!p_vout*>b_direct*);****if(*!p_vout*>p_chroma*)********return;****module_Unneed(*p_vout*>p_chroma,*p_vout*>p_chroma*>p_module*);****vlc_object_release(*p_vout*>p_chroma*);****p_vout*>p_chroma*=*NULL;}static*void*DropPicture(*vout_thread_t**p_vout,*picture_t**p_picture*){****vlc_mutex_lock(*&p_vout*>picture_lock*);****if(*p_picture*>i_refcount*)****{********/**Pretend*we*displayed*the*picture,*but*don‘t*destroy***********it*since*the*decoder*might*still*need*it.**/********p_picture*>i_status*=*DISPLAYED_PICTURE;****}****else****{********/**Destroy*the*picture*without*displaying*it**/********p_picture*>i_status*=*DESTROYED_PICTURE;********p_vout*>i_heap_size**;****}****vlc_mutex_unlock(*&p_vout*>picture_lock*);}/**following*functions*are*local**/static*int*ReduceHeight(*int*i_ratio*){****int*i_dummy*=*VOUT_ASPECT_FACTOR;****int*i_pgcd**=*1;****if(*!i_ratio*)****{********return*i_pgcd;****}****/**VOUT_ASPECT_FACTOR*is*(2^7***3^3***5^3),*we*just*check*for*2,*3*and*5**/****while(*!(i_ratio*&*1)*&&*!(i_dummy*&*1)*)****{********i_ratio*>>=*1;********i_dummy*>>=*1;********i_pgcd**<<=*1;****}****while(*!(i_ratio*%*3)*&&*!(i_dummy*%*3)*)****{********i_ratio*/=*3;********i_dummy*/=*3;********i_pgcd***=*3;****}****while(*!(i_ratio*%*5)*&&*!(i_dummy*%*5)*)****{********i_ratio*/=*5;********i_dummy*/=*5;********i_pgcd***=*5;****}****return*i_pgcd;}static*void*AspectRatio(*int*i_aspect,*int**i_aspect_x,*int**i_aspect_y*){****unsigned*int*i_pgcd*=*ReduceHeight(*i_aspect*);*****i_aspect_x*=*i_aspect*/*i_pgcd;*****i_aspect_y*=*VOUT_ASPECT_FACTOR*/*i_pgcd;}/*****This*function*copies*all*RGB*informations*from*a*picture_heap_t*into***a*video_format_t**/static*void*VideoFormatImportRgb(*video_format_t**p_fmt,*const*picture_heap_t**p_heap*){****p_fmt*>i_rmask*=*p_heap*>i_rmask;****p_fmt*>i_gmask*=*p_heap*>i_gmask;****p_fmt*>i_bmask*=*p_heap*>i_bmask;****p_fmt*>i_rrshift*=*p_heap*>i_rrshift;****p_fmt*>i_lrshift*=*p_heap*>i_lrshift;****p_fmt*>i_rgshift*=*p_heap*>i_rgshift;****p_fmt*>i_lgshift*=*p_heap*>i_lgshift;****p_fmt*>i_rbshift*=*p_heap*>i_rbshift;****p_fmt*>i_lbshift*=*p_heap*>i_lbshift;}/*****This*funtion*copes*all*RGB*informations*from*a*video_format_t*into***a*picture_heap_t**/static*void*VideoFormatExportRgb(*const*video_format_t**p_fmt,*picture_heap_t**p_heap*){****p_heap*>i_rmask*=*p_fmt*>i_rmask;****p_heap*>i_gmask*=*p_fmt*>i_gmask;****p_heap*>i_bmask*=*p_fmt*>i_bmask;****p_heap*>i_rrshift*=*p_fmt*>i_rrshift;****p_heap*>i_lrshift*=*p_fmt*>i_lrshift;****p_heap*>i_rgshift*=*p_fmt*>i_rgshift;****p_heap*>i_lgshift*=*p_fmt*>i_lgshift;****p_heap*>i_rbshift*=*p_fmt*>i_rbshift;****p_heap*>i_lbshift*=*p_fmt*>i_lbshift;}/*****This*function*computes*rgb*shifts*from*masks**/static*void*PictureHeapFixRgb(*picture_heap_t**p_heap*){****video_format_t*fmt;****/***/****fmt.i_chroma*=*p_heap*>i_chroma;****VideoFormatImportRgb(*&fmt,*p_heap*);****/***/****video_format_FixRgb(*&fmt*);****VideoFormatExportRgb(*&fmt,*p_heap*);}/******Helper*thread*for*object*variables*callbacks.***Only*used*to*avoid*deadlocks*when*using*the*video*embedded*mode.*******/typedef*struct*suxor_thread_t{****VLC_COMMON_MEMBERS****input_thread_t**p_input;}*suxor_thread_t;static*void**SuxorRestartVideoES(*vlc_object_t***p_vlc_t*){****suxor_thread_t**p_this*=*(suxor_thread_t**)*p_vlc_t;****/**Now*restart*current*video*stream**/****int*val*=*var_GetInteger(*p_this*>p_input,*„video*es“*);****if(*val*>=*0*)****{********var_SetInteger(*p_this*>p_input,*„video*es“,**VIDEO_ES*);********var_SetInteger(*p_this*>p_input,*„video*es“,*val*);****}****vlc_object_release(*p_this*>p_input*);****vlc_object_release(*p_this*);****return*NULL;}/******object*variables*callbacks:*a*bunch*of*object*variables*are*used*by*the***interfaces*to*interact*with*the*vout.***-*********/static*int*DeinterlaceCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****input_thread_t**p_input;****vlc_value_t*val;****char**psz_mode*=*newval.psz_string;****char**psz_filter,**psz_deinterlace*=*NULL;****(void)psz_cmd;*(void)oldval;*(void)p_data;****var_Get(*p_vout,*„vout*filter“,*&val*);****psz_filter*=*val.psz_string;****if(*psz_filter*)*psz_deinterlace*=*strstr(*psz_filter,*„deinterlace“*);****if(*!psz_mode*||*!*psz_mode*)****{********if(*psz_deinterlace*)********{************char**psz_src*=*psz_deinterlace*+*sizeof(„deinterlace“)***1;************if(*psz_src[0]*==*‚:‘*)*psz_src++;************memmove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_lace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_

DOSSiER | open source, philosophie du libre

philosophie du LibRE

OPENSOURcE

> en couverture

«Je suis parti sur l’idée d’un portrait, qui amène l’idée de la personne, de l’humain. Le portrait, c’est l’être et l’esprit. Sur un fond de ciel, cela amène l’idée de l’âme, et de bien d’autres choses. Ce portrait pour amener un côté très spirituel au sujet. On y retrouve de la technique et du numérique. Le hardware, le câblage, l’alliance homme-machine, l’esprit ouvert par la machine. La machine qui devient prolongement, voire remplacement du cerveau. Je me suis servi d’une citation d’un bouquin qui parlait d’Internet et qui expliquait que depuis toujours l’outil est le prolongement du corps, comme par exemple le marteau était un prolongement de la main. Aujourd’hui, l’ordinateur et le réseau sont des outils qui deviennent le prolongement du cerveau. D’où l’idée de la technique dans l’Homme. Prolongement du cerveau et ouverture de l’esprit par la technique. J’amène aussi de la légèreté et de l’aérien avec les oiseaux autour. Ensuite, j’ai voulu y amener un côté épique et baroque dans l’ambiance. Malgré tout, c’est une guerre, une révolution. Une nouvelle forme de guerre, mais une guerre quand même. La guerre de l’info, du traitement de l’info, des savoirs, des partages, etc. Bref, des libertés.Le côté glaive, l’anti copyright en écusson tributaire gravé sur le front du personnage, le regard et l’air sérieux. On pourrait un peu croire que ce personnage est le chef d’une tribu. Il a un côté atemporel, mélangeant son côté apaisant, étrange, paisible, mais aussi mystérieux. Qui pourrait aller avec les a priori, les enjeux, les dangers et les intérêts d’Internet.J’ai voulu lui donner un rôle de leader. Celui d’un chef spirituel qui rappellerait le déterminisme technologique avec une sorte de déification de la technique. Personnification de ces logiciels, de ces techniques, de ces communautés qui prônent le libre savoir. C’est pour cela aussi que je lui ai donné un peu ce côté «prophète», les yeux clairs, la barbe blanche, etc. Tous ces éléments du binaire qui l’entourent et qui en font ce qu’il est. J’amène aussi une notion de liberté au travers du ciel et des oiseaux. Des éléments qui sont pour moi synonymes de liberté et de grandeur. Enfin, ce qui est sûr, c’est que l’on a un côté fantastique là-dedans. Et c’est ce que je recherchais. Le rêve, car la science et la fiction ne sont jamais bien loin. Souvent, les écrivains de science-fiction et les chercheurs en communication trouvent ensemble les réponses aux enjeux des réseaux de demain.»

shift. // futurorg.com

Page 19: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

*NULL;****}****return*p_vout;}/********************************************************************************vout_Close:*Close*a*vout*created*by*vout_Create.*********************************************************************************You*HAVE*to*call*it*on*vout*created*by*vout_Create*before*vlc_object_release.***You*should*NEVER*call*it*on*vout*not*obtained*though*vout_Create***(like*with*vout_Request*or*vlc_object_find.)***You*can*use*vout_CloseAndRelease()*as*a*convenient*method.******************************************************************************/void*vout_Close(*vout_thread_t**p_vout*){****assert(*p_vout*);****vlc_object_kill(*p_vout*);****vlc_thread_join(*p_vout*);****module_Unneed(*p_vout,*p_vout*>p_module*);****p_vout*>p_module*=*NULL;}/***/static*void*vout_Destructor(*vlc_object_t***p_this*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****/**Make*sure*the*vout*was*stopped*first**/****assert(*!p_vout*>p_module*);****/***/****spu_Destroy(*p_vout*>p_spu*);****/**Destroy*the*locks**/****vlc_mutex_destroy(*&p_vout*>picture_lock*);****vlc_mutex_destroy(*&p_vout*>change_lock*);****vlc_mutex_destroy(*&p_vout*>vfilter_lock*);****free(*p_vout*>psz_filter_chain*);****config_ChainDestroy(*p_vout*>p_cfg*);#ifndef*__APPLE__****vout_thread_t**p_another_vout;****/**This*is*a*dirty*hack*mostly*for*Linux,*where*there*is*no*way*to*get*the*******GUI*back*if*you*closed*it*while*playing*video.*This*is*solved*in*******Mac*OS*X,*where*we*have*this*novelty*called*menubar,*that*will*always*******allow*you*access*to*the*applications*main*functionality.*They*should*try*******that*on*linux*sometime.**/****p_another_vout*=*vlc_object_find(*p_this*>p_libvlc,**************************************VLC_OBJECT_VOUT,*FIND_ANYWHERE*);****if(*p_another_vout*==*NULL*)********var_SetBool(*p_this*>p_libvlc,*„intf*show“,*true*);****else********vlc_object_release(*p_another_vout*);#endif}/*******InitThread:*initialize*video*output*thread*************This*function*is*called*from*RunThread*and*performs*the*second*step*of*the***initialization.*It*returns*0*on*success.*Note*that*the*thread‘s*flag*are*not***modified*inside*this*function.***XXX*You*have*to*enter*it*with*change_lock*taken.******************************************************************************/static*int*ChromaCreate(*vout_thread_t**p_vout*);static*void*ChromaDestroy(*vout_thread_t**p_vout*);static*bool*ChromaIsEqual(*const*picture_heap_t**p_output,*const*picture_heap_t**p_render*){*****if(*!vout_ChromaCmp(*p_output*>i_chroma,*p_render*>i_chroma*)*)*********return*false;*****if(*p_output*>i_chroma*!=*FOURCC_RV15*&&*********p_output*>i_chroma*!=*FOURCC_RV16*&&*********p_output*>i_chroma*!=*FOURCC_RV24*&&*********p_output*>i_chroma*!=*FOURCC_RV32*)*********return*true;*****return*p_output*>i_rmask*==*p_render*>i_rmask*&&************p_output*>i_gmask*==*p_render*>i_gmask*&&************p_output*>i_bmask*==*p_render*>i_bmask;}static*int*InitThread(*vout_thread_t**p_vout*){****int*i,*i_aspect_x,*i_aspect_y;#ifdef*STATS****p_vout*>c_loops*=*0;#endif****/**Initialize*output*method,*it*allocates*direct*buffers*for*us**/****if(*p_vout*>pf_init(*p_vout*)*)********return*VLC_EGENERIC;****if(*!I_OUTPUTPICTURES*)****{********msg_Err(*p_vout,*„plugin*was*unable*to*allocate*at*least*„*************************„one*direct*buffer“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****if(*I_OUTPUTPICTURES*>*VOUT_MAX_PICTURES*)****{********msg_Err(*p_vout,*„plugin*allocated*too*many*direct*buffers,*„*************************„our*internal*buffers*must*have*overflown.“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****msg_Dbg(*p_vout,*„got*%i*direct*buffer(s)“,*I_OUTPUTPICTURES*);****AspectRatio(*p_vout*>fmt_render.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*in*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_render.i_width,*p_vout*>fmt_render.i_height,*************p_vout*>fmt_render.i_x_offset,*p_vout*>fmt_render.i_y_offset,*************p_vout*>fmt_render.i_visible_width,*************p_vout*>fmt_render.i_visible_height,*************(char*)&p_vout*>fmt_render.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_render.i_sar_num,*p_vout*>fmt_render.i_sar_den*);****AspectRatio(*p_vout*>fmt_in.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*user*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_in.i_width,*p_vout*>fmt_in.i_height,*************p_vout*>fmt_in.i_x_offset,*p_vout*>fmt_in.i_y_offset,*************p_vout*>fmt_in.i_visible_width,*************p_vout*>fmt_in.i_visible_height,*************(char*)&p_vout*>fmt_in.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_in.i_sar_num,*p_vout*>fmt_in.i_sar_den*);****if(*!p_vout*>fmt_out.i_width*||*!p_vout*>fmt_out.i_height*)****{********p_vout*>fmt_out.i_width*=*p_vout*>fmt_out.i_visible_width*=************p_vout*>output.i_width;********p_vout*>fmt_out.i_height*=*p_vout*>fmt_out.i_visible_height*=************p_vout*>output.i_height;********p_vout*>fmt_out.i_x_offset*=**p_vout*>fmt_out.i_y_offset*=*0;********p_vout*>fmt_out.i_aspect*=*p_vout*>output.i_aspect;********p_vout*>fmt_out.i_chroma*=*p_vout*>output.i_chroma;****}****if(*!p_vout*>fmt_out.i_sar_num*||*!p_vout*>fmt_out.i_sar_num*)****{********p_vout*>fmt_out.i_sar_num*=*p_vout*>fmt_out.i_aspect**************p_vout*>fmt_out.i_height;********p_vout*>fmt_out.i_sar_den*=*VOUT_ASPECT_FACTOR**************p_vout*>fmt_out.i_width;****}****vlc_ureduce(*&p_vout*>fmt_out.i_sar_num,*&p_vout*>fmt_out.i_sar_den,*****************p_vout*>fmt_out.i_sar_num,*p_vout*>fmt_out.i_s a r _ d e n , * 0 * ) ; * * * * A s p e c t R a t i o ( * p _ v o u t * > f m t _ o u t . i _ a s p e c t , * & i _ a s p e c t _ x , * & i _ a s p e c t _ y * ) ; * * * * m s g _ D b g ( * p _ v o u t , * „ p i c t u r e * o u t * % i x % i * ( % i , % i , % i x % i ) , * „ * * * * * * * * * * * * * „ c h r o m a * % 4 . 4 s , * a r * % i : % i , * s a r * % i : % i “ , * * * * * * * * * * * * *p_vout*>fmt_out.i_width,*p_vout*>fmt_out.i_height,*************p_vout*>fmt_out.i_x_offset,*p_vout*>fmt_out.i_y_offset,*************p_vout*>fmt_out.i_visible_width,*************p_vout*>fmt_out.i_visible_height,*************(char*)&p_vout*>fmt_out.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_out.i_sar_num,*p_vout*>fmt_out.i_sar_den*);****/**FIXME*removed*the*need*of*both*fmt_**and*heap*infos**/****/**Calculate*shifts*from*system*updated*masks**/****PictureHeapFixRgb(*&p_vout*>render*);****VideoFormatImportRgb(*&p_vout*>fmt_render,*&p_vout*>render*);****PictureHeapFixRgb(*&p_vout*>output*);****VideoFormatImportRgb(*&p_vout*>fmt_out,*&p_vout*>output*);****/**Check*whether*we*managed*to*create*direct*buffers*similar*to*******the*render*buffers,*ie*same*size*and*chroma**/****if(*(*p_vout*>output.i_width*==*p_vout*>render.i_width*)*****&&*(*p_vout*>output.i_height*==*p_vout*>render.i_height*)*****&&*(*ChromaIsEqual(*&p_vout*>output,*&p_vout*>render*)*)*)****{********/**Cool*!*We*have*direct*buffers,*we*can*ask*the*decoder*to***********directly*decode*into*them*!*Map*the*first*render*buffers*to***********the*first*direct*buffers,*but*keep*the*first*direct*buffer***********for*memcpy*operations**/********p_vout*>b_direct*=*1;********for(*i*=*1;*i*<*VOUT_MAX_PICTURES;*i++*)********{************if(*p_vout*>p_picture[*i*].i_type*!=*DIRECT_PICTURE*&&****************I_RENDERPICTURES*>=*VOUT_MIN_DIRECT_PICTURES***1*&&****************p_vout*>p_picture[*i***1*].i_type*==*DIRECT_PICTURE*)************{****************/**We*have*enough*direct*buffers*so*there‘s*no*need*to*******************try*to*use*system*memory*buffers.**/****************break;************}************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;********}********msg_Dbg(*p_vout,*„direct*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*1*%i“,*****************VOUT_MAX_PICTURES***2,*VOUT_MAX_PICTURES***1*);****}****else****{********/**Rats...*Something*is*wrong*here,*we*could*not*find*an*output***********plugin*able*to*directly*render*what*we*decode.*See*if*we*can***********find*a*chroma*plugin*to*do*the*conversion**/********p_vout*>b_direct*=*0;********if(*ChromaCreate(*p_vout*)*)********{********p_vout*>pf_end(*p_vout*);************return*VLC_EGENERIC;********}********msg_Dbg(*p_vout,*„indirect*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*%i*%i“,*****************VOUT_MAX_PICTURES***1,*I_OUTPUTPICTURES,*****************I_OUTPUTPICTURES*+*VOUT_MAX_PICTURES***1*);********/**Append*render*buffers*after*the*direct*buffers**/********for(*i*=*I_OUTPUTPICTURES;*i*<*2***VOUT_MAX_PICTURES;*i++*)********{************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;************/**Check*if*we*have*enough*render*pictures**/************if(*I_RENDERPICTURES*==*VOUT_MAX_PICTURES*)****************break;********}****}****/**Link*pictures*back*to*their*heap**/****for(*i*=*0*;*i*<*I_RENDERPICTURES*;*i++*)****{********PP_RENDERPICTURE[*i*]*>p_heap*=*&p_vout*>render;****}****for(*i*=*0*;*i*<*I_OUTPUTPICTURES*;*i++*)****{********PP_OUTPUTPICTURE[*i*]*>p_heap*=*&p_vout*>output;****}****return*VLC_SUCCESS;}/********************************************************************************RunThread:*video*output*thread*************************************Video*output*thread.*This*function*does*only*returns*when*the*thread*is***terminated.*It*handles*the*pictures*arriving*in*the*video*heap*and*the***display*device*events.***t*******p_last_picture*=*NULL;*******************/**last*picture**/****subpicture_t****p_subpic*=*NULL;*******************/**subpicture*pointer**/****bool************b_drop_late;****int*************i_displayed*=*0,*i_lost*=*0;****/********Initialize*thread******/****vlc_mutex_lock(*&p_vout*>change_lock*);****p_vout*>b_error*=*InitThread(*p_vout*);****b_drop_late*=*var_CreateGetBool(*p_vout,*„drop*late*frames“*);****/**signal*the*creation*of*the*vout**/****vlc_thread_ready(*p_vout*);****if(*p_vout*>b_error*)****{********EndThread(*p_vout*);********vlc_mutex_unlock(*&p_vout*>change_lock*);********return*NULL;****}****vlc_object_lock(*p_vout*);****if(*p_vout*>b_title_show*)********DisplayTitleOnOSD(*p_vout*);****/********Main*loop***it*is*not*executed*if*an*error*occurred*during*******initialization******/****while(*vlc_object_alive(*p_vout*)*&&*!p_vout*>b_error*)****{********/**Initialize*loop*variables**/********const*mtime_t*current_date*=*mdate();********picture_t**p_picture*=*NULL;********picture_t**p_filtered_picture;********mtime_t*display_date*=*0;********picture_t**p_directbuffer;********input_thread_t**p_input;********int*i_index;#if*0********p_vout*>c_loops++;********if(*!(p_vout*>c_loops*%*VOUT_STATS_NB_LOOPS)*)********{************msg_Dbg(*p_vout,*„picture*heap:*%d/%d“,*********************I_RENDERPICTURES,*p_vout*>i_heap_size*);********}#endif********/**Update*statistics**/********p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);********if(*p_input*)********{************vlc_mutex_lock(*&p_input*>p*>counters.counters_lock*);************stats_UpdateInteger(*p_vout,*p_input*>p*>counters.p_lost_pictures,*********************************i_lost*,*NULL);************stats_UpdateInteger(*p_vout,*********************************p_input*>p*>counters.p_displayed_pictures,*********************************i_displayed*,*NULL);************i_displayed*=*i_lost*=*0;************vlc_mutex_unlock(*&p_input*>p*>counters.counters_lock*);************vlc_object_release(*p_input*);********}********/************Find*the*picture*to*display*(the*one*with*the*earliest*date).***********This*operation*does*not*need*lock,*since*only*READY_PICTUREs***********are*handled.**/********for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)********{************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];************if(*p_pic*>i_status*==*READY_PICTURE*&&****************(*p_picture*==*NULL*||*p_pic*>date*<*display_date*)*)************{****************p_picture*=*p_pic;****************display_date*=*p_picture*>date;************}********}********if(*p_picture*)********{************/**If*we*met*the*last*picture,*parse*again*to*see*whether*there*is***************a*more*appropriate*one.**/************if(*p_picture*==*p_last_picture*)************{****************for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)****************{********************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];********************if(*p_pic*>i_status*==*READY_PICTURE*&&************************p_pic*!=*p_last_picture*&&************************(*p_picture*==*p_last_picture*||*p_pic*>date*<*display_date*)*)********************{************************p_picture*=*p_pic;************************display_date*=*p_picture*>date;********************}****************}************}************/**If*we*found*better*than*the*last*picture,*destroy*it**/************if(*p_last_picture*&&*p_picture*!=*p_last_picture*)************{****************DropPicture(*p_vout,*p_last_picture*);****************p_last_picture*=*NULL;************}************/**Compute*FPS*rate**/************p_vout*>p_fps_sample[*p_vout*>c_fps_samples++*%*VOUT_FPS_SAMPLES*]****************=*display_date;************if(*!p_picture*>b_force*&&****************p_picture*!=*p_last_picture*&&****************display_date*<*current_date*+*p_vout*>render_time*&&****************b_drop_late*)************{****************/**Picture*is*late:*it*will*be*destroyed*and*the*thread*******************will*directly*choose*the*next*picture**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„late*picture*skipped*(%“PRId64“)“,**********************************current_date***display_date*);****************continue;************}************if(*display_date*>****************current_date*+*p_vout*>i_pts_delay*+*VOUT_BO-GUS_DELAY*)************{****************/**Picture*is*waaay*too*early:*it*will*be*destroyed**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„vout*warning:*early*picture*skipped*„**************************„(%“PRId64“)“,*display_date***current_date****************************p_vout*>i_pts_delay*);****************continue;************}************if(*display_date*>*current_date*+*VOUT_DISPLAY_DELAY*)************{****************/**A*picture*is*ready*to*be*rendered,*but*its*rendering*date*******************is*far*from*the*current*one*so*the*thread*will*perform*an*******************empty*loop*as*if*no*picture*were*found.*The*picture*state*******************is*unchanged**/****************p_picture****=*NULL;****************display_date*=*0;************}************else*if(*p_picture*==*p_last_picture*)************{****************/**We*are*asked*to*repeat*the*previous*picture,*but*we*first*******************wait*for*a*couple*of*idle*loops**/****************if(*i_idle_loops*<*4*)****************{********************p_picture****=*NULL;********************display_date*=*0;****************}****************else****************{********************/**We*set*the*display*date*to*something*high,*otherwise***we‘ll*have*lots*of*problems*with*late*pictures**/********************display_date*=*current_date*+*p_vout*>render_time;****************}************}********}********if(*p_picture*==*NULL*)************i_idle_loops++;********p_filtered_picture*=*NULL;********if(*p_picture*)************p_filtered_picture*=*filter_chain_VideoFilter(*p_vout*>p_vf2_chain,***********************************************************p_picture*);********if(*p_filtered_picture*&&*p_vout*>b_snapshot*)********{************p_vout*>b_snapshot*=*false;************vout_Snapshot(*p_vout,*p_filtered_picture*);********}********/************Check*for*subpictures*to*display**********/********if(*display_date*>*0*)********{************p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);************p_subpic*=*spu_SortSubpictures(*p_vout*>p_spu,*display_date,********************************************p_input*?*var_GetInteger(*p_input,*„state“*)*==*PAUSE_S*:*false*);************if(*p_input*)****************vlc_object_release(*p_input*);********}********/************Perform*rendering**********/********i_displayed++;********p_directbuffer*=*vout_RenderPicture(*p_vout,*p_filtered_picture,*p_subpic*);********/************Call*the*plugin*specific*rendering*method*if*there*is*one**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*&&*p_vout*>pf_render*)********{************/**Render*the*direct*buffer*returned*by*vout_RenderPicture**/************p_vout*>pf_render(*p_vout,*p_directbuffer*);********}********/************Sleep,*wake*up**********/********if(*display_date*!=*0*&&*p_directbuffer*!=*NULL*)********{************mtime_t*current_render_time*=*mdate()***current_date;************/**if*render*time*is*very*large*we*don‘t*include*it*in*the*mean**/************if(*current_render_time*<*p_vout*>render_time*+****************VOUT_DISPLAY_DELAY*)************{****************/**Store*render*time*using*a*sliding*mean*weighting*to*******************current*value*in*a*3*to*1*ratio*/****************p_vout*>render_time**=*3;****************p_vout*>render_time*+=*current_render_time;****************p_vout*>render_time*>>=*2;************}********}********/**Give*back*change*lock**/********vlc_mutex_unlock(*&p_vout*>change_lock*);********vlc_object_unlock(*p_vout*);********/**Sleep*a*while*or*until*a*given*date**/********if(*display_date*!=*0*)********{************/**If*there*are*filters*in*the*chain,*better*give*them*the*picture***************in*advance**/************if(*!p_vout*>psz_filter_chain*||*!*p_vout*>psz_filter_chain*)************{****************mwait(*display_date***VOUT_MWAIT_TOLERANCE*);************}********}********else********{************msleep(*VOUT_IDLE_SLEEP*);********}********/**On*awakening,*take*back*lock*and*send*immediately*picture***********to*display.**/********vlc_object_lock(*p_vout*);********/**Note:*vlc_object_alive()*could*be*false*here,*and*we***********could*be*dead**/********vlc_mutex_lock(*&p_vout*>change_lock*);********/************Display*the*previously*rendered*picture**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*)********{************/**Display*the*direct*buffer*returned*by*vout_RenderPicture**/************if(*p_vout*>pf_display*)****************p_vout*>pf_display(*p_vout,*p_directbuffer*);************/**Tell*the*vout*this*was*the*last*picture*and*that*it*does*not***************need*to*be*forced*anymore.**/************p_last_picture*=*p_picture;************p_last_picture*>b_force*=*false;********}********/**Drop*the*filtered*picture*if*created*by*video*filters**/********if(*p_filtered_picture*!=*NULL*&&*p_filtered_picture*!=*p_picture*)************DropPicture(*p_vout,*p_filtered_picture*);********if(*p_picture*!=*NULL*)********{************/**Reinitialize*idle*loop*count**/************i_idle_loops*=*0;********}********/************Check*events*and*manage*thread**********/********if(*p_vout*>pf_manage*&&*p_vout*>pf_manage(*p_vout*)*)********{************/**A*fatal*error*occurred,*and*the*thread*must*terminate***************immediately,*without*displaying*anything***setting*b_error*to*1***************causes*the*immediate*end*of*the*main*while()*loop.**/************//*FIXME*pf_end************p_vout*>b_error*=*1;************break;********}********if(*p_vout*>i_changes*&*VOUT_SIZE_CHANGE*)********{************/**this*must*only*happen*when*the*vout*plugin*is*incapable*of***************rescaling*the*picture*itself.*In*this*case*we*need*to*destroy***************the*current*picture*buffers*and*recreate*new*ones*with*the*right***************dimensions**/************int*i;************p_vout*>i_changes*&=*~VOUT_SIZE_CHANGE;************assert(*!p_vout*>b_direct*);************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************for(*i*=*0;*i*<*I_OUTPUTPICTURES;*i++*)*****************p_vout*>p_picture[*i*].i_status*=*FREE_PICTURE;************I_OUTPUTPICTURES*=*0;************if(*p_vout*>pf_init(*p_vout*)*)************{****************msg_Err(*p_vout,*„cannot*resize*display“*);****************/**FIXME:*pf_end*will*be*called*again*in*EndThread()**/****************p_vout*>b_error*=*1;************}************vlc_mutex_unlock(*&p_vout*>picture_lock*);************/**Need*to*reinitialise*the*chroma*plugin.*Since*we*might*need***************resizing*too*and*it‘s*not*sure*that*we*already*had*it,***************recreate*the*chroma*plugin*chain*from*scratch.**/************/**dionoea**/************if(*ChromaCreate(*p_vout*)*)************{****************msg_Err(*p_vout,*„WOW*THIS*SUCKS*BIG*TIME!!!!!“*);****************p_vout*>b_error*=*1;************}************if(*p_vout*>b_error*)****************break;********}********if(*p_vout*>i_changes*&*VOUT_PICTURE_BUFFERS_CHANGE*)********{************/**This*happens*when*the*picture*buffers*need*to*be*recreated.***************This*is*useful*on*multimonitor*displays*for*instance.*****************************Warning:*This*only*works*when*the*vout*creates*only*1*picture***************buffer!!**/************p_vout*>i_changes*&=*~VOUT_PICTURE_BUFFERS_CHANGE;************if(*!p_vout*>b_direct*)****************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************I_OUTPUTPICTURES*=*I_RENDERPICTURES*=*0;************p_vout*>b_error*=*InitThread(*p_vout*);************if(*p_vout*>b_error*)****************msg_Err(*p_vout,*„InitThread*after*VOUT_PICTURE_BUFFERS_CHANGE*failed\n“*);************vlc_mutex_unlock(*&p_vout*>picture_lock*);************if(*p_vout*>b_error*)****************break;********}********/**Check*for*„video*filter2“*changes**/********vlc_mutex_lock(*&p_vout*>vfilter_lock*);********if(*p_vout*>psz_vf2*)********{************es_format_t*fmt;************es_format_Init(*&fmt,*VIDEO_ES,*p_vout*>fmt_render.i_chroma*);************fmt.video*=*p_vout*>fmt_render;************filter_chain_Reset(*p_vout*>p_vf2_chain,*&fmt,*&fmt*);************if(*filter_chain_AppendFromString(*p_vout*>p_vf2_chain,***********************************************p_vout*>psz_vf2*)*<*0*)****************msg_Err(*p_vout,*„Video*filter*chain*creation*failed“*);************free(*p_vout*>psz_vf2*);************p_vout*>psz_vf2*=*NULL;********}********vlc_mutex_unlock(*&p_vout*>vfilter_lock*);****}****/********Error*loop***wait*until*the*thread*destruction*is*requested******/****if(*p_vout*>b_error*)********ErrorThread(*p_vout*);****/**End*of*thread**/****CleanThread(*p_vout*);****EndThread(*p_vout*);****vlc_mutex_unlock(*&p_vout*>change_lock*);****vlc_object_unlock(*p_vout*);****return*NULL;}/********************************************************************************ErrorThread:*RunThread()*error*loop*******This*function*is*called*when*an*error*occurred*during*thread*main‘s*loop.***The*thread*can*still*receive*feed,*but*must*be*ready*to*terminate*as*soon***as*possible.**********/static*void*ErrorThread(*vout_thread_t**p_vout*){****/**Wait*until*a*̀ die‘*order**/****while(*vlc_object_alive(*p_vout*)*)********vlc_object_wait(*p_vout*);}/********************************************************************************CleanThread:*clean*up*after*InitThread*********This*function*is*called*after*a*sucessful***initialization.*It*frees*all*resources*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**********/static*void*CleanThread(*vout_thread_t**p_vout*){****int*****i_index;****************************************/**index*in*heap**/****if(*!p_vout*>b_direct*)********ChromaDestroy(*p_vout*);****/**Destroy*all*remaining*pictures**/****for(*i_index*=*0;*i_index*<*2***VOUT_MAX_PICTURES*+*1;*i_index++*)****{********if*(*p_vout*>p_picture[i_index].i_type*==*MEMORY_PICTURE*)********{************free(*p_vout*>p_picture[i_index].p_data_orig*);********}****}****/**Destroy*translation*tables**/****if(*!p_vout*>b_error*)********p_vout*>pf_end(*p_vout*);}/****w**********EndThread:*thread*destruction******This*function*is*called*when*the*thread*ends.***It*frees*all*resources*not*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**************/static*void*EndThread(*vout_thread_t**p_vout*){#ifdef*STATS****{********struct*tms*cpu_usage;********times(*&cpu_usage*);********msg_Dbg(*p_vout,*„cpu*usage*(user:*%d,*system:*%d)“,*****************cpu_usage.tms_utime,*cpu_usage.tms_stime*);****}#endif****/**FIXME*does*that*function**really**need*to*be*called*inside*the*thread*?**/****/**Destroy*subpicture*unit**/****spu_Attach(*p_vout*>p_spu,*VLC_OBJECT(p_vout),*false*);****/**Destroy*the*video*filters2**/****filter_chain_Delete(*p_vout*>p_vf2_chain*);}/**Thread*helpers**/static*picture_t**ChromaGetPicture(*filter_t**p_filter*){****picture_t**p_pic*=*(picture_t**)p_filter*>p_owner;****p_filter*>p_owner*=*NULL;****return*p_pic;}static*int*ChromaCreate(*vout_thread_t**p_vout*){****static*const*char*typename[]*=*„chroma“;****filter_t**p_chroma;****/**Choose*the*best*module**/****p_chroma*=*p_vout*>p_chroma*=********vlc_custom_create(*p_vout,*sizeof(filter_t),*VLC_OBJECT_GENERIC,***************************typename*);****vlc_object_attach(*p_chroma,*p_vout*);****/**TODO:*Set*the*fmt_in*and*fmt_out*stuff*here**/****p_chroma*>fmt_in.video*=*p_vout*>fmt_render;****p_chroma*>fmt_out.video*=*p_vout*>fmt_out;****VideoFormatImportRgb(*&p_chroma*>fmt_in.video,*&p_vout*>render*);****VideoFormatImportRgb(*&p_chroma*>fmt_out.video,*&p_vout*>output*);****p_chroma*>p_module*=*module_Need(*p_chroma,*„video*filter2“,*NULL,*0*);****if(*p_chroma*>p_module*==*NULL*)****{********msg_Err(*p_vout,*„no*chroma*module*for*%4.4s*to*%4.4s*i=%dx%d*o=%dx%d“,*****************(char*)&p_vout*>render.i_chroma,*****************(char*)&p_vout*>output.i_chroma,*****************p_chroma*>fmt_in.video.i_width,*p_chroma*>fmt_in.video.i_height,*****************p_chroma*>fmt_out.video.i_width,*p_chroma*>fmt_out.video.i_height*****************);********vlc_object_release(*p_vout*>p_chroma*);********p_vout*>p_chroma*=*NULL;********return*VLC_EGENERIC;****}****p_chroma*>pf_vout_buffer_new*=*ChromaGetPicture;****return*VLC_SUCCESS;}static*void*ChromaDestroy(*vout_thread_t**p_vout*){****assert(*!p_vout*>b_direct*);****if(*!p_vout*>p_chroma*)********return;****module_Unneed(*p_vout*>p_chroma,*p_vout*>p_chroma*>p_module*);****vlc_object_release(*p_vout*>p_chroma*);****p_vout*>p_chroma*=*NULL;}static*void*DropPicture(*vout_thread_t**p_vout,*picture_t**p_picture*){****vlc_mutex_lock(*&p_vout*>picture_lock*);****if(*p_picture*>i_refcount*)****{********/**Pretend*we*displayed*the*picture,*but*don‘t*destroy***********it*since*the*decoder*might*still*need*it.**/********p_picture*>i_status*=*DISPLAYED_PICTURE;****}****else****{********/**Destroy*the*picture*without*displaying*it**/********p_picture*>i_status*=*DESTROYED_PICTURE;********p_vout*>i_heap_size**;****}****vlc_mutex_unlock(*&p_vout*>picture_lock*);}/**following*functions*are*local**/static*int*ReduceHeight(*int*i_ratio*){****int*i_dummy*=*VOUT_ASPECT_FACTOR;****int*i_pgcd**=*1;****if(*!i_ratio*)****{********return*i_pgcd;****}****/**VOUT_ASPECT_FACTOR*is*(2^7***3^3***5^3),*we*just*check*for*2,*3*and*5**/****while(*!(i_ratio*&*1)*&&*!(i_dummy*&*1)*)****{********i_ratio*>>=*1;********i_dummy*>>=*1;********i_pgcd**<<=*1;****}****while(*!(i_ratio*%*3)*&&*!(i_dummy*%*3)*)****{********i_ratio*/=*3;********i_dummy*/=*3;********i_pgcd***=*3;****}****while(*!(i_ratio*%*5)*&&*!(i_dummy*%*5)*)****{********i_ratio*/=*5;********i_dummy*/=*5;********i_pgcd***=*5;****}****return*i_pgcd;}static*void*AspectRatio(*int*i_aspect,*int**i_aspect_x,*int**i_aspect_y*){****unsigned*int*i_pgcd*=*ReduceHeight(*i_aspect*);*****i_aspect_x*=*i_aspect*/*i_pgcd;*****i_aspect_y*=*VOUT_ASPECT_FACTOR*/*i_pgcd;}/*****This*function*copies*all*RGB*informations*from*a*picture_heap_t*into***a*video_format_t**/static*void*VideoFormatImportRgb(*video_format_t**p_fmt,*const*picture_heap_t**p_heap*){****p_fmt*>i_rmask*=*p_heap*>i_rmask;****p_fmt*>i_gmask*=*p_heap*>i_gmask;****p_fmt*>i_bmask*=*p_heap*>i_bmask;****p_fmt*>i_rrshift*=*p_heap*>i_rrshift;****p_fmt*>i_lrshift*=*p_heap*>i_lrshift;****p_fmt*>i_rgshift*=*p_heap*>i_rgshift;****p_fmt*>i_lgshift*=*p_heap*>i_lgshift;****p_fmt*>i_rbshift*=*p_heap*>i_rbshift;****p_fmt*>i_lbshift*=*p_heap*>i_lbshift;}/*****This*funtion*copes*all*RGB*informations*from*a*video_format_t*into***a*picture_heap_t**/static*void*VideoFormatExportRgb(*const*video_format_t**p_fmt,*picture_heap_t**p_heap*){****p_heap*>i_rmask*=*p_fmt*>i_rmask;****p_heap*>i_gmask*=*p_fmt*>i_gmask;****p_heap*>i_bmask*=*p_fmt*>i_bmask;****p_heap*>i_rrshift*=*p_fmt*>i_rrshift;****p_heap*>i_lrshift*=*p_fmt*>i_lrshift;****p_heap*>i_rgshift*=*p_fmt*>i_rgshift;****p_heap*>i_lgshift*=*p_fmt*>i_lgshift;****p_heap*>i_rbshift*=*p_fmt*>i_rbshift;****p_heap*>i_lbshift*=*p_fmt*>i_lbshift;}/*****This*function*computes*rgb*shifts*from*masks**/static*void*PictureHeapFixRgb(*picture_heap_t**p_heap*){****video_format_t*fmt;****/***/****fmt.i_chroma*=*p_heap*>i_chroma;****VideoFormatImportRgb(*&fmt,*p_heap*);****/***/****video_format_FixRgb(*&fmt*);****VideoFormatExportRgb(*&fmt,*p_heap*);}/******Helper*thread*for*object*variables*callbacks.***Only*used*to*avoid*deadlocks*when*using*the*video*embedded*mode.*******/typedef*struct*suxor_thread_t{****VLC_COMMON_MEMBERS****input_thread_t**p_input;}*suxor_thread_t;static*void**SuxorRestartVideoES(*vlc_object_t***p_vlc_t*){****suxor_thread_t**p_this*=*(suxor_thread_t**)*p_vlc_t;****/**Now*restart*current*video*stream**/****int*val*=*var_GetInteger(*p_this*>p_input,*„video*es“*);****if(*val*>=*0*)****{********var_SetInteger(*p_this*>p_input,*„video*es“,**VIDEO_ES*);********var_SetInteger(*p_this*>p_input,*„video*es“,*val*);****}****vlc_object_release(*p_this*>p_input*);****vlc_object_release(*p_this*);****return*NULL;}/******object*variables*callbacks:*a*bunch*of*object*variables*are*used*by*the***interfaces*to*interact*with*the*vout.***-*********/static*int*DeinterlaceCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****input_thread_t**p_input;****vlc_value_t*val;****char**psz_mode*=*newval.psz_string;****char**psz_filter,**psz_deinterlace*=*NULL;****(void)psz_cmd;*(void)oldval;*(void)p_data;****var_Get(*p_vout,*„vout*filter“,*&val*);****psz_filter*=*val.psz_string;****if(*psz_filter*)*psz_deinterlace*=*strstr(*psz_filter,*„deinterlace“*);****if(*!psz_mode*||*!*psz_mode*)****{********if(*psz_deinterlace*)********{************char**psz_src*=*psz_deinterlace*+*sizeof(„deinterlace“)***1;************if(*psz_src[0]*==*‚:‘*)*psz_src++;************memmove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ *NULL;****}****return*p_vout;}/********************************************************************************vout_Close:*Close*a*vout*created*by*vout_Create.*********************************************************************************You*HAVE*to*call*it*on*vout*created*by*vout_Create*before*vlc_object_release.***You*should*NEVER*call*it*on*vout*not*obtained*though*vout_Create***(like*with*vout_Request*or*vlc_object_find.)***You*can*use*vout_CloseAndRelease()*as*a*convenient*method.******************************************************************************/void*vout_Close(*vout_thread_t**p_vout*){****assert(*p_vout*);****vlc_object_kill(*p_vout*);****vlc_thread_join(*p_vout*);****module_Unneed(*p_vout,*p_vout*>p_module*);****p_vout*>p_module*=*NULL;}/***/static*void*vout_Destructor(*vlc_object_t***p_this*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****/**Make*sure*the*vout*was*stopped*first**/****assert(*!p_vout*>p_module*);****/***/****spu_Destroy(*p_vout*>p_spu*);****/**Destroy*the*locks**/****vlc_mutex_destroy(*&p_vout*>picture_lock*);****vlc_mutex_destroy(*&p_vout*>change_lock*);****vlc_mutex_destroy(*&p_vout*>vfilter_lock*);****free(*p_vout*>psz_filter_chain*);****config_ChainDestroy(*p_vout*>p_cfg*);#ifndef*__APPLE__****vout_thread_t**p_another_vout;****/**This*is*a*dirty*hack*mostly*for*Linux,*where*there*is*no*way*to*get*the*******GUI*back*if*you*closed*it*while*playing*video.*This*is*solved*in*******Mac*OS*X,*where*we*have*this*novelty*called*menubar,*that*will*always*******allow*you*access*to*the*applications*main*functionality.*They*should*try*******that*on*linux*sometime.**/****p_another_vout*=*vlc_object_find(*p_this*>p_libvlc,**************************************VLC_OBJECT_VOUT,*FIND_ANYWHERE*);****if(*p_another_vout*==*NULL*)********var_SetBool(*p_this*>p_libvlc,*„intf*show“,*true*);****else********vlc_object_release(*p_another_vout*);#endif}/*******InitThread:*initialize*video*output*thread*************This*function*is*called*from*RunThread*and*performs*the*second*step*of*the***initialization.*It*returns*0*on*success.*Note*that*the*thread‘s*flag*are*not***modified*inside*this*function.***XXX*You*have*to*enter*it*with*change_lock*taken.******************************************************************************/static*int*ChromaCreate(*vout_thread_t**p_vout*);static*void*ChromaDestroy(*vout_thread_t**p_vout*);static*bool*ChromaIsEqual(*const*picture_heap_t**p_output,*const*picture_heap_t**p_render*){*****if(*!vout_ChromaCmp(*p_output*>i_chroma,*p_render*>i_chroma*)*)*********return*false;*****if(*p_output*>i_chroma*!=*FOURCC_RV15*&&*********p_output*>i_chroma*!=*FOURCC_RV16*&&*********p_output*>i_chroma*!=*FOURCC_RV24*&&*********p_output*>i_chroma*!=*FOURCC_RV32*)*********return*true;*****return*p_output*>i_rmask*==*p_render*>i_rmask*&&************p_output*>i_gmask*==*p_render*>i_gmask*&&************p_output*>i_bmask*==*p_render*>i_bmask;}static*int*InitThread(*vout_thread_t**p_vout*){****int*i,*i_aspect_x,*i_aspect_y;#ifdef*STATS****p_vout*>c_loops*=*0;#endif****/**Initialize*output*method,*it*allocates*direct*buffers*for*us**/****if(*p_vout*>pf_init(*p_vout*)*)********return*VLC_EGENERIC;****if(*!I_OUTPUTPICTURES*)****{********msg_Err(*p_vout,*„plugin*was*unable*to*allocate*at*least*„*************************„one*direct*buffer“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****if(*I_OUTPUTPICTURES*>*VOUT_MAX_PICTURES*)****{********msg_Err(*p_vout,*„plugin*allocated*too*many*direct*buffers,*„*************************„our*internal*buffers*must*have*overflown.“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****msg_Dbg(*p_vout,*„got*%i*direct*buffer(s)“,*I_OUTPUTPICTURES*);****AspectRatio(*p_vout*>fmt_render.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*in*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_render.i_width,*p_vout*>fmt_render.i_height,*************p_vout*>fmt_render.i_x_offset,*p_vout*>fmt_render.i_y_offset,*************p_vout*>fmt_render.i_visible_width,*************p_vout*>fmt_render.i_visible_height,*************(char*)&p_vout*>fmt_render.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_render.i_sar_num,*p_vout*>fmt_render.i_sar_den*);****AspectRatio(*p_vout*>fmt_in.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*user*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_in.i_width,*p_vout*>fmt_in.i_height,*************p_vout*>fmt_in.i_x_offset,*p_vout*>fmt_in.i_y_offset,*************p_vout*>fmt_in.i_visible_width,*************p_vout*>fmt_in.i_visible_height,*************(char*)&p_vout*>fmt_in.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_in.i_sar_num,*p_vout*>fmt_in.i_sar_den*);****if(*!p_vout*>fmt_out.i_width*||*!p_vout*>fmt_out.i_height*)****{********p_vout*>fmt_out.i_width*=*p_vout*>fmt_out.i_visible_width*=************p_vout*>output.i_width;********p_vout*>fmt_out.i_height*=*p_vout*>fmt_out.i_visible_height*=************p_vout*>output.i_height;********p_vout*>fmt_out.i_x_offset*=**p_vout*>fmt_out.i_y_offset*=*0;********p_vout*>fmt_out.i_aspect*=*p_vout*>output.i_aspect;********p_vout*>fmt_out.i_chroma*=*p_vout*>output.i_chroma;****}****if(*!p_vout*>fmt_out.i_sar_num*||*!p_vout*>fmt_out.i_sar_num*)****{********p_vout*>fmt_out.i_sar_num*=*p_vout*>fmt_out.i_aspect**************p_vout*>fmt_out.i_height;********p_vout*>fmt_out.i_sar_den*=*VOUT_ASPECT_FACTOR**************p_vout*>fmt_out.i_width;****}****vlc_ureduce(*&p_vout*>fmt_out.i_sar_num,*&p_vout*>fmt_out.i_sar_den,*****************p_vout*>fmt_out.i_sar_n u m , * p _ v o u t * > f m t _ o u t . i _ s a r _ d e n , * 0 * ) ; * * * * A s p e c t R a t i o ( * p _ v o u t * > f m t _ o u t . i _ a s p e c t , * & i _ a s p e c t _ x , * & i _ a s p e c t _ y * ) ; * * * * m s g _ D b g ( * p _ v o u t , * „ p i c t u r e * o u t * % i x % i * ( % i , % i , % i x % i ) , * „ * * * * * * * * * * * * * „ c h r o m a * % 4 . 4 s , * a r * % i : % i , * s a r * % i : % i “ , * * * * * * * * * * * * *p_vout*>fmt_out.i_width,*p_vout*>fmt_out.i_height,*************p_vout*>fmt_out.i_x_offset,*p_vout*>fmt_out.i_y_offset,*************p_vout*>fmt_out.i_visible_width,*************p_vout*>fmt_out.i_visible_height,*************(char*)&p_vout*>fmt_out.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_out.i_sar_num,*p_vout*>fmt_out.i_sar_den*);****/**FIXME*removed*the*need*of*both*fmt_**and*heap*infos**/****/**Calculate*shifts*from*system*updated*masks**/****PictureHeapFixRgb(*&p_vout*>render*);****VideoFormatImportRgb(*&p_vout*>fmt_render,*&p_vout*>render*);****PictureHeapFixRgb(*&p_vout*>output*);****VideoFormatImportRgb(*&p_vout*>fmt_out,*&p_vout*>output*);****/**Check*whether*we*managed*to*create*direct*buffers*similar*to*******the*render*buffers,*ie*same*size*and*chroma**/****if(*(*p_vout*>output.i_width*==*p_vout*>render.i_width*)*****&&*(*p_vout*>output.i_height*==*p_vout*>render.i_height*)*****&&*(*ChromaIsEqual(*&p_vout*>output,*&p_vout*>render*)*)*)****{********/**Cool*!*We*have*direct*buffers,*we*can*ask*the*decoder*to***********directly*decode*into*them*!*Map*the*first*render*buffers*to***********the*first*direct*buffers,*but*keep*the*first*direct*buffer***********for*memcpy*operations**/********p_vout*>b_direct*=*1;********for(*i*=*1;*i*<*VOUT_MAX_PICTURES;*i++*)********{************if(*p_vout*>p_picture[*i*].i_type*!=*DIRECT_PICTURE*&&****************I_RENDERPICTURES*>=*VOUT_MIN_DIRECT_PICTURES***1*&&****************p_vout*>p_picture[*i***1*].i_type*==*DIRECT_PICTURE*)************{****************/**We*have*enough*direct*buffers*so*there‘s*no*need*to*******************try*to*use*system*memory*buffers.**/****************break;************}************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;********}********msg_Dbg(*p_vout,*„direct*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*1*%i“,*****************VOUT_MAX_PICTURES***2,*VOUT_MAX_PICTURES***1*);****}****else****{********/**Rats...*Something*is*wrong*here,*we*could*not*find*an*output***********plugin*able*to*directly*render*what*we*decode.*See*if*we*can***********find*a*chroma*plugin*to*do*the*conversion**/********p_vout*>b_direct*=*0;********if(*ChromaCreate(*p_vout*)*)********{********p_vout*>pf_end(*p_vout*);************return*VLC_EGENERIC;********}********msg_Dbg(*p_vout,*„indirect*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*%i*%i“,*****************VOUT_MAX_PICTURES***1,*I_OUTPUTPICTURES,*****************I_OUTPUTPICTURES*+*VOUT_MAX_PICTURES***1*);********/**Append*render*buffers*after*the*direct*buffers**/********for(*i*=*I_OUTPUTPICTURES;*i*<*2***VOUT_MAX_PICTURES;*i++*)********{************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;************/**Check*if*we*have*enough*render*pictures**/************if(*I_RENDERPICTURES*==*VOUT_MAX_PICTURES*)****************break;********}****}****/**Link*pictures*back*to*their*heap**/****for(*i*=*0*;*i*<*I_RENDERPICTURES*;*i++*)****{********PP_RENDERPICTURE[*i*]*>p_heap*=*&p_vout*>render;****}****for(*i*=*0*;*i*<*I_OUTPUTPICTURES*;*i++*)****{********PP_OUTPUTPICTURE[*i*]*>p_heap*=*&p_vout*>output;****}****return*VLC_SUCCESS;}/********************************************************************************RunThread:*video*output*thread*************************************Video*output*thread.*This*function*does*only*returns*when*the*thread*is***terminated.*It*handles*the*pictures*arriving*in*the*video*heap*and*the***display*device*events.***t*******p_last_picture*=*NULL;*******************/**last*picture**/****subpicture_t****p_subpic*=*NULL;*******************/**subpicture*pointer**/****bool************b_drop_late;****int*************i_displayed*=*0,*i_lost*=*0;****/********Initialize*thread******/****vlc_mutex_lock(*&p_vout*>change_lock*);****p_vout*>b_error*=*InitThread(*p_vout*);****b_drop_late*=*var_CreateGetBool(*p_vout,*„drop*late*frames“*);****/**signal*the*creation*of*the*vout**/****vlc_thread_ready(*p_vout*);****if(*p_vout*>b_error*)****{********EndThread(*p_vout*);********vlc_mutex_unlock(*&p_vout*>change_lock*);********return*NULL;****}****vlc_object_lock(*p_vout*);****if(*p_vout*>b_title_show*)********DisplayTitleOnOSD(*p_vout*);****/********Main*loop***it*is*not*executed*if*an*error*occurred*during*******initialization******/****while(*vlc_object_alive(*p_vout*)*&&*!p_vout*>b_error*)****{********/**Initialize*loop*variables**/********const*mtime_t*current_date*=*mdate();********picture_t**p_picture*=*NULL;********picture_t**p_filtered_picture;********mtime_t*display_date*=*0;********picture_t**p_directbuffer;********input_thread_t**p_input;********int*i_index;#if*0********p_vout*>c_loops++;********if(*!(p_vout*>c_loops*%*VOUT_STATS_NB_LOOPS)*)********{************msg_Dbg(*p_vout,*„picture*heap:*%d/%d“,*********************I_RENDERPICTURES,*p_vout*>i_heap_size*);********}#endif********/**Update*statistics**/********p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);********if(*p_input*)********{************vlc_mutex_lock(*&p_input*>p*>counters.counters_lock*);************stats_UpdateInteger(*p_vout,*p_input*>p*>counters.p_lost_pictures,*********************************i_lost*,*NULL);************stats_UpdateInteger(*p_vout,*********************************p_input*>p*>counters.p_displayed_pictures,*********************************i_displayed*,*NULL);************i_displayed*=*i_lost*=*0;************vlc_mutex_unlock(*&p_input*>p*>counters.counters_lock*);************vlc_object_release(*p_input*);********}********/************Find*the*picture*to*display*(the*one*with*the*earliest*date).***********This*operation*does*not*need*lock,*since*only*READY_PICTUREs***********are*handled.**/********for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)********{************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];************if(*p_pic*>i_status*==*READY_PICTURE*&&****************(*p_picture*==*NULL*||*p_pic*>date*<*display_date*)*)************{****************p_picture*=*p_pic;****************display_date*=*p_picture*>date;************}********}********if(*p_picture*)********{************/**If*we*met*the*last*picture,*parse*again*to*see*whether*there*is***************a*more*appropriate*one.**/************if(*p_picture*==*p_last_picture*)************{****************for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)****************{********************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];********************if(*p_pic*>i_status*==*READY_PICTURE*&&************************p_pic*!=*p_last_picture*&&************************(*p_picture*==*p_last_picture*||*p_pic*>date*<*display_date*)*)********************{************************p_picture*=*p_pic;************************display_date*=*p_picture*>date;********************}****************}************}************/**If*we*found*better*than*the*last*picture,*destroy*it**/************if(*p_last_picture*&&*p_picture*!=*p_last_picture*)************{****************DropPicture(*p_vout,*p_last_picture*);****************p_last_picture*=*NULL;************}************/**Compute*FPS*rate**/************p_vout*>p_fps_sample[*p_vout*>c_fps_samples++*%*VOUT_FPS_SAMPLES*]****************=*display_date;************if(*!p_picture*>b_force*&&****************p_picture*!=*p_last_picture*&&****************display_date*<*current_date*+*p_vout*>render_time*&&****************b_drop_late*)************{****************/**Picture*is*late:*it*will*be*destroyed*and*the*thread*******************will*directly*choose*the*next*picture**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„late*picture*skipped*(%“PRId64“)“,**********************************current_date***display_date*);****************continue;************}************if(*display_date*>****************current_date*+*p_vout*>i_pts_delay*+*VOUT_BO-GUS_DELAY*)************{****************/**Picture*is*waaay*too*early:*it*will*be*destroyed**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„vout*warning:*early*picture*skipped*„**************************„(%“PRId64“)“,*display_date***current_date****************************p_vout*>i_pts_delay*);****************continue;************}************if(*display_date*>*current_date*+*VOUT_DISPLAY_DELAY*)************{****************/**A*picture*is*ready*to*be*rendered,*but*its*rendering*date*******************is*far*from*the*current*one*so*the*thread*will*perform*an*******************empty*loop*as*if*no*picture*were*found.*The*picture*state*******************is*unchanged**/****************p_picture****=*NULL;****************display_date*=*0;************}************else*if(*p_picture*==*p_last_picture*)************{****************/**We*are*asked*to*repeat*the*previous*picture,*but*we*first*******************wait*for*a*couple*of*idle*loops**/****************if(*i_idle_loops*<*4*)****************{********************p_picture****=*NULL;********************display_date*=*0;****************}****************else****************{********************/**We*set*the*display*date*to*something*high,*otherwise***we‘ll*have*lots*of*problems*with*late*pictures**/********************display_date*=*current_date*+*p_vout*>render_time;****************}************}********}********if(*p_picture*==*NULL*)************i_idle_loops++;********p_filtered_picture*=*NULL;********if(*p_picture*)************p_filtered_picture*=*filter_chain_VideoFilter(*p_vout*>p_vf2_chain,***********************************************************p_picture*);********if(*p_filtered_picture*&&*p_vout*>b_snapshot*)********{************p_vout*>b_snapshot*=*false;************vout_Snapshot(*p_vout,*p_filtered_picture*);********}********/************Check*for*subpictures*to*display**********/********if(*display_date*>*0*)********{************p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);************p_subpic*=*spu_SortSubpictures(*p_vout*>p_spu,*display_date,********************************************p_input*?*var_GetInteger(*p_input,*„state“*)*==*PAUSE_S*:*false*);************if(*p_input*)****************vlc_object_release(*p_input*);********}********/************Perform*rendering**********/********i_displayed++;********p_directbuffer*=*vout_RenderPicture(*p_vout,*p_filtered_picture,*p_subpic*);********/************Call*the*plugin*specific*rendering*method*if*there*is*one**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*&&*p_vout*>pf_render*)********{************/**Render*the*direct*buffer*returned*by*vout_RenderPicture**/************p_vout*>pf_render(*p_vout,*p_directbuffer*);********}********/************Sleep,*wake*up**********/********if(*display_date*!=*0*&&*p_directbuffer*!=*NULL*)********{************mtime_t*current_render_time*=*mdate()***current_date;************/**if*render*time*is*very*large*we*don‘t*include*it*in*the*mean**/************if(*current_render_time*<*p_vout*>render_time*+****************VOUT_DISPLAY_DELAY*)************{****************/**Store*render*time*using*a*sliding*mean*weighting*to*******************current*value*in*a*3*to*1*ratio*/****************p_vout*>render_time**=*3;****************p_vout*>render_time*+=*current_render_time;****************p_vout*>render_time*>>=*2;************}********}********/**Give*back*change*lock**/********vlc_mutex_unlock(*&p_vout*>change_lock*);********vlc_object_unlock(*p_vout*);********/**Sleep*a*while*or*until*a*given*date**/********if(*display_date*!=*0*)********{************/**If*there*are*filters*in*the*chain,*better*give*them*the*picture***************in*advance**/************if(*!p_vout*>psz_filter_chain*||*!*p_vout*>psz_filter_chain*)************{****************mwait(*display_date***VOUT_MWAIT_TOLERANCE*);************}********}********else********{************msleep(*VOUT_IDLE_SLEEP*);********}********/**On*awakening,*take*back*lock*and*send*immediately*picture***********to*display.**/********vlc_object_lock(*p_vout*);********/**Note:*vlc_object_alive()*could*be*false*here,*and*we***********could*be*dead**/********vlc_mutex_lock(*&p_vout*>change_lock*);********/************Display*the*previously*rendered*picture**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*)********{************/**Display*the*direct*buffer*returned*by*vout_RenderPicture**/************if(*p_vout*>pf_display*)****************p_vout*>pf_display(*p_vout,*p_directbuffer*);************/**Tell*the*vout*this*was*the*last*picture*and*that*it*does*not***************need*to*be*forced*anymore.**/************p_last_picture*=*p_picture;************p_last_picture*>b_force*=*false;********}********/**Drop*the*filtered*picture*if*created*by*video*filters**/********if(*p_filtered_picture*!=*NULL*&&*p_filtered_picture*!=*p_picture*)************DropPicture(*p_vout,*p_filtered_picture*);********if(*p_picture*!=*NULL*)********{************/**Reinitialize*idle*loop*count**/************i_idle_loops*=*0;********}********/************Check*events*and*manage*thread**********/********if(*p_vout*>pf_manage*&&*p_vout*>pf_manage(*p_vout*)*)********{************/**A*fatal*error*occurred,*and*the*thread*must*terminate***************immediately,*without*displaying*anything***setting*b_error*to*1***************causes*the*immediate*end*of*the*main*while()*loop.**/************//*FIXME*pf_end************p_vout*>b_error*=*1;************break;********}********if(*p_vout*>i_changes*&*VOUT_SIZE_CHANGE*)********{************/**this*must*only*happen*when*the*vout*plugin*is*incapable*of***************rescaling*the*picture*itself.*In*this*case*we*need*to*destroy***************the*current*picture*buffers*and*recreate*new*ones*with*the*right***************dimensions**/************int*i;************p_vout*>i_changes*&=*~VOUT_SIZE_CHANGE;************assert(*!p_vout*>b_direct*);************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************for(*i*=*0;*i*<*I_OUTPUTPICTURES;*i++*)*****************p_vout*>p_picture[*i*].i_status*=*FREE_PICTURE;************I_OUTPUTPICTURES*=*0;************if(*p_vout*>pf_init(*p_vout*)*)************{****************msg_Err(*p_vout,*„cannot*resize*display“*);****************/**FIXME:*pf_end*will*be*called*again*in*EndThread()**/****************p_vout*>b_error*=*1;************}************vlc_mutex_unlock(*&p_vout*>picture_lock*);************/**Need*to*reinitialise*the*chroma*plugin.*Since*we*might*need***************resizing*too*and*it‘s*not*sure*that*we*already*had*it,***************recreate*the*chroma*plugin*chain*from*scratch.**/************/**dionoea**/************if(*ChromaCreate(*p_vout*)*)************{****************msg_Err(*p_vout,*„WOW*THIS*SUCKS*BIG*TIME!!!!!“*);****************p_vout*>b_error*=*1;************}************if(*p_vout*>b_error*)****************break;********}********if(*p_vout*>i_changes*&*VOUT_PICTURE_BUFFERS_CHANGE*)********{************/**This*happens*when*the*picture*buffers*need*to*be*recreated.***************This*is*useful*on*multimonitor*displays*for*instance.*****************************Warning:*This*only*works*when*the*vout*creates*only*1*picture***************buffer!!**/************p_vout*>i_changes*&=*~VOUT_PICTURE_BUFFERS_CHANGE;************if(*!p_vout*>b_direct*)****************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************I_OUTPUTPICTURES*=*I_RENDERPICTURES*=*0;************p_vout*>b_error*=*InitThread(*p_vout*);************if(*p_vout*>b_error*)****************msg_Err(*p_vout,*„InitThread*after*VOUT_PICTURE_BUFFERS_CHANGE*failed\n“*);************vlc_mutex_unlock(*&p_vout*>picture_lock*);************if(*p_vout*>b_error*)****************break;********}********/**Check*for*„video*filter2“*changes**/********vlc_mutex_lock(*&p_vout*>vfilter_lock*);********if(*p_vout*>psz_vf2*)********{************es_format_t*fmt;************es_format_Init(*&fmt,*VIDEO_ES,*p_vout*>fmt_render.i_chroma*);************fmt.video*=*p_vout*>fmt_render;************filter_chain_Reset(*p_vout*>p_vf2_chain,*&fmt,*&fmt*);************if(*filter_chain_AppendFromString(*p_vout*>p_vf2_chain,***********************************************p_vout*>psz_vf2*)*<*0*)****************msg_Err(*p_vout,*„Video*filter*chain*creation*failed“*);************free(*p_vout*>psz_vf2*);************p_vout*>psz_vf2*=*NULL;********}********vlc_mutex_unlock(*&p_vout*>vfilter_lock*);****}****/********Error*loop***wait*until*the*thread*destruction*is*requested******/****if(*p_vout*>b_error*)********ErrorThread(*p_vout*);****/**End*of*thread**/****CleanThread(*p_vout*);****EndThread(*p_vout*);****vlc_mutex_unlock(*&p_vout*>change_lock*);****vlc_object_unlock(*p_vout*);****return*NULL;}/********************************************************************************ErrorThread:*RunThread()*error*loop*******This*function*is*called*when*an*error*occurred*during*thread*main‘s*loop.***The*thread*can*still*receive*feed,*but*must*be*ready*to*terminate*as*soon***as*possible.**********/static*void*ErrorThread(*vout_thread_t**p_vout*){****/**Wait*until*a*̀ die‘*order**/****while(*vlc_object_alive(*p_vout*)*)********vlc_object_wait(*p_vout*);}/********************************************************************************CleanThread:*clean*up*after*InitThread*********This*function*is*called*after*a*sucessful***initialization.*It*frees*all*resources*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**********/static*void*CleanThread(*vout_thread_t**p_vout*){****int*****i_index;****************************************/**index*in*heap**/****if(*!p_vout*>b_direct*)********ChromaDestroy(*p_vout*);****/**Destroy*all*remaining*pictures**/****for(*i_index*=*0;*i_index*<*2***VOUT_MAX_PICTURES*+*1;*i_index++*)****{********if*(*p_vout*>p_picture[i_index].i_type*==*MEMORY_PICTURE*)********{************free(*p_vout*>p_picture[i_index].p_data_orig*);********}****}****/**Destroy*translation*tables**/****if(*!p_vout*>b_error*)********p_vout*>pf_end(*p_vout*);}/****w**********EndThread:*thread*destruction******This*function*is*called*when*the*thread*ends.***It*frees*all*resources*not*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**************/static*void*EndThread(*vout_thread_t**p_vout*){#ifdef*STATS****{********struct*tms*cpu_usage;********times(*&cpu_usage*);********msg_Dbg(*p_vout,*„cpu*usage*(user:*%d,*system:*%d)“,*****************cpu_usage.tms_utime,*cpu_usage.tms_stime*);****}#endif****/**FIXME*does*that*function**really**need*to*be*called*inside*the*thread*?**/****/**Destroy*subpicture*unit**/****spu_Attach(*p_vout*>p_spu,*VLC_OBJECT(p_vout),*false*);****/**Destroy*the*video*filters2**/****filter_chain_Delete(*p_vout*>p_vf2_chain*);}/**Thread*helpers**/static*picture_t**ChromaGetPicture(*filter_t**p_filter*){****picture_t**p_pic*=*(picture_t**)p_filter*>p_owner;****p_filter*>p_owner*=*NULL;****return*p_pic;}static*int*ChromaCreate(*vout_thread_t**p_vout*){****static*const*char*typename[]*=*„chroma“;****filter_t**p_chroma;****/**Choose*the*best*module**/****p_chroma*=*p_vout*>p_chroma*=********vlc_custom_create(*p_vout,*sizeof(filter_t),*VLC_OBJECT_GENERIC,***************************typename*);****vlc_object_attach(*p_chroma,*p_vout*);****/**TODO:*Set*the*fmt_in*and*fmt_out*stuff*here**/****p_chroma*>fmt_in.video*=*p_vout*>fmt_render;****p_chroma*>fmt_out.video*=*p_vout*>fmt_out;****VideoFormatImportRgb(*&p_chroma*>fmt_in.video,*&p_vout*>render*);****VideoFormatImportRgb(*&p_chroma*>fmt_out.video,*&p_vout*>output*);****p_chroma*>p_module*=*module_Need(*p_chroma,*„video*filter2“,*NULL,*0*);****if(*p_chroma*>p_module*==*NULL*)****{********msg_Err(*p_vout,*„no*chroma*module*for*%4.4s*to*%4.4s*i=%dx%d*o=%dx%d“,*****************(char*)&p_vout*>render.i_chroma,*****************(char*)&p_vout*>output.i_chroma,*****************p_chroma*>fmt_in.video.i_width,*p_chroma*>fmt_in.video.i_height,*****************p_chroma*>fmt_out.video.i_width,*p_chroma*>fmt_out.video.i_height*****************);********vlc_object_release(*p_vout*>p_chroma*);********p_vout*>p_chroma*=*NULL;********return*VLC_EGENERIC;****}****p_chroma*>pf_vout_buffer_new*=*ChromaGetPicture;****return*VLC_SUCCESS;}static*void*ChromaDestroy(*vout_thread_t**p_vout*){****assert(*!p_vout*>b_direct*);****if(*!p_vout*>p_chroma*)********return;****module_Unneed(*p_vout*>p_chroma,*p_vout*>p_chroma*>p_module*);****vlc_object_release(*p_vout*>p_chroma*);****p_vout*>p_chroma*=*NULL;}static*void*DropPicture(*vout_thread_t**p_vout,*picture_t**p_picture*){****vlc_mutex_lock(*&p_vout*>picture_lock*);****if(*p_picture*>i_refcount*)****{********/**Pretend*we*displayed*the*picture,*but*don‘t*destroy***********it*since*the*decoder*might*still*need*it.**/********p_picture*>i_status*=*DISPLAYED_PICTURE;****}****else****{********/**Destroy*the*picture*without*displaying*it**/********p_picture*>i_status*=*DESTROYED_PICTURE;********p_vout*>i_heap_size**;****}****vlc_mutex_unlock(*&p_vout*>picture_lock*);}/**following*functions*are*local**/static*int*ReduceHeight(*int*i_ratio*){****int*i_dummy*=*VOUT_ASPECT_FACTOR;****int*i_pgcd**=*1;****if(*!i_ratio*)****{********return*i_pgcd;****}****/**VOUT_ASPECT_FACTOR*is*(2^7***3^3***5^3),*we*just*check*for*2,*3*and*5**/****while(*!(i_ratio*&*1)*&&*!(i_dummy*&*1)*)****{********i_ratio*>>=*1;********i_dummy*>>=*1;********i_pgcd**<<=*1;****}****while(*!(i_ratio*%*3)*&&*!(i_dummy*%*3)*)****{********i_ratio*/=*3;********i_dummy*/=*3;********i_pgcd***=*3;****}****while(*!(i_ratio*%*5)*&&*!(i_dummy*%*5)*)****{********i_ratio*/=*5;********i_dummy*/=*5;********i_pgcd***=*5;****}****return*i_pgcd;}static*void*AspectRatio(*int*i_aspect,*int**i_aspect_x,*int**i_aspect_y*){****unsigned*int*i_pgcd*=*ReduceHeight(*i_aspect*);*****i_aspect_x*=*i_aspect*/*i_pgcd;*****i_aspect_y*=*VOUT_ASPECT_FACTOR*/*i_pgcd;}/*****This*function*copies*all*RGB*informations*from*a*picture_heap_t*into***a*video_format_t**/static*void*VideoFormatImportRgb(*video_format_t**p_fmt,*const*picture_heap_t**p_heap*){****p_fmt*>i_rmask*=*p_heap*>i_rmask;****p_fmt*>i_gmask*=*p_heap*>i_gmask;****p_fmt*>i_bmask*=*p_heap*>i_bmask;****p_fmt*>i_rrshift*=*p_heap*>i_rrshift;****p_fmt*>i_lrshift*=*p_heap*>i_lrshift;****p_fmt*>i_rgshift*=*p_heap*>i_rgshift;****p_fmt*>i_lgshift*=*p_heap*>i_lgshift;****p_fmt*>i_rbshift*=*p_heap*>i_rbshift;****p_fmt*>i_lbshift*=*p_heap*>i_lbshift;}/*****This*funtion*copes*all*RGB*informations*from*a*video_format_t*into***a*picture_heap_t**/static*void*VideoFormatExportRgb(*const*video_format_t**p_fmt,*picture_heap_t**p_heap*){****p_heap*>i_rmask*=*p_fmt*>i_rmask;****p_heap*>i_gmask*=*p_fmt*>i_gmask;****p_heap*>i_bmask*=*p_fmt*>i_bmask;****p_heap*>i_rrshift*=*p_fmt*>i_rrshift;****p_heap*>i_lrshift*=*p_fmt*>i_lrshift;****p_heap*>i_rgshift*=*p_fmt*>i_rgshift;****p_heap*>i_lgshift*=*p_fmt*>i_lgshift;****p_heap*>i_rbshift*=*p_fmt*>i_rbshift;****p_heap*>i_lbshift*=*p_fmt*>i_lbshift;}/*****This*function*computes*rgb*shifts*from*masks**/static*void*PictureHeapFixRgb(*picture_heap_t**p_heap*){****video_format_t*fmt;****/***/****fmt.i_chroma*=*p_heap*>i_chroma;****VideoFormatImportRgb(*&fmt,*p_heap*);****/***/****video_format_FixRgb(*&fmt*);****VideoFormatExportRgb(*&fmt,*p_heap*);}/******Helper*thread*for*object*variables*callbacks.***Only*used*to*avoid*deadlocks*when*using*the*video*embedded*mode.*******/typedef*struct*suxor_thread_t{****VLC_COMMON_MEMBERS****input_thread_t**p_input;}*suxor_thread_t;static*void**SuxorRestartVideoES(*vlc_object_t***p_vlc_t*){****suxor_thread_t**p_this*=*(suxor_thread_t**)*p_vlc_t;****/**Now*restart*current*video*stream**/****int*val*=*var_GetInteger(*p_this*>p_input,*„video*es“*);****if(*val*>=*0*)****{********var_SetInteger(*p_this*>p_input,*„video*es“,**VIDEO_ES*);********var_SetInteger(*p_this*>p_input,*„video*es“,*val*);****}****vlc_object_release(*p_this*>p_input*);****vlc_object_release(*p_this*);****return*NULL;}/******object*variables*callbacks:*a*bunch*of*object*variables*are*used*by*the***interfaces*to*interact*with*the*vout.***-*********/static*int*DeinterlaceCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****input_thread_t**p_input;****vlc_value_t*val;****char**psz_mode*=*newval.psz_string;****char**psz_filter,**psz_deinterlace*=*NULL;****(void)psz_cmd;*(void)oldval;*(void)p_data;****var_Get(*p_vout,*„vout*filter“,*&val*);****psz_filter*=*val.psz_string;****if(*psz_filter*)*psz_deinterlace*=*strstr(*psz_filter,*„deinterlace“*);****if(*!psz_mode*||*!*psz_mode*)****{********if(*psz_deinterlace*)********{************char**psz_src*=*psz_deinterlace*+*sizeof(„deinterlace“)***1;************if(*psz_src[0]*==*‚:‘*)*psz_src++;************memmove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ *NULL;****}****return*p_vout;}/********************************************************************************vout_Close:*Close*a*vout*created*by*vout_Create.*********************************************************************************You*HAVE*to*call*it*on*vout*created*by*vout_Create*before*vlc_object_release.***You*should*NEVER*call*it*on*vout*not*obtained*though*vout_Create***(like*with*vout_Request*or*vlc_object_find.)***You*can*use*vout_CloseAndRelease()*as*a*convenient*method.******************************************************************************/void*vout_Close(*vout_thread_t**p_vout*){****assert(*p_vout*);****vlc_object_kill(*p_vout*);****vlc_thread_join(*p_vout*);****module_Unneed(*p_vout,*p_vout*>p_module*);****p_vout*>p_module*=*NULL;}/***/static*void*vout_Destructor(*vlc_object_t***p_this*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****/**Make*sure*the*vout*was*stopped*first**/****assert(*!p_vout*>p_module*);****/***/****spu_Destroy(*p_vout*>p_spu*);****/**Destroy*the*locks**/****vlc_mutex_destroy(*&p_vout*>picture_lock*);****vlc_mutex_destroy(*&p_vout*>change_lock*);****vlc_mutex_destroy(*&p_vout*>vfilter_lock*);****free(*p_vout*>psz_filter_chain*);****config_ChainDestroy(*p_vout*>p_cfg*);#ifndef*__APPLE__****vout_thread_t**p_another_vout;****/**This*is*a*dirty*hack*mostly*for*Linux,*where*there*is*no*way*to*get*the*******GUI*back*if*you*closed*it*while*playing*video.*This*is*solved*in*******Mac*OS*X,*where*we*have*this*novelty*called*menubar,*that*will*always*******allow*you*access*to*the*applications*main*functionality.*They*should*try*******that*on*linux*sometime.**/****p_another_vout*=*vlc_object_find(*p_this*>p_libvlc,**************************************VLC_OBJECT_VOUT,*FIND_ANYWHERE*);****if(*p_another_vout*==*NULL*)********var_SetBool(*p_this*>p_libvlc,*„intf*show“,*true*);****else********vlc_object_release(*p_another_vout*);#endif}/*******InitThread:*initialize*video*output*thread*************This*function*is*called*from*RunThread*and*performs*the*second*step*of*the***initialization.*It*returns*0*on*success.*Note*that*the*thread‘s*flag*are*not***modified*inside*this*function.***XXX*You*have*to*enter*it*with*change_lock*taken.******************************************************************************/static*int*ChromaCreate(*vout_thread_t**p_vout*);static*void*ChromaDestroy(*vout_thread_t**p_vout*);static*bool*ChromaIsEqual(*const*picture_heap_t**p_output,*const*picture_heap_t**p_render*){*****if(*!vout_ChromaCmp(*p_output*>i_chroma,*p_render*>i_chroma*)*)*********return*false;*****if(*p_output*>i_chroma*!=*FOURCC_RV15*&&*********p_output*>i_chroma*!=*FOURCC_RV16*&&*********p_output*>i_chroma*!=*FOURCC_RV24*&&*********p_output*>i_chroma*!=*FOURCC_RV32*)*********return*true;*****return*p_output*>i_rmask*==*p_render*>i_rmask*&&************p_output*>i_gmask*==*p_render*>i_gmask*&&************p_output*>i_bmask*==*p_render*>i_bmask;}static*int*InitThread(*vout_thread_t**p_vout*){****int*i,*i_aspect_x,*i_aspect_y;#ifdef*STATS****p_vout*>c_loops*=*0;#endif****/**Initialize*output*method,*it*allocates*direct*buffers*for*us**/****if(*p_vout*>pf_init(*p_vout*)*)********return*VLC_EGENERIC;****if(*!I_OUTPUTPICTURES*)****{********msg_Err(*p_vout,*„plugin*was*unable*to*allocate*at*least*„*************************„one*direct*buffer“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****if(*I_OUTPUTPICTURES*>*VOUT_MAX_PICTURES*)****{********msg_Err(*p_vout,*„plugin*allocated*too*many*direct*buffers,*„*************************„our*internal*buffers*must*have*overflown.“*);********p_vout*>pf_end(*p_vout*);********return*VLC_EGENERIC;****}****msg_Dbg(*p_vout,*„got*%i*direct*buffer(s)“,*I_OUTPUTPICTURES*);****AspectRatio(*p_vout*>fmt_render.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*in*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_render.i_width,*p_vout*>fmt_render.i_height,*************p_vout*>fmt_render.i_x_offset,*p_vout*>fmt_render.i_y_offset,*************p_vout*>fmt_render.i_visible_width,*************p_vout*>fmt_render.i_visible_height,*************(char*)&p_vout*>fmt_render.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_render.i_sar_num,*p_vout*>fmt_render.i_sar_den*);****AspectRatio(*p_vout*>fmt_in.i_aspect,*&i_aspect_x,*&i_aspect_y*);****msg_Dbg(*p_vout,*„picture*user*%ix%i*(%i,%i,%ix%i),*„*************„chroma*%4.4s,*ar*%i:%i,*sar*%i:%i“,*************p_vout*>fmt_in.i_width,*p_vout*>fmt_in.i_height,*************p_vout*>fmt_in.i_x_offset,*p_vout*>fmt_in.i_y_offset,*************p_vout*>fmt_in.i_visible_width,*************p_vout*>fmt_in.i_visible_height,*************(char*)&p_vout*>fmt_in.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_in.i_sar_num,*p_vout*>fmt_in.i_sar_den*);****if(*!p_vout*>fmt_out.i_width*||*!p_vout*>fmt_out.i_height*)****{********p_vout*>fmt_out.i_width*=*p_vout*>fmt_out.i_visible_width*=************p_vout*>output.i_width;********p_vout*>fmt_out.i_height*=*p_vout*>fmt_out.i_visible_height*=************p_vout*>output.i_height;********p_vout*>fmt_out.i_x_offset*=**p_vout*>fmt_out.i_y_offset*=*0;********p_vout*>fmt_out.i_aspect*=*p_vout*>output.i_aspect;********p_vout*>fmt_out.i_chroma*=*p_vout*>output.i_chroma;****}****if(*!p_vout*>fmt_out.i_sar_num*||*!p_vout*>fmt_out.i_sar_num*)****{********p_vout*>fmt_out.i_sar_num*=*p_vout*>fmt_out.i_aspect**************p_vout*>fmt_out.i_height;********p_vout*>fmt_out.i_sar_den*=*VOUT_ASPECT_FACTOR**************p_vout*>fmt_out.i_width;****}****vlc_ureduce(*&p_vout*>fmt_out.i_sar_num,*&p_vout*>fmt_out.i_sar_den,*****************p_vout*>fmt_out.i_sar_n u m , * p _ v o u t * > f m t _ o u t . i _ s a r _ d e n , * 0 * ) ; * * * * A s p e c t R a t i o ( * p _ v o u t * > f m t _ o u t . i _ a s p e c t , * & i _ a s p e c t _ x , * & i _ a s p e c t _ y * ) ; * * * * m s g _ D b g ( * p _ v o u t , * „ p i c t u r e * o u t * % i x % i * ( % i , % i , % i x % i ) , * „ * * * * * * * * * * * * * „ c h r o m a * % 4 . 4 s , * a r * % i : % i , * s a r * % i : % i “ , * * * * * * * * * * * * *p_vout*>fmt_out.i_width,*p_vout*>fmt_out.i_height,*************p_vout*>fmt_out.i_x_offset,*p_vout*>fmt_out.i_y_offset,*************p_vout*>fmt_out.i_visible_width,*************p_vout*>fmt_out.i_visible_height,*************(char*)&p_vout*>fmt_out.i_chroma,*************i_aspect_x,*i_aspect_y,*************p_vout*>fmt_out.i_sar_num,*p_vout*>fmt_out.i_sar_den*);****/**FIXME*removed*the*need*of*both*fmt_**and*heap*infos**/****/**Calculate*shifts*from*system*updated*masks**/****PictureHeapFixRgb(*&p_vout*>render*);****VideoFormatImportRgb(*&p_vout*>fmt_render,*&p_vout*>render*);****PictureHeapFixRgb(*&p_vout*>output*);****VideoFormatImportRgb(*&p_vout*>fmt_out,*&p_vout*>output*);****/**Check*whether*we*managed*to*create*direct*buffers*similar*to*******the*render*buffers,*ie*same*size*and*chroma**/****if(*(*p_vout*>output.i_width*==*p_vout*>render.i_width*)*****&&*(*p_vout*>output.i_height*==*p_vout*>render.i_height*)*****&&*(*ChromaIsEqual(*&p_vout*>output,*&p_vout*>render*)*)*)****{********/**Cool*!*We*have*direct*buffers,*we*can*ask*the*decoder*to***********directly*decode*into*them*!*Map*the*first*render*buffers*to***********the*first*direct*buffers,*but*keep*the*first*direct*buffer***********for*memcpy*operations**/********p_vout*>b_direct*=*1;********for(*i*=*1;*i*<*VOUT_MAX_PICTURES;*i++*)********{************if(*p_vout*>p_picture[*i*].i_type*!=*DIRECT_PICTURE*&&****************I_RENDERPICTURES*>=*VOUT_MIN_DIRECT_PICTURES***1*&&****************p_vout*>p_picture[*i***1*].i_type*==*DIRECT_PICTURE*)************{****************/**We*have*enough*direct*buffers*so*there‘s*no*need*to*******************try*to*use*system*memory*buffers.**/****************break;************}************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;********}********msg_Dbg(*p_vout,*„direct*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*1*%i“,*****************VOUT_MAX_PICTURES***2,*VOUT_MAX_PICTURES***1*);****}****else****{********/**Rats...*Something*is*wrong*here,*we*could*not*find*an*output***********plugin*able*to*directly*render*what*we*decode.*See*if*we*can***********find*a*chroma*plugin*to*do*the*conversion**/********p_vout*>b_direct*=*0;********if(*ChromaCreate(*p_vout*)*)********{********p_vout*>pf_end(*p_vout*);************return*VLC_EGENERIC;********}********msg_Dbg(*p_vout,*„indirect*render,*mapping*„*****************„render*pictures*0*%i*to*system*pictures*%i*%i“,*****************VOUT_MAX_PICTURES***1,*I_OUTPUTPICTURES,*****************I_OUTPUTPICTURES*+*VOUT_MAX_PICTURES***1*);********/**Append*render*buffers*after*the*direct*buffers**/********for(*i*=*I_OUTPUTPICTURES;*i*<*2***VOUT_MAX_PICTURES;*i++*)********{************PP_RENDERPICTURE[*I_RENDERPICTURES*]*=*&p_vout*>p_picture[*i*];************I_RENDERPICTURES++;************/**Check*if*we*have*enough*render*pictures**/************if(*I_RENDERPICTURES*==*VOUT_MAX_PICTURES*)****************break;********}****}****/**Link*pictures*back*to*their*heap**/****for(*i*=*0*;*i*<*I_RENDERPICTURES*;*i++*)****{********PP_RENDERPICTURE[*i*]*>p_heap*=*&p_vout*>render;****}****for(*i*=*0*;*i*<*I_OUTPUTPICTURES*;*i++*)****{********PP_OUTPUTPICTURE[*i*]*>p_heap*=*&p_vout*>output;****}****return*VLC_SUCCESS;}/********************************************************************************RunThread:*video*output*thread*************************************Video*output*thread.*This*function*does*only*returns*when*the*thread*is***terminated.*It*handles*the*pictures*arriving*in*the*video*heap*and*the***display*device*events.***t*******p_last_picture*=*NULL;*******************/**last*picture**/****subpicture_t****p_subpic*=*NULL;*******************/**subpicture*pointer**/****bool************b_drop_late;****int*************i_displayed*=*0,*i_lost*=*0;****/********Initialize*thread******/****vlc_mutex_lock(*&p_vout*>change_lock*);****p_vout*>b_error*=*InitThread(*p_vout*);****b_drop_late*=*var_CreateGetBool(*p_vout,*„drop*late*frames“*);****/**signal*the*creation*of*the*vout**/****vlc_thread_ready(*p_vout*);****if(*p_vout*>b_error*)****{********EndThread(*p_vout*);********vlc_mutex_unlock(*&p_vout*>change_lock*);********return*NULL;****}****vlc_object_lock(*p_vout*);****if(*p_vout*>b_title_show*)********DisplayTitleOnOSD(*p_vout*);****/********Main*loop***it*is*not*executed*if*an*error*occurred*during*******initialization******/****while(*vlc_object_alive(*p_vout*)*&&*!p_vout*>b_error*)****{********/**Initialize*loop*variables**/********const*mtime_t*current_date*=*mdate();********picture_t**p_picture*=*NULL;********picture_t**p_filtered_picture;********mtime_t*display_date*=*0;********picture_t**p_directbuffer;********input_thread_t**p_input;********int*i_index;#if*0********p_vout*>c_loops++;********if(*!(p_vout*>c_loops*%*VOUT_STATS_NB_LOOPS)*)********{************msg_Dbg(*p_vout,*„picture*heap:*%d/%d“,*********************I_RENDERPICTURES,*p_vout*>i_heap_size*);********}#endif********/**Update*statistics**/********p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);********if(*p_input*)********{************vlc_mutex_lock(*&p_input*>p*>counters.counters_lock*);************stats_UpdateInteger(*p_vout,*p_input*>p*>counters.p_lost_pictures,*********************************i_lost*,*NULL);************stats_UpdateInteger(*p_vout,*********************************p_input*>p*>counters.p_displayed_pictures,*********************************i_displayed*,*NULL);************i_displayed*=*i_lost*=*0;************vlc_mutex_unlock(*&p_input*>p*>counters.counters_lock*);************vlc_object_release(*p_input*);********}********/************Find*the*picture*to*display*(the*one*with*the*earliest*date).***********This*operation*does*not*need*lock,*since*only*READY_PICTUREs***********are*handled.**/********for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)********{************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];************if(*p_pic*>i_status*==*READY_PICTURE*&&****************(*p_picture*==*NULL*||*p_pic*>date*<*display_date*)*)************{****************p_picture*=*p_pic;****************display_date*=*p_picture*>date;************}********}********if(*p_picture*)********{************/**If*we*met*the*last*picture,*parse*again*to*see*whether*there*is***************a*more*appropriate*one.**/************if(*p_picture*==*p_last_picture*)************{****************for(*i_index*=*0;*i_index*<*I_RENDERPICTURES;*i_index++*)****************{********************picture_t**p_pic*=*PP_RENDERPICTURE[i_index];********************if(*p_pic*>i_status*==*READY_PICTURE*&&************************p_pic*!=*p_last_picture*&&************************(*p_picture*==*p_last_picture*||*p_pic*>date*<*display_date*)*)********************{************************p_picture*=*p_pic;************************display_date*=*p_picture*>date;********************}****************}************}************/**If*we*found*better*than*the*last*picture,*destroy*it**/************if(*p_last_picture*&&*p_picture*!=*p_last_picture*)************{****************DropPicture(*p_vout,*p_last_picture*);****************p_last_picture*=*NULL;************}************/**Compute*FPS*rate**/************p_vout*>p_fps_sample[*p_vout*>c_fps_samples++*%*VOUT_FPS_SAMPLES*]****************=*display_date;************if(*!p_picture*>b_force*&&****************p_picture*!=*p_last_picture*&&****************display_date*<*current_date*+*p_vout*>render_time*&&****************b_drop_late*)************{****************/**Picture*is*late:*it*will*be*destroyed*and*the*thread*******************will*directly*choose*the*next*picture**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„late*picture*skipped*(%“PRId64“)“,**********************************current_date***display_date*);****************continue;************}************if(*display_date*>****************current_date*+*p_vout*>i_pts_delay*+*VOUT_BO-GUS_DELAY*)************{****************/**Picture*is*waaay*too*early:*it*will*be*destroyed**/****************DropPicture(*p_vout,*p_picture*);****************i_lost++;****************msg_Warn(*p_vout,*„vout*warning:*early*picture*skipped*„**************************„(%“PRId64“)“,*display_date***current_date****************************p_vout*>i_pts_delay*);****************continue;************}************if(*display_date*>*current_date*+*VOUT_DISPLAY_DELAY*)************{****************/**A*picture*is*ready*to*be*rendered,*but*its*rendering*date*******************is*far*from*the*current*one*so*the*thread*will*perform*an*******************empty*loop*as*if*no*picture*were*found.*The*picture*state*******************is*unchanged**/****************p_picture****=*NULL;****************display_date*=*0;************}************else*if(*p_picture*==*p_last_picture*)************{****************/**We*are*asked*to*repeat*the*previous*picture,*but*we*first*******************wait*for*a*couple*of*idle*loops**/****************if(*i_idle_loops*<*4*)****************{********************p_picture****=*NULL;********************display_date*=*0;****************}****************else****************{********************/**We*set*the*display*date*to*something*high,*otherwise***we‘ll*have*lots*of*problems*with*late*pictures**/********************display_date*=*current_date*+*p_vout*>render_time;****************}************}********}********if(*p_picture*==*NULL*)************i_idle_loops++;********p_filtered_picture*=*NULL;********if(*p_picture*)************p_filtered_picture*=*filter_chain_VideoFilter(*p_vout*>p_vf2_chain,***********************************************************p_picture*);********if(*p_filtered_picture*&&*p_vout*>b_snapshot*)********{************p_vout*>b_snapshot*=*false;************vout_Snapshot(*p_vout,*p_filtered_picture*);********}********/************Check*for*subpictures*to*display**********/********if(*display_date*>*0*)********{************p_input*=*vlc_object_find(*p_vout,*VLC_OBJECT_INPUT,*FIND_PARENT*);************p_subpic*=*spu_SortSubpictures(*p_vout*>p_spu,*display_date,********************************************p_input*?*var_GetInteger(*p_input,*„state“*)*==*PAUSE_S*:*false*);************if(*p_input*)****************vlc_object_release(*p_input*);********}********/************Perform*rendering**********/********i_displayed++;********p_directbuffer*=*vout_RenderPicture(*p_vout,*p_filtered_picture,*p_subpic*);********/************Call*the*plugin*specific*rendering*method*if*there*is*one**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*&&*p_vout*>pf_render*)********{************/**Render*the*direct*buffer*returned*by*vout_RenderPicture**/************p_vout*>pf_render(*p_vout,*p_directbuffer*);********}********/************Sleep,*wake*up**********/********if(*display_date*!=*0*&&*p_directbuffer*!=*NULL*)********{************mtime_t*current_render_time*=*mdate()***current_date;************/**if*render*time*is*very*large*we*don‘t*include*it*in*the*mean**/************if(*current_render_time*<*p_vout*>render_time*+****************VOUT_DISPLAY_DELAY*)************{****************/**Store*render*time*using*a*sliding*mean*weighting*to*******************current*value*in*a*3*to*1*ratio*/****************p_vout*>render_time**=*3;****************p_vout*>render_time*+=*current_render_time;****************p_vout*>render_time*>>=*2;************}********}********/**Give*back*change*lock**/********vlc_mutex_unlock(*&p_vout*>change_lock*);********vlc_object_unlock(*p_vout*);********/**Sleep*a*while*or*until*a*given*date**/********if(*display_date*!=*0*)********{************/**If*there*are*filters*in*the*chain,*better*give*them*the*picture***************in*advance**/************if(*!p_vout*>psz_filter_chain*||*!*p_vout*>psz_filter_chain*)************{****************mwait(*display_date***VOUT_MWAIT_TOLERANCE*);************}********}********else********{************msleep(*VOUT_IDLE_SLEEP*);********}********/**On*awakening,*take*back*lock*and*send*immediately*picture***********to*display.**/********vlc_object_lock(*p_vout*);********/**Note:*vlc_object_alive()*could*be*false*here,*and*we***********could*be*dead**/********vlc_mutex_lock(*&p_vout*>change_lock*);********/************Display*the*previously*rendered*picture**********/********if(*p_filtered_picture*!=*NULL*&&*p_directbuffer*!=*NULL*)********{************/**Display*the*direct*buffer*returned*by*vout_RenderPicture**/************if(*p_vout*>pf_display*)****************p_vout*>pf_display(*p_vout,*p_directbuffer*);************/**Tell*the*vout*this*was*the*last*picture*and*that*it*does*not***************need*to*be*forced*anymore.**/************p_last_picture*=*p_picture;************p_last_picture*>b_force*=*false;********}********/**Drop*the*filtered*picture*if*created*by*video*filters**/********if(*p_filtered_picture*!=*NULL*&&*p_filtered_picture*!=*p_picture*)************DropPicture(*p_vout,*p_filtered_picture*);********if(*p_picture*!=*NULL*)********{************/**Reinitialize*idle*loop*count**/************i_idle_loops*=*0;********}********/************Check*events*and*manage*thread**********/********if(*p_vout*>pf_manage*&&*p_vout*>pf_manage(*p_vout*)*)********{************/**A*fatal*error*occurred,*and*the*thread*must*terminate***************immediately,*without*displaying*anything***setting*b_error*to*1***************causes*the*immediate*end*of*the*main*while()*loop.**/************//*FIXME*pf_end************p_vout*>b_error*=*1;************break;********}********if(*p_vout*>i_changes*&*VOUT_SIZE_CHANGE*)********{************/**this*must*only*happen*when*the*vout*plugin*is*incapable*of***************rescaling*the*picture*itself.*In*this*case*we*need*to*destroy***************the*current*picture*buffers*and*recreate*new*ones*with*the*right***************dimensions**/************int*i;************p_vout*>i_changes*&=*~VOUT_SIZE_CHANGE;************assert(*!p_vout*>b_direct*);************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************for(*i*=*0;*i*<*I_OUTPUTPICTURES;*i++*)*****************p_vout*>p_picture[*i*].i_status*=*FREE_PICTURE;************I_OUTPUTPICTURES*=*0;************if(*p_vout*>pf_init(*p_vout*)*)************{****************msg_Err(*p_vout,*„cannot*resize*display“*);****************/**FIXME:*pf_end*will*be*called*again*in*EndThread()**/****************p_vout*>b_error*=*1;************}************vlc_mutex_unlock(*&p_vout*>picture_lock*);************/**Need*to*reinitialise*the*chroma*plugin.*Since*we*might*need***************resizing*too*and*it‘s*not*sure*that*we*already*had*it,***************recreate*the*chroma*plugin*chain*from*scratch.**/************/**dionoea**/************if(*ChromaCreate(*p_vout*)*)************{****************msg_Err(*p_vout,*„WOW*THIS*SUCKS*BIG*TIME!!!!!“*);****************p_vout*>b_error*=*1;************}************if(*p_vout*>b_error*)****************break;********}********if(*p_vout*>i_changes*&*VOUT_PICTURE_BUFFERS_CHANGE*)********{************/**This*happens*when*the*picture*buffers*need*to*be*recreated.***************This*is*useful*on*multimonitor*displays*for*instance.*****************************Warning:*This*only*works*when*the*vout*creates*only*1*picture***************buffer!!**/************p_vout*>i_changes*&=*~VOUT_PICTURE_BUFFERS_CHANGE;************if(*!p_vout*>b_direct*)****************ChromaDestroy(*p_vout*);************vlc_mutex_lock(*&p_vout*>picture_lock*);************p_vout*>pf_end(*p_vout*);************I_OUTPUTPICTURES*=*I_RENDERPICTURES*=*0;************p_vout*>b_error*=*InitThread(*p_vout*);************if(*p_vout*>b_error*)****************msg_Err(*p_vout,*„InitThread*after*VOUT_PICTURE_BUFFERS_CHANGE*failed\n“*);************vlc_mutex_unlock(*&p_vout*>picture_lock*);************if(*p_vout*>b_error*)****************break;********}********/**Check*for*„video*filter2“*changes**/********vlc_mutex_lock(*&p_vout*>vfilter_lock*);********if(*p_vout*>psz_vf2*)********{************es_format_t*fmt;************es_format_Init(*&fmt,*VIDEO_ES,*p_vout*>fmt_render.i_chroma*);************fmt.video*=*p_vout*>fmt_render;************filter_chain_Reset(*p_vout*>p_vf2_chain,*&fmt,*&fmt*);************if(*filter_chain_AppendFromString(*p_vout*>p_vf2_chain,***********************************************p_vout*>psz_vf2*)*<*0*)****************msg_Err(*p_vout,*„Video*filter*chain*creation*failed“*);************free(*p_vout*>psz_vf2*);************p_vout*>psz_vf2*=*NULL;********}********vlc_mutex_unlock(*&p_vout*>vfilter_lock*);****}****/********Error*loop***wait*until*the*thread*destruction*is*requested******/****if(*p_vout*>b_error*)********ErrorThread(*p_vout*);****/**End*of*thread**/****CleanThread(*p_vout*);****EndThread(*p_vout*);****vlc_mutex_unlock(*&p_vout*>change_lock*);****vlc_object_unlock(*p_vout*);****return*NULL;}/********************************************************************************ErrorThread:*RunThread()*error*loop*******This*function*is*called*when*an*error*occurred*during*thread*main‘s*loop.***The*thread*can*still*receive*feed,*but*must*be*ready*to*terminate*as*soon***as*possible.**********/static*void*ErrorThread(*vout_thread_t**p_vout*){****/**Wait*until*a*̀ die‘*order**/****while(*vlc_object_alive(*p_vout*)*)********vlc_object_wait(*p_vout*);}/********************************************************************************CleanThread:*clean*up*after*InitThread*********This*function*is*called*after*a*sucessful***initialization.*It*frees*all*resources*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**********/static*void*CleanThread(*vout_thread_t**p_vout*){****int*****i_index;****************************************/**index*in*heap**/****if(*!p_vout*>b_direct*)********ChromaDestroy(*p_vout*);****/**Destroy*all*remaining*pictures**/****for(*i_index*=*0;*i_index*<*2***VOUT_MAX_PICTURES*+*1;*i_index++*)****{********if*(*p_vout*>p_picture[i_index].i_type*==*MEMORY_PICTURE*)********{************free(*p_vout*>p_picture[i_index].p_data_orig*);********}****}****/**Destroy*translation*tables**/****if(*!p_vout*>b_error*)********p_vout*>pf_end(*p_vout*);}/****w**********EndThread:*thread*destruction******This*function*is*called*when*the*thread*ends.***It*frees*all*resources*not*allocated*by*InitThread.***XXX*You*have*to*enter*it*with*change_lock*taken.**************/static*void*EndThread(*vout_thread_t**p_vout*){#ifdef*STATS****{********struct*tms*cpu_usage;********times(*&cpu_usage*);********msg_Dbg(*p_vout,*„cpu*usage*(user:*%d,*system:*%d)“,*****************cpu_usage.tms_utime,*cpu_usage.tms_stime*);****}#endif****/**FIXME*does*that*function**really**need*to*be*called*inside*the*thread*?**/****/**Destroy*subpicture*unit**/****spu_Attach(*p_vout*>p_spu,*VLC_OBJECT(p_vout),*false*);****/**Destroy*the*video*filters2**/****filter_chain_Delete(*p_vout*>p_vf2_chain*);}/**Thread*helpers**/static*picture_t**ChromaGetPicture(*filter_t**p_filter*){****picture_t**p_pic*=*(picture_t**)p_filter*>p_owner;****p_filter*>p_owner*=*NULL;****return*p_pic;}static*int*ChromaCreate(*vout_thread_t**p_vout*){****static*const*char*typename[]*=*„chroma“;****filter_t**p_chroma;****/**Choose*the*best*module**/****p_chroma*=*p_vout*>p_chroma*=********vlc_custom_create(*p_vout,*sizeof(filter_t),*VLC_OBJECT_GENERIC,***************************typename*);****vlc_object_attach(*p_chroma,*p_vout*);****/**TODO:*Set*the*fmt_in*and*fmt_out*stuff*here**/****p_chroma*>fmt_in.video*=*p_vout*>fmt_render;****p_chroma*>fmt_out.video*=*p_vout*>fmt_out;****VideoFormatImportRgb(*&p_chroma*>fmt_in.video,*&p_vout*>render*);****VideoFormatImportRgb(*&p_chroma*>fmt_out.video,*&p_vout*>output*);****p_chroma*>p_module*=*module_Need(*p_chroma,*„video*filter2“,*NULL,*0*);****if(*p_chroma*>p_module*==*NULL*)****{********msg_Err(*p_vout,*„no*chroma*module*for*%4.4s*to*%4.4s*i=%dx%d*o=%dx%d“,*****************(char*)&p_vout*>render.i_chroma,*****************(char*)&p_vout*>output.i_chroma,*****************p_chroma*>fmt_in.video.i_width,*p_chroma*>fmt_in.video.i_height,*****************p_chroma*>fmt_out.video.i_width,*p_chroma*>fmt_out.video.i_height*****************);********vlc_object_release(*p_vout*>p_chroma*);********p_vout*>p_chroma*=*NULL;********return*VLC_EGENERIC;****}****p_chroma*>pf_vout_buffer_new*=*ChromaGetPicture;****return*VLC_SUCCESS;}static*void*ChromaDestroy(*vout_thread_t**p_vout*){****assert(*!p_vout*>b_direct*);****if(*!p_vout*>p_chroma*)********return;****module_Unneed(*p_vout*>p_chroma,*p_vout*>p_chroma*>p_module*);****vlc_object_release(*p_vout*>p_chroma*);****p_vout*>p_chroma*=*NULL;}static*void*DropPicture(*vout_thread_t**p_vout,*picture_t**p_picture*){****vlc_mutex_lock(*&p_vout*>picture_lock*);****if(*p_picture*>i_refcount*)****{********/**Pretend*we*displayed*the*picture,*but*don‘t*destroy***********it*since*the*decoder*might*still*need*it.**/********p_picture*>i_status*=*DISPLAYED_PICTURE;****}****else****{********/**Destroy*the*picture*without*displaying*it**/********p_picture*>i_status*=*DESTROYED_PICTURE;********p_vout*>i_heap_size**;****}****vlc_mutex_unlock(*&p_vout*>picture_lock*);}/**following*functions*are*local**/static*int*ReduceHeight(*int*i_ratio*){****int*i_dummy*=*VOUT_ASPECT_FACTOR;****int*i_pgcd**=*1;****if(*!i_ratio*)****{********return*i_pgcd;****}****/**VOUT_ASPECT_FACTOR*is*(2^7***3^3***5^3),*we*just*check*for*2,*3*and*5**/****while(*!(i_ratio*&*1)*&&*!(i_dummy*&*1)*)****{********i_ratio*>>=*1;********i_dummy*>>=*1;********i_pgcd**<<=*1;****}****while(*!(i_ratio*%*3)*&&*!(i_dummy*%*3)*)****{********i_ratio*/=*3;********i_dummy*/=*3;********i_pgcd***=*3;****}****while(*!(i_ratio*%*5)*&&*!(i_dummy*%*5)*)****{********i_ratio*/=*5;********i_dummy*/=*5;********i_pgcd***=*5;****}****return*i_pgcd;}static*void*AspectRatio(*int*i_aspect,*int**i_aspect_x,*int**i_aspect_y*){****unsigned*int*i_pgcd*=*ReduceHeight(*i_aspect*);*****i_aspect_x*=*i_aspect*/*i_pgcd;*****i_aspect_y*=*VOUT_ASPECT_FACTOR*/*i_pgcd;}/*****This*function*copies*all*RGB*informations*from*a*picture_heap_t*into***a*video_format_t**/static*void*VideoFormatImportRgb(*video_format_t**p_fmt,*const*picture_heap_t**p_heap*){****p_fmt*>i_rmask*=*p_heap*>i_rmask;****p_fmt*>i_gmask*=*p_heap*>i_gmask;****p_fmt*>i_bmask*=*p_heap*>i_bmask;****p_fmt*>i_rrshift*=*p_heap*>i_rrshift;****p_fmt*>i_lrshift*=*p_heap*>i_lrshift;****p_fmt*>i_rgshift*=*p_heap*>i_rgshift;****p_fmt*>i_lgshift*=*p_heap*>i_lgshift;****p_fmt*>i_rbshift*=*p_heap*>i_rbshift;****p_fmt*>i_lbshift*=*p_heap*>i_lbshift;}/*****This*funtion*copes*all*RGB*informations*from*a*video_format_t*into***a*picture_heap_t**/static*void*VideoFormatExportRgb(*const*video_format_t**p_fmt,*picture_heap_t**p_heap*){****p_heap*>i_rmask*=*p_fmt*>i_rmask;****p_heap*>i_gmask*=*p_fmt*>i_gmask;****p_heap*>i_bmask*=*p_fmt*>i_bmask;****p_heap*>i_rrshift*=*p_fmt*>i_rrshift;****p_heap*>i_lrshift*=*p_fmt*>i_lrshift;****p_heap*>i_rgshift*=*p_fmt*>i_rgshift;****p_heap*>i_lgshift*=*p_fmt*>i_lgshift;****p_heap*>i_rbshift*=*p_fmt*>i_rbshift;****p_heap*>i_lbshift*=*p_fmt*>i_lbshift;}/*****This*function*computes*rgb*shifts*from*masks**/static*void*PictureHeapFixRgb(*picture_heap_t**p_heap*){****video_format_t*fmt;****/***/****fmt.i_chroma*=*p_heap*>i_chroma;****VideoFormatImportRgb(*&fmt,*p_heap*);****/***/****video_format_FixRgb(*&fmt*);****VideoFormatExportRgb(*&fmt,*p_heap*);}/******Helper*thread*for*object*variables*callbacks.***Only*used*to*avoid*deadlocks*when*using*the*video*embedded*mode.*******/typedef*struct*suxor_thread_t{****VLC_COMMON_MEMBERS****input_thread_t**p_input;}*suxor_thread_t;static*void**SuxorRestartVideoES(*vlc_object_t***p_vlc_t*){****suxor_thread_t**p_this*=*(suxor_thread_t**)*p_vlc_t;****/**Now*restart*current*video*stream**/****int*val*=*var_GetInteger(*p_this*>p_input,*„video*es“*);****if(*val*>=*0*)****{********var_SetInteger(*p_this*>p_input,*„video*es“,**VIDEO_ES*);********var_SetInteger(*p_this*>p_input,*„video*es“,*val*);****}****vlc_object_release(*p_this*>p_input*);****vlc_object_release(*p_this*);****return*NULL;}/******object*variables*callbacks:*a*bunch*of*object*variables*are*used*by*the***interfaces*to*interact*with*the*vout.***-*********/static*int*DeinterlaceCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_this;****input_thread_t**p_input;****vlc_value_t*val;****char**psz_mode*=*newval.psz_string;****char**psz_filter,**psz_deinterlace*=*NULL;****(void)psz_cmd;*(void)oldval;*(void)p_data;****var_Get(*p_vout,*„vout*filter“,*&val*);****psz_filter*=*val.psz_string;****if(*psz_filter*)*psz_deinterlace*=*strstr(*psz_filter,*„deinterlace“*);****if(*!psz_mode*||*!*psz_mode*)****{********if(*psz_deinterlace*)********{************char**psz_src*=*psz_deinterlace*+*sizeof(„deinterlace“)***1;************if(*psz_src[0]*==*‚:‘*)*psz_src++;************memmove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_ove(*psz_deinterlace,*psz_src,*strlen(psz_src)*+*1*);********}****}****else*if(*!psz_deinterlace*)****{********psz_filter*=*realloc(*psz_filter,*strlen(*psz_filter*)*+******************************sizeof(„:deinterlace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_filter;****var_Set(*p_vout,*„vout*filter“,*val*);****free(*psz_filter*);****return*VLC_SUCCESS;}static*int*FilterCallback(*vlc_object_t**p_this,*char*const**psz_cmd,***********************vlc_value_t*oldval,*vlc_value_t*newval,*void**p_data*){****vout_thread_t**p_vout*=*(vout_thread_t**)p_lace“)*);********if(*psz_filter*&&**psz_filter*)*strcat(*psz_filter,*„:“*);********strcat(*psz_filter,*„deinterlace“*);****}****p_input*=*(input_thread_t**)vlc_object_find(*p_this,*VLC_OBJECT_INPUT,*************************************************FIND_PARENT*);****if(*!p_input*)*return*VLC_EGENERIC;****if(*psz_mode*&&**psz_mode*)****{********/**Modify*input*as*well*because*the*vout*might*have*to*be*restarted**/********val.psz_string*=*psz_mode;********var_Create(*p_input,*„deinterlace*mode“,*VLC_VAR_STRING*);********var_Set(*p_input,*„deinterlace*mode“,*val*);****}****vlc_object_release(*p_input*);****val.b_bool*=*true;****var_Set(*p_vout,*„intf*change“,*val*);****val.psz_string*=*psz_

M ais qu’est-ce qu’un logiciel «libre»? Et ça veut dire quoi, «open source»? Diront les néophytes. Et ils auront raison. Dif-ficile de résumer tout un mouvement, une communauté de personnes, de

travailleurs, informaticiens et simples utilisateurs. Une philosophie, en quelques mots... Alors prenons un exem-ple, bien connu de certains : l’imprimante de Richard Stallman. Qui est Stallman ? Un ingénieur informaticien qui travaillait au laboratoire d’intelligence artificielle du Massachusetts Institute of Technology (MIT). Un jour, le laboratoire reçoit une nouvelle imprimante, censée être plus fiable que la précédente. Mais voilà, cette impri-mante n’a de cesse de tomber en panne. Les ingénieurs du laboratoire pensent alors écrire un programme pour que l’imprimante leur envoie un message à chaque fois qu’elle tombe en panne, voire même un autre programme qui pourra améliorer les performances de la machine. Mais l’imprimante a été livrée sans son pilote, c’est-à-dire sans le logiciel (sous forme de «code source») qui la fait fonctionner. L’histoire veut que Stallman, ayant entendu parler d’un laboratoire qui possède les codes sources de ce logiciel, va les demander cordialement. Mais ces homologues refusent de les lui donner, car ils ont signé avec le constructeur une close de non divulgation du code, de la «recette» du logiciel si vous préférez. Le logiciel est donc «propriétaire». Vous pouvez l’utiliser, mais surtout pas le reprendre, le modifier, ni le copier, etc. Vous devez donc vous débrouiller avec votre im-primante foireuse, même si vous avez les compétences d’améliorer son utilisation.

Naissance du «Libre»Stallman vit ce refus de la part de ses confrères comme un affront. En effet, il est coutumier à l’époque pour les chercheurs de s’échanger les résultats de leurs recher-ches. C’est à partir de là qu’il décide de fonder la Free Software Foundation (Fondation du logiciel libre). Son idée de l’informatique est qu’elle doit se baser sur une liberté totale : liberté, pour tous les individus, d’utiliser, de modifier et de distribuer n’importe quel programme. Une liberté aussi fondamentale que la liberté d’expres-sion, indissociable d’autres valeurs comme l’éthique, la responsabilité sociale, la solidarité ou l’entraide.Mais pour asseoir ce «modèle», radicalement opposé aux logiques propriétaires devenues normes dans le milieu de l’informatique, Stallman doit lui donner une base juridique. C’est ainsi qu’est née la licence GPL (General Public Licence). Non dénué d’ironie, Stallman estampille sa licence copyleft, en réponse à l’habituel copyright qui couvre juridiquement la propriété intellectuelle, valable dans le cas d’un programme informatique. En français, le

«gauche d’auteur» apporte donc l’alternative au «droit d’auteur».En 1984, le même Stallman lance un grand projet de distribution de logiciel libre : le projet GNU. Le but est d’élaborer un système d’exploitation complet et libre. Au fur et à mesure de l’avancement du projet, presque tous les programmes deviennent libres (gestion de la souris, du clavier, de l’écran, etc.). Il ne manque bientôt plus que la partie centrale, le noyau, qui doit lui aussi se «libérer». En 1991, alors que le projet GNU est bien avancé, un étudiant finlandais de 21 ans, du nom de Linus Torvalds, entame l’élaboration du noyau à partir des travaux qui étaient déjà en cours sur un système appelé Unix. Pensant apporter une contribution modeste, c’est finalement cet étudiant qui réussit à fabriquer le noyau, qu’il nomme Linux. Le système est complet. On l’appelle donc logiquement GNU/Linux.Le projet GNU/Linux est un déclencheur pour le monde du Libre, qui bénéficie alors pour la première fois d’un système opérationnel entièrement libre.

Révolution philosophiqueMais alors, quel intérêt pour l’utilisateur ? La question est légitime, et il convient d’y répondre par une autre ques-tion : quand vous achetez un ordinateur en magasin, vous posez-vous la question de son système d’exploitation ? Hélas, rarement... Une grande partie des utilisateurs ont encore du mal à concevoir l’informatique sans Windows, le système d’exploitation de Microsoft. Et si ce constat est valable pour les usagers, il l’est également pour l’éducation, enjeu fondamental pour les prochains utilisateurs que sont les élèves, qui auront du mal à «désapprendre» Windows si une alternative leur est offerte. D’autres choisissent Mac, en effet, qui utilise les mêmes logiques propriétaires et com-merciales que Microsoft. Pas étonnant alors que le choix soit restreint, puisque Microsoft et Mac OSX contrôlent encore presque 95% de la distribution. Et les distributeurs et constructeurs ne sont apparemment pas mécontents de ce statu quo. Sachez juste qu’avec des logiciels propriétai-res, il vous faut régulièrement effectuer des mises à jour... payantes. Par ailleurs, un problème fréquent qui se pose est celui de l’interopérabilité : tous vos fichiers textes, tableurs, vidéo, musique, etc. ne sont pas toujours compatibles en fonction des versions. Face à ces incohérences, le mou-vement du Libre a voulu changer la donne, modifier les comportements, insuffler une autre logique que celle de la propriété, restrictive et agressive.Ce qu’on peut appeler la «révolution du Libre» est née d’une prouesse humaine et éthique plus que d’un réel progrès technique : redonner de la valeur à l’échange, la solidarité, l’entraide, le don, en alternative aux carcans éco-nomiques actuels. Une utopie devenue bien réelle.

......................................................I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII ? XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII 19 ? /

philosophie du LibRE

OPENSOURcE

une révolution en marche...

Page 20: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

I II III IV V VI VII ? IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII20 / ? ......................................................

trust hard de microsoft

Notes----------------------------------------1. www.microsoft.com/fr

2. Hold up planétaire, Roberto Di Cosmo, Dominique Nora, 1998, édition Zéro Heurewww.dicosmo.org/HoldUp

3. Liste disponible sur : www.bons-vendeurs-ordinateurs.info

4. Archives de Businessweek.com, 15 juillet 1996, Inside Microsoft.

5. Article publié sur Clubic.com, le 26 Février 2009. Ballmer : Windows face au piratage et à Linux.

L a petite société de Bill Gates et Paul Allen s’est bien engraissée depuis ses débuts en 1975 dans la ville d’Albuquerque au Nouveau-Mexi-que. Dès les années 80, ces deux étudiants se spécialisent dans l’interprétation du langage

informatique1. Leur génie commercial est basé sur la pro-priété. Alors que la norme poussait les éditeurs de logiciels à les vendre avec leurs droits, Paul et Bill ont vendu leur premier logiciel (l’Altair BASIC, ancêtre du MS-DOS, ndlr) avec une simple licence d’exploitation au constructeur d’ordinateurs MITS. En restant ainsi propriétaires d’un logiciel «en location», ils peuvent exiger de toucher un pourcentage sur tous les exemplaires exploités. Et facturer les améliorations et compléments. Le développement du logiciel propriétaire va à l’encontre de la philosophie du Libre et de l’Open source, née à la même époque. Mais il est pourtant devenu la norme ultradominante, bien que

payante et intrusive2.

Position hégémoniqueIl est aujourd’hui presque impossible d’acheter

des ordinateurs qui ne sont pas déjà équipés de Windows. Cette pratique est illégale. Les vendeurs

d’hardware doivent laisser aux clients le choix des li-cences et pilotes des logiciels.

L’Association francophone des utilisateurs de logiciels libres publie une «liste des

bons et mauvais vendeurs d’ordinateur personnel3», ré-

gulièrement mise à jour. Parmi les mauvais élèves, Dell, Cdiscount, Fnac,

Carrefour et Darty «omettent» de préci-ser avec quels logiciels et licences est fourni leur

matériel informatique, ni la part que cela représente dans le coût d’achat final. Par ailleurs, ces mêmes logiciels ont une incapacité «naturelle» à opérer avec d’autres produits. Microsoft possède un langage propriétaire qui ne permet pas à tous les systèmes de communiquer avec lui, ils ne sont pas interopérables. Ce qui limite parfois les usages que l’on peut en faire, mais assure à la marque une position hégémonique. Il existe différents degrés d’opérabilité. La compatibilité est le niveau zéro, elle permet à deux systè-mes différents de dialoguer. Ensuite, le langage Microsoft est devenu un «standard de fait» lorsqu’il a commencé à devenir le système dominant. L’interopérabilité de ses logiciels, ou compatibilité universelle, lui ferait perdre cette position...Actuellement, les logiciels Windows équipent près de 90% du parc informatique mondial. Niveau part de marché, on fait difficilement mieux ! Et pour continuer à faire du profit malgré tout, Bill Gates ne manque pas d’idées. Les logiciels nécessitent d’être régulièrement mis à jour ou remplacés par des versions plus récentes. Les versions d’essai livrées gratuitement avec Windows, qui deviennent obsolètes et menaçantes pour le système une fois passée la période d’essai, doivent finalement être achetées. Ces «racketi-ciels» se basent sur ce que l’on appelle une obsolescence

programmée, ou comment continuer à vendre des produits à des utilisateurs de façon contrainte. Alors que la plupart des entreprises de logiciels testent leurs produits avant de les commercialiser, Microsoft a été la seule à vendre plu-sieurs fois la version bêta d’un logiciel (version imparfaite destinée à détecter les derniers bugs, ndlr).

Duperies recordsCe monopole féroce se résume dans une devise qu’un diri-geant d’Intel aurait prêté au Vice-président de Microsoft lors d’un meeting en 1995 : «Embrace, extend and extinguish»4 («Adopte, conquiers et extermine») qui en dit long sur leur politique concurrentielle. En revanche, la devise officielle «Votre talent, notre passion» laisse transparaître beaucoup plus de collaboration et de participatif. Un premier pas vers l’interopérabilité ? L’entreprise y a été contrainte. En 2004, la Commission européenne condamne Microsoft à ouvrir les codes de ses logiciels et à vendre des versions de Windows sans le lecteur Media Player, le tout accompagné d’une amende record de près de 500 millions d’euros. Mais il en faut plus pour faire plier le géant du logiciel, qui n’a toujours pas changé ses pratiques. En février 2008, il écope d’une deuxième amende de 899 millions d’euros. Sur ces quatre mêmes années, Microsoft versait à ses actionnaires 56 milliards d’euros de dividendes. Ce qui montre le fossé entre les sommes réclamées par les instances européennes et les bénéfices générés par ces infractions. Ces sommes records ne représentent que 2% du chiffre d’affaires de la firme à la fenêtre multicolore. Or, lors du second jugement, la Cour pénale internationale aurait pu exiger jusqu’à 10% du chiffre d’affaires annuel, soit 4,5 milliards d’euros. Selon Steve Ballmer, PDG de Microsoft, la concurrence vient désormais davantage de Linux que d’Apple5. La marche de l’Empereur du libre sur la banquise est encore longue.

Par Emmanuel Lemoine

Qu’ont en commun la Xbox, Hotmail ou Vista ? Hormis le fait que ces produits sont entrés dans le langage informatique courant, ils appartiennent tous à Microsoft. Nous avons cliqué dans les propriétés du système… et analysé l’art du trust, pas si soft.

L’aLpHabet KLiNgoNieN à La Loupe---------------------------------------------------------------------------------Dans son livre Piège dans le cyberespace, Roberto Di Cosmo propose un monde imaginaire. Il s’agit du pays des Techno-Crétins, où une entreprise, appelons-la Macropresse, obtient peu à peu le contrôle absolu des imprimeries de la planète. Les éditeurs lui confient leurs journaux à imprimer avec des caractères Macropresse, dont elle est la seule propriétaire. Un beau jour, l’entreprise explique à grand renfort de publicité, qu’elle a découvert des caractères beaucoup plus performants : appelons-les les caractères klingoniens, d’après l’alphabet des Klingons, dans la série télévisée StarTrek. Et elle commence à imprimer tous les journaux et magazines en klingonien. Bien sûr, ces caractères ne sont lisibles que grâce à la loupe Macropresse, distribuée dans tous les kiosques, aux frais des éditeurs de journaux. Le public, ravi d’épouser la modernité, s’adapte et achète massivement la loupe. Macropresse, forte de son monopole, change alors les caractères tous les deux ans, puis tous les ans. La vieille loupe ne peut pas lire le nouveau klingonien, et il faut, à chaque version, que le public s’en procure à grands frais une autre. Flairant l’aubaine, un compétiteur invente une mini loupe, aussi efficace et bien moins chère pour lire le klingonien. Mais les éditeurs, qui ont un contrat exclusif avec Macropresse, refu-sent de la distribuer... Pire : Macropresse gagne un procès contre ce concurrent, coupable d’avoir analysé le klingonien pour concevoir sa mini loupe ! Cela vous semble scandaleux ? Jamais je ne me ferais arnaquer de la sorte, pensez-vous ? Tel est pourtant le lot quotidien des clients de Microsoft.www.dicosmo.org/Piege/FR/piege.pdf

DOSSiER | open source, philosophie du libre

Page 21: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

I II III IV V VI VII VIII ? X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII ...................................................... 21 ? /

libre n’est pas gratuit

Notes----------------------------------------1. La cathédrale et le Bazar, Eric Steven Raymond. www.linux-france.org/article/these/cathedrale-bazar

2. «Libre comme “liberté d’expres-sion”, pas comme “bière gratuite”»

L a métaphore est souvent utilisée : Microsoft est une cathédrale. La plus grande de celles, peu nombreuses, qui règnent sur le monde de l’informatique. Comme toutes les cathé-drales, elle est majestueuse, secrète, pleine de

vénération, et surtout très puissante. Le premier à utiliser le terme est Eric Steven Raymond, informaticien et jour-naliste américain, quand il écrit, en 1997, La Cathédrale et le Bazar, qui explique selon lui les raisons du succès des logiciels libres face aux grand groupes propriétaires.

Révolution méthodologiqueEric S. Raymond n’est pas un novice : informaticien de formation, hacker à ses heures perdues, il fût l’un des premiers contributeurs du système d’exploitation GNU, et a longtemps collaboré aux développements d’Unix, entre autres. Pourtant, en 1993, quand il découvre Linux et la méthode de travail de son géniteur, Linus Torvalds, il comprend qu’il s’agit d’une profonde révolution mé-thodologique.À l’opposé des grands logiciels (et systèmes d’exploitation), qui se construisent comme des cathédrales, «soigneuse-ment élaborées par des sorciers isolés ou des petits groupes de mages travaillant à l’écart du monde»1, la communauté Linux ressemblait à un grand bazar, «grouillant de rituels et d’approches différentes [...] à partir duquel un système stable et cohérent ne pourrait apparemment émerger que par une succession de miracles». Mais il faut croire que les miracles existent, puisque que Raymond analyse la méthodologie et la rationalise : les développeurs du Libre réussissent mieux que ceux qui travaillent pour de grandes firmes parce qu’ils sont motivés, et prennent plaisir à fabriquer des logiciels qu’ils aiment ; ils se basent essentiel-lement sur le travail d’autrui, le réutilisent et l’actualisent à volonté, gagnant ainsi un temps précieux ; la grande communauté de testeurs et d’utilisateurs permet de résoudre les pro-blèmes très rapidement ; les logiciels sont très régulièrement mis à jour, avec des numéros de version, ce qui permet de revenir à une version précédente si un développement n’est pas satisfaisant.La méthode Torvalds – «distribuez vite et souvent, déléguez tout ce que vous pou-vez déléguer, soyez ouvert jusqu’à la pro-miscuité» – n’est pas une révolution technique, mais bien conceptuelle et méthodologique. «Linux fut le premier projet qui fit un effort conscient et abouti pour utiliser le monde

entier comme réservoir de talent. [...] Torvalds fut le premier à comprendre comment jouer selon les nouvelles règles qu’un Internet omniprésent rendait possibles». Au rôle clé d’Inter-net, Linus Torvalds ajoute une gestion ouverte, basée sur l’intelligence collective, et «l’effort soutenu de nombreuses volontés travaillant dans le même sens», qui résume bien la philosophie de travail des développeurs du Libre.

Trouver un modèle économiqueLe succès des logiciels libres repose également sur une rencontre fortuite : d’un côté les acteurs (développeurs compétents et passionnés, fondamentalement altruistes), de l’autre des utilisateurs, parmi lesquels des collectivités et des entreprises, qui affectent des fonds et des ressources humaines à la mise en place de systèmes libres au sein de leurs structures. Le développement des logiciels libres ne relève pas de la pure philanthropie, mais au contraire d’une profonde lo-gique économique. À la traduction du projet de R ichard Stallman en français, une petite polé-mique est apparue sur le sens du mot free, qui peut vouloir dire «libre», ou «gratuit». La logique non propriétaire est basée sur la liberté de reprendre un code source ouvert, donc «libre». Mais libre n’est pas gratuit. Autre formule bien connue pour illus-trer l’idée : «free as in “free speech”, not as in “free beer”»2. La plupart des logiciels libres sont gratuits et libre-ment téléchargeables. Les édi-

teurs du Libre ont donc dû trou-ver un modèle économique viable, qui pour la plupart est centré sur les services (installation, maintenance, assistance, etc.). On touche là à une question essentielle du Libre : les supports. On en-tend généralement par support l’accompagnement à l’installation, la maintenance ou la correction

du programme le cas échéant. Une panoplie de services mis à la disposition des utilisateurs,

des exploitants du programme, voire des programmeurs eux-mêmes. Il existe deux

grande familles de supports : les éditeurs commerciaux et les communautaires. Le support communautaire est basé

sur le bénévolat des développeurs qui travaillent sur le produit. Sur

chaque support «libre», une armada d’informaticiens sera

toujours prête à répondre à vos questions sur des

forums, à corriger les b ug s , à am él i o rer

les produits. Cette communauté est en général très

Par Julien FournierÉtudiant en sciences de l’information et de la communication

Face aux monopoles des systèmes propriétaires, le Libre développe un modèle économique viable et éthique, basé sur le respect des clients, des collaborations entre les éditeurs et une répartition juste des richesses...

...

Page 22: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

22 / ? I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI ? XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII......................................................

réactive, efficace et disponible. Le support commercial est lui basé sur des services payants qui accompagnent les produits open source. Au sein de ce modèle économique, quatre types d’acteurs à distinguer : les fondations, orga-nismes à but non lucratif, qui pilotent le développement de grands produits open source ; les distributeurs, qui sélectionnent les outils et composants autour du noyau Linux, assurent le packaging, la distribution et le support ; les éditeurs, qui créent des produits logiciels, diffusés sous licence open source, assurent leur promotion et proposent des offres de support ; et les prestataires, qui vendent des services autour des supports.

Stratégie de la peurDepuis le début des années 1990, avec le boom Internet, les logiciels libres connaissent une expansion exponentielle. À tel point que Microsoft prend la menace très au sérieux et commande, en 1998, une étude sur les avancées du Libre. Ce document, loin des clichés alors véhiculés sur les logiciels libres, reconnaît pleinement leur crédibilité : ils sont au moins aussi robustes et fiables qu’une bonne partie de logiciels propriétaires. Un ingénieur de chez Microsoft, David Stutz, ayant quitté la firme en 2003, écrit sur son site personnel3 : «Les logiciels open source constituent une vague aussi grande et puissante que l’a été Internet, et deviennent rapidement une alternative crédible à Windows». Microsoft, quelque peu débordé par la montée en puissance d’Internet, ne peut que se réfugier dans des

stratégies de discrédit de ses nouveaux adversaires. Après avoir taxé les promoteurs du libre de «communistes», quelques stratégies «Fear, Uncertainty, Doubt» («Peur, incertitude, doute») sont élaborées. Véritables guerres de propagande, ces techniques consistent en des campa-gnes de désinformation pour décrédibiliser un produit concurrentiel de meilleure qualité que le produit promu par sa propre société. Mais cela n’y changera rien, et les ingénieurs de chez Microsoft arrivent à la conclusion que la firme doit évoluer, et vite.La riposte de Microsoft sera alors financière : sur plusieurs contrats négociés avec des collectivités, la firme ira jusqu’à proposer des réductions allant de 60 à 80% sur ces produits phares, ce qui laisse pantois quant à la marge habituellement réalisée par le groupe...Aujourd’hui, plusieurs pays se tournent vers le Libre pour équiper leurs administrations. La suite bureautique Open Office est un des produits «phares» du Libre, et séduit de plus en plus d’administrations. Et, si la gratuité est souvent un élément important du processus de décision, le Libre recèle plusieurs qualités techniques, notamment en terme de sécurité. C’est donc tout naturellement que le portail du gouvernement consacré à la sécurité informatique accorde une place importante aux logiciels libres. Enfin sachez que depuis 2003, le ministère des Finances a revu entièrement son système informatique, qui a laissé une grande place aux logiciels libres en remplacement des propriétaires. Ou comment payer ses impôts en toute liberté.

...

DOSSiER | open source, philosophie du libre

Copyright : version anglo-saxone du droit d’auteur, qui protège les œuvres artistiques publiées ou non. Il régit notamment la reproduction de l’œuvre, des travaux dérivés, la distribution de copies, sous quelque forme que ce soit, et la représentation publique.

Creative Commons : Ces licences, selon leur choix, restreignent seulement quelques droits (ou aucun) des travaux, parmi celles-ci :

Copyleft est la possibilité donnée par l’auteur de copier, d’utiliser, d’étudier, de modifier et de distribuer son œuvre dans la mesure où ses possibilités restent préservées.

Attribution : signature de l’auteur initial, obligatoire en droit français.

Pas d’utilisation commerciale : le titulaire de droits peut autoriser tous les types d’utilisation ou au contraire restreindre aux utilisations non commer-ciales (les utilisations commerciales restant soumises à son autorisation).

Pas de modification : le titulaire de droits peut continuer à réserver la faculté de réaliser des œuvres de type dérivées ou au contraire autoriser à l’avance les modifications, traductions...

Paternité : l’œuvre peut être librement utilisée, à la condition de l’attribuer à son l’auteur en citant son nom.

Partage à l’identique des conditions initiales : à la possibilité d’autoriser à l’avance les modifications peut se superposer l’obligation pour les œuvres dites dérivées d’être proposées au public avec les mêmes libertés (sous les mêmes options Creative Commons) que l’œuvre originaire.

Hardware : Matériel informatique physique (disque dur, la carte mémoire, le clavier, etc.).

Software: Ensemble des composants immatériels d’un ordinateur (logiciels, programmes ou systèmes d’exploi-tation).

Free software (ou logiciel libre) : Logiciel qui donne à chaque utilisateur le droit de l’exécuter, le copier, le distribuer, l’étudier, le modifier, l’améliorer librement et sans contrepartie.

Freeware : Logiciel gratuit (en français gratuiciel), copia-ble à volonté mais dont l’auteur se réserve la propriété, le programme «source» n’étant pas modifiable.

Shareware : Logiciel payant que l’on peut utiliser en libre essai durant une période ou un nombre d’utilisations donnés. Si son utilisateur souhaite utiliser définitivement le logiciel, il a l’obligation de rétribuer l’auteur du logiciel.

Open source : S’applique aux logiciels dont la licence respecte des critères précisément établis par l’Open Source Initiative, c’est-à-dire la possibilité de libre redistribution, d’accès au code source, et de travaux dérivés.

Intéropérabilité : Capacité que possède un système, dont les interfaces sont intégralement connues, à fonctionner avec d’autres systèmes et ce sans restriction de mise en œuvre.

Linux : Désigne à la fois le système d’exploitation et le noyau, sur lesquelles sont basées de nombreuses distributions libres, créé en 1991 par Linus Torvalds. Le nom vient de l’acronyme récursif «Linux Is Not UniX».

GNU : Projet de production et de sensibilisation aux logiciels libres lancé en 1984 par Richard Stallman, qui a abouti à un véritable système d’exploitation en 1992 grâce au noyau Linux. Son nom signifie par clin d’œil : «Gnu’s Not Unix».

Quelques licences et contrats libres...-----------------------------------------------------------------------------------------------------------------

Lexique-------------------------------------------------------------------------------------

Note----------------------------------------3. www.synthesist.net

Page 23: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII ? XXIV XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII ...................................................... 23 ? /

éducation et développe... ment

Il y a quatre ans, l’école maternelle des Bois à Paris s’est équipée d’ordinateurs récupérés auprès d’entreprises ou particuliers, afin d’initier ses élèves aux joies de l’informatique. Mais «s’est vite posée la question des systèmes d’exploitation pour lesquels nous ne disposons

pas de licences», expliquait Thierry Xavier1, l’instituteur. Une bonne occasion d’éduquer aux logiciels libres dès le plus jeune âge ? C’eut été sans compter sur Microsoft Fresh Start, l’un des programmes de Partners in Learning, qui a délivré gratuitement à l’école des Bois une cinquantaine de licences Windows 2000 et l’encyclopédie Encarta. Une aubaine financière pour cette école qui peut utiliser gratuitement des logiciels propriétaires (lesquels nécessiteront des mises à jour et évolutions payantes). Un joli coup pour l’entreprise de Bill Gates qui noyaute les machines et fidélise aussi les enseignants de l’école et toutes les générations de futurs consommateurs qui useront ses bancs. Mais la France est loin d’être le pays prioritaire et le programme Partners in Learning (PIL) s’implante particulièrement dans la plupart des pays où l’informatique libre se développe. De deux choses l’une, soit Microsoft agit par pure philanthropie dans les pays émergents, soit il entrevoit un marché potentiel et cherche à couper l’herbe sous le pied de l’alternative libre...«Nous implantons une technologie et des outils dans des environ-nements éducatifs concrets afin [...] d’améliorer la réussite scolaire dans le monde entier», explique Ralph Young2, Vice-président chargé du Worldwide Public Sector chez Microsoft. En effet, avec bientôt 72 000 écoles dans une centaine de pays, Ralph Young cible un marché potentiel assez large ! Depuis son lancement en 2003, le programme PIL a équipé plus de 121 millions d’élèves et 5,5 millions d’enseignants, et il ne cesse de croître. En mars 2008, la société annonçait un financement supplémentaire de 235 millions de dollars pour cette initiative, et presque 500 millions sur les dix prochaines années.

Burkina, face aux contratsAlors que la plupart des pays ont accueilli ce programme à grand renfort de partenariats et d’éloges gouvernementaux, en revanche au Burkina Faso, une vaste polémique a accompagné l’arrivée de cette nouvelle collaboration public/privé en 2005. L’association Nouvelle technologie Burkina Faso (NTBF) a alerté sur le sens commercial caché de ce partenariat. Pour NTBF, l’accès aux nouvelles technologies de l’information et de la communication (NTIC) est un enjeu majeur d’édu-cation et d’autonomie économique dans les pays africains. L’association y voit une solution pour pallier aux pénuries d’enseignants et de ressources documentaires, grâce au e-lear-ning, à l’isolement et aux coûts des communications, avec les courriers électroniques.En avril 2008, Ouagadougou accueillait le 2e Forum africain sur les meilleures pratiques dans le domaine des NTIC, lors duquel le PDG de Microsoft, Steve Ballmer en personne, est venu affirmer – en toute transparence – la bonne santé de son chiffre d’affaires sur le continent africain, «supérieur cette année à celui réalisé en Chine»3. Accessoirement, ce petit séjour africain lui aura aussi permis de conclure des contrats juteux avec les gouvernements d’Angola, du Maroc, du Sénégal et du Burkina Faso pour équiper les écoles en ordinateurs et logiciels.À l’échelle internationale, la vindicte contre ces pratiques

n’est pas très virulente non plus. L’Unesco a un po-sitionnement ambigu sur ces questions. Les accords conclus en septembre 2007 avec Curriki, communauté internationale d’e-learning, qui prévoient la coopération avec les ministères de l’Éducation nationaux pour travailler «au déve-loppement de contenu éducatif à accès libre et former les professionnels à la technologie des logiciels libres»4. Ces engagements sont en totale contradiction avec d’autres accords conclus en novembre 2004 avec Mi-crosoft, prévoyant des équipements massifs de systèmes propriétaires dans les pays en voie de développement. Ce paradoxe fut notamment soulevé lors des Rencontres africaines du logiciel li-bre, qui ont vu le jour à Ouagadougou. La 3e et dernière édition à Rabat (Maroc) en 2007 avait pour thème «le logiciel libre dans l’éducation»5. Leurs conclusions pourraient bien intéresser l’Unesco !

Par Maxence DelormeÉtudiant en L3 Histoire de l’art à l’Université de Nantes.

L’accès à l’informatique et à internet est un levier pour l’éducation en afrique, c’est aussi un business énorme pour les propriétaires de logiciels. La marmaille et les pauvres comme futurs clients ?

réduire La Fracture et s’éMaNciper--------------------------------------------------------------------------------------------------------------------------La Conférence des Nations Unies sur le développement (CNUCED), dans le cadre de son rapport annuel sur le Commerce électronique et développement, a mesuré pour la première fois l’impact des logiciels libres en 20031. En conclusion, elle préconisait l’utilisation des logiciels libres pour réduire la fracture numérique, inciter à la concurrence et réduire les coûts d’équipement. Le rapport note notamment que « même si ce n’est pas son faible coût qui incite, globalement, au développement du Libre et de l’open source, cela peut accélérer son adoption dans les pays en voie de développement. L’argent dépensé en licence pourrait être mieux utilisé pour former des experts en technologies de l’information ».Mais le Libre ne représente pas qu’un enjeu « économique ». Il permettrait à ces pays de s’affranchir d’une dépendance qui est également politique et juridique. Le continent asiatique l’a bien compris, puisque plusieurs pays prévoient sans complexe une stratégie de développement non propriétaire. L’Inde, l’Indonésie et la Thaïlande sont les premiers à avoir franchi le cap. Le constructeur HP fourni désormais des ordinateurs équipés en GNU/Linux aux particuliers et PME. La Chine, la Corée du Sud et le Japon sont même allés plus loin en co-créant une version asiatique de Linux, adaptée à leurs besoins. Ainsi en 2004, Asianux 2.0 voit le jour. Avoir la maîtrise des logiciels, c’est avoir la maîtrise de son développement. 1. United Nations Conference on trade and development, www.unctad.org

Notes

--------------1. www.

ec-2-bois.scola.ac-paris.fr

2. Communi-qué diffusé par Microsoft le 15 janvier 2009.

3. Tournée afri-caine de Microsoft.

Avril 2008, Centre sur les politiques internationa-les des TIC d’Afrique du Centre et de l’Ouest.

www.cipaco.org

4. L’Unesco soutient le déve-loppement et la libre diffusion

de matériel éducatif. 09 octobre 2007, Unesco. www.portal.unesco.org

5. Rencontres africaines du logi-ciel libre. www.rall.logiciels-libres.org

Page 24: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

24 / ? I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII ? XXV XXVI XXVII XXVIII XXIX XXX XXXI XXXII......................................................

vous avez dit bazar ?

F ondée sur le modèle du Bazar1, la commu-nauté virtuelle du Libre est composée d’uti-lisateurs-développeurs qui, depuis plus de 10 ans, s’attèlent à la construction d’un modèle coopératif, sans gourou ni théoricien, prenant

appui sur le potentiel de diffusion et de communication offert par Internet. L’élaboration et la réussite d’un logiciel libre ne se limite pas à la création de programmes et de lignes de codes, bien que les programmeurs soient ma-joritaires. Ils ne formeraient pas la communauté s’il n’y avait pas tous les autres, indispensables au bon dévelop-pement d’un logiciel : les bêta-testeurs, les rédacteurs de mode d’emploi, les traducteurs, etc. C’est pourquoi il est préférable d’utiliser le terme de «développeur» à celui de «programmeur» lorsque l’on parle des acteurs de la communauté du Libre en général. En fait, la plupart des logiciels libres fonctionne avec peu de personnes, sans le préalable d’une décision formelle. Il y a toujours un coordinateur – souvent l’initiateur – et les échanges entre les membres du groupe sont importants. Le processus, à l’évidence d’essence libertaire, est une application prati-que du principe consistant à concilier autorité et absence d’autoritarisme. Sans hiérarchie ni centralisation, le système ne peut fonctionner que dans le cadre d’une autorégula-tion du groupe. Rien d’étonnant donc à ce que la Toile soit devenue le support de l’esprit et de l’aboutissement du logiciel libre.

Un modèle volontaire innovantOutre la pratique libertaire dans son choix d’organisation

structurelle, le mouvement du logiciel libre montre que, par le partage de l’information, on peut donner de la visi-bilité à ses compétences tout en bénéficiant de celles des autres et de leur expérience. Cette nouvelle dynamique sociale est porteuse dans son rapport alternatif au travail et à l’argent ainsi que dans l’éthique2 particulière qui est véhiculée au sein de ce modèle coopératif volontaire. La force de la communauté se construit autour de son po-tentiel humain. Elle piétine le principe d’appropriation exclusive de l’information et du savoir. Une démarche fondamentalement humaniste.En 2003, une étude menée au niveau mondial par la Confé-rence des Nations unies sur le commerce et le développe-ment a montré qu’environ un tiers des développeurs du Libre a comme motivation première le Libre lui-même : que le code soit ouvert à tous3. Un quart d’entre eux est d’abord intéressé par la stimulation intellectuelle que cela procure, un cinquième représente des professionnels que cette activité aide dans leur travail, alors que le dernier cin-quième apprécie l’expérience qu’il peut acquérir à travers la programmation du Libre.L’étude montre que plus de 70% d’entre eux sont âgés de 22 à 37 ans ; ce sont surtout des professionnels, puisque la moitié sont des programmeurs ou administrateurs-systèmes de métier, alors que seulement 20% se disent étudiants, éparpillés aux quatre coins de la planète.Pour fédérer l’ensemble des projets et les associer à tous ces individus, des sites web4 les regroupent et leur permettent de se rencontrer. Le Libre, symbole d’un modèle de Bazar, n’a en tout cas rien de chaotique.

Par Sophie Girard

pour le commun des mortels, le monde de l’informatique se présente souvent comme une entité obscure et inaccessible. Méconnu du grand public, on constate que dans ce domaine les

stéréotypes vont bon train. alors qui se cache derrière ces lignes de codes ?

Notes----------------------------------------1. La cathédrale et le Bazar, Eric Steven Raymondwww.linux-france.org/article/these/cathedrale-bazar

2. L’Ethique Hacker, Pekka Hima-nen, Exils 2001

3. CNUCED, e-commerce and deve-lopment Report 2003, 20 novembre 2003, www.unctad.org

4. www.freshmeat.net ouwww.sourceforge.net

DOSSiER | open source, philosophie du libre

Page 25: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV ? XXVI XXVII XXVIII XXIX XXX XXXI XXXII ...................................................... 25 ? /

Note----------------------------------------1. GNU Network object model envi-ronment. Le projet Gnome est un logiciel libre qui fait partie du projet GNU. Il vise à offrir à ses utilisateurs et développeurs un contrôle total de leur environnement, de leurs applications et de leurs données.www.gnomefr.org

stéphane raimbault est développeur au sein du projet gnome1. sa vision d’ « ingénieur du Libre » permet de mieux cerner le fonctionnement et l’éthique de l’open source. un hacker passionné par le travail en réseau et l’intelligence collective.

europa : Quel est votre parcours et comment êtes-vous arrivé au Libre ?stéphane raimbault : J’ai une formation d’ingénieur. À l’université, j’ai très vite commencé à m’intéresser aux logiciels... libres ! Et c’est une distinction importante. J’y suis venu en 96-98, avec les débuts d’Internet, qui facilitait l’échange et le partage de codes sources. J’étais dans un environnement scientifique, donc mes collègues avaient déjà la démarche de partager leurs travaux et les résultats de leurs recherches. Il était donc naturel d’appliquer la même méthodologie à l’informatique. On a commencé à s’équiper pour surfer sur Internet, pour échanger des choses, et nous nous sommes intéressés aux logiciels libres. Nous avons déployé de nombreux services au sein de l’université qui avaient vocation à promouvoir Internet et à être utilisés par les étudiants. Différents projets ont été réalisés, des bornes interactives pour les étudiants, on a animé quelques sites web, on a travaillé sur différentes choses liées au Web. Ensuite j’ai continué mes études, je suis allé travailler, et je me suis toujours intéressé à ce qui existait dans le monde du logiciel libre. Donc c’est assez naturellement que j’ai continué à les utiliser quand j’ai commencé à travailler. J’ai d’ailleurs fait des choix en entreprise basés sur ces logiciels.

C’est donc un vrai choix que celui du Libre ? Quel est le moteur de cette motivation, de cette éthique ?s. r. : Oui, c’est un vrai choix. Il y a plusieurs facteurs à ça. Je crois que le tout premier est que je n’étais pas satisfait de la qualité des logiciels issus du monde propriétaire, es-sentiellement ceux de Microsoft. Ce sont de bons produits malgré tout, mais je rencontrais trop de problèmes, trop de bugs, trop d’instabilité. En plus, ils imposaient leurs choix, qui étaient souvent commerciaux, sans laisser aux utilisateurs la liberté de choisir. Par exemple, vous avez un document qui a été écrit dans un format et puis le lende-main on vous dit : «Eh bien maintenant la nouvelle version fonctionne différemment.» Leur performance sur le réseau était catastrophique. Par exemple, quand Internet a débuté, leurs systèmes ne permettaient pas la mise en réseau. Ce sont des problèmes pratiques.Et puis l’autre point, c’est le côté technique : lorsque j’ai un problème, je ne veux pas appeler un service ou une assistance par téléphone en disant : «Voilà j’ai un problème, ça ne fonctionne pas» et attendre qu’on veuille bien corriger mon problème, ce qui peut prendre des mois. Quand je trouve des problèmes, je peux directement discuter avec le développeur sur le projet. S’il n’a pas le temps et que moi j’ai la compétence, je vais creuser et résoudre le problème moi-même, soumettre un correctif. Le problème est traité dans la semaine et c’est clos.

Quel temps consacrez-vous à Gnome en moyenne ?s. r. : Disons que c’est variable, je m’organise selon mes libertés. Ça peut aller de trois ou quatre heures par soir ou l’après-midi, pendant la sieste des enfants. Il y a des périodes de rush et des périodes plus calmes. Je suis venu à ce projet essentiellement par l’effort de traduction, parce qu’il était mal traduit en français et ça m’agaçait de voir des chaînes

mal traduites à l’écran. La particularité de ce travail est qu’il est très intense sur la fin. D’abord les développements sont réalisés, puis l’interface est figée, et là interviennent les tra-ducteurs pour traduire toutes ces chaînes de l’anglais vers leur langue maternelle, et s’en suivent environ 3 semaines très intenses.

Comment peut-on collaborer à Gnome et quelles sont les compétences requises ?s. r. : Il y a deux sortes d’accès à la collaboration. Quand vous faites un correctif sur un logiciel, il doit être approuvé par quelqu’un, le mainteneur, responsable du module. Puis il y a des gens qui ont un accès direct et peuvent «com-miter», c’est à dire faire des modifications sur le serveur officiel, serveur de référence sur lequel se trouve la version reconnue par tous et approuvée du programme. Mille personnes ont accès au référentiel et peuvent effectuer un changement. J’en fais partie. J’ai eu ce droit d’accès d’abord comme coordinateur de la traduction française, et maintenant je m’en sers pour contribuer à un autre pro-gramme qui permet de coordonner l’effort de traduction et de coordonner toutes les équipes via un processus de relecture. L’environnement est traduit en 48 langues. Au sein du projet Gnome il existe des gens qui ne connaissent rien à la technique mais qui sont des acteurs importants, parce qu’ils font des remarques, travaillent sur du contenu pour le site web, préparent des réunions ou des meetings, organisent les notes qui ne nécessitent pas forcément de connaissances techniques. Il existe aussi des gens qui sont de simples utilisateurs, hors de la communauté d’un projet, qui vont jouer le jeu d’avoir la toute nouvelle version, et font naturellement remonter les problèmes. C’est une communauté importante du Libre et c’est la grande force de l’Open source.

Comment se structure le Libre en interne ? Quel est son modèle hiérarchique ?s. r. : C’est un point important. Les logiciels libres fonc-tionnent beaucoup sur la méritocratie. Le meilleur a le pouvoir. C’est tout l’inverse de ce qui peut se passer en entreprise où la structure est définie par une hiérarchie imposée par la direction. Dans le Libre, la personne qui va être reconnue n’est pas celle qui parle le plus fort ou qui a le plus grand charisme, c’est celle qui offre les meilleurs choix techniques, les meilleures solutions. Donc parfois les rôles changent. Ce qui est important dans un projet open source, c’est la reconnaissance. Lorsque quelqu’un contribue ou a contribué, il aime au moins voir son nom inscrit quelque part, pour que son travail soit reconnu par ses pairs. C’est un moteur important de la motivation.

Vous considérez-vous comme un hacker ?s. r. : En fait, le terme est souvent confondu avec cracker, dont la vocation est de s’introduire dans un système. Le hacker est quelqu’un qui aime programmer. Pour lui, c’est un vrai plaisir. C’est la définition que j’ai du hacker. Donc oui, je suis passionné, j’aime le développement, disons que je me considère comme un hacker.

Propos recueillis parSophie Girard

...comme c’est bazar !

Page 26: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

26 / ? I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV ? XXVII XXVIII XXIX XXX XXXI XXXII......................................................

L’«open cola»-----------------------------------------------------------------Ce Cola a été créé pour expliquer le principe du logi-ciel libre. Tous les ingrédients sont connus et la recette est libre de toute modification. Il vous est donc possi-ble de boire, modifier et distribuer cet «open cola».La base :10,0 grammes E 4143,50 millilitres d’huile d‘orange3 millilitres d‘eau 2,75 millilitres d’huile de lime1,25 millilitres d’huile de cannelle 1,00 millilitres d’huile de citron 1,00 millilitres d’huile de muscade0,25 millilitres d’huile de coriandre 0,25 millilitres d’huile de neroli0,25 millilitres d’huile de lavandeLe concentré :2 cuillères à café de la base3,5 cuillères à café de E 338 ou acide citrique2,36 kilogrammes du sucre2,28 litres d‘eau30 millilitres de E 1501 demi-cuillère à café de caféineLa boisson :Une dose de concentré et 5 doses de soda

1/ Qu’est-ce qu’une «distribution»?Il y en a plusieurs dizaines, vous trouverez forcément chaussure à votre pied. Certaines sont faites pour les ordinateurs vieux et faibles, d’autres pour des grosses machines bien mon-tées, d’autres sont plus adaptées au graphisme, alors que certaines se limiteront à contenter vos besoins en bureautique (texte, tableurs, navigation Internet, etc.). L’idée est d’installer une version qui soit adaptée à votre machine aussi bien qu’à vos besoins.

2/ Comment choisir sa distribution ?Des questionnaires en ligne très didactiques vous aideront dans votre démarche. Quelle est la puissance de votre machine ? (si vous ne le savez pas, un petit «touche windows + touche pause» sur votre clavier vous aidera). Quelle utilisation faites-vous de votre ordinateur ? Quel est votre niveau de connaissance en logiciels libres ? Êtes-vous téméraire ? etc. > www.zegeniestudios.net

3/ Télécharger sa versionVous avez choisi ? Presque toutes les distri-butions ont un site dédié, vous pourrez vous y rendre et trouver toutes les réponses à vos questions complémentaires. Il ne vous reste qu’à télécharger votre version et la graver sur un CD (si vous ne savez pas le faire, demandez à votre neveu). Redémarrer l’ordinateur sur le CD d’installation fraîchement gravé. Dans la plupart des cas, vous pourrez faire un essai «virtuel», sans procéder à l’installation.

4/ Installez !Si vous êtes convaincu, il ne vous reste plus qu’à cliquer sur «installer», et voilà, c’est fait !Bien sûr, il vous faudra un peu de persévérance, mais vous aurez, en cas de problème, toujours une communauté de personnes réactives à votre disposition pour répondre à vos questions. Si vous postez une question sur un forum officiel entre 19h et minuit, vous aurez, en moyenne, une réponse dans les 2 minutes ! Essayez après ça d’appeler le service après-vente de Micro-soft... Qui dit mieux ?

Installer Linux chez soi------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ça y est, vous êtes décidé. marre des virus, des incompatibilités, de windows vista qui plante, vous voulez passer sous linux. prêt pour le grand saut ? n’ayez pas peur, tout va bien se passer. procédez par étapes :

Rendez-vous libres à Nantes------------------------------------------------------------------------------------------------------------------------------------------------L’un des principaux événements de la communauté du Libre se déroulera à Nantes cet été. Du 7 au 11 juillet, les 10èmes Rencontres mondiales du logiciel libre auront lieu à l’université du Petit Port. Autour de conférences (majoritairement en anglais), d’ateliers et des soirées (très !) animées, l’objectif est de faire se rencontrer les acteurs du Libre du monde entier sur le thème de «la migration et la conduite du changement pour une informatique libre». Richard Stallman interviendra notamment sur ces conférences. L’organisation regroupe à la fois des petites associations et des organisations nationales œuvrant dans la promotion du logiciel libre : Linux-Nantes, Alliance Libre, Gulliver, Actux, La fabrique du Libre, N@utile, APO33, Login, Document Libre, LiLoLiPo, APRIL, AFUL, Mirabelug, EPPLUG, Landinux, ABUL, Libre accès.Tous les contacts et programme : www.rmll.info

Pour finir en chanson...----------------------------------------------------------------------------------------------------------------------

- black-out -DOSSiER | open source, philosophie du libre

à deuX pas d’Hadopi------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Présenté une première fois en Conseil des ministres le 18 juin 2008, le projet de loi «Création et Internet» a pour but de contrôler les droits d’auteur sur le web et de lutter contre le téléchargement illégal. Aussi appelée loi Hadopi (Haute autorité pour la diffusion des œuvres et la protection des droits sur Internet), l’autorité administrative serait en charge du contrôle et des sanctions des «pirates» du web, seulement sur saisine des ayants droit, c’est-à-dire des maisons de disques, maisons de production cinématographique, etc. Le projet a été précédemment adopté en première lecture à la quasi-unanimité le 30 octobre au Sénat. Actuellement suspendu depuis le 12 mars dernier, l’examen du texte reprendra à l’Assemblée nationale le 31 mars (date postérieure à l’écriture de ces lignes). Les anti-Hadopi se mobilisent et la polémique autour de la mesure phare, la riposte graduée, fait rage. Cette dernière se décline en trois phases : l’internaute qui télécharge illégalement recevra dans un premier temps un avertissement par mail. S’il n’en tient pas compte et continue à télécharger, un second avertissement lui sera envoyé par lettre recommandée. S’il persiste, sa connexion Internet sera pure-ment et simplement suspendue – mais il continuera à la payer – pour une durée allant d’un mois à un an, avec interdiction de se réabonner auprès de tout autre opérateur. Les critiques ne se font pas attendre et viennent de tous bords. Avant même la présentation du projet de loi, le Parlement européen a été le premier à le critiquer. L’Arcep (Autorité de régulation des communications et des postes) et la Cnil (Commission nationale de l’informatique et des libertés) ont émis des avis critiques. Cette dernière estime voir dans cette procédure de «riposte graduée» une véritable faille judiciaire. Le courant de protestation, porté par les acteurs du web et les associations d’utili-sateurs, va jusqu’à qualifier la loi de «liberticide» et «anti-constitutionnelle». La Quadrature du Net1, farouchement opposée à ce projet de loi, a publié un rapport de 42 pages retraçant les enjeux d’Hadopi, et appelle au «Black-out». Le web français s’apprête-t-il à vivre ses heures les plus sombres ?1. Collectif de citoyens français qui informe sur des projets législatifs menaçant les libertés publiques et le développement économique et social à l’ère du numérique. > www.laquadrature.net

Page 27: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez
Page 28: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

28 / ? I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII ? XXIX XXX XXXI XXXII......................................................

C hampagner ist teuer und somit exklusiv, bleibt daher ein Genuss für besondere Anlässe. Ein solcher ereignete sich im November 2007 in Le Mans. Der Bürgermeister der Stadt unterzeichnete einen Vertrag mit der

ansässigen Versicherungsgesellschaft Mutuelles du Mans Assurances (MMA). Gegenstand des Kontrakts ist das erste „Naming Right“ Frankreichs. Die Versicherungsgesellschaft bezahlt insgesamt 10 Millionen Euro an die Stadt und erhält im Gegenzug die Namensrechte am neuen Stadion. Die so getaufte MMArena wird 2009 fertig gestellt werden und dann den Fußballclub MUC 72 als Hauptmieter beheimaten. Die Stadt als Eigentümerin des Stadions erhält über die Vertragsdauer von 10 Jahren jeweils eine Million Euro per annum von der MMA. Damit werden etwa 10 Prozent der Bau- und Unterhaltungskosten für die MMArena aus dem Sponsoring finanziert.Diese monetären Vorteile rufen auch weitere Interes-senten auf den Plan, warum dem Beispiel Le Mans bald weitere „Naming Rights“ folgen dürften. Auch in Lyon befindet man sich in Gesprächen mit Investoren über die Vergabe der Namensrechte für das neue Stadion, das sich derzeit noch im Bau befindet. Entsprechende Geldgeber zu finden ist nicht schwer, denn das Werbetool „Naming Rights“ erfreut sich bei Werbern großer Beliebtheit. Für einen vergleichsweise geringen Kostenaufwand erreicht der Sponsor eine hohe „awareness“, wie es in der Mar-ketingsprache heißt. Umso erfreulicher für interessierte

Investoren ist es daher, dass sich die Stadionlandschaft gerade stark wandelt und sich dadurch neue Möglichkeiten für Investments erschließen. Denn Frankreich erlebt gerade einen wahren Bauboom.Hintergrund ist die Bewerbung Frankreichs für die Fußball-europameisterschaft 2016. Wie ein Bericht von Philippe Séguin feststellt, die dem Premierminister François Fillon vorgelegt wurde, sind die französischen Stadien im Ver-gleich zu Deutschland und England nicht konkurrenzfähig. Beflügelt von der Bewerbung werden dem Bericht zufolge derzeit 35 Stadien renoviert oder komplett neugebaut. Dafür werden erhebliche Summen notwendig sein, die der Direktor von Sport+Markt Frankreich, Olivier Michel auf etwa 2 Milliarden Euro alleine für die Stadien schätzt. Kein Wunder also, dass öffentliches Interesse besteht, diese Kosten auch auf private Schultern zu verteilen.Eine Entwicklung, die erst durch ein Umdenken der Poli-tik möglich wurde. Von wenigen Ausnahmen abgesehen, befinden sich die Stadien im Besitz der Gemeinden, wo lokale Politiker die Veräußerung des Namensrechts bislang als zu kommerzielles Interesse ansehen würden, wie Michel feststellt. Während die Fußballclubs eine zunehmende Professionalisierung an den Tag legen, fehlt es in der Lokal-politik noch an der entsprechenden Business-Orientierung. Dass sich das Tool „Naming Rights“ dennoch auf dem Vormarsch befindet, liegt für den Experten an der Wahl Sarkozys, der den möglichen Beitrag des Privatsektors im öffentlichen Interesse sehen würde.

LA vOix DE LA v.O.

Par Timo EuteneuerÉtudiant en sociologie des médias et sciences de la communication à Leipzig en Allemagne

vERtREibt

StADiON DAS

KOmmERz

Page 29: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

Das Denken in wirtschaftlichen Kategorien ist in anderen europäischen Ländern bereits weiter fortgeschritten als hierzulande. In Deutschland beispielsweise sind bereits 12 der 18 Bundesligastadien nach einem Sponsor benannt. Eine Entwicklung, die dort nicht überall auf Sympathien stößt. Widerstand regt sich vor allem aus dem Lager der Anhänger, für die der Verkauf des Stadionnamens dem Ausverkauf der eigenen Tradition gleichkommt. In Rostock und Nürnberg haben Fans massiv gegen die kommerzielle Namensänderung protestiert, letztlich jedoch ohne Erfolg. Auch Michel mahnt, dass die Sorgen um das Verhalten traditionsbewusster Fans in der Regel berechtigt seien, aber die Entwicklung der letzten Jahre gezeigt hätte, dass sich die Anhänger durchaus schnell an einen neuen Na-men gewöhnen könnten. Diese Einschätzung zeichnet sich momentan in Le Mans ab. Von Protesten ist bislang nichts zu hören, im Gegenteil sei man stolz, noch vor der großen Konkurrenz aus Lyon als erster ein „Naming Right“ zu besitzen, wie André Boivent, Mitglied des Fanclubs Manseau 12, berichtet.Während das Naming zumindest von einem Teil der Anhänger als Sinnbild für den Ausverkauf gesehen wird, schlägt sich die Professionalisierung des Sports auch in der Architektur der neuen Stadien nieder. Auf die Transformation von Sportvereinen zu Wirtschaftsunter-nehmen folgt ebenso die Transformation von Stadien zu Arenen. Die Sportstätten dieses neuen Typs sind multifunktional, in Peripherien gebaut und bieten neben den billigen Plätzen auch Logen für die zahlungskräftige Kundschaft. Die exklusiven Kabinen werden häufig vom

Sponsor selbst genutzt, um Geschäftsbeziehungen zu pflegen, und sind vom muffigen Tribünengeruch durch verspiegelte Fenster abgetrennt. Für Kritiker manifes-tiert sich die Entfremdung des Sports vom Fan in der Architektur der neuen Arenen. „Es sind Pilgerstätten für einmal oder zweimal die Woche mit riesigen Parkplätzen davor. Sie sind austauschbar. Man könnte sie überall hinbauen, weil sie längst den Bezug zu den Lebenswelten der Bewohner, der Fans verloren haben», kritisiert der Schweizer Architekt Eraldo Consolascio in der deuts-chen Tageszeitung taz. Wie die Zeitung weiter schreibt, sei durch die neue Sportstättenarchitektur der Fußball salonfähig geworden „und die Zeit, in denen Stadien als klassenlose Kommunikations- und Identifikations-zentren der Fans verstanden wurden, spätestens seit der WM 2006 vorbei.“Champagner ist teuer und daher nicht für Jedermann. Die Exklusion hat im modernen Sport auch die Stadien erreicht. In Deutschland wurde dies auf einer legendären Mitgliederversammlung gewahr, als ein erboster Fan des FC Bayern München medienwirksam zu Protokoll gab, dass man „mit Champagnergläsern eben keine La Ola machen kann“. Er spielte damit auf die schlechte Stimmung im knapp 70 000 Zuschauer fassenden Stadion an, zu der die 200 Logenplätze ihren Teil beisteuern. Ebenso wie die MMArena in Le Mans trägt auch die Münchner Allianz Arena den Namen einer Versicherungsgesellschaft. Die MMArena in Le Mans wird übrigens 250 Logen haben. Hinzu kommen 2000 VIP Plätze bei einer Gesamtkapazität von 25 000 Plätzen. Prost!

«La résistance se manifeste surtout dans les clubs de supporters, pour lesquels la vente du nom du stade équivaut à la liquidation de leur propre tradition.»

Résumé-----------------------------------------Ça s’appelle le naming, et c’est un phénomène récemment apparu dans le milieu du football. La dé-marche commerciale consiste à ce que les noms, parfois mythiques et évocateurs, des stades (le Vélodrome, Geoffroy Guichard, Gerland ou en-core La Beaujoire), soient remplacés par le nom d’une entreprise-spon-sor. Ainsi le stade Leon-Bollée, au Mans, devrait bientôt devenir le Mutuel du Mans Arena. Démarche que devrait entreprendre le Club de Lyon prochainement.Le phénomène provoque une vive polémique chez les supporters, entre ceux qui voient là l’intrusion encore plus prégnante du commerce sur les quelques «valeurs» qui leur restent, et ceux qui voient au contraire la manne financière qui va leur per-mettre de recruter encore plus, donc de monter dans le classement.

........WWW............................................................ Retrouvez la traduction intégrale de l’article de Timo Euteneuer par Virginie Bernard sur :www.journaleuropa.infoRubrique «sport»

Page 30: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

Comment en est-on arrivé là ? Je vois venir votre question. Sachez tout d’abord que nous étions un petit nombre à sentir le vent tourner. Nous avons essayé d’alerter la population, mais rien n’y a fait. Jusqu’au jour de son élection, où tout a basculé. Je vois bien que vous essayez de comprendre. Moi-même, qui ai vécu cette période, j’ai encore du mal à y croire.J’avais 20 ans dans les années 2000, et on peut dire que c’est là que tout a commencé. C’était à l’époque où il y avait des centaines de milliers de Mormons qui résidaient en Europe. On les voyait souvent. Je me souviens très bien, quand je les croisais, j’aimais à leur parler de la vie et de la mort. Ce sont des gens qui ont fait vœux de chasteté avant le mariage, qui croyaient en la réincarnation... On ne prenait pas garde à leur présence à l’époque, ils faisaient presque partie du paysage social, avec leurs costumes tirés et leurs petits badges. Ils passaient toutes leurs journées dans les archives régionales, départementales, municipales, et numérisaient tous les livrets de famille qu’ils pouvaient trouver, pour en faire des microfilms, qui étaient ensuite stockés dans une montagne au-dessus de Salt Lake City. À l’époque, ils disaient vouloir «retracer l’arbre généalogique de l’humanité»1... Rendez-vous compte. On était bien loin de penser qu’il s’agissait en réalité d’une vaste entreprise de fichage planétaire. Je vivais en France à l’époque, et si les Mormons étaient nombreux, ils ne nous inquiétaient pas trop. Jusqu’en 2005, année où ils ont commencé à s’intéresser de près à la puce RFID, que maintenant vous connaissez bien, puisqu’elle est partout. À l’époque, il s’agissait d’améliorer la traçabilité des biens matériels : la nourriture, les camions, les mar-chandises, etc. On l’utilisait dans les cartes du métro. Puis, l’implant sous-cutané chez les nouveaux-nés est devenu la règle2. Là encore pour une bonne raison : il s’agissait de dématérialiser le passeport. En réalité, chaque nouveau-né était inscrit directement sur l’arbre généalogique numérique mondial des Mormons. Maîtriser l’évolution de l’espèce, c’était là tout l’enjeu.La RFID System, plus grosse compagnie de fabrication de puces au monde, était dirigée par un magnat américain, mormon lui aussi. C’est lui qui a entièrement financé les recherches sur les biopuces. On leur prêtait des vertus envi-ronnementales, soi-disant pour détecter les pollutions organiques ou microbiennes. Enfin, c’était la version officielle... En 2008, l’équipe du chercheur allemand Peter Fromherz a réussi, en utilisant l’activité électrique des neurones, à leur transférer un contrôle sans intermédiaire3. C’est-à-dire qu’une puce pouvait prendre le contrôle d’un cerveau humain. Personne ne s’en est rendu compte, parce qu’à l’époque, on travaillait déjà sur des hommes-machines, construits de toutes pièces, qui devaient remplacer nos caissières, nos guides, nos éboueurs, etc. On se disait naïvement qu’on avait encore la chance d’être «humain». Donc a commencé à émerger une génération d’humains-bioniques, totalement contrôlés. Le 4 octobre 2008, je m’en souviens comme si c’était hier, tout a basculé. Cette élection est restée dans l’histoire comme la première élection mondiale. C’est là que mes amis et moi avons commencé à nous poser des questions. Il est arrivé en pleine crise économique, «la pire qu’on ait connue depuis plus de 50 ans» disaient les économistes. Il a senti la fin du système, et l’a anticipée. Il tenait des discours courageux sur la fin du capitalisme, un nouveau mode de pensée, l’écologie, la science, etc. Il était trop avant-gardiste pour être réel. Toute sa campagne s’est basée sur Facebook et Youtube. Son cabinet était passé maître en matière de réseaux sociaux virtuels. Ils ont créé ce qu’on a appelé plus tard la «dépendance technologico-sociale». Près de 85% des humains «non contrôlés» étaient surveillés via ces plateformes. Comment deviner que Mark Zuckerberg, fondateur de Facebook, était mormon ? Et qu’il travaillait en sous-main pour le président... mormon lui aussi. Nous l’appelions «l’homme providentiel», plutôt que «l’homme présidentiel». Il suscitait l’enthousiasme partout où il allait, béné-ficiait d’un consensus planétaire... et d’un vaste réseau d’électeurs potentiels. Il s’est réapproprié la constitution, a réformé les bases du système social, et a commencé à accomplir la grande entreprise mormone, le «contrôle de la destinée humaine».En 2022, lors de son 3ème mandat, tout devint beaucoup plus sombre. 85% des résidents planétaires étaient des hommes bioniques, tandis que les autres étaient technologico-socio-dépendants. Il a alors inventé le concept de déterminisme humain. C’était donc le genre à éradiquer, car «l’homme est un loup pour l’homme», et seules les machines sont dotées de raison pure. Il était en passe de réussir, rien ne pouvait l’arrêter.C’est en janvier 2024 qu’ont eu lieu les premières insurrections. Depuis, nous vivons sous terre. Cela fait presque huit ans maintenant, et je ne sais pas ce que la surface est devenue. Sûrement pas un havre de paix... Nous essayons d’élargir notre galerie, petit à petit. On s’organise, nous avons des passeurs qui nous font parvenir des denrées depuis la surface. Pour combien de temps encore ? Nous avons choisi l’auto-exclusion, parce que c’est mieux comme ça. Le réseau sous-terrain n’est pas contrôlé, alors on peut communiquer avec d’autres groupes aux quatre coins du globe. Certains ont des noms, nous pas encore. C’est un peu rudimentaire, mais nous survivons.Je n’ai pas vraiment d’ambition en griffonnant ce billet sur une écorce d’arbre que j’ai trouvée en creusant la terre, j’espère juste qu’un jour, si quelqu’un le trouve, il pourra vous donner des éléments de réflexion sur comment tout ça est arrivé.

SurveillanceGlobaleFictionpar Luca Moniti Étudiant en Anthropologie des médias à Savona, Italie

30 / ? I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX ? XXXI XXXII......................................................

Réalité----------------------------------1. Les Mormons se sont fixé pour objectif de retracer l’ar-bre généalogique de l’huma-nité. Cette ambition repose essentiellement sur le fait qu’ils croient les liens familiaux éter-nels. Ainsi, ils expliquent que l’expression : «jusqu’à ce que la mort vous sépare» n’existe pas. Les liens du mariage entre un couple, et ceux entre les pa-rents et les enfants continuent après la mort. Toutefois, ces «alliances» peuvent égale-ment être réalisées pour les ancêtres. Mais ces derniers doivent être identifiés. C’est pour cette raison que les mem-bres de l’Église mormone font des recherches généalogiques. [...] Les Mormons, qui ont des ancêtres et cousins sur tous les continents, ont entrepris, depuis près de 70 ans, une colossale entreprise de mi-crofilmage pour sauvegarder et exploiter les registres et ar-chives du monde entier. www.geneawiki.com

2. Deux employés de la société Citywatcher ont troqué leurs badges d’accès contre l’intru-sion sous-cutanée dans leurs avant-bras de puces RFID. Un test «grandeur nature» qui devrait, si l’expérience est concluante, finir de convain-cre les clients de Citywatcher d’adopter ce type de procédé pour fiabiliser leur propre sécu-rité. La société Applied Digital qui a fourni ces puces RFID est déjà prête à commercialiser à grande échellewww.generation-nt.com

3. Les associations neurones-transistors : en vue de contrôler le vivant et l’inerte dans leurs plus petites dimensions, un nouveau défi scientifique aux allures de chimère est passé dans le domaine du réalisable : le mariage du silicium et du vivant a été réalisé par l’équipe du chercheur allemand Peter Fromherz. Le principe est sim-ple : une variation de poten-tiel d’un transistor MOSFET se transforme en courant et toute cellule neuronale a une certaine activité électrique. Ils ‘agit donc de transférer le contrôle électrique à la cellule et ce, sans intermédiaire.www.cirano.qc.ca

Page 31: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez
Page 32: ˆˇ˘ : ˆ ˙. / ˙ ˚ˇ˚ .˜ˇ - ddata.over-blog.comddata.over-blog.com/xxxyyy/2/45/75/05/RevueDePresse/EuropaN21... · journalisme citoyen. vous pouvez y participer : envoyez

création : shift. / futurorg.comcréation : shift. / futurorg.com