|  | /* | 
|  | * Copyright (c) 2021, Alliance for Open Media. All rights reserved | 
|  | * | 
|  | * This source code is subject to the terms of the BSD 3-Clause Clear License and the | 
|  | * Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear License was | 
|  | * not distributed with this source code in the LICENSE file, you can obtain it | 
|  | * at aomedia.org/license/software-license/bsd-3-c-c/.  If the Alliance for Open Media Patent | 
|  | * License 1.0 was not distributed with this source code in the PATENTS file, you | 
|  | * can obtain it at aomedia.org/license/patent-license/. | 
|  | */ | 
|  |  | 
|  | The Lanczos resampling library and utilities are developed by Google | 
|  | initially and contributed to the Alliance for open Media for experiments | 
|  | related to super-resolution and Adaptive Streaming use cases. | 
|  |  | 
|  | For questions and technical support, please contact debargha@google.com | 
|  |  | 
|  | LIBRARY | 
|  | ####### | 
|  |  | 
|  | The main library source and header files are: | 
|  | lanczos_resample.c | 
|  | lanczos_resample.h | 
|  |  | 
|  |  | 
|  | UTILITIES | 
|  | ######### | 
|  |  | 
|  | Two utilities are provided to resample y4m and yuv videos respectively: | 
|  | lanczos_resample_y4m (built using source lanczos_resample_y4m.c) | 
|  | lanczos_resample_y4m (built using source lanczos_resample_yuv.c) | 
|  |  | 
|  | Another utility simply returns the filter parameters for a given | 
|  | resampling configuration: | 
|  | lanczos_resample_filter (built using source lanczos_resample_filter.c) | 
|  |  | 
|  | lanczos_resample_y4m | 
|  | -------------------- | 
|  | The usage of lanczos_resample_y4m is: | 
|  | lanczos_resample_y4m | 
|  | [<Options>] | 
|  | <y4m_input> | 
|  | <num_frames> | 
|  | <horz_resampling_config> | 
|  | <vert_resampling_config> | 
|  | <y4m_output> | 
|  | [<outwidth>x<outheight>] | 
|  |  | 
|  | Notes: | 
|  | <Options> are optional switches prefixed by '-' as follows: | 
|  | -bit:<n>        - providing bits for filter taps | 
|  | [default: 14] | 
|  | -ieb:<n>        - providing intermediate extra bits of | 
|  | prec between horz and vert filtering | 
|  | clamped to maximum of (15 - bitdepth) | 
|  | [default: 2] | 
|  | -ext:<ext_type> - providing the extension type | 
|  | <ext_type> is one of: | 
|  | 'r' or 'rep' (Repeat) | 
|  | 's' or 'sym' (Symmetric) | 
|  | 'f' or 'ref' (Reflect/Mirror-whole) | 
|  | 'g' or 'gra' (Grafient preserving) | 
|  | [default: 'r'] | 
|  | -win:<win_type> - providing the windowing function type | 
|  | <win_type> is one of: | 
|  | 'lanczos'     (Repeat) | 
|  | 'lanczos_dil' (Symmetric) | 
|  | 'gaussian'    (Gaussian) | 
|  | 'gengaussian' (Generalized Gaussian) | 
|  | 'cosine'      (Cosine) | 
|  | 'hamming      (Hamming) | 
|  | 'blackman     (Blackman) | 
|  | 'kaiser       (Kaiser) | 
|  | [default: 'lanczos'] | 
|  |  | 
|  | <y4m_input> is the input video in Y4M format | 
|  | <y4m_output> is the output video in Y4M format | 
|  | <num_frames> is number of frames to be processed | 
|  | <horz_resampling_config> and <vert_resampling_config> | 
|  | are of the form: | 
|  | <p>:<q>:<Lanczos_a>[:<x0>] where: | 
|  | <p>/<q> gives the resampling ratio. | 
|  | <Lanczos_a> is Lanczos parameter. | 
|  | <x0> is the optional initial offset | 
|  | [default: centered] | 
|  | If used, it can be a number in (-1, 1), | 
|  | or 'c' meaning centered. | 
|  | which is a shortcut for x0 = (q-p)/(2p) | 
|  | or 'd' meaning co-sited chroma with centered | 
|  | luma for use only on sub-sampled chroma, | 
|  | which is a shortcut for x0 = (q-p)/(4p) | 
|  | The field can be prefixed by 'i' meaning | 
|  | using the inverse of the number provided, | 
|  | If it is desired to provide different config parameters | 
|  | for luma and chroma, the <Lanczos_a> and <x0> fields | 
|  | could be optionally converted to a pair of | 
|  | comma-separated parameters as follows: | 
|  | <p>:<q>:<Lanczos_al>,<lanczos_ac>[:<x0l>,<x0c>] | 
|  | where <Lanczos_al> and <lanczos_ac> are | 
|  | luma and chroma lanczos parameters | 
|  | <x0l> and <x0c> are | 
|  | luma and chroma initial offsets | 
|  | <outwidth>x<outheight> is output video dimensions | 
|  | only needed in case of upsampling | 
|  | Resampling config of 1:1:1:0 horizontally or vertically | 
|  | is regarded as a no-op in that direction | 
|  |  | 
|  | Example usages: | 
|  |  | 
|  | 1a. Downsample 10 frames from Boat_1920x1080_60fps_10bit_420.y4m by | 
|  | ratio 3/2 horizontally and 4/3 vertically with Lanczos parameter | 
|  | 6 for both and centered sampling. | 
|  |  | 
|  | lanczos_resample_y4m Boat_1920x1080_60fps_10bit_420.y4m 10 \ | 
|  | 2:3:6 3:4:6 /tmp/down.y4m | 
|  |  | 
|  | 1b. Reverse the process in 1a. That is, upsample 10 frames from | 
|  | /tmp/boat.y4m by ratio 3/2 horizontally and 4/3 vertically with | 
|  | Lanczos parameter 6 for both and centered sampling. The output | 
|  | dimension desired is specified to be 1920x1080. | 
|  |  | 
|  | lanczos_resample_y4m /tmp/down.y4m 10 3:2:6 4:3:6 /tmp/downup.y4m 1920x1080 | 
|  |  | 
|  | 2a. Similar to 1a, except using left-aligned sampling | 
|  |  | 
|  | lanczos_resample_y4m Boat_1920x1080_60fps_10bit_420.y4m 10 \ | 
|  | 2:3:6:0 3:4:6:0 /tmp/down.y4m | 
|  |  | 
|  | 2b. Reversing the process in 2a. | 
|  |  | 
|  | lanczos_resample_y4m /tmp/down.y4m 10 3:2:6:0 4:3:6:0 /tmp/downup.y4m \ | 
|  | 1920x1080 | 
|  |  | 
|  | 3a. Similar to 1a, except using a specified initial offset of 0.125 horizontally | 
|  | and center aligned sampling vertically | 
|  |  | 
|  | lanczos_resample_y4m Boat_1920x1080_60fps_10bit_420.y4m 10 \ | 
|  | 2:3:6:0.125 3:4:6 /tmp/down.y4m | 
|  |  | 
|  | 3b. Reversing the process in 3a. | 
|  |  | 
|  | lanczos_resample_y4m /tmp/down.y4m 10 3:2:6:i0.125 4:3:6 /tmp/downup.y4m \ | 
|  | 1920x1080 | 
|  |  | 
|  | 4a. Similar to 3a, except using symmetric border extension instead of default | 
|  | repeat. | 
|  |  | 
|  | lanczos_resample_y4m -ext:sym Boat_1920x1080_60fps_10bit_420.y4m 10 \ | 
|  | 2:3:6:0.125 3:4:6:c /tmp/down.y4m | 
|  |  | 
|  | 4b. Reversing the process in 4a. | 
|  |  | 
|  | lanczos_resample_y4m -ext:sym /tmp/down.y4m 10 3:2:6:i0.125 4:3:6:c \ | 
|  | /tmp/downup.y4m 1920x1080 | 
|  |  | 
|  | 5a. Downsample 10 frames from Boat_1920x1080_60fps_10bit_420.y4m by | 
|  | ratio 3/2 horizontally and vertically with Lanczos parameter | 
|  | 6 for both, centered sampling for luma, co-sited chroma horizontally | 
|  | and centered chroma vertically. Note this is the most common use | 
|  | case encountered in practice. | 
|  |  | 
|  | lanczos_resample_y4m Boat_1920x1080_60fps_10bit_420.y4m 10 \ | 
|  | 2:3:6:c,d 2:3:6 /tmp/down.y4m | 
|  |  | 
|  | 5b. Reversing the process in 5a. | 
|  |  | 
|  | lanczos_resample_y4m /tmp/down.y4m 10 3:2:6:ic,id 3:2:6 \ | 
|  | /tmp/downup.y4m 1920x1080 | 
|  |  | 
|  | 6a. Similar to 5a except using symmetric border extension, 12-bit | 
|  | filters, 3 bit intermediate extra precision, and hamming windowing. | 
|  |  | 
|  | lanczos_resample_y4m -ext:sym -bit:12 -ieb:3 -win:hamming \ | 
|  | Boat_1920x1080_60fps_10bit_420.y4m 10 \ | 
|  | 2:3:6:c,d 2:3:6 /tmp/down.y4m | 
|  |  | 
|  | 6b. Reversing the process in 6a. | 
|  |  | 
|  | lanczos_resample_y4m -ext:sym -bit:12 -ieb:3 -win:hamming \ | 
|  | /tmp/down.y4m 10 3:2:6:ic,id 3:2:6 \ | 
|  | /tmp/downup.y4m 1920x1080 | 
|  | lanczos_resample_yuv | 
|  | -------------------- | 
|  | The usage of lanczos_resample_yuv is similar but with two extra | 
|  | arguments to specify the input format: | 
|  | lanczos_resample_yuv | 
|  | [<Options>] | 
|  | <yuv_input> | 
|  | <width>x<height> | 
|  | <pix_format> | 
|  | <num_frames> | 
|  | <horz_resampling_config> | 
|  | <vert_resampling_config> | 
|  | <yuv_output> | 
|  | [<outwidth>x<outheight>] | 
|  | Notes: | 
|  | <yuv_input> is the input video in raw YUV format | 
|  | <yuv_output> is the output video in raw YUV format | 
|  | <width>x<height> is input video dimensions. | 
|  | <pix_format> is one of { yuv420p, yuv420p10, yuv420p12, | 
|  | yuv422p, yuv422p10, yuv422p12, | 
|  | yuv444p, yuv444p10, yuv444p12 } | 
|  | All other parameters are the same as the ones used for | 
|  | lanczos_resample_y4m described above. | 
|  |  | 
|  |  | 
|  | lanczos_resample_filter | 
|  | ----------------------- | 
|  | Utility to show the filter parameters used for both luma and chroma. | 
|  | The usage of lanczos_resample_filter is: | 
|  | lanczos_resample_filter | 
|  | [<Options>] | 
|  | <resampling_config> | 
|  | Notes: | 
|  | <resampling_config> is in the same format as one specified | 
|  | in lanczos_resample_y4m above for <horz_resampling_config> | 
|  | or <vert_resampling_config>. | 
|  |  | 
|  | Example usages: | 
|  |  | 
|  | 7a. lanczos_resample_filter -bit:14 2:3:6 | 
|  | (shows 14-bit a = 6 filter for 2/3 resampling, x0 = centered) | 
|  | 7b. lanczos_resample_filter -bit:12 1:2:5:0.125 | 
|  | (shows 12-bit a = 5 filter for 1/2 resampling, x0 = 0.125) | 
|  | 7c. lanczos_resample_filter -bit:12 1:2:5:c,d 12 | 
|  | (shows 12-bit a = 5 filter for 1/2 resampling, | 
|  | x0 = centered for luma, co-sited for chroma) | 
|  | 7d. lanczos_resample_filter -bit:12 3:2:6:i0.125 12 | 
|  | (shows 12-bit a = 5 filter for 3/2 resampling, x0 = inverse of 0.125) | 
|  |  | 
|  |  | 
|  | SCRIPTS | 
|  | ####### | 
|  |  | 
|  | In addition to these utilities, two convenience scripts are provided: | 
|  | lanczos_downup.sh | 
|  | lanczos_downcompup.sh | 
|  | They can be invoked from the build directory directly after a build that | 
|  | produces lanczos_resample_y4m, aomenc and aomdec applications. | 
|  |  | 
|  | lanczos_downup.sh | 
|  | ----------------- | 
|  | The script lanczos_downup.sh resamples a video with specified parameters | 
|  | and then reverses the process using two lanczos_resample_y4m commands. | 
|  | The usage for the script is: | 
|  |  | 
|  | Usage: | 
|  | lanczos_downup.sh [<Options>] | 
|  | <input_y4m> | 
|  | <num_frames> | 
|  | <horz_resampling_config> | 
|  | <vert_resampling_config> | 
|  | <downup_y4m> | 
|  | [<down_y4m>] | 
|  |  | 
|  | Notes: | 
|  | <Options> are optional switches similar to what is used by | 
|  | lanczos_resample_y4m utility | 
|  | <y4m_input> is input y4m video | 
|  | <num_frames> is number of frames to process | 
|  | <horz_resampling_config> and <vert_resampling_config> are in format: | 
|  | <p>:<q>:<Lanczos_a_str>[:<x0>] | 
|  | similar to what is used by lanczos_resample_y4m utility, with the | 
|  | enhancement that for <Lanczos_a_str> optionally | 
|  | two '^'-separated strings for 'a' could be provided instead | 
|  | of one for down and up-sampling operations respectively if different. | 
|  | Note each string separated by '^' could have two values for luma | 
|  | and chroma separated by ','. | 
|  | So <Lanczos_a_str> could be of the form: | 
|  | <a_luma_down>,<a_chroma_down>^<a_luma_up>,<a_chroma_up> | 
|  | if down and up operations use different parameters, or | 
|  | <a_luma_down>,<a_chroma_down> | 
|  | if down and up operations use the same parameters. | 
|  | <downup_y4m> is the output y4m video. | 
|  | <down_y4m> provides the intermediate resampled file as an | 
|  | optional parameter. If skipped the intermediate resampled | 
|  | file is deleted. | 
|  |  | 
|  | Example usages: | 
|  | 8. Similar to combined use cases 1a and 1b above including both | 
|  | down and inverse up steps. | 
|  |  | 
|  | 8a. From build directory run: | 
|  | /path/to/script/lanczos_downup.sh Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:6 3:4:6 /tmp/downup.y4m | 
|  | [Here the intermediate resampled files is not stored] | 
|  |  | 
|  | 8b. From build directory run: | 
|  | /path/to/script/lanczos_downup.sh Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:6 3:4:6 /tmp/downup.y4m \ | 
|  | /tmp/down.y4m | 
|  | [Here the intermediate resampled file is stored in /tmp/down.y4m] | 
|  |  | 
|  | 8c. From build directory run: | 
|  | /path/to/script/lanczos_downup.sh Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:8^4 3:4:8^4 /tmp/downup.y4m | 
|  | [Here Lanczos parameters 8 and 4 are used for down and upscaling | 
|  | respectively] | 
|  |  | 
|  | 8d. From build directory run: | 
|  | /path/to/script/lanczos_downup.sh Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:6,4^6,4:c,d 3:4:6,4^6,4 /tmp/downup.y4m | 
|  | [Here Lanczos parameters 6 and 4 are used for luma and chroma | 
|  | respectively for both down and upscaling. Further centered | 
|  | luma and co-sited chroma are used horizontally, while centered | 
|  | luma and chroma sampling are used vertically.] | 
|  |  | 
|  | lanczos_downcompup.sh | 
|  | --------------------- | 
|  | The script lanczos_downcompup.sh resamples a video with specified parameters | 
|  | using lanczos_resample_y4m, then comprsses and decompresses using aomenc and | 
|  | aomdec respectively, and finally reverse resamples the decompressed video to | 
|  | the source resolution using another lanczos_resample_y4m command. | 
|  | The usage for the script is: | 
|  |  | 
|  | Usage: | 
|  | lanczos_downcompup.sh [<Options>] | 
|  | <input_y4m> | 
|  | <num_frames> | 
|  | <horz_resampling_config> | 
|  | <vert_resampling_config> | 
|  | <cq_level>[:<cpu_used>] | 
|  | <downcompup_y4m> | 
|  | [[<down_y4m>]:[<downcomp_bit>]:[<downcomp_y4m]] | 
|  |  | 
|  | Notes: | 
|  | <Options> are optional switches similar to what is used by | 
|  | lanczos_resample_y4m utility | 
|  | <y4m_input> is input y4m video | 
|  | <num_frames> is number of frames to process | 
|  | <horz_resampling_config> and <vert_resampling_config> are in format: | 
|  | <p>:<q>:<Lanczos_a_str>[:<x0>] | 
|  | similar to what is used by lanczos_resample_y4m utility, with the | 
|  | enhancement that for <Lanczos_a_str> optionally | 
|  | two '^'-separated strings for 'a' could be provided instead | 
|  | of one for down and up-sampling operations respectively if different. | 
|  | Note each string separated by '^' could have two values for luma | 
|  | and chroma separated by ','. | 
|  | So <Lanczos_a_str> could be of the form: | 
|  | <a_luma_down>,<a_chroma_down>^<a_luma_up>,<a_chroma_up> | 
|  | if down and up operations use different parameters, or | 
|  | <a_luma_down>,<a_chroma_down> | 
|  | if down and up operations use the same parameters. | 
|  | <cq_level>[:<cpu_used>] provides the cq_level parameter of | 
|  | compression along with an optional cpu_used parameter. | 
|  | <downcompup_y4m> is the output y4m video. | 
|  | The last param [[<down_y4m>]:[<downcomp_bit>]:[<downcomp_y4m]] | 
|  | provides names of intermediate files where: | 
|  | <down_y4m> is the resampled source | 
|  | <downcomp_bit> is the compressed resampled bitstream | 
|  | <downcomp_y4m> is the reconstructed bitstream. | 
|  | This parameter string is entirely optional. | 
|  | Besides if provided, each of <down_y4m>, <downcomp_bit> and | 
|  | <downcomp_y4m> are optional by themselves where each can be | 
|  | either provided or empty. If empty the corresponding | 
|  | intermediate file is deleted. | 
|  |  | 
|  | Example usages: | 
|  | 9. Similar to use cases 8 above with a compression step in between. | 
|  |  | 
|  | 9a. From build directory run: | 
|  | /path/to/script/lanczos_downcompup.sh Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:6 3:4:6 40:5 /tmp/downup.y4m | 
|  | [Here no intermediate files are stored. | 
|  | Compression is at cq_level 40 and cpu_used=5] | 
|  |  | 
|  | 9b. From build directory run: | 
|  | /path/to/script/lanczos_downcompup.sh Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:6 3:4:6 40:5 /tmp/downup.y4m \ | 
|  | /tmp/down.y4m::/tmp/downrec.y4m | 
|  | [Here the resampled source and its compressed reconstruction are | 
|  | stoted in /tmp/down.y4m and /tmp/downrec.y4m respectively. | 
|  | Compression is at cq_level 40 and cpu_used=5]. | 
|  |  | 
|  | 9c. From build directory run: | 
|  | /path/to/script/lanczos_downcompup.sh Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:6 3:4:6 40:5 /tmp/downup.y4m \ | 
|  | /tmp/down.y4m:/tmp/down.bit:/tmp/downrec.y4m | 
|  | [Here the resampled source, its compressed bitstream, and the | 
|  | conpressed reconstruction are stoted in /tmp/down.y4m, | 
|  | /tmp/downcomp.bit and /tmp/downrec.y4m respectively. | 
|  | Compression is at cq_level 40 and cpu_used=5]. | 
|  |  | 
|  | 9d. From build directory run: | 
|  | /path/to/script/lanczos_downcompup.sh Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:8^4 3:4:8^4 40:5 /tmp/downup.y4m | 
|  | [Here Lanczos parameters 8 and 4 are used for down and upscaling | 
|  | respectively. | 
|  | Compression is at cq_level 40 and cpu_used=5]. | 
|  |  | 
|  | 9e. From build directory run: | 
|  | /path/to/script/lanczos_downcompup.sh Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:6,4^6,4:c,d 3:4:6,4^6,4 40:5 /tmp/downup.y4m | 
|  | [Here Lanczos parameters 6 and 4 are used for luma and chroma | 
|  | respectively for both down and upscaling. Further centered | 
|  | luma sampling and co-sited chroma sampling are respectively used | 
|  | in the horizontal direction, while centered sampling is used for | 
|  | both luma and chroma vertically. | 
|  | Compression is at cq_level 40 and cpu_used=5]. | 
|  |  | 
|  | 9f. From build directory run: | 
|  | /path/to/script/lanczos_downcompup.sh -win:kaiser \ | 
|  | Boat_1920x1080_60fps_10bit_420.y4m \ | 
|  | 10 2:3:5:c,d 3:4:5 40:5 /tmp/downup.y4m | 
|  | [Here Lanczos parameter 5 is used for luma and chroma both | 
|  | horizontally and vertically, Further, centered luma | 
|  | sampling and co-sited chroma sampling are used respectively | 
|  | in the horizontal direction, while centered sampling is used | 
|  | for both luma and chroma vertically. | 
|  | Compression is at cq_level 40 and cpu_used=5]. |