Get one camera packet.
112 {
113 uint8_t *frame_data = &buf_[0];
114 uint8_t *pdu_data = &pdu_[0];
115 int total = 0;
116 int pkg_len = 0;
117 size_t frame_len = 0;
118 uint16_t pre_seq = 0;
119
120 do {
121 if (!InputAvailable(POLL_TIMEOUT)) {
122 return SOCKET_TIMEOUT;
123 }
124
125
126 ssize_t pdu_len = recvfrom(sockfd_, pdu_data, H265_PDU_SIZE, 0, NULL, NULL);
127 if (pdu_len < 0) {
128 if (errno != EWOULDBLOCK) {
129 AERROR <<
"Failed to receive package from port: " << port_;
130 return RECEIVE_FAIL;
131 }
132 }
133
134 AINFO <<
"Received pdu length: " << pdu_len <<
" from port: " << port_;
136 uint16_t local_seq = ntohs(pdu_pkg->rtp_header.seq);
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 << "/"
141 << pre_seq;
142 }
143 pre_seq = local_seq;
144
147
148 if (total) {
149 AERROR <<
"Error! lost package for last frame, left bytes: " << total;
150 }
151 AINFO <<
"Received new frame from port: " << port_;
152
153 uint32_t
frame_id = ntohl(pdu_pkg->header.frame_id);
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_ << "/"
158 }
160
161 cyber::Time image_time(ntohl(pdu_pkg->header.ts_sec),
162 1000 * ntohl(pdu_pkg->header.ts_usec));
163
164
165 uint64_t camera_timestamp = image_time.ToNanosecond();
166 h265Pb->mutable_header()->set_camera_timestamp(camera_timestamp);
167 h265Pb->set_measurement_time(image_time.ToSecond());
168 h265Pb->set_format("h265");
169 h265Pb->set_frame_type(static_cast<int>(pdu_pkg->header.frame_type));
170 AINFO <<
"Port: " << port_
171 << ", received frame size: " << ntohl(pdu_pkg->header.frame_size)
172 << ", frame type: " << static_cast<int>(pdu_pkg->header.frame_type)
173 << ", PhyNo: " << static_cast<int>(pdu_pkg->header.PhyNo)
175
176 frame_len = ntohl(pdu_pkg->header.frame_size);
177 total = static_cast<int>(frame_len);
178 frame_data = &buf_[0];
179 continue;
180 }
181
182 if (total > 0) {
183 pkg_len =
static_cast<int>(pdu_len -
sizeof(
RtpHeader));
184 memcpy(frame_data, pdu_data + sizeof(RtpHeader), pkg_len);
185 total -= pkg_len;
186 frame_data += pkg_len;
187
188
189 }
190 if (total <= 0) {
191 total = 0;
192
193
194 if (frame_len > 0) {
195 h265Pb->set_data(buf_, frame_len);
196 break;
197 }
198 AERROR <<
"Error! frame info is wrong. frame length: " << frame_len;
199 }
200 } while (true);
201
202 return 0;
203}
std::string frame_id
Point cloud frame id
struct apollo::drivers::video::RtpHeader RtpHeader
struct apollo::drivers::video::HwPduPacket HwPduPacket