#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // Bibliothèques utiles
#include <string.h>
#include <io.h>
#include <fcntl.h>
void find_TransportStream_synchro_bytes(void);
//void display_usage(void);
void press_key(char press_key_text[]); // Liste provisoire des prototypes de nos fonctions
void exit_prog(char error_msg[]); // --> à mettre dans le fichier header
unsignedint menu(void);
long get_ip_file_length (char *ip_filepath);
void file_seek(int offset);
void option_menu1();
void option_menu2();
struct TransportStream_header
{
unsignedchar synchro_byte;
unsignedchar transport_error_ind;
unsignedchar payload_start_indicator;
unsignedchar transport_priority; // Structure de l'en-tête TS d'un flux MPEG
unsignedint PID;
unsignedchar transport_scrambling_control;
unsignedchar adaptation_field_control;
unsignedchar continuity_counter;
} TransportStream_header;
FILE *ip_file = NULL; // déclaration et initialisation d'un pointeur de type FILE
char *ip_filepath; // Pointeur sur les arguments de la ligne de commande
int synchro_bytes[10]; // Stockage des octets de synchro
unsignedchar TransportStream_raw_header[4]; //4 octets réservés pour la lecture des données du flux
long ip_file_length; // Longueur du fichier
char choix_menu;
//=============================================Fonction Principale=================================
int main (int argc, int *argv[])
{
char path[200];
FILE *ip_file = NULL;
printf("Tapez ici un chemin valide d'une video MPEG-2 :\n");
scanf ("%s", path);
ip_file = fopen(path, "rb");
//if (argc==1) // Si rien n'est donné en paramètre, on quitte l'appli
//{
// exit_prog("");
//}
//while (argc>1)
//{
//ip_file = fopen("C:\\Documents and Settings\\dgombert\\Bureau\\videotest.mpg", "rb");
//}
//Récupération de la longueur en octets
ip_file_length = get_ip_file_length(ip_filepath);
printf("Ouverture du fichier MPEG %s contenant %d octets. \n", ip_filepath,ip_file_length
);
//Lecture seule, en mode binaire
ip_file = fopen(ip_filepath, "rb");
// Trouve les octets de synchro
find_TransportStream_synchro_bytes();
// Retourne se placer au premier octet de synchro
fseek(ip_file, synchro_bytes[1], 0);
// Affichage du Menu
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");
}
exit_prog("");
return0;
}
//===================================================================================================
void find_TransportStream_synchro_bytes(void)
{
int synchro_data = 0;
long nbre_synchro_data = 0;
int position_file = 0;
while(!feof(ip_file) && nbre_synchro_data<100) // utilisation de feof pour trouver les éventuelles erreurs de fread
{
position_file = ftell(ip_file); // Repère la position où nous sommes dans le fichier
synchro_data = 0; // Pour pouvoir récomparer avec la valeur 0x47...
fread(&synchro_data,1,1,ip_file); // Lit octet par octet ip_file et enregistre l'octet dans synchro_data
switch(synchro_data)
{
case 0x47 :
synchro_bytes[nbre_synchro_data] = position_file; // Stockage du nouvel octet de synchro trouvé
nbre_synchro_data++; // On incrémente jusqu'à 100...
file_seek(187); // Aller chercher, 187 octets plus loin, le nouvel octet de synchronisation
break;
default :
nbre_synchro_data = 0;
}
}
if(nbre_synchro_data<100)
{
exit_prog("Erreur : Fin du fichier atteinte avant d'avoir trouvé les 100 octets de synchronisation");
}
}
//=================================================================================================
//void display_usage(void)
//{
// puts("Usage:\t TSDECODE -i<input filepath> of TS file to decode");
// puts("\t \t -p<search PID>");
// puts("\t \t -q do not show progress when extracting");
//
// puts("\nExample: TSDECODE -ic:\\test.mpg -p600");
// puts("\t will open file c:\\videotest.mpg and process PID x packets\n");
//}
//=================================================================================================
void press_key(char press_key_text[])
{
while( !_kbhit())
{;}
_getch();
}
//================================================================================================
void exit_prog(char error_msg[])
{
_fcloseall();
press_key("Press a key to exit...");
exit(0);
}
//===============================================================================================
unsignedint menu(void)
{
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;
}
//=================================================================================================
long get_ip_file_length (char *ip_filepath)
{
int ip_file_bis = 0;
ip_file_bis = _open(ip_filepath,_O_RDONLY);
if(ip_file_bis == -1)
{
exit_prog("Erreur : Impossible d'ouvrir le fichier specifie");
}
ip_file_length = _filelength(ip_file_bis);
_close(ip_file_bis);
return ip_file_length;
}
//================================================================================================
void file_seek(int offset)
{
if(ftell(ip_file) + offset > ip_file_length)
{
press_key("Fin du fichier");
}
fseek(ip_file, offset, 1);
}
//===============================================================================================
void option_menu1()
{
TS_decode();
}
//==============================================================================================
void option_menu2()
{
}