comparison ra288.c @ 1316:b1d624981afd libavcodec

optimization: merge phases 0 and 1
author nickols_k
date Wed, 18 Jun 2003 06:37:23 +0000
parents 8a7be8c2710e
children b4a72edb3a71
comparison
equal deleted inserted replaced
1315:6696d3bf4ff2 1316:b1d624981afd
384 for (sum=0,x=len;x--;sum+=(*p1++)*(*p2++)); 384 for (sum=0,x=len;x--;sum+=(*p1++)*(*p2++));
385 tgt[n--]=sum; 385 tgt[n--]=sum;
386 } 386 }
387 } 387 }
388 388
389 void * decode_block(AVCodecContext * avctx, unsigned char *in, signed short int *out) 389 void * decode_block(AVCodecContext * avctx, unsigned char *in, signed short int *out,unsigned len)
390 { 390 {
391 int x,y; 391 int x,y;
392 Real288_internal *glob=avctx->priv_data; 392 Real288_internal *glob=avctx->priv_data;
393 int cfs=((short*)(avctx->extradata))[3]; /* coded frame size 38 */ 393 unsigned short int buffer[len];
394 unsigned short int buffer[cfs]; 394
395 395 unpack(buffer,in,len);
396 unpack(buffer,in,cfs);
397 for (x=0;x<32;x++) 396 for (x=0;x<32;x++)
398 { 397 {
399 glob->phasep=(glob->phase=x&7)*5; 398 glob->phasep=(glob->phase=x&7)*5;
400 decode(glob,buffer[x]); 399 decode(glob,buffer[x]);
401 for (y=0;y<5;*(out++)=8*glob->output[glob->phasep+(y++)]); 400 for (y=0;y<5;*(out++)=8*glob->output[glob->phasep+(y++)]);
415 //((short*)(avctx->extradata))[1]; /* subpacket height */ 414 //((short*)(avctx->extradata))[1]; /* subpacket height */
416 //((short*)(avctx->extradata))[2]; /* subpacket flavour */ 415 //((short*)(avctx->extradata))[2]; /* subpacket flavour */
417 //((short*)(avctx->extradata))[3]; /* coded frame size */ 416 //((short*)(avctx->extradata))[3]; /* coded frame size */
418 //((short*)(avctx->extradata))[4]; /* codec's data length */ 417 //((short*)(avctx->extradata))[4]; /* codec's data length */
419 //((short*)(avctx->extradata))[5...] /* codec's data */ 418 //((short*)(avctx->extradata))[5...] /* codec's data */
420 int z,bret; 419 int bret;
421 void *datao; 420 void *datao;
422 int w=avctx->block_align; /* 228 */ 421 int w=avctx->block_align; /* 228 */
423 int h=((short*)(avctx->extradata))[1]; /* 12 */ 422 int h=((short*)(avctx->extradata))[1]; /* 12 */
424 int cfs=((short*)(avctx->extradata))[3]; /* coded frame size 38 */ 423 int cfs=((short*)(avctx->extradata))[3]; /* coded frame size 38 */
425 int i,j; 424 int i,j;
426 unsigned char tb[h*w], *ptb;
427 if(buf_size<w*h) 425 if(buf_size<w*h)
428 { 426 {
429 fprintf(stderr,"ffra288: Error! Input buffer is too small [%d<%d]\n",buf_size,w*h); 427 fprintf(stderr,"ffra288: Error! Input buffer is too small [%d<%d]\n",buf_size,w*h);
430 return 0; 428 return 0;
431 } 429 }
432 datao = data; 430 datao = data;
433 ptb = buf; 431 bret = 0;
434 /* Phase 0: deinterleave */ 432 for (j = 0; j < h/2; j++)
435 for (j = 0; j < h; j++) 433 for (i = 0; i < h; i++)
436 for (i = 0; i < h/2; i++)
437 { 434 {
438 memcpy(&tb[i*2*w+j*cfs],ptb,cfs); 435 data=decode_block(avctx,&buf[j*cfs+cfs*i*h/2],(signed short *)data,cfs);
439 ptb += cfs; 436 bret += cfs;
440 } 437 }
441 /* Phase 1: decode */
442 bret = ptb-buf;
443 for(z=0;z<bret;z+=cfs) data=decode_block(avctx,&tb[z],(signed short *)data);
444 *data_size = data - datao; 438 *data_size = data - datao;
445 return bret; 439 return bret;
446 } 440 }
447 else 441 else
448 { 442 {