int main() { memset(&hints2,0,sizeof(hints2)); hints2.ai_family=PF_UNSPEC; hints2.ai_socktype=SOCK_DGRAM; hints2.ai_protocol=IPPROTO_UDP; rc2=getaddrinfo("202.205.253.254","123",&hints2,&res2); if (rc2 != 0) { perror("getaddrinfo"); return; } sk = socket(res2->ai_family, res2->ai_socktype,res2->ai_protocol); if (sk <0 ) { perror("socket"); } else { printf("socket success!\n"); } GetNtpTime(sk,res2); }
RtpSessionError CRtpSessionVideo::SendData(CPacket* packet) { RtpSessionError ret = AM_RTP_SESSION_ERROR_OK; AM_U32 id = packet->GetStreamId(); if (AM_LIKELY(id == mStreamId)) { AM_U32 packetNum = 0; AM_U32 size = packet->GetDataSize(); AM_U8 *data = packet->GetDataPtr(); RtspPacket *packets = NULL; AM_S32 pktPtsIncr90k = (mOldPts > 0) ? (AM_S32)(packet->GetPTS()-mOldPts) : ((mVideoInfo.type == 1) ? (AM_S32)((AM_U64)mVideoInfo.rate * 90000LLU / (AM_U64)mVideoInfo.scale) : (AM_S32)((AM_U64)mVideoInfo.fps * 90000LLU / 512000000LLU)); mOldPts = packet->GetPTS(); switch(mVideoInfo.type) { case 1: { /* H.264 */ packets = mPackager->assemblePacketH264(data, size, mMaxPacketSize, packetNum, mSeqNum, mCurrentTimeStamp, mSsrc, pktPtsIncr90k); }break; case 2: { /* MJPEG */ AM_U8 qfactor = (0xff & packet->mPayload->mData.mFrameAttr); packets = mPackager->assemblePacketJpeg(data, qfactor, size, mMaxPacketSize, packetNum, mSeqNum, mCurrentTimeStamp, mSsrc, pktPtsIncr90k); }break; default: { ERROR("Invalid video type!"); }break; } packet->SetStreamId(mOldStreamId); packet->Release(); if (AM_LIKELY(packets)) { AUTO_LOCK(mMutex); for (AM_UINT i = 0; i < packetNum; ++ i) { if (AM_LIKELY(HaveDestination(id))) { if (AM_UNLIKELY(!mRtspServer->SendPacket(mDestination, &packets[i]))) { ERROR("Failed to send video NALU"); ret = AM_RTP_SESSION_ERROR_NETWORK; break; } } /* No destination, just ignore */ ret = AM_RTP_SESSION_ERROR_OK; } for (Destination *dest = mDestination; dest; dest = dest->next) { if (dest->enable) { dest->update_sent_data_info(mCurrentTimeStamp, GetNtpTime(), packetNum, size); if (AM_UNLIKELY(dest->sendsr)) { dest->update_rtcp_sr(mCurrentTimeStamp, 90000, GetNtpTime()); if (AM_LIKELY(dest->sendsr)) { mRtspServer->SendRtcpSr(dest); dest->sendsr = false; } } } } } else { ret = AM_RTP_SESSION_ERROR_BITSTREAM; ERROR("Failed to build RTP packet!"); } } else { ERROR("No such session %u", packet->GetStreamId()); ret = AM_RTP_SESSION_ERROR_NOSESSION; /* Audio stream's id is set to MAX_ENCODE_STREAM_NUM to distinguish it * from video stream, before release it we need to reset its stream id * to its original one, AVQueue need its original stream id to release * memory */ packet->SetStreamId(mOldStreamId); packet->Release(); } return ret; }