BOOL CTSBuffUtil::GetSectionBuff(BYTE** sectionData, DWORD* dataSize) { if( sectionSize == 0 && carryPacket.empty() == false ){ //繰り越しパケットを処理 CTSPacketUtil tsPacket; tsPacket.payload_unit_start_indicator = 1; tsPacket.data_byteSize = (BYTE)carryPacket.size(); tsPacket.data_byte = &carryPacket.front(); if( PESMode == FALSE ){ if( AddSectionBuff(&tsPacket) != 2 ){ carryPacket.clear(); } }else{ AddPESBuff(&tsPacket); carryPacket.clear(); } } if( sectionSize == 0 || sectionSize != sectionBuff.size() ){ //sectionBuffはGet済みか作成途中 carryPacket.clear(); return FALSE; } *sectionData = §ionBuff.front(); *dataSize = sectionSize; //sectionBuffがGet済みであることを示す sectionSize = 0; return TRUE; }
DWORD CTSBuffUtil::Add188TS(CTSPacketUtil* tsPacket) { if( tsPacket == NULL ){ return FALSE; } //カウンターチェック if( CheckCounter(tsPacket) == FALSE ){ Clear(); } //スクランブルのチェック if( tsPacket->transport_scrambling_control != 0 ){ //スクランブルパケットなので解析できない Clear(); return ERR_NOT_SUPPORT; } if( tsPacket->payload_unit_start_indicator == 1 ){ if( tsPacket->data_byteSize < 3 ){ //サイズが小さすぎる return FALSE; } if(tsPacket->data_byte[0] == 0x00 && tsPacket->data_byte[1] == 0x00 && tsPacket->data_byte[2] == 0x01){ //PES if( this->supportPES == FALSE ){ Clear(); return ERR_NOT_SUPPORT; } this->PESMode = TRUE; }else if( tsPacket->adaptation_field_length > 0 && tsPacket->random_access_indicator == 1 ){ //PES if( this->supportPES == FALSE ){ Clear(); return ERR_NOT_SUPPORT; } this->PESMode = TRUE; }else if( tsPacket->adaptation_field_length > 0 && tsPacket->PCR_flag == 1 ){ //PCR Clear(); return ERR_NOT_SUPPORT; }else if( tsPacket->adaptation_field_length > 0 && tsPacket->OPCR_flag == 1 ){ //OPCR Clear(); return ERR_NOT_SUPPORT; } } if( this->lastPID == 0xFFFF && this->lastCounter == 0xFF ){ //初回 if( tsPacket->payload_unit_start_indicator == 1 ){ //PSI this->lastPID = tsPacket->PID; this->lastCounter = tsPacket->continuity_counter; if( this->PESMode == FALSE ){ return AddSectionBuff(tsPacket); }else{ return AddPESBuff(tsPacket); } }else{ //スタート位置ではない return ERR_ADD_NEXT; } }else{ this->lastPID = tsPacket->PID; this->lastCounter = tsPacket->continuity_counter; if( this->PESMode == FALSE ){ return AddSectionBuff(tsPacket); }else{ return AddPESBuff(tsPacket); } } }