中国电信CDN规范解析INDEX文件的C代码实现


编译命令  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;

}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

langeldep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值