Mercurial > mplayer.hg
comparison libaf/af_format.c @ 12478:7f8eb5f6814a
support for 24 bit pcm/wav files
author | reimar |
---|---|
date | Sun, 16 May 2004 10:48:59 +0000 |
parents | be1e7cfddc08 |
children | dbbc25ea6403 |
comparison
equal
deleted
inserted
replaced
12477:1550ef7117c4 | 12478:7f8eb5f6814a |
---|---|
129 // Helper functions to check sanity for input arguments | 129 // Helper functions to check sanity for input arguments |
130 | 130 |
131 // Sanity check for bytes per sample | 131 // Sanity check for bytes per sample |
132 int check_bps(int bps) | 132 int check_bps(int bps) |
133 { | 133 { |
134 if(bps != 4 && bps != 2 && bps != 1){ | 134 if(bps != 4 && bps != 3 && bps != 2 && bps != 1){ |
135 af_msg(AF_MSG_ERROR,"[format] The number of bytes per sample" | 135 af_msg(AF_MSG_ERROR,"[format] The number of bytes per sample" |
136 " must be 1, 2 or 4. Current value is %i \n",bps); | 136 " must be 1, 2, 3 or 4. Current value is %i \n",bps); |
137 return AF_ERROR; | 137 return AF_ERROR; |
138 } | 138 } |
139 return AF_OK; | 139 return AF_OK; |
140 } | 140 } |
141 | 141 |
347 "", | 347 "", |
348 AF_FLAGS_REENTRANT, | 348 AF_FLAGS_REENTRANT, |
349 open | 349 open |
350 }; | 350 }; |
351 | 351 |
352 static inline uint32_t load24bit(void* data, int pos) { | |
353 #if WORDS_BIGENDIAN | |
354 return (((uint32_t)((uint8_t*)data)[3*pos])<<24) | | |
355 (((uint32_t)((uint8_t*)data)[3*pos+1])<<16) | | |
356 (((uint32_t)((uint8_t*)data)[3*pos+2])<<8); | |
357 #else | |
358 return (((uint32_t)((uint8_t*)data)[3*pos])<<8) | | |
359 (((uint32_t)((uint8_t*)data)[3*pos+1])<<16) | | |
360 (((uint32_t)((uint8_t*)data)[3*pos+2])<<24); | |
361 #endif | |
362 } | |
363 | |
364 static inline void store24bit(void* data, int pos, uint32_t expanded_value) { | |
365 #if WORDS_BIGENDIAN | |
366 ((uint8_t*)data)[3*pos]=expanded_value>>24; | |
367 ((uint8_t*)data)[3*pos+1]=expanded_value>>16; | |
368 ((uint8_t*)data)[3*pos+2]=expanded_value>>8; | |
369 #else | |
370 ((uint8_t*)data)[3*pos]=expanded_value>>8; | |
371 ((uint8_t*)data)[3*pos+1]=expanded_value>>16; | |
372 ((uint8_t*)data)[3*pos+2]=expanded_value>>24; | |
373 #endif | |
374 } | |
375 | |
352 // Function implementations used by play | 376 // Function implementations used by play |
353 static void endian(void* in, void* out, int len, int bps) | 377 static void endian(void* in, void* out, int len, int bps) |
354 { | 378 { |
355 register int i; | 379 register int i; |
356 switch(bps){ | 380 switch(bps){ |
357 case(2):{ | 381 case(2):{ |
358 register uint16_t s; | 382 register uint16_t s; |
359 for(i=0;i<len;i++){ | 383 for(i=0;i<len;i++){ |
360 s=((uint16_t*)in)[i]; | 384 s=((uint16_t*)in)[i]; |
361 ((uint16_t*)out)[i]=(uint16_t)(((s&0x00FF)<<8) | (s&0xFF00)>>8); | 385 ((uint16_t*)out)[i]=(uint16_t)(((s&0x00FF)<<8) | (s&0xFF00)>>8); |
386 } | |
387 break; | |
388 } | |
389 case(3):{ | |
390 register uint8_t s; | |
391 for(i=0;i<len;i++){ | |
392 s=((uint8_t*)in)[3*i]; | |
393 ((uint8_t*)out)[3*i]=((uint8_t*)in)[3*i+2]; | |
394 ((uint8_t*)out)[3*i+2]=s; | |
362 } | 395 } |
363 break; | 396 break; |
364 } | 397 } |
365 case(4):{ | 398 case(4):{ |
366 register uint32_t s; | 399 register uint32_t s; |
386 break; | 419 break; |
387 case(2): | 420 case(2): |
388 for(i=0;i<len;i++) | 421 for(i=0;i<len;i++) |
389 ((uint16_t*)out)[i]=(uint16_t)(SHRT_MAX+((int)((int16_t*)in)[i])); | 422 ((uint16_t*)out)[i]=(uint16_t)(SHRT_MAX+((int)((int16_t*)in)[i])); |
390 break; | 423 break; |
424 case(3): | |
425 for(i=0;i<len;i++) | |
426 store24bit(out, i, (uint32_t)(INT_MAX+(int32_t)load24bit(in, i))); | |
427 break; | |
391 case(4): | 428 case(4): |
392 for(i=0;i<len;i++) | 429 for(i=0;i<len;i++) |
393 ((uint32_t*)out)[i]=(uint32_t)(INT_MAX+((int32_t*)in)[i]); | 430 ((uint32_t*)out)[i]=(uint32_t)(INT_MAX+((int32_t*)in)[i]); |
394 break; | 431 break; |
395 } | 432 } |
404 ((int8_t*)out)[i]=(int8_t)(SCHAR_MIN+((int)((uint8_t*)in)[i])); | 441 ((int8_t*)out)[i]=(int8_t)(SCHAR_MIN+((int)((uint8_t*)in)[i])); |
405 break; | 442 break; |
406 case(2): | 443 case(2): |
407 for(i=0;i<len;i++) | 444 for(i=0;i<len;i++) |
408 ((int16_t*)out)[i]=(int16_t)(SHRT_MIN+((int)((uint16_t*)in)[i])); | 445 ((int16_t*)out)[i]=(int16_t)(SHRT_MIN+((int)((uint16_t*)in)[i])); |
446 break; | |
447 case(3): | |
448 for(i=0;i<len;i++) | |
449 store24bit(out, i, (int32_t)(INT_MIN+(uint32_t)load24bit(in, i))); | |
409 break; | 450 break; |
410 case(4): | 451 case(4): |
411 for(i=0;i<len;i++) | 452 for(i=0;i<len;i++) |
412 ((int32_t*)out)[i]=(int32_t)(INT_MIN+((uint32_t*)in)[i]); | 453 ((int32_t*)out)[i]=(int32_t)(INT_MIN+((uint32_t*)in)[i]); |
413 break; | 454 break; |
422 switch(outbps){ | 463 switch(outbps){ |
423 case(2): | 464 case(2): |
424 for(i=0;i<len;i++) | 465 for(i=0;i<len;i++) |
425 ((uint16_t*)out)[i]=((uint16_t)((uint8_t*)in)[i])<<8; | 466 ((uint16_t*)out)[i]=((uint16_t)((uint8_t*)in)[i])<<8; |
426 break; | 467 break; |
468 case(3): | |
469 for(i=0;i<len;i++) | |
470 store24bit(out, i, ((uint32_t)((uint8_t*)in)[i])<<24); | |
471 break; | |
427 case(4): | 472 case(4): |
428 for(i=0;i<len;i++) | 473 for(i=0;i<len;i++) |
429 ((uint32_t*)out)[i]=((uint32_t)((uint8_t*)in)[i])<<24; | 474 ((uint32_t*)out)[i]=((uint32_t)((uint8_t*)in)[i])<<24; |
430 break; | 475 break; |
431 } | 476 } |
434 switch(outbps){ | 479 switch(outbps){ |
435 case(1): | 480 case(1): |
436 for(i=0;i<len;i++) | 481 for(i=0;i<len;i++) |
437 ((uint8_t*)out)[i]=(uint8_t)((((uint16_t*)in)[i])>>8); | 482 ((uint8_t*)out)[i]=(uint8_t)((((uint16_t*)in)[i])>>8); |
438 break; | 483 break; |
484 case(3): | |
485 for(i=0;i<len;i++) | |
486 store24bit(out, i, ((uint32_t)((uint16_t*)in)[i])<<16); | |
487 break; | |
439 case(4): | 488 case(4): |
440 for(i=0;i<len;i++) | 489 for(i=0;i<len;i++) |
441 ((uint32_t*)out)[i]=((uint32_t)((uint16_t*)in)[i])<<16; | 490 ((uint32_t*)out)[i]=((uint32_t)((uint16_t*)in)[i])<<16; |
442 break; | 491 break; |
443 } | 492 } |
444 break; | 493 break; |
494 case(3): | |
495 switch(outbps){ | |
496 case(1): | |
497 for(i=0;i<len;i++) | |
498 ((uint8_t*)out)[i]=(uint8_t)(load24bit(in, i)>>24); | |
499 break; | |
500 case(2): | |
501 for(i=0;i<len;i++) | |
502 ((uint16_t*)out)[i]=(uint16_t)(load24bit(in, i)>>16); | |
503 break; | |
504 case(4): | |
505 for(i=0;i<len;i++) | |
506 ((uint32_t*)out)[i]=(uint32_t)load24bit(in, i); | |
507 break; | |
508 } | |
509 break; | |
445 case(4): | 510 case(4): |
446 switch(outbps){ | 511 switch(outbps){ |
447 case(1): | 512 case(1): |
448 for(i=0;i<len;i++) | 513 for(i=0;i<len;i++) |
449 ((uint8_t*)out)[i]=(uint8_t)((((uint32_t*)in)[i])>>24); | 514 ((uint8_t*)out)[i]=(uint8_t)((((uint32_t*)in)[i])>>24); |
450 break; | 515 break; |
451 case(2): | 516 case(2): |
452 for(i=0;i<len;i++) | 517 for(i=0;i<len;i++) |
453 ((uint16_t*)out)[i]=(uint16_t)((((uint32_t*)in)[i])>>16); | 518 ((uint16_t*)out)[i]=(uint16_t)((((uint32_t*)in)[i])>>16); |
454 break; | 519 break; |
520 case(3): | |
521 for(i=0;i<len;i++) | |
522 store24bit(out, i, ((uint32_t*)in)[i]); | |
523 break; | |
455 } | 524 } |
456 break; | 525 break; |
457 } | 526 } |
458 } | 527 } |
459 | 528 |
467 break; | 536 break; |
468 case(2): | 537 case(2): |
469 for(i=0;i<len;i++) | 538 for(i=0;i<len;i++) |
470 ((int16_t*)out)[i]=(int16_t)lrintf(SHRT_MAX*((float*)in)[i]); | 539 ((int16_t*)out)[i]=(int16_t)lrintf(SHRT_MAX*((float*)in)[i]); |
471 break; | 540 break; |
541 case(3): | |
542 for(i=0;i<len;i++) | |
543 store24bit(out, i, (int32_t)lrintf(INT_MAX*((float*)in)[i])); | |
544 break; | |
472 case(4): | 545 case(4): |
473 for(i=0;i<len;i++) | 546 for(i=0;i<len;i++) |
474 ((int32_t*)out)[i]=(int32_t)lrintf(INT_MAX*((float*)in)[i]); | 547 ((int32_t*)out)[i]=(int32_t)lrintf(INT_MAX*((float*)in)[i]); |
475 break; | 548 break; |
476 } | 549 } |
486 break; | 559 break; |
487 case(2): | 560 case(2): |
488 for(i=0;i<len;i++) | 561 for(i=0;i<len;i++) |
489 ((float*)out)[i]=(1.0/SHRT_MAX)*((float)((int16_t*)in)[i]); | 562 ((float*)out)[i]=(1.0/SHRT_MAX)*((float)((int16_t*)in)[i]); |
490 break; | 563 break; |
564 case(3): | |
565 for(i=0;i<len;i++) | |
566 ((float*)out)[i]=(1.0/INT_MAX)*((float)((int32_t)load24bit(in, i))); | |
567 break; | |
491 case(4): | 568 case(4): |
492 for(i=0;i<len;i++) | 569 for(i=0;i<len;i++) |
493 ((float*)out)[i]=(1.0/INT_MAX)*((float)((int32_t*)in)[i]); | 570 ((float*)out)[i]=(1.0/INT_MAX)*((float)((int32_t*)in)[i]); |
494 break; | 571 break; |
495 } | 572 } |