@@ -418,10 +418,42 @@ public void analyze(@NonNull ImageProxy image) {
418
418
419
419
byte [] byteData = new byte [ySize + uSize + vSize ];
420
420
421
+ int width = image .getWidth ();
422
+ int yStride = image .getPlanes ()[0 ].getRowStride ();
423
+ int uStride = image .getPlanes ()[1 ].getRowStride ();
424
+ int vStride = image .getPlanes ()[2 ].getRowStride ();
425
+ int outputOffset = 0 ;
426
+ if (width == yStride ) {
427
+ yBuffer .get (byteData , outputOffset , ySize );
428
+ outputOffset += ySize ;
429
+ } else {
430
+ for (int inputOffset = 0 ; inputOffset < ySize ; inputOffset += yStride ) {
431
+ yBuffer .position (inputOffset );
432
+ yBuffer .get (byteData , outputOffset , Math .min (yBuffer .remaining (), width ));
433
+ outputOffset += width ;
434
+ }
435
+ }
421
436
//U and V are swapped
422
- yBuffer .get (byteData , 0 , ySize );
423
- vBuffer .get (byteData , ySize , vSize );
424
- uBuffer .get (byteData , ySize + vSize , uSize );
437
+ if (width == vStride ) {
438
+ vBuffer .get (byteData , outputOffset , vSize );
439
+ outputOffset += vSize ;
440
+ } else {
441
+ for (int inputOffset = 0 ; inputOffset < vSize ; inputOffset += vStride ) {
442
+ vBuffer .position (inputOffset );
443
+ vBuffer .get (byteData , outputOffset , Math .min (vBuffer .remaining (), width ));
444
+ outputOffset += width ;
445
+ }
446
+ }
447
+ if (width == uStride ) {
448
+ uBuffer .get (byteData , outputOffset , uSize );
449
+ outputOffset += uSize ;
450
+ } else {
451
+ for (int inputOffset = 0 ; inputOffset < uSize ; inputOffset += uStride ) {
452
+ uBuffer .position (inputOffset );
453
+ uBuffer .get (byteData , outputOffset , Math .min (uBuffer .remaining (), width ));
454
+ outputOffset += width ;
455
+ }
456
+ }
425
457
426
458
buffers [currentBuffer ].put (byteData );
427
459
buffers [currentBuffer ].position (0 );
0 commit comments