edc_ecc.c
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:21k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* reed-solomon encoder / decoder for compact disc building project
  2.  * Copyright 1998 by Heiko Eissfeldt
  3.  * portions used& Chris Smith
  4.  */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include "ecc.h"
  9. /* these prototypes will become public when the function are implemented */
  10. static int do_decode_L2(unsigned char in[(L2_RAW+L2_Q+L2_P)],
  11. unsigned char out[L2_RAW]);
  12. static int do_decode_L1(unsigned char in[(L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR],
  13. unsigned char out[L1_RAW*FRAMES_PER_SECTOR],
  14. int delay1, int delay2, int delay3, int scramble);
  15. /* ------------- tables generated by gen_encodes --------------*/
  16. #include "encoder_tables"
  17. static int encode_L1_Q(unsigned char inout[L1_RAW + L1_Q])
  18. {
  19.   unsigned char *Q;
  20.   int i;
  21.   memmove(inout+L1_RAW/2+L1_Q, inout+L1_RAW/2, L1_RAW/2);
  22.   Q = inout + L1_RAW/2;
  23.   memset(Q, 0, L1_Q);
  24.   for (i = 0; i < L1_RAW + L1_Q; i++) {
  25. unsigned char data;
  26. if (i == L1_RAW/2) i += L1_Q;
  27.         data = inout[i];
  28. if (data != 0) {
  29. unsigned char base = rs_l12_log[data];
  30. Q[0] ^= rs_l12_alog[(base+AQ[0][i]) % ((1 << RS_L12_BITS)-1)];
  31. Q[1] ^= rs_l12_alog[(base+AQ[1][i]) % ((1 << RS_L12_BITS)-1)];
  32. Q[2] ^= rs_l12_alog[(base+AQ[2][i]) % ((1 << RS_L12_BITS)-1)];
  33. Q[3] ^= rs_l12_alog[(base+AQ[3][i]) % ((1 << RS_L12_BITS)-1)];
  34. }
  35.   }
  36.   return 0;
  37. }
  38. static int encode_L1_P(unsigned char inout[L1_RAW + L1_Q + L1_P])
  39. {
  40.   unsigned char *P;
  41.   int i;
  42.   P = inout + L1_RAW + L1_Q;
  43.   memset(P, 0, L1_P);
  44.   for (i = 0; i < L2_RAW + L2_Q + L2_P; i++) {
  45. unsigned char data;
  46.         data = inout[i];
  47. if (data != 0) {
  48. unsigned char base = rs_l12_log[data];
  49. P[0] ^= rs_l12_alog[(base+AP[0][i]) % ((1 << RS_L12_BITS)-1)];
  50. P[1] ^= rs_l12_alog[(base+AP[1][i]) % ((1 << RS_L12_BITS)-1)];
  51. P[2] ^= rs_l12_alog[(base+AP[2][i]) % ((1 << RS_L12_BITS)-1)];
  52. P[3] ^= rs_l12_alog[(base+AP[3][i]) % ((1 << RS_L12_BITS)-1)];
  53. }
  54.   }
  55.   return 0;
  56. }
  57. static int decode_L1_Q(unsigned char inout[L1_RAW + L1_Q])
  58. {
  59.   return 0;
  60. }
  61. static int decode_L1_P(unsigned char in[L1_RAW + L1_Q + L1_P])
  62. {
  63.   return 0;
  64. }
  65. static int encode_L2_Q(unsigned char inout[4 + L2_RAW + 4 + 8 + L2_P + L2_Q])
  66. {
  67.   unsigned char *Q;
  68.   int i,j;
  69.   Q = inout + 4 + L2_RAW + 4 + 8 + L2_P;
  70.   memset(Q, 0, L2_Q);
  71.   for (j = 0; j < 26; j++) {
  72.      for (i = 0; i < 43; i++) {
  73. unsigned char data;
  74.         /* LSB */
  75.         data = inout[(j*43*2+i*2*44) % (4 + L2_RAW + 4 + 8 + L2_P)];
  76. if (data != 0) {
  77. unsigned int base = rs_l12_log[data];
  78. unsigned int sum = base + DQ[0][i];
  79. if (sum >= ((1 << RS_L12_BITS)-1))
  80.   sum -= (1 << RS_L12_BITS)-1;
  81. Q[0]    ^= rs_l12_alog[sum];
  82. sum = base + DQ[1][i];
  83. if (sum >= ((1 << RS_L12_BITS)-1))
  84.   sum -= (1 << RS_L12_BITS)-1;
  85. Q[26*2] ^= rs_l12_alog[sum];
  86. }
  87.         /* MSB */
  88.         data = inout[(j*43*2+i*2*44+1) % (4 + L2_RAW + 4 + 8 + L2_P)];
  89. if (data != 0) {
  90. unsigned int base = rs_l12_log[data];
  91. unsigned int sum = base+DQ[0][i];
  92. if (sum >= ((1 << RS_L12_BITS)-1))
  93.   sum -= (1 << RS_L12_BITS)-1;
  94. Q[1]      ^= rs_l12_alog[sum];
  95. sum = base + DQ[1][i];
  96. if (sum >= ((1 << RS_L12_BITS)-1))
  97.   sum -= (1 << RS_L12_BITS)-1;
  98. Q[26*2+1] ^= rs_l12_alog[sum];
  99. }
  100.      }
  101.      Q += 2;
  102.   }
  103.   return 0;
  104. }
  105. static int encode_L2_P(unsigned char inout[4 + L2_RAW + 4 + 8 + L2_P])
  106. {
  107.   unsigned char *P;
  108.   int i,j;
  109.   P = inout + 4 + L2_RAW + 4 + 8;
  110.   memset(P, 0, L2_P);
  111.   for (j = 0; j < 43; j++) {
  112.      for (i = 0; i < 24; i++) {
  113. unsigned char data;
  114.         /* LSB */
  115.         data = inout[i*2*43];
  116. if (data != 0) {
  117. unsigned int base = rs_l12_log[data];
  118. unsigned int sum = base + DP[0][i];
  119. if (sum >= ((1 << RS_L12_BITS)-1))
  120.   sum -= (1 << RS_L12_BITS)-1;
  121. P[0]    ^= rs_l12_alog[sum];
  122. sum = base + DP[1][i];
  123. if (sum >= ((1 << RS_L12_BITS)-1))
  124.   sum -= (1 << RS_L12_BITS)-1;
  125. P[43*2] ^= rs_l12_alog[sum];
  126. }
  127.         /* MSB */
  128.         data = inout[i*2*43+1];
  129. if (data != 0) {
  130. unsigned int base = rs_l12_log[data];
  131. unsigned int sum = base + DP[0][i];
  132. if (sum >= ((1 << RS_L12_BITS)-1))
  133.   sum -= (1 << RS_L12_BITS)-1;
  134. P[1]      ^= rs_l12_alog[sum];
  135. sum = base + DP[1][i];
  136. if (sum >= ((1 << RS_L12_BITS)-1))
  137.   sum -= (1 << RS_L12_BITS)-1;
  138. P[43*2+1] ^= rs_l12_alog[sum];
  139. }
  140.      }
  141.      P += 2;
  142.      inout += 2;
  143.   }
  144.   return 0;
  145. }
  146. int decode_L2_Q(unsigned char inout[4 + L2_RAW + 12 + L2_Q])
  147. {
  148.   return 0;
  149. }
  150. int decode_L2_P(unsigned char inout[4 + L2_RAW + 12 + L2_Q + L2_P])
  151. {
  152.   return 0;
  153. }
  154. int scramble_L2(unsigned char *inout)
  155. {
  156.   unsigned char *r = inout + 12;
  157.   unsigned char *s = yellowbook_scrambler;
  158.   unsigned int i;
  159.   unsigned int *f = (unsigned int *)inout;
  160.   for (i = (L2_RAW + L2_Q + L2_P +16)/sizeof(unsigned char); i; i--) {
  161.     *r++ ^= *s++;
  162.   }
  163.   /* generate F1 frames */
  164.   for (i = (2352/sizeof(unsigned int)); i; i--) {
  165.     *f++ = ((*f & 0xff00ff00UL) >> 8) | ((*f & 0x00ff00ffUL) << 8);
  166.   }
  167.   return 0;
  168. }
  169. static int encode_LSUB_Q(unsigned char inout[LSUB_RAW + LSUB_Q])
  170. {
  171.   unsigned char *Q;
  172.   unsigned char data;
  173.   int i;
  174.   memmove(inout+LSUB_QRAW+LSUB_Q, inout+LSUB_QRAW, LSUB_RAW-LSUB_QRAW);
  175.   Q = inout + LSUB_QRAW;
  176.   memset(Q, 0, LSUB_Q);
  177. #if 0
  178.   data = inout[0] & 0x3f;
  179.   if (data != 0) {
  180. unsigned char base = rs_sub_rw_log[data];
  181. Q[0] ^= rs_sub_rw_alog[(base+26) % ((1 << RS_SUB_RW_BITS)-1)];
  182. Q[1] ^= rs_sub_rw_alog[(base+7) % ((1 << RS_SUB_RW_BITS)-1)];
  183.   }
  184.   data = inout[1] & 0x3f;
  185.   if (data != 0) {
  186. unsigned char base = rs_sub_rw_log[data];
  187. Q[0] ^= rs_sub_rw_alog[(base+6) % ((1 << RS_SUB_RW_BITS)-1)];
  188. Q[1] ^= rs_sub_rw_alog[(base+1) % ((1 << RS_SUB_RW_BITS)-1)];
  189.   }
  190. #else
  191.   for (i = 0; i < LSUB_QRAW; i++) {
  192. unsigned char data;
  193. data = inout[i] & 0x3f;
  194. if (data != 0) {
  195. unsigned char base = rs_sub_rw_log[data];
  196. Q[0] ^= rs_sub_rw_alog[(base+SQ[0][i]) % ((1 << RS_SUB_RW_BITS)-1)];
  197. Q[1] ^= rs_sub_rw_alog[(base+SQ[1][i]) % ((1 << RS_SUB_RW_BITS)-1)];
  198. }
  199.   }
  200. #endif
  201.   return 0;
  202. }
  203. static int encode_LSUB_P(unsigned char inout[LSUB_RAW + LSUB_Q + LSUB_P])
  204. {
  205.   unsigned char *P;
  206.   int i;
  207.   P = inout + LSUB_RAW + LSUB_Q;
  208.   memset(P, 0, LSUB_P);
  209.   for (i = 0; i < LSUB_RAW + LSUB_Q; i++) {
  210. unsigned char data;
  211. data = inout[i] & 0x3f;
  212. if (data != 0) {
  213. unsigned char base = rs_sub_rw_log[data];
  214. P[0] ^= rs_sub_rw_alog[(base+SP[0][i]) % ((1 << RS_SUB_RW_BITS)-1)];
  215. P[1] ^= rs_sub_rw_alog[(base+SP[1][i]) % ((1 << RS_SUB_RW_BITS)-1)];
  216. P[2] ^= rs_sub_rw_alog[(base+SP[2][i]) % ((1 << RS_SUB_RW_BITS)-1)];
  217. P[3] ^= rs_sub_rw_alog[(base+SP[3][i]) % ((1 << RS_SUB_RW_BITS)-1)];
  218. }
  219.   }
  220.   return 0;
  221. }
  222. int decode_LSUB_Q(unsigned char inout[LSUB_QRAW + LSUB_Q])
  223. {
  224.   unsigned char Q[LSUB_Q];
  225.   int i;
  226.   memset(Q, 0, LSUB_Q);
  227.   for (i = LSUB_QRAW + LSUB_Q -1; i>=0; i--) {
  228. unsigned char data;
  229. data = inout[LSUB_QRAW + LSUB_Q -1 -i] & 0x3f;
  230. if (data != 0) {
  231. unsigned char base = rs_sub_rw_log[data];
  232. Q[0] ^= rs_sub_rw_alog[(base+0*i) % ((1 << RS_SUB_RW_BITS)-1)];
  233. Q[1] ^= rs_sub_rw_alog[(base+1*i) % ((1 << RS_SUB_RW_BITS)-1)];
  234. }
  235.   }
  236.   return (Q[0] != 0 || Q[1] != 0);
  237. }
  238. int decode_LSUB_P(unsigned char inout[LSUB_RAW + LSUB_Q + LSUB_P])
  239. {
  240.   unsigned char P[LSUB_P];
  241.   int i;
  242.   memset(P, 0, LSUB_P);
  243.   for (i = LSUB_RAW + LSUB_Q + LSUB_P-1; i>=0; i--) {
  244. unsigned char data;
  245. data = inout[LSUB_RAW + LSUB_Q + LSUB_P -1 -i] & 0x3f;
  246. if (data != 0) {
  247. unsigned char base = rs_sub_rw_log[data];
  248. P[0] ^= rs_sub_rw_alog[(base+0*i) % ((1 << RS_SUB_RW_BITS)-1)];
  249. P[1] ^= rs_sub_rw_alog[(base+1*i) % ((1 << RS_SUB_RW_BITS)-1)];
  250. P[2] ^= rs_sub_rw_alog[(base+2*i) % ((1 << RS_SUB_RW_BITS)-1)];
  251. P[3] ^= rs_sub_rw_alog[(base+3*i) % ((1 << RS_SUB_RW_BITS)-1)];
  252. }
  253.   }
  254.   return (P[0] != 0 || P[1] != 0 || P[2] != 0 || P[3] != 0);
  255. }
  256. /* Layer 1 CIRC en/decoder */
  257. #define MAX_L1_DEL1 2
  258. static unsigned char l1_delay_line1[MAX_L1_DEL1][L1_RAW];
  259. #define MAX_L1_DEL2 108
  260. static unsigned char l1_delay_line2[MAX_L1_DEL2][L1_RAW+L1_Q];
  261. #define MAX_L1_DEL3 1
  262. static unsigned char l1_delay_line3[MAX_L1_DEL3][L1_RAW+L1_Q+L1_P];
  263. static unsigned l1_del_index;
  264. int do_encode_L1(unsigned char in[L1_RAW*FRAMES_PER_SECTOR],
  265. unsigned char out[(L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR],
  266. int delay1, int delay2, int delay3, int permute)
  267. {
  268.   int i;
  269.   for (i = 0; i < FRAMES_PER_SECTOR; i++) {
  270.      int j;
  271.      unsigned char t;
  272.      if (in != out)
  273. memcpy(out, in, L1_RAW);
  274.      if (delay1) {
  275. /* shift through delay line 1 */
  276.   for (j = 0; j < L1_RAW; j++) {
  277. if (((j/4) % MAX_L1_DEL1) == 0) {
  278. t = l1_delay_line1[l1_del_index % (MAX_L1_DEL1)][j];
  279. l1_delay_line1[l1_del_index % (MAX_L1_DEL1)][j] = out[j];
  280. out[j] = t;
  281. }
  282. }
  283.      }
  284.      if (permute) {
  285. /* permute */
  286. t = out[2]; out[2] = out[8]; out[8] = out[10]; out[10] = out[18];
  287.         out[18] = out[6]; out [6] = t;
  288. t = out[3]; out[3] = out[9]; out[9] = out[11]; out[11] = out[19];
  289.         out[19] = out[7]; out [7] = t;
  290. t = out[4]; out[4] = out[16]; out[16] = out[20]; out[20] = out[14];
  291.         out[14] = out[12]; out [12] = t;
  292. t = out[5]; out[5] = out[17]; out[17] = out[21]; out[21] = out[15];
  293.         out[15] = out[13]; out [13] = t;
  294.      }
  295.      /* build Q parity */
  296.      encode_L1_Q(out);
  297.      if (delay2) {
  298. /* shift through delay line 2 */
  299.   for (j = 0; j < L1_RAW+L1_Q; j++) {
  300. if (j != 0) {
  301. t = l1_delay_line2[(l1_del_index) % MAX_L1_DEL2][j];
  302. l1_delay_line2[(l1_del_index + j*4) % MAX_L1_DEL2][j] = out[j];
  303. out[j] = t;
  304. }
  305. }
  306.      }
  307.      /* build P parity */
  308.      encode_L1_P(out);
  309.      if (delay3) {
  310. /* shift through delay line 3 */
  311.   for (j = 0; j < L1_RAW+L1_Q+L1_P; j++) {
  312. if (((j) & MAX_L1_DEL3) == 0) {
  313. t = l1_delay_line3[0][j];
  314. l1_delay_line3[0][j] = out[j];
  315. out[j] = t;
  316. }
  317. }
  318.      }
  319.      /* invert Q and P parity */
  320.      for (j = 0; j < L1_Q; j++)
  321. out[j+12] = ~out[j+12];
  322.      for (j = 0; j < L1_P; j++)
  323. out[j+28] = ~out[j+28];
  324.      l1_del_index++;
  325.      out += L1_RAW+L1_Q+L1_P;
  326.      in += L1_RAW;
  327.   }
  328.   return 0;
  329. }
  330. int do_decode_L1(unsigned char in[(L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR],
  331. unsigned char out[L1_RAW*FRAMES_PER_SECTOR],
  332. int delay1, int delay2, int delay3, int permute)
  333. {
  334.   int i;
  335.   for (i = 0; i < FRAMES_PER_SECTOR; i++) {
  336.      int j;
  337.      unsigned char t;
  338.      if (delay3) {
  339. /* shift through delay line 3 */
  340.   for (j = 0; j < L1_RAW+L1_Q+L1_P; j++) {
  341. if (((j) & MAX_L1_DEL3) != 0) {
  342. t = l1_delay_line3[0][j];
  343. l1_delay_line3[0][j] = in[j];
  344. in[j] = t;
  345. }
  346. }
  347.      }
  348.      /* invert Q and P parity */
  349.      for (j = 0; j < L1_Q; j++)
  350. in[j+12] = ~in[j+12];
  351.      for (j = 0; j < L1_P; j++)
  352. in[j+28] = ~in[j+28];
  353.      /* build P parity */
  354.      decode_L1_P(in);
  355.      if (delay2) {
  356. /* shift through delay line 2 */
  357.   for (j = 0; j < L1_RAW+L1_Q; j++) {
  358. if (j != L1_RAW+L1_Q-1) {
  359. t = l1_delay_line2[(l1_del_index) % MAX_L1_DEL2][j];
  360. l1_delay_line2[(l1_del_index + (MAX_L1_DEL2 - j*4)) % MAX_L1_DEL2][j] = in[j];
  361. in[j] = t;
  362. }
  363. }
  364.      }
  365.      /* build Q parity */
  366.      decode_L1_Q(in);
  367.      if (permute) {
  368. /* permute */
  369. t = in[2]; in[2] = in[6]; in[6] = in[18]; in[18] = in[10];
  370.         in[10] = in[8]; in [8] = t;
  371. t = in[3]; in[3] = in[7]; in[7] = in[19]; in[19] = in[11];
  372.         in[11] = in[9]; in [9] = t;
  373. t = in[4]; in[4] = in[12]; in[12] = in[14]; in[14] = in[20];
  374.         in[20] = in[16]; in [16] = t;
  375. t = in[5]; in[5] = in[13]; in[13] = in[15]; in[15] = in[21];
  376.         in[21] = in[17]; in [17] = t;
  377.      }
  378.      if (delay1) {
  379. /* shift through delay line 1 */
  380.   for (j = 0; j < L1_RAW; j++) {
  381. if (((j/4) % MAX_L1_DEL1) != 0) {
  382. t = l1_delay_line1[l1_del_index % (MAX_L1_DEL1)][j];
  383. l1_delay_line1[l1_del_index % (MAX_L1_DEL1)][j] = in[j];
  384. in[j] = t;
  385. }
  386. }
  387.      }
  388.      if (in != out)
  389. memcpy(out, in, (L1_RAW));
  390.      l1_del_index++;
  391.      in += L1_RAW+L1_Q+L1_P;
  392.      out += L1_RAW;
  393.   }
  394.   return 0;
  395. }
  396. static unsigned char bin2bcd(unsigned p)
  397. {
  398.   return ((p/10)<<4)|(p%10);
  399. }
  400. static int build_address(unsigned char inout[], int sectortype, unsigned address)
  401. {
  402.   inout[12] = bin2bcd(address / (60*75));
  403.   inout[13] = bin2bcd((address / 75) % 60);
  404.   inout[14] = bin2bcd(address % 75);
  405.   if (sectortype == MODE_0)
  406. inout[15] = 0;
  407.   else if (sectortype == MODE_1)
  408. inout[15] = 1;
  409.   else if (sectortype == MODE_2)
  410. inout[15] = 2;
  411.   else if (sectortype == MODE_2_FORM_1)
  412. inout[15] = 2;
  413.   else if (sectortype == MODE_2_FORM_2)
  414. inout[15] = 2;
  415.   else
  416. return -1;
  417.   return 0;
  418. }
  419. #include "crctable.out"
  420. unsigned int build_edc(unsigned char inout[], int from, int upto)
  421. {
  422.   unsigned char *p = inout+from;
  423.   unsigned int result = 0;
  424.   for (; from <= upto; from++)
  425.     result = EDC_crctable[(result ^ *p++) & 0xffL] ^ (result >> 8);
  426.   return result;
  427. }
  428. /* Layer 2 Product code en/decoder */
  429. int do_encode_L2(unsigned char inout[(12 + 4 + L2_RAW+4+8+L2_Q+L2_P)], int sectortype, unsigned address)
  430. {
  431.   unsigned int result;
  432. #define SYNCPATTERN "x00xffxffxffxffxffxffxffxffxffxff"
  433.   /* supply initial sync pattern */
  434.   memcpy(inout, SYNCPATTERN, sizeof(SYNCPATTERN));
  435.   if (sectortype == MODE_0) {
  436. memset(inout + sizeof(SYNCPATTERN), 0, 4 + L2_RAW + 12 + L2_P + L2_Q);
  437.         build_address(inout, sectortype, address);
  438. return 0;
  439.   }
  440.   
  441.   switch (sectortype) {
  442.     case MODE_1:
  443.         build_address(inout, sectortype, address);
  444. result = build_edc(inout, 0, 16+2048-1);
  445. inout[2064+0] = result >> 0L;
  446. inout[2064+1] = result >> 8L;
  447. inout[2064+2] = result >> 16L;
  448. inout[2064+3] = result >> 24L;
  449. memset(inout+2064+4, 0, 8);
  450.    encode_L2_P(inout+12);
  451.   encode_L2_Q(inout+12);
  452. break;
  453.     case MODE_2:
  454.         build_address(inout, sectortype, address);
  455. break;
  456.     case MODE_2_FORM_1:
  457.         result = build_edc(inout, 16, 16+8+2048-1);
  458. inout[2072+0] = result >> 0L;
  459. inout[2072+1] = result >> 8L;
  460. inout[2072+2] = result >> 16L;
  461. inout[2072+3] = result >> 24L;
  462. /* clear header for P/Q parity calculation */
  463. inout[12] = 0;
  464. inout[12+1] = 0;
  465. inout[12+2] = 0;
  466. inout[12+3] = 0;
  467.    encode_L2_P(inout+12);
  468.   encode_L2_Q(inout+12);
  469. build_address(inout, sectortype, address);
  470. break;
  471.     case MODE_2_FORM_2:
  472.         build_address(inout, sectortype, address);
  473. result = build_edc(inout, 16, 16+8+2324-1);
  474. inout[2348+0] = result >> 0L;
  475. inout[2348+1] = result >> 8L;
  476. inout[2348+2] = result >> 16L;
  477. inout[2348+3] = result >> 24L;
  478. break;
  479.     default:
  480. return -1;
  481.   }
  482.   return 0;
  483. }
  484. static int do_decode_L2(unsigned char in[(L2_RAW+L2_Q+L2_P)],
  485. unsigned char out[L2_RAW])
  486. {
  487.   return 0;
  488. }
  489. #define MAX_SUB_DEL 8
  490. static unsigned char sub_delay_line[MAX_SUB_DEL][LSUB_RAW+LSUB_Q+LSUB_P];
  491. static unsigned sub_del_index;
  492. /* R-W Subchannel en/decoder */
  493. int do_encode_sub(unsigned char in[LSUB_RAW*PACKETS_PER_SUBCHANNELFRAME],
  494. unsigned char out[(LSUB_RAW+LSUB_Q+LSUB_P)*PACKETS_PER_SUBCHANNELFRAME],
  495. int delay1, int permute)
  496. {
  497.   int i;
  498.   if (in == out) return -1;
  499.   for (i = 0; i < PACKETS_PER_SUBCHANNELFRAME; i++) {
  500.      int j;
  501.      unsigned char t;
  502.      memcpy(out, in, (LSUB_RAW));
  503.      /* build Q parity */
  504.      encode_LSUB_Q(out);
  505.      /* build P parity */
  506.      encode_LSUB_P(out);
  507.      if (permute) {
  508. /* permute */
  509. t = out[1]; out[1] = out[18]; out[18] = t;
  510. t = out[2]; out[2] = out[ 5]; out[ 5] = t;
  511. t = out[3]; out[3] = out[23]; out[23] = t;
  512.      }
  513.      if (delay1) {
  514. /* shift through delay_line */
  515.   for (j = 0; j < LSUB_RAW+LSUB_Q+LSUB_P; j++) {
  516. if ((j % MAX_SUB_DEL) != 0) {
  517. t = sub_delay_line[(sub_del_index) % MAX_SUB_DEL][j];
  518. sub_delay_line[(sub_del_index + j) % MAX_SUB_DEL][j] = out[j];
  519. out[j] = t;
  520. }
  521. }
  522.      }
  523.      sub_del_index++;
  524.      out += LSUB_RAW+LSUB_Q+LSUB_P;
  525.      in += LSUB_RAW;
  526.   }
  527.   return 0;
  528. }
  529. int 
  530. do_decode_sub(
  531.      unsigned char in[(LSUB_RAW+LSUB_Q+LSUB_P)*PACKETS_PER_SUBCHANNELFRAME],
  532.      unsigned char out[LSUB_RAW*PACKETS_PER_SUBCHANNELFRAME],
  533.      int delay1, int permute)
  534. {
  535.   int i;
  536.   if (in == out) return -1;
  537.   for (i = 0; i < PACKETS_PER_SUBCHANNELFRAME; i++) {
  538.      int j;
  539.      unsigned char t;
  540.      if (delay1) {
  541. /* shift through delay_line */
  542.   for (j = 0; j < LSUB_RAW+LSUB_Q+LSUB_P; j++) {
  543. if ((j % MAX_SUB_DEL) != MAX_SUB_DEL-1) {
  544. t = sub_delay_line[(sub_del_index) % MAX_SUB_DEL][j];
  545. sub_delay_line[(sub_del_index + (MAX_SUB_DEL - j)) % MAX_SUB_DEL][j] = in[j];
  546. in[j] = t;
  547. }
  548. }
  549.      }
  550.      if (permute) {
  551. /* permute */
  552. t = in[1]; in[1] = in[18]; in[18] = t;
  553. t = in[2]; in[2] = in[ 5]; in[ 5] = t;
  554. t = in[3]; in[3] = in[23]; in[23] = t;
  555.      }
  556.      /* build P parity */
  557.      decode_LSUB_P(in);
  558.      /* build Q parity */
  559.      decode_LSUB_Q(in);
  560.      memcpy(out, in, LSUB_QRAW);
  561.      memcpy(out+LSUB_QRAW, in+LSUB_QRAW+LSUB_Q, LSUB_RAW-LSUB_QRAW);
  562.      sub_del_index++;
  563.      in += LSUB_RAW+LSUB_Q+LSUB_P;
  564.      out += LSUB_RAW;
  565.   }
  566.   return 0;
  567. }
  568. static int sectortype = MODE_0;
  569. int get_sector_type(void)
  570. {
  571.   return sectortype;
  572. }
  573. int set_sector_type(int st)
  574. {
  575.   switch(st) {
  576.     case MODE_0:
  577.     case MODE_1:
  578.     case MODE_2:
  579.     case MODE_2_FORM_1:
  580.     case MODE_2_FORM_2:
  581.       sectortype = st;
  582.     default:
  583.       return -1;
  584.   }
  585.   return 0;
  586. }
  587. /* ------------- --------------*/
  588. #ifdef MAIN
  589. #define DO_L1 1
  590. #define DO_L2 2
  591. #define DO_SUB 4
  592. static const unsigned sect_size[8][2] = {
  593. /* nothing */
  594. {0,0},
  595. /* Layer 1 decode/encode */
  596. { (L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR, L1_RAW*FRAMES_PER_SECTOR},
  597. /* Layer 2 decode/encode */
  598. { 16+L2_RAW+12+L2_Q+L2_P, L2_RAW},
  599. /* Layer 1 and 2 decode/encode */
  600. { (L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR, L1_RAW*FRAMES_PER_SECTOR},
  601. /* Subchannel decode/encode */
  602. { (LSUB_RAW+LSUB_Q+LSUB_P)*PACKETS_PER_SUBCHANNELFRAME,
  603.  LSUB_RAW*PACKETS_PER_SUBCHANNELFRAME},
  604. /* Layer 1 and subchannel decode/encode */
  605. { (L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR +
  606.    (LSUB_RAW+LSUB_Q+LSUB_P)*PACKETS_PER_SUBCHANNELFRAME,
  607.   LSUB_RAW*PACKETS_PER_SUBCHANNELFRAME +
  608.    L1_RAW*FRAMES_PER_SECTOR},
  609. /* Layer 2 and subchannel decode/encode */
  610. { L2_RAW+L2_Q+L2_P+
  611.    (LSUB_RAW+LSUB_Q+LSUB_P)*PACKETS_PER_SUBCHANNELFRAME,
  612.   LSUB_RAW*PACKETS_PER_SUBCHANNELFRAME +
  613.    L2_RAW},
  614. /* Layer 1, 2 and subchannel decode/encode */
  615. { (L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR +
  616.    (LSUB_RAW+LSUB_Q+LSUB_P)*PACKETS_PER_SUBCHANNELFRAME,
  617.   LSUB_RAW*PACKETS_PER_SUBCHANNELFRAME +
  618.    L1_RAW*FRAMES_PER_SECTOR},
  619. };
  620. int main(int argc, char **argv)
  621. {
  622.   int encode = 1;
  623.   int mask = DO_L2;
  624.   FILE *infp;
  625.   FILE *outfp;
  626.   unsigned address = 0;
  627.   unsigned char *l1_inbuf;
  628.   unsigned char *l1_outbuf;
  629.   unsigned char *l2_inbuf;
  630.   unsigned char *l2_outbuf;
  631.   unsigned char *sub_inbuf;
  632.   unsigned char *sub_outbuf;
  633.   unsigned char *last_outbuf;
  634.   unsigned char inbuf[(LSUB_RAW+LSUB_Q+LSUB_P)*PACKETS_PER_SUBCHANNELFRAME +
  635. (L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR];
  636.   unsigned char outbuf[(LSUB_RAW+LSUB_Q+LSUB_P)*PACKETS_PER_SUBCHANNELFRAME +
  637. (L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR];
  638.   unsigned load_offset;
  639.   l1_inbuf = l2_inbuf = sub_inbuf = inbuf;
  640.   l1_outbuf = l2_outbuf = sub_outbuf = last_outbuf = outbuf;
  641.   infp = fopen("sectors_in", "rb");
  642.   outfp = fopen("sectors_out", "wb");
  643.   sectortype= MODE_1;
  644.   address = 0 + 75*2;
  645.   switch (sectortype) {
  646. case MODE_1:
  647. case MODE_2:
  648. load_offset = 16;
  649. break;
  650. case MODE_2_FORM_1:
  651. case MODE_2_FORM_2:
  652. load_offset = 24;
  653. break;
  654. default:
  655. load_offset = 0;
  656.   }
  657.   while(1) {
  658. if (1 != fread(inbuf+load_offset,
  659.   sect_size[mask][encode], 1, infp)) { perror(""); break; }
  660. if (encode == 1) {
  661.       if (mask & DO_L2) {
  662. switch (sectortype) {
  663. case MODE_0:
  664. break;
  665. case MODE_1:
  666. break;
  667. case MODE_2:
  668. if (1 !=
  669.   fread(inbuf+load_offset+
  670. sect_size[mask][encode],
  671.   2336 - sect_size[mask][encode],
  672. 1, infp)) { perror(""); break; }
  673. break;
  674. case MODE_2_FORM_1:
  675. break;
  676. case MODE_2_FORM_2:
  677. if (1 !=
  678.   fread(inbuf+load_offset+
  679. sect_size[mask][encode],
  680.   2324 - sect_size[mask][encode],
  681. 1, infp)) { perror(""); break; }
  682. break;
  683. default:
  684. if (1 !=
  685.   fread(inbuf+load_offset+
  686. sect_size[mask][encode],
  687.   2448 - sect_size[mask][encode],
  688. 1, infp)) { perror(""); break; }
  689. memset(inbuf,0,16);
  690. /*memset(inbuf+16+2048,0,12+272);*/
  691. break;
  692. }
  693. do_encode_L2(l2_inbuf, MODE_1, address);
  694. if (0) scramble_L2(l2_inbuf);
  695. last_outbuf = l1_inbuf = l2_inbuf;
  696. l1_outbuf = l2_inbuf;
  697. sub_inbuf = l2_inbuf + L2_RAW;
  698. sub_outbuf = l2_outbuf + 12 + 4+ L2_RAW+4+ 8+ L2_Q+L2_P;
  699.       }
  700.       if (mask & DO_L1) {
  701. do_encode_L1(l1_inbuf, l1_outbuf,1,1,1,1);
  702. last_outbuf = l1_outbuf;
  703. sub_inbuf = l1_inbuf + L1_RAW*FRAMES_PER_SECTOR;
  704. sub_outbuf = l1_outbuf + (L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR;
  705.       }
  706.       if (mask & DO_SUB) {
  707. do_encode_sub(sub_inbuf, sub_outbuf, 0, 0);
  708.       }
  709. } else {
  710.       if (mask & DO_L1) {
  711. do_decode_L1(l1_inbuf, l1_outbuf,1,1,1,1);
  712. last_outbuf = l2_inbuf = l1_outbuf;
  713. l2_outbuf = l1_inbuf;
  714. sub_inbuf = l1_inbuf + (L1_RAW+L1_Q+L1_P)*FRAMES_PER_SECTOR;
  715. sub_outbuf = l1_outbuf + L1_RAW*FRAMES_PER_SECTOR;
  716.       }
  717.       if (mask & DO_L2) {
  718. do_decode_L2(l2_inbuf, l2_outbuf);
  719. last_outbuf = l2_outbuf;
  720. sub_inbuf = l2_inbuf + L2_RAW+L2_Q+L2_P;
  721. sub_outbuf = l2_outbuf + L2_RAW;
  722.       }
  723.       if (mask & DO_SUB) {
  724. do_decode_sub(sub_inbuf, sub_outbuf, 1, 1);
  725.       }
  726. }
  727. if (1 != fwrite(last_outbuf, sect_size[mask][1 - encode], 1, outfp)) {
  728. perror("");
  729. break;
  730. }
  731. address++;
  732.   }
  733. #if 0
  734.   /* flush the data from the delay lines with zeroed sectors, if necessary */
  735. #endif
  736.   return 0;
  737. }
  738. #endif