 |
libxcoder
5.4.0
|
Go to the documentation of this file.
38 #elif __linux__ || __APPLE__
43 static void print_usage(
void)
46 "Multi-threaded video transcoding demo application directly using Netint Libxcoder version %s\n"
47 "Usage: ni_xcoder_multithread_transcode [options]\n"
50 "-h | --help Show this message.\n"
51 "-v | --version Print version info.\n"
52 "-i | --input (Required) Input file path.\n"
53 "-o | --output (Required) Output file path.\n"
54 " Can be specified multiple (max %d) times\n"
55 " to run multiple encoding instances simultaneously.\n"
56 "-m | --dec-codec (Required) Decoder codec format. Must match the codec of input file.\n"
57 " [a|avc, h|hevc, v|vp9]\n"
58 "-n | --enc-codec (Required) Encoder codec format.\n"
59 " [a|avc, h|hevc, x|av1] (x is in ivf container format)\n"
60 "-l | --loglevel Set loglevel of this application and libxcoder API.\n"
61 " [none, fatal, error, info, debug, trace]\n"
63 "-c | --card Set card index to use.\n"
64 " See `ni_rsrc_mon` for info of cards on system.\n"
66 "-r | --repeat To loop input X times. Must be a positive integer\n"
68 "-d | --decoder-params Decoding params. See \"Decoding Parameters\" chapter in\n"
69 " QuadraIntegration&ProgrammingGuide*.pdf for help.\n"
71 "-e | --encoder-params Encoding params. See \"Encoding Parameters\" chapter in\n"
72 " QuadraIntegration&ProgrammingGuide*.pdf for help.\n"
73 " Can be specified multiple (max %d) times,\n"
74 " must match the number of -o specified.\n"
76 "-g | --encoder-gop Custom GOP for encoding. See \"Custom Gop Structure\" chapter in\n"
77 " QuadraIntegration&ProgrammingGuide*.pdf for help.\n"
78 " gopPresetIdx must be set to 0 to be in effect.\n"
80 "-u | --user-data-sei-passthru (No argument) Enable user data unregistered SEI passthrough when specified\n"
81 "-f | --vf Video filter params. The only supported filters in this demo are:\n"
82 " ni_quadra_scale - supported params [width, height, format]\n"
83 " e.g. ni_quadra_scale=width=1280:height=720:format=yuv420p\n"
84 " ni_quadra_drawbox - supported params [x, y, width, height]\n"
85 " e.g. ni_quadra_drawbox=x=300:y=150:width=600:height=400\n"
90 int main(
int argc,
char *argv[])
97 int o_index = 0, e_index = 0, g_index = 0;
99 int input_width = 0, input_height = 0, output_width = 0, output_height = 0, bit_depth = 8;
100 int dec_codec_format = -1, enc_codec_format = -1;
104 char dec_conf_params[2048] = {0};
105 char filter_conf_params[2048] = {0};
108 int user_data_sei_passthru = 0;
121 void *p_stream_info = NULL;
122 int fps_num = 30, fps_den = 1, bitrate = 200000;
128 ni_pthread_t dec_send_tid, dec_recv_tid, enc_send_tid, enc_recv_tid;
137 const char *opt_string =
"hvi:o:m:n:l:c:r:d:e:g:uf:";
138 static struct option long_options[] = {
151 {
"user-data-sei-passthru",
no_argument, NULL,
'u'},
156 while ((opt =
getopt_long(argc, argv, opt_string, long_options, &opt_index)) != -1)
179 for (i = 0; i < o_index; i++)
181 if (0 == strcmp(out_filename[i],
optarg))
194 for (i = 0; i < strlen(
optarg); i++)
198 if (strcmp(
optarg,
"a") == 0 || strcmp(
optarg,
"avc") == 0)
202 else if (strcmp(
optarg,
"h") == 0 || strcmp(
optarg,
"hevc") == 0)
206 else if (strcmp(
optarg,
"v") == 0 || strcmp(
optarg,
"vp9") == 0)
213 "Must be one of [a|avc, h|hevc, v|vp9]\n",
optarg);
220 for (i = 0; i < strlen(
optarg); i++)
224 if (strcmp(
optarg,
"a") == 0 || strcmp(
optarg,
"avc") == 0)
228 else if (strcmp(
optarg,
"h") == 0 || strcmp(
optarg,
"hevc") == 0)
232 else if (strcmp(
optarg,
"x") == 0 || strcmp(
optarg,
"av1") == 0)
239 "Must be one of [a|avc, h|hevc, x|av1]\n",
optarg);
253 "Must be one of [none, fatal, error, info, debug, trace]\n",
optarg);
259 xcoderGUID = (int)strtol(
optarg, &n, 10);
260 if (n ==
optarg || *n !=
'\0' || xcoderGUID < 0)
263 "Must be a non-negative integer\n",
optarg);
273 "Must be a positive integer\n",
optarg);
288 ni_strcpy(enc_conf_params[e_index],
sizeof(enc_conf_params[e_index]),
optarg);
298 ni_strcpy(enc_gop_params[g_index],
sizeof(enc_gop_params[g_index]),
optarg);
302 user_data_sei_passthru = 1;
314 if (!in_filename[0]) {
326 if (dec_codec_format == -1) {
332 if (enc_codec_format == -1) {
345 output_total = o_index;
346 for (i = 0; i < output_total; i++)
348 if (strcmp(out_filename[i],
"null") != 0 &&
349 strcmp(out_filename[i],
"/dev/null") != 0)
352 ni_fopen(&(output_fp[i]), out_filename[i],
"wb");
363 ni_log(
NI_LOG_INFO,
"Note: Requested NULL output for index %d, no output file will be generated\n", i);
368 if (!p_dec_api_param)
376 if (!p_enc_api_param)
389 "ERROR: Failed to probe input file as H.264, file format not supported!\n");
394 input_width = avc_sps.
width;
395 input_height = avc_sps.
height;
397 bit_depth, input_width, input_height);
404 "ERROR: Failed to probe input file as H.265, file format not supported!\n");
408 input_width = (int)(hevc_sps.
width -
411 input_height = (int)(hevc_sps.
height -
414 ni_log(
NI_LOG_INFO,
"Using probed H.265 source info: %d bits, resolution %dx%d\n",
415 bit_depth, input_width, input_height);
422 "ERROR: Failed to probe input file as VP9, file format not supported!\n");
425 bit_depth = vp9_info.
profile ? 10 : 8;
426 input_width = vp9_info.
width;
427 input_height = vp9_info.
height;
429 "Using probed VP9 source info: %d bits, resolution %dx%d, timebase %u/%u\n",
430 bit_depth, input_width, input_height,
475 for (i = 0; i < output_total; i++)
485 for (i = 0; i < output_total; i++)
491 p_stream_info = &avc_sps;
493 p_stream_info = &hevc_sps;
496 p_stream_info = &vp9_info;
501 output_width = input_width;
502 output_height = input_height;
504 if (filter_conf_params[0])
507 ni_log(
NI_LOG_ERROR,
"Error: filters are only supported when hwframe is enabled (out=hw)\n");
514 ni_log(
NI_LOG_ERROR,
"Error: failed to parse filter parameters: %s\n", filter_conf_params);
527 output_width = scale_params.
width;
528 output_height = scale_params.
height;
530 else if (drawbox_params.
enabled)
558 ni_log(
NI_LOG_INFO,
"Starting to transcode: HWFrames %d, video resolution %dx%d -> %dx%d\n",
559 dec_ctx.
hw_action, input_width, input_height, output_width, output_height);
589 "Error: create decoder send thread failed in transcode "
597 "Error: create decoder receive thread failed in "
616 else if (drawbox_params.
enabled)
621 ret =
encoder_open(&ctx, enc_ctx, p_enc_api_param, output_total, enc_conf_params, enc_gop_params,
622 p_ni_frame, output_width, output_height, fps_num, fps_den, bitrate,
624 xcoderGUID, p_hwframe, 1,
false);
650 "in transcode mode\n");
657 "failed in transcode mode\n");
674 for (i = 0; i < output_total; i++)
677 if (output_fp[i] != NULL)
679 fclose(output_fp[i]);
702 free(p_dec_api_param);
703 free(p_enc_api_param);
ni_test_frame_list_t * frame_list
ni_scale_params_t * scale_params
ni_pix_fmt_t gc620_to_ni_pix_fmt(int pix_fmt)
ni_session_context_t * p_sca_ctx
int main(int argc, char *argv[])
void encoder_stat_report_and_close(ni_demo_context_t *p_ctx, ni_session_context_t *p_enc_ctx_list, int output_total)
void * encoder_send_thread(void *args)
int probe_h264_stream_info(ni_demo_context_t *p_ctx, ni_h264_sps_t *sps)
ni_retcode_t ni_strcpy(char *dest, size_t dmax, const char *src)
int retrieve_filter_params(char filter_params[], ni_scale_params_t *scale_params, ni_drawbox_params_t *drawbox_params)
ni_pts_queue * enc_pts_queue[MAX_OUTPUT_FILES]
void ni_log_set_level(ni_log_level_t level)
Set ni_log_level.
uint64_t ni_gettime_ns(void)
unsigned int bottom_offset
#define required_argument
#define NI_XCODER_REVISION
int probe_h265_stream_info(ni_demo_context_t *p_ctx, ni_h265_sps_t *sps)
ni_demo_context_t * p_ctx
ni_test_frame_list_t * frame_list
void * decoder_receive_thread(void *args)
ni_session_context_t * p_fmt_ctx
ni_demo_context_t * p_ctx
int ni_pthread_join(ni_pthread_t thread, void **value_ptr)
join with a terminated thread
bool frame_list_is_empty(ni_test_frame_list_t *list)
int probe_vp9_stream_info(ni_demo_context_t *p_ctx, ni_vp9_header_info_t *vp9_info)
ni_session_context_t * p_enc_ctx
ni_log_level_t arg_to_ni_log_level(const char *arg_str)
Convert terminal arg string to ni_log_level_t.
void decoder_stat_report_and_close(ni_demo_context_t *p_ctx, ni_session_context_t *p_dec_ctx)
int read_and_cache_file(ni_demo_context_t *ctx, char *filename)
int decoder_open_session(ni_session_context_t *p_dec_ctx, int iXcoderGUID, ni_xcoder_params_t *p_dec_params)
decoder session open
ni_session_context_t * p_ovly_ctx
ni_h265_window_t pic_conf_win
void hwframe_list_release(ni_test_frame_list_t *list)
unsigned int right_offset
void * encoder_receive_thread(void *args)
ni_drawbox_params_t * drawbox_params
void ni_log(ni_log_level_t level, const char *fmt,...)
print log message using ni_log_callback
ni_session_context_t * p_enc_ctx
void * decoder_send_thread(void *args)
int getopt_long(int argc, char *argv[], const char *optstring, const struct option *longopts, int *longindex)
void ni_usleep(int64_t usec)
int bit_depth_luma
bit_depth_luma_minus8 + 8
ni_test_frame_list_t * frame_list
ni_session_data_io_t frames[NI_MAX_BUFFERED_FRAME]
void ni_device_session_context_clear(ni_session_context_t *p_ctx)
Clear already allocated session context.
uint8_t * p_data[NI_MAX_NUM_DATA_POINTERS]
int ni_pthread_create(ni_pthread_t *thread, const ni_pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
create a new thread
ni_retcode_t ni_decoder_init_default_params(ni_xcoder_params_t *p_param, int fps_num, int fps_denom, long bit_rate, int width, int height)
Initialize default decoder parameters.
union _ni_session_data_io::@19 data
int encoder_open(ni_demo_context_t *p_ctx, ni_session_context_t *enc_ctx_list, ni_xcoder_params_t *p_api_param_list, int output_total, char p_enc_conf_params[][2048], char p_enc_conf_gop[][2048], ni_frame_t *p_ni_frame, int width, int height, int fps_num, int fps_den, int bitrate, int codec_format, ni_pix_fmt_t pix_fmt, int aspect_ratio_idc, int xcoder_guid, niFrameSurface1_t *p_surface, int multi_thread, bool check_zerocopy)
ni_demo_context_t * p_ctx
int enable_user_data_sei_passthru
ni_demo_context_t * p_ctx
ni_test_frame_list_t * frame_list
ni_session_context_t * p_pad_ctx
ni_session_context_t * p_dec_ctx
ni_session_context_t * p_dec_ctx
ni_session_context_t * p_crop_ctx
ni_retcode_t ni_device_session_context_init(ni_session_context_t *p_ctx)
Initialize already allocated session context to a known state.
int ni_retrieve_decoder_params(char xcoderParams[], ni_xcoder_params_t *params, ni_session_context_t *ctx)
retrieve decoder config parameter values from –decoder-params
Implementation of getopt() and getopt_long() for Windows environment.
ni_retcode_t ni_fopen(FILE **fp, const char *filename, const char *mode)