| 586 | } |
| 587 | |
| 588 | std::vector<std::shared_ptr<Image>> Image::WrapExternalBufferMany(std::vector<std::shared_ptr<ExternalBuffer>> &buffers, |
| 589 | nvcv::ImageFormat fmt) |
| 590 | { |
| 591 | // This is the key of an image wrapper. |
| 592 | // All image wrappers have the same key. |
| 593 | Image::Key key; |
| 594 | |
| 595 | std::vector<std::shared_ptr<CacheItem>> items = Cache::Instance().fetch(key); |
| 596 | |
| 597 | std::vector<std::shared_ptr<Image>> out; |
| 598 | out.reserve(buffers.size()); |
| 599 | |
| 600 | for (size_t i = 0; i < buffers.size(); ++i) |
| 601 | { |
| 602 | std::vector<std::shared_ptr<ExternalBuffer>> spBuffers; |
| 603 | spBuffers.push_back(buffers[i]); |
| 604 | |
| 605 | if (!spBuffers.back()) |
| 606 | throw std::runtime_error("Input buffer doesn't provide cuda_array_interface or DLPack interfaces"); |
| 607 | |
| 608 | std::vector<DLPackTensor> bufinfos; |
| 609 | bufinfos.emplace_back(spBuffers[0]->dlTensor()); |
| 610 | nvcv::ImageDataStridedCuda imgData = CreateNVCVImageDataCuda(bufinfos, fmt); |
| 611 | |
| 612 | // None found? |
| 613 | if (items.empty()) |
| 614 | { |
| 615 | // Need to add wrappers into cache so that they don't get destroyed by |
| 616 | // the cuda stream when they're last used, and python script isn't |
| 617 | // holding a reference to them. If we don't do it, things might break. |
| 618 | std::shared_ptr<Image> img(new Image(std::move(spBuffers), imgData)); |
| 619 | Cache::Instance().add(*img); |
| 620 | out.push_back(img); |
| 621 | } |
| 622 | else |
| 623 | { |
| 624 | std::shared_ptr<Image> img = std::static_pointer_cast<Image>(items.back()); |
| 625 | items.pop_back(); |
| 626 | img->setWrapData(std::move(spBuffers), imgData); |
| 627 | out.push_back(img); |
| 628 | } |
| 629 | } |
| 630 | |
| 631 | return out; |
| 632 | } |
| 633 | |
| 634 | std::shared_ptr<Image> Image::WrapExternalBufferVector(std::vector<py::object> buffers, nvcv::ImageFormat fmt) |
| 635 | { |
nothing calls this directly
no test coverage detected