int url_lpfillbuffer(URLContext *s,int size) { url_lpbuf_t *lp; int rlen=0; int ssread; int cache_read_len=0; int64_t tmprp; if(!s || !s->lpbuf) return AVERROR(EINVAL); lp=s->lpbuf; lp_lock(&lp->mutex); if(lp->wp>=lp->rp) { if(lp->rp!=lp->buffer) ssread=FFMIN(size,lp->buffer_end-lp->wp); else ssread=FFMIN(size,lp->buffer_end-lp->wp-32); } else ssread=FFMIN(size,lp->rp-lp->wp-32);/*reversed 32bytes;*/ lp_bprint( AV_LOG_INFO,"fill buffer %d,buffer=%x,rp=%x,wp=%x,buffer_end=%x,size=%d\n",ssread,lp->buffer,lp->rp,lp->wp,lp->buffer_end,size); if(ssread<=0) { rlen=0; goto release; } if(lp->cache_enable){ /*do read on cache first*/ rlen=aviolp_cache_read(lp->cache_id,lp->pos,lp->wp,ssread); cache_read_len=rlen; lp_bprint(AV_LOG_INFO,"filled buffer from cache=%d\n",cache_read_len); } if(rlen<=0){ if(lp->file_size>0 && lp->pos>=lp->file_size){ rlen=0;/*file read end*/ goto release; }else if(lp->cache_enable && s->prot->url_seek(s,0,SEEK_CUR)!=lp->pos){/*maybe do read from cache file before,so seek it now*/ int ret=s->prot->url_seek(s,lp->pos,SEEK_SET); if(ret!=lp->pos){ rlen=-1;/*error*/ goto release; } } tmprp=lp->pos; lp_unlock(&lp->mutex);/*release lock for long time read*/ rlen=s->prot->url_read(s,lp->wp,ssread); lp_lock(&lp->mutex); if(tmprp!=lp->pos) rlen=AVERROR(EAGAIN);;/*pos have changed,so I think we have a seek on read*/ lp_bprint(AV_LOG_INFO,"filled buffer from remote=%d\n",rlen); } if(rlen>0) { if(lp->cache_enable&& cache_read_len<=0)/*not read from cache itself*/ aviolp_cache_write(lp->cache_id,lp->pos,lp->wp,rlen); lp->valid_data_size+=rlen; lp->pos+=rlen; lp->wp+=rlen; if(lp->wp>=lp->buffer_end) lp->wp=lp->buffer; } release: lp_unlock(&lp->mutex); lp_bprint( AV_LOG_INFO,"lpfilld=%d\n",rlen); return rlen; }
int url_lpopen(URLContext *s,int size) { url_lpbuf_t *lp; int blocksize=32*1024; int ret; float value=0.0; int bufsize=0; if(size==0){ //size=am_getconfig_float("libplayer.ffmpeg.lpbufsizemax",&value); //if(size<=0) size=IO_LP_BUFFER_SIZE; } lp_bprint( AV_LOG_INFO,"url_lpopen=%d\n",size); if(!s) return -1; lp_bprint( AV_LOG_INFO,"url_lpopen2=%d\n",size); //ret=am_getconfig_float("libplayer.ffmpeg.lpbufblocksize",&value); //if(ret>=0 && value>=32){ // blocksize=(int)value; //} lp_sprint( AV_LOG_INFO,"lpbuffer block size=%d\n",blocksize); lp=av_mallocz(sizeof(url_lpbuf_t)); if(!lp) return AVERROR(ENOMEM); lp->buffer=av_malloc(size); if(!lp->buffer) { int failedsize=size/2;/*if no memory used 1/2 size */ //ret=am_getconfig_float("libplayer.ffmpeg.lpbuffaildsize",&value); //if(ret>=0 && value>=1024){ // failedsize=(int)value; //} lp_sprint( AV_LOG_INFO,"malloc buf failed,used failed size=%d\n",failedsize); lp->buffer=av_malloc(failedsize); while(!lp->buffer){ failedsize=failedsize/2; if(failedsize<16*1024)/*do't malloc too small size failed size*/ return AVERROR(ENOMEM); lp->buffer=av_malloc(failedsize); } bufsize=failedsize; }else{ bufsize=size; } lp_sprint( AV_LOG_INFO,"url_lpopen used lp buf size=%d\n",bufsize); s->lpbuf=lp; lp->buffer_size=bufsize; lp->rp=lp->buffer; lp->wp=lp->buffer; lp->buffer_end=lp->buffer+bufsize; lp->valid_data_size=0; lp->pos=0; lp->block_read_size=FFMIN(blocksize,bufsize>>4); lp_lock_init(&lp->mutex,NULL); lp->file_size=url_lpseek(s,0,AVSEEK_SIZE); lp->cache_enable=0; lp->cache_id=aviolp_cache_open(s->filename,url_filesize(s)); lp->dbg_cnt=0; if(lp->cache_id!=0) lp->cache_enable=1; lp_bprint( AV_LOG_INFO,"url_lpopen4%d\n",bufsize); return 0; }
int url_lpopen(URLContext *s,int size) { url_lpbuf_t *lp; int blocksize=32*1024; int ret; float value=0.0; int bufsize=0; if(size==0){ ret=am_getconfig_float("libplayer.ffmpeg.lpbufsizemax",&value); if(ret<0 || value < 1024*32){ if(am_getconfig_bool_def("media.amplayer.low_ram",0)){ size=IO_LP_BUFFER_SIZE/8; }else{ size=IO_LP_BUFFER_SIZE; } }else{ size=(int)value; } } lp_bprint( AV_LOG_INFO,"url_lpopen=%d\n",size); if(!s) return -1; lp_bprint( AV_LOG_INFO,"url_lpopen2=%d\n",size); ret=am_getconfig_float("libplayer.ffmpeg.lpbufblocksize",&value); if(ret>=0 && value>=32){ blocksize=(int)value; } lp_sprint( AV_LOG_INFO,"lpbuffer block size=%d\n",blocksize); lp=av_mallocz(sizeof(url_lpbuf_t)); if(!lp) return AVERROR(ENOMEM); lp->buffer=av_malloc(size); if(!lp->buffer) { int failedsize=size/2;/*if no memory used 1/2 size */ ret=am_getconfig_float("libplayer.ffmpeg.lpbuffaildsize",&value); if(ret>=0 && value>=1024){ failedsize=(int)value; } lp_sprint( AV_LOG_INFO,"malloc buf failed,used failed size=%d\n",failedsize); lp->buffer=av_malloc(failedsize); while(!lp->buffer){ failedsize=failedsize/2; if(failedsize<16*1024){/*do't malloc too small size failed size*/ av_free(lp); return AVERROR(ENOMEM); } lp->buffer=av_malloc(failedsize); } bufsize=failedsize; }else{ bufsize=size; } lp_sprint( AV_LOG_INFO,"url_lpopen used lp buf size=%d\n",bufsize); s->lpbuf=lp; lp->buffer_size=bufsize; lp->rp=lp->buffer; lp->wp=lp->buffer; lp->buffer_end=lp->buffer+bufsize; lp->valid_data_size=0; lp->pos=0; lp->block_read_size=FFMIN(blocksize,bufsize>>4); lp_lock_init(&lp->mutex,NULL); lp->file_size=url_lpseek(s,0,AVSEEK_SIZE); lp->cache_enable=0; lp->cache_id=aviolp_cache_open(s->filename,url_lpseek(s,0,AVSEEK_SIZE)); lp->dbg_cnt=0; ret=am_getconfig_float("libplayer.ffmpeg.lpbufmaxbuflv",&value); if(ret<0) lp->max_forword_level=1; else{ lp->max_forword_level=value; } if(lp->cache_id!=0) lp->cache_enable=1; lp_bprint( AV_LOG_INFO,"url_lpopen4%d\n",bufsize); ret=am_getconfig_float("libplayer.ffmpeg.maxreadseek",&value); if(ret>=0 && value>=0) { lp->max_read_seek=value; }else { lp->max_read_seek=DEF_MAX_READ_SEEK; } return 0; }