Mercurial > libavcodec.hg
changeset 3086:befacb1cb573 libavcodec
faster find_startcode()
author | michael |
---|---|
date | Sat, 04 Feb 2006 20:32:02 +0000 |
parents | 95bee8ba8870 |
children | 526bc949ef31 |
files | mpeg12.c mpegvideo.c mpegvideo.h parser.c |
diffstat | 4 files changed, 38 insertions(+), 57 deletions(-) [+] |
line wrap: on
line diff
--- a/mpeg12.c Sat Feb 04 10:04:13 2006 +0000 +++ b/mpeg12.c Sat Feb 04 20:32:02 2006 +0000 @@ -2171,33 +2171,6 @@ return 0; } -/* return the 8 bit start code value and update the search - state. Return -1 if no start code found */ -static int find_start_code(const uint8_t **pbuf_ptr, const uint8_t *buf_end) -{ - const uint8_t *buf_ptr= *pbuf_ptr; - - buf_ptr++; //gurantees that -1 is within the array - buf_end -= 3; // gurantees that +3 is within the array - - while (buf_ptr < buf_end) { - if(*buf_ptr==0){ - while(buf_ptr < buf_end && buf_ptr[1]==0) - buf_ptr++; - - if(buf_ptr[-1] == 0 && buf_ptr[1] == 1){ - *pbuf_ptr = buf_ptr+3; - return buf_ptr[2] + 0x100; - } - } - buf_ptr += 2; - } - buf_end += 3; //undo the hack above - - *pbuf_ptr = buf_end; - return -1; -} - static int mpeg1_decode_picture(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { @@ -2715,7 +2688,8 @@ if(s->mb_y == s->end_mb_y) return 0; - start_code = find_start_code(&buf, s->gb.buffer_end); + start_code= -1; + buf = ff_find_start_code(buf, s->gb.buffer_end, &start_code); mb_y= start_code - SLICE_MIN_START_CODE; if(mb_y < 0 || mb_y >= s->end_mb_y) return -1; @@ -2995,14 +2969,12 @@ int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) { int i; - uint32_t state; - - state= pc->state; + uint32_t state= pc->state; i=0; if(!pc->frame_start_found){ for(i=0; i<buf_size; i++){ - state= (state<<8) | buf[i]; + i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1; if(state >= SLICE_MIN_START_CODE && state <= SLICE_MAX_START_CODE){ i++; pc->frame_start_found=1; @@ -3016,7 +2988,7 @@ if (buf_size == 0) return 0; for(; i<buf_size; i++){ - state= (state<<8) | buf[i]; + i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1; if((state&0xFFFFFF00) == 0x100){ if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){ pc->frame_start_found=0; @@ -3083,7 +3055,8 @@ for(;;) { /* find start next code */ - start_code = find_start_code(&buf_ptr, buf_end); + start_code = -1; + buf_ptr = ff_find_start_code(buf_ptr,buf_end, &start_code); if (start_code < 0){ if(s2->pict_type != B_TYPE || avctx->skip_frame <= AVDISCARD_DEFAULT){ if(avctx->thread_count > 1){
--- a/mpegvideo.c Sat Feb 04 10:04:13 2006 +0000 +++ b/mpegvideo.c Sat Feb 04 20:32:02 2006 +0000 @@ -228,6 +228,34 @@ } #endif //CONFIG_ENCODERS +const uint8_t *ff_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){ + int i; + + for(i=0; i<3; i++){ + uint32_t tmp= *state << 8; + *state= tmp + *(p++); + if(tmp == 0x100 || p==end) + return p; + } + p--; // need to recheck or might miss one + end--; // we need the byte after 00 00 01 too + + while(p<end){ + if (p[ 0] > 1) p+= 3; + else if(p[-1] ) p+= 2; + else if(p[-2]|(p[0]-1)) p++; + else{ + p++; + break; + } + } + + p= FFMIN(p, end)-3; + *state= be2me_32(unaligned32(p)); + + return p+4; +} + /* init common dct for both encoder and decoder */ int DCT_common_init(MpegEncContext *s) {
--- a/mpegvideo.h Sat Feb 04 10:04:13 2006 +0000 +++ b/mpegvideo.h Sat Feb 04 20:32:02 2006 +0000 @@ -773,6 +773,7 @@ int ff_find_unused_picture(MpegEncContext *s, int shared); void ff_denoise_dct(MpegEncContext *s, DCTELEM *block); void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src); +const uint8_t *ff_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state); void ff_er_frame_start(MpegEncContext *s); void ff_er_frame_end(MpegEncContext *s);
--- a/parser.c Sat Feb 04 10:04:13 2006 +0000 +++ b/parser.c Sat Feb 04 20:32:02 2006 +0000 @@ -272,28 +272,6 @@ return 0; } -static int find_start_code(const uint8_t **pbuf_ptr, const uint8_t *buf_end) -{ - const uint8_t *buf_ptr; - unsigned int state=0xFFFFFFFF, v; - int val; - - buf_ptr = *pbuf_ptr; - while (buf_ptr < buf_end) { - v = *buf_ptr++; - if (state == 0x000001) { - state = ((state << 8) | v) & 0xffffff; - val = state; - goto found; - } - state = ((state << 8) | v) & 0xffffff; - } - val = -1; - found: - *pbuf_ptr = buf_ptr; - return val; -} - /* XXX: merge with libavcodec ? */ #define MPEG1_FRAME_RATE_BASE 1001 @@ -335,7 +313,8 @@ s->repeat_pict = 0; buf_end = buf + buf_size; while (buf < buf_end) { - start_code = find_start_code(&buf, buf_end); + start_code= -1; + buf= ff_find_start_code(buf, buf_end, &start_code); bytes_left = buf_end - buf; switch(start_code) { case PICTURE_START_CODE: