mirror of
https://github.com/mpv-player/mpv
synced 2025-04-07 18:14:33 +00:00
Implement X/27/0 packet decoding.
It contains information about navigation links. Modified patch from Otvos Attila oattila at chello dot hu git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@24264 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
bf61021b10
commit
c4debc9042
@ -330,6 +330,9 @@ teletext_add_digit <value>
|
|||||||
- - Delete last digit from page number. (Backspace emulation, works only
|
- - Delete last digit from page number. (Backspace emulation, works only
|
||||||
in page number editing mode.)
|
in page number editing mode.)
|
||||||
|
|
||||||
|
teletext_go_link <1-6>
|
||||||
|
Follow given link on current teletext page
|
||||||
|
|
||||||
tv_start_scan
|
tv_start_scan
|
||||||
Start automatic tv channels scaning
|
Start automatic tv channels scaning
|
||||||
|
|
||||||
|
@ -2452,6 +2452,13 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
|
|||||||
tvh->functions->control(tvh->priv,TV_VBI_CONTROL_ADD_DEC,&(cmd->args[0].v.s));
|
tvh->functions->control(tvh->priv,TV_VBI_CONTROL_ADD_DEC,&(cmd->args[0].v.s));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MP_CMD_TV_TELETEXT_GO_LINK:
|
||||||
|
{
|
||||||
|
tvi_handle_t* tvh=(tvi_handle_t *)(mpctx->demuxer->priv);
|
||||||
|
if (mpctx->file_format == DEMUXER_TYPE_TV)
|
||||||
|
tvh->functions->control(tvh->priv,TV_VBI_CONTROL_GO_LINK,&(cmd->args[0].v.i));
|
||||||
|
break;
|
||||||
|
}
|
||||||
#endif /* HAVE_TV_TELETEXT */
|
#endif /* HAVE_TV_TELETEXT */
|
||||||
#endif /* USE_TV */
|
#endif /* USE_TV */
|
||||||
|
|
||||||
|
@ -146,6 +146,7 @@ static mp_cmd_t mp_cmds[] = {
|
|||||||
{ MP_CMD_VF_CHANGE_RECTANGLE, "change_rectangle", 2, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}}}},
|
{ MP_CMD_VF_CHANGE_RECTANGLE, "change_rectangle", 2, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}}}},
|
||||||
#ifdef HAVE_TV_TELETEXT
|
#ifdef HAVE_TV_TELETEXT
|
||||||
{ MP_CMD_TV_TELETEXT_ADD_DEC, "teletext_add_dec", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } },
|
{ MP_CMD_TV_TELETEXT_ADD_DEC, "teletext_add_dec", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } },
|
||||||
|
{ MP_CMD_TV_TELETEXT_GO_LINK, "teletext_go_link", 1, { {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_NEW_GUI
|
#ifdef HAVE_NEW_GUI
|
||||||
|
@ -280,6 +280,11 @@ typedef struct tt_char_s{
|
|||||||
unsigned char raw; ///< raw character (as received from device)
|
unsigned char raw; ///< raw character (as received from device)
|
||||||
} tt_char;
|
} tt_char;
|
||||||
|
|
||||||
|
typedef struct tt_link_s{
|
||||||
|
int pagenum; ///< page number
|
||||||
|
int subpagenum; ///< subpage number
|
||||||
|
} tt_link_t;
|
||||||
|
|
||||||
typedef struct tt_page_s{
|
typedef struct tt_page_s{
|
||||||
int pagenum; ///< page number
|
int pagenum; ///< page number
|
||||||
int subpagenum; ///< subpage number
|
int subpagenum; ///< subpage number
|
||||||
@ -288,6 +293,7 @@ typedef struct tt_page_s{
|
|||||||
unsigned char flags; ///< page flags, not used
|
unsigned char flags; ///< page flags, not used
|
||||||
unsigned char raw[VBI_ROWS*VBI_COLUMNS]; ///< page data
|
unsigned char raw[VBI_ROWS*VBI_COLUMNS]; ///< page data
|
||||||
struct tt_page_s* next_subpage;
|
struct tt_page_s* next_subpage;
|
||||||
|
struct tt_link_s links[6];
|
||||||
} tt_page;
|
} tt_page;
|
||||||
|
|
||||||
typedef struct tt_stream_props_s{
|
typedef struct tt_stream_props_s{
|
||||||
|
@ -376,7 +376,7 @@ static int steppage(int p, int direction, int skip_hidden)
|
|||||||
*/
|
*/
|
||||||
static void put_to_cache(priv_vbi_t* priv,tt_page* pg,int line){
|
static void put_to_cache(priv_vbi_t* priv,tt_page* pg,int line){
|
||||||
tt_page* pgc; //page in cache
|
tt_page* pgc; //page in cache
|
||||||
int i,count;
|
int i,j,count;
|
||||||
|
|
||||||
if(line<0){
|
if(line<0){
|
||||||
i=0;
|
i=0;
|
||||||
@ -406,6 +406,8 @@ static void put_to_cache(priv_vbi_t* priv,tt_page* pg,int line){
|
|||||||
pgc->subpagenum=pg->subpagenum;
|
pgc->subpagenum=pg->subpagenum;
|
||||||
pgc->lang=pg->lang;
|
pgc->lang=pg->lang;
|
||||||
pgc->flags=pg->flags;
|
pgc->flags=pg->flags;
|
||||||
|
for(j=0;j<6;++j)
|
||||||
|
pgc->links[j]=pg->links[j];
|
||||||
//instead of copying entire page into cache, copy only undamaged
|
//instead of copying entire page into cache, copy only undamaged
|
||||||
//symbols into cache
|
//symbols into cache
|
||||||
for(;i<count;i++){
|
for(;i<count;i++){
|
||||||
@ -1014,6 +1016,42 @@ static void decode_pkt_page(priv_vbi_t* priv,unsigned char*data,int magAddr,int
|
|||||||
store_in_cache(priv,magAddr,rowAddr);
|
store_in_cache(priv,magAddr,rowAddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief decode packets 27 (teletext links)
|
||||||
|
* \param priv private data structure
|
||||||
|
* \param data raw teletext data
|
||||||
|
* \param magAddr teletext page's magazine address
|
||||||
|
*/
|
||||||
|
static int decode_pkt27(priv_vbi_t* priv,unsigned char* data,int magAddr){
|
||||||
|
int i,hpg;
|
||||||
|
|
||||||
|
if (!priv->mag[magAddr].pt)
|
||||||
|
return 0;
|
||||||
|
for(i=0;i<38;++i)
|
||||||
|
if ((data[i] = corrHamm48[ data[i] ]) & 0x80){
|
||||||
|
pll_add(priv,2,4);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Not a X/27/0 Format 1 packet or
|
||||||
|
flag "show links on row 24" is not set.
|
||||||
|
*/
|
||||||
|
if (data[0] || !(data[37] & 8))
|
||||||
|
return 1;
|
||||||
|
for(i=0;i<6;++i) {
|
||||||
|
hpg = (magAddr<<8) ^ ((data[4+i*6]&0x8)<<5 | (data[6+i*6]&0xc)<<7);
|
||||||
|
if (!hpg) hpg=0x800;
|
||||||
|
priv->mag[magAddr].pt->links[i].pagenum = (data[1+i*6] & 0xf) |
|
||||||
|
((data[2+i*6] & 0xf) << 4) | hpg;
|
||||||
|
priv->mag[magAddr].pt->links[i].subpagenum = ((data[3+i*6] & 0xf) |
|
||||||
|
(data[4+i*6] & 0xf) << 4 | (data[5+i*6] & 0xf) << 8 |
|
||||||
|
(data[6+i*6] & 0xf) << 12) & 0x3f7f;
|
||||||
|
}
|
||||||
|
put_to_cache(priv,priv->mag[magAddr].pt,-1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief decodes raw vbi data (signal amplitudes) into sequence of bytes
|
* \brief decodes raw vbi data (signal amplitudes) into sequence of bytes
|
||||||
* \param priv private data structure
|
* \param priv private data structure
|
||||||
@ -1205,6 +1243,8 @@ static void vbi_decode(priv_vbi_t* priv,unsigned char*buf){
|
|||||||
}else if(pkt>0 && pkt<VBI_ROWS){
|
}else if(pkt>0 && pkt<VBI_ROWS){
|
||||||
if(!priv->mag[magAddr].pt) continue;
|
if(!priv->mag[magAddr].pt) continue;
|
||||||
decode_pkt_page(priv,data+2,magAddr,pkt);//skip MRGA
|
decode_pkt_page(priv,data+2,magAddr,pkt);//skip MRGA
|
||||||
|
}else if(pkt==27) {
|
||||||
|
decode_pkt27(priv,data+2,magAddr);
|
||||||
}else if(pkt==30){
|
}else if(pkt==30){
|
||||||
decode_pkt30(priv,data+2,magAddr);
|
decode_pkt30(priv,data+2,magAddr);
|
||||||
} else {
|
} else {
|
||||||
@ -1339,6 +1379,7 @@ int teletext_control(void* p, int cmd, void *arg)
|
|||||||
{
|
{
|
||||||
int fine_tune=99;
|
int fine_tune=99;
|
||||||
priv_vbi_t* priv=(priv_vbi_t*)p;
|
priv_vbi_t* priv=(priv_vbi_t*)p;
|
||||||
|
tt_page* pgc;
|
||||||
|
|
||||||
if (!priv && cmd!=TV_VBI_CONTROL_START)
|
if (!priv && cmd!=TV_VBI_CONTROL_START)
|
||||||
return TVI_CONTROL_FALSE;
|
return TVI_CONTROL_FALSE;
|
||||||
@ -1424,6 +1465,28 @@ int teletext_control(void* p, int cmd, void *arg)
|
|||||||
pthread_mutex_unlock(&(priv->buffer_mutex));
|
pthread_mutex_unlock(&(priv->buffer_mutex));
|
||||||
return TVI_CONTROL_TRUE;
|
return TVI_CONTROL_TRUE;
|
||||||
}
|
}
|
||||||
|
case TV_VBI_CONTROL_GO_LINK:
|
||||||
|
{
|
||||||
|
int val=*(int *) arg;
|
||||||
|
if(val<1 || val>6)
|
||||||
|
return TVI_CONTROL_FALSE;
|
||||||
|
pthread_mutex_lock(&(priv->buffer_mutex));
|
||||||
|
if (!(pgc = priv->ptt_cache[priv->pagenum])) {
|
||||||
|
pthread_mutex_unlock(&(priv->buffer_mutex));
|
||||||
|
return TVI_CONTROL_FALSE;
|
||||||
|
}
|
||||||
|
if (!pgc->links[val-1].pagenum || pgc->links[val-1].pagenum>0x7ff) {
|
||||||
|
pthread_mutex_unlock(&(priv->buffer_mutex));
|
||||||
|
return TVI_CONTROL_FALSE;
|
||||||
|
}
|
||||||
|
priv->pagenum=pgc->links[val-1].pagenum;
|
||||||
|
if(pgc->links[val-1].subpagenum!=0x3f7f)
|
||||||
|
priv->subpagenum=pgc->links[val-1].subpagenum;
|
||||||
|
else
|
||||||
|
priv->subpagenum=get_subpagenum_from_cache(priv,priv->pagenum);
|
||||||
|
pthread_mutex_unlock(&(priv->buffer_mutex));
|
||||||
|
return TVI_CONTROL_TRUE;
|
||||||
|
}
|
||||||
case TV_VBI_CONTROL_SET_PAGE:
|
case TV_VBI_CONTROL_SET_PAGE:
|
||||||
{
|
{
|
||||||
int val=*(int *) arg;
|
int val=*(int *) arg;
|
||||||
|
Loading…
Reference in New Issue
Block a user