author | ke.gong <ke.gong@amlogic.com> | 2014-05-05 07:34:38 (GMT) |
---|---|---|
committer | tao.dong <tao.dong@amlogic.com> | 2014-05-14 11:27:02 (GMT) |
commit | 5844dca2328c5823d156ba201015753bb28aa9a8 (patch) | |
tree | 72d3d28094ddb609308979aefc89876fb4f1bf41 | |
parent | bc727b640273b758044847aa759af761285b83eb (diff) | |
download | libzvbi-5844dca2328c5823d156ba201015753bb28aa9a8.zip libzvbi-5844dca2328c5823d156ba201015753bb28aa9a8.tar.gz libzvbi-5844dca2328c5823d156ba201015753bb28aa9a8.tar.bz2 |
PD #91247: ADd sub page switch interface.
PD #91247: Add get sub page information interface.
PD #91247: Fixed get next page function.
-rwxr-xr-x | src/cache.c | 69 | ||||
-rwxr-xr-x | src/libzvbi.h | 3 | ||||
-rwxr-xr-x | src/teletext.c | 54 |
3 files changed, 101 insertions, 25 deletions
diff --git a/src/cache.c b/src/cache.c index 7a82bab..0aa079d 100755 --- a/src/cache.c +++ b/src/cache.c @@ -1376,6 +1376,75 @@ _vbi_cache_find_next_page (vbi_cache * ca, } cache_page * +_vbi_cache_find_next_page_2 (vbi_cache * ca, + int dir, + vbi_subno pgno, + vbi_subno subno) +{ + struct node *hash_list; + cache_page *cp, *cp1, *ret = NULL; + int i; + + assert (NULL != ca); + + if (pgno < 0x100 || pgno > 0x8FF || 0xFF == (pgno & 0xFF)) { + warning (&ca->log, + "Invalid pgno 0x%x.", pgno); + return NULL; + } + + for(i = 0; i < HASH_SIZE; i++){ + hash_list = ca->hash + hash (i); + FOR_ALL_NODES (cp, cp1, hash_list, hash_node) { + if(dir > 0){ + if((cp->pgno > pgno) && (!ret || (ret->pgno > cp->pgno))) + ret = cp; + }else if(dir < 0){ + if((cp->pgno < pgno) && (!ret || (ret->pgno < cp->pgno))) + ret = cp; + } + } + } + + if(ret){ + return cache_page_ref(ret); + } + + return NULL; +} + +vbi_bool +_vbi_cache_get_sub_info(vbi_cache *ca, vbi_subno pgno, int *subs, int *len) +{ + struct node *hash_list; + cache_page *cp, *cp1; + int left = *len; + int cnt = 0; + + assert (NULL != ca); + assert (left >= 0); + + if (pgno < 0x100 || pgno > 0x8FF || 0xFF == (pgno & 0xFF)) { + warning (&ca->log, + "Invalid pgno 0x%x.", pgno); + return FALSE; + } + + hash_list = ca->hash + hash (pgno); + + FOR_ALL_NODES (cp, cp1, hash_list, hash_node) { + if((cp->pgno == pgno) && (left > 0)){ + subs[cnt++] = cp->subno; + left--; + } + } + + *len = cnt; + + return TRUE; +} + +cache_page * _vbi_cache_find_page (vbi_cache * ca, int dir, vbi_subno pgno) diff --git a/src/libzvbi.h b/src/libzvbi.h index 146e982..4f562ee 100755 --- a/src/libzvbi.h +++ b/src/libzvbi.h @@ -1845,6 +1845,9 @@ extern void vbi_resolve_link(vbi_page *pg, int column, int row, extern void vbi_resolve_home(vbi_page *pg, vbi_link *ld); extern vbi_bool vbi_get_next_pgno(vbi_decoder *vbi, int dir, vbi_pgno *pgno, vbi_pgno *subno); +extern vbi_bool vbi_get_next_sub_pgno(vbi_decoder *vbi, int dir, vbi_pgno *pgno, vbi_pgno *subno); +extern vbi_bool vbi_get_sub_info(vbi_decoder *vbi, vbi_pgno pgno, int *subs, int *len); + /* tables.h */ diff --git a/src/teletext.c b/src/teletext.c index 5a74195..55c631d 100755 --- a/src/teletext.c +++ b/src/teletext.c @@ -2885,34 +2885,31 @@ vbi_get_next_pgno(vbi_decoder *vbi, int dir, vbi_pgno *pgno, vbi_pgno *subno) pg = *pgno; sub = *subno; - vtp = _vbi_cache_find_next_page (vbi->ca, dir, pg, sub); + vtp = _vbi_cache_find_next_page_2 (vbi->ca, dir, pg, sub); - if (!vtp) { - int start, no; - - start = no = vbi_bcd2dec(pg); - - if(dir > 0){ - do{ - no++; - if(no > 899) - no = 0; - vtp = _vbi_cache_find_page(vbi->ca, dir, vbi_dec2bcd(no)); - if(vtp) - break; - }while(no != start); - }else if(dir < 0){ - do { - no--; - if(no < 100) - no = 899; - vtp = _vbi_cache_find_page(vbi->ca, dir, vbi_dec2bcd(no)); - if(vtp) - break; - }while(no != start); - } + if(vtp) { + *pgno = vtp->pgno; + *subno = vtp->subno; + cache_page_unref (vtp); + return TRUE; } + return FALSE; +} + +vbi_bool +vbi_get_next_sub_pgno(vbi_decoder *vbi, int dir, vbi_pgno *pgno, vbi_pgno *subno) +{ + cache_page *vtp; + vbi_pgno pg, sub; + + assert(pgno && subno && (pgno>0x899 || pgno < 0x100)); + + pg = *pgno; + sub = *subno; + + vtp = _vbi_cache_find_next_page (vbi->ca, dir, pg, sub); + if(vtp) { *pgno = vtp->pgno; *subno = vtp->subno; @@ -2923,6 +2920,13 @@ vbi_get_next_pgno(vbi_decoder *vbi, int dir, vbi_pgno *pgno, vbi_pgno *subno) return FALSE; } +vbi_bool +vbi_get_sub_info(vbi_decoder *vbi, vbi_pgno pgno, int *subs, int *len) +{ + return _vbi_cache_get_sub_info(vbi->ca, pgno, subs, len); +} + + /* Local variables: c-set-style: K&R |