27
27
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
28
*/
29
29
use core:: f16;
30
- use yuvutils_rs :: {
30
+ use yuv :: {
31
31
convert_rgba16_to_f16, convert_rgba_to_f16, rgba10_to_ar30, rgba12_to_ar30, rgba8_to_ar30,
32
32
BufferStoreMut , Rgb30ByteOrder ,
33
33
} ;
@@ -46,7 +46,7 @@ fn work_on_transmuted_ptr_f16<F>(
46
46
let mut allocated = false ;
47
47
let mut dst_stride = rgba_stride as usize / 2 ;
48
48
let mut working_slice: BufferStoreMut < ' _ , f16 > = unsafe {
49
- if rgba as usize % 2 == 0 && rgba_stride / 2 == 0 {
49
+ if rgba as usize % 2 == 0 && rgba_stride % 2 == 0 {
50
50
BufferStoreMut :: Borrowed ( std:: slice:: from_raw_parts_mut (
51
51
rgba as * mut f16 ,
52
52
rgba_stride as usize / 2 * height,
@@ -78,7 +78,7 @@ fn work_on_transmuted_ptr_f16<F>(
78
78
79
79
if allocated {
80
80
let src_slice = working_slice. borrow ( ) ;
81
- let dst_slice = unsafe {
81
+ let dst_slice: & mut [ u8 ] = unsafe {
82
82
std:: slice:: from_raw_parts_mut ( rgba as * mut u8 , rgba_stride as usize * height)
83
83
} ;
84
84
for ( src, dst) in src_slice
@@ -110,7 +110,7 @@ pub(crate) fn work_on_transmuted_ptr_u16<F>(
110
110
let mut allocated = false ;
111
111
let mut dst_stride = rgba_stride as usize / 2 ;
112
112
let mut working_slice: BufferStoreMut < ' _ , u16 > = unsafe {
113
- if rgba as usize % 2 == 0 && rgba_stride / 2 == 0 {
113
+ if rgba as usize % 2 == 0 && rgba_stride % 2 == 0 {
114
114
BufferStoreMut :: Borrowed ( std:: slice:: from_raw_parts_mut (
115
115
rgba as * mut u16 ,
116
116
rgba_stride as usize / 2 * height,
@@ -320,32 +320,150 @@ pub extern "C" fn weave_cvt_rgba16_to_rgba_f16(
320
320
width : u32 ,
321
321
height : u32 ,
322
322
) {
323
- work_on_transmuted_ptr_u16 (
324
- rgba16,
325
- rgba16_stride,
326
- width as usize ,
327
- height as usize ,
328
- true ,
329
- |src : & mut [ u16 ] , src_stride : usize | {
330
- work_on_transmuted_ptr_f16 (
331
- rgba_f16,
332
- rgba_f16_stride,
333
- width as usize ,
334
- height as usize ,
335
- false ,
336
- |dst : & mut [ f16 ] , dst_stride : usize | {
337
- convert_rgba16_to_f16 (
338
- src,
339
- src_stride,
340
- dst,
341
- dst_stride,
342
- bit_depth,
343
- width as usize ,
344
- height as usize ,
345
- )
346
- . unwrap ( ) ;
347
- } ,
348
- ) ;
349
- } ,
350
- ) ;
323
+ if rgba16 == rgba_f16 {
324
+ let mut new_src = vec ! [ 0 ; width as usize * height as usize * 4 ] ;
325
+ let src_slice = unsafe {
326
+ std:: slice:: from_raw_parts ( rgba16 as * mut u8 , rgba16_stride as usize * height as usize )
327
+ } ;
328
+ for ( dst, src) in new_src
329
+ . chunks_exact_mut ( width as usize * 4 )
330
+ . zip ( src_slice. chunks_exact ( rgba16_stride as usize ) )
331
+ {
332
+ let src = & src[ 0 ..width as usize * 4 * 2 ] ;
333
+ let dst = & mut dst[ 0 ..width as usize * 4 ] ;
334
+ for ( dst, src) in dst. iter_mut ( ) . zip ( src. chunks_exact ( 2 ) ) {
335
+ * dst = u16:: from_ne_bytes ( [ src[ 0 ] , src[ 1 ] ] ) ;
336
+ }
337
+ }
338
+
339
+ work_on_transmuted_ptr_f16 (
340
+ rgba_f16,
341
+ rgba_f16_stride,
342
+ width as usize ,
343
+ height as usize ,
344
+ false ,
345
+ |dst : & mut [ f16 ] , dst_stride : usize | {
346
+ convert_rgba16_to_f16 (
347
+ & new_src,
348
+ width as usize * 4 ,
349
+ dst,
350
+ dst_stride,
351
+ bit_depth,
352
+ width as usize ,
353
+ height as usize ,
354
+ )
355
+ . unwrap ( ) ;
356
+ } ,
357
+ ) ;
358
+ } else {
359
+ work_on_transmuted_ptr_u16 (
360
+ rgba16,
361
+ rgba16_stride,
362
+ width as usize ,
363
+ height as usize ,
364
+ true ,
365
+ |src : & mut [ u16 ] , src_stride : usize | {
366
+ work_on_transmuted_ptr_f16 (
367
+ rgba_f16,
368
+ rgba_f16_stride,
369
+ width as usize ,
370
+ height as usize ,
371
+ false ,
372
+ |dst : & mut [ f16 ] , dst_stride : usize | {
373
+ convert_rgba16_to_f16 (
374
+ src,
375
+ src_stride,
376
+ dst,
377
+ dst_stride,
378
+ bit_depth,
379
+ width as usize ,
380
+ height as usize ,
381
+ )
382
+ . unwrap ( ) ;
383
+ } ,
384
+ ) ;
385
+ } ,
386
+ ) ;
387
+ }
388
+ }
389
+
390
+ #[ cfg( test) ]
391
+ mod tests {
392
+ use super :: * ;
393
+ use core:: f16;
394
+ #[ test]
395
+ fn test_u16_f16 ( ) {
396
+ let width = 16usize ;
397
+ let height = 16usize ;
398
+ let origin = vec ! [ 512 ; width * height * 4 ] ;
399
+ let mut dst: Vec < f16 > = vec ! [ 0. ; width * height * 4 ] ;
400
+ weave_cvt_rgba16_to_rgba_f16 (
401
+ origin. as_ptr ( ) ,
402
+ width as u32 * 4 * 2 ,
403
+ 10 ,
404
+ dst. as_mut_ptr ( ) as * mut _ ,
405
+ width as u32 * 4 * 2 ,
406
+ width as u32 ,
407
+ height as u32 ,
408
+ ) ;
409
+ let v_src = origin
410
+ . iter ( )
411
+ . map ( |& x| ( x as f32 / 1023f32 ) as f16 )
412
+ . collect :: < Vec < f16 > > ( ) ;
413
+ assert_eq ! ( dst, v_src) ;
414
+
415
+ let mut origin = vec ! [ 512 ; width * height * 4 ] ;
416
+ weave_cvt_rgba16_to_rgba_f16 (
417
+ origin. as_ptr ( ) ,
418
+ width as u32 * 4 * 2 ,
419
+ 10 ,
420
+ origin. as_mut_ptr ( ) as * mut _ ,
421
+ width as u32 * 4 * 2 ,
422
+ width as u32 ,
423
+ height as u32 ,
424
+ ) ;
425
+ let v_src = origin
426
+ . iter ( )
427
+ . map ( |& x| f16:: from_bits ( x) )
428
+ . collect :: < Vec < f16 > > ( ) ;
429
+ assert_eq ! ( dst, v_src) ;
430
+ }
431
+
432
+ #[ test]
433
+ fn test_u16_f16_12 ( ) {
434
+ let width = 16usize ;
435
+ let height = 16usize ;
436
+ let origin = vec ! [ 4095 ; width * height * 4 ] ;
437
+ let mut dst: Vec < f16 > = vec ! [ 0. ; width * height * 4 ] ;
438
+ weave_cvt_rgba16_to_rgba_f16 (
439
+ origin. as_ptr ( ) ,
440
+ width as u32 * 4 * 2 ,
441
+ 12 ,
442
+ dst. as_mut_ptr ( ) as * mut _ ,
443
+ width as u32 * 4 * 2 ,
444
+ width as u32 ,
445
+ height as u32 ,
446
+ ) ;
447
+ let v_src = origin
448
+ . iter ( )
449
+ . map ( |& x| ( x as f32 / 4095f32 ) as f16 )
450
+ . collect :: < Vec < f16 > > ( ) ;
451
+ assert_eq ! ( dst, v_src) ;
452
+
453
+ let mut origin = vec ! [ 512 ; width * height * 4 ] ;
454
+ weave_cvt_rgba16_to_rgba_f16 (
455
+ origin. as_ptr ( ) ,
456
+ width as u32 * 4 * 2 ,
457
+ 12 ,
458
+ origin. as_mut_ptr ( ) as * mut _ ,
459
+ width as u32 * 4 * 2 ,
460
+ width as u32 ,
461
+ height as u32 ,
462
+ ) ;
463
+ let v_src = origin
464
+ . iter ( )
465
+ . map ( |& x| f16:: from_bits ( x) )
466
+ . collect :: < Vec < f16 > > ( ) ;
467
+ assert_eq ! ( dst, v_src) ;
468
+ }
351
469
}
0 commit comments