source: svn/newcon3bcm2_21bu/dst/dmw/src/cc/cc_front.c @ 46

Last change on this file since 46 was 46, checked in by megakiss, 11 years ago

459Mhz로 OTC 주파수 변경

  • Property svn:executable set to *
File size: 31.6 KB
Line 
1
2#include "cc_config.h"
3#include "cc_type.h"
4#include "cc_def.h"
5#include "cc_private.h"
6
7
8#define MAX_NUM_SAVED_DATA 128
9
10#define DCC_ATSC_ID 0x47413934
11
12#define DCC_AFD_ID 0x44544731
13
14static struct {
15        //708
16        tDCC_DefWin rcv_dfw;
17        tDCC_WinAttr rcv_wa;
18        tDCC_PenAttr rcv_pa;
19        UINT8 saved_data[MAX_NUM_SAVED_DATA*2];
20        UINT8 num_saved_data;
21       
22        BOOL is_set_ETX;        // ETX Ä¿¸Çµå ¼ö½Å ¿©ºÎ, ETXÀÌÈÄ text(GX)¸¦ ¹«½ÃÇϱâ À§ÇØ »ç¿ë
23                                                // ETX ¼ö½Å½Ã TRUE, CxÄ¿¸Çµå ¼ö½Å½Ã FALSE
24       
25        //608
26        BOOL is_feeding_608;
27       
28        //common
29        UINT8 service_num;
30       
31        UINT32 last_rcvd_ms[eDCC_S_NUM]; //service on ¿©ºÎ¸¦ üũÇϱâ À§ÇÔ.
32
33        // callback
34        tDCC_InfoCallback info_cb;     
35} p_front_attr;
36
37
38#define ATTR(i) p_front_attr.i
39
40
41#if ENABLE_AFD
42
43static BOOL p_b_afd_on=FALSE;
44static void (*p_fn_afd_callback)(UINT8);
45static UINT8 p_afd_format=0xff;
46static UINT32 p_afd_rx_count;
47
48#if ENABLE_AFD_BARDATA
49// note that bar data implementation is on going.
50struct {
51        UINT16 top, bottom, left, right;
52} p_afd_bardata;
53
54static void (*p_fn_afd_bardata_callback)(UINT16 t, UINT16 b, UINT16 l, UINT16 r);
55#endif
56
57//#define AFD_TIMER_ID 0xafdafd
58
59//void p_afd_timer_proc(UINT32 timer, UINT32 param);
60
61void DCC_SetAFDOn(BOOL);
62BOOL DCC_GetIsAFDOn();
63void DCC_SetAFDFormat(UINT8 format);
64UINT8 DCC_GetAFDFormat();
65
66#endif
67
68#if 0
69__CC_UTIL__() {}
70#endif
71
72static UINT8 p_make_color(UINT8 r, UINT8 g, UINT8 b)
73{
74        r=r>=2?1:0;
75        g=g>=2?1:0;
76        b=b>=2?1:0;
77       
78        return r | (g<<1) | (b<<2);
79}
80void p_bit_reverse( UINT8 src, UINT8 *dest )
81{
82        *dest = (src << 7) + ((src & 0x2) << 5) + ((src & 0x4) << 3)
83                + ((src & 0x8) << 1) + ((src & 0x10) >> 1) + ((src & 0x20) >> 3)
84                + ((src & 0x40) >> 5) + ((src & 0x80) >> 7);
85}
86
87
88BOOL p_check_parity_error(BOOL bOddParity,UINT8 ch_char)
89{
90        //leon 2004.04.19 NTSC CC´Â odd parity¸¦ °¡Á®¾ß µÈ´Ù.
91        //
92                BOOL bReturn=FALSE;
93                BOOL bOdd=0;
94                int parity=0;
95                int i;
96               
97                for(i=0;i<8;i++){
98                        parity+=(ch_char>>i)&0x01;
99                }
100                bOdd=parity%2;
101               
102                if(bOddParity && !bOdd){//odd parity
103                        bReturn=TRUE;//parity error
104                }else if(!bOddParity && bOdd){//even parity
105                        bReturn=TRUE;//parity error
106                }
107//              dcm_Print( "p err!\n" );
108                return bReturn;
109}
110
111
112#if 0 // zooyouny 100701 : »ç¿ëµÇ´Â °÷ÀÌ ¾øÀ½
113static int p_get_cmd_len(UINT8 cmd) {
114       
115        return 0;       
116}
117#endif
118
119
120#if 0
121__708_CC_PARSE__() {}
122#endif
123
124static int p_parse_c0(UINT8 *data, int size)
125{
126        int idx=0;
127       
128        CCPRINT("parse708", "Parse C0(%s)\n", CC_C0_NAME(data[idx]));
129       
130        ATTR(is_set_ETX) = FALSE;
131
132        switch(data[idx])
133        {
134                case eDCC_C0_NUL :
135                        //Àü´ÞÇÏÁö ¾ÊÀ½.
136                        break;
137                case eDCC_C0_ETX :
138                        //ATTR(is_set_ETX) = TRUE;
139                        //etx´Â ´ÙÀ½ command°¡ ¿Ã ¶§±îÁö ¹öÆÛ¿¡ ÀÖ´Â data¸¦ ¸ðµÎ flushÇÔ
140                        //µû¶ó¼­ µ¥ÀÌÅͰ¡ ¿Ã ¶§¸¶´Ù »Ñ·ÁÁÖ´Â ½Ã½ºÅÛ¿¡¼­´Â Àǹ̾ø´Â commandÀÓ
141                        break;
142                case eDCC_C0_BS :
143                case eDCC_C0_FF :
144                case eDCC_C0_CR :
145                case eDCC_C0_HCR :
146                        DCCExec_ProcessMsg(eCMD_C0, 0, data[idx], 0);
147                        break;
148               
149                case eDCC_C0_P16 :
150                        if(size<3) return -1;
151                               
152#if USE_KOR_CC
153                       
154                        /* °¡²û ÀÌÀü packet¿¡ 0x18Äڵ尡 ¿ÔÀ¸¸é¼­ ´Ù½Ã ¹Ýº¹Çؼ­ 0x18ÀÌ ¿À´Â °æ¿ì ÀÖÀ½
155                                 ÀÌ °æ¿ì¿¡ ´ëÇØ¼­ ¿¹¿Ü 󸮸¦ ÇØ¾ßÇÔ
156                        */
157#if USE_MODIFY_P16
158                        if(data[idx+1]==eDCC_C0_P16) {
159                                CCPRINT("parse708", "contineous p16 code\n");
160                                return 1;
161                        }
162#endif
163                       
164                        DCCExec_ProcessMsg(eCMD_GX, eDCC_OPT_P16, data[idx+1]<<8 | data[idx+2], 0);
165#endif
166                        idx+=2;
167                        break;
168               
169                default:
170                       
171                        if(data[idx]<0x10) idx=1;
172                        else if(data[idx]<0x18) idx=2;
173                        else idx=3;
174                               
175                        if(size<idx) return -1;
176                       
177                        return idx;
178        }
179        return idx+1;
180}
181
182static int p_parse_c1(UINT8 *data, UINT8 size)
183{
184        int idx=0;
185       
186        CCPRINT("parse708", "Parse -C1-(%s)\n", CC_C1_NAME(data[idx]));
187       
188        ATTR(is_set_ETX) = FALSE;
189
190        switch(data[idx]) 
191        {
192                case eDCC_C1_CW0 :
193                case eDCC_C1_CW1 :
194                case eDCC_C1_CW2 :
195                case eDCC_C1_CW3 :
196                case eDCC_C1_CW4 :
197                case eDCC_C1_CW5 :
198                case eDCC_C1_CW6 :
199                case eDCC_C1_CW7 :
200                       
201                        DCCExec_ProcessMsg(eCMD_CWX, 0, data[idx]&0x7, 0);
202                        break;
203               
204                case eDCC_C1_DF0 :
205                case eDCC_C1_DF1 :
206                case eDCC_C1_DF2 :
207                case eDCC_C1_DF3 :
208                case eDCC_C1_DF4 :
209                case eDCC_C1_DF5 :
210                case eDCC_C1_DF6 :
211                case eDCC_C1_DF7 :
212                        //ÃÖ¼Ò size 6ÀÌ ´õ ÇÊ¿äÇÔ
213                        //return °ª¿¡ ´ëÇÑ ÀçÁ¤ÀÇ ÇÊ¿äÇÔ. -1À̸é 󸮵ÇÁö ¾ÊÀ½À» ÀǹÌ
214                        if(size<7) return -1;
215                               
216                        ATTR(rcv_dfw).id=data[idx]&0x7;
217                        ATTR(rcv_dfw).p=data[++idx]&0x7;
218                        ATTR(rcv_dfw).cl=(data[idx]&0x8)>>3;
219                        ATTR(rcv_dfw).rl=(data[idx]&0x10)>>4;
220                        ATTR(rcv_dfw).v=(data[idx]&0x20)>>5;
221                        ATTR(rcv_dfw).av=data[++idx]&0x7f;
222                        ATTR(rcv_dfw).rp=(data[idx]&0x80)>>7;
223                        ATTR(rcv_dfw).ah=data[++idx];
224                        ATTR(rcv_dfw).rc=data[++idx]&0xf;
225                        ATTR(rcv_dfw).ap=(data[idx]&0xf0)>>4;
226                        ATTR(rcv_dfw).cc=data[++idx]&0x3f;
227                        ATTR(rcv_dfw).ps=data[++idx]&0x7;
228                        ATTR(rcv_dfw).ws=(data[idx]&0x38)>>3;
229                       
230                        CCPRINT("parse708ex", "\tid(%d), p(%d), cl(%d), rl(%d)\n",
231                                ATTR(rcv_dfw).id, ATTR(rcv_dfw).p, ATTR(rcv_dfw).cl, ATTR(rcv_dfw).rl);
232                        CCPRINT("parse708ex", "\tv(%d), av(%d), rp(%d), ah(%d)\n",
233                                ATTR(rcv_dfw).v, ATTR(rcv_dfw).av, ATTR(rcv_dfw).rp, ATTR(rcv_dfw).ah);
234                        CCPRINT("parse708ex", "\trc(%d), ap(%d), cc(%d), ps(%d)\n",
235                                ATTR(rcv_dfw).rc, ATTR(rcv_dfw).ap, ATTR(rcv_dfw).cc, ATTR(rcv_dfw).ps);
236                        CCPRINT("parse708ex", "\tws(%d)\n", ATTR(rcv_dfw).ws);
237                               
238                        DCCExec_ProcessMsg(eCMD_DFX, 0, (UINT32)&ATTR(rcv_dfw), 0);
239                       
240                        break;
241               
242                case eDCC_C1_CLW :
243                       
244                        if(size<2) return -1;
245                        //ÇØ´ç windowÀÇ ¹è°æÀ» Áö¿î´Ù.
246                       
247                        CCPRINT("parse708ex", "\twin(0x%x)\n", data[idx+1]);
248                       
249                        DCCExec_ProcessMsg(eCMD_CLW, 0, data[++idx], 0);
250                       
251                        break;
252               
253                case eDCC_C1_DLW :
254                        if(size<2) return -1;
255                       
256                        CCPRINT("parse708ex", "\twin(0x%x)\n", data[idx+1]);
257                       
258                        DCCExec_ProcessMsg(eCMD_DLW, 0, data[++idx], 0);
259                        break;
260               
261                case eDCC_C1_DSW :
262                        if(size<2) return -1;
263                               
264                        CCPRINT("parse708ex", "\twin(0x%x)\n", data[idx+1]);
265                       
266                        DCCExec_ProcessMsg(eCMD_DSW, 0, data[++idx], 0);
267                        break;
268               
269                case eDCC_C1_HDW :
270                        if(size<2) return -1;
271                               
272                        CCPRINT("parse708ex", "\twin(0x%x)\n", data[idx]);
273                       
274                        DCCExec_ProcessMsg(eCMD_HDW, 0, data[++idx], 0);
275                        break;
276               
277                case eDCC_C1_TGW :
278                        if(size<2) return -1;
279                               
280                        CCPRINT("parse708ex", "\twin(0x%x)\n", data[idx]);
281                       
282                        DCCExec_ProcessMsg(eCMD_TGW, 0, data[++idx], 0);
283                        break;
284               
285                case eDCC_C1_SWA :
286                        if(size<5) return -1;
287                        idx++;
288                        ATTR(rcv_wa).fc=
289                                p_make_color((data[idx]&0x30)>>4, (data[idx]&0xc)>>2, data[idx]&0x3);
290                        ATTR(rcv_wa).fo=(data[idx]&0xc0)>>6;
291                        idx++;
292                        ATTR(rcv_wa).bc=
293                                p_make_color((data[idx]&0x30)>>4, (data[idx]&0xc)>>2, data[idx]&0x3);
294                        ATTR(rcv_wa).bt=(data[idx]&0xc0)>>6 | (data[idx+1]&0x80)>>5;
295                        ATTR(rcv_wa).j=data[++idx]&0x3;
296                        ATTR(rcv_wa).sd=(data[idx]&0xc)>>2;
297                        ATTR(rcv_wa).pd=(data[idx]&0x30)>>4;
298                        ATTR(rcv_wa).ww=(data[idx]&0x40)>>6;
299                        ATTR(rcv_wa).de=data[++idx]&0x3;
300                        ATTR(rcv_wa).ed=(data[idx]&0xc)>>2;
301                        ATTR(rcv_wa).es=(data[idx]&0xf0)>>4;
302                       
303                        CCPRINT("parse708ex", "\tfc(%d), fo(%d), bc(%d), bt(%d)\n",
304                                ATTR(rcv_wa).fc, ATTR(rcv_wa).fo, ATTR(rcv_wa).bc, ATTR(rcv_wa).bt);
305                        CCPRINT("parse708ex", "\tj(%d), sd(%d), pd(%d), ww(%d)\n",
306                                ATTR(rcv_wa).j, ATTR(rcv_wa).sd, ATTR(rcv_wa).pd, ATTR(rcv_wa).ww);
307                        CCPRINT("parse708ex", "\tde(%d), ed(%d), es(%d)\n",
308                                ATTR(rcv_wa).de, ATTR(rcv_wa).ed, ATTR(rcv_wa).es);
309                       
310                        DCCExec_ProcessMsg(eCMD_SWA, 0, (UINT32)&ATTR(rcv_wa), 0);
311                        break;
312               
313                case eDCC_C1_SPA :
314                        if(size<3) return -1;
315                               
316                        ATTR(rcv_pa).s=data[++idx]&0x3;
317                        ATTR(rcv_pa).o=(data[idx]&0xc)>>2;
318                        ATTR(rcv_pa).tt=(data[idx]&0xf0)>>4;
319                        ATTR(rcv_pa).fs=data[++idx]&0x7;
320                        ATTR(rcv_pa).et=(data[idx]&0x38)>>3;
321                        ATTR(rcv_pa).u=(data[idx]&0x40)>>6;
322                        ATTR(rcv_pa).i=(data[idx]&0x80)>>7;
323                       
324                        CCPRINT("parse708ex", "\ts(%d), o(%d), tt(%d), fs(%d)\n",
325                                ATTR(rcv_pa).s, ATTR(rcv_pa).o, ATTR(rcv_pa).tt, ATTR(rcv_pa).fs);
326                        CCPRINT("parse708ex", "\tet(%d), u(%d), i(%d)\n",
327                                ATTR(rcv_pa).et, ATTR(rcv_pa).u, ATTR(rcv_pa).i);
328                       
329                        DCCExec_ProcessMsg(eCMD_SPA, 0, (UINT32)&ATTR(rcv_pa), 0);
330                        break;
331                       
332                case eDCC_C1_SPC :
333                        if(size<4) return -1;
334                               
335                        idx++;
336                        ATTR(rcv_pa).fc=
337                                p_make_color((data[idx]&0x30)>>4, (data[idx]&0xc)>>2, data[idx]&0x3);
338                        ATTR(rcv_pa).fo=(data[idx]&0xc0)>>6;
339                        idx++;
340                        ATTR(rcv_pa).bc=
341                                p_make_color((data[idx]&0x30)>>4, (data[idx]&0xc)>>2, data[idx]&0x3);
342                        ATTR(rcv_pa).bo=(data[idx]&0xc0)>>6;
343                        idx++;
344                        ATTR(rcv_pa).ec=
345                                p_make_color((data[idx]&0x30)>>4, (data[idx]&0xc)>>2, data[idx]&0x3);
346                       
347                        CCPRINT("parse708ex", "\tfc(%d), fo(%d), bc(%d), bo(%d)\n",
348                                ATTR(rcv_pa).fc, ATTR(rcv_pa).fo, ATTR(rcv_pa).bc, ATTR(rcv_pa).bo);
349                        CCPRINT("parse708ex", "\tec(%d)\n", ATTR(rcv_pa).ec);
350                       
351                        DCCExec_ProcessMsg(eCMD_SPC, 0, (UINT32)&ATTR(rcv_pa), 0);
352                        break;
353               
354                case eDCC_C1_SPL :
355                        if(size<3) return -1;
356                               
357                        CCPRINT("parse708ex", "\tspl row(%d), col(%d)\n",
358                                data[idx+1]&0xf, data[idx+2]&0x3f);
359                       
360                        DCCExec_ProcessMsg(eCMD_SPL, 0, data[idx+1]&0xf, data[idx+2]&0x3f);
361                        idx+=2;
362                        break;
363               
364                case eDCC_C1_DLY :
365                        if(size<2) return -1;
366                               
367                        CCPRINT("parse708ex", "\tdly(%d)\n", data[idx+1]);
368                       
369                        DCCExec_ProcessMsg(eCMD_DLY, 0, data[++idx], 0);
370                        break;
371               
372                case eDCC_C1_DLC :
373                        DCCExec_ProcessMsg(eCMD_DLC, 0, 0, 0);
374                        break;
375                       
376                case eDCC_C1_RST :
377                        DCCExec_ProcessMsg(eCMD_RST, 0, 0, 0);
378                        break;
379               
380                default:
381                        ;//±×´ë·Î ó¸®ÇÏ¸é µÊ.
382               
383        }
384       
385        return idx+1;
386}
387
388static int p_parse_c2(UINT8 *data, int size)
389{
390        int idx=0;
391       
392        ATTR(is_set_ETX) = FALSE;
393
394        if(data[idx]<0x8) idx=1;
395        else if(data[idx]<0x10) idx=2;
396        else if(data[idx]<0x18) idx=3;
397        else idx=4;
398               
399        if(size<idx) return -1;
400       
401        return idx;
402}
403
404static int p_parse_c3(UINT8 *data, int size)
405{
406        int idx=0;
407       
408        ATTR(is_set_ETX) = FALSE;
409
410        if(data[idx]<0x88) idx=5;
411        else if(data[idx]<0x90) idx=6;
412        else {
413                if(size<2) return -1;
414                idx=(data[idx+1]&0x3f)+2;
415        }
416       
417        if(size<idx) return -1;
418       
419        return idx;
420}
421
422static int p_parse_g0(UINT8 *data, int size)
423{
424        if (ATTR(is_set_ETX) == FALSE) {
425//              if(data[0]==0x7f) //0x7f -> 0x5ff·Î º¯°æÇÔ.
426//                      DCCExec_ProcessMsg(eCMD_GX, 0, 0x5ff, 0);
427//              else
428                        DCCExec_ProcessMsg(eCMD_GX, 0, data[0], 0);
429        }
430        return 1;
431}
432
433static int p_parse_g1(UINT8 *data, int size)
434{
435        if (ATTR(is_set_ETX) == FALSE)
436                DCCExec_ProcessMsg(eCMD_GX, 0, data[0], 0);
437        return 1;
438}
439
440static int p_parse_g2(UINT8 *data, int size)
441{
442        //g2 ÄÚµå Áß »ç¿ëµÇÁö ¾Ê´Â ÄÚµå´Â ¹«½Ã¸¦ ÇØ¾ß ÇÔ.
443        //0x500¹ø´ë´Â »ç¿ëµÇÁö ¾ÊÀ½..
444        static UINT8 used[]=
445        {
446                0x20, 0x21, 0x25, 0x2a, 0x2c, 0x30, 
447                0x31, 0x32, 0x33, 0x34, 0x35, 0x39, 0x3a, 0x3c, 0x3d, 0x3f,
448                0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f
449        };
450       
451        int i;
452        BOOL bmatched=FALSE;
453       
454        for(i=0; i<sizeof(used)/sizeof(used[0]); i++) {
455                if(data[0]==used[i]) {
456                        bmatched=TRUE;
457                        break;
458                }
459        }
460       
461        if(bmatched && ATTR(is_set_ETX) == FALSE)
462                DCCExec_ProcessMsg(eCMD_GX, 0, data[0]|0x500, 0);
463
464        return 1;
465}
466
467static int p_parse_g3(UINT8 *data, int size)
468{
469        //0x500¹ø´ë´Â »ç¿ëµÇÁö ¾ÊÀ½..
470        static UINT8 used[]=
471        {
472                0xa0, 0x00, 0x00, 0x00
473        };
474       
475        int i;
476        BOOL bmatched=FALSE;
477       
478        for(i=0; i<sizeof(used)/sizeof(used[0]); i++) {
479                if(data[0]==used[i]) {
480                        bmatched=TRUE;
481                        break;
482                }
483        }
484       
485        if(bmatched && ATTR(is_set_ETX) == FALSE)
486                DCCExec_ProcessMsg(eCMD_GX, 0, data[0]|0x500, 0);
487        return 1;
488}
489
490
491int p_parse_708(UINT8 *data, int size)
492{
493        int idx;
494        int code_region;
495        int parse_ret=0;
496       
497        CCPRINT("parse708", "size:%d\n", size);
498       
499        if(ATTR(num_saved_data)+size>=MAX_NUM_SAVED_DATA) {
500                //buffer is full
501                CCPRINT("warn", "buffer is full(saved size : %d, in size : %d\n", 
502                        ATTR(num_saved_data), size);
503                DCCExec_ProcessMsg(eCMD_BUF_FULL, 0, 0, 0);
504        }
505
506        //¿ì¼± saved data¿¡ ÀúÀåÇÑ ÈÄ Ã³¸®Çϵµ·Ï ÇÔ
507        memcpy(ATTR(saved_data)+ATTR(num_saved_data), data, size);
508        ATTR(num_saved_data)+=size;
509       
510        for(idx=0; idx<ATTR(num_saved_data);) 
511        {
512                if(ATTR(saved_data)[idx]==eDCC_C0_EXT1) {
513                        if(ATTR(saved_data)[++idx]<0x20)    code_region=eDCC_CR_C2;
514                        else if(ATTR(saved_data)[idx]<0x80) code_region=eDCC_CR_G2;
515                        else if(ATTR(saved_data)[idx]<0xa0) code_region=eDCC_CR_C3;
516                        else                                code_region=eDCC_CR_G3;
517                }
518                else if(ATTR(saved_data)[idx]<0x20) code_region=eDCC_CR_C0;
519                else if(ATTR(saved_data)[idx]<0x80) code_region=eDCC_CR_G0;
520                else if(ATTR(saved_data)[idx]<0xa0) code_region=eDCC_CR_C1;
521                else                                code_region=eDCC_CR_G1;
522                       
523                CCPRINT("parse708", "code region : %s\n", CC_CR_NAME(code_region));
524
525                switch(code_region) {
526                        case eDCC_CR_C0 :
527                                parse_ret=p_parse_c0(&ATTR(saved_data)[idx], ATTR(num_saved_data)-idx);
528                                break;
529                       
530                        case eDCC_CR_C1 :
531                                parse_ret=p_parse_c1(&ATTR(saved_data)[idx], ATTR(num_saved_data)-idx);
532                                break;
533                       
534                        case eDCC_CR_C2 :
535                                parse_ret=p_parse_c2(&ATTR(saved_data)[idx], ATTR(num_saved_data)-idx);
536                                break;
537                       
538                        case eDCC_CR_C3 :
539                                parse_ret=p_parse_c3(&ATTR(saved_data)[idx], ATTR(num_saved_data)-idx);
540                                break;
541                               
542                        case eDCC_CR_G0 :
543                                parse_ret=p_parse_g0(&ATTR(saved_data)[idx], ATTR(num_saved_data)-idx);
544                                break;
545                       
546                        case eDCC_CR_G1 :
547                                parse_ret=p_parse_g1(&ATTR(saved_data)[idx], ATTR(num_saved_data)-idx);
548                                break;
549                       
550                        case eDCC_CR_G2 :
551                                parse_ret=p_parse_g2(&ATTR(saved_data)[idx], ATTR(num_saved_data)-idx);
552                                break;
553                       
554                        case eDCC_CR_G3 :
555                                parse_ret=p_parse_g3(&ATTR(saved_data)[idx], ATTR(num_saved_data)-idx);
556                                break;
557                       
558                }
559               
560                if(parse_ret==-1) {
561                        //return°ªÀÌ -1À̸é size°¡ À۾Ƽ­ ó¸®ÇÏÁö ¸øÇß´Ù´Â °ÍÀ» ¶æÇÔ.
562                        memmove(ATTR(saved_data), &ATTR(saved_data)[idx], ATTR(num_saved_data));
563                        break;
564                }
565                else
566                        idx+=parse_ret;
567        }
568        ATTR(num_saved_data)-=idx;
569        //󸮸¦ ´Ù ÇßÀ½..
570        return 0;
571}
572
573
574#if 0
575__608_CC_PARSE__() {}
576#endif
577
578static void p_parse_608_data(BOOL field, UINT8 d1, UINT8 d2)
579{
580        //±×´ë·Î ³Ñ±è
581        DCCExec_Process608(d1, d2);
582}
583
584
585#if 0
586__CC_DEMUX__() {}
587#endif
588
589static int p_demux_708_data(UINT8 *data, int size)
590{
591        static int prev_seq_no=-1;
592        int seq_no=data[0]>>6;
593        int pkt_size=data[0]&0x3f;
594        int idx;
595        int blk_size, service_num;
596       
597        CCPRINT("dmx708", "size : %d, pkt_size:%d\n", size, pkt_size);
598       
599        CCPRINT("dmx708", "prev_seq_no:%d, seq_no:%d\n", prev_seq_no, seq_no);
600       
601        if(prev_seq_no!=-1 && (prev_seq_no+1)%4!=seq_no) {
602               
603                CCPRINT("warn", "seq num error(prev(%d), cur(%d)\n", prev_seq_no, seq_no);
604#if IGNORE_SEQ_NUM==0
605                //bad seq no..Update ÇÊ¿äÇÔ.
606                prev_seq_no=-1;
607               
608                //ÇöÀç ¸ðµç »óŸ¦ ÃʱâÈ­ÇÔ.--> ÇöÀç »óŰ¡ 708ÀÏ °æ¿ì¸¸.
609                if(ATTR(service_num)>=eDCC_S_CS1 && ATTR(service_num)<=eDCC_S_CS6) {
610                        DCCExec_ProcessMsg(eCMD_RST, 0, 0, 0);
611                }
612                       
613                return -1;
614#endif 
615        }
616               
617        prev_seq_no=seq_no;
618               
619        if(pkt_size==0){
620                pkt_size=127;
621        }
622        else pkt_size=pkt_size*2-1;
623
624
625        if(pkt_size > size-1) { /* ½ÇÁ¦º¸´Ù Àû°Ô ¹ÞÀº °æ¿ì */
626#if DISCARD_UNCORRECTED_PKT_SIZE
627                //À߸øµÈ packetÀ̹ǷΠ¹ö¸²
628                CCPRINT("dmx708", "packet size is bad(hdr len(%d), rcvd_len(%d)\n", pkt_size, size);
629                return -1;
630#else
631                //neverdai. pkt size º¸´Ù size°¡ ÀÛÀ» ¶§ pkt_size¸¦ Á¶Á¤ÇØ¾ß ÇÔ.
632                pkt_size=size-1;
633                CCPRINT("dmx708", "calculate packet size again!!\n");
634#endif
635        }
636        else if(pkt_size < size-1) { /* ½ÇÁ¦º¸´Ù ¸¹ÀÌ ¹ÞÀº °æ¿ì */
637#if DISCARD_UNCORRECTED_PKT_SIZE
638                CCPRINT("dmx708", "packet size is bad(hdr len(%d), rcvd_len(%d)\n", pkt_size, size);
639                return -1;
640#else
641                //neverdai. pkt size º¸´Ù size°¡ ÀÛÀ» ¶§ pkt_size¸¦ Á¶Á¤ÇØ¾ß ÇÔ.
642                pkt_size=size-1;
643                CCPRINT("dmx708", "calculate packet size again!!\n");
644#endif         
645        }
646       
647        for(idx=1; idx<pkt_size+1;) 
648        {
649                blk_size=data[idx]&0x1f;
650                service_num=data[idx++]>>5;
651               
652                if(service_num==0x7 && blk_size!=0) {
653                        service_num=data[idx++]&0x3f;
654#if DISCARD_WHEN_BAD_EXT_SERVICE_NUM
655                        if(service_num<=6) {
656                                idx+=blk_size;
657                                CCPRINT("warn", "demux_708 service number is not fair!!\n");
658                                continue;
659                        }       
660#endif
661                }
662               
663                if(service_num==0) {
664                        if(blk_size==0) break;//null service block hdr
665#if DISCARD_WHEN_BAD_NULL_BLOCK
666                        else break;
667#endif
668                }
669               
670                CCPRINT("dmx708", "service num : %d, size : %d\n", service_num, blk_size);
671
672                if(blk_size>pkt_size+1-idx) {
673#if DISCARD_WHEN_PACKET_BLOCK_MISMATCH
674                        CCPRINT("dmx708", "block size and packet size is not matched..\n");     
675                        break;
676#else
677                        blk_size=pkt_size+1-idx; //blk_size Á¶Àý.
678#endif
679                }
680               
681                //¼³Á¤µÈ service¸¸ ó¸®ÇÔ.
682                if(ATTR(service_num)-eDCC_S_CS1+1==service_num) {
683                       
684                        //DCCExec_ProcessMsg(eCMD_SERVICE_ON, 0, service_num, 0);
685                        p_parse_708(&data[idx], blk_size);
686                       
687                        DCCMain_SendCmd(eCMD_SET_TIMER, eDCC_OPT_TIMER_ONESHOT, 
688                                TIMER_ID_CLEAR_SCREEN, TIMER_CLEAR_SCREEN_DURATION);
689                }
690               
691                if(service_num>=1 && service_num<=6)
692                        ATTR(last_rcvd_ms)[eDCC_S_CS1+service_num-1]=DCCDDI_GetCurMs();
693               
694                idx+=blk_size;
695        }       
696       
697        return 0;
698}
699
700
701static BOOL p_checksum_byte(UINT8 data)
702{
703        int i;
704        int sum;
705       
706        for(i=0, sum=0; i<8; i++) {
707                sum+=(data>>i)&0x1;
708        }
709       
710        if(sum&0x1) //odd
711                return TRUE;
712               
713        return FALSE;
714}
715       
716
717static void p_demux_608_data(UINT8 field, UINT8 d1, UINT8 d2)
718{
719        static int rcv_sm[2]={eDCC_S_NONE, eDCC_S_NONE};
720       
721        if(!p_checksum_byte(d1) || !p_checksum_byte(d2)) {
722                CCPRINT("warn", "608 byte checksum error(d1:%x,d2:%x)\n", d1, d2);
723                return;
724        }
725       
726        d1=(d1&(~0x80));
727        d2=(d2&(~0x80));
728       
729        if(d1==0 && d2==0) return;
730        if(d1==0xff && d2==0xff) return;
731
732        CCPRINT("dmx608", "demux 608 data(field:%d, 0x%x,0x%x)\n", field, d1, d2);
733       
734        if(field>1) field=1;
735       
736        if(d1>=0x10 && d1<0x20)
737        {
738                if(d2==eDCC_C_RU2 || d2==eDCC_C_RU3 || d2==eDCC_C_RU4 || d2==eDCC_C_RCL || d2==eDCC_C_RDC) {
739                        //CC Mode
740                        if(d1==0x14 && field==0) rcv_sm[field]=eDCC_S_CC1;
741                        else if(d1==0x1c && field==0) rcv_sm[field]=eDCC_S_CC2;
742                        else if(d1==0x15 && field==1) rcv_sm[field]=eDCC_S_CC3;
743                        else if(d1==0x1d && field==1) rcv_sm[field]=eDCC_S_CC4;
744                        else if(d1==0x14 || d1==0x1c || d1==0x15 || d1==0x1d)
745                                rcv_sm[field]=eDCC_S_NONE;
746                }
747                else if(d2==eDCC_C_TR || d2==eDCC_C_RTD) {
748                        //Text Mode
749                        if(d1==0x14 && field==0) rcv_sm[field]=eDCC_S_T1;
750                        else if(d1==0x1c && field==0) rcv_sm[field]=eDCC_S_T2;
751                        else if(d1==0x15 && field==1) rcv_sm[field]=eDCC_S_T3;
752                        else if(d1==0x1d && field==1) rcv_sm[field]=eDCC_S_T4;
753                        else if(d1==0x14 || d1==0x1c || d1==0x15 || d1==0x1d)
754                                rcv_sm[field]=eDCC_S_NONE;
755                }
756               
757                if(rcv_sm[field]==eDCC_S_NONE) {
758                        //󸮸¦ ÇÒ Çʿ䰡 ¾øÀ½.
759                        CCPRINT("dmx608", "receive service mode is none\n");
760                        return;
761                }
762        }
763        else if(d1<0x10)
764        {
765#if ENABLE_XDS
766                //xds Mode
767                if(field==1) {
768                        //todo xds ó¸®
769                }
770#endif
771               
772                return;
773
774        }
775       
776        ATTR(last_rcvd_ms)[rcv_sm[field]]=DCCDDI_GetCurMs(); //¹ÞÀº ½Ã°¢ ÀúÀå
777       
778        if(rcv_sm[field]==ATTR(service_num)) {
779                p_parse_608_data(field, d1, d2);
780               
781                DCCMain_SendCmd(eCMD_SET_TIMER, eDCC_OPT_TIMER_ONESHOT, 
782                                TIMER_ID_CLEAR_SCREEN, TIMER_CLEAR_SCREEN_DURATION_608);
783        }
784       
785}
786
787
788#if 0
789__PICTURE_UD__() {}
790#endif
791
792static void p_print_pic_ud(tDCC_PicUDRaw *pic_ud_raw)
793{
794        int i;
795        UINT8 *buf=pic_ud_raw->data;
796        BOOL is_print=FALSE;
797
798#if 0   
799        for(i=0, is_print=FALSE; i<(buf[5]&0x1f); i++) {
800                if(((buf[7+i*3]&0x7)==0x7) || ((buf[7+i*3]&0x7)==0x6)) {is_print=TRUE; break;}
801        }
802
803        if(!is_print) return;
804#endif
805       
806        CCPRINT("ud2", "====================================================\n");
807        CCPRINT("ud3", "ATSC_ID : [%02x %02x %02x %02x], type : [%02x], cc_cnt : %d\n",
808                buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]&0x1f);
809       
810        for(i=0; i<(buf[5]&0x1f); i++) {
811               
812                if(7+i*3+2>=pic_ud_raw->size) {
813                        CCPRINT("udex2", "[%d/%d]size is small(size:%d)\n", i, buf[5]&0x1f, pic_ud_raw->size);
814                        break;
815                }
816               
817                if(!(buf[7+i*3]&0x4)) {
818                        CCPRINT("udex3", "invalid(0x%x)\n", buf[7+i*3]);
819                        //continue;
820                }
821                else if((buf[7+i*3]&0x3)==0x3) {
822                        CCPRINT("ud", "--> CC START : cnt[%d][%02x %02x %02x]\n", 
823                                buf[5]&0x1f, buf[7+i*3], buf[7+i*3+1], buf[7+i*3+2]);
824                        CCPRINT("ud1", "  SeqNum : %d, PktSize : %d\n", buf[7+i*3+1]>>6, (buf[7+i*3+1]&0x3f)*2-1);
825                        CCPRINT("ud1", "  service num : %d, block_size : %d\n", buf[7+i*3+2]>>5, buf[7+i*3+2]&0x1f);
826                }
827                else if((buf[7+i*3]&0x3)==0x2) {
828                        CCPRINT("ud", " ++ CC DATA : [%d/%d][%02x %02x %02x]\n", 
829                                i, buf[5]&0x1f, buf[7+i*3], buf[7+i*3+1], buf[7+i*3+2]);
830                }
831                else {
832                        CCPRINT("ud2", " ++ CC EXT : [%d/%d][%02x %02x %02x]\n", 
833                                i, buf[5]&0x1f, buf[7+i*3], buf[7+i*3+1], buf[7+i*3+2]);
834                }
835        }
836       
837        CCPRINT("udex3", "====================================================\n");
838       
839}
840
841static int p_parse_pic_ud(tDCC_PicUDRaw *pic_ud_raw, tDCC_PicUD *pic_ud)
842{
843        UINT32 temp;
844        int i;
845
846#if ENABLE_AFD
847        UINT8 tmpBuf[2];
848#endif
849       
850        DCCUtil_InitBitBuf(pic_ud_raw->data, pic_ud_raw->size);
851
852        CCPRINT("parse_ud", "(id:%d)parse pic ud(size : %d)\n", pic_ud_raw->ms_rcv, pic_ud_raw->size);
853
854        p_print_pic_ud(pic_ud_raw);
855       
856        if(DCCUtil_CheckBits(32)) return -1;
857               
858        if(DCCUtil_NextBits(32)==DCC_ATSC_ID) {
859                DCCUtil_GetBits(32); //ATSC_ID
860               
861                if(DCCUtil_CheckBits(8)) return -1;
862               
863                temp=DCCUtil_GetBits(8); //User data type code
864               
865                if(temp==0x3) {
866                        pic_ud->ud_type=eDCC_UD_TC_708;
867                }
868                else if(temp==0x4) {
869                        pic_ud->ud_type=eDCC_UD_TC_608;
870                }
871                else {
872                        pic_ud->ud_type=eDCC_UD_TC_UNKNOWN;
873                        CCPRINT("parse_ud", "!! pic user data type code is not supported(type:0x%x)\n", temp);
874                        return -1;
875                }
876        }
877#if ENABLE_AFD
878        else if(DCC_GetIsAFDOn() && !DCCUtil_CheckBits(32) && DCCUtil_NextBits(32) == DCC_AFD_ID) {
879                DCCUtil_GetBits(32);
880               
881                if(DCCUtil_CheckBits(8)) return -1;
882                tmpBuf[0]=(DCCUtil_GetBits(8)>>6)&0x1;
883                        //afd active_format_flag
884               
885                if(DCCUtil_CheckBits(8)) return -1;
886                tmpBuf[1]=DCCUtil_GetBits(8)&0xf;
887                        //afd active_format
888
889                p_afd_rx_count++;
890               
891                //active formatÀ» ó¸®ÇÏ¸é µÊ.
892                if(tmpBuf[1] != DCC_GetAFDFormat()) {
893                       
894                        //CCPRINT("#### afd is changed : 0x%x --> 0x%x\n", DCC_GetAFDFormat(), tmpBuf[1]);
895                       
896                        DCC_SetAFDFormat(tmpBuf[1]);
897
898                #if 1
899                        if(p_fn_afd_callback) (*p_fn_afd_callback)(tmpBuf[1]);
900                #else
901                        //callbackÀ» Á÷Á¢ È£ÃâÇÏ´Â °ÍÀº ¹®Á¦°¡ µÇ±â ¶§¹®¿¡ timer task¿¡¼­ ó¸®Çϵµ·Ï ÇÔ.
902                        DMW_SYS_SetTimer(AFD_TIMER_ID, 0, p_afd_timer_proc, tmpBuf[1], TRUE);
903                #endif
904                }
905                return -1;
906        }
907
908#endif
909
910        else {
911#if ENABLE_SCTE20_21
912                CCPRINT("scte2021"," SCTE 20 data!!\n");
913               
914                if(DCCUtil_CheckBits(16)) return -1;
915       
916                temp = DCCUtil_GetBits(8);
917                if( temp == 0x03)//user data type 0x03
918                {
919                        // ¿ø·¡´Â 0x81ÀÌ ¸ÂÁö¸¸ Cable Lab(?) or Çʸ³½º ÂÊ¿¡¼­ 0x01·Î ÇØÁֱ⸦ ¿äûÇÔ.                   
920                        // Á¶°Ç : start code = 0x40 && vbi data flag == 1
921                        //if( (tmpBuf[1] = DCCUtil_GetBits(8)) == 0x81 ) // SCTE20(7bits, 0x40) + vbi_data_flag(1)
922                        temp = DCCUtil_GetBits(8);
923                        if( temp & 0x01)
924                        {
925                                pic_ud->ud_type=eDCC_UD_TC_SCTE2X;
926                        }
927                        else 
928                        {
929                                CCPRINT("scte2021"," vbi_data_flag is not 1!!\n");
930                                return -1;
931                        }
932                }
933                else{
934                        CCPRINT("scte2021"," SCTE 20 data but it is not avaiable!!\n");
935                        return -1;
936                }
937#else //ENABLE_SCTE20_21
938                CCPRINT("scte2021", "!! No ATSC_ID(ATSC:0x%x, but 0x%x\n", DCC_ATSC_ID, DCCUtil_NextBits(32));
939                return -1;
940#endif//ENABLE_SCTE20_21
941        }
942       
943        if(pic_ud->ud_type==eDCC_UD_TC_708) 
944        {
945                static BOOL b_cc_started=FALSE;
946                static UINT8 cc_buf[256];               // a service block
947                static int cc_idx=0;                    // an index for the above service block
948                static int pkt_size=0;                  // the size of DTVCC packet data
949                //UINT8 v_cc_data_pkt[256];     // a cc data packet, of which cc valid is set
950                //int v_cc_idx=0;                                       // an index for the above cc data packet
951                UINT8 marker_bit = 0;
952                BOOL is_valid;
953               
954                if(DCCUtil_CheckBits(16)) return -1;
955               
956                pic_ud->flags=(UINT8)DCCUtil_GetBits(3);
957                        //neverdai flags´Â em_data_flag, cc_data_flag, data_flag·Î µÇ¾îÀÖ´Ù.
958                        //¿©±â¼­ cc_data¸¸ ó¸®Çϱ⠶§¹®¿¡ cc_data_flag°¡ 0ÀÎÁö 1ÀÎÁö¸¸ È®ÀÎÇÑ´Ù.
959                pic_ud->cc_count=(UINT8)DCCUtil_GetBits(5);
960                pic_ud->em_data=(UINT8)DCCUtil_GetBits(8);
961               
962                if((pic_ud->flags&0x2)==0) {
963                        //cc_data_flag°¡ 0ÀÎ °æ¿ì
964                        return -1;
965                }
966               
967                for(i=0; i<pic_ud->cc_count; i++) {
968                       
969                        if(DCCUtil_CheckBits(24)) return -1;
970                       
971                        marker_bit = DCCUtil_GetBits(5); //marker bit
972                       
973                        is_valid=DCCUtil_GetBits(1);
974                       
975                        temp=DCCUtil_GetBits(2); //cc_type(00,01 : line21 line1,2  10,11 : dtvcc data, start)
976                       
977
978                        switch(temp) {
979                                case 0x3: //dtvcc start
980                                        if(b_cc_started) {
981                                                //ÀúÀåµÇ¾îÀÖ´ø °ÍÀ» ó¸®ÇÔ.
982                                                if(cc_idx>2){
983                                                        p_demux_708_data(cc_buf, cc_idx);
984                                                }
985                                                b_cc_started=FALSE;
986                                                pkt_size = 0;
987                                        }
988                                       
989                                        cc_idx=0;
990                                       
991                                        if(is_valid) {
992                                                b_cc_started=TRUE;
993               
994                                                //v_cc_data_pkt[v_cc_idx++] = (marker_bit << 3) | (is_valid << 2) | temp;
995                                               
996                                                cc_buf[cc_idx++]=(UINT8)DCCUtil_GetBits(8);
997                                                //v_cc_data_pkt[v_cc_idx++] = cc_buf[cc_idx++];
998                                                cc_buf[cc_idx++]=(UINT8)DCCUtil_GetBits(8);
999                                                //v_cc_data_pkt[v_cc_idx++] = cc_buf[cc_idx++];                                         
1000
1001                                                pkt_size = (cc_buf[0] & 0x3f) * 2;
1002                                               
1003                                                if (pkt_size == 0)
1004                                                        pkt_size = 128;
1005                                        }
1006                                        else DCCUtil_GetBits(16);
1007                                               
1008                                        break;
1009                               
1010                                case 0x2: //dtvcc data
1011                                       
1012                                        if(!b_cc_started) { //header¸¦ ¹ÞÁö ¸øÇÑ »óÅ¿¡¼­ data¸¦ ¹ÞÀº °æ¿ì..
1013                                                CCPRINT("parse_ud"," header is not received!!\n");
1014                                                DCCUtil_GetBits(16);
1015                                                break;                                         
1016                                        }
1017                                       
1018                                        if(cc_idx>=128) {
1019                                                //packet overflow..´õ ÀÌ»ó ¹ÞÁö ¾ÊÀ½. lost packet!!
1020                                                CCPRINT("parse_ud"," lost packet!!\n");
1021                                                DCCUtil_GetBits(16);
1022                                                break;
1023                                        }
1024                                       
1025                                        if(is_valid) {
1026                                               
1027                                                //v_cc_data_pkt[v_cc_idx++] = (marker_bit << 3) | (is_valid << 2) | temp;
1028
1029                                                cc_buf[cc_idx++]=(UINT8)DCCUtil_GetBits(8);
1030                                                //v_cc_data_pkt[v_cc_idx++] = cc_buf[cc_idx++];
1031                                                cc_buf[cc_idx++]=(UINT8)DCCUtil_GetBits(8);
1032                                                //v_cc_data_pkt[v_cc_idx++] = cc_buf[cc_idx++];
1033
1034                                                // Çì´õ¿¡¼­ ÀÐÀº DTVCC ÆÐŶ »çÀÌÁî¿Í ½ÇÁ¦ ÀÐÀº ¹ÙÀÌÆ® ¼ö°¡ °°Àº °æ¿ì ¹Ù·Î ó¸®
1035                                                if (cc_idx >= pkt_size) 
1036                                                {
1037                                                        p_demux_708_data(cc_buf, cc_idx);
1038                                                        cc_idx = 0;
1039                                                        b_cc_started = FALSE;
1040                                                        pkt_size = 0;
1041                                                }
1042                                        }
1043                                        else {
1044                                                DCCUtil_GetBits(16);
1045#if IGNORE_DTVCC_DATA_INVALID==0                                       
1046                                                if(cc_idx>2){
1047                                                        p_demux_708_data(cc_buf, cc_idx);
1048                                                }
1049                                               
1050                                                cc_idx=0;
1051                                                b_cc_started=FALSE;
1052                                                pkt_size = 0;
1053#endif
1054                                        }
1055
1056                                        break;
1057                               
1058                                case 0x0:
1059#if ENABLE_608_DEMUX
1060                                        if(is_valid) 
1061                                        {
1062                                                UINT8 d1 = DCCUtil_GetBits(8);
1063                                                UINT8 d2 = DCCUtil_GetBits(8);
1064                                               
1065                                                //feeding
1066                                                if(ATTR(is_feeding_608)) {
1067                                                        DCCDDI_Feeding608(0, d1, d2, FALSE);
1068                                                }       
1069                                               
1070                                                p_demux_608_data(0, d1, d2);
1071                                               
1072//                                              v_cc_data_pkt[v_cc_idx++] = d1;
1073//                                              v_cc_data_pkt[v_cc_idx++] = d2;
1074                                        }
1075                                        else 
1076                                                DCCUtil_GetBits(16);
1077#else
1078                                        DCCUtil_GetBits(16);
1079#endif
1080                                        break;
1081                                       
1082                                case 0x1:
1083#if ENABLE_608_DEMUX                                   
1084                                        if(is_valid) {
1085                                                UINT8 d1 = DCCUtil_GetBits(8);
1086                                                UINT8 d2 = DCCUtil_GetBits(8);
1087
1088                                                //feeding
1089                                                if(ATTR(is_feeding_608)) {
1090                                                        DCCDDI_Feeding608(1, d1, d2, FALSE);
1091                                                }       
1092                                               
1093                                                p_demux_608_data(1, d1, d2);
1094
1095//                                              v_cc_data_pkt[v_cc_idx++] = d1;
1096//                                              v_cc_data_pkt[v_cc_idx++] = d2;
1097                                        } 
1098                                        else 
1099                                                DCCUtil_GetBits(16);
1100#else
1101                                        DCCUtil_GetBits(16);
1102#endif                                 
1103                                        break;
1104                                       
1105                        }
1106                       
1107                }
1108
1109#if 0           
1110                if (v_cc_idx != 0)
1111                        DCCExec_ProcessMsg(eCMD_CC_DATA_PACKETS,0, (UINT32)v_cc_data_pkt, v_cc_idx);
1112#endif
1113
1114        }
1115#if ENABLE_SCTE20_21
1116        else if(pic_ud->ud_type == eDCC_UD_TC_SCTE2X){
1117                int i;
1118                UINT8 temp[2];
1119                UINT8 cc_data[2];
1120                UINT8 cc_count;
1121                UINT8 cc_priority, field_number, line_offset, marker_bit;
1122               
1123/* zooyouny À§¿¡¼­ ÀоîÁÖµµ·Ï ÇßÀ½
1124                temp[0] = DCCUtil_GetBits(8);
1125                temp[1] = DCCUtil_GetBits(8);
1126                //user data type°ú vbi data flag´Â user data typeÀ» °áÁ¤ÇÒ ¶§ ¸ÕÀú °Ë»öÇß´Ù.
1127*/             
1128                cc_count = DCCUtil_GetBits(5)& 0x1F;
1129               
1130                for(i=0;i<cc_count;i++){
1131                        cc_priority = DCCUtil_GetBits(2) & 0x3;
1132                        field_number = DCCUtil_GetBits(2) & 0x3;
1133                        line_offset = DCCUtil_GetBits(5) & 0x1F;
1134                       
1135                        p_bit_reverse( DCCUtil_GetBits(8),&cc_data[0]);//8?,7?
1136                        p_bit_reverse( DCCUtil_GetBits(8),&cc_data[1]);//8?,7?
1137
1138                        // field reordering
1139#if 1
1140                        if (pic_ud_raw->pic_structure == 3)
1141                        {
1142                                if (pic_ud_raw->top_field_first == 0)
1143                                {
1144                                        if (field_number == 1)
1145                                                field_number = 2;
1146                                        else if (field_number == 2)
1147                                                field_number = 1;
1148                                }
1149
1150                                if (pic_ud_raw->repeat_first_field == 1)
1151                                {
1152                                        if (pic_ud_raw->top_field_first == 1 && field_number == 3)
1153                                                field_number = 1;
1154                                        else if (pic_ud_raw->top_field_first == 0 && field_number == 3)
1155                                                field_number = 2;                                               
1156                                }
1157                        }
1158                        else if (pic_ud_raw->pic_structure == 0)
1159                                continue;
1160#endif         
1161                       
1162#if 1
1163                        if(cc_data[0]!=0x80 && cc_data[1] != 0x80){
1164                                CCPRINT("scte_2021", "field_number:%d, line_offset:%d\n",field_number,line_offset);     
1165                                // zooyouny 100727 : for debuging
1166                                if (ATTR(info_cb))
1167                                {
1168                                        ATTR(info_cb)(eDCC_IT_SCTE20, 0, field_number, (((cc_data[0]&0x7f)<<8)|(cc_data[1]&0x7f)));
1169                                        // "E " ³ª¿À¸é ¸ØÃß°Ô Çϱâ À§ÇÑ µð¹ö±ë ÄÚµå
1170                                        if( ((cc_data[0] & 0x7f) == 0x45) && ((cc_data[1]&0x7f) == 0x20))
1171                                                cc_data[0] = cc_data[0];
1172                                }
1173                        }
1174                       
1175                        if( line_offset == 11 ) //line10 : NTSC field1, line273 : NTSC field2
1176                        {
1177                                if(field_number==1 || field_number==2 ){
1178                                        if( cc_data[0] == 0 && cc_data[1] == 0 )
1179                                                continue;                                       
1180                                        /* NTSCÀÏ °æ¿ì odd parityÀ̾î¾ß µÈ´Ù. */
1181/*      zooyouny 100727 : p_demux_608_data ³»ºÎ¿¡¼­ ¼öÇà
1182                                        if( p_check_parity_error( TRUE, cc_data[0] )
1183                                                || p_check_parity_error( TRUE, cc_data[1] ) )
1184                                        {
1185                                                CCPRINT("scte_2021","Ignore VBI_DATA cc[%d],[%d]\n", cc_data[0],cc_data[1] );
1186                                                continue;
1187                                        }
1188*/
1189//                                      if( cc_data[0] != 0x0 || cc_data[1] != 0x0  )
1190                                        {
1191                                                //iskang
1192                                                //aux cc insert´Â ¿©±â¿¡¼­ ...
1193                                                p_demux_608_data( field_number==1? 0:1, cc_data[0], cc_data[1] );       
1194//feeding
1195                                                if(ATTR(is_feeding_608)) {
1196                                                        DCCDDI_Feeding608(field_number==1? 0:1, cc_data[0], cc_data[1], FALSE);
1197                                                }
1198                                               
1199                                                CCPRINT("scte_2021","Send cc data on 608 demux\n");
1200                                        }
1201                                }
1202                                else if(field_number==3)
1203                                        CCPRINT("scte_2021", "Scte20 the repeated field in film mode, field_number (3)\n");
1204                               
1205                                else//field_number==0
1206                                        CCPRINT("scte_2021", "Scte20 Forbidden field_number (0)\n" );
1207                        }//line_offset == 11
1208                        else
1209                                CCPRINT("scte_2021", "line offset is not 11..\n" );
1210
1211#else                                   
1212                        p_demux_608_data( field_number-1, cc_data[0], cc_data[1] );
1213#endif                         
1214                       
1215                        marker_bit = DCCUtil_GetBits(1);
1216                }
1217        }
1218#endif//ENABLE_SCTE20_21
1219        else {
1220                CCPRINT("parse_ud", "Unsupported Format\n");
1221        }
1222       
1223#if 1   //ÇϳªÀÇ USER DATA°¡ Á¾·áµÇ¾ú´Ù´Â °ÍÀ» ¾Ë·ÁÁÜ.
1224        //feeding
1225        if(ATTR(is_feeding_608)) {
1226                DCCDDI_Feeding608(1, 0, 0, TRUE);
1227        }               
1228#endif
1229
1230       
1231
1232        return 0;
1233}
1234
1235
1236
1237
1238
1239
1240#if 0
1241__APIs__() {}
1242#endif
1243
1244#if ENABLE_AFD
1245
1246void DCC_SetAFDOn(BOOL bOn)
1247{
1248        p_b_afd_on=bOn;
1249}
1250
1251BOOL DCC_GetIsAFDOn()
1252{
1253        return p_b_afd_on;
1254}
1255
1256BOOL DCC_SetAFDCallback(void *cb)
1257{
1258        p_fn_afd_callback=(void (*)(UINT8))cb;
1259        return TRUE;
1260}
1261
1262void DCC_SetAFDFormat(UINT8 format)
1263{
1264        p_afd_format=format;
1265}
1266
1267UINT8 DCC_GetAFDFormat()
1268{
1269        return p_afd_format;
1270}
1271
1272UINT32 DCC_GetAFDRefreshCount()
1273{
1274        return p_afd_rx_count;
1275}
1276
1277#endif //ENABLE_AFD
1278
1279
1280void DCCFront_Init()
1281{
1282        static BOOL b_inited=FALSE;
1283       
1284        if(!b_inited) {
1285                //ÃʱâÈ­ ÀÛ¾÷.
1286                ATTR(service_num)=eDCC_S_NONE;
1287                ATTR(is_set_ETX)=FALSE;
1288               
1289                b_inited=TRUE;
1290        }
1291
1292}
1293
1294int DCCFront_ParsePicUD(tDCC_PicUDRaw *pic_ud_raw, tDCC_PicUD *pic_ud)
1295{
1296        return p_parse_pic_ud(pic_ud_raw, pic_ud);
1297}
1298
1299
1300BOOL DCCFront_IsServiceOn(UINT8 service)
1301{
1302        if(CC_MS_PASS(ATTR(last_rcvd_ms)[service])>=SERVICE_ON_DURATION)
1303                return FALSE;
1304       
1305        return TRUE;
1306}
1307
1308
1309void DCCFront_SetService(UINT8 service)
1310{
1311        ATTR(service_num)=service;
1312}
1313
1314
1315void DCCFront_SetFeeding608(BOOL bon)
1316{
1317        ATTR(is_feeding_608)=bon;
1318}
1319
1320void DCCFront_SetCallback(tDCC_InfoCallback func)
1321{
1322        ATTR(info_cb)=func;
1323       
1324}
1325
1326
1327/* end of file */
Note: See TracBrowser for help on using the repository browser.