<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog du projet Odyssea Media Center</title>
	<atom:link href="https://blog.developpez.com/odyssea/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/odyssea</link>
	<description></description>
	<lastBuildDate>Wed, 05 Feb 2014 13:48:37 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Journal de bord de la création d&#8217;un logiciel média center, Odyssea</title>
		<link>https://blog.developpez.com/odyssea/p12466/annonces/journal-de-bord-de-la-creation-dun-logiciel-media-center-odyssea</link>
		<comments>https://blog.developpez.com/odyssea/p12466/annonces/journal-de-bord-de-la-creation-dun-logiciel-media-center-odyssea#comments</comments>
		<pubDate>Wed, 05 Feb 2014 13:48:37 +0000</pubDate>
		<dc:creator><![CDATA[Sotoaleono]]></dc:creator>
				<category><![CDATA[Annonces]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/odyssea/?p=23</guid>
		<description><![CDATA[Plusieurs tentatives de programmation jonchent le parcours, en effet, au fur et à mesure des avancées, on se rend compte, assez tardivement, que le chemin emprunté n&#8217;était pas le bon&#8230; Ce qui est assez énervant, c&#8217;est de savoir que l&#8217;on fait des allers retours, et que c&#8217;est assez peu constructif&#8230; Nouvelle étape dans le processus de création du logiciel : la création d&#8217;un serveur. Pourquoi un serveur, tout simplement pour qu&#8217;il serve, mais qu&#8217;il serve [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Plusieurs tentatives de programmation jonchent le parcours, en effet, au fur et à mesure des avancées, on se rend compte, assez tardivement, que le chemin emprunté n&rsquo;était pas le bon&#8230;</p>
<p>Ce qui est assez énervant, c&rsquo;est de savoir que l&rsquo;on fait des allers retours, et que c&rsquo;est assez peu constructif&#8230;</p>
<p>Nouvelle étape dans le processus de création du logiciel : la création d&rsquo;un serveur.</p>
<p>Pourquoi un serveur, tout simplement pour qu&rsquo;il serve, mais qu&rsquo;il serve qui et surtout à quoi? </p>
<p>Simple, dans mon univers ( ma maison, quatre ordinateurs, et uniquement un avec deux tuners tnt, et 3 To de vidéos et séries, et un autre avec un tuner usb), et donc il me faut un moyen, de contrôler ces derniers et éventuellement pouvoir diffuser la télévision sur le réseau. Bref un serveur&#8230;</p>
<p>Cependant, au fur et à mesure, je me dis que la gestion des fichiers présents doit aussi être effectuée par ces serveurs, car la phase d&rsquo;identification et de téléchargement, mise à jour des divers éléments peut être effectuée par ce même logiciel.</p>
<p>Donc je me suis retroussé les manches et mis au travail : </p>
<p>Première étape, la recherche des ordinateurs aux alentours et connectés au réseau. Fait</p>
<p>Deuxième étape, la recherche des fichiers et leurs identifications ( ainsi que la non prise en compte des doublons etc ). Fait.</p>
<p>En effet, les nombreuses tentatives d&rsquo;indexations m&rsquo;ont permis de mettre en place assez rapidement des fonctions déjà éprouvées ( Requête internet, utilisation API The Movie DB et The TVDB), et ainsi gagner du temps sur ce processus&#8230;</p>
<p>La troisième étape en non des moindres, la communication entre deux ordinateurs, c&rsquo;est à dire obtention des informations concernant les fichiers, et la disponibilité des serveurs, est en cours de conception, bref je jonglerai avec les thread, directshow et la tnt&#8230;. Bref que du bonheur.</p>
<p>La suite au prochain épisode!!</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DirectShow Réception de la TNT (DVB-T)</title>
		<link>https://blog.developpez.com/odyssea/p12452/annonces/directshow-reception-de-la-tnt-dvb-t</link>
		<comments>https://blog.developpez.com/odyssea/p12452/annonces/directshow-reception-de-la-tnt-dvb-t#comments</comments>
		<pubDate>Mon, 27 Jan 2014 18:18:30 +0000</pubDate>
		<dc:creator><![CDATA[Sotoaleono]]></dc:creator>
				<category><![CDATA[Annonces]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/odyssea/?p=8</guid>
		<description><![CDATA[Dans ce billet, je tenterai de décrire, certainement maladroitement, la programmation de la réception d&#8217;un tuner TNT par le biais de DirectShow. Après plusieurs heures(voire des jours) de recherches et d&#8217;essais, j&#8217;ai finalement réussi à recevoir des images via mon tuner tnt usb. Ce n&#8217;était pas sans mal car, il faut le reconnaître, le net ne regorge pas de plusieurs exemples en la matière, ni des sources fonctionnant correctement&#8230; La devise et maître mot de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans ce billet, je tenterai de décrire, certainement maladroitement, la programmation de la réception d&rsquo;un tuner TNT par le biais de DirectShow.</p>
<p>Après plusieurs heures(voire des jours) de recherches et d&rsquo;essais, j&rsquo;ai finalement réussi à recevoir des images via mon tuner tnt usb. Ce n&rsquo;était pas sans mal car, il faut le reconnaître, le net ne regorge pas de plusieurs exemples en la matière, ni des sources fonctionnant correctement&#8230;</p>
<p>La devise et maître mot de ce billet est donc :<br />
&laquo;&nbsp;La théorie, c&rsquo;est quand on sait tout et que rien ne fonctionne. La pratique, c&rsquo;est quand tout fonctionne et que personne ne sait pourquoi.&nbsp;&raquo;</p>
<p>Là il y aura beaucoup de pratique&#8230;.</p>
<p>D&rsquo;abord créer une structure pour recevoir les données concernant les tuners et les filtres etc&#8230;.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">struct TUNERSTRUCT<br />
{<br />
BSTR Name;<br />
char *Char_Name;<br />
<br />
SmartPtr pTuner;<br />
SmartPtr &nbsp;pDVBTLocator;<br />
SmartPtr &nbsp;TuningSpace;<br />
SmartPtr pTuneRequest;<br />
SmartPtr pDVBTuneRequest;<br />
SmartPtr DirectSoundRenderer;<br />
SmartPtr VideoRenderer;<br />
SmartPtr &nbsp;m_pNetworkProvider; <br />
SmartPtr &nbsp; &nbsp; m_pTunerDemodDevice; // for tuner device filter <br />
SmartPtr &nbsp; &nbsp; m_pBDACaptureDevice; // for tuner device filter<br />
SmartPtr &nbsp; &nbsp; m_pDemux; // for tuner device filter<br />
SmartPtr &nbsp; m_pBDASecTab;<br />
SmartPtr &nbsp;m_pTSFileSink;<br />
SmartPtr &nbsp; m_pBDATIF;<br />
SmartPtr &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pTunerPin; &nbsp; &nbsp; &nbsp; &nbsp; // the tuner pin on the tuner/demod filter <br />
SmartPtr &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pDemodPin; &nbsp; &nbsp; &nbsp; &nbsp; // the demod pin on the tuner/demod filter <br />
SmartPtr &nbsp;m_KsTunerPropSet; &nbsp; &nbsp;// IKsPropertySet for tuner <br />
SmartPtr &nbsp;m_KsDemodPropSet; &nbsp; &nbsp;// IKsPropertySet for demod <br />
&nbsp; <br />
};</div></div>
<p>La première chose à faire est de récupérer le nom des tuners tnt.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HRESULT DVB_Get_Device(void){<br />
DVB_Tuner_Max=0;<br />
HRESULT hr;<br />
BOOL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fFoundFilter = FALSE; &nbsp; <br />
SmartPtr &nbsp; &nbsp; &nbsp;pIMoniker; &nbsp; <br />
SmartPtr &nbsp;pIEnumMoniker; &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; if (!pCreateDevEnum) { &nbsp; <br />
&nbsp;hr=CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (PVOID *)&amp;amp;pCreateDevEnum);<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;Cannot CoCreate ICreateDevEnum&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; // obtain the enumerator &nbsp; <br />
&nbsp; &nbsp; hr = pCreateDevEnum-&amp;gt;CreateClassEnumerator(KSCATEGORY_BDA_RECEIVER_COMPONENT, &amp;amp;pIEnumMoniker, 0); &nbsp; <br />
&nbsp; &nbsp; // the call can return S_FALSE if no moniker exists, so explicitly check S_OK &nbsp; <br />
&nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; TOOL_Debug(&quot;DVB_Get_Device&quot;,&quot;Cannot CreateClassEnumerator&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; if (S_OK != hr) { // Class not found &nbsp; <br />
&nbsp; &nbsp; &nbsp; printf(&quot;Class not found, CreateClassEnumerator returned S_FALSE&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return E_UNEXPECTED; &nbsp; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; // next filter &nbsp; <br />
&nbsp; &nbsp; while (pIEnumMoniker-&amp;gt;Next(1, &amp;amp;pIMoniker, 0) == S_OK) &nbsp; <br />
&nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // obtain filter's friendly name &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SmartPtr &nbsp;pBag; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; hr = pIMoniker-&amp;gt;BindToStorage(NULL,NULL,IID_IPropertyBag,reinterpret_cast(&amp;amp;pBag)); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TOOL_Debug(&quot;DVB_Get_Device&quot;,&quot;Cannot BindToStorage&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return hr; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; VARIANT varBSTR; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; varBSTR.vt = VT_BSTR;<br />
&nbsp; &nbsp; &nbsp; &nbsp; hr = pBag-&amp;gt;Read(L&quot;FriendlyName&quot;, &amp;amp;varBSTR, NULL); <br />
&nbsp; &nbsp; &nbsp; &nbsp; TUNER[DVB_Tuner_Max].Name=varBSTR.bstrVal;<br />
&nbsp; &nbsp; &nbsp; &nbsp; BSTRtoASC(TUNER[DVB_Tuner_Max].Name,TUNER[DVB_Tuner_Max].Char_Name);<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;Ajout du Device_Tuner [%d] : %s&quot;,DVB_Tuner_Max,TUNER[DVB_Tuner_Max].Char_Name); &nbsp; <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;IPropertyBag-&amp;gt;Read method failed&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pIMoniker = NULL; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp;DVB_Tuner_Max++;<br />
<br />
return hr;<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>Voilà, alors nous avons récupéré le nom du tuner ( dans mon cas, ça me donne : &laquo;&nbsp;DiBcom BDA Digital Capture (Dev1 Path0)&nbsp;&raquo;). Cela sera utile pour connecter les filtres entre eux.</p>
<p>Après il est nécessaire un espace de tuning.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HRESULT DVB_Create_Tuning_Space(long DVB_Selected){<br />
<br />
HRESULT hr;<br />
<br />
hr = CoCreateInstance(CLSID_DVBTuningSpace,NULL, CLSCTX_INPROC_SERVER,IID_IDVBTuningSpace2,(void **) &amp;amp;TUNER[DVB_Selected].TuningSpace);<br />
<br />
hr = TUNER[DVB_Selected].TuningSpace-&amp;gt;put_SystemType(DVB_Terrestrial);<br />
<br />
hr = TUNER[DVB_Selected].TuningSpace-&amp;gt;put__NetworkType(CLSID_DVBTNetworkProvider);<br />
<br />
return hr;<br />
}</div></div>
<p>Puis il faut envoyer la requête de chaine :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DVB_Tuning_Request(0,546167,8,-1,-1,-1);</div></div>
<p>Le chiffre 546167 correspond à la fréquence d&rsquo;un multiplex. <a href="http://fr.wikipedia.org/wiki/T%C3%A9l%C3%A9vision_num%C3%A9rique_terrestre_en_France" title="La tnt en france"></a></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HRESULT DVB_Tuning_Request(long DVB_Selected,long Mhz, long BW, long ONID, long SID, long TSID){<br />
HRESULT hr;<br />
BSTR TuningName;<br />
TuningName = L&quot;DVB-T&quot;;<br />
<br />
SmartPtr &nbsp;pDVBTLocator;<br />
<br />
hr = CoCreateInstance(CLSID_DVBTLocator,NULL, CLSCTX_INPROC_SERVER,IID_IDVBTLocator,(void **)&amp;amp;TUNER[DVB_Selected].pDVBTLocator);<br />
<br />
hr = TUNER[DVB_Selected].pDVBTLocator-&amp;gt;put_CarrierFrequency(Mhz);<br />
hr = TUNER[DVB_Selected].pDVBTLocator-&amp;gt;put_Bandwidth(BW);<br />
hr = TUNER[DVB_Selected].TuningSpace-&amp;gt;put_DefaultLocator(TUNER[DVB_Selected].pDVBTLocator);<br />
TOOL_Debug(&quot;DVB_Tuning_Request&quot;,&quot; Frequence : %d - BandWith : %d - ONID : %d - SID : %d - TSID : %d&quot;,Mhz,BW,ONID,SID,TSID);<br />
hr = TUNER[DVB_Selected].TuningSpace-&amp;gt;put_UniqueName(TuningName);<br />
hr = TUNER[DVB_Selected].TuningSpace-&amp;gt;put_FriendlyName(TuningName);<br />
hr = TUNER[DVB_Selected].TuningSpace-&amp;gt;put_FrequencyMapping(L&quot;&quot;);<br />
<br />
SmartPtr &nbsp;pTuningSpaceContainer;<br />
hr = CoCreateInstance(CLSID_SystemTuningSpaces,NULL, CLSCTX_INPROC_SERVER,IID_ITuningSpaceContainer,(void **)&amp;amp;pTuningSpaceContainer);<br />
<br />
VARIANT tiIndex;<br />
hr = pTuningSpaceContainer-&amp;gt;Add(TUNER[DVB_Selected].TuningSpace,&amp;amp;tiIndex); &nbsp; &nbsp;<br />
<br />
if (!SUCCEEDED(hr)) {<br />
&nbsp; &nbsp; // Get the enumerator for the collection.<br />
&nbsp; &nbsp; SmartPtr pTuningSpaceEnum;<br />
&nbsp; &nbsp; hr = pTuningSpaceContainer-&amp;gt;get_EnumTuningSpaces(&amp;amp;pTuningSpaceEnum);<br />
&nbsp; &nbsp; if (SUCCEEDED(hr)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; // Loop through the collection.<br />
&nbsp; &nbsp; &nbsp; &nbsp; SmartPtr pTuningSpace;<br />
&nbsp; &nbsp; &nbsp; &nbsp; //ITuningSpace *pTuningSpace;<br />
&nbsp; &nbsp; &nbsp; &nbsp; tiIndex.intVal=0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; while (S_OK == pTuningSpaceEnum-&amp;gt;Next(1, &amp;amp;pTuningSpace, NULL)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BSTR Name;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = pTuningSpace-&amp;gt;get_UniqueName(&amp;amp;Name);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (SUCCEEDED(hr)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (wcscmp(Name, TuningName) == 0) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = pTuningSpaceContainer-&amp;gt;put_Item(tiIndex,TUNER[DVB_Selected].TuningSpace);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SysFreeString(Name);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tiIndex.intVal++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //pTuningSpace-&amp;gt;Release();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pTuningSpace.Release();<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }<br />
}<br />
<br />
hr = TUNER[DVB_Selected].TuningSpace-&amp;gt;CreateTuneRequest(&amp;amp;TUNER[DVB_Selected].pTuneRequest);<br />
<br />
TUNER[DVB_Selected].pTuneRequest.QueryInterface(&amp;amp;TUNER[DVB_Selected].pDVBTuneRequest);<br />
&nbsp;<br />
if(TUNER[DVB_Selected].pDVBTuneRequest) {<br />
<br />
&nbsp; &nbsp; hr = TUNER[DVB_Selected].pDVBTuneRequest-&amp;gt;put_SID(SID);//1538<br />
&nbsp; &nbsp; hr = TUNER[DVB_Selected].pDVBTuneRequest-&amp;gt;put_TSID(TSID);<br />
&nbsp; &nbsp; hr = TUNER[DVB_Selected].pDVBTuneRequest-&amp;gt;put_ONID(ONID);//8442<br />
}<br />
<br />
GUID CLSIDNetworkType;<br />
hr = TUNER[DVB_Selected].TuningSpace-&amp;gt;get__NetworkType(&amp;amp;CLSIDNetworkType);<br />
<br />
hr = CoCreateInstance(CLSIDNetworkType, NULL, CLSCTX_INPROC_SERVER,IID_IBaseFilter, (void **) &amp;amp;TUNER[DVB_Selected].m_pNetworkProvider);<br />
hr = g_pGB-&amp;gt;AddFilter(TUNER[DVB_Selected].m_pNetworkProvider,L&quot;Network Provider&quot;);<br />
<br />
TUNER[DVB_Selected].m_pNetworkProvider.QueryInterface(&amp;amp;TUNER[DVB_Selected].pTuner); &nbsp; <br />
<br />
// Query for ITuner.<br />
<br />
if (TUNER[DVB_Selected].pTuner) {<br />
&nbsp; &nbsp; // Submit the tune request to the network provider.<br />
&nbsp; &nbsp; hr = TUNER[DVB_Selected].pTuner-&amp;gt;put_TuneRequest(TUNER[DVB_Selected].pTuneRequest);<br />
}<br />
<br />
return hr;<br />
}</div></div>
<p>Après nous avons la délicate tâche de lier les différents filtres dans un ordre logique afin de les connecter ensemble. Un petit exemple de ce que cela doit donner : </p>
<p><a href="http://blog.developpez.com/odyssea/files/2014/01/dvbt-w2k.jpg"><img src="http://blog.developpez.com/odyssea/files/2014/01/dvbt-w2k-300x186.jpg" alt="dvbt-w2k" width="300" height="186" class="alignnone size-medium wp-image-14" /></a></p>
<p>A l&rsquo;aide de cette fonction, nous ajouterons au fur et à mesure les filtres</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HRESULT TUNER_Load_Filter(REFCLSID clsid,IBaseFilter** ppFilter,IBaseFilter* pConnectFilter,BOOL fIsUpstream,BSTR Name){ &nbsp; <br />
&nbsp; &nbsp; HRESULT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;hr = S_OK; &nbsp; <br />
&nbsp; &nbsp; BOOL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fFoundFilter = FALSE; &nbsp; <br />
&nbsp; &nbsp; SmartPtr &nbsp; &nbsp; &nbsp;pIMoniker; &nbsp; <br />
&nbsp; &nbsp; SmartPtr &nbsp;pIEnumMoniker; &nbsp; <br />
&nbsp; &nbsp; char *Temp;<br />
&nbsp; &nbsp;TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;Debut de la fonction [%s]&quot;,TOOL_Convert_to_char(Name)); &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; if (!pCreateDevEnum) { &nbsp; <br />
&nbsp;hr=CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (PVOID *)&amp;amp;pCreateDevEnum);<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;Cannot CoCreate ICreateDevEnum&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; // obtain the enumerator &nbsp; <br />
&nbsp; &nbsp; hr = pCreateDevEnum-&amp;gt;CreateClassEnumerator(clsid, &amp;amp;pIEnumMoniker, 0); &nbsp; <br />
&nbsp; &nbsp; // the call can return S_FALSE if no moniker exists, so explicitly check S_OK &nbsp; <br />
&nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;Cannot CreateClassEnumerator&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; if (S_OK != hr) { // Class not found &nbsp; <br />
&nbsp; &nbsp; &nbsp; TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;Class not found, CreateClassEnumerator returned S_FALSE&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return E_UNEXPECTED; &nbsp; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; // next filter &nbsp; <br />
&nbsp; &nbsp; while (pIEnumMoniker-&amp;gt;Next(1, &amp;amp;pIMoniker, 0) == S_OK) &nbsp;{ &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // obtain filter's friendly name &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SmartPtr &nbsp;pBag; &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; hr = pIMoniker-&amp;gt;BindToStorage(NULL,NULL,IID_IPropertyBag,reinterpret_cast(&amp;amp;pBag)); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;Cannot BindToStorage&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; VARIANT varBSTR; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; varBSTR.vt = VT_BSTR;<br />
&nbsp; &nbsp; &nbsp; &nbsp; hr = pBag-&amp;gt;Read(L&quot;FriendlyName&quot;, &amp;amp;varBSTR, NULL); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;IPropertyBag-&amp;gt;Read method failed&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pIMoniker = NULL; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; pBag = NULL; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (wcsncmp(varBSTR.bstrVal, Name,sizeof(Name)) == 0) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; //BSTRtoASC(Name,Temp);<br />
TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;Correspondance decouverte avec [%s]&quot;,TOOL_Convert_to_char(Name)); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // bind the filter &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SmartPtr &nbsp;pFilter; &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; hr = pIMoniker-&amp;gt;BindToObject(NULL,NULL,IID_IBaseFilter,reinterpret_cast(&amp;amp;pFilter)); &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pIMoniker = NULL; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pFilter = NULL; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; hr = g_pGB-&amp;gt;AddFilter (pFilter, varBSTR.bstrVal); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;Cannot add filter [%s]&quot;,TOOL_Convert_to_char(Name)); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; //MessageBox (NULL, _T(&quot;&quot;), _T(&quot;&quot;), MB_OK); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // test connections &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // to upstream filter &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if(pConnectFilter==NULL){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fFoundFilter = TRUE; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pFilter.QueryInterface(ppFilter); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return S_OK;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (pConnectFilter) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (fIsUpstream) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = DVB_ConnectFilters(pConnectFilter, pFilter); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = DVB_ConnectFilters(pFilter, pConnectFilter); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (SUCCEEDED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //that's the filter we want &nbsp; <br />
&nbsp;TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;Filters connected [%s]&quot;,TOOL_Convert_to_char(Name)); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fFoundFilter = TRUE; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pFilter.QueryInterface(ppFilter); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fFoundFilter = FALSE; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // that wasn't the the filter we wanted &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // so unload and try the next one &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = g_pGB-&amp;gt;RemoveFilter(pFilter); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TOOL_Debug(&quot;TUNER_Load_Filter&quot;,&quot;Filters not connected&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; else { &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fFoundFilter = TRUE; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pFilter.QueryInterface(ppFilter); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; pIMoniker = NULL; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; pFilter = NULL; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }// while &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; pIEnumMoniker = NULL; &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; return S_OK; &nbsp; <br />
} &nbsp;<br />
<br />
<br />
HRESULT DVB_ConnectFilters(IBaseFilter* pFilterUpstream,IBaseFilter* pFilterDownstream){ &nbsp; <br />
&nbsp; &nbsp; HRESULT &nbsp; &nbsp; &nbsp; &nbsp; hr = E_FAIL; &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; SmartPtr &nbsp; pIPinUpstream; &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; PIN_INFO &nbsp; &nbsp; &nbsp; &nbsp;PinInfoUpstream; &nbsp; <br />
&nbsp; &nbsp; PIN_INFO &nbsp; &nbsp; &nbsp; &nbsp;PinInfoDownstream; &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;TOOL_Debug(&quot;DVB_ConnectFilters&quot;,&quot;ConnectFilters&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; // grab upstream filter's enumerator &nbsp; <br />
&nbsp; &nbsp; SmartPtr &nbsp;pIEnumPinsUpstream; &nbsp; <br />
&nbsp; &nbsp; hr = pFilterUpstream-&amp;gt;EnumPins(&amp;amp;pIEnumPinsUpstream); &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; if(FAILED(hr)) &nbsp; <br />
&nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; TOOL_Debug(&quot;DVB_ConnectFilters&quot;,&quot;Enumerate Upstream Filter's Pins&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; // iterate through upstream filter's pins &nbsp; <br />
&nbsp; &nbsp; while (pIEnumPinsUpstream-&amp;gt;Next (1, &amp;amp;pIPinUpstream, 0) == S_OK) &nbsp; <br />
&nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; hr = pIPinUpstream-&amp;gt;QueryPinInfo (&amp;amp;PinInfoUpstream); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if(FAILED(hr)) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TOOL_Debug(&quot;DVB_ConnectFilters&quot;,&quot;Cannot Obtain Upstream Filter's PIN_INFO&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; SmartPtr &nbsp;pPinDown; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; pIPinUpstream-&amp;gt;ConnectedTo (&amp;amp;pPinDown); &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; // bail if pins are connected &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // otherwise check direction and connect &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if ((PINDIR_OUTPUT == PinInfoUpstream.dir) &amp;amp;&amp;amp; (pPinDown == NULL)) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // grab downstream filter's enumerator &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SmartPtr &nbsp;pIEnumPinsDownstream; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = pFilterDownstream-&amp;gt;EnumPins (&amp;amp;pIEnumPinsDownstream); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(FAILED(hr)) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TOOL_Debug(&quot;DVB_ConnectFilters&quot;,&quot;Cannot enumerate pins on downstream filter!&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // iterate through downstream filter's pins &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SmartPtr &nbsp; pIPinDownstream; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (pIEnumPinsDownstream-&amp;gt;Next (1, &amp;amp;pIPinDownstream, 0) == S_OK) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // make sure it is an input pin &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = pIPinDownstream-&amp;gt;QueryPinInfo(&amp;amp;PinInfoDownstream); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(SUCCEEDED(hr)) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SmartPtr &nbsp; pPinUp; &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Determine if the pin is already connected. &nbsp;Note that &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // VFW_E_NOT_CONNECTED is expected if the pin isn't yet connected. &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = pIPinDownstream-&amp;gt;ConnectedTo (&amp;amp;pPinUp); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(FAILED(hr) &amp;amp;&amp;amp; hr != VFW_E_NOT_CONNECTED) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TOOL_Debug(&quot;DVB_ConnectFilters&quot;,&quot;Failed in pIPinDownstream-&amp;gt;ConnectedTo()!&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ((PINDIR_INPUT == PinInfoDownstream.dir) &amp;amp;&amp;amp; (pPinUp == NULL)) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (SUCCEEDED (g_pGB-&amp;gt;Connect(pIPinUpstream, pIPinDownstream))) &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PinInfoDownstream.pFilter-&amp;gt;Release(); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PinInfoUpstream.pFilter-&amp;gt;Release(); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return S_OK; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PinInfoDownstream.pFilter-&amp;gt;Release(); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pIPinDownstream = NULL; &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } // while next downstream filter pin &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //We are now back into the upstream pin loop &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } // if output pin &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; pIPinUpstream = NULL; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; PinInfoUpstream.pFilter-&amp;gt;Release(); &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; } // while next upstream filter pin &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; return E_FAIL; &nbsp; <br />
}</div></div>
<p>Nous lierons alors, le m_pNetworkProvider au m_pTunerDemodDevice, puis le m_pBDACaptureDevice au m_pTunerDemodDevice :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">hr=TUNER_Load_Filter(KSCATEGORY_BDA_NETWORK_TUNER, &nbsp;&amp;amp;TUNER[0].m_pTunerDemodDevice,TUNER[0].m_pNetworkProvider, TRUE,TUNER[0].Name); <br />
<br />
hr=TUNER_Load_Filter(KSCATEGORY_BDA_RECEIVER_COMPONENT, &nbsp;&amp;amp;TUNER[0].m_pBDACaptureDevice,TUNER[0].m_pTunerDemodDevice, TRUE,TUNER[0].Name);</div></div>
<p>Une fois cela effectué il faut charger le demux ( le démultiplexeur)</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;HRESULT hr = S_OK; &nbsp; <br />
&nbsp; &nbsp; hr = CoCreateInstance(CLSID_MPEG2Demultiplexer,NULL, CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void **) &amp;amp;TUNER[TUNER_Number].m_pDemux);<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp;TOOL_Debug(&quot;Could not CoCreateInstance CLSID_MPEG2Demultiplexer\n&quot;,&quot;&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; hr = g_pGB-&amp;gt;AddFilter(TUNER[TUNER_Number].m_pDemux, L&quot;Demux&quot;); &nbsp; <br />
&nbsp; &nbsp; if (FAILED(hr)) { &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; TOOL_Debug(&quot;Unable to add demux filter to graph\n&quot;,&quot;&quot;); &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return hr; &nbsp; <br />
&nbsp; &nbsp; }</div></div>
<p>Puis il faut connecter directement les filtres du m_pDemux au m_pBDACaptureDevice :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">hr = DVB_ConnectFilters(TUNER[0].m_pBDACaptureDevice, TUNER[0].m_pDemux);</div></div>
<p>Puis nous connectons le reste des filtres :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">hr=TUNER_Load_Filter(KSCATEGORY_BDA_TRANSPORT_INFORMATION,&amp;amp;TUNER[0].m_pBDATIF,TUNER[0].m_pDemux, TRUE,L&quot;BDA MPEG2 Transport Information Filter&quot;); <br />
<br />
hr=TUNER_Load_Filter(KSCATEGORY_BDA_TRANSPORT_INFORMATION,&amp;amp;TUNER[0].m_pBDASecTab,NULL, TRUE,L&quot;MPEG-2 Sections and Tables&quot;);</div></div>
<p>Puis nous y mappons la section et tables du MPEG2  et ce pour obtenir la PAT, SDT etc&#8230; Encore une chose qui n&rsquo;est pas spécialement documentée sur le net&#8230; A vous de chercher un peu, car çà à l&rsquo;air d&rsquo;être assez simple mais très fastidieux à faire&#8230;.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HRESULT hr;<br />
SmartPtr PinOut;<br />
SmartPtr pDemux;<br />
hr = &nbsp;TUNER[TUNER_Selected].m_pDemux-&amp;gt;QueryInterface(IID_IMpeg2Demultiplexer, (void**)&amp;amp;pDemux);<br />
if (SUCCEEDED(hr)){<br />
// Create a new output pin.<br />
AM_MEDIA_TYPE mt;<br />
ZeroMemory(&amp;amp;mt, sizeof(AM_MEDIA_TYPE));<br />
GetPSIMedia(&amp;amp;mt);<br />
<br />
// Create the pin.<br />
IPin *pPsiPin;<br />
hr = pDemux-&amp;gt;CreateOutputPin(&amp;amp;mt, L&quot;PSI&quot;, &amp;amp;pPsiPin);<br />
if (SUCCEEDED(hr))<br />
{<br />
IMPEG2PIDMap *pPid = NULL;<br />
hr = pPsiPin-&amp;gt;QueryInterface(IID_IMPEG2PIDMap, (void**)&amp;amp;pPid);<br />
<br />
// Map to PID 0.<br />
ULONG Pid = 0x00;<br />
hr = pPid-&amp;gt;MapPID(1, &amp;amp;Pid, MEDIA_MPEG2_PSI);<br />
<br />
//NIT<br />
Pid = 0x10;<br />
hr = pPid-&amp;gt;MapPID(1, &amp;amp;Pid, MEDIA_MPEG2_PSI);<br />
<br />
//SDT;<br />
Pid = 0x11;<br />
hr = pPid-&amp;gt;MapPID(1, &amp;amp;Pid, MEDIA_MPEG2_PSI);<br />
<br />
PinOut = GetPin(TUNER[TUNER_Selected].m_pBDASecTab,PINDIR_INPUT);<br />
hr= g_pGB-&amp;gt;Connect(PinOut,pPsiPin);<br />
<br />
&nbsp;} &nbsp; <br />
}<br />
return hr;</div></div>
<p>Et puis pour lier le pin vidéo du demux au filtre de rendu&#8230;</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HRESULT hr;<br />
SmartPtr PinOut;<br />
SmartPtr pDemux;<br />
hr = &nbsp;TUNER[TUNER_Selected].m_pDemux-&amp;gt;QueryInterface(IID_IMpeg2Demultiplexer, (void**)&amp;amp;pDemux);<br />
if (SUCCEEDED(hr)){<br />
// Create a new output pin.<br />
AM_MEDIA_TYPE mt;<br />
ZeroMemory(&amp;amp;mt, sizeof(AM_MEDIA_TYPE));<br />
GetVideoMedia(&amp;amp;mt);<br />
<br />
// Create the pin.<br />
IPin *VideoPin;<br />
hr = pDemux-&amp;gt;CreateOutputPin(&amp;amp;mt, L&quot;Video&quot;, &amp;amp;VideoPin);<br />
if (SUCCEEDED(hr))<br />
{<br />
IMPEG2PIDMap *pPid = NULL;<br />
hr = VideoPin-&amp;gt;QueryInterface(IID_IMPEG2PIDMap, (void**)&amp;amp;pPid);<br />
<br />
ULONG Pid = 120; ( Pid video de la chaine ) <br />
<br />
long Filter=2;<br />
hr = pPid-&amp;gt;MapPID(1, &amp;amp;Pid, MEDIA_ELEMENTARY_STREAM);<br />
SmartPtr &nbsp; &nbsp;Colour_In;<br />
SmartPtr &nbsp; &nbsp;Colour_Out;<br />
Colour_In = GetPin(Colour_Converter,PINDIR_INPUT);<br />
hr= g_pGB-&amp;gt;Connect(VideoPin,Colour_In);<br />
<br />
Colour_Out = GetPin(Colour_Converter,PINDIR_OUTPUT);<br />
<br />
hr= g_pGB-&amp;gt;Render(Colour_Out);<br />
<br />
&nbsp;} &nbsp; <br />
}<br />
return hr;</div></div>
<p>Et le tour est joué!!!</p>
<p>Vous parviendrez à obtenir les pid audio et video en utilisant un logiciel du style pouchtin tv cela vous donnera un truc du style : <a href="http://blog.developpez.com/odyssea/files/2014/01/Pid.png"><img src="http://blog.developpez.com/odyssea/files/2014/01/Pid-300x168.png" alt="Pid" width="300" height="168" class="alignnone size-medium wp-image-17" /></a></p>
<p>Voili voilou, j&rsquo;espère que je vous aurai aidé dans vos recherche et que finalement vous arrêterez de maudire ce @*¤# de msdn qui ne dit rien du tout&#8230;.</p>
<p>Et vous n&rsquo;oublierez pas de lancer le graph aussi!!!!</p>
<p>Si vous avez des questions, des soucis, des remarques, je suis à votre écoute!!!!!!!!!!</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obtenir une preview d&#8217;une video, un thumbnail quoi!!</title>
		<link>https://blog.developpez.com/odyssea/p8622/annonces/obtenir_une_preview_d_une_video_un_thumb</link>
		<comments>https://blog.developpez.com/odyssea/p8622/annonces/obtenir_une_preview_d_une_video_un_thumb#comments</comments>
		<pubDate>Thu, 11 Feb 2010 22:19:13 +0000</pubDate>
		<dc:creator><![CDATA[Sotoaleono]]></dc:creator>
				<category><![CDATA[Annonces]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Simple : long Get_Thumbnail(long Object) { &#160; Debug(&#34;Get_Thumbnail&#34;,&#34;Début de la fonction Get_Thumbnail&#34;); &#160; HRESULT hr; &#160; &#160; CoInitialize (NULL); &#160; &#160; SmartPtr &#60; IMediaDet &#62; pDet; &#160; &#160; hr = CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER, IID_IMediaDet, (void**) &#38;pDet ); &#160; &#160; if (FAILED(hr))return FALSE; &#160; &#160; BSTR &#160;Origin_File = SysAllocString(Convert_to_LPC(Odyssea_Media[Object].FileName)); &#160; &#160; hr = pDet-&#62;put_Filename(Origin_File); &#160; &#160; if (FAILED(hr)) &#160; &#160;return FALSE; &#160; &#160; double StreamLength; &#160; &#160; pDet-&#62;get_StreamLength(&#38;StreamLength); &#160; &#160; long lStreams; &#160; &#160; &#160; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Simple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">long Get_Thumbnail(long Object) <br />
{ <br />
&nbsp; Debug(&quot;Get_Thumbnail&quot;,&quot;Début de la fonction Get_Thumbnail&quot;); <br />
&nbsp; <br />
HRESULT hr; <br />
&nbsp;<br />
&nbsp; CoInitialize (NULL); <br />
&nbsp;<br />
&nbsp; SmartPtr &lt; IMediaDet &gt; pDet; <br />
&nbsp;<br />
&nbsp; hr = CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER, IID_IMediaDet, (void**) &amp;pDet ); <br />
&nbsp;<br />
&nbsp; if (FAILED(hr))return FALSE; <br />
&nbsp; <br />
&nbsp; BSTR &nbsp;Origin_File = SysAllocString(Convert_to_LPC(Odyssea_Media[Object].FileName)); <br />
&nbsp;<br />
&nbsp; hr = pDet-&gt;put_Filename(Origin_File); <br />
&nbsp;<br />
&nbsp; if (FAILED(hr)) &nbsp; &nbsp;return FALSE; <br />
&nbsp;<br />
&nbsp; double StreamLength; <br />
&nbsp;<br />
&nbsp; pDet-&gt;get_StreamLength(&amp;StreamLength); <br />
&nbsp;<br />
&nbsp; long lStreams; <br />
&nbsp;<br />
&nbsp; &nbsp; hr = pDet-&gt;get_OutputStreams(&amp;lStreams); <br />
&nbsp;<br />
&nbsp; &nbsp; if (FAILED(hr))return FALSE; <br />
&nbsp; <br />
&nbsp; bool bFound = false; <br />
&nbsp;<br />
&nbsp; for (int i=0; i&lt;lStreams; i++) <br />
&nbsp; { <br />
&nbsp;<br />
&nbsp; &nbsp; GUID major_type; <br />
&nbsp;<br />
&nbsp; &nbsp; hr = pDet-&gt;put_CurrentStream(i); <br />
&nbsp;<br />
&nbsp; &nbsp; if (SUCCEEDED(hr)) <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; hr = pDet-&gt;get_StreamType(&amp;major_type); <br />
&nbsp;<br />
&nbsp; &nbsp; if (FAILED(hr)) <br />
&nbsp; &nbsp; &nbsp; break; <br />
&nbsp;<br />
&nbsp; &nbsp; if (major_type == MEDIATYPE_Video) <br />
&nbsp; &nbsp; { <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; bFound = true; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; break; <br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; if (!bFound) <br />
&nbsp; &nbsp; return VFW_E_INVALIDMEDIATYPE; <br />
&nbsp; <br />
&nbsp; long width = 0, height = 0; &nbsp; <br />
&nbsp;<br />
&nbsp; &nbsp; AM_MEDIA_TYPE mt; <br />
&nbsp;<br />
&nbsp; &nbsp; hr = pDet-&gt;get_StreamMediaType(&amp;mt); <br />
&nbsp;<br />
&nbsp; &nbsp; if (SUCCEEDED(hr)) <br />
&nbsp;<br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if ((mt.formattype == FORMAT_VideoInfo) &amp;&amp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (mt.cbFormat &gt;= sizeof(VIDEOINFOHEADER))) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width = pVih-&gt;bmiHeader.biWidth; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height = pVih-&gt;bmiHeader.biHeight; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; else <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hr = VFW_E_INVALIDMEDIATYPE; <br />
&nbsp; &nbsp; &nbsp; &nbsp;} <br />
&nbsp;<br />
&nbsp; &nbsp; if (FAILED(hr))return FALSE; <br />
&nbsp; <br />
&nbsp; BSTR &nbsp;Texture_File = SysAllocString(Convert_to_LPC(Odyssea_Media[Object].TexF)); &nbsp; &nbsp;<br />
&nbsp;<br />
&nbsp; hr = pDet-&gt;WriteBitmapBits((double)(StreamLength/2), width, height, Texture_File); <br />
&nbsp;<br />
&nbsp; hr=D3DXCreateTextureFromFileEx(g_pd3dDevice,Convert_to_LPC(Odyssea_Media[Object].TexF),D3DX_DEFAULT_NONPOW2,D3DX_DEFAULT_NONPOW2, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL,&amp;Temporary_Texture); <br />
&nbsp;<br />
&nbsp; D3DXSaveTextureToFileA(Odyssea_Media[Object].TexF, D3DXIFF_JPG,Temporary_Texture,NULL); &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp; if (FAILED(hr)) &nbsp; &nbsp;return FALSE; <br />
Debug(&quot;Get_Thumbnail&quot;,&quot;Fin de la fonction Get_Thumbnail&quot;); <br />
&nbsp; return S_OK; <br />
}</div></div>
<p>Tout simplement&#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chose promise chose due</title>
		<link>https://blog.developpez.com/odyssea/p8575/annonces/chose_promise_chose_due</link>
		<comments>https://blog.developpez.com/odyssea/p8575/annonces/chose_promise_chose_due#comments</comments>
		<pubDate>Fri, 29 Jan 2010 23:06:41 +0000</pubDate>
		<dc:creator><![CDATA[Sotoaleono]]></dc:creator>
				<category><![CDATA[Annonces]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voici les extraits de codes réalisés afin de permettre l&#8217;écriture(ajout et modification) de balise à la fin des fichiers : //////////////////// //////////////////// //////////////////// //TAG V4 //////////////////// //////////////////// //////////////////// long Get_TAGV4_Size(long Object){ //Obtient la taille normale du fichier donc logiquement la taille du TAG long TAGSize=0; &#160; FILE *FileSourceGTS; &#160; if(Odyssea_Media[Object].Type==OSERIE &#124;&#124; Odyssea_Media[Object].Type==OMOVIE &#124;&#124; Odyssea_Media[Object].Type==OVIDEO)FileSourceGTS=fopen(Odyssea_Media[Object].TexF,&#34;rb&#34;); //Verification de la présence du &#60;/ODC&#62; obligatoire en fin de fichier if(FileSourceGTS){ char TAGODC[10]; &#160; fseek(FileSourceGTS,-10L,SEEK_END); &#160; fread(&#38;TAGODC,sizeof(char),6,FileSourceGTS); &#160; if(strncmp(TAGODC,&#34;&#60;/ODC&#62;&#34;,6)==0){ &#160; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voici les extraits de codes réalisés afin de permettre l&rsquo;écriture(ajout et modification) de balise à la fin des fichiers :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">//////////////////// <br />
//////////////////// <br />
//////////////////// <br />
//TAG V4 <br />
//////////////////// <br />
//////////////////// <br />
//////////////////// <br />
long Get_TAGV4_Size(long Object){ <br />
//Obtient la taille normale du fichier donc logiquement la taille du TAG <br />
long TAGSize=0; <br />
&nbsp;<br />
FILE *FileSourceGTS; <br />
&nbsp;<br />
if(Odyssea_Media[Object].Type==OSERIE || Odyssea_Media[Object].Type==OMOVIE || Odyssea_Media[Object].Type==OVIDEO)FileSourceGTS=fopen(Odyssea_Media[Object].TexF,&quot;rb&quot;); <br />
//Verification de la présence du &lt;/ODC&gt; obligatoire en fin de fichier <br />
if(FileSourceGTS){ <br />
char TAGODC[10]; <br />
&nbsp;<br />
fseek(FileSourceGTS,-10L,SEEK_END); <br />
&nbsp;<br />
fread(&amp;TAGODC,sizeof(char),6,FileSourceGTS); <br />
&nbsp;<br />
if(strncmp(TAGODC,&quot;&lt;/ODC&gt;&quot;,6)==0){ <br />
&nbsp;<br />
&nbsp; fread(&amp;TAGSize,sizeof(long),1,FileSourceGTS); <br />
//Car en fait la taille est marquée sous un long, en fin du fichier, précédé par la chaine &lt;/ODC&gt; <br />
} <br />
&nbsp;<br />
fclose(FileSourceGTS); <br />
&nbsp;<br />
return TAGSize; <br />
} <br />
else return -1; <br />
&nbsp;<br />
} <br />
&nbsp;<br />
void Delete_TAGV4(long Object) <br />
{ <br />
&nbsp;<br />
long TAGSize=Get_TAGV4_Size(Object); &nbsp;<br />
&nbsp;<br />
FILE *FileTAG; <br />
&nbsp;<br />
if(Odyssea_Media[Object].Type==OSERIE || Odyssea_Media[Object].Type==OMOVIE || Odyssea_Media[Object].Type==OVIDEO)FileTAG=fopen(Odyssea_Media[Object].TexF,&quot;rb&quot;); <br />
&nbsp;<br />
char *Temp = (char*)malloc(TAGSize); &nbsp;<br />
&nbsp;<br />
fseek(FileTAG,0,SEEK_SET); <br />
&nbsp;<br />
fread(Temp,sizeof(char),TAGSize,FileTAG); <br />
&nbsp;<br />
fclose(FileTAG); <br />
&nbsp;<br />
if(Odyssea_Media[Object].Type==OSERIE || Odyssea_Media[Object].Type==OMOVIE || Odyssea_Media[Object].Type==OVIDEO)FileTAG=fopen(Odyssea_Media[Object].TexF,&quot;wb&quot;); <br />
fwrite(Temp,sizeof(char),TAGSize,FileTAG); <br />
&nbsp;<br />
fclose(FileTAG); <br />
&nbsp;<br />
} <br />
&nbsp;<br />
&nbsp;<br />
void SetTagV4(long Object,char *Balise, char *Information) <br />
{ <br />
Debug(&quot;SetTAGV4&quot;); <br />
&nbsp;<br />
long TAGSize=Get_TAGV4_Size(Object); <br />
&nbsp;<br />
char StrlenTAGSize[10]; <br />
&nbsp;<br />
sprintf(StrlenTAGSize,&quot;%d&quot;,TAGSize); <br />
&nbsp;<br />
FILE *FileSource; <br />
//Présence du &lt;/ODC&gt; <br />
if(TAGSize&gt;0){ <br />
&nbsp;<br />
if(Odyssea_Media[Object].Type==OSERIE || Odyssea_Media[Object].Type==OMOVIE || Odyssea_Media[Object].Type==OVIDEO)FileSource=fopen(Odyssea_Media[Object].TexF,&quot;rb&quot;); <br />
&nbsp;<br />
fpos_t posend = 0; <br />
&nbsp;<br />
fseek(FileSource,0,SEEK_END); <br />
&nbsp;<br />
fgetpos(FileSource, &amp;posend); <br />
&nbsp;<br />
long SizeTampon=(posend-TAGSize); <br />
&nbsp;<br />
char *TempTampon = (char*)malloc(SizeTampon-10); &nbsp;<br />
&nbsp;<br />
fseek(FileSource,TAGSize,SEEK_SET); <br />
&nbsp;<br />
fread(TempTampon,sizeof(char),SizeTampon-10,FileSource); <br />
&nbsp;<br />
TempTampon[SizeTampon-10]=NULL; <br />
&nbsp;<br />
fclose(FileSource); <br />
//On efface <br />
&nbsp;<br />
Delete_TAGV4(Object); <br />
&nbsp;<br />
char *FinalTampon = (char*)malloc(SizeTampon+strlen(Information)); &nbsp;<br />
&nbsp;<br />
long PositionBaliseHead=0; <br />
&nbsp;<br />
long PositionBaliseQueue=0; <br />
&nbsp; <br />
for(long i=0;i&lt;strlen(TempTampon);i++){ <br />
&nbsp;<br />
&nbsp; char *TempBalise = (char*)malloc(strlen(Balise)+2); &nbsp;<br />
&nbsp;<br />
&nbsp; char *TempBaliseRef = (char*)malloc(strlen(Balise)+2); &nbsp;<br />
&nbsp; <br />
&nbsp; if(PositionBaliseHead==0){ <br />
&nbsp;<br />
&nbsp; &nbsp; sprintf(TempBaliseRef,&quot;&lt;%s&gt;&quot;,Balise); &nbsp;<br />
&nbsp;<br />
&nbsp; &nbsp; for(long j=0;j&lt;strlen(TempBaliseRef);j++)TempBalise[j]=TempTampon[i+j]; <br />
&nbsp;<br />
&nbsp; &nbsp; if(strncmp(TempBalise,TempBaliseRef,strlen(TempBaliseRef))==0)PositionBaliseHead=i+strlen(Balise)+2; <br />
&nbsp;<br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; if(PositionBaliseHead!=0 &amp;&amp; PositionBaliseQueue==0){ <br />
&nbsp;<br />
&nbsp; &nbsp; sprintf(TempBaliseRef,&quot;&lt;/%s&gt;&quot;,Balise); <br />
&nbsp;<br />
&nbsp; &nbsp; for(long j=0;j&lt;strlen(TempBaliseRef);j++)TempBalise[j]=TempTampon[i+j]; <br />
&nbsp;<br />
&nbsp; &nbsp; if(strncmp(TempBalise,TempBaliseRef,strlen(TempBaliseRef))==0)PositionBaliseQueue=i; <br />
&nbsp;<br />
&nbsp; } <br />
&nbsp;<br />
} <br />
&nbsp;<br />
long Count=0; <br />
&nbsp;<br />
if(PositionBaliseHead!=0 &amp;&amp; PositionBaliseQueue!=0){ <br />
&nbsp;<br />
&nbsp; for(long i=0;i&lt;strlen(TempTampon);i++){ <br />
&nbsp;<br />
&nbsp; &nbsp; if(i&lt;PositionBaliseHead || i&gt;PositionBaliseQueue-1)FinalTampon[Count]=TempTampon[i],Count++; <br />
&nbsp;<br />
&nbsp; &nbsp; else { <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; for(long j=0;j&lt;strlen(Information);j++)FinalTampon[Count+j]=Information[j]; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; Count+=strlen(Information); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; i=PositionBaliseQueue-1; <br />
&nbsp;<br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; FinalTampon[Count]=NULL; <br />
&nbsp;<br />
} <br />
&nbsp;<br />
else{ <br />
&nbsp;<br />
&nbsp; char *Tampon = (char*)malloc(strlen(Information)+5+(strlen(Balise)*2)); &nbsp;<br />
&nbsp;<br />
&nbsp; sprintf(Tampon,&quot;&lt;%s&gt;%s&lt;/%s&gt;&quot;,Balise,Information,Balise); <br />
&nbsp;<br />
&nbsp; strcpy(FinalTampon,TempTampon); <br />
&nbsp;<br />
&nbsp; strcat(FinalTampon,Tampon); <br />
&nbsp;<br />
&nbsp; Count=strlen(FinalTampon); <br />
&nbsp;<br />
} <br />
&nbsp; <br />
char ODCInformation[256]; <br />
&nbsp;<br />
sprintf(ODCInformation,&quot;&lt;/ODC&gt;&quot;); <br />
&nbsp;<br />
if(Odyssea_Media[Object].Type==OSERIE || Odyssea_Media[Object].Type==OMOVIE || Odyssea_Media[Object].Type==OVIDEO)FileSource=fopen(Odyssea_Media[Object].TexF,&quot;ab&quot;); <br />
&nbsp;<br />
posend = 0; <br />
&nbsp;<br />
fseek(FileSource,0,SEEK_END); <br />
&nbsp;<br />
fgetpos(FileSource, &amp;posend); <br />
&nbsp;<br />
long ComputeTag=posend; <br />
&nbsp;<br />
fwrite(FinalTampon,sizeof(char),strlen(FinalTampon),FileSource); <br />
&nbsp;<br />
fwrite(ODCInformation,sizeof(char),strlen(ODCInformation),FileSource); <br />
&nbsp;<br />
fwrite(&amp;ComputeTag,sizeof(long),1,FileSource); <br />
&nbsp;<br />
} <br />
&nbsp;<br />
else{ <br />
&nbsp;<br />
if(Odyssea_Media[Object].Type==OSERIE || Odyssea_Media[Object].Type==OMOVIE || Odyssea_Media[Object].Type==OVIDEO)FileSource=fopen(Odyssea_Media[Object].TexF,&quot;ab&quot;); <br />
&nbsp;<br />
long ComputeTag=0; <br />
&nbsp;<br />
char *Tampon = (char*)malloc(strlen(Information)+5+(strlen(Balise)*2)); &nbsp;<br />
&nbsp;<br />
sprintf(Tampon,&quot;&lt;%s&gt;%s&lt;/%s&gt;&quot;,Balise,Information,Balise); <br />
&nbsp;<br />
char ODCInformation[256]; <br />
&nbsp;<br />
sprintf(ODCInformation,&quot;&lt;/ODC&gt;&quot;); <br />
&nbsp;<br />
fpos_t posend = 0; <br />
&nbsp;<br />
fseek(FileSource,0,SEEK_END); <br />
&nbsp;<br />
fgetpos(FileSource, &amp;posend); <br />
&nbsp;<br />
ComputeTag=posend; <br />
&nbsp;<br />
fwrite(Tampon,sizeof(char),strlen(Tampon),FileSource); <br />
&nbsp;<br />
fwrite(ODCInformation,sizeof(char),strlen(ODCInformation),FileSource); <br />
&nbsp;<br />
fwrite(&amp;ComputeTag,sizeof(long),1,FileSource); <br />
&nbsp;<br />
} <br />
&nbsp;<br />
fclose(FileSource); <br />
&nbsp;<br />
} <br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
long GetTagV4(long Object,char *Balise, char *Dest){ <br />
&nbsp;<br />
long TAGSize=Get_TAGV4_Size(Object); <br />
&nbsp;<br />
char StrlenTAGSize[10]; <br />
&nbsp;<br />
sprintf(StrlenTAGSize,&quot;%d&quot;,TAGSize); <br />
&nbsp;<br />
FILE *FileSource; <br />
&nbsp;<br />
if(TAGSize&gt;0){ <br />
&nbsp;<br />
if(Odyssea_Media[Object].Type==OSERIE || Odyssea_Media[Object].Type==OMOVIE || Odyssea_Media[Object].Type==OVIDEO)FileSource=fopen(Odyssea_Media[Object].TexF,&quot;rb&quot;); <br />
&nbsp;<br />
&nbsp;<br />
fpos_t posend = 0; <br />
&nbsp;<br />
fseek(FileSource,0,SEEK_END); <br />
&nbsp;<br />
fgetpos(FileSource, &amp;posend); <br />
&nbsp;<br />
long SizeTampon=(posend-TAGSize); <br />
&nbsp;<br />
char *TempTampon = (char*)malloc(SizeTampon-10); &nbsp;<br />
&nbsp;<br />
fseek(FileSource,TAGSize,SEEK_SET); <br />
&nbsp;<br />
fread(TempTampon,sizeof(char),SizeTampon-10,FileSource); <br />
&nbsp;<br />
TempTampon[SizeTampon-10]=NULL; <br />
&nbsp;<br />
fclose(FileSource); <br />
&nbsp;<br />
long PositionBaliseHead=0; <br />
&nbsp;<br />
long PositionBaliseQueue=0; <br />
&nbsp; <br />
for(long i=0;i&lt;strlen(TempTampon);i++){ <br />
&nbsp;<br />
&nbsp; char *TempBalise = (char*)malloc(strlen(Balise)+2); &nbsp;<br />
&nbsp;<br />
&nbsp; char *TempBaliseRef = (char*)malloc(strlen(Balise)+2); &nbsp;<br />
&nbsp; <br />
&nbsp; if(PositionBaliseHead==0){ <br />
&nbsp;<br />
&nbsp; &nbsp; sprintf(TempBaliseRef,&quot;&lt;%s&gt;&quot;,Balise); &nbsp;<br />
&nbsp;<br />
&nbsp; &nbsp; for(long j=0;j&lt;strlen(TempBaliseRef);j++)TempBalise[j]=TempTampon[i+j]; <br />
&nbsp;<br />
&nbsp; &nbsp; if(strncmp(TempBalise,TempBaliseRef,strlen(TempBaliseRef))==0)PositionBaliseHead=i+strlen(Balise)+2; <br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; if(PositionBaliseHead!=0 &amp;&amp; PositionBaliseQueue==0){ <br />
&nbsp;<br />
&nbsp; &nbsp; sprintf(TempBaliseRef,&quot;&lt;/%s&gt;&quot;,Balise); <br />
&nbsp;<br />
&nbsp; &nbsp; for(long j=0;j&lt;strlen(TempBaliseRef);j++)TempBalise[j]=TempTampon[i+j]; <br />
&nbsp;<br />
&nbsp; &nbsp; if(strncmp(TempBalise,TempBaliseRef,strlen(TempBaliseRef))==0)PositionBaliseQueue=i; <br />
&nbsp; } <br />
} <br />
&nbsp;<br />
char *TDest=(char*)malloc(PositionBaliseQueue-PositionBaliseHead); <br />
&nbsp;<br />
for(long i=PositionBaliseHead;i&lt;PositionBaliseQueue;i++)TDest[i-PositionBaliseHead]=TempTampon[i]; <br />
&nbsp;<br />
TDest[PositionBaliseQueue-PositionBaliseHead]=NULL; <br />
&nbsp;<br />
strcpy(Dest,TDest); <br />
&nbsp;<br />
return TRUE; <br />
&nbsp;<br />
&nbsp; } <br />
&nbsp;<br />
return FALSE; <br />
}</div></div>
<p>Deux jours de travail&#8230;.Trois fois rien!!!!</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Premier billet : l&#8217;indexation</title>
		<link>https://blog.developpez.com/odyssea/p8572/annonces/premier_billet_l_indexation</link>
		<comments>https://blog.developpez.com/odyssea/p8572/annonces/premier_billet_l_indexation#comments</comments>
		<pubDate>Fri, 29 Jan 2010 10:37:37 +0000</pubDate>
		<dc:creator><![CDATA[Sotoaleono]]></dc:creator>
				<category><![CDATA[Annonces]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour! Premier billet de réflexion, l&#8217;indexation des fichiers multimédia. Passons outre la recherche des fichiers (dont le code sera exposé ultérieurement). Comment effectuer une indexation rapide dont la gestion serait simple? Car l&#8217;indexation se doit d&#8217;être rapide(moins de quelques minutes au démarrage du logiciel), et actualisée. Il s&#8217;agit de la pierre angulaire de ce logiciel, ne pas avoir à renommer tous les fichiers à chaque fois, et surtout prendre en compte chacune des modifications(synopsis, paroles [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour!</p>
<p>Premier billet de réflexion, l&rsquo;indexation des fichiers multimédia.</p>
<p>Passons outre la recherche des fichiers (dont le code sera exposé ultérieurement). Comment effectuer une indexation rapide dont la gestion serait simple?</p>
<p>Car l&rsquo;indexation se doit d&rsquo;être rapide(moins de quelques minutes au démarrage du logiciel), et actualisée. Il s&rsquo;agit de la pierre angulaire de ce logiciel, ne pas avoir à renommer tous les fichiers à chaque fois,  et surtout prendre en compte chacune des modifications(synopsis, paroles etc&#8230;)</p>
<p>Une bonne indexation des fichiers permet alors une bonne gestion de ces fichiers et surtout rendant utile la recherche de données sur les médias(acteur, synopsis, paroles, titre, saison&#8230;.)</p>
<p>Voici les essais et les réflexions liés à cet indexation : </p>
<p>Première tentative : indexation dans un fichier unique </p>
<p>Le logiciel scanne une fois la totalité du répertoire(comme windows media player) puis les modifications effectuées sont répercutées dans le fichier de données.</p>
<p>Bon principe de départ, car l&rsquo;indexation s&rsquo;effectue une seule fois, mais à l&rsquo;usage, après plusieurs suppressions &amp; modifications, la gestion de cette base devient vraiment très compliquée, et difficilement applicable à une collection entière de 4000 fichiers&#8230;.Passons.</p>
<p>Deuxième tentative : application de tags &laquo;&nbsp;rigides&nbsp;&raquo; dans les fichiers</p>
<p>On y applique un tag unique du style : Fichier de texture &#8211; Synopsis &#8211; Renseignement 1 &#8211; Renseignement 2 &#8211; Renseignement 3. Hyper pratique au début, car au début, tout est formaté toujours au même format, (150 octets en fin de fichier) contenant les informations de base. La récupération s&rsquo;effectue alors très rapidement.</p>
<p>Super hyper pratique&#8230;.quand on a que trois types d&rsquo;information à récolter, par contre lorsqu&rsquo;une foule d&rsquo;informations diverses doit être recueillie&#8230;Il devient difficile de tout gérer, et de créer une fonction par type de fichier (lecture, écriture, effacement des tags, et ce pour chacun des types de fichier (serie, film, mp3, chaine tv)) Bref une vraie galère en fin de compte.</p>
<p>Troisième tentative : application de balises à la fin des fichiers </p>
<p>Meilleure façon trouvée à ce jour : des balises du type (SYNOPSIS) xxxx(/SYNOPSIS) ou (ARTISTE)xxx(/ARTISTE), ces dernières permettent de recueillir les informations désirées sur n&rsquo;importe quel fichier, à l&rsquo;aide de fonctions uniques pour tout les types de fichiers. Par exemple GetTAG(&laquo;&nbsp;c:/essai.txt&nbsp;&raquo;,&nbsp;&raquo;SYNOPSIS&nbsp;&raquo;,Temporary), renvoyant automatiquement le contenu de la balise synopsis du fichier.</p>
<p>Cela permet d&rsquo;obtenir rapidement les informations demandées, sans avoir à les récupérer sur internet à chaque fois. Ces fonctions sont en cours d&rsquo;élaboration actuellement.</p>
<p>Le prochain billet de ce blog y sera consacré.</p>
<p>Kenavo!!!</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passage dans une nouvelle ère!!!!</title>
		<link>https://blog.developpez.com/odyssea/p8566/annonces/passage_dans_une_nouvelle_ere</link>
		<comments>https://blog.developpez.com/odyssea/p8566/annonces/passage_dans_une_nouvelle_ere#comments</comments>
		<pubDate>Wed, 27 Jan 2010 21:28:39 +0000</pubDate>
		<dc:creator><![CDATA[Sotoaleono]]></dc:creator>
				<category><![CDATA[Annonces]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Dernièrement, j&#8217;ai rempli mon sac du courage qu&#8217;il me restait et me suis proposé à demander un hébergement? Examen de ma candidature faite, et réussi, je me retrouve dans cette belle fenêtre ouverte sur le web qu&#8217;est DEVELOPPEZ.COM. Tout n&#8217;est pas encore en place, et j&#8217;avoue, je tâtonne encore un peu dans cet univers (redmine et autre). Mais il faudra bien commencer à prendre ses marques. J&#8217;espère juste avoir assez de temps(24 heures &#8211; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour, </p>
<p>Dernièrement, j&rsquo;ai rempli mon sac du courage qu&rsquo;il me restait et me suis proposé à demander un hébergement?</p>
<p>Examen de ma candidature faite, et réussi, je me retrouve dans cette belle fenêtre ouverte sur le web qu&rsquo;est DEVELOPPEZ.COM.</p>
<p>Tout n&rsquo;est pas encore en place, et j&rsquo;avoue, je tâtonne encore un peu dans cet univers (redmine et autre). Mais il faudra bien commencer à prendre ses marques.</p>
<p>J&rsquo;espère juste avoir assez de temps(24 heures &#8211; (boulot + famille + sommeil)) me laisse finalement quelques heures pour mener à bien le projet et ces outils.</p>
<p>Allez&#8230;KENAVO </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
