You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			176 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
		
		
			
		
	
	
			176 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
| 
											10 years ago
										 | /*
 | ||
|  |  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | ||
|  |  * | ||
|  |  *  Use of this source code is governed by a BSD-style license | ||
|  |  *  that can be found in the LICENSE file in the root of the source | ||
|  |  *  tree. An additional intellectual property rights grant can be found | ||
|  |  *  in the file PATENTS.  All contributing project authors may | ||
|  |  *  be found in the AUTHORS file in the root of the source tree. | ||
|  |  */ | ||
|  | #include <string.h>
 | ||
|  | #include "g711.h"
 | ||
|  | #include "g711_interface.h"
 | ||
|  | #include "typedefs.h"
 | ||
|  | 
 | ||
|  | int16_t WebRtcG711_EncodeA(void* state, | ||
|  |                            int16_t* speechIn, | ||
|  |                            int16_t len, | ||
|  |                            int16_t* encoded) { | ||
|  |   int n; | ||
|  |   uint16_t tempVal, tempVal2; | ||
|  | 
 | ||
|  |   // Set and discard to avoid getting warnings
 | ||
|  |   (void)(state = NULL); | ||
|  | 
 | ||
|  |   // Sanity check of input length
 | ||
|  |   if (len < 0) { | ||
|  |     return (-1); | ||
|  |   } | ||
|  | 
 | ||
|  |   // Loop over all samples
 | ||
|  |   for (n = 0; n < len; n++) { | ||
|  |     tempVal = (uint16_t) linear_to_alaw(speechIn[n]); | ||
|  | 
 | ||
|  | #ifdef WEBRTC_ARCH_BIG_ENDIAN
 | ||
|  |     if ((n & 0x1) == 1) { | ||
|  |       encoded[n >> 1] |= ((uint16_t) tempVal); | ||
|  |     } else { | ||
|  |       encoded[n >> 1] = ((uint16_t) tempVal) << 8; | ||
|  |     } | ||
|  | #else
 | ||
|  |     if ((n & 0x1) == 1) { | ||
|  |       tempVal2 |= ((uint16_t) tempVal) << 8; | ||
|  |       encoded[n >> 1] |= ((uint16_t) tempVal) << 8; | ||
|  |     } else { | ||
|  |       tempVal2 = ((uint16_t) tempVal); | ||
|  |       encoded[n >> 1] = ((uint16_t) tempVal); | ||
|  |     } | ||
|  | #endif
 | ||
|  |   } | ||
|  |   return (len); | ||
|  | } | ||
|  | 
 | ||
|  | int16_t WebRtcG711_EncodeU(void* state, | ||
|  |                            int16_t* speechIn, | ||
|  |                            int16_t len, | ||
|  |                            int16_t* encoded) { | ||
|  |   int n; | ||
|  |   uint16_t tempVal; | ||
|  | 
 | ||
|  |   // Set and discard to avoid getting warnings
 | ||
|  |   (void)(state = NULL); | ||
|  | 
 | ||
|  |   // Sanity check of input length
 | ||
|  |   if (len < 0) { | ||
|  |     return (-1); | ||
|  |   } | ||
|  | 
 | ||
|  |   // Loop over all samples
 | ||
|  |   for (n = 0; n < len; n++) { | ||
|  |     tempVal = (uint16_t) linear_to_ulaw(speechIn[n]); | ||
|  | 
 | ||
|  | #ifdef WEBRTC_ARCH_BIG_ENDIAN
 | ||
|  |     if ((n & 0x1) == 1) { | ||
|  |       encoded[n >> 1] |= ((uint16_t) tempVal); | ||
|  |     } else { | ||
|  |       encoded[n >> 1] = ((uint16_t) tempVal) << 8; | ||
|  |     } | ||
|  | #else
 | ||
|  |     if ((n & 0x1) == 1) { | ||
|  |       encoded[n >> 1] |= ((uint16_t) tempVal) << 8; | ||
|  |     } else { | ||
|  |       encoded[n >> 1] = ((uint16_t) tempVal); | ||
|  |     } | ||
|  | #endif
 | ||
|  |   } | ||
|  |   return (len); | ||
|  | } | ||
|  | 
 | ||
|  | int16_t WebRtcG711_DecodeA(void* state, | ||
|  |                            int16_t* encoded, | ||
|  |                            int16_t len, | ||
|  |                            int16_t* decoded, | ||
|  |                            int16_t* speechType) { | ||
|  |   int n; | ||
|  |   uint16_t tempVal; | ||
|  | 
 | ||
|  |   // Set and discard to avoid getting warnings
 | ||
|  |   (void)(state = NULL); | ||
|  | 
 | ||
|  |   // Sanity check of input length
 | ||
|  |   if (len < 0) { | ||
|  |     return (-1); | ||
|  |   } | ||
|  | 
 | ||
|  |   for (n = 0; n < len; n++) { | ||
|  | #ifdef WEBRTC_ARCH_BIG_ENDIAN
 | ||
|  |     if ((n & 0x1) == 1) { | ||
|  |       tempVal = ((uint16_t) encoded[n >> 1] & 0xFF); | ||
|  |     } else { | ||
|  |       tempVal = ((uint16_t) encoded[n >> 1] >> 8); | ||
|  |     } | ||
|  | #else
 | ||
|  |     if ((n & 0x1) == 1) { | ||
|  |       tempVal = (encoded[n >> 1] >> 8); | ||
|  |     } else { | ||
|  |       tempVal = (encoded[n >> 1] & 0xFF); | ||
|  |     } | ||
|  | #endif
 | ||
|  |     decoded[n] = (int16_t) alaw_to_linear(tempVal); | ||
|  |   } | ||
|  | 
 | ||
|  |   *speechType = 1; | ||
|  |   return (len); | ||
|  | } | ||
|  | 
 | ||
|  | int16_t WebRtcG711_DecodeU(void* state, | ||
|  |                            int16_t* encoded, | ||
|  |                            int16_t len, | ||
|  |                            int16_t* decoded, | ||
|  |                            int16_t* speechType) { | ||
|  |   int n; | ||
|  |   uint16_t tempVal; | ||
|  | 
 | ||
|  |   // Set and discard to avoid getting warnings
 | ||
|  |   (void)(state = NULL); | ||
|  | 
 | ||
|  |   // Sanity check of input length
 | ||
|  |   if (len < 0) { | ||
|  |     return (-1); | ||
|  |   } | ||
|  | 
 | ||
|  |   for (n = 0; n < len; n++) { | ||
|  | #ifdef WEBRTC_ARCH_BIG_ENDIAN
 | ||
|  |     if ((n & 0x1) == 1) { | ||
|  |       tempVal = ((uint16_t) encoded[n >> 1] & 0xFF); | ||
|  |     } else { | ||
|  |       tempVal = ((uint16_t) encoded[n >> 1] >> 8); | ||
|  |     } | ||
|  | #else
 | ||
|  |     if ((n & 0x1) == 1) { | ||
|  |       tempVal = (encoded[n >> 1] >> 8); | ||
|  |     } else { | ||
|  |       tempVal = (encoded[n >> 1] & 0xFF); | ||
|  |     } | ||
|  | #endif
 | ||
|  |     decoded[n] = (int16_t) ulaw_to_linear(tempVal); | ||
|  |   } | ||
|  | 
 | ||
|  |   *speechType = 1; | ||
|  |   return (len); | ||
|  | } | ||
|  | 
 | ||
|  | int WebRtcG711_DurationEst(void* state, | ||
|  |                            const uint8_t* payload, | ||
|  |                            int payload_length_bytes) { | ||
|  |   (void) state; | ||
|  |   (void) payload; | ||
|  |   /* G.711 is one byte per sample, so we can just return the number of bytes. */ | ||
|  |   return payload_length_bytes; | ||
|  | } | ||
|  | 
 | ||
|  | int16_t WebRtcG711_Version(char* version, int16_t lenBytes) { | ||
|  |   strncpy(version, "2.0.0", lenBytes); | ||
|  |   return 0; | ||
|  | } |