PeriDyno 1.0.0
Loading...
Searching...
No Matches
ImageEncoder.cpp
Go to the documentation of this file.
1#include "ImageEncoder.h"
2#include <nvjpeg.h>
3
4
5template <typename T>
6void check(T result, char const* const func, const char* const file,
7 int const line) {
8 if (result) {
9 fprintf(stderr, "CUDA error at %s:%d code=%d \"%s\" \n", file, line,
10 static_cast<unsigned int>(result), func);
11 exit(-1);
12 }
13}
14
15#define checkCudaErrors(val) check((val), #val, __FILE__, __LINE__)
16
18{
19 checkCudaErrors(nvjpegCreateSimple(&nvjpegHandle));
20 checkCudaErrors(nvjpegEncoderStateCreate(nvjpegHandle, &encoderState, NULL));
21 checkCudaErrors(nvjpegEncoderParamsCreate(nvjpegHandle, &encodeParams, NULL));
22 // default parameters
23 checkCudaErrors(nvjpegEncoderParamsSetQuality(encodeParams, 70, NULL));
24 //checkCudaErrors(nvjpegEncoderParamsSetOptimizedHuffman(encodeParams, 0, NULL));
25 checkCudaErrors(nvjpegEncoderParamsSetSamplingFactors(encodeParams, NVJPEG_CSS_420, NULL));
26
27 // initialize buffer
28 cudaBuffer.size = 1920 * 1080 * 3;
29 checkCudaErrors(cudaMalloc(&cudaBuffer.ptr, cudaBuffer.size));
30}
31
33{
34 checkCudaErrors(nvjpegEncoderParamsDestroy(encodeParams));
35 checkCudaErrors(nvjpegEncoderStateDestroy(encoderState));
36 checkCudaErrors(nvjpegDestroy(nvjpegHandle));
37
38 checkCudaErrors(cudaFree(cudaBuffer.ptr));
39}
40
42{
43 checkCudaErrors(nvjpegEncoderParamsSetQuality(encodeParams, quality, NULL));
44}
45
46
47unsigned long ImageEncoderNV::Encode(const unsigned char* data,
48 int width, int height, int pitch,
49 std::vector<unsigned char>& buffer)
50{
51 // reallocate image buffer
52 size_t bytes = width * height * 3;
53 if (bytes > cudaBuffer.size) {
54 cudaBuffer.size = bytes;
55 checkCudaErrors(cudaFree(cudaBuffer.ptr));
56 checkCudaErrors(cudaMalloc(&cudaBuffer.ptr, cudaBuffer.size));
57 };
58
59 checkCudaErrors(cudaMemcpy(cudaBuffer.ptr, data, bytes, cudaMemcpyHostToDevice));
60
61 nvjpegImage_t nv_image;
62 nv_image.channel[0] = (unsigned char*)cudaBuffer.ptr;
63 nv_image.pitch[0] = width * 3;
64
66 &nv_image, NVJPEG_INPUT_RGBI, width, height, NULL));
67
68 size_t length;
69 checkCudaErrors(nvjpegEncodeRetrieveBitstream(nvjpegHandle, encoderState, NULL, &length, NULL));
70
71 // get stream itself
72 //checkCudaErrors(cudaStreamSynchronize(stream));
73
74 if (buffer.size() < length) buffer.resize(length);
75
76 checkCudaErrors(nvjpegEncodeRetrieveBitstream(nvjpegHandle, encoderState, buffer.data(), &length, NULL));
77
78 // write stream to file
79 //checkCudaErrors(cudaStreamSynchronize(stream));
80
81 return length;
82}
void check(T result, char const *const func, const char *const file, int const line)
#define checkCudaErrors(val)
nvjpegHandle * nvjpegHandle
virtual unsigned long Encode(const unsigned char *data, int width, int height, int pitch, std::vector< unsigned char > &buffer) override
virtual void SetQuality(int quality) override
nvjpegEncoderState * encoderState
struct ImageEncoderNV::@073055035047302167172074165363320122204367031221 cudaBuffer
nvjpegEncoderParams * encodeParams
#define T(t)