1#include "../build/xcoder_auto_headers.h"
21#define WINDOW_SIZE (MCTF_LOOKBACK + 1 + MCTF_LOOKAHEAD)
22static const int lookback = MCTF_LOOKBACK;
23static const int lookahead = MCTF_LOOKAHEAD;
25typedef struct MCTFContext {
27 uint64_t frame_number;
36 if (separate_metadata) {
37 if ((p_metadata_buffer == NULL) ||
40 if (p_metadata_buffer)
41 free(p_metadata_buffer);
81 memcpy(frame_buffer, src->
p_buffer, frame_size_bytes);
84 dst->
p_buffer = (uint8_t*)frame_buffer;
87 if (src->
p_data[0] != NULL)
89 if (src->
p_data[1] != NULL)
91 if (src->
p_data[2] != NULL)
93 if (src->
p_data[3] != NULL)
101 int mctf_filter_poc = 0;
102 MCTFContext *ctx = (MCTFContext *)(p_ctx->
mctf);
104 if (p_ctx->
frame_num < ctx->frame_number) {
105 return MCTF_RET_EOS_PENDING;
107 return MCTF_RET_EOS_DONE;
112 mctf_filter_poc = ni_mctf_get_filter_poc(ctx->mctf_handle);
113 if ((ctx->frame_number >= mctf_filter_poc && ctx->frame_number - mctf_filter_poc <= lookahead) ||
114 (ctx->frame_number < mctf_filter_poc && mctf_filter_poc - ctx->frame_number <= lookback)) {
120 niYUVFrame ref_frame;
121 int plane_stride[4] = {0};
122 int plane_height[4] = {0};
124 memset(&ref_frame, 0,
sizeof(niYUVFrame));
126 for (
int i = 0; i < 3; i++) {
127 ref_frame.planes[i].ptr = ni_frame->
p_data[i];
128 ref_frame.planes[i].width = source_width;
129 ref_frame.planes[i].height = plane_height[i];
130 ref_frame.planes[i].stride = plane_stride[i];
133 ref_frame.planes[i].width /= 2;
139 ni_mctf_buffer_ref_frame(ctx->mctf_handle, &ref_frame, ctx->frame_number);
141 if ((ctx->frame_number >= mctf_filter_poc) && (ctx->frame_number - mctf_filter_poc < lookahead)) {
144 int idx = (ctx->frame_number - mctf_filter_poc);
145 copy_ni_frame(&(ctx->frameBuffer[idx]), ni_frame);
146 ret = MCTF_RET_BUFFERED;
147 }
else if (ctx->frame_number == (mctf_filter_poc + lookahead)) {
149 niYUVFrame filtered_frame;
150 memset(&filtered_frame, 0,
sizeof(niYUVFrame));
152 for (
int i = 0; i < 3; i++) {
153 filtered_frame.planes[i].ptr = ctx->frameBuffer[0].p_data[i];
154 filtered_frame.planes[i].width = source_width;
155 filtered_frame.planes[i].height = plane_height[i];
156 filtered_frame.planes[i].stride = plane_stride[i];
159 filtered_frame.planes[i].width /= 2;
163 ni_mctf_process_directly (ctx->mctf_handle, &filtered_frame);
164 ret = MCTF_RET_FILTERED;
166 ret = MCTF_RET_LOOKBACK_REF;
169 ret = MCTF_RET_NOT_REF;
179 MCTFContext *ctx = (MCTFContext *)(p_ctx->
mctf);
181 int idx = lookahead - waitCnt;
182 if (ctx && ctx->frameBuffer[idx].p_buffer) {
183 ni_frame_t *result_frame = &(ctx->frameBuffer[idx]);
192 MCTFContext *ctx = (MCTFContext *)calloc(1,
sizeof(MCTFContext));
197 ctx->mctf_handle = ni_mctf_handle_create();
198 if (!ctx->mctf_handle) {
204 MCTF_PERIOD, MCTF_LOOKBACK, MCTF_LOOKAHEAD, WINDOW_SIZE)) {
205 ni_mctf_handle_release(ctx->mctf_handle);
219 MCTFContext *ctx = (MCTFContext *)p_ctx->
mctf;
220 for (
int i = 0; i < lookahead; i++) {
223 ni_mctf_handle_release(ctx->mctf_handle);
ni_retcode_t ni_frame_buffer_free(ni_frame_t *p_frame)
Free frame buffer that was previously allocated with either ni_frame_buffer_alloc or ni_encoder_frame...
void ni_log(ni_log_level_t level, const char *fmt,...)
print log message using ni_log_callback
int ni_posix_memalign(void **memptr, size_t alignment, size_t size)
Allocate aligned memory.
void ni_get_hw_yuv420p_dim(int width, int height, int factor, int is_semiplanar, int plane_stride[NI_MAX_NUM_DATA_POINTERS], int plane_height[NI_MAX_NUM_DATA_POINTERS])
Get dimension information of Netint HW YUV420p frame to be sent to encoder for encoding....
uint32_t data_len[NI_MAX_NUM_DATA_POINTERS]
uint32_t start_buffer_size
uint8_t separate_metadata
uint32_t metadata_buffer_size
uint8_t * p_data[NI_MAX_NUM_DATA_POINTERS]
unsigned int extra_data_len
uint8_t * p_metadata_buffer
uint32_t active_video_width
uint32_t active_video_height