diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-08-10 23:01:33 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-09-13 20:22:43 +0200 |
| commit | 040900d195a29f61217caf2d224575793a76ff07 (patch) | |
| tree | 09d4e79abf2f200ef8446ff4bd6af6f4bb5b5177 /src | |
| parent | e8d543c3eaea9468dbb9de6873f510cd42dbd911 (diff) | |
wip: fastvideo decoder building but not linking on deb stable.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/exceptions.cc | 7 | ||||
| -rw-r--r-- | src/lib/exceptions.h | 7 | ||||
| -rw-r--r-- | src/lib/fastvideo.cc | 167 | ||||
| -rw-r--r-- | src/lib/fastvideo.h | 6 |
4 files changed, 187 insertions, 0 deletions
diff --git a/src/lib/exceptions.cc b/src/lib/exceptions.cc index 3991c57b9..4df170717 100644 --- a/src/lib/exceptions.cc +++ b/src/lib/exceptions.cc @@ -138,3 +138,10 @@ VerifyError::VerifyError (string m, int n) } + +FastvideoError::FastvideoError (string s) + : runtime_error (String::compose("Fastvideo error in %1", s)) +{ + +} + diff --git a/src/lib/exceptions.h b/src/lib/exceptions.h index 05cda9659..acb2ea9e6 100644 --- a/src/lib/exceptions.h +++ b/src/lib/exceptions.h @@ -379,4 +379,11 @@ public: {} }; + +class FastvideoError : public std::runtime_error +{ +public: + explicit FastvideoError (std::string s); +}; + #endif diff --git a/src/lib/fastvideo.cc b/src/lib/fastvideo.cc new file mode 100644 index 000000000..0e944191b --- /dev/null +++ b/src/lib/fastvideo.cc @@ -0,0 +1,167 @@ +#include "exceptions.h" +#include "fastvideo.h" +#include <fastvideo_decoder_j2k.h> + + +using boost::shared_ptr; + + +shared_ptr<OpenJPEGImage> +fastvideo_decompess_j2k (dcp::Data data, int reduce) +{ + fastJ2kImageInfo_t info; + fastStatus_t r = fastDecoderJ2kPredecode(&info, data.data().get(), data.size()); + if (r != FAST_OK) { + throw FastvideoError ("J2kPredecode"); + } + + /* Init */ + + fastDecoderJ2kStaticParameters_t parameters; + memset(¶meters, 0, sizeof(fastDecoderJ2kStaticParameters_t)); + + parameters.ResolutionLevels = 5 - reduce; + parameters.verboseLevel = 1; + parameters.enableROI = 0; + + parameters.maxTileHeight = info.width; + parameters.maxTileWidth = info.height; + + parameters.windowX0 = 0; + parameters.windowY0 = 0; + parameters.windowWidth = info.width; + parameters.windowHeight = info.height; + + parameters.truncationLength = 0; + parameters.truncationMode = 0; + parameters.truncationRate = 0; + + parameters.DecodePasses = 0; + parameters.imageInfo = &info; + parameters.maxStreamSize = info.streamSize; + + fastDecoderJ2kHandle_t decoder; + fastDeviceSurfaceBufferHandle_t buffer; + r = fastDecoderJ2kCreate( + &decoder, + ¶meters, + FAST_RGB8, info.width, info.height, + 1, + &buffer + ); + if (r != FAST_OK) { + throw FastvideoError ("J2kCreate"); + } + + unsigned long long requested_mem_size = 0; + + { + unsigned long long component_mem_size = 0; + r = fastDecoderJ2kGetAllocatedGpuMemorySize(decoder, &component_mem_size); + if (r != FAST_OK) { + throw FastvideoError ("J2kGetAllocatedGpuMemorySize"); + } + requested_mem_size += component_mem_size; + } + + fastExportToHostHandle_t adapter; + fastSurfaceFormat_t surface_format; + r = fastExportToHostCreate(&adapter, &surface_format, buffer); + if (r != FAST_OK) { + throw FastvideoError ("ExportToHostCreate"); + } + + { + unsigned int component_mem_size = 0; + r = fastExportToHostGetAllocatedGpuMemorySize(adapter, &component_mem_size); + if (r != FAST_OK) { + throw FastvideoError ("ExportToHostGetAllocatedGpuMemorySize"); + } + requested_mem_size += component_mem_size; + } + + const double gigabyte = 1024.0 * 1024.0 * 1024.0; + printf("\nRequested GPU memory size: %.2lf GB\n", requested_mem_size / gigabyte); + + /* Transform */ + + double total_time = 0; + fastGpuTimerHandle_t device_to_host_timer = 0; + fastGpuTimerCreate(&device_to_host_timer); + + fastDecoderJ2kReport_t report; + + fastExportParameters_t export_parameters; + export_parameters.convert = FAST_CONVERT_NONE; + + int aligned_width = info.width * 3; + aligned_width += 4 - (aligned_width % FAST_ALIGNMENT); + size_t decoded_size = info.height * aligned_width; + uint8_t* decoded = 0; + r = fastMalloc(reinterpret_cast<void**>(&decoded), decoded_size); + if (r != FAST_OK) { + throw FastvideoError ("fastMalloc"); + } + + r = fastDecoderJ2kTransform (decoder, decoded, decoded_size, &report); + if (r != FAST_OK) { + throw FastvideoError ("J2kTransform"); + } + + total_time += report.elapsedTime; + + fastGpuTimerStart(device_to_host_timer); + r = fastExportToHostCopy(adapter, decoded, info.width, aligned_width, info.height, &export_parameters); + if (r != FAST_OK) { + throw FastvideoError ("ExportToHostCopy"); + } + + float elapsed_time_gpu = 0.; + fastGpuTimerStop(device_to_host_timer); + fastGpuTimerGetTime(device_to_host_timer, &elapsed_time_gpu); + + total_time += elapsed_time_gpu / 1000.0; + + if (report.codeblockCount > 0) { + printf("Input image : (%dx%d pixels; %d %d-bit channel(s))\n", info.width, info.height, report.channels, report.bitsPerChannel); + printf("Tile count: %d (%dx%d)\n", report.tileCount, report.tilesX, report.tilesY); + printf("Window mode disabled: decode full image\n"); + printf("Resolution levels: %d\n", report.resolutionLevels); + printf("Codeblock size: %dx%d\n", report.cbX, report.cbY); + + const double megabyte = 1024.0 * 1024.0; + printf("%7.2f ms 1) Tier-2 time (%d codeblocks)\n", report.s1_tier2 * 1000.0, report.codeblockCount); + printf("%7.2f ms 2) CPU->GPU copy time (%.2lf MB, %.2lf MB/s)\n", + report.s2_copy * 1000.0, + report.copyToGpu_size / megabyte, + report.copyToGpu_size == 0 ? 0 : (report.copyToGpu_size / report.s2_copy / megabyte)); + printf("%7.2f ms 3) Tier-1 time\n", report.s3_tier1 * 1000.0); + printf("%7.2f ms 4) DWT time\n", report.s6_dwt * 1000.0); + printf("%7.2f ms 5) Postprocessing time (MCT, DC-shift)\n", report.s7_postprocessing * 1000.0); + printf(" Output size = "); + if (report.outStreamSize < 1024) + printf("%lld bytes", report.outStreamSize); + else + printf("%.0f KB", report.outStreamSize / 1024.0f); + printf(" (%.1f:1)\n", report.outStreamSize == 0 ? 0 : (float)report.outStreamSize / report.inStreamSize); + } + + printf("Total decode time for %d images = %.1f ms; %.1f FPS;\n", 1, + total_time * 1000.0, 1 / total_time); + + fastGpuTimerDestroy(device_to_host_timer); + + /* Close */ + + r = fastDecoderJ2kDestroy(decoder); + if (r != FAST_OK) { + throw FastvideoError ("J2kDestroy"); + } + r = fastExportToHostDestroy(adapter); + if (r != FAST_OK) { + throw FastvideoError ("ExportToHostDestroy"); + } + + fastFree(decoded); +} + diff --git a/src/lib/fastvideo.h b/src/lib/fastvideo.h new file mode 100644 index 000000000..6717bde03 --- /dev/null +++ b/src/lib/fastvideo.h @@ -0,0 +1,6 @@ +#include <dcp/data.h> +#include <boost/shared_ptr.hpp> + +class OpenJPEGImage; + +boost::shared_ptr<OpenJPEGImage> fastvideo_decompess_j2k (dcp::Data data, int reduce); |
