/* * Receive data */ static int iptv_http_data ( http_client_t *hc, void *buf, size_t len ) { iptv_mux_t *im = hc->hc_aux; if (im == NULL || hc->hc_code != HTTP_STATUS_OK) return 0; if (im->im_m3u_header) { sbuf_append(&im->mm_iptv_buffer, buf, len); return 0; } pthread_mutex_lock(&iptv_lock); sbuf_append(&im->mm_iptv_buffer, buf, len); tsdebug_write((mpegts_mux_t *)im, buf, len); if (len > 0) iptv_input_recv_packets(im, len); pthread_mutex_unlock(&iptv_lock); return 0; }
/* * Read thread */ static void * iptv_file_thread ( void *aux ) { iptv_mux_t *im = aux; file_priv_t *fp = im->im_data; ssize_t r; int fd = fp->fd, pause = 0; char buf[32*1024]; off_t off = 0; int64_t mono; int e; #if defined(PLATFORM_DARWIN) fcntl(fd, F_NOCACHE, 1); #endif pthread_mutex_lock(&iptv_lock); while (!fp->shutdown && fd > 0) { while (!fp->shutdown && pause) { mono = mclk() + sec2mono(1); do { e = tvh_cond_timedwait(&fp->cond, &iptv_lock, mono); if (e == ETIMEDOUT) break; } while (ERRNO_AGAIN(e)); } if (fp->shutdown) break; pause = 0; pthread_mutex_unlock(&iptv_lock); r = read(fd, buf, sizeof(buf)); pthread_mutex_lock(&iptv_lock); if (r == 0) break; if (r < 0) { if (ERRNO_AGAIN(errno)) continue; break; } sbuf_append(&im->mm_iptv_buffer, buf, r); if (iptv_input_recv_packets(im, r) == 1) pause = 1; #ifndef PLATFORM_DARWIN #if !ENABLE_ANDROID posix_fadvise(fd, off, r, POSIX_FADV_DONTNEED); #endif #endif off += r; } pthread_mutex_unlock(&iptv_lock); return NULL; }