예제 #1
0
//出力用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;
}
예제 #2
0
//出力用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;
}