| From eca467944c65f0d230f407b92175df65c3708521 Mon Sep 17 00:00:00 2001 |
| From: Sudarshan S <sudarshan.s@intel.com> |
| Date: Tue, 9 Feb 2021 20:20:42 +0530 |
| Subject: [PATCH] h264encode : Added low_power command line option |
| |
| h264encode utilty failed to run on the platforms where only low-power |
| (VAEntryPointEncSliceLPi)entrypoints are supported . This change adds |
| a low_power command line option. |
| --- |
| encode/h264encode.c | 39 ++++++++++++++++++++++++++++++++++----- |
| 1 file changed, 34 insertions(+), 5 deletions(-) |
| |
| diff --git a/encode/h264encode.c b/encode/h264encode.c |
| index 4bb1f12..5486df9 100644 |
| --- a/encode/h264encode.c |
| +++ b/encode/h264encode.c |
| @@ -174,6 +174,10 @@ static unsigned int SyncPictureTicks=0; |
| static unsigned int SavePictureTicks=0; |
| static unsigned int TotalTicks=0; |
| |
| +//Default entrypoint for Encode |
| +static VAEntrypoint requested_entrypoint = -1; |
| +static VAEntrypoint selected_entrypoint = -1; |
| + |
| struct __bitstream { |
| unsigned int *buffer; |
| int bit_offset; |
| @@ -860,6 +864,7 @@ static int print_help(void) |
| printf(" --enablePSNR calculate PSNR of recyuv vs. srcyuv\n"); |
| printf(" --entropy <0|1>, 1 means cabac, 0 cavlc\n"); |
| printf(" --profile <BP|MP|HP>\n"); |
| + printf(" --low_power <num> 0: Normal mode, 1: Low power mode, others: auto mode\n"); |
| return 0; |
| } |
| |
| @@ -885,6 +890,7 @@ static int process_cmdline(int argc, char *argv[]) |
| {"framecount", required_argument, NULL, 16 }, |
| {"entropy", required_argument, NULL, 17 }, |
| {"profile", required_argument, NULL, 18 }, |
| + {"low_power", required_argument, NULL, 19 }, |
| {NULL, no_argument, NULL, 0 }}; |
| int long_index; |
| |
| @@ -978,6 +984,17 @@ static int process_cmdline(int argc, char *argv[]) |
| else |
| h264_profile = 0; |
| break; |
| + case 19: |
| + { |
| + int lp_option = atoi(optarg); |
| + if (lp_option == 0) |
| + requested_entrypoint = VAEntrypointEncSlice; //normal 0 |
| + else if (lp_option == 1) |
| + requested_entrypoint = VAEntrypointEncSliceLP; //low power 1 |
| + else |
| + requested_entrypoint = -1; |
| + } |
| + break; |
| case ':': |
| case '?': |
| print_help(); |
| @@ -1088,17 +1105,29 @@ static int init_va(void) |
| h264_profile = profile_list[i]; |
| vaQueryConfigEntrypoints(va_dpy, h264_profile, entrypoints, &num_entrypoints); |
| for (slice_entrypoint = 0; slice_entrypoint < num_entrypoints; slice_entrypoint++) { |
| - if (entrypoints[slice_entrypoint] == VAEntrypointEncSlice) { |
| + if (requested_entrypoint == -1 ) { |
| + //Select the entry point based on what is avaiable |
| + if ( (entrypoints[slice_entrypoint] == VAEntrypointEncSlice) || |
| + (entrypoints[slice_entrypoint] == VAEntrypointEncSliceLP) ) { |
| + support_encode = 1; |
| + selected_entrypoint = entrypoints[slice_entrypoint]; |
| + break; |
| + } |
| + } else if ((entrypoints[slice_entrypoint] == requested_entrypoint)) { |
| + //Select the entry point based on what was requested in cmd line option |
| support_encode = 1; |
| + selected_entrypoint = entrypoints[slice_entrypoint]; |
| break; |
| } |
| } |
| - if (support_encode == 1) |
| + if (support_encode == 1) { |
| + printf("Using EntryPoint - %d \n",selected_entrypoint); |
| break; |
| + } |
| } |
| |
| if (support_encode == 0) { |
| - printf("Can't find VAEntrypointEncSlice for H264 profiles\n"); |
| + printf("Can't find VAEntrypointEncSlice or VAEntrypointEncSliceLP for H264 profiles\n"); |
| exit(1); |
| } else { |
| switch (h264_profile) { |
| @@ -1130,7 +1159,7 @@ static int init_va(void) |
| for (i = 0; i < VAConfigAttribTypeMax; i++) |
| attrib[i].type = i; |
| |
| - va_status = vaGetConfigAttributes(va_dpy, h264_profile, VAEntrypointEncSlice, |
| + va_status = vaGetConfigAttributes(va_dpy, h264_profile, selected_entrypoint, |
| &attrib[0], VAConfigAttribTypeMax); |
| CHECK_VASTATUS(va_status, "vaGetConfigAttributes"); |
| /* check the interested configattrib */ |
| @@ -1272,7 +1301,7 @@ static int setup_encode() |
| VASurfaceID *tmp_surfaceid; |
| int codedbuf_size, i; |
| |
| - va_status = vaCreateConfig(va_dpy, h264_profile, VAEntrypointEncSlice, |
| + va_status = vaCreateConfig(va_dpy, h264_profile, selected_entrypoint, |
| &config_attrib[0], config_attrib_num, &config_id); |
| CHECK_VASTATUS(va_status, "vaCreateConfig"); |
| |