dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008
-
13 mars 2008 à 15:07
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 2008
-
14 mars 2008 à 16:47
Bonjour à tous,
Je récupère les octets de mon fichier vidéo dans un buffer "Buffer[]" et je voudrais sélectionner les octets 0x47 et je n'y arrive pas. Il me dit constamment "i : variable not found" alors que je l'ai déclaré, et aussi "assertion failure ...ftell.c".
Enfin bon, mon but est d'écrire les octets 0x47 (contenus dans Buffer) dans synchro_bytes et je n'y arrive pas. Je suis deçu depuis quelques heures et j'ai toujours un problème même en utlisant le débuggeur. Je n'en peux plus, je vous demande de l'aide s'il vous plait..
void find_TransportStream_synchro_bytes(char *Buffer, int ip_file_length);
void press_key(char press_key_text[]); // Liste provisoire des prototypes de nos fonctions
void exit_prog(char error_msg[]); // --> à mettre dans un fichier header
unsigned int menu(void);
void option_menu1();
void option_menu2();
void TransportStream_header_decode();
//Déclarations de nos variables
FILE *ip_file=NULL;
char ip_filepath[10000];
int ip_file_length=0,i; // Longueur du fichier
int size;
int synchro_bytes[4] = {0,0,0,0}; // Stockage des premiers octets de synchro
// char choix_menu;
int end_of_file = 0;
if (argc == 1) //S'il n'y a pas d'argument, on demande à l'utilisateur d'entrer la chaine
{
printf("Entrer le chemin de la video:\n");
//scanf("%s",ip_filepath); //Attention n'accepte pas les espaces
gets(ip_filepath); //Accepte tout jusqu'à l'appuie sur entrée
}
else //entrée d'une chaine en argument du main (en passant par l'invite de commande)
{
strcpy(ip_filepath,&argv[1][0]); //ip_filepath pointe sur le premier argument, premier caractère
}
ip_file = fopen(ip_filepath, "rb"); // Ouverture du fichier MPEG en lecture seule ("rb"=read binary)
if(ip_file==NULL)
{
printf("Erreur : Impossible d'ouvrir le fichier spécifié \n"); //test d'ouverture du fichier
exit(0);
}
fseek (ip_file , 0, SEEK_END); //On se place a la fin du fichier
ip_file_length=ftell (ip_file ); //Retourne le nombre d'octet depuis le debut du fichier jusqu'a la position du curseur(ici la fin)
rewind (ip_file); //on se replace au debut du fichier
printf("Ouverture du fichier MPEGx %s, contenant %ibytes.\n\n", ip_filepath, ip_file_length);
printf("Voici la liste des 200 premiers octets de ce flux MPEGx : \n");
char *Buffer=new char[ip_file_length];
size=(int)fread(Buffer,1,ip_file_length,ip_file); //tout le fichier est recopié dans le Buffer
for(i=0;i<200;i++) //juste les n premiers
{
if((unsigned char)Buffer[i]<0x10)
{printf("0x0%x \n" , (unsigned char)Buffer[i]);}
else
{printf("0x%x \n" , (unsigned char)Buffer[i]);} //affichage des octets en héxa
}
//system("pause");
printf("%x \n" , (unsigned char)Buffer[101]);
//system("pause");
// Trouve les octets de synchronisation 0x47:
find_TransportStream_synchro_bytes(Buffer, ip_file_length);
system("pause");
int j=0;
for(j=0;j<10;j++)
{
printf("Voici les 10 premiers octets de synchronisation : 0x%x \n", (unsigned char)synchro_bytes[j]);
}
system("pause");
// Retourne se placer au premier octet de synchronisation:
//fseek(ip_file, synchro_bytes[1], 0);
// Menu utilisateur:
//choix_menu = menu();
//switch(choix_menu)
//{
//case'1':
//option_menu1();
//break;
//case'2':
//option_menu2();
//break;
//case'3':
//exit_prog("");
//break;
//default:
//puts("\nERREUR : Ceci n'est pas une entrée correcte");
//}
void find_TransportStream_synchro_bytes(char *Buffer, int ip_file_length)
{
FILE *ip_file=NULL;
int synchro_bytes[10];
int nbre_synchro_data=0;
int position_file=0;
int i=0;
for(i=0;i<200;i++)
{
if((unsigned char)Buffer[i]==4)
{
position_file=ftell(ip_file);
synchro_bytes[position_file]=*Buffer;
//printf("%x",*synchro_bytes);
//printf("%d",position_file);
//printf("Voici l'octet de synchronisation numéro %d, et son contenu pour vérifier : %x",position_file,*Buffer);
fseek(ip_file,187,1); // Aller chercher le nouvel octet de synchronisation, 187 octets plus loin...
i++;
}
else;
}
//if(nbre_synchro_data<100)
//{
//exit_prog("Erreur : Fin du fichier atteinte avant d'avoir trouve les 100 octets de synchro");
void TransportStream_header_decode()
{
FILE *ip_file=NULL;
unsigned int current_header_add = 0; // Ajout d'une en-tête étant décodé/affiché
int index = 0; // index for found PID table
unsigned int search_PID = 0; // PID value to search for, from command line
long int payload_start = 0; // add of payload start when found
int quite_mode = 0; // display progress when extracting? yes/no
int end_of_file = 0; // check for end of file
unsigned char TS_raw_header[4]; // 4 byte space to read data from file
int count= 0;
printf("\nTaille de l'en-tête du TS: %dbytes", sizeof(TS_raw_header));
current_header_add = ftell(ip_file);
fread(&TS_raw_header, sizeof(TS_raw_header), 1, ip_file); // Lecture de l'en-tête
for (count=0; count <=sizeof(TS_raw_header); count++)
printf("\nByte %d: \t \t x%x",count, TS_raw_header[count]);
// Utilisation de masques et décalages afin de récupérer les données que nous voulons dans l'en-tête:
Les problèmes sont donc au sein de la fonction "void find_TransportStream_synchro_bytes(char *Buffer, int ip_file_length)". j'ai essayé de jouer avec les system("pause") et les breakpoints sans succès...
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008 13 mars 2008 à 15:10
je voulais également les afficher ses octets 0x47 et connaitre leur place dans le buffer mais ...
--> printf me dit "i not found"
-->position_file=ftell(ip_file); ne marche pas
Petite précision : une fois que le premier octet de synchro a été trouvé, le prochain doit nécessairement se trouver 187 octets plus loin, d'où le : fseek(ip_file,187,1);
Sinon je sais que mon programme n'est pas fini mais il se compile sans erreur..
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008 13 mars 2008 à 15:12
Toute dernière précision, je suis novice en langage C (oui je sais ça se voit mais jprécise), je sais que les var globales c'est déconseillé et que les prototypes se mettent dans un point h mais je le ferai plus tard. Sinon j'ai pas mal chercher avant de faire appel à vous mais sans succès, à mon plus grand désarroi..
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 13 mars 2008 à 15:28
Salut
Rapidement, tu as stokke TOUT ton fichier dans ton buffer. Tu n'as donc pas besoin de relir le fichier par la suite et encore moins de faire des ftell alors que tu viens d'initialiser ton fichier a NULL:
FILE *ip_file=NULL;
Pourquoi ne pas faire: position_file=i ?
Ensuite tu n'as plus qu'a faire i+187 pour trouver ton prochain octect de synchro.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 13 mars 2008 à 15:37
C'est le bordel ton code. Tu pourrais le nettoyer un peu avant de poster:
void find_TransportStream_synchro_bytes(char *Buffer, int ip_file_length)
{
FILE *ip_file= NULL;
int synchro_bytes[10];
int nbre_synchro_data=0;
int position_file=0;
int i=0;
for(i=0;i<200;i++)
{
if((unsigned char)Buffer[i]==4) <= 4 ? c'est quoi 4, je croyais que tu voulais 0x47 ?
{
position_file =ftell(ip_file); <= ip_file indéfinit = NULL synchro_bytes[position_file]=*Buffer; <= synchro_bytes est une variable locale, pourquoi tu écris dedans ? vu que tout ce que tu écris dedans est détruit dès que tu quittes la fonction. De plus, synchro_bytes a une taille de 10 or j'imagine que position_file sera bien supérieure à 10 donc c'est la cata ici.
//printf("%x",*synchro_bytes);
//printf("%d",position_file);
//printf("Voici l'octet de synchronisation numéro %d, et son contenu pour vérifier : %x",position_file,*Buffer);
fseek(ip_file,187,1); // Aller chercher le nouvel octet de synchronisation, 187 octets plus loin... < = pareil, ip_file vaut NULL donc... i++; <= Pourquoi tu incrémentes puisque le for le fait ? }
else; <= Un else qui sert a quoi ? }
}
Donc bref, faut que tu revois le passage d'argument, la notion de portée et de visibilité de variable.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 13 mars 2008 à 15:56
synchro_bytes[position_file]=*Buffer; <=
synchro_bytes est une variable locale, pourquoi tu écris dedans ? vu
que tout ce que tu écris dedans est détruit dès que tu quittes la
fonction. De plus, synchro_bytes a une taille de 10 or j'imagine que
position_file sera bien supérieure à 10 donc c'est la cata ici.
Y'a pas que ça. Buffer n'est jamais incrémenté. On ne fait que copier le premier caractère de Buffer dans tout le tableau synchro_bytes.
[auteur/DAYVID75014/1332434.aspx dayvid75014] >> En gros, ce que dis luhtor, c'est revoie tes bases en langage C. Plusieurs sections de ton code son a refaire complètement. Le fais que tu essais de manipuler un fichier sans même l'avoir ouvert montre que tu ne possède pas encore les connaissances pour faire tel code. Commence par la base, ensuite, monte progressivement. Je le répète souvent mais, on ne fonce jamais tête baissé avec ce langage. Impossible de sauter des étapes. Il faut impérativement passer par la base.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 13 mars 2008 à 16:03
Ah, je l'ai pas dis "gentiment" ? Car je peux le dire brutalement aussi.
Les types qui passent sur ce forum (moi en particulier) n'ont pas besoin de t'aider. Perso je suis pas obligé, donc on apprécie quand la personne qui demande de l'aide fait en sorte de faciliter la tache au éventuels lecteurs du post. Tout ca pour dire: sur le code que tu as posté, la moitité ne nous intéresse pas.
Par ailleurs, prendre 15 min pour te faire doucement comprendre que ya plein d'erreur dans le code, ca sert à rien. Autant de le dire direct. Mais bon, j'ai pas l'impression d'avoir été "méchant". Tu demandes pourquoi ton code marche pas, moi je te sors toutes les erreurs que je peux voir, c'est aussi simple que ca.
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008 14 mars 2008 à 10:55
jlavais mis en variable globae synchro_byte mais en faisant des modif j'avais zappé de le remettre ... jsuis pas nul à ce point là... enfin bon j'ai encore beaucoup de problème, notemment avec ce test :
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008 14 mars 2008 à 10:58
TOUT mon fichier est stocké dans le Buffer, j'ai vérifié à l'aide de printf, d'un éditeur hexadécimal et d'un system("pause")...
Je voudrais mettre de coté les octets égaux à 0x47... les stocker dans synchro_byte et aussi repérer leur position dans le fichier(mais ça je n'ai aucune idée, il faut que me penche sur la question, toute suggestion est dc la bienvenue ;-))