bool pointcloud::should_process(const rs2::frame& frame) { if (!frame) return false; auto set = frame.as<rs2::frameset>(); if (set) { //process composite frame only if it contains both a depth frame and the requested texture frame if (_stream_filter.stream == RS2_STREAM_ANY) return false; auto tex = set.first_or_default(_stream_filter.stream, _stream_filter.format); if (!tex) return false; auto depth = set.first_or_default(RS2_STREAM_DEPTH, RS2_FORMAT_Z16); if (!depth) return false; } else { if (frame.get_profile().stream_type() == RS2_STREAM_DEPTH && frame.get_profile().format() == RS2_FORMAT_Z16) return true; auto p = frame.get_profile(); if (p.stream_type() == _stream_filter.stream && p.format() == _stream_filter.format && p.stream_index() == _stream_filter.index) return true; return false; //TODO: switch to this code when map_to api is removed //if (_stream_filter != RS2_STREAM_ANY) // return false; //process single frame only if it is a depth frame //if (frame.get_profile().stream_type() != RS2_STREAM_DEPTH || frame.get_profile().format() != RS2_FORMAT_Z16) // return false; } return true; }
rs2::frame align::process_frame(const rs2::frame_source& source, const rs2::frame& f) { rs2::frame rv; std::vector<rs2::frame> output_frames; std::vector<rs2::frame> other_frames; auto frames = f.as<rs2::frameset>(); auto depth = frames.first_or_default(RS2_STREAM_DEPTH, RS2_FORMAT_Z16).as<rs2::depth_frame>(); _depth_scale = ((librealsense::depth_frame*)depth.get())->get_units(); if (_to_stream_type == RS2_STREAM_DEPTH) frames.foreach([&other_frames](const rs2::frame& f) {if (f.get_profile().stream_type() != RS2_STREAM_DEPTH) other_frames.push_back(f); }); else frames.foreach([this, &other_frames](const rs2::frame& f) {if (f.get_profile().stream_type() == _to_stream_type) other_frames.push_back(f); }); if (_to_stream_type == RS2_STREAM_DEPTH) { for (auto from : other_frames) { auto aligned_frame = allocate_aligned_frame(source, from, depth); align_frames(aligned_frame, from, depth); output_frames.push_back(aligned_frame); } } else { auto to = other_frames.front(); auto aligned_frame = allocate_aligned_frame(source, depth, to); align_frames(aligned_frame, depth, to); output_frames.push_back(aligned_frame); } auto new_composite = source.allocate_composite_frame(std::move(output_frames)); return new_composite; }