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");
     }
   }