source: svn/trunk/newcon3bcm2_21bu/dst/dhl/api/test/PsiTest.c @ 2

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

first commit

  • Property svn:executable set to *
File size: 23.4 KB
Line 
1/*
2        PsiTest.c
3
4
5*/
6
7#include "DHL_PSI.h"
8#include "DHL_PSI_Priv.h"
9#include "DHL_DBG.h"
10#include "DHL_UTL.h"
11
12#include "DLIB_PSI_Parser.h"
13#include "DLIB_PSIP_Parser.h"
14#include "DLIB_PSI_Monitor.h"
15#include "DLIB_PSIP_Monitor.h"
16
17
18//#include <string.h>
19
20/*
21
22        Å×½ºÆ® ¹æ¹ý:
23
24                ¸ðµç Å×½ºÆ® ÇÔ¼ö´Â      PsiTest_ ·Î ½ÃÀÛÇÑ´Ù.
25
26
27        1. ÃʱâÈ­
28
29                ÃʱâÈ­ ºÎºÐ¿¡¼­ DHL_DMX_Init ¹× DHL_PSI_Init ÀÌ È£ÃâµÇÁö ¾Ê¾Ò´Ù¸é
30                Á÷Á¢ shell¿¡¼­ È£ÃâÇØ ÁØ´Ù.
31
32                Shell> DHL_DMX_Init
33                Shell> DHL_PSI_Init
34
35        2. ±âº» ¼½¼Ç ¼ö½Å
36
37                all pass filter¸¦ ¼³Á¤Çϰí, 1Ãʰ£ ´ë±âÇÑ ÈÄ¿¡ filter off ÇÑ´Ù.
38                ÇÔ¼öÀÎÀÚ: tsd port.
39
40                Shell> PsiTest_01 0 0 1   // 1ÃÊ µ¿¾È tsd 0 ¿¡¼­ PAT (pid 0) ¼ö½Å.
41                Shell> PsiTest_01 1 0 1   // 1ÃÊ µ¿¾È tsd 1 ¿¡¼­ PAT ¼ö½Å.
42
43                Shell> PsiTest_01 0 0x1ffb 1 // 1ÃÊ µ¿¾È tsd 0 ¿¡¼­ ATSC base table ¼ö½Å.
44
45        3. ´ÜÀÏ ¼½¼Ç ¼ö½Å Å×½ºÆ®
46
47                °¢Á¾ update ¸ðµå Å×½ºÆ®
48                CRC üũ Å×½ºÆ®. ¾Æ·¡ ¸ðµç Å×½ºÆ®¿¡¼­ CRC ¿¡·¯°¡ ¹ß»ýÇÏ¸é ¾ÈµÊ.
49
50                        PsiTest_Section tsd pid tid update num
51                        update => 1:onehot, 2:version, 3:crc, 4:cont.
52
53
54                Shell> PsiTest_Section 0 0 0x0 1 5  // Çϳª¸¸ ¹Þ°í timeout ³ª¾ß ÇÔ.
55                Shell> PsiTest_Section 0 0 0x0 2 5  // Çϳª¸¸ ¹Þ°í timeout ³ª¾ß ÇÔ.
56                Shell> PsiTest_Section 0 0 0x0 3 5  // Çϳª¸¸ ¹Þ°í timeout ³ª¾ß ÇÔ.
57                Shell> PsiTest_Section 0 0 0x0 4 5  // 5°³ ¸ðµÎ ¼ö½Å ÇØ¾ß ÇÔ. ´õ ¼ö½ÅµÉ ¼öµµ ÀÖÀ½.
58
59
60        4. ¼½¼Ç ¼ö½Å ºÎÇÏ Å×½ºÆ®..
61
62                PAT ¼ö½ÅÀ» continuous ¸ðµå·Î ó¸®ÇÑ´Ù.
63                ±×·¯´Ù°¡ STT ¼ö½ÅÀ» ÀϺη¯ Áö¿¬ ¼ö½ÅÇϵµ·Ï ó¸®Çϸé PAT ¼ö½Å¿¡ ºÎÇϰ¡ °É¸²..
64               
65
66                Shell> PsiTest_Load_Pat
67                        // pat ¼ö½Å »óȲ üũ..
68               
69                Shell> PsiTest_Load_Stt
70                        // stt°¡ ¼ö½Å µÉ ¶§ ¸¶´Ù °­Á¦ Áö¿¬¿¡ ÀÇÇØ pat ¼ö½Å¿¡ ¿µÇâÀ» ÁÖ´Â Çö»ó È®ÀÎ.
71
72               
73
74        5. Å×ÀÌºí ¼ö½Å Å×½ºÆ®
75
76                        PsiTest_Table tsd pid tid
77
78                Shell> PsiTest_Table 0 0 0     // PAT Çϳª¸¦ ¹Þ°í Á¾·á.
79                Shell> PsiTest_Table 0 0xnn 2  // PMT ¼ö½Å. PMT°¡ ¿©·µÀÏ °æ¿ì, ¹Ýº¹ ½ÃµµÇÏ¿© ¸ðµç PMT¸¦ ´Ù ¹Þ¾Æº¸µµ·Ï ÇÏÀÚ.
80               
81                Shell> PsiTest_Table 0 0x1ffb 0xc7  // mgt. timeout ³¯ ¼öµµ ÀÖÀ½.
82                Shell> PsiTest_Table 0 0x1ffb 0xc8  // tvct
83                Shell> PsiTest_Table 0 0x1ffb 0xc9  // cvct
84                Shell> PsiTest_Table 0 0x1ffb 0xca  // rrt
85                Shell> PsiTest_Table 0 0x1ffb 0xcd  // stt
86               
87        6. µ¿ÀÏ pid Å×ÀÌºí ¼ö½Å Å×½ºÆ®
88       
89                Shell> PsiTest_Load_Mgt
90                Shell> PsiTest_Load_Tvct        // Mgt¿Í Tvct µ¿½Ã ¼ö½Å È®ÀÎ
91                Shell> PsiTest_Stop_Mgt // Mgt´Â ¼ö½ÅÀÌ Áߴܵǰí Tvct´Â Áö¼ÓÀûÀ¸·Î ¼ö½ÅµÇ´ÂÁö È®ÀÎ
92                Shell> PsiTest_Load_Mgt // Mgt¿Í Tvct µ¿½Ã ¼ö½Å È®ÀÎ
93                Shell> PsiTest_Load_Stop        // ¼ö½Å Á¾·á
94
95        7. ett ¼ö½Å Å×½ºÆ®
96
97                        PsiTest_Load_Ett1 pid etmid
98                       
99                Shell> PsiTest_Load_Ett1 0xnnnn 0xnnnnnnnn // ¼ö½ÅµÈ ettÀÇ etmid°¡ µ¿ÀÏÇÑÁö È®ÀÎ
100                Shell> PsiTest_Load_Ett2 0xnnnn 0xmmmmmmmm // (´Ü, n != m) µ¿½Ã¿¡ ¼ö½Å µÇ´ÂÁö È®ÀÎ, etmidµµ È®ÀÎ
101                Shell> PsiTest_Load_Stop        // ¼ö½Å Á¾·á
102                        ¡Ø ettÀÇ pid¹× etmid´Â epg_start, epg_list µîÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¾Ë¼ö ÀÖ´Ù.
103                        ¡Ø test ½ºÆ®¸²Àº sarnoff bndb °°Àº ½ºÆ®¸²À» ÀÌ¿ëÇÏ¸é µÈ´Ù. (pid, etmid ¿¹: pid 0x1d07, etmid 0x001d0502, 0x001d0506)
104
105        8. PAT version change test
106
107                Shell> PsiTest_Load_Pat2        // ù ¹øÂ° pat ¼ö½Å È®ÀÎ ÈÄ 
108                                        // ¹öÀüÀÌ º¯°æ µÉ ¶§±îÁö ä³ÎÀ» º¯°æ ÇØº¸¸é¼­
109                                        // ¹öÀü º¯°æ½Ã update µÊÀ» È®ÀÎ
110                                        // ÃÖ¾ÇÀÇ °æ¿ì ¸ðµç ä³ÎÀÇ ¹öÀüÀÌ µ¿ÀÏÇϸé Å×½ºÆ® ºÒ°¡
111                       
112                       
113        x. ¼½¼Ç »ý¼º ÃÖ´ë °¹¼ö Å×½ºÆ®
114
115                Shell> PsiTest_HowManyFilter 0
116
117                        ·Î±×¸¦ »ìÆìº¸¸é¼­ ¸î°³ÀÇ ¼½¼ÇÀÌ »ý¼ºµÇ´Ù°¡ ¿¡·¯°¡ ¹ß»ýÇß´ÂÁö Å×½ºÆ®.
118                        ´Ù½Ã À§ ÇÔ¼ö¸¦ ¹Ýº¹Çϸ鼭 ÃÖ´ë ¼½¼Ç °¹¼ö¿¡ º¯µ¿ÀÌ ÀÖ´ÂÁö Å×½ºÆ®.
119       
120                Shell> PsiTest_HowManyFilter 0
121                Shell> PsiTest_HowManyFilter 0
122                Shell> PsiTest_HowManyFilter 1
123                Shell> PsiTest_HowManyFilter 1
124       
125
126*/
127
128#define print DHL_OS_Printf
129#define CHK_DHR(msg) if (dhr!=DHL_OK) { print("!! %s err %d\n", msg, dhr); goto errexit; }
130
131
132typedef struct 
133{
134        //--- common
135        UINT32 magic;
136
137        UINT32 cmd;
138        UINT32 section_count;
139
140        //--- Section test
141        UINT32 max_count;
142        BOOL full_dump;
143
144        //--- Table test
145        DHL_OS_SEMA_ID sem;  // ¼ö½Å ÅëÁö semaphore
146        tDHL_PSI_DataArray *data;
147       
148} PsiTestContext;
149
150#define PSI_CTX_MAGIC 0xcafebabe
151
152static void reset_ctx(PsiTestContext *ctx)
153{
154        memset(ctx, 0, sizeof(*ctx));
155        ctx->magic = PSI_CTX_MAGIC;
156}
157
158static DHL_RESULT get_tsd(UINT32 tsd_id, tDHL_TSD *pHandle)
159{
160        tDHL_TSD handle;
161        if (tsd_id >= DHL_CFG_MAX_NUM_TSD) {
162                return DHL_FAIL_INVALID_PARAM;
163        }
164        handle = DHL_DMX_GetTsdByID(tsd_id);
165        if (handle == NULL) return DHL_FAIL_INVALID_HANDLE;
166        *pHandle = handle;
167        return DHL_OK;
168}
169
170
171
172#if COMMENT
173____Test_1____(){}
174#endif
175
176/*
177        pat ¼ö½Å Å×½ºÆ®.
178        Á¦´ë·Î TS ¼³Á¤ÀÌ µÇ¾ú´Ù¸é 1ÃÊ¿¡ Àû¾îµµ ¸î °³ÀÇ PAT´Â ¼ö½ÅµÇ¾î¾ß ÇÑ´Ù.
179
180        Å×½ºÆ® ¹æ¹ý:
181*/
182
183
184static void PsiTest_01_Proc(tDHL_PSI_Event event, tDHL_PSI_ControlHandle psiCtl, UINT32 userParam)
185{
186        DHL_RESULT dhr;
187        PsiTestContext *ctx = (PsiTestContext *)userParam;
188
189        if (!ctx || ctx->magic != PSI_CTX_MAGIC) {
190                print("!! invalid ctx\n");
191                return;
192        }
193       
194        if (event == ePSIEVENT_DATARECEIVED) 
195        {
196                ctx->section_count++;
197
198                // PsiData Àд ·çƾÀÌ ¾ø´õ¶óµµ system¿¡ ¾Ç¿µÇâÀº ¾ø¾î¾ß ÇÑ´Ù.
199        #if 0
200                dhr = DHL_PSI_ReadPSIData(psiCtl, &data);
201                DHL_PSI_FreePSIData(data);
202        #endif
203               
204        }
205}
206
207/*
208        ÁöÁ¤ÇÑ tsd, pid ¿¡¼­ ¸ðµç ¼½¼ÇÀ» ´Ù ¼ö½ÅÇÑ´Ù.
209
210        ÁöÁ¤ÇÑ ½Ã°£ µ¿¾È ¸î °³ÀÇ ¼½¼ÇÀÌ ¼ö½ÅµÇ¾ú´ÂÁö üũ °¡´ÉÇÏ´Ù.
211        tsd ¸¦ ¹Ù²Ù¾î °¡¸é¼­ Å×½ºÆ® °¡´É.
212        pid¸¦ º¯°æÇØ °¡¸é¼­ Å×½ºÆ® °¡´É.
213*/
214void PsiTest_01(UINT32 tsd_id, UINT16 pid, UINT16 waitSecond)
215{
216        DHL_RESULT dhr;
217        tDHL_TSD tsd;
218        tDHL_PSI_ControlHandle handle = 0;
219        tDHL_PSI_Filter *f = NULL;
220        PsiTestContext ctx;
221
222        reset_ctx(&ctx);
223
224        print("section receive basic test\n");
225        print("  use all pass filter at tsd port %u\n", tsd_id);
226       
227        dhr = get_tsd(tsd_id, &tsd);
228        CHK_DHR("get tsd");
229
230        dhr = DHL_PSI_AllocGenericFilter(&f);
231
232        CHK_DHR("alloc filter");
233
234        // ¸ð´ÏÅÍ ½ÃÀÛ..
235        dhr = DHL_PSI_StartMonitor(tsd, pid,
236                ePSIMODE_SECTION, ePSIUPDATE_CONTINEOUS, f, 
237                4096, 256, PsiTest_01_Proc, (UINT32)&ctx, &handle);
238        CHK_DHR("start monitor");
239
240        DHL_OS_Delay(waitSecond*1000);
241
242        // ¸ð´ÏÅÍ ÇØÁ¦..
243        DHL_PSI_StopMonitor(handle);
244        handle = 0;
245        f = 0;
246       
247        print("\n total %u sections received\n", ctx.section_count);
248
249errexit:       
250        if (handle) DHL_PSI_StopMonitor(handle);
251        if (f) DHL_PSI_FreeFilter(f);
252
253}
254
255
256
257
258#if COMMENT
259____Test_1____(){}
260#endif
261
262
263static void PsiTest_Section_Proc(tDHL_PSI_Event event, tDHL_PSI_ControlHandle psiCtl, UINT32 userParam)
264{
265        DHL_RESULT dhr;
266        PsiTestContext *ctx = (PsiTestContext *)userParam;
267
268        if (!ctx || ctx->magic != PSI_CTX_MAGIC) {
269                print("!! invalid ctx\n");
270                return;
271        }
272       
273        if (event == ePSIEVENT_DATARECEIVED) 
274        {
275                tDHL_PSI_DataArray *data;
276                UINT8 *ptr; int len;
277                UINT32 crc_insection, crc_calculated;
278               
279                dhr = DHL_PSI_ReadPSIData(psiCtl, &data);
280                if (dhr != DHL_OK) {
281                        print("!! read psi data err %d\n", dhr);
282                        return;
283                }
284
285                memdump(data->sectPtr[0], 16, "section");
286               
287                ctx->section_count++;
288
289                ptr = data->sectPtr[0];
290                len = (((ptr[1] & 0xf)<<8UL) | ptr[2]) + 3; // tid ºÎÅÍ crc±îÁö Àüü Å©±â.
291
292                crc_insection = (ptr[len-4]<<24UL)|(ptr[len-3]<<16UL)|(ptr[len-2]<<8UL)|(ptr[len-1]);
293                crc_calculated = DHL_UTL_CalcCRC32(DHL_CRC_START, ptr, len-4);
294
295                if (crc_insection != crc_calculated) {
296                        print("!! crc in section %x != crc calculated %x, at section #%d\n",
297                                crc_insection, crc_calculated, ctx->section_count);
298                }
299               
300                if (ctx->section_count >= ctx->max_count)
301                {
302                        // ¿©±â¼­ Áß´Ü ½Ãų ¼ö ÀÖ´Â ¹æ¹ýÀº ¾øÀ½..
303                        // API»óÀ¸·Î, DHL_PSI_StopMonitor¸¦ ¾ÈÀüÇÏ°Ô È£ÃâÇÒ ¼ö ÀÖ´Â À§Ä¡´Â ¾Æ´Ï´Ù.
304                }
305               
306                // ¿©±â¼­ µ¥ÀÌÅ͸¦ È®ÀÎÇÏ´Â °ÍÀÌ ¸ñÀûÀÌ ¾Æ´Ï¹Ç·Î ±×³É free.
307                DHL_PSI_FreePSIData(data);
308        }
309}
310
311/*
312        ÁöÁ¤ÇÑ tsd, pid ¿¡¼­ ¸ðµç ¼½¼ÇÀ» ´Ù ¼ö½ÅÇÑ´Ù.
313
314        ÁöÁ¤ÇÑ ¼½¼Ç ¼ö ¸¸Å­¸¸ ¹Þ°í Áß´ÜÇÑ´Ù.
315*/
316void PsiTest_Section(UINT32 tsd_id, UINT16 pid, UINT8 tid, tDHL_PSI_Update update, UINT32 num_section)
317{
318        DHL_RESULT dhr;
319        tDHL_TSD tsd;
320        tDHL_PSI_ControlHandle handle = 0;
321        tDHL_PSI_Filter *f = NULL;
322        int waitSecond = 5;
323        PsiTestContext ctx;
324        DHL_OS_SEMA_ID mutex;
325        int i; 
326       
327        reset_ctx(&ctx);
328       
329        print("section rx test, tsd %u, pid %x, tid %x, update %d(%s), %d sections\n", 
330                tsd_id, pid, tid, update,
331                update==ePSIUPDATE_ONESHOT ? "OneShot" :
332                update==ePSIUPDATE_VERCHANGE ? "VerChg" : 
333                update==ePSIUPDATE_CRCCHANGE ? "CrcChg" :
334                update==ePSIUPDATE_CONTINEOUS ? "Cont." : "?",
335                num_section,
336                0);
337
338        dhr = get_tsd(tsd_id, &tsd);
339        CHK_DHR("get tsd");
340
341        dhr = DHL_PSI_AllocGenericFilter(&f);
342        CHK_DHR("alloc filter");
343
344
345        // ¼½¼Ç ¼ö½ÅÇÒ ÃÖ´ë Ƚ¼ö ÁöÁ¤.
346        ctx.max_count = num_section;
347
348        // ¸ð´ÏÅÍ ½ÃÀÛ..
349        dhr = DHL_PSI_StartMonitor(tsd, pid,
350                ePSIMODE_SECTION, update, f, 
351                4096, 256, PsiTest_Section_Proc, (UINT32)&ctx, &handle);
352        CHK_DHR("start monitor");
353
354        // ÁÖ±âÀûÀ¸·Î üũ¸¦ Çϸ鼭 ¿øÇÏ´Â ¼½¼Ç °¹¼ö ¼ö½Å È®ÀÎ.
355        for (i=0; i<waitSecond; i++) {
356                DHL_OS_Delay(500);
357                if (ctx.section_count >= num_section)
358                        break;
359                print("section rx count %d. wait more..\n", ctx.section_count);
360        }
361       
362        // ¸ð´ÏÅÍ ÇØÁ¦..
363        DHL_PSI_StopMonitor(handle);   
364        f = 0;
365        handle = 0;
366
367        // ½ÇÁ¦·Î ¿øÇÏ´Â ¼½¼Ç °¹¼öº¸´Ù ´õ ¸¹ÀÌ ¼ö½ÅµÉ ¼ö ÀÖÀ½.
368        print("\n=== total %u sections received\n", ctx.section_count);
369
370errexit:       
371        if (handle) DHL_PSI_StopMonitor(handle);
372        if (f) DHL_PSI_FreeFilter(f);
373       
374}
375
376
377
378#if COMMENT
379____Test_1____(){}
380#endif
381
382
383static void PsiTest_Table_Proc(tDHL_PSI_Event event, tDHL_PSI_ControlHandle psiCtl, UINT32 userParam)
384{
385        DHL_RESULT dhr;
386        PsiTestContext *ctx = (PsiTestContext *)userParam;
387        tDHL_PSI_DataArray *data;
388
389        if (!ctx || ctx->magic != PSI_CTX_MAGIC) {
390                print("!! invalid ctx\n");
391                return;
392        }
393       
394        if (event == ePSIEVENT_DATARECEIVED) 
395        {
396                tDHL_PSI_DataArray *data;
397                dhr = DHL_PSI_ReadPSIData(psiCtl, &data);
398                if (dhr) {
399                        print("!! read psi data err %d\n", dhr);
400                        ctx->data = NULL;
401                }
402                else
403                        ctx->data = data;
404                DHL_OS_GiveSemaphore(ctx->sem);
405        }
406}
407
408void PsiTest_Table(UINT32 tsd_id, UINT16 pid, UINT8 tid, tDHL_PSI_Update update)
409{
410        DHL_RESULT dhr;
411        tDHL_TSD tsd;
412        tDHL_PSI_ControlHandle handle = 0;
413        tDHL_PSI_Filter *f = NULL;
414        int waitSecond = 1;
415        PsiTestContext ctx;
416        DHL_OS_SEMA_ID sem = 0;
417       
418        reset_ctx(&ctx);
419
420        //update = ePSIUPDATE_ONESHOT;
421       
422        print("table receive test, tsd %u, pid %x, tid %x, update %u (%s)\n", 
423                tsd_id, pid, tid, update,
424                update==ePSIUPDATE_ONESHOT ? "OneShot" :
425                update==ePSIUPDATE_VERCHANGE ? "VerChg" : 
426                update==ePSIUPDATE_CRCCHANGE ? "CrcChg" :
427                update==ePSIUPDATE_CONTINEOUS ? "Cont." : "?",
428                0);
429       
430        dhr = get_tsd(tsd_id, &tsd);
431        CHK_DHR("get tsd");
432
433        dhr = DHL_PSI_AllocGenericFilter(&f);
434        CHK_DHR("alloc filter");
435       
436        f->mask[0] = tid; f->coef[0] = f->excl[0] = 0xff;
437
438        // ¼ö½Å ÅëÁö ¼¼¸¶Æ÷¾î »ý¼º.
439        sem = DHL_OS_CreateBinarySemaphore("", 0, FALSE);
440        ctx.sem = sem;
441       
442        // ¸ð´ÏÅÍ ½ÃÀÛ..
443        dhr = DHL_PSI_StartMonitor(tsd, pid,
444                ePSIMODE_TABLE, update, f, 
445                4096, 256, PsiTest_Table_Proc, (UINT32)&ctx, &handle);
446        CHK_DHR("start monitor");
447
448        f = NULL;
449        print("waiting until table rx completed..\n");
450        dhr = DHL_OS_TakeSemaphore(sem, 5000);
451        if (dhr == DHL_FAIL_TIMEOUT) {
452                print("!! table get timeout..\n");
453                goto errexit;
454        }
455        else if (dhr != DHL_OK) {
456                print("!! take sem err %d\n", dhr);
457                goto errexit;
458        }
459       
460        if (1) {
461                int i; char msg[20]; UINT8 *ptr; int len;
462                print("\n=== table received. (%d sections)\n", ctx.data->numSections);
463
464                for (i=0; i<ctx.data->numSections; i++) {
465                        sprintf(msg, "section[%d]", i);
466                        ptr = ctx.data->sectPtr[i];
467                        len = (((ptr[1] & 0xf)<<8UL) | ptr[2]) + 3; // tid ºÎÅÍ crc±îÁö Àüü Å©±â.
468                        memdump(ptr, len, msg);
469                }
470        }
471
472        if (pid == 0 && tid == 0) {
473                MPEG_PAT *pat;
474                int k;
475                dhr = ParsePAT(ctx.data, &pat);
476                if (dhr == DHL_OK) {
477                        print("pat tsid %x, v%d\n", pat->transport_stream_id, pat->version_number);
478                        for (k=0; k<pat->numPrograms; k++)
479                                print(" (%d) #0x%x, pid 0x%x\n", k, 
480                                        pat->programs[k].program_number, pat->programs[k].program_map_PID);
481                        FreePAT(pat);
482                }
483        }
484       
485errexit:       
486        if (ctx.data) DHL_PSI_FreePSIData(ctx.data);
487        if (handle) DHL_PSI_StopMonitor(handle);
488        if (sem) DHL_OS_DeleteSemaphore(sem);
489        if (f) DHL_PSI_FreeFilter(f);
490
491}
492
493
494
495#if COMMENT
496____Test_1____(){}
497#endif
498
499static tDHL_PSI_ControlHandle s_load_pat, s_load_stt, s_load_tvct, s_load_mgt, s_load_eit;
500
501void PsiTest_Load_Proc(tDHL_PSI_Event event, tDHL_PSI_ControlHandle psiCtl, UINT32 userParam)
502{
503        DHL_RESULT dhr;
504        if (event == ePSIEVENT_DATARECEIVED) {
505                tDHL_PSI_DataArray *data;
506                UINT8 *ptr; 
507                //int len;
508               
509                dhr = DHL_PSI_ReadPSIData(psiCtl, &data);
510                if (dhr != DHL_OK) {
511                        print("!! read psi data err %d\n", dhr);
512                        return;
513                }
514
515                ptr = data->sectPtr[0];
516                memdump(ptr, 16, ptr[0]==0x0 ? "pat" : 
517                                                ptr[0]==0xcd ? "stt" : "?");
518                //len = (((ptr[1] & 0xf)<<8UL) | ptr[2]) + 3; // tid ºÎÅÍ crc±îÁö Àüü Å©±â.
519
520                // ¿©±â¼­ µ¥ÀÌÅ͸¦ È®ÀÎÇÏ´Â °ÍÀÌ ¸ñÀûÀÌ ¾Æ´Ï¹Ç·Î ±×³É free.
521                DHL_PSI_FreePSIData(data);
522
523                // stt¶ó¸é ÀǵµÀûÀ¸·Î Áö¿¬À» ½ÃÄѼ­ task ¼öÇà ¼º´ÉÀ» ¹æÇØÇÑ´Ù.
524                if (userParam == 1) {
525                        print("=== stt1 intentional delay!!\n");
526                        DHL_OS_Delay(500);
527                }
528
529                print("=== user param %d..!!\n", userParam);
530
531        }
532}
533
534void PsiTest_Load_Pat()
535{
536        DHL_RESULT dhr;
537        if (s_load_pat) {
538                print("pat already run\n");
539                return;
540        }
541        dhr = MonitorPAT(DHL_DMX_GetTsd(), TRUE, FALSE, ePSIUPDATE_CONTINEOUS, 
542                PsiTest_Load_Proc, 0, &s_load_pat);
543        if (dhr)
544                print("!! monitor pat err %d\n", dhr);
545}
546
547void PsiTest_Load_Pat2()
548{
549        DHL_RESULT dhr;
550        if (s_load_pat) {
551                print("pat already run\n");
552                return;
553        }
554        dhr = MonitorPAT(DHL_DMX_GetTsd(), TRUE, FALSE, ePSIUPDATE_VERCHANGE, 
555                PsiTest_Load_Proc, 0, &s_load_pat);
556        if (dhr)
557                print("!! monitor pat err %d\n", dhr);
558}
559
560void PsiTest_Load_Stt()
561{
562        DHL_RESULT dhr;
563        if (s_load_stt) {
564                print("stt already run\n");
565                return;
566        }
567        // stt ¼ö½ÅÀÌ µÉ ¶§¿¡´Â parameter·Î 1À» Àü´ÞÇÏ¿© ƯÁ¤ µ¿ÀÛÀ» Çϵµ·Ï ÇÔ.
568        dhr = MonitorStt(DHL_DMX_GetTsd(), ePSIUPDATE_CONTINEOUS, 
569                PsiTest_Load_Proc, 1, &s_load_stt);
570        if (dhr)
571                print("!! monitor stt err %d\n", dhr);
572}
573
574void PsiTest_Load_Tvct()
575{
576        DHL_RESULT dhr;
577        if (s_load_tvct) {
578                print("tvct already run\n");
579                return;
580        }
581        dhr = MonitorTvct(DHL_DMX_GetTsd(), ePSIMODE_TABLE, ePSIUPDATE_CONTINEOUS, 
582                PsiTest_Load_Proc, 2, &s_load_tvct);
583        if (dhr)
584                print("!! monitor tvct err %d\n", dhr);
585}
586
587void PsiTest_Load_Mgt()
588{
589        DHL_RESULT dhr;
590        if (s_load_mgt) {
591                print("mgt already run\n");
592                return;
593        }
594        dhr = MonitorMgt(DHL_DMX_GetTsd(), ePSIUPDATE_CONTINEOUS, 
595                PsiTest_Load_Proc, 3, &s_load_mgt);
596        if (dhr)
597                print("!! monitor Mgt err %d\n", dhr);
598}
599
600void PsiTest_Load_Eit(UINT16 pid, UINT16 sid)
601{
602        DHL_RESULT dhr;
603        if (s_load_eit) {
604                print("eit already run\n");
605                return;
606        }
607        dhr = MonitorEit(DHL_DMX_GetTsd(), pid, sid, ePSIMODE_TABLE,
608                ePSIUPDATE_CONTINEOUS, 
609                PsiTest_Load_Proc, 4, &s_load_eit);
610        if (dhr)
611                print("!! monitor Eit err %d\n", dhr);
612}
613
614void PsiTest_Stop_Pat()
615{
616        if (s_load_pat) {
617                print("stop pat..\n");
618                DHL_PSI_StopMonitor(s_load_pat);
619                s_load_pat = 0;
620        }
621}
622
623void PsiTest_Stop_Stt()
624{
625        if (s_load_stt) {
626                print("stop stt..\n");
627                DHL_PSI_StopMonitor(s_load_stt);
628                s_load_stt = 0;
629        }               
630}
631
632void PsiTest_Stop_Tvct()
633{
634        if (s_load_tvct) {
635                print("stop tvct..\n");
636                DHL_PSI_StopMonitor(s_load_tvct);
637                s_load_tvct = 0;
638        }       
639}
640
641void PsiTest_Stop_Mgt()
642{
643        if (s_load_mgt) {
644                print("stop mgt..\n");
645                DHL_PSI_StopMonitor(s_load_mgt);
646                s_load_mgt = 0;
647        }       
648}
649
650void PsiTest_Stop_Eit()
651{
652        if (s_load_eit) {
653                print("stop eit..\n");
654                DHL_PSI_StopMonitor(s_load_eit);
655                s_load_eit = 0;
656        }       
657}
658
659#if COMMENT
660____ETT_Test____(){}
661#endif
662
663static tDHL_PSI_ControlHandle s_load_ett1, s_load_ett2;
664
665void PsiTest_Ett_Proc(tDHL_PSI_Event event, tDHL_PSI_ControlHandle psiCtl, UINT32 userParam)
666{
667        DHL_RESULT dhr;
668        if (event == ePSIEVENT_DATARECEIVED) {
669                tDHL_PSI_DataArray *data;
670                UINT8 *ptr; 
671                UINT32 etmid;
672               
673                dhr = DHL_PSI_ReadPSIData(psiCtl, &data);
674                if (dhr != DHL_OK) {
675                        print("!! read psi data err %d\n", dhr);
676                        return;
677                }
678
679                ptr = data->sectPtr[0];
680                memdump(ptr, 16, "ett");
681
682                memcpy(&etmid, &data->sectPtr[9], 4);
683
684                if (userParam != etmid) {
685                        print("!! received etmid(0x%x) is not matched to the etmid(0x%x) of filter\n", etmid, userParam);
686                }
687
688                DHL_PSI_FreePSIData(data);
689        }
690}
691
692void PsiTest_Load_Ett1(UINT16 pid, UINT16 etmid)
693{
694        DHL_RESULT dhr;
695        if (s_load_ett1) {
696                print("ett1 already run\n");
697                return;
698        }
699        dhr = MonitorEtt(DHL_DMX_GetTsd(), pid, etmid, ePSIUPDATE_CONTINEOUS, 
700                PsiTest_Ett_Proc, etmid, &s_load_ett1);
701        if (dhr)
702                print("!! monitor ett1 err %d\n", dhr);
703}
704
705void PsiTest_Load_Ett2(UINT16 pid, UINT16 etmid)
706{
707        DHL_RESULT dhr;
708        if (s_load_ett2) {
709                print("ett2 already run\n");
710                return;
711        }
712        dhr = MonitorEtt(DHL_DMX_GetTsd(), pid, etmid, ePSIUPDATE_CONTINEOUS, 
713                PsiTest_Ett_Proc, etmid, &s_load_ett2);
714        if (dhr)
715                print("!! monitor ett2 err %d\n", dhr);
716}
717
718void PsiTest_Stop_Ett1()
719{
720        if (s_load_ett1) {
721                print("stop ett1..\n");
722                DHL_PSI_StopMonitor(s_load_ett1);
723                s_load_ett1 = 0;
724        }       
725}
726
727void PsiTest_Stop_Ett2()
728{
729        if (s_load_ett2) {
730                print("stop ett2..\n");
731                DHL_PSI_StopMonitor(s_load_ett2);
732                s_load_ett2 = 0;
733        }       
734}
735
736
737void PsiTest_Load_Stop()
738{
739        if (s_load_pat) {
740                print("stop pat..\n");
741                DHL_PSI_StopMonitor(s_load_pat);
742                s_load_pat = 0;
743        }
744        if (s_load_stt) {
745                print("stop stt..\n");
746                DHL_PSI_StopMonitor(s_load_stt);
747                s_load_stt = 0;
748        }       
749        if (s_load_tvct) {
750                print("stop tvct..\n");
751                DHL_PSI_StopMonitor(s_load_tvct);
752                s_load_tvct = 0;
753        }       
754        if (s_load_mgt) {
755                print("stop mgt..\n");
756                DHL_PSI_StopMonitor(s_load_mgt);
757                s_load_mgt = 0;
758        }       
759        if (s_load_eit) {
760                print("stop eit..\n");
761                DHL_PSI_StopMonitor(s_load_eit);
762                s_load_eit = 0;
763        }       
764        if (s_load_ett1) {
765                print("stop ett1..\n");
766                DHL_PSI_StopMonitor(s_load_ett1);
767                s_load_ett1 = 0;
768        }       
769        if (s_load_ett2) {
770                print("stop ett2..\n");
771                DHL_PSI_StopMonitor(s_load_ett2);
772                s_load_ett2 = 0;
773        }       
774       
775}
776
777#if COMMENT
778____Filters____(){}
779#endif
780
781#define MAX_FILTER 256 // ÀÌ ¼ýÀÚ ¸¸Å­ Å×½ºÆ® ÇÒ °ÍÀÓ..
782
783tDHL_PSI_ControlHandle f_handle[MAX_FILTER] = {0, };
784
785void PsiTest_HowManyFilter(UINT32 tsd_id)
786{
787        DHL_RESULT dhr;
788        tDHL_TSD tsd;
789        tDHL_PSI_Filter *f = NULL;
790        int i;
791        UINT16 pid = 0x700; // pid´Â Àß »ç¿ëµÇÁö ¾ÊÀ» ¹ýÇÑ °ÍÀ¸·Î ¼±Á¤.
792       
793        PsiTestContext ctx;
794       
795        print("section filter test, try maximum %u filters at a time..\n", MAX_FILTER);
796       
797        dhr = get_tsd(tsd_id, &tsd);
798        CHK_DHR("get tsd");
799
800        memset(f_handle, 0, sizeof(f_handle));
801
802        for (i=0; i<MAX_FILTER; i++)
803        {
804                f = NULL;
805                dhr = DHL_PSI_AllocGenericFilter(&f);
806                if (dhr) {
807                        print("!! at %u th loop..\n", i);
808                        CHK_DHR("alloc filter");
809                }
810                // table_id_extension 16ºñÆ® °ø°£¿¡ i°ª »ç¿ë.
811
812                // 0   1   2   3   4  5   6  7   8     9
813                // tid sec_len tid_ex ver sn lsn proto ..
814                f->data[3] = i>>8; f->data[4] = i&0xff;
815                f->mask[3] = f->mask[4] = 0xff;
816                f->mode[3] = f->mode[4] = 0xff;
817
818                memset(&ctx, 0, sizeof(ctx));
819               
820                // ¸ð´ÏÅÍ ½ÃÀÛ..
821                dhr = DHL_PSI_StartMonitor(tsd, pid,
822                        ePSIMODE_SECTION, ePSIUPDATE_ONESHOT, f, 
823                        4096, 256, PsiTest_01_Proc, 0, &f_handle[i]);
824                if (dhr) {
825                        print("!! at %u th loop..\n", i);
826                        CHK_DHR("start monitor");
827                }
828        }
829       
830
831errexit:       
832        for (i=0; i<MAX_FILTER; i++) {
833                if (f_handle[i]) DHL_PSI_StopMonitor(f_handle[i]);
834        }
835        if (f) DHL_PSI_FreeFilter(f);
836}
837
838void PsiTest_FreeAllFilter(void);
839
840void PsiTest_ConsumeFilterExcept(UINT32 num_extra, UINT32 tsd_id)
841{
842        DHL_RESULT dhr;
843        tDHL_TSD tsd;
844        tDHL_PSI_Filter *f = NULL;
845        int i;
846        static int n_flt = 0;
847        UINT16 pid = 0x700; // pid´Â Àß »ç¿ëµÇÁö ¾ÊÀ» ¹ýÇÑ °ÍÀ¸·Î ¼±Á¤.
848       
849        PsiTestContext ctx;
850       
851        print("section filter test, try maximum %u filters at a time..\n", MAX_FILTER);
852       
853        dhr = get_tsd(tsd_id, &tsd);
854        CHK_DHR("get tsd");
855
856        memset(f_handle, 0, sizeof(f_handle));
857
858        PsiTest_FreeAllFilter();        // ÀÌÀü¿¡ µ¿ÀÛÁßÀÌ´ø ÇÊÅÍ´Â Áß´ÜÇÏ°í »õ·Î ½ÃÀÛ
859
860        for (i=0; i<MAX_FILTER; i++)
861        {
862                f = NULL;
863                dhr = DHL_PSI_AllocGenericFilter(&f);
864                if (dhr) {
865                        print("!! at %u th loop..\n", i);
866                        CHK_DHR("alloc filter");
867                }
868                // table_id_extension 16ºñÆ® °ø°£¿¡ i°ª »ç¿ë.
869
870                // 0   1   2   3   4  5   6  7   8     9
871                // tid sec_len tid_ex ver sn lsn proto ..
872                f->data[3] = i>>8; f->data[4] = i&0xff;
873                f->mask[3] = f->mask[4] = 0xff;
874                f->mode[3] = f->mode[4] = 0xff;
875
876                memset(&ctx, 0, sizeof(ctx));
877               
878                // ¸ð´ÏÅÍ ½ÃÀÛ..
879                dhr = DHL_PSI_StartMonitor(tsd, pid,
880                        ePSIMODE_SECTION, ePSIUPDATE_ONESHOT, f, 
881                        4096, 256, PsiTest_01_Proc, 0, &f_handle[i]);
882                if (dhr) {
883                        print("!! at %u th loop..\n", i);
884                        CHK_DHR("start monitor");
885                }
886                else 
887                        n_flt++;
888        }
889       
890
891errexit:       
892        for (i = 0; i < num_extra; i++) {
893                if (f_handle[i]) 
894                        DHL_PSI_StopMonitor(f_handle[i]);
895                n_flt--;
896        }
897        if (f) DHL_PSI_FreeFilter(f);
898
899        print("%d filters are enable to use..\n", num_extra);
900
901        dhl_psi_show();
902}
903
904void PsiTest_FreeAllFilter()
905{
906        int i;
907        for (i = 0; i < MAX_FILTER; i++) {
908                if (f_handle[i]) DHL_PSI_StopMonitor(f_handle[i]);
909        }
910}
911
912PsiTest_SWFilter()
913{
914        DHL_RESULT check_sw_filter(tDHL_PSI_Filter* pFilter, UINT8* buf, int len);
915
916        tDHL_PSI_Filter filter1 = {
917                /*data*/
918                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
919                0x00, 0x00, 0x00, 0x00, 0x00,
920                /*mask*/
921                0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
922                0x00, 0x00, 0x00, 0x00, 0x00,
923                /*mode*/
924                0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
925                0x00, 0x00, 0x00, 0x00, 0x00
926        };
927
928        tDHL_PSI_Filter filter2 = {
929                /*data*/
930                0xc7, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 
931                0x00, 0x00, 0x00, 0x00, 0x00,
932                /*mask*/
933                0xff, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 
934                0xff, 0x00, 0x00, 0x00, 0x00,
935                /*mode*/
936                0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
937                0xff, 0x00, 0x00, 0x00, 0x00
938        };
939
940        // ÇÊÅÍ¿Í ÀÏÄ¡µÇ´Â Å×ÀÌºí ¿¹Á¦
941        // ½ÇÁ¦ ½ºÆ®¸²À¸·Î ºÎÅÍ ÃßÃâÇÑ ³»¿ëÀÓ
942        UINT8 t_table1[] = {
943                0x00, 0xb0, 0x11, 0x08, 0x11, 0xc9, 0x00, 0x00, 
944                0x00, 0x02, 0xe0, 0x20, 0x00, 0x63, 0xe0, 0x30,
945                0x3f, 0x33, 0x40, 0x4d
946        };
947
948        // ÇÊÅÍ¿¡ ºÎÇÕÇÏÁö ¾Ê´Â Å×ÀÌºí ¿¹Á¦
949        // ½ÇÁ¦ ½ºÆ®¸²À¸·Î ºÎÅÍ ÃßÃâÇÑ ³»¿ë¿¡ pid¸¸ ´Ù¸£°Ô Á¶ÀÛ
950        UINT8 t_table2[] = {
951                0x01, 0xb0, 0x11, 0x08, 0x11, 0xc9, 0x00, 0x00, 
952                0x00, 0x02, 0xe0, 0x20, 0x00, 0x63, 0xe0, 0x30,
953                0x3f, 0x33, 0x40, 0x4d
954        };
955
956        UINT8 t_table3[] = {
957                0xc7, 0xf0, 0x11, 0x00, 0x00, 0xc9, 0x00, 0x00, 
958                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
959                0x00, 0x00, 0x00, 0x00
960        };
961
962        DHL_OS_Printf("\n\ncheck_sw_filter test start..\n\n");
963
964        // À߸øµÈ ¼½¼ÇÀ» Á¦´ë·Î °ËÃâÇÏÁö ¸øÇÏ´Â °ÍÀº ¾Æ´ÑÁö °Ë»ç
965        if (check_sw_filter(&filter1, t_table2, ((t_table2[1]&0x0f)<<8)|t_table2[2]) == DHL_OK) 
966                DHL_OS_Printf("!! check_sw_filter didn't filter out incorrect section!!\n");
967       
968        // Á¤»óÀûÀÎ ¼½¼ÇÀ» À߸øµÈ ¼½¼ÇÀ¸·Î ÆÇ´ÜÇÏ´Â °ÍÀº ¾Æ´ÑÁö °Ë»ç
969        if (check_sw_filter(&filter1, t_table1, ((t_table1[1]&0x0f)<<8)|t_table1[2]) == DHL_FAIL)
970                DHL_OS_Printf("!! check_sw_filter missed correct section!!\n");
971
972        // ´Ù¸¥ ¹öÀüÀÇ Å×À̺íÀ» Àß Ã£¾Æ³»´ÂÁö °Ë»ç
973        if (check_sw_filter(&filter2, t_table3, ((t_table3[1]&0x0f)<<8)|t_table3[2]) == DHL_FAIL)
974                DHL_OS_Printf("!! check_sw_filter missed version change!!\n");
975               
976        DHL_OS_Printf("\n\ncheck_sw_filter test end..\n\n");
977       
978}
979
980
981#if COMMENT
982____Test_1____(){}
983#endif
984
985#include "DHL_DBG.h"
986
987static DHL_SymbolTable PsiTestSymbols[] =
988{
989        //---- functions
990       
991        DHL_FNC_SYM_ENTRY(OS_DelayTest),
992        DHL_FNC_SYM_ENTRY(OS_TaskTest),
993        DHL_FNC_SYM_ENTRY(OS_MultiTaskTest),
994        DHL_FNC_SYM_ENTRY(OS_HowManyTaskTest),
995        DHL_FNC_SYM_ENTRY(OS_TaskSelfDeleteTest),
996        DHL_FNC_SYM_ENTRY(OS_InterruptTest),
997        DHL_FNC_SYM_ENTRY(OS_ISRTest_Loop),
998        DHL_FNC_SYM_ENTRY(OS_ISRTest),
999        DHL_FNC_SYM_ENTRY(OS_GetCharTest),
1000};
1001
1002void PsiTestInit()
1003{
1004        DHL_DBG_RegisterSymbols(PsiTestSymbols, DHL_NUMSYMBOLS(PsiTestSymbols));
1005
1006
1007}
1008
1009
1010
Note: See TracBrowser for help on using the repository browser.