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 <io.h>
#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.