libxcoder  5.2.0
ni_generic_utils.h
Go to the documentation of this file.
1 /*******************************************************************************
2  *
3  * Copyright (C) 2022 NETINT Technologies
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18  * SOFTWARE.
19  *
20  ******************************************************************************/
21 
22 /*!*****************************************************************************
23  * \file generic_utils.h
24  *
25  * \brief Miscellaneous utility functions shared by Libxcoder API examples
26  ******************************************************************************/
27 
28 #pragma once
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include "ni_device_api.h"
37 
38 #ifdef _WIN32
39 #define open _open
40 #define close _close
41 #define read _read
42 #define write _write
43 #define lseek _lseek
44 #endif
45 
46 #define FILE_NAME_LEN 256
47 #define MAX_INPUT_FILES 3
48 #define MAX_OUTPUT_FILES 4
49 
50 #define NI_TEST_RETCODE_FAILURE -1
51 #define NI_TEST_RETCODE_SUCCESS 0
52 #define NI_TEST_RETCODE_END_OF_STREAM 1
53 #define NI_TEST_RETCODE_EAGAIN 2
54 #define NI_TEST_RETCODE_NEXT_INPUT 3
55 #define NI_TEST_RETCODE_SEQ_CHANGE_DONE 4
56 
57 #define NI_ALIGN(x, a) (((x)+(a)-1)&~((a)-1))
58 
59 // max YUV frame size
60 #define MAX_YUV_FRAME_SIZE (7680 * 4320 * 3)
61 
62 // H264
63 #define MAX_LOG2_MAX_FRAME_NUM (12 + 4)
64 #define MIN_LOG2_MAX_FRAME_NUM 4
65 #define EXTENDED_SAR 255
66 #define QP_MAX_NUM (51 + 6 * 6) // The maximum supported qp
67 #define NI_MAX_BUFFERED_FRAME 45
68 
69 #define HEVC_MAX_SUB_LAYERS 7
70 #define HEVC_MAX_SHORT_TERM_REF_PIC_SETS 64
71 #define HEVC_MAX_LONG_TERM_REF_PICS 32
72 #define HEVC_MAX_SPS_COUNT 16
73 #define HEVC_MAX_REFS 16
74 #define HEVC_MAX_LOG2_CTB_SIZE 6
75 
76 typedef enum
77 {
78  NI_SW_PIX_FMT_NONE = -1, /* invalid format */
79  NI_SW_PIX_FMT_YUV444P, /* 8-bit YUV444 planar */
80  NI_SW_PIX_FMT_YUV444P10LE, /* 10-bit YUV444 planar */
82 
83 typedef struct _ni_pix_fmt_name
84 {
85  const char *name;
88 
89 typedef struct _ni_gc620_pix_fmt
90 {
94 
95 // simplistic ref counted HW frame
96 typedef struct _ni_hwframe_ref_t
97 {
98  int ref_cnt;
101 
102 typedef struct _ni_test_frame_list
103 {
105  int head;
106  int tail;
108 
109 typedef struct _ni_demo_context
110 {
112 
113  // read input files
114  uint8_t *file_cache;
116  uint64_t total_file_size;
117  uint64_t loops_left;
118 
119  // target fps at which YUV input is read
121 
122  // bookkeeping counters
123  uint8_t curr_enc_index;
131  uint64_t reconfig_count;
132  uint64_t start_time;
133 
134  // av1-specific variables
138  uint8_t av1_output_obu;
140 
141  // trackers for current state of decoder/encoder
150 
151 typedef struct uploader_param
152 {
160  int pfs;
161  void *yuv_buf;
162  unsigned long *p_total_bytes_sent;
166 
167 void print_version(void);
168 
169 int is_ni_enc_pix_fmt(ni_pix_fmt_t pix_fmt);
170 ni_pix_fmt_t ni_pixel_format_search(const char *name);
171 const char *ni_pixel_format_name(ni_pix_fmt_t pix_fmt);
172 int ni_to_gc620_pix_fmt(ni_pix_fmt_t pix_fmt);
173 ni_pix_fmt_t gc620_to_ni_pix_fmt(int pix_fmt);
175 
183 
184 uint64_t get_total_file_size(FILE* fp);
185 int read_and_cache_file(ni_demo_context_t *ctx, char *filename);
187 void rewind_data_buf_pos_by(ni_demo_context_t *p_ctx, uint64_t nb_bytes);
188 int frame_read_buffer_size(int w, int h, ni_pix_fmt_t pix_fmt,
189  ni_sw_pix_fmt_t sw_pix_fmt);
190 uint32_t read_next_chunk_from_file(ni_demo_context_t *p_ctx, FILE *pfs, uint8_t *p_dst, uint32_t to_read);
191 int read_yuv_from_file(ni_demo_context_t *p_ctx, FILE *pfs, void *yuv_buf, int width, int height,
192  ni_pix_fmt_t pix_fmt, ni_sw_pix_fmt_t sw_pix_fmt,
193  int *eos, ni_session_run_state_t run_state);
194 
196  void *yuv_buf, int width, int height,
197  ni_sw_pix_fmt_t sw_pix_fmt, int mode,
198  ni_codec_format_t codec_format);
199 
200 int write_rawvideo_data(FILE *p_file, int input_aligned_width, int input_aligned_height,
201  int output_width, int output_height, int format, ni_frame_t *p_out_frame);
202 
204 void ni_hw_frame_ref(const niFrameSurface1_t *p_surface);
205 void ni_hw_frame_unref(uint16_t hwframe_index);
206 
207 
209  ni_session_data_io_t *p_session_data, ni_frame_t *p_src_frame,
210  int output_format);
212  ni_session_data_io_t *p_swin_data, //intermediate for swf
213  ni_session_data_io_t *p_in_data,
214  int input_video_width, int input_video_height,
215  void *yuv_buf);
216 int uploader_open_session(ni_session_context_t *p_upl_ctx, int iXcoderGUID,
217  int width, int height, ni_pix_fmt_t pix_fmt,
218  int is_p2p, int pool_size);
220  ni_session_context_t *p_upl_ctx,
221  ni_session_context_t *p_sca_ctx,
222  ni_session_data_io_t *p_sw_data,
223  ni_session_data_io_t *p_hw_data,
224  ni_session_data_io_t *p_scale_data,
225  ni_pix_fmt_t pix_fmt, int width,
226  int height, FILE *pfs, void *yuv_buf, int *eos);
227 
228 #ifdef __cplusplus
229 }
230 #endif
ni_pix_fmt_name_t
struct _ni_pix_fmt_name ni_pix_fmt_name_t
ni_pixel_format_search
ni_pix_fmt_t ni_pixel_format_search(const char *name)
Definition: ni_generic_utils.c:87
_ni_demo_context::ivf_header_written
uint8_t ivf_header_written
Definition: ni_generic_utils.h:139
_ni_gc620_pix_fmt
Definition: ni_generic_utils.h:89
_ni_demo_context::av1_muxed_num_packets
uint32_t av1_muxed_num_packets[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:135
_ni_demo_context::loops_left
uint64_t loops_left
Definition: ni_generic_utils.h:117
ni_pix_fmt_t
ni_pix_fmt_t
Definition: ni_device_api.h:260
uploader_param::p_upl_ctx
ni_session_context_t * p_upl_ctx
Definition: ni_generic_utils.h:154
_ni_gc620_pix_fmt::pix_fmt_ni
ni_pix_fmt_t pix_fmt_ni
Definition: ni_generic_utils.h:91
uploader_param::p_swin_frame
ni_session_data_io_t * p_swin_frame
Definition: ni_generic_utils.h:156
scan_and_clean_hwdescriptors
int scan_and_clean_hwdescriptors(void)
Definition: ni_generic_utils.c:635
gc620_to_ni_pix_fmt
ni_pix_fmt_t gc620_to_ni_pix_fmt(int pix_fmt)
Definition: ni_generic_utils.c:132
_ni_gc620_pix_fmt::pix_fmt_gc620
int pix_fmt_gc620
Definition: ni_generic_utils.h:92
_ni_pix_fmt_name
Definition: ni_generic_utils.h:83
ni_hwframe_ref_t
struct _ni_hwframe_ref_t ni_hwframe_ref_t
_ni_demo_context::total_file_size
uint64_t total_file_size
Definition: ni_generic_utils.h:116
_ni_hwframe_ref_t
Definition: ni_generic_utils.h:96
ni_pixel_format_name
const char * ni_pixel_format_name(ni_pix_fmt_t pix_fmt)
Definition: ni_generic_utils.c:102
uploader_param::input_video_height
int input_video_height
Definition: ni_generic_utils.h:159
_ni_hwframe_ref_t::surface
niFrameSurface1_t surface
Definition: ni_generic_utils.h:99
MAX_OUTPUT_FILES
#define MAX_OUTPUT_FILES
Definition: ni_generic_utils.h:48
hwdl_frame
int hwdl_frame(ni_session_context_t *p_ctx, ni_session_data_io_t *p_session_data, ni_frame_t *p_src_frame, int output_format)
Download hw frames by HwDesc.
Definition: ni_generic_utils.c:709
frame_list_is_empty
bool frame_list_is_empty(ni_test_frame_list_t *list)
Definition: ni_generic_utils.c:175
_ni_demo_context::p_av1_seq_header
uint8_t * p_av1_seq_header[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:136
_ni_demo_context::dec_eos_received
int dec_eos_received
Definition: ni_generic_utils.h:144
uploader_param::pool_size
int pool_size
Definition: ni_generic_utils.h:163
_ni_demo_context::end_all_threads
uint8_t end_all_threads
Definition: ni_generic_utils.h:111
_ni_demo_context::enc_sos_sent
int enc_sos_sent[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:146
frame_read_buffer_size
int frame_read_buffer_size(int w, int h, ni_pix_fmt_t pix_fmt, ni_sw_pix_fmt_t sw_pix_fmt)
Definition: ni_generic_utils.c:335
_ni_demo_context::curr_file_offset
uint64_t curr_file_offset
Definition: ni_generic_utils.h:115
uploader_frame_list_full
bool uploader_frame_list_full(ni_test_frame_list_t *list, ni_pix_fmt_t pix_fmt)
Definition: ni_generic_utils.c:185
uploader_param::yuv_buf
void * yuv_buf
Definition: ni_generic_utils.h:161
_ni_demo_context::dec_eos_sent
int dec_eos_sent
Definition: ni_generic_utils.h:143
_ni_test_frame_list
Definition: ni_generic_utils.h:102
uploader_param
Definition: ni_generic_utils.h:151
NI_SW_PIX_FMT_NONE
@ NI_SW_PIX_FMT_NONE
Definition: ni_generic_utils.h:78
ni_demo_context_t
struct _ni_demo_context ni_demo_context_t
_ni_demo_context
Definition: ni_generic_utils.h:109
uploader_param::frame_list
ni_test_frame_list_t * frame_list
Definition: ni_generic_utils.h:164
read_yuv_from_file
int read_yuv_from_file(ni_demo_context_t *p_ctx, FILE *pfs, void *yuv_buf, int width, int height, ni_pix_fmt_t pix_fmt, ni_sw_pix_fmt_t sw_pix_fmt, int *eos, ni_session_run_state_t run_state)
Definition: ni_generic_utils.c:413
_ni_test_frame_list::tail
int tail
Definition: ni_generic_utils.h:106
_ni_demo_context::num_frames_received
uint64_t num_frames_received
Definition: ni_generic_utils.h:128
print_version
void print_version(void)
Definition: ni_generic_utils.c:70
_ni_demo_context::enc_eos_sent
int enc_eos_sent[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:147
hwframe_list_release
void hwframe_list_release(ni_test_frame_list_t *list)
Definition: ni_generic_utils.c:231
_ni_demo_context::enc_resend
int enc_resend[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:145
uploader_param::pfs
int pfs
Definition: ni_generic_utils.h:160
_ni_test_frame_list::head
int head
Definition: ni_generic_utils.h:105
_ni_demo_context::dec_sos_sent
int dec_sos_sent
Definition: ni_generic_utils.h:142
ni_gc620_pix_fmt_t
struct _ni_gc620_pix_fmt ni_gc620_pix_fmt_t
get_total_file_size
uint64_t get_total_file_size(FILE *fp)
Definition: ni_generic_utils.c:250
uploader_open_session
int uploader_open_session(ni_session_context_t *p_upl_ctx, int iXcoderGUID, int width, int height, ni_pix_fmt_t pix_fmt, int is_p2p, int pool_size)
Uploader session open.
Definition: ni_generic_utils.c:894
_ni_session_data_io
Definition: ni_device_api.h:2866
ni_to_gc620_pix_fmt
int ni_to_gc620_pix_fmt(ni_pix_fmt_t pix_fmt)
Definition: ni_generic_utils.c:117
frame_list_length
int frame_list_length(ni_test_frame_list_t *list)
Definition: ni_generic_utils.c:203
_ni_demo_context::num_frames_sent
uint64_t num_frames_sent[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:129
_ni_pix_fmt_name::name
const char * name
Definition: ni_generic_utils.h:85
ni_test_frame_list_t
struct _ni_test_frame_list ni_test_frame_list_t
ni_hw_frame_ref
void ni_hw_frame_ref(const niFrameSurface1_t *p_surface)
Definition: ni_generic_utils.c:658
_ni_test_frame_list::frames
ni_session_data_io_t frames[NI_MAX_BUFFERED_FRAME]
Definition: ni_generic_utils.h:104
frame_list_enqueue
int frame_list_enqueue(ni_test_frame_list_t *list)
Definition: ni_generic_utils.c:209
NI_SW_PIX_FMT_YUV444P10LE
@ NI_SW_PIX_FMT_YUV444P10LE
Definition: ni_generic_utils.h:80
uploader_param::input_video_width
int input_video_width
Definition: ni_generic_utils.h:158
get_pixel_planar
ni_pixel_planar_format get_pixel_planar(ni_pix_fmt_t pix_fmt)
Definition: ni_generic_utils.c:147
frame_list_is_full
bool frame_list_is_full(ni_test_frame_list_t *list)
Definition: ni_generic_utils.c:180
_ni_session_context
Definition: ni_device_api.h:1408
_niFrameSurface1
Definition: ni_device_api.h:2793
NI_MAX_BUFFERED_FRAME
#define NI_MAX_BUFFERED_FRAME
Definition: ni_generic_utils.h:67
_ni_frame
Definition: ni_device_api.h:2601
uploader_param::p_total_bytes_sent
unsigned long * p_total_bytes_sent
Definition: ni_generic_utils.h:162
ni_pixel_planar_format
enum _ni_pixel_planar_format ni_pixel_planar_format
ni_session_run_state_t
enum _ni_session_run_state ni_session_run_state_t
Session running state type.
_ni_demo_context::start_time
uint64_t start_time
Definition: ni_generic_utils.h:132
_ni_demo_context::file_cache
uint8_t * file_cache
Definition: ni_generic_utils.h:114
_ni_demo_context::dec_total_bytes_sent
uint64_t dec_total_bytes_sent
Definition: ni_generic_utils.h:124
NI_SW_PIX_FMT_YUV444P
@ NI_SW_PIX_FMT_YUV444P
Definition: ni_generic_utils.h:79
ni_sw_pix_fmt_t
ni_sw_pix_fmt_t
Definition: ni_generic_utils.h:76
_ni_hwframe_ref_t::ref_cnt
int ref_cnt
Definition: ni_generic_utils.h:98
is_ni_enc_pix_fmt
int is_ni_enc_pix_fmt(ni_pix_fmt_t pix_fmt)
Definition: ni_generic_utils.c:81
_ni_demo_context::enc_total_bytes_sent
uint64_t enc_total_bytes_sent[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:126
_ni_demo_context::av1_seq_header_len
uint32_t av1_seq_header_len[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:137
frame_list_drain
int frame_list_drain(ni_test_frame_list_t *list)
Definition: ni_generic_utils.c:219
uploader_param::p_scale_frame
ni_session_data_io_t * p_scale_frame
Definition: ni_generic_utils.h:157
uploader_param::p_ctx
ni_demo_context_t * p_ctx
Definition: ni_generic_utils.h:153
_ni_demo_context::dec_total_bytes_received
uint64_t dec_total_bytes_received
Definition: ni_generic_utils.h:125
uploader_param::p_sca_ctx
ni_session_context_t * p_sca_ctx
Definition: ni_generic_utils.h:155
read_next_chunk_from_file
uint32_t read_next_chunk_from_file(ni_demo_context_t *p_ctx, FILE *pfs, uint8_t *p_dst, uint32_t to_read)
Definition: ni_generic_utils.c:375
upload_send_data_get_desc
int upload_send_data_get_desc(ni_demo_context_t *p_ctx, ni_session_context_t *p_upl_ctx, ni_session_data_io_t *p_swin_data, ni_session_data_io_t *p_in_data, int input_video_width, int input_video_height, void *yuv_buf)
Read from input file, upload to encoder, retrieve HW descriptor.
Definition: ni_generic_utils.c:742
_ni_demo_context::reconfig_count
uint64_t reconfig_count
Definition: ni_generic_utils.h:131
reset_data_buf_pos
void reset_data_buf_pos(ni_demo_context_t *p_ctx)
Definition: ni_generic_utils.c:316
write_rawvideo_data
int write_rawvideo_data(FILE *p_file, int input_aligned_width, int input_aligned_height, int output_width, int output_height, int format, ni_frame_t *p_out_frame)
Write hwdl data to files.
Definition: ni_generic_utils.c:510
_ni_demo_context::num_packets_received
uint64_t num_packets_received[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:130
uploader_param_t
struct uploader_param uploader_param_t
_ni_demo_context::read_framerate
int read_framerate
Definition: ni_generic_utils.h:120
_ni_demo_context::enc_eos_received
int enc_eos_received[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:148
ni_device_api.h
Public definitions for operating NETINT video processing devices for video processing.
_ni_pix_fmt_name::pix_fmt
ni_pix_fmt_t pix_fmt
Definition: ni_generic_utils.h:86
hwupload_frame
niFrameSurface1_t * hwupload_frame(ni_demo_context_t *p_ctx, ni_session_context_t *p_upl_ctx, ni_session_context_t *p_sca_ctx, ni_session_data_io_t *p_sw_data, ni_session_data_io_t *p_hw_data, ni_session_data_io_t *p_scale_data, ni_pix_fmt_t pix_fmt, int width, int height, FILE *pfs, void *yuv_buf, int *eos)
Definition: ni_generic_utils.c:937
_ni_demo_context::av1_output_obu
uint8_t av1_output_obu
Definition: ni_generic_utils.h:138
ni_codec_format_t
enum _ni_codec_format ni_codec_format_t
This is an enumeration for supported codec formats.
ni_hw_frame_unref
void ni_hw_frame_unref(uint16_t hwframe_index)
Definition: ni_generic_utils.c:679
read_and_cache_file
int read_and_cache_file(ni_demo_context_t *ctx, char *filename)
Definition: ni_generic_utils.c:259
convert_yuv_444p_to_420p
int convert_yuv_444p_to_420p(ni_session_data_io_t *p_frame, void *yuv_buf, int width, int height, ni_sw_pix_fmt_t sw_pix_fmt, int mode, ni_codec_format_t codec_format)
Definition: ni_generic_utils.c:448
_ni_demo_context::enc_total_bytes_received
uint64_t enc_total_bytes_received[MAX_OUTPUT_FILES]
Definition: ni_generic_utils.h:127
_ni_demo_context::curr_enc_index
uint8_t curr_enc_index
Definition: ni_generic_utils.h:123
rewind_data_buf_pos_by
void rewind_data_buf_pos_by(ni_demo_context_t *p_ctx, uint64_t nb_bytes)
Definition: ni_generic_utils.c:322