xref: /aosp_15_r20/external/libhevc/test/encoder/main.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
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