]> www.vanbest.org Git - sasc-ng.git/commitdiff
cardclient-CCcam: style cleanup
authorleslie <unknown>
Mon, 9 Jun 2008 04:29:30 +0000 (12:29 +0800)
committerleslie <unknown>
Mon, 9 Jun 2008 04:29:30 +0000 (12:29 +0800)
systems/cardclient/cccam.c

index e229e6adac4d76216b4796ecb4651c50b5d89317..79f3f0afa4ff0126fc1cbf76c4fa940de40a61a0 100644 (file)
  */\r
 \r
 #include <stdio.h>\r
-#include <stdint.h>\r
-#include <unistd.h>\r
-#include <errno.h>\r
-#include <sys/types.h>\r
-#include <sys/socket.h>\r
-#include <sys/time.h>\r
-#include <sys/un.h>\r
 #include <stdlib.h>\r
 #include <errno.h>\r
 #include <string.h>\r
+#include <unistd.h>\r
+#include <errno.h>\r
+#include <sys/socket.h>\r
 #include <sys/un.h>\r
 #include <fcntl.h>\r
 #include <netinet/in.h>\r
-#include <unistd.h>\r
 #include <arpa/inet.h>\r
 #include <signal.h>\r
-#include <pthread.h>\r
 \r
 #include <vdr/pat.h>\r
 \r
 #include "cc.h"\r
-#include "network.h"\r
-#include "parse.h"\r
-\r
-// START (C) 2002 by Andreas Oberritter <obi@tuxbox.org>\r
-\r
-#define MAX_PIDS       4\r
-\r
-typedef struct descrambleservice_t\r
-{\r
-       unsigned char valid;\r
-       unsigned char started;\r
-       unsigned short status;\r
-       unsigned short onID;\r
-       unsigned short sID;\r
-       unsigned short Unkwn;\r
-       unsigned short caID;\r
-       unsigned short ecmPID;\r
-       unsigned char numpids;\r
-       unsigned short pid[MAX_PIDS];\r
-\r
-} descrambleservice_s;\r
-\r
-typedef struct ca_descriptor_s\r
-{\r
-       unsigned char descriptor_tag            : 8;\r
-       unsigned char descriptor_length         : 8;\r
-       unsigned short ca_system_id             : 16;\r
-       unsigned char reserved                  : 3;\r
-       unsigned short ca_pid                   : 13;\r
-       unsigned char * private_data_byte;\r
-} __attribute__ ((packed)) ca_descriptor;\r
-\r
-typedef struct ca_pmt_program_info_s\r
-{\r
-       unsigned char ca_pmt_cmd_id             : 8;\r
-       ca_descriptor * descriptor;\r
-} __attribute__ ((packed)) ca_pmt_program_info;\r
-\r
-typedef struct ca_pmt_es_info_s\r
-{\r
-       unsigned char stream_type               : 8;\r
-       unsigned char reserved                  : 3;\r
-       unsigned short elementary_pid           : 13;\r
-       unsigned char reserved2                 : 4;\r
-       unsigned short es_info_length           : 12;\r
-       ca_pmt_program_info * program_info;\r
-} __attribute__ ((packed)) ca_pmt_es_info;\r
-\r
-typedef struct ca_pmt_s\r
-{\r
-       unsigned char ca_pmt_list_management    : 8;\r
-       unsigned short program_number           : 16;\r
-       unsigned char reserved1                 : 2;\r
-       unsigned char version_number            : 5;\r
-       unsigned char current_next_indicator    : 1;\r
-       unsigned char reserved2                 : 4;\r
-       unsigned short program_info_length      : 12;\r
-       ca_pmt_program_info * program_info;\r
-       ca_pmt_es_info * es_info;\r
-} __attribute__ ((packed)) ca_pmt;\r
-// END (C) 2002 by Andreas Oberritter <obi@tuxbox.org>\r
+//#include "network.h"\r
+//#include "parse.h"\r
 \r
-#define LIST_MORE 0x00   /* CA application should append a 'MORE' CAPMT object the list, and start receiving the next object */\r
-#define LIST_FIRST 0x01  /* CA application should clear the list when a 'FIRST' CAPMT object is received, and start receiving the next object */\r
-#define LIST_LAST 0x02   /* CA application should append a 'LAST' CAPMT object to the list, and start working with the list */\r
 #define LIST_ONLY 0x03   /* CA application should clear the list when an 'ONLY' CAPMT object is received, and start working with the object */\r
-#define LIST_ADD 0x04  /* CA application should append an 'ADD' CAPMT object to the current list, and start working with the updated list */\r
-#define LIST_UPDATE 0x05 /* CA application should replace an entry in the list with an 'UPDATE' CAPMT object, and start working with the updated list */\r
-/* ca_pmt_cmd_id's: */\r
-#define CMD_OK_DESCRAMBLING 0x01 /* CA application should start descrambling the service in this CAPMT object, as soon as the list of CAPMT objects is complete */\r
 \r
-int parse_ca_pmt ( unsigned char * buffer,  unsigned int length);\r
-\r
-// -- cCCcamClient -----------------------------------------------------------\r
+// -- cCardClientCCcam ---------------------------------------------------------\r
 \r
 class cCardClientCCcam : public cCardClient , private cThread {\r
 private:\r
@@ -131,7 +57,6 @@ private:
   void Writecapmt(int j);\r
   int CCSelect(int sd, bool forRead, int s);\r
   bool GetCCamCw(unsigned char *cw, int s);\r
-  int startportlistener();\r
 protected:\r
   virtual bool lLogin(int cardnum);\r
   virtual void Action(void);\r
@@ -139,39 +64,34 @@ public:
   cCardClientCCcam(const char *Name);\r
   virtual bool Init(const char *CfgDir);\r
   virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *Cw, int cardnum);\r
-  bool CanHandle(unsigned short SysId)\r
-{\r
-if ((SysId & 0xf000) != 0x5000)\r
-  return true;\r
-else\r
-  return false;\r
-}\r
-\r
-};\r
+  virtual bool CanHandle(unsigned short SysId);\r
+  };\r
 \r
 static cCardClientLinkReg<cCardClientCCcam> __ncd("CCcam");\r
 \r
 cCardClientCCcam::cCardClientCCcam(const char *Name)\r
 :cCardClient(Name)\r
+,cThread("CCcam listener")\r
 {\r
   cwccam_fd=-1;\r
   pmtversion=0;\r
-  ccam_fd[0] = -1;\r
-  ccam_fd[1] = -1;\r
-  ccam_fd[2] = -1;\r
-  ccam_fd[3] = -1;\r
+  ccam_fd[0]=-1; ccam_fd[1]=-1; ccam_fd[2]=-1; ccam_fd[3]=-1;\r
 }\r
 \r
-\r
 bool cCardClientCCcam::Init(const char *config)\r
 {\r
   cMutexLock lock(this);\r
-  int num = 0;\r
+  int num=0;\r
   signal(SIGPIPE,SIG_IGN);\r
   if(!ParseStdConfig(config,&num)) return false;\r
   return true;\r
 }\r
 \r
+bool cCardClientCCcam::CanHandle(unsigned short SysId)\r
+{\r
+  if((SysId & 0xf000) != 0x5000) return true;\r
+  return false;\r
+}\r
 \r
 bool cCardClientCCcam::lLogin(int cardnum)\r
 {\r
@@ -191,46 +111,42 @@ bool cCardClientCCcam::lLogin(int cardnum)
   serv_addr_un.sun_family = AF_LOCAL;\r
   strcpy(serv_addr_un.sun_path, camdsock);\r
   res=connect(ccam_fd[cardnum], (const sockaddr*)&serv_addr_un, sizeof(serv_addr_un));\r
-  if (res !=0)\r
-  {\r
+  if (res !=0) {\r
     PRINTF(L_CC_CCCAM,"Couldnt open camd.socket..... errno = %d Aggg",errno);\r
     close(ccam_fd[cardnum]);\r
     ccam_fd[cardnum] = -1;\r
-  }\r
+    }\r
   PRINTF(L_CC_CCCAM,"Opened camd.socket..... ccamd_fd  = %d ",ccam_fd[cardnum]);\r
   if (cwccam_fd!=-1) return 1;\r
   PRINTF(L_CC_CCCAM,"logging in");\r
   so=socket(AF_INET, SOCK_DGRAM, 0);\r
-  if(so<0)\r
-  {\r
+  if(so<0) {\r
     close(so);\r
     return false;\r
-  }\r
+    }\r
   bzero(&servAddr, sizeof(servAddr));\r
   servAddr.sin_family = AF_INET;\r
   servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");\r
   servAddr.sin_port = htons(port);\r
   rc = bind (so, (struct sockaddr *) &servAddr,sizeof(servAddr));\r
-  if(rc<0)\r
-  {\r
+  if(rc<0) {\r
     close(so);\r
     PRINTF(L_CC_CCCAM,"not logged in");\r
     return false;\r
-  }\r
+    }\r
   cwccam_fd =so;\r
   PRINTF(L_CC_CCCAM,"logged in");\r
-  startportlistener();\r
 \r
+  PRINTF(L_CC_CCCAM,"starting UDP listener");\r
+  Start();\r
   return true;\r
 }\r
 \r
-\r
 bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *cw, int cardnum)\r
 {\r
-\r
   // if(((ccam_fd ==0) && !Login()) || !CanHandle(ecm->caId)) return false;\r
   //so.Flush();\r
-//  cMutexLock lock(this);\r
+  //  cMutexLock lock(this);\r
   //newcw[cardnum] =0;\r
   unsigned char capmt[2048];\r
   PRINTF(L_CC_CCCAM,"Processing ECM.... for card %d",cardnum);\r
@@ -245,36 +161,29 @@ bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data
 \r
   //PRINTF(L_CC_CCCAM,"Card num beign used... - %d, pid %d progid %d provid %d caid %d",cardnum, pid,ecm->prgId, ecm->provId, ecm->caId );\r
   memcpy(capmt,"\x9f\x80\x32\x82\x00\x00", 6);\r
-\r
-  capmt[6]=0x01;\r
-                 //prg-nr\r
-  capmt[7]=(unsigned char)((ecm->prgId>>8) & 0xff);\r
-                 //prg-nr\r
+  capmt[6]=0x01; //prg-nr\r
+  capmt[7]=(unsigned char)((ecm->prgId>>8) & 0xff); //prg-nr\r
   capmt[8]=(unsigned char)(ecm->prgId & 0xff);\r
-\r
   capmt[9]=pmtversion;     //reserved - version - current/next\r
   pmtversion++;\r
-  pmtversion%=32;\r
-                 //0x00;  reserved - prg-info len\r
-  capmt[10]=(unsigned char)((ecm->prgId>>8) & 0xff);\r
-                 //0x00;  prg-info len\r
+  pmtversion%=32; //0x00;  reserved - prg-info len\r
+  capmt[10]=(unsigned char)((ecm->prgId>>8) & 0xff); //0x00;  prg-info len\r
   capmt[11]=(unsigned char)(ecm->prgId & 0xff);\r
   // this is ASN.1 this is NOT the way you do BER...\r
   capmt[12]=0x01;        //CMD_OK_DESCRAMBLING;   ca pmt command id\r
   capmt[13]=0x81;        // private descr.. dvbnamespace\r
   capmt[14]=0x08;\r
   {\r
-    int dvb_namespace = cardnum<<8;\r
-    capmt[15]=dvb_namespace>>24;\r
-    capmt[16]=(dvb_namespace>>16)&0xFF;\r
-    capmt[17]=(dvb_namespace>>8)&0xFF;\r
-    capmt[18]=dvb_namespace&0xFF;\r
+  int dvb_namespace = cardnum<<8;\r
+  capmt[15]=dvb_namespace>>24;\r
+  capmt[16]=(dvb_namespace>>16)&0xFF;\r
+  capmt[17]=(dvb_namespace>>8)&0xFF;\r
+  capmt[18]=dvb_namespace&0xFF;\r
   }\r
   capmt[19]=ecm->transponder>>8;\r
   capmt[20]=ecm->transponder&0xFF;\r
   capmt[21]=ecm->provId>>8;\r
   capmt[22]=ecm->provId&0xFF;\r
-\r
   capmt[23]=0x82;        // demuxer kram..\r
   capmt[24]=0x02;\r
   capmt[25]= 1<<cardnum ;\r
@@ -293,20 +202,16 @@ bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data
   capmt[wp++] = cardnum&0xFF;\r
   capmt[wp++] = 0x00;      //es_length\r
   capmt[wp++] = 0x06;      //es ca_pmt_cmd_id\r
-\r
   capmt[lenpos]=((len & 0xf00)>>8);\r
   capmt[lenpos+1]=(len & 0xff);\r
   capmt[4]=((wp-6)>>8) & 0xff;\r
   capmt[5]=(wp-6) & 0xff;\r
-  if (newcw[cardnum])\r
-  {\r
-    cTimeMs k;\r
-    if ((k.Now() - timecw[cardnum]) > 3000)\r
-                 // just too old lets bin em...\r
-        newcw[cardnum] = 0;\r
-  }\r
-  if ((pid != pids[cardnum]) || (ccam_fd[cardnum] == -1))\r
-  {              // channel change\r
+  if (newcw[cardnum]) {\r
+    if ((cTimeMs::Now() - timecw[cardnum]) > 3000)\r
+      // just too old lets bin em...\r
+      newcw[cardnum] = 0;\r
+    }\r
+  if ((pid != pids[cardnum]) || (ccam_fd[cardnum] == -1)) { // channel change\r
     PRINTF(L_CC_CCCAM,"sending capmts ");\r
     pids[cardnum] = pid;\r
     newcw[cardnum] =0;\r
@@ -314,40 +219,35 @@ bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data
     lLogin(cardnum);\r
     Writecapmt(cardnum);\r
     usleep(300000);\r
-  }\r
+    }\r
   lastcard = cardnum;\r
   lastpid = pid;\r
   failedcw=0;\r
   int u=0;\r
   while ((newcw[cardnum] == 0) && (u++<700))\r
     usleep(1000);      // give the card a chance to decode it...\r
-  if (newcw[cardnum] == 0)\r
-  {\r
+  if (newcw[cardnum] == 0) {\r
     // somethings up, so we will send capmt again.\r
     pids[cardnum] = pid;\r
-  //  memcpy(capmt,sacapmt[cardnum],2048);\r
+    //  memcpy(capmt,sacapmt[cardnum],2048);\r
     Writecapmt(cardnum);\r
-  }\r
+    }\r
   u=0;\r
   while ((newcw[cardnum] == 0) && (u++<1000))\r
     usleep(1000);\r
-  if (newcw[cardnum] == 0)\r
-  {\r
+  if (newcw[cardnum] == 0) {\r
     PRINTF(L_CC_CCCAM,"FAILED ECM FOR CARD %d !!!!!!!!!!!!!!!!!!",cardnum);\r
-      sacapmt[cardnum][9]=pmtversion;     //reserved - version - current/next\r
-  pmtversion++;\r
-  pmtversion%=32;\r
+    sacapmt[cardnum][9]=pmtversion;     //reserved - version - current/next\r
+    pmtversion++;\r
+    pmtversion%=32;\r
     failedcw++;\r
-    if (failedcw == 10)\r
-      {\r
+    if (failedcw == 10) {\r
       // CCcam is having problems lets mark it for a restart....\r
-       FILE *i = fopen("/tmp/killCCcam","w+");\r
-             fclose(i);\r
-\r
-\r
+      FILE *i = fopen("/tmp/killCCcam","w+");\r
+      fclose(i);\r
       }\r
     return false;\r
-  }\r
+    }\r
   memcpy(cw,savedcw[cardnum],16);\r
   newcw[cardnum] =0;\r
   PRINTF(L_CC_CCCAM," GOT CW FOR CARD %d !!!!!!!!!!!!!!!!!!",cardnum);\r
@@ -355,11 +255,10 @@ bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data
   pmtversion++;\r
   pmtversion%=32;\r
   failedcw=0;\r
-    Writecapmt(cardnum);\r
+  Writecapmt(cardnum);\r
   return true;\r
 }\r
 \r
-\r
 void cCardClientCCcam::Writecapmt(int n)\r
 {\r
   int len;\r
@@ -370,17 +269,15 @@ void cCardClientCCcam::Writecapmt(int n)
   len |= sacapmt[n][5];\r
   len += 6;\r
   int retry = 1;\r
-  while (retry)\r
-  {\r
-  PRINTF(L_CC_CCCAM,"Writing capmt for card %d %d =================================================",n, sacapmt[n][6]);\r
-  if (ccam_fd[n]==-1)\r
-    lLogin(n);\r
-  if (ccam_fd[n]==-1)\r
-    return ;\r
-\r
-  int r = write(ccam_fd[n], &sacapmt[n],len );\r
-    if (r != len)\r
-      {\r
+  while (retry) {\r
+    PRINTF(L_CC_CCCAM,"Writing capmt for card %d %d =================================================",n, sacapmt[n][6]);\r
+    if (ccam_fd[n]==-1)\r
+      lLogin(n);\r
+    if (ccam_fd[n]==-1)\r
+      return ;\r
+\r
+    int r = write(ccam_fd[n], &sacapmt[n],len );\r
+    if (r != len) {\r
       PRINTF(L_CC_CCCAM,"CCcam probably has crashed or been killed...");\r
       close(ccam_fd[n]);\r
       ccam_fd[n]=-1;\r
@@ -388,59 +285,38 @@ void cCardClientCCcam::Writecapmt(int n)
       if (retry > 2)\r
         retry =0;\r
       }\r
-  else\r
-  retry =0;\r
-  }\r
-}\r
-\r
-\r
-int cCardClientCCcam::startportlistener()\r
-{\r
-  PRINTF(L_CC_CCCAM,"starting UDP listener");\r
-  SetDescription("CCcamd listener...");\r
-  Start();\r
-\r
-  return 1;\r
+    else\r
+      retry =0;\r
+    }\r
 }\r
 \r
-\r
 void cCardClientCCcam::Action()\r
 {\r
   unsigned char cw[18];\r
-  while (1)\r
-  {\r
-    if (GetCCamCw(cw,0))\r
-    {\r
-      int pid;\r
-      cTimeMs k;\r
-      pid = cw[0] + (cw[1]<<8);\r
+  while(Running()) {\r
+    if (GetCCamCw(cw,0)) {\r
       PRINTF(L_CC_CCCAM," Got: %02hhx%02hhx  %02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx  %02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",\r
-        cw[0], cw[1], cw[2], cw[3],\r
-        cw[4], cw[5], cw[6], cw[7],\r
-        cw[8], cw[9], cw[10], cw[11],\r
-        cw[12], cw[13], cw[14], cw[15], cw[16], cw[17]);\r
+        cw[0],cw[1],\r
+        cw[2],cw[3],cw[4],cw[5],cw[6],cw[7],cw[8],cw[9],\r
+        cw[10],cw[11],cw[12],cw[13],cw[14],cw[15],cw[16],cw[17]);\r
 \r
-      if (cw[1] == 0x0f)\r
-      {\r
+      if (cw[1] == 0x0f) {\r
         int n = cw[0];\r
-        if (memcmp(savedcw[n],cw+2,16))\r
-        {\r
-          if (newcw[n] == 1)\r
-          {\r
+        if (memcmp(savedcw[n],cw+2,16)) {\r
+          if (newcw[n] == 1) {\r
             close(ccam_fd[n]);\r
             ccam_fd[n]=-1;\r
-          }\r
+            }\r
           memcpy(savedcw[n],cw+2,16);\r
           newcw[n] =1;\r
-          timecw[n]= k.Now();\r
+          timecw[n]= cTimeMs::Now();\r
           PRINTF(L_CC_CCCAM,"SAVING KEYS USING PID FROM CCCAM  %d !!!!!!!!!!!", n);\r
+          }\r
         }\r
       }\r
     }\r
-  }\r
 }\r
 \r
-\r
 bool cCardClientCCcam::GetCCamCw(unsigned char *cw, int s)\r
 {\r
   unsigned char msg[18];\r
@@ -458,199 +334,17 @@ bool cCardClientCCcam::GetCCamCw(unsigned char *cw, int s)
   return(true);\r
 }\r
 \r
-\r
 int cCardClientCCcam::CCSelect(int sd, bool forRead, int s)\r
 {\r
-  if(sd>=0)\r
-  {\r
+  if(sd>=0) {\r
     fd_set fds;\r
     FD_ZERO(&fds); FD_SET(sd,&fds);\r
     struct timeval tv;\r
     tv.tv_sec=4; tv.tv_usec=000;\r
     int r=::select(sd+1,forRead ? &fds:0,forRead ? 0:&fds,0,&tv);\r
     if(r>0) return 1;\r
-    else if(r<0)\r
-    {\r
-      return 0;\r
+    else if(r<0) return 0;\r
+    else return 0;\r
     }\r
-    else\r
-    {\r
-      return 0;\r
-    }\r
-  }\r
   return 0;\r
 }\r
-\r
-\r
-int caid_count =1 ;\r
-int parse_ca_pmt ( unsigned char * buffer,  unsigned int length)\r
-{\r
-  unsigned short i, j;\r
-  ca_pmt * pmt;\r
-  descrambleservice_s service;\r
-\r
-  memset(&service, 0, sizeof(descrambleservice_s));\r
-\r
-  pmt = (ca_pmt *) malloc(sizeof(ca_pmt));\r
-\r
-  pmt->ca_pmt_list_management = buffer[0];\r
-  pmt->program_number = (buffer[1] << 8) | buffer[2];\r
-  pmt->program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5];\r
-\r
-  printf("ca_pmt_list_management: %02x\n", pmt->ca_pmt_list_management);\r
-  printf("prugram number: %04x\n", pmt->program_number);\r
-  printf("program_info_length: %04x\n", pmt->program_info_length);\r
-  switch (pmt->ca_pmt_list_management)\r
-  {\r
-    case 0x01:         /* first */\r
-      printf("first\n");\r
-      break;\r
-    case 0x03:         /* only */\r
-      printf("only\n");\r
-      break;\r
-\r
-    default:\r
-      printf("unknown\n");\r
-      break;\r
-  }\r
-\r
-  if (pmt->program_info_length != 0)\r
-  {\r
-    pmt->program_info = (ca_pmt_program_info *) malloc(sizeof(ca_pmt_program_info));\r
-    pmt->program_info->ca_pmt_cmd_id = buffer[6];\r
-    printf("ca_pmt_id: %04x\n", pmt->program_info->ca_pmt_cmd_id);\r
-    pmt->program_info->descriptor = (ca_descriptor *) malloc(sizeof(ca_descriptor));\r
-\r
-    for (i = 0; i < pmt->program_info_length - 1; i += pmt->program_info->descriptor->descriptor_length + 2)\r
-    {\r
-      pmt->program_info->descriptor->descriptor_length = buffer[i + 8];\r
-      pmt->program_info->descriptor->ca_system_id = (buffer[i + 9] << 8) | buffer[i + 10];\r
-      pmt->program_info->descriptor->ca_pid = ((buffer[i + 11] & 0x1F) << 8)| buffer[i + 12];\r
-      printf("ca_descriptor_length %d\n",pmt->program_info->descriptor->descriptor_length);\r
-      printf("ca_system_id: %04x\n", pmt->program_info->descriptor->ca_system_id);\r
-      printf("ca_pid: %04x\n", pmt->program_info->descriptor->ca_pid);\r
-\r
-    }\r
-\r
-    free(pmt->program_info->descriptor);\r
-    free(pmt->program_info);\r
-  }\r
-\r
-  pmt->es_info = (ca_pmt_es_info *) malloc(sizeof(ca_pmt_es_info));\r
-\r
-  for (i = pmt->program_info_length + 6; i < length; i += pmt->es_info->es_info_length + 5)\r
-  {\r
-    if (service.numpids == MAX_PIDS)\r
-    {\r
-      break;\r
-    }\r
-\r
-    pmt->es_info->stream_type = buffer[i];\r
-    pmt->es_info->elementary_pid = ((buffer[i + 1] & 0x1F) << 8) | buffer[i + 2];\r
-    pmt->es_info->es_info_length = ((buffer[i + 3] & 0x0F) << 8) | buffer[i + 4];\r
-\r
-    printf("stream_type: %02x\n", pmt->es_info->stream_type);\r
-    printf("elementary_pid: %04x\n", pmt->es_info->elementary_pid);\r
-    printf("es_info_length: %04x\n", pmt->es_info->es_info_length);\r
-\r
-    service.pid[service.numpids++] = pmt->es_info->elementary_pid;\r
-\r
-    if (pmt->es_info->es_info_length != 0)\r
-    {\r
-      pmt->es_info->program_info = (ca_pmt_program_info *) malloc(sizeof(ca_pmt_program_info));\r
-\r
-      pmt->es_info->program_info->ca_pmt_cmd_id = buffer[i + 5];\r
-      pmt->es_info->program_info->descriptor = (ca_descriptor *)malloc(sizeof(ca_descriptor));\r
-\r
-      for (j = 0; j < pmt->es_info->es_info_length - 1; j += pmt->es_info->program_info->descriptor->descriptor_length + 2)\r
-      {\r
-        pmt->es_info->program_info->descriptor->descriptor_length = buffer[i + j + 7];\r
-        pmt->es_info->program_info->descriptor->ca_system_id = (buffer[i + j + 8] << 8) | buffer[i + j + 9];\r
-        pmt->es_info->program_info->descriptor->ca_pid = ((buffer[i + j + 10] & 0x1F) << 8) | buffer[i + j + 11];\r
-\r
-        printf("ca_system_id: %04x\n", pmt->es_info->program_info->descriptor->ca_system_id);\r
-        printf("ca_pid: %04x\n", pmt->es_info->program_info->descriptor->ca_pid);\r
-\r
-        if (service.caID != 0)\r
-        {\r
-          break;\r
-        }\r
-      }\r
-\r
-      free(pmt->es_info->program_info->descriptor);\r
-      free(pmt->es_info->program_info);\r
-    }\r
-  }\r
-\r
-  service.sID = pmt->program_number;\r
-\r
-  free(pmt->es_info);\r
-  free(pmt);\r
-\r
-  if ((service.numpids != 0) && (service.caID != 0))\r
-  {\r
-    service.onID = 0x0085;\r
-\r
-    service.Unkwn = 0x0104;\r
-\r
-    return 0;        //   return adddescrambleservicestruct(&service);\r
-  }\r
-  else\r
-  {\r
-    return -1;\r
-  }\r
-}\r
-\r
-\r
-unsigned int parse_length_field (unsigned char * buffer)\r
-{\r
-  unsigned char size_indicator = (buffer[0] >> 7) & 0x01;\r
-  unsigned int length_value = 0;\r
-\r
-  if (size_indicator == 0)\r
-  {\r
-    length_value = buffer[0] & 0x7F;\r
-  }\r
-\r
-  else if (size_indicator == 1)\r
-  {\r
-    unsigned char length_field_size = buffer[0] & 0x7F;\r
-    unsigned int i;\r
-\r
-    for (i = 0; i < length_field_size; i++)\r
-    {\r
-      length_value = (length_value << 8) | buffer[i + 1];\r
-    }\r
-  }\r
-\r
-  return length_value;\r
-}\r
-\r
-\r
-unsigned char get_length_field_size (unsigned int length)\r
-{\r
-  if (length < 0x80)\r
-  {\r
-    return 0x01;\r
-  }\r
-\r
-  if (length < 0x100)\r
-  {\r
-    return 0x02;\r
-  }\r
-\r
-  if (length < 0x10000)\r
-  {\r
-    return 0x03;\r
-  }\r
-\r
-  if (length < 0x1000000)\r
-  {\r
-    return 0x04;\r
-  }\r
-\r
-  else\r
-  {\r
-    return 0x05;\r
-  }\r
-}\r