25
25
static int EmitYUV (const VP8Io * const io , WebPDecParams * const p ) {
26
26
WebPDecBuffer * output = p -> output ;
27
27
const WebPYUVABuffer * const buf = & output -> u .YUVA ;
28
- uint8_t * const y_dst = buf -> y + io -> mb_y * buf -> y_stride ;
29
- uint8_t * const u_dst = buf -> u + (io -> mb_y >> 1 ) * buf -> u_stride ;
30
- uint8_t * const v_dst = buf -> v + (io -> mb_y >> 1 ) * buf -> v_stride ;
28
+ uint8_t * const y_dst = buf -> y + ( size_t ) io -> mb_y * buf -> y_stride ;
29
+ uint8_t * const u_dst = buf -> u + (size_t )( io -> mb_y >> 1 ) * buf -> u_stride ;
30
+ uint8_t * const v_dst = buf -> v + (size_t )( io -> mb_y >> 1 ) * buf -> v_stride ;
31
31
const int mb_w = io -> mb_w ;
32
32
const int mb_h = io -> mb_h ;
33
33
const int uv_w = (mb_w + 1 ) / 2 ;
34
34
const int uv_h = (mb_h + 1 ) / 2 ;
35
- int j ;
36
- for (j = 0 ; j < mb_h ; ++ j ) {
37
- memcpy (y_dst + j * buf -> y_stride , io -> y + j * io -> y_stride , mb_w );
38
- }
39
- for (j = 0 ; j < uv_h ; ++ j ) {
40
- memcpy (u_dst + j * buf -> u_stride , io -> u + j * io -> uv_stride , uv_w );
41
- memcpy (v_dst + j * buf -> v_stride , io -> v + j * io -> uv_stride , uv_w );
42
- }
35
+ WebPCopyPlane (io -> y , io -> y_stride , y_dst , buf -> y_stride , mb_w , mb_h );
36
+ WebPCopyPlane (io -> u , io -> uv_stride , u_dst , buf -> u_stride , uv_w , uv_h );
37
+ WebPCopyPlane (io -> v , io -> uv_stride , v_dst , buf -> v_stride , uv_w , uv_h );
43
38
return io -> mb_h ;
44
39
}
45
40
46
41
// Point-sampling U/V sampler.
47
42
static int EmitSampledRGB (const VP8Io * const io , WebPDecParams * const p ) {
48
43
WebPDecBuffer * const output = p -> output ;
49
44
WebPRGBABuffer * const buf = & output -> u .RGBA ;
50
- uint8_t * const dst = buf -> rgba + io -> mb_y * buf -> stride ;
45
+ uint8_t * const dst = buf -> rgba + ( size_t ) io -> mb_y * buf -> stride ;
51
46
WebPSamplerProcessPlane (io -> y , io -> y_stride ,
52
47
io -> u , io -> v , io -> uv_stride ,
53
48
dst , buf -> stride , io -> mb_w , io -> mb_h ,
@@ -62,7 +57,7 @@ static int EmitSampledRGB(const VP8Io* const io, WebPDecParams* const p) {
62
57
static int EmitFancyRGB (const VP8Io * const io , WebPDecParams * const p ) {
63
58
int num_lines_out = io -> mb_h ; // a priori guess
64
59
const WebPRGBABuffer * const buf = & p -> output -> u .RGBA ;
65
- uint8_t * dst = buf -> rgba + io -> mb_y * buf -> stride ;
60
+ uint8_t * dst = buf -> rgba + ( size_t ) io -> mb_y * buf -> stride ;
66
61
WebPUpsampleLinePairFunc upsample = WebPUpsamplers [p -> output -> colorspace ];
67
62
const uint8_t * cur_y = io -> y ;
68
63
const uint8_t * cur_u = io -> u ;
@@ -133,7 +128,7 @@ static int EmitAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
133
128
const WebPYUVABuffer * const buf = & p -> output -> u .YUVA ;
134
129
const int mb_w = io -> mb_w ;
135
130
const int mb_h = io -> mb_h ;
136
- uint8_t * dst = buf -> a + io -> mb_y * buf -> a_stride ;
131
+ uint8_t * dst = buf -> a + ( size_t ) io -> mb_y * buf -> a_stride ;
137
132
int j ;
138
133
(void )expected_num_lines_out ;
139
134
assert (expected_num_lines_out == mb_h );
@@ -186,7 +181,7 @@ static int EmitAlphaRGB(const VP8Io* const io, WebPDecParams* const p,
186
181
(colorspace == MODE_ARGB || colorspace == MODE_Argb );
187
182
const WebPRGBABuffer * const buf = & p -> output -> u .RGBA ;
188
183
int num_rows ;
189
- const int start_y = GetAlphaSourceRow (io , & alpha , & num_rows );
184
+ const size_t start_y = GetAlphaSourceRow (io , & alpha , & num_rows );
190
185
uint8_t * const base_rgba = buf -> rgba + start_y * buf -> stride ;
191
186
uint8_t * const dst = base_rgba + (alpha_first ? 0 : 3 );
192
187
const int has_alpha = WebPDispatchAlpha (alpha , io -> width , mb_w ,
@@ -210,7 +205,7 @@ static int EmitAlphaRGBA4444(const VP8Io* const io, WebPDecParams* const p,
210
205
const WEBP_CSP_MODE colorspace = p -> output -> colorspace ;
211
206
const WebPRGBABuffer * const buf = & p -> output -> u .RGBA ;
212
207
int num_rows ;
213
- const int start_y = GetAlphaSourceRow (io , & alpha , & num_rows );
208
+ const size_t start_y = GetAlphaSourceRow (io , & alpha , & num_rows );
214
209
uint8_t * const base_rgba = buf -> rgba + start_y * buf -> stride ;
215
210
#if (WEBP_SWAP_16BIT_CSP == 1 )
216
211
uint8_t * alpha_dst = base_rgba ;
@@ -276,9 +271,9 @@ static int EmitRescaledYUV(const VP8Io* const io, WebPDecParams* const p) {
276
271
static int EmitRescaledAlphaYUV (const VP8Io * const io , WebPDecParams * const p ,
277
272
int expected_num_lines_out ) {
278
273
const WebPYUVABuffer * const buf = & p -> output -> u .YUVA ;
279
- uint8_t * const dst_a = buf -> a + p -> last_y * buf -> a_stride ;
274
+ uint8_t * const dst_a = buf -> a + ( size_t ) p -> last_y * buf -> a_stride ;
280
275
if (io -> a != NULL ) {
281
- uint8_t * const dst_y = buf -> y + p -> last_y * buf -> y_stride ;
276
+ uint8_t * const dst_y = buf -> y + ( size_t ) p -> last_y * buf -> y_stride ;
282
277
const int num_lines_out = Rescale (io -> a , io -> width , io -> mb_h , p -> scaler_a );
283
278
assert (expected_num_lines_out == num_lines_out );
284
279
if (num_lines_out > 0 ) { // unmultiply the Y
@@ -356,7 +351,7 @@ static int ExportRGB(WebPDecParams* const p, int y_pos) {
356
351
const WebPYUV444Converter convert =
357
352
WebPYUV444Converters [p -> output -> colorspace ];
358
353
const WebPRGBABuffer * const buf = & p -> output -> u .RGBA ;
359
- uint8_t * dst = buf -> rgba + y_pos * buf -> stride ;
354
+ uint8_t * dst = buf -> rgba + ( size_t ) y_pos * buf -> stride ;
360
355
int num_lines_out = 0 ;
361
356
// For RGB rescaling, because of the YUV420, current scan position
362
357
// U/V can be +1/-1 line from the Y one. Hence the double test.
@@ -383,15 +378,15 @@ static int EmitRescaledRGB(const VP8Io* const io, WebPDecParams* const p) {
383
378
while (j < mb_h ) {
384
379
const int y_lines_in =
385
380
WebPRescalerImport (p -> scaler_y , mb_h - j ,
386
- io -> y + j * io -> y_stride , io -> y_stride );
381
+ io -> y + ( size_t ) j * io -> y_stride , io -> y_stride );
387
382
j += y_lines_in ;
388
383
if (WebPRescaleNeededLines (p -> scaler_u , uv_mb_h - uv_j )) {
389
- const int u_lines_in =
390
- WebPRescalerImport ( p -> scaler_u , uv_mb_h - uv_j ,
391
- io -> u + uv_j * io -> uv_stride , io -> uv_stride );
392
- const int v_lines_in =
393
- WebPRescalerImport ( p -> scaler_v , uv_mb_h - uv_j ,
394
- io -> v + uv_j * io -> uv_stride , io -> uv_stride );
384
+ const int u_lines_in = WebPRescalerImport (
385
+ p -> scaler_u , uv_mb_h - uv_j , io -> u + ( size_t ) uv_j * io -> uv_stride ,
386
+ io -> uv_stride );
387
+ const int v_lines_in = WebPRescalerImport (
388
+ p -> scaler_v , uv_mb_h - uv_j , io -> v + ( size_t ) uv_j * io -> uv_stride ,
389
+ io -> uv_stride );
395
390
(void )v_lines_in ; // remove a gcc warning
396
391
assert (u_lines_in == v_lines_in );
397
392
uv_j += u_lines_in ;
@@ -403,7 +398,7 @@ static int EmitRescaledRGB(const VP8Io* const io, WebPDecParams* const p) {
403
398
404
399
static int ExportAlpha (WebPDecParams * const p , int y_pos , int max_lines_out ) {
405
400
const WebPRGBABuffer * const buf = & p -> output -> u .RGBA ;
406
- uint8_t * const base_rgba = buf -> rgba + y_pos * buf -> stride ;
401
+ uint8_t * const base_rgba = buf -> rgba + ( size_t ) y_pos * buf -> stride ;
407
402
const WEBP_CSP_MODE colorspace = p -> output -> colorspace ;
408
403
const int alpha_first =
409
404
(colorspace == MODE_ARGB || colorspace == MODE_Argb );
@@ -431,7 +426,7 @@ static int ExportAlpha(WebPDecParams* const p, int y_pos, int max_lines_out) {
431
426
static int ExportAlphaRGBA4444 (WebPDecParams * const p , int y_pos ,
432
427
int max_lines_out ) {
433
428
const WebPRGBABuffer * const buf = & p -> output -> u .RGBA ;
434
- uint8_t * const base_rgba = buf -> rgba + y_pos * buf -> stride ;
429
+ uint8_t * const base_rgba = buf -> rgba + ( size_t ) y_pos * buf -> stride ;
435
430
#if (WEBP_SWAP_16BIT_CSP == 1 )
436
431
uint8_t * alpha_dst = base_rgba ;
437
432
#else
@@ -470,7 +465,7 @@ static int EmitRescaledAlphaRGB(const VP8Io* const io, WebPDecParams* const p,
470
465
int lines_left = expected_num_out_lines ;
471
466
const int y_end = p -> last_y + lines_left ;
472
467
while (lines_left > 0 ) {
473
- const int row_offset = scaler -> src_y - io -> mb_y ;
468
+ const int64_t row_offset = ( int64_t ) scaler -> src_y - io -> mb_y ;
474
469
WebPRescalerImport (scaler , io -> mb_h + io -> mb_y - scaler -> src_y ,
475
470
io -> a + row_offset * io -> width , io -> width );
476
471
lines_left -= p -> emit_alpha_row (p , y_end - lines_left , lines_left );
0 commit comments