Skip to content

Commit d7f44e4

Browse files
committed
utils: Add flag for preserving subsample factors when calculating stride
For YUV420/422 formats, it may be desirable to preserve the subsampling factor when computing Y and U/V strides. In such cases, double the U/V stride to get the Y stride . Signed-off-by: Naushir Patuck <[email protected]>
1 parent 28196ed commit d7f44e4

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

src/libpisp/common/pisp_utils.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ uint32_t compute_x_offset(uint32_t /* pisp_image_format */ format, int x)
5757
return x_offset;
5858
}
5959

60-
void compute_stride_align(pisp_image_format_config &config, int align)
60+
void compute_stride_align(pisp_image_format_config &config, int align, bool preserve_subsample_ratio)
6161
{
6262
if (PISP_IMAGE_FORMAT_WALLPAPER(config.format))
6363
{
@@ -95,19 +95,24 @@ void compute_stride_align(pisp_image_format_config &config, int align)
9595
// image in memory must be sufficiently aligned
9696
config.stride = (config.stride + align - 1) & ~(align - 1);
9797
config.stride2 = (config.stride2 + align - 1) & ~(align - 1);
98+
99+
// For YUV420/422 formats, ensure the stride ratio matches the subample ratio for the planes.
100+
if (preserve_subsample_ratio && PISP_IMAGE_FORMAT_PLANAR(config.format) &&
101+
(PISP_IMAGE_FORMAT_SAMPLING_422(config.format) || PISP_IMAGE_FORMAT_SAMPLING_420(config.format)))
102+
config.stride = config.stride2 << 1;
98103
}
99104
}
100105

101-
void compute_stride(pisp_image_format_config &config)
106+
void compute_stride(pisp_image_format_config &config, bool preserve_subsample_ratio)
102107
{
103108
// Our preferred alignment is really 64 bytes, though 16 should work too. Use 16 for now, as it gives better test coverage.
104-
compute_stride_align(config, PISP_BACK_END_OUTPUT_MIN_ALIGN);
109+
compute_stride_align(config, PISP_BACK_END_OUTPUT_MIN_ALIGN, preserve_subsample_ratio);
105110
}
106111

107-
void compute_optimal_stride(pisp_image_format_config &config)
112+
void compute_optimal_stride(pisp_image_format_config &config, bool preserve_subsample_ratio)
108113
{
109114
// Use our preferred alignment of 64 bytes.
110-
compute_stride_align(config, PISP_BACK_END_OUTPUT_MAX_ALIGN);
115+
compute_stride_align(config, PISP_BACK_END_OUTPUT_MAX_ALIGN, preserve_subsample_ratio);
111116
}
112117

113118
void compute_addr_offset(const pisp_image_format_config &config, int x, int y, uint32_t *addr_offset,

src/libpisp/common/utils.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
namespace libpisp
1212
{
1313

14-
void compute_stride(pisp_image_format_config &config);
15-
void compute_optimal_stride(pisp_image_format_config &config);
16-
void compute_stride_align(pisp_image_format_config &config, int align);
14+
void compute_stride(pisp_image_format_config &config, bool preserve_subsample_ratio = false);
15+
void compute_optimal_stride(pisp_image_format_config &config, bool preserve_subsample_ratio = false);
16+
void compute_stride_align(pisp_image_format_config &config, int align, bool preserve_subsample_ratio = false);
1717
void compute_addr_offset(const pisp_image_format_config &config, int x, int y, uint32_t *addr_offset,
1818
uint32_t *addr_offset2);
1919
int num_planes(pisp_image_format format);

0 commit comments

Comments
 (0)