| 632 | } |
| 633 | |
| 634 | std::shared_ptr<Image> Image::WrapExternalBufferVector(std::vector<py::object> buffers, nvcv::ImageFormat fmt) |
| 635 | { |
| 636 | std::vector<std::shared_ptr<ExternalBuffer>> spBuffers; |
| 637 | for (auto &obj : buffers) |
| 638 | { |
| 639 | std::shared_ptr<ExternalBuffer> buffer = cast_py_object_as<ExternalBuffer>(obj); |
| 640 | if (!buffer) |
| 641 | throw std::runtime_error("Input buffer doesn't provide cuda_array_interface or DLPack interfaces"); |
| 642 | spBuffers.push_back(std::move(buffer)); |
| 643 | } |
| 644 | |
| 645 | std::vector<DLPackTensor> bufinfos; |
| 646 | |
| 647 | for (size_t i = 0; i < spBuffers.size(); ++i) |
| 648 | { |
| 649 | bufinfos.emplace_back(spBuffers[i]->dlTensor()); |
| 650 | } |
| 651 | |
| 652 | nvcv::ImageDataStridedCuda imgData = CreateNVCVImageDataCuda(std::move(bufinfos), fmt); |
| 653 | |
| 654 | // This is the key of an image wrapper. |
| 655 | // All image wrappers have the same key. |
| 656 | Image::Key key; |
| 657 | |
| 658 | std::shared_ptr<CacheItem> item = Cache::Instance().fetchOne(key); |
| 659 | |
| 660 | // None found? |
| 661 | if (!item) |
| 662 | { |
| 663 | // Need to add wrappers into cache so that they don't get destroyed by |
| 664 | // the cuda stream when they're last used, and python script isn't |
| 665 | // holding a reference to them. If we don't do it, things might break. |
| 666 | std::shared_ptr<Image> img(new Image(std::move(spBuffers), imgData)); |
| 667 | Cache::Instance().add(*img); |
| 668 | return img; |
| 669 | } |
| 670 | else |
| 671 | { |
| 672 | std::shared_ptr<Image> img = std::static_pointer_cast<Image>(item); |
| 673 | img->setWrapData(std::move(spBuffers), imgData); |
| 674 | return img; |
| 675 | } |
| 676 | } |
| 677 | |
| 678 | void Image::setWrapData(std::vector<std::shared_ptr<ExternalBuffer>> bufs, const nvcv::ImageDataStridedCuda &imgData) |
| 679 | { |
nothing calls this directly
no test coverage detected