/*
 ** Copyright 2003-2010, VisualOn, Inc.
 **
 ** 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.
 */
/*******************************************************************************
	File:		channel_map.c

	Content:	channel mapping functions

*******************************************************************************/

#include "channel_map.h"
#include "bitenc.h"
#include "psy_const.h"
#include "qc_data.h"

static const Word16 maxChannelBits = MAXBITS_COEF;

static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
{
  Word16 error=0;                                    

  elInfo->elType=elType;                             

  switch(elInfo->elType) {

    case ID_SCE:
      elInfo->nChannelsInEl=1;                       

      elInfo->ChannelIndex[0]=0;                     

      elInfo->instanceTag=0;                         
      break;

    case ID_CPE:

      elInfo->nChannelsInEl=2;                        

      elInfo->ChannelIndex[0]=0;                      
      elInfo->ChannelIndex[1]=1;                      

      elInfo->instanceTag=0;                    
      break;

    default:
      error=1;                                  
  }

  return error;
}


Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
{
  Word16 error;
  error = 0;                                        

  switch(nChannels) {

    case 1: 
      initElement(elInfo, ID_SCE);
      break;

    case 2:
      initElement(elInfo, ID_CPE);
      break;

    default:
      error=4;                                         
  }

  return error;
}


Word16 InitElementBits(ELEMENT_BITS *elementBits,
                       ELEMENT_INFO elInfo,
                       Word32 bitrateTot,
                       Word16 averageBitsTot,
                       Word16 staticBitsTot)
{
  Word16 error;
  error = 0;                                    

   switch(elInfo.nChannelsInEl) {
    case 1:
      elementBits->chBitrate = bitrateTot;                     
      elementBits->averageBits = averageBitsTot - staticBitsTot;
      elementBits->maxBits = maxChannelBits;                   

      elementBits->maxBitResBits = maxChannelBits - averageBitsTot;
      elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7); 
      elementBits->bitResLevel = elementBits->maxBitResBits;   
      elementBits->relativeBits  = 0x4000; /* 1.0f/2 */        
      break;

    case 2:
      elementBits->chBitrate   = bitrateTot >> 1;
      elementBits->averageBits = averageBitsTot - staticBitsTot;
      elementBits->maxBits     = maxChannelBits << 1;

      elementBits->maxBitResBits = (maxChannelBits << 1) - averageBitsTot;
      elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);   
      elementBits->bitResLevel = elementBits->maxBitResBits;     
      elementBits->relativeBits = 0x4000; /* 1.0f/2 */           
      break;

    default:
      error = 1;                                                 
  }
  return error;
}
