summaryrefslogtreecommitdiff
authorke.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)
commit5844dca2328c5823d156ba201015753bb28aa9a8 (patch)
tree72d3d28094ddb609308979aefc89876fb4f1bf41
parentbc727b640273b758044847aa759af761285b83eb (diff)
downloadlibzvbi-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.
Diffstat
-rwxr-xr-xsrc/cache.c69
-rwxr-xr-xsrc/libzvbi.h3
-rwxr-xr-xsrc/teletext.c54
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