mmlibs/mmfw/codecs/Src/Gsm610CodecCommon/gsm610fr.cpp
author hgs
Tue, 02 Nov 2010 12:28:51 +0000
changeset 6 fe9d1bf55678
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk46_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
// Copyright (c) 2000-2010 Nokia Corporation and/or its subsidiary(-ies).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
// All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
// Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
// Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
// Description:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
// Polymorphic DLL implementation of GSM 6.10 full rate (FR) speech coder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
// and decoder    objects.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
// This codec is based on ANSI C simulation codes. For this implementation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
// (polymorphic DLL) the original ANSI C codes have been modified slightly:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
// - The original .c files were renamed to .cpp files.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
// - All global varibles (codec's state) are now encoder's or decoder's
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
// private member variables.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
// - Because codec's state is in the codec object, an extra variable -
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
// a pointer codec object - have been added to some original routines.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
// - Global tables are now const C++ tables in tables.h header file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
// - VAD and DTX modules have been removed from the original routines.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
// - Due to error in GNU tool chain all array indexes of type [i-1] in
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
// rpeltp.cpp have been removed and changed to [j] type.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
// - multr, L_add, L_mac from basicop.cpp inlined
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
// INCLUDES
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
// 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
#include "gsm610fr.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
#include "codec.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
#include <e32uid.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
#include "rpeltp.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
//  LOCAL FUNCTIONS
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
//===================================================================
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
    GSM610FR_Encoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
    ConstructL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
    This function implements the second phase construction of GSM610FR_Encoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
    class. Function binds the encoder to given input and output streams and
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
    resets encoder.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
    Parameters:     RReadStream aInStrm     Handle to input stream (16 bit
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
                                            PCM speech data)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
                    RWriteStream aOutStrm   Handle to output stream (encoded
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
                                            speech data)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
void CGSM610FR_Encoder::ConstructL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
    ::reset_encoder(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
    iOddFrame = TRUE;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
    GSM610FR_Encoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
    ~GSM610FR_Encoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
    Empty encoder destructor.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
    Parameters:     none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
CGSM610FR_Encoder::~CGSM610FR_Encoder()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
    GSM610FR_Encoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
    StartL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
    Start encoder object. Initialize codec status.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
    Parameters:     none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
void CGSM610FR_Encoder::StartL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
    ::reset_encoder(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
    iOddFrame = TRUE;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
    GSM610FR_Encoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
    ExecuteL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
    Execute encoder object. Read one speech frame from the input stream,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
    RPELTP encode it and write the encoded frame to output stream.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
    Parameters:     none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
    Leave Handling:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
    If the length of data available in the input stream is less than
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
    FRAMESIZE then the function leaves with KErrEof.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
void CGSM610FR_Encoder::ExecuteL(TUint8* aInBuf, TUint8* aOutBuf)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
	TInt16* inBufPtr  = (TInt16*) aInBuf;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
	for (TInt frame = 0; frame < 2; frame++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
	    ::RPELTP_encoder(this, inBufPtr, &iCodeBuf);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
		if ( iOddFrame )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
			PackFrame0 (&iCodeBuf, (TInt8*) aOutBuf);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
			PackFrame1 (&iCodeBuf, (TInt8*) aOutBuf);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
		iOddFrame = !iOddFrame;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
		inBufPtr += FRAMESIZE;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
    GSM610FR_Encoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
    StopL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
    Stop encoder object. Flush out last frames, if necessary.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
    Parameters:     none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
void CGSM610FR_Encoder::StopL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
void CGSM610FR_Encoder::Release()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
    delete this;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
    GSM610FR_Encoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
    PackFrame0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
    Pack the codewords of the even frame into pack buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
    Packing as in MS gsm610 encoder.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
    Parameters:     struct codes* aCodeBuf    Code words for one speech frame.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
void CGSM610FR_Encoder::PackFrame0(struct codes* aCodeBuf, TInt8* pbuf)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
    TInt16* LAR = aCodeBuf->LARc;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
    // pack the LARc[0..7] into the first 4.5 bytes
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
    *pbuf++ = (TUint8)(((LAR[0]     ) & 0x3F) | ((LAR[1] << 6) & 0xC0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
    *pbuf++ = (TUint8)(((LAR[1] >> 2) & 0x0F) | ((LAR[2] << 4) & 0xF0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
    *pbuf++ = (TUint8)(((LAR[2] >> 4) & 0x01) | ((LAR[3] << 1) & 0x3E) | ((LAR[4] << 6) & 0xC0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
    *pbuf++ = (TUint8)(((LAR[4] >> 2) & 0x03) | ((LAR[5] << 2) & 0x3C) | ((LAR[6] << 6) & 0xC0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
    *pbuf   = (TUint8)(((LAR[6] >> 2) & 0x01) | ((LAR[7] << 1) & 0x0E));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
    // pack Nc, bc, Mc, xmaxc, and xMc for each of the 4 sub-frames
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
    for(TInt i = 0; i < 4; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
        struct sfcodes& c = aCodeBuf->sfc[i];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
        *pbuf++ |= ((c.Nc << 4) & 0xF0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
        *pbuf++ = (TUint8)(((c.Nc >> 4) & 0x07) | ((c.bc << 3) & 0x18) | ((c.Mc << 5) & 0x60) | ((c.xmaxc << 7) & 0x80));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
        *pbuf++ = (TUint8)(((c.xmaxc >> 1) & 0x1F) | ((c.xMc[0] << 5) & 0xE0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
        *pbuf++ = (TUint8)((c.xMc[1] & 0x07) | ((c.xMc[2] << 3) & 0x38) | ((c.xMc[3] << 6) & 0xC0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
        *pbuf++ = (TUint8)(((c.xMc[3] >> 2) & 0x01) | ((c.xMc[4] << 1) & 0x0E) | ((c.xMc[5] << 4) & 0x70) | ((c.xMc[6] << 7) & 0x80));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
        *pbuf++ = (TUint8)(((c.xMc[6] >> 1) & 0x03) | ((c.xMc[7] << 2) & 0x1C) | ((c.xMc[8] << 5) & 0xE0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
        *pbuf++ = (TUint8)((c.xMc[9] & 0x07) | ((c.xMc[10] << 3) & 0x38) | ((c.xMc[11] << 6) & 0xC0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
        *pbuf   = (TUint8)(((c.xMc[11] >> 2) & 0x01) | ((c.xMc[12] << 1) & 0x0E));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
    GSM610FR_Encoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
    PackFrame1
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
    Pack the codewords of the odd frame into pack buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
    Packing as in MS gsm610 encoder.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
    Parameters:     struct codes* aCodeBuf    Code words for one speech frame.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
void CGSM610FR_Encoder::PackFrame1(struct codes* aCodeBuf, TInt8* pbuf)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
    TInt16* LAR = aCodeBuf->LARc;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
	pbuf += (PACKSIZE / 2);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
	TInt8 pbufZero = pbuf[0];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
    // pack the LARc[0..7] into the first 4.5 bytes, starting with the msb of the first byte
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
    *pbuf++ = (TUint8) (pbufZero | ((LAR[0] << 4) & 0xF0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
    *pbuf++ = (TUint8)(((LAR[0] >> 4) & 0x03) | ((LAR[1] << 2) & 0xFC));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
    *pbuf++ = (TUint8)(((LAR[2]     ) & 0x1F) | ((LAR[3] << 5) & 0xE0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
    *pbuf++ = (TUint8)(((LAR[3] >> 3) & 0x03) | ((LAR[4] << 2) & 0x3C) | ((LAR[5] << 6) & 0xC0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
    *pbuf++ = (TUint8)(((LAR[5] >> 2) & 0x03) | ((LAR[6] << 2) & 0x1C) | ((LAR[7] << 5) & 0xE0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
    // pack Nc, bc, Mc, xmaxc, and xMc for each of the 4 sub-frames
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
    for(TInt i = 0; i < 4; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
        struct sfcodes& c = aCodeBuf->sfc[i];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
        *pbuf++ = (TUint8)((c.Nc & 0x7F) | ((c.bc << 7) & 0x80));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
        *pbuf++ = (TUint8)(((c.bc >> 1) & 0x01) | ((c.Mc << 1) & 0x06) | ((c.xmaxc << 3) & 0xF8));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
        *pbuf++ = (TUint8)(((c.xmaxc >> 5) & 0x01) | ((c.xMc[0] << 1) & 0x0E) | ((c.xMc[1] << 4) & 0x70) | ((c.xMc[2] << 7) & 0x80));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
        *pbuf++ = (TUint8)(((c.xMc[2] >> 1) & 0x03) | ((c.xMc[3] << 2) & 0x1C) | ((c.xMc[4] << 5) & 0xE0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
        *pbuf++ = (TUint8)(((c.xMc[5]) & 0x07) | ((c.xMc[6] << 3) & 0x38) | ((c.xMc[7] << 6) & 0xC0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
        *pbuf++ = (TUint8)(((c.xMc[7] >> 2) & 0x01) | ((c.xMc[8] << 1) & 0x0E) | ((c.xMc[9] << 4) & 0x70) | ((c.xMc[10] << 7) & 0x80));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
        *pbuf++ = (TUint8)(((c.xMc[10] >> 1) & 0x03) | ((c.xMc[11] << 2) & 0x1C) | ((c.xMc[12] << 5) & 0xE0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
    GSM610FR_Decoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
    ConstructL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
    This function implements the second phase construction of GSM610FR_Decoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
    class. Function binds the decoder to given input and output streams and
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
    resets decoder.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
    Parameters:     RReadStream aInStrm     Handle to input stream (encoded
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
                                            speech data)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
                                            
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
                    RWriteStream aOutStrm   Handle to output stream (16 bit
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
                                            PCM speech data)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
void CGSM610FR_Decoder::ConstructL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
    ::reset_decoder(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
    iOddFrame = TRUE;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299
    GSM610FR_Decoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   300
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   301
    ~GSM610FR_Decoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   302
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   303
    Empty decoder destructor.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   304
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   305
    Parameters:     none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   306
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   307
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   308
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   309
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   310
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   311
CGSM610FR_Decoder::~CGSM610FR_Decoder()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   312
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   313
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   314
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   315
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   316
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   317
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   318
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   319
    GSM610FR_Decoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   320
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   321
    StartL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   322
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   323
    Start decoder object. Initialize codec status.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   324
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   325
    Parameters:     none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   326
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   327
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   328
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   329
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   330
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   331
void CGSM610FR_Decoder::StartL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   332
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   333
    ::reset_decoder(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   334
    iOddFrame = TRUE;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   335
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   336
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   337
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   338
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   339
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   340
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   341
    GSM610FR_Decoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   342
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   343
    ExecuteL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   344
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   345
    Execute decoder object. Read one encoded speech frame from the input
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   346
    stream RPELTP decode it and write the decoded frame to output stream.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   347
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   348
    Parameters:     none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   349
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   350
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   351
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   352
    Leave Handling:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   353
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   354
    If the length of data available in the input stream is less than size
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   355
    of one encoded speech frame then the function leaves with KErrEof.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   356
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   357
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   358
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   359
void CGSM610FR_Decoder::ExecuteL(TUint8* aInBuf, TUint8* aOutBuf)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   360
{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   361
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   362
	TInt16* outBufPtr = (TInt16*) aOutBuf;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   363
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   364
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   365
	// Process both odd and even frames
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   366
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   367
	for (TInt frame = 0; frame < 2; frame++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   368
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   369
		if ( iOddFrame )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   370
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   371
			UnpackFrame0(&iCodeBuf, (TInt8*) aInBuf);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   372
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   373
	   else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   374
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   375
			UnpackFrame1(&iCodeBuf, (TInt8*) aInBuf);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   376
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   377
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   378
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   379
		::RPELTP_decoder(this, &iCodeBuf, outBufPtr);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   380
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   381
		iOddFrame = !iOddFrame;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   382
		outBufPtr += FRAMESIZE;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   383
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   384
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   385
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   386
}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   387
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   388
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   389
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   390
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   391
    GSM610FR_Decoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   392
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   393
    StopL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   394
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   395
    Stop decoder object. Flush out last frames, if necessary.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   396
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   397
    Parameters:     none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   398
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   399
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   400
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   401
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   402
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   403
void CGSM610FR_Decoder::StopL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   404
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   405
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   406
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   407
void CGSM610FR_Decoder::Release()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   408
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   409
    delete this;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   410
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   411
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   412
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   413
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   414
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   415
    GSM610FR_Decoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   416
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   417
    UnpackFrame0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   418
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   419
    Unpack the codewords of the even frame from pack buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   420
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   421
    Packing as in MS gsm610 encoder.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   422
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   423
    Parameters:     struct codes* aCodeBuf    Code words for one speech frame
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   424
                                              are unpacked into this structure.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   425
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   426
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   427
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   428
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   429
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   430
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   431
void CGSM610FR_Decoder::UnpackFrame0(struct codes* aCodeBuf,  TInt8* pbuf)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   432
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   433
    TInt16* LAR = aCodeBuf->LARc;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   434
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   435
    // unpack the LAR[0..7] from the first 4.5 bytes
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   436
    LAR[0] = (TInt16)((pbuf[0] & 0x3F));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   437
    LAR[1] = (TInt16)(((pbuf[0] & 0xC0) >> 6) | ((pbuf[1] & 0x0F) << 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   438
    LAR[2] = (TInt16)(((pbuf[1] & 0xF0) >> 4) | ((pbuf[2] & 0x01) << 4));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   439
    LAR[3] = (TInt16)(((pbuf[2] & 0x3E) >> 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   440
    LAR[4] = (TInt16)(((pbuf[2] & 0xC0) >> 6) | ((pbuf[3] & 0x03) << 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   441
    LAR[5] = (TInt16)(((pbuf[3] & 0x3C) >> 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   442
    LAR[6] = (TInt16)(((pbuf[3] & 0xC0) >> 6) | ((pbuf[4] & 0x01) << 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   443
    LAR[7] = (TInt16)(((pbuf[4] & 0x0E) >> 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   444
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   445
    // unpack Nc, bc, Mc, xmaxc, and xMc for each of the 4 sub-frames
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   446
    for(TInt i = 0; i < 4; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   447
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   448
        struct sfcodes& c = aCodeBuf->sfc[i];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   449
#define sfb(x) (pbuf[4+i*7+x])
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   450
        c.Nc = (TInt16)(((sfb(0) & 0xF0) >> 4) | ((sfb(1) & 0x07) << 4));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   451
        c.bc = (TInt16)(((sfb(1) & 0x18) >> 3));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   452
        c.Mc = (TInt16)(((sfb(1) & 0x60) >> 5));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   453
        c.xmaxc = (TInt16)(((sfb(1) & 0x80) >> 7) | ((sfb(2) & 0x1F) << 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   454
        c.xMc[0] = (TInt16)(((sfb(2) & 0xE0) >> 5));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   455
        c.xMc[1] = (TInt16)((sfb(3) & 0x07));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   456
        c.xMc[2] = (TInt16)(((sfb(3) & 0x3C) >> 3));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   457
        c.xMc[3] = (TInt16)(((sfb(3) & 0xC0) >> 6) | ((sfb(4) & 0x01) << 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   458
        c.xMc[4] = (TInt16)(((sfb(4) & 0x0E) >> 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   459
        c.xMc[5] = (TInt16)(((sfb(4) & 0x70) >> 4));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   460
        c.xMc[6] = (TInt16)(((sfb(4) & 0x80) >> 7) | ((sfb(5) & 0x03) << 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   461
        c.xMc[7] = (TInt16)(((sfb(5) & 0x1C) >> 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   462
        c.xMc[8] = (TInt16)(((sfb(5) & 0xE0) >> 5));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   463
        c.xMc[9] = (TInt16)((sfb(6) & 0x07));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   464
        c.xMc[10] = (TInt16)(((sfb(6) & 0x38) >> 3));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   465
        c.xMc[11] = (TInt16)(((sfb(6) & 0xC0) >> 6) | ((sfb(7) & 0x01) << 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   466
        c.xMc[12] = (TInt16)(((sfb(7) & 0x0E) >> 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   467
#undef sfb
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   468
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   469
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   470
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   471
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   472
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   473
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   474
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   475
    GSM610FR_Decoder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   476
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   477
    UnpackFrame1
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   478
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   479
    Unpack the codewords of the odd frame from pack buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   480
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   481
    Packing as in MS gsm610 encoder.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   482
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   483
    Parameters:     struct codes* aCodeBuf    Code words for one speech frame
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   484
                                              are unpacked into this structure.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   485
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   486
    Return Values:  none
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   487
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   488
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   489
-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   490
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   491
void CGSM610FR_Decoder::UnpackFrame1(struct codes* aCodeBuf, TInt8* pbuf)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   492
{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   493
    TInt16* LAR = aCodeBuf->LARc;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   494
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   495
    // unpack the LAR[0..7] from the first 4.5 bytes
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   496
    LAR[0] = (TInt16)(((pbuf[32] & 0xF0) >> 4) | ((pbuf[33] & 0x03) << 4));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   497
    LAR[1] = (TInt16)(((pbuf[33] & 0xFC) >> 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   498
    LAR[2] = (TInt16)(((pbuf[34] & 0x1F)));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   499
    LAR[3] = (TInt16)(((pbuf[34] & 0xE0) >> 5) | ((pbuf[35] & 0x03) << 3));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   500
    LAR[4] = (TInt16)(((pbuf[35] & 0x3C) >> 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   501
    LAR[5] = (TInt16)(((pbuf[35] & 0xC0) >> 6) | ((pbuf[36] & 0x03) << 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   502
    LAR[6] = (TInt16)(((pbuf[36] & 0x1C) >> 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   503
    LAR[7] = (TInt16)(((pbuf[36] & 0xE0) >> 5));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   504
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   505
    // unpack Nc, bc, Mc, xmaxc, and xMc for each of the 4 sub-frames
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   506
    for(TInt i = 0; i < 4; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   507
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   508
        struct sfcodes& c = aCodeBuf->sfc[i];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   509
#define sfb(x) (pbuf[37+i*7+x])
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   510
        c.Nc = (TInt16)(sfb(0) & 0x7F);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   511
        c.bc = (TInt16)(((sfb(0) & 0x80) >> 7) | ((sfb(1) & 0x01) << 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   512
        c.Mc = (TInt16)(((sfb(1) & 0x06) >> 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   513
        c.xmaxc = (TInt16)(((sfb(1) & 0xF8) >> 3) | ((sfb(2) & 0x01) << 5));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   514
        c.xMc[0] = (TInt16)(((sfb(2) & 0x0E) >> 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   515
        c.xMc[1] = (TInt16)(((sfb(2) & 0x70) >> 4));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   516
        c.xMc[2] = (TInt16)(((sfb(2) & 0x80) >> 7) | ((sfb(3) & 0x03) << 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   517
        c.xMc[3] = (TInt16)(((sfb(3) & 0x1C) >> 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   518
        c.xMc[4] = (TInt16)(((sfb(3) & 0xE0) >> 5));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   519
        c.xMc[5] = (TInt16)(((sfb(4) & 0x07)));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   520
        c.xMc[6] = (TInt16)(((sfb(4) & 0x38) >> 3));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   521
        c.xMc[7] = (TInt16)(((sfb(4) & 0xC0) >> 6) | ((sfb(5) & 0x01) << 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   522
        c.xMc[8] = (TInt16)(((sfb(5) & 0x0E) >> 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   523
        c.xMc[9] = (TInt16)(((sfb(5) & 0x70) >> 4));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   524
        c.xMc[10] = (TInt16)(((sfb(5) & 0x80) >> 7) | ((sfb(6) & 0x03) << 1));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   525
        c.xMc[11] = (TInt16)(((sfb(6) & 0x1C) >> 2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   526
        c.xMc[12] = (TInt16)(((sfb(6) & 0xE0) >> 5));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   527
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   528
#undef sfb
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   529
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   530
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   531
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   532
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   533
//-----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   534
//  End of File
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   535
//-----------------------------------------------------------------------------