Exemple #1
0
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;
}
Exemple #2
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){
		//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;
}
Exemple #3
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;
}