JPIPKAK-JPIP流媒体

司机简称

JPIPKAK

生成依赖项

卡卡杜类库

JPEG 2000交互协议(JPIP)在随机访问、码流重新排序和增量解码方面的灵活性在网络环境中具有很高的可利用性,允许使用有限带宽连接或高争用网络访问远程大文件。

驱动程序功能

Supports Georeferencing

This driver supports georeferencing

JPIPKAK-JPIP概述

本节简要概述了JPIP事件序列,更多信息请访问 JPEG 2000 Interactive Protocol (Part 9 – JPIP) 规范可以(也应该)从 ISO .

JPEG 2000第9部分的早期版本可从http://www.JPEG.org/public/fcd15444-9v2.pdf获得,注意ISO版权,本文档中不复制图表。

JPIP协议已经在这个格式驱动程序中抽象出来,请求是在1:1的分辨率级别上发出的。

JPIP Sequence Diagram

  1. 对目标图像、目标id、http上的会话、作为jpp流返回的数据的初始JPIP请求被请求,并且在响应上设置最大长度。在这种情况下,不请求初始窗口,尽管它可以。服务器使用一个目标标识符(可用于标识服务器上的映像)和一个JPIP cnew响应头(包括到JPIP服务器的路径,JPIP服务器将处理所有未来请求)和一个cid会话标识符进行响应。会话是必需的,以便服务器可以对客户端连接的状态建模,只发送所需的数据。

  2. 客户端请求目标映像上具有最大响应长度的特定视图窗口,并包括在先前通信中建立的会话标识符fsiz'用于标识与请求的视图窗口关联的分辨率。值“fx”和“fy”指定所需图像分辨率的尺寸roff'用于标识与请求的视图windw相关联的空间区域的左上角rsiz'用于标识与请求的视图窗口关联的空间区域的水平和垂直范围。

JPIPKAK-进近

JPIPKAK驱动程序使用了一种首先在这里演示的方法, J2KViewer ,作者是Juan Pablo Garcia Ortiz,他将通信层(socket/http)与Kakadu kduôu缓存对象分离。将通信层与数据对象分离是可取的,因为它允许使用优化的http客户端库,如libcurl、Apache http client(注意jportiz使用的是纯Java套接字),并允许客户端和服务器之间的SSL通信。

Kakadu与JPIP服务器的客户机通信的实现使用了一个socket,这个socket连接保存了这个客户机会话的状态。可以使用客户端和服务器之间的JPIP缓存操作重新创建与Kakadu的客户端会话,但不支持使用传统的HTTP cookies,因为JPIP与传输层无关。

JPIPKAK驱动程序是使用带有Kakadu缓存对象的HTTP客户端库编写的,并且支持与JPIP服务器的优化通信(可能支持也可能不支持HTTP会话)和Kakadu kdu戋u region戋u解压器的高性能。

Component Diagram

JPIPKAK-实现

该实现支持GDAL C++和C API,并为Java驱动程序提供java驱动程序的初始SWIG包装器( TODO -qGIS示例)。

驱动程序使用一个简单的线程模型来支持请求读取数据和远程获取。这个线程模型支持两个独立的客户端窗口,只有一个到服务器的连接。对服务器的请求被多路复用以有效地利用可用带宽。客户端通过对“优先级”元数据请求选项使用“0”(低)或“1”(高)值来标识这些窗口。

注意:SSL支持

如果客户机构建时支持SSL,那么如果请求是jpips://协议而不是jpip://,则驱动程序将确定是否使用SSL。注意,驱动程序不使用Curl证书束验证服务器证书,并且当前设置为接受所有SSL服务器证书。

注:libCurl

JPIP使用HTTP头设置客户机/服务器值,并对GDAL HTTP可移植性库进行了修改以支持这一点。

GDAL Sequence Diagram

  1. GDALGetDatasetDriver

    获取与此数据集相关的驱动程序。

  2. 正常开放

    如果文件名包含在 GDALOpenInfo 对象具有JPIP或JPIPS的不区分大小写的URI方案 JPIPKAKDataset 创建并初始化,否则返回空值。

  3. 初始化

    初始化涉及到与JPIP服务器建立初始连接,以建立会话并检索有关映像的初始元数据(ref。 JPIP Sequence Diagram

    如果连接失败,则函数返回false,并且 Open 函数返回空值,指示使用此驱动程序打开数据集失败。

    如果连接成功,则会向JPIP服务器发出后续请求,以检索有关映像的所有可用元数据。元数据项使用 GDALMajorObject->SetMetadataItem 在“JPIP”域中。

    如果从服务器返回的元数据包含GeoJP2 UUID框或GMLJP2 XML框,则分析此元数据并设置此数据集的地理元数据。

  4. GDALGetMetadata

    C API到 JPIPKAKDataset->GetMetadata

  5. GetMetadata

    返回“JPIP”域的元数据,键为“JPIP_NQUALITYLAYERS”、“JPIP_NRESOLUTIONLEVELS”、“JPIP_NCOMPS”和“JPIP_SPRECISION”

  6. 格兰异步栅格

    如果异步栅格IO处于活动状态且不是必需的,则C API调用 JPIPKAKDataset->EndAsyncRasterIO

  7. 端异步栅格

    JPIPKakaAsyncRasterio对象被删除

  8. 删除

  9. 格德尔贝吉纳辛克拉斯特里奥

    C API到 JPIPKAKDataset->BeginAsyncRasterIO

  10. 海棠

    客户机已将请求的视图窗口设置为1:1,并可选地设置了放弃级别、质量层和线程优先级元数据项。

  11. 创造

    创建jpipkakaksyncRasterio对象

  12. 起点

    配置kakadu机器并启动后台线程(如果尚未运行)以与服务器通信当前的视图窗口请求。背景线程导致 kdu_cache 对象更新,直到JPIP服务器为当前视图窗口请求发送“响应结束”(EOR)消息。

  13. GDALLockBuffer

    C API到锁缓冲区

  14. LockBuffer

    未在中实现 JPIPKAKAsyncRasterIO ,在中获取锁 JPIPKAKAsyncRasterIO->GetNextUpdatedRegion

  15. GDALGetNextUpdatedRegion

    GetNextUpdatedRegion的C API

  16. GetNextUpdatedRegion

    该函数解压缩可用数据以生成图像(根据中设置的数据集缓冲区类型 JPIPKAKDataset->BeginAsyncRasterIO )解压缩的窗口宽度、高度(在请求的丢弃级别)将返回到区域指针中,并且可以由客户端呈现。呈现操作的状态是 GARIO_PENDING, GARIO_UPDATE, GARIO_ERROR, GARIO_COMPLETEGDALAsyncStatusType 结构。 GARIO_UPDATE, GARIO_PENDING 需要更多的GetNextUpdatedRegion读取才能获得完整的图像数据,这是JPIP的渐进式渲染。 GARIO_COMPLETE 指示窗口已完成。

    GDALAsyncStatusType 是由GetNextUpdatedRegion 指示当kakadu的缓存中有更多数据要解压缩,或者服务器没有发送响应结束(EOR)消息以指示请求窗口已完成时,是否应再次调用该函数。

    传递给此函数的区域是通过引用传递的,调用者可以在结果返回时读取此区域以查找已解压缩的区域。图像数据被打包到缓冲器中,例如,如果请求的区域有3个分量,则为RGB。

  17. GDALUnlockBuffer

    卸载缓冲区的C Api

  18. UnlockBuffer

    未在中实现 JPIPKAKAsyncRasterIO ,在中获取锁 JPIPKAKAsyncRasterIO->GetNextUpdatedRegion

  19. 客户端呈现图像数据

  20. GDALLockBuffer

  21. LockBuffer

  22. GDALGetNextUpdatedRegion

  23. GetNextUpdatedRegion

  24. GDALUnlockBuffer

  25. UnlockBuffer

  26. Draw

JPIPKAK-安装要求

目前只提供了一个Windows makefile,但是它应该在Linux上编译,并且没有Windows依赖项。

也见

NOTES

驱动程序最初由 ITT VIS 并捐赠给GDAL以支持远程JPEG 2000数据集的支持SSL的JPIP客户端流。