You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.3 KiB
59 lines
2.3 KiB
#include "system/loggerd/encoder/encoder.h"
|
|
|
|
VideoEncoder::VideoEncoder(const EncoderInfo &encoder_info, int in_width, int in_height)
|
|
: encoder_info(encoder_info), in_width(in_width), in_height(in_height) {
|
|
|
|
out_width = encoder_info.frame_width > 0 ? encoder_info.frame_width : in_width;
|
|
out_height = encoder_info.frame_height > 0 ? encoder_info.frame_height : in_height;
|
|
|
|
|
|
std::vector pubs = {encoder_info.publish_name};
|
|
if (encoder_info.thumbnail_name != NULL) {
|
|
pubs.push_back(encoder_info.thumbnail_name);
|
|
}
|
|
pm.reset(new PubMaster(pubs));
|
|
}
|
|
|
|
void VideoEncoder::publisher_publish(int segment_num, uint32_t idx, VisionIpcBufExtra &extra,
|
|
unsigned int flags, kj::ArrayPtr<capnp::byte> header, kj::ArrayPtr<capnp::byte> dat) {
|
|
// broadcast packet
|
|
MessageBuilder msg;
|
|
auto event = msg.initEvent(true);
|
|
auto edat = (event.*(encoder_info.init_encode_data_func))();
|
|
auto edata = edat.initIdx();
|
|
struct timespec ts;
|
|
timespec_get(&ts, TIME_UTC);
|
|
edat.setUnixTimestampNanos((uint64_t)ts.tv_sec*1000000000 + ts.tv_nsec);
|
|
edata.setFrameId(extra.frame_id);
|
|
edata.setTimestampSof(extra.timestamp_sof);
|
|
edata.setTimestampEof(extra.timestamp_eof);
|
|
edata.setType(encoder_info.encode_type);
|
|
edata.setEncodeId(cnt++);
|
|
edata.setSegmentNum(segment_num);
|
|
edata.setSegmentId(idx);
|
|
edata.setFlags(flags);
|
|
edata.setLen(dat.size());
|
|
edat.adoptData(msg.getOrphanage().referenceExternalData(dat));
|
|
edat.setWidth(out_width);
|
|
edat.setHeight(out_height);
|
|
if (flags & V4L2_BUF_FLAG_KEYFRAME) edat.setHeader(header);
|
|
|
|
uint32_t bytes_size = capnp::computeSerializedSizeInWords(msg) * sizeof(capnp::word);
|
|
if (msg_cache.size() < bytes_size) {
|
|
msg_cache.resize(bytes_size);
|
|
}
|
|
kj::ArrayOutputStream output_stream(kj::ArrayPtr<capnp::byte>(msg_cache.data(), bytes_size));
|
|
capnp::writeMessage(output_stream, msg);
|
|
pm->send(encoder_info.publish_name, msg_cache.data(), bytes_size);
|
|
|
|
// Publish keyframe thumbnail
|
|
if ((flags & V4L2_BUF_FLAG_KEYFRAME) && encoder_info.thumbnail_name != NULL) {
|
|
MessageBuilder tm;
|
|
auto thumbnail = tm.initEvent().initThumbnail();
|
|
thumbnail.setFrameId(extra.frame_id);
|
|
thumbnail.setTimestampEof(extra.timestamp_eof);
|
|
thumbnail.setThumbnail(dat);
|
|
thumbnail.setEncoding(cereal::Thumbnail::Encoding::KEYFRAME);
|
|
pm->send(encoder_info.thumbnail_name, tm);
|
|
}
|
|
}
|
|
|