Mercurial > libavcodec.hg
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 { |