00001 #include <math.h>
00002 #include "rcpcc_hg16.h"
00003 #include "uep_rcpcc.h"
00004
00005 extern int debug;
00006 static int ppx[4][8][4];
00007
00008 void Makeppx(int Rtype)
00009 {
00010 int i, j, k;
00011 int step = 32- Rtype;
00012 int row = 0;
00013 while (Rtype >=0)
00014 {
00015 if (row == 0){
00016 for (i=0; i<8; i++)
00017 for (j=0; j< 4; j++)
00018 ppx[row][i][j] = px[Rtype][i][j];
00019 }
00020 else
00021 {
00022 for (i=0; i<8; i++)
00023 for (j=0; j< 4; j++)
00024 ppx[row][i][j] = px[Rtype][i][j] - px[Rtype + step][i][j];
00025 }
00026 Rtype = Rtype - step;
00027 row ++;
00028 }
00029
00030 if (debug >= 5) {
00031 printf("ppx\n");
00032 for (i=0; i< 4; i++){
00033 printf("row %d\n", i);
00034 for (j=0; j < 8; j++){
00035 for (k=0; k< 4; k++)
00036 printf("%d ", ppx[i][j][k]);
00037 if (j <=6)
00038 printf(", ");
00039 }
00040 printf("\n ");
00041 }
00042 }
00043 }
00044
00045 void GetRcpcBits(buf_rcpc *b1, int *rcpc_bits1, int *rcpc_bits2, int Rtype , int N)
00046 {
00047
00048 int j,i,k;
00049 int step = 32 - Rtype;
00050 int *temp_bits[4];
00051 int buff[8][4];
00052 int co[4];
00053 int co2 = 0;
00054 int new_Rtype = Rtype - step * ((b1->count) - 1) ;
00055 int loopmax;
00056
00057 ConvBytes2Bits(b1->block[ (b1->count) - 1], rcpc_bits1, N);
00058 if (debug >= 5)
00059 printf(" into GetRcpcBits\n");
00060
00061
00062
00063
00064
00065
00066 if (b1->count > max_arq(Rtype) + 1)
00067 loopmax = max_arq(Rtype) + 1;
00068 else
00069 loopmax = b1->count;
00070
00071 for (i=0; i< loopmax; i++){
00072 temp_bits[i] = (int *) malloc(10 * N * 8 *sizeof(int) );
00073 if (temp_bits[i] == NULL)
00074 printf("GetRcpcbits () - error can't malloc temp_bits[%d]\n",i);
00075
00076 ConvBytes2Bits(b1->block[i], temp_bits[i], N);
00077 co[i] = 0;
00078 }
00079
00080 while ( co2 < N * 8 * loopmax ){
00081 for (i=0; i< 8; i++){
00082 for (j=0; j< 4; j++){
00083 buff[i][j]= 0;
00084
00085 for (k=0; k< loopmax; k++)
00086 {
00087 if (ppx[k][i][j] ==1)
00088 {
00089 buff[i][j] = temp_bits[k][co[k]];
00090 co[k]++;
00091 }
00092 }
00093 if ((px[new_Rtype][i][j] == 1 ) &&( co2 < N * 8 * (b1->count)) )
00094 {
00095 rcpc_bits2[co2] = buff[i][j];
00096 co2++;
00097 }
00098 }
00099 }
00100 }
00101
00102 if (debug >= 5)
00103 printf(" end of GetRcpcBits\n");
00104 for (i=0; i< loopmax; i++){
00105 free(temp_bits[i]);
00106 }
00107 }
00108
00109 unsigned char *DecodeVideoPacket(int Rtype, int N, buf_rcpc *b1,
00110 int *CRC_flag, int *K, int CRCBytes,
00111 int arq_type)
00112 {
00113 int *out_bits;
00114 int i, j;
00115 int *rcpc_bits1;
00116 int *rcpc_bits2;
00117 int step = 32 - Rtype;
00118 int new_Rtype;
00119 unsigned char *info_bytes;
00120
00121
00122
00123 rcpc_bits1= (int *)malloc(N * 8 *sizeof(int));
00124 if (rcpc_bits1 == NULL) {
00125 printf("DecodeVideoPacket () - error can't malloc rcpc_bits1\n");
00126 }
00127
00128
00129 rcpc_bits2= (int *)malloc(N * 8 * (b1->count) *sizeof(int));
00130 if (rcpc_bits2 == NULL) {
00131 printf("DecodeVideoPacket () - error can't malloc rcpc_bits2\n");
00132 }
00133
00134 (*K)=rcpcc16_getK(Rtype,N,CRCBytes);
00135
00136 info_bytes = (unsigned char *)calloc((*K)+CRCBytes, sizeof(unsigned char ));
00137 if (info_bytes == NULL)
00138 printf("DecodeVideoPacket () - error can't calloc info_bytes");
00139 out_bits = (int *)calloc( ( (*K) + CRCBytes) * 8 + TAILBITS, sizeof(int) );
00140 if (out_bits == NULL)
00141 printf("DecodeVideoPacket () - error can't calloc out_bits\n");
00142
00143
00144 Makeppx(Rtype);
00145
00146 GetRcpcBits(b1, rcpc_bits1, rcpc_bits2, Rtype, N );
00147
00148
00149 if ((b1->count) == 1) {
00150
00151 rcpcc16_decode(rcpc_bits1, out_bits, Rtype, N, ppx[0],CRCBytes);
00152
00153 ConvBits2Bytes(out_bits, info_bytes, (*K)+CRCBytes);
00154
00155 *CRC_flag = CheckCRC(info_bytes, (*K), CRCBytes);
00156
00157 } else if ((b1->count) > 1) {
00158
00159
00160
00161
00162 if((arq_type == 3) || (arq_type == 1)) {
00163
00164 rcpcc16_decode(rcpc_bits1, out_bits, Rtype, N, ppx[b1->count - 1],CRCBytes);
00165
00166 ConvBits2Bytes(out_bits, info_bytes, (*K)+CRCBytes);
00167
00168 *CRC_flag = CheckCRC(info_bytes, (*K), CRCBytes);
00169
00170 }
00171
00172
00173
00174 if (((*CRC_flag == 0) && (arq_type == 3)) || (arq_type==2)) {
00175 for (i=0; i< ( (*K) + CRCBytes) * 8 + TAILBITS ; i++)
00176 out_bits[i]= 0;
00177
00178 new_Rtype = Rtype - step*( (b1->count) -1);
00179
00180 rcpcc16_decode(rcpc_bits2, out_bits, new_Rtype,
00181 (b1->count)*N, px[new_Rtype],CRCBytes);
00182
00183 ConvBits2Bytes(out_bits, info_bytes, *K+CRCBytes);
00184
00185 *CRC_flag = CheckCRC(info_bytes, (*K), CRCBytes);
00186
00187 }
00188 }
00189
00190
00191 free(out_bits);
00192 free(rcpc_bits1);
00193 free(rcpc_bits2);
00194
00195 return info_bytes;
00196 }
00197