comme le titre l'indique, j'ai un souci de design de classe.
J'ai cr=E9=E9 trois classes qui me permettent d'afficher de la vid=E9o
gr=E2ce =E0 DirectShow.
J'ai une classe DS_InfosVideo, DS_AffichVideo, qui sont assez
explicites, et une derni=E8re classe TVideoAffich qui est la fen=EAtre
qui affichera la vid=E9o, et qui a comme membres priv=E9s les deux
classes pr=E9c=E9dentes...
Je peux afficher 3 types de vid=E9o: les fichiers vid=E9o, des fichiers
XML pour la pr=E9visualisation de montages vid=E9o, et de la vid=E9o en
temps-r=E9el provenant d'une cam=E9ra num=E9rique.
J'ai donc utilis=E9 l'idiome du constructeur nomm=E9 pour chacune de ces
3 classes, ce qui me permet de charger les bonnes infos.
Hors-sujet. C'est un détail d'implémentation, et on parle ici de design.
InfosVideo n'est pas une interface qu'on peut assimiler à une source [...] récupération des infos d'une source vidéo.
Par contre AffichVideo est composée de deux "sous-objets": une source (dont les interfaces COM sont différentes selon le type de la source : XML, Fichier...) et un renderer, qui, peut-importe la source affiche le rendu de cette source; Ce renderer peut lui aussi être de différents types (VMR, Overlay, etc...)
Hé bien, tout va bien.
class Source { ... [cf mes autres messages] }; class Destination { ... [idem] };
class AffichVideo { Source* la_source; Destination* la_destination; };
class Source_XML: public Source { ... };
class Destination_Overlay: public Destination { ... };
À aucun moment, AffichVideo ne doit savoir ce que "XML" ou "Overlay" signifie.
Source et Destination contiennent des fonctions virtuelles pures. Source_XML et ses potes implémentent ces fonctions, à grands coups de COM et autres joyeusetés Win32.
On 16 Jun 2006 14:28:17 -0700, "Michael" <michael.delva@gmail.com>:
Elle utilise des interfaces COM
Hors-sujet. C'est un détail d'implémentation, et on parle ici de
design.
InfosVideo n'est pas une interface qu'on peut assimiler à une
source [...] récupération des infos d'une source vidéo.
Par contre AffichVideo est composée de deux "sous-objets": une source
(dont les interfaces COM sont différentes selon le type de la source :
XML, Fichier...) et un renderer, qui, peut-importe la source affiche le
rendu de cette source; Ce renderer peut lui aussi être de différents
types (VMR, Overlay, etc...)
Hé bien, tout va bien.
class Source { ... [cf mes autres messages] };
class Destination { ... [idem] };
class AffichVideo
{
Source* la_source;
Destination* la_destination;
};
class Source_XML: public Source
{
...
};
class Destination_Overlay: public Destination
{ ...
};
À aucun moment, AffichVideo ne doit savoir ce que "XML" ou "Overlay"
signifie.
Source et Destination contiennent des fonctions virtuelles pures.
Source_XML et ses potes implémentent ces fonctions, à grands coups de
COM et autres joyeusetés Win32.
Hors-sujet. C'est un détail d'implémentation, et on parle ici de design.
InfosVideo n'est pas une interface qu'on peut assimiler à une source [...] récupération des infos d'une source vidéo.
Par contre AffichVideo est composée de deux "sous-objets": une source (dont les interfaces COM sont différentes selon le type de la source : XML, Fichier...) et un renderer, qui, peut-importe la source affiche le rendu de cette source; Ce renderer peut lui aussi être de différents types (VMR, Overlay, etc...)
Hé bien, tout va bien.
class Source { ... [cf mes autres messages] }; class Destination { ... [idem] };
class AffichVideo { Source* la_source; Destination* la_destination; };
class Source_XML: public Source { ... };
class Destination_Overlay: public Destination { ... };
À aucun moment, AffichVideo ne doit savoir ce que "XML" ou "Overlay" signifie.
Source et Destination contiennent des fonctions virtuelles pures. Source_XML et ses potes implémentent ces fonctions, à grands coups de COM et autres joyeusetés Win32.
Sylvain
Michael wrote on 16/06/2006 21:08:
Mais je compte proposer un renderer de plus. Ca ne change rien aux classes InfosVideo et dérivées, mais du coup ça multiplie le nombre de classes AffichVideo par 2!
qu'est-ce un renderer ici ?
je le comprends comme le machin DirectX (un IGraphBuilder) qui affiche effectivement le flux construit à partir de la source (un ISampleGrabber). il est de fait unique (sauf peut être subtilitées avancées) dans l'architecture DX en tant qu'objet de rendu.
ce qui peut changer est plus facilement les 'filtres' appliquées à la source; cela peut inclure du mixage, de la décompression hard, de la conversion (entre standards TV par ex.).
partant, je pense que le lieu des éventuelles adaptations est plus entre la source et le visualisateur, mais ni l'un, ni l'autre; la gestion des ces filtres pluggables revient vient à 'chapeau' qui saura mettre bout à bout des filtres entre ses 2 maillons.
Sylvain.
Michael wrote on 16/06/2006 21:08:
Mais je compte proposer un renderer de plus. Ca ne change rien aux
classes InfosVideo et dérivées, mais du coup ça multiplie le nombre
de classes AffichVideo par 2!
qu'est-ce un renderer ici ?
je le comprends comme le machin DirectX (un IGraphBuilder) qui affiche
effectivement le flux construit à partir de la source (un
ISampleGrabber). il est de fait unique (sauf peut être subtilitées
avancées) dans l'architecture DX en tant qu'objet de rendu.
ce qui peut changer est plus facilement les 'filtres' appliquées à la
source; cela peut inclure du mixage, de la décompression hard, de la
conversion (entre standards TV par ex.).
partant, je pense que le lieu des éventuelles adaptations est plus entre
la source et le visualisateur, mais ni l'un, ni l'autre; la gestion des
ces filtres pluggables revient vient à 'chapeau' qui saura mettre bout à
bout des filtres entre ses 2 maillons.
Mais je compte proposer un renderer de plus. Ca ne change rien aux classes InfosVideo et dérivées, mais du coup ça multiplie le nombre de classes AffichVideo par 2!
qu'est-ce un renderer ici ?
je le comprends comme le machin DirectX (un IGraphBuilder) qui affiche effectivement le flux construit à partir de la source (un ISampleGrabber). il est de fait unique (sauf peut être subtilitées avancées) dans l'architecture DX en tant qu'objet de rendu.
ce qui peut changer est plus facilement les 'filtres' appliquées à la source; cela peut inclure du mixage, de la décompression hard, de la conversion (entre standards TV par ex.).
partant, je pense que le lieu des éventuelles adaptations est plus entre la source et le visualisateur, mais ni l'un, ni l'autre; la gestion des ces filtres pluggables revient vient à 'chapeau' qui saura mettre bout à bout des filtres entre ses 2 maillons.
Mais ça ne change rien au problème de durée de vie.
J'avais tenté ça aussi, mais ça ne m'arrange pas non plus...
Tu as une alternative :
template <class Input, class Renderer> class AffichVideo { private: Renderer renderer; Input input; ... };
Tu passes alors d'un polymorphisme d'héritage à un polymorphisme de templates.
AMHA, ça ne se justifie pas ici, mais c'est une solution qui existe.
J'avais pensé à ça aussi, mais autant passer le type de source en paramètre template ne pose pas de souci, puisque c'est décidé dès la compilation, autant passer le type de renderer en template est un problème, puisque ce choix est défini à l'exécution...
Mais ça ne change rien au problème de durée de vie.
J'avais tenté ça aussi, mais ça ne m'arrange pas non plus...
Tu as une alternative :
template <class Input, class Renderer> class AffichVideo
{
private:
Renderer renderer;
Input input;
...
};
Tu passes alors d'un polymorphisme d'héritage à un polymorphisme de
templates.
AMHA, ça ne se justifie pas ici, mais c'est une solution qui existe.
J'avais pensé à ça aussi, mais autant passer le type de source en paramètre
template ne pose pas de souci, puisque c'est décidé dès la compilation,
autant passer le type de renderer en template est un problème, puisque ce
choix est défini à l'exécution...
Mais ça ne change rien au problème de durée de vie.
J'avais tenté ça aussi, mais ça ne m'arrange pas non plus...
Tu as une alternative :
template <class Input, class Renderer> class AffichVideo { private: Renderer renderer; Input input; ... };
Tu passes alors d'un polymorphisme d'héritage à un polymorphisme de templates.
AMHA, ça ne se justifie pas ici, mais c'est une solution qui existe.
J'avais pensé à ça aussi, mais autant passer le type de source en paramètre template ne pose pas de souci, puisque c'est décidé dès la compilation, autant passer le type de renderer en template est un problème, puisque ce choix est défini à l'exécution...
Michael
J'avais pensé à ça aussi, mais autant passer le type de source en paramètre template ne pose pas de souci, puisque c'est décidé dès la compilation, autant passer le type de renderer en template est un problème, puisque ce choix est défini à l'exécution...
Par exemple, à moins que je ne vois pas l'astuce, on ne peut pas faire ça si je ne m'abuse?
class foo { private: AffichVideo affich; public: foo(); };
J'avais pensé à ça aussi, mais autant passer le type de source en
paramètre template ne pose pas de souci, puisque c'est décidé dès la
compilation, autant passer le type de renderer en template est un
problème, puisque ce choix est défini à l'exécution...
Par exemple, à moins que je ne vois pas l'astuce, on ne peut pas faire ça si
je ne m'abuse?
class foo
{
private:
AffichVideo affich;
public:
foo();
};
J'avais pensé à ça aussi, mais autant passer le type de source en paramètre template ne pose pas de souci, puisque c'est décidé dès la compilation, autant passer le type de renderer en template est un problème, puisque ce choix est défini à l'exécution...
Par exemple, à moins que je ne vois pas l'astuce, on ne peut pas faire ça si je ne m'abuse?
class foo { private: AffichVideo affich; public: foo(); };