blob: d07c846d8135bcf59f26067774404eb6fda74f7b [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
/****************************************************************************************
Portions of this file are derived from the following 3GPP standard:
3GPP TS 26.073
ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
Available from http://www.3gpp.org
(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
Permission to distribute, modify and use this file under the standard license
terms listed above has been obtained from the copyright holder.
****************************************************************************************/
/*
------------------------------------------------------------------------------
Filename: /audio/gsm-amr/c/src/amrencode.c
Functions: AMREncode
AMREncodeInit
AMREncodeReset
AMREncodeExit
Date: 01/26/2002
------------------------------------------------------------------------------
REVISION HISTORY
Description: Added input_type in the parameter list and updated code to
check the type of output formatting to use.
Description: Corrected typo in Include section.
Description: Added code to support ETS format.
Description: Modified file by adding the return of the number of encoder
frame bytes.
Description: Added call to sid_sync function to support TX_NO_DATA case.
Added SID type and mode info to ets_output_bfr for ETS SID
frames. Created AMREncodeInit, AMREncodeReset, and AMREncodeExit
functions.
Description: Modified design of handling of ETS outputs such that the ETS
testvectors could be compared directly to the output of this
function.
Description: Added conditional compile around calls to AMR Encoder interface
functions to allow amrencode.c to be used in the ETS reference
console.
Description: Replaced "int" and/or "char" with OSCL defined types.
Description:
------------------------------------------------------------------------------
MODULE DESCRIPTION
This file contains the functions required to initialize, reset, exit, and
invoke the ETS 3GPP GSM AMR encoder.
------------------------------------------------------------------------------
*/
/*----------------------------------------------------------------------------
; INCLUDES
----------------------------------------------------------------------------*/
#include "cnst.h"
#include "mode.h"
#include "frame_type_3gpp.h"
#include "typedef.h"
#include "amrencode.h"
#include "ets_to_if2.h"
#include "ets_to_wmf.h"
#include "sid_sync.h"
#include "sp_enc.h"
/*----------------------------------------------------------------------------
; MACROS [optional]
; [Define module specific macros here]
----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
; DEFINES [optional]
; [Include all pre-processor statements here. Include conditional
; compile variables also.]
----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
; LOCAL FUNCTION DEFINITIONS
; [List function prototypes here]
----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
; LOCAL VARIABLE DEFINITIONS
; [Variable declaration - defined here and used outside this module]
----------------------------------------------------------------------------*/
/*
------------------------------------------------------------------------------
FUNCTION NAME: AMREncodeInit
------------------------------------------------------------------------------
INPUT AND OUTPUT DEFINITIONS
Inputs:
pEncStructure = pointer containing the pointer to a structure used by
the encoder (void)
pSidSyncStructure = pointer containing the pointer to a structure used for
SID synchronization (void)
dtx_enable = flag to turn off or turn on DTX (Flag)
Outputs:
None
Returns:
init_status = 0, if initialization was successful; -1, otherwise (int)
Global Variables Used:
None
Local Variables Needed:
speech_encoder_state = pointer to encoder frame structure
(Speech_Encode_FrameState)
sid_state = pointer to SID sync structure (sid_syncState)
------------------------------------------------------------------------------
FUNCTION DESCRIPTION
This function initializes the GSM AMR Encoder library by calling
GSMInitEncode and sid_sync_init. If initialization was successful,
init_status is set to zero, otherwise, it is set to -1.
------------------------------------------------------------------------------
REQUIREMENTS
None
------------------------------------------------------------------------------
REFERENCES
None
------------------------------------------------------------------------------
PSEUDO-CODE
// Initialize GSM AMR Encoder
CALL GSMInitEncode(state_data = &pEncStructure,
dtx = dtx_enable,
id = char_id )
MODIFYING(nothing)
RETURNING(return_value = enc_init_status)
// Initialize SID synchronization
CALL sid_sync_init(state = &pSidSyncStructure)
MODIFYING(nothing)
RETURNING(return_value = sid_sync_init_status)
IF ((enc_init_status != 0) || (sid_sync_init != 0))
THEN
init_status = -1
ENDIF
MODIFY(nothing)
RETURN(init_status)
------------------------------------------------------------------------------
RESOURCES USED [optional]
When the code is written for a specific target processor the
the resources used should be documented below.
HEAP MEMORY USED: x bytes
STACK MEMORY USED: x bytes
CLOCK CYCLES: (cycle count equation for this function) + (variable
used to represent cycle count for each subroutine
called)
where: (cycle count variable) = cycle count for [subroutine
name]
------------------------------------------------------------------------------
CAUTION [optional]
[State any special notes, constraints or cautions for users of this function]
------------------------------------------------------------------------------
*/
Word16 AMREncodeInit(
void **pEncStructure,
void **pSidSyncStructure,
Flag dtx_enable)
{
Word16 enc_init_status = 0;
Word16 sid_sync_init_status = 0;
Word16 init_status = 0;
/* Initialize GSM AMR Encoder */
#ifdef CONSOLE_ENCODER_REF
/* Change to original ETS input types */
Speech_Encode_FrameState **speech_encode_frame =
(Speech_Encode_FrameState **)(pEncStructure);
sid_syncState **sid_sync_state = (sid_syncState **)(pSidSyncStructure);
/* Use ETS version of sp_enc.c */
enc_init_status = Speech_Encode_Frame_init(speech_encode_frame,
dtx_enable,
(Word8*)"encoder");
/* Initialize SID synchronization */
sid_sync_init_status = sid_sync_init(sid_sync_state);
#else
/* Use PV version of sp_enc.c */
enc_init_status = GSMInitEncode(pEncStructure,
dtx_enable,
(Word8*)"encoder");
/* Initialize SID synchronization */
sid_sync_init_status = sid_sync_init(pSidSyncStructure);
#endif
if ((enc_init_status != 0) || (sid_sync_init_status != 0))
{
init_status = -1;
}
return(init_status);
}
/****************************************************************************/
/*
------------------------------------------------------------------------------
FUNCTION NAME: AMREncodeReset
------------------------------------------------------------------------------
INPUT AND OUTPUT DEFINITIONS
Inputs:
pEncStructure = pointer to a structure used by the encoder (void)
pSidSyncStructure = pointer to a structure used for SID synchronization
(void)
Outputs:
None
Returns:
reset_status = 0, if reset was successful; -1, otherwise (int)
Global Variables Used:
None
Local Variables Needed:
speech_encoder_state = pointer to encoder frame structure
(Speech_Encode_FrameState)
sid_state = pointer to SID sync structure (sid_syncState)
------------------------------------------------------------------------------
FUNCTION DESCRIPTION
This function resets the state memory used by the Encoder and SID sync
function. If reset was successful, reset_status is set to zero, otherwise,
it is set to -1.
------------------------------------------------------------------------------
REQUIREMENTS
None
------------------------------------------------------------------------------
REFERENCES
None
------------------------------------------------------------------------------
PSEUDO-CODE
// Reset GSM AMR Encoder
CALL Speech_Encode_Frame_reset(state_data = pEncStructure)
MODIFYING(nothing)
RETURNING(return_value = enc_reset_status)
// Reset SID synchronization
CALL sid_sync_reset(state = pSidSyncStructure)
MODIFYING(nothing)
RETURNING(return_value = sid_sync_reset_status)
IF ((enc_reset_status != 0) || (sid_sync_reset_status != 0))
THEN
reset_status = -1
ENDIF
MODIFY(nothing)
RETURN(reset_status)
------------------------------------------------------------------------------
RESOURCES USED [optional]
When the code is written for a specific target processor the
the resources used should be documented below.
HEAP MEMORY USED: x bytes
STACK MEMORY USED: x bytes
CLOCK CYCLES: (cycle count equation for this function) + (variable
used to represent cycle count for each subroutine
called)
where: (cycle count variable) = cycle count for [subroutine
name]
------------------------------------------------------------------------------
CAUTION [optional]
[State any special notes, constraints or cautions for users of this function]
------------------------------------------------------------------------------
*/
Word16 AMREncodeReset(
void *pEncStructure,
void *pSidSyncStructure)
{
Word16 enc_reset_status = 0;
Word16 sid_sync_reset_status = 0;
Word16 reset_status = 0;
/* Reset GSM AMR Encoder */
enc_reset_status = Speech_Encode_Frame_reset(pEncStructure);
/* Reset SID synchronization */
sid_sync_reset_status = sid_sync_reset(pSidSyncStructure);
if ((enc_reset_status != 0) || (sid_sync_reset_status != 0))
{
reset_status = -1;
}
return(reset_status);
}
/****************************************************************************/
/*
------------------------------------------------------------------------------
FUNCTION NAME: AMREncodeExit
------------------------------------------------------------------------------
INPUT AND OUTPUT DEFINITIONS
Inputs:
pEncStructure = pointer containing the pointer to a structure used by
the encoder (void)
pSidSyncStructure = pointer containing the pointer to a structure used for
SID synchronization (void)
Outputs:
None
Returns:
None
Global Variables Used:
None
Local Variables Needed:
speech_encoder_state = pointer to encoder frame structure
(Speech_Encode_FrameState)
sid_state = pointer to SID sync structure (sid_syncState)
------------------------------------------------------------------------------
FUNCTION DESCRIPTION
This function frees up the state memory used by the Encoder and SID
synchronization function.
------------------------------------------------------------------------------
REQUIREMENTS
None
------------------------------------------------------------------------------
REFERENCES
None
------------------------------------------------------------------------------
PSEUDO-CODE
// Exit GSM AMR Encoder
CALL GSMEncodeFrameExit(state_data = &pEncStructure)
MODIFYING(nothing)
RETURNING(nothing)
// Exit SID synchronization
CALL sid_sync_exit(state = &pSidSyncStructure)
MODIFYING(nothing)
RETURNING(nothing)
MODIFY(nothing)
RETURN(nothing)
------------------------------------------------------------------------------
RESOURCES USED [optional]
When the code is written for a specific target processor the
the resources used should be documented below.
HEAP MEMORY USED: x bytes
STACK MEMORY USED: x bytes
CLOCK CYCLES: (cycle count equation for this function) + (variable
used to represent cycle count for each subroutine
called)
where: (cycle count variable) = cycle count for [subroutine
name]
------------------------------------------------------------------------------
CAUTION [optional]
[State any special notes, constraints or cautions for users of this function]
------------------------------------------------------------------------------
*/
void AMREncodeExit(
void **pEncStructure,
void **pSidSyncStructure)
{
/* Exit GSM AMR Encoder */
#ifdef CONSOLE_ENCODER_REF
/* Change to original ETS input types */
Speech_Encode_FrameState ** speech_encode_frame =
(Speech_Encode_FrameState **)(pEncStructure);
sid_syncState ** sid_sync_state = (sid_syncState **)(pSidSyncStructure);
/* Use ETS version of sp_enc.c */
Speech_Encode_Frame_exit(speech_encode_frame);
/* Exit SID synchronization */
sid_sync_exit(sid_sync_state);
#else
/* Use PV version of sp_enc.c */
GSMEncodeFrameExit(pEncStructure);
/* Exit SID synchronization */
sid_sync_exit(pSidSyncStructure);
#endif
return;
}
/****************************************************************************/
/*
------------------------------------------------------------------------------
FUNCTION NAME: AMREncode
------------------------------------------------------------------------------
INPUT AND OUTPUT DEFINITIONS
Inputs:
pEncState = pointer to encoder state structure (void)
pSidSyncState = pointer to SID sync state structure (void)
mode = codec mode (enum Mode)
pEncInput = pointer to the input speech samples (Word16)
pEncOutput = pointer to the encoded bit stream (unsigned char)
p3gpp_frame_type = pointer to the 3GPP frame type (enum Frame_Type_3GPP)
output_format = output format type (Word16); valid values are AMR_WMF,
AMR_IF2, and AMR_ETS
Outputs:
pEncOutput buffer contains to the newly encoded bit stream
p3gpp_frame_type store contains the new 3GPP frame type
Returns:
num_enc_bytes = number of encoded bytes for a particular
mode or -1, if an error occurred (int)
Global Variables Used:
WmfEncBytesPerFrame = table containing the number of encoder frame
data bytes per codec mode for WMF output
format (const int)
If2EncBytesPerFrame = table containing the number of encoder frame
data bytes per codec mode for IF2 output
format (const int)
Local Variables Needed:
None
------------------------------------------------------------------------------
FUNCTION DESCRIPTION
This function is the top-level entry point to the GSM AMR Encoder library.
The following describes the encoding process for WMF or IF2 formatted output
data. This functions calls GSMEncodeFrame to encode one frame's worth of
input speech samples, and returns the newly encoded bit stream in the buffer
pointed to by pEncOutput.Then the function sid_sync is called to determine
the transmit frame type. If the transmit frame type is TX_SPEECH_GOOD or
TX_SID_FIRST or TX_SID_UPDATE, p3gpp_frame_type will be set to the encoder
used mode. For SID frames, the SID type information and mode information are
added to the encoded parameter bitstream according to the SID frame format
described in [1]. If the transmit frame type is TX_NO_DATA, the store
pointed to by p3gpp_frame_type will be set to NO_DATA. Then the output
format type (output_format) will be checked to determine the format of the
encoded data.
If output_format is AMR_TX_WMF, the function ets_to_wmf will be called to
convert from ETS format (1 bit/word, where 1 word = 16 bits, information in
least significant bit) to WMF (aka, non-IF2). The WMF format stores the data
in octets. The least significant 4 bits of the first octet contains the 3GPP
frame type information and the most significant 4 bits are zeroed out. The
succeeding octets contain the packed encoded speech bits. The total number of
WMF bytes encoded is obtained from WmfEncBytesPerFrame table and returned via
num_enc_bytes.
If output_format is AMR_TX_IF2, the function if2_to_ets will be called to
convert from ETS format to IF2 [1]. The IF2 format stores the data in octets.
The least significant nibble of the first octet contains the 3GPP frame type
and the most significant nibble contains the first 4 encoded speech bits. The
suceeding octets contain the packed encoded speech bits. The total number of
IF2 bytes encoded is obtained from If2EncBytesPerFrame table and returned via
num_enc_bytes.
If output_format is AMR_TX_ETS, GSMFrameEncode is called to generate the
encoded speech parameters, then, sid_sync is called to determine the transmit
frame type. If the transmit frame type is not TX_NO_DATA, then the transmit
frame type information is saved in the first location of the ets_output_bfr,
followed by the encoded speech parameters. The codec mode information is
stored immediately after the MAX_SERIAL_SIZE encoded speech parameters. If
the transmit frame type is TX_NO_DATA, the transmit frame type, encoded
speech parameters, and codec mode are stored in the same order as before
in ets_output_bfr. However, for the no data case, the codec mode is set to
-1.
After all the required information is generated, the 16-bit data generated
by the Encoder (in ets_output_bfr) is copied to the buffer pointed to by
pEncOutput in the little endian configuration, i.e., least significant byte,
followed by most significant byte. The num_enc_bytes is set to
2*(MAX_SERIAL_SIZE+2).
If output_format is invalid, this function flags the error and sets
num_enc_bytes to -1.
------------------------------------------------------------------------------
REQUIREMENTS
None
------------------------------------------------------------------------------
REFERENCES
[1] "AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0
Release 4, June 2001
------------------------------------------------------------------------------
PSEUDO-CODE
IF ((output_format == AMR_TX_WMF) | (output_format == AMR_TX_IF2))
THEN
// Encode one speech frame (20 ms)
CALL GSMEncodeFrame( state_data = pEncState,
mode = mode,
new_speech = pEncInput,
serial = &ets_output_bfr[0],
usedMode = &usedMode )
MODIFYING(nothing)
RETURNING(return_value = 0)
// Determine transmit frame type
CALL sid_sync(st = pSidSyncState,
mode = usedMode
tx_frame_type = &tx_frame_type)
MODIFYING(nothing)
RETURNING(nothing)
IF (tx_frame_type != TX_NO_DATA)
THEN
// There is data to transmit
*p3gpp_frame_type = (enum Frame_Type_3GPP) usedMode
// Add SID type and mode info for SID frames
IF (*p3gpp_frame_type == AMR_SID)
THEN
// Add SID type to encoder output buffer
IF (tx_frame_type == TX_SID_FIRST)
THEN
ets_output_bfr[AMRSID_TXTYPE_BIT_OFFSET] &= 0x7f
ELSEIF (tx_frame_type == TX_SID_UPDATE )
THEN
ets_output_bfr[AMRSID_TXTYPE_BIT_OFFSET] |= 0x80
ENDIF
// Add mode information bits
FOR i = 0 TO NUM_AMRSID_TXMODE_BITS-1
ets_output_bfr[AMRSID_TXMODE_BIT_OFFSET+i] = (mode>>i)&&0x0001
ENDFOR
ENDIF
ELSE
// There is no data to transmit
*p3gpp_frame_type = NO_DATA
ENDIF
// Determine the output format to use
IF (output_format == AMR_TX_WMF)
THEN
// Change output data format to WMF
CALL ets_to_wmf( frame_type_3gpp = *p3gpp_frame_type,
ets_input_ptr = &ets_output_bfr[0],
wmf_output_ptr = pEncOutput )
MODIFYING(nothing)
RETURNING(nothing)
// Set up the number of encoded WMF bytes
num_enc_bytes = WmfEncBytesPerFrame[(int) *p3gpp_frame_type]
ELSEIF (output_format == AMR_TX_IF2)
THEN
// Change output data format to IF2
CALL ets_to_if2( frame_type_3gpp = *p3gpp_frame_type,
ets_input_ptr = &ets_output_bfr[0],
if2_output_ptr = pEncOutput )
MODIFYING(nothing)
RETURNING(nothing)
// Set up the number of encoded IF2 bytes
num_enc_bytes = If2EncBytesPerFrame[(int) *p3gpp_frame_type]
ENDIF
ELSEIF (output_format = AMR_TX_ETS)
THEN
// Encode one speech frame (20 ms)
CALL GSMEncodeFrame( state_data = pEncState,
mode = mode,
new_speech = pEncInput,
serial = &ets_output_bfr[1],
usedMode = &usedMode )
MODIFYING(nothing)
RETURNING(return_value = 0)
// Save used mode
*p3gpp_frame_type = (enum Frame_Type_3GPP) usedMode
// Determine transmit frame type
CALL sid_sync(st = pSidSyncState,
mode = usedMode
tx_frame_type = &tx_frame_type)
MODIFYING(nothing)
RETURNING(nothing)
// Put TX frame type in output buffer
ets_output_bfr[0] = tx_frame_type
// Put mode information after the encoded speech parameters
IF (tx_frame_type != TX_NO_DATA)
THEN
ets_output_bfr[MAX_SERIAL_SIZE+1] = mode
ELSE
ets_output_bfr[MAX_SERIAL_SIZE+1] = -1
ENDIF
// Copy output of encoder to pEncOutput buffer
ets_output_ptr = (unsigned char *) &ets_output_bfr[0]
// Copy 16-bit data in 8-bit chunks using Little Endian configuration
FOR i = 0 TO (2*(MAX_SERIAL_SIZE+6))-1
*(pEncOutput+i) = *ets_output_ptr
ets_output_ptr = ets_output_ptr + 1
ENDFOR
// Set up number of encoded bytes
num_enc_bytes = 2*(MAX_SERIAL_SIZE+6)
ELSE
// Invalid output_format, set up error code
num_enc_bytes = -1
ENDIF
MODIFY (nothing)
RETURN (num_enc_bytes)
------------------------------------------------------------------------------
RESOURCES USED [optional]
When the code is written for a specific target processor the
the resources used should be documented below.
HEAP MEMORY USED: x bytes
STACK MEMORY USED: x bytes
CLOCK CYCLES: (cycle count equation for this function) + (variable
used to represent cycle count for each subroutine
called)
where: (cycle count variable) = cycle count for [subroutine
name]
------------------------------------------------------------------------------
CAUTION [optional]
[State any special notes, constraints or cautions for users of this function]
------------------------------------------------------------------------------
*/
Word16 AMREncode(
void *pEncState,
void *pSidSyncState,
enum Mode mode,
Word16 *pEncInput,
UWord8 *pEncOutput,
enum Frame_Type_3GPP *p3gpp_frame_type,
Word16 output_format
)
{
Word16 ets_output_bfr[MAX_SERIAL_SIZE+2];
UWord8 *ets_output_ptr;
Word16 num_enc_bytes = -1;
Word16 i;
enum TXFrameType tx_frame_type;
enum Mode usedMode = MR475;
/* Encode WMF or IF2 frames */
if ((output_format == AMR_TX_WMF) | (output_format == AMR_TX_IF2))
{
/* Encode one speech frame (20 ms) */
#ifndef CONSOLE_ENCODER_REF
/* Use PV version of sp_enc.c */
GSMEncodeFrame(pEncState, mode, pEncInput, ets_output_bfr, &usedMode);
#else
/* Use ETS version of sp_enc.c */
Speech_Encode_Frame(pEncState, mode, pEncInput, ets_output_bfr, &usedMode);
#endif
/* Determine transmit frame type */
sid_sync(pSidSyncState, usedMode, &tx_frame_type);
if (tx_frame_type != TX_NO_DATA)
{
/* There is data to transmit */
*p3gpp_frame_type = (enum Frame_Type_3GPP) usedMode;
/* Add SID type and mode info for SID frames */
if (*p3gpp_frame_type == AMR_SID)
{
/* Add SID type to encoder output buffer */
if (tx_frame_type == TX_SID_FIRST)
{
ets_output_bfr[AMRSID_TXTYPE_BIT_OFFSET] &= 0x0000;
}
else if (tx_frame_type == TX_SID_UPDATE)
{
ets_output_bfr[AMRSID_TXTYPE_BIT_OFFSET] |= 0x0001;
}
/* Add mode information bits */
for (i = 0; i < NUM_AMRSID_TXMODE_BITS; i++)
{
ets_output_bfr[AMRSID_TXMODE_BIT_OFFSET+i] =
(mode >> i) & 0x0001;
}
}
}
else
{
/* This is no data to transmit */
*p3gpp_frame_type = (enum Frame_Type_3GPP)AMR_NO_DATA;
}
/* At this point, output format is ETS */
/* Determine the output format to use */
if (output_format == AMR_TX_WMF)
{
/* Change output data format to WMF */
ets_to_wmf(*p3gpp_frame_type, ets_output_bfr, pEncOutput);
/* Set up the number of encoded WMF bytes */
num_enc_bytes = WmfEncBytesPerFrame[(Word16) *p3gpp_frame_type];
}
else if (output_format == AMR_TX_IF2)
{
/* Change output data format to IF2 */
ets_to_if2(*p3gpp_frame_type, ets_output_bfr, pEncOutput);
/* Set up the number of encoded IF2 bytes */
num_enc_bytes = If2EncBytesPerFrame[(Word16) *p3gpp_frame_type];
}
}
/* Encode ETS frames */
else if (output_format == AMR_TX_ETS)
{
/* Encode one speech frame (20 ms) */
#ifndef CONSOLE_ENCODER_REF
/* Use PV version of sp_enc.c */
GSMEncodeFrame(pEncState, mode, pEncInput, &ets_output_bfr[1], &usedMode);
#else
/* Use ETS version of sp_enc.c */
Speech_Encode_Frame(pEncState, mode, pEncInput, &ets_output_bfr[1], &usedMode);
#endif
/* Save used mode */
*p3gpp_frame_type = (enum Frame_Type_3GPP) usedMode;
/* Determine transmit frame type */
sid_sync(pSidSyncState, usedMode, &tx_frame_type);
/* Put TX frame type in output buffer */
ets_output_bfr[0] = tx_frame_type;
/* Put mode information after the encoded speech parameters */
if (tx_frame_type != TX_NO_DATA)
{
ets_output_bfr[1+MAX_SERIAL_SIZE] = (Word16) mode;
}
else
{
ets_output_bfr[1+MAX_SERIAL_SIZE] = -1;
}
/* Copy output of encoder to pEncOutput buffer */
ets_output_ptr = (UWord8 *) & ets_output_bfr[0];
/* Copy 16-bit data in 8-bit chunks */
/* using Little Endian configuration */
for (i = 0; i < 2*(MAX_SERIAL_SIZE + 2); i++)
{
*(pEncOutput + i) = *ets_output_ptr;
ets_output_ptr += 1;
}
/* Set up the number of encoded bytes */
num_enc_bytes = 2 * (MAX_SERIAL_SIZE + 2);
}
/* Invalid frame format */
else
{
/* Invalid output format, set up error code */
num_enc_bytes = -1;
}
return(num_enc_bytes);
}