static void stream_chunk_raw_cb(int fd, short event, void *arg) { struct stream_ctx *st; size_t chunk_size; int ret; st = (struct stream_ctx *)arg; if (st->end_offset && (st->offset > st->end_offset)) { stream_end(st, 0); return; } if (st->end_offset && ((st->offset + STREAM_CHUNK_SIZE) > (st->end_offset + 1))) chunk_size = st->end_offset + 1 - st->offset; else chunk_size = STREAM_CHUNK_SIZE; ret = read(st->fd, st->buf, chunk_size); if (ret <= 0) { if (ret == 0) DPRINTF(E_LOG, L_HTTPD, "Done streaming file id %d\n", st->id); else DPRINTF(E_LOG, L_HTTPD, "Streaming error, file id %d\n", st->id); stream_end(st, 0); return; } DPRINTF(E_DBG, L_HTTPD, "Read %d bytes; streaming file id %d\n", ret, st->id); evbuffer_add(st->evbuf, st->buf, ret); #ifdef HAVE_LIBEVENT2_OLD evhttp_send_reply_chunk(st->req, st->evbuf); struct evhttp_connection *evcon = evhttp_request_get_connection(st->req); struct bufferevent *bufev = evhttp_connection_get_bufferevent(evcon); g_st = st; // Can't pass st to callback so use global - limits libevent 2.0 to a single stream bufev->writecb = stream_chunk_resched_cb_wrapper; #else evhttp_send_reply_chunk_with_cb(st->req, st->evbuf, stream_chunk_resched_cb, st); #endif st->offset += ret; stream_up_playcount(st); }
void streaming_sort() { int capacity = 256; int nitems = 0,i=0; int buffer[capacity]; stream_init(); // GET READY FILE*file = open_infile(infile_name); while(!feof(file) && !ferror(file)) { int success = fscanf(file,"%d",buffer + i); if(success != 1) break; nitems++; i++; if(i == capacity) { stream_data( buffer, i); // SOME DATA FOR YOU i = 0; } } if(i) stream_data( buffer, i); // HAVE A BIT MORE DATA stream_end(); // DONE fclose(file); }
int pull_all_callback(void *cdata, neo4j_message_type_t type, const neo4j_value_t *argv, uint16_t argc) { assert(cdata != NULL); assert(argc == 0 || argv != NULL); run_result_stream_t *results = (run_result_stream_t *)cdata; if (type == NEO4J_RECORD_MESSAGE) { if (append_result(results, argv, argc)) { neo4j_log_trace_errno(results->logger, "append_result failed"); set_failure(results, errno); return -1; } return 1; } --(results->refcount); results->streaming = false; // not a record, so keep this memory along with the result stream if (neo4j_mpool_merge(&(results->mpool), &(results->record_mpool)) < 0) { neo4j_log_trace_errno(results->logger, "neo4j_mpool_merge failed"); set_failure(results, errno); return -1; } return stream_end(results, type, "PULL_ALL", argv, argc); }
int VIDEO_streamSysExit() { stream_end( stream_get_handle() ); pthread_mutex_destroy(&gbl.mutex); return OSA_SOK; }
int discard_all_callback(void *cdata, neo4j_message_type_t type, const neo4j_value_t *argv, uint16_t argc) { assert(cdata != NULL); assert(argc == 0 || argv != NULL); run_result_stream_t *results = (run_result_stream_t *)cdata; --(results->refcount); results->streaming = false; return stream_end(results, type, "DISCARD_ALL", argv, argc); }
static void stream_fail_cb(struct evhttp_connection *evcon, void *arg) { struct stream_ctx *st; st = (struct stream_ctx *)arg; DPRINTF(E_WARN, L_HTTPD, "Connection failed; stopping streaming of file ID %d\n", st->id); /* Stop streaming */ event_del(st->ev); stream_end(st, 1); }
static void stream_chunk_resched_cb(struct evhttp_connection *evcon, void *arg) { struct stream_ctx *st; struct timeval tv; int ret; st = (struct stream_ctx *)arg; evutil_timerclear(&tv); ret = event_add(st->ev, &tv); if (ret < 0) { DPRINTF(E_LOG, L_HTTPD, "Could not re-add one-shot event for streaming\n"); stream_end(st, 0); } }
static void stream_chunk_xcode_cb(int fd, short event, void *arg) { struct stream_ctx *st; struct timeval tv; int xcoded; int ret; int dummy; st = (struct stream_ctx *)arg; xcoded = transcode(st->evbuf, STREAM_CHUNK_SIZE, st->xcode, &dummy); if (xcoded <= 0) { if (xcoded == 0) DPRINTF(E_LOG, L_HTTPD, "Done streaming transcoded file id %d\n", st->id); else DPRINTF(E_LOG, L_HTTPD, "Transcoding error, file id %d\n", st->id); stream_end(st, 0); return; } DPRINTF(E_DBG, L_HTTPD, "Got %d bytes from transcode; streaming file id %d\n", xcoded, st->id); /* Consume transcoded data until we meet start_offset */ if (st->start_offset > st->offset) { ret = st->start_offset - st->offset; if (ret < xcoded) { evbuffer_drain(st->evbuf, ret); st->offset += ret; ret = xcoded - ret; } else { evbuffer_drain(st->evbuf, xcoded); st->offset += xcoded; goto consume; } } else ret = xcoded; #ifdef HAVE_LIBEVENT2_OLD evhttp_send_reply_chunk(st->req, st->evbuf); struct evhttp_connection *evcon = evhttp_request_get_connection(st->req); struct bufferevent *bufev = evhttp_connection_get_bufferevent(evcon); g_st = st; // Can't pass st to callback so use global - limits libevent 2.0 to a single stream bufev->writecb = stream_chunk_resched_cb_wrapper; #else evhttp_send_reply_chunk_with_cb(st->req, st->evbuf, stream_chunk_resched_cb, st); #endif st->offset += ret; stream_up_playcount(st); return; consume: /* reschedule immediately - consume up to start_offset */ evutil_timerclear(&tv); ret = event_add(st->ev, &tv); if (ret < 0) { DPRINTF(E_LOG, L_HTTPD, "Could not re-add one-shot event for streaming (xcode)\n"); stream_end(st, 0); return; } }
inline unsigned char stream_next(struct reg_stream* p){ return (stream_end(p))?('\0'):(p->buff[(p->pos)++]); }
inline unsigned char stream_char(struct reg_stream* p){ return (stream_end(p))?('\0'):(p->buff[p->pos]); }