source: svn/newcon3bcm2_21bu/dst/dmw/src/psi/DMW_PsiUtil.c @ 45

Last change on this file since 45 was 45, checked in by megakiss, 11 years ago
  • Property svn:executable set to *
File size: 28.1 KB
Line 
1/*
2        DMW_PsiUtil.c
3
4        DST TV MW PSI Scan Module
5
6        Various utility functions
7
8        Copyright 2006~2009 Digital STREAM Technology, Inc.
9        All Rights Reserved
10       
11*/
12
13
14#include "DMW_Platform.h"
15
16#include "DLIB_PSIP_Parser.h"
17
18#include "DMW_PsiUtil.h"
19
20
21
22// here, we use debug print routine of psi engine
23DHL_MODULE("psieng", 0);
24
25
26
27
28#if COMMENT
29____Strings____(){}
30#endif
31
32
33const char *PSIUTIL_TidString(UINT8 t)
34{
35        const char *p;
36        const char *table_id_string_mod_32[] =
37        { 
38                "pat", "cat", "pmt", 0, 0, 0, 0, "mgt",  // 0x00~0x07, or 0xc0~0xc7
39                "tvt", "cvt", "rrt", "eit", "ett", "stt", "det", "dst", // 0xc8~0xcf
40                0, "nrt", "ltst", "dcct", "dcst", 0, 0, 0, // 0xd0~0xd7
41                "eas", 0, 0, 0, 0, 0, 0, "dsmcc_ast", // 0x38~0x3f, or 0xd8~
42        };
43
44        p = table_id_string_mod_32[t & 0x1f];
45        return p ? p : "?";
46}
47
48char *PSIUTIL_ChannelNumberString(int major, int minor, char *buf)
49{
50        static char buf0[22];  // ÃÖ´ë Å©±â..
51       
52        if (buf == NULL) buf = buf0;
53       
54        if (minor == EPG_ONE_PART_CHANNEL_INDICATOR)
55                sprintf(buf, "%d", major);
56        else
57                sprintf(buf, "%d-%d", major, minor);
58               
59        return buf;
60}
61
62//-----------------------
63//  GpsTimeString/GpsTimeString2
64//
65//  GPS timeÀ» user time Çü½ÄÀ¸·Î º¯È¯Çؼ­ stringÀ¸·Î ¸¸µé¾îÁÖ´Â ÇÔ¼öÀÌ´Ù.
66//  caller°¡ stringÀúÀå¿¡ »ç¿ëµÉ buffer¸¦ ÁöÁ¤Çϴ°ÍÀÌ ±ÇÀåµÈ´Ù. Å©±â´Â ÀûÀýÇϰÔ..
67//  ¸¸¾à °£´ÜÇÏ°Ô Å×½ºÆ®ÇÒ ¸ñÀûÀ̶ó¸é NULL·Î ÁöÁ¤ÇÏ¿© static buffer¸¦ »ç¿ëÇÒ ¼öµµ ÀÖÀ¸³ª
68//  ÀÌ °æ¿ì multiple instance¸¦ »ç¿ëÇÏÁö ¸øÇÔ¿¡ À¯ÀÇÇ϶ó..
69//
70char *PSIUTIL_GpsTimeString2(UINT32 gps, char *buf, int level)
71{
72
73#if SYS_TIME_MODULE_ENABLED
74       
75        // 0: (3:20), 1: (3:20:15) 2: (4/19 3:20:15) 3: (2004/4/19 ¿ù 3:20:15)
76       
77        char *WdayString_k[7]={"ÀÏ", "¿ù", "È­", "¼ö", "¸ñ", "±Ý", "Åä"};
78        char *WdayString_e[7]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
79       
80        static char _buf[100];
81        STime_t s;
82       
83        DMW_ConvertUTC2LocalTime(&g_EpgDebugTimeContext, DMW_ConvertGPS2UTC(&g_EpgDebugTimeContext, gps), &s);
84        if (buf == NULL) buf = _buf;
85
86        if (level >= 4)
87                sprintf(buf, "%d/%d/%d %s %2d:%02d:%02d [tz%+d]",
88                        s.year, s.month, s.day, s.wday<7?WdayString_e[s.wday]:"", s.hour, s.min, s.sec,
89                        g_EpgDebugTimeContext.nTimeZone);
90        else if (level >= 3)
91                sprintf(buf, "%d/%d/%d %s %2d:%02d:%02d",
92                        s.year, s.month, s.day, s.wday<7?WdayString_k[s.wday]:"", s.hour, s.min, s.sec);
93        else if (level >= 2)
94                sprintf(buf, "%d/%d %2d:%02d:%02d",
95                        s.month, s.day, s.hour, s.min, s.sec);
96        else if (level >= 1)
97                sprintf(buf, "%2d:%02d:%02d", s.hour, s.min, s.sec);
98        else
99                sprintf(buf, "%2d:%02d", s.hour, s.min);
100
101        return buf;
102       
103#else
104
105        return "(NoSysTime API)";
106#endif
107
108}
109
110char *PSIUTIL_GpsTimeString(UINT32 gps, char *buf)
111{
112        return PSIUTIL_GpsTimeString2(gps, buf, 3);
113}
114
115
116
117
118
119#if COMMENT
120____Helper____(){}
121#endif
122
123
124/*
125        ÀÚµ¿ÀûÀ¸·Î Null setting±îÁö ÇÏ´Â Free API..
126        null pointer ¿¡µµ ¾ÈÀü.
127
128        ex:  PSIUTIL_FreeTable(&mgt);
129*/
130void PSIUTIL_FreeTable(void *tablePtrPtr)
131{
132        if (tablePtrPtr == NULL || *(void **)tablePtrPtr == NULL) return;
133        FreeAtscTable(*(void **)tablePtrPtr);
134        *(void **)tablePtrPtr = NULL;
135}
136
137
138
139/*
140        return non-zero if pat is different.
141        return zero if same pat exist.
142
143        assumption: if pat1 and pat2 is non-null, it should be "valid".
144*/
145BOOL PSIUTIL_IsEquivalentPat(MPEG_PAT *pat1, MPEG_PAT *pat2)
146{
147        int i;
148
149        if (pat1 == NULL || pat2 == NULL)
150                return FALSE;
151
152        if (pat1->version_number != pat2->version_number)
153                return FALSE;
154       
155        if (pat1->transport_stream_id != pat2->transport_stream_id)
156                return FALSE;
157       
158        if (pat1->numPrograms != pat2->numPrograms)
159                return FALSE;
160
161        if (!pat1->programs || !pat2->programs)
162                return FALSE;
163
164        // program ³»¿ëÀº °°°í ¼ø¼­¸¸ º¯°æµÇ¾îµµ ¼­·Î ´Ù¸¥ °ÍÀ¸·Î °£ÁÖÇÑ´Ù.
165        // ¿Ö³ÄÇϸé pat¿¡¼­ÀÇ index Á¤º¸°¡ Áß¿äÇÑ Àǹ̸¦ °®±â ¶§¹®.
166
167        for (i=0; i<pat1->numPrograms; i++)
168        {
169                if (pat1->programs[i].program_map_PID != pat2->programs[i].program_map_PID)
170                        return FALSE;
171                if (pat1->programs[i].program_number != pat2->programs[i].program_number)
172                        return FALSE;
173        }
174
175        return TRUE;
176}
177
178
179
180BOOL PSIUTIL_IsEquivalentMgt(mgtSectionPtr_t mgt1, mgtSectionPtr_t mgt2)
181{
182        int i, k;
183       
184        // ÇØ´ç table_type À» ã¾Æ¼­ ºñ±³ÇÏ´Â ¹æ½Ä..
185
186        if (mgt1 == NULL || mgt2 == NULL)
187                return FALSE; // it means it should not be ignored any way.
188
189        if (mgt1->tables_defined != mgt2->tables_defined)
190                return FALSE;
191
192        for (i=0; i<mgt1->tables_defined; i++) 
193        {
194                mgtTablePtr_t tb1, tb2;
195               
196                tb1 = &mgt1->table[i];
197               
198                // cafrii 050330 add
199                // ¸ÕÀú ÀÌ tb1 ÀÌ mgt1¿¡ ÀÌ¹Ì ÀÖ¾ú´ø typeÀÎÁö °Ë»ç..
200                // µ¿ÀÏÇÑ table typeÀÌ ¼­·Î ´Ù¸¥ °ª (PID µî) À» °¡Áö°í
201                // ¿©·¯°³°¡ Á¸ÀçÇÒ °æ¿ì, Ç×»ó different table·Î °£ÁֵǴ ¹®Á¦ ¼öÁ¤.
202                //
203                for (k=0; k<i; k++) {
204                        if (mgt1->table[k].table_type == tb1->table_type)
205                                break;
206                }
207                if (k < i)
208                        continue;  // ÀÌ table 'tb1' Àº ÀÌ¹Ì ¾Õ¿¡ ÀÖ´Â ´Ù¸¥ table°ú µ¿ÀÏÇÏ´Ù..
209                       
210                // find tbl->table_type in mgt2
211                // if not found, return as different
212               
213                for (k=0; k<mgt2->tables_defined; k++) {
214                        if (tb1->table_type == mgt2->table[k].table_type)
215                                break;
216                }
217                if (k >= mgt2->tables_defined) // 'tb1->table_type' not found!
218                        return FALSE;
219               
220                tb2 = &mgt2->table[k];
221               
222                // compare pid, version, num bytes
223                if (tb1->table_type_PID != tb2->table_type_PID ||
224                        tb1->table_type_version_number != tb2->table_type_version_number ||
225                        tb1->number_bytes != tb2->number_bytes)
226                                return FALSE;
227        }
228
229        return TRUE;
230       
231}
232
233
234BOOL PSIUTIL_IsEquivalentVct(xvctPtr_t vct1, xvctPtr_t vct2)
235{
236        int i;
237        if (vct1 == NULL || vct2 == NULL)
238                return FALSE;
239
240        if (vct1->is_cvct != vct2->is_cvct)
241                return FALSE;
242
243        if (vct1->transport_stream_id != vct2->transport_stream_id ||
244                vct1->version_number != vct2->version_number ||
245                vct1->numChannels != vct2->numChannels)
246                return FALSE;
247
248        // todo..
249        // »ó¼¼ ³»¿ë±îÁö ¸ðµÎ ºñ±³´Â Èûµé´Ù..
250        // ¾îÂ¥ÇÇ hardware filter ¶Ç´Â version change Á¤º¸·Î µ¿ÀÛÇÒ °ÍÀ̹ǷÎ
251        // debug message ¼öÁØ¿¡¼­ ÀÇ¹Ì ÀÖ´Â Á¤µµ·Î¸¸ üũ..
252
253        return TRUE;
254}
255
256BOOL PSIUTIL_IsEquivalentStt(sttSectionPtr_t stt1, sttSectionPtr_t stt2)
257{
258        if (stt1 == NULL || stt2 == NULL)
259                return FALSE; // it means it should not be ignored any way.
260
261        if (stt1->system_time != stt2->system_time)
262                return FALSE;
263
264        if (stt1->GPS_UTC_offset != stt2->GPS_UTC_offset)
265                return FALSE;
266
267        if (stt1->daylight_savings.DS_status != stt2->daylight_savings.DS_status ||
268                stt1->daylight_savings.DS_day_of_month != stt2->daylight_savings.DS_day_of_month ||
269                stt1->daylight_savings.DS_hour != stt2->daylight_savings.DS_hour)
270                return FALSE;
271       
272        return TRUE;
273}
274
275mgtTablePtr_t PSIUTIL_FindTableInMgt(mgtSection_t *mgt, int type)
276{
277        // mgt ¿¡¼­ ÇØ´ç typeÀÇ table Á¤º¸¸¦ µÇµ¹·ÁÁØ´Ù.
278        int i;
279        if (mgt == NULL) return NULL;
280       
281        for (i=0; i<mgt->tables_defined; i++) {
282                if (mgt->table[i].table_type == (table_type_k)type) return &(mgt->table[i]);
283        }
284        return NULL;
285}
286
287
288
289
290void PSIUTIL_ComparePrintTwoMgts(mgtSectionPtr_t mgt1, mgtSectionPtr_t mgt2, int debuglevel)
291{
292        // µÎ°³ÀÇ mgt tableÀ» ¼­·Î ºñ±³ Ãâ·ÂÇØÁØ´Ù.
293        //
294        mgtTablePtr_t tbl1, tbl2;
295        char buf1[20], buf2[20];
296        int i, k;
297        int candidate;
298        //char *hdr = "_PID ver size";
299       
300        dprint(debuglevel, "  MGT1 ver %d, %d tables   MGT2 ver %d, %d tables\n",
301                mgt1 ? mgt1->version_number : 0, mgt1 ? mgt1->tables_defined : 0, 
302                mgt2 ? mgt2->version_number : 0, mgt2 ? mgt2->tables_defined : 0);
303               
304        for (i=0; i<1; i++) {
305                tbl1 = PSIUTIL_FindTableInMgt(mgt1, tt_terrestrial_VCT_cni_1);
306                tbl2 = PSIUTIL_FindTableInMgt(mgt2, tt_terrestrial_VCT_cni_1);
307                if (tbl1 == NULL && tbl2 == NULL) continue;
308               
309                if (tbl1 == NULL) sprintf(buf1, "-------------");
310                else sprintf(buf1, "%04x %3d %4d", tbl1->table_type_PID, tbl1->table_type_version_number, tbl1->number_bytes);
311                if (tbl2 == NULL) sprintf(buf2, "-------------");
312                else sprintf(buf2, "%04x %3d %4d", tbl2->table_type_PID, tbl2->table_type_version_number, tbl2->number_bytes);
313               
314                dprint(debuglevel, "  TVCT      %s    %s\n", buf1, buf2);
315        }
316        for (i=0; i<1; i++) {
317                tbl1 = PSIUTIL_FindTableInMgt(mgt1, tt_cable_VCT_cni_1);
318                tbl2 = PSIUTIL_FindTableInMgt(mgt2, tt_cable_VCT_cni_1);
319                if (tbl1 == NULL && tbl2 == NULL) continue;
320
321                if (tbl1 == NULL) sprintf(buf1, "-------------");
322                else sprintf(buf1, "%04x %3d %4d", tbl1->table_type_PID, tbl1->table_type_version_number, tbl1->number_bytes);
323                if (tbl2 == NULL) sprintf(buf2, "-------------");
324                else sprintf(buf2, "%04x %3d %4d", tbl2->table_type_PID, tbl2->table_type_version_number, tbl2->number_bytes);
325               
326                dprint(debuglevel, "  CVCT      %s    %s\n", buf1, buf2);
327        }
328       
329        // eit
330        for (i=0; i<128; i++) {
331                tbl1 = PSIUTIL_FindTableInMgt(mgt1, tt_EIT_min+i);
332                tbl2 = PSIUTIL_FindTableInMgt(mgt2, tt_EIT_min+i);
333                if (tbl1 == NULL && tbl2 == NULL) continue;
334
335                if (tbl1 == NULL) sprintf(buf1, "-------------");
336                else sprintf(buf1, "%04x %3d %4d", tbl1->table_type_PID, tbl1->table_type_version_number, tbl1->number_bytes);
337                if (tbl2 == NULL) sprintf(buf2, "-------------");
338                else sprintf(buf2, "%04x %3d %4d", tbl2->table_type_PID, tbl2->table_type_version_number, tbl2->number_bytes);
339               
340                // Mgt1¿¡¼­ Mgt2ÀÇ EIT-iÀÇ Á¤º¸ (PID, version, bytesize)¿Í °°Àº EIT¸¦ ã´Â´Ù..
341                candidate = -1;
342                for (k=i; tbl2 && k<min(i+4, 128); k++) 
343                {
344                        tbl1 = PSIUTIL_FindTableInMgt(mgt1, tt_EIT_min+k); // ¿¾³¯ MGT¿¡¼­ EIT-k Á¤º¸¸¦ ã´Â´Ù.
345                        if (tbl1 == NULL) continue;
346                        if (tbl1->table_type_PID == tbl2->table_type_PID && 
347                            tbl1->table_type_version_number == tbl2->table_type_version_number &&
348                            tbl1->number_bytes == tbl2->number_bytes) {
349                                candidate = k;
350                                break;
351                        }
352                }
353                dprint(debuglevel, "  Eit-%03d   %s    %s", i, buf1, buf2);
354                if (candidate >= 0)
355                        dprint(debuglevel, " <-- Eit-%d", candidate);
356                dprint(debuglevel, "\n");
357        }
358        dprint(debuglevel, "\n");
359        // ett
360        for (i=0; i<128; i++) {
361                tbl1 = PSIUTIL_FindTableInMgt(mgt1, tt_event_ETT_min+i);
362                tbl2 = PSIUTIL_FindTableInMgt(mgt2, tt_event_ETT_min+i);
363                if (tbl1 == NULL && tbl2 == NULL) continue;
364
365                if (tbl1 == NULL) sprintf(buf1, "-------------");
366                else sprintf(buf1, "%04x %3d %4d", tbl1->table_type_PID, tbl1->table_type_version_number, tbl1->number_bytes);
367                if (tbl2 == NULL) sprintf(buf2, "-------------");
368                else sprintf(buf2, "%04x %3d %4d", tbl2->table_type_PID, tbl2->table_type_version_number, tbl2->number_bytes);
369
370                // Mgt1¿¡¼­ Mgt2ÀÇ EIT-iÀÇ Á¤º¸ (PID, version, bytesize)¿Í °°Àº EIT¸¦ ã´Â´Ù..
371                candidate = -1;
372                for (k=i; tbl2 && k<min(i+4, 128); k++) 
373                {
374                        tbl1 = PSIUTIL_FindTableInMgt(mgt1, tt_event_ETT_min+k); // ¿¾³¯ MGT¿¡¼­ EIT-k Á¤º¸¸¦ ã´Â´Ù.
375                        if (tbl1 == NULL) continue;
376                        if (tbl1->table_type_PID == tbl2->table_type_PID && 
377                            tbl1->table_type_version_number == tbl2->table_type_version_number &&
378                            tbl1->number_bytes == tbl2->number_bytes) {
379                                candidate = k;
380                                break;
381                        }
382                }
383                dprint(debuglevel, "  Ett-%03d   %s    %s", i, buf1, buf2);
384                if (candidate >= 0)
385                        dprint(debuglevel, " <-- Ett-%d", candidate);
386                dprint(debuglevel, "\n");
387        }
388}
389
390
391
392
393#if COMMENT
394____DbgPrint____(){}
395#endif
396
397#include "DMW_DebugUtil.h"
398
399#define SimplePrint DMW_DBG_SimplePrint
400
401#define USE_CODECONV_LIB 1
402
403
404#if USE_CODECONV_LIB
405        #include "DMW_CodeConv.h"
406       
407        #define UC_ConvUc2Ks DMW_ConvUc2Ks
408        #define UC_FreeKsString DMW_FreeKsString
409        #define UC_UniPrint DMW_UniPrint
410
411#else
412
413// ÇØ´ç library°¡ ¾ø´Â °æ¿ì ±ÞÁ¶Çؼ­ ¸¸µç Àӽà ÇÔ¼ö..
414// ¿µ¹® ASCII ¿µ¿ªÀÇ Uicode¶ó¸é ºÒÆíÇÔ ¾øÀÌ »ç¿ë °¡´ÉÇÔ.
415PSI_STATIC UINT8 *UC_ConvUc2Ks(UINT16 *ucs, int len)
416{
417        UINT8 *ks;
418        int i;
419        if (len < 0) {
420                for (i=0; i<256; i++) { // ÃÖ´ë ±ÛÀÚ 256..
421                        if (ucs[i] == 0) break;
422                }
423                len = i;
424        }
425        ks = OS_Calloc(len+1, 1);
426        if (!ks) return NULL;
427       
428        for (i=0; i<len; i++) {
429                if ((ucs[i] >> 8) == 0)
430                        ks[i] = (ucs[i] & 0xff);
431                else
432                        ks[i] = '.';
433        }
434        return ks;
435}
436
437PSI_STATIC void UC_FreeKsString(UINT8 *ks)
438{
439        OS_Free(&ks);
440}
441
442PSI_STATIC int UC_UniPrint(UINT16 *ucs, int len)
443{
444        UINT8 *s;
445        s = UC_ConvUc2Ks(ucs, len);
446        if (s) { 
447                dprint((char *)s); 
448                UC_FreeKsString(s); 
449        }
450        return 0;
451}
452
453#endif // USE_CODECONV_LIB
454
455
456/*
457        Warning! the content of buffer @p is modified!
458        NOT recommend to using this function..
459*/
460int PSIUTIL_UniPrint(UINT8 *p, int numChar)
461{
462        #define SWAP16(c) ((((c) & 0xff) << 8U) | (((c) >> 8) & 0xff))         
463
464        UINT16 test = 0x1234;
465        BOOL bLE = *(UINT8 *)&test == 0x12 ? FALSE : TRUE;
466        int i;
467        UINT16 *ucs = (UINT16 *)p;
468       
469        if (numChar < 0) { // auto-detect length.
470                for (i=0; i<256; i++) {  // max 256..
471                        if (ucs[i] == 0) break;
472                }
473                numChar = i;
474        }
475
476#if 1 // DMW_UNIPRINT_ENABLED
477        if (bLE) {
478                // swap each codes..
479                for (i=0; i<numChar; i++)
480                        ucs[i] = SWAP16(ucs[i]);
481        }
482        return UC_UniPrint(ucs, numChar);
483
484#else
485        for (i=0; i<numChar; i++) {
486                if (bLE) {
487                        if (ucs[i] & 0xff) == 0)
488                                SimplePrint("%c", (ucs[i] >> 8) & 0xff);
489                        else
490                                SimplePrint(".");
491                }
492                else {
493                        if ((ucs[i] >> 8) == 0)
494                                SimplePrint("%c", ucs[i] & 0xff);
495                        else
496                                SimplePrint(".");
497                }
498        }
499#endif
500
501}
502
503
504
505
506
507//-----------------------
508//  PSIUTIL_ConvertMss2Ks
509//
510//  MSS (MultipleStringStructure)¸¦ KS ¿Ï¼ºÇüÀ¸·Î º¯È¯ÇÑ´Ù.
511//  caller°¡ ÁöÁ¤ÇÑ ¹öÆÛ¸¦ »ç¿ëÇϸç, ¹öÆÛ Å©±â¸¦ ³Ñ¾î¼³ °æ¿ì truncate µÊ.
512//  MSS ¾È¿¡´Â ¿©·¯°³ÀÇ string ÀÌ Á¸ÀçÇÒ ¼ö Àִµ¥, instance´Â ÃßÃâÇϰíÀÚ ÇÏ´Â
513//  stringÀÇ instance ¹øÈ£ÀÌ´Ù. (0ºÎÅÍ ½ÃÀÛÇÏ´Â À妽º °ª)
514//  MSS¿¡ ¿øÇÏ´Â string instance°¡ ¾øÀ¸¸é statusNotFound °¡ ¸®ÅϵȴÙ.
515//
516#define MAX_SEGMENT_STR_SIZE  256
517
518STATUS PSIUTIL_ConvertMss2Ks(UINT8 *mssPtr, UINT16 mssLen, char *buf, int max_buflen, char *lang, int instance)
519{
520        // if 'lang' is non-NULL, lang should be ISO-639 language code. ex: "eng", "kor"
521        // if lang is NULL, instance should be 0 ~ mStringPtr->number_strings-1
522        // string is filled upto max_buflen-1 and null-terminator is attached at tail of string.
523       
524        multipleStringPtr_t     mStringPtr = NULL;
525        msStringPtr_t p;
526
527        INT32   j, pos;
528        char    string[MAX_SEGMENT_STR_SIZE];
529        DHL_RESULT err = DHL_OK;
530        STATUS status = statusOK;  // cafrii 060609 init bugfix
531        UINT8   *ks;
532
533        if (buf == NULL || max_buflen < 1)
534                return statusInvalidArgument;
535
536        if (mssPtr == NULL)
537                return statusInvalidArgument;
538
539        buf[0] = 0;
540
541        // cafrii 060719 bugfix!! DS083
542        if (mssLen <= 0) {  // ±×³É empty stringÀ¸·Î ¸®ÅÏ.
543                status = statusOK;
544                goto label_exit;
545        }
546       
547        // mssLenÀÌ 0ÀÎ °æ¿ì mStringPtrÀÌ NULL À̸鼭 noError¸®ÅϵÊ.
548        err = ParseMultipleString(mssPtr, mssLen, &mStringPtr);
549        if (IsError(err) || mStringPtr == NULL) {      // cafrii 050315 change
550                mStringPtr = NULL;   // cafrii 050315 add
551                status = (err==DHL_FAIL_BAD_FORMAT ? statusPSIPError : statusOutOfMemory);
552                goto label_exit;
553        }
554
555        if (lang && (lang[0] == 0 || lang[0] == ' '))
556                lang = NULL;
557       
558        if (lang) {
559                UINT32 code;
560                for (j=0; j<mStringPtr->number_strings; j++) {
561                        code = mStringPtr->msString[j].ISO639_language_code;
562                        if ((char)((code>>16)&0xff) == lang[0] &&
563                                (char)((code>>8)&0xff) == lang[1] &&
564                                (char)((code)&0xff) == lang[2]) {
565                                instance = j;
566                                break;
567                        }
568                }
569        }
570        if (instance < 0 || instance >= mStringPtr->number_strings) {
571                status = statusNotFound;
572                goto label_exit;
573        }
574
575        p = & mStringPtr->msString[instance];
576        pos = 0;
577
578        //langcode = p->ISO639_language_code;
579        //SimplePrint("(%c%c%c) ", (char)(langcode >> 16), (char)(langcode >> 8), (char)(langcode));
580       
581        for (j=0; j<p->number_segments; j++) {
582               
583                switch (p->segment[j].compression_type) {
584                       
585                        case cm_None:
586                                // ÁÖÀÇ!! compresse_string_byte°¡ address alignÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù¸é ¿¡·¯°¡ ³¯Áöµµ ¸ð¸£°ÚÀ½..
587                               
588                                if (p->segment[j].mode == tm_ISO10646_1_Page_0x00) { // 0x00
589                                        // ASCII, ISO Latin-1 (Roman)
590                                        //
591                                        if (pos + p->segment[j].number_bytes < max_buflen) {
592                                                memcpy(buf+pos, p->segment[j].compress_string_byte, p->segment[j].number_bytes);
593                                                pos += p->segment[j].number_bytes;
594                                        }
595                                        else {
596                                                // cafrii 060314, º¹»çÇÒ ¼ö ÀÖ´Â ¸¸Å­¸¸ º¹»çÇÑ´Ù.
597                                                int len = max_buflen - 1 - pos;
598                                                memcpy(buf+pos, p->segment[j].compress_string_byte, len);
599                                                pos += len;
600                                                buf[pos] = 0;
601                                                status = statusOK;  // is it better to notify warning?
602                                                goto label_exit;
603                                        }
604                                }
605                                else if (p->segment[j].mode == tm_ISO10646_1_16_bit) { // 0x3F
606                                        // ISO/IEC 10646-1 mode (all) - KOREAN mode only
607                                        //
608                                        ks = UC_ConvUc2Ks((UINT16 *)p->segment[j].compress_string_byte, p->segment[j].number_bytes/2);
609                                                // length °è»êÀº ±×³É 2·Î ³ª´®. Ȧ¼ö ÀÎ °æ¿ì ¸¶Áö¸·Àº À߸®³ª, Á¦´ë·Î µÈ code¶ó¸é
610                                                // Ç×»ó 2ÀÇ ¹è¼öÀÏ °ÍÀ̹ǷΠ¹®Á¦ ¾ø´Ù.
611                                        if (pos + strlen((char *)ks) < (size_t)max_buflen) {
612                                                memcpy(buf+pos, ks, strlen((char *)ks));
613                                                pos += strlen((char *)ks);
614                                                UC_FreeKsString(ks);
615                                        }
616                                        else {
617                                                // cafrii 060314, º¹»çÇÒ ¼ö ÀÖ´Â ¸¸Å­¸¸ º¹»çÇÑ´Ù.
618                                                int len = max_buflen - 1 - pos;
619                                                memcpy(buf+pos, ks, len);
620                                                UC_FreeKsString(ks);
621                                                pos += len;   // ¸¶Áö¸· ±ÛÀÚ°¡ ÇѱÛÀÏ °æ¿ì 1byte À߸®¸é ÀÌ»óÇÏ°Ô Ç¥ÇöµÉ ¼ö ÀÖÀ½.
622                                                buf[pos] = 0;
623                                                status = statusOK;  // is it better to notify warning?
624                                                goto label_exit;
625                                        }
626                                }
627                                else if (p->segment[j].mode == 0x48) { // ¿Ï¼ºÇü ÇѱÛ..
628                                        // ±×³É Ãâ·ÂÇϸé Shell font°¡ Çѱ۷Πº¸¿©ÁÙ °ÍÀÓ..
629                                        //
630                                        if (pos + p->segment[j].number_bytes < max_buflen) {
631                                                memcpy(buf+pos, p->segment[j].compress_string_byte, p->segment[j].number_bytes);
632                                                pos += p->segment[j].number_bytes;
633                                        }
634                                        else {
635                                                // cafrii 060314, º¹»çÇÒ ¼ö ÀÖ´Â ¸¸Å­¸¸ º¹»çÇÑ´Ù.
636                                                int len = max_buflen - 1 - pos;
637                                                memcpy(buf+pos, p->segment[j].compress_string_byte, len);
638                                                pos += len;   // ¸¶Áö¸· ±ÛÀÚ°¡ ÇѱÛÀÏ °æ¿ì 1byte À߸®¸é ÀÌ»óÇÏ°Ô Ç¥ÇöµÉ ¼ö ÀÖÀ½.
639                                                buf[pos] = 0;
640                                                status = statusOK;  // is it better to notify warning?
641                                                goto label_exit;
642                                        }
643                                }
644                                else {
645                                        char errmsg[40];
646                                        int len;
647                                        sprintf(errmsg, "!!Unsupported(%x)!!", p->segment[j].mode);
648                                        len = strlen(errmsg);
649                                        if (pos + len < max_buflen) {
650                                                memcpy(buf+pos, errmsg, len);
651                                                pos += len;
652                                        }
653                                }
654                                break;
655                               
656                        case cm_Huffman_C4C5:
657                        case cm_Huffman_C6C7:
658                               
659                                DecodeHuffmanString(p->segment[j].compress_string_byte,
660                                                                p->segment[j].number_bytes,
661                                                                p->segment[j].compression_type,
662                                                                string, MAX_SEGMENT_STR_SIZE);
663                               
664                                ks = UC_ConvUc2Ks((UINT16 *)string, -1);
665
666                                if (pos + strlen((char *)ks) < (size_t)max_buflen) {
667                                        memcpy(buf+pos, ks, strlen((char *)ks));
668                                        pos += strlen((char *)ks);
669                                        UC_FreeKsString(ks);
670                                }
671                                else {
672                                        // cafrii 060314, º¹»çÇÒ ¼ö ÀÖ´Â ¸¸Å­¸¸ º¹»çÇÑ´Ù.
673                                        int len = max_buflen - 1 - pos;
674                                        memcpy(buf+pos, ks, len);
675                                        UC_FreeKsString(ks);
676                                        pos += len;   // ¸¶Áö¸· ±ÛÀÚ°¡ ÇѱÛÀÏ °æ¿ì 1byte À߸®¸é ÀÌ»óÇÏ°Ô Ç¥ÇöµÉ ¼ö ÀÖÀ½.
677                                        buf[pos] = 0;
678                                        status = statusOK;  // is it better to notify warning?
679                                        goto label_exit;
680                                }
681                                break;
682                }
683        }
684        buf[pos] = 0; // null terminate
685
686label_exit:
687
688        if (mStringPtr)
689                FreeMultipleString(mStringPtr);
690
691        return status;
692}
693
694
695
696
697
698//-----------------------
699//  PSIUTIL_PrintMSS
700//
701//  PSIP¿¡¼­ »ç¿ëÇÏ´Â multipleStringÀ» µð¹ö±ëÀÌ ÆíÇϵµ·Ï Ãâ·ÂÇØÁØ´Ù..
702//  ÃÖÁ¾ Ãâ·ÂÀ» ÇÒ ¶§ »ç¿ëÇÏ´Â ÇÔ¼ö´Â DMW_UniPrint ·Î¼­, ÀÌ ÇÔ¼öÀÇ Ãâ·Â°¡´É ¿©ºÎ¿¡ µû¶ó
703//  ÀϺΠ±ÛÀÚ´Â Ãâ·ÂÀÌ ¾ÈµÈ´Ù.
704//
705//  ¸¸¾à Unicode»óÅÂÀÇ code°ªÀ» º¸°í ½ÍÀ¸¸é PrintMultipleString ÇÔ¼ö¸¦ »ç¿ëÇ϶ó..
706//
707#define STR_SIZE        256
708void PSIUTIL_PrintMSS(UINT8 *buffer, UINT16 len, int indent, int detailLevel)
709{
710        multipleStringPtr_t     mStringPtr = NULL;
711        INT32   i,j,k;
712        UINT32  langcode;
713        char    string[STR_SIZE], tmp[64];  // tmp´Â indent ¹öÆÛ ¿ë..
714        DHL_RESULT err;
715
716        if (indent > 63) indent = 63;
717        memset(tmp, ' ', indent);
718        tmp[indent] = 0;
719
720        // cafrii 060719 bugfix! add check. DS083
721        if (buffer == NULL || len == 0) {
722                SimplePrint("%s[null]\n", tmp);
723                goto PrintMultipleStringExit;
724        }
725
726        // lenÀÌ 0ÀÎ °æ¿ì mStringPtrÀÌ NULL À̸鼭 noError¸®ÅϵÊ.
727        err = ParseMultipleString(buffer, len, &mStringPtr);
728        if (IsError(err)) {        // cafrii 050315 change
729                mStringPtr = NULL;     // cafrii 050315 add
730                goto PrintMultipleStringExit;
731        }
732
733        if (mStringPtr == NULL) {
734                SimplePrint("%s[None]\n", tmp);
735                goto PrintMultipleStringExit;
736        }
737
738        for (i=0; i<mStringPtr->number_strings; i++) {
739                langcode = mStringPtr->msString[i].ISO639_language_code;
740                SimplePrint("%s(%c%c%c) ", tmp, (char)(langcode >> 16), (char)(langcode >> 8), (char)(langcode));
741                for (j=0; j<mStringPtr->msString[i].number_segments; j++) {
742                        switch (mStringPtr->msString[i].segment[j].compression_type) {
743                                case cm_None:
744                                        // ÁÖÀÇ!! compresse_string_byte°¡ address alignÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù¸é ¿¡·¯°¡ ³¯Áöµµ ¸ð¸£°ÚÀ½..
745                                        if (mStringPtr->msString[i].segment[j].mode == tm_ISO10646_1_Page_0x00) // 0x00
746                                                // ASCII, ISO Latin-1 (Roman)
747                                                for (k=0; k<mStringPtr->msString[i].segment[j].number_bytes; k++)
748                                                        SimplePrint("%c", mStringPtr->msString[i].segment[j].compress_string_byte[k]);
749                                        else if (mStringPtr->msString[i].segment[j].mode == tm_ISO10646_1_16_bit) // 0x3F
750                                                // ISO/IEC 10646-1 mode (all) - KOREAN mode only
751                                                PSIUTIL_UniPrint((UINT8 *)(mStringPtr->msString[i].segment[j].compress_string_byte), 
752                                                        mStringPtr->msString[i].segment[j].number_bytes/2);
753                                                        // length °è»êÀº ±×³É 2·Î ³ª´®. Ȧ¼ö ÀÎ °æ¿ì ¸¶Áö¸·Àº À߸®³ª, Á¦´ë·Î µÈ code¶ó¸é
754                                                        // Ç×»ó 2ÀÇ ¹è¼öÀÏ °ÍÀ̹ǷΠ¹®Á¦ ¾ø´Ù.
755                                        else if (mStringPtr->msString[i].segment[j].mode == 0x48) // ¿Ï¼ºÇü ÇѱÛ..
756                                                // ±×³É Ãâ·ÂÇϸé Shell font°¡ Çѱ۷Πº¸¿©ÁÙ °ÍÀÓ..
757                                                for (k=0; k<mStringPtr->msString[i].segment[j].number_bytes; k++)
758                                                        SimplePrint("%c", mStringPtr->msString[i].segment[j].compress_string_byte[k]);
759                                        else
760                                                SimplePrint("!!Unsupported(%x)!!", mStringPtr->msString[i].segment[j].mode);
761                                        break;
762                                       
763                                case cm_Huffman_C4C5:
764                                case cm_Huffman_C6C7:
765                                       
766                                        DecodeHuffmanString(mStringPtr->msString[i].segment[j].compress_string_byte,
767                                                                        mStringPtr->msString[i].segment[j].number_bytes,
768                                                                        mStringPtr->msString[i].segment[j].compression_type,
769                                                                        string, STR_SIZE);
770                                        PSIUTIL_UniPrint((UINT8 *)string, -1);
771                                        // DecodeÇÏ´Â ÇÔ¼ö°¡ SZ Çü½ÄÀ̹ǷΠ±æÀ̸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.
772                                        break;
773                        }
774                }
775                SimplePrint("\n");
776               
777        #if 0
778                if (detailLevel >= 1) {
779                        // Á» ´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ Ãâ·ÂÇϰíÀÚ Çϸé 'PrintMultipleString' ¸¦ »ç¿ëÇ϶ó..
780                        for (j=0; j<mStringPtr->msString[i].number_segments; j++) {
781                                SimplePrint("%s  [seg%d] comp_type %d, len %d\n", tmp, j,
782                                        mStringPtr->msString[i].segment[j].compression_type, mStringPtr->msString[i].segment[j].number_bytes);
783                                SimplePrint("%s     ", tmp);
784                                for (k=0; k<mStringPtr->msString[i].segment[j].number_bytes; k++)
785                                        SimplePrint("%02x ", mStringPtr->msString[i].segment[j].compress_string_byte[k]);
786                                SimplePrint("\n");
787                        }
788                }
789        #endif
790       
791        }
792        FreeMultipleString(mStringPtr);
793
794PrintMultipleStringExit:
795        return;
796}
797
798
799//-----------------------
800//  PSIUTIL_PrintEit
801//
802//  EitÀÇ Á¤º¸¸¦ º¸±âÁÁ°Ô Ãâ·ÂÇØÁØ´Ù. SysTime ¼³Á¤¿¡ µû¶ó ÇöÀç ½Ã°£ Ãâ·ÂÀÌ Á¤È®ÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù.
803//  ¸¸¾à EITÀÇ ¸ðµç ÀÚ¼¼ÇÑ Á¤º¸¸¦ Ãâ·ÂÇϱ⸦ ¿øÇϸé PrintEit ¸¦ »ç¿ëÇ϶ó..
804//
805void PSIUTIL_PrintEit(eitPtr_t eitPtr, int indent, ettSectionPtr_t *ettArray)
806{
807        // indent´Â ¸Å ¶óÀÎÀÇ ¾Õ¿¡ ¸îÄ­À» µé¿©¾²±â¸¦ ÇÒ °ÍÀΰ¡ ÁöÁ¤ÇÏ´Â °ÍÀε¥, ÃÖ´ë 31±îÁö °¡´ÉÇÏ´Ù.
808        //
809        INT32 i;
810        char tmp[32], buf1[64], buf2[64]; // tmp´Â µé¿©¾²±â¿ë, buf´Â TimeString¿ë
811       
812        if (indent > 31) indent = 31;
813        memset(tmp, ' ', indent);
814        tmp[indent] = 0;
815
816        //SimplePrint("\n%s------ EIT ------\n", tmp);
817        SimplePrint("%sEIT source_id %d, ver %d, %d events\n", 
818                        tmp, eitPtr->source_id, eitPtr->version_number, eitPtr->numEvents);
819        for (i=0; i<eitPtr->numEvents; i++) {
820                SimplePrint("%s   event[%d]: id: 0x%04X, %s ~ %s, ETM %d (%s)\n", 
821                                tmp, i, eitPtr->event[i].event_id,
822                                PSIUTIL_GpsTimeString2(eitPtr->event[i].start_time, buf1, 2),
823                                PSIUTIL_GpsTimeString2(eitPtr->event[i].start_time + eitPtr->event[i].length_in_seconds, buf2, 1),
824                                //eitPtr->event[i].start_time, eitPtr->event[i].length_in_seconds,
825                                eitPtr->event[i].ETM_location,
826                                eitPtr->event[i].ETM_location == ETM_none ? "None" :
827                                eitPtr->event[i].ETM_location == ETM_in_this_PTC ? "ThisPTC" :
828                                eitPtr->event[i].ETM_location == ETM_in_channel_TSID_PTC ? "ChannelTsidPTC" : "??"
829                                );
830                PSIUTIL_PrintMSS(eitPtr->event[i].title, eitPtr->event[i].title_length, indent+6, 0);
831                //SimplePrint("%s      desc_len %d\n", tmp, eitPtr->event[i].descriptor_length);
832               
833                // 'ettArray'°¡ ÀÖÀ¸¸é °°ÀÌ ettµµ Ãâ·ÂÇÑ´Ù.
834                // ±×·±µ¥ ¿ø·¡ ¾ø´Â ettÀÎÁö, ¾ÆÁ÷ ¼ö½ÅÀÌ ´ú µÈ ettÀÎÁö ½±°Ô ¾Ë ¹æ¹ýÀÌ ¾ø´Ù.
835                if (eitPtr->event[i].ETM_location != ETM_none && 
836                        ettArray && ettArray[i]) {
837                        ettSectionPtr_t ettSectPtr = ettArray[i];
838                        //SimplePrint("%sETT ETM_id %08x, event %x, ver %d\n", tmp, ettSectPtr->ETM_id, (ettSectPtr->ETM_id>>2) & 0x3fff,
839                        //                                              ettSectPtr->version_number);
840                        PSIUTIL_PrintMSS(ettSectPtr->extended_text_message, 
841                                                ettSectPtr->extended_text_message_length, indent+7, 0);
842                                                // ETT ETMÀº ÇÑÄ­ ´õ µé¿©¾²µµ·Ï ÇÏÀÚ..
843                }
844        }
845}
846
847//-----------------------
848//  PSIUTIL_PrintEtt
849//
850//  EttÀÇ Á¤º¸¸¦ º¸±âÁÁ°Ô Ãâ·ÂÇØÁØ´Ù.
851//  ¸¸¾à ETTÀÇ ¸ðµç ÀÚ¼¼ÇÑ Á¤º¸¸¦ Ãâ·ÂÇϱ⸦ ¿øÇϸé PrintEtt ¸¦ »ç¿ëÇ϶ó..
852//
853void PSIUTIL_PrintEtt(ettSectionPtr_t ettSectPtr, int indent)
854{
855        char tmp[32];
856       
857        if (indent > 31) indent = 31;
858        memset(tmp, ' ', indent);
859        tmp[indent] = 0;
860
861        //SimplePrint("\n%s------ ETT Section ------\n", tmp);
862        SimplePrint("%sETT ETM_id %08x, event %x, ver %d\n", tmp, ettSectPtr->ETM_id, (ettSectPtr->ETM_id>>2) & 0x3fff,
863                                                        ettSectPtr->version_number);
864        PSIUTIL_PrintMSS(ettSectPtr->extended_text_message, 
865                                ettSectPtr->extended_text_message_length, indent+3, 0);
866}
867
868
869//-----------------------
870//  PSIUTIL_PrintRrt
871//
872//  RrtÀÇ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.
873//  cafrii 060822, detail ¸ðµå¿¡¼­ ´õ ¸¹Àº Á¤º¸ Ãâ·ÂÇϰԲû ¼öÁ¤.
874//
875void PSIUTIL_PrintRrt(rrtSectionPtr_t rrt, int indent, BOOL bDetail)
876{
877        int i, k;
878        char ibuf[32];
879        int offset = 0;
880        static char mssbuf[200];
881        STATUS status;
882       
883        if (indent > 31) indent = 31;
884        memset(ibuf, ' ', indent);
885        ibuf[indent] = 0;
886
887        // °£´ÜÇϰԴ ù¹øÂ° langcode¸¸ Ãâ·Â.
888        status = PSIUTIL_ConvertMss2Ks(rrt->rating_region_name, 
889                                rrt->rating_region_name_length, mssbuf, 200, NULL, 0);
890
891        SimplePrint("%s  RRT ver %d, %d dims, region 0x%x  { %s }\n", 
892                        ibuf, (int)rrt->version_number, (int)rrt->dimensions_defined, 
893                        rrt->rating_region, status ? "err" : mssbuf);
894
895        if (bDetail) {
896                // ¸ðµç langcode¸¦ ´Ù Ãâ·ÂÇÑ´Ù.
897                PSIUTIL_PrintMSS(rrt->rating_region_name, 
898                                                        rrt->rating_region_name_length, indent+6, 0);
899        }
900       
901        for (i=0; i<rrt->dimensions_defined; i++) 
902        {
903                rrtDimensionPtr_t dim = &rrt->dimension[i];
904               
905                status = PSIUTIL_ConvertMss2Ks(dim->dimension_name, 
906                                                dim->dimension_name_length, mssbuf, 200, "eng", 0);
907                if (status)
908                        status = PSIUTIL_ConvertMss2Ks(dim->dimension_name, 
909                                                dim->dimension_name_length, mssbuf, 200, "kor", 0);
910                if (status)
911                        status = PSIUTIL_ConvertMss2Ks(dim->dimension_name, 
912                                                dim->dimension_name_length, mssbuf, 200, NULL, 0);
913
914                SimplePrint("%s  [%d] grad %d, %d values, { %s }\n", ibuf, i, 
915                                                                (int)dim->graduated_scale,
916                                                                (int)dim->values_defined,
917                                                                status ? "err" : mssbuf);
918
919                if (bDetail)
920                        PSIUTIL_PrintMSS(dim->dimension_name, 
921                                                                dim->dimension_name_length, indent+8, 0);
922               
923                if (dim->first_value_empty) {
924                        offset = 1;
925                        SimplePrint("%s     (%d) --\n", ibuf, 0);
926                }
927
928                for (k=0; k<dim->values_defined; k++) 
929                {
930                        rrtValuePtr_t value = &dim->value[k];
931                       
932                        status = PSIUTIL_ConvertMss2Ks(value->abbrev_rating_value, 
933                                                        value->abbrev_rating_value_length, mssbuf, 200, "eng", 0);
934                        if (status)
935                                status = PSIUTIL_ConvertMss2Ks(value->abbrev_rating_value, 
936                                                        value->abbrev_rating_value_length, mssbuf, 200, "kor", 0);
937                        if (status)
938                                status = PSIUTIL_ConvertMss2Ks(value->abbrev_rating_value, 
939                                                        value->abbrev_rating_value_length, mssbuf, 200, NULL, 0);
940
941                        SimplePrint("%s     (%d) %s  { %s }\n", ibuf, k+offset, 
942                                                        value->block_on ? "ON" : "--",
943                                                        status ? "err" : mssbuf);
944
945                        // Ãß°¡ Á¤º¸ Ç¥½Ã..
946                        if (bDetail)
947                                PSIUTIL_PrintMSS(value->abbrev_rating_value, 
948                                                                        value->abbrev_rating_value_length, indent+10, 0);
949
950                        // value_text Ç¥½Ã..
951                        if (bDetail) { 
952                                //SimplePrint("%s          text:\n", ibuf);
953                                PSIUTIL_PrintMSS(value->rating_value, 
954                                                                                value->rating_value_length, indent+12, 0);
955                        }
956                }
957        }
958}
959
960
961
962
963
Note: See TracBrowser for help on using the repository browser.