Mercurial > mplayer.hg
changeset 557:e4aca0d51268
some dvd sub parsing and check added
author | arpi_esp |
---|---|
date | Sat, 21 Apr 2001 02:24:36 +0000 |
parents | 3d1e8b618594 |
children | 30d9f61e9c0b |
files | mplayer.c |
diffstat | 1 files changed, 113 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/mplayer.c Sat Apr 21 00:15:19 2001 +0000 +++ b/mplayer.c Sat Apr 21 02:24:36 2001 +0000 @@ -184,6 +184,86 @@ vo_sub=NULL; // no sub here } + + + + +void spudec_process_control(unsigned char *control, int size, int* d1, int* d2) +{ + int off = 2; + int a,b; /* Temporary vars */ + + do { + int type = control[off]; + off++; + printf("cmd=%d ",type); + + switch(type) { + case 0x00: + /* Menu ID, 1 byte */ + printf("Menu ID\n"); + break; + case 0x01: + /* Start display */ + printf("Start display!\n"); +// gSpudec.geom.bIsVisible = 1; + break; + case 0x03: + /* Palette */ + printf("Palette\n"); +// palette[3] = &(gSpudec.clut[(control[off] >> 4)]); +// palette[2] = &(gSpudec.clut[control[off] & 0xf]); +// palette[1] = &(gSpudec.clut[(control[off+1] >> 4)]); +// palette[0] = &(gSpudec.clut[control[off+1] & 0xf]); + off+=2; + break; + case 0x04: + /* Alpha */ + printf("Alpha\n"); +// alpha[3] = control[off] & 0xf0; +// alpha[2] = (control[off] & 0xf) << 4; +// alpha[1] = control[off+1] & 0xf0; +// alpha[0] = (control[off+1] & 0xf) << 4; + off+=2; + break; + case 0x05: + /* Co-ords */ + a = (control[off] << 16) + (control[off+1] << 8) + control[off+2]; + b = (control[off+3] << 16) + (control[off+4] << 8) + control[off+5]; + + printf("Coords col: %d - %d row: %d - %d\n",a >> 12,a & 0xfff,b >> 12,b & 0xfff); + +// gSpudec.geom.start_col = a >> 12; +// gSpudec.geom.end_col = a & 0xfff; +// gSpudec.geom.start_row = b >> 12; +// gSpudec.geom.end_row = b & 0xfff; + + off+=6; + break; + case 0x06: + /* Graphic lines */ + *(d1) = (control[off] << 8) + control[off+1]; + *(d2) = (control[off+2] << 8) + control[off+3]; + printf("Graphic pos color: %d b/w: %d\n",*d1,*d2); + off+=4; + break; + case 0xff: + /* All done, bye-bye */ + printf("Done!\n"); + return; + break; + default: + printf("spudec: Error determining control type 0x%02x.\n",type); + return; + break; + } + + /* printf("spudec: Processsed control type 0x%02x.\n",type); */ + } while(off < size); +} + + + //**************************************************************************// // Config file //**************************************************************************// @@ -2058,10 +2138,39 @@ } // DVD sub: - { unsigned char* buf=NULL; - int len=ds_get_packet_sub(d_dvdsub,&buf); - if(len>0){ - printf("\rDVD sub: %d \n",len); + { unsigned char* packet=NULL; + int len=ds_get_packet_sub(d_dvdsub,&packet); + if(len>=2){ + int len2; + len2=(packet[0]<<8)+packet[1]; + printf("\rDVD sub: %d / %d \n",len,len2); + if(len==len2){ + +//----------------------------------------------------- + int x0, x1; + int d1, d2; + int lifetime; + x0 = (packet[2] << 8) + packet[3]; + x1 = (packet[x0+2] << 8) + packet[x0+3]; + + /* /Another/ sanity check. */ + if((packet[x1+2]<<8) + packet[x1+3] != x1) { + printf("spudec: Incorrect packet.\n"); + return; + } + lifetime= ((packet[x1]<<8) + packet[x1+1]); + printf("lifetime=%d\n",lifetime); + + d1 = d2 = -1; + spudec_process_control(packet + x0 + 2, x1-x0-2, &d1, &d2); +// if((d1 != -1) && (d2 != -1)) { +// spudec_process_data(packet, x0, d1, d2); +// } +//----------------------------------------------------- + + } else printf("fragmented dvd-subs not yet supported!!!\n"); + } else if(len>=0) { + printf("invalud dvd sub\n"); } }