|
|
|
@ -30,6 +30,7 @@ |
|
|
|
|
|
|
|
|
|
typedef struct MJPEGParserContext{ |
|
|
|
|
ParseContext pc; |
|
|
|
|
int size; |
|
|
|
|
}MJPEGParserContext; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -39,35 +40,59 @@ typedef struct MJPEGParserContext{ |
|
|
|
|
static int find_frame_end(MJPEGParserContext *m, const uint8_t *buf, int buf_size){ |
|
|
|
|
ParseContext *pc= &m->pc; |
|
|
|
|
int vop_found, i; |
|
|
|
|
uint16_t state; |
|
|
|
|
uint32_t state; |
|
|
|
|
|
|
|
|
|
vop_found= pc->frame_start_found; |
|
|
|
|
state= pc->state; |
|
|
|
|
|
|
|
|
|
i=0; |
|
|
|
|
if(!vop_found){ |
|
|
|
|
for(i=0; i<buf_size; i++){ |
|
|
|
|
for(i=0; i<buf_size;){ |
|
|
|
|
state= (state<<8) | buf[i]; |
|
|
|
|
if(state == 0xFFD8){ |
|
|
|
|
if(state>=0xFFC00000 && state<=0xFFFEFFFF){ |
|
|
|
|
if(state>=0xFFD80000 && state<=0xFFD8FFFF){ |
|
|
|
|
i++; |
|
|
|
|
vop_found=1; |
|
|
|
|
break; |
|
|
|
|
}else if(state<0xFFD00000 || state>0xFFD9FFFF){ |
|
|
|
|
m->size= (state&0xFFFF)-1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(m->size>0){ |
|
|
|
|
int size= FFMIN(buf_size-i, m->size); |
|
|
|
|
i+=size; |
|
|
|
|
m->size-=size; |
|
|
|
|
state=0; |
|
|
|
|
continue; |
|
|
|
|
}else |
|
|
|
|
i++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(vop_found){ |
|
|
|
|
/* EOF considered as end of frame */ |
|
|
|
|
if (buf_size == 0) |
|
|
|
|
return 0; |
|
|
|
|
for(; i<buf_size; i++){ |
|
|
|
|
for(; i<buf_size;){ |
|
|
|
|
state= (state<<8) | buf[i]; |
|
|
|
|
if(state == 0xFFD8){ |
|
|
|
|
if(state>=0xFFC00000 && state<=0xFFFEFFFF){ |
|
|
|
|
if(state>=0xFFD80000 && state<=0xFFD8FFFF){ |
|
|
|
|
pc->frame_start_found=0; |
|
|
|
|
pc->state=0; |
|
|
|
|
return i-1; |
|
|
|
|
return i-3; |
|
|
|
|
} else if(state<0xFFD00000 || state>0xFFD9FFFF){ |
|
|
|
|
m->size= (state&0xFFFF)-1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(m->size>0){ |
|
|
|
|
int size= FFMIN(buf_size-i, m->size); |
|
|
|
|
i+=size; |
|
|
|
|
m->size-=size; |
|
|
|
|
state=0; |
|
|
|
|
continue; |
|
|
|
|
}else |
|
|
|
|
i++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
pc->frame_start_found= vop_found; |
|
|
|
|
pc->state= state; |
|
|
|
|