//出力用TSデータを送る //戻り値: // TRUE(成功)、FALSE(失敗) //引数: // data [IN]TSデータ // size [IN]dataのサイズ BOOL COneServiceUtil::AddTSBuff( BYTE* data, DWORD size ) { BOOL ret = TRUE; if( this->SID == 0xFFFF || this->sendTcp != NULL || this->sendUdp != NULL){ //全サービス扱い ret = WriteData(data, size); for( DWORD i=0; i<size; i+=188 ){ CTSPacketUtil packet; if( packet.Set188TS(data + i, 188) == TRUE ){ if( packet.PID == this->pmtPID ){ DWORD err = createPmt.AddData(&packet); } } } }else{ if( size > this->buffSize ){ SAFE_DELETE_ARRAY(this->buff); this->buff = new BYTE[size*2]; this->buffSize = size*2; } this->buffWriteSize = 0; for( DWORD i=0; i<size; i+=188 ){ CTSPacketUtil packet; if( packet.Set188TS(data + i, 188) == TRUE ){ if( packet.PID == 0x0000 ){ //PAT BYTE* patBuff = NULL; DWORD patBuffSize = 0; if( createPat.GetPacket(&patBuff, &patBuffSize) == TRUE ){ memcpy(this->buff + this->buffWriteSize, patBuff, patBuffSize); this->buffWriteSize+=patBuffSize; } }else if( packet.PID == this->pmtPID ){ //PMT DWORD err = createPmt.AddData(&packet); if( err == NO_ERR || err == ERR_NO_CHAGE ){ BYTE* pmtBuff = NULL; DWORD pmtBuffSize = 0; if( createPmt.GetPacket(&pmtBuff, &pmtBuffSize) == TRUE ){ memcpy(this->buff + this->buffWriteSize, pmtBuff, pmtBuffSize); this->buffWriteSize+=pmtBuffSize; }else{ _OutputDebugString(L"createPmt.GetPacket Err"); //そのまま memcpy(this->buff + this->buffWriteSize, data+i, 188); this->buffWriteSize+=188; } }else if( err == FALSE ){ _OutputDebugString(L"createPmt.AddData Err"); //そのまま memcpy(this->buff + this->buffWriteSize, data+i, 188); this->buffWriteSize+=188; } }else{ //その他 if( packet.PID < 0x0030 ){ //そのまま memcpy(this->buff + this->buffWriteSize, data+i, 188); this->buffWriteSize+=188; }else{ if( createPmt.IsNeedPID(packet.PID) == TRUE ){ //PMTで定義されてる memcpy(this->buff + this->buffWriteSize, data+i, 188); this->buffWriteSize+=188; }else{ //EMMなら必要 map<WORD,WORD>::iterator itr; itr = this->emmPIDMap.find(packet.PID); if( itr != this->emmPIDMap.end() ){ memcpy(this->buff + this->buffWriteSize, data+i, 188); this->buffWriteSize+=188; } } } } } } WriteData(this->buff, this->buffWriteSize); } if( this->pittariStart == TRUE ){ if( this->lastPMTVer == 0xFFFF ){ this->lastPMTVer = createPmt.GetVersion(); }else if(this->lastPMTVer != createPmt.GetVersion()){ //ぴったり開始 StratPittariRec(); this->lastPMTVer = createPmt.GetVersion(); } if( this->epgUtil != NULL ){ EPG_EVENT_INFO* epgInfo; if( this->epgUtil->GetEpgInfo( this->pittariONID, this->pittariTSID, this->pittariSID, FALSE, &epgInfo ) == NO_ERR ){ if( epgInfo->event_id == this->pittariEventID ){ //ぴったり開始 StratPittariRec(); this->pittariStart = FALSE; this->pittariEndChk = TRUE; } } } } if( this->pittariEndChk == TRUE ){ if( this->epgUtil != NULL ){ EPG_EVENT_INFO* epgInfo; if( this->epgUtil->GetEpgInfo( this->pittariONID, this->pittariTSID, this->pittariSID, FALSE, &epgInfo ) == NO_ERR ){ if( epgInfo->event_id != this->pittariEventID ){ //ぴったり終了 StopPittariRec(); this->pittariEndChk = FALSE; } } } } return ret; }
//出力用TSデータを送る //戻り値: // TRUE(成功)、FALSE(失敗) //引数: // data [IN]TSデータ // size [IN]dataのサイズ BOOL COneServiceUtil::AddTSBuff( BYTE* data, DWORD size ) { BOOL ret = TRUE; if( this->SID == 0xFFFF || this->sendTcp != NULL || this->sendUdp != NULL){ //全サービス扱い if( data != NULL ){ ret = WriteData(data, size); } for( DWORD i=0; i<size; i+=188 ){ CTSPacketUtil packet; if( packet.Set188TS(data + i, 188) == TRUE ){ if( packet.PID == this->pmtPID ){ DWORD err = createPmt.AddData(&packet); } } } }else{ this->buff.clear(); for( DWORD i=0; i<size; i+=188 ){ CTSPacketUtil packet; if( packet.Set188TS(data + i, 188) == TRUE ){ if( packet.PID == 0x0000 ){ //PAT BYTE* patBuff = NULL; DWORD patBuffSize = 0; if( createPat.GetPacket(&patBuff, &patBuffSize) == TRUE ){ if( packet.payload_unit_start_indicator == 1 ){ this->buff.insert(this->buff.end(), patBuff, patBuff + patBuffSize); } } }else if( packet.PID == this->pmtPID ){ //PMT DWORD err = createPmt.AddData(&packet); if( err == NO_ERR || err == ERR_NO_CHAGE ){ BYTE* pmtBuff = NULL; DWORD pmtBuffSize = 0; if( createPmt.GetPacket(&pmtBuff, &pmtBuffSize) == TRUE ){ this->buff.insert(this->buff.end(), pmtBuff, pmtBuff + pmtBuffSize); }else{ _OutputDebugString(L"createPmt.GetPacket Err"); //そのまま this->buff.insert(this->buff.end(), data + i, data + i + 188); } }else if( err == FALSE ){ _OutputDebugString(L"createPmt.AddData Err"); //そのまま this->buff.insert(this->buff.end(), data + i, data + i + 188); } }else{ //その他 if( packet.PID < 0x0030 ){ //そのまま this->buff.insert(this->buff.end(), data + i, data + i + 188); }else{ if( createPmt.IsNeedPID(packet.PID) == TRUE ){ //PMTで定義されてる this->buff.insert(this->buff.end(), data + i, data + i + 188); }else{ //EMMなら必要 map<WORD,WORD>::iterator itr; itr = this->emmPIDMap.find(packet.PID); if( itr != this->emmPIDMap.end() ){ this->buff.insert(this->buff.end(), data + i, data + i + 188); } } } } } } if( this->buff.empty() == false ){ ret = WriteData(&this->buff.front(), (DWORD)this->buff.size()); } } if( this->pittariStart == TRUE ){ if( this->lastPMTVer == 0xFFFF ){ this->lastPMTVer = createPmt.GetVersion(); }else if(this->lastPMTVer != createPmt.GetVersion()){ //ぴったり開始 StratPittariRec(); this->lastPMTVer = createPmt.GetVersion(); } if( this->epgUtil != NULL ){ EPG_EVENT_INFO* epgInfo; if( this->epgUtil->GetEpgInfo( this->pittariONID, this->pittariTSID, this->pittariSID, FALSE, &epgInfo ) == NO_ERR ){ if( epgInfo->event_id == this->pittariEventID ){ //ぴったり開始 StratPittariRec(); this->pittariStart = FALSE; this->pittariEndChk = TRUE; } } } } if( this->pittariEndChk == TRUE ){ if( this->epgUtil != NULL ){ EPG_EVENT_INFO* epgInfo; if( this->epgUtil->GetEpgInfo( this->pittariONID, this->pittariTSID, this->pittariSID, FALSE, &epgInfo ) == NO_ERR ){ if( epgInfo->event_id != this->pittariEventID ){ //ぴったり終了 StopPittariRec(); this->pittariEndChk = FALSE; } } } } return ret; }