source: svn/newcon3bcm2_21bu/BSEAV/lib/scte65/api/si_api_chanmap.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 7.3 KB
Line 
1/***************************************************************
2**
3** Broadcom Corp. Confidential
4** Copyright 2003-2008 Broadcom Corp. All Rights Reserved.
5**
6** THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED
7** SOFTWARE LICENSE AGREEMENT BETWEEN THE USER AND BROADCOM.
8** YOU HAVE NO RIGHT TO USE OR EXPLOIT THIS MATERIAL EXCEPT
9** SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
10**
11** File:                si_api_chanmap.c
12** Description: API function that for channel maps
13**
14** Created: 03/08/2001
15**
16** REVISION:
17**
18** $Log: $
19**
20**
21****************************************************************/
22
23#include "si.h"
24#include "si_os.h"
25#include "si_dbg.h"
26#include "si_util.h"
27#include "si_list.h"
28#include "si_vct.h"
29#include "si_svct_vcm.h"
30#include "si_svct.h"
31#include "si_lvct.h"
32#include "si_nit_mms.h"
33#include "si_nit_cds.h"
34#include "si_api_chanmap.h"
35#include "si_descriptors.h"
36
37
38static SI_API_CHAN_MAP *SI_Channel_Map = NULL;
39extern struct svct_vcm_channel_list SVCT_VCM_channels;
40extern unsigned long Total_SVCT_VCM_Channels;
41extern SI_mutex m_svct_vcm;
42
43extern struct lvct_channel_list LVCT_channels;
44extern unsigned long Total_LVCT_Channels;
45extern SI_mutex m_lvct;
46
47extern NIT_MMS_RECORD NIT_MMS_Table[NIT_MMS_MAX_TABLE_SIZE];
48extern unsigned long NIT_CDS_Freq_KHZ_Table[NIT_CDS_MAX_NUM_OF_CARRIRE_INDEX];
49extern unsigned long Total_NIT_CDS_carriers;
50extern unsigned long Total_NIT_MMS_entries;
51
52int SI_Api_Clear_Chan_Map(void)
53{
54        Total_NIT_CDS_carriers = Total_NIT_MMS_entries = 0;
55        Total_SVCT_VCM_Channels = Total_LVCT_Channels = 0;
56        /*TODO::        SI_SVCT_VCM_Free_List(); etc.*/
57}
58
59
60int SI_Api_Get_Chan_Map(SI_API_CHAN_MAP **chan, unsigned long *len)
61{
62        unsigned long i = 0;
63        SI_SVCT_VCM_CHANNEL *svct;
64        SI_LVCT_CHANNEL *lvct;
65        unsigned long idx;
66
67        if (SI_Channel_Map)
68                SI_free(SI_Channel_Map);
69        if (Total_NIT_CDS_carriers==0 || Total_NIT_MMS_entries==0) {
70                *len = 0;
71                return -1;
72        }
73
74        *len = Total_SVCT_VCM_Channels + Total_LVCT_Channels;
75
76        if (*len)
77        {
78                /* create the channel map vector. */
79                SI_Channel_Map = (SI_API_CHAN_MAP *)SI_alloc(sizeof(SI_API_CHAN_MAP) * (*len));
80                if (SI_Channel_Map == NULL)
81                {
82                        SI_DBG_PRINT(E_SI_ERR_MSG,("Failed to allocate channel map!!!\n"));
83                        return -1;
84                }
85
86                /* start with svct. */
87                SI_mutex_lock(m_svct_vcm);
88                svct = SI_LST_D_FIRST(&SVCT_VCM_channels);
89                while (svct && i<Total_SVCT_VCM_Channels)
90                {
91                        if (svct->channel_type == NORMAL_CHAN)
92                        {
93                                SI_Channel_Map[i].num_mode = ((svct->vcn_mode==ONE_PART)?SI_API_ONE_PART:SI_API_TWO_PART);
94                                SI_Channel_Map[i].channum1 = svct->channum1;
95                                SI_Channel_Map[i].channum2 = svct->channum2;
96                                SI_Channel_Map[i].source_id = svct->source_ID;
97                                SI_Channel_Map[i].freq = NIT_CDS_Freq_KHZ_Table[svct->CDS_reference]*1000; /* in Hz */
98
99                                if (svct->transport_type == MPEG2_XPORT)
100                                {
101                                        SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG;
102                                        SI_Channel_Map[i].chan_parm.dig_parm.prog_num = svct->ChanPropUnion.mpeg_prop.prog_num;
103                                        idx = svct->ChanPropUnion.mpeg_prop.MMS_reference;
104                                        switch (NIT_MMS_Table[idx].transmission_system)
105                                        {
106                                                case ITU_T_ANNEX_B_TX_SYS:
107                                                        SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ANNEX_B;
108                                                break;
109
110                                                case ATSC_TX_SYS:
111                                                        SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ATSC;
112                                                break;
113
114                                                default:
115                                                        /*SI_DBG_PRINT(E_SI_ERR_MSG,("Unknown transmission system from MMS table %d!!!\n", NIT_MMS_Table[idx].transmission_system));*/
116                                                        SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_TRANS_STANDARD_UNKNOWN;
117                                                break;
118                                        }
119
120                                        switch (NIT_MMS_Table[idx].modulation_format)
121                                        {
122                                                case MOD_VSB8:
123                                                        SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_VSB8;
124                                                break;
125
126                                                case MOD_VSB16:
127                                                        SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_VSB16;
128                                                break;
129
130                                                case MOD_QAM64:
131                                                        SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_QAM64;
132                                                break;
133
134                                                case MOD_QAM256:
135                                                        SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_QAM256;
136                                                break;
137
138                                                default:
139                                                        SI_DBG_PRINT(E_SI_ERR_MSG,("Unknown modulation format from MMS table %d!!!\n", NIT_MMS_Table[idx].modulation_format));
140                                                        SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_DIG_FORMAT_UNKNOWN;
141                                                break;
142                                        }
143
144                                        SI_Channel_Map[i].chan_parm.dig_parm.symrate = NIT_MMS_Table[idx].symbol_rate;
145                                        if (SI_NTT_SNS_Find_SrcId(SI_Channel_Map[i].source_id ,&SI_Channel_Map[i].name, SI_API_CHAN_MAP_NAME_LEN))
146                                                strcpy(SI_Channel_Map[i].name, "Info Unavailable");
147                                }
148                                else
149                                {
150                                        SI_Channel_Map[i].chan_type = SI_API_CHAN_ANALOG;
151                                        SI_Channel_Map[i].chan_parm.ana_parm.standard = (SI_API_ANA_STANDARD)svct->ChanPropUnion.nonmpeg_prop.video_standard;
152                                }
153                        }
154
155                        i++;
156                        svct = SI_LST_D_NEXT(svct, chan_link);
157                }
158                if (svct || i!= Total_SVCT_VCM_Channels)
159                        SI_DBG_PRINT(E_SI_WRN_MSG,("SVCT length does not agree with Total_SVCT_VCM_Channels!!!\n"));
160
161                SI_mutex_unlock(m_svct_vcm);
162
163                /* Now for lvct. */
164                SI_mutex_lock(m_lvct);
165                lvct = SI_LST_D_FIRST(&LVCT_channels);
166                while (lvct && i<*len)
167                {
168                        if (lvct->chanbits & LVCT_HIDDEN_MASK)
169                        {
170                                SI_Channel_Map[i].num_mode = ((lvct->vcn_mode==ONE_PART)?SI_API_ONE_PART:SI_API_TWO_PART);
171                                SI_Channel_Map[i].channum1 = lvct->channum1;
172                                SI_Channel_Map[i].channum2 = lvct->channum2;
173                                SI_Channel_Map[i].source_id = lvct->source_ID;
174                                SI_Channel_Map[i].freq = lvct->carrier_freq; /* in Hz */
175
176                                switch (lvct->mod_mode)
177                                {
178                                        case LVCT_MM_ANALOG:
179                                                SI_Channel_Map[i].chan_type = SI_API_CHAN_ANALOG;
180                                                SI_Channel_Map[i].chan_parm.ana_parm.standard = SI_API_NTSC; /* NTSC by default. */
181                                        break;
182
183                                        case LVCT_MM_SCTE1:
184                                                SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_QAM64;
185                                                SI_Channel_Map[i].chan_parm.dig_parm.symrate = 5056900;
186                                                SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ANNEX_B;
187                                                SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG;
188                                                SI_Channel_Map[i].chan_parm.dig_parm.prog_num = lvct->program_num;
189                                        break;
190
191                                        case LVCT_MM_SCTE2:
192                                                SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_QAM256;
193                                                SI_Channel_Map[i].chan_parm.dig_parm.symrate = 5360500;
194                                                SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ANNEX_B;
195                                                SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG;
196                                                SI_Channel_Map[i].chan_parm.dig_parm.prog_num = lvct->program_num;
197                                        break;
198
199                                        case LVCT_MM_8_VSB:
200                                                SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_VSB8;
201                                                SI_Channel_Map[i].chan_parm.dig_parm.symrate = 10762000;/* 10.76MB/s ??? */
202                                                SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ATSC;
203                                                SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG;
204                                                SI_Channel_Map[i].chan_parm.dig_parm.prog_num = lvct->program_num;
205                                        break;
206
207                                        case LVCT_MM_16_VSB:
208                                                SI_Channel_Map[i].chan_parm.dig_parm.format = SI_API_VSB16;
209                                                SI_Channel_Map[i].chan_parm.dig_parm.symrate = 10762000;/* ??? */
210                                                SI_Channel_Map[i].chan_parm.dig_parm.mode = SI_API_ATSC;
211                                                SI_Channel_Map[i].chan_type = SI_API_CHAN_MPEG;
212                                                SI_Channel_Map[i].chan_parm.dig_parm.prog_num = lvct->program_num;
213                                        break;
214
215                                        default:
216                                                SI_DBG_PRINT(E_SI_ERR_MSG,("Unknown modulation mode from LVCT table %d!!!\n", lvct->mod_mode));
217                                                SI_Channel_Map[i].chan_type = SI_API_CHAN_UNKNOWN;
218                                        break;
219                                }
220                        }
221                        i++;
222                        lvct = SI_LST_D_NEXT(lvct, chan_link);
223                }
224                if (svct || i!= *len)
225                        SI_DBG_PRINT(E_SI_WRN_MSG,("LVCT length does not agree with Total_LVCT_Channels!!!\n"));
226
227                SI_mutex_unlock(m_lvct);
228        }
229
230        *chan = SI_Channel_Map;
231
232        return 0;
233}
Note: See TracBrowser for help on using the repository browser.