Changeset 1678


Ignore:
Timestamp:
02/24/10 21:52:38 (11 years ago)
Author:
alno
Message:

WebIf:

  • Merging revisions 1675-1676 of trunk
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/monitor-improvement/module-dvbapi.c

    r1662 r1678  
    147147int dvbapi_set_filter(int dmx_fd, int api, unsigned short pid, unsigned char filt, unsigned char mask, int timeout)
    148148{
    149     int command,ret=-1;
     149    int ret=-1;
    150150
    151151    cs_debug("dvbapi: set filter pid:%04x, value:%04x",pid, filt);
     
    154154    {
    155155        case 0:
    156             //dvbapi 3
    157             command=0;
     156            api=api;
    158157            struct dmx_sct_filter_params sFP2;
    159158
     
    169168            break;
    170169        case 1:
    171             //dvbapi 1
    172             command=0;
     170            api=api;
    173171            struct dmxSctFilterParams sFP1;
    174172
     
    225223    if (dmx_fd < 0) return 0;
    226224
    227     int command,ret=0;
     225    int ret=0;
    228226
    229227    for (i=0;i<num_apis;i++)
     
    533531}
    534532
     533void dvbapi_process_emm (int demux_index, unsigned char *buffer, unsigned int len) {
     534    int i;
     535    cs_debug("dvbapi: EMM Type: 0x%02x caid: %04x", buffer[0],demux[demux_index].ca_system_id);
     536    cs_ddump(buffer, len, "emm:");
     537
     538    //force emm output
     539    reader[ridx].logemm=9999;
     540
     541    memset(&epg, 0, sizeof(epg));
     542    epg.caid[0] = (uchar)(demux[demux_index].ca_system_id>>8);
     543    epg.caid[1] = (uchar)(demux[demux_index].ca_system_id);
     544
     545    epg.provid[1] = (uchar)(demux[demux_index].provider_id>>16);
     546    epg.provid[2] = (uchar)(demux[demux_index].provider_id>>8);
     547    epg.provid[3] = (uchar)(demux[demux_index].provider_id);
     548
     549    epg.l=len;
     550    memcpy(epg.emm, buffer, epg.l);
     551
     552    for (i=0;i<CS_MAXREADER;i++) {
     553        if (reader[i].caid[0] == demux[demux_index].ca_system_id) {
     554            client[cs_idx].au=i;
     555            memcpy(epg.hexserial, reader[client[cs_idx].au].hexserial, 8);
     556        }
     557    }
     558
     559    switch(demux[demux_index].ca_system_id >> 8) {
     560        case 0x18: // NAGRA EMM
     561            epg.l=len;
     562            int emm_shared = (buffer[7] == 0x10);
     563            uchar cam_id[4];
     564
     565            switch(buffer[0]) {
     566                case 0x82:
     567                    //emm-s
     568                    cs_debug("dvbapi: NAGRA shared emm");
     569                    //do_emm(&epg);
     570                    break;
     571                case 0x83:
     572                    //emm-u/g
     573                    cam_id[0] = buffer[5]; cam_id[1] = buffer[4]; cam_id[2] = buffer[3]; cam_id[3] = buffer[6];
     574                    cs_debug("dvbapi: NAGRA %s EMM for camid: %02X %02X %02X %02X", emm_shared ? "group" : "user", cam_id[0], cam_id[1], cam_id[2], cam_id[3]);
     575                    if (epg.hexserial[2]==cam_id[0] && epg.hexserial[3]==cam_id[1] && epg.hexserial[4]==cam_id[2]) {
     576                        if (emm_shared==1) {
     577                            //do_emm(&epg);
     578                            cs_debug("dvbapi: do nagra user emm");
     579                        }
     580                        if (emm_shared==0 && epg.hexserial[5] == cam_id[3]) {
     581                            //do_emm(&epg);
     582                            cs_debug("dvbapi: do nagra group emm");
     583                        }
     584                    }
     585                    break;
     586                default:
     587                    cs_debug("dvbapi: unknown Nagra EMM (skipped)");
     588                    break;
     589            }
     590            break;
     591        case 0x06: //Irdeto EMM
     592        case 0x01: //Seca EMM
     593            do_emm(&epg);
     594            break;
     595        case 0x0D:
     596            cs_debug("dvbapi: CrytoWorks EMM (skipped)");
     597            break;
     598        case 0x05:
     599            cs_debug("dvbapi: Viaccess EMM (skipped)");
     600            break;
     601        case 0x09:
     602            cs_debug("dvbapi: Videoguard EMM (skipped)");
     603            break;
     604        default:
     605            cs_debug("dvbapi: Unknown EMM (skipped)");
     606            break;
     607    }
     608}
     609
    535610void *thread_descrambling(void *di)
    536611{
     
    555630    program_number=demux[demux_index].program_number;
    556631
    557     while(1)
    558     {
     632    while(1) {
    559633        if (demux[demux_index].ca_system_id!=0) // got valid cw -> stop trying
    560634            break;
     
    583657    unsigned char buffer[BUFSIZE];
    584658
    585     while(1)
    586     {
     659    while(1) {
    587660        pfdcount=0;
    588661
     
    643716                }
    644717                if (pfd2[i].fd==demux[demux_index].demux_emm_fd) {
    645                     //EMM
    646 
    647                     cs_debug("EMM Type: 0x%02x", buffer[0]);
    648                     cs_ddump(buffer, len, "emm:");
    649 
    650                     //force emm output
    651                     reader[ridx].logemm=9999;
    652 
    653                     memset(&epg, 0, sizeof(epg));
    654 
    655                     epg.caid[0] = (uchar)(demux[demux_index].ca_system_id>>8);
    656                     epg.caid[1] = (uchar)(demux[demux_index].ca_system_id);
    657 
    658                     epg.provid[2] = (uchar)(demux[demux_index].provider_id>>8);
    659                     epg.provid[3] = (uchar)(demux[demux_index].provider_id);
    660 
    661                     epg.l=len;
    662                     memcpy(epg.emm, buffer, epg.l);
    663                     memcpy(epg.hexserial, reader[client[cs_idx].au].hexserial, 8);
    664 
    665                     do_emm(&epg);
     718                    dvbapi_process_emm(demux_index, buffer, len);
    666719                }
    667720            }
     
    882935
    883936
    884 void dvbapi_handlesockmsg (unsigned char *buffer, unsigned int len)
    885 {
    886     unsigned int val, size, i;
     937void dvbapi_handlesockmsg (unsigned char *buffer, unsigned int len) {
     938    unsigned int val=0, size=0, i, k;
    887939
    888940    //cs_dump(buffer, len, "handlesockmsg:");
    889 
    890     if (buffer[0] != 0x9F || buffer[1] != 0x80) {
    891         cs_log("dvbapi: unknown socket command: %02x", buffer[0]);
    892         return;
    893     }
    894 
    895     if (buffer[3] & 0x80) {
    896         val = 0;
    897         size = buffer[3] & 0x7F;
    898         for (i = 0; i < size; i++)
    899             val = (val << 8) | buffer[i + 1 + 3];
    900         size++;
    901     } else
    902     {
    903         val = buffer[3] & 0x7F;
    904         size = 1;
    905     }
    906 
    907     switch(buffer[2])
    908     {
    909         case 0x30:
    910             cs_debug("ca_info!!");
    911             break;
    912         case 0x32:
    913             if ((3 + size + val) == len)
     941    for (k = 0; k < len; k += 3 + size + val) {
     942        if (buffer[0+k] != 0x9F || buffer[1+k] != 0x80) {
     943            cs_log("dvbapi: unknown socket command: %02x", buffer[0+k]);
     944            return;
     945        }
     946
     947        if (buffer[3+k] & 0x80) {
     948            val = 0;
     949            size = buffer[3+k] & 0x7F;
     950            for (i = 0; i < size; i++)
     951                val = (val << 8) | buffer[i + 1 + 3 + k];
     952            size++;
     953        } else  {
     954            val = buffer[3+k] & 0x7F;
     955            size = 1;
     956        }
     957
     958        switch(buffer[2+k]) {
     959            case 0x32:
    914960                dvbapi_parse_capmt(buffer + 3 + size, val);
    915             else {
    916                 cs_log("dvbapi: ca_pmt invalid length");
    917                 cs_dump(buffer, len, "invalid length:");
    918             }
    919             break;
    920         case 0x3f:
    921             //9F 80 3f 04 83 02 00 <demux index>
    922             cs_ddump(buffer, len, "capmt 3f:");
    923             int demux_index=buffer[7];
    924             dvbapi_stop_descrambling_all(demux_index);
    925             break;
    926         default:
    927             cs_log("dvbapi: handlesockmsg() unknown command");
    928             cs_dump(buffer, len, "unknown command:");
    929             break;
     961                break;
     962            case 0x3f:
     963                //9F 80 3f 04 83 02 00 <demux index>
     964                cs_ddump(buffer, len, "capmt 3f:");
     965                int demux_index=buffer[7+k];
     966                dvbapi_stop_descrambling_all(demux_index);
     967                break;
     968            default:
     969                cs_log("dvbapi: handlesockmsg() unknown command");
     970                cs_dump(buffer, len, "unknown command:");
     971                break;
     972        }
    930973    }
    931974}
    932975
    933976int dvbapi_init_listenfd() {
    934 
    935977    int clilen;
    936978    struct sockaddr_un servaddr;
Note: See TracChangeset for help on using the changeset viewer.