接收ts

之前覺得是丟包啦,看了代碼才知道是代碼自身的問題,修改了,不再花屏啦! ui

struct sockaddr_in stPeerAddr; orm

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; }
相關文章
相關標籤/搜索