static bool decoder_file_decode(const struct decoder_plugin *plugin, struct decoder *decoder, const char *path) { assert(plugin != NULL); assert(plugin->file_decode != NULL); assert(decoder != NULL); assert(decoder->stream_tag == NULL); assert(decoder->decoder_tag == NULL); assert(path != NULL); assert(g_path_is_absolute(path)); assert(decoder->dc->state == DECODE_STATE_START); g_debug("probing plugin %s", plugin->name); if (decoder->dc->command == DECODE_COMMAND_STOP) return true; decoder_unlock(decoder->dc); decoder_plugin_file_decode(plugin, decoder, path); decoder_lock(decoder->dc); assert(decoder->dc->state == DECODE_STATE_START || decoder->dc->state == DECODE_STATE_DECODE); return decoder->dc->state != DECODE_STATE_START; }
int main(int argc, char **argv) { GError *error = NULL; const char *decoder_name; struct decoder decoder; if (argc != 3) { g_printerr("Usage: run_decoder DECODER URI >OUT\n"); return 1; } decoder_name = argv[1]; decoder.uri = argv[2]; g_log_set_default_handler(my_log_func, NULL); tag_pool_init(); if (!input_stream_global_init(&error)) { g_warning("%s", error->message); g_error_free(error); return 2; } decoder_plugin_init_all(); decoder.plugin = decoder_plugin_from_name(decoder_name); if (decoder.plugin == NULL) { g_printerr("No such decoder: %s\n", decoder_name); return 1; } decoder.initialized = false; if (decoder.plugin->file_decode != NULL) { decoder_plugin_file_decode(decoder.plugin, &decoder, decoder.uri); } else if (decoder.plugin->stream_decode != NULL) { struct input_stream *is = input_stream_open(decoder.uri, &error); if (is == NULL) { if (error != NULL) { g_warning("%s", error->message); g_error_free(error); } else g_printerr("input_stream_open() failed\n"); return 1; } decoder_plugin_stream_decode(decoder.plugin, &decoder, is); input_stream_close(is); } else { g_printerr("Decoder plugin is not usable\n"); return 1; } decoder_plugin_deinit_all(); input_stream_global_finish(); if (!decoder.initialized) { g_printerr("Decoding failed\n"); return 1; } tag_pool_deinit(); return 0; }