static int udp_set_url(struct sockaddr_storage *addr, const char *hostname, int port) { struct addrinfo *res0; int addr_len; int family = AF_UNSPEC; if(am_getconfig_bool_def("media.libplayer.ipv4only",1)) family = AF_INET; res0 = udp_resolve_host(hostname, port, SOCK_DGRAM, family, 0); if (res0 == 0) return AVERROR(EIO); memcpy(addr, res0->ai_addr, res0->ai_addrlen); addr_len = res0->ai_addrlen; freeaddrinfo(res0); return addr_len; }
int in_get_sys_prop_bool(char* key){ int value = 0; #ifdef HAVE_ANDROID_OS value = am_getconfig_bool_def(key,-1); if(value<0){ return -1; } #else char * ev = getenv(key); if(ev==NULL){ return -1; } value = atoi(ev); #endif return value; }
static int udp_socket_create(UDPContext *s, struct sockaddr_storage *addr, int *addr_len) { int udp_fd = -1; struct addrinfo *res0 = NULL, *res = NULL; int family = AF_UNSPEC; if(am_getconfig_bool_def("media.libplayer.ipv4only",1)) family = AF_INET; if (((struct sockaddr *) &s->dest_addr)->sa_family) family = ((struct sockaddr *) &s->dest_addr)->sa_family; res0 = udp_resolve_host(0, s->local_port, SOCK_DGRAM, family, AI_PASSIVE); if (res0 == 0) goto fail; for (res = res0; res; res=res->ai_next) { udp_fd = socket(res->ai_family, SOCK_DGRAM, 0); if (udp_fd > 0) break; av_log(NULL, AV_LOG_ERROR, "socket: %s\n", strerror(errno)); } if (udp_fd < 0) goto fail; memcpy(addr, res->ai_addr, res->ai_addrlen); *addr_len = res->ai_addrlen; freeaddrinfo(res0); return udp_fd; fail: if (udp_fd >= 0) closesocket(udp_fd); if(res0) freeaddrinfo(res0); return -1; }
int ffmpeg_open_file(play_para_t *am_p) { AVFormatContext *pFCtx ; int ret = -1; int byteiosize = FILE_BUFFER_SIZE; const char * header = am_p->start_param ? am_p->start_param->headers : NULL; // Open video file if (am_p == NULL) { log_print("[ffmpeg_open_file] Empty pointer!\n"); return FFMPEG_EMP_POINTER; } if (am_p->byteiobufsize > 0) { byteiosize = am_p->byteiobufsize; } if (am_p->file_name != NULL) { Retry_open: //ret = av_open_input_file(&pFCtx, am_p->file_name, NULL, byteiosize, NULL, am_p->start_param ? am_p->start_param->headers : NULL); ret = av_open_input_file_header(&pFCtx, am_p->file_name, NULL, byteiosize, NULL, header); if(am_getconfig_bool_def("media.amplayer.disp_url",1)>0){ log_print("[ffmpeg_open_file] file=%s,header=%s\n", am_p->file_name, header); } if (ret != 0) { if (ret == AVERROR(EAGAIN)) { goto Retry_open; } log_print("ffmpeg error: Couldn't open input file! ret==%x\n", ret); return FFMPEG_OPEN_FAILED; // Couldn't open file } am_p->pFormatCtx = pFCtx; return FFMPEG_SUCCESS; } else { log_print("not assigned a file to play\n"); return FFMPEG_NO_FILE; } }
/* return non zero if error */ static int tcp_open(URLContext *h, const char *uri, int flags) { struct addrinfo hints, *ai, *cur_ai; int port, fd = -1; TCPContext *s = NULL; int listen_socket = 0; const char *p; char buf[256]; int ret; socklen_t optlen; int timeout = 500, listen_timeout = -1; char hostname[1024],proto[1024],path[1024]; char portstr[10]; av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname), &port, path, sizeof(path), uri); if (strcmp(proto, "tcp")) return AVERROR(EINVAL); if (port <= 0 || port >= 65536) { av_log(h, AV_LOG_ERROR, "Port missing in uri\n"); return AVERROR(EINVAL); } p = strchr(uri, '?'); if (p) { if (av_find_info_tag(buf, sizeof(buf), "listen", p)) listen_socket = 1; if (av_find_info_tag(buf, sizeof(buf), "timeout", p)) { timeout = strtol(buf, NULL, 10); } if (av_find_info_tag(buf, sizeof(buf), "listen_timeout", p)) { listen_timeout = strtol(buf, NULL, 10); } } memset(&hints, 0, sizeof(hints)); if(am_getconfig_bool_def("media.libplayer.ipv4only",1)) hints.ai_family = AF_INET; else hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; snprintf(portstr, sizeof(portstr), "%d", port); av_log(h, AV_LOG_INFO,"tcp will get address from dns!\n"); if (listen_socket) hints.ai_flags |= AI_PASSIVE; if (!hostname[0]) ret = getaddrinfo(NULL, portstr, &hints, &ai); else ret = getaddrinfo(hostname, portstr, &hints, &ai); if (ret) { av_log(h, AV_LOG_ERROR, "Failed to resolve hostname %s: %s\n", hostname, gai_strerror(ret)); return AVERROR(EIO); } av_log(h, AV_LOG_INFO,"resolved %s's ipaddress \n",hostname); cur_ai = ai; restart: ret = AVERROR(EIO); fd = socket(cur_ai->ai_family, cur_ai->ai_socktype, cur_ai->ai_protocol); if (fd < 0) goto fail; if (listen_socket) { int fd1; int reuse = 1; struct pollfd lp = { fd, POLLIN, 0 }; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); ret = bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen); if (ret) { ret = ff_neterrno(); goto fail1; } ret = listen(fd, 1); if (ret) { ret = ff_neterrno(); goto fail1; } ret = poll(&lp, 1, listen_timeout >= 0 ? listen_timeout : -1); if (ret <= 0) { ret = AVERROR(ETIMEDOUT); goto fail1; } fd1 = accept(fd, NULL, NULL); if (fd1 < 0) { ret = ff_neterrno(); goto fail1; } closesocket(fd); fd = fd1; ff_socket_nonblock(fd, 1); } else { redo: ff_socket_nonblock(fd, 1); ret = connect(fd, cur_ai->ai_addr, cur_ai->ai_addrlen); } if (ret < 0) { struct pollfd p = {fd, POLLOUT, 0}; ret = ff_neterrno(); if (ret == AVERROR(EINTR)) { if (url_interrupt_cb()) { ret = AVERROR_EXIT; goto fail1; } goto redo; } if (ret != AVERROR(EINPROGRESS) && ret != AVERROR(EAGAIN)) goto fail; /* wait until we are connected or until abort */ while(timeout--) { if (url_interrupt_cb()) { ret = AVERROR_EXIT; goto fail1; } ret = poll(&p, 1, 100); if (ret > 0) break; } if (ret <= 0) { av_log(h, AV_LOG_ERROR, "TCP connection to %s:%d timeout failed!\n", hostname, port); ret = AVERROR(ETIMEDOUT); goto fail; } /* test error */ optlen = sizeof(ret); if (getsockopt (fd, SOL_SOCKET, SO_ERROR, &ret, &optlen)) ret = AVUNERROR(ff_neterrno()); if (ret != 0) { char errbuf[100]; ret = AVERROR(ret); av_strerror(ret, errbuf, sizeof(errbuf)); av_log(h, AV_LOG_ERROR, "TCP connection to %s:%d failed: %s, ret = %d\n", hostname, port, errbuf, ret); ret = AVERROR(ret); if(ret>0) ret = AVERROR(EIO); goto fail; } } av_log(h, AV_LOG_INFO,"tcp connect %s ok!\n",hostname); s = av_malloc(sizeof(TCPContext)); if (!s) { freeaddrinfo(ai); return AVERROR(ENOMEM); } h->priv_data = s; h->is_streamed = 1; s->fd = fd; freeaddrinfo(ai); return 0; fail: if (cur_ai->ai_next) { /* Retry with the next sockaddr */ cur_ai = cur_ai->ai_next; if (fd >= 0) closesocket(fd); goto restart; } fail1: if (fd >= 0) closesocket(fd); freeaddrinfo(ai); return ret; }
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; }