Modifications suite au passage au tout HD

Contributions au logiciel proposées par certains utilisateurs, et qui peuvent éventuellement intéresser les autres utilisateurs.
Répondre
mekp
Messages : 14
Enregistré le : 20 juin 2010, 15:06
Carte Tuner : pinnacle PCTV hybrid pro pci
Êtes-vous un robot ? : Je ne suis pas un robot

Modifications suite au passage au tout HD

Message par mekp »

RESOLUTION du problème en utilisant PouchinTVMod 0.6.2.288 avec XP 32 bits et avec ffdshow

- j'utilise PouchinTVMod 0.6.2.288 avec XP 32 bits et avec ffdshow
- je reçois la TNT via la tour Eiffel Paris
- ma solution : modification du fichier channels.cpp
-> appel de PostMessage(hMainWnd, WM_COMMAND, IDM_APP_RESTART, NULL);
lors du changement de chaine s'il y a changement de format vidéo
ce qui est équivalent à <Ctrl>Q
CELA permet de résoudre le problème avec PouchinTVMod 0.6.2.288 et avec ffdshow
- INCONVENIENT de cette solution :
- le tableau des ixChaine correspondant à chaque format est en dur dans le code
- on pourrait envisager de lire ce tableau depuis un fichier externe qui serait
modifiable sans recompiler le code (par exemple si Arte passe en 1920x1080)
- l'idéal serait de trouver les formats dans le fichier chaines.xml
MAIS est-ce possible ?

DETAIL de la modification :

/+++++ : ajouté juste avant la declaration du module change_chaine(...)
#define NBFORMAT 5
char tb_format_ixChaine[NBFORMAT][99] = { // l'espace en fin de chaine est necessaire
"1920x1080 0 1 2 3 6 8 9 10 11 13 14 15 16 18 19 21 22 23 25 ",
"1440x1080 4 5 7 12 17 20 30 ",
"720x576 24 26 31 32 33 ",
"pour extension future",
"pour extension future"};
int ixChaine_prev = -1;
//+++++
HRESULT change_chaine(int ixChaine, bool bForceTune)
{
..... contenu inchangé .....
//+++++ : ajouté en fin du module change_chaine(...) juste avant return S_OK;
char chixChaine[5], chixChaine_prev[5];
int iformat, iformat_prev;
iformat_prev = -1;
iformat = -1;
sprintf(chixChaine_prev, " %d ", ixChaine_prev);
sprintf(chixChaine, " %d ", ixChaine);
if ( ixChaine_prev != -1 ) {
for (int ifor = 0; ifor<NBFORMAT; ifor++) {
if ( strstr(tb_format_ixChaine[ifor], chixChaine_prev) != NULL ) {
iformat_prev = ifor;
break;
}
}
}
for (int ifor = 0; ifor<NBFORMAT; ifor++) {
if ( strstr(tb_format_ixChaine[ifor], chixChaine) != NULL ) {
iformat = ifor;
break;
}
}
/*
wchar_t buf[200] = L"";
swprintf(buf, L"ixChaine_prev : %d , ixChaine : %d ; iformat_prev : %d , iformat : %d",
ixChaine_prev, ixChaine, iformat_prev, iformat);
MessageBox(NULL, buf, L"test", MB_OK);
*/
if ( iformat != iformat_prev ) {
PostMessage(hMainWnd, WM_COMMAND, IDM_APP_RESTART, NULL);
ixChaine_prev = ixChaine;
}
//+++++
return S_OK;
}
mekp
Messages : 14
Enregistré le : 20 juin 2010, 15:06
Carte Tuner : pinnacle PCTV hybrid pro pci
Êtes-vous un robot ? : Je ne suis pas un robot

Re: Bugs en pagaille suite au passage au tout HD

Message par mekp »

Pour ceux qui utilisent PouchinTVMod 0.6.2 avec XP 32 bits et avec ffdshow
et qui veulent un <Ctrl>Q automatique lors d'un changement de résolution

Je propose la modification suivante (moins de 100 lignes de code)
si on a pas peur de sa complexité ! (nota : PouchinTVMod contient plus de 94000 lignes de codes)

- ajout d'un fichier FormatsChaines.txt dans le même répertoire que PouchinTVMod.exe , il contient :
1920x1080 1 2 3 4 8 10 11 12 13 15 16 17 18 20 21 23 24 25 30
1440x1080 5 6 9 14 19 22 57
720x576 26 41 60 61 62
pour extension future
pour extension future
- seules les 5 premières lignes sont lues
- l'espace apres le dernier n° de chaine de chaque ligne est nécessaire
- les n° de chaines ci-dessus sont nNumeroChaine de PouchinTV (1 à 63) (établis pour Paris tour-eiffel)
qui apparaissent dans le menu de sélection de chaine
et dans l'onglet Options , Configuration , Chaines
il y a 35 chaines en tout
- si ce fichier est absent, PouchinTV fonctionne comme avant

- modification du fichier channels.cpp : ajout avant la déclaration du module change_chaine() :
//+++++ début0 : ajouté juste avant la déclaration du module change_chaine(...)
#define NBFORMAT 5
char tb_FormatsChaines[NBFORMAT][99] = {"", "", "", "", ""};
int nNumCh_prev = -1;
bool is_file_FormatsChaines = false;
bool test_file_FormatsChaines_done = false;
//+++++ fin0

- première modification du module change_chaine() du fichier channels.cpp
//+++++ début1 : ajouté au tout début du module change_chaine(...)
// lecture du fichier 'FormatsChaines.txt' si présent pour renseigner tb_FormatsChaines
if ( test_file_FormatsChaines_done == false ) {
FILE *fd;
wchar_t wcmdline[300];
char cmdline[300];
char lignelue[300];
char FileParam[300]; // nom du fichier FormatsChaines.txt
char *ptch;
int itmp, i_last_slash;
LPTSTR lpszCommandLine = ::GetCommandLine();
wcscpy(wcmdline, lpszCommandLine);
wcstombs(&cmdline[0], wcmdline, sizeof(wcmdline));
// élimine le premier '"' dans cmdline le cas echéant
if ( cmdline[0] == '"' ) {
memmove(&cmdline[0] , &cmdline[1], strlen(cmdline)); // élimine 1ere double quote
}
// recherche '.exe' pour éliminer ce qui est derrière '.exe' le cas echéant
ptch = strstr(cmdline, ".exe"); // forcément différent de NULL
if ( *(ptch+4) != 0 ) *(ptch+4) = 0;
// recherche le dernier anti-slash
i_last_slash = -1;
for (itmp = 0; itmp < (int)strlen(cmdline); itmp++) {
if ( cmdline[itmp] == 92 ) i_last_slash = itmp; // 92 : anti-slash
}
if ( i_last_slash == -1 ) {
// cas ou il n'y a pas de répertoire devant le nom de l'exécutable
strcpy(FileParam, "FormatsChaines.txt");
} else {
cmdline[i_last_slash+1] = 0; // élimine ce qui est après le dernier anti-slash
sprintf(FileParam, "%sFormatsChaines.txt", cmdline);
}
// lecture du fichier 'FormatsChaines.txt' si présent
fd = fopen(FileParam, "r");
if ( fd != NULL ) {
for (itmp = 0; itmp < NBFORMAT; itmp++) {
fgets(lignelue, sizeof(lignelue), fd);
if ( lignelue[strlen(lignelue)-1] == 10 ) lignelue[strlen(lignelue)-1] = 0;
strcpy(tb_FormatsChaines[itmp], lignelue);
}
fclose(fd);
is_file_FormatsChaines = true;
}
test_file_FormatsChaines_done = true;
}
//+++++ fin1

- deuxième modification du module change_chaine() du fichier channels.cpp
//+++++ début2 : ajouté en fin du module change_chaine(...) juste avant return S_OK;
if ( is_file_FormatsChaines == false ) return S_OK;
char chNumCh[5], chNumCh_prev[5];
int nNumCh;
int iformat, iformat_prev;
nNumCh = Canaux[ixChaine].nNumeroChaine;
iformat_prev = -1;
iformat = -1;
sprintf(chNumCh_prev, " %d ", nNumCh_prev);
sprintf(chNumCh, " %d ", nNumCh);
if ( nNumCh_prev != -1 ) {
for (int ifor = 0; ifor<NBFORMAT; ifor++) {
if ( strstr(tb_FormatsChaines[ifor], chNumCh_prev) != NULL ) {
iformat_prev = ifor;
break;
}
}
}
for (int ifor = 0; ifor<NBFORMAT; ifor++) {
if ( strstr(tb_FormatsChaines[ifor], chNumCh) != NULL ) {
iformat = ifor;
break;
}
}
if ( iformat != iformat_prev && nNumCh != nNumCh_prev ) {
PostMessage(hMainWnd, WM_COMMAND, IDM_APP_RESTART, NULL);
}
nNumCh_prev = nNumCh;
//+++++ fin2
mekp
Messages : 14
Enregistré le : 20 juin 2010, 15:06
Carte Tuner : pinnacle PCTV hybrid pro pci
Êtes-vous un robot ? : Je ne suis pas un robot

Re: Bugs en pagaille suite au passage au tout HD

Message par mekp »

Une modification simple pour connaitre la résolution des chaines lors de chaque changement de chaine
nota : j'ai mis les informations dans le titre de la fenêtre (par manque de place dans la barre d'état)

- ajout avant la déclaration du module change_chaine() dans le fichier channels.cpp (voir ma modification précédente)
int nNumCh_new = -1;

- complément de modification du module change_chaine() du fichier channels.cpp (voir ma modification précédente)
//+++++ début2 : ajouté en fin du module change_chaine(...) juste avant return S_OK;
nNumCh_new = Canaux[ixChaine].nNumeroChaine; // !!!!! le complément de modification
if ( is_file_FormatsChaines == false ) return S_OK;

- ajout avant la déclaration du module CVideoRenderer::GetVideoInfo(...) dans le fichier rendering.cpp
TCHAR WindowTextOrig[256] = L"";
extern int nNumCh_new;

- modification du module CVideoRenderer::GetVideoInfo(...) dans le fichier rendering.cpp
ajout juste après : sVInf.sNativeSize.cy = vih->rcSource.bottom;
//+++++ : ajouter la résolution et le n° et le nom de chaine dans le titre de la fenêtre
if ( wcscmp(L"", WindowTextOrig) == NULL ) {
GetWindowText(hMainWnd, WindowTextOrig, _countof(WindowTextOrig));
}
wchar_t WindowTextNew[200] = L"";
wchar_t str_ChanName[200];
SendMessage(hMainStatus, SB_GETTEXT, 0, (LPARAM)&str_ChanName[0]); // 0 pour sbf_ChanName
swprintf(WindowTextNew, L"%s -> %dx%d : %d %s",
WindowTextOrig, sVInf.sNativeSize.cx, sVInf.sNativeSize.cy,
nNumCh_new, str_ChanName);
SetWindowText(hMainWnd, WindowTextNew);
//+++++
jeanaimarre
Messages : 6
Enregistré le : 07 avr. 2016, 00:47
Carte Tuner : Avermedia Volar Green HD
Êtes-vous un robot ? : Je ne suis pas un robot

Re: Bugs en pagaille suite au passage au tout HD

Message par jeanaimarre »

Quels sont les outils de développement que vous utilisez pour modifier et recompiler ?
mekp
Messages : 14
Enregistré le : 20 juin 2010, 15:06
Carte Tuner : pinnacle PCTV hybrid pro pci
Êtes-vous un robot ? : Je ne suis pas un robot

Re: Bugs en pagaille suite au passage au tout HD

Message par mekp »

Une petite correction pour corriger un BUG potentiel dans la modification que j'ai proposé le 11 Avr 2016 à 15:43

remplacer :

// recherche '.exe' pour éliminer ce qui est derrière '.exe' le cas echéant
ptch = strstr(cmdline, ".exe"); // forcément différent de NULL

par :

// recherche '.exe' pour éliminer ce qui est derrière '.exe' le cas echéant
strlwr(cmdline); // CAR peut être en majuscule , par exemple : POUCHI~1.EXE
ptch = strstr(cmdline, ".exe"); // forcément différent de NULL

par ailleurs, pour compiler sous 'XP 32 bits' et 'W7 32 bits' j'utilise :
- VisualStudio 2005
- Microsoft SDK 6.1
- Microsoft DXSDK Feb2007
Gingko
Administrateur du site et développeur
Messages : 2058
Enregistré le : 05 août 2007, 12:57
Carte Tuner : August DVB-T210 USB + divers autres
Êtes-vous un robot ? : Je ne suis pas un robot
Localisation : Pantin (IDF, 93)
Contact :

Re: Modifications suite au passage au tout HD

Message par Gingko »

Bonjour.

Pour information, je vous informe que j'ai déplacé un certain nombre de messages dans la présente section des « Contributions » du forum.

Les messages ci-dessus se trouvaient précédemment dans la section Fonctionnement.

Gingko
Gingko
․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․
Tuners utilisés, sur 3 ordis : • USB : August DVB-T210, AverMedia HDTV DVB-T Volar (2×) • PCI : Hauppauge Nova-DT Dual DVB-T • Express Card : AverMedia Digi Express 54
mekp
Messages : 14
Enregistré le : 20 juin 2010, 15:06
Carte Tuner : pinnacle PCTV hybrid pro pci
Êtes-vous un robot ? : Je ne suis pas un robot

Re: Modifications suite au passage au tout HD

Message par mekp »

ZUT encore un BUG dans la modification que j'ai proposé le 11 Avr 2016 à 15:43

pour éviter le plantage lors de la recherche de chaines
remplacer :

//+++++ début2 : ajouté en fin du module change_chaine(...) juste avant return S_OK;
nNumCh_new = Canaux[ixChaine].nNumeroChaine;

par :

//+++++ début2 : ajouté en fin du module change_chaine(...) juste avant return S_OK;
if ( ixChaine == -1 ) return S_OK; // ajouté SINON plantage de la recherche de chaines
nNumCh_new = Canaux[ixChaine].nNumeroChaine;
Répondre