-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathencoder.cpp
More file actions
112 lines (98 loc) · 3.92 KB
/
encoder.cpp
File metadata and controls
112 lines (98 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "encoder.h"
#include "cuvid/NvEncoder/NvEncoderCuda.h"
#include "cuvid/Utils/NvCodecUtils.h"
#include "cuvid/Utils/FFmpegDemuxer.h"
#include "cuvid/Utils/ColorSpace.h"
#include "cuvid/AppDecUtils.h"
#include "cuvid/Utils/NvEncoderCLIOptions.h"
#include "cuvid/nvEncodeAPI.h"
#define ENC(handle) ((NvEncoderCuda*)(handle->enc))
void _InitializeEncoder(NvEncoder* pEnc, NvEncoderInitParam encodeCLIOptions, NV_ENC_BUFFER_FORMAT eFormat)
{
NV_ENC_INITIALIZE_PARAMS initializeParams = { NV_ENC_INITIALIZE_PARAMS_VER };
NV_ENC_CONFIG encodeConfig = { NV_ENC_CONFIG_VER };
initializeParams.encodeConfig = &encodeConfig;
pEnc->CreateDefaultEncoderParams(&initializeParams, encodeCLIOptions.GetEncodeGUID(), encodeCLIOptions.GetPresetGUID(), encodeCLIOptions.GetTuningInfo());
encodeCLIOptions.SetInitParams(&initializeParams, eFormat);
pEnc->CreateEncoder(&initializeParams);
}
videoEncoderHandle videoEncoder_init(int width, int height, char* params){
videoEncoderHandle handle = (videoEncoderHandle)malloc(sizeof(videoEncoder));
ck(cuInit(0));
handle->cuContext = nullptr;
createCudaContext(&(handle->cuContext), 0, 0);
handle->enc = new NvEncoderCuda(handle->cuContext, width, height, NV_ENC_BUFFER_FORMAT_ARGB);
NV_ENC_BUFFER_FORMAT eFormat = NV_ENC_BUFFER_FORMAT_ARGB;
NvEncoderInitParam encodeCLIOptions(params);
_InitializeEncoder(ENC(handle), encodeCLIOptions, eFormat);
return handle;
}
int videoEncoder_destroy(videoEncoderHandle handle){
ENC(handle)->DestroyEncoder();
delete(ENC(handle));
cuCtxDestroy(handle->cuContext);
handle->cuContext = nullptr;
handle->enc = nullptr;
return 0;
}
videoEncodedBuffer* videoEncoder_encode_end(videoEncoderHandle handle){
std::vector<std::vector<uint8_t>> vPacket;
ENC(handle)->EndEncode(vPacket);
int currentSize = 0;
for (std::vector<uint8_t> &packet : vPacket){
currentSize += packet.size();
}
if(currentSize == 0){
return NULL;
}
videoEncodedBuffer* buffer = videoEncodedBuffer_init(currentSize);
currentSize = 0;
for (std::vector<uint8_t> &packet : vPacket){
memcpy(buffer->data+currentSize, reinterpret_cast<char*>(packet.data()), packet.size());
currentSize+=packet.size();
}
return buffer;
}
videoEncodedBuffer* videoEncoder_encode(videoEncoderHandle handle, u_int8_t* in){
std::vector<std::vector<uint8_t>> vPacket;
const NvEncInputFrame* encoderInputFrame = ENC(handle)->GetNextInputFrame();
NvEncoderCuda::CopyToDeviceFrame(handle->cuContext, in, ENC(handle)->GetWidthInBytes(NV_ENC_BUFFER_FORMAT_ARGB,ENC(handle)->GetEncodeWidth()), (CUdeviceptr)encoderInputFrame->inputPtr,
(int)encoderInputFrame->pitch,
ENC(handle)->GetEncodeWidth(),
ENC(handle)->GetEncodeHeight(),
CU_MEMORYTYPE_HOST,
encoderInputFrame->bufferFormat,
encoderInputFrame->chromaOffsets,
encoderInputFrame->numChromaPlanes);
ENC(handle)->EncodeFrame(vPacket);
int currentSize = 0;
for (std::vector<uint8_t> &packet : vPacket){
currentSize += packet.size();
}
if(currentSize == 0){
return NULL;
}
videoEncodedBuffer* buffer = videoEncodedBuffer_init(currentSize);
currentSize = 0;
for (std::vector<uint8_t> &packet : vPacket){
memcpy(buffer->data+currentSize, reinterpret_cast<char*>(packet.data()), packet.size());
currentSize+=packet.size();
}
return buffer;
}
void videoEncodedBuffer_destory(videoEncodedBuffer** buffer){
if(*buffer == NULL){
if((*buffer)->data != NULL){
free((*buffer)->data);
(*buffer)->data = NULL;
}
free(*buffer);
(*buffer) = NULL;
}
}
videoEncodedBuffer* videoEncodedBuffer_init(int size){
videoEncodedBuffer* frame = (videoEncodedBuffer*)malloc(sizeof(videoEncodedBuffer));
frame->size = size;
frame->data = (u_int8_t*)malloc(frame->size);
return frame;
}