1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar *****************************************************************************
18*c83a76b0SSuyog Pawar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar
21*c83a76b0SSuyog Pawar /*!
22*c83a76b0SSuyog Pawar ******************************************************************************
23*c83a76b0SSuyog Pawar * \file main.c
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * \brief
26*c83a76b0SSuyog Pawar * This file contains sample application for HEVC Encoder
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * \date
29*c83a76b0SSuyog Pawar * 18/09/2012
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * \author
32*c83a76b0SSuyog Pawar * Ittiam
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar ******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar
37*c83a76b0SSuyog Pawar /*****************************************************************************/
38*c83a76b0SSuyog Pawar /* File Includes */
39*c83a76b0SSuyog Pawar /*****************************************************************************/
40*c83a76b0SSuyog Pawar
41*c83a76b0SSuyog Pawar /* System include files */
42*c83a76b0SSuyog Pawar #include <assert.h>
43*c83a76b0SSuyog Pawar #include <stddef.h>
44*c83a76b0SSuyog Pawar #include <stdio.h>
45*c83a76b0SSuyog Pawar #include <stdlib.h>
46*c83a76b0SSuyog Pawar #include <string.h>
47*c83a76b0SSuyog Pawar #include <stdarg.h>
48*c83a76b0SSuyog Pawar #include <stdint.h>
49*c83a76b0SSuyog Pawar #include <limits.h>
50*c83a76b0SSuyog Pawar
51*c83a76b0SSuyog Pawar /* User include files */
52*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
53*c83a76b0SSuyog Pawar #include "itt_video_api.h"
54*c83a76b0SSuyog Pawar #include "ihevce_api.h"
55*c83a76b0SSuyog Pawar #include "ihevce_plugin.h"
56*c83a76b0SSuyog Pawar #include "ihevce_profile.h"
57*c83a76b0SSuyog Pawar #include "app.h"
58*c83a76b0SSuyog Pawar
59*c83a76b0SSuyog Pawar /*****************************************************************************/
60*c83a76b0SSuyog Pawar /* Constant Macros */
61*c83a76b0SSuyog Pawar /*****************************************************************************/
62*c83a76b0SSuyog Pawar #define DYN_BITRATE_TEST 0
63*c83a76b0SSuyog Pawar #define FORCE_IDR_TEST 0
64*c83a76b0SSuyog Pawar
65*c83a76b0SSuyog Pawar /*****************************************************************************/
66*c83a76b0SSuyog Pawar /* Global definitions */
67*c83a76b0SSuyog Pawar /*****************************************************************************/
68*c83a76b0SSuyog Pawar
69*c83a76b0SSuyog Pawar /*!
70*c83a76b0SSuyog Pawar *******************************************************************************
71*c83a76b0SSuyog Pawar * \brief
72*c83a76b0SSuyog Pawar * list of supported arguments
73*c83a76b0SSuyog Pawar *
74*c83a76b0SSuyog Pawar *****************************************************************************
75*c83a76b0SSuyog Pawar */
76*c83a76b0SSuyog Pawar // clang-format off
77*c83a76b0SSuyog Pawar static const argument_t argument_mapping[] =
78*c83a76b0SSuyog Pawar {
79*c83a76b0SSuyog Pawar {"-h", "--help", HELP, "Print help \n"},
80*c83a76b0SSuyog Pawar {"-c", "--config", CONFIG, "Input Config file \n" },
81*c83a76b0SSuyog Pawar {"-v", "--version", VERSION, "Encoder version \n"},
82*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " File I/O Parameters \n" " ---------------------\n"},
83*c83a76b0SSuyog Pawar {"-i", "--input", INPUT_YUV, "Input yuv file {mandatory} \n"},
84*c83a76b0SSuyog Pawar {"-o", "--output", OUTPUT, "Output bitstream file {mandatory}\n"},
85*c83a76b0SSuyog Pawar {"-frames", "--num_frames_to_encode", NUM_FRAMES_TO_ENCODE, "Number of frames to encode \n"},
86*c83a76b0SSuyog Pawar {"-log", "--log_dump_level", LOG_DUMP_LEVEL, "0- [No log/prints] 1- [BitsGenerated, POC, Qp, Pic-type]\n"
87*c83a76b0SSuyog Pawar " 2- [1 + PSNR + Seq Summary] 3- [2 + SSIM + Frame Summary] {0}\n"},
88*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " Source Parameters \n" " ---------------------\n"},
89*c83a76b0SSuyog Pawar {"-sw", "--src_width", SRC_WIDTH, "Input Source Width {mandatory}[240:4096]\n"},
90*c83a76b0SSuyog Pawar {"-sh", "--src_height", SRC_HEIGHT, "Input Source Height {mandatory}[128:2176] [ \n"},
91*c83a76b0SSuyog Pawar {"-fNum", "--src_frame_rate_num", SRC_FRAME_RATE_NUM, "Frame rate numerator {30000}[7500:120000]\n"},
92*c83a76b0SSuyog Pawar {"-fDen", "--src_frame_rate_denom", SRC_FRAME_RATE_DENOM, "Frame rate denominator {1000}[1000,1001]\n"},
93*c83a76b0SSuyog Pawar {"-pixfmt", "--input_chroma_format", INPUT_CHROMA_FORMAT, "11- YUV_420P; 13- YUV_422P {11}\n"},
94*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " Target Parameters (for all the layers of multi-resolution encoding) \n" " ------------------------------------------------------------------------\n"},
95*c83a76b0SSuyog Pawar {"-level", "--codec_level", CODEC_LEVEL, "Coded Level multiplied by 30 {153}[0:153]\n"},
96*c83a76b0SSuyog Pawar {"-b", "--tgt_bitrate", TGT_BITRATE, "Target bitrates in bps{5000000}."
97*c83a76b0SSuyog Pawar " For MRESxMBR comma seperated BR1,BR2,BR3...\n"},
98*c83a76b0SSuyog Pawar {"-qp", "--frame_qp", FRAME_QP, "Initial QP values.Dependes on bit depth {38},"
99*c83a76b0SSuyog Pawar " For MRESxMBR comma seperated QP1,QP2,QP3...\n"},
100*c83a76b0SSuyog Pawar {"-obd", "--output_bit_depth", OUTPUT_BIT_DEPTH, "Output bit depth common for all Res.{-ibd}[8,10,12] \n"},
101*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " GOP structure Parameters \n" " ----------------------------\n"},
102*c83a76b0SSuyog Pawar {"-maxCgop", "--max_closed_gop_period", MAX_CLOSED_GOP_PERIOD, "Max IDR Pic distance- Closed GOP {0}[0:300] \n"},
103*c83a76b0SSuyog Pawar {"-minCgop", "--min_closed_gop_period", MIN_CLOSED_GOP_PERIOD, "Min IDR Pic distance- Closed GOP {0}[0:300]\n"},
104*c83a76b0SSuyog Pawar {"-craOgop", "--max_cra_open_gop_period", MAX_CRA_OPEN_GOP_PERIOD, "Max CRA Pic distance- Open GOP {60}[0:300]\n"},
105*c83a76b0SSuyog Pawar {"-maxIgop", "--max_i_open_gop_period", MAX_I_OPEN_GOP_PERIOD, "Max I (non CRA, non IDR) Pic distance {0}[0:300]\n"},
106*c83a76b0SSuyog Pawar {"-bpicTL", "--max_temporal_layers", MAX_TEMPORAL_LAYERS, "B pyramid layers {3}[0:3] \n"},
107*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " Coding tools Parameters \n" " ---------------------------\n"},
108*c83a76b0SSuyog Pawar {"-preset", "--quality_preset", QUALITY_PRESET, "0- PQ, 2- HQ, 3- MS, 4- HS, 5- ES {3}\n"},
109*c83a76b0SSuyog Pawar {"-lfd", "--deblocking_type", DEBLOCKING_TYPE, "Debocking 0- enabled, 1- disabled {0}\n"},
110*c83a76b0SSuyog Pawar {"-scm", "--use_default_sc_mtx", USE_DEFAULT_SC_MTX, "0- disabled, 1- enabled {0}\n"},
111*c83a76b0SSuyog Pawar {"-wpp", "--enable_entropy_sync", ENABLE_ENTROPY_SYNC, "Entropy sync 1- enabled, 0- disabled {0}\n"},
112*c83a76b0SSuyog Pawar {"-intraTD", "--max_tr_tree_depth_I", MAX_TR_TREE_DEPTH_I, "Max transform tree depth for intra {3}[1,2,3]\n"},
113*c83a76b0SSuyog Pawar {"-interTD", "--max_tr_tree_depth_nI", MAX_TR_TREE_DEPTH_NI, "Max transform tree depth for inter {3}[2,3,4]\n"},
114*c83a76b0SSuyog Pawar {"-hrange", "--max_search_range_horz", MAX_SEARCH_RANGE_HORZ, "Horizontal search range {512}[64:512]\n"},
115*c83a76b0SSuyog Pawar {"-vrange", "--max_search_range_vert", MAX_SEARCH_RANGE_VERT, "Vertical search range {256}[32:256]\n"},
116*c83a76b0SSuyog Pawar {"-arch", "--archType", ARCH_TYPE, "0 => Automatic, 4 => ARM(No neon)\n"},
117*c83a76b0SSuyog Pawar
118*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " Multi Core parameters \n" " -------------------------\n"},
119*c83a76b0SSuyog Pawar {"-core", "--num_cores", NUM_CORES, "#Logical cores (Include hyperthreads){auto}[1:80] \n"},
120*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " Rate Control parameters \n" " -------------------------\n"},
121*c83a76b0SSuyog Pawar {"-rc", "--rate_control_mode", RATE_CONTROL_MODE, "1 -Capped VBR,2- VBR ,3- CQP, 5- CBR {5} \n"},
122*c83a76b0SSuyog Pawar {"-aq", "--cu_level_rc", CU_LEVEL_RC, "CU Qp Modulation 0- Disable 1-Spatial QP modulation \n"},
123*c83a76b0SSuyog Pawar {"-maxqp", "--max_frame_qp", MAX_FRAME_QP, "Max frame Qp for I frame {51}[51] \n"},
124*c83a76b0SSuyog Pawar {"-minqp", "--min_frame_qp", MIN_FRAME_QP, "Min frame Qp for I frame. Depends on Bit depth {1}[1/-12/-24] \n"},
125*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " Look Ahead Processing Parameters \n" " ----------------------------------\n"},
126*c83a76b0SSuyog Pawar
127*c83a76b0SSuyog Pawar {"-lapwindow", "--rc_look_ahead_pics", RC_LOOK_AHEAD_PICS, "RC look ahead window {60}[0:120] \n"},
128*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " Output stream Parameters \n" " ----------------------------------\n"},
129*c83a76b0SSuyog Pawar {"-codec", "--codec_type", CODEC_TYPE, "0- HEVC {0}\n"},
130*c83a76b0SSuyog Pawar {"-profile", "--codec_profile", CODEC_PROFILE, "1- Main 2- Main10 4- RExt {1} \n"},
131*c83a76b0SSuyog Pawar {"-tier", "--codec_tier", CODEC_TIER, "0- Main 1- High {1} \n"},
132*c83a76b0SSuyog Pawar {"-sps", "--sps_at_cdr_enable", SPS_AT_CDR_ENABLE, "1- enable, 0- disable {1}\n"},
133*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " Tile Parameters \n" " --------------------------\n"},
134*c83a76b0SSuyog Pawar {"-tiles", "--tiles_enabled_flag", TILES_ENABLED_FLAG, "Tile encoding 0- disable 1-enable {0} \n"},
135*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " Slice Parameters \n" " --------------------------\n"},
136*c83a76b0SSuyog Pawar {"-slicemode", "--slice_segment_mode", SLICE_SEGMENT_MODE, "Flag to control dependent slice generation {0}[0,1,2]\n"
137*c83a76b0SSuyog Pawar " 0- Disable slices\n"
138*c83a76b0SSuyog Pawar " 1- CTB/Slice\n"
139*c83a76b0SSuyog Pawar " 2- Bytes/Slice \n"},
140*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " SEI parameters \n" " ---------------------------\n"},
141*c83a76b0SSuyog Pawar {"-sei", "--sei_enable_flags", SEI_ENABLE_FLAGS, "1- enable, 0- disable {0}\n"},
142*c83a76b0SSuyog Pawar {"-seipayload", "--sei_payload_enable_flags", SEI_PAYLOAD_ENABLE_FLAGS, "1- enable, 0- disable {0}\n"},
143*c83a76b0SSuyog Pawar {"-seipayloadpath", "--sei_payload_path", SEI_PAYLOAD_PATH, "Input SEI Payload Path (optional)" },
144*c83a76b0SSuyog Pawar {"-seibuf", "--sei_buffer_period_flags", SEI_BUFFER_PERIOD_FLAGS, "1- enable, 0- disable {0}\n"},
145*c83a76b0SSuyog Pawar {"-seipictime", "--sei_pic_timing_flags", SEI_PIC_TIMING_FLAGS, "1- enable, 0- disable {0}\n"},
146*c83a76b0SSuyog Pawar {"-seirecpt", "--sei_recovery_point_flags", SEI_RECOVERY_POINT_FLAGS, "1- enable, 0- disable {0}\n"},
147*c83a76b0SSuyog Pawar {"-seihash", "--sei_hash_flags", SEI_HASH_FLAGS, "3- Checksum, 2- CRC, 1- MD5, 0- disable {0}\n"},
148*c83a76b0SSuyog Pawar {"-seidispcol", "--sei_mastering_disp_colour_vol_flags", SEI_MASTERING_DISP_COLOUR_VOL_FLAGS, "1: enable, 0: disable {0}\n"},
149*c83a76b0SSuyog Pawar {"-seiprimx", "--display_primaries_x", DISPLAY_PRIMARIES_X, "X-Primaries: comma separated R,G,B values {}[0:50000] \n"},
150*c83a76b0SSuyog Pawar {"-seiprimy", "--display_primaries_y", DISPLAY_PRIMARIES_Y, "Y-Primaries: comma separated R,G,B values {}[0:50000] \n"},
151*c83a76b0SSuyog Pawar {"-seiwhiteptx", "--white_point_x", WHITE_POINT_X, "X White point value {}[0:50000] \n"},
152*c83a76b0SSuyog Pawar {"-seiwhitepty", "--white_point_y", WHITE_POINT_Y, "Y White point value {}[0:50000] \n"},
153*c83a76b0SSuyog Pawar {"-seidisplummax", "--max_display_mastering_luminance", MAX_DISPLAY_MASTERING_LUMINANCE, "Max mastering Luminance. In units of 0.0001 Candelas/sqmtr {} \n"},
154*c83a76b0SSuyog Pawar {"-seidisplummin", "--min_display_mastering_luminance", MIN_DISPLAY_MASTERING_LUMINANCE, "Min mastering Luminance. In units of 0.0001 Candelas/sqmtr {}\n"},
155*c83a76b0SSuyog Pawar {"-seicllinfo", "--sei_content_light_level_info", SEI_CLL_INFO_ENABLE, "1- enable, 0- disable {0}\n"},
156*c83a76b0SSuyog Pawar {"-seimaxcll", "--max_content_light_level", SEI_MAX_CLL, "16bit unsigned number indicating max pixel intensity\n"},
157*c83a76b0SSuyog Pawar {"-seiavgcll", "--max_frame_average_light_level", SEI_AVG_CLL, "16bit unsigned number indicating max avg pixel intensity\n"},
158*c83a76b0SSuyog Pawar {"", "", GRPINFO, "\n " " VUI Parameters \n" " ------------------------\n"},
159*c83a76b0SSuyog Pawar {"-vui", "--vui_enable", VUI_ENABLE, "1- enable, 0- disable {0}\n"},
160*c83a76b0SSuyog Pawar {"-arFlag", "--aspect_ratio_info_present_flag", ASPECT_RATIO_INFO_PRESENT_FLAG, "Aspect Ratio 1-enable 0-diable {0} \n"},
161*c83a76b0SSuyog Pawar {"-arIdc", "--aspect_ratio_idc", ASPECT_RATIO_IDC, "Aspect Ration IDC {255}[0:255]\n"},
162*c83a76b0SSuyog Pawar {"-sarw", "--sar_width", SAR_WIDTH, "SAR Width {4}[0:65535]\n"},
163*c83a76b0SSuyog Pawar {"-sarh", "--sar_height", SAR_HEIGHT, "SAR Height {3}[0:65535] \n"},
164*c83a76b0SSuyog Pawar {"-overscan", "--overscan_info_present_flag", OVERSCAN_INFO_PRESENT_FLAG, "Overscan Info. 1-enable 0-disable {0}\n"},
165*c83a76b0SSuyog Pawar {"-overscanValid", "--overscan_appropriate_flag", OVERSCAN_APPROPRIATE_FLAG, "Overscan Appropriate 1-enable 0-disable {0}\n"},
166*c83a76b0SSuyog Pawar {"-vidsigp", "--video_signal_type_present_flag", VIDEO_SIGNAL_TYPE_PRESENT_FLAG, "Video Signal Type Present. 1-enable 0-diable {1} \n"},
167*c83a76b0SSuyog Pawar {"-vidfmt", "--video_format", VIDEO_FORMAT, "Video Format {5}[0:5]\n"},
168*c83a76b0SSuyog Pawar {"-fullrange", "--video_full_range_flag", VIDEO_FULL_RANGE_FLAG, "Video Full Range. 1-enable 0-diable {1}\n"},
169*c83a76b0SSuyog Pawar {"-colorDesc", "--colour_description_present_flag", COLOUR_DESCRIPTION_PRESENT_FLAG, "Colour description.1-enable 0-diable {0}\n"},
170*c83a76b0SSuyog Pawar {"-colorPrim", "--colour_primaries", COLOUR_PRIMARIES, "Colour Primaries {2}[0:255] \n"},
171*c83a76b0SSuyog Pawar {"-xferCh", "--transfer_characteristics", TRANSFER_CHARACTERISTICS, "Transfer Characteristic {2}[0:255]\n"},
172*c83a76b0SSuyog Pawar {"-mxcoeff", "--matrix_coefficients", MATRIX_COEFFICIENTS, "Matrix Coefficients {2}[0:255]\n"},
173*c83a76b0SSuyog Pawar {"-chloc", "--chroma_loc_info_present_flag", CHROMA_LOC_INFO_PRESENT_FLAG, "Presence of chroma_sample_loc_type_top_field and "
174*c83a76b0SSuyog Pawar "chroma_sample_loc_type_bottom_field.1-enable 0-diable {0}\n"},
175*c83a76b0SSuyog Pawar {"-chtf", "--chroma_sample_loc_type_top_field", CHROMA_SAMPLE_LOC_TYPE_TOP_FIELD, "Location of Chroma samples for Top field.{0}[0,1] \n"},
176*c83a76b0SSuyog Pawar {"-chbf", "--chroma_sample_loc_type_bottom_field", CHROMA_SAMPLE_LOC_TYPE_BOTTOM_FIELD, "Location of Chroma samples for Bottom field..{0}[0,1] \n"},
177*c83a76b0SSuyog Pawar {"-timinginfo", "--timing_info_present_flag", TIMING_INFO_PRESENT_FLAG, "Timing info.1-enable 0-diable {0}\n"},
178*c83a76b0SSuyog Pawar {"-vuihrdparam", "--vui_hrd_parameters_present_flag", VUI_HRD_PARAMETERS_PRESENT_FLAG, "HRD parameters.1-enable 0-diable {0} \n"},
179*c83a76b0SSuyog Pawar {"-nalhrdparam", "--nal_hrd_parameters_present_flag", NAL_HRD_PARAMETERS_PRESENT_FLAG, "NAL HRD parameters.1-enable 0-diable {0}\n"}
180*c83a76b0SSuyog Pawar };
181*c83a76b0SSuyog Pawar // clang-format on
182*c83a76b0SSuyog Pawar
183*c83a76b0SSuyog Pawar /*!
184*c83a76b0SSuyog Pawar ******************************************************************************
185*c83a76b0SSuyog Pawar * \if Function name : print_usage \endif
186*c83a76b0SSuyog Pawar *
187*c83a76b0SSuyog Pawar * \brief
188*c83a76b0SSuyog Pawar * prints application usage
189*c83a76b0SSuyog Pawar *
190*c83a76b0SSuyog Pawar *****************************************************************************
191*c83a76b0SSuyog Pawar */
print_usage(void)192*c83a76b0SSuyog Pawar void print_usage(void)
193*c83a76b0SSuyog Pawar {
194*c83a76b0SSuyog Pawar WORD32 i = 0;
195*c83a76b0SSuyog Pawar WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
196*c83a76b0SSuyog Pawar
197*c83a76b0SSuyog Pawar printf("\nUsage:\n");
198*c83a76b0SSuyog Pawar while(i < num_entries)
199*c83a76b0SSuyog Pawar {
200*c83a76b0SSuyog Pawar printf("%-32s\t %s", argument_mapping[i].argument_name, argument_mapping[i].description);
201*c83a76b0SSuyog Pawar i++;
202*c83a76b0SSuyog Pawar }
203*c83a76b0SSuyog Pawar }
204*c83a76b0SSuyog Pawar
205*c83a76b0SSuyog Pawar /*!
206*c83a76b0SSuyog Pawar ******************************************************************************
207*c83a76b0SSuyog Pawar * \if Function name : get_argument \endif
208*c83a76b0SSuyog Pawar *
209*c83a76b0SSuyog Pawar * \brief
210*c83a76b0SSuyog Pawar * Maps input string to a argument. If the input string is not recognized,
211*c83a76b0SSuyog Pawar * returns INVALID
212*c83a76b0SSuyog Pawar *
213*c83a76b0SSuyog Pawar *****************************************************************************
214*c83a76b0SSuyog Pawar */
get_argument(CHAR * name)215*c83a76b0SSuyog Pawar ARGUMENT_T get_argument(CHAR *name)
216*c83a76b0SSuyog Pawar {
217*c83a76b0SSuyog Pawar WORD32 i;
218*c83a76b0SSuyog Pawar WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
219*c83a76b0SSuyog Pawar
220*c83a76b0SSuyog Pawar for(i = 0; i < num_entries; i++)
221*c83a76b0SSuyog Pawar {
222*c83a76b0SSuyog Pawar if((0 == strcmp(argument_mapping[i].argument_name, name)) ||
223*c83a76b0SSuyog Pawar ((0 == strcmp(argument_mapping[i].argument_shortname, name)) &&
224*c83a76b0SSuyog Pawar (0 != strcmp(argument_mapping[i].argument_shortname, "--"))))
225*c83a76b0SSuyog Pawar {
226*c83a76b0SSuyog Pawar return argument_mapping[i].argument;
227*c83a76b0SSuyog Pawar }
228*c83a76b0SSuyog Pawar }
229*c83a76b0SSuyog Pawar return INVALID;
230*c83a76b0SSuyog Pawar }
231*c83a76b0SSuyog Pawar
232*c83a76b0SSuyog Pawar /*!
233*c83a76b0SSuyog Pawar ******************************************************************************
234*c83a76b0SSuyog Pawar * \if Function name : codec_exit \endif
235*c83a76b0SSuyog Pawar *
236*c83a76b0SSuyog Pawar * \brief
237*c83a76b0SSuyog Pawar * handles unrecoverable errors. Prints error message to console and exits
238*c83a76b0SSuyog Pawar *
239*c83a76b0SSuyog Pawar *****************************************************************************
240*c83a76b0SSuyog Pawar */
codec_exit(CHAR * pc_err_message)241*c83a76b0SSuyog Pawar void codec_exit(CHAR *pc_err_message)
242*c83a76b0SSuyog Pawar {
243*c83a76b0SSuyog Pawar printf("%s\n", pc_err_message);
244*c83a76b0SSuyog Pawar exit(-1);
245*c83a76b0SSuyog Pawar }
246*c83a76b0SSuyog Pawar
247*c83a76b0SSuyog Pawar /*!
248*c83a76b0SSuyog Pawar ******************************************************************************
249*c83a76b0SSuyog Pawar * \if Function name : parse_argument \endif
250*c83a76b0SSuyog Pawar *
251*c83a76b0SSuyog Pawar * \brief
252*c83a76b0SSuyog Pawar * Parse input argument
253*c83a76b0SSuyog Pawar *
254*c83a76b0SSuyog Pawar *****************************************************************************
255*c83a76b0SSuyog Pawar */
parse_argument(appl_ctxt_t * ps_ctxt,CHAR * argument,CHAR * value)256*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T parse_argument(appl_ctxt_t *ps_ctxt, CHAR *argument, CHAR *value)
257*c83a76b0SSuyog Pawar {
258*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *ps_static_prms = &ps_ctxt->s_static_cfg_prms;
259*c83a76b0SSuyog Pawar ARGUMENT_T arg = get_argument(argument);
260*c83a76b0SSuyog Pawar WORD32 i4_value = 0;
261*c83a76b0SSuyog Pawar UWORD8 au1_keywd_str[STR_LEN];
262*c83a76b0SSuyog Pawar UWORD8 *pu1_keywd_str = au1_keywd_str;
263*c83a76b0SSuyog Pawar
264*c83a76b0SSuyog Pawar switch(arg)
265*c83a76b0SSuyog Pawar {
266*c83a76b0SSuyog Pawar case HELP:
267*c83a76b0SSuyog Pawar print_usage();
268*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
269*c83a76b0SSuyog Pawar
270*c83a76b0SSuyog Pawar case VERSION:
271*c83a76b0SSuyog Pawar break;
272*c83a76b0SSuyog Pawar
273*c83a76b0SSuyog Pawar case INPUT_YUV:
274*c83a76b0SSuyog Pawar sscanf(value, "%s", ps_ctxt->au1_in_file);
275*c83a76b0SSuyog Pawar assert(strlen((char *)ps_ctxt->au1_in_file) < STR_LEN);
276*c83a76b0SSuyog Pawar break;
277*c83a76b0SSuyog Pawar
278*c83a76b0SSuyog Pawar case OUTPUT:
279*c83a76b0SSuyog Pawar sscanf(value, "%s", ps_ctxt->au1_out_file[0][0]);
280*c83a76b0SSuyog Pawar assert(strlen((char *)ps_ctxt->au1_out_file[0][0]) < STR_LEN);
281*c83a76b0SSuyog Pawar break;
282*c83a76b0SSuyog Pawar case NUM_FRAMES_TO_ENCODE:
283*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
284*c83a76b0SSuyog Pawar if(i4_value < 0)
285*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_num_frms_to_encode = INT32_MAX - 1;
286*c83a76b0SSuyog Pawar else
287*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_num_frms_to_encode = i4_value;
288*c83a76b0SSuyog Pawar break;
289*c83a76b0SSuyog Pawar
290*c83a76b0SSuyog Pawar case LOG_DUMP_LEVEL:
291*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
292*c83a76b0SSuyog Pawar ps_static_prms->i4_log_dump_level = i4_value;
293*c83a76b0SSuyog Pawar break;
294*c83a76b0SSuyog Pawar case SRC_WIDTH:
295*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
296*c83a76b0SSuyog Pawar ps_static_prms->s_src_prms.i4_width = i4_value;
297*c83a76b0SSuyog Pawar break;
298*c83a76b0SSuyog Pawar
299*c83a76b0SSuyog Pawar case SRC_HEIGHT:
300*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
301*c83a76b0SSuyog Pawar ps_static_prms->s_src_prms.i4_height = i4_value;
302*c83a76b0SSuyog Pawar break;
303*c83a76b0SSuyog Pawar
304*c83a76b0SSuyog Pawar case SRC_FRAME_RATE_NUM:
305*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
306*c83a76b0SSuyog Pawar ps_static_prms->s_src_prms.i4_frm_rate_num = i4_value;
307*c83a76b0SSuyog Pawar break;
308*c83a76b0SSuyog Pawar
309*c83a76b0SSuyog Pawar case SRC_FRAME_RATE_DENOM:
310*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
311*c83a76b0SSuyog Pawar ps_static_prms->s_src_prms.i4_frm_rate_denom = i4_value;
312*c83a76b0SSuyog Pawar break;
313*c83a76b0SSuyog Pawar case INPUT_CHROMA_FORMAT:
314*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
315*c83a76b0SSuyog Pawar ps_static_prms->s_src_prms.inp_chr_format = (IV_COLOR_FORMAT_T)i4_value;
316*c83a76b0SSuyog Pawar break;
317*c83a76b0SSuyog Pawar case CODEC_LEVEL:
318*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
319*c83a76b0SSuyog Pawar ps_static_prms->s_tgt_lyr_prms.as_tgt_params[0].i4_codec_level = i4_value;
320*c83a76b0SSuyog Pawar break;
321*c83a76b0SSuyog Pawar case TGT_BITRATE:
322*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
323*c83a76b0SSuyog Pawar ps_static_prms->s_tgt_lyr_prms.as_tgt_params[0].ai4_tgt_bitrate[0] = i4_value;
324*c83a76b0SSuyog Pawar break;
325*c83a76b0SSuyog Pawar
326*c83a76b0SSuyog Pawar case FRAME_QP:
327*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
328*c83a76b0SSuyog Pawar ps_static_prms->s_tgt_lyr_prms.as_tgt_params[0].ai4_frame_qp[0] = i4_value;
329*c83a76b0SSuyog Pawar break;
330*c83a76b0SSuyog Pawar case MAX_CLOSED_GOP_PERIOD:
331*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
332*c83a76b0SSuyog Pawar ps_static_prms->s_coding_tools_prms.i4_max_closed_gop_period = i4_value;
333*c83a76b0SSuyog Pawar break;
334*c83a76b0SSuyog Pawar
335*c83a76b0SSuyog Pawar case MIN_CLOSED_GOP_PERIOD:
336*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
337*c83a76b0SSuyog Pawar ps_static_prms->s_coding_tools_prms.i4_min_closed_gop_period = i4_value;
338*c83a76b0SSuyog Pawar break;
339*c83a76b0SSuyog Pawar
340*c83a76b0SSuyog Pawar case MAX_CRA_OPEN_GOP_PERIOD:
341*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
342*c83a76b0SSuyog Pawar ps_static_prms->s_coding_tools_prms.i4_max_cra_open_gop_period = i4_value;
343*c83a76b0SSuyog Pawar break;
344*c83a76b0SSuyog Pawar
345*c83a76b0SSuyog Pawar case MAX_I_OPEN_GOP_PERIOD:
346*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
347*c83a76b0SSuyog Pawar ps_static_prms->s_coding_tools_prms.i4_max_i_open_gop_period = i4_value;
348*c83a76b0SSuyog Pawar break;
349*c83a76b0SSuyog Pawar
350*c83a76b0SSuyog Pawar case MAX_TEMPORAL_LAYERS:
351*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
352*c83a76b0SSuyog Pawar ps_static_prms->s_coding_tools_prms.i4_max_temporal_layers = i4_value;
353*c83a76b0SSuyog Pawar break;
354*c83a76b0SSuyog Pawar
355*c83a76b0SSuyog Pawar case QUALITY_PRESET:
356*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
357*c83a76b0SSuyog Pawar ps_static_prms->s_tgt_lyr_prms.as_tgt_params[0].i4_quality_preset =
358*c83a76b0SSuyog Pawar (IHEVCE_QUALITY_CONFIG_T)i4_value;
359*c83a76b0SSuyog Pawar break;
360*c83a76b0SSuyog Pawar
361*c83a76b0SSuyog Pawar case DEBLOCKING_TYPE:
362*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
363*c83a76b0SSuyog Pawar ps_static_prms->s_coding_tools_prms.i4_deblocking_type = i4_value;
364*c83a76b0SSuyog Pawar break;
365*c83a76b0SSuyog Pawar
366*c83a76b0SSuyog Pawar case USE_DEFAULT_SC_MTX:
367*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
368*c83a76b0SSuyog Pawar ps_static_prms->s_coding_tools_prms.i4_use_default_sc_mtx = i4_value;
369*c83a76b0SSuyog Pawar break;
370*c83a76b0SSuyog Pawar
371*c83a76b0SSuyog Pawar case ENABLE_ENTROPY_SYNC:
372*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
373*c83a76b0SSuyog Pawar ps_static_prms->s_coding_tools_prms.i4_enable_entropy_sync = i4_value;
374*c83a76b0SSuyog Pawar break;
375*c83a76b0SSuyog Pawar
376*c83a76b0SSuyog Pawar case MAX_TR_TREE_DEPTH_I:
377*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
378*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_max_tr_tree_depth_I = i4_value;
379*c83a76b0SSuyog Pawar break;
380*c83a76b0SSuyog Pawar
381*c83a76b0SSuyog Pawar case MAX_TR_TREE_DEPTH_NI:
382*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
383*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_max_tr_tree_depth_nI = i4_value;
384*c83a76b0SSuyog Pawar break;
385*c83a76b0SSuyog Pawar
386*c83a76b0SSuyog Pawar case MAX_SEARCH_RANGE_HORZ:
387*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
388*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_max_search_range_horz = i4_value;
389*c83a76b0SSuyog Pawar break;
390*c83a76b0SSuyog Pawar
391*c83a76b0SSuyog Pawar case MAX_SEARCH_RANGE_VERT:
392*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
393*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_max_search_range_vert = i4_value;
394*c83a76b0SSuyog Pawar break;
395*c83a76b0SSuyog Pawar case ARCH_TYPE:
396*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
397*c83a76b0SSuyog Pawar switch(i4_value)
398*c83a76b0SSuyog Pawar {
399*c83a76b0SSuyog Pawar case 0:
400*c83a76b0SSuyog Pawar ps_static_prms->e_arch_type = ARCH_NA;
401*c83a76b0SSuyog Pawar break;
402*c83a76b0SSuyog Pawar case 4:
403*c83a76b0SSuyog Pawar ps_static_prms->e_arch_type = ARCH_ARM_NONEON;
404*c83a76b0SSuyog Pawar break;
405*c83a76b0SSuyog Pawar default:
406*c83a76b0SSuyog Pawar ps_static_prms->e_arch_type = ARCH_ARM_NONEON;
407*c83a76b0SSuyog Pawar break;
408*c83a76b0SSuyog Pawar }
409*c83a76b0SSuyog Pawar break;
410*c83a76b0SSuyog Pawar
411*c83a76b0SSuyog Pawar case NUM_CORES:
412*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
413*c83a76b0SSuyog Pawar ps_static_prms->s_multi_thrd_prms.i4_max_num_cores = i4_value;
414*c83a76b0SSuyog Pawar if((i4_value > MAX_NUM_CORES) || (i4_value < 1))
415*c83a76b0SSuyog Pawar {
416*c83a76b0SSuyog Pawar printf("APLN ERROR >> Number of cores per CPU configured is "
417*c83a76b0SSuyog Pawar "unsupported \n");
418*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
419*c83a76b0SSuyog Pawar }
420*c83a76b0SSuyog Pawar break;
421*c83a76b0SSuyog Pawar case RATE_CONTROL_MODE:
422*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
423*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_rate_control_mode = i4_value;
424*c83a76b0SSuyog Pawar break;
425*c83a76b0SSuyog Pawar case CU_LEVEL_RC:
426*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
427*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_cu_level_rc = i4_value;
428*c83a76b0SSuyog Pawar break;
429*c83a76b0SSuyog Pawar case MAX_FRAME_QP:
430*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
431*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_max_frame_qp = i4_value;
432*c83a76b0SSuyog Pawar break;
433*c83a76b0SSuyog Pawar
434*c83a76b0SSuyog Pawar case MIN_FRAME_QP:
435*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
436*c83a76b0SSuyog Pawar ps_static_prms->s_config_prms.i4_min_frame_qp = i4_value;
437*c83a76b0SSuyog Pawar break;
438*c83a76b0SSuyog Pawar
439*c83a76b0SSuyog Pawar case RC_LOOK_AHEAD_PICS:
440*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
441*c83a76b0SSuyog Pawar ps_static_prms->s_lap_prms.i4_rc_look_ahead_pics = i4_value;
442*c83a76b0SSuyog Pawar break;
443*c83a76b0SSuyog Pawar
444*c83a76b0SSuyog Pawar case CODEC_TYPE:
445*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
446*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_codec_type = i4_value;
447*c83a76b0SSuyog Pawar break;
448*c83a76b0SSuyog Pawar
449*c83a76b0SSuyog Pawar case CODEC_PROFILE:
450*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
451*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_codec_profile = i4_value;
452*c83a76b0SSuyog Pawar break;
453*c83a76b0SSuyog Pawar
454*c83a76b0SSuyog Pawar case CODEC_TIER:
455*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
456*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_codec_tier = i4_value;
457*c83a76b0SSuyog Pawar break;
458*c83a76b0SSuyog Pawar
459*c83a76b0SSuyog Pawar case SPS_AT_CDR_ENABLE:
460*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
461*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_sps_at_cdr_enable = i4_value;
462*c83a76b0SSuyog Pawar break;
463*c83a76b0SSuyog Pawar
464*c83a76b0SSuyog Pawar case VUI_ENABLE:
465*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
466*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_vui_enable = i4_value;
467*c83a76b0SSuyog Pawar break;
468*c83a76b0SSuyog Pawar
469*c83a76b0SSuyog Pawar case SEI_ENABLE_FLAGS:
470*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
471*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_sei_enable_flag = i4_value;
472*c83a76b0SSuyog Pawar break;
473*c83a76b0SSuyog Pawar
474*c83a76b0SSuyog Pawar case SEI_PAYLOAD_ENABLE_FLAGS:
475*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
476*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_sei_payload_enable_flag = i4_value;
477*c83a76b0SSuyog Pawar break;
478*c83a76b0SSuyog Pawar
479*c83a76b0SSuyog Pawar case SEI_PAYLOAD_PATH:
480*c83a76b0SSuyog Pawar sscanf(value, "%s", ps_ctxt->ai1_sei_payload_path);
481*c83a76b0SSuyog Pawar assert(strlen((char *)ps_ctxt->ai1_sei_payload_path) < STR_LEN);
482*c83a76b0SSuyog Pawar break;
483*c83a76b0SSuyog Pawar
484*c83a76b0SSuyog Pawar case SEI_BUFFER_PERIOD_FLAGS:
485*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
486*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_sei_buffer_period_flags = i4_value;
487*c83a76b0SSuyog Pawar break;
488*c83a76b0SSuyog Pawar
489*c83a76b0SSuyog Pawar case SEI_PIC_TIMING_FLAGS:
490*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
491*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_sei_pic_timing_flags = i4_value;
492*c83a76b0SSuyog Pawar break;
493*c83a76b0SSuyog Pawar
494*c83a76b0SSuyog Pawar case SEI_RECOVERY_POINT_FLAGS:
495*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
496*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_sei_recovery_point_flags = i4_value;
497*c83a76b0SSuyog Pawar break;
498*c83a76b0SSuyog Pawar
499*c83a76b0SSuyog Pawar case SEI_HASH_FLAGS:
500*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
501*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag = i4_value;
502*c83a76b0SSuyog Pawar break;
503*c83a76b0SSuyog Pawar
504*c83a76b0SSuyog Pawar case SEI_MASTERING_DISP_COLOUR_VOL_FLAGS:
505*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
506*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_sei_mastering_disp_colour_vol_flags = i4_value;
507*c83a76b0SSuyog Pawar break;
508*c83a76b0SSuyog Pawar
509*c83a76b0SSuyog Pawar case DISPLAY_PRIMARIES_X:
510*c83a76b0SSuyog Pawar {
511*c83a76b0SSuyog Pawar char *token;
512*c83a76b0SSuyog Pawar char *str;
513*c83a76b0SSuyog Pawar const char s[2] = ",";
514*c83a76b0SSuyog Pawar WORD32 i;
515*c83a76b0SSuyog Pawar
516*c83a76b0SSuyog Pawar if(0 == ps_static_prms->s_out_strm_prms.i4_sei_mastering_disp_colour_vol_flags)
517*c83a76b0SSuyog Pawar {
518*c83a76b0SSuyog Pawar break;
519*c83a76b0SSuyog Pawar }
520*c83a76b0SSuyog Pawar sscanf(value, "%s", pu1_keywd_str);
521*c83a76b0SSuyog Pawar
522*c83a76b0SSuyog Pawar str = (char *)pu1_keywd_str;
523*c83a76b0SSuyog Pawar token = strtok(str, s);
524*c83a76b0SSuyog Pawar
525*c83a76b0SSuyog Pawar for(i = 0; i < 3; i++)
526*c83a76b0SSuyog Pawar {
527*c83a76b0SSuyog Pawar if(token != NULL)
528*c83a76b0SSuyog Pawar {
529*c83a76b0SSuyog Pawar sscanf(token, "%d", &i4_value);
530*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.au2_display_primaries_x[i] = i4_value;
531*c83a76b0SSuyog Pawar token = strtok(NULL, s);
532*c83a76b0SSuyog Pawar }
533*c83a76b0SSuyog Pawar else if((token == NULL) && (i != 2))
534*c83a76b0SSuyog Pawar {
535*c83a76b0SSuyog Pawar printf("APLN ERROR >> Insufficient number of display_primary_x "
536*c83a76b0SSuyog Pawar "values entered \n");
537*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
538*c83a76b0SSuyog Pawar }
539*c83a76b0SSuyog Pawar }
540*c83a76b0SSuyog Pawar }
541*c83a76b0SSuyog Pawar break;
542*c83a76b0SSuyog Pawar
543*c83a76b0SSuyog Pawar case DISPLAY_PRIMARIES_Y:
544*c83a76b0SSuyog Pawar {
545*c83a76b0SSuyog Pawar char *token;
546*c83a76b0SSuyog Pawar char *str;
547*c83a76b0SSuyog Pawar const char s[2] = ",";
548*c83a76b0SSuyog Pawar WORD32 i;
549*c83a76b0SSuyog Pawar
550*c83a76b0SSuyog Pawar if(0 == ps_static_prms->s_out_strm_prms.i4_sei_mastering_disp_colour_vol_flags)
551*c83a76b0SSuyog Pawar {
552*c83a76b0SSuyog Pawar break;
553*c83a76b0SSuyog Pawar }
554*c83a76b0SSuyog Pawar sscanf(value, "%s", pu1_keywd_str);
555*c83a76b0SSuyog Pawar
556*c83a76b0SSuyog Pawar str = (char *)pu1_keywd_str;
557*c83a76b0SSuyog Pawar token = strtok(str, s);
558*c83a76b0SSuyog Pawar
559*c83a76b0SSuyog Pawar for(i = 0; i < 3; i++)
560*c83a76b0SSuyog Pawar {
561*c83a76b0SSuyog Pawar if(token != NULL)
562*c83a76b0SSuyog Pawar {
563*c83a76b0SSuyog Pawar sscanf(token, "%d", &i4_value);
564*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.au2_display_primaries_y[i] = i4_value;
565*c83a76b0SSuyog Pawar token = strtok(NULL, s);
566*c83a76b0SSuyog Pawar }
567*c83a76b0SSuyog Pawar else if((token == NULL) && (i != 2))
568*c83a76b0SSuyog Pawar {
569*c83a76b0SSuyog Pawar printf("APLN ERROR >> Insufficient number of display_primary_x "
570*c83a76b0SSuyog Pawar "values entered \n");
571*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
572*c83a76b0SSuyog Pawar }
573*c83a76b0SSuyog Pawar }
574*c83a76b0SSuyog Pawar }
575*c83a76b0SSuyog Pawar break;
576*c83a76b0SSuyog Pawar
577*c83a76b0SSuyog Pawar case WHITE_POINT_X:
578*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
579*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.u2_white_point_x = i4_value;
580*c83a76b0SSuyog Pawar break;
581*c83a76b0SSuyog Pawar
582*c83a76b0SSuyog Pawar case WHITE_POINT_Y:
583*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
584*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.u2_white_point_y = i4_value;
585*c83a76b0SSuyog Pawar break;
586*c83a76b0SSuyog Pawar
587*c83a76b0SSuyog Pawar case MAX_DISPLAY_MASTERING_LUMINANCE:
588*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
589*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.u4_max_display_mastering_luminance = i4_value;
590*c83a76b0SSuyog Pawar break;
591*c83a76b0SSuyog Pawar
592*c83a76b0SSuyog Pawar case MIN_DISPLAY_MASTERING_LUMINANCE:
593*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
594*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.u4_min_display_mastering_luminance = i4_value;
595*c83a76b0SSuyog Pawar break;
596*c83a76b0SSuyog Pawar
597*c83a76b0SSuyog Pawar case SEI_CLL_INFO_ENABLE:
598*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
599*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.i4_sei_cll_enable = i4_value;
600*c83a76b0SSuyog Pawar break;
601*c83a76b0SSuyog Pawar
602*c83a76b0SSuyog Pawar case SEI_MAX_CLL:
603*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
604*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.u2_sei_max_cll = i4_value;
605*c83a76b0SSuyog Pawar break;
606*c83a76b0SSuyog Pawar
607*c83a76b0SSuyog Pawar case SEI_AVG_CLL:
608*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
609*c83a76b0SSuyog Pawar ps_static_prms->s_out_strm_prms.u2_sei_avg_cll = i4_value;
610*c83a76b0SSuyog Pawar break;
611*c83a76b0SSuyog Pawar
612*c83a76b0SSuyog Pawar case TILES_ENABLED_FLAG:
613*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
614*c83a76b0SSuyog Pawar ps_static_prms->s_app_tile_params.i4_tiles_enabled_flag = i4_value;
615*c83a76b0SSuyog Pawar break;
616*c83a76b0SSuyog Pawar case SLICE_SEGMENT_MODE:
617*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
618*c83a76b0SSuyog Pawar ps_static_prms->s_slice_params.i4_slice_segment_mode = i4_value;
619*c83a76b0SSuyog Pawar break;
620*c83a76b0SSuyog Pawar case ASPECT_RATIO_INFO_PRESENT_FLAG:
621*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
622*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_aspect_ratio_info_present_flag = i4_value;
623*c83a76b0SSuyog Pawar break;
624*c83a76b0SSuyog Pawar
625*c83a76b0SSuyog Pawar case ASPECT_RATIO_IDC:
626*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
627*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.au1_aspect_ratio_idc[0] = i4_value;
628*c83a76b0SSuyog Pawar break;
629*c83a76b0SSuyog Pawar
630*c83a76b0SSuyog Pawar case SAR_WIDTH:
631*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
632*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.au2_sar_width[0] = i4_value;
633*c83a76b0SSuyog Pawar break;
634*c83a76b0SSuyog Pawar
635*c83a76b0SSuyog Pawar case SAR_HEIGHT:
636*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
637*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.au2_sar_height[0] = i4_value;
638*c83a76b0SSuyog Pawar break;
639*c83a76b0SSuyog Pawar
640*c83a76b0SSuyog Pawar case OVERSCAN_INFO_PRESENT_FLAG:
641*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
642*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_overscan_info_present_flag = i4_value;
643*c83a76b0SSuyog Pawar break;
644*c83a76b0SSuyog Pawar
645*c83a76b0SSuyog Pawar case OVERSCAN_APPROPRIATE_FLAG:
646*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
647*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_overscan_appropriate_flag = i4_value;
648*c83a76b0SSuyog Pawar break;
649*c83a76b0SSuyog Pawar
650*c83a76b0SSuyog Pawar case VIDEO_SIGNAL_TYPE_PRESENT_FLAG:
651*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
652*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_video_signal_type_present_flag = i4_value;
653*c83a76b0SSuyog Pawar break;
654*c83a76b0SSuyog Pawar
655*c83a76b0SSuyog Pawar case VIDEO_FORMAT:
656*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
657*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_video_format = i4_value;
658*c83a76b0SSuyog Pawar break;
659*c83a76b0SSuyog Pawar
660*c83a76b0SSuyog Pawar case VIDEO_FULL_RANGE_FLAG:
661*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
662*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_video_full_range_flag = i4_value;
663*c83a76b0SSuyog Pawar break;
664*c83a76b0SSuyog Pawar
665*c83a76b0SSuyog Pawar case COLOUR_DESCRIPTION_PRESENT_FLAG:
666*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
667*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_colour_description_present_flag = i4_value;
668*c83a76b0SSuyog Pawar break;
669*c83a76b0SSuyog Pawar
670*c83a76b0SSuyog Pawar case COLOUR_PRIMARIES:
671*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
672*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_colour_primaries = i4_value;
673*c83a76b0SSuyog Pawar break;
674*c83a76b0SSuyog Pawar
675*c83a76b0SSuyog Pawar case TRANSFER_CHARACTERISTICS:
676*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
677*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_transfer_characteristics = i4_value;
678*c83a76b0SSuyog Pawar break;
679*c83a76b0SSuyog Pawar
680*c83a76b0SSuyog Pawar case MATRIX_COEFFICIENTS:
681*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
682*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_matrix_coefficients = i4_value;
683*c83a76b0SSuyog Pawar break;
684*c83a76b0SSuyog Pawar
685*c83a76b0SSuyog Pawar case CHROMA_LOC_INFO_PRESENT_FLAG:
686*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
687*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_chroma_loc_info_present_flag = i4_value;
688*c83a76b0SSuyog Pawar break;
689*c83a76b0SSuyog Pawar
690*c83a76b0SSuyog Pawar case CHROMA_SAMPLE_LOC_TYPE_TOP_FIELD:
691*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
692*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_chroma_sample_loc_type_top_field = i4_value;
693*c83a76b0SSuyog Pawar break;
694*c83a76b0SSuyog Pawar
695*c83a76b0SSuyog Pawar case CHROMA_SAMPLE_LOC_TYPE_BOTTOM_FIELD:
696*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
697*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_chroma_sample_loc_type_bottom_field = i4_value;
698*c83a76b0SSuyog Pawar break;
699*c83a76b0SSuyog Pawar
700*c83a76b0SSuyog Pawar case TIMING_INFO_PRESENT_FLAG:
701*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
702*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_timing_info_present_flag = i4_value;
703*c83a76b0SSuyog Pawar break;
704*c83a76b0SSuyog Pawar
705*c83a76b0SSuyog Pawar case VUI_HRD_PARAMETERS_PRESENT_FLAG:
706*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
707*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_vui_hrd_parameters_present_flag = i4_value;
708*c83a76b0SSuyog Pawar break;
709*c83a76b0SSuyog Pawar
710*c83a76b0SSuyog Pawar case NAL_HRD_PARAMETERS_PRESENT_FLAG:
711*c83a76b0SSuyog Pawar sscanf(value, "%d", &i4_value);
712*c83a76b0SSuyog Pawar ps_static_prms->s_vui_sei_prms.u1_nal_hrd_parameters_present_flag = i4_value;
713*c83a76b0SSuyog Pawar break;
714*c83a76b0SSuyog Pawar
715*c83a76b0SSuyog Pawar case INVALID:
716*c83a76b0SSuyog Pawar default:
717*c83a76b0SSuyog Pawar printf("APLN ERROR >> Argument %s is invalid, ignoring \n", argument);
718*c83a76b0SSuyog Pawar break;
719*c83a76b0SSuyog Pawar }
720*c83a76b0SSuyog Pawar
721*c83a76b0SSuyog Pawar return IHEVCE_EOK;
722*c83a76b0SSuyog Pawar }
723*c83a76b0SSuyog Pawar
724*c83a76b0SSuyog Pawar /*!
725*c83a76b0SSuyog Pawar ******************************************************************************
726*c83a76b0SSuyog Pawar * \if Function name : read_cfg_file \endif
727*c83a76b0SSuyog Pawar *
728*c83a76b0SSuyog Pawar * \brief
729*c83a76b0SSuyog Pawar * Parse config file
730*c83a76b0SSuyog Pawar *
731*c83a76b0SSuyog Pawar *****************************************************************************
732*c83a76b0SSuyog Pawar */
read_cfg_file(appl_ctxt_t * ps_ctxt,FILE * fp_cfg)733*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T read_cfg_file(appl_ctxt_t *ps_ctxt, FILE *fp_cfg)
734*c83a76b0SSuyog Pawar {
735*c83a76b0SSuyog Pawar while(1)
736*c83a76b0SSuyog Pawar {
737*c83a76b0SSuyog Pawar CHAR line[STR_LEN] = { '\0' };
738*c83a76b0SSuyog Pawar CHAR argument[STR_LEN] = { '\0' };
739*c83a76b0SSuyog Pawar CHAR value[STR_LEN];
740*c83a76b0SSuyog Pawar CHAR description[STR_LEN];
741*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T status;
742*c83a76b0SSuyog Pawar
743*c83a76b0SSuyog Pawar if(NULL == fgets(line, STR_LEN, fp_cfg))
744*c83a76b0SSuyog Pawar return IHEVCE_EOK;
745*c83a76b0SSuyog Pawar
746*c83a76b0SSuyog Pawar /* split string on whitespace */
747*c83a76b0SSuyog Pawar sscanf(line, "%s %s %s", argument, value, description);
748*c83a76b0SSuyog Pawar if(argument[0] == '\0' || argument[0] == '#')
749*c83a76b0SSuyog Pawar continue;
750*c83a76b0SSuyog Pawar
751*c83a76b0SSuyog Pawar status = parse_argument(ps_ctxt, argument, value);
752*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
753*c83a76b0SSuyog Pawar {
754*c83a76b0SSuyog Pawar return status;
755*c83a76b0SSuyog Pawar }
756*c83a76b0SSuyog Pawar }
757*c83a76b0SSuyog Pawar }
758*c83a76b0SSuyog Pawar
759*c83a76b0SSuyog Pawar /*!
760*c83a76b0SSuyog Pawar ******************************************************************************
761*c83a76b0SSuyog Pawar * \if Function name : libihevce_encode_init \endif
762*c83a76b0SSuyog Pawar *
763*c83a76b0SSuyog Pawar * \brief
764*c83a76b0SSuyog Pawar * Allocates the memory and calls encoder init
765*c83a76b0SSuyog Pawar *
766*c83a76b0SSuyog Pawar *****************************************************************************
767*c83a76b0SSuyog Pawar */
libihevce_encode_init(appl_ctxt_t * ps_ctxt)768*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T libihevce_encode_init(appl_ctxt_t *ps_ctxt)
769*c83a76b0SSuyog Pawar {
770*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *params = &ps_ctxt->s_static_cfg_prms;
771*c83a76b0SSuyog Pawar CHAR ac_error[STR_LEN];
772*c83a76b0SSuyog Pawar
773*c83a76b0SSuyog Pawar /* call the function to initialise encoder*/
774*c83a76b0SSuyog Pawar if(IHEVCE_EFAIL == ihevce_init(params, (void *)&ps_ctxt->ihevceHdl))
775*c83a76b0SSuyog Pawar {
776*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to initialise libihevce encoder\n");
777*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
778*c83a76b0SSuyog Pawar }
779*c83a76b0SSuyog Pawar
780*c83a76b0SSuyog Pawar return IHEVCE_EOK;
781*c83a76b0SSuyog Pawar }
782*c83a76b0SSuyog Pawar
783*c83a76b0SSuyog Pawar /*!
784*c83a76b0SSuyog Pawar ******************************************************************************
785*c83a76b0SSuyog Pawar * \if Function name : allocate_input \endif
786*c83a76b0SSuyog Pawar *
787*c83a76b0SSuyog Pawar * \brief
788*c83a76b0SSuyog Pawar * allocate input buffers
789*c83a76b0SSuyog Pawar *
790*c83a76b0SSuyog Pawar *****************************************************************************
791*c83a76b0SSuyog Pawar */
allocate_input(appl_ctxt_t * ps_ctxt,ihevce_inp_buf_t * inp_pic)792*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T allocate_input(appl_ctxt_t *ps_ctxt, ihevce_inp_buf_t *inp_pic)
793*c83a76b0SSuyog Pawar {
794*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *params = &ps_ctxt->s_static_cfg_prms;
795*c83a76b0SSuyog Pawar WORD32 y_sz = params->s_src_prms.i4_width * params->s_src_prms.i4_height;
796*c83a76b0SSuyog Pawar WORD32 uv_sz = y_sz >> 1;
797*c83a76b0SSuyog Pawar WORD32 pic_size = y_sz + uv_sz;
798*c83a76b0SSuyog Pawar UWORD8 *pu1_buf;
799*c83a76b0SSuyog Pawar
800*c83a76b0SSuyog Pawar #ifdef X86_MINGW
801*c83a76b0SSuyog Pawar pu1_buf = (UWORD8 *)_aligned_malloc(pic_size, 64);
802*c83a76b0SSuyog Pawar #else
803*c83a76b0SSuyog Pawar if (0 != posix_memalign((void **)&pu1_buf, 64, pic_size))
804*c83a76b0SSuyog Pawar {
805*c83a76b0SSuyog Pawar return (IHEVCE_EFAIL);
806*c83a76b0SSuyog Pawar }
807*c83a76b0SSuyog Pawar #endif
808*c83a76b0SSuyog Pawar if(NULL == pu1_buf)
809*c83a76b0SSuyog Pawar {
810*c83a76b0SSuyog Pawar return (IHEVCE_EFAIL);
811*c83a76b0SSuyog Pawar }
812*c83a76b0SSuyog Pawar if(IV_YUV_420P == params->s_src_prms.inp_chr_format)
813*c83a76b0SSuyog Pawar {
814*c83a76b0SSuyog Pawar inp_pic->apv_inp_planes[0] = pu1_buf;
815*c83a76b0SSuyog Pawar inp_pic->apv_inp_planes[1] = pu1_buf + y_sz;
816*c83a76b0SSuyog Pawar inp_pic->apv_inp_planes[2] = pu1_buf + y_sz + (uv_sz >> 1);
817*c83a76b0SSuyog Pawar
818*c83a76b0SSuyog Pawar inp_pic->ai4_inp_strd[0] = params->s_src_prms.i4_width;
819*c83a76b0SSuyog Pawar inp_pic->ai4_inp_strd[1] = params->s_src_prms.i4_width >> 1;
820*c83a76b0SSuyog Pawar inp_pic->ai4_inp_strd[2] = params->s_src_prms.i4_width >> 1;
821*c83a76b0SSuyog Pawar
822*c83a76b0SSuyog Pawar inp_pic->ai4_inp_size[0] = y_sz;
823*c83a76b0SSuyog Pawar inp_pic->ai4_inp_size[1] = (uv_sz >> 1);
824*c83a76b0SSuyog Pawar inp_pic->ai4_inp_size[2] = (uv_sz >> 1);
825*c83a76b0SSuyog Pawar }
826*c83a76b0SSuyog Pawar else if(IV_YUV_420SP_UV == params->s_src_prms.inp_chr_format)
827*c83a76b0SSuyog Pawar {
828*c83a76b0SSuyog Pawar inp_pic->apv_inp_planes[0] = pu1_buf;
829*c83a76b0SSuyog Pawar inp_pic->apv_inp_planes[1] = pu1_buf + y_sz;
830*c83a76b0SSuyog Pawar inp_pic->apv_inp_planes[2] = NULL;
831*c83a76b0SSuyog Pawar
832*c83a76b0SSuyog Pawar inp_pic->ai4_inp_strd[0] = params->s_src_prms.i4_width;
833*c83a76b0SSuyog Pawar inp_pic->ai4_inp_strd[1] = params->s_src_prms.i4_width;
834*c83a76b0SSuyog Pawar inp_pic->ai4_inp_strd[2] = 0;
835*c83a76b0SSuyog Pawar
836*c83a76b0SSuyog Pawar inp_pic->ai4_inp_size[0] = y_sz;
837*c83a76b0SSuyog Pawar inp_pic->ai4_inp_size[1] = uv_sz;
838*c83a76b0SSuyog Pawar inp_pic->ai4_inp_size[2] = 0;
839*c83a76b0SSuyog Pawar }
840*c83a76b0SSuyog Pawar
841*c83a76b0SSuyog Pawar inp_pic->i4_curr_bitrate = params->s_tgt_lyr_prms.as_tgt_params[0].ai4_tgt_bitrate[0];
842*c83a76b0SSuyog Pawar inp_pic->i4_curr_peak_bitrate = params->s_tgt_lyr_prms.as_tgt_params[0].ai4_peak_bitrate[0];
843*c83a76b0SSuyog Pawar inp_pic->u8_pts = 0;
844*c83a76b0SSuyog Pawar inp_pic->i4_force_idr_flag = 0;
845*c83a76b0SSuyog Pawar
846*c83a76b0SSuyog Pawar return IHEVCE_EOK;
847*c83a76b0SSuyog Pawar }
848*c83a76b0SSuyog Pawar
849*c83a76b0SSuyog Pawar /*!
850*c83a76b0SSuyog Pawar ******************************************************************************
851*c83a76b0SSuyog Pawar * \if Function name : read_input \endif
852*c83a76b0SSuyog Pawar *
853*c83a76b0SSuyog Pawar * \brief
854*c83a76b0SSuyog Pawar * read input from a file
855*c83a76b0SSuyog Pawar *
856*c83a76b0SSuyog Pawar *****************************************************************************
857*c83a76b0SSuyog Pawar */
read_input(appl_ctxt_t * ps_ctxt,FILE * fp,ihevce_inp_buf_t * inp_pic)858*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T read_input(appl_ctxt_t *ps_ctxt, FILE *fp, ihevce_inp_buf_t *inp_pic)
859*c83a76b0SSuyog Pawar {
860*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *params = &ps_ctxt->s_static_cfg_prms;
861*c83a76b0SSuyog Pawar WORD32 au4_wd[3] = { 0 };
862*c83a76b0SSuyog Pawar WORD32 au4_ht[3] = { 0 };
863*c83a76b0SSuyog Pawar WORD32 num_comp = 3;
864*c83a76b0SSuyog Pawar WORD32 comp_idx;
865*c83a76b0SSuyog Pawar WORD32 i;
866*c83a76b0SSuyog Pawar
867*c83a76b0SSuyog Pawar if(IV_YUV_420P == params->s_src_prms.inp_chr_format)
868*c83a76b0SSuyog Pawar {
869*c83a76b0SSuyog Pawar au4_wd[0] = params->s_src_prms.i4_width;
870*c83a76b0SSuyog Pawar au4_wd[1] = au4_wd[2] = params->s_src_prms.i4_width >> 1;
871*c83a76b0SSuyog Pawar au4_ht[0] = params->s_src_prms.i4_height;
872*c83a76b0SSuyog Pawar au4_ht[1] = au4_ht[2] = params->s_src_prms.i4_height >> 1;
873*c83a76b0SSuyog Pawar
874*c83a76b0SSuyog Pawar num_comp = 3;
875*c83a76b0SSuyog Pawar }
876*c83a76b0SSuyog Pawar else if(IV_YUV_420SP_UV == params->s_src_prms.inp_chr_format)
877*c83a76b0SSuyog Pawar {
878*c83a76b0SSuyog Pawar au4_wd[0] = params->s_src_prms.i4_width;
879*c83a76b0SSuyog Pawar au4_wd[1] = params->s_src_prms.i4_width;
880*c83a76b0SSuyog Pawar au4_ht[0] = params->s_src_prms.i4_height;
881*c83a76b0SSuyog Pawar au4_ht[1] = params->s_src_prms.i4_height >> 1;
882*c83a76b0SSuyog Pawar
883*c83a76b0SSuyog Pawar num_comp = 2;
884*c83a76b0SSuyog Pawar }
885*c83a76b0SSuyog Pawar
886*c83a76b0SSuyog Pawar for(comp_idx = 0; comp_idx < num_comp; comp_idx++)
887*c83a76b0SSuyog Pawar {
888*c83a76b0SSuyog Pawar WORD32 wd = au4_wd[comp_idx];
889*c83a76b0SSuyog Pawar WORD32 ht = au4_ht[comp_idx];
890*c83a76b0SSuyog Pawar WORD32 strd = inp_pic->ai4_inp_strd[comp_idx];
891*c83a76b0SSuyog Pawar UWORD8 *pu1_buf = inp_pic->apv_inp_planes[comp_idx];
892*c83a76b0SSuyog Pawar
893*c83a76b0SSuyog Pawar for(i = 0; i < ht; i++)
894*c83a76b0SSuyog Pawar {
895*c83a76b0SSuyog Pawar WORD32 bytes = fread(pu1_buf, sizeof(UWORD8), wd, fp);
896*c83a76b0SSuyog Pawar if(bytes != wd)
897*c83a76b0SSuyog Pawar {
898*c83a76b0SSuyog Pawar return (IHEVCE_EFAIL);
899*c83a76b0SSuyog Pawar }
900*c83a76b0SSuyog Pawar pu1_buf += strd;
901*c83a76b0SSuyog Pawar }
902*c83a76b0SSuyog Pawar }
903*c83a76b0SSuyog Pawar
904*c83a76b0SSuyog Pawar return IHEVCE_EOK;
905*c83a76b0SSuyog Pawar }
906*c83a76b0SSuyog Pawar
907*c83a76b0SSuyog Pawar /*!
908*c83a76b0SSuyog Pawar ******************************************************************************
909*c83a76b0SSuyog Pawar * \if Function name : write_output \endif
910*c83a76b0SSuyog Pawar *
911*c83a76b0SSuyog Pawar * \brief
912*c83a76b0SSuyog Pawar * Write bitstream buffers to a file
913*c83a76b0SSuyog Pawar *
914*c83a76b0SSuyog Pawar *****************************************************************************
915*c83a76b0SSuyog Pawar */
write_output(FILE * fp,ihevce_out_buf_t * out_pic)916*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T write_output(FILE *fp, ihevce_out_buf_t *out_pic)
917*c83a76b0SSuyog Pawar {
918*c83a76b0SSuyog Pawar WORD32 bytes;
919*c83a76b0SSuyog Pawar
920*c83a76b0SSuyog Pawar bytes = fwrite(out_pic->pu1_output_buf, sizeof(UWORD8), out_pic->i4_bytes_generated, fp);
921*c83a76b0SSuyog Pawar if(bytes != out_pic->i4_bytes_generated)
922*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
923*c83a76b0SSuyog Pawar
924*c83a76b0SSuyog Pawar return IHEVCE_EOK;
925*c83a76b0SSuyog Pawar }
926*c83a76b0SSuyog Pawar
927*c83a76b0SSuyog Pawar /*!
928*c83a76b0SSuyog Pawar ******************************************************************************
929*c83a76b0SSuyog Pawar * \if Function name : free_input \endif
930*c83a76b0SSuyog Pawar *
931*c83a76b0SSuyog Pawar * \brief
932*c83a76b0SSuyog Pawar * free input buffers
933*c83a76b0SSuyog Pawar *
934*c83a76b0SSuyog Pawar *****************************************************************************
935*c83a76b0SSuyog Pawar */
free_input(ihevce_inp_buf_t * inp_pic)936*c83a76b0SSuyog Pawar void free_input(ihevce_inp_buf_t *inp_pic)
937*c83a76b0SSuyog Pawar {
938*c83a76b0SSuyog Pawar if(inp_pic->apv_inp_planes[0])
939*c83a76b0SSuyog Pawar {
940*c83a76b0SSuyog Pawar #ifdef X86_MINGW
941*c83a76b0SSuyog Pawar _aligned_free(inp_pic->apv_inp_planes[0]);
942*c83a76b0SSuyog Pawar #else
943*c83a76b0SSuyog Pawar free(inp_pic->apv_inp_planes[0]);
944*c83a76b0SSuyog Pawar #endif
945*c83a76b0SSuyog Pawar }
946*c83a76b0SSuyog Pawar }
947*c83a76b0SSuyog Pawar
948*c83a76b0SSuyog Pawar /*!
949*c83a76b0SSuyog Pawar ******************************************************************************
950*c83a76b0SSuyog Pawar * \if Function name : libihevce_encode_close \endif
951*c83a76b0SSuyog Pawar *
952*c83a76b0SSuyog Pawar * \brief
953*c83a76b0SSuyog Pawar * Frees all the allocated resources and call encoder free
954*c83a76b0SSuyog Pawar *
955*c83a76b0SSuyog Pawar *****************************************************************************
956*c83a76b0SSuyog Pawar */
libihevce_encode_close(appl_ctxt_t * ps_ctxt)957*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T libihevce_encode_close(appl_ctxt_t *ps_ctxt)
958*c83a76b0SSuyog Pawar {
959*c83a76b0SSuyog Pawar /* encoder close */
960*c83a76b0SSuyog Pawar if(ps_ctxt->ihevceHdl)
961*c83a76b0SSuyog Pawar ihevce_close(ps_ctxt->ihevceHdl);
962*c83a76b0SSuyog Pawar
963*c83a76b0SSuyog Pawar return IHEVCE_EOK;
964*c83a76b0SSuyog Pawar }
965*c83a76b0SSuyog Pawar
966*c83a76b0SSuyog Pawar /*!
967*c83a76b0SSuyog Pawar ******************************************************************************
968*c83a76b0SSuyog Pawar * \if Function name : libihevce_encode_frame \endif
969*c83a76b0SSuyog Pawar *
970*c83a76b0SSuyog Pawar * \brief
971*c83a76b0SSuyog Pawar * Calls encoder process and copied the output to pckt buffer
972*c83a76b0SSuyog Pawar *
973*c83a76b0SSuyog Pawar *****************************************************************************
974*c83a76b0SSuyog Pawar */
libihevce_encode_frame(appl_ctxt_t * ps_ctxt,FILE * pf_inp_yuv,FILE * pf_out)975*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T libihevce_encode_frame(appl_ctxt_t *ps_ctxt, FILE *pf_inp_yuv, FILE *pf_out)
976*c83a76b0SSuyog Pawar {
977*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *params = &ps_ctxt->s_static_cfg_prms;
978*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T status = IHEVCE_EOK;
979*c83a76b0SSuyog Pawar WORD32 i4_num_frames = 0;
980*c83a76b0SSuyog Pawar ihevce_inp_buf_t inp_pic;
981*c83a76b0SSuyog Pawar ihevce_out_buf_t out_pic;
982*c83a76b0SSuyog Pawar CHAR ac_error[STR_LEN];
983*c83a76b0SSuyog Pawar profile_database_t s_profile_data;
984*c83a76b0SSuyog Pawar #if HEADER_MODE
985*c83a76b0SSuyog Pawar ihevce_out_buf_t out_pic_hdr;
986*c83a76b0SSuyog Pawar #endif
987*c83a76b0SSuyog Pawar
988*c83a76b0SSuyog Pawar (void)s_profile_data;
989*c83a76b0SSuyog Pawar memset(&inp_pic, 0, sizeof(inp_pic));
990*c83a76b0SSuyog Pawar memset(&out_pic, 0, sizeof(out_pic));
991*c83a76b0SSuyog Pawar #if HEADER_MODE
992*c83a76b0SSuyog Pawar memset(&out_pic_hdr, 0, sizeof(out_pic_hdr));
993*c83a76b0SSuyog Pawar #endif
994*c83a76b0SSuyog Pawar
995*c83a76b0SSuyog Pawar status = allocate_input(ps_ctxt, &inp_pic);
996*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
997*c83a76b0SSuyog Pawar {
998*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to allocate input");
999*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
1000*c83a76b0SSuyog Pawar }
1001*c83a76b0SSuyog Pawar
1002*c83a76b0SSuyog Pawar #if HEADER_MODE
1003*c83a76b0SSuyog Pawar status = ihevce_encode_header(ps_ctxt->ihevceHdl, &out_pic_hdr);
1004*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1005*c83a76b0SSuyog Pawar {
1006*c83a76b0SSuyog Pawar sprintf(ac_error, "encode header call failed");
1007*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
1008*c83a76b0SSuyog Pawar }
1009*c83a76b0SSuyog Pawar if(out_pic_hdr.i4_bytes_generated)
1010*c83a76b0SSuyog Pawar {
1011*c83a76b0SSuyog Pawar status = write_output(pf_out, &out_pic_hdr);
1012*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1013*c83a76b0SSuyog Pawar {
1014*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to write output");
1015*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
1016*c83a76b0SSuyog Pawar }
1017*c83a76b0SSuyog Pawar }
1018*c83a76b0SSuyog Pawar #endif
1019*c83a76b0SSuyog Pawar
1020*c83a76b0SSuyog Pawar PROFILE_INIT(&s_profile_data);
1021*c83a76b0SSuyog Pawar
1022*c83a76b0SSuyog Pawar while(1)
1023*c83a76b0SSuyog Pawar {
1024*c83a76b0SSuyog Pawar ihevce_inp_buf_t *ps_inp_pic = &inp_pic;
1025*c83a76b0SSuyog Pawar
1026*c83a76b0SSuyog Pawar ps_inp_pic->i4_force_idr_flag = 0;
1027*c83a76b0SSuyog Pawar
1028*c83a76b0SSuyog Pawar if(i4_num_frames < params->s_config_prms.i4_num_frms_to_encode)
1029*c83a76b0SSuyog Pawar {
1030*c83a76b0SSuyog Pawar status = read_input(ps_ctxt, pf_inp_yuv, &inp_pic);
1031*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1032*c83a76b0SSuyog Pawar {
1033*c83a76b0SSuyog Pawar ps_inp_pic = NULL;
1034*c83a76b0SSuyog Pawar }
1035*c83a76b0SSuyog Pawar }
1036*c83a76b0SSuyog Pawar else
1037*c83a76b0SSuyog Pawar {
1038*c83a76b0SSuyog Pawar ps_inp_pic = NULL;
1039*c83a76b0SSuyog Pawar }
1040*c83a76b0SSuyog Pawar #if DYN_BITRATE_TEST
1041*c83a76b0SSuyog Pawar if((i4_num_frames == 200) && (ps_inp_pic != NULL))
1042*c83a76b0SSuyog Pawar {
1043*c83a76b0SSuyog Pawar ps_inp_pic->i4_curr_bitrate = ps_inp_pic->i4_curr_bitrate << 1;
1044*c83a76b0SSuyog Pawar }
1045*c83a76b0SSuyog Pawar #endif
1046*c83a76b0SSuyog Pawar #if FORCE_IDR_TEST
1047*c83a76b0SSuyog Pawar if((i4_num_frames == 70) && (ps_inp_pic != NULL))
1048*c83a76b0SSuyog Pawar {
1049*c83a76b0SSuyog Pawar ps_inp_pic->i4_force_idr_flag = 1;
1050*c83a76b0SSuyog Pawar }
1051*c83a76b0SSuyog Pawar #endif
1052*c83a76b0SSuyog Pawar /* call encoder process frame */
1053*c83a76b0SSuyog Pawar PROFILE_START(&s_profile_data);
1054*c83a76b0SSuyog Pawar status = ihevce_encode(ps_ctxt->ihevceHdl, ps_inp_pic, &out_pic);
1055*c83a76b0SSuyog Pawar PROFILE_STOP(&s_profile_data, NULL);
1056*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1057*c83a76b0SSuyog Pawar {
1058*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to process encode");
1059*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
1060*c83a76b0SSuyog Pawar }
1061*c83a76b0SSuyog Pawar
1062*c83a76b0SSuyog Pawar if(out_pic.i4_bytes_generated)
1063*c83a76b0SSuyog Pawar {
1064*c83a76b0SSuyog Pawar status = write_output(pf_out, &out_pic);
1065*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1066*c83a76b0SSuyog Pawar {
1067*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to write output");
1068*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
1069*c83a76b0SSuyog Pawar }
1070*c83a76b0SSuyog Pawar }
1071*c83a76b0SSuyog Pawar
1072*c83a76b0SSuyog Pawar if(out_pic.i4_end_flag)
1073*c83a76b0SSuyog Pawar break;
1074*c83a76b0SSuyog Pawar
1075*c83a76b0SSuyog Pawar i4_num_frames++;
1076*c83a76b0SSuyog Pawar inp_pic.u8_pts +=
1077*c83a76b0SSuyog Pawar (1000000 * params->s_src_prms.i4_frm_rate_denom) / params->s_src_prms.i4_frm_rate_num;
1078*c83a76b0SSuyog Pawar }
1079*c83a76b0SSuyog Pawar
1080*c83a76b0SSuyog Pawar PROFILE_END(&s_profile_data, "encode API call");
1081*c83a76b0SSuyog Pawar
1082*c83a76b0SSuyog Pawar free_input(&inp_pic);
1083*c83a76b0SSuyog Pawar
1084*c83a76b0SSuyog Pawar return IHEVCE_EOK;
1085*c83a76b0SSuyog Pawar }
1086*c83a76b0SSuyog Pawar
1087*c83a76b0SSuyog Pawar /*!
1088*c83a76b0SSuyog Pawar ******************************************************************************
1089*c83a76b0SSuyog Pawar * \if Function name : main \endif
1090*c83a76b0SSuyog Pawar *
1091*c83a76b0SSuyog Pawar * \brief
1092*c83a76b0SSuyog Pawar * Application to demonstrate codec API. Shows how to use create,
1093*c83a76b0SSuyog Pawar * process, control and delete
1094*c83a76b0SSuyog Pawar *
1095*c83a76b0SSuyog Pawar *****************************************************************************
1096*c83a76b0SSuyog Pawar */
main(int argc,char * argv[])1097*c83a76b0SSuyog Pawar int main(int argc, char *argv[])
1098*c83a76b0SSuyog Pawar {
1099*c83a76b0SSuyog Pawar /* Main context */
1100*c83a76b0SSuyog Pawar main_ctxt_t s_main_ctxt;
1101*c83a76b0SSuyog Pawar
1102*c83a76b0SSuyog Pawar /* app ctxt */
1103*c83a76b0SSuyog Pawar appl_ctxt_t *ps_ctxt = &s_main_ctxt.s_app_ctxt;
1104*c83a76b0SSuyog Pawar
1105*c83a76b0SSuyog Pawar /* cfg params */
1106*c83a76b0SSuyog Pawar ihevce_static_cfg_params_t *params = &ps_ctxt->s_static_cfg_prms;
1107*c83a76b0SSuyog Pawar
1108*c83a76b0SSuyog Pawar /* error string */
1109*c83a76b0SSuyog Pawar CHAR ac_error[STR_LEN];
1110*c83a76b0SSuyog Pawar
1111*c83a76b0SSuyog Pawar /* config file name */
1112*c83a76b0SSuyog Pawar CHAR ac_cfg_fname[STR_LEN];
1113*c83a76b0SSuyog Pawar
1114*c83a76b0SSuyog Pawar WORD32 i;
1115*c83a76b0SSuyog Pawar FILE *fp_cfg = NULL;
1116*c83a76b0SSuyog Pawar FILE *pf_inp_yuv = NULL;
1117*c83a76b0SSuyog Pawar FILE *pf_out = NULL;
1118*c83a76b0SSuyog Pawar
1119*c83a76b0SSuyog Pawar /* error status */
1120*c83a76b0SSuyog Pawar IHEVCE_PLUGIN_STATUS_T status = IHEVCE_EOK;
1121*c83a76b0SSuyog Pawar
1122*c83a76b0SSuyog Pawar /* call the function to set default params */
1123*c83a76b0SSuyog Pawar if(IHEVCE_EFAIL == ihevce_set_def_params(params))
1124*c83a76b0SSuyog Pawar {
1125*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to set default parameters\n");
1126*c83a76b0SSuyog Pawar codec_exit(ac_error);
1127*c83a76b0SSuyog Pawar }
1128*c83a76b0SSuyog Pawar
1129*c83a76b0SSuyog Pawar /* Usage */
1130*c83a76b0SSuyog Pawar if(argc < 2)
1131*c83a76b0SSuyog Pawar {
1132*c83a76b0SSuyog Pawar printf("Using enc.cfg as configuration file \n");
1133*c83a76b0SSuyog Pawar strcpy(ac_cfg_fname, "enc.cfg");
1134*c83a76b0SSuyog Pawar }
1135*c83a76b0SSuyog Pawar else if(argc == 2)
1136*c83a76b0SSuyog Pawar {
1137*c83a76b0SSuyog Pawar if(!strcmp(argv[1], "--help"))
1138*c83a76b0SSuyog Pawar {
1139*c83a76b0SSuyog Pawar print_usage();
1140*c83a76b0SSuyog Pawar exit(-1);
1141*c83a76b0SSuyog Pawar }
1142*c83a76b0SSuyog Pawar strcpy(ac_cfg_fname, argv[1]);
1143*c83a76b0SSuyog Pawar }
1144*c83a76b0SSuyog Pawar
1145*c83a76b0SSuyog Pawar /*************************************************************************/
1146*c83a76b0SSuyog Pawar /* Parse arguments */
1147*c83a76b0SSuyog Pawar /*************************************************************************/
1148*c83a76b0SSuyog Pawar /* Read command line arguments */
1149*c83a76b0SSuyog Pawar if(argc > 2)
1150*c83a76b0SSuyog Pawar {
1151*c83a76b0SSuyog Pawar for(i = 1; i + 1 < argc; i += 2)
1152*c83a76b0SSuyog Pawar {
1153*c83a76b0SSuyog Pawar if(CONFIG == get_argument(argv[i]))
1154*c83a76b0SSuyog Pawar {
1155*c83a76b0SSuyog Pawar strcpy(ac_cfg_fname, argv[i + 1]);
1156*c83a76b0SSuyog Pawar if((fp_cfg = fopen(ac_cfg_fname, "r")) == NULL)
1157*c83a76b0SSuyog Pawar {
1158*c83a76b0SSuyog Pawar sprintf(ac_error, "Could not open Configuration file %s", ac_cfg_fname);
1159*c83a76b0SSuyog Pawar codec_exit(ac_error);
1160*c83a76b0SSuyog Pawar }
1161*c83a76b0SSuyog Pawar status = read_cfg_file(ps_ctxt, fp_cfg);
1162*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1163*c83a76b0SSuyog Pawar {
1164*c83a76b0SSuyog Pawar sprintf(ac_error, "Encountered error in cfg file");
1165*c83a76b0SSuyog Pawar codec_exit(ac_error);
1166*c83a76b0SSuyog Pawar }
1167*c83a76b0SSuyog Pawar fclose(fp_cfg);
1168*c83a76b0SSuyog Pawar }
1169*c83a76b0SSuyog Pawar else
1170*c83a76b0SSuyog Pawar {
1171*c83a76b0SSuyog Pawar status = parse_argument(ps_ctxt, argv[i], argv[i + 1]);
1172*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1173*c83a76b0SSuyog Pawar {
1174*c83a76b0SSuyog Pawar sprintf(ac_error, "Encountered error in cfg file");
1175*c83a76b0SSuyog Pawar codec_exit(ac_error);
1176*c83a76b0SSuyog Pawar }
1177*c83a76b0SSuyog Pawar }
1178*c83a76b0SSuyog Pawar }
1179*c83a76b0SSuyog Pawar }
1180*c83a76b0SSuyog Pawar else
1181*c83a76b0SSuyog Pawar {
1182*c83a76b0SSuyog Pawar if((fp_cfg = fopen(ac_cfg_fname, "r")) == NULL)
1183*c83a76b0SSuyog Pawar {
1184*c83a76b0SSuyog Pawar sprintf(ac_error, "Could not open Configuration file %s", ac_cfg_fname);
1185*c83a76b0SSuyog Pawar codec_exit(ac_error);
1186*c83a76b0SSuyog Pawar }
1187*c83a76b0SSuyog Pawar status = read_cfg_file(ps_ctxt, fp_cfg);
1188*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1189*c83a76b0SSuyog Pawar {
1190*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to set Configuration parameter");
1191*c83a76b0SSuyog Pawar codec_exit(ac_error);
1192*c83a76b0SSuyog Pawar }
1193*c83a76b0SSuyog Pawar fclose(fp_cfg);
1194*c83a76b0SSuyog Pawar }
1195*c83a76b0SSuyog Pawar
1196*c83a76b0SSuyog Pawar pf_inp_yuv = fopen(ps_ctxt->au1_in_file, "rb");
1197*c83a76b0SSuyog Pawar printf("Input file %s \n", ps_ctxt->au1_in_file);
1198*c83a76b0SSuyog Pawar if(NULL == pf_inp_yuv)
1199*c83a76b0SSuyog Pawar {
1200*c83a76b0SSuyog Pawar sprintf(ac_error, "Could not open input file");
1201*c83a76b0SSuyog Pawar codec_exit(ac_error);
1202*c83a76b0SSuyog Pawar }
1203*c83a76b0SSuyog Pawar
1204*c83a76b0SSuyog Pawar pf_out = fopen(ps_ctxt->au1_out_file[0][0], "wb");
1205*c83a76b0SSuyog Pawar printf("Output file %s \n", ps_ctxt->au1_out_file[0][0]);
1206*c83a76b0SSuyog Pawar if(NULL == pf_out)
1207*c83a76b0SSuyog Pawar {
1208*c83a76b0SSuyog Pawar sprintf(ac_error, "Could not open output file");
1209*c83a76b0SSuyog Pawar codec_exit(ac_error);
1210*c83a76b0SSuyog Pawar }
1211*c83a76b0SSuyog Pawar
1212*c83a76b0SSuyog Pawar status = libihevce_encode_init(ps_ctxt);
1213*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1214*c83a76b0SSuyog Pawar {
1215*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to init encoder");
1216*c83a76b0SSuyog Pawar codec_exit(ac_error);
1217*c83a76b0SSuyog Pawar }
1218*c83a76b0SSuyog Pawar
1219*c83a76b0SSuyog Pawar status = libihevce_encode_frame(ps_ctxt, pf_inp_yuv, pf_out);
1220*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1221*c83a76b0SSuyog Pawar {
1222*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to encode frame");
1223*c83a76b0SSuyog Pawar codec_exit(ac_error);
1224*c83a76b0SSuyog Pawar }
1225*c83a76b0SSuyog Pawar
1226*c83a76b0SSuyog Pawar status = libihevce_encode_close(ps_ctxt);
1227*c83a76b0SSuyog Pawar if(status != IHEVCE_EOK)
1228*c83a76b0SSuyog Pawar {
1229*c83a76b0SSuyog Pawar sprintf(ac_error, "Unable to close encoder");
1230*c83a76b0SSuyog Pawar return IHEVCE_EFAIL;
1231*c83a76b0SSuyog Pawar }
1232*c83a76b0SSuyog Pawar
1233*c83a76b0SSuyog Pawar if(NULL != pf_inp_yuv)
1234*c83a76b0SSuyog Pawar fclose(pf_inp_yuv);
1235*c83a76b0SSuyog Pawar
1236*c83a76b0SSuyog Pawar if(NULL != pf_out)
1237*c83a76b0SSuyog Pawar fclose(pf_out);
1238*c83a76b0SSuyog Pawar
1239*c83a76b0SSuyog Pawar return 0;
1240*c83a76b0SSuyog Pawar }
1241