1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*******************************************************************************
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	File:		channel_map.c
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Content:	channel mapping functions
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "channel_map.h"
24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "bitenc.h"
25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_const.h"
26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "qc_data.h"
27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic const Word16 maxChannelBits = MAXBITS_COEF;
29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongstatic Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
32b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  Word16 error=0;
33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
34b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  elInfo->elType=elType;
35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  switch(elInfo->elType) {
37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    case ID_SCE:
39b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elInfo->nChannelsInEl=1;
40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
41b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elInfo->ChannelIndex[0]=0;
42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
43b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elInfo->instanceTag=0;
44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      break;
45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    case ID_CPE:
47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
48b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elInfo->nChannelsInEl=2;
49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
50b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elInfo->ChannelIndex[0]=0;
51b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elInfo->ChannelIndex[1]=1;
52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
53b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elInfo->instanceTag=0;
54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      break;
55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    default:
57b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      error=1;
58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
59956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
60956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  return error;
61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
66956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 error;
67b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  error = 0;
68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
69956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  switch(nChannels) {
70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    case 1:
72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      initElement(elInfo, ID_SCE);
73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      break;
74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    case 2:
76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      initElement(elInfo, ID_CPE);
77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      break;
78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    default:
80b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      error=4;
81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  return error;
84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 InitElementBits(ELEMENT_BITS *elementBits,
88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       ELEMENT_INFO elInfo,
89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       Word32 bitrateTot,
90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       Word16 averageBitsTot,
91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                       Word16 staticBitsTot)
92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 error;
94b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  error = 0;
95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong   switch(elInfo.nChannelsInEl) {
97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    case 1:
98b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elementBits->chBitrate = bitrateTot;
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      elementBits->averageBits = averageBitsTot - staticBitsTot;
100b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elementBits->maxBits = maxChannelBits;
101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      elementBits->maxBitResBits = maxChannelBits - averageBitsTot;
103b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
104b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elementBits->bitResLevel = elementBits->maxBitResBits;
105b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elementBits->relativeBits  = 0x4000; /* 1.0f/2 */
106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      break;
107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    case 2:
109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      elementBits->chBitrate   = bitrateTot >> 1;
110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      elementBits->averageBits = averageBitsTot - staticBitsTot;
111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      elementBits->maxBits     = maxChannelBits << 1;
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      elementBits->maxBitResBits = (maxChannelBits << 1) - averageBitsTot;
114b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
115b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elementBits->bitResLevel = elementBits->maxBitResBits;
116b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      elementBits->relativeBits = 0x4000; /* 1.0f/2 */
117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      break;
118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    default:
120b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      error = 1;
121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  return error;
123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
124