/** @internal @This is the open_codec upump callback * It calls _open_codec_cb. * * @param upump description structure of the pump */ static void upipe_avcdec_open_codec_cb(struct upump *upump) { assert(upump); struct upipe *upipe = upump_get_opaque(upump, struct upipe*); struct upipe_avcdec *upipe_avcdec = upipe_avcdec_from_upipe(upipe); struct upipe_avcodec_open_params *params = &upipe_avcdec->open_params; struct upump *upump_av_deal = upipe_avcdec->upump_av_deal; /* check udeal */ if (upump_av_deal) { if (unlikely(!upipe_av_deal_grab())) { upipe_dbg(upipe, "could not grab resource, return"); return; } upipe_avcdec->upump_av_deal = NULL; } /* real open_codec function */ bool ret = upipe_avcdec_open_codec(upipe, params->codec, params->extradata, params->extradata_size); /* clean dealer */ if (unlikely(!upipe_av_deal_yield(upump_av_deal))) { upump_free(upump_av_deal); upump_av_deal = NULL; upipe_err(upipe, "can't stop dealer"); upipe_throw_upump_error(upipe); if (upipe_avcdec->context) { avcodec_close(upipe_avcdec->context); av_free(upipe_avcdec->context); upipe_avcdec->context = NULL; } return; } upump_free(upump_av_deal); upump_av_deal = NULL; if (!ret) { return; } /* unblock input pump*/ if (upipe_avcdec->saved_upump_mgr) { upipe_dbg(upipe, "unblocking saved upump_mgr"); upump_mgr_sink_unblock(upipe_avcdec->saved_upump_mgr); upump_mgr_release(upipe_avcdec->saved_upump_mgr); upipe_avcdec->saved_upump_mgr = NULL; } }
int main(int argc, char **argv) { long flags; assert(ecore_init()); mgr = upump_ecore_mgr_alloc(UPUMP_POOL, UPUMP_BLOCKER_POOL); assert(mgr != NULL); /* Create a pipe with non-blocking write */ assert(pipe(pipefd) != -1); flags = fcntl(pipefd[1], F_GETFL); assert(flags != -1); flags |= O_NONBLOCK; assert(fcntl(pipefd[1], F_SETFL, flags) != -1); /* Create watchers */ write_idler = upump_alloc_idler(mgr, write_idler_cb, NULL, NULL); assert(write_idler != NULL); write_watcher = upump_alloc_fd_write(mgr, write_watcher_cb, NULL, NULL, pipefd[1]); assert(write_watcher != NULL); read_timer = upump_alloc_timer(mgr, read_timer_cb, NULL, NULL, timeout, 0); assert(read_timer != NULL); read_watcher = upump_alloc_fd_read(mgr, read_watcher_cb, NULL, NULL, pipefd[0]); assert(read_watcher != NULL); /* Start tests */ upump_start(write_idler); ecore_main_loop_begin(); printf("\nread: \t%zd\nwrite: \t%zd\n", bytes_read, bytes_written); assert(bytes_read); assert(bytes_read == bytes_written); /* Clean up */ upump_free(write_idler); upump_free(write_watcher); upump_free(read_timer); upump_free(read_watcher); upump_mgr_release(mgr); ecore_shutdown(); return 0; }
int main(int argc, char **argv) { long flags; loop = ev_default_loop(0); mgr = upump_ev_mgr_alloc(loop, UPUMP_POOL, UPUMP_BLOCKER_POOL); assert(mgr != NULL); /* Create a pipe with non-blocking write */ assert(pipe(pipefd) != -1); flags = fcntl(pipefd[1], F_GETFL); assert(flags != -1); flags |= O_NONBLOCK; assert(fcntl(pipefd[1], F_SETFL, flags) != -1); /* Create watchers */ write_idler = upump_alloc_idler(mgr, write_idler_cb, NULL); assert(write_idler != NULL); write_watcher = upump_alloc_fd_write(mgr, write_watcher_cb, NULL, pipefd[1]); assert(write_watcher != NULL); read_timer = upump_alloc_timer(mgr, read_timer_cb, NULL, timeout, 0); assert(read_timer != NULL); read_watcher = upump_alloc_fd_read(mgr, read_watcher_cb, NULL, pipefd[0]); assert(read_watcher != NULL); /* Start tests */ upump_start(write_idler); ev_loop(loop, 0); assert(bytes_read); assert(bytes_read == bytes_written); /* Clean up */ upump_free(write_idler); upump_free(write_watcher); upump_free(read_timer); upump_free(read_watcher); upump_mgr_release(mgr); ev_default_destroy(); return 0; }
/** @This aborts and frees an existing upump watching for exclusive access to * avcodec_open(). * * @param upipe description structure of the pipe */ static void upipe_avcdec_abort_av_deal(struct upipe *upipe) { struct upipe_avcdec *upipe_avcdec = upipe_avcdec_from_upipe(upipe); if (unlikely(upipe_avcdec->upump_av_deal != NULL)) { upipe_av_deal_abort(upipe_avcdec->upump_av_deal); upump_free(upipe_avcdec->upump_av_deal); upipe_avcdec->upump_av_deal = NULL; if (upipe_avcdec->open_params.extradata) { free(upipe_avcdec->open_params.extradata); } memset(&upipe_avcdec->open_params, 0, sizeof(struct upipe_avcodec_open_params)); } }
void run(struct upump_mgr *mgr) { long flags; assert(mgr != NULL); /* Create a pipe with non-blocking write */ assert(pipe(pipefd) != -1); flags = fcntl(pipefd[1], F_GETFL); assert(flags != -1); flags |= O_NONBLOCK; assert(fcntl(pipefd[1], F_SETFL, flags) != -1); /* Create watchers */ write_idler = upump_alloc_idler(mgr, write_idler_cb, NULL, NULL); assert(write_idler != NULL); write_watcher = upump_alloc_fd_write(mgr, write_watcher_cb, NULL, NULL, pipefd[1]); assert(write_watcher != NULL); read_timer = upump_alloc_timer(mgr, read_timer_cb, NULL, NULL, timeout, 0); assert(read_timer != NULL); read_watcher = upump_alloc_fd_read(mgr, read_watcher_cb, NULL, NULL, pipefd[0]); assert(read_watcher != NULL); /* Start tests */ upump_start(write_idler); upump_mgr_run(mgr, NULL); assert(bytes_read); assert(bytes_read == bytes_written); /* Clean up */ upump_free(write_idler); upump_free(write_watcher); upump_free(read_timer); upump_free(read_watcher); upump_mgr_release(mgr); }