66 sockfd_ = socket(AF_INET, SOCK_DGRAM, 0);
68 AERROR <<
"Failed to create socket fd.";
73 AINFO <<
"Opening UDP socket on port: " << uint16_t(port);
76 memset(&my_addr,
'\0',
sizeof(my_addr));
77 my_addr.sin_family = AF_INET;
78 my_addr.sin_port = htons(uint16_t(port));
79 my_addr.sin_addr.s_addr = INADDR_ANY;
80 if (bind(sockfd_,
reinterpret_cast<sockaddr *
>(&my_addr),
81 sizeof(sockaddr_in)) < 0) {
82 AERROR <<
"Failed to bind socket on local address.";
85 if (fcntl(sockfd_, F_SETFL, O_NONBLOCK | FASYNC) < 0) {
86 AERROR <<
"Failed to enable non-blocking I/O.";
89 const int rbuf = 4 * 1024 * 1024;
90 if (setsockopt(sockfd_, SOL_SOCKET, SO_RCVBUF, &rbuf,
sizeof(
int)) < 0) {
91 AERROR <<
"Failed to enable socket receive buffer.";
95 if (setsockopt(sockfd_, SOL_SOCKET, SO_REUSEADDR, &enable,
sizeof(
int)) < 0) {
96 AERROR <<
"Failed to enable socket reuseable address.";
99 buf_ =
new uint8_t[H265_FRAME_PACKAGE_SIZE];
101 AERROR <<
"Failed to allocate H265 frame package buffer.";
103 pdu_ =
new uint8_t[H265_PDU_SIZE];
105 AERROR <<
"Failed to allocate H265 PDU buffer.";
108 AINFO <<
"Camera socket fd: " << sockfd_ <<
", port: " << port_;
113 uint8_t *frame_data = &buf_[0];
114 uint8_t *pdu_data = &pdu_[0];
117 size_t frame_len = 0;
118 uint16_t pre_seq = 0;
122 return SOCKET_TIMEOUT;
126 ssize_t pdu_len = recvfrom(sockfd_, pdu_data, H265_PDU_SIZE, 0, NULL, NULL);
128 if (errno != EWOULDBLOCK) {
129 AERROR <<
"Failed to receive package from port: " << port_;
134 AINFO <<
"Received pdu length: " << pdu_len <<
" from port: " << port_;
137 AINFO <<
"Package seq number: " << local_seq;
138 if (local_seq - pre_seq != 1 && pre_seq > 1 && local_seq > 0) {
139 AERROR <<
"Error! port: " << port_
140 <<
", package sequence is wrong. curent/pre " << local_seq <<
"/"
149 AERROR <<
"Error! lost package for last frame, left bytes: " << total;
151 AINFO <<
"Received new frame from port: " << port_;
154 if (frame_id - frame_id_ != 1 && frame_id_ > 1 && frame_id > 1) {
155 AERROR <<
"Error! port: " << port_
156 <<
", lose Frame. pre_frame_id/frame_id " << frame_id_ <<
"/"
159 frame_id_ = frame_id;
166 h265Pb->mutable_header()->set_camera_timestamp(camera_timestamp);
167 h265Pb->set_measurement_time(image_time.
ToSecond());
168 h265Pb->set_format(
"h265");
170 AINFO <<
"Port: " << port_
173 <<
", PhyNo: " <<
static_cast<int>(pdu_pkg->
header.
PhyNo)
174 <<
", frame id: " << frame_id;
177 total =
static_cast<int>(frame_len);
178 frame_data = &buf_[0];
183 pkg_len =
static_cast<int>(pdu_len -
sizeof(
RtpHeader));
184 memcpy(frame_data, pdu_data +
sizeof(
RtpHeader), pkg_len);
186 frame_data += pkg_len;
195 h265Pb->set_data(buf_, frame_len);
198 AERROR <<
"Error! frame info is wrong. frame length: " << frame_len;