Changeset 4350
- Timestamp:
- 01/06/11 23:10:37 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/reader-viaccess.c
r4348 r4350 921 921 static int emm_global_len = 0; 922 922 923 int pos, emm_len = 0, k; 923 int pos, emm_len = 0; 924 uint k; 924 925 uchar emmbuf[512]; 925 926 … … 933 934 if (!memcmp(emm_global, buffer, *len)) 934 935 return 0; 935 936 //cs_log("viaccess global emm_provid: %06X provid: %06X", emm_provid, provider);937 936 938 937 // copy first part of the emm-s … … 945 944 // emm-s part 2 946 945 if (!emm_global_len) return 0; 947 948 if (buffer[6]!=0x00) return 0;949 946 947 //copy emm-s header (including sa) 950 948 memcpy(emmbuf, buffer, 7); 951 949 pos=7; 952 950 953 for (k=3; k<emm_global[2]+2 && k<emm_global_len; k += emm_global[k+1]+2) { 954 if (emm_global[k]!=0x90) continue; 955 memcpy(emmbuf+pos, emm_global+k, emm_global[k+1]+2); 956 pos += emm_global[k+1]+2; 957 } 958 959 memcpy(emmbuf+pos, "\x9E\x20", 2); 960 memcpy(emmbuf+pos+2, buffer+7, 32); 961 pos+=34; 962 963 int found=0; 964 for (k=8; k<emm_global[2]+2 && k<emm_global_len; k += emm_global[k+1]+2) { 965 if (emm_global[k] == 0xA1 || emm_global[k] == 0xA8 || emm_global[k] == 0xA9 || emm_global[k] == 0xB6) { 966 memcpy(emmbuf+pos, emm_global+k, emm_global[k+1]+2); 967 pos += emm_global[k+1]+2; 968 found=1; 951 //copy emm-gh 952 memcpy(emmbuf+pos, emm_global+3, emm_global_len-3); 953 pos=pos+emm_global_len-3; 954 955 //determine whether fixed or variable length emm-s 956 //if no f0 08 nano is found it has fixed length 957 int fixed = 1; 958 for (k=0; k<(*len); k++) { 959 if (buffer[k]==0xf0 && (k+1) < *len && buffer[k+1] == 0x08) { 960 cs_debug_mask(D_DVBAPI, "viaccess_reassemble_emm: found variable emm"); 961 fixed = 0; 969 962 } 970 963 } 971 if (found==0) return 0; 972 973 memcpy(emmbuf+pos, "\xF0\x08", 2); 974 memcpy(emmbuf+pos+2, buffer+39, 8); 975 pos+=10; 976 964 965 //fixed emm-s 966 if (fixed) { 967 cs_debug_mask(D_DVBAPI, "viaccess_reassemble_emm: found fixed emm"); 968 //add 9E 20 nano + first 32 bytes of emm content 969 memcpy(emmbuf+pos, "\x9E\x20", 2); 970 memcpy(emmbuf+pos+2, buffer+7, 32); 971 pos+=34; 972 973 //add F0 08 nano + 8 subsequent bytes of emm content 974 memcpy(emmbuf+pos, "\xF0\x08", 2); 975 memcpy(emmbuf+pos+2, buffer+39, 8); 976 pos+=10; 977 } 978 //variable emm-s 979 else { 980 //copy emm-s as is 981 memcpy(emmbuf+pos, buffer+7, *len); 982 pos+=*len; 983 } 984 985 //calculate emm length and set it on position 2 977 986 emm_len=pos; 978 987 emmbuf[2]=emm_len-3; 979 cs_ddump_mask(D_READER, buffer, *len, "original emm:"); 988 989 //cs_ddump_mask(D_READER, buffer, *len, "original emm:"); 990 cs_debug_mask(D_DVBAPI, "viaccess_reassemble_emm: emm-gh ? %s", cs_hexdump(1, emm_global, emm_global_len)); 991 cs_debug_mask(D_DVBAPI, "viaccess_reassemble_emm: emm-s ? %s", cs_hexdump(1, buffer, *len)); 992 cs_debug_mask(D_DVBAPI, "viaccess_reassemble_emm: assembled emm ? %s", cs_hexdump(1, emmbuf, emm_len)); 993 994 //place assembled emm 980 995 memcpy(buffer, emmbuf, emm_len); 981 996 *len=emm_len; … … 984 999 return 1; 985 1000 } 1001 986 1002 #endif 987 1003
Note:
See TracChangeset
for help on using the changeset viewer.