div class=postbodyMPEG TS 의 SectionFilter 를 구현하는데 있어서br /Positiveamp;Negative mask filter 알고리즘으로 적절한 H/W 적인 Filter와 유사한 동작을 구현할수 있게 됩니다.br /br /여기서 Positive mask 는 주어진 data 와 mask 값을 AND연산후 comp 와 비교하는 일반적인 mask 동작으로 특정 비트패턴을 일치조건으로 취하는 동작입니다.br /반면에 Negative mask 는 주어진 data 와 mask 값을 AND연산후 주어진 비트패턴이 주어진 comp 값과 다른 경우 일치조건으로 취하는 동작입니다.br /br /Positive mask 는 특정 비트열을 통과시키는 용도로 구현되며 br /Negative mask 는 현재조건이 변경되는 시점을 통과시키는 용도로 구현되는것이죠.br /br /아래의 예제가 충분할지는 모르겠지만 대략 다음과 같이 구현된다고 보시면 됩니다. 당연히 H/W 설계적인 관점에서도 가능한br /구조로 되어 있습니다.br /br /거의 기능상 구현으로 봤을때는 Positive mask 만 있으면 충분합니다.br /하지만 불필요한 반복적인 data를 무시하지 않기 때문에 CPU가 과도하게 피곤해지겠죠.br /Negative mask 는 이것을 방지하게 됩니다.br /br /div class=codetitlebCode:/b/divdiv class=codecontent#include lt;stdio.hgt;br /#include lt;stdlib.hgt;br /#include lt;memory.hgt;br /#include lt;unistd.hgt;br /br /static __inline int __mzmatch_filter(const unsigned char *s_data, const unsigned char *s_mask, const unsigned char *s_mode, const unsigned char *s_comp, size_t s_size);br /int mzmatch_filter(const void *s_data, const void *s_mask, const void *s_mode, const void *s_comp, size_t s_size);br /br /static __inline int __mzmatch_filter(const unsigned char *s_data, const unsigned char *s_mask, const unsigned char *s_mode, const unsigned char *s_comp, size_t s_size)br /{br /nbsp; nbsp; size_t s_offset = (size_t)0;br /nbsp; nbsp; unsigned char s_positive_mask, s_negative_mask;br /nbsp; nbsp; while(s_offset lt; s_size) {br /nbsp; nbsp; nbsp; nbsp; s_positive_mask = s_mask[s_offset] amp; s_mode[s_offset];br /nbsp; nbsp; nbsp; nbsp; s_negative_mask = s_mask[s_offset] amp; (~s_mode[s_offset]);br /nbsp; nbsp; nbsp; nbsp; if(((s_positive_mask amp; s_data[s_offset]) != (s_positive_mask amp; s_comp[s_offset])) ||br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;((s_negative_mask != ((unsigned char)0)) amp;amp; ((s_negative_mask amp; (s_data[s_offset] ^ s_comp[s_offset])) == ((unsigned char)0)))) {br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; return(0);br /nbsp; nbsp; nbsp; nbsp; }br /nbsp; nbsp; nbsp; nbsp; s_offset++;br /nbsp; nbsp; }br /nbsp; nbsp; return(1);br /}br /br /int mzmatch_filter(const void *s_data, const void *s_mask, const void *s_mode, const void *s_comp, size_t s_size)br /{br /nbsp; nbsp; return(__mzmatch_filter((const unsigned char *)s_data, (const unsigned char *)s_mask, (const unsigned char *)s_mode, (const unsigned char *)s_comp, s_size));br /}br /br /void test(unsigned char s_mask, unsigned char s_mode, unsigned char s_comp)br /{br /nbsp; nbsp; int s_match_condition;br /nbsp; nbsp; unsigned int s_data_min = 0x00u, s_data_max = 0xffu;br /nbsp; nbsp; (void)fprintf(stdout, TEST =gt; data=%02X~%02X mask=%02X mode=%02X comp=%02X,br /nbsp; nbsp; nbsp; nbsp; (unsigned int)s_data_min,br /nbsp; nbsp; nbsp; nbsp; (unsigned int)s_data_max,br /nbsp; nbsp; nbsp; nbsp; (unsigned int)s_mask,br /nbsp; nbsp; nbsp; nbsp; (unsigned int)s_mode,br /nbsp; nbsp; nbsp; nbsp; (unsigned int)s_compbr /nbsp; nbsp; );br /nbsp; nbsp; do {br /nbsp; nbsp; nbsp; nbsp; if((s_data_min % 0x10u) == 0x00u)(void)fputs(\n, stdout);br /nbsp; nbsp; nbsp; nbsp; s_match_condition = mzmatch_filter(amp;s_data_min, amp;s_mask, amp;s_mode, amp;s_comp, (size_t)1);br /#if defined(__linux__) /* can use ansi code(escape sequence code) */br /nbsp; nbsp; nbsp; nbsp; (void)fprintf(stdout,br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; %s%02X\x1b[0m,br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; (s_match_condition == 0) ? \x1b[1;31m : \x1b[1;33m,br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; (unsigned int)s_data_min);br /#elsebr /nbsp; nbsp; nbsp; nbsp; if(s_match_condition != 0) {br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; (void)fprintf(stdout,br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; %02X,br /nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; (unsigned int)s_data_min);br /nbsp; nbsp; nbsp; nbsp; }br /#endifbr /nbsp; nbsp; }while((s_data_min++) lt; s_data_max);br /nbsp; nbsp; (void)fputs(\n, stdout);br /}br /br /int main(void)br /{br /nbsp; nbsp; test(0xffu, 0xffu, 0x80u);br /nbsp; nbsp; test(0xffu, 0x00u, 0x80u);br /nbsp; nbsp; test(0xffu, 0xf9u, 0xceu);br /nbsp; nbsp; test(0xffu, 0xf0u, 0x24u);br /nbsp; nbsp; test(0x3fu, ~((unsigned char)0x3fu), 0x04u);br /nbsp; nbsp; /* TS filter */br /nbsp; nbsp; test(0xffu, 0xffu, 0x00u); /* PAT */br /nbsp; nbsp; test(0xffu, 0xffu, 0x01u); /* CAT */br /nbsp; nbsp; test(0xffu, 0xffu, 0x02u); /* PMT */br /nbsp; nbsp; test(0xffu, 0xffu, 0x3eu); /* DSM CC */br /nbsp; nbsp; test(0xfcu, 0xffu, 0x80u); /* ECM 0x80, 0x81, 0x82 */br /nbsp; nbsp; return(EXIT_SUCCESS);br /}/div/div span class=postbodybr //span
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/02/05 09:53 2008/02/05 09:53
받은 트랙백이 없고, 댓글 span class="cnt"하나/span가 달렸습니다.

댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/232

댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/232

트랙백 주소 :: http://blog.minzkn.com/trackback/232

트랙백 RSS :: http://blog.minzkn.com/rss/trackback/232

트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/232

댓글을 달아 주세요

댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/232
댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/232
  1. 강군 2008/05/28 09:39  댓글주소  수정/삭제  댓글쓰기

    이제 MPEG section filtering 공부를 시작했습니다. CPU manual을 읽던 중 positive, negative comparison에 대해 애매한 서술이 있었는데, 이 글을 보고 많은 도움이 되었습니다. 앞으로도 좋은 글 부탁드리겠습니다 (--)(__)