source: svn/trunk/newcon3bcm2_21bu/BSEAV/lib/scte65/svct/si_svct_vcm.c

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 18.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_svct_vcm.c
12** Description: function that parses the S-VCT VCM table sections and
13**                              keeps track of all the virtual channel link lists.
14**
15** Created: 03/08/2001
16**
17** REVISION:
18**
19** $Log: $
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_stt.h"
31#include "si_descriptors.h"
32
33/* local function prototypes. */
34#ifdef MANAGE_VCM
35static SI_SVCT_VCM_CHANNEL * SI_SVCT_VCM_Create_Channel (void);
36static SI_RET_CODE SI_SVCT_VCM_Ins_Channel(SI_SVCT_VCM_CHANNEL *new_channel);
37static unsigned char SI_SVCT_VCM_Compare_channel(SI_SVCT_VCM_CHANNEL *chan1, SI_SVCT_VCM_CHANNEL *chan2);
38#endif
39static SI_RET_CODE SI_SVCT_VCM_Free_Channel(SI_SVCT_VCM_CHANNEL *channel);
40
41
42struct svct_vcm_channel_list SVCT_VCM_channels, SVCT_VCM_2_channels;
43unsigned long Total_SVCT_VCM_Channels;
44SI_mutex m_svct_vcm;
45static SI_SVCT_VCM_Callback_t *s_vcm_cb = NULL;
46void SI_SVCT_VCM_Init(SI_SVCT_VCM_Callback_t *cb)
47{
48        s_vcm_cb = cb;
49        SI_LST_D_INIT(&SVCT_VCM_channels);
50        Total_SVCT_VCM_Channels = 0;
51        SI_mutex_init(m_svct_vcm);
52}
53
54#ifdef MANAGE_VCM
55/*********************************************************************
56 Function : SI_SVCT_VCM_Create_Channel
57 Description : Function to allocate the space for an S-VCT channel.
58 Input : none.
59 Output : pointer to the S-VCT channel structure allocated. Will
60                        return NULL if out of memory.
61**********************************************************************/
62static SI_SVCT_VCM_CHANNEL * SI_SVCT_VCM_Create_Channel (void)
63{
64        SI_SVCT_VCM_CHANNEL * channel;
65        /*int   i;*/
66
67        channel = (SI_SVCT_VCM_CHANNEL *)SI_alloc(sizeof(SI_SVCT_VCM_CHANNEL));
68        if (channel == NULL)
69        {
70                SI_DBG_PRINT(E_SI_ERR_MSG,("Failed to allocate an S-VCT channel!!!\n"));
71                return NULL;
72        }
73
74   SI_memset(channel, 0, sizeof (SI_SVCT_VCM_CHANNEL));
75
76        SI_LST_D_INIT_ENTRY(&(channel->chan_link));
77        channel->more_prop = 0;
78
79        return channel;
80}
81
82/*********************************************************************
83 Function : SI_SVCT_VCM_Compare_Channel
84 Description : Function to compare an SVCT VCM channel to another to see
85                                if the virtual channel numbers are equal, greater or less.
86 Input : SI_SVCT_VCM_CHANNEL *chan1.    pointer to one SVCT VCM channel struct
87                 SI_SVCT_VCM_CHANNEL *chan2.    pointer to second SVCT VCM channel struct
88 Output : 0 if the chan1 number is smaller, 1 if equal, 2 if chan1 is
89                        greater.
90**********************************************************************/
91static unsigned char SI_SVCT_VCM_Compare_channel(SI_SVCT_VCM_CHANNEL *chan1, SI_SVCT_VCM_CHANNEL *chan2)
92{
93        if (chan1->vcn_mode != chan2->vcn_mode){
94                if (chan1->vcn_mode == ONE_PART)
95                        return 0;
96                else
97                        return 2;
98    }
99        /* both channels are one or two part. */
100        if (chan1->vcn_mode == ONE_PART)
101        {
102                if (chan1->channum1 == chan2->channum1)
103                        return 1;
104                else if (chan1->channum1 > chan2->channum1)
105                        return 2;
106        }
107        else
108        {
109                if (chan1->channum1 == chan2->channum1)
110                {
111                        if (chan1->channum2 == chan2->channum2)
112                                return 1;
113                        else if (chan1->channum2 > chan2->channum2)
114                                return 2;
115
116                }
117                else if (chan1->channum1 > chan2->channum1)
118                        return 2;
119        }
120
121        return 0;
122}
123#endif
124
125
126/*********************************************************************
127 Function : SI_SVCT_VCM_Free_Channel
128 Description : Function to free an SVCT VCM channel from the SVCT VCM
129                                channel list. the channel structure will be freed but
130                                not removed from the channel list. WE ASSUME THAT WHEN
131                                CALLING THIS FUNCTION, THE CHANNEL HAS NOT BEEN ADDED
132                                TO THE LIST YET!!!
133 Input : SI_SVCT_VCM_CHANNEL *channel.  pointer to  SVCT VCM channel
134                        structure to be freed.
135 Output : SI_RET_CODE.
136**********************************************************************/
137static SI_RET_CODE SI_SVCT_VCM_Free_Channel(SI_SVCT_VCM_CHANNEL *channel)
138{
139        if (channel)
140                SI_free(channel);
141
142        return SI_SUCCESS;
143}
144
145
146/*********************************************************************
147 Function : SI_SVCT_VCM_Free_List
148 Description : Function to free the whole SVCT VCM channel list.
149 Input : None.
150 Output : SI_RET_CODE.
151**********************************************************************/
152SI_RET_CODE SI_SVCT_VCM_Free_List(void)
153{
154        SI_SVCT_VCM_CHANNEL *channel;
155
156        SI_mutex_lock(m_svct_vcm);
157        while ((channel = SI_LST_D_FIRST(&SVCT_VCM_channels)))
158        {
159                SI_LST_D_REMOVE_HEAD(&SVCT_VCM_channels, chan_link);
160                SI_SVCT_VCM_Free_Channel(channel);
161                Total_SVCT_VCM_Channels--;
162        }
163
164        /* just in case. */
165        Total_SVCT_VCM_Channels = 0;
166
167        SI_mutex_unlock(m_svct_vcm);
168
169        return SI_SUCCESS;
170}
171
172#ifdef MANAGE_VCM
173/*********************************************************************
174 Function : SI_SVCT_VCM_Ins_Channel
175 Description : Function to insert an SVCT VCM channel into the SVCT VCM
176                                channel list. The order is that two part numbers
177                                are after the one part numbers and within each part
178                                the channels are sorted in incrementing order.
179 Input : SI_SVCT_VCM_CHANNEL *new_channel.      pointer to new SVCT VCM channel
180                        structure to be inserted.
181 Output : SI_RET_CODE.
182**********************************************************************/
183static SI_RET_CODE SI_SVCT_VCM_Ins_Channel(SI_SVCT_VCM_CHANNEL *new_channel)
184{
185        SI_SVCT_VCM_CHANNEL * channel;
186        unsigned char comp;
187        /*int   i;*/
188
189        SI_mutex_lock(m_svct_vcm);
190
191        channel = SI_LST_D_FIRST(&SVCT_VCM_channels);
192        /* if the list is empty, just put the new channel in. */
193        if (channel == NULL)
194        {
195                SI_LST_D_INSERT_HEAD(&SVCT_VCM_channels, new_channel, chan_link);
196                Total_SVCT_VCM_Channels++;
197                SI_mutex_unlock(m_svct_vcm);
198                return SI_SUCCESS;
199        }
200
201        /* search for the the place to insert. */
202        while ((comp = SI_SVCT_VCM_Compare_channel(new_channel, channel)) == 2 && SI_LST_D_NEXT(channel, chan_link))
203                channel = SI_LST_D_NEXT(channel, chan_link);
204
205        if (comp == 2)
206        {
207                /* we got to the end of list. insert after current element. */
208                SI_LST_D_INSERT_AFTER(channel, new_channel, chan_link);
209                Total_SVCT_VCM_Channels++;
210        }
211        else if (comp == 0)
212        {
213                /* insert before the current element. */
214                SI_LST_D_INSERT_BEFORE(&SVCT_VCM_channels, channel, new_channel, chan_link);
215                Total_SVCT_VCM_Channels++;
216        }
217        else
218        {
219                /* equal! It should only happen when we do not have the revision descriptor,
220                        simply keep the old one and free the new one. */
221                SI_SVCT_VCM_Free_Channel(new_channel);
222        }
223
224        SI_mutex_unlock(m_svct_vcm);
225
226        return SI_SUCCESS;
227}
228#endif
229
230/*********************************************************************
231 Function : SI_SVCT_VCM_Pointer
232 Description : Function to point past newly received SVCT VCM table
233                                section inorder to get to table descriptors.
234 Input : unsigned char *table : newly received SVCT VCM table data.
235 Output : unsigned char * points to the end of VCM record plus 1 which is the
236                                        start of table descriptors.
237**********************************************************************/
238unsigned char * SI_SVCT_VCM_Pointer (unsigned char *table)
239{
240        unsigned char desc_incl;
241        unsigned char num_vc_rec;
242        /*unsigned long desc_start, desc_len;*/
243        unsigned long desc_tag, desc_cnt, len, i, j;
244        unsigned char *current;
245
246        /* get descriptors_included bit. */
247        desc_incl = SI_Construct_Data(table,
248                                SVCT_VCM_DESC_INCL_BYTE_INDX,
249                                SVCT_VCM_DESC_INCL_BYTE_NUM,
250                                SVCT_VCM_DESC_INCL_SHIFT,
251                                SVCT_VCM_DESC_INCL_MASK);
252
253        /* get number of VC records. */
254        num_vc_rec = SI_Construct_Data(table,
255                                SVCT_VCM_NUM_VC_REC_BYTE_INDX,
256                                SVCT_VCM_NUM_VC_REC_BYTE_NUM,
257                                SVCT_VCM_NUM_VC_REC_SHIFT,
258                                SVCT_VCM_NUM_VC_REC_MASK);
259        SI_DBG_PRINT(E_SI_DBG_MSG,("vcm ptr : num of vcm %x, desc %x\n", num_vc_rec, desc_incl));
260
261        current = table + SVCT_VCM_NUM_VC_REC_BYTE_INDX + SVCT_VCM_NUM_VC_REC_BYTE_NUM;
262
263        /* go through all the VCM records. */
264        for (i=0; i<num_vc_rec; i++)
265        {
266                if (desc_incl)
267                {
268                        /* get descriptors count. */
269                        desc_cnt = SI_Construct_Data(current,
270                                                SVCT_VCM_DESC_CNT_BYTE_INDX,
271                                                SVCT_VCM_DESC_CNT_BYTE_NUM,
272                                                SVCT_VCM_DESC_CNT_SHIFT,
273                                                SVCT_VCM_DESC_CNT_MASK);
274                        /* current -> first descriptor. */
275                        current += SVCT_VCM_DESC_CNT_BYTE_INDX+SVCT_VCM_DESC_CNT_BYTE_NUM;
276
277                        /* go through all descriptors. */
278                        for (j=0; j<desc_cnt; j++)
279                        {
280                                desc_tag = *(current++);
281                                len = *(current++);
282                                /* update current pointer. */
283                                current += len;
284                        }
285                }
286                else
287                        /* simply update the current pointer. */
288                        current += SVCT_VCM_MMS_REF_BYTE_INDX+SVCT_VCM_MMS_REF_BYTE_NUM;
289        }
290
291        return current;
292}
293
294
295/*********************************************************************
296 Function : SI_SVCT_VCM_Parse
297 Description : Function to parse a newly received SVCT VCM table section and
298                                put it into the SVCT VCM channel link list
299 Input : unsigned char *table : newly received SVCT VCM table data.
300 Output : SI_RET_CODE.
301**********************************************************************/
302static SI_SVCT_VCM_CHANNEL s_channel;
303extern unsigned short g_vct_id;
304SI_RET_CODE SI_SVCT_VCM_Parse (unsigned char *table)
305{
306        unsigned long temp, i, j/*, offset*/;
307        unsigned char desc_incl;
308        unsigned char num_vc_rec;
309        /*unsigned long desc_start, desc_len;*/
310        unsigned long desc_tag, desc_cnt, len;
311        unsigned char *current;
312#ifdef MANAGE_VCM
313        SI_SVCT_VCM_CHANNEL * channel;
314#else
315        SI_SVCT_VCM_CHANNEL * channel = &s_channel;
316#endif
317        bool has_registration;
318        /*SI_RET_CODE result;*/
319
320
321        SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM Table received.\n"));
322
323        /* get descriptors_included bit. */
324        desc_incl = SI_Construct_Data(table,
325                                SVCT_VCM_DESC_INCL_BYTE_INDX,
326                                SVCT_VCM_DESC_INCL_BYTE_NUM,
327                                SVCT_VCM_DESC_INCL_SHIFT,
328                                SVCT_VCM_DESC_INCL_MASK);
329
330        /* check the activation time. */
331        temp = SI_Construct_Data(table,
332                                SVCT_VCM_ACTIVE_TIME_BYTE_INDX,
333                                SVCT_VCM_ACTIVE_TIME_BYTE_NUM,
334                                SVCT_VCM_ACTIVE_TIME_SHIFT,
335                                SVCT_VCM_ACTIVE_TIME_MASK);
336
337        /* zero is considered as immediate action*/
338        if (temp != 0 && temp > SI_STT_Get_GPS_UTC_Offset()) {
339                temp = SI_STT_Conv_To_UTC_Time(temp);
340                if ( temp!=0 && temp > SI_STT_Get_Sys_Time())
341                {
342                        SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM table activation time in the future! Discarding now\n"));
343                        return SI_SUCCESS;
344                }
345        }
346
347        /* get number of VC records. */
348        num_vc_rec = SI_Construct_Data(table,
349                                SVCT_VCM_NUM_VC_REC_BYTE_INDX,
350                                SVCT_VCM_NUM_VC_REC_BYTE_NUM,
351                                SVCT_VCM_NUM_VC_REC_SHIFT,
352                                SVCT_VCM_NUM_VC_REC_MASK);
353        SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM num of VCM's %x.\n", num_vc_rec));
354
355        current = table + SVCT_VCM_NUM_VC_REC_BYTE_INDX + SVCT_VCM_NUM_VC_REC_BYTE_NUM;
356        /* go through all the VCM records. */
357        for (i=0; i<num_vc_rec; i++)
358        {
359#ifdef MANAGE_VCM
360                /* create the channel struct. */
361                if ((channel = SI_SVCT_VCM_Create_Channel()) == NULL)
362                {
363                        SI_DBG_PRINT(E_SI_ERR_MSG,("SVCT VCM cannot create channel structure!!!\n"));
364                        return SI_NO_MEMORY;
365                }
366#else
367                SI_memset(channel, 0, sizeof (SI_SVCT_VCM_CHANNEL));
368#endif
369                has_registration = false;
370                channel->vct_id = g_vct_id;
371                channel->appflag = SI_Construct_Data(current,
372                                                        SVCT_VCM_APP_VIRT_CHAN_BYTE_INDX,
373                                                        SVCT_VCM_APP_VIRT_CHAN_BYTE_NUM,
374                                                        SVCT_VCM_APP_VIRT_CHAN_SHIFT,
375                                                        SVCT_VCM_APP_VIRT_CHAN_MASK);
376                if (channel->appflag)
377                        SI_DBG_PRINT(E_SI_WRN_MSG,("SVCT VCM received app entry point!!!\n"));
378
379                /* assuming it onepart channel number until we got two part descriptors. */
380                channel->vcn_mode = ONE_PART;
381                channel->channum1 = SI_Construct_Data(current,
382                                                        SVCT_VCM_VC_NUM_BYTE_INDX,
383                                                        SVCT_VCM_VC_NUM_BYTE_NUM,
384                                                        SVCT_VCM_VC_NUM_SHIFT,
385                                                        SVCT_VCM_VC_NUM_MASK);
386                channel->path_select = SI_Construct_Data(current,
387                                                        SVCT_VCM_PATH_SEL_BYTE_INDX,
388                                                        SVCT_VCM_PATH_SEL_BYTE_NUM,
389                                                        SVCT_VCM_PATH_SEL_SHIFT,
390                                                        SVCT_VCM_PATH_SEL_MASK);
391                channel->transport_type = SI_Construct_Data(current,
392                                                                SVCT_VCM_XPORT_TYPE_BYTE_INDX,
393                                                                SVCT_VCM_XPORT_TYPE_BYTE_NUM,
394                                                                SVCT_VCM_XPORT_TYPE_SHIFT,
395                                                                SVCT_VCM_XPORT_TYPE_MASK);
396                channel->channel_type = SI_Construct_Data(current,
397                                                                SVCT_VCM_CHAN_TYPE_BYTE_INDX,
398                                                                SVCT_VCM_CHAN_TYPE_BYTE_NUM,
399                                                                SVCT_VCM_CHAN_TYPE_SHIFT,
400                                                                SVCT_VCM_CHAN_TYPE_MASK);
401                channel->CDS_reference = SI_Construct_Data(current,
402                                                                SVCT_VCM_CDS_REF_BYTE_INDX,
403                                                                SVCT_VCM_CDS_REF_BYTE_NUM,
404                                                                SVCT_VCM_CDS_REF_SHIFT,
405                                                                SVCT_VCM_CDS_REF_MASK);
406                channel->source_ID = SI_Construct_Data(current,
407                                                                SVCT_VCM_SOURCE_ID_BYTE_INDX,
408                                                                SVCT_VCM_SOURCE_ID_BYTE_NUM,
409                                                                SVCT_VCM_SOURCE_ID_SHIFT,
410                                                                SVCT_VCM_SOURCE_ID_MASK);
411                SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM appflag %x, channel %x, xport type %x, channel type %x, source id %x, cds ref %x.\n", channel->appflag,channel->channum1,channel->transport_type,channel->channel_type,channel->source_ID,channel->CDS_reference));
412
413                if (channel->transport_type == MPEG2_XPORT)
414                {
415                        /* mpeg digital channel. */
416                        channel->ChanPropUnion.mpeg_prop.prog_num = SI_Construct_Data(current,
417                                                                                                        SVCT_VCM_PROG_NUM_BYTE_INDX,
418                                                                                                        SVCT_VCM_PROG_NUM_BYTE_NUM,
419                                                                                                        SVCT_VCM_PROG_NUM_SHIFT,
420                                                                                                        SVCT_VCM_PROG_NUM_MASK);
421                        channel->ChanPropUnion.mpeg_prop.MMS_reference = SI_Construct_Data(current,
422                                                                                                        SVCT_VCM_MMS_REF_BYTE_INDX,
423                                                                                                        SVCT_VCM_MMS_REF_BYTE_NUM,
424                                                                                                        SVCT_VCM_MMS_REF_SHIFT,
425                                                                                                        SVCT_VCM_MMS_REF_MASK);
426                        SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM MPEG channel: Prog num %x, mms ref %x.\n", channel->ChanPropUnion.mpeg_prop.prog_num, channel->ChanPropUnion.mpeg_prop.MMS_reference));
427                }
428                else
429                {
430                        /* analog channel. */
431                        channel->ChanPropUnion.nonmpeg_prop.scrambled = SI_Construct_Data(current,
432                                                                                                        SVCT_VCM_SCRAMBLED_BYTE_INDX,
433                                                                                                        SVCT_VCM_SCRAMBLED_BYTE_NUM,
434                                                                                                        SVCT_VCM_SCRAMBLED_SHIFT,
435                                                                                                        SVCT_VCM_SCRAMBLED_MASK);
436                        channel->ChanPropUnion.nonmpeg_prop.video_standard = SI_Construct_Data(current,
437                                                                                                        SVCT_VCM_VIDEO_STANDARD_BYTE_INDX,
438                                                                                                        SVCT_VCM_VIDEO_STANDARD_BYTE_NUM,
439                                                                                                        SVCT_VCM_VIDEO_STANDARD_SHIFT,
440                                                                                                        SVCT_VCM_VIDEO_STANDARD_MASK);
441                        SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM ANALOG channel: standard %x, scramble %x.\n", channel->ChanPropUnion.nonmpeg_prop.video_standard, channel->ChanPropUnion.nonmpeg_prop.scrambled));
442                }
443
444                if (desc_incl)
445                {
446                        /* get descriptors count. */
447                        desc_cnt = SI_Construct_Data(current,
448                                                SVCT_VCM_DESC_CNT_BYTE_INDX,
449                                                SVCT_VCM_DESC_CNT_BYTE_NUM,
450                                                SVCT_VCM_DESC_CNT_SHIFT,
451                                                SVCT_VCM_DESC_CNT_MASK);
452                        /* current -> first descriptor. */
453                        current += SVCT_VCM_DESC_CNT_BYTE_INDX+SVCT_VCM_DESC_CNT_BYTE_NUM;
454
455                        /* go through all descriptors. */
456                        for (j=0; j<desc_cnt; j++)
457                        {
458                                desc_tag = *(current++);
459                                len = *(current++);
460                                switch(desc_tag)
461                                {
462                                        case SI_DESC_TWO_PART_CHANNEL_NO:
463                                                SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM two part descriptor.\n"));
464
465                                                channel->vcn_mode = TWO_PART;
466                                                channel->channum1 = SI_Construct_Data(current,
467                                                                                        DESC_TPCND_MAJOR_NUMBER_BYTE_INDEX,
468                                                                                        DESC_TPCND_MAJOR_NUMBER_BYTE_NUM,
469                                                                                        DESC_TPCND_MAJOR_NUMBER_SHIFT,
470                                                                                        DESC_TPCND_MAJOR_NUMBER_MASK);
471                                                channel->channum2 = SI_Construct_Data(current,
472                                                                                        DESC_TPCND_MINOR_NUMBER_BYTE_INDEX,
473                                                                                        DESC_TPCND_MINOR_NUMBER_BYTE_NUM,
474                                                                                        DESC_TPCND_MINOR_NUMBER_SHIFT,
475                                                                                        DESC_TPCND_MINOR_NUMBER_MASK);
476                                        break;
477
478                                        case SI_DESC_CHANNEL_PROPERTIES:
479                                                SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM Chan properties descriptor.\n"));
480
481                                                channel->more_prop = 1;
482                                                channel->tsid = SI_Construct_Data(current,
483                                                                                DESC_CPD_CHANNEL_TSID_BYTE_INDEX,
484                                                                                DESC_CPD_CHANNEL_TSID_BYTE_NUM,
485                                                                                DESC_CPD_CHANNEL_TSID_SHIFT,
486                                                                                DESC_CPD_CHANNEL_TSID_MASK);
487                                                channel->serv_type = SI_Construct_Data(current,
488                                                                                DESC_CPD_SERVICE_TYPE_BYTE_INDEX,
489                                                                                DESC_CPD_SERVICE_TYPE_BYTE_NUM,
490                                                                                DESC_CPD_SERVICE_TYPE_SHIFT,
491                                                                                DESC_CPD_SERVICE_TYPE_MASK);
492                                                channel->chanbits = SI_Construct_Data(current,
493                                                                                DESC_CPD_CHANNEL_BITS_BYTE_INDEX,
494                                                                                DESC_CPD_CHANNEL_BITS_BYTE_NUM,
495                                                                                DESC_CPD_CHANNEL_BITS_SHIFT,
496                                                                                DESC_CPD_CHANNEL_BITS_MASK);
497                                        break;
498                                        case SI_DESC_REGISTRATION:
499                                        {
500                                                unsigned int format_id = SI_Construct_Data(current,
501                                                                                DESC_REGISTRATION_BYTE_INDEX,
502                                                                                DESC_REGISTRATION_BYTE_NUM,
503                                                                                DESC_REGISTRATION_BYTE_SHIFT,
504                                                                                DESC_REGISTRATION_BYTE_MASK);
505                                                if (format_id == DTA_REGISTRATION_FORMAT_ID) {
506                                                        has_registration = true;
507                                                }
508                                                else {
509                                                        has_registration = false;
510                                                }
511                                                break;
512                                        }       
513                                        /*case SI_DESC_USER_PRIVATE:*/
514                                        case SI_DESC_SERVICE_INFORMATION:
515                                        {
516                                                unsigned char revision;
517                                                unsigned char video_content;
518                                                if (has_registration == true) {
519                                                        revision = SI_Construct_Data(current, 
520                                                                                DESC_SID_REVISION_BYTE_INDEX, 
521                                                                                DESC_SID_REVISION_BYTE_NUM,
522                                                                                DESC_SID_REVISION_BYTE_SHIFT,
523                                                                                DESC_SID_REVISION_BYTE_MASK);
524                                                        if (revision == 0x01) {
525                                                                video_content = SI_Construct_Data(current,
526                                                                                DESC_SID_VIDEO_CONTENT_BYTE_INDEX,
527                                                                                DESC_SID_VIDEO_CONTENT_BYTE_NUM,
528                                                                                DESC_SID_VIDEO_CONTENT_SHIFT,
529                                                                                DESC_SID_VIDEO_CONTENT_MASK);
530                                                                channel->hd_flag = (video_content & 0x01);
531                                                                channel->threed_flag = (video_content>>1) & 0x01;
532                                                                channel->mpeg4_flag = (video_content>>2) & 0x01;
533                                                                channel->sdv_flag = SI_Construct_Data(current,
534                                                                                DESC_SID_VIDEO_DELIVERY_BYTE_INDEX,
535                                                                                DESC_SID_VIDEO_DELIVERY_BYTE_NUM,
536                                                                                DESC_SID_VIDEO_DELIVERY_SHIFT,
537                                                                                DESC_SID_VIDEO_DELIVERY_MASK);
538                                                        }
539                                                        SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM service information descriptor."));
540                                                }
541                                                else {
542                                                        SI_DBG_PRINT(E_SI_DBG_MSG,("Get Service information desc but registration is not received yet. Discard"));
543                                                }
544                                        }
545                                        break;
546                                        default:
547                                                SI_DBG_PRINT(E_SI_WRN_MSG,("SVCT VCM table descriptor %x received! Ignoring!\n", desc_tag));
548                                        break;
549                                }
550
551                                /* update current pointer. */
552                                current += len;
553                        }
554                }
555                else
556                {
557                        SI_DBG_PRINT(E_SI_DBG_MSG,("SVCT VCM NO descriptors.\n"));
558
559                        /* simply update the current pointer. */
560                        current += SVCT_VCM_MMS_REF_BYTE_INDX+SVCT_VCM_MMS_REF_BYTE_NUM;
561                }
562#ifdef MANAGE_VCM
563                /* insert the channel */
564                SI_SVCT_VCM_Ins_Channel(channel);
565#else
566                if (s_vcm_cb && s_vcm_cb->cb)
567                        s_vcm_cb->cb(channel,s_vcm_cb->data);
568#endif
569
570
571        }
572
573        return SI_SUCCESS;
574}
575
Note: See TracBrowser for help on using the repository browser.