1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
ErrorMessage := '';
Result := False;
DirectShowGraph := TDirectShowGraph.Create(Owner);
try
// Création du Graph
Hr := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, DirectShowGraph.FGraphBuilder);
if Failed(Hr) then
begin
ErrorMessage := 'Filter graph creation error.';
Exit;
end;
// Add to ROT si demandé
if AllowAddToRot then
begin
Hr := AddToRot(DirectShowGraph.FGraphBuilder, DirectShowGraph.FRotEntry);
if Failed(Hr) then
begin
DirectShowGraph.FRotEntry := -1;
ErrorMessage := 'Filter graph could not be added to the ROT.';
Exit;
end;
end;
//..... Importation des différents filtres dans le graphe
//*****************************************
// Rajout du Video Mixing Renderer9
//*****************************************
Hr := CoCreateInstance(CLSID_VideoMixingRenderer9, nil, CLSCTX_INPROC, IID_IBaseFilter, VideoMixingRendererFilter);
if Failed(Hr) then
begin
ErrorMessage := 'Could not use the Video Mixing Renderer.';
Exit;
end;
Hr := DirectShowGraph.FGraphBuilder.AddFilter(VideoMixingRendererFilter, 'Video Mixing Renderer');
if Failed(Hr) then
begin
ErrorMessage := 'Could not add "Video Mixing Renderer" filter.';
Exit;
end;
// récupération de l'interface
Hr := VideoMixingRendererFilter.QueryInterface(IID_IVMRFilterConfig9, VideoMixingRendererInterface);
if Failed(Hr) then
begin
ErrorMessage := 'Filter "Video Mixing Renderer" interface not found.';
Exit;
end;
// mode windowless
Hr := VideoMixingRendererInterface.SetRenderingMode(VMRMode_Windowless);
VideoMixingRendererInterface := nil;
if not Failed(Hr) then
begin
// prendre le controle and régler la fenêtre
Hr := VideoMixingRendererFilter.QueryInterface(IID_IVMRWindowlessControl9, DirectShowGraph.FVideoMixingRendererControl);
if not Failed(Hr) then
begin
Hr := DirectShowGraph.FVideoMixingRendererControl.SetVideoClippingWindow(Owner);
if Failed(hr) then
DirectShowGraph.FVideoMixingRendererControl := nil;
end;
end;
VideoMixingRendererFilter := nil;
end;
//******************************************************************************
// rajout d'un filtre Grabber
//*********************************************************************************
Hr := CoCreateInstance(CLSID_SampleGrabber, nil, CLSCTX_INPROC, IID_IBaseFilter,DirectShowGraph.FSampleGrabber);
if Failed(Hr) then
begin
ErrorMessage := 'Could not use a Sample Grabber.';
Exit;
end;
hr := DirectShowGraph.FgraphBuilder.AddFilter(DirectShowGraph.FSampleGrabber, 'Sample Grabber'); // voir cela est fait plus loin
if Failed(Hr) then
begin
ErrorMessage := 'Could not add "Sample Grabber" filter.';
Exit;
end;
// avant de l'ajouter il faut régler le type de media
// avant d'adjoindre SampleGrabber il faut lui indiquer le mediatype qu'il va gérer pour ne pas le laisser aller chercher
// d'autres format et faire des transformations
// récupérer l'interface
hr := DirectShowGraph.FSampleGrabber.QueryInterface(IID_ISampleGrabber,DirectShowGraph.FSampleGrabberInterface);
if Failed(Hr) then
begin
ErrorMessage := 'Filter "Sample Grabber" interface not found.';
Exit;
end;
// setmediatype
ZeroMemory(@media_type, sizeof(AM_MEDIA_TYPE));
media_type.majortype:= MEDIATYPE_Video;
media_type.subtype:= MEDIASUBTYPE_RGB32;
// il faudrait peut-être rajouter le format Type ????
hr:= DirectShowGraph.FSampleGrabberInterface.SetMediaType(media_type);
// tout fonctionne bien sous XP
// sous Win7 il faut ajouter un Colore Converter DMO
hr := CoCreateInstance(CLSID_ColorConverterDMO, nil, CLSCTX_INPROC, IMediaObject,DirectShowGraph.iDMOobjet);
hr := CoCreateInstance(CLSID_DMOWrapperFilter, nil, CLSCTX_INPROC, IID_IBaseFilter,DirectShowGraph.FColorConverterDMO);
//hr := CoCreateInstance(CLSID_DMOWrapperFilter, nil, CLSCTX_INPROC_SERVER, IBaseFilter,iFilter);
if succeeded(hr) then
begin
hr := DirectShowGraph.FColorConverterDMO.QueryInterface(IDMOWrapperFilter, DirectShowGraph.DMOWrapper);
if Succeeded(hr) then
begin
hr := DirectShowGraph.DMOWrapper.Init(CLSID_ColorConverterDMO, DMOCATEGORY_VIDEO_EFFECT);
DirectShowGraph.DMOWrapper := nil;
if Succeeded(hr) then
begin
Hr := DirectShowGraph.FGraphBuilder.AddFilter(DirectshowGraph.FColorConverterDMO, 'Color Converter DMO');
if Failed(Hr) then
begin
ErrorMessage := 'Could not add "Color Converter DMO" filter.';
Exit;
end;
end
else
begin
ErrorMessage := 'Could not init "Color Converter DMO" filter.';
Exit;
end;
end;
end;
// insertion du demultiplexer et autres éléments
// ...
// ...
// le graphe finit de se construire par lui même
if not Assigned(DirectShowGraph.FVideoPin) then
begin
Hr := DirectShowGraph.FMpeg2DemultiplexerFilter.FindPin('2', DirectShowGraph.FVideoPin);
if Failed(Hr) then
begin
ErrorMessage := 'Filter demultiplexer video pin not found.';
Exit;
end;
end;
if not Assigned(DirectShowGraph.FAudioPin) then
begin
Hr := DirectShowGraph.FMpeg2DemultiplexerFilter.FindPin('3', DirectShowGraph.FAudioPin);
if Failed(Hr) then
begin
ErrorMessage := 'Filter demultiplexer audio pin not found.';
Exit;
end;
end;
// demande du rendu automatique
DirectShowGraph.FGraphBuilder.Render(DirectShowGraph.FVideoPin);
DirectShowGraph.FGraphBuilder.Render(DirectShowGraph.FAudioPin);
if Assigned(DirectShowGraph.FColorConverterDMO) then
begin
DirectShowGraph.FColorConverterDMO.SetSyncSource(nil);
end;
if Assigned(DirectShowGraph.FMpeg2DemultiplexerFilter) then
begin
DirectShowGraph.FMpeg2DemultiplexerFilter.SetSyncSource(nil);
DirectShowGraph.FGraphBuilder.SetDefaultSyncSource;
end;
// récupération des interface des flux audio et vidéo pour futur décodage des PIDs
Hr := DirectShowGraph.FVideoPin.QueryInterface(IID_IMPEG2PIDMap, DirectShowGraph.FVideoStreamMap);
if Failed(Hr) then
begin
ErrorMessage := 'Filter video stream interface not found.';
Exit;
end;
Hr := DirectShowGraph.FAudioPin.QueryInterface(IID_IMPEG2PIDMap, DirectShowGraph.FAudioStreamMap);
if Failed(Hr) then
begin
ErrorMessage := 'Filter audio stream interface not found.';
Exit;
end;
//... |
Partager