TSCreate.rar TURE.cpp---创建TS流的一个主要文件的内容

来源:百度文库 编辑:神马文学网 时间:2024/04/28 23:45:33
#include "stdafx.h"
#include"TURE.h"
#include"crc.h"
#include"stdio.h"
#if 1
/*内存拷贝*/
void MEMCPY(U8*des,U8*sour,U32 len)
{
#if 1
U32 ii=0;
for(ii=0;ii='0'&&value<='9'){
return (value-'0');
}else if(value>='A'&&value<='F'){
return (value-'A'+10);
}else if(value>='a'&&value<='f'){
return (value-'a'+10);
}
return 0xff;
}
U16 Change_dec2hex(U16 value)
{//0x1234;--->0x12 ; 0x34.
U16 temp_h=0,temp_l=0,temp=0;
temp_h=(value/100);
temp_l=(value%100);
temp = (temp_h/10)*16+(temp_h%10);
temp_h = temp;
temp = (temp_l/10)*16+(temp_l%10);
temp_l = temp;
temp = (temp_h*256)+temp_l;
return temp;
}
U32 n16(U8 times)
{
U32 v=1,ii=0;
for(ii=0;ii0x12 ; 0x34.
U16 value=0;
C8  counter=0,ii=0,jj=0;
char *pp=0;
pp=pointer;
while(*pointer!=0)
{
if(!((*pointer>='a'&&*pointer<='f')||
(*pointer>='A'&&*pointer<='F')||
(*pointer>='0'&&*pointer<='9')))
{
return 1;
}
counter++;
pointer++;
}
for(ii=counter;ii>0;ii--)
{//次数
value+=Asiic2hex(pp[ii-1])*n16(jj);
jj++;
}
*out=value;
return 0;
}
static void ts_head_create( TS_HEAD *AA,U16 PID, U8 start,U8 counter)
{
AA->syn_byte = 0x47;
AA->tras_error=0;
AA->play_init=((start==1)?1:0);
AA->tras_prio=0;
AA->PID =PID;
AA->tras_scramb=0;
AA->ada_field_C=1;
AA->conti_cter = counter;
}
static void tshead2buffer( TS_HEAD *AA,U8*buffer)
{
buffer[0]=AA->syn_byte;
buffer[1]=AA->tras_error<<7|AA->play_init<<6|AA->tras_prio<<5|((AA->PID>>8)&0x1f);
buffer[2]=(AA->PID&0x00ff);
buffer[3]=AA->tras_scramb<<6|AA->ada_field_C<<4|AA->conti_cter;
}
TS_CREATE::TS_CREATE(FROM_USER *p){
public_para=p;
S_File_len = 0;
}
TS_CREATE::TS_CREATE(TS_CREATE &New){
public_para=New.public_para;
S_File_len =New.S_File_len;
}
U8 TS_CREATE::CREATE_PAT(){
#if 1
CFile source,destin;
char name[100];
U32 file_len=0,PAT_CRC=0xffffffff;
U8 pat_use[188]={0},*pointer_pat=0;
U16 pat_seclen=0;
TS_HEAD ts_instance;
PAT_STRU pat_head;
pointer_pat=pat_use;
strcpy(name,public_para->sour_path);
source.Open(name,0,0);
file_len =source.GetLength();
public_para->File_len = file_len;
if(file_len>0x400000){
return 1;
}
strcpy(name,public_para->des_path);
destin.Open(name,CFile::modeCreate|CFile::modeReadWrite,0);
ts_head_create(&ts_instance,0,1,0);
tshead2buffer(&ts_instance,pointer_pat);
pointer_pat[4]=0;//pointer filed
pointer_pat+=5;
pat_seclen = pat_head_len+2*2+4-3;//2个pro_len
pat_head.Table_id=0;
pat_head.Sec_len=(pat_seclen|0x8000)&0x8fff;
pat_head.Ts_id = public_para->Ts_id;
pat_head.version= sec_version<<1|1;
pat_head.sec_num=0;
pat_head.last_sec_num=0;
pointer_pat[0]=pat_head.Table_id;
pointer_pat[1]=pat_head.Sec_len>>8;
pointer_pat[2]=pat_head.Sec_len&0x00ff;
pointer_pat[3]=pat_head.Ts_id>>8;
pointer_pat[4]=pat_head.Ts_id&0x00ff;
pointer_pat[5]=pat_head.version;
pointer_pat[6]=pat_head.sec_num;
pointer_pat[7]=pat_head.last_sec_num;
//MEMCPY(pointer_pat,(U8*)&pat_head,sizeof(PAT_STRU));
pointer_pat+=pat_head_len;
pointer_pat[0]=public_para->program_num>>8;
pointer_pat[1]=public_para->program_num&0x00ff;
pointer_pat[2]=(public_para->PMT_PID&0x1fff)>>8;
pointer_pat[3]=public_para->PMT_PID&0x00ff;
pointer_pat+=4;
//PAT_CRC=CountCRC32(pat_use,(pat_seclen+3),PAT_CRC);
CRC_crc32Calculate(pat_use,(pat_seclen+3),&PAT_CRC);
pointer_pat[0]=PAT_CRC>>24;
pointer_pat[1]=PAT_CRC>>16;
pointer_pat[2]=PAT_CRC>>8;
pointer_pat[3]=PAT_CRC&0x000000ff;
destin.Write(pat_use,188);
return 0;
#endif
return 1;
}
U8 TS_CREATE::CREATE_PMT(){//0x05 私用分段
#if 1
CFile destin;
char name[100];
U32 file_len=0,PMT_CRC=0xffffffff;
U8 pmt_use[188]={0},*pointer_pmt=0;
U16 pmt_seclen=0;
TS_HEAD ts_instance;
PMT_STRU pmt_head;
pointer_pmt=pmt_use;
strcpy(name,public_para->des_path);
destin.Open(name,CFile::modeNoTruncate|CFile::modeReadWrite,0);
ts_head_create(&ts_instance,public_para->PMT_PID,1,1);
tshead2buffer(&ts_instance,pointer_pmt);
pointer_pmt[4]=0;//pointer filed
pointer_pmt+=5;
pmt_seclen = pmt_head_len+6+5+4-3;//6私有定义(des+len+file_len)
pmt_head.Table_id=0x02;
pmt_head.Sec_len=(pmt_seclen|0x8000)&0x8fff;
pmt_head.prog_num = public_para->program_num;
pmt_head.version= sec_version<<1|1;
pmt_head.sec_num=0;
pmt_head.last_sec_num=0;
pmt_head.pcr_pid = 0x1fff;
pmt_head.pro_length= 6; //the descriptor bytes,after this byte
pointer_pmt[0]=pmt_head.Table_id;
pointer_pmt[1]=pmt_head.Sec_len>>8;
pointer_pmt[2]=pmt_head.Sec_len&0x00ff;
pointer_pmt[3]=pmt_head.prog_num>>8;
pointer_pmt[4]=pmt_head.prog_num&0x00ff;
pointer_pmt[5]=pmt_head.version;
pointer_pmt[6]=pmt_head.sec_num;
pointer_pmt[7]=pmt_head.last_sec_num;
pointer_pmt[8]=(pmt_head.pcr_pid&0x1fff)>>8;
pointer_pmt[9]=pmt_head.pcr_pid&0x00ff;
pointer_pmt[10]=(pmt_head.pro_length&0x0fff)>>16;
pointer_pmt[11]=pmt_head.pro_length&0x00ff;
pointer_pmt+=pmt_head_len;
pointer_pmt[0]=0x88;//私有描述字
pointer_pmt[1]=4;
pointer_pmt[2]=public_para->File_len>>24;
pointer_pmt[3]=public_para->File_len>>16;
pointer_pmt[4]=public_para->File_len>>8;
pointer_pmt[5]=public_para->File_len;
pointer_pmt+=6;
pointer_pmt[0]=0x05;
pointer_pmt[1]=(public_para->PID&0x1fff)>>8;
pointer_pmt[2]=public_para->PID&0x1fff;
pointer_pmt[3]=00;
pointer_pmt[4]=00;//no des infor
pointer_pmt+=5;
//PMT_CRC=CountCRC32(pmt_use,(pmt_seclen+3),PMT_CRC);
CRC_crc32Calculate(pmt_use,(pmt_seclen+3),&PMT_CRC);
pointer_pmt[0]=PMT_CRC>>24;
pointer_pmt[1]=PMT_CRC>>16;
pointer_pmt[2]=PMT_CRC>>8;
pointer_pmt[3]=PMT_CRC&0x000000ff;
destin.SeekToEnd();
destin.Write(pmt_use,188);
return 0;
#endif
return 1;
}
U8 TS_CREATE::CREATE_SDT(){
#if 1
CFile destin;
char name[100];
U32 file_len=0,STD_CRC=0xffffffff;
U8 std_use[188]={0},*pointer_std=0;
U16 std_seclen=0;
TS_HEAD ts_instance;
STD_HEAD_STRU std_head;
SDT_BODY std_body;
pointer_std=std_use;
strcpy(name,public_para->des_path);
destin.Open(name,CFile::modeNoTruncate|CFile::modeReadWrite,0);
ts_head_create(&ts_instance,0x0011,1,2);
tshead2buffer(&ts_instance,pointer_std);
pointer_std[4]=0;
pointer_std+=5;
std_seclen = std_head_len+5+4-3;//6私有定义(des+len+file_len)
std_head.Table_id=0x42;
std_head.Sec_len=(std_seclen|0x8000)&0x8fff;
std_head.Ts_id = public_para->Ts_id;
std_head.version= sec_version<<1|1;
std_head.sec_num=0;
std_head.last_sec_num=0;
std_head.ori_net_id = 0x0001;//特定
std_head.reser_future=0;
pointer_std[0]=std_head.Table_id;
pointer_std[1]=std_head.Sec_len>>8;
pointer_std[2]=std_head.Sec_len&0x00ff;
pointer_std[3]=std_head.Ts_id>>8;
pointer_std[4]=std_head.Ts_id&0x00ff;
pointer_std[5]=std_head.version;
pointer_std[6]=std_head.sec_num;
pointer_std[7]=std_head.last_sec_num;
pointer_std[8]=std_head.ori_net_id>>8;
pointer_std[9]=std_head.ori_net_id&0x00ff;
pointer_std[10]=std_head.reser_future;
pointer_std+=std_head_len;
std_body.service_id = public_para->program_num;
std_body.EIT_para=0x00&0x03;
std_body.r_c_lenth=(((0x04)<<1|0)<<12)|0;
pointer_std[0]=std_body.service_id>>8;
pointer_std[1]=std_body.service_id&0x00ff;
pointer_std[2]=std_body.EIT_para;
pointer_std[3]=0;
pointer_std[4]=0;//不带描述字
pointer_std+=5;
//STD_CRC=CountCRC32(std_use,(std_seclen+3),STD_CRC);
CRC_crc32Calculate(std_use,(std_seclen+3),&STD_CRC);
pointer_std[0]=STD_CRC>>24;
pointer_std[1]=STD_CRC>>16;
pointer_std[2]=STD_CRC>>8;
pointer_std[3]=STD_CRC&0x000000ff;
destin.SeekToEnd();
destin.Write(std_use,188);
return 0;
#endif
return 1;
}
U8 TS_CREATE::CREATE_DATA(){
#if 1
CFile source,destin;
char name[100];
U32 file_len=0,PRI_CRC=0xffffffff,Remain_len=0;
U8 pri_use[188]={0},sec_buufer[4096]/*Ts_bufer[0x100000],*/;
U16 pri_seclen=0;
U8 packet_cout=0;
U16 tab_exten_num=0,last_sec_nums=0,last_sec_bytes=0;
//exten_id数目,section数目,最后section的字节数
U16 cur_sec_byte=0,cur_ext_num=0;
U32 ii=0,jj=0,kk=0,Total_secs=0,sec_write=0;
U8 *Ts_bufer=0,*file_buffer=0;
//总section长度
static U8 temppppp=0;
TS_HEAD ts_instance;
PRI_HEAD pri_head;
Ts_bufer = new U8[0x400000];
file_buffer=new U8[0x400000];//暂定4M
if(Ts_bufer==0||file_buffer==0){
return 1;
}
strcpy(name,public_para->sour_path);
source.Open(name,0,0);
file_len =source.GetLength();
if(file_len>0x400000){
return 1;
}
source.Read(file_buffer,file_len);
//temppppp=*(file_buffer+file_len-1);
/*以下计算需要多少 table_exten_id ,以及最后的section数为多少*/
Total_secs = file_len/4084;
if(file_len%4084!=0){
Total_secs++;
}
tab_exten_num = file_len/(4084*256);
Remain_len = file_len%(4084*256);
if(Remain_len!=0){
tab_exten_num+=1;
last_sec_nums = Remain_len/4084;
last_sec_bytes=Remain_len%4084;
if(last_sec_bytes!=0){
last_sec_nums+=1;
}else{
last_sec_bytes = 4084;
}
}else{
last_sec_nums = 256;
last_sec_bytes = 4084;
}
/*以上计算需要多少 table_exten_id ,以及最后的section数为多少*/
strcpy(name,public_para->des_path);
destin.Open(name,CFile::modeNoTruncate|CFile::modeWrite,0);
pri_head.Table_id=public_para->Priv_table_id;
ts_instance.syn_byte = 0x47;
ts_instance.tras_error=0;
ts_instance.tras_prio=0;
ts_instance.PID =public_para->PID;
ts_instance.tras_scramb=0;
ts_instance.ada_field_C=1;
pri_head.version= ((U8)sec_version<<1)|1;
for(jj=0;jjTable_exten_id+cur_ext_num);
pri_head.sec_num=jj%256;
if(cur_ext_num!=tab_exten_num-1){
pri_head.last_sec_num=0xff;
}else{
pri_head.last_sec_num=last_sec_nums-1;
}
sec_buufer[0]=pri_head.Table_id;
sec_buufer[1]=pri_head.Sec_len>>8;
sec_buufer[2]=pri_head.Sec_len&0x00ff;
sec_buufer[3]=pri_head.Table_id_EX>>8;
sec_buufer[4]=pri_head.Table_id_EX&0x00ff;
sec_buufer[5]=pri_head.version;
sec_buufer[6]=pri_head.sec_num;
sec_buufer[7]=pri_head.last_sec_num;
if(jj!=Total_secs-1){//get data from file
cur_sec_byte=4084;
}else{
cur_sec_byte=last_sec_bytes;
}
MEMCPY(sec_buufer+8,file_buffer+jj*4084,cur_sec_byte);
//PRI_CRC=CountCRC32(sec_buufer,(cur_sec_byte+8),PRI_CRC);
CRC_crc32Calculate(sec_buufer,(cur_sec_byte+8),&PRI_CRC);
sec_buufer[cur_sec_byte+8]=PRI_CRC>>24;
sec_buufer[cur_sec_byte+8+1]=PRI_CRC>>16;
sec_buufer[cur_sec_byte+8+2]=PRI_CRC>>8;
sec_buufer[cur_sec_byte+8+3]=PRI_CRC&0x000000ff;
cur_sec_byte+=(4+8);//change to total_section_len
#if 0//test to verify playload is right
MEMCPY(Ts_bufer+kk,sec_buufer+8,cur_sec_byte-12);
kk+=cur_sec_byte-12;
continue;
#endif
/*以下为一个section的写入操作*/
sec_write=0;//已经复制的字节数
for(ii=0;ii<30;ii++){
ts_instance.conti_cter = ii;
if(ii==0){
ts_instance.play_init=1;
pri_use[0]=ts_instance.syn_byte;
pri_use[1]=(ts_instance.tras_error<<7)|(ts_instance.play_init<<6)|(ts_instance.tras_prio<<5)|((ts_instance.PID>>8)&0x1f);
pri_use[2]=(ts_instance.PID&0x00ff);
pri_use[3]=(ts_instance.tras_scramb<<6)|(ts_instance.ada_field_C<<4)|ts_instance.conti_cter;
pri_use[4]=0;//应该有 pointer filed
MEMCPY(pri_use+5,sec_buufer+sec_write,183);
sec_write+=183;//实际拷贝字节
}else{
ts_instance.play_init=0;
pri_use[0]=ts_instance.syn_byte;
pri_use[1]=(ts_instance.tras_error<<7)|(ts_instance.play_init<<6)|(ts_instance.tras_prio<<5)|((ts_instance.PID>>8)&0x1f);
pri_use[2]=(ts_instance.PID&0x00ff);
pri_use[3]=(ts_instance.tras_scramb<<6)|(ts_instance.ada_field_C<<4)|ts_instance.conti_cter;
MEMCPY(pri_use+4,sec_buufer+sec_write,184);
sec_write+=184;
}
MEMCPY((Ts_bufer+(kk*188)),pri_use,188);
kk++;
if(sec_write>=cur_sec_byte){
break;
}
}
/*以上为一个section的写入操作*/
}
destin.SeekToEnd();
#if(0)
destin.Write(Ts_bufer,kk);
#endif
destin.Write(Ts_bufer,kk*188);
delete []Ts_bufer;
delete []file_buffer;
return 0;
#endif
return 1;
}
#endif