int url_lpread(URLContext *s,unsigned char * buf,int size) { url_lpbuf_t *lp; int len=size; int valid_data_can_read; unsigned char *tbuf=buf; if(!s || !s->lpbuf) return -1; lp=s->lpbuf; lp_lock(&lp->mutex); lp_rprint(AV_LOG_INFO, "url_lpread:buffer=%x,rp=%x,wp=%x,end=%x,lp->valid_data_size=%d,pos=%lld\n", lp->buffer,lp->rp,lp->wp,lp->buffer_end,lp->valid_data_size,lp->pos); while(len>0) { if(lp->wp>=lp->rp) valid_data_can_read=lp->wp-lp->rp; else valid_data_can_read=lp->buffer_end-lp->rp; valid_data_can_read=FFMIN(len,valid_data_can_read); LP_ASSERT(valid_data_can_read>=0); if(valid_data_can_read==0) { int rlen; lp_unlock(&lp->mutex); if((len<lp->block_read_size) && (lp->seekflags & LESS_BUFF_DATA)) rlen=url_lpfillbuffer(s,len); else rlen=url_lpfillbuffer(s,lp->block_read_size); if(rlen<=0) { lp_unlock(&lp->mutex); return ((size-len)>0)?(size-len):rlen; } lp_lock(&lp->mutex); } lp_rprint( AV_LOG_INFO, "url_lpread:buffer=%x,rp=%x,wp=%x,end=%x,tbuf=%x,valid_data_can_read=%x(%d)\n", lp->buffer,lp->rp,lp->wp,lp->buffer_end,tbuf,valid_data_can_read,valid_data_can_read); if(valid_data_can_read>0) { if(tbuf!=NULL) { memcpy(tbuf,lp->rp,valid_data_can_read); tbuf+=valid_data_can_read; } lp->rp+=valid_data_can_read; if(lp->rp>=lp->buffer_end) lp->rp=lp->buffer; len-=valid_data_can_read; } LP_ASSERT(lp->rp>=lp->buffer); LP_ASSERT(lp->rp<lp->buffer_end); } lp_unlock(&lp->mutex); return (size-len); }
int url_lp_intelligent_buffering(URLContext *s,int size) { int forward_data,back_data; int datalen; url_lpbuf_t *lp; int ret=-1; if(!s || !s->lpbuf) return AVERROR(EINVAL); lp=s->lpbuf; lp->dbg_cnt++; if(size <=0) size=lp->block_read_size; datalen= url_lp_getbuffering_size(s,&forward_data,&back_data); if(lp->dbg_cnt%100==0) lp_print( AV_LOG_INFO, "url_lp buffering:datalen=%d,forward_datad=%d,back_data=%d,lp->buffer_size=%d,size=%d\n", datalen,forward_data,back_data,lp->buffer_size,size); if(datalen>=0 && ((forward_data/lp->buffer_size)<lp->max_forword_level) && ((datalen <lp->buffer_size-1024) || (back_data>(forward_data/2+1)) || (back_data>3*1024*1024)) ) ret=url_lpfillbuffer(s,size);/*lest 1/3 back data && < 3M back data*/ return ret; }