编译命令 g++ -g -o parseIndex parseIndex.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <assert.h>
typedef unsigned char BYTE;
#pragma pack(1)
typedef struct _IndexHead
{
char Indentify[32];
BYTE MajorVersion;
BYTE MinorVersion;
char Generation[24];
BYTE Count;
char Creator[32];
}IndexHead;
typedef struct _Tag
{
unsigned int flag;
unsigned short vlen;
}Tag;
typedef struct
{
unsigned int flag;
const char* name;
}_TagInfo;
#pragma pack()
_TagInfo TagInfo[] = {
{0x00 ,"Skip one byte"},
{0x11000001 ,"Index Info"},
{0x110001FF ,"Content Info"},
{0x15000105 ,"Source URI"},
{0x13000107 ,"Index Type"},
{0x13000106 ,"File Type"},
{0x1300010E ,"Video Frame Rate Tickets"},
{0x1300010F ,"Video Frame Rate Time Scale"},
{0x1300010C ,"Video Horizontal Size"},
{0x1300010D ,"Video Vertical Size"},
{0x13000116 ,"Elementary Stream Count"},
{0x13000109 ,"Bitrate"},
{0x13000117 ,"Sub File Count"},
{0x13000108 ,"Schedule Fragment Count"},
{0x1500010A ,"Schedule Start Time"},
{0x1300010B ,"Schedule Fragment Duration"},
{0x13000118 ,"Time Shift Time"},
{0x1400011B ,"Open for Write"},
{0x1500011C ,"ProviderID"},
{0x1500011D ,"ContentID"},
{0x1500011E ,"PhysicalChannelID"},
{0x110004FF ,"Control Info"},
{0x16000401 ,"Program Association Table"},
{0x16000403 ,"Program Map Table"},
{0x15000410 ,"SDP"},
{0x110005FF ,"Sub File Info"},
{0x13000501 ,"Sub File ID"},
{0x15000502 ,"Sub File URI"},
{0x13000503 ,"Sub File Type"},
{0x13000504 ,"Sub File Data Start"},
{0x13000505 ,"Sub File Data end"},
{0x1300050A ,"Sub File Duration"},
{0x1200050C ,"Sub File Scale"},
{0x13000520 ,"Sub File IDR Frames Count"},
{0x1300050E ,"Sub File I Frames Count"},
{0x1300050F ,"Sub File P Frames Count"},
{0x13000510 ,"Sub File B Frames Count"},
{0x13000521 ,"Sub File Index Data Start"},
{0x13000522 ,"Sub File Index Data End"},
{0x110003FF ,"Elementary Stream Info"},
{0x13000301 ,"Elementary Stream Type"},
{0x13000303 ,"Elementary Stream PID"},
{0x16000305 ,"elementary stream sequence"},
{0x16000306 ,"elementary stream extended sequence"},
{0x16000307 ,"elementary stream sequence parameter set"},
{0x13000701 ,"Index Rate"},
{0x13000702 ,"Worst Case Offset"},
{0x11000FFF ,"Schedule Fragment Info"},
{0x13000F01 ,"Fragment ID"},
{0x15000F02 ,"Fragment Content ID"},
{0x13000F03 ,"Fragment Start Time"},
{0x13000F04 ,"Fragment Duration"}
};
int main (int argc, char** argv)
{
if (argc < 2)
{
printf ("%s indexFileName\n", argv[0]);
return -1;
}
char* fileName = argv[1];
struct stat stbuf;
stat (fileName, &stbuf);
char* fdata = (char*) malloc (stbuf.st_size);
FILE* fp = fopen (fileName, "rb");
if (fp == NULL)
{
printf ("file %s is not exists\n", fileName);
return -1;
}
fread (fdata, sizeof(char), stbuf.st_size, fp);
fclose (fp);
int offset = 0;
if (fdata[0]=='0' && fdata[1]=='5' && fdata[2]=='9' && fdata[3]=='E' && fdata[4]=='\r' && fdata[5]=='\n')
offset += 6;
IndexHead fHead;
memcpy (&fHead, fdata+offset, sizeof(fHead));
assert (sizeof(fHead) == 91);
printf ("----------------------HEAD----------------------\n");
printf ("Indentify = %s\n", fHead.Indentify);
printf ("MajorVersion = %d\n", fHead.MajorVersion);
printf ("MinorVersion = %d\n", fHead.MinorVersion);
printf ("Generation = %s\n", fHead.Generation);
printf ("Count = %d\n", fHead.Count);
printf ("Creator = %s\n", fHead.Creator);
printf ("------------------------------------------------\n\n");
offset += 91;
while (offset < stbuf.st_size)
{
Tag tag;
if ((BYTE)fdata[offset] == 0x00)
{
offset ++;
continue;
}
else
{
memcpy (&tag, fdata+offset, sizeof(Tag));
offset += sizeof(Tag);
if (tag.flag == 0x11000001)
{
printf("---------------------Index Info---------------------\n");//TLV
continue;
}
if (tag.flag == 0x110001FF)
{
printf("@@:Content Info\n");//TLV
continue;
}
if (tag.flag == 0x15000105)
{
char* data = (char*)calloc(1, tag.vlen+1);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf ("------Source URI = %s\n", data);
continue;
}
if (tag.flag == 0x13000107)
{
BYTE t = 0;
assert (tag.vlen == 1);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf ("------Index Type = %d\n", t);
continue;
}
if (tag.flag == 0x13000106)
{
BYTE t = 0;
assert (tag.vlen == 1);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------File Type = %d\n", t);
continue;
}
if (tag.flag == 0x1300010E)
{
unsigned int i;
assert (tag.vlen <= 4);
memcpy (&i, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Video Frame Rate Tickets = %d\n", i);
continue;
}
if (tag.flag == 0x1300010F)
{
unsigned int i;
assert (tag.vlen <= 4);
memcpy (&i, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Video Frame Rate Time Scale = %d\n", i);
continue;
}
if (tag.flag == 0x1300010C)
{
unsigned short s;
assert (tag.vlen <= 2);
memcpy (&s, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Video Horizontal Size = %d\n", s);
continue;
}
if (tag.flag == 0x1300010D)
{
unsigned short s;
assert (tag.vlen <= 2);
memcpy (&s, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Video Vertical Size = %d\n", s);
continue;
}
if (tag.flag == 0x13000116)
{
BYTE s;
assert (tag.vlen == 1);
memcpy (&s, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Elementary Stream Count = %d\n", s);
continue;
}
if (tag.flag == 0x13000109)
{
double b = 0;
assert (tag.vlen <= sizeof(b));
memcpy (&b, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Bitrate = %ld\n", b);
continue;
}
if (tag.flag == 0x13000117)
{
BYTE t = 0;
assert (tag.vlen == 1);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File Count = %d\n", t);
continue;
}
if (tag.flag == 0x13000108)
{
unsigned short t = 0;
assert (tag.vlen == 2);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Schedule Fragment Count = %d\n", t);
continue;
}
if (tag.flag == 0x1500010A)
{
char* data = (char*)calloc (1, tag.vlen+1);
assert (tag.vlen <= 24);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Schedule Start Time = %s\n", data);
continue;
}
if (tag.flag == 0x1300010B)
{
double b = 0;
assert (tag.vlen <= 8);
memcpy (&b, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Schedule Fragment Duration = %ld\n", b);
continue;
}
if (tag.flag == 0x13000118)
{
unsigned int t;
assert (tag.vlen <= 4);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Time Shift Time = %d\n", t);
continue;
}
if (tag.flag == 0x1400011B)
{
BYTE t;
assert (tag.vlen == 1);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Open for Write = %s\n", t==0?"false":"true");
continue;
}
if (tag.flag == 0x1500011C)
{
char* data = (char*)calloc(1, tag.vlen+1);
assert (tag.vlen <= 32);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------ProviderID = %s\n", data);
continue;
}
if (tag.flag == 0x1500011D)
{
char* data = (char*)calloc(1, tag.vlen+1);
assert (tag.vlen <= 512);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------ContentID = %s\n", data);
continue;
}
if (tag.flag == 0x1500011E)
{
char* data = (char*)calloc(1, tag.vlen+1);
assert (tag.vlen <= 32);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------PhysicalChannelID = %s\n", data);
continue;
}
if (tag.flag == 0x110004FF)
{
printf("@@:Control Info\n");//TLV
continue;
}
if (tag.flag == 0x16000401)
{
char* data = (char*)calloc (1, tag.vlen+1);
assert (tag.vlen <= 188);//binary data
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Program Association Table = binary data, len = %d\n", tag.vlen);
continue;
}
if (tag.flag == 0x16000403)
{
char* data = (char*)calloc (1, tag.vlen+1);
assert (tag.vlen <= 188);//binary data
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Program Map Table = binary data, len = %d\n", tag.vlen);
continue;
}
if (tag.flag == 0x15000410)
{
char* data = (char*)calloc(1, tag.vlen+1);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------SDP = %s\n", data);
continue;
}
if (tag.flag == 0x110005FF)
{
printf("@@:Sub File Info\n");//TLV
continue;
}
if (tag.flag == 0x13000501)
{
BYTE t = 0;
assert (tag.vlen == 1);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File ID = %d\n", t);
continue;
}
if (tag.flag == 0x15000502)
{
char* data = (char*)calloc(1, tag.vlen+1);
assert (tag.vlen <= 512);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File URI = %s\n", data);
continue;
}
if (tag.flag == 0x13000503)
{
BYTE t = 0;
assert (tag.vlen == 1);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
switch (t)
{
case 0:
printf("------Sub File Type = %d, TS\n", t);
break;
case 2:
printf("------Sub File Type = %d, FLV\n", t);
break;
case 3:
printf("------Sub File Type = %d, 3GP\n", t);
break;
case 4:
printf("------Sub File Type = %d, MP4\n", t);
break;
default:
printf("------Sub File Type = %d, file type is unknown\n", t);
break;
}
continue;
}
if (tag.flag == 0x13000504)
{
double b = 0;
assert (tag.vlen <= 5);
memcpy (&b, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File Data Start = %ld\n", b);
continue;
}
if (tag.flag == 0x13000505)
{
double b = 0;
assert (tag.vlen <= 5);
memcpy (&b, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File Data end = %ld\n", b);
continue;
}
if (tag.flag == 0x1300050A)
{
double b = 0;
assert (tag.vlen <= sizeof(b));
memcpy (&b, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File Duration = %ld\n", b);
continue;
}
if (tag.flag == 0x1200050C)
{
BYTE t = 0;
assert (tag.vlen == 1);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File Scale = %d\n", t);
continue;
}
if (tag.flag == 0x13000520)
{
unsigned int t = 0;
assert (tag.vlen <= 4);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File IDR Frames Count = %d\n", t);
continue;
}
if (tag.flag == 0x1300050E)
{
unsigned int t = 0;
assert (tag.vlen <= 4);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File I Frames Count = %d\n", t);
continue;
}
if (tag.flag == 0x1300050F)
{
unsigned int t = 0;
assert (tag.vlen <= 4);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File P Frames Count = %d\n", t);
continue;
}
if (tag.flag == 0x13000510)
{
unsigned int t = 0;
assert (tag.vlen <= 4);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File B Frames Count = %d\n", t);
continue;
}
if (tag.flag == 0x13000521)
{
double b = 0;
assert (tag.vlen <= 5);
memcpy (&b, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File Index Data Start = %ld\n", b);
continue;
}
if (tag.flag == 0x13000522)
{
double b = 0;
assert (tag.vlen <= 5);
memcpy (&b, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Sub File Index Data End = %ld\n", b);
continue;
}
if (tag.flag == 0x110003FF)
{
printf("@@:Elementary Stream Info\n");//TLV
continue;
}
if (tag.flag == 0x13000301)
{
BYTE t = 0;
assert (tag.vlen == 1);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Elementary Stream Type = %d, %s\n", t, t==1?"MP3G2":"H.264");
continue;
}
if (tag.flag == 0x13000303)
{
unsigned short t;
assert (tag.vlen == 2);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Elementary Stream PID = %d\n", t);
continue;
}
if (tag.flag == 0x16000305)
{
char* data = (char*)malloc (tag.vlen+1);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------elementary stream sequence = binary data, len = %d\n", tag.vlen);//binary
continue;
}
if (tag.flag == 0x16000306)
{
char* data = (char*)malloc (tag.vlen+1);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------elementary stream extended sequence = binary data, len = %d\n", tag.vlen);//binary
continue;
}
if (tag.flag == 0x16000307)
{
char* data = (char*)malloc (tag.vlen+1);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------elementary stream sequence parameter set = binary data, len=%d\n", tag.vlen);
continue;
}
if (tag.flag == 0x13000701)
{
char* data = (char*)malloc (tag.vlen+1);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Index Rate\n");//文档里没有该字段的描述
continue;
}
if (tag.flag == 0x13000702)
{
char* data = (char*)malloc (tag.vlen+1);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Worst Case Offset\n");//文档里没有该字段的描述
continue;
}
if (tag.flag == 0x11000FFF)
{
printf("@@:Schedule Fragment Info\n");//TLV
continue;
}
if (tag.flag == 0x13000F01)
{
unsigned short t = 0;
assert (tag.vlen == 2);
memcpy (&t, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Fragment ID = %d\n", t);
continue;
}
if (tag.flag == 0x15000F02)
{
char* data = (char*)calloc (1, tag.vlen+1);
memcpy (data, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Fragment Content ID = %s\n", data);
continue;
}
if (tag.flag == 0x13000F03)
{
double b = 0;
assert (tag.vlen == sizeof(b));
memcpy (&b, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Fragment Start Time = %ld\n", b);
continue;
}
if (tag.flag == 0x13000F04)
{
double b = 0;
assert (tag.vlen == sizeof(b));
memcpy (&b, fdata+offset, tag.vlen);
offset += tag.vlen;
printf("------Fragment Duration = %ld\n", b);
continue;
}
printf ("\nunknown tag = 0x%x, vlen = %d, offset = %d\n", tag.flag, tag.vlen, offset);
char* datas = (char*)calloc (1, tag.vlen+1);
memcpy (datas, fdata+offset, tag.vlen);
offset += tag.vlen;
continue;
}
}
printf ("\n-------------------------------------------------------\n");
printf ("\nParse file finish\n");
return 0;
}