source: svn/newcon3bcm2_21bu/BSEAV/lib/ts_cat/ca_parser.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: 3.7 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2008, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile:  $
11 * $brcm_Revision:  $
12 * $brcm_Date: $
13 *
14 * Module Description:
15 *
16 * Revision History:
17 *
18 * $brcm_Log:  $
19 *
20 ***************************************************************************/
21#include "bstd.h"
22#include "ts_priv.h"
23#include "ca_parser.h"
24
25BDBG_MODULE(ca_parser);
26
27#ifndef CA_ASSERT
28#define CA_ASSERT BDBG_ASSERT
29#endif
30
31/*
32 * This function is used to parse CA table to get pointer to CA descritor block
33 *
34 * Parameters:
35 *      cat_buf         pointer to the beginning of CA table
36 *      psize           pointer to the size of buffer, and will be length of section upon successfully
37 *
38 * Returns:
39 *      pointer to CA descriptor block if successful
40 *      NULL otherwise
41*/
42uint8_t *cat_parser(const uint8_t *cat_buf, size_t *psize)
43{
44        uint8_t *p = (uint8_t *)cat_buf;
45        int section_len;
46
47        BDBG_MSG(("%s: enter", __func__));
48        CA_ASSERT((p && psize));
49
50        if (0x01 != *p) {
51                BDBG_WRN(("%s: Invalid CA Table ID (0x%02x)", __func__, *p));
52                return NULL;
53        }
54
55        p++;
56        section_len = (TS_READ_16(p) & 0xfff); p += 2;
57               
58        if (*psize < (section_len + 3)) {
59                BDBG_WRN(("%s: Invalid CA Table", __func__));
60                return NULL;
61        }
62
63        /* skip version_number, current_next, last_section fields */
64        p += 5;
65        *psize = section_len;
66       
67        BDBG_MSG(("%s: leave", __func__));
68
69        return p;
70}
71
72/*
73 * This function is used to parse CA descriptor from either CAT (for system wide)
74 * or PMT (for stream wide)
75 *
76 * Parameters:
77 *      ca_buf          pointer to the beginning of CA descriptor block
78 *      size            size of buffer
79 *      ca_desc         pointer to ca_descriptor data structure
80 *
81 * Returns:
82 *      0 if failed
83 *      1 if parsing is successful
84*/
85int ca_parser(const uint8_t *ca_buf, size_t size, ca_descriptor *ca_desc)
86{
87        uint8_t *p = (uint8_t *)ca_buf;
88        int i, len;
89        BDBG_MSG(("%s: enter", __func__));
90        CA_ASSERT((p && ca_desc));
91
92        if (TS_PSI_DT_CA != *p) {
93                BDBG_WRN(("%s: Invalid CA Descriptor (0x%02x)", __func__, *p));
94                return 0;
95        }
96        ca_desc->sig = 0xDEADF00D;
97
98        p++;
99        len = *p; p++;
100        ca_desc->CA_system_ID = TS_READ_16(p); p += 2;
101        ca_desc->CA_PID = (TS_READ_16(p) & 0x1fff); p += 2;
102        len -= 4;
103        if (len > CA_MAX_PRIV_DATA) {
104                BDBG_WRN(("%s: private data bytes %d exceed data buffer size %d", __func__, len, CA_MAX_PRIV_DATA));
105                len = CA_MAX_PRIV_DATA;
106        }
107        ca_desc->priv_length = len;
108       
109        for (i = 0; i < ca_desc->priv_length; i++) {
110                ca_desc->priv_data[i] = *p;
111                p++;
112        }
113       
114        if (size <= (size_t)(p - ca_buf)) {
115                BDBG_ERR(("%s: CA descriptor data exceed buffer boundary", __func__));
116                return 0;
117        }
118
119        if (ca_desc->sig != 0xDEADF00D)
120        {
121                BDBG_ERR(("%s: CA descriptor overflow", __func__));
122        }
123        BDBG_MSG(("%s: leave", __func__));
124
125        return 1;
126}
127
128/*
129 * This function is used to dump CA descriptor retrived from either CAT or PMT
130 *
131 * Parameters:
132 *      ca_desc         pointer to ca_descriptor data structure with CA descriptor to dump
133 *
134 * Returns:
135 *      NONE
136*/
137void ca_dump_descriptor(ca_descriptor *ca_desc)
138{
139        int i;
140
141        CA_ASSERT(ca_desc);
142
143        BDBG_MSG(("===dump CA descritpor===\n"));
144        BDBG_MSG(("System ID = 0x%04x\n", ca_desc->CA_system_ID));
145        BDBG_MSG(("    CA ID = 0x%04x\n", ca_desc->CA_PID));
146        BDBG_MSG(("Priv data = %d\n", ca_desc->priv_length));
147       
148        for (i = 0; i < ca_desc->priv_length && i < CA_MAX_PRIV_DATA; i++) {
149                if (0 == (i % 8))
150                        BDBG_MSG(("\n\t"));
151                BDBG_MSG(("0x%02x ", ca_desc->priv_data[i]));
152        }               
153        BDBG_MSG(("\n"));
154}
Note: See TracBrowser for help on using the repository browser.