Sélection d'octet

Résolu
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008 - 13 mars 2008 à 15:07
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 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..

Voici mon code :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>        
#include <string.h>         // Bibliothèques utiles
#include
#include <fcntl.h>
#include <windows.h>




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();




struct TransportStream_header                 
{
unsigned char synchronisation_byte;
unsigned char transport_error_indicator;
unsigned char payload_start_indicator;
unsigned char transport_priority;               // Structure  de l'en-tête TS du flux MPEG
unsigned int PID;
unsigned char transport_scrambling_control;
unsigned char adaptation_field_control;
unsigned char continuity_counter;
} TransportStream_header;


 


//=======================Fonction-Principale=======================================================================================================================


int main(int argc, char *argv[])   
{


    //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
   
    if(size != ip_file_length)
    {
        printf("Erreur lecture\n" );
        exit(0);
    }
    //fclose(ip_file);


   
    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");
   //}
 
 //system("pause");
    delete []Buffer;
 exit_prog("");
      return 0;
}


//========================================================================================================================================================================


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 press_key(char press_key_text[])

 printf("%s", press_key_text);           
 while ( !_kbhit() )
 {;}
 _getch();
}


//=====================================================================================================================================================================


void exit_prog(char error_msg[])
{
 printf("\n%s\n", error_msg);          
 _fcloseall( );
 press_key("Press a key to exit...");
 exit(0);





//======================================================================================================================================================================


unsigned int menu(void)

 char choix_menu;
 
 puts("Menu:");
    puts("1 - Decodage de l'en-tête");
 puts("2 - Extraire le PES");        // Menu à développer avec de nouvelles options
 puts("3 - Exit");


 puts("\nEntrer_choix:");
 scanf("%s", &choix_menu);


 return  choix_menu;
}


//=====================================================================================================================================================================


void option_menu1()
{
int end_of_file = 0;


while(end_of_file == 0)
{
TransportStream_header_decode();


 




}
puts("Erreur : Fin du fichier atteinte");
}


//=======================================================================================================================================================================




void option_menu2()
{


 


}




//========================================================================================================================================================================


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:


 TransportStream_header.synchronisation_byte = TS_raw_header[0];
 TransportStream_header.transport_error_indicator = (TS_raw_header[1] & 0x80) >> 7;
 TransportStream_header.payload_start_indicator = (TS_raw_header[1] & 0x40) >> 6;
 TransportStream_header.transport_priority = (TS_raw_header[1] & 0x20) >> 5;
 TransportStream_header.PID = ((TS_raw_header[1] & 31) << 8) | TS_raw_header[2];
 TransportStream_header.transport_scrambling_control = (TS_raw_header[3] & 0xC0);
 TransportStream_header.adaptation_field_control = (TS_raw_header[3] & 0x30) >> 4;
 TransportStream_header.continuity_counter = (TS_raw_header[3] & 0xF);  


}


//=========================================================================================================================================================================

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...

Quelqu'un a-t-il une idée ???

Bonne journée à tous.

14 réponses

dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
14 mars 2008 à 11:36
char valeur=71;
 for(i=0;i<1000;i++)
 {
 if((unsigned char)Buffer[i]==valeur)
 {
  synchro_bytes[i]=(unsigned char)Buffer[i];
  printf("0x%x\n",synchro_bytes[i]);
 }
 }
3
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 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..
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 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..
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
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.

A+
Mon site internet : http://pistol.petesampras.free.fr
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
13 mars 2008 à 15:29
position_file=i me donne "i not found"...
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
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.
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
13 mars 2008 à 15:47
Et le debuggeur il marche comment maintenant?

A+
Mon site internet : http://pistol.petesampras.free.fr
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
13 mars 2008 à 15:48
Et sinon tu peux le dire gentiment Luthor ?
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
13 mars 2008 à 15:49
je commence à m'améliorer Vincent ! ;-)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
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.

C++ (@++)<!--
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
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.
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 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 :

 for(i=0;i<1000;i++)
 {
 if((unsigned char)Buffer[i]==47)
 {
  synchro_bytes[i]=(unsigned char)Buffer[i];
  printf("0x%x",synchro_bytes[i]);
 }
 }

A l'aide du debuggeur je me suis rendu compte que i va de 0 à 1000 sans jamais rentrer  dans mon if, et pourtant je sais en faisant ...  

 printf("0x%x \n",Buffer[101]);
 printf("0x%x \n",Buffer[289]);
 printf("0x%x \n",Buffer[477]);
 printf("0x%x \n",Buffer[665]);
 printf("0x%x \n",Buffer[853]);

...que Buffer a ces instants vaut 47 précisement. 

Quelqu'un a une idée?

Bonne journée à tous ! 
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 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 ;-))
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
14 mars 2008 à 16:47
Ou:

for(i=0;i<1000;i++)
 {
 if((unsigned char)Buffer[i]==0x47)
 {
  synchro_bytes[i]=(unsigned char)Buffer[i];
  printf("0x%x\n",synchro_bytes[i]);
 }
 }
0
Rejoignez-nous