接收ts

原创
2013/09/29 11:30
阅读数 104

以前以为是丢包啦,看了代码才知道是代码自身的问题,修改了,再也不花屏啦!

struct sockaddr_in stPeerAddr;

socklen_t tPeerSize = sizeof( stPeerAddr );


int iRet = recvfrom( GetFd(),
        ( char* )(m_stRecvPacket.m_pchBuf+m_stRecvPacket.m_uiOffset),
m_stRecvPacket.m_uiSize - m_stRecvPacket.m_uiOffset,
0,
        (struct sockaddr*)&stPeerAddr,&tPeerSize );
if ( iRet < 0 )
{
if ( CDTS_Auxiliary::GetSockErr() != EAGAIN && CDTS_Auxiliary::GetSockErr() != EINTR )
{
GAL_ERROR_PRINT << "recvfrom error = %m";
}
return -3;
}


//GAL_DEBUG_PRINT << "recv len = " << iRet << " from " << inet_ntoa( stPeerAddr.sin_addr ) << " : " << DTS_NET_TO_HOST_16( stPeerAddr.sin_port );
//fprintf( stderr,"------------- 0x%x\n",*m_stRecvPacket.m_pchBuf );


m_stRecvPacket.m_uiOffset += iRet;


if ( m_stRecvPacket.m_uiOffset < TRANSPORT_PACKET_SIZE )
{
GAL_DEBUG_PRINT << "We didn't read a complete TS packet";
return -4;
}


//GAL_DEBUG_PRINT << "buffer size = " << m_stRecvPacket.m_uiOffset << " Ts size = " << fFrameSize;


// Make sure the data begins with a sync byte:
dts_uint32 syncBytePosition;
for ( syncBytePosition = 0; syncBytePosition < m_stRecvPacket.m_uiOffset; ++syncBytePosition ) {
if ( m_stRecvPacket.m_pchBuf[syncBytePosition] == TRANSPORT_SYNC_BYTE ) 
{
if ( syncBytePosition + TRANSPORT_PACKET_SIZE >= m_stRecvPacket.m_uiOffset )
{
dts_uint32 uiLen = m_stRecvPacket.m_uiOffset - syncBytePosition;
memcpy( m_stRecvPacket.m_pchBuf,m_stRecvPacket.m_pchBuf+syncBytePosition,uiLen );
m_stRecvPacket.m_uiOffset = uiLen;


return -5;
}
if ( m_stRecvPacket.m_pchBuf[ syncBytePosition + TRANSPORT_PACKET_SIZE ] == TRANSPORT_SYNC_BYTE )
{
break;
}
}
}


if (syncBytePosition == m_stRecvPacket.m_uiOffset) {
GAL_ERROR <<  "No Transport Stream sync byte in data.";
GAL_ERROR_PRINT <<  "No Transport Stream sync byte in data.";


::bzero( m_stRecvPacket.m_pchBuf,m_stRecvPacket.m_uiOffset );
m_stRecvPacket.m_uiOffset = 0;

return -6;
} else if (syncBytePosition > 0) {
// There's a sync byte, but not at the start of the data.  Move the good data
// to the start of the buffer, then read more to fill it up again:


GAL_DEBUG_PRINT<< "There's a sync byte, but not at the start of the data. = " << syncBytePosition;


memmove(m_stRecvPacket.m_pchBuf, &m_stRecvPacket.m_pchBuf[syncBytePosition], m_stRecvPacket.m_uiOffset - syncBytePosition);
//fFrameSize -= syncBytePosition;
m_stRecvPacket.m_uiOffset -= syncBytePosition;
//numTSPackets = m_stRecvPacket.m_uiOffset/TRANSPORT_PACKET_SIZE;
} // else normal case: the data begins with a sync byte

CTSParse* pstTSParse = NULL;
// unsigned char* pszBuf;
// dts_uint8 cc;
for ( unsigned i = 0; i < numTSPackets; ++i ) 
{
// pszBuf = &m_stRecvPacket.m_pchBuf[ i*TRANSPORT_PACKET_SIZE ];
// cc = pszBuf[ 3 ] & 0x0F;
pstTSParse = new CTSParse( &m_stRecvPacket.m_pchBuf[ i*TRANSPORT_PACKET_SIZE ] );
if ( pstTSParse->GetCreateError() == -1 )
{
//fprintf( stderr,"!!!!!!!!!!!!!!!!! 0x%x\n",m_stRecvPacket.m_pchBuf[ i*TRANSPORT_PACKET_SIZE ] );
//GAL_ERROR_PRINT << i << " ts parse fail";


//m_stTsFile.WriteData( (char*)(m_stRecvPacket.m_pchBuf),numTSPackets*TRANSPORT_PACKET_SIZE );


delete pstTSParse;
break;
}

m_stTSProgramMgr.AddMultiTSPacket( pstTSParse );
}


dts_uint32 fFrameSize = numTSPackets * TRANSPORT_PACKET_SIZE;


if ( m_stRecvPacket.m_uiOffset > fFrameSize )
{
dts_uint32 uiLen = m_stRecvPacket.m_uiOffset - fFrameSize;
memcpy( m_stRecvPacket.m_pchBuf,m_stRecvPacket.m_pchBuf+fFrameSize,uiLen );
m_stRecvPacket.m_uiOffset = uiLen;
}
else
{
::bzero( m_stRecvPacket.m_pchBuf,m_stRecvPacket.m_uiOffset );
m_stRecvPacket.m_uiOffset = 0;
}
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部