tsdecrypt reads and decrypts CSA encrypted incoming mpeg transport stream over UDP/RTP using code words obtained from OSCAM or similar CAM server. tsdecrypt communicates with CAM server using cs378x (camd35 over tcp) protocol or newcamd protocol. https://georgi.unixsol.org/programs/tsdecrypt/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

process.c 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include <unistd.h>
  2. #include "data.h"
  3. #include "tables.h"
  4. static unsigned long ts_pack;
  5. static int ts_pack_shown;
  6. void show_ts_pack(struct ts *ts, uint16_t pid, char *wtf, char *extra, uint8_t *ts_packet) {
  7. char cw1_dump[8 * 6];
  8. char cw2_dump[8 * 6];
  9. if (ts->debug_level >= 4) {
  10. if (ts_pack_shown)
  11. return;
  12. int stype = ts_packet_get_scrambled(ts_packet);
  13. ts_hex_dump_buf(cw1_dump, 8 * 6, ts->key.cw , 8, 0);
  14. ts_hex_dump_buf(cw2_dump, 8 * 6, ts->key.cw + 8, 8, 0);
  15. fprintf(stderr, "@ %s %s %03x %5ld %7ld | %s %s | %s\n",
  16. stype == 0 ? "------" :
  17. stype == 2 ? "even 0" :
  18. stype == 3 ? "odd 1" : "??????",
  19. wtf,
  20. pid,
  21. ts_pack, ts_pack * 188,
  22. cw1_dump, cw2_dump, extra ? extra : wtf);
  23. }
  24. }
  25. static void dump_ts_pack(struct ts *ts, uint16_t pid, uint8_t *ts_packet) {
  26. if (pid == 0x010) show_ts_pack(ts, pid, "nit", NULL, ts_packet);
  27. else if (pid == 0x11) show_ts_pack(ts, pid, "sdt", NULL, ts_packet);
  28. else if (pid == 0x12) show_ts_pack(ts, pid, "epg", NULL, ts_packet);
  29. else show_ts_pack(ts, pid, "---", NULL, ts_packet);
  30. }
  31. static void decode_packet(struct ts *ts, uint8_t *ts_packet) {
  32. int scramble_idx = ts_packet_get_scrambled(ts_packet);
  33. if (scramble_idx > 1) {
  34. if (ts->key.is_valid_cw) {
  35. // scramble_idx 2 == even key
  36. // scramble_idx 3 == odd key
  37. ts_packet_set_not_scrambled(ts_packet);
  38. uint8_t payload_ofs = ts_packet_get_payload_offset(ts_packet);
  39. dvbcsa_decrypt(ts->key.csakey[scramble_idx - 2], ts_packet + payload_ofs, 188 - payload_ofs);
  40. } else {
  41. // Can't decrypt the packet just make it NULL packet
  42. if (ts->pid_filter)
  43. ts_packet_set_pid(ts_packet, 0x1fff);
  44. }
  45. }
  46. }
  47. static void decode_buffer(struct ts *ts, uint8_t *data, int data_len) {
  48. int i;
  49. int batch_sz = dvbcsa_bs_batch_size(); // 32?
  50. int even_packets = 0;
  51. int odd_packets = 0;
  52. struct dvbcsa_bs_batch_s even_pcks[batch_sz + 1];
  53. struct dvbcsa_bs_batch_s odd_pcks [batch_sz + 1];
  54. // Prepare batch structure
  55. for (i = 0; i < batch_sz; i++) {
  56. uint8_t *ts_packet = data + (i * 188);
  57. int scramble_idx = ts_packet_get_scrambled(ts_packet);
  58. if (scramble_idx > 1) {
  59. if (ts->key.is_valid_cw) {
  60. uint8_t payload_ofs = ts_packet_get_payload_offset(ts_packet);
  61. if (scramble_idx == 2) { // scramble_idx 2 == even key
  62. even_pcks[even_packets].data = ts_packet + payload_ofs;
  63. even_pcks[even_packets].len = 188 - payload_ofs;
  64. even_packets++;
  65. }
  66. if (scramble_idx == 3) { // scramble_idx 3 == odd key
  67. odd_pcks[odd_packets].data = ts_packet + payload_ofs;
  68. odd_pcks[odd_packets].len = 188 - payload_ofs;
  69. odd_packets++;
  70. }
  71. ts_packet_set_not_scrambled(ts_packet);
  72. } else {
  73. if (ts->pid_filter)
  74. ts_packet_set_pid(ts_packet, 0x1fff);
  75. }
  76. }
  77. }
  78. // Decode packets
  79. if (even_packets) {
  80. even_pcks[even_packets].data = NULL; // Last one...
  81. dvbcsa_bs_decrypt(ts->key.bs_csakey[0], even_pcks, 184);
  82. }
  83. if (odd_packets) {
  84. odd_pcks[odd_packets].data = NULL; // Last one...
  85. dvbcsa_bs_decrypt(ts->key.bs_csakey[1], odd_pcks, 184);
  86. }
  87. // Fill write buffer
  88. for (i=0; i<data_len; i += 188) {
  89. uint8_t *ts_packet = data + i;
  90. if (!ts->pid_filter) {
  91. cbuf_fill(ts->write_buf, ts_packet, 188);
  92. } else {
  93. uint16_t pid = ts_packet_get_pid(ts_packet);
  94. if (pidmap_get(&ts->pidmap, pid)) // PAT or allowed PIDs
  95. cbuf_fill(ts->write_buf, ts_packet, 188);
  96. }
  97. }
  98. }
  99. void *decode_thread(void *_ts) {
  100. struct ts *ts = _ts;
  101. uint8_t *data;
  102. int data_size;
  103. int req_size = 188 * dvbcsa_bs_batch_size();
  104. while (!ts->decode_stop) {
  105. data = cbuf_peek(ts->decode_buf, req_size, &data_size);
  106. if (data_size < req_size) {
  107. usleep(10000);
  108. continue;
  109. }
  110. data = cbuf_get(ts->decode_buf, req_size, &data_size);
  111. if (data)
  112. decode_buffer(ts, data, data_size);
  113. }
  114. do { // Flush data
  115. data = cbuf_get(ts->decode_buf, req_size, &data_size);
  116. if (data)
  117. decode_buffer(ts, data, data_size);
  118. } while(data);
  119. return NULL;
  120. }
  121. void *write_thread(void *_ts) {
  122. struct ts *ts = _ts;
  123. uint8_t *data;
  124. int data_size;
  125. while (!ts->write_stop) {
  126. data_size = 0;
  127. data = cbuf_peek(ts->write_buf, FRAME_SIZE, &data_size);
  128. if (data_size < FRAME_SIZE) {
  129. usleep(5000);
  130. continue;
  131. }
  132. data = cbuf_get (ts->write_buf, FRAME_SIZE, &data_size);
  133. if (data)
  134. write(ts->output.fd, data, data_size);
  135. }
  136. do { // Flush data
  137. data = cbuf_get(ts->write_buf, FRAME_SIZE, &data_size);
  138. if (data)
  139. write(ts->output.fd, data, data_size);
  140. } while(data);
  141. return NULL;
  142. }
  143. void process_packets(struct ts *ts, uint8_t *data, ssize_t data_len) {
  144. ssize_t i;
  145. for (i=0; i<data_len; i += 188) {
  146. uint8_t *ts_packet = data + i;
  147. uint16_t pid = ts_packet_get_pid(ts_packet);
  148. ts_pack_shown = 0;
  149. process_pat(ts, pid, ts_packet);
  150. process_cat(ts, pid, ts_packet);
  151. process_pmt(ts, pid, ts_packet);
  152. process_emm(ts, pid, ts_packet);
  153. process_ecm(ts, pid, ts_packet);
  154. if (!ts_pack_shown)
  155. dump_ts_pack(ts, pid, ts_packet);
  156. if (ts->threaded) {
  157. // Add to decode buffer. The decoder thread will handle it
  158. if (cbuf_fill(ts->decode_buf, ts_packet, 188) != 0) {
  159. ts_LOGf("Decode buffer is full, waiting...\n");
  160. cbuf_dump(ts->decode_buf);
  161. usleep(10000);
  162. }
  163. } else {
  164. decode_packet(ts, ts_packet);
  165. if (ts->pid_filter) {
  166. if (pidmap_get(&ts->pidmap, pid)) // PAT or allowed PIDs
  167. write(ts->output.fd, ts_packet, 188);
  168. } else {
  169. write(ts->output.fd, ts_packet, 188);
  170. }
  171. }
  172. ts_pack++;
  173. }
  174. }