comparison h264.c @ 8446:489c8d652fff libavcodec

Optimize esc removal code.
author michael
date Tue, 23 Dec 2008 18:31:44 +0000
parents 4fdaffd1ae1c
children 42198817a5ba
comparison
equal deleted inserted replaced
8445:8621deaff8dc 8446:489c8d652fff
1421 if (dst == NULL){ 1421 if (dst == NULL){
1422 return NULL; 1422 return NULL;
1423 } 1423 }
1424 1424
1425 //printf("decoding esc\n"); 1425 //printf("decoding esc\n");
1426 si=di=0; 1426 memcpy(dst, src, i);
1427 while(si<length){ 1427 si=di=i;
1428 while(si+2<length){
1428 //remove escapes (very rare 1:2^22) 1429 //remove escapes (very rare 1:2^22)
1429 if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){ 1430 if(src[si+2]>3){
1431 dst[di++]= src[si++];
1432 dst[di++]= src[si++];
1433 }else if(src[si]==0 && src[si+1]==0){
1430 if(src[si+2]==3){ //escape 1434 if(src[si+2]==3){ //escape
1431 dst[di++]= 0; 1435 dst[di++]= 0;
1432 dst[di++]= 0; 1436 dst[di++]= 0;
1433 si+=3; 1437 si+=3;
1434 continue; 1438 continue;
1435 }else //next start code 1439 }else //next start code
1436 break; 1440 goto nsc;
1437 } 1441 }
1438 1442
1439 dst[di++]= src[si++]; 1443 dst[di++]= src[si++];
1440 } 1444 }
1445 while(si<length)
1446 dst[di++]= src[si++];
1447 nsc:
1441 1448
1442 memset(dst+di, 0, FF_INPUT_BUFFER_PADDING_SIZE); 1449 memset(dst+di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1443 1450
1444 *dst_length= di; 1451 *dst_length= di;
1445 *consumed= si + 1;//+1 for the header 1452 *consumed= si + 1;//+1 for the header