source: svn/newcon3bcm2_21bu/BSEAV/lib/mpeg2_ts_parse/psip_descriptor.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.1 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2003-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: psip_descriptor.c $
11 * $brcm_Revision: 4 $
12 * $brcm_Date: 5/8/08 1:48p $
13 *
14 * [File Description:]
15 *
16 * Revision History:
17 *
18 * $brcm_Log: /BSEAV/lib/mpeg2_ts_parse/psip_descriptor.c $
19 *
20 * 4   5/8/08 1:48p tokushig
21 * PR42421: fixed issue with interpretation of cc_type field of caption
22 * service descriptor.  added parse routines for genre descriptor
23 *
24 * 3   11/2/07 9:34a marcusk
25 * PR36682: Check text length before returning CAD descriptor text.
26 *
27 * 2   2/26/07 2:31p marcusk
28 * PR 28121: Fixed SLD element offset.
29 *
30 * 1   2/7/05 11:24p dlwin
31 * Merge down for release 2005_REFSW_MERGETOMAIN:
32 *
33 * Irvine_BSEAVSW_Devel/2   2/4/04 9:56a erickson
34 * PR9217: converted BDBG_ASSERT calls to CHECK calls. Don't assert on bad
35 * data.
36 *
37 * Irvine_BSEAVSW_Devel/1   8/29/03 5:03p marcusk
38 * Initial Version.
39 *
40 ***************************************************************************/
41#include "bstd.h"
42#include "psip_priv.h"
43#include "psip_descriptor.h"
44BDBG_MODULE(psip_descriptor);
45
46uint8_t PSIP_CSD_getNumServices( TS_PSI_descriptor descriptor )
47{
48        CHECK( descriptor[0] == 0x86 );
49        return (uint8_t)(descriptor[2] & 0x1F);
50}
51
52BERR_Code PSIP_CSD_getService( TS_PSI_descriptor descriptor, int serviceNum, PSIP_CSD_service *p_service )
53{
54        int byteOffset;
55
56        CHECK( descriptor[0] == 0x86 );
57
58        if( serviceNum >= (descriptor[2] & 0x1F) )
59        {
60                return BERR_INVALID_PARAMETER;
61        }
62
63        byteOffset = 3 + (6*serviceNum);
64
65        p_service->language[0] = descriptor[byteOffset+0];
66        p_service->language[1] = descriptor[byteOffset+1];
67        p_service->language[2] = descriptor[byteOffset+2];
68        p_service->cc_type = (descriptor[byteOffset+3]>>7)&1;
69        if( p_service->cc_type )
70        {
71                p_service->cc.caption_service_number = (uint8_t)(descriptor[byteOffset+3]&0x3F);
72        }
73        else
74        {
75                p_service->cc.line21_field = descriptor[byteOffset+3]&1;
76        }
77        p_service->easy_reader = (descriptor[byteOffset+4]>>7)&1;
78        p_service->wide_aspect_ratio = (descriptor[byteOffset+4]>>6)&1;
79
80        return BERR_SUCCESS;
81}
82
83#define PSIP_CAD_RATING_DIM_SIZE (2*descriptor[byteOffset+1])   
84
85static int PSIP_CAD_P_getRatingRegionByteOffset( TS_PSI_descriptor descriptor, int ratingRegionNum )
86{
87        uint8_t i;
88        int byteOffset = 3;
89
90        /* Jump to correct table (or first byte after last table) */
91        for( i = 0; i < ratingRegionNum; i++ )
92        {
93                byteOffset += 2 + PSIP_CAD_RATING_DIM_SIZE + descriptor[byteOffset+2+PSIP_CAD_RATING_DIM_SIZE];
94
95                CHECK( byteOffset < descriptor[1] );
96        }
97
98        return byteOffset;
99}
100
101uint8_t PSIP_CAD_getRatingRegionCount( TS_PSI_descriptor descriptor )
102{
103        CHECK( descriptor[0] == 0x87 );
104        return (uint8_t)(descriptor[2] & 0x3F);
105}
106
107BERR_Code PSIP_CAD_getRatingRegion( TS_PSI_descriptor descriptor, int ratingRegionNum, PSIP_CAD_rating_region *p_ratingRegion )
108{
109        int byteOffset;
110        CHECK( descriptor[0] == 0x87 );
111
112        if( ratingRegionNum >= (descriptor[2] & 0x3F) )
113        {
114                return BERR_INVALID_PARAMETER;
115        }
116
117        byteOffset = PSIP_CAD_P_getRatingRegionByteOffset( descriptor, ratingRegionNum );
118        p_ratingRegion->rating_region = descriptor[byteOffset+0];
119        p_ratingRegion->rated_dimensions = descriptor[byteOffset+1];
120        if( descriptor[byteOffset+2+PSIP_CAD_RATING_DIM_SIZE] )
121        {
122                p_ratingRegion->p_rating_description_text = &descriptor[byteOffset+3+PSIP_CAD_RATING_DIM_SIZE];
123        }
124        else
125        {
126                p_ratingRegion->p_rating_description_text = NULL;
127        }
128
129        return BERR_SUCCESS;
130}
131
132BERR_Code PSIP_CAD_getRatingDimension( TS_PSI_descriptor descriptor, int ratingRegionNum, int ratingDimensionNum, PSIP_CAD_rating_dimension *p_ratingDimension )
133{
134        int byteOffset;
135        CHECK( descriptor[0] == 0x87 );
136
137        if( ratingRegionNum >= (descriptor[2] & 0x3F) )
138        {
139                return BERR_INVALID_PARAMETER;
140        }
141
142        byteOffset = PSIP_CAD_P_getRatingRegionByteOffset( descriptor, ratingRegionNum );
143
144        if( ratingRegionNum >= descriptor[byteOffset+1] )
145        {
146                return BERR_INVALID_PARAMETER;
147        }
148
149        p_ratingDimension->rating_dimension_j = descriptor[byteOffset+2+(2*ratingDimensionNum)];
150        p_ratingDimension->rating_value = (uint8_t)(descriptor[byteOffset+2+(2*ratingDimensionNum)+1] & 0xF);
151
152        return BERR_SUCCESS;
153}
154
155PSIP_MSS_string PSIP_ECND_getLongChannelName( TS_PSI_descriptor descriptor )
156{
157        CHECK( descriptor[0] == 0xA0 );
158        return &descriptor[2];
159}
160
161void PSIP_SLD_getHeader( TS_PSI_descriptor descriptor, PSIP_SLD_header *p_header )
162{
163        CHECK( descriptor[0] == 0xA1 );
164
165        p_header->PCR_PID = (uint16_t)(TS_READ_16( &descriptor[2] ) & 0x1FFF);
166        p_header->number_elements = descriptor[4];
167}
168
169BERR_Code PSIP_SLD_getElement( TS_PSI_descriptor descriptor, int elementNum, PSIP_SLD_element *p_element )
170{
171        int byteOffset;
172
173        CHECK( descriptor[0] == 0xA1 );
174        if( elementNum >= descriptor[4] )
175        {
176                return BERR_INVALID_PARAMETER;
177        }
178
179        byteOffset = 5 + (elementNum*6);
180        p_element->stream_type = descriptor[byteOffset+0];
181        p_element->elementary_PID = (uint16_t)(TS_READ_16( &descriptor[byteOffset+1] ) & 0x1FFF);
182        p_element->ISO_639_language_code[0] = descriptor[byteOffset+3];
183        p_element->ISO_639_language_code[1] = descriptor[byteOffset+4];
184        p_element->ISO_639_language_code[2] = descriptor[byteOffset+5];
185
186        return BERR_SUCCESS;
187}
188
189uint8_t PSIP_TSSD_getNumServices( TS_PSI_descriptor descriptor )
190{
191        CHECK( descriptor[0] == 0xA2 );
192
193        return (uint8_t)(descriptor[2] & 0x1F);
194}
195
196BERR_Code PSIP_TSSD_getService( TS_PSI_descriptor descriptor, int serviceNum, PSIP_TSSD_service *p_service )
197{
198        int byteOffset;
199
200        CHECK( descriptor[0] == 0xA2 );
201        if( serviceNum >= (descriptor[2] & 0x1F) )
202        {
203                return BERR_INVALID_PARAMETER;
204        }
205
206        byteOffset = 3 + (serviceNum*5);
207
208        p_service->time_shift = (uint16_t)(TS_READ_16( &descriptor[byteOffset+0] ) & 0x3FF);
209        p_service->major_channel_number = (uint16_t)((TS_READ_16( &descriptor[byteOffset+3] )>>2) & 0x3FF);
210        p_service->minor_channel_number = (uint16_t)(TS_READ_16( &descriptor[byteOffset+4] ) & 0x3FF);
211
212        return BERR_SUCCESS;
213}
214
215PSIP_MSS_string PSIP_CND_getComponentName( TS_PSI_descriptor descriptor )
216{
217        CHECK( descriptor[0] == 0xA3 );
218        return &descriptor[2];
219}
220
221void PSIP_DCC_RD_getRequest( uint8_t *descriptor, PSIP_DCC_RD_request *p_request )
222{
223        CHECK( descriptor[0] == 0xA8 || descriptor[0] == 0xA9 );
224
225        p_request->dcc_request_type = descriptor[2];
226        p_request->p_dcc_request_text = &descriptor[4];
227}
228
229void PSIP_RCD_getRcInformation( TS_PSI_descriptor descriptor, uint8_t *p_numBytes, const uint8_t **pp_rc_information )
230{
231        CHECK( descriptor[0] == 0xAA );
232
233        *p_numBytes = descriptor[1];
234        *pp_rc_information = &descriptor[2];
235}
236
237uint8_t PSIP_GD_getNumGenres( TS_PSI_descriptor descriptor )
238{
239        CHECK( descriptor[0] == 0xA2 );
240
241        return (uint8_t)(descriptor[2] & 0x1F);
242}
243
244BERR_Code PSIP_GD_getGenre( TS_PSI_descriptor descriptor, int genreNum, PSIP_GD_Genre *p_genre )
245{
246        int byteOffset;
247
248        CHECK( descriptor[0] == 0xAB );
249        if( genreNum >= (descriptor[2] & 0x1F) )
250        {
251                return BERR_INVALID_PARAMETER;
252        }
253
254        byteOffset = 3 + genreNum;
255        *p_genre   = descriptor[byteOffset];
256
257        return BERR_SUCCESS;
258}
Note: See TracBrowser for help on using the repository browser.