|
@@ -34,7 +34,6 @@ struct video_encoder::impl {
|
|
|
|
|
|
|
|
// frame related
|
|
// frame related
|
|
|
void *frame_ptr = nullptr, **output_ptr = nullptr;
|
|
void *frame_ptr = nullptr, **output_ptr = nullptr;
|
|
|
- size_t *output_size = nullptr;
|
|
|
|
|
NV_ENC_REGISTERED_PTR frame_reg_ptr = nullptr;
|
|
NV_ENC_REGISTERED_PTR frame_reg_ptr = nullptr;
|
|
|
|
|
|
|
|
bool initialize() {
|
|
bool initialize() {
|
|
@@ -168,9 +167,11 @@ struct video_encoder::impl {
|
|
|
// copy bitstream
|
|
// copy bitstream
|
|
|
assert(output_ptr != nullptr);
|
|
assert(output_ptr != nullptr);
|
|
|
assert(output_size != nullptr);
|
|
assert(output_size != nullptr);
|
|
|
- *output_ptr = malloc(lock_config.bitstreamSizeInBytes);
|
|
|
|
|
- *output_size = lock_config.bitstreamSizeInBytes;
|
|
|
|
|
- memcpy(*output_ptr, lock_config.bitstreamBufferPtr, lock_config.bitstreamSizeInBytes);
|
|
|
|
|
|
|
+ *output_ptr = malloc(lock_config.bitstreamSizeInBytes + sizeof(size_t));
|
|
|
|
|
+ auto &output_size = *(size_t *) ((char *) *output_ptr + 0);
|
|
|
|
|
+ auto output_data = (char *) *output_ptr + sizeof(size_t);
|
|
|
|
|
+ output_size = lock_config.bitstreamSizeInBytes;
|
|
|
|
|
+ memcpy(output_data, lock_config.bitstreamBufferPtr, lock_config.bitstreamSizeInBytes);
|
|
|
|
|
|
|
|
// cleanup
|
|
// cleanup
|
|
|
NVENC_API_CHECK(api.nvEncUnlockBitstream(encoder, output_buf));
|
|
NVENC_API_CHECK(api.nvEncUnlockBitstream(encoder, output_buf));
|
|
@@ -205,7 +206,7 @@ void video_encoder::stop_encode() {
|
|
|
pimpl->cleanup();
|
|
pimpl->cleanup();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-bool video_encoder::encode_frame(void *frame_ptr, void **output_ptr, size_t *output_size) {
|
|
|
|
|
|
|
+bool video_encoder::encode_frame(void *frame_ptr, void **output_ptr) {
|
|
|
// register frame ptr
|
|
// register frame ptr
|
|
|
if (pimpl->frame_ptr != frame_ptr) {
|
|
if (pimpl->frame_ptr != frame_ptr) {
|
|
|
pimpl->unregister_frame_ptr();
|
|
pimpl->unregister_frame_ptr();
|
|
@@ -214,17 +215,16 @@ bool video_encoder::encode_frame(void *frame_ptr, void **output_ptr, size_t *out
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pimpl->output_ptr = output_ptr;
|
|
pimpl->output_ptr = output_ptr;
|
|
|
- pimpl->output_size = output_size;
|
|
|
|
|
return pimpl->encode_frame();
|
|
return pimpl->encode_frame();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-bool video_encoder::encode_frame(cudaGraphicsResource *res, void **output_ptr, size_t *output_size) {
|
|
|
|
|
|
|
+bool video_encoder::encode_frame(cudaGraphicsResource *res, void **output_ptr) {
|
|
|
void *pbo_ptr;
|
|
void *pbo_ptr;
|
|
|
size_t pbo_size;
|
|
size_t pbo_size;
|
|
|
CUDA_API_CHECK(cudaGraphicsMapResources(1, &res));
|
|
CUDA_API_CHECK(cudaGraphicsMapResources(1, &res));
|
|
|
CUDA_API_CHECK(cudaGraphicsResourceGetMappedPointer(&pbo_ptr, &pbo_size, res));
|
|
CUDA_API_CHECK(cudaGraphicsResourceGetMappedPointer(&pbo_ptr, &pbo_size, res));
|
|
|
assert(pbo_size == pimpl->frame_pitch * pimpl->frame_height);
|
|
assert(pbo_size == pimpl->frame_pitch * pimpl->frame_height);
|
|
|
- CALL_CHECK(encode_frame(pbo_ptr, output_ptr, output_size));
|
|
|
|
|
|
|
+ CALL_CHECK(encode_frame(pbo_ptr, output_ptr));
|
|
|
CUDA_API_CHECK(cudaGraphicsUnmapResources(1, &res));
|
|
CUDA_API_CHECK(cudaGraphicsUnmapResources(1, &res));
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|