Changeset 8100
- Timestamp:
- 01/13/13 12:10:28 (11 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r8095 r8100 43 43 struct s_client *dvbapi_client=NULL; 44 44 45 typedefstruct s_emm_filter {45 struct s_emm_filter { 46 46 int32_t demux_id; 47 47 uchar filter[32]; … … 152 152 ll_emm_pending_filter = ll_create("ll_emm_pending_filter"); 153 153 154 S_EMM_FILTER*filter_item;155 if (!cs_malloc(&filter_item,sizeof( S_EMM_FILTER)))154 struct s_emm_filter *filter_item; 155 if (!cs_malloc(&filter_item,sizeof(struct s_emm_filter))) 156 156 return 0; 157 157 … … 173 173 } 174 174 175 int32_t find_emmfilter_in_list(uchar *filter, uint16_t emmpid, uint32_t provid) 175 int32_t is_emmfilter_in_list_internal(LLIST *ll, uchar *filter, uint16_t emmpid, uint32_t provid) 176 { 177 struct s_emm_filter *filter_item; 178 LL_ITER itr; 179 if (ll_count(ll) > 0) { 180 itr = ll_iter_create(ll); 181 while ((filter_item=ll_iter_next(&itr))) { 182 if (!memcmp(filter_item->filter, filter, 32) && filter_item->pid == emmpid && filter_item->provid == provid) 183 return 1; 184 } 185 } 186 return 0; 187 } 188 189 int32_t is_emmfilter_in_list(uchar *filter, uint16_t emmpid, uint32_t provid) 176 190 { 177 191 if (!ll_emm_active_filter) … … 184 198 ll_emm_pending_filter = ll_create("ll_emm_pending_filter"); 185 199 186 S_EMM_FILTER *filter_item; 200 if (is_emmfilter_in_list_internal(ll_emm_active_filter, filter, emmpid,provid)) 201 return 1; 202 if (is_emmfilter_in_list_internal(ll_emm_inactive_filter, filter, emmpid,provid)) 203 return 1; 204 if (is_emmfilter_in_list_internal(ll_emm_pending_filter, filter, emmpid,provid)) 205 return 1; 206 207 return 0; 208 } 209 210 struct s_emm_filter *get_emmfilter_by_filternum_internal(LLIST *ll, uint32_t num) 211 { 212 struct s_emm_filter *filter; 187 213 LL_ITER itr; 188 if (ll_count(ll_emm_active_filter) > 0) { 189 itr = ll_iter_create(ll_emm_active_filter); 190 while ((filter_item=ll_iter_next(&itr))) { 191 if (!memcmp(filter_item->filter, filter, 32) && filter_item->pid == emmpid && filter_item->provid == provid) 192 return 1; 193 } 194 } 195 if (ll_count(ll_emm_inactive_filter) > 0) { 196 itr = ll_iter_create(ll_emm_inactive_filter); 197 while ((filter_item=ll_iter_next(&itr))) { 198 if (!memcmp(filter_item->filter, filter, 32) && filter_item->pid == emmpid && filter_item->provid == provid) 199 return 1; 200 } 201 } 202 if (ll_count(ll_emm_pending_filter) > 0) { 203 itr = ll_iter_create(ll_emm_pending_filter); 204 while ((filter_item=ll_iter_next(&itr))) { 205 if (!memcmp(filter_item->filter, filter, 32) && filter_item->pid == emmpid && filter_item->provid == provid) 206 return 1; 207 } 208 } 209 return 0; 214 if (ll_count(ll) > 0) { 215 itr = ll_iter_create(ll); 216 while ((filter=ll_iter_next(&itr))) { 217 if (filter->num == num) 218 return filter; 219 } 220 } 221 return NULL; 222 } 223 224 struct s_emm_filter *get_emmfilter_by_filternum(uint32_t num) 225 { 226 if (!ll_emm_active_filter) 227 ll_emm_active_filter = ll_create("ll_emm_active_filter"); 228 229 if (!ll_emm_inactive_filter) 230 ll_emm_inactive_filter = ll_create("ll_emm_inactive_filter"); 231 232 if (!ll_emm_pending_filter) 233 ll_emm_pending_filter = ll_create("ll_emm_pending_filter"); 234 235 struct s_emm_filter *emm_filter = NULL; 236 emm_filter = get_emmfilter_by_filternum_internal(ll_emm_active_filter, num); 237 if (emm_filter) 238 return emm_filter; 239 emm_filter = get_emmfilter_by_filternum_internal(ll_emm_inactive_filter, num); 240 if (emm_filter) 241 return emm_filter; 242 emm_filter = get_emmfilter_by_filternum_internal(ll_emm_pending_filter, num); 243 if (emm_filter) 244 return emm_filter; 245 246 return NULL; 210 247 } 211 248 … … 571 608 l = dvbapi_find_emmpid(demux_index, emmtype, 0x0100, seca_provid); 572 609 } else { 573 //.. provid 0 is safe since oscam sets filter with e.g. rdr->sa & doesn't add filter twice ( find_emmfilter_in_list)610 //.. provid 0 is safe since oscam sets filter with e.g. rdr->sa & doesn't add filter twice (is_emmfilter_in_list) 574 611 if (!rdr->caid) { 575 612 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->csystem.caids[0], 0); … … 582 619 if (l>-1) { 583 620 //filter already in list? 584 if ( find_emmfilter_in_list(filter, demux[demux_index].EMMpids[l].PID, demux[demux_index].EMMpids[l].PROVID)) {621 if (is_emmfilter_in_list(filter, demux[demux_index].EMMpids[l].PID, demux[demux_index].EMMpids[l].PROVID)) { 585 622 fcount_added++; 586 623 continue; … … 594 631 cs_ddump_mask(D_DVBAPI, filter, 32, "[EMM Filter] starting emm filter type %s, pid: 0x%04X", typtext[typtext_idx], demux[demux_index].EMMpids[l].PID); 595 632 if (fcount>=demux[demux_index].max_emm_filter) { 596 add_emmfilter_to_list(demux_index, filter, demux[demux_index].EMMpids[l].CAID, demux[demux_index].EMMpids[l].PROVID, demux[demux_index].EMMpids[l].PID, fcount +1, 0, 0);633 add_emmfilter_to_list(demux_index, filter, demux[demux_index].EMMpids[l].CAID, demux[demux_index].EMMpids[l].PROVID, demux[demux_index].EMMpids[l].PID, fcount, 0, 0); 597 634 } else { 598 dvbapi_set_filter(demux_index, selected_api, demux[demux_index].EMMpids[l].PID, demux[demux_index].EMMpids[l].CAID, demux[demux_index].EMMpids[l].PROVID, filter, filter+16, 0, demux[demux_index].pidindex, fcount +1, TYPE_EMM, 1);635 dvbapi_set_filter(demux_index, selected_api, demux[demux_index].EMMpids[l].PID, demux[demux_index].EMMpids[l].CAID, demux[demux_index].EMMpids[l].PROVID, filter, filter+16, 0, demux[demux_index].pidindex, fcount, TYPE_EMM, 1); 599 636 } 600 637 fcount++; … … 929 966 } 930 967 968 struct s_dvbapi_priority *dvbapi_check_prio_match_emmpid(int32_t demux_id, uint16_t caid, uint32_t provid, char type) { 969 struct s_dvbapi_priority *p; 970 int32_t i; 971 972 uint16_t ecm_pid=0; 973 for (i=0; i<demux[demux_id].ECMpidcount; i++) { 974 if ((demux[demux_id].ECMpids[i].CAID==caid) && (demux[demux_id].ECMpids[i].PROVID==provid)) { 975 ecm_pid=demux[demux_id].ECMpids[i].ECM_PID; 976 break; 977 } 978 } 979 980 if (!ecm_pid) 981 return NULL; 982 983 for (p=dvbapi_priority, i=0; p != NULL; p=p->next, i++) { 984 if (p->type != type) continue; 985 986 if (p->caid && p->caid != caid) continue; 987 if (p->provid && p->provid != provid) continue; 988 if (p->ecmpid && p->ecmpid != ecm_pid) continue; 989 if (p->srvid && p->srvid != demux[demux_id].program_number) continue; 990 991 if (p->type == 'i' && p->chid) continue; 992 993 return p; 994 } 995 return NULL; 996 997 } 998 999 struct s_dvbapi_priority *dvbapi_check_prio_match(int32_t demux_id, int32_t pidindex, char type) { 1000 struct s_dvbapi_priority *p; 1001 struct s_ecmpids *ecmpid = &demux[demux_id].ECMpids[pidindex]; 1002 int32_t i; 1003 1004 for (p=dvbapi_priority, i=0; p != NULL; p=p->next, i++) { 1005 if (p->type != type) continue; 1006 1007 if (p->caid && p->caid != ecmpid->CAID) continue; 1008 if (p->provid && p->provid != ecmpid->PROVID) continue; 1009 if (p->ecmpid && p->ecmpid != ecmpid->ECM_PID) continue; 1010 if (p->srvid && p->srvid != demux[demux_id].program_number) continue; 1011 1012 if (p->type == 'i' && p->chid) continue; 1013 1014 return p; 1015 } 1016 return NULL; 1017 1018 } 1019 931 1020 #ifdef READER_VIACCESS 932 1021 extern int32_t viaccess_reassemble_emm(uchar *buffer, uint32_t *len); … … 941 1030 if (demux[demux_index].pidindex==-1) return; 942 1031 943 uint32_t provider = demux[demux_index].ECMpids[demux[demux_index].pidindex].PROVID; 944 uint16_t caid = demux[demux_index].ECMpids[demux[demux_index].pidindex].CAID; 1032 struct s_emm_filter *filter = get_emmfilter_by_filternum(filter_num); 1033 1034 if (!filter) 1035 return; 1036 1037 uint32_t provider = filter->provid; 1038 uint16_t caid = filter->caid; 945 1039 946 1040 switch (caid >> 8) { … … 962 1056 cs_debug_mask(D_DVBAPI, "emm from fd %d", demux[demux_index].demux_fd[filter_num].fd); //emm shown with -d64 963 1057 964 struct s_dvbapi_priority *mapentry = dvbapi_check_prio_match(demux_index, demux[demux_index].pidindex, 'm');1058 struct s_dvbapi_priority *mapentry =dvbapi_check_prio_match_emmpid(filter->demux_id, filter->caid, filter->provid, 'm'); 965 1059 if (mapentry) { 966 1060 cs_debug_mask(D_DVBAPI, "Mapping EMM from %04X:%06X to %04X:%06X", caid, provider, mapentry->mapcaid, mapentry->mapprovid); … … 1173 1267 fclose(fp); 1174 1268 return; 1175 }1176 1177 struct s_dvbapi_priority *dvbapi_check_prio_match_emmpid(int32_t demux_id, uint16_t caid, uint32_t provid, char type) {1178 struct s_dvbapi_priority *p;1179 int32_t i;1180 1181 uint16_t ecm_pid=0;1182 for (i=0; i<demux[demux_id].ECMpidcount; i++) {1183 if ((demux[demux_id].ECMpids[i].CAID==caid) && (demux[demux_id].ECMpids[i].PROVID==provid)) {1184 ecm_pid=demux[demux_id].ECMpids[i].ECM_PID;1185 break;1186 }1187 }1188 1189 if (!ecm_pid)1190 return NULL;1191 1192 for (p=dvbapi_priority, i=0; p != NULL; p=p->next, i++) {1193 if (p->type != type) continue;1194 1195 if (p->caid && p->caid != caid) continue;1196 if (p->provid && p->provid != provid) continue;1197 if (p->ecmpid && p->ecmpid != ecm_pid) continue;1198 if (p->srvid && p->srvid != demux[demux_id].program_number) continue;1199 1200 if (p->type == 'i' && p->chid) continue;1201 1202 return p;1203 }1204 return NULL;1205 1206 }1207 1208 struct s_dvbapi_priority *dvbapi_check_prio_match(int32_t demux_id, int32_t pidindex, char type) {1209 struct s_dvbapi_priority *p;1210 struct s_ecmpids *ecmpid = &demux[demux_id].ECMpids[pidindex];1211 int32_t i;1212 1213 for (p=dvbapi_priority, i=0; p != NULL; p=p->next, i++) {1214 if (p->type != type) continue;1215 1216 if (p->caid && p->caid != ecmpid->CAID) continue;1217 if (p->provid && p->provid != ecmpid->PROVID) continue;1218 if (p->ecmpid && p->ecmpid != ecmpid->ECM_PID) continue;1219 if (p->srvid && p->srvid != demux[demux_id].program_number) continue;1220 1221 if (p->type == 'i' && p->chid) continue;1222 1223 return p;1224 }1225 return NULL;1226 1227 1269 } 1228 1270 … … 2405 2447 int32_t stopped=0, started=0; 2406 2448 time_t now = time((time_t *) 0); 2407 S_EMM_FILTER*filter_item;2449 struct s_emm_filter *filter_item; 2408 2450 LL_ITER itr; 2409 2451 itr = ll_iter_create(ll_emm_active_filter); … … 2425 2467 } 2426 2468 if (stopped>started) { 2427 S_EMM_FILTER*filter_item2;2469 struct s_emm_filter *filter_item2; 2428 2470 LL_ITER itr2 = ll_iter_create(ll_emm_inactive_filter); 2429 2471 while ((filter_item2=ll_iter_next(&itr2))) { -
trunk/oscam-chk.c
r8087 r8100 939 939 } 940 940 if (!caid_found) { 941 //cs_debug_mask(D_EMM, "emm reader %s reader_caid %04x != caid %04x", reader->label, reader->caid, caid);941 cs_debug_mask(D_EMM, "emm reader %s reader_caid %04x != caid %04x", reader->label, reader->caid, caid); 942 942 return 0; 943 943 }
Note:
See TracChangeset
for help on using the changeset viewer.