summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/libtc/tcmoduleinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/transcode/transcode-1.1.7/libtc/tcmoduleinfo.c')
-rw-r--r--debian/transcode/transcode-1.1.7/libtc/tcmoduleinfo.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/libtc/tcmoduleinfo.c b/debian/transcode/transcode-1.1.7/libtc/tcmoduleinfo.c
new file mode 100644
index 00000000..92b2dcbc
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/libtc/tcmoduleinfo.c
@@ -0,0 +1,207 @@
+/*
+ * tcmoduleinfo.c -- module informations (capabilities) and helper functions.
+ * (C) 2005-2010 - Francesco Romani <fromani -at- gmail -dot- com>
+ *
+ * This file is part of transcode, a video stream processing tool.
+ *
+ * transcode is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * transcode is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "libtc.h"
+#include "tcmodule-info.h"
+#include "transcode.h"
+
+#include <string.h>
+
+#define HAVE_FEATURE(info, feat) \
+ ((info)->features & (TC_MODULE_FEATURE_ ## feat))
+
+int tc_module_info_match(int tc_codec,
+ const TCModuleInfo *head, const TCModuleInfo *tail)
+{
+ int found = 0;
+ int i = 0, j = 0;
+ /* we need a pair of valid references to go further */
+ if (head == NULL || tail == NULL) {
+ return 0;
+ }
+ /*
+ * a multiplexor module can be chained with nothing,
+ * it must be placed at the end of the chain; reversed
+ * for demulitplexor module.
+ */
+ if (HAVE_FEATURE(head, MULTIPLEX) || HAVE_FEATURE(tail, DEMULTIPLEX)) {
+ return 0;
+ }
+ /* format kind compatibility check */
+ if ((HAVE_FEATURE(head, VIDEO) && !HAVE_FEATURE(tail, VIDEO))
+ || (HAVE_FEATURE(head, AUDIO) && !HAVE_FEATURE(tail, AUDIO))) {
+ return 0;
+ }
+
+ /*
+ * we look only for the first compatible match, not for the best one.
+ * Yet.
+ */
+ for (i = 0; !found && tail->codecs_in[i] != TC_CODEC_ERROR; i++) {
+ for (j = 0; !found && head->codecs_out[j] != TC_CODEC_ERROR; j++) {
+ /* trivial case: exact match */
+ if (tc_codec == head->codecs_out[j]
+ && head->codecs_out[j] == tail->codecs_in[i]) {
+ /* triple fit */
+ found = 1;
+ }
+ if ((head->codecs_out[j] == tail->codecs_in[i]
+ || head->codecs_out[j] == TC_CODEC_ANY)
+ && TC_CODEC_ANY == tc_codec) {
+ found = 1;
+ }
+ if ((tc_codec == head->codecs_out[j]
+ || tc_codec == TC_CODEC_ANY)
+ && TC_CODEC_ANY == tail->codecs_in[i]) {
+ found = 1;
+ }
+ if ((tail->codecs_in[i] == tc_codec
+ || tail->codecs_in[i] == TC_CODEC_ANY)
+ && TC_CODEC_ANY == head->codecs_out[j]) {
+ found = 1;
+ }
+ }
+ }
+ return found;
+}
+
+#undef HAVE_FEATURE
+
+
+static void codecs_to_string(const TCCodecID *codecs, char *buffer,
+ size_t bufsize, const char *fallback_string)
+{
+ int found = 0;
+ int i = 0;
+
+ if (buffer == NULL || bufsize < TC_BUF_LINE) {
+ return;
+ }
+
+ buffer[0] = '\0';
+
+ for (i = 0; codecs[i] != TC_CODEC_ERROR; i++) {
+ const char *codec = tc_codec_to_string(codecs[i]);
+ if (codec != NULL) {
+ strlcat(buffer, codec, bufsize);
+ strlcat(buffer, " ", bufsize);
+ found = 1;
+ }
+ }
+ if (!found) {
+ strlcpy(buffer, fallback_string, bufsize);
+ }
+}
+
+void tc_module_info_log(const TCModuleInfo *info, int verbose)
+{
+ char buffer[TC_BUF_LINE];
+
+ if (info == NULL) {
+ return;
+ }
+ if (info->name == NULL
+ || (info->version == NULL || info->description == NULL)) {
+ tc_log_error(__FILE__, "missing critical information for module");
+ return;
+ }
+
+ if (verbose >= TC_STATS) {
+ tc_log_info(info->name, "description:\n%s", info->description);
+ }
+
+ if (verbose >= TC_DEBUG) {
+ if (info->features == TC_MODULE_FEATURE_NONE) {
+ strlcpy(buffer, "none (this shouldn't happen!", sizeof(buffer));
+ } else {
+ tc_snprintf(buffer, sizeof(buffer), "%s%s%s",
+ (info->features & TC_MODULE_FEATURE_VIDEO) ?"video " :"",
+ (info->features & TC_MODULE_FEATURE_AUDIO) ?"audio " :"",
+ (info->features & TC_MODULE_FEATURE_EXTRA) ?"extra" :"");
+ }
+ tc_log_info(info->name, "can handle : %s", buffer);
+
+ if (info->features == TC_MODULE_FEATURE_NONE) {
+ strlcpy(buffer, "nothing (this shouldn't happen!", sizeof(buffer));
+ } else {
+ tc_snprintf(buffer, sizeof(buffer), "%s%s%s",
+ (info->features & TC_MODULE_FEATURE_FILTER)
+ ?"filtering " :"",
+ (info->features & TC_MODULE_FEATURE_ENCODE)
+ ?"encoding " :"",
+ (info->features & TC_MODULE_FEATURE_MULTIPLEX)
+ ?"multiplexing" :"");
+ }
+ tc_log_info(info->name, "can do : %s", buffer);
+
+ if (info->flags == TC_MODULE_FLAG_NONE) {
+ strlcpy(buffer, "none", sizeof(buffer));
+ } else {
+ tc_snprintf(buffer, sizeof(buffer), "%s%s%s%s",
+ (info->flags & TC_MODULE_FLAG_RECONFIGURABLE)
+ ?"reconfigurable " :"",
+ (info->flags & TC_MODULE_FLAG_DELAY)
+ ?"delay " :"",
+ (info->flags & TC_MODULE_FLAG_BUFFERING)
+ ?"buffering " :"",
+ (info->flags & TC_MODULE_FLAG_CONVERSION)
+ ?"conversion " :"");
+ }
+ tc_log_info(info->name, "flags : %s", buffer);
+ }
+
+ if (verbose >= TC_INFO) {
+ const char *str = (info->features & TC_MODULE_FEATURE_MULTIPLEX)
+ ?"a media stream" :"nothing";
+ codecs_to_string(info->codecs_in, buffer, sizeof(buffer), str);
+ tc_log_info(info->name, "accepts : %s", buffer);
+
+ codecs_to_string(info->codecs_out, buffer, TC_BUF_LINE, str);
+ tc_log_info(info->name, "produces : %s", buffer);
+ }
+}
+
+void tc_module_info_free(TCModuleInfo *info)
+{
+ if (info != NULL) {
+ /*
+ * void* casts to silence warning from gcc 4.x (free requires void*,
+ * argument is const something*
+ */
+ tc_free((void*)info->name);
+ tc_free((void*)info->version);
+ tc_free((void*)info->description);
+ tc_free((void*)info->codecs_in);
+ tc_free((void*)info->codecs_out);
+ }
+}
+
+/*************************************************************************/
+
+/*
+ * Local variables:
+ * c-file-style: "stroustrup"
+ * c-file-offsets: ((case-label . *) (statement-case-intro . *))
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+ */