mlt_consumer create_consumer( char *id, mlt_producer producer ) { char *arg = strchr( id, ':' ); if ( arg != NULL ) *arg ++ = '\0'; mlt_consumer consumer = mlt_factory_consumer( id, arg ); if ( consumer != NULL ) { mlt_properties properties = mlt_consumer_properties( consumer ); mlt_properties_set_data( properties, "transport_callback", transport_action, 0, NULL, NULL ); mlt_properties_set_data( properties, "transport_producer", producer, 0, NULL, NULL ); } return consumer; }
/** * Stop the consumer **/ static int consumer_stop(mlt_consumer parent) { // Get the properties mlt_properties properties = mlt_consumer_properties(parent); // Check that we're running if (mlt_properties_get_int(properties, "running")) { // Get the threads pthread_t *consumer_pthread = mlt_properties_get_data(properties, "consumer_pthread", NULL); // Stop the threads mlt_properties_set_int(properties, "running", 0); // Wait for termination pthread_join(*consumer_pthread, NULL); } return 0; }
void MltRuntime::run(ANativeWindow* nw) throw(Exception) { init(); Lock lk(&run_lock); if ( consumer) mlt_consumer_close(consumer); mlt_profile profile = mlt_profile_clone(MltLoader::global_profile); consumer = mlt_factory_consumer(profile, "android_surface_preview", NULL); if ( consumer == NULL) { mlt_profile_close(profile); throw_error_v(ErrorRuntimeLoadFailed, "consumer init failed"); } mlt_properties props = mlt_consumer_properties(consumer); ANativeWindow_acquire(nw); mlt_properties_set_data(props, "native_window", nw , sizeof(void*),release_native_window , NULL); mlt_consumer_connect(consumer, mlt_producer_service(producer)); mlt_consumer_start(consumer); status = StatusRunning; }
/** * Start the consumer. **/ static int consumer_start(mlt_consumer parent) { // Get the properties mlt_properties properties = mlt_consumer_properties(parent); // Get the actual object consumer_SDIstream this = parent->child; // Check that we're not already running if (!mlt_properties_get_int(properties, "running")) { // Allocate threads pthread_t *consumer_pthread = calloc(1, sizeof(pthread_t)); // Assign the thread to properties mlt_properties_set_data(properties, "consumer_pthread", consumer_pthread, sizeof(pthread_t), free, NULL); // Set the running state mlt_properties_set_int(properties, "running", 1); // Create the the threads pthread_create(consumer_pthread, NULL, consumer_thread, this); } return 0; }
// Stop the threads mlt_properties_set_int(properties, "running", 0); // Wait for termination pthread_join(*consumer_pthread, NULL); } return 0; } /** * Determine if the consumer is stopped **/ static int consumer_is_stopped(mlt_consumer this) { // Get the properties mlt_properties properties = mlt_consumer_properties(this); return !mlt_properties_get_int(properties, "running"); } /** * Threaded wrapper for pipe. **/ static void *consumer_thread(void *arg) { // Identify the arg consumer_SDIstream this = arg; // Get the consumer mlt_consumer consumer = &this->parent; // Convenience functionality (this is to stop melt/inigo after the end of a playout)