H261 decoder

Dependencies:   SDL_lib2 SX1276Lib mbed

Committer:
miruga27
Date:
Wed Jan 11 20:18:38 2017 +0000
Revision:
1:1ed97958d0f3
Parent:
0:5bd441b8ab2d
JPEG Compressor and SX1276 transmitter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miruga27 1:1ed97958d0f3 1
miruga27 0:5bd441b8ab2d 2
miruga27 0:5bd441b8ab2d 3
miruga27 0:5bd441b8ab2d 4 /*
miruga27 0:5bd441b8ab2d 5 * decoder.c
miruga27 0:5bd441b8ab2d 6 *
miruga27 0:5bd441b8ab2d 7 * Created on: 5/7/2016
miruga27 0:5bd441b8ab2d 8 * Author: Miguel Ruiz García
miruga27 0:5bd441b8ab2d 9 Company: University of Cantabria
miruga27 0:5bd441b8ab2d 10 e-mail:mrg47@alumnos.unican.es
miruga27 0:5bd441b8ab2d 11 */
miruga27 0:5bd441b8ab2d 12
miruga27 0:5bd441b8ab2d 13
miruga27 0:5bd441b8ab2d 14 #include <SDL.h>
miruga27 0:5bd441b8ab2d 15 #include <stdio.h>
miruga27 0:5bd441b8ab2d 16 #include "mbed.h"
miruga27 0:5bd441b8ab2d 17 #include "functions_dec.h"
miruga27 0:5bd441b8ab2d 18 #include "lora.h"
miruga27 1:1ed97958d0f3 19 //#include "debug.h"
miruga27 0:5bd441b8ab2d 20 #define BPS 128000
miruga27 0:5bd441b8ab2d 21 #define BITS 8
miruga27 0:5bd441b8ab2d 22 #define STOP_BITS 1
miruga27 0:5bd441b8ab2d 23
miruga27 1:1ed97958d0f3 24 //DigitalOut myled(LED1);
miruga27 0:5bd441b8ab2d 25
miruga27 0:5bd441b8ab2d 26 int main(int argc, char *argv[]){
miruga27 0:5bd441b8ab2d 27 Serial pc(USBTX, USBRX);
miruga27 0:5bd441b8ab2d 28 pc.baud(BPS);
miruga27 0:5bd441b8ab2d 29 pc.format (BITS,SerialBase::None, STOP_BITS) ;
miruga27 0:5bd441b8ab2d 30
miruga27 0:5bd441b8ab2d 31 int i=0,j=0,p_x=0,p_y=0,k=0;
miruga27 1:1ed97958d0f3 32 //myled=1;
miruga27 0:5bd441b8ab2d 33 short int m[HEIGHT][WIDTH][3];
miruga27 0:5bd441b8ab2d 34 short int *matriz=(short int *)malloc(sizeof(short int)*WIDTH*HEIGHT*3);
miruga27 1:1ed97958d0f3 35 short int index1,index2,index3;
miruga27 0:5bd441b8ab2d 36 short int acumulador[3]={0,0,0};
miruga27 1:1ed97958d0f3 37 int veces=0;
miruga27 1:1ed97958d0f3 38
miruga27 1:1ed97958d0f3 39 for(veces=0; veces < 30;veces++){
miruga27 0:5bd441b8ab2d 40 short int *temp1,*temp2,*temp3;//these are vectors. Memory allocations are done at lora function.
miruga27 1:1ed97958d0f3 41 temp3=(short int *)malloc(sizeof(short int)*380);
miruga27 1:1ed97958d0f3 42 temp2=(short int *)malloc(sizeof(short int)*300);
miruga27 1:1ed97958d0f3 43 temp1=(short int *)malloc(sizeof(short int)*300);
miruga27 1:1ed97958d0f3 44 //debug("lora\r\n");
miruga27 1:1ed97958d0f3 45 lora(temp1,index1,temp2,index2,temp3,index3,acumulador);//acumulador tells the length of the respective vector(acumulador[0] -> temp1,...)
miruga27 0:5bd441b8ab2d 46 int indice=0;
miruga27 1:1ed97958d0f3 47 // debug("paquete numero %i\r\n",veces+1);
miruga27 0:5bd441b8ab2d 48 //We must "unroll" the vectors after being processed with the RLC (in the encoder)
miruga27 1:1ed97958d0f3 49
miruga27 1:1ed97958d0f3 50 /* debug("return from lora function...\r\n");
miruga27 1:1ed97958d0f3 51 debug("acumulador[0]= %i\r\n",acumulador[0]);
miruga27 1:1ed97958d0f3 52 debug("acumulador[0]= %i\r\n",acumulador[1]);
miruga27 1:1ed97958d0f3 53 debug("acumulador[0]= %i\r\n",acumulador[2]);
miruga27 1:1ed97958d0f3 54 debug("Paquete numero %i\r\n",veces+1);*/
miruga27 1:1ed97958d0f3 55 k=0;
miruga27 1:1ed97958d0f3 56 short int acc1=0,acc2=0,acc3=0;
miruga27 1:1ed97958d0f3 57 for(i=0;i<acumulador[0]/2;i++){//Se divide entre 2 poque se cuentan por pares (longitud,valor).
miruga27 1:1ed97958d0f3 58 for(j=k;j<(*(temp1+indice)*3+k);j+=3){
miruga27 1:1ed97958d0f3 59
miruga27 1:1ed97958d0f3 60 *(matriz+j)=*(temp1+indice+1);
miruga27 1:1ed97958d0f3 61 acc1++;
miruga27 1:1ed97958d0f3 62 if(j>HEIGHT*WIDTH*3) break;
miruga27 1:1ed97958d0f3 63 //debug("iteracion\r\n");
miruga27 1:1ed97958d0f3 64 }
miruga27 1:1ed97958d0f3 65 k=j;
miruga27 1:1ed97958d0f3 66 indice+=2;
miruga27 1:1ed97958d0f3 67
miruga27 1:1ed97958d0f3 68 }
miruga27 1:1ed97958d0f3 69 for(i=(acc1-1)*3;i<HEIGHT*WIDTH*3;i++){
miruga27 1:1ed97958d0f3 70 *(matriz+i)=0;
miruga27 1:1ed97958d0f3 71
miruga27 1:1ed97958d0f3 72 }
miruga27 1:1ed97958d0f3 73
miruga27 1:1ed97958d0f3 74 //debug("*(temp1+indice)= %i\r\n",*(temp1+0));
miruga27 1:1ed97958d0f3 75 indice=0;
miruga27 1:1ed97958d0f3 76 k=0;
miruga27 1:1ed97958d0f3 77 for(i=0;i<acumulador[1]/2;i++){
miruga27 1:1ed97958d0f3 78
miruga27 1:1ed97958d0f3 79 for(j=k;j<(*(temp2+indice)*3+k);j+=3){
miruga27 1:1ed97958d0f3 80
miruga27 1:1ed97958d0f3 81 *(matriz+j+1)=*(temp2+indice+1);
miruga27 1:1ed97958d0f3 82 acc2++;
miruga27 1:1ed97958d0f3 83 if(j>HEIGHT*WIDTH*3) break;
miruga27 0:5bd441b8ab2d 84 }
miruga27 0:5bd441b8ab2d 85 k=j;
miruga27 0:5bd441b8ab2d 86 indice+=2;
miruga27 0:5bd441b8ab2d 87 }
miruga27 1:1ed97958d0f3 88 for(i=(acc2-1)*3;i<HEIGHT*WIDTH*3;i++){
miruga27 1:1ed97958d0f3 89 *(matriz+i+1)=0;
miruga27 1:1ed97958d0f3 90 }
miruga27 1:1ed97958d0f3 91
miruga27 1:1ed97958d0f3 92 //debug("*(temp2+indice)= %i\r\n",*(temp2+indice));
miruga27 0:5bd441b8ab2d 93 indice=0;
miruga27 0:5bd441b8ab2d 94 k=0;
miruga27 1:1ed97958d0f3 95 for(i=0;i<acumulador[2]/2;i++){
miruga27 1:1ed97958d0f3 96 for(j=k;j<(*(temp3+indice)*3+k);j+=3){
miruga27 1:1ed97958d0f3 97
miruga27 1:1ed97958d0f3 98 *(matriz+j+2)=*(temp3+indice+1);
miruga27 1:1ed97958d0f3 99 acc3++;
miruga27 1:1ed97958d0f3 100 if(j>HEIGHT*WIDTH*3) break;
miruga27 0:5bd441b8ab2d 101 }
miruga27 0:5bd441b8ab2d 102 k=j;
miruga27 0:5bd441b8ab2d 103 indice+=2;
miruga27 0:5bd441b8ab2d 104 }
miruga27 0:5bd441b8ab2d 105
miruga27 1:1ed97958d0f3 106 for(i=(acc3-1)*3;i<HEIGHT*WIDTH*3;i++){
miruga27 1:1ed97958d0f3 107 *(matriz+i+2)=0;
miruga27 0:5bd441b8ab2d 108 }
miruga27 0:5bd441b8ab2d 109
miruga27 1:1ed97958d0f3 110
miruga27 1:1ed97958d0f3 111
miruga27 1:1ed97958d0f3 112 free(temp1);
miruga27 1:1ed97958d0f3 113 free(temp2);
miruga27 1:1ed97958d0f3 114 free(temp3);
miruga27 1:1ed97958d0f3 115 //debug("zig-zag\r\n");
miruga27 1:1ed97958d0f3 116
miruga27 0:5bd441b8ab2d 117 zig_zag_dec(m,matriz);
miruga27 1:1ed97958d0f3 118 //debug("acumulador\r\n");
miruga27 0:5bd441b8ab2d 119
miruga27 0:5bd441b8ab2d 120 cuantizador_dec(m);
miruga27 1:1ed97958d0f3 121
miruga27 0:5bd441b8ab2d 122
miruga27 1:1ed97958d0f3 123 //debug("idct\r\n");
miruga27 0:5bd441b8ab2d 124 int matrix[8][8][3];
miruga27 0:5bd441b8ab2d 125 for(i=0;i<HEIGHT;i+=8){
miruga27 0:5bd441b8ab2d 126 for(j=0;j<WIDTH;j+=8){
miruga27 0:5bd441b8ab2d 127
miruga27 0:5bd441b8ab2d 128 int k=0,l=0;
miruga27 0:5bd441b8ab2d 129
miruga27 0:5bd441b8ab2d 130 for(k=i;k<i+8;k++){
miruga27 0:5bd441b8ab2d 131 for(l=j;l<j+8;l++){
miruga27 0:5bd441b8ab2d 132
miruga27 0:5bd441b8ab2d 133
miruga27 0:5bd441b8ab2d 134 matrix[k-i][l-j][0]=m[k][l][0];
miruga27 0:5bd441b8ab2d 135 matrix[k-i][l-j][1]=m[k][l][1];
miruga27 0:5bd441b8ab2d 136 matrix[k-i][l-j][2]=m[k][l][2];
miruga27 0:5bd441b8ab2d 137 }
miruga27 0:5bd441b8ab2d 138
miruga27 0:5bd441b8ab2d 139 }
miruga27 0:5bd441b8ab2d 140
miruga27 0:5bd441b8ab2d 141 IDCT(matrix,m,i,j);// i j índices de los pixeles en x e y del macrobloque
miruga27 0:5bd441b8ab2d 142
miruga27 0:5bd441b8ab2d 143 }
miruga27 0:5bd441b8ab2d 144
miruga27 0:5bd441b8ab2d 145 }
miruga27 0:5bd441b8ab2d 146
miruga27 0:5bd441b8ab2d 147
miruga27 0:5bd441b8ab2d 148 int bpp=3;
miruga27 0:5bd441b8ab2d 149
miruga27 1:1ed97958d0f3 150 /* for(i=0;i<HEIGHT;i++){
miruga27 0:5bd441b8ab2d 151 for(j=0;j<WIDTH;j++){
miruga27 0:5bd441b8ab2d 152
miruga27 0:5bd441b8ab2d 153 if(m[i][j][0]>235) m[i][j][0]=235;
miruga27 0:5bd441b8ab2d 154 if(m[i][j][1]>235) m[i][j][1]=235;
miruga27 0:5bd441b8ab2d 155 if(m[i][j][2]>240) m[i][j][2]=240;
miruga27 0:5bd441b8ab2d 156
miruga27 0:5bd441b8ab2d 157 if(m[i][j][0]<16) m[i][j][0]=16;
miruga27 0:5bd441b8ab2d 158 if(m[i][j][1]<16) m[i][j][1]=16;
miruga27 0:5bd441b8ab2d 159 if(m[i][j][2]<16) m[i][j][2]=16;
miruga27 0:5bd441b8ab2d 160 }
miruga27 1:1ed97958d0f3 161 }*/
miruga27 1:1ed97958d0f3 162 //debug("yuv\r\n");
miruga27 1:1ed97958d0f3 163 yuv_to_rgb(m);
miruga27 1:1ed97958d0f3 164 unsigned char var;
miruga27 1:1ed97958d0f3 165 /* for(i=0;i<HEIGHT;i++){
miruga27 1:1ed97958d0f3 166 for(j=0;j<WIDTH;j++){
miruga27 1:1ed97958d0f3 167 while(!pc.writeable());
miruga27 1:1ed97958d0f3 168 pc.printf("%c",(char)m[i][j][0]);
miruga27 0:5bd441b8ab2d 169 }
miruga27 1:1ed97958d0f3 170 }*/
miruga27 0:5bd441b8ab2d 171
miruga27 0:5bd441b8ab2d 172 for(i=0;i<8;i++){
miruga27 0:5bd441b8ab2d 173 for(j=0;j<320;j++){
miruga27 1:1ed97958d0f3 174
miruga27 1:1ed97958d0f3 175 var=0xff & m[i][j][0];
miruga27 1:1ed97958d0f3 176 if(j>311){
miruga27 1:1ed97958d0f3 177 while(!pc.writeable());
miruga27 1:1ed97958d0f3 178 pc.printf("%c",(char)m[i][j-8][0]);
miruga27 0:5bd441b8ab2d 179
miruga27 1:1ed97958d0f3 180
miruga27 1:1ed97958d0f3 181 while(!pc.writeable());
miruga27 1:1ed97958d0f3 182 pc.printf("%c",(char)m[i][j-8][1]);
miruga27 1:1ed97958d0f3 183
miruga27 1:1ed97958d0f3 184
miruga27 1:1ed97958d0f3 185 while(!pc.writeable());
miruga27 1:1ed97958d0f3 186 pc.printf("%c",(char)m[i][j-8][2]);
miruga27 1:1ed97958d0f3 187 }
miruga27 1:1ed97958d0f3 188 else{
miruga27 1:1ed97958d0f3 189 while(!pc.writeable());
miruga27 1:1ed97958d0f3 190 pc.printf("%c",(char)m[i][j][0]);
miruga27 1:1ed97958d0f3 191
miruga27 1:1ed97958d0f3 192
miruga27 1:1ed97958d0f3 193 while(!pc.writeable());
miruga27 1:1ed97958d0f3 194 pc.printf("%c",(char)m[i][j][1]);
miruga27 1:1ed97958d0f3 195
miruga27 1:1ed97958d0f3 196
miruga27 1:1ed97958d0f3 197 while(!pc.writeable());
miruga27 1:1ed97958d0f3 198 pc.printf("%c",(char)m[i][j][2]);
miruga27 1:1ed97958d0f3 199 }
miruga27 1:1ed97958d0f3 200
miruga27 1:1ed97958d0f3 201 //var=255;
miruga27 1:1ed97958d0f3 202
miruga27 0:5bd441b8ab2d 203
miruga27 0:5bd441b8ab2d 204 }
miruga27 0:5bd441b8ab2d 205 }
miruga27 1:1ed97958d0f3 206
miruga27 1:1ed97958d0f3 207 while(!pc.writeable());
miruga27 1:1ed97958d0f3 208 pc.printf("2");//OJO con ponerlo aqui arriba
miruga27 1:1ed97958d0f3 209
miruga27 1:1ed97958d0f3 210
miruga27 1:1ed97958d0f3 211 char h;
miruga27 1:1ed97958d0f3 212 h=acc1&0xff;
miruga27 1:1ed97958d0f3 213
miruga27 1:1ed97958d0f3 214 while(!pc.writeable());
miruga27 1:1ed97958d0f3 215 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 216
miruga27 1:1ed97958d0f3 217 h=(acc1>>8) & 0xff;
miruga27 1:1ed97958d0f3 218
miruga27 1:1ed97958d0f3 219 while(!pc.writeable());
miruga27 1:1ed97958d0f3 220 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 221
miruga27 1:1ed97958d0f3 222
miruga27 1:1ed97958d0f3 223
miruga27 1:1ed97958d0f3 224 h=acc2&0xff;
miruga27 1:1ed97958d0f3 225
miruga27 1:1ed97958d0f3 226 while(!pc.writeable());
miruga27 1:1ed97958d0f3 227 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 228
miruga27 1:1ed97958d0f3 229 h=(acc2>>8)&0xff;
miruga27 1:1ed97958d0f3 230
miruga27 1:1ed97958d0f3 231 while(!pc.writeable());
miruga27 1:1ed97958d0f3 232 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 233
miruga27 1:1ed97958d0f3 234
miruga27 1:1ed97958d0f3 235 h=acc3&0xff;
miruga27 1:1ed97958d0f3 236
miruga27 1:1ed97958d0f3 237 while(!pc.writeable());
miruga27 1:1ed97958d0f3 238 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 239
miruga27 1:1ed97958d0f3 240 h=(acc3>>8)&0xff;
miruga27 1:1ed97958d0f3 241
miruga27 1:1ed97958d0f3 242 while(!pc.writeable());
miruga27 1:1ed97958d0f3 243 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 244 /* char h;
miruga27 1:1ed97958d0f3 245 h=acumulador[0]&0xff;
miruga27 1:1ed97958d0f3 246
miruga27 1:1ed97958d0f3 247 while(!pc.writeable());
miruga27 1:1ed97958d0f3 248 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 249
miruga27 1:1ed97958d0f3 250 h=(acumulador[0]>>8) & 0xff;
miruga27 1:1ed97958d0f3 251
miruga27 1:1ed97958d0f3 252 while(!pc.writeable());
miruga27 1:1ed97958d0f3 253 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 254
miruga27 1:1ed97958d0f3 255
miruga27 1:1ed97958d0f3 256
miruga27 1:1ed97958d0f3 257 h=acumulador[1]&0xff;
miruga27 1:1ed97958d0f3 258
miruga27 1:1ed97958d0f3 259 while(!pc.writeable());
miruga27 1:1ed97958d0f3 260 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 261
miruga27 1:1ed97958d0f3 262 h=(acumulador[1]>>8)&0xff;
miruga27 1:1ed97958d0f3 263
miruga27 1:1ed97958d0f3 264 while(!pc.writeable());
miruga27 1:1ed97958d0f3 265 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 266
miruga27 1:1ed97958d0f3 267
miruga27 1:1ed97958d0f3 268 h=acumulador[2]&0xff;
miruga27 1:1ed97958d0f3 269
miruga27 1:1ed97958d0f3 270 while(!pc.writeable());
miruga27 1:1ed97958d0f3 271 pc.printf("%c",h);
miruga27 1:1ed97958d0f3 272
miruga27 1:1ed97958d0f3 273 h=(acumulador[2]>>8)&0xff;
miruga27 1:1ed97958d0f3 274
miruga27 1:1ed97958d0f3 275 while(!pc.writeable());
miruga27 1:1ed97958d0f3 276 pc.printf("%c",h);*/
miruga27 1:1ed97958d0f3 277 }
miruga27 1:1ed97958d0f3 278
miruga27 1:1ed97958d0f3 279 DigitalOut led(LED1);
miruga27 1:1ed97958d0f3 280 while(1){
miruga27 1:1ed97958d0f3 281
miruga27 1:1ed97958d0f3 282 led=1;
miruga27 1:1ed97958d0f3 283 wait(0.5);
miruga27 1:1ed97958d0f3 284 led=0;
miruga27 1:1ed97958d0f3 285 wait(0.5);
miruga27 1:1ed97958d0f3 286 }
miruga27 0:5bd441b8ab2d 287 return 0;
miruga27 0:5bd441b8ab2d 288 }