mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 18:51:11 +00:00
add actions. see ChangeLog for details
Original commit message from CVS: add actions. see ChangeLog for details
This commit is contained in:
parent
27c4315715
commit
c50aa69137
185 changed files with 4780 additions and 22412 deletions
224
ChangeLog
224
ChangeLog
|
@ -1,3 +1,227 @@
|
|||
2005-05-29 Benjamin Otte <in7y118@public.uni-hamburg.de>
|
||||
|
||||
ORGANIZATIONAL CHANGES:
|
||||
|
||||
* configure.ac:
|
||||
remove leftover valgrind stuff, fix GST_OBJ_*FLAGS
|
||||
* gst/cothreads.c:
|
||||
* gst/cothreads.h:
|
||||
remove cothreads
|
||||
* gst/thread.h:
|
||||
* gst/thread.c:
|
||||
remove GstThread
|
||||
* gst/gstschedulerfactory.h:
|
||||
* gst/gstschedulerfactory.c:
|
||||
* gst/registries/gstlibxmlregistry.c:
|
||||
split out registry specific stuff from gstscheduler.[ch]
|
||||
* gst/Makefile.am:
|
||||
* gst/gst.h:
|
||||
remove cothread.[ch] and gstthread.[ch], add gstaction.[ch] and
|
||||
gstschedulerfactory.[ch]
|
||||
* gst/gstcompat.h:
|
||||
add a gst_bin_iterate macro, remove old 0.5 macros
|
||||
* gst/gst.c: (gst_register_core_elements):
|
||||
remove registering GstThread
|
||||
* gst/gst_private.h:
|
||||
add some functions here that shouldn't be exported
|
||||
* gst/gstclock.c: (gst_clock_class_init):
|
||||
remove thread initing, it's done in gst.c
|
||||
* gst/gstclock.h:
|
||||
* gst/gsttypes.h:
|
||||
move some more types to gsttypes.h: GstRealPad(Class),
|
||||
GstClockTime and GstAction
|
||||
|
||||
NEW SCHEDULING MODEL:
|
||||
|
||||
* gst/gstaction.h:
|
||||
* gst/gstaction.c:
|
||||
implement actions. These were formally known as triggers. They
|
||||
implement the different callback types used by elements.
|
||||
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_element_sched),
|
||||
(gst_bin_unset_element_sched), (gst_bin_iterate):
|
||||
* gst/gstbin.h:
|
||||
- remove gst_bin_iterate
|
||||
- remove code for decoupled elements
|
||||
* gst/gstelement.c: (gst_element_add_pad), (gst_element_remove_pad),
|
||||
(gst_element_reset_actions), (gst_element_change_state),
|
||||
(gst_element_found_tags_for_pad):
|
||||
add action support. Adding/removing pads adds/removes their actions
|
||||
from the element automatically. Allow resetting actions which sets
|
||||
all actions to their initial state.
|
||||
* gst/gstelement.c:
|
||||
* gst/gstelement.h:
|
||||
remove lots of functions related to the old scheduling code, like
|
||||
_yield, _interrupt etc
|
||||
* gst/gstpad.c: (gst_pad_push), (gst_real_pad_set_active),
|
||||
(gst_real_pad_is_active), (gst_real_pad_set_initially_active),
|
||||
(gst_src_pad_set_action_handler),
|
||||
(gst_sink_pad_set_action_handler):
|
||||
add functions to interact with pad actions.
|
||||
* gst/gstpad.c:
|
||||
* gst/gstpad.h:
|
||||
remove lots of stuff related to old scheduling, like DECOUPLED, the
|
||||
active property, chainhandlers etc
|
||||
* gst/gstpipeline.c: (gst_pipeline_class_init),
|
||||
(gst_pipeline_dispose):
|
||||
remove old scheduling specific calls
|
||||
* gst/gstscheduler.c: (gst_scheduler_class_init),
|
||||
(gst_scheduler_init), (gst_scheduler_dispose),
|
||||
(gst_scheduler_real_add_element),
|
||||
(gst_scheduler_real_remove_element), (gst_scheduler_marshal),
|
||||
(gst_scheduler_add_element), (gst_scheduler_remove_element),
|
||||
(gst_scheduler_state_transition), (gst_scheduler_get_clock),
|
||||
(gst_scheduler_set_clock), (gst_scheduler_auto_clock),
|
||||
(gst_scheduler_pad_push):
|
||||
* gst/gstscheduler.h:
|
||||
remove old scheduling code and add new one, which is basically
|
||||
add_action, remove_action (obvious), toggle_active (to indicate
|
||||
changing the activity state of an action) and update_values (to
|
||||
indicate that an action changed the values it was configured with
|
||||
|
||||
ELEMENTS:
|
||||
|
||||
* gst/gstqueue.c:
|
||||
* gst/gstqueue.h:
|
||||
nearly reimplement. Throw out all the threading specific code.
|
||||
* gst/elements/gstfakesink.c: (gst_fakesink_init),
|
||||
(gst_fakesink_request_new_pad), (gst_fakesink_chain):
|
||||
* gst/elements/gstfdsink.c: (gst_fdsink_init), (gst_fdsink_chain):
|
||||
* gst/elements/gstfdsrc.c: (gst_fdsrc_init), (gst_fdsrc_get):
|
||||
* gst/elements/gstfilesink.c: (gst_filesink_init),
|
||||
(gst_filesink_handle_event), (gst_filesink_chain):
|
||||
* gst/elements/gstfilesrc.c: (gst_filesrc_init), (gst_filesrc_get):
|
||||
replace get/chainfunction with a src/sinkpad action.
|
||||
* gst/elements/gstfakesrc.c: (gst_fakesrc_class_init),
|
||||
(gst_fakesrc_init), (gst_fakesrc_request_new_pad),
|
||||
(gst_fakesrc_update_functions), (gst_fakesrc_set_property),
|
||||
(gst_fakesrc_get_property), (gst_fakesrc_get):
|
||||
* gst/elements/gstfakesrc.h:
|
||||
replace getfunction with a srcpad action. Remove "loopbased"
|
||||
property.
|
||||
* gst/elements/gstidentity.c: (gst_identity_base_init),
|
||||
(gst_identity_class_init), (gst_identity_init),
|
||||
(gst_identity_push), (gst_identity_chain), (gst_identity_wakeup),
|
||||
(gst_identity_set_property), (gst_identity_get_property),
|
||||
(gst_identity_change_state):
|
||||
* gst/elements/gstidentity.h:
|
||||
make this a PUSH-based element. Remove "loopbased" property and
|
||||
other scheduling specific stuff.
|
||||
* gst/elements/gsttee.c: (gst_tee_base_init), (gst_tee_class_init),
|
||||
(gst_tee_init), (gst_tee_request_new_pad), (gst_tee_get),
|
||||
(gst_tee_chain), (gst_tee_change_state):
|
||||
* gst/elements/gsttee.h:
|
||||
implement using pad actions
|
||||
* gst/elements/gsttypefindelement.c: (gst_type_find_element_init),
|
||||
(push_buffer_store), (stop_typefinding),
|
||||
(gst_type_find_element_wakeup),
|
||||
(gst_type_find_element_handle_event),
|
||||
(gst_type_find_element_chain):
|
||||
* gst/elements/gsttypefindelement.h:
|
||||
make this a push-based element
|
||||
|
||||
SCHEDULERS:
|
||||
|
||||
* gst/schedulers/Makefile.am:
|
||||
* gst/schedulers/cothreads_compat.h:
|
||||
* gst/schedulers/entryscheduler.c:
|
||||
* gst/schedulers/faircothreads.c:
|
||||
* gst/schedulers/faircothreads.h:
|
||||
* gst/schedulers/fairscheduler.c:
|
||||
* gst/schedulers/gstbasicscheduler.c:
|
||||
* gst/schedulers/gstoptimalscheduler.c:
|
||||
* gst/schedulers/gthread-cothreads.h:
|
||||
remove
|
||||
* gst/schedulers/gstsimplescheduler.c:
|
||||
implement a simple scheduler. It's supposed to be as simple as
|
||||
possible (code-size). It's as fast as opt in 0.8.
|
||||
|
||||
LIBS:
|
||||
|
||||
* libs/gst/bytestream/Makefile.am:
|
||||
* libs/gst/bytestream/gstbytestream.c:
|
||||
* libs/gst/bytestream/gstbytestream.h:
|
||||
remove bytestream
|
||||
* libs/gst/bytestream/filepad.c: (gst_file_pad_init),
|
||||
(gst_file_pad_chain), (gst_file_pad_parent_set):
|
||||
make this a sinkpad-action using pad.
|
||||
|
||||
TOOLS:
|
||||
|
||||
* tools/Makefile.am:
|
||||
* tools/gst-md5sum.1.in:
|
||||
* tools/gst-md5sum.c:
|
||||
* tools/gst-xmlinspect.1.in:
|
||||
* tools/gst-xmlinspect.c:
|
||||
* tools/gst-xmllaunch.1.in:
|
||||
remove gst-xml-* tools and gst-md5sum.
|
||||
* tools/gst-inspect.c: (print_element_flag_info),
|
||||
(print_implementation_info), (print_pad_info):
|
||||
fix to show current scheduling information.
|
||||
* tools/gst-launch.c: (fault_handler_sighandler),
|
||||
(fault_handler_sigaction), (fault_spin), (print_tag),
|
||||
(play_handler), (should_quit), (quit_cb), (launch_poll), (main):
|
||||
implement new scheduling.
|
||||
* tools/gst-typefind.c: (have_type_handler), (main):
|
||||
make work with new scheduling
|
||||
|
||||
TESTSUITE:
|
||||
|
||||
* tests/Makefile.am:
|
||||
* tests/lat.c:
|
||||
* tests/muxing/Makefile.am:
|
||||
* tests/muxing/case1.c:
|
||||
* tests/sched/.cvsignore:
|
||||
* tests/sched/Makefile.am:
|
||||
* tests/sched/dynamic-pipeline.c:
|
||||
* tests/sched/interrupt1.c:
|
||||
* tests/sched/interrupt2.c:
|
||||
* tests/sched/interrupt3.c:
|
||||
* tests/sched/runtestcases:
|
||||
* tests/sched/runxml.c:
|
||||
* tests/sched/sched-stress.c:
|
||||
* tests/sched/testcases:
|
||||
* tests/sched/testcases1.tc:
|
||||
* tests/threadstate/.cvsignore:
|
||||
* tests/threadstate/Makefile.am:
|
||||
* tests/threadstate/test1.c:
|
||||
* tests/threadstate/test2.c:
|
||||
* tests/threadstate/threadstate1.c:
|
||||
* tests/threadstate/threadstate2.c:
|
||||
* tests/threadstate/threadstate3.c:
|
||||
* tests/threadstate/threadstate4.c:
|
||||
* tests/threadstate/threadstate5.c:
|
||||
* testsuite/Makefile.am:
|
||||
* testsuite/bytestream/Makefile.am:
|
||||
* testsuite/cleanup/Makefile.am:
|
||||
* testsuite/clock/Makefile.am:
|
||||
* testsuite/clock/clock1.c: (main):
|
||||
* testsuite/dlopen/loadgst.c: (do_test):
|
||||
* testsuite/elements/fake.c: (main):
|
||||
* testsuite/elements/struct_i386.h:
|
||||
* testsuite/elements/tee.c: (main):
|
||||
* testsuite/ghostpads/ghostpads.c: (main):
|
||||
* testsuite/pad/Makefile.am:
|
||||
* testsuite/pad/getnopush.c: (gst_test_src_get),
|
||||
(gst_test_src_init), (main):
|
||||
* testsuite/parse/parse1.c:
|
||||
* testsuite/schedulers/142183-2.c: (main):
|
||||
* testsuite/schedulers/143777-2.c: (main):
|
||||
* testsuite/schedulers/143777.c: (main):
|
||||
* testsuite/schedulers/147819.c: (handoff_identity1),
|
||||
(handoff_identity2), (main):
|
||||
* testsuite/schedulers/Makefile.am:
|
||||
* testsuite/schedulers/group_link.c: (main):
|
||||
* testsuite/schedulers/queue_link.c: (main):
|
||||
* testsuite/schedulers/relink.c: (cb_handoff), (main):
|
||||
* testsuite/schedulers/unlink.c: (main):
|
||||
* testsuite/schedulers/unref.c: (cb_handoff), (main):
|
||||
* testsuite/schedulers/useless_iteration.c: (main):
|
||||
- make work with new scheduling (mostly by making fakesrc only send
|
||||
a fixed number of buffers so we hit EOS and uising the _iterate
|
||||
compat macro.
|
||||
- remove tests that test the old scheduling model
|
||||
- remove tests that test threading
|
||||
|
||||
2005-05-17 Benjamin Otte <in7y118@public.uni-hamburg.de>
|
||||
|
||||
* gst/gstobject.c: (gst_object_ref), (gst_object_unref):
|
||||
|
|
2
common
2
common
|
@ -1 +1 @@
|
|||
Subproject commit 131c2632127e6f061b5270d8f80651782a4fdd13
|
||||
Subproject commit 67b7e6c0db99415e0440d0c576495641b53e976a
|
19
configure.ac
19
configure.ac
|
@ -560,15 +560,14 @@ AC_SUBST(GST_PKG_DEPS)
|
|||
|
||||
dnl flags shared for all internal objects (core libs, elements, applications)
|
||||
dnl we disable deprecated internally
|
||||
dnl XML, GLib, popt, GST_INT, VALGRIND, and the right include for CFLAGS
|
||||
dnl XML, GLib, popt, GST_INT, and the right include for CFLAGS
|
||||
dnl no need to add XML, GLib, popt explicitly since libgstreamer pulls them in
|
||||
GST_INT_CFLAGS="$GLIB_CFLAGS $XML_CFLAGS $GST_PKG_CFLAGS \
|
||||
$GST_INT_CFLAGS $GST_ERROR_CFLAGS -DGST_DISABLE_DEPRECATED"
|
||||
|
||||
dnl Private vars for libgst only
|
||||
GST_LIB_CFLAGS="$GST_PKG_CFLAGS $GST_INT_CFLAGS \
|
||||
$VALGRIND_CFLAGS -I\$(top_srcdir)"
|
||||
GST_LIB_LIBS="$XML_LIBS $GLIB_LIBS -lpopt $GST_PKG_LIBS $LTLIBINTL $VALGRIND_LIBS -lm"
|
||||
GST_LIB_CFLAGS="$GST_PKG_CFLAGS $GST_INT_CFLAGS -I\$(top_srcdir)"
|
||||
GST_LIB_LIBS="$XML_LIBS $GLIB_LIBS -lpopt $GST_PKG_LIBS $LTLIBINTL -lm"
|
||||
GST_LIB_LDFLAGS="$GST_LT_LDFLAGS -version-info $GST_LIBVERSION $EXPORT_LDFLAGS"
|
||||
AC_SUBST(GST_LIB_CFLAGS)
|
||||
AC_SUBST(GST_LIB_LIBS)
|
||||
|
@ -576,10 +575,11 @@ AC_SUBST(GST_LIB_LDFLAGS)
|
|||
|
||||
dnl Vars for all internal objects built on libgstreamer
|
||||
GST_OBJ_CFLAGS="$GST_INT_CFLAGS -I\$(top_srcdir)/libs -I\$(top_srcdir)"
|
||||
GST_OBJ_LIBS="\$(top_builddir)/gst/libgstreamer-$GST_MAJORMINOR.la"
|
||||
|
||||
AC_SUBST(GST_OBJ_CFLAGS, "$GST_OBJ_CFLAGS")
|
||||
AC_SUBST(GST_OBJ_LIBS, "$GST_OBJ_LIBS")
|
||||
GST_OBJ_LIBS="\$(top_builddir)/gst/libgstreamer-$GST_MAJORMINOR.la $GLIB_LIBS $LTLIBINTL"
|
||||
GST_OBJ_LDFLAGS="$GST_LT_LDFLAGS -version-info $GST_LIBVERSION $EXPORT_LDFLAGS"
|
||||
AC_SUBST(GST_OBJ_CFLAGS)
|
||||
AC_SUBST(GST_OBJ_LIBS)
|
||||
AC_SUBST(GST_OBJ_LDFLAGS)
|
||||
|
||||
dnl specific additional LDFLAGS for plugins
|
||||
GST_PLUGIN_LDFLAGS="-module -avoid-version $EXPORT_LDFLAGS"
|
||||
|
@ -646,10 +646,7 @@ tests/Makefile
|
|||
tests/bufspeed/Makefile
|
||||
tests/instantiate/Makefile
|
||||
tests/memchunk/Makefile
|
||||
tests/muxing/Makefile
|
||||
tests/seeking/Makefile
|
||||
tests/sched/Makefile
|
||||
tests/threadstate/Makefile
|
||||
testsuite/Makefile
|
||||
testsuite/bins/Makefile
|
||||
testsuite/bytestream/Makefile
|
||||
|
|
|
@ -1,10 +1,5 @@
|
|||
lib_LTLIBRARIES = libgstreamer-@GST_MAJORMINOR@.la
|
||||
AS_LIBTOOL_LIB = libgstreamer-@GST_MAJORMINOR@
|
||||
if GST_DISABLE_OMEGA_COTHREADS
|
||||
noinst_LTLIBRARIES =
|
||||
else
|
||||
noinst_LTLIBRARIES = libcothreads.la
|
||||
endif
|
||||
|
||||
#GST_INSTRUMENT_FLAGS = -finstrument-functions -DGST_ENABLE_FUNC_INSTRUMENTATION
|
||||
|
||||
|
@ -82,6 +77,7 @@ EXTRA_libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
|
|||
libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
|
||||
gst.c \
|
||||
gstobject.c \
|
||||
gstaction.c \
|
||||
gstbin.c \
|
||||
gstbuffer.c \
|
||||
gstcaps.c \
|
||||
|
@ -104,11 +100,11 @@ libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
|
|||
gstqueue.c \
|
||||
gstquery.c \
|
||||
gstscheduler.c \
|
||||
gstschedulerfactory.c \
|
||||
gststructure.c \
|
||||
gstsystemclock.c \
|
||||
gsttag.c \
|
||||
gsttaginterface.c \
|
||||
gstthread.c \
|
||||
$(GST_TRACE_SRC) \
|
||||
gsttypefind.c \
|
||||
$(GST_URI_SRC) \
|
||||
|
@ -150,6 +146,7 @@ libgstreamer_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINO
|
|||
|
||||
gst_headers = \
|
||||
gst.h \
|
||||
gstaction.h \
|
||||
gstobject.h \
|
||||
gstbin.h \
|
||||
gstbuffer.h \
|
||||
|
@ -174,11 +171,11 @@ gst_headers = \
|
|||
gstqueue.h \
|
||||
gstquery.h \
|
||||
gstscheduler.h \
|
||||
gstschedulerfactory.h \
|
||||
gststructure.h \
|
||||
gstsystemclock.h \
|
||||
gsttag.h \
|
||||
gsttaginterface.h \
|
||||
gstthread.h \
|
||||
gsttrace.h \
|
||||
gsttypefind.h \
|
||||
gsttypes.h \
|
||||
|
@ -201,16 +198,7 @@ noinst_HEADERS = \
|
|||
gst-i18n-app.h \
|
||||
gst_private.h \
|
||||
gstdata_private.h \
|
||||
gstarch.h \
|
||||
cothreads.h
|
||||
|
||||
if GST_DISABLE_OMEGA_COTHREADS
|
||||
#libcothreads_la_SOURCES =
|
||||
#libcothreads_la_CFLAGS =
|
||||
else
|
||||
libcothreads_la_SOURCES = cothreads.c
|
||||
libcothreads_la_CFLAGS = $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS)
|
||||
endif
|
||||
gstarch.h
|
||||
|
||||
|
||||
gstmarshal.h: gstmarshal.list
|
||||
|
|
679
gst/cothreads.c
679
gst/cothreads.c
|
@ -1,679 +0,0 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||
* 2000 Wim Taymans <wtay@chello.be>
|
||||
*
|
||||
* cothreads.c: Cothreading routines
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include "gst_private.h"
|
||||
#include <glib.h>
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "cothreads.h"
|
||||
#include "gstarch.h"
|
||||
#include "gstinfo.h"
|
||||
#include "gstutils.h"
|
||||
|
||||
#ifdef HAVE_UCONTEXT_H
|
||||
#include <ucontext.h>
|
||||
#endif
|
||||
|
||||
#ifndef MAP_ANONYMOUS
|
||||
#ifdef MAP_ANON
|
||||
/* older glibc's have MAP_ANON instead of MAP_ANONYMOUS */
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#else
|
||||
/* make due without. If this fails, we need to open and map /dev/zero */
|
||||
#define MAP_ANONYMOUS 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define STACK_SIZE 0x200000
|
||||
|
||||
#define COTHREAD_MAGIC_NUMBER 0xabcdef
|
||||
|
||||
#define COTHREAD_MAXTHREADS 16
|
||||
#define COTHREAD_STACKSIZE (STACK_SIZE/COTHREAD_MAXTHREADS)
|
||||
|
||||
static void cothread_destroy (cothread_state * cothread);
|
||||
|
||||
struct _cothread_context
|
||||
{
|
||||
cothread_state *cothreads[COTHREAD_MAXTHREADS]; /* array of cothread states */
|
||||
int ncothreads;
|
||||
int current;
|
||||
unsigned long stack_top;
|
||||
GHashTable *data;
|
||||
GThread *thread;
|
||||
};
|
||||
|
||||
/* Disabling this define allows you to shut off a few checks in
|
||||
* cothread_switch. This likely will speed things up fractionally */
|
||||
#define COTHREAD_PARANOID
|
||||
|
||||
|
||||
/* this _cothread_ctx_key is used as a GThread key to the thread's context
|
||||
* a GThread key is a "pointer" to memory space that is/can be different
|
||||
* (ie. private) for each thread. The key itself is shared among threads,
|
||||
* so it only needs to be initialized once.
|
||||
*/
|
||||
static GStaticPrivate _cothread_ctx_key = G_STATIC_PRIVATE_INIT;
|
||||
|
||||
/*
|
||||
* This should only after context init, since we do checking.
|
||||
*/
|
||||
static cothread_context *
|
||||
cothread_get_current_context (void)
|
||||
{
|
||||
cothread_context *ctx;
|
||||
|
||||
ctx = g_static_private_get (&_cothread_ctx_key);
|
||||
g_assert (ctx);
|
||||
|
||||
#ifdef COTHREAD_PARANOID
|
||||
g_assert (ctx->thread == g_thread_self ());
|
||||
#endif
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_context_init:
|
||||
*
|
||||
* Create and initialize a new cothread context
|
||||
*
|
||||
* Returns: the new cothread context
|
||||
*/
|
||||
cothread_context *
|
||||
cothread_context_init (void)
|
||||
{
|
||||
char __csf;
|
||||
void *current_stack_frame = &__csf; /* Get pointer inside current stack frame */
|
||||
cothread_context *ctx;
|
||||
|
||||
/* if there already is a cotread context for this thread,
|
||||
* just return it */
|
||||
ctx = g_static_private_get (&_cothread_ctx_key);
|
||||
if (ctx) {
|
||||
GST_CAT_INFO (GST_CAT_COTHREADS,
|
||||
"returning private _cothread_ctx_key %p", ctx);
|
||||
return ctx;
|
||||
}
|
||||
|
||||
/*
|
||||
* initalize the whole of the cothreads context
|
||||
*/
|
||||
ctx = (cothread_context *) g_malloc (sizeof (cothread_context));
|
||||
|
||||
/* we consider the initiating process to be cothread 0 */
|
||||
ctx->ncothreads = 1;
|
||||
ctx->current = 0;
|
||||
ctx->data = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
ctx->thread = g_thread_self ();
|
||||
|
||||
GST_CAT_INFO (GST_CAT_COTHREADS, "initializing cothreads");
|
||||
|
||||
/* set this thread's context pointer */
|
||||
GST_CAT_INFO (GST_CAT_COTHREADS,
|
||||
"setting private _cothread_ctx_key to %p in thread %p", ctx,
|
||||
g_thread_self ());
|
||||
g_static_private_set (&_cothread_ctx_key, ctx, NULL);
|
||||
|
||||
g_assert (ctx == cothread_get_current_context ());
|
||||
|
||||
/* clear the cothread data */
|
||||
memset (ctx->cothreads, 0, sizeof (ctx->cothreads));
|
||||
|
||||
/* FIXME this may not be 64bit clean
|
||||
* could use casts to uintptr_t from inttypes.h
|
||||
* if only all platforms had inttypes.h
|
||||
*/
|
||||
/* stack_top is the address of the first byte past our stack segment. */
|
||||
/* FIXME: an assumption is made that the stack segment is STACK_SIZE
|
||||
* aligned. */
|
||||
ctx->stack_top = ((gulong) current_stack_frame | (STACK_SIZE - 1)) + 1;
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "stack top is 0x%08lx", ctx->stack_top);
|
||||
|
||||
/*
|
||||
* initialize the 0th cothread
|
||||
*/
|
||||
ctx->cothreads[0] = (cothread_state *) g_malloc0 (sizeof (cothread_state));
|
||||
ctx->cothreads[0]->ctx = ctx;
|
||||
ctx->cothreads[0]->cothreadnum = 0;
|
||||
ctx->cothreads[0]->func = NULL;
|
||||
ctx->cothreads[0]->argc = 0;
|
||||
ctx->cothreads[0]->argv = NULL;
|
||||
ctx->cothreads[0]->priv = NULL;
|
||||
ctx->cothreads[0]->flags = COTHREAD_STARTED;
|
||||
ctx->cothreads[0]->sp = (void *) current_stack_frame;
|
||||
|
||||
GST_CAT_INFO (GST_CAT_COTHREADS, "0th cothread is %p at sp:%p",
|
||||
ctx->cothreads[0], ctx->cothreads[0]->sp);
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_context_free:
|
||||
* @ctx: the cothread context to free
|
||||
*
|
||||
* Free the cothread context.
|
||||
*/
|
||||
void
|
||||
cothread_context_free (cothread_context * ctx)
|
||||
{
|
||||
gint i;
|
||||
|
||||
g_return_if_fail (ctx != NULL);
|
||||
g_assert (ctx->thread == g_thread_self ());
|
||||
g_assert (ctx->current == 0);
|
||||
|
||||
GST_CAT_INFO (GST_CAT_COTHREADS, "free cothread context");
|
||||
|
||||
for (i = 1; i < COTHREAD_MAXTHREADS; i++) {
|
||||
if (ctx->cothreads[i]) {
|
||||
cothread_destroy (ctx->cothreads[i]);
|
||||
}
|
||||
}
|
||||
if (ctx->cothreads[0]) {
|
||||
g_free (ctx->cothreads[0]);
|
||||
ctx->cothreads[0] = NULL;
|
||||
}
|
||||
g_hash_table_destroy (ctx->data);
|
||||
/* make sure we free the private key for cothread context */
|
||||
GST_CAT_INFO (GST_CAT_COTHREADS,
|
||||
"setting private _cothread_ctx_key to NULL in thread %p",
|
||||
g_thread_self ());
|
||||
g_static_private_set (&_cothread_ctx_key, NULL, NULL);
|
||||
g_free (ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_create:
|
||||
* @ctx: the cothread context
|
||||
*
|
||||
* Create a new cothread state in the given context
|
||||
*
|
||||
* Returns: the new cothread state or NULL on error
|
||||
*/
|
||||
cothread_state *
|
||||
cothread_create (cothread_context * ctx)
|
||||
{
|
||||
cothread_state *cothread;
|
||||
void *mmaped = NULL;
|
||||
gint slot = 0;
|
||||
unsigned long page_size;
|
||||
|
||||
g_return_val_if_fail (ctx != NULL, NULL);
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "manager sef %p, cothread self %p",
|
||||
ctx->thread, g_thread_self ());
|
||||
|
||||
if (ctx->ncothreads == COTHREAD_MAXTHREADS) {
|
||||
/* this is pretty fatal */
|
||||
g_warning ("cothread_create: attempt to create > COTHREAD_MAXTHREADS");
|
||||
return NULL;
|
||||
}
|
||||
/* find a free spot in the stack, note slot 0 has the main thread */
|
||||
for (slot = 1; slot < ctx->ncothreads; slot++) {
|
||||
if (ctx->cothreads[slot] == NULL)
|
||||
break;
|
||||
else if (ctx->cothreads[slot]->flags & COTHREAD_DESTROYED &&
|
||||
slot != ctx->current) {
|
||||
cothread_destroy (ctx->cothreads[slot]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "Found free cothread slot %d", slot);
|
||||
|
||||
/* cothread stack space of the thread is mapped in reverse, with cothread 0
|
||||
* stack space at the top */
|
||||
cothread =
|
||||
(cothread_state *) (ctx->stack_top - (slot + 1) * COTHREAD_STACKSIZE);
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "cothread pointer is %p", cothread);
|
||||
|
||||
#if 0
|
||||
/* This tests to see whether or not we can grow down the stack */
|
||||
{
|
||||
unsigned long ptr;
|
||||
|
||||
for (ptr = ctx->stack_top - 4096; ptr > (unsigned long) cothread;
|
||||
ptr -= 4096) {
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "touching location 0x%08lx", ptr);
|
||||
*(volatile unsigned int *) ptr = *(volatile unsigned int *) ptr;
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "ok (0x%08x)", *(unsigned int *) ptr);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef _SC_PAGESIZE
|
||||
page_size = sysconf (_SC_PAGESIZE);
|
||||
#else
|
||||
page_size = getpagesize ();
|
||||
#endif
|
||||
|
||||
/* The mmap is necessary on Linux/i386, and possibly others, since the
|
||||
* kernel is picky about when we can expand our stack. */
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "mmaping %p, size 0x%08x", cothread,
|
||||
COTHREAD_STACKSIZE);
|
||||
/* Remap with a guard page. This decreases our stack size by 8 kB (for
|
||||
* 4 kB pages) and also wastes almost 4 kB for the cothreads
|
||||
* structure */
|
||||
munmap ((void *) cothread, COTHREAD_STACKSIZE);
|
||||
mmaped = mmap ((void *) cothread, page_size,
|
||||
PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
mmaped = mmap (((void *) cothread) + page_size * 2,
|
||||
COTHREAD_STACKSIZE - page_size * 2,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "coming out of mmap");
|
||||
if (mmaped == MAP_FAILED) {
|
||||
perror ("mmap'ing cothread stack space");
|
||||
return NULL;
|
||||
}
|
||||
if (mmaped != (void *) cothread + page_size * 2) {
|
||||
g_warning ("could not mmap requested memory for cothread");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cothread->magic_number = COTHREAD_MAGIC_NUMBER;
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS,
|
||||
"create cothread %d with magic number 0x%x", slot,
|
||||
cothread->magic_number);
|
||||
cothread->ctx = ctx;
|
||||
cothread->cothreadnum = slot;
|
||||
cothread->flags = 0;
|
||||
cothread->priv = NULL;
|
||||
cothread->sp = ((guchar *) cothread + COTHREAD_STACKSIZE);
|
||||
cothread->stack_size = COTHREAD_STACKSIZE - page_size * 2;
|
||||
cothread->stack_base = (void *) cothread + 2 * page_size;
|
||||
|
||||
GST_CAT_INFO (GST_CAT_COTHREADS,
|
||||
"created cothread #%d in slot %d: %p at sp:%p",
|
||||
ctx->ncothreads, slot, cothread, cothread->sp);
|
||||
|
||||
ctx->cothreads[slot] = cothread;
|
||||
ctx->ncothreads++;
|
||||
|
||||
return cothread;
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_free:
|
||||
* @cothread: the cothread state
|
||||
*
|
||||
* Free the given cothread state
|
||||
*/
|
||||
void
|
||||
cothread_free (cothread_state * cothread)
|
||||
{
|
||||
g_return_if_fail (cothread != NULL);
|
||||
|
||||
GST_CAT_INFO (GST_CAT_COTHREADS, "flag cothread %d for destruction",
|
||||
cothread->cothreadnum);
|
||||
|
||||
/* we simply flag the cothread for destruction here */
|
||||
if (cothread)
|
||||
cothread->flags |= COTHREAD_DESTROYED;
|
||||
else
|
||||
g_warning ("somebody set up us the bomb");
|
||||
}
|
||||
|
||||
static void
|
||||
cothread_destroy (cothread_state * cothread)
|
||||
{
|
||||
cothread_context *ctx;
|
||||
gint cothreadnum;
|
||||
|
||||
g_return_if_fail (cothread != NULL);
|
||||
|
||||
cothreadnum = cothread->cothreadnum;
|
||||
ctx = cothread->ctx;
|
||||
g_assert (ctx->thread == g_thread_self ());
|
||||
g_assert (ctx == cothread_get_current_context ());
|
||||
|
||||
GST_CAT_INFO (GST_CAT_COTHREADS, "destroy cothread %d %p %d",
|
||||
cothreadnum, cothread, ctx->current);
|
||||
|
||||
/* cothread 0 needs to be destroyed specially */
|
||||
g_assert (cothreadnum != 0);
|
||||
|
||||
/* doing cleanups of the cothread create */
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS,
|
||||
"destroy cothread %d with magic number 0x%x", cothreadnum,
|
||||
cothread->magic_number);
|
||||
g_assert (cothread->magic_number == COTHREAD_MAGIC_NUMBER);
|
||||
|
||||
g_assert (cothread->priv == NULL);
|
||||
|
||||
memset (cothread, 0, sizeof (*cothread));
|
||||
|
||||
ctx->cothreads[cothreadnum] = NULL;
|
||||
ctx->ncothreads--;
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_setfunc:
|
||||
* @cothread: the cothread state
|
||||
* @func: the function to call
|
||||
* @argc: argument count for the cothread function
|
||||
* @argv: arguments for the cothread function
|
||||
*
|
||||
* Set the cothread function
|
||||
*/
|
||||
void
|
||||
cothread_setfunc (cothread_state * cothread, cothread_func func, int argc,
|
||||
char **argv)
|
||||
{
|
||||
cothread->func = func;
|
||||
cothread->argc = argc;
|
||||
cothread->argv = argv;
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_stop:
|
||||
* @cothread: the cothread to stop
|
||||
*
|
||||
* Stop the cothread and reset the stack and program counter.
|
||||
*/
|
||||
void
|
||||
cothread_stop (cothread_state * cothread)
|
||||
{
|
||||
cothread->flags &= ~COTHREAD_STARTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_main:
|
||||
* @ctx: cothread context to find main cothread of.
|
||||
*
|
||||
* Gets the main thread.
|
||||
*
|
||||
* Returns: the #cothread_state of the main (0th) cothread.
|
||||
*/
|
||||
cothread_state *
|
||||
cothread_main (cothread_context * ctx)
|
||||
{
|
||||
g_assert (ctx->thread == g_thread_self ());
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "returning %p, the 0th cothread",
|
||||
ctx->cothreads[0]);
|
||||
return ctx->cothreads[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_current_main:
|
||||
*
|
||||
* Get the main thread in the current GThread.
|
||||
*
|
||||
* Returns: the #cothread_state of the main (0th) thread in the current GThread
|
||||
*/
|
||||
cothread_state *
|
||||
cothread_current_main (void)
|
||||
{
|
||||
cothread_context *ctx = cothread_get_current_context ();
|
||||
|
||||
return ctx->cothreads[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_current:
|
||||
*
|
||||
* Get the currenttly executing cothread
|
||||
*
|
||||
* Returns: the #cothread_state of the current cothread
|
||||
*/
|
||||
cothread_state *
|
||||
cothread_current (void)
|
||||
{
|
||||
cothread_context *ctx = cothread_get_current_context ();
|
||||
|
||||
return ctx->cothreads[ctx->current];
|
||||
}
|
||||
|
||||
static void
|
||||
cothread_stub (void)
|
||||
{
|
||||
cothread_context *ctx = cothread_get_current_context ();
|
||||
cothread_state *cothread = ctx->cothreads[ctx->current];
|
||||
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
char __csf;
|
||||
void *current_stack_frame = &__csf;
|
||||
#endif
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "stack addr %p", &ctx);
|
||||
|
||||
cothread->flags |= COTHREAD_STARTED;
|
||||
|
||||
while (TRUE) {
|
||||
cothread->func (cothread->argc, cothread->argv);
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "cothread[%d] thread->func exited",
|
||||
ctx->current);
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "sp=%p", current_stack_frame);
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "ctx=%p current=%p", ctx,
|
||||
cothread_get_current_context ());
|
||||
g_assert (ctx == cothread_get_current_context ());
|
||||
|
||||
g_assert (ctx->current != 0);
|
||||
|
||||
/* we do this to avoid ever returning, we just switch to 0th thread */
|
||||
cothread_switch (cothread_main (ctx));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_getcurrent:
|
||||
*
|
||||
* Get the current cothread id
|
||||
*
|
||||
* Returns: the current cothread id
|
||||
*/
|
||||
int
|
||||
cothread_getcurrent (void)
|
||||
G_GNUC_NO_INSTRUMENT;
|
||||
|
||||
int cothread_getcurrent (void)
|
||||
{
|
||||
cothread_context *ctx = cothread_get_current_context ();
|
||||
|
||||
if (!ctx)
|
||||
return -1;
|
||||
|
||||
return ctx->current;
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_set_private:
|
||||
* @cothread: the cothread state
|
||||
* @data: the data
|
||||
*
|
||||
* set private data for the cothread.
|
||||
*/
|
||||
void
|
||||
cothread_set_private (cothread_state * cothread, gpointer data)
|
||||
{
|
||||
cothread->priv = data;
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_context_set_data:
|
||||
* @cothread: the cothread state
|
||||
* @key: a key for the data
|
||||
* @data: the data
|
||||
*
|
||||
* adds data to a cothread
|
||||
*/
|
||||
void
|
||||
cothread_context_set_data (cothread_state * cothread, gchar * key,
|
||||
gpointer data)
|
||||
{
|
||||
cothread_context *ctx = cothread_get_current_context ();
|
||||
|
||||
g_hash_table_insert (ctx->data, key, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_get_private:
|
||||
* @cothread: the cothread state
|
||||
*
|
||||
* get the private data from the cothread
|
||||
*
|
||||
* Returns: the private data of the cothread
|
||||
*/
|
||||
gpointer
|
||||
cothread_get_private (cothread_state * cothread)
|
||||
{
|
||||
return cothread->priv;
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_context_get_data:
|
||||
* @cothread: the cothread state
|
||||
* @key: a key for the data
|
||||
*
|
||||
* get data from the cothread
|
||||
*
|
||||
* Returns: the data associated with the key
|
||||
*/
|
||||
gpointer
|
||||
cothread_context_get_data (cothread_state * cothread, gchar * key)
|
||||
{
|
||||
cothread_context *ctx = cothread_get_current_context ();
|
||||
|
||||
return g_hash_table_lookup (ctx->data, key);
|
||||
}
|
||||
|
||||
/**
|
||||
* cothread_switch:
|
||||
* @cothread: cothread state to switch to
|
||||
*
|
||||
* Switches to the given cothread state
|
||||
*/
|
||||
void
|
||||
cothread_switch (cothread_state * cothread)
|
||||
{
|
||||
cothread_context *ctx;
|
||||
cothread_state *current;
|
||||
int enter;
|
||||
|
||||
#ifdef COTHREAD_PARANOID
|
||||
if (cothread == NULL)
|
||||
goto nothread;
|
||||
#endif
|
||||
ctx = cothread->ctx;
|
||||
|
||||
/* paranoia check to make sure we're in the right thread */
|
||||
g_assert (ctx->thread == g_thread_self ());
|
||||
|
||||
#ifdef COTHREAD_PARANOID
|
||||
if (ctx == NULL)
|
||||
goto nocontext;
|
||||
#endif
|
||||
|
||||
current = ctx->cothreads[ctx->current];
|
||||
#ifdef COTHREAD_PARANOID
|
||||
if (current == NULL)
|
||||
goto nocurrent;
|
||||
#endif
|
||||
if (current == cothread)
|
||||
goto selfswitch;
|
||||
|
||||
|
||||
/* find the number of the thread to switch to */
|
||||
GST_CAT_INFO (GST_CAT_COTHREAD_SWITCH,
|
||||
"switching from cothread #%d to cothread #%d",
|
||||
ctx->current, cothread->cothreadnum);
|
||||
ctx->current = cothread->cothreadnum;
|
||||
|
||||
/* save the current stack pointer, frame pointer, and pc */
|
||||
#ifdef GST_ARCH_PRESETJMP
|
||||
GST_ARCH_PRESETJMP ();
|
||||
#endif
|
||||
enter = setjmp (current->jmp);
|
||||
if (enter != 0) {
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS,
|
||||
"enter cothread #%d %d sp=%p jmpbuf=%p",
|
||||
current->cothreadnum, enter, current->sp, current->jmp);
|
||||
return;
|
||||
}
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "exit cothread #%d %d sp=%p jmpbuf=%p",
|
||||
current->cothreadnum, enter, current->sp, current->jmp);
|
||||
enter = 1;
|
||||
|
||||
if (current->flags & COTHREAD_DESTROYED) {
|
||||
cothread_destroy (current);
|
||||
}
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "set stack to %p", cothread->sp);
|
||||
/* restore stack pointer and other stuff of new cothread */
|
||||
if (cothread->flags & COTHREAD_STARTED) {
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "via longjmp() jmpbuf %p", cothread->jmp);
|
||||
/* switch to it */
|
||||
longjmp (cothread->jmp, 1);
|
||||
} else {
|
||||
#ifdef HAVE_MAKECONTEXT
|
||||
ucontext_t ucp;
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "making context");
|
||||
|
||||
g_assert (cothread != cothread_main (ctx));
|
||||
|
||||
getcontext (&ucp);
|
||||
ucp.uc_stack.ss_sp = (void *) cothread->stack_base;
|
||||
ucp.uc_stack.ss_size = cothread->stack_size;
|
||||
makecontext (&ucp, cothread_stub, 0);
|
||||
setcontext (&ucp);
|
||||
#else
|
||||
GST_ARCH_SETUP_STACK ((char *) cothread->sp);
|
||||
GST_ARCH_SET_SP (cothread->sp);
|
||||
/* start it */
|
||||
GST_ARCH_CALL (cothread_stub);
|
||||
#endif
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_COTHREADS, "exit thread ");
|
||||
ctx->current = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
#ifdef COTHREAD_PARANOID
|
||||
nothread:
|
||||
g_warning ("cothread: can't switch to NULL cothread!");
|
||||
return;
|
||||
nocontext:
|
||||
g_warning ("cothread: there's no context, help!");
|
||||
exit (2);
|
||||
nocurrent:
|
||||
g_warning ("cothread: there's no current thread, help!");
|
||||
exit (2);
|
||||
#endif /* COTHREAD_PARANOID */
|
||||
selfswitch:
|
||||
return;
|
||||
}
|
|
@ -1,77 +0,0 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||
* 2000 Wim Taymans <wtay@chello.be>
|
||||
*
|
||||
* cothreads.h: Header for cothreading routines
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __COTHREADS_H__
|
||||
#define __COTHREADS_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
typedef struct _cothread_state cothread_state;
|
||||
typedef struct _cothread_context cothread_context;
|
||||
|
||||
typedef int (*cothread_func) (int argc,char **argv);
|
||||
|
||||
#define COTHREAD_STARTED 0x01
|
||||
#define COTHREAD_DESTROYED 0x02
|
||||
|
||||
struct _cothread_state {
|
||||
cothread_context *ctx;
|
||||
int cothreadnum;
|
||||
gpointer priv;
|
||||
|
||||
cothread_func func;
|
||||
int argc;
|
||||
char **argv;
|
||||
|
||||
int flags;
|
||||
void *sp;
|
||||
jmp_buf jmp;
|
||||
void *stack_base;
|
||||
unsigned long stack_size;
|
||||
|
||||
int magic_number;
|
||||
};
|
||||
|
||||
|
||||
cothread_context* cothread_context_init (void);
|
||||
void cothread_context_free (cothread_context *ctx);
|
||||
void cothread_context_set_data (cothread_state *cothread,
|
||||
gchar *key, gpointer data);
|
||||
gpointer cothread_context_get_data (cothread_state *cothread, gchar *key);
|
||||
|
||||
cothread_state* cothread_create (cothread_context *ctx);
|
||||
void cothread_free (cothread_state *cothread);
|
||||
void cothread_setfunc (cothread_state *cothread, cothread_func func,
|
||||
int argc, char **argv);
|
||||
void cothread_stop (cothread_state *cothread);
|
||||
|
||||
void cothread_switch (cothread_state *cothread);
|
||||
void cothread_set_private (cothread_state *cothread,
|
||||
gpointer data);
|
||||
gpointer cothread_get_private (cothread_state *cothread);
|
||||
|
||||
cothread_state* cothread_main (cothread_context *ctx);
|
||||
cothread_state* cothread_current_main (void);
|
||||
cothread_state* cothread_current (void);
|
||||
|
||||
#endif /* __COTHREAD_H__ */
|
|
@ -113,7 +113,8 @@ static void gst_fakesink_get_property (GObject * object, guint prop_id,
|
|||
|
||||
static GstElementStateReturn gst_fakesink_change_state (GstElement * element);
|
||||
|
||||
static void gst_fakesink_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_fakesink_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * _data);
|
||||
|
||||
static guint gst_fakesink_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
|
@ -187,8 +188,8 @@ gst_fakesink_init (GstFakeSink * fakesink)
|
|||
pad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
gst_sink_pad_set_action_handler (pad, GST_DEBUG_FUNCPTR (gst_fakesink_chain));
|
||||
gst_element_add_pad (GST_ELEMENT (fakesink), pad);
|
||||
gst_pad_set_chain_function (pad, GST_DEBUG_FUNCPTR (gst_fakesink_chain));
|
||||
|
||||
fakesink->silent = FALSE;
|
||||
fakesink->dump = FALSE;
|
||||
|
@ -231,7 +232,8 @@ gst_fakesink_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
|||
|
||||
sinkpad = gst_pad_new_from_template (templ, name);
|
||||
g_free (name);
|
||||
gst_pad_set_chain_function (sinkpad, GST_DEBUG_FUNCPTR (gst_fakesink_chain));
|
||||
gst_sink_pad_set_action_handler (sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_fakesink_chain));
|
||||
|
||||
gst_element_add_pad (GST_ELEMENT (fakesink), sinkpad);
|
||||
|
||||
|
@ -309,7 +311,7 @@ gst_fakesink_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
}
|
||||
|
||||
static void
|
||||
gst_fakesink_chain (GstPad * pad, GstData * _data)
|
||||
gst_fakesink_chain (GstAction * action, GstRealPad * pad, GstData * _data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstFakeSink *fakesink;
|
||||
|
@ -341,7 +343,7 @@ gst_fakesink_chain (GstPad * pad, GstData * _data)
|
|||
gst_element_set_time (GST_ELEMENT (fakesink), value);
|
||||
}
|
||||
default:
|
||||
gst_pad_event_default (pad, event);
|
||||
gst_pad_event_default (GST_PAD (pad), event);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
|
|
|
@ -64,7 +64,6 @@ enum
|
|||
{
|
||||
ARG_0,
|
||||
ARG_NUM_SOURCES,
|
||||
ARG_LOOP_BASED,
|
||||
ARG_OUTPUT,
|
||||
ARG_DATA,
|
||||
ARG_SIZETYPE,
|
||||
|
@ -179,7 +178,7 @@ GST_BOILERPLATE_FULL (GstFakeSrc, gst_fakesrc, GstElement, GST_TYPE_ELEMENT,
|
|||
|
||||
static GstPad *gst_fakesrc_request_new_pad (GstElement * element,
|
||||
GstPadTemplate * templ, const gchar * unused);
|
||||
static void gst_fakesrc_update_functions (GstFakeSrc * src);
|
||||
static void gst_fakesrc_update_functions (GstFakeSrc * src, GstPad * pad);
|
||||
static void gst_fakesrc_set_property (GObject * object, guint prop_id,
|
||||
const GValue * value, GParamSpec * pspec);
|
||||
static void gst_fakesrc_get_property (GObject * object, guint prop_id,
|
||||
|
@ -188,8 +187,7 @@ static void gst_fakesrc_set_clock (GstElement * element, GstClock * clock);
|
|||
|
||||
static GstElementStateReturn gst_fakesrc_change_state (GstElement * element);
|
||||
|
||||
static GstData *gst_fakesrc_get (GstPad * pad);
|
||||
static void gst_fakesrc_loop (GstElement * element);
|
||||
static GstData *gst_fakesrc_get (GstAction * action, GstRealPad * pad);
|
||||
|
||||
static guint gst_fakesrc_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
|
@ -214,13 +212,9 @@ gst_fakesrc_class_init (GstFakeSrcClass * klass)
|
|||
gobject_class = (GObjectClass *) klass;
|
||||
gstelement_class = (GstElementClass *) klass;
|
||||
|
||||
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NUM_SOURCES,
|
||||
g_param_spec_int ("num-sources", "num-sources", "Number of sources",
|
||||
1, G_MAXINT, 1, G_PARAM_READABLE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOOP_BASED,
|
||||
g_param_spec_boolean ("loop-based", "loop-based",
|
||||
"Enable loop-based operation", FALSE, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_OUTPUT,
|
||||
g_param_spec_enum ("output", "output", "Output method (currently unused)",
|
||||
GST_TYPE_FAKESRC_OUTPUT, FAKESRC_FIRST_LAST_LOOP, G_PARAM_READWRITE));
|
||||
|
@ -299,11 +293,9 @@ gst_fakesrc_init (GstFakeSrc * fakesrc)
|
|||
pad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
gst_fakesrc_update_functions (fakesrc, pad);
|
||||
gst_element_add_pad (GST_ELEMENT (fakesrc), pad);
|
||||
|
||||
fakesrc->loop_based = FALSE;
|
||||
gst_fakesrc_update_functions (fakesrc);
|
||||
|
||||
fakesrc->output = FAKESRC_FIRST_LAST_LOOP;
|
||||
fakesrc->segment_start = -1;
|
||||
fakesrc->segment_end = -1;
|
||||
|
@ -358,39 +350,14 @@ gst_fakesrc_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
|||
name = g_strdup_printf ("src%d", GST_ELEMENT (fakesrc)->numsrcpads);
|
||||
|
||||
srcpad = gst_pad_new_from_template (templ, name);
|
||||
gst_fakesrc_update_functions (fakesrc, srcpad);
|
||||
gst_element_add_pad (GST_ELEMENT (fakesrc), srcpad);
|
||||
gst_fakesrc_update_functions (fakesrc);
|
||||
|
||||
g_free (name);
|
||||
|
||||
return srcpad;
|
||||
}
|
||||
|
||||
static const GstFormat *
|
||||
gst_fakesrc_get_formats (GstPad * pad)
|
||||
{
|
||||
static const GstFormat formats[] = {
|
||||
GST_FORMAT_DEFAULT,
|
||||
0,
|
||||
};
|
||||
|
||||
return formats;
|
||||
}
|
||||
|
||||
static const GstQueryType *
|
||||
gst_fakesrc_get_query_types (GstPad * pad)
|
||||
{
|
||||
static const GstQueryType types[] = {
|
||||
GST_QUERY_TOTAL,
|
||||
GST_QUERY_POSITION,
|
||||
GST_QUERY_START,
|
||||
GST_QUERY_SEGMENT_END,
|
||||
0,
|
||||
};
|
||||
|
||||
return types;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_fakesrc_query (GstPad * pad, GstQueryType type,
|
||||
GstFormat * format, gint64 * value)
|
||||
|
@ -416,19 +383,6 @@ gst_fakesrc_query (GstPad * pad, GstQueryType type,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static const GstEventMask *
|
||||
gst_fakesrc_get_event_mask (GstPad * pad)
|
||||
{
|
||||
static const GstEventMask masks[] = {
|
||||
{GST_EVENT_SEEK, GST_SEEK_FLAG_FLUSH},
|
||||
{GST_EVENT_SEEK_SEGMENT, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT_LOOP},
|
||||
{GST_EVENT_FLUSH, 0},
|
||||
{0, 0},
|
||||
};
|
||||
|
||||
return masks;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_fakesrc_event_handler (GstPad * pad, GstEvent * event)
|
||||
{
|
||||
|
@ -463,34 +417,12 @@ gst_fakesrc_event_handler (GstPad * pad, GstEvent * event)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_fakesrc_update_functions (GstFakeSrc * src)
|
||||
gst_fakesrc_update_functions (GstFakeSrc * src, GstPad * pad)
|
||||
{
|
||||
GList *pads;
|
||||
|
||||
if (src->loop_based) {
|
||||
gst_element_set_loop_function (GST_ELEMENT (src),
|
||||
GST_DEBUG_FUNCPTR (gst_fakesrc_loop));
|
||||
} else {
|
||||
gst_element_set_loop_function (GST_ELEMENT (src), NULL);
|
||||
}
|
||||
|
||||
pads = GST_ELEMENT (src)->pads;
|
||||
while (pads) {
|
||||
GstPad *pad = GST_PAD (pads->data);
|
||||
|
||||
if (src->loop_based) {
|
||||
gst_pad_set_get_function (pad, NULL);
|
||||
} else {
|
||||
gst_pad_set_get_function (pad, GST_DEBUG_FUNCPTR (gst_fakesrc_get));
|
||||
}
|
||||
|
||||
gst_src_pad_set_action_handler (pad, gst_fakesrc_get);
|
||||
gst_real_pad_set_initially_active (GST_REAL_PAD (pad), TRUE);
|
||||
gst_pad_set_event_function (pad, gst_fakesrc_event_handler);
|
||||
gst_pad_set_event_mask_function (pad, gst_fakesrc_get_event_mask);
|
||||
gst_pad_set_query_function (pad, gst_fakesrc_query);
|
||||
gst_pad_set_query_type_function (pad, gst_fakesrc_get_query_types);
|
||||
gst_pad_set_formats_function (pad, gst_fakesrc_get_formats);
|
||||
pads = g_list_next (pads);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -516,10 +448,6 @@ gst_fakesrc_set_property (GObject * object, guint prop_id, const GValue * value,
|
|||
src = GST_FAKESRC (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case ARG_LOOP_BASED:
|
||||
src->loop_based = g_value_get_boolean (value);
|
||||
gst_fakesrc_update_functions (src);
|
||||
break;
|
||||
case ARG_OUTPUT:
|
||||
g_warning ("not yet implemented");
|
||||
break;
|
||||
|
@ -596,9 +524,6 @@ gst_fakesrc_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
case ARG_NUM_SOURCES:
|
||||
g_value_set_int (value, GST_ELEMENT (src)->numsrcpads);
|
||||
break;
|
||||
case ARG_LOOP_BASED:
|
||||
g_value_set_boolean (value, src->loop_based);
|
||||
break;
|
||||
case ARG_OUTPUT:
|
||||
g_value_set_enum (value, src->output);
|
||||
break;
|
||||
|
@ -791,7 +716,7 @@ gst_fakesrc_create_buffer (GstFakeSrc * src)
|
|||
}
|
||||
|
||||
static GstData *
|
||||
gst_fakesrc_get (GstPad * pad)
|
||||
gst_fakesrc_get (GstAction * action, GstRealPad * pad)
|
||||
{
|
||||
GstFakeSrc *src;
|
||||
GstBuffer *buf;
|
||||
|
@ -870,40 +795,6 @@ gst_fakesrc_get (GstPad * pad)
|
|||
return GST_DATA (buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_fakesrc_loop:
|
||||
* @element: the faksesrc to loop
|
||||
*
|
||||
* generate an empty buffer and push it to the next element.
|
||||
*/
|
||||
static void
|
||||
gst_fakesrc_loop (GstElement * element)
|
||||
{
|
||||
GstFakeSrc *src;
|
||||
const GList *pads;
|
||||
|
||||
g_return_if_fail (element != NULL);
|
||||
g_return_if_fail (GST_IS_FAKESRC (element));
|
||||
|
||||
src = GST_FAKESRC (element);
|
||||
|
||||
pads = gst_element_get_pad_list (element);
|
||||
|
||||
while (pads) {
|
||||
GstPad *pad = GST_PAD (pads->data);
|
||||
GstData *data;
|
||||
|
||||
data = gst_fakesrc_get (pad);
|
||||
gst_pad_push (pad, data);
|
||||
|
||||
if (src->eos) {
|
||||
return;
|
||||
}
|
||||
|
||||
pads = g_list_next (pads);
|
||||
}
|
||||
}
|
||||
|
||||
static GstElementStateReturn
|
||||
gst_fakesrc_change_state (GstElement * element)
|
||||
{
|
||||
|
|
|
@ -76,7 +76,6 @@ typedef struct _GstFakeSrcClass GstFakeSrcClass;
|
|||
struct _GstFakeSrc {
|
||||
GstElement element;
|
||||
|
||||
gboolean loop_based;
|
||||
gboolean eos;
|
||||
|
||||
GstFakeSrcOutputType output;
|
||||
|
|
|
@ -69,7 +69,8 @@ static void gst_fdsink_set_property (GObject * object, guint prop_id,
|
|||
static void gst_fdsink_get_property (GObject * object, guint prop_id,
|
||||
GValue * value, GParamSpec * pspec);
|
||||
|
||||
static void gst_fdsink_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_fdsink_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * _data);
|
||||
|
||||
|
||||
static void
|
||||
|
@ -103,14 +104,14 @@ gst_fdsink_init (GstFdSink * fdsink)
|
|||
fdsink->sinkpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
gst_sink_pad_set_action_handler (fdsink->sinkpad, gst_fdsink_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (fdsink), fdsink->sinkpad);
|
||||
gst_pad_set_chain_function (fdsink->sinkpad, gst_fdsink_chain);
|
||||
|
||||
fdsink->fd = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_fdsink_chain (GstPad * pad, GstData * _data)
|
||||
gst_fdsink_chain (GstAction * action, GstRealPad * pad, GstData * _data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstFdSink *fdsink;
|
||||
|
@ -119,7 +120,7 @@ gst_fdsink_chain (GstPad * pad, GstData * _data)
|
|||
g_return_if_fail (GST_IS_PAD (pad));
|
||||
g_return_if_fail (buf != NULL);
|
||||
|
||||
fdsink = GST_FDSINK (gst_pad_get_parent (pad));
|
||||
fdsink = GST_FDSINK (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
g_return_if_fail (fdsink->fd >= 0);
|
||||
|
||||
|
|
|
@ -102,7 +102,7 @@ static void gst_fdsrc_get_property (GObject * object, guint prop_id,
|
|||
|
||||
static GstElementStateReturn gst_fdsrc_change_state (GstElement * element);
|
||||
static gboolean gst_fdsrc_release_locks (GstElement * element);
|
||||
static GstData *gst_fdsrc_get (GstPad * pad);
|
||||
static GstData *gst_fdsrc_get (GstAction * action, GstRealPad * pad);
|
||||
|
||||
|
||||
static void
|
||||
|
@ -164,7 +164,8 @@ gst_fdsrc_init (GstFdSrc * fdsrc)
|
|||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
|
||||
gst_pad_set_get_function (fdsrc->srcpad, gst_fdsrc_get);
|
||||
gst_src_pad_set_action_handler (fdsrc->srcpad, gst_fdsrc_get);
|
||||
gst_real_pad_set_initially_active (GST_REAL_PAD (fdsrc->srcpad), TRUE);
|
||||
gst_element_add_pad (GST_ELEMENT (fdsrc), fdsrc->srcpad);
|
||||
|
||||
fdsrc->fd = 0;
|
||||
|
@ -265,7 +266,7 @@ gst_fdsrc_release_locks (GstElement * element)
|
|||
}
|
||||
|
||||
static GstData *
|
||||
gst_fdsrc_get (GstPad * pad)
|
||||
gst_fdsrc_get (GstAction * action, GstRealPad * pad)
|
||||
{
|
||||
GstFdSrc *src;
|
||||
GstBuffer *buf;
|
||||
|
@ -277,7 +278,7 @@ gst_fdsrc_get (GstPad * pad)
|
|||
gint retval;
|
||||
#endif
|
||||
|
||||
src = GST_FDSRC (gst_pad_get_parent (pad));
|
||||
src = GST_FDSRC (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
/* create the buffer */
|
||||
buf = gst_buffer_new_and_alloc (src->blocksize);
|
||||
|
|
|
@ -66,29 +66,6 @@ enum
|
|||
ARG_LOCATION
|
||||
};
|
||||
|
||||
static const GstFormat *
|
||||
gst_filesink_get_formats (GstPad * pad)
|
||||
{
|
||||
static const GstFormat formats[] = {
|
||||
GST_FORMAT_BYTES,
|
||||
0,
|
||||
};
|
||||
|
||||
return formats;
|
||||
}
|
||||
|
||||
static const GstQueryType *
|
||||
gst_filesink_get_query_types (GstPad * pad)
|
||||
{
|
||||
static const GstQueryType types[] = {
|
||||
GST_QUERY_TOTAL,
|
||||
GST_QUERY_POSITION,
|
||||
0
|
||||
};
|
||||
|
||||
return types;
|
||||
}
|
||||
|
||||
static void gst_filesink_dispose (GObject * object);
|
||||
|
||||
static void gst_filesink_set_property (GObject * object, guint prop_id,
|
||||
|
@ -99,10 +76,11 @@ static void gst_filesink_get_property (GObject * object, guint prop_id,
|
|||
static gboolean gst_filesink_open_file (GstFileSink * sink);
|
||||
static void gst_filesink_close_file (GstFileSink * sink);
|
||||
|
||||
static gboolean gst_filesink_handle_event (GstPad * pad, GstEvent * event);
|
||||
static gboolean gst_filesink_handle_event (GstRealPad * pad, GstEvent * event);
|
||||
static gboolean gst_filesink_pad_query (GstPad * pad, GstQueryType type,
|
||||
GstFormat * format, gint64 * value);
|
||||
static void gst_filesink_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_filesink_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * _data);
|
||||
|
||||
static void gst_filesink_uri_handler_init (gpointer g_iface,
|
||||
gpointer iface_data);
|
||||
|
@ -167,14 +145,12 @@ gst_filesink_init (GstFileSink * filesink)
|
|||
pad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
gst_sink_pad_set_action_handler (pad, gst_filesink_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (filesink), pad);
|
||||
gst_pad_set_chain_function (pad, gst_filesink_chain);
|
||||
|
||||
GST_FLAG_SET (GST_ELEMENT (filesink), GST_ELEMENT_EVENT_AWARE);
|
||||
|
||||
gst_pad_set_query_function (pad, gst_filesink_pad_query);
|
||||
gst_pad_set_query_type_function (pad, gst_filesink_get_query_types);
|
||||
gst_pad_set_formats_function (pad, gst_filesink_get_formats);
|
||||
|
||||
filesink->filename = NULL;
|
||||
filesink->file = NULL;
|
||||
|
@ -336,12 +312,12 @@ gst_filesink_pad_query (GstPad * pad, GstQueryType type,
|
|||
|
||||
/* handle events (search) */
|
||||
static gboolean
|
||||
gst_filesink_handle_event (GstPad * pad, GstEvent * event)
|
||||
gst_filesink_handle_event (GstRealPad * pad, GstEvent * event)
|
||||
{
|
||||
GstEventType type;
|
||||
GstFileSink *filesink;
|
||||
|
||||
filesink = GST_FILESINK (gst_pad_get_parent (pad));
|
||||
filesink = GST_FILESINK (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
if (!(GST_FLAG_IS_SET (filesink, GST_FILESINK_OPEN))) {
|
||||
gst_event_unref (event);
|
||||
|
@ -407,7 +383,7 @@ gst_filesink_handle_event (GstPad * pad, GstEvent * event)
|
|||
gst_element_set_eos (GST_ELEMENT (filesink));
|
||||
break;
|
||||
default:
|
||||
gst_pad_event_default (pad, event);
|
||||
gst_pad_event_default (GST_PAD (pad), event);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -422,7 +398,7 @@ gst_filesink_handle_event (GstPad * pad, GstEvent * event)
|
|||
* take the buffer from the pad and write to file if it's open
|
||||
*/
|
||||
static void
|
||||
gst_filesink_chain (GstPad * pad, GstData * _data)
|
||||
gst_filesink_chain (GstAction * action, GstRealPad * pad, GstData * _data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstFileSink *filesink;
|
||||
|
@ -431,7 +407,7 @@ gst_filesink_chain (GstPad * pad, GstData * _data)
|
|||
g_return_if_fail (GST_IS_PAD (pad));
|
||||
g_return_if_fail (buf != NULL);
|
||||
|
||||
filesink = GST_FILESINK (gst_pad_get_parent (pad));
|
||||
filesink = GST_FILESINK (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
if (GST_IS_EVENT (buf)) {
|
||||
gst_filesink_handle_event (pad, GST_EVENT (buf));
|
||||
|
|
|
@ -125,43 +125,6 @@ enum
|
|||
ARG_TOUCH
|
||||
};
|
||||
|
||||
static const GstEventMask *
|
||||
gst_filesrc_get_event_mask (GstPad * pad)
|
||||
{
|
||||
static const GstEventMask masks[] = {
|
||||
{GST_EVENT_SEEK, GST_SEEK_METHOD_CUR |
|
||||
GST_SEEK_METHOD_SET | GST_SEEK_METHOD_END | GST_SEEK_FLAG_FLUSH},
|
||||
{GST_EVENT_FLUSH, 0},
|
||||
{GST_EVENT_SIZE, 0},
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
return masks;
|
||||
}
|
||||
|
||||
static const GstQueryType *
|
||||
gst_filesrc_get_query_types (GstPad * pad)
|
||||
{
|
||||
static const GstQueryType types[] = {
|
||||
GST_QUERY_TOTAL,
|
||||
GST_QUERY_POSITION,
|
||||
0
|
||||
};
|
||||
|
||||
return types;
|
||||
}
|
||||
|
||||
static const GstFormat *
|
||||
gst_filesrc_get_formats (GstPad * pad)
|
||||
{
|
||||
static const GstFormat formats[] = {
|
||||
GST_FORMAT_BYTES,
|
||||
0,
|
||||
};
|
||||
|
||||
return formats;
|
||||
}
|
||||
|
||||
static void gst_filesrc_dispose (GObject * object);
|
||||
|
||||
static void gst_filesrc_set_property (GObject * object, guint prop_id,
|
||||
|
@ -170,7 +133,7 @@ static void gst_filesrc_get_property (GObject * object, guint prop_id,
|
|||
GValue * value, GParamSpec * pspec);
|
||||
|
||||
static gboolean gst_filesrc_check_filesize (GstFileSrc * src);
|
||||
static GstData *gst_filesrc_get (GstPad * pad);
|
||||
static GstData *gst_filesrc_get (GstAction * action, GstRealPad * pad);
|
||||
static gboolean gst_filesrc_srcpad_event (GstPad * pad, GstEvent * event);
|
||||
static gboolean gst_filesrc_srcpad_query (GstPad * pad, GstQueryType type,
|
||||
GstFormat * format, gint64 * value);
|
||||
|
@ -247,12 +210,10 @@ gst_filesrc_init (GstFileSrc * src)
|
|||
src->srcpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
gst_pad_set_get_function (src->srcpad, gst_filesrc_get);
|
||||
gst_src_pad_set_action_handler (src->srcpad, gst_filesrc_get);
|
||||
gst_real_pad_set_initially_active (GST_REAL_PAD (src->srcpad), TRUE);
|
||||
gst_pad_set_event_function (src->srcpad, gst_filesrc_srcpad_event);
|
||||
gst_pad_set_event_mask_function (src->srcpad, gst_filesrc_get_event_mask);
|
||||
gst_pad_set_query_function (src->srcpad, gst_filesrc_srcpad_query);
|
||||
gst_pad_set_query_type_function (src->srcpad, gst_filesrc_get_query_types);
|
||||
gst_pad_set_formats_function (src->srcpad, gst_filesrc_get_formats);
|
||||
gst_element_add_pad (GST_ELEMENT (src), src->srcpad);
|
||||
|
||||
#ifdef HAVE_MMAP
|
||||
|
@ -686,12 +647,12 @@ gst_filesrc_get_read (GstFileSrc * src)
|
|||
}
|
||||
|
||||
static GstData *
|
||||
gst_filesrc_get (GstPad * pad)
|
||||
gst_filesrc_get (GstAction * action, GstRealPad * pad)
|
||||
{
|
||||
GstFileSrc *src;
|
||||
|
||||
g_return_val_if_fail (pad != NULL, NULL);
|
||||
src = GST_FILESRC (gst_pad_get_parent (pad));
|
||||
src = GST_FILESRC (gst_pad_get_parent (GST_PAD (pad)));
|
||||
g_return_val_if_fail (GST_FLAG_IS_SET (src, GST_FILESRC_OPEN), NULL);
|
||||
|
||||
/* check for flush */
|
||||
|
|
|
@ -31,18 +31,10 @@
|
|||
#include "gstidentity.h"
|
||||
#include <gst/gstmarshal.h>
|
||||
|
||||
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_identity_debug);
|
||||
/*
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_identity_debug, "identity", 0, "identity element");
|
||||
#define GST_CAT_DEFAULT gst_identity_debug
|
||||
*/
|
||||
|
||||
GstElementDetails gst_identity_details = GST_ELEMENT_DETAILS ("Identity",
|
||||
"Generic",
|
||||
|
@ -58,49 +50,32 @@ enum
|
|||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
#define DEFAULT_LOOP_BASED FALSE
|
||||
#define DEFAULT_SLEEP_TIME 0
|
||||
#define DEFAULT_DUPLICATE 1
|
||||
#define DEFAULT_ERROR_AFTER -1
|
||||
#define DEFAULT_DROP_PROBABILITY 0.0
|
||||
#define DEFAULT_DATARATE 0
|
||||
#define DEFAULT_SILENT FALSE
|
||||
#define DEFAULT_DUMP FALSE
|
||||
#define DEFAULT_SYNC FALSE
|
||||
#define DEFAULT_CHECK_PERFECT FALSE
|
||||
|
||||
enum
|
||||
{
|
||||
ARG_0,
|
||||
ARG_LOOP_BASED,
|
||||
ARG_SLEEP_TIME,
|
||||
ARG_DUPLICATE,
|
||||
ARG_ERROR_AFTER,
|
||||
ARG_DROP_PROBABILITY,
|
||||
ARG_DATARATE,
|
||||
ARG_SILENT,
|
||||
ARG_LAST_MESSAGE,
|
||||
ARG_DUMP,
|
||||
ARG_SYNC,
|
||||
ARG_CHECK_PERFECT
|
||||
};
|
||||
|
||||
|
||||
#define _do_init(bla) \
|
||||
GST_DEBUG_CATEGORY_INIT (gst_identity_debug, "identity", 0, "identity element");
|
||||
|
||||
GST_BOILERPLATE_FULL (GstIdentity, gst_identity, GstElement, GST_TYPE_ELEMENT,
|
||||
_do_init);
|
||||
GST_BOILERPLATE (GstIdentity, gst_identity, GstElement, GST_TYPE_ELEMENT);
|
||||
|
||||
static void gst_identity_finalize (GObject * object);
|
||||
static void gst_identity_set_property (GObject * object, guint prop_id,
|
||||
const GValue * value, GParamSpec * pspec);
|
||||
static void gst_identity_get_property (GObject * object, guint prop_id,
|
||||
GValue * value, GParamSpec * pspec);
|
||||
static GstElementStateReturn gst_identity_change_state (GstElement * element);
|
||||
|
||||
static void gst_identity_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_identity_set_clock (GstElement * element, GstClock * clock);
|
||||
static GstElementStateReturn gst_identity_change_state (GstElement * element);
|
||||
static void gst_identity_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * data);
|
||||
static void gst_identity_wakeup (GstAction * action, GstElement * element,
|
||||
gpointer unused);
|
||||
|
||||
|
||||
static guint gst_identity_signals[LAST_SIGNAL] = { 0 };
|
||||
|
@ -110,10 +85,6 @@ gst_identity_base_init (gpointer g_class)
|
|||
{
|
||||
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
||||
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&srctemplate));
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&sinktemplate));
|
||||
gst_element_class_set_details (gstelement_class, &gst_identity_details);
|
||||
}
|
||||
|
||||
|
@ -138,45 +109,36 @@ gst_identity_class_init (GstIdentityClass * klass)
|
|||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
gstelement_class = GST_ELEMENT_CLASS (klass);
|
||||
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOOP_BASED,
|
||||
g_param_spec_boolean ("loop-based", "Loop-based",
|
||||
"Set to TRUE to use loop-based rather than chain-based scheduling",
|
||||
DEFAULT_LOOP_BASED, G_PARAM_READWRITE));
|
||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_identity_get_property);
|
||||
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_identity_set_property);
|
||||
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SLEEP_TIME,
|
||||
g_param_spec_uint ("sleep-time", "Sleep time",
|
||||
"Microseconds to sleep between processing", 0, G_MAXUINT,
|
||||
DEFAULT_SLEEP_TIME, G_PARAM_READWRITE));
|
||||
"Microseconds to sleep between processing", 0, G_MAXUINT, 0,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DUPLICATE,
|
||||
g_param_spec_uint ("duplicate", "Duplicate Buffers",
|
||||
"Push the buffers N times", 0, G_MAXUINT, DEFAULT_DUPLICATE,
|
||||
G_PARAM_READWRITE));
|
||||
"Push the buffers N times", 0, G_MAXUINT, 1, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ERROR_AFTER,
|
||||
g_param_spec_int ("error_after", "Error After", "Error after N buffers",
|
||||
G_MININT, G_MAXINT, DEFAULT_ERROR_AFTER, G_PARAM_READWRITE));
|
||||
G_MININT, G_MAXINT, -1, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DROP_PROBABILITY,
|
||||
g_param_spec_float ("drop_probability", "Drop Probability",
|
||||
"The Probability a buffer is dropped", 0.0, 1.0,
|
||||
DEFAULT_DROP_PROBABILITY, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DATARATE,
|
||||
g_param_spec_int ("datarate", "Datarate",
|
||||
"(Re)timestamps buffers with number of bytes per second (0 = inactive)",
|
||||
0, G_MAXINT, DEFAULT_DATARATE, G_PARAM_READWRITE));
|
||||
"The Probability a buffer is dropped", 0.0, 1.0, 0.0,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT,
|
||||
g_param_spec_boolean ("silent", "silent", "silent", DEFAULT_SILENT,
|
||||
g_param_spec_boolean ("silent", "silent", "silent", FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LAST_MESSAGE,
|
||||
g_param_spec_string ("last-message", "last-message", "last-message", NULL,
|
||||
G_PARAM_READABLE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DUMP,
|
||||
g_param_spec_boolean ("dump", "Dump", "Dump buffer contents",
|
||||
DEFAULT_DUMP, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC,
|
||||
g_param_spec_boolean ("sync", "Synchronize",
|
||||
"Synchronize to pipeline clock", DEFAULT_SYNC, G_PARAM_READWRITE));
|
||||
g_param_spec_boolean ("dump", "Dump", "Dump buffer contents", FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHECK_PERFECT,
|
||||
g_param_spec_boolean ("check-perfect", "Check For Perfect Stream",
|
||||
"Verify that the stream is time- and data-contiguous",
|
||||
DEFAULT_CHECK_PERFECT, G_PARAM_READWRITE));
|
||||
"Verify that the stream is time- and data-contiguous", FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
gst_identity_signals[SIGNAL_HANDOFF] =
|
||||
g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
||||
|
@ -185,74 +147,82 @@ gst_identity_class_init (GstIdentityClass * klass)
|
|||
GST_TYPE_BUFFER | G_SIGNAL_TYPE_STATIC_SCOPE);
|
||||
|
||||
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_identity_finalize);
|
||||
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_identity_set_property);
|
||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_identity_get_property);
|
||||
|
||||
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_identity_set_clock);
|
||||
gstelement_class->change_state =
|
||||
GST_DEBUG_FUNCPTR (gst_identity_change_state);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
gst_identity_init (GstIdentity * identity)
|
||||
{
|
||||
identity->sinkpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
GST_FLAG_SET (identity, GST_ELEMENT_EVENT_AWARE);
|
||||
GST_FLAG_SET (identity, GST_ELEMENT_PUSHING);
|
||||
|
||||
identity->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
|
||||
gst_sink_pad_set_action_handler (identity->sinkpad, gst_identity_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (identity), identity->sinkpad);
|
||||
gst_pad_set_chain_function (identity->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_chain));
|
||||
gst_pad_set_link_function (identity->sinkpad, gst_pad_proxy_pad_link);
|
||||
gst_pad_set_getcaps_function (identity->sinkpad, gst_pad_proxy_getcaps);
|
||||
|
||||
identity->srcpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
identity->srcpad = gst_pad_new ("src", GST_PAD_SRC);
|
||||
gst_element_add_pad (GST_ELEMENT (identity), identity->srcpad);
|
||||
gst_pad_set_link_function (identity->srcpad, gst_pad_proxy_pad_link);
|
||||
gst_pad_set_getcaps_function (identity->srcpad, gst_pad_proxy_getcaps);
|
||||
|
||||
identity->loop_based = DEFAULT_LOOP_BASED;
|
||||
identity->sleep_time = DEFAULT_SLEEP_TIME;
|
||||
identity->duplicate = DEFAULT_DUPLICATE;
|
||||
identity->error_after = DEFAULT_ERROR_AFTER;
|
||||
identity->drop_probability = DEFAULT_DROP_PROBABILITY;
|
||||
identity->datarate = DEFAULT_DATARATE;
|
||||
identity->silent = DEFAULT_SILENT;
|
||||
identity->sync = DEFAULT_SYNC;
|
||||
identity->check_perfect = DEFAULT_CHECK_PERFECT;
|
||||
identity->dump = DEFAULT_DUMP;
|
||||
identity->wakeup = gst_element_add_wakeup (GST_ELEMENT (identity), FALSE,
|
||||
gst_identity_wakeup, NULL);
|
||||
|
||||
identity->loop_based = FALSE;
|
||||
identity->sleep_time = 0;
|
||||
identity->duplicate = 1;
|
||||
identity->error_after = -1;
|
||||
identity->drop_probability = 0.0;
|
||||
identity->silent = FALSE;
|
||||
identity->check_perfect = FALSE;
|
||||
identity->prev_timestamp = GST_CLOCK_TIME_NONE;
|
||||
identity->prev_duration = GST_CLOCK_TIME_NONE;
|
||||
identity->prev_offset_end = -1;
|
||||
identity->dump = FALSE;
|
||||
identity->last_message = NULL;
|
||||
identity->srccaps = NULL;
|
||||
|
||||
GST_FLAG_SET (identity, GST_ELEMENT_EVENT_AWARE);
|
||||
GST_FLAG_SET (identity, GST_ELEMENT_WORK_IN_PLACE);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
gst_identity_set_clock (GstElement * element, GstClock * clock)
|
||||
gst_identity_push (GstIdentity * identity, GstBuffer * buf)
|
||||
{
|
||||
GstIdentity *identity = GST_IDENTITY (element);
|
||||
if (!identity->silent) {
|
||||
g_free (identity->last_message);
|
||||
identity->last_message =
|
||||
g_strdup_printf ("chain ******* (%s:%s)i (%d bytes, timestamp: %"
|
||||
GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %"
|
||||
G_GINT64_FORMAT ", offset_end: % " G_GINT64_FORMAT ", flags: %d) %p",
|
||||
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf),
|
||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
||||
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_BUFFER_OFFSET (buf),
|
||||
GST_BUFFER_OFFSET_END (buf), GST_BUFFER_FLAGS (buf), buf);
|
||||
g_object_notify (G_OBJECT (identity), "last-message");
|
||||
}
|
||||
|
||||
gst_object_replace ((GstObject **) & identity->clock, (GstObject *) clock);
|
||||
gst_object_ref (GST_OBJECT (identity));
|
||||
g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0,
|
||||
buf);
|
||||
|
||||
if (identity->sleep_time)
|
||||
g_usleep (identity->sleep_time);
|
||||
|
||||
/* things may happen in handoff signals... */
|
||||
if (GST_ELEMENT_SCHED (identity))
|
||||
gst_pad_push (identity->srcpad, GST_DATA (buf));
|
||||
gst_object_unref (GST_OBJECT (identity));
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gst_identity_chain (GstPad * pad, GstData * _data)
|
||||
gst_identity_chain (GstAction * action, GstRealPad * pad, GstData * data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstIdentity *identity;
|
||||
guint i;
|
||||
|
||||
g_return_if_fail (pad != NULL);
|
||||
g_return_if_fail (GST_IS_PAD (pad));
|
||||
g_return_if_fail (buf != NULL);
|
||||
|
||||
identity = GST_IDENTITY (gst_pad_get_parent (pad));
|
||||
GstBuffer *buf;
|
||||
GstIdentity *identity = GST_IDENTITY (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
buf = GST_BUFFER (data);
|
||||
if (GST_IS_EVENT (buf)) {
|
||||
GstEvent *event = GST_EVENT (buf);
|
||||
|
||||
|
@ -261,11 +231,12 @@ gst_identity_chain (GstPad * pad, GstData * _data)
|
|||
|
||||
identity->last_message =
|
||||
g_strdup_printf ("chain ******* (%s:%s)E (type: %d) %p",
|
||||
GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE (event), event);
|
||||
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_EVENT_TYPE (event),
|
||||
event);
|
||||
|
||||
g_object_notify (G_OBJECT (identity), "last_message");
|
||||
}
|
||||
gst_pad_event_default (pad, event);
|
||||
gst_pad_event_default (identity->sinkpad, event);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -328,75 +299,31 @@ gst_identity_chain (GstPad * pad, GstData * _data)
|
|||
gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
|
||||
}
|
||||
|
||||
for (i = identity->duplicate; i; i--) {
|
||||
GstClockTime time;
|
||||
|
||||
if (!identity->silent) {
|
||||
g_free (identity->last_message);
|
||||
identity->last_message =
|
||||
g_strdup_printf ("chain ******* (%s:%s)i (%d bytes, timestamp: %"
|
||||
GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %"
|
||||
G_GINT64_FORMAT ", offset_end: % " G_GINT64_FORMAT ", flags: %d) %p",
|
||||
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf),
|
||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
||||
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_BUFFER_OFFSET (buf),
|
||||
GST_BUFFER_OFFSET_END (buf), GST_BUFFER_FLAGS (buf), buf);
|
||||
g_object_notify (G_OBJECT (identity), "last-message");
|
||||
}
|
||||
|
||||
time = GST_BUFFER_TIMESTAMP (buf);
|
||||
|
||||
if (identity->datarate > 0) {
|
||||
time = identity->bytes_handled * GST_SECOND / identity->datarate;
|
||||
|
||||
GST_BUFFER_TIMESTAMP (buf) = time;
|
||||
GST_BUFFER_DURATION (buf) =
|
||||
GST_BUFFER_SIZE (buf) * GST_SECOND / identity->datarate;
|
||||
}
|
||||
|
||||
g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0,
|
||||
buf);
|
||||
|
||||
if (i > 1)
|
||||
gst_buffer_ref (buf);
|
||||
|
||||
if (identity->sync) {
|
||||
if (identity->clock) {
|
||||
gst_element_wait (GST_ELEMENT (identity), time);
|
||||
}
|
||||
}
|
||||
|
||||
identity->bytes_handled += GST_BUFFER_SIZE (buf);
|
||||
gst_pad_push (identity->srcpad, GST_DATA (buf));
|
||||
|
||||
if (identity->sleep_time)
|
||||
g_usleep (identity->sleep_time);
|
||||
if (identity->duplicate > 1) {
|
||||
identity->current = buf;
|
||||
gst_data_ref (GST_DATA (buf));
|
||||
identity->missing = identity->duplicate - 1;
|
||||
gst_action_set_active (action, FALSE);
|
||||
gst_action_set_active (identity->wakeup, TRUE);
|
||||
}
|
||||
gst_identity_push (identity, buf);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_identity_loop (GstElement * element)
|
||||
gst_identity_wakeup (GstAction * action, GstElement * element, gpointer unused)
|
||||
{
|
||||
GstIdentity *identity;
|
||||
GstBuffer *buf;
|
||||
GstIdentity *identity = GST_IDENTITY (element);
|
||||
GstBuffer *buf = identity->current;
|
||||
|
||||
g_return_if_fail (element != NULL);
|
||||
g_return_if_fail (GST_IS_IDENTITY (element));
|
||||
|
||||
identity = GST_IDENTITY (element);
|
||||
|
||||
buf = GST_BUFFER (gst_pad_pull (identity->sinkpad));
|
||||
if (GST_IS_EVENT (buf)) {
|
||||
GstEvent *event = GST_EVENT (buf);
|
||||
|
||||
if (GST_EVENT_IS_INTERRUPT (event)) {
|
||||
gst_event_unref (event);
|
||||
g_assert (buf);
|
||||
if (--identity->missing) {
|
||||
gst_data_ref (GST_DATA (buf));
|
||||
} else {
|
||||
gst_pad_event_default (identity->sinkpad, event);
|
||||
}
|
||||
} else {
|
||||
gst_identity_chain (identity->sinkpad, GST_DATA (buf));
|
||||
identity->current = NULL;
|
||||
gst_action_set_active (action, FALSE);
|
||||
gst_real_pad_set_active (GST_REAL_PAD (identity->sinkpad), TRUE);
|
||||
}
|
||||
gst_identity_push (identity, buf);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -411,17 +338,6 @@ gst_identity_set_property (GObject * object, guint prop_id,
|
|||
identity = GST_IDENTITY (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case ARG_LOOP_BASED:
|
||||
identity->loop_based = g_value_get_boolean (value);
|
||||
if (identity->loop_based) {
|
||||
gst_element_set_loop_function (GST_ELEMENT (identity),
|
||||
gst_identity_loop);
|
||||
gst_pad_set_chain_function (identity->sinkpad, NULL);
|
||||
} else {
|
||||
gst_pad_set_chain_function (identity->sinkpad, gst_identity_chain);
|
||||
gst_element_set_loop_function (GST_ELEMENT (identity), NULL);
|
||||
}
|
||||
break;
|
||||
case ARG_SLEEP_TIME:
|
||||
identity->sleep_time = g_value_get_uint (value);
|
||||
break;
|
||||
|
@ -440,12 +356,6 @@ gst_identity_set_property (GObject * object, guint prop_id,
|
|||
case ARG_DROP_PROBABILITY:
|
||||
identity->drop_probability = g_value_get_float (value);
|
||||
break;
|
||||
case ARG_DATARATE:
|
||||
identity->datarate = g_value_get_int (value);
|
||||
break;
|
||||
case ARG_SYNC:
|
||||
identity->sync = g_value_get_boolean (value);
|
||||
break;
|
||||
case ARG_CHECK_PERFECT:
|
||||
identity->check_perfect = g_value_get_boolean (value);
|
||||
break;
|
||||
|
@ -467,9 +377,6 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
identity = GST_IDENTITY (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case ARG_LOOP_BASED:
|
||||
g_value_set_boolean (value, identity->loop_based);
|
||||
break;
|
||||
case ARG_SLEEP_TIME:
|
||||
g_value_set_uint (value, identity->sleep_time);
|
||||
break;
|
||||
|
@ -482,9 +389,6 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
case ARG_DROP_PROBABILITY:
|
||||
g_value_set_float (value, identity->drop_probability);
|
||||
break;
|
||||
case ARG_DATARATE:
|
||||
g_value_set_int (value, identity->datarate);
|
||||
break;
|
||||
case ARG_SILENT:
|
||||
g_value_set_boolean (value, identity->silent);
|
||||
break;
|
||||
|
@ -494,9 +398,6 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
case ARG_LAST_MESSAGE:
|
||||
g_value_set_string (value, identity->last_message);
|
||||
break;
|
||||
case ARG_SYNC:
|
||||
g_value_set_boolean (value, identity->sync);
|
||||
break;
|
||||
case ARG_CHECK_PERFECT:
|
||||
g_value_set_boolean (value, identity->check_perfect);
|
||||
break;
|
||||
|
@ -509,29 +410,14 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
static GstElementStateReturn
|
||||
gst_identity_change_state (GstElement * element)
|
||||
{
|
||||
GstIdentity *identity;
|
||||
|
||||
g_return_val_if_fail (GST_IS_IDENTITY (element), GST_STATE_FAILURE);
|
||||
|
||||
identity = GST_IDENTITY (element);
|
||||
GstIdentity *identity = GST_IDENTITY (element);
|
||||
|
||||
switch (GST_STATE_TRANSITION (element)) {
|
||||
case GST_STATE_NULL_TO_READY:
|
||||
break;
|
||||
case GST_STATE_READY_TO_PAUSED:
|
||||
identity->bytes_handled = 0;
|
||||
identity->prev_timestamp = GST_CLOCK_TIME_NONE;
|
||||
identity->prev_duration = GST_CLOCK_TIME_NONE;
|
||||
identity->prev_offset_end = -1;
|
||||
break;
|
||||
case GST_STATE_PAUSED_TO_PLAYING:
|
||||
case GST_STATE_PLAYING_TO_PAUSED:
|
||||
break;
|
||||
case GST_STATE_PAUSED_TO_READY:
|
||||
g_free (identity->last_message);
|
||||
identity->last_message = NULL;
|
||||
break;
|
||||
case GST_STATE_READY_TO_NULL:
|
||||
if (identity->current) {
|
||||
gst_data_unref (GST_DATA (identity->current));
|
||||
identity->current = NULL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -47,27 +47,27 @@ typedef struct _GstIdentityClass GstIdentityClass;
|
|||
struct _GstIdentity {
|
||||
GstElement element;
|
||||
|
||||
GstPad *sinkpad;
|
||||
GstPad *srcpad;
|
||||
GstPad * sinkpad;
|
||||
GstPad * srcpad;
|
||||
|
||||
GstAction * wakeup;
|
||||
|
||||
gboolean loop_based;
|
||||
guint duplicate;
|
||||
gint error_after;
|
||||
gfloat drop_probability;
|
||||
gint datarate;
|
||||
guint sleep_time;
|
||||
gboolean silent;
|
||||
gboolean dump;
|
||||
gboolean sync;
|
||||
gboolean check_perfect;
|
||||
GstClockTime prev_timestamp;
|
||||
GstClockTime prev_duration;
|
||||
guint64 prev_offset_end;
|
||||
GstClock *clock;
|
||||
gchar *last_message;
|
||||
GstCaps *srccaps;
|
||||
|
||||
guint64 bytes_handled;
|
||||
GstBuffer * current;
|
||||
guint missing;
|
||||
};
|
||||
|
||||
struct _GstIdentityClass {
|
||||
|
|
|
@ -27,15 +27,10 @@
|
|||
#include "gsttee.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_tee_debug);
|
||||
#if 0
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_tee_debug, "tee", 0, "tee element");
|
||||
#define GST_CAT_DEFAULT gst_tee_debug
|
||||
|
||||
#endif
|
||||
GstElementDetails gst_tee_details = GST_ELEMENT_DETAILS ("Tee pipe fitting",
|
||||
"Generic",
|
||||
"1-to-N pipe fitting",
|
||||
|
@ -63,10 +58,7 @@ GstStaticPadTemplate tee_src_template = GST_STATIC_PAD_TEMPLATE ("src%d",
|
|||
GST_PAD_REQUEST,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
#define _do_init(bla) \
|
||||
GST_DEBUG_CATEGORY_INIT (gst_tee_debug, "tee", 0, "tee element");
|
||||
|
||||
GST_BOILERPLATE_FULL (GstTee, gst_tee, GstElement, GST_TYPE_ELEMENT, _do_init);
|
||||
GST_BOILERPLATE (GstTee, gst_tee, GstElement, GST_TYPE_ELEMENT);
|
||||
|
||||
static GstPad *gst_tee_request_new_pad (GstElement * element,
|
||||
GstPadTemplate * temp, const gchar * unused);
|
||||
|
@ -77,7 +69,10 @@ static void gst_tee_set_property (GObject * object, guint prop_id,
|
|||
static void gst_tee_get_property (GObject * object, guint prop_id,
|
||||
GValue * value, GParamSpec * pspec);
|
||||
|
||||
static void gst_tee_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_tee_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * data);
|
||||
static GstData *gst_tee_get (GstAction * action, GstRealPad * pad);
|
||||
static GstElementStateReturn gst_tee_change_state (GstElement * element);
|
||||
|
||||
|
||||
static void
|
||||
|
@ -85,8 +80,6 @@ gst_tee_base_init (gpointer g_class)
|
|||
{
|
||||
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
||||
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&sinktemplate));
|
||||
gst_element_class_set_details (gstelement_class, &gst_tee_details);
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&tee_src_template));
|
||||
|
@ -114,6 +107,9 @@ gst_tee_class_init (GstTeeClass * klass)
|
|||
gstelement_class = (GstElementClass *) klass;
|
||||
|
||||
|
||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_tee_get_property);
|
||||
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_tee_set_property);
|
||||
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NUM_PADS,
|
||||
g_param_spec_int ("num_pads", "num_pads", "num_pads",
|
||||
0, G_MAXINT, 0, G_PARAM_READABLE));
|
||||
|
@ -126,9 +122,8 @@ gst_tee_class_init (GstTeeClass * klass)
|
|||
|
||||
|
||||
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_tee_finalize);
|
||||
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_tee_set_property);
|
||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_tee_get_property);
|
||||
|
||||
gstelement_class->change_state = gst_tee_change_state;
|
||||
gstelement_class->request_new_pad =
|
||||
GST_DEBUG_FUNCPTR (gst_tee_request_new_pad);
|
||||
}
|
||||
|
@ -136,17 +131,16 @@ gst_tee_class_init (GstTeeClass * klass)
|
|||
static void
|
||||
gst_tee_init (GstTee * tee)
|
||||
{
|
||||
tee->sinkpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
tee->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
|
||||
gst_sink_pad_set_action_handler (tee->sinkpad, gst_tee_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (tee), tee->sinkpad);
|
||||
gst_pad_set_chain_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_chain));
|
||||
gst_pad_set_link_function (tee->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_pad_proxy_pad_link));
|
||||
gst_pad_set_getcaps_function (tee->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
||||
|
||||
tee->last_message = NULL;
|
||||
GST_FLAG_SET (tee, GST_ELEMENT_EVENT_AWARE);
|
||||
}
|
||||
|
||||
/* helper compare function */
|
||||
|
@ -161,56 +155,6 @@ name_pad_compare (gconstpointer a, gconstpointer b)
|
|||
return strcmp (name, gst_pad_get_name (pad)); /* returns 0 if match */
|
||||
}
|
||||
|
||||
static GstCaps *
|
||||
gst_tee_getcaps (GstPad * _pad)
|
||||
{
|
||||
GstTee *tee = GST_TEE (gst_pad_get_parent (_pad));
|
||||
GstCaps *caps = gst_caps_new_any (), *tmp, *res;
|
||||
GstPad *pad;
|
||||
const GList *pads;
|
||||
|
||||
for (pads = gst_element_get_pad_list (GST_ELEMENT (tee));
|
||||
pads != NULL; pads = pads->next) {
|
||||
pad = GST_PAD (pads->data);
|
||||
if (pad == _pad)
|
||||
continue;
|
||||
|
||||
tmp = gst_pad_get_allowed_caps (pad);
|
||||
res = gst_caps_intersect (caps, tmp);
|
||||
gst_caps_free (tmp);
|
||||
gst_caps_free (caps);
|
||||
caps = res;
|
||||
}
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
static GstPadLinkReturn
|
||||
gst_tee_link (GstPad * _pad, const GstCaps * caps)
|
||||
{
|
||||
GstTee *tee = GST_TEE (gst_pad_get_parent (_pad));
|
||||
GstPadLinkReturn res;
|
||||
GstPad *pad;
|
||||
const GList *pads;
|
||||
|
||||
GST_DEBUG_OBJECT (tee, "Forwarding link to all other pads");
|
||||
|
||||
for (pads = gst_element_get_pad_list (GST_ELEMENT (tee));
|
||||
pads != NULL; pads = pads->next) {
|
||||
pad = GST_PAD (pads->data);
|
||||
if (pad == _pad)
|
||||
continue;
|
||||
|
||||
res = gst_pad_try_set_caps (pad, caps);
|
||||
GST_DEBUG_OBJECT (tee, "Pad %s:%s gave response %d",
|
||||
GST_DEBUG_PAD_NAME (pad), res);
|
||||
if (GST_PAD_LINK_FAILED (res))
|
||||
return res;
|
||||
}
|
||||
|
||||
return GST_PAD_LINK_OK;
|
||||
}
|
||||
|
||||
static GstPad *
|
||||
gst_tee_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
||||
const gchar * unused)
|
||||
|
@ -252,8 +196,11 @@ gst_tee_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
|||
|
||||
srcpad = gst_pad_new_from_template (templ, name);
|
||||
g_free (name);
|
||||
gst_pad_set_link_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_link));
|
||||
gst_pad_set_getcaps_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_getcaps));
|
||||
gst_src_pad_set_action_handler (srcpad, gst_tee_get);
|
||||
gst_pad_set_link_function (srcpad,
|
||||
GST_DEBUG_FUNCPTR (gst_pad_proxy_pad_link));
|
||||
gst_pad_set_getcaps_function (srcpad,
|
||||
GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
||||
gst_element_add_pad (GST_ELEMENT (tee), srcpad);
|
||||
GST_PAD_ELEMENT_PRIVATE (srcpad) = NULL;
|
||||
|
||||
|
@ -313,50 +260,82 @@ gst_tee_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_tee_chain:
|
||||
* @pad: the pad to follow
|
||||
* @buf: the buffer to pass
|
||||
*
|
||||
* Chain a buffer on a pad.
|
||||
*/
|
||||
static void
|
||||
gst_tee_chain (GstPad * pad, GstData * _data)
|
||||
static GstData *
|
||||
gst_tee_get (GstAction * action, GstRealPad * pad)
|
||||
{
|
||||
GstData *data;
|
||||
GstTee *tee = GST_TEE (gst_action_get_element (action));
|
||||
|
||||
g_assert (tee->current);
|
||||
if (!tee->silent) {
|
||||
GstData *data = tee->current;
|
||||
|
||||
g_free (tee->last_message);
|
||||
tee->last_message =
|
||||
g_strdup_printf ("request ******* (%s:%s)t (%d bytes, %"
|
||||
G_GUINT64_FORMAT ") %p", GST_DEBUG_PAD_NAME (pad),
|
||||
GST_IS_BUFFER (data) ? GST_BUFFER_SIZE (data) : 0,
|
||||
GST_IS_BUFFER (data) ? GST_BUFFER_TIMESTAMP (data) :
|
||||
GST_CLOCK_TIME_NONE, data);
|
||||
g_object_notify (G_OBJECT (tee), "last_message");
|
||||
}
|
||||
data = tee->current;
|
||||
gst_action_set_active (action, FALSE);
|
||||
tee->missing_pads--;
|
||||
if (tee->missing_pads == 0) {
|
||||
gst_real_pad_set_active (GST_REAL_PAD (tee->sinkpad), TRUE);
|
||||
if (GST_IS_EVENT (tee->current) &&
|
||||
GST_EVENT_TYPE (tee->current) == GST_EVENT_EOS) {
|
||||
gst_element_set_eos (GST_ELEMENT (tee));
|
||||
}
|
||||
tee->current = NULL;
|
||||
} else {
|
||||
gst_data_ref (tee->current);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_tee_chain (GstAction * action, GstRealPad * pad, GstData * data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstTee *tee;
|
||||
const GList *pads;
|
||||
GstTee *tee = GST_TEE (gst_action_get_element (action));
|
||||
|
||||
g_return_if_fail (pad != NULL);
|
||||
g_return_if_fail (GST_IS_PAD (pad));
|
||||
g_return_if_fail (buf != NULL);
|
||||
|
||||
tee = GST_TEE (gst_pad_get_parent (pad));
|
||||
|
||||
gst_buffer_ref_by_count (buf, GST_ELEMENT (tee)->numsrcpads - 1);
|
||||
|
||||
pads = gst_element_get_pad_list (GST_ELEMENT (tee));
|
||||
|
||||
while (pads) {
|
||||
g_assert (tee->current == NULL);
|
||||
g_assert (tee->missing_pads == 0);
|
||||
tee->current = data;
|
||||
for (pads = gst_element_get_pad_list (GST_ELEMENT (tee)); pads;
|
||||
pads = g_list_next (pads)) {
|
||||
GstPad *outpad = GST_PAD (pads->data);
|
||||
|
||||
pads = g_list_next (pads);
|
||||
|
||||
if (GST_PAD_DIRECTION (outpad) != GST_PAD_SRC)
|
||||
continue;
|
||||
|
||||
if (!tee->silent) {
|
||||
g_free (tee->last_message);
|
||||
tee->last_message =
|
||||
g_strdup_printf ("chain ******* (%s:%s)t (%d bytes, %"
|
||||
G_GUINT64_FORMAT ") %p", GST_DEBUG_PAD_NAME (outpad),
|
||||
GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf), buf);
|
||||
g_object_notify (G_OBJECT (tee), "last_message");
|
||||
gst_real_pad_set_active (GST_REAL_PAD (outpad), TRUE);
|
||||
tee->missing_pads++;
|
||||
}
|
||||
gst_real_pad_set_active (GST_REAL_PAD (tee->sinkpad), FALSE);
|
||||
}
|
||||
|
||||
static GstElementStateReturn
|
||||
gst_tee_change_state (GstElement * element)
|
||||
{
|
||||
GstTee *tee = GST_TEE (element);
|
||||
|
||||
switch (GST_STATE_TRANSITION (element)) {
|
||||
case GST_STATE_PAUSED_TO_READY:
|
||||
if (tee->current) {
|
||||
gst_data_unref (tee->current);
|
||||
tee->current = NULL;
|
||||
tee->missing_pads = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (GST_PAD_IS_USABLE (outpad))
|
||||
gst_pad_push (outpad, GST_DATA (buf));
|
||||
else
|
||||
gst_buffer_unref (buf);
|
||||
}
|
||||
if (GST_ELEMENT_CLASS (parent_class)->change_state)
|
||||
return GST_ELEMENT_CLASS (parent_class)->change_state (element);
|
||||
|
||||
return GST_STATE_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -48,6 +48,9 @@ struct _GstTee {
|
|||
|
||||
GstPad *sinkpad;
|
||||
|
||||
GstData *current; /* current data peers should pull */
|
||||
gint missing_pads; /* number of pads that haven't pulled yet */
|
||||
|
||||
gboolean silent;
|
||||
gchar *last_message;
|
||||
};
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include <gst/gsttypefind.h>
|
||||
#include <gst/gstutils.h>
|
||||
#include <gst/gsterror.h>
|
||||
#include <gst/gstaction.h>
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_type_find_element_debug);
|
||||
#define GST_CAT_DEFAULT gst_type_find_element_debug
|
||||
|
@ -103,16 +104,17 @@ static void gst_type_find_element_set_property (GObject * object,
|
|||
static void gst_type_find_element_get_property (GObject * object,
|
||||
guint prop_id, GValue * value, GParamSpec * pspec);
|
||||
|
||||
static const GstEventMask *gst_type_find_element_src_event_mask (GstPad * pad);
|
||||
static gboolean gst_type_find_element_src_event (GstPad * pad,
|
||||
GstEvent * event);
|
||||
static gboolean gst_type_find_handle_src_query (GstPad * pad,
|
||||
GstQueryType type, GstFormat * fmt, gint64 * value);
|
||||
static void push_buffer_store (GstTypeFindElement * typefind);
|
||||
|
||||
static void gst_type_find_element_chain (GstPad * sinkpad, GstData * data);
|
||||
static GstElementStateReturn
|
||||
gst_type_find_element_change_state (GstElement * element);
|
||||
static void gst_type_find_element_wakeup (GstAction * action,
|
||||
GstElement * element, gpointer unused);
|
||||
static void gst_type_find_element_chain (GstAction * action,
|
||||
GstRealPad * sinkpad, GstData * data);
|
||||
static GstElementStateReturn gst_type_find_element_change_state (GstElement *
|
||||
element);
|
||||
|
||||
static guint gst_type_find_element_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
|
@ -178,33 +180,35 @@ gst_type_find_element_class_init (GstTypeFindElementClass * typefind_class)
|
|||
static void
|
||||
gst_type_find_element_init (GstTypeFindElement * typefind)
|
||||
{
|
||||
GST_FLAG_SET (typefind, GST_ELEMENT_EVENT_AWARE);
|
||||
GST_FLAG_SET (typefind, GST_ELEMENT_PUSHING);
|
||||
|
||||
/* sinkpad */
|
||||
typefind->sink =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get
|
||||
(&type_find_element_sink_template), "sink");
|
||||
gst_pad_set_chain_function (typefind->sink, gst_type_find_element_chain);
|
||||
gst_sink_pad_set_action_handler (typefind->sink, gst_type_find_element_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (typefind), typefind->sink);
|
||||
/* srcpad */
|
||||
typefind->src =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get
|
||||
(&type_find_element_src_template), "src");
|
||||
gst_pad_set_event_function (typefind->src, gst_type_find_element_src_event);
|
||||
gst_pad_set_event_mask_function (typefind->src,
|
||||
gst_type_find_element_src_event_mask);
|
||||
gst_pad_set_query_function (typefind->src,
|
||||
GST_DEBUG_FUNCPTR (gst_type_find_handle_src_query));
|
||||
gst_pad_use_explicit_caps (typefind->src);
|
||||
gst_element_add_pad (GST_ELEMENT (typefind), typefind->src);
|
||||
|
||||
typefind->wakeup = gst_element_add_wakeup (GST_ELEMENT (typefind), FALSE,
|
||||
gst_type_find_element_wakeup, NULL);
|
||||
typefind->caps = NULL;
|
||||
typefind->pending_events = NULL;
|
||||
typefind->min_probability = 1;
|
||||
typefind->max_probability = GST_TYPE_FIND_MAXIMUM;
|
||||
|
||||
typefind->store = gst_buffer_store_new ();
|
||||
|
||||
GST_FLAG_SET (typefind, GST_ELEMENT_EVENT_AWARE);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_type_find_element_dispose (GObject * object)
|
||||
{
|
||||
|
@ -294,20 +298,6 @@ gst_type_find_handle_src_query (GstPad * pad,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static const GstEventMask *
|
||||
gst_type_find_element_src_event_mask (GstPad * pad)
|
||||
{
|
||||
static const GstEventMask mask[] = {
|
||||
{GST_EVENT_SEEK,
|
||||
GST_SEEK_METHOD_SET | GST_SEEK_METHOD_CUR | GST_SEEK_METHOD_END |
|
||||
GST_SEEK_FLAG_FLUSH},
|
||||
/* add more if you want, event masks suck and need to die anyway */
|
||||
{0,}
|
||||
};
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_type_find_element_src_event (GstPad * pad, GstEvent * event)
|
||||
{
|
||||
|
@ -368,6 +358,19 @@ start_typefinding (GstTypeFindElement * typefind)
|
|||
typefind->stream_length_available = TRUE;
|
||||
typefind->stream_length = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
push_buffer_store (GstTypeFindElement * typefind, GstEvent * event)
|
||||
{
|
||||
if (!event)
|
||||
event = gst_event_new_discontinuous (TRUE,
|
||||
GST_FORMAT_DEFAULT, (guint64) 0, GST_FORMAT_BYTES, (guint64) 0,
|
||||
GST_FORMAT_UNDEFINED);
|
||||
typefind->pending_events = g_list_append (typefind->pending_events, event);
|
||||
gst_real_pad_set_active (GST_REAL_PAD (typefind->sink), FALSE);
|
||||
gst_action_set_active (typefind->wakeup, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
stop_typefinding (GstTypeFindElement * typefind)
|
||||
{
|
||||
|
@ -401,7 +404,7 @@ stop_typefinding (GstTypeFindElement * typefind)
|
|||
"could not seek to required position %u, hope for the best", size);
|
||||
typefind->mode = MODE_NORMAL;
|
||||
/* push out our queued buffers here */
|
||||
push_buffer_store (typefind);
|
||||
push_buffer_store (typefind, NULL);
|
||||
} else {
|
||||
typefind->waiting_for_discont_offset = size;
|
||||
}
|
||||
|
@ -409,25 +412,26 @@ stop_typefinding (GstTypeFindElement * typefind)
|
|||
}
|
||||
|
||||
static void
|
||||
push_buffer_store (GstTypeFindElement * typefind)
|
||||
gst_type_find_element_wakeup (GstAction * action, GstElement * element,
|
||||
gpointer unused)
|
||||
{
|
||||
guint size = gst_buffer_store_get_size (typefind->store, 0);
|
||||
guint size;
|
||||
GstBuffer *buffer;
|
||||
const GList *item;
|
||||
GstTypeFindElement *typefind = GST_TYPE_FIND_ELEMENT (element);
|
||||
|
||||
/* handle pending events */
|
||||
for (item = typefind->pending_events; item; item = item->next) {
|
||||
if (typefind->pending_events) {
|
||||
GstEvent *e = item->data;
|
||||
|
||||
typefind->pending_events = g_list_remove (typefind->pending_events,
|
||||
typefind->pending_events->data);
|
||||
gst_pad_push (typefind->src, GST_DATA (e));
|
||||
return;
|
||||
}
|
||||
g_list_free (typefind->pending_events);
|
||||
typefind->pending_events = NULL;
|
||||
|
||||
/* data */
|
||||
gst_pad_push (typefind->src, GST_DATA (gst_event_new_discontinuous (TRUE,
|
||||
GST_FORMAT_DEFAULT, (guint64) 0, GST_FORMAT_BYTES, (guint64) 0,
|
||||
GST_FORMAT_UNDEFINED)));
|
||||
size = gst_buffer_store_get_size (typefind->store, 0);
|
||||
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
|
||||
GST_DEBUG_OBJECT (typefind, "pushing cached data (%u bytes)", size);
|
||||
gst_pad_push (typefind->src, GST_DATA (buffer));
|
||||
|
@ -437,6 +441,8 @@ push_buffer_store (GstTypeFindElement * typefind)
|
|||
}
|
||||
|
||||
gst_buffer_store_clear (typefind->store);
|
||||
gst_action_set_active (action, FALSE);
|
||||
gst_real_pad_set_active (GST_REAL_PAD (typefind->sink), TRUE);
|
||||
}
|
||||
|
||||
static guint64
|
||||
|
@ -496,8 +502,7 @@ gst_type_find_element_handle_event (GstPad * pad, GstEvent * event)
|
|||
g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE],
|
||||
0, entry->probability, entry->caps);
|
||||
stop_typefinding (typefind);
|
||||
push_buffer_store (typefind);
|
||||
gst_pad_event_default (pad, event);
|
||||
push_buffer_store (typefind, event);
|
||||
} else {
|
||||
gst_pad_event_default (pad, event);
|
||||
GST_ELEMENT_ERROR (typefind, STREAM, TYPE_NOT_FOUND, (NULL),
|
||||
|
@ -526,13 +531,11 @@ gst_type_find_element_handle_event (GstPad * pad, GstEvent * event)
|
|||
if (gst_event_discont_get_value (event, GST_FORMAT_BYTES, &off) &&
|
||||
off == typefind->waiting_for_discont_offset) {
|
||||
typefind->mode = MODE_NORMAL;
|
||||
push_buffer_store (typefind);
|
||||
push_buffer_store (typefind, NULL);
|
||||
}
|
||||
gst_event_unref (event);
|
||||
}
|
||||
} else if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
|
||||
push_buffer_store (typefind);
|
||||
gst_pad_event_default (pad, event);
|
||||
push_buffer_store (typefind, event);
|
||||
} else {
|
||||
gst_event_unref (event);
|
||||
}
|
||||
|
@ -618,7 +621,8 @@ compare_type_find_factory (gconstpointer fac1, gconstpointer fac2)
|
|||
return GST_PLUGIN_FEATURE (fac1)->rank - GST_PLUGIN_FEATURE (fac2)->rank;
|
||||
}
|
||||
static void
|
||||
gst_type_find_element_chain (GstPad * pad, GstData * data)
|
||||
gst_type_find_element_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * data)
|
||||
{
|
||||
GstTypeFindElement *typefind;
|
||||
GList *entries;
|
||||
|
@ -626,9 +630,9 @@ gst_type_find_element_chain (GstPad * pad, GstData * data)
|
|||
GList *walk;
|
||||
GstTypeFind find = { find_peek, find_suggest, NULL, find_element_get_length };
|
||||
|
||||
typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad));
|
||||
typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (GST_PAD (pad)));
|
||||
if (GST_IS_EVENT (data)) {
|
||||
gst_type_find_element_handle_event (pad, GST_EVENT (data));
|
||||
gst_type_find_element_handle_event (GST_PAD (pad), GST_EVENT (data));
|
||||
return;
|
||||
}
|
||||
switch (typefind->mode) {
|
||||
|
|
|
@ -48,6 +48,8 @@ struct _GstTypeFindElement {
|
|||
GstPad * sink;
|
||||
GstPad * src;
|
||||
|
||||
GstAction * wakeup;
|
||||
|
||||
guint min_probability;
|
||||
guint max_probability;
|
||||
GstCaps * caps;
|
||||
|
|
|
@ -450,11 +450,8 @@ init_pre (void)
|
|||
{
|
||||
g_type_init ();
|
||||
|
||||
if (g_thread_supported ()) {
|
||||
/* somebody already initialized threading */
|
||||
} else {
|
||||
if (!g_thread_supported ())
|
||||
g_thread_init (NULL);
|
||||
}
|
||||
/* we need threading to be enabled right here */
|
||||
_gst_debug_init ();
|
||||
|
||||
|
@ -526,8 +523,6 @@ gst_register_core_elements (GstPlugin * plugin)
|
|||
GST_TYPE_BIN) ||
|
||||
!gst_element_register (plugin, "pipeline", GST_RANK_PRIMARY,
|
||||
GST_TYPE_PIPELINE) ||
|
||||
!gst_element_register (plugin, "thread", GST_RANK_PRIMARY,
|
||||
GST_TYPE_THREAD) ||
|
||||
!gst_element_register (plugin, "queue", GST_RANK_NONE, GST_TYPE_QUEUE))
|
||||
g_assert_not_reached ();
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <gst/gsttypes.h>
|
||||
#include <gst/gstversion.h>
|
||||
|
||||
#include <gst/gstaction.h>
|
||||
#include <gst/gstbin.h>
|
||||
#include <gst/gstbuffer.h>
|
||||
#include <gst/gstcaps.h>
|
||||
|
@ -48,11 +49,11 @@
|
|||
#include <gst/gstpipeline.h>
|
||||
#include <gst/gstplugin.h>
|
||||
#include <gst/gstscheduler.h>
|
||||
#include <gst/gstschedulerfactory.h>
|
||||
#include <gst/gststructure.h>
|
||||
#include <gst/gstsystemclock.h>
|
||||
#include <gst/gsttag.h>
|
||||
#include <gst/gsttaginterface.h>
|
||||
#include <gst/gstthread.h>
|
||||
#include <gst/gsttrace.h>
|
||||
#include <gst/gsttypefind.h>
|
||||
#include <gst/gsturi.h>
|
||||
|
|
|
@ -36,6 +36,10 @@ extern const char *g_log_domain_gstreamer;
|
|||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "gstaction.h"
|
||||
|
||||
GstAction *gst_action_new (GstActionType type);
|
||||
#define gst_action_free(action) g_free (action)
|
||||
|
||||
/*** debugging categories *****************************************************/
|
||||
|
||||
|
|
404
gst/gstaction.c
Normal file
404
gst/gstaction.c
Normal file
|
@ -0,0 +1,404 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
|
||||
*
|
||||
* gstaction.c: base class for main actions/loops
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "gst_private.h"
|
||||
|
||||
#include "gstaction.h"
|
||||
#include "gstelement.h"
|
||||
#include "gstpad.h"
|
||||
#include "gstinfo.h"
|
||||
#include "gstscheduler.h"
|
||||
|
||||
/*
|
||||
GST_DEBUG_CATEGORY_STATIC (debug, "GST_ACTION",
|
||||
GST_DEBUG_BOLD | GST_DEBUG_FG_RED, "action handling");
|
||||
#define GST_CAT_DEFAULT debug
|
||||
*/
|
||||
#if 1
|
||||
# define RELEASE(action)
|
||||
#else
|
||||
# define RELEASE(action) G_STMT_START{\
|
||||
gchar *_str; \
|
||||
\
|
||||
g_assert (action->any.active); \
|
||||
_str = gst_action_to_string (action); \
|
||||
g_print ("releasing %s\n", _str); \
|
||||
g_free (_str); \
|
||||
}G_STMT_END
|
||||
#endif
|
||||
GType
|
||||
gst_action_get_type (void)
|
||||
{
|
||||
g_assert_not_reached ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define GST_ACTION_SCHEDULER_CALL(action, call) G_STMT_START{ \
|
||||
GstScheduler *sched = action->any.element->sched; \
|
||||
if (sched) { \
|
||||
GstSchedulerClass *klass = GST_SCHEDULER_GET_CLASS (sched); \
|
||||
g_assert (klass->call); \
|
||||
klass->call (sched, action); \
|
||||
} \
|
||||
}G_STMT_END
|
||||
|
||||
GstAction *
|
||||
gst_action_new (GstActionType type)
|
||||
{
|
||||
GstAction *action = g_new0 (GstAction, 1);
|
||||
|
||||
action->type = type;
|
||||
action->any.active = FALSE;
|
||||
action->any.coupled = TRUE;
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
void
|
||||
gst_element_add_action (GstElement * element, GstAction * action)
|
||||
{
|
||||
g_return_if_fail (action->any.element == NULL);
|
||||
|
||||
action->any.element = element;
|
||||
element->actions = g_slist_prepend (element->actions, action);
|
||||
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
/* FIXME: make this work with %P */
|
||||
G_STMT_START {
|
||||
gchar *str = gst_action_to_string (action);
|
||||
|
||||
GST_DEBUG_OBJECT (element, "adding action: %s", str);
|
||||
g_free (str);
|
||||
} G_STMT_END;
|
||||
#endif
|
||||
|
||||
GST_ACTION_SCHEDULER_CALL (action, add_action);
|
||||
}
|
||||
|
||||
void
|
||||
gst_element_remove_action (GstAction * action)
|
||||
{
|
||||
GstElement *element;
|
||||
|
||||
g_return_if_fail (action->any.element != NULL);
|
||||
|
||||
element = gst_action_get_element (action);
|
||||
GST_ACTION_SCHEDULER_CALL (action, remove_action);
|
||||
g_assert (g_slist_find (element->actions, action));
|
||||
element->actions = g_slist_remove (element->actions, action);
|
||||
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
/* FIXME: make this work with %P */
|
||||
G_STMT_START {
|
||||
gchar *str = gst_action_to_string (action);
|
||||
|
||||
GST_DEBUG ("removing action: %s", str);
|
||||
g_free (str);
|
||||
} G_STMT_END;
|
||||
#endif
|
||||
|
||||
action->any.element = NULL;
|
||||
/* FIXME: pads manage their actions themselves - which kinda sucks */
|
||||
if (action->type != GST_ACTION_SRC_PAD && action->type != GST_ACTION_SINK_PAD)
|
||||
gst_action_free (action);
|
||||
}
|
||||
|
||||
GstElement *
|
||||
gst_action_get_element (const GstAction * action)
|
||||
{
|
||||
g_return_val_if_fail (GST_IS_ACTION (action), NULL);
|
||||
|
||||
return action->any.element;
|
||||
}
|
||||
|
||||
void
|
||||
gst_action_set_active (GstAction * action, gboolean active)
|
||||
{
|
||||
g_return_if_fail (GST_IS_ACTION (action));
|
||||
|
||||
if (action->any.active == active)
|
||||
return;
|
||||
action->any.active = active;
|
||||
GST_ACTION_SCHEDULER_CALL (action, toggle_active);
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_action_is_active (GstAction * action)
|
||||
{
|
||||
g_return_val_if_fail (GST_IS_ACTION (action), FALSE);
|
||||
|
||||
return action->any.active;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_action_set_initially_active:
|
||||
* @action: ithe action to set
|
||||
* @active: whether or not the action should be initially active
|
||||
*
|
||||
* Initially active actions are activated by default when elements reset their
|
||||
* actions. This happens during the state change from READY to PAUSED for
|
||||
* example. This function allows modifying that behaviour for an action.
|
||||
**/
|
||||
void
|
||||
gst_action_set_initially_active (GstAction * action, gboolean active)
|
||||
{
|
||||
g_return_if_fail (GST_IS_ACTION (action));
|
||||
|
||||
action->any.initially_active = active;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_action_is_initially_active:
|
||||
* @action: #GstAction to check
|
||||
*
|
||||
* Retruns if the @action is initially active or not.
|
||||
*
|
||||
* Returns: TRUE if the @action is initially active, FALSE otherwise
|
||||
**/
|
||||
gboolean
|
||||
gst_action_is_initially_active (GstAction * action)
|
||||
{
|
||||
g_return_val_if_fail (GST_IS_ACTION (action), FALSE);
|
||||
|
||||
return action->any.initially_active;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_action_set_coupled:
|
||||
* @action: action to set
|
||||
* @coupled: new value
|
||||
*
|
||||
* Makes an action coupled or not. A coupled action's activity depends on the
|
||||
* state of the element it belongs to. It gets deactivated automatically when
|
||||
* the element changes state to READY or below and it gets reset to its initial
|
||||
* state by gst_element_reset_actions (). Activity of coupled actions must be
|
||||
* set manually by the element at all times.
|
||||
**/
|
||||
void
|
||||
gst_action_set_coupled (GstAction * action, gboolean coupled)
|
||||
{
|
||||
g_return_if_fail (GST_IS_ACTION (action));
|
||||
|
||||
if (action->any.coupled == coupled)
|
||||
return;
|
||||
action->any.coupled = coupled;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_action_is_coupled (GstAction * action)
|
||||
{
|
||||
g_return_val_if_fail (GST_IS_ACTION (action), FALSE);
|
||||
|
||||
return action->any.coupled;
|
||||
}
|
||||
|
||||
GstAction *
|
||||
gst_element_add_wakeup (GstElement * element, gboolean active,
|
||||
GstActionWakeupFunc release, gpointer user_data)
|
||||
{
|
||||
GstAction *action;
|
||||
GstActionWakeup *wakeup;
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
||||
g_return_val_if_fail (release != NULL, NULL);
|
||||
|
||||
action = gst_action_new (GST_ACTION_WAKEUP);
|
||||
action->any.initially_active = active;
|
||||
wakeup = &action->wakeup;
|
||||
wakeup->release = release;
|
||||
wakeup->user_data = user_data;
|
||||
gst_element_add_action (element, action);
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
void
|
||||
gst_action_wakeup_release (GstAction * action)
|
||||
{
|
||||
g_return_if_fail (GST_IS_ACTION_TYPE (action, GST_ACTION_WAKEUP));
|
||||
|
||||
RELEASE (action);
|
||||
action->wakeup.release (action, action->any.element,
|
||||
action->wakeup.user_data);
|
||||
}
|
||||
|
||||
GstRealPad *
|
||||
gst_action_get_pad (const GstAction * action)
|
||||
{
|
||||
g_return_val_if_fail (GST_IS_ACTION (action), NULL);
|
||||
g_return_val_if_fail (action->type == GST_ACTION_SINK_PAD
|
||||
|| action->type == GST_ACTION_SRC_PAD, NULL);
|
||||
|
||||
if (action->type == GST_ACTION_SINK_PAD) {
|
||||
g_assert (action->sinkpad.pad != NULL);
|
||||
return action->sinkpad.pad;
|
||||
} else if (action->type == GST_ACTION_SRC_PAD) {
|
||||
g_assert (action->srcpad.pad != NULL);
|
||||
return action->srcpad.pad;
|
||||
} else {
|
||||
g_assert_not_reached ();
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gst_action_release_sink_pad (GstAction * action, GstData * data)
|
||||
{
|
||||
g_return_if_fail (GST_IS_ACTION_TYPE (action, GST_ACTION_SINK_PAD));
|
||||
|
||||
RELEASE (action);
|
||||
action->sinkpad.release (action, action->sinkpad.pad, data);
|
||||
}
|
||||
|
||||
GstData *
|
||||
gst_action_release_src_pad (GstAction * action)
|
||||
{
|
||||
g_return_val_if_fail (GST_IS_ACTION_TYPE (action, GST_ACTION_SRC_PAD), NULL);
|
||||
|
||||
RELEASE (action);
|
||||
return action->srcpad.release (action, action->srcpad.pad);
|
||||
}
|
||||
|
||||
GstAction *
|
||||
gst_real_pad_get_action (GstRealPad * pad)
|
||||
{
|
||||
g_return_val_if_fail (GST_IS_REAL_PAD (pad), NULL);
|
||||
|
||||
g_assert_not_reached ();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GstAction *
|
||||
gst_element_add_wait (GstElement * element, gboolean active,
|
||||
GstClockTime start_time, GstClockTime interval, GstActionWaitFunc release)
|
||||
{
|
||||
GstAction *action;
|
||||
GstActionWait *wait;
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
||||
g_return_val_if_fail (release != NULL, NULL);
|
||||
g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (start_time), NULL);
|
||||
g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (interval), NULL);
|
||||
|
||||
action = gst_action_new (GST_ACTION_WAIT);
|
||||
action->any.initially_active = active;
|
||||
wait = &action->wait;
|
||||
wait->time = start_time;
|
||||
wait->interval = interval;
|
||||
wait->release = release;
|
||||
gst_element_add_action (element, action);
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
void
|
||||
gst_action_wait_change (GstAction * action, GstClockTime start_time,
|
||||
GstClockTime interval)
|
||||
{
|
||||
g_return_if_fail (GST_IS_ACTION_TYPE (action, GST_ACTION_WAIT));
|
||||
|
||||
action->wait.time = start_time;
|
||||
action->wait.interval = interval;
|
||||
GST_ACTION_SCHEDULER_CALL (action, update_values);
|
||||
}
|
||||
|
||||
void
|
||||
gst_action_wait_release (GstAction * action)
|
||||
{
|
||||
GstClockTime time;
|
||||
|
||||
g_return_if_fail (GST_IS_ACTION_TYPE (action, GST_ACTION_WAIT));
|
||||
|
||||
RELEASE (action);
|
||||
time = action->wait.time;
|
||||
action->wait.time += action->wait.interval;
|
||||
action->wait.release (action, action->any.element, time);
|
||||
}
|
||||
|
||||
GstAction *
|
||||
gst_element_add_fd (GstElement * element, gboolean active,
|
||||
gint fd, gushort condition, GstActionFdFunc release)
|
||||
{
|
||||
GstAction *action;
|
||||
GstActionFd *afd;
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
||||
g_return_val_if_fail (release != NULL, NULL);
|
||||
g_return_val_if_fail (condition != 0, NULL);
|
||||
|
||||
action = gst_action_new (GST_ACTION_FD);
|
||||
action->any.initially_active = active;
|
||||
afd = &action->fd;
|
||||
afd->fd = fd;
|
||||
afd->condition = condition;
|
||||
gst_element_add_action (element, action);
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
void
|
||||
gst_action_fd_release (GstAction * action, GIOCondition condition)
|
||||
{
|
||||
g_return_if_fail (GST_IS_ACTION_TYPE (action, GST_ACTION_FD));
|
||||
|
||||
RELEASE (action);
|
||||
action->fd.release (action, action->any.element, action->fd.fd, condition);
|
||||
}
|
||||
|
||||
void
|
||||
gst_action_fd_change (GstAction * action, gint fd, gushort condition)
|
||||
{
|
||||
g_return_if_fail (GST_IS_ACTION_TYPE (action, GST_ACTION_FD));
|
||||
|
||||
action->fd.fd = fd;
|
||||
action->fd.condition = condition;
|
||||
GST_ACTION_SCHEDULER_CALL (action, update_values);
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
gst_action_type_to_string (GstActionType type)
|
||||
{
|
||||
switch (type) {
|
||||
case GST_ACTION_WAKEUP:
|
||||
return "WAKEUP";
|
||||
case GST_ACTION_SINK_PAD:
|
||||
return "SINKPAD";
|
||||
case GST_ACTION_SRC_PAD:
|
||||
return "SRCPAD";
|
||||
case GST_ACTION_FD:
|
||||
return "FD";
|
||||
case GST_ACTION_WAIT:
|
||||
return "TIME";
|
||||
default:
|
||||
g_return_val_if_reached (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
gchar *
|
||||
gst_action_to_string (const GstAction * action)
|
||||
{
|
||||
g_return_val_if_fail (GST_IS_ACTION (action), NULL);
|
||||
|
||||
return g_strdup_printf ("%s for %s",
|
||||
gst_action_type_to_string (action->type),
|
||||
GST_ELEMENT_NAME (gst_action_get_element (action)));
|
||||
}
|
182
gst/gstaction.h
Normal file
182
gst/gstaction.h
Normal file
|
@ -0,0 +1,182 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 2004-2005 Benjamin Otte <otte@gnome.org>
|
||||
*
|
||||
* gstaction.h: base class for main actions/loops
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __GST_ACTION_H__
|
||||
#define __GST_ACTION_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include <gst/gsttypes.h>
|
||||
#include <gst/gstdata.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
||||
#define GST_TYPE_ACTION (gst_action_get_type ())
|
||||
#define GST_IS_ACTION(action) ((action) != NULL && \
|
||||
(action)->type > GST_ACTION_INVALID && \
|
||||
(action)->type < GST_ACTION_TYPE_COUNT)
|
||||
#define GST_IS_ACTION_TYPE(action, _type) ((action) != NULL && \
|
||||
(action)->type == _type)
|
||||
|
||||
typedef enum {
|
||||
GST_ACTION_INVALID = 0,
|
||||
GST_ACTION_WAKEUP,
|
||||
GST_ACTION_SINK_PAD,
|
||||
GST_ACTION_SRC_PAD,
|
||||
GST_ACTION_FD,
|
||||
GST_ACTION_WAIT,
|
||||
/* add more */
|
||||
GST_ACTION_TYPE_COUNT
|
||||
} GstActionType;
|
||||
|
||||
typedef struct _GstActionAny GstActionAny;
|
||||
typedef struct _GstActionWakeup GstActionWakeup;
|
||||
typedef struct _GstActionSinkPad GstActionSinkPad;
|
||||
typedef struct _GstActionSrcPad GstActionSrcPad;
|
||||
typedef struct _GstActionFd GstActionFd;
|
||||
typedef struct _GstActionWait GstActionWait;
|
||||
|
||||
typedef void (* GstActionWakeupFunc) (GstAction * action,
|
||||
GstElement * element,
|
||||
gpointer user_data);
|
||||
typedef GstData * (* GstActionSrcPadFunc) (GstAction * action,
|
||||
GstRealPad * pad);
|
||||
typedef void (* GstActionSinkPadFunc) (GstAction * action,
|
||||
GstRealPad * pad,
|
||||
GstData * data);
|
||||
typedef void (* GstActionFdFunc) (GstAction * action,
|
||||
GstElement * element,
|
||||
gint fd,
|
||||
GIOCondition condition);
|
||||
typedef void (* GstActionWaitFunc) (GstAction * action,
|
||||
GstElement * element,
|
||||
GstClockTime time);
|
||||
|
||||
#define GST_ACTION_HEAD \
|
||||
GstActionType type; \
|
||||
guint active : 1; \
|
||||
guint initially_active : 1; \
|
||||
guint coupled : 1; \
|
||||
guint padding : 13; \
|
||||
GstElement * element;
|
||||
struct _GstActionAny {
|
||||
GST_ACTION_HEAD
|
||||
};
|
||||
|
||||
struct _GstActionWakeup {
|
||||
GST_ACTION_HEAD
|
||||
GstActionWakeupFunc release;
|
||||
gpointer user_data;
|
||||
};
|
||||
|
||||
struct _GstActionSrcPad {
|
||||
GST_ACTION_HEAD
|
||||
GstRealPad * pad;
|
||||
GstActionSrcPadFunc release;
|
||||
};
|
||||
|
||||
struct _GstActionSinkPad {
|
||||
GST_ACTION_HEAD
|
||||
GstRealPad * pad;
|
||||
GstActionSinkPadFunc release;
|
||||
};
|
||||
|
||||
struct _GstActionFd {
|
||||
GST_ACTION_HEAD
|
||||
int fd;
|
||||
gushort condition;
|
||||
GstActionFdFunc release;
|
||||
};
|
||||
|
||||
struct _GstActionWait {
|
||||
GST_ACTION_HEAD
|
||||
GstClockTime time;
|
||||
GstClockTime interval;
|
||||
GstActionWaitFunc release;
|
||||
};
|
||||
|
||||
/* FIXME: padding? */
|
||||
union _GstAction {
|
||||
GstActionType type;
|
||||
GstActionAny any;
|
||||
GstActionWakeup wakeup;
|
||||
GstActionSinkPad sinkpad;
|
||||
GstActionSrcPad srcpad;
|
||||
GstActionFd fd;
|
||||
GstActionWait wait;
|
||||
};
|
||||
|
||||
GType gst_action_get_type (void);
|
||||
|
||||
GstElement * gst_action_get_element (const GstAction * action);
|
||||
void gst_action_set_active (GstAction * action,
|
||||
gboolean active);
|
||||
gboolean gst_action_is_active (GstAction * action);
|
||||
void gst_action_set_initially_active (GstAction * action,
|
||||
gboolean active);
|
||||
gboolean gst_action_is_initially_active (GstAction * action);
|
||||
void gst_action_set_coupled (GstAction * action,
|
||||
gboolean coupled);
|
||||
gboolean gst_action_is_coupled (GstAction * action);
|
||||
void gst_element_add_action (GstElement * element,
|
||||
GstAction * action);
|
||||
void gst_element_remove_action (GstAction * action);
|
||||
|
||||
GstAction * gst_element_add_wakeup (GstElement * element,
|
||||
gboolean active,
|
||||
GstActionWakeupFunc release,
|
||||
gpointer user_data);
|
||||
void gst_action_wakeup_release (GstAction * action);
|
||||
|
||||
GstRealPad * gst_action_get_pad (const GstAction * action);
|
||||
void gst_action_release_sink_pad (GstAction * action,
|
||||
GstData * data);
|
||||
GstData * gst_action_release_src_pad (GstAction * action);
|
||||
GstAction * gst_real_pad_get_action (GstRealPad * pad);
|
||||
|
||||
GstAction * gst_element_add_wait (GstElement * element,
|
||||
gboolean active,
|
||||
GstClockTime start_time,
|
||||
GstClockTime interval,
|
||||
GstActionWaitFunc release);
|
||||
void gst_action_wait_change (GstAction * action,
|
||||
/* FIXME: better name? */ GstClockTime start_time,
|
||||
GstClockTime interval);
|
||||
void gst_action_wait_release (GstAction * action);
|
||||
|
||||
GstAction * gst_element_add_fd (GstElement * element,
|
||||
gboolean active,
|
||||
gint fd,
|
||||
gushort condition,
|
||||
GstActionFdFunc release);
|
||||
void gst_action_fd_release (GstAction * action,
|
||||
GIOCondition condition);
|
||||
void gst_action_fd_change (GstAction * action,
|
||||
gint fd,
|
||||
gushort condition);
|
||||
|
||||
gchar * gst_action_to_string (const GstAction * action);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_ACTION_H__ */
|
123
gst/gstbin.c
123
gst/gstbin.c
|
@ -51,9 +51,6 @@ static GstElementDetails gst_bin_details = GST_ELEMENT_DETAILS ("Generic bin",
|
|||
|
||||
GType _gst_bin_type = 0;
|
||||
|
||||
static gboolean _gst_boolean_did_something_accumulator (GSignalInvocationHint *
|
||||
ihint, GValue * return_accu, const GValue * handler_return, gpointer dummy);
|
||||
|
||||
static void gst_bin_dispose (GObject * object);
|
||||
|
||||
static GstElementStateReturn gst_bin_change_state (GstElement * element);
|
||||
|
@ -73,8 +70,6 @@ GstElementStateReturn gst_bin_set_state (GstElement * element,
|
|||
static GstClock *gst_bin_get_clock_func (GstElement * element);
|
||||
static void gst_bin_set_clock_func (GstElement * element, GstClock * clock);
|
||||
|
||||
static gboolean gst_bin_iterate_func (GstBin * bin);
|
||||
|
||||
#ifndef GST_DISABLE_LOADSAVE
|
||||
static xmlNodePtr gst_bin_save_thyself (GstObject * object, xmlNodePtr parent);
|
||||
static void gst_bin_restore_thyself (GstObject * object, xmlNodePtr self);
|
||||
|
@ -172,11 +167,6 @@ gst_bin_class_init (GstBinClass * klass)
|
|||
g_signal_new ("element-removed", G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GstBinClass, element_removed), NULL,
|
||||
NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_ELEMENT);
|
||||
gst_bin_signals[ITERATE] =
|
||||
g_signal_new ("iterate", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (GstBinClass, iterate),
|
||||
_gst_boolean_did_something_accumulator, NULL, gst_marshal_BOOLEAN__VOID,
|
||||
G_TYPE_BOOLEAN, 0);
|
||||
|
||||
gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_bin_dispose);
|
||||
|
||||
|
@ -196,22 +186,6 @@ gst_bin_class_init (GstBinClass * klass)
|
|||
klass->remove_element = GST_DEBUG_FUNCPTR (gst_bin_remove_func);
|
||||
klass->child_state_change =
|
||||
GST_DEBUG_FUNCPTR (gst_bin_child_state_change_func);
|
||||
klass->iterate = GST_DEBUG_FUNCPTR (gst_bin_iterate_func);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_gst_boolean_did_something_accumulator (GSignalInvocationHint * ihint,
|
||||
GValue * return_accu, const GValue * handler_return, gpointer dummy)
|
||||
{
|
||||
gboolean did_something;
|
||||
|
||||
did_something = g_value_get_boolean (handler_return);
|
||||
if (did_something) {
|
||||
g_value_set_boolean (return_accu, TRUE);
|
||||
}
|
||||
|
||||
/* always continue emission */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -347,8 +321,6 @@ gst_bin_set_element_sched (GstElement * element, GstScheduler * sched)
|
|||
if (GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) {
|
||||
GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, element,
|
||||
"child is already a manager, not resetting sched");
|
||||
if (GST_ELEMENT_SCHED (element))
|
||||
gst_scheduler_add_scheduler (sched, GST_ELEMENT_SCHED (element));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -365,7 +337,6 @@ gst_bin_set_element_sched (GstElement * element, GstScheduler * sched)
|
|||
|
||||
gst_scheduler_add_element (sched, element);
|
||||
|
||||
if (!GST_FLAG_IS_SET (element, GST_ELEMENT_DECOUPLED)) {
|
||||
/* set the sched pointer in all the pads */
|
||||
pads = element->pads;
|
||||
while (pads) {
|
||||
|
@ -392,7 +363,6 @@ gst_bin_set_element_sched (GstElement * element, GstScheduler * sched)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -414,9 +384,6 @@ gst_bin_unset_element_sched (GstElement * element, GstScheduler * sched)
|
|||
if (GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) {
|
||||
GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, element,
|
||||
"child is already a manager, not unsetting sched");
|
||||
if (sched) {
|
||||
gst_scheduler_remove_scheduler (sched, GST_ELEMENT_SCHED (element));
|
||||
}
|
||||
return;
|
||||
}
|
||||
/* for each child, remove them from their schedule */
|
||||
|
@ -428,7 +395,6 @@ gst_bin_unset_element_sched (GstElement * element, GstScheduler * sched)
|
|||
/* otherwise, if it's just a regular old element */
|
||||
GList *pads;
|
||||
|
||||
if (!GST_FLAG_IS_SET (element, GST_ELEMENT_DECOUPLED)) {
|
||||
/* unset the sched pointer in all the pads */
|
||||
pads = element->pads;
|
||||
while (pads) {
|
||||
|
@ -454,7 +420,6 @@ gst_bin_unset_element_sched (GstElement * element, GstScheduler * sched)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gst_scheduler_remove_element (GST_ELEMENT_SCHED (element), element);
|
||||
}
|
||||
|
@ -1265,84 +1230,24 @@ gst_bin_restore_thyself (GstObject * object, xmlNodePtr self)
|
|||
}
|
||||
#endif /* GST_DISABLE_LOADSAVE */
|
||||
|
||||
static GStaticRecMutex iterate_lock = G_STATIC_REC_MUTEX_INIT;
|
||||
|
||||
static gboolean
|
||||
gst_bin_iterate_func (GstBin * bin)
|
||||
{
|
||||
GstScheduler *sched = GST_ELEMENT_SCHED (bin);
|
||||
|
||||
g_static_rec_mutex_unlock (&iterate_lock);
|
||||
|
||||
/* only iterate if this is the manager bin */
|
||||
if (sched && sched->parent == GST_ELEMENT (bin)) {
|
||||
GstSchedulerState state;
|
||||
|
||||
state = gst_scheduler_iterate (sched);
|
||||
|
||||
if (state == GST_SCHEDULER_STATE_RUNNING) {
|
||||
goto done;
|
||||
} else if (state == GST_SCHEDULER_STATE_ERROR) {
|
||||
gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PAUSED);
|
||||
} else if (state == GST_SCHEDULER_STATE_STOPPED) {
|
||||
/* check if we have children scheds that are still running */
|
||||
/* FIXME: remove in 0.9? autouseless because iterations gone? */
|
||||
GList *walk;
|
||||
|
||||
for (walk = sched->schedulers; walk; walk = g_list_next (walk)) {
|
||||
GstScheduler *test = walk->data;
|
||||
|
||||
g_return_val_if_fail (test->parent, FALSE);
|
||||
if (GST_STATE (test->parent) == GST_STATE_PLAYING) {
|
||||
GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, bin,
|
||||
"current bin is not iterating, but children are, "
|
||||
"so returning TRUE anyway...");
|
||||
g_usleep (1);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
g_warning ("bin \"%s\" is not the managing bin, can't be iterated on!\n",
|
||||
GST_ELEMENT_NAME (bin));
|
||||
}
|
||||
|
||||
g_static_rec_mutex_lock (&iterate_lock);
|
||||
|
||||
return FALSE;
|
||||
|
||||
done:
|
||||
g_static_rec_mutex_lock (&iterate_lock);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_bin_iterate:
|
||||
* @bin: a#GstBin to iterate.
|
||||
*
|
||||
* Iterates over the elements in this bin.
|
||||
*
|
||||
* Returns: TRUE if the bin did something useful. This value
|
||||
* can be used to determine it the bin is in EOS.
|
||||
*/
|
||||
gboolean
|
||||
gst_bin_iterate (GstBin * bin)
|
||||
{
|
||||
gboolean running;
|
||||
gulong eos, error;
|
||||
GMainLoop *loop;
|
||||
|
||||
g_return_val_if_fail (bin != NULL, FALSE);
|
||||
g_return_val_if_fail (GST_IS_BIN (bin), FALSE);
|
||||
|
||||
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, bin, "starting iteration");
|
||||
gst_object_ref (GST_OBJECT (bin));
|
||||
|
||||
g_static_rec_mutex_lock (&iterate_lock);
|
||||
running = FALSE;
|
||||
g_signal_emit (G_OBJECT (bin), gst_bin_signals[ITERATE], 0, &running);
|
||||
g_static_rec_mutex_unlock (&iterate_lock);
|
||||
|
||||
gst_object_unref (GST_OBJECT (bin));
|
||||
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, bin, "finished iteration");
|
||||
|
||||
return running;
|
||||
loop = g_main_loop_new (NULL, FALSE);
|
||||
eos =
|
||||
g_signal_connect_swapped (bin, "error", G_CALLBACK (g_main_loop_quit),
|
||||
loop);
|
||||
error =
|
||||
g_signal_connect_swapped (bin, "eos", G_CALLBACK (g_main_loop_quit),
|
||||
loop);
|
||||
g_main_loop_run (loop);
|
||||
g_main_loop_unref (loop);
|
||||
g_signal_handler_disconnect (bin, eos);
|
||||
g_signal_handler_disconnect (bin, error);
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -41,7 +41,6 @@ GST_EXPORT GType _gst_bin_type;
|
|||
* GstBinFlags:
|
||||
* @GST_BIN_FLAG_MANAGER: this bin is a manager of child elements, i.e.
|
||||
* a pipeline or thread.
|
||||
* @GST_BIN_SELF_SCHEDULABLE: the bin iterates itself.
|
||||
* @GST_BIN_FLAG_PREFER_COTHREADS: we prefer to have cothreads when its
|
||||
* an option, over chain-based.
|
||||
* @GST_BIN_FLAG_FIXED_CLOCK: bin has one clock that cannot be changed.
|
||||
|
@ -59,7 +58,6 @@ GST_EXPORT GType _gst_bin_type;
|
|||
*/
|
||||
typedef enum {
|
||||
GST_BIN_FLAG_MANAGER = GST_ELEMENT_FLAG_LAST,
|
||||
GST_BIN_SELF_SCHEDULABLE,
|
||||
GST_BIN_FLAG_PREFER_COTHREADS,
|
||||
GST_BIN_FLAG_FIXED_CLOCK,
|
||||
GST_BIN_STATE_LOCKED,
|
||||
|
@ -90,9 +88,6 @@ struct _GstBinClass {
|
|||
void (*child_state_change) (GstBin *bin, GstElementState oldstate,
|
||||
GstElementState newstate, GstElement *element);
|
||||
|
||||
/* run a full iteration of operation */
|
||||
gboolean (*iterate) (GstBin *bin);
|
||||
|
||||
/* signals */
|
||||
void (*element_added) (GstBin *bin, GstElement *child);
|
||||
void (*element_removed) (GstBin *bin, GstElement *child);
|
||||
|
@ -117,8 +112,6 @@ G_CONST_RETURN GList*
|
|||
GstElement* gst_bin_get_by_interface (GstBin *bin, GType interface);
|
||||
GList * gst_bin_get_all_by_interface (GstBin *bin, GType interface);
|
||||
|
||||
gboolean gst_bin_iterate (GstBin *bin);
|
||||
|
||||
void gst_bin_use_clock (GstBin *bin, GstClock *clock);
|
||||
GstClock* gst_bin_get_clock (GstBin *bin);
|
||||
void gst_bin_auto_clock (GstBin *bin);
|
||||
|
|
|
@ -362,9 +362,6 @@ gst_clock_class_init (GstClockClass * klass)
|
|||
|
||||
parent_class = g_type_class_ref (GST_TYPE_OBJECT);
|
||||
|
||||
if (!g_thread_supported ())
|
||||
g_thread_init (NULL);
|
||||
|
||||
#ifndef GST_DISABLE_TRACE
|
||||
_gst_clock_entry_trace =
|
||||
gst_alloc_trace_register (GST_CLOCK_ENTRY_TRACE_NAME);
|
||||
|
|
|
@ -35,8 +35,6 @@ G_BEGIN_DECLS
|
|||
#define GST_IS_CLOCK_CLASS(cclass) (G_TYPE_CHECK_CLASS_TYPE ((cclass), GST_TYPE_CLOCK))
|
||||
#define GST_CLOCK_GET_CLASS(clock) (G_TYPE_INSTANCE_GET_CLASS ((clock), GST_TYPE_CLOCK, GstClockClass))
|
||||
|
||||
typedef guint64 GstClockTime;
|
||||
typedef gint64 GstClockTimeDiff;
|
||||
typedef gpointer GstClockID;
|
||||
|
||||
#define GST_CLOCK_TIME_NONE ((GstClockTime)-1)
|
||||
|
|
|
@ -27,60 +27,13 @@
|
|||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#ifndef GST_DISABLE_DEPRECATED
|
||||
/* 0.5.2 changes; remove these ASAP */
|
||||
//#ifndef GST_DISABLE_DEPRECATED
|
||||
|
||||
/* element functions */
|
||||
#define gst_element_connect(a,b) gst_element_link(a,b)
|
||||
#define gst_element_connect_pads(a,b,c,d) \
|
||||
gst_element_link_pads(a,b,c,d)
|
||||
#ifdef G_HAVE_ISO_VARARGS
|
||||
#define gst_element_connect_many(a,...) gst_element_link_many(a,__VA_ARGS__)
|
||||
#elif defined(G_HAVE_GNUC_VARARGS)
|
||||
#define gst_element_connect_many(a,args...) \
|
||||
gst_element_link_many(a, ## args)
|
||||
#else
|
||||
/* FIXME: need an inline function */
|
||||
#endif
|
||||
#define gst_element_connect_filtered(a,b,c) \
|
||||
gst_element_link_filtered(a,b,c)
|
||||
#define gst_element_disconnect(a,b) gst_element_unlink(a,b)
|
||||
|
||||
/* pad functions */
|
||||
#define gst_pad_connect(a,b) gst_pad_link(a,b)
|
||||
#define gst_pad_connect_filtered(a,b,c) gst_pad_link_filtered(a,b,c)
|
||||
#define gst_pad_disconnect(a,b) gst_pad_unlink(a,b)
|
||||
#define gst_pad_proxy_connect(a,b) gst_pad_proxy_link(a,b)
|
||||
#define gst_pad_set_connect_function(a,b) \
|
||||
gst_pad_set_link_function(a,b)
|
||||
gboolean gst_bin_iterate (GstBin *bin);
|
||||
|
||||
/* pad macros */
|
||||
#define GST_PAD_IS_CONNECTED(a) GST_PAD_IS_LINKED(a)
|
||||
|
||||
/* pad enums */
|
||||
#define GST_PAD_CONNECT_REFUSED GST_PAD_LINK_REFUSED
|
||||
#define GST_PAD_CONNECT_DELAYED GST_PAD_LINK_DELAYED
|
||||
#define GST_PAD_CONNECT_OK GST_PAD_LINK_OK
|
||||
#define GST_PAD_CONNECT_DONE GST_PAD_LINK_DONE
|
||||
typedef GstPadLinkReturn GstPadConnectReturn;
|
||||
|
||||
/* pad function types */
|
||||
typedef GstPadLinkFunction GstPadConnectFunction;
|
||||
|
||||
/* probably not used */
|
||||
/*
|
||||
* GST_RPAD_LINKFUNC
|
||||
*/
|
||||
|
||||
/* 0.8.1.1 removal; remove completely in 0.9 */
|
||||
/* information messages */
|
||||
# ifdef G_HAVE_ISO_VARARGS
|
||||
#define gst_info(...) GST_INFO(__VA_ARGS__)
|
||||
# elif defined(G_HAVE_GNUC_VARARGS)
|
||||
#define gst_info(format,args...) GST_INFO(format,##args)
|
||||
# endif
|
||||
|
||||
#endif /* not GST_DISABLE_DEPRECATED */
|
||||
//#endif /* not GST_DISABLE_DEPRECATED */
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
299
gst/gstelement.c
299
gst/gstelement.c
|
@ -26,6 +26,7 @@
|
|||
#include <gobject/gvaluecollector.h>
|
||||
|
||||
#include "gstelement.h"
|
||||
#include "gstaction.h"
|
||||
#include "gstbin.h"
|
||||
#include "gstmarshal.h"
|
||||
#include "gsterror.h"
|
||||
|
@ -263,7 +264,6 @@ gst_element_init (GstElement * element)
|
|||
element->numsrcpads = 0;
|
||||
element->numsinkpads = 0;
|
||||
element->pads = NULL;
|
||||
element->loopfunc = NULL;
|
||||
element->sched = NULL;
|
||||
element->clock = NULL;
|
||||
element->sched_private = NULL;
|
||||
|
@ -834,37 +834,6 @@ gst_element_get_clock (GstElement * element)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_clock_wait:
|
||||
* @element: a #GstElement.
|
||||
* @id: the #GstClock to use.
|
||||
* @jitter: the difference between requested time and actual time.
|
||||
*
|
||||
* Waits for a specific time on the clock.
|
||||
*
|
||||
* Returns: the #GstClockReturn result of the wait operation.
|
||||
*/
|
||||
GstClockReturn
|
||||
gst_element_clock_wait (GstElement * element, GstClockID id,
|
||||
GstClockTimeDiff * jitter)
|
||||
{
|
||||
GstClockReturn res;
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), GST_CLOCK_ERROR);
|
||||
|
||||
if (GST_ELEMENT_SCHED (element)) {
|
||||
GST_CAT_DEBUG (GST_CAT_CLOCK, "waiting on scheduler clock with id %d");
|
||||
res =
|
||||
gst_scheduler_clock_wait (GST_ELEMENT_SCHED (element), element, id,
|
||||
jitter);
|
||||
} else {
|
||||
GST_CAT_DEBUG (GST_CAT_CLOCK, "no scheduler, returning GST_CLOCK_TIMEOUT");
|
||||
res = GST_CLOCK_TIMEOUT;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
#undef GST_CAT_DEFAULT
|
||||
#define GST_CAT_DEFAULT GST_CAT_CLOCK
|
||||
/**
|
||||
|
@ -907,51 +876,6 @@ gst_element_get_time (GstElement * element)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_wait:
|
||||
* @element: element that should wait
|
||||
* @timestamp: what timestamp to wait on
|
||||
*
|
||||
* Waits until the given relative time stamp for the element has arrived.
|
||||
* When this function returns successfully, the relative time point specified
|
||||
* in the timestamp has passed for this element.
|
||||
* <note>This function can only be called on elements in
|
||||
* #GST_STATE_PLAYING</note>
|
||||
*
|
||||
* Returns: TRUE on success.
|
||||
*/
|
||||
gboolean
|
||||
gst_element_wait (GstElement * element, GstClockTime timestamp)
|
||||
{
|
||||
GstClockID id;
|
||||
GstClockReturn ret;
|
||||
GstClockTime time;
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
|
||||
g_return_val_if_fail (GST_IS_CLOCK (element->clock), FALSE);
|
||||
g_return_val_if_fail (element->current_state == GST_STATE_PLAYING, FALSE);
|
||||
g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
|
||||
|
||||
/* shortcut when we're already late... */
|
||||
time = gst_element_get_time (element);
|
||||
GST_CAT_LOG_OBJECT (GST_CAT_CLOCK, element, "element time %" GST_TIME_FORMAT,
|
||||
GST_TIME_ARGS (time));
|
||||
if (time >= timestamp) {
|
||||
GST_CAT_INFO_OBJECT (GST_CAT_CLOCK, element,
|
||||
"called gst_element_wait (%" GST_TIME_FORMAT ") and was late (%"
|
||||
GST_TIME_FORMAT, GST_TIME_ARGS (timestamp),
|
||||
GST_TIME_ARGS (gst_element_get_time (element)));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
id = gst_clock_new_single_shot_id (element->clock,
|
||||
element->base_time + timestamp);
|
||||
ret = gst_element_clock_wait (element, id, NULL);
|
||||
gst_clock_id_free (id);
|
||||
|
||||
return ret == GST_CLOCK_STOPPED;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_set_time:
|
||||
* @element: element to set time on
|
||||
|
@ -1171,6 +1095,16 @@ gst_element_add_pad (GstElement * element, GstPad * pad)
|
|||
g_return_if_fail (gst_object_check_uniqueness (element->pads,
|
||||
GST_PAD_NAME (pad)) == TRUE);
|
||||
|
||||
if (GST_IS_REAL_PAD (pad)) {
|
||||
/* append the pad's action to the element */
|
||||
if (GST_ELEMENT_IS_PUSHING (element) && GST_PAD_IS_SRC (pad)) {
|
||||
g_return_if_fail (GST_REAL_PAD (pad)->action == NULL);
|
||||
} else {
|
||||
g_return_if_fail (GST_REAL_PAD (pad)->action != NULL);
|
||||
gst_element_add_action (element, GST_REAL_PAD (pad)->action);
|
||||
}
|
||||
}
|
||||
|
||||
GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element, "adding pad '%s'",
|
||||
GST_STR_NULL (GST_OBJECT_NAME (pad)));
|
||||
|
||||
|
@ -1193,10 +1127,6 @@ gst_element_add_pad (GstElement * element, GstPad * pad)
|
|||
break;
|
||||
}
|
||||
|
||||
/* activate element when we are playing */
|
||||
if (GST_STATE (element) == GST_STATE_PLAYING)
|
||||
gst_pad_set_active (pad, TRUE);
|
||||
|
||||
/* emit the NEW_PAD signal */
|
||||
g_signal_emit (G_OBJECT (element), gst_element_signals[NEW_PAD], 0, pad);
|
||||
}
|
||||
|
@ -1257,6 +1187,9 @@ gst_element_remove_pad (GstElement * element, GstPad * pad)
|
|||
gst_pad_unlink (pad, GST_PAD (GST_RPAD_PEER (pad)));
|
||||
}
|
||||
gst_caps_replace (&GST_RPAD_EXPLICIT_CAPS (pad), NULL);
|
||||
|
||||
if (GST_REAL_PAD (pad)->action)
|
||||
gst_element_remove_action (GST_REAL_PAD (pad)->action);
|
||||
} else if (GST_IS_GHOST_PAD (pad)) {
|
||||
g_object_set (pad, "real-pad", NULL, NULL);
|
||||
}
|
||||
|
@ -2297,37 +2230,6 @@ gst_element_get_random_pad (GstElement * element, GstPadDirection dir)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_get_event_masks:
|
||||
* @element: a #GstElement to query
|
||||
*
|
||||
* Get an array of event masks from the element.
|
||||
* If the element doesn't implement an event masks function,
|
||||
* the query will be forwarded to a random linked sink pad.
|
||||
*
|
||||
* Returns: An array of #GstEventMask elements.
|
||||
*/
|
||||
const GstEventMask *
|
||||
gst_element_get_event_masks (GstElement * element)
|
||||
{
|
||||
GstElementClass *oclass;
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
||||
|
||||
oclass = GST_ELEMENT_GET_CLASS (element);
|
||||
|
||||
if (oclass->get_event_masks)
|
||||
return oclass->get_event_masks (element);
|
||||
else {
|
||||
GstPad *pad = gst_element_get_random_pad (element, GST_PAD_SINK);
|
||||
|
||||
if (pad)
|
||||
return gst_pad_get_event_masks (GST_PAD_PEER (pad));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_send_event:
|
||||
* @element: a #GstElement to send the event to.
|
||||
|
@ -2383,37 +2285,6 @@ gst_element_seek (GstElement * element, GstSeekType seek_type, guint64 offset)
|
|||
return gst_element_send_event (element, event);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_get_query_types:
|
||||
* @element: a #GstElement to query
|
||||
*
|
||||
* Get an array of query types from the element.
|
||||
* If the element doesn't implement a query types function,
|
||||
* the query will be forwarded to a random sink pad.
|
||||
*
|
||||
* Returns: An array of #GstQueryType elements.
|
||||
*/
|
||||
const GstQueryType *
|
||||
gst_element_get_query_types (GstElement * element)
|
||||
{
|
||||
GstElementClass *oclass;
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
||||
|
||||
oclass = GST_ELEMENT_GET_CLASS (element);
|
||||
|
||||
if (oclass->get_query_types)
|
||||
return oclass->get_query_types (element);
|
||||
else {
|
||||
GstPad *pad = gst_element_get_random_pad (element, GST_PAD_SINK);
|
||||
|
||||
if (pad)
|
||||
return gst_pad_get_query_types (GST_PAD_PEER (pad));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_query:
|
||||
* @element: a #GstElement to perform the query on.
|
||||
|
@ -2456,37 +2327,6 @@ gst_element_query (GstElement * element, GstQueryType type,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_get_formats:
|
||||
* @element: a #GstElement to query
|
||||
*
|
||||
* Get an array of formats from the element.
|
||||
* If the element doesn't implement a formats function,
|
||||
* the query will be forwarded to a random sink pad.
|
||||
*
|
||||
* Returns: An array of #GstFormat elements.
|
||||
*/
|
||||
const GstFormat *
|
||||
gst_element_get_formats (GstElement * element)
|
||||
{
|
||||
GstElementClass *oclass;
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
|
||||
|
||||
oclass = GST_ELEMENT_GET_CLASS (element);
|
||||
|
||||
if (oclass->get_formats)
|
||||
return oclass->get_formats (element);
|
||||
else {
|
||||
GstPad *pad = gst_element_get_random_pad (element, GST_PAD_SINK);
|
||||
|
||||
if (pad)
|
||||
return gst_pad_get_formats (GST_PAD_PEER (pad));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_convert:
|
||||
* @element: a #GstElement to invoke the converter on.
|
||||
|
@ -2934,20 +2774,18 @@ gst_element_clear_pad_caps (GstElement * element)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_element_pads_activate (GstElement * element, gboolean active)
|
||||
void
|
||||
gst_element_reset_actions (GstElement * element)
|
||||
{
|
||||
GList *pads = element->pads;
|
||||
GSList *walk;
|
||||
GstAction *action;
|
||||
|
||||
while (pads) {
|
||||
GstPad *pad = GST_PAD (pads->data);
|
||||
|
||||
pads = g_list_next (pads);
|
||||
|
||||
if (!GST_IS_REAL_PAD (pad))
|
||||
continue;
|
||||
|
||||
gst_pad_set_active (pad, active);
|
||||
for (walk = element->actions; walk; walk = g_slist_next (walk)) {
|
||||
action = walk->data;
|
||||
if (gst_action_is_coupled (action)) {
|
||||
//g_print ("resetting %s to %s\n", gst_action_to_string (action), action->any.initially_active ? "TRUE" : "FALSE");
|
||||
gst_action_set_active (action, action->any.initially_active);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2957,6 +2795,7 @@ gst_element_change_state (GstElement * element)
|
|||
GstElementState old_state, old_pending;
|
||||
GstObject *parent;
|
||||
gint old_transition;
|
||||
GSList *walk;
|
||||
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_FAILURE);
|
||||
|
||||
|
@ -2995,10 +2834,8 @@ gst_element_change_state (GstElement * element)
|
|||
GST_CAT_LOG_OBJECT (GST_CAT_CLOCK, element, "setting base time to %"
|
||||
G_GINT64_FORMAT, element->base_time);
|
||||
}
|
||||
gst_element_pads_activate (element, FALSE);
|
||||
break;
|
||||
case GST_STATE_PAUSED_TO_PLAYING:
|
||||
gst_element_pads_activate (element, TRUE);
|
||||
if (element->clock) {
|
||||
GstClockTime time = gst_clock_get_event_time (element->clock);
|
||||
|
||||
|
@ -3015,12 +2852,19 @@ gst_element_change_state (GstElement * element)
|
|||
"failed state change, could not negotiate pads");
|
||||
goto failure;
|
||||
}
|
||||
gst_element_reset_actions (element);
|
||||
break;
|
||||
/* going to the READY state clears all pad caps */
|
||||
/* FIXME: Why doesn't this happen on READY => NULL? -- Company */
|
||||
case GST_STATE_PAUSED_TO_READY:
|
||||
element->base_time = 0;
|
||||
gst_element_clear_pad_caps (element);
|
||||
for (walk = element->actions; walk; walk = g_slist_next (walk)) {
|
||||
GstAction *action = walk->data;
|
||||
|
||||
if (gst_action_is_coupled (action))
|
||||
gst_action_set_active (action, FALSE);
|
||||
}
|
||||
break;
|
||||
case GST_STATE_NULL_TO_READY:
|
||||
case GST_STATE_READY_TO_NULL:
|
||||
|
@ -3269,40 +3113,6 @@ gst_element_restore_thyself (GstObject * object, xmlNodePtr self)
|
|||
}
|
||||
#endif /* GST_DISABLE_LOADSAVE */
|
||||
|
||||
/**
|
||||
* gst_element_yield:
|
||||
* @element: a #GstElement to yield.
|
||||
*
|
||||
* Requests a yield operation for the element. The scheduler will typically
|
||||
* give control to another element.
|
||||
*/
|
||||
void
|
||||
gst_element_yield (GstElement * element)
|
||||
{
|
||||
if (GST_ELEMENT_SCHED (element)) {
|
||||
gst_scheduler_yield (GST_ELEMENT_SCHED (element), element);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_interrupt:
|
||||
* @element: a #GstElement to interrupt.
|
||||
*
|
||||
* Requests the scheduler of this element to interrupt the execution of
|
||||
* this element and scheduler another one.
|
||||
*
|
||||
* Returns: TRUE if the element should exit its chain/loop/get
|
||||
* function ASAP, depending on the scheduler implementation.
|
||||
*/
|
||||
gboolean
|
||||
gst_element_interrupt (GstElement * element)
|
||||
{
|
||||
if (GST_ELEMENT_SCHED (element)) {
|
||||
return gst_scheduler_interrupt (GST_ELEMENT_SCHED (element), element);
|
||||
} else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_set_scheduler:
|
||||
* @element: a #GstElement to set the scheduler of.
|
||||
|
@ -3339,46 +3149,6 @@ gst_element_get_scheduler (GstElement * element)
|
|||
return GST_ELEMENT_SCHED (element);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_element_set_loop_function:
|
||||
* @element: a #GstElement to set the loop function of.
|
||||
* @loop: Pointer to #GstElementLoopFunction.
|
||||
*
|
||||
* This sets the loop function for the element. The function pointed to
|
||||
* can deviate from the GstElementLoopFunction definition in type of
|
||||
* pointer only.
|
||||
*
|
||||
* NOTE: in order for this to take effect, the current loop function *must*
|
||||
* exit. Assuming the loop function itself is the only one who will cause
|
||||
* a new loopfunc to be assigned, this should be no problem.
|
||||
*/
|
||||
void
|
||||
gst_element_set_loop_function (GstElement * element,
|
||||
GstElementLoopFunction loop)
|
||||
{
|
||||
gboolean need_notify = FALSE;
|
||||
|
||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||
|
||||
/* if the element changed from loop based to chain/get based
|
||||
* or vice versa, we need to inform the scheduler about that */
|
||||
if ((element->loopfunc == NULL && loop != NULL) ||
|
||||
(element->loopfunc != NULL && loop == NULL)) {
|
||||
need_notify = TRUE;
|
||||
}
|
||||
|
||||
/* set the loop function */
|
||||
element->loopfunc = loop;
|
||||
|
||||
if (need_notify) {
|
||||
/* set the NEW_LOOPFUNC flag so everyone knows to go try again */
|
||||
GST_FLAG_SET (element, GST_ELEMENT_NEW_LOOPFUNC);
|
||||
|
||||
if (GST_ELEMENT_SCHED (element)) {
|
||||
gst_scheduler_scheduling_change (GST_ELEMENT_SCHED (element), element);
|
||||
}
|
||||
}
|
||||
}
|
||||
static inline void
|
||||
gst_element_emit_found_tag (GstElement * element, GstElement * source,
|
||||
const GstTagList * tag_list)
|
||||
|
@ -3387,6 +3157,7 @@ gst_element_emit_found_tag (GstElement * element, GstElement * source,
|
|||
g_signal_emit (element, gst_element_signals[FOUND_TAG], 0, source, tag_list);
|
||||
gst_object_unref (GST_OBJECT (element));
|
||||
}
|
||||
|
||||
static void
|
||||
gst_element_found_tag_func (GstElement * element, GstElement * source,
|
||||
const GstTagList * tag_list)
|
||||
|
@ -3448,11 +3219,7 @@ gst_element_found_tags_for_pad (GstElement * element, GstPad * pad,
|
|||
GST_EVENT_SRC (tag_event) = gst_object_ref (GST_OBJECT (element));
|
||||
GST_EVENT_TIMESTAMP (tag_event) = timestamp;
|
||||
gst_element_found_tags (element, gst_event_tag_get_list (tag_event));
|
||||
if (GST_PAD_IS_USABLE (pad)) {
|
||||
gst_pad_push (pad, GST_DATA (tag_event));
|
||||
} else {
|
||||
gst_data_unref (GST_DATA (tag_event));
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
|
@ -79,38 +79,9 @@ GST_EXPORT GType _gst_element_type;
|
|||
#define GST_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_ELEMENT, GstElement))
|
||||
#define GST_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT, GstElementClass))
|
||||
|
||||
/* convenience functions */
|
||||
#ifndef GST_DISABLE_DEPRECATED
|
||||
#ifdef G_HAVE_ISO_VARARGS
|
||||
#define GST_ELEMENT_QUERY_TYPE_FUNCTION(functionname, ...) \
|
||||
GST_QUERY_TYPE_FUNCTION (GstElement*, functionname, __VA_ARGS__);
|
||||
#define GST_ELEMENT_FORMATS_FUNCTION(functionname, ...) \
|
||||
GST_FORMATS_FUNCTION (GstElement*, functionname, __VA_ARGS__);
|
||||
#define GST_ELEMENT_EVENT_MASK_FUNCTION(functionname, ...) \
|
||||
GST_EVENT_MASK_FUNCTION (GstElement*, functionname, __VA_ARGS__);
|
||||
#elif defined(G_HAVE_GNUC_VARARGS)
|
||||
#define GST_ELEMENT_QUERY_TYPE_FUNCTION(functionname, a...) \
|
||||
GST_QUERY_TYPE_FUNCTION (GstElement*, functionname, a);
|
||||
#define GST_ELEMENT_FORMATS_FUNCTION(functionname, a...) \
|
||||
GST_FORMATS_FUNCTION (GstElement*, functionname, a);
|
||||
#define GST_ELEMENT_EVENT_MASK_FUNCTION(functionname, a...) \
|
||||
GST_EVENT_MASK_FUNCTION (GstElement*, functionname, a);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
/* element is complex (for some def.) and generally require a cothread */
|
||||
GST_ELEMENT_COMPLEX = GST_OBJECT_FLAG_LAST,
|
||||
/* input and output pads aren't directly coupled to each other
|
||||
examples: queues, multi-output async readers, etc. */
|
||||
GST_ELEMENT_DECOUPLED,
|
||||
/* this element should be placed in a thread if at all possible */
|
||||
GST_ELEMENT_THREAD_SUGGESTED,
|
||||
/* this element, for some reason, has a loop function that performs
|
||||
* an infinite loop without calls to gst_element_yield () */
|
||||
GST_ELEMENT_INFINITE_LOOP,
|
||||
/* there is a new loopfunction ready for placement */
|
||||
GST_ELEMENT_NEW_LOOPFUNC,
|
||||
/* element pushes new data, srcpads aren't scheduled */
|
||||
GST_ELEMENT_PUSHING = GST_OBJECT_FLAG_LAST,
|
||||
/* if this element can handle events */
|
||||
GST_ELEMENT_EVENT_AWARE,
|
||||
/* use threadsafe property get/set implementation */
|
||||
|
@ -133,9 +104,8 @@ typedef enum {
|
|||
GST_ELEMENT_FLAG_LAST = GST_OBJECT_FLAG_LAST + 16
|
||||
} GstElementFlags;
|
||||
|
||||
#define GST_ELEMENT_IS_THREAD_SUGGESTED(obj) (GST_FLAG_IS_SET(obj,GST_ELEMENT_THREAD_SUGGESTED))
|
||||
#define GST_ELEMENT_IS_PUSHING(obj) (GST_FLAG_IS_SET(obj,GST_ELEMENT_PUSHING))
|
||||
#define GST_ELEMENT_IS_EVENT_AWARE(obj) (GST_FLAG_IS_SET(obj,GST_ELEMENT_EVENT_AWARE))
|
||||
#define GST_ELEMENT_IS_DECOUPLED(obj) (GST_FLAG_IS_SET(obj,GST_ELEMENT_DECOUPLED))
|
||||
|
||||
#define GST_ELEMENT_NAME(obj) (GST_OBJECT_NAME(obj))
|
||||
#define GST_ELEMENT_PARENT(obj) (GST_OBJECT_PARENT(obj))
|
||||
|
@ -170,7 +140,6 @@ typedef enum {
|
|||
typedef struct _GstElementFactory GstElementFactory;
|
||||
typedef struct _GstElementFactoryClass GstElementFactoryClass;
|
||||
|
||||
typedef void (*GstElementLoopFunction) (GstElement *element);
|
||||
typedef void (*GstElementPreRunFunction) (GstElement *element);
|
||||
typedef void (*GstElementPostRunFunction) (GstElement *element);
|
||||
|
||||
|
@ -180,10 +149,10 @@ struct _GstElement {
|
|||
/* element state and scheduling */
|
||||
guint8 current_state;
|
||||
guint8 pending_state;
|
||||
GstElementLoopFunction loopfunc;
|
||||
|
||||
GstScheduler *sched;
|
||||
gpointer sched_private;
|
||||
GSList * actions;
|
||||
|
||||
/* allocated clock */
|
||||
GstClock *clock;
|
||||
|
@ -235,7 +204,6 @@ struct _GstElementClass {
|
|||
gboolean (*release_locks) (GstElement *element);
|
||||
|
||||
/* query/convert/events functions */
|
||||
const GstEventMask* (*get_event_masks) (GstElement *element);
|
||||
gboolean (*send_event) (GstElement *element, GstEvent *event);
|
||||
const GstFormat* (*get_formats) (GstElement *element);
|
||||
gboolean (*convert) (GstElement *element,
|
||||
|
@ -279,8 +247,6 @@ void gst_element_class_set_details (GstElementClass *klass,
|
|||
void gst_element_default_error (GObject *object, GstObject *orig, GError *error, gchar *debug);
|
||||
|
||||
GType gst_element_get_type (void);
|
||||
void gst_element_set_loop_function (GstElement *element,
|
||||
GstElementLoopFunction loop);
|
||||
|
||||
#define gst_element_get_name(elem) gst_object_get_name(GST_OBJECT(elem))
|
||||
#define gst_element_set_name(elem,name) gst_object_set_name(GST_OBJECT(elem),name)
|
||||
|
@ -372,17 +338,11 @@ gboolean gst_element_link_pads_filtered (GstElement *src, const gchar *srcpadn
|
|||
void gst_element_unlink_pads (GstElement *src, const gchar *srcpadname,
|
||||
GstElement *dest, const gchar *destpadname);
|
||||
|
||||
G_CONST_RETURN GstEventMask*
|
||||
gst_element_get_event_masks (GstElement *element);
|
||||
gboolean gst_element_send_event (GstElement *element, GstEvent *event);
|
||||
gboolean gst_element_seek (GstElement *element, GstSeekType seek_type,
|
||||
guint64 offset);
|
||||
G_CONST_RETURN GstQueryType*
|
||||
gst_element_get_query_types (GstElement *element);
|
||||
gboolean gst_element_query (GstElement *element, GstQueryType type,
|
||||
GstFormat *format, gint64 *value);
|
||||
G_CONST_RETURN GstFormat*
|
||||
gst_element_get_formats (GstElement *element);
|
||||
gboolean gst_element_convert (GstElement *element,
|
||||
GstFormat src_format, gint64 src_value,
|
||||
GstFormat *dest_format, gint64 *dest_value);
|
||||
|
|
982
gst/gstpad.c
982
gst/gstpad.c
File diff suppressed because it is too large
Load diff
69
gst/gstpad.h
69
gst/gstpad.h
|
@ -27,6 +27,7 @@
|
|||
#include <gst/gstconfig.h>
|
||||
|
||||
#include <gst/gstobject.h>
|
||||
#include <gst/gstaction.h>
|
||||
#include <gst/gstbuffer.h>
|
||||
#include <gst/gstcaps.h>
|
||||
#include <gst/gstevent.h>
|
||||
|
@ -71,14 +72,8 @@ GST_EXPORT GType _gst_ghost_pad_type;
|
|||
#define GST_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GHOST_PAD, GstGhostPadClass))
|
||||
|
||||
|
||||
/*typedef struct _GstPad GstPad; */
|
||||
/*typedef struct _GstPadClass GstPadClass;*/
|
||||
typedef struct _GstRealPad GstRealPad;
|
||||
typedef struct _GstRealPadClass GstRealPadClass;
|
||||
typedef struct _GstGhostPad GstGhostPad;
|
||||
typedef struct _GstGhostPadClass GstGhostPadClass;
|
||||
/*typedef struct _GstPadTemplate GstPadTemplate;*/
|
||||
/*typedef struct _GstPadTemplateClass GstPadTemplateClass;*/
|
||||
typedef struct _GstStaticPadTemplate GstStaticPadTemplate;
|
||||
typedef struct _GstPadLink GstPadLink;
|
||||
|
||||
|
@ -119,7 +114,6 @@ typedef gboolean (*GstPadQueryFunction) (GstPad *pad, GstQueryType type,
|
|||
GstFormat *format, gint64 *value);
|
||||
typedef GList* (*GstPadIntLinkFunction) (GstPad *pad);
|
||||
typedef const GstFormat* (*GstPadFormatsFunction) (GstPad *pad);
|
||||
typedef const GstEventMask* (*GstPadEventMaskFunction) (GstPad *pad);
|
||||
typedef const GstQueryType* (*GstPadQueryTypeFunction) (GstPad *pad);
|
||||
|
||||
typedef GstPadLinkReturn (*GstPadLinkFunction) (GstPad *pad, const GstCaps *caps);
|
||||
|
@ -137,8 +131,7 @@ typedef enum {
|
|||
} GstPadDirection;
|
||||
|
||||
typedef enum {
|
||||
GST_PAD_DISABLED = GST_OBJECT_FLAG_LAST,
|
||||
GST_PAD_NEGOTIATING,
|
||||
GST_PAD_NEGOTIATING = GST_OBJECT_FLAG_LAST,
|
||||
GST_PAD_DISPATCHING,
|
||||
|
||||
GST_PAD_FLAG_LAST = GST_OBJECT_FLAG_LAST + 4
|
||||
|
@ -185,13 +178,8 @@ struct _GstRealPad {
|
|||
gpointer sched_private;
|
||||
|
||||
/* data transport functions */
|
||||
GstPadChainFunction chainfunc;
|
||||
GstPadChainFunction chainhandler;
|
||||
GstPadGetFunction getfunc;
|
||||
GstPadGetFunction gethandler;
|
||||
GstPadEventFunction eventfunc;
|
||||
GstAction * action;
|
||||
GstPadEventFunction eventhandler;
|
||||
GstPadEventMaskFunction eventmaskfunc;
|
||||
|
||||
GList *ghostpads;
|
||||
|
||||
|
@ -250,18 +238,10 @@ struct _GstGhostPadClass {
|
|||
#define GST_RPAD_CAPS(pad) (((GstRealPad *)(pad))->caps)
|
||||
#define GST_RPAD_APPFILTER(pad) (((GstRealPad *)(pad))->appfilter)
|
||||
#define GST_RPAD_PEER(pad) (((GstRealPad *)(pad))->peer)
|
||||
#define GST_RPAD_CHAINFUNC(pad) (((GstRealPad *)(pad))->chainfunc)
|
||||
#define GST_RPAD_CHAINHANDLER(pad) (((GstRealPad *)(pad))->chainhandler)
|
||||
#define GST_RPAD_GETFUNC(pad) (((GstRealPad *)(pad))->getfunc)
|
||||
#define GST_RPAD_GETHANDLER(pad) (((GstRealPad *)(pad))->gethandler)
|
||||
#define GST_RPAD_EVENTFUNC(pad) (((GstRealPad *)(pad))->eventfunc)
|
||||
#define GST_RPAD_EVENTHANDLER(pad) (((GstRealPad *)(pad))->eventhandler)
|
||||
#define GST_RPAD_CONVERTFUNC(pad) (((GstRealPad *)(pad))->convertfunc)
|
||||
#define GST_RPAD_QUERYFUNC(pad) (((GstRealPad *)(pad))->queryfunc)
|
||||
#define GST_RPAD_INTLINKFUNC(pad) (((GstRealPad *)(pad))->intlinkfunc)
|
||||
#define GST_RPAD_FORMATSFUNC(pad) (((GstRealPad *)(pad))->formatsfunc)
|
||||
#define GST_RPAD_QUERYTYPEFUNC(pad) (((GstRealPad *)(pad))->querytypefunc)
|
||||
#define GST_RPAD_EVENTMASKFUNC(pad) (((GstRealPad *)(pad))->eventmaskfunc)
|
||||
|
||||
#define GST_RPAD_LINKFUNC(pad) (((GstRealPad *)(pad))->linkfunc)
|
||||
#define GST_RPAD_UNLINKFUNC(pad) (((GstRealPad *)(pad))->unlinkfunc)
|
||||
|
@ -282,12 +262,8 @@ struct _GstGhostPadClass {
|
|||
|
||||
/* Some check functions (unused?) */
|
||||
#define GST_PAD_IS_LINKED(pad) (GST_PAD_PEER(pad) != NULL)
|
||||
#define GST_PAD_IS_ACTIVE(pad) (!GST_FLAG_IS_SET(GST_PAD_REALIZE(pad), GST_PAD_DISABLED))
|
||||
#define GST_PAD_IS_NEGOTIATING(pad) (GST_FLAG_IS_SET (pad, GST_PAD_NEGOTIATING))
|
||||
#define GST_PAD_IS_DISPATCHING(pad) (GST_FLAG_IS_SET (pad, GST_PAD_DISPATCHING))
|
||||
#define GST_PAD_IS_USABLE(pad) (GST_PAD_IS_LINKED (pad) && \
|
||||
GST_PAD_IS_ACTIVE(pad) && GST_PAD_IS_ACTIVE(GST_PAD_PEER (pad)))
|
||||
#define GST_PAD_CAN_PULL(pad) (GST_IS_REAL_PAD(pad) && GST_REAL_PAD(pad)->gethandler != NULL)
|
||||
#define GST_PAD_IS_SRC(pad) (GST_PAD_DIRECTION(pad) == GST_PAD_SRC)
|
||||
#define GST_PAD_IS_SINK(pad) (GST_PAD_DIRECTION(pad) == GST_PAD_SINK)
|
||||
|
||||
|
@ -368,9 +344,9 @@ G_CONST_RETURN gchar* gst_pad_get_name (GstPad *pad);
|
|||
|
||||
GstPadDirection gst_pad_get_direction (GstPad *pad);
|
||||
|
||||
void gst_pad_set_active (GstPad *pad, gboolean active);
|
||||
void gst_pad_set_active_recursive (GstPad *pad, gboolean active);
|
||||
gboolean gst_pad_is_active (GstPad *pad);
|
||||
void gst_real_pad_set_active (GstRealPad *pad, gboolean active);
|
||||
gboolean gst_real_pad_is_active (GstRealPad *pad);
|
||||
void gst_real_pad_set_initially_active (GstRealPad *pad, gboolean active);
|
||||
|
||||
void gst_pad_set_element_private (GstPad *pad, gpointer priv);
|
||||
gpointer gst_pad_get_element_private (GstPad *pad);
|
||||
|
@ -391,14 +367,9 @@ void gst_pad_set_bufferalloc_function (GstPad *pad, GstPadBufferAllocFunction
|
|||
GstBuffer* gst_pad_alloc_buffer (GstPad *pad, guint64 offset, gint size);
|
||||
|
||||
/* data passing setup functions */
|
||||
void gst_pad_set_chain_function (GstPad *pad, GstPadChainFunction chain);
|
||||
void gst_pad_set_get_function (GstPad *pad, GstPadGetFunction get);
|
||||
void gst_src_pad_set_action_handler (GstPad *pad, GstActionSrcPadFunc func);
|
||||
void gst_sink_pad_set_action_handler (GstPad *pad, GstActionSinkPadFunc func);
|
||||
void gst_pad_set_event_function (GstPad *pad, GstPadEventFunction event);
|
||||
void gst_pad_set_event_mask_function (GstPad *pad, GstPadEventMaskFunction mask_func);
|
||||
G_CONST_RETURN GstEventMask*
|
||||
gst_pad_get_event_masks (GstPad *pad);
|
||||
G_CONST_RETURN GstEventMask*
|
||||
gst_pad_get_event_masks_default (GstPad *pad);
|
||||
|
||||
/* pad links */
|
||||
void gst_pad_set_link_function (GstPad *pad, GstPadLinkFunction link);
|
||||
|
@ -446,27 +417,10 @@ gboolean gst_pad_recover_caps_error (GstPad *pad, const GstCaps *allowed);
|
|||
|
||||
/* data passing functions */
|
||||
void gst_pad_push (GstPad *pad, GstData *data);
|
||||
GstData* gst_pad_pull (GstPad *pad);
|
||||
gboolean gst_pad_send_event (GstPad *pad, GstEvent *event);
|
||||
gboolean gst_pad_event_default (GstPad *pad, GstEvent *event);
|
||||
#ifndef GST_DISABLE_DEPRECATED
|
||||
GstPad* gst_pad_selectv (GList *padlist);
|
||||
GstPad* gst_pad_select (GstPad *pad, ...);
|
||||
GstPad* gst_pad_select_valist (GstPad *pad, va_list varargs);
|
||||
#endif
|
||||
/* FIXME 0.9: rename to _select? Otherwise rename SchedulerClass pointer */
|
||||
GstData * gst_pad_collectv (GstPad **selected, const GList *padlist);
|
||||
GstData * gst_pad_collect (GstPad **selected, GstPad *pad, ...);
|
||||
GstData * gst_pad_collect_valist (GstPad **selected, GstPad *pad, va_list varargs);
|
||||
|
||||
/* convert/query/format functions */
|
||||
void gst_pad_set_formats_function (GstPad *pad,
|
||||
GstPadFormatsFunction formats);
|
||||
G_CONST_RETURN GstFormat*
|
||||
gst_pad_get_formats (GstPad *pad);
|
||||
G_CONST_RETURN GstFormat*
|
||||
gst_pad_get_formats_default (GstPad *pad);
|
||||
|
||||
/* convert/query functions */
|
||||
void gst_pad_set_convert_function (GstPad *pad, GstPadConvertFunction convert);
|
||||
gboolean gst_pad_convert (GstPad *pad,
|
||||
GstFormat src_format, gint64 src_value,
|
||||
|
@ -476,11 +430,6 @@ gboolean gst_pad_convert_default (GstPad *pad,
|
|||
GstFormat *dest_format, gint64 *dest_value);
|
||||
|
||||
void gst_pad_set_query_function (GstPad *pad, GstPadQueryFunction query);
|
||||
void gst_pad_set_query_type_function (GstPad *pad, GstPadQueryTypeFunction type_func);
|
||||
G_CONST_RETURN GstQueryType*
|
||||
gst_pad_get_query_types (GstPad *pad);
|
||||
G_CONST_RETURN GstQueryType*
|
||||
gst_pad_get_query_types_default (GstPad *pad);
|
||||
gboolean gst_pad_query (GstPad *pad, GstQueryType type,
|
||||
GstFormat *format, gint64 *value);
|
||||
gboolean gst_pad_query_default (GstPad *pad, GstQueryType type,
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "gstpipeline.h"
|
||||
#include "gstinfo.h"
|
||||
#include "gstscheduler.h"
|
||||
#include "gstschedulerfactory.h"
|
||||
|
||||
static GstElementDetails gst_pipeline_details =
|
||||
GST_ELEMENT_DETAILS ("Pipeline object",
|
||||
|
@ -52,8 +53,6 @@ static void gst_pipeline_init (GTypeInstance * instance, gpointer g_class);
|
|||
|
||||
static void gst_pipeline_dispose (GObject * object);
|
||||
|
||||
static GstElementStateReturn gst_pipeline_change_state (GstElement * element);
|
||||
|
||||
static GstBinClass *parent_class = NULL;
|
||||
|
||||
/* static guint gst_pipeline_signals[LAST_SIGNAL] = { 0 }; */
|
||||
|
@ -95,15 +94,11 @@ static void
|
|||
gst_pipeline_class_init (gpointer g_class, gpointer class_data)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
|
||||
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
||||
GstPipelineClass *klass = GST_PIPELINE_CLASS (g_class);
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_pipeline_dispose);
|
||||
|
||||
gstelement_class->change_state =
|
||||
GST_DEBUG_FUNCPTR (gst_pipeline_change_state);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -137,7 +132,6 @@ gst_pipeline_dispose (GObject * object)
|
|||
g_assert (GST_IS_SCHEDULER (GST_ELEMENT_SCHED (pipeline)));
|
||||
sched = GST_ELEMENT_SCHED (pipeline);
|
||||
|
||||
gst_scheduler_reset (sched);
|
||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
|
@ -154,24 +148,3 @@ gst_pipeline_new (const gchar * name)
|
|||
{
|
||||
return gst_element_factory_make ("pipeline", name);
|
||||
}
|
||||
|
||||
static GstElementStateReturn
|
||||
gst_pipeline_change_state (GstElement * element)
|
||||
{
|
||||
switch (GST_STATE_TRANSITION (element)) {
|
||||
case GST_STATE_NULL_TO_READY:
|
||||
gst_scheduler_setup (GST_ELEMENT_SCHED (element));
|
||||
break;
|
||||
case GST_STATE_READY_TO_PAUSED:
|
||||
case GST_STATE_PAUSED_TO_PLAYING:
|
||||
case GST_STATE_PLAYING_TO_PAUSED:
|
||||
case GST_STATE_PAUSED_TO_READY:
|
||||
case GST_STATE_READY_TO_NULL:
|
||||
break;
|
||||
}
|
||||
|
||||
if (GST_ELEMENT_CLASS (parent_class)->change_state)
|
||||
return GST_ELEMENT_CLASS (parent_class)->change_state (element);
|
||||
|
||||
return GST_STATE_SUCCESS;
|
||||
}
|
||||
|
|
970
gst/gstqueue.c
970
gst/gstqueue.c
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,7 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||
* 2000 Wim Taymans <wtay@chello.be>
|
||||
* 2004,2005 Benjamin Otte <otte@gnome.org>
|
||||
*
|
||||
* gstqueue.h:
|
||||
*
|
||||
|
@ -52,9 +53,10 @@ typedef struct _GstQueueSize GstQueueSize;
|
|||
typedef struct _GstQueueClass GstQueueClass;
|
||||
|
||||
struct _GstQueueSize {
|
||||
guint items; /* no. of items */
|
||||
guint buffers; /* no. of buffers */
|
||||
guint bytes; /* no. of bytes */
|
||||
guint64 time; /* amount of time */
|
||||
GstClockTime time; /* amount of time */
|
||||
};
|
||||
|
||||
struct _GstQueue {
|
||||
|
@ -69,39 +71,25 @@ struct _GstQueue {
|
|||
GstQueueSize
|
||||
cur_level, /* currently in the queue */
|
||||
max_size, /* max. amount of data allowed in the queue */
|
||||
min_threshold; /* min. amount of data required to wake reader */
|
||||
min_threshold, /* min. amount of data required to wake reader */
|
||||
max_threshold; /* min. amount of data required to wake writer */
|
||||
|
||||
/* whether we leak data, and at which end */
|
||||
gint leaky;
|
||||
|
||||
/* number of nanoseconds until a blocked queue 'times out'
|
||||
* to receive data and returns a filler event. -1 = disable */
|
||||
guint64 block_timeout;
|
||||
|
||||
/* it the queue should fail on possible deadlocks */
|
||||
gboolean may_deadlock;
|
||||
|
||||
gboolean interrupt;
|
||||
gboolean flush;
|
||||
gboolean got_eos;
|
||||
|
||||
GMutex *qlock; /* lock for queue (vs object lock) */
|
||||
GCond *item_add; /* signals buffers now available for reading */
|
||||
GCond *item_del; /* signals space now available for writing */
|
||||
GCond *event_done; /* upstream event signaller */
|
||||
|
||||
GTimeVal *timeval; /* the timeout for the queue locking */
|
||||
GQueue *events; /* upstream events get decoupled here */
|
||||
|
||||
GstCaps *negotiated_caps;
|
||||
|
||||
GMutex *event_lock; /* lock when handling the events queue */
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING - 1];
|
||||
};
|
||||
|
||||
struct _GstQueueClass {
|
||||
GstElementClass parent_class;
|
||||
|
||||
/* vtable */
|
||||
|
||||
/* signals - 'running' is called from both sides
|
||||
* which might make it sort of non-useful... */
|
||||
void (*underrun) (GstQueue *queue);
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||
* 2000 Wim Taymans <wim.taymans@chello.be>
|
||||
* 2004 Benjamin Otte <otte@gnomee.org>
|
||||
*
|
||||
* gstscheduler.c: Default scheduling code for most cases
|
||||
*
|
||||
|
@ -27,13 +28,22 @@
|
|||
#include "gstinfo.h"
|
||||
#include "gstregistrypool.h"
|
||||
|
||||
/*
|
||||
GST_DEBUG_CATEGORY_STATIC (sched_debug, "GST_SCHEDULER",
|
||||
GST_DEBUG_BOLD | GST_DEBUG_FG_BLUE, "scheduler base class");
|
||||
#define GST_CAT_DEFAULT sched_debug
|
||||
*/
|
||||
|
||||
static void gst_scheduler_class_init (GstSchedulerClass * klass);
|
||||
static void gst_scheduler_init (GstScheduler * sched);
|
||||
static void gst_scheduler_dispose (GObject * object);
|
||||
|
||||
static GstObjectClass *parent_class = NULL;
|
||||
static void gst_scheduler_real_add_element (GstScheduler * scheduler,
|
||||
GstElement * element);
|
||||
static void gst_scheduler_real_remove_element (GstScheduler * scheduler,
|
||||
GstElement * element);
|
||||
|
||||
static gchar *_default_name = NULL;
|
||||
static GstObjectClass *parent_class = NULL;
|
||||
|
||||
GType
|
||||
gst_scheduler_get_type (void)
|
||||
|
@ -64,13 +74,14 @@ gst_scheduler_get_type (void)
|
|||
static void
|
||||
gst_scheduler_class_init (GstSchedulerClass * klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GObjectClass *gobject = G_OBJECT_CLASS (klass);
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
parent_class = g_type_class_ref (GST_TYPE_OBJECT);
|
||||
gobject->dispose = gst_scheduler_dispose;
|
||||
|
||||
gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_scheduler_dispose);
|
||||
klass->add_element = gst_scheduler_real_add_element;
|
||||
klass->remove_element = gst_scheduler_real_remove_element;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -78,10 +89,6 @@ gst_scheduler_init (GstScheduler * sched)
|
|||
{
|
||||
sched->clock_providers = NULL;
|
||||
sched->clock_receivers = NULL;
|
||||
sched->schedulers = NULL;
|
||||
sched->state = GST_SCHEDULER_STATE_NONE;
|
||||
sched->parent = NULL;
|
||||
sched->parent_sched = NULL;
|
||||
sched->clock = NULL;
|
||||
}
|
||||
|
||||
|
@ -91,58 +98,62 @@ gst_scheduler_dispose (GObject * object)
|
|||
GstScheduler *sched = GST_SCHEDULER (object);
|
||||
|
||||
/* thse lists should all be NULL */
|
||||
GST_DEBUG ("scheduler %p dispose %p %p %p",
|
||||
object,
|
||||
sched->clock_providers, sched->clock_receivers, sched->schedulers);
|
||||
GST_DEBUG ("scheduler %p dispose %p %p",
|
||||
object, sched->clock_providers, sched->clock_receivers);
|
||||
|
||||
gst_object_replace ((GstObject **) & sched->current_clock, NULL);
|
||||
gst_object_replace ((GstObject **) & sched->clock, NULL);
|
||||
|
||||
/* kids are held reference to, so dereference here. */
|
||||
while (sched->schedulers != NULL) {
|
||||
gst_scheduler_remove_scheduler (sched,
|
||||
GST_SCHEDULER (sched->schedulers->data));
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_setup:
|
||||
* @sched: the scheduler
|
||||
*
|
||||
* Prepare the scheduler.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_setup (GstScheduler * sched)
|
||||
static void
|
||||
gst_scheduler_real_add_element (GstScheduler * scheduler, GstElement * element)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
GSList *walk;
|
||||
GstSchedulerClass *klass = GST_SCHEDULER_GET_CLASS (scheduler);
|
||||
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
g_assert (klass->add_element);
|
||||
for (walk = element->actions; walk; walk = g_slist_next (walk)) {
|
||||
klass->add_action (scheduler, walk->data);
|
||||
}
|
||||
}
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
static void
|
||||
gst_scheduler_real_remove_element (GstScheduler * scheduler,
|
||||
GstElement * element)
|
||||
{
|
||||
GSList *walk;
|
||||
GstSchedulerClass *klass = GST_SCHEDULER_GET_CLASS (scheduler);
|
||||
|
||||
if (sclass->setup)
|
||||
sclass->setup (sched);
|
||||
g_assert (klass->remove_element);
|
||||
for (walk = element->actions; walk; walk = g_slist_next (walk)) {
|
||||
klass->remove_action (scheduler, walk->data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_reset:
|
||||
* @sched: a #GstScheduler to reset.
|
||||
* gst_scheduler_marshal:
|
||||
* @sched: #GstScheduler to marshal to
|
||||
* @func: function to be called
|
||||
* @data: user data provided to the function
|
||||
*
|
||||
* Reset the schedulers.
|
||||
*/
|
||||
* This function is meant to be used from a different thread. Use this whenever
|
||||
* you need to marshal function calls into the thread this scheduler is running
|
||||
* in. Note that there are no guarantees made as to when the provided function
|
||||
* will be exected, though schedulers will make a best effort to execute it as
|
||||
* soon as possible.
|
||||
**/
|
||||
void
|
||||
gst_scheduler_reset (GstScheduler * sched)
|
||||
gst_scheduler_marshal (GstScheduler * sched, GstMarshalFunc func, gpointer data)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
GstSchedulerClass *klass;
|
||||
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
if (sclass->reset)
|
||||
sclass->reset (sched);
|
||||
g_return_if_fail (func != NULL);
|
||||
klass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
g_return_if_fail (klass->marshal != NULL);
|
||||
klass->marshal (sched, func, data);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -221,7 +232,6 @@ void
|
|||
gst_scheduler_add_element (GstScheduler * sched, GstElement * element)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
gboolean redistribute_clock = FALSE;
|
||||
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||
|
@ -240,24 +250,15 @@ gst_scheduler_add_element (GstScheduler * sched, GstElement * element)
|
|||
sched->clock_providers = g_list_prepend (sched->clock_providers, element);
|
||||
GST_CAT_DEBUG (GST_CAT_CLOCK, "added clock provider %s",
|
||||
GST_ELEMENT_NAME (element));
|
||||
redistribute_clock = TRUE;
|
||||
}
|
||||
if (gst_element_requires_clock (element)) {
|
||||
sched->clock_receivers = g_list_prepend (sched->clock_receivers, element);
|
||||
GST_CAT_DEBUG (GST_CAT_CLOCK, "added clock receiver %s",
|
||||
GST_ELEMENT_NAME (element));
|
||||
redistribute_clock = TRUE;
|
||||
}
|
||||
|
||||
gst_element_set_scheduler (element, sched);
|
||||
|
||||
if (redistribute_clock) {
|
||||
GstClock *clock;
|
||||
|
||||
clock = gst_scheduler_get_clock (sched);
|
||||
gst_scheduler_set_clock (sched, clock);
|
||||
}
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
if (sclass->add_element)
|
||||
|
@ -275,33 +276,12 @@ void
|
|||
gst_scheduler_remove_element (GstScheduler * sched, GstElement * element)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
GList *link;
|
||||
gboolean redistribute_clock = FALSE;
|
||||
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||
|
||||
link = g_list_find (sched->clock_providers, element);
|
||||
if (link) {
|
||||
sched->clock_providers = g_list_delete_link (sched->clock_providers, link);
|
||||
GST_CAT_DEBUG (GST_CAT_CLOCK, "removed clock provider %s",
|
||||
GST_ELEMENT_NAME (element));
|
||||
redistribute_clock = TRUE;
|
||||
}
|
||||
link = g_list_find (sched->clock_receivers, element);
|
||||
if (link) {
|
||||
sched->clock_receivers = g_list_delete_link (sched->clock_receivers, link);
|
||||
GST_CAT_DEBUG (GST_CAT_CLOCK, "removed clock receiver %s",
|
||||
GST_ELEMENT_NAME (element));
|
||||
redistribute_clock = TRUE;
|
||||
}
|
||||
|
||||
if (redistribute_clock) {
|
||||
GstClock *clock;
|
||||
|
||||
clock = gst_scheduler_get_clock (sched);
|
||||
gst_scheduler_set_clock (sched, clock);
|
||||
}
|
||||
sched->clock_providers = g_list_remove (sched->clock_providers, element);
|
||||
sched->clock_receivers = g_list_remove (sched->clock_receivers, element);
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
|
@ -331,9 +311,7 @@ gst_scheduler_state_transition (GstScheduler * sched, GstElement * element,
|
|||
g_return_val_if_fail (GST_IS_SCHEDULER (sched), GST_STATE_FAILURE);
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_FAILURE);
|
||||
|
||||
if (element == sched->parent && sched->parent_sched == NULL) {
|
||||
/* FIXME is distributing the clock in the state change still needed
|
||||
* when we distribute as soon as we add/remove elements? I think not.*/
|
||||
if (GST_OBJECT (element) == gst_object_get_parent (GST_OBJECT (sched))) {
|
||||
switch (transition) {
|
||||
case GST_STATE_READY_TO_PAUSED:
|
||||
{
|
||||
|
@ -357,121 +335,6 @@ gst_scheduler_state_transition (GstScheduler * sched, GstElement * element,
|
|||
return GST_STATE_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_scheduling_change:
|
||||
* @sched: the scheduler
|
||||
* @element: the element that changed its scheduling strategy
|
||||
*
|
||||
* Tell the scheduler that an element changed its scheduling strategy.
|
||||
* An element could, for example, change its loop function or changes
|
||||
* from a loop based element to a chain based element.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_scheduling_change (GstScheduler * sched, GstElement * element)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
if (sclass->scheduling_change)
|
||||
sclass->scheduling_change (sched, element);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_add_scheduler:
|
||||
* @sched: a #GstScheduler to add to
|
||||
* @sched2: the #GstScheduler to add
|
||||
*
|
||||
* Notifies the scheduler that it has to monitor this scheduler.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_add_scheduler (GstScheduler * sched, GstScheduler * sched2)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched2));
|
||||
g_return_if_fail (sched2->parent_sched == NULL);
|
||||
|
||||
GST_DEBUG ("gstscheduler: %p add scheduler %p", sched, sched2);
|
||||
|
||||
gst_object_ref (GST_OBJECT (sched2));
|
||||
gst_object_ref (GST_OBJECT (sched));
|
||||
|
||||
sched->schedulers = g_list_prepend (sched->schedulers, sched2);
|
||||
sched2->parent_sched = sched;
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
if (sclass->add_scheduler)
|
||||
sclass->add_scheduler (sched, sched2);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_remove_scheduler:
|
||||
* @sched: the scheduler
|
||||
* @sched2: the scheduler to remove
|
||||
*
|
||||
a Notifies the scheduler that it can stop monitoring this scheduler.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_remove_scheduler (GstScheduler * sched, GstScheduler * sched2)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched2));
|
||||
g_return_if_fail (sched2->parent_sched == sched);
|
||||
|
||||
GST_DEBUG ("gstscheduler: %p remove scheduler %p", sched, sched2);
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
if (sclass->remove_scheduler)
|
||||
sclass->remove_scheduler (sched, sched2);
|
||||
|
||||
sched->schedulers = g_list_remove (sched->schedulers, sched2);
|
||||
sched2->parent_sched = NULL;
|
||||
|
||||
gst_object_unref (GST_OBJECT (sched2));
|
||||
gst_object_unref (GST_OBJECT (sched));
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_lock_element:
|
||||
* @sched: the scheduler
|
||||
* @element: the element to lock
|
||||
*
|
||||
* Acquire a lock on the given element in the given scheduler.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_lock_element (GstScheduler * sched, GstElement * element)
|
||||
{
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_unlock_element:
|
||||
* @sched: the scheduler
|
||||
* @element: the element to unlock
|
||||
*
|
||||
* Release the lock on the given element in the given scheduler.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_unlock_element (GstScheduler * sched, GstElement * element)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
g_return_if_fail (GST_IS_ELEMENT (element));
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_error:
|
||||
* @sched: the scheduler
|
||||
|
@ -493,58 +356,6 @@ gst_scheduler_error (GstScheduler * sched, GstElement * element)
|
|||
sclass->error (sched, element);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_yield:
|
||||
* @sched: the scheduler
|
||||
* @element: the element requesting a yield
|
||||
*
|
||||
* Tell the scheduler to schedule another element.
|
||||
*
|
||||
* Returns: TRUE if the element should save its state, FALSE
|
||||
* if the scheduler can perform this action itself.
|
||||
*/
|
||||
gboolean
|
||||
gst_scheduler_yield (GstScheduler * sched, GstElement * element)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
|
||||
g_return_val_if_fail (GST_IS_SCHEDULER (sched), TRUE);
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), TRUE);
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
if (sclass->yield)
|
||||
return sclass->yield (sched, element);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_interrupt:
|
||||
* @sched: the scheduler
|
||||
* @element: the element requesting an interrupt
|
||||
*
|
||||
* Tell the scheduler to interrupt execution of this element.
|
||||
*
|
||||
* Returns: TRUE if the element should return NULL from the chain/get
|
||||
* function.
|
||||
*/
|
||||
gboolean
|
||||
gst_scheduler_interrupt (GstScheduler * sched, GstElement * element)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
|
||||
g_return_val_if_fail (GST_IS_SCHEDULER (sched), FALSE);
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
if (sclass->interrupt)
|
||||
return sclass->interrupt (sched, element);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_get_clock:
|
||||
* @sched: the scheduler
|
||||
|
@ -565,23 +376,8 @@ gst_scheduler_get_clock (GstScheduler * sched)
|
|||
GST_CAT_DEBUG (GST_CAT_CLOCK, "scheduler using fixed clock %p (%s)",
|
||||
clock, clock ? GST_STR_NULL (GST_OBJECT_NAME (clock)) : "-");
|
||||
} else {
|
||||
GList *schedulers = sched->schedulers;
|
||||
GList *providers = sched->clock_providers;
|
||||
|
||||
/* try to get a clock from one of the schedulers we manage first */
|
||||
while (schedulers) {
|
||||
GstScheduler *scheduler = GST_SCHEDULER (schedulers->data);
|
||||
|
||||
clock = gst_scheduler_get_clock (scheduler);
|
||||
if (clock) {
|
||||
GST_CAT_DEBUG (GST_CAT_CLOCK,
|
||||
"scheduler found managed sched clock %p (%s)",
|
||||
clock, clock ? GST_STR_NULL (GST_OBJECT_NAME (clock)) : "-");
|
||||
break;
|
||||
}
|
||||
|
||||
schedulers = g_list_next (schedulers);
|
||||
}
|
||||
/* still no clock, try to find one in the providers */
|
||||
while (!clock && providers) {
|
||||
clock = gst_element_get_clock (GST_ELEMENT (providers->data));
|
||||
|
@ -591,7 +387,7 @@ gst_scheduler_get_clock (GstScheduler * sched)
|
|||
providers = g_list_next (providers);
|
||||
}
|
||||
/* still no clock, use a system clock */
|
||||
if (!clock && sched->parent_sched == NULL) {
|
||||
if (!clock) {
|
||||
clock = gst_system_clock_obtain ();
|
||||
/* we unref since this function is not supposed to increase refcount
|
||||
* of clock object returned; this is ok since the systemclock always
|
||||
|
@ -640,14 +436,11 @@ void
|
|||
gst_scheduler_set_clock (GstScheduler * sched, GstClock * clock)
|
||||
{
|
||||
GList *receivers;
|
||||
GList *schedulers;
|
||||
|
||||
g_return_if_fail (sched != NULL);
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
|
||||
receivers = sched->clock_receivers;
|
||||
schedulers = sched->schedulers;
|
||||
|
||||
gst_object_replace ((GstObject **) & sched->current_clock,
|
||||
(GstObject *) clock);
|
||||
|
||||
|
@ -661,15 +454,6 @@ gst_scheduler_set_clock (GstScheduler * sched, GstClock * clock)
|
|||
gst_element_set_clock (element, clock);
|
||||
receivers = g_list_next (receivers);
|
||||
}
|
||||
while (schedulers) {
|
||||
GstScheduler *scheduler = GST_SCHEDULER (schedulers->data);
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_CLOCK,
|
||||
"scheduler setting clock %p (%s) on scheduler %p", clock,
|
||||
(clock ? GST_OBJECT_NAME (clock) : "nil"), scheduler);
|
||||
gst_scheduler_set_clock (scheduler, clock);
|
||||
schedulers = g_list_next (schedulers);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -688,66 +472,24 @@ gst_scheduler_auto_clock (GstScheduler * sched)
|
|||
|
||||
gst_object_replace ((GstObject **) & sched->clock, NULL);
|
||||
|
||||
GST_CAT_DEBUG (GST_CAT_CLOCK, "scheduler using automatic clock");
|
||||
GST_DEBUG_OBJECT (sched, "using automatic clock");
|
||||
}
|
||||
|
||||
GstClockReturn gst_clock_id_wait (GstClockID id, GstClockTimeDiff * jitter);
|
||||
|
||||
/**
|
||||
* gst_scheduler_clock_wait:
|
||||
* @sched: the scheduler
|
||||
* @element: the element that wants to wait
|
||||
* @id: the clockid to use
|
||||
* @jitter: the time difference between requested time and actual time
|
||||
*
|
||||
* Wait till the clock reaches a specific time. The ClockID can
|
||||
* be obtained from #gst_clock_new_single_shot_id.
|
||||
*
|
||||
* Returns: the status of the operation
|
||||
*/
|
||||
GstClockReturn
|
||||
gst_scheduler_clock_wait (GstScheduler * sched, GstElement * element,
|
||||
GstClockID id, GstClockTimeDiff * jitter)
|
||||
void
|
||||
gst_scheduler_pad_push (GstScheduler * sched, GstRealPad * pad, GstData * data)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
GstSchedulerClass *klass;
|
||||
|
||||
g_return_val_if_fail (GST_IS_SCHEDULER (sched), GST_CLOCK_ERROR);
|
||||
g_return_val_if_fail (id != NULL, GST_CLOCK_ERROR);
|
||||
g_return_if_fail (GST_IS_SCHEDULER (sched));
|
||||
g_return_if_fail (GST_IS_REAL_PAD (pad));
|
||||
g_return_if_fail (GST_PAD_IS_SRC (pad));
|
||||
g_return_if_fail (data != NULL);
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
if (sclass->clock_wait)
|
||||
return sclass->clock_wait (sched, element, id, jitter);
|
||||
else
|
||||
return gst_clock_id_wait (id, jitter);
|
||||
klass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
g_return_if_fail (klass->pad_push);
|
||||
klass->pad_push (sched, pad, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_iterate:
|
||||
* @sched: the scheduler
|
||||
*
|
||||
* Perform one iteration on the scheduler.
|
||||
*
|
||||
* Returns: a boolean indicating something usefull has happened.
|
||||
*/
|
||||
gboolean
|
||||
gst_scheduler_iterate (GstScheduler * sched)
|
||||
{
|
||||
GstSchedulerClass *sclass;
|
||||
gboolean res = FALSE;
|
||||
|
||||
g_return_val_if_fail (GST_IS_SCHEDULER (sched), FALSE);
|
||||
|
||||
sclass = GST_SCHEDULER_GET_CLASS (sched);
|
||||
|
||||
if (sclass->iterate) {
|
||||
res = sclass->iterate (sched);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* gst_scheduler_show:
|
||||
* @sched: the scheduler
|
||||
|
@ -766,277 +508,3 @@ gst_scheduler_show (GstScheduler * sched)
|
|||
if (sclass->show)
|
||||
sclass->show (sched);
|
||||
}
|
||||
|
||||
/*
|
||||
* Factory stuff starts here
|
||||
*
|
||||
*/
|
||||
static void gst_scheduler_factory_class_init (GstSchedulerFactoryClass * klass);
|
||||
static void gst_scheduler_factory_init (GstSchedulerFactory * factory);
|
||||
|
||||
static GstPluginFeatureClass *factory_parent_class = NULL;
|
||||
|
||||
/* static guint gst_scheduler_factory_signals[LAST_SIGNAL] = { 0 }; */
|
||||
|
||||
GType
|
||||
gst_scheduler_factory_get_type (void)
|
||||
{
|
||||
static GType schedulerfactory_type = 0;
|
||||
|
||||
if (!schedulerfactory_type) {
|
||||
static const GTypeInfo schedulerfactory_info = {
|
||||
sizeof (GstSchedulerFactoryClass),
|
||||
NULL,
|
||||
NULL,
|
||||
(GClassInitFunc) gst_scheduler_factory_class_init,
|
||||
NULL,
|
||||
NULL,
|
||||
sizeof (GstSchedulerFactory),
|
||||
0,
|
||||
(GInstanceInitFunc) gst_scheduler_factory_init,
|
||||
NULL
|
||||
};
|
||||
|
||||
schedulerfactory_type = g_type_register_static (GST_TYPE_PLUGIN_FEATURE,
|
||||
"GstSchedulerFactory", &schedulerfactory_info, 0);
|
||||
}
|
||||
return schedulerfactory_type;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_scheduler_factory_class_init (GstSchedulerFactoryClass * klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstObjectClass *gstobject_class;
|
||||
GstPluginFeatureClass *gstpluginfeature_class;
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
gstobject_class = (GstObjectClass *) klass;
|
||||
gstpluginfeature_class = (GstPluginFeatureClass *) klass;
|
||||
|
||||
factory_parent_class = g_type_class_ref (GST_TYPE_PLUGIN_FEATURE);
|
||||
|
||||
if (!_default_name) {
|
||||
if (g_getenv ("GST_SCHEDULER")) {
|
||||
_default_name = g_strdup (g_getenv ("GST_SCHEDULER"));
|
||||
} else {
|
||||
_default_name = g_strdup (GST_SCHEDULER_DEFAULT_NAME);
|
||||
}
|
||||
}
|
||||
g_assert (_default_name);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_scheduler_factory_init (GstSchedulerFactory * factory)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* gst_scheduler_register:
|
||||
* @plugin: a #GstPlugin
|
||||
* @name: name of the scheduler to register
|
||||
* @longdesc: description of the scheduler
|
||||
* @type: #GType of the scheduler to register
|
||||
*
|
||||
* Registers a scheduler with GStreamer.
|
||||
*
|
||||
* Returns: TRUE, if the registering succeeded, FALSE on error.
|
||||
*
|
||||
* Since: 0.8.5
|
||||
**/
|
||||
gboolean
|
||||
gst_scheduler_register (GstPlugin * plugin, const gchar * name,
|
||||
const gchar * longdesc, GType type)
|
||||
{
|
||||
GstSchedulerFactory *factory;
|
||||
|
||||
g_return_val_if_fail (plugin != NULL, FALSE);
|
||||
g_return_val_if_fail (name != NULL, FALSE);
|
||||
g_return_val_if_fail (longdesc != NULL, FALSE);
|
||||
g_return_val_if_fail (g_type_is_a (type, GST_TYPE_SCHEDULER), FALSE);
|
||||
|
||||
factory = gst_scheduler_factory_find (name);
|
||||
if (factory) {
|
||||
g_return_val_if_fail (factory->type == 0, FALSE);
|
||||
g_free (factory->longdesc);
|
||||
factory->longdesc = g_strdup (longdesc);
|
||||
factory->type = type;
|
||||
} else {
|
||||
factory = gst_scheduler_factory_new (name, longdesc, type);
|
||||
g_return_val_if_fail (factory, FALSE);
|
||||
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_new:
|
||||
* @name: name of schedulerfactory to create
|
||||
* @longdesc: long description of schedulerfactory to create
|
||||
* @type: the gtk type of the GstScheduler element of this factory
|
||||
*
|
||||
* Create a new schedulerfactory with the given parameters
|
||||
*
|
||||
* Returns: a new #GstSchedulerFactory.
|
||||
*/
|
||||
GstSchedulerFactory *
|
||||
gst_scheduler_factory_new (const gchar * name, const gchar * longdesc,
|
||||
GType type)
|
||||
{
|
||||
GstSchedulerFactory *factory;
|
||||
|
||||
g_return_val_if_fail (name != NULL, NULL);
|
||||
|
||||
factory = gst_scheduler_factory_find (name);
|
||||
|
||||
if (!factory) {
|
||||
factory =
|
||||
GST_SCHEDULER_FACTORY (g_object_new (GST_TYPE_SCHEDULER_FACTORY, NULL));
|
||||
GST_PLUGIN_FEATURE_NAME (factory) = g_strdup (name);
|
||||
} else {
|
||||
g_free (factory->longdesc);
|
||||
}
|
||||
|
||||
factory->longdesc = g_strdup (longdesc);
|
||||
factory->type = type;
|
||||
|
||||
return factory;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_destroy:
|
||||
* @factory: factory to destroy
|
||||
*
|
||||
* Removes the scheduler from the global list.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_factory_destroy (GstSchedulerFactory * factory)
|
||||
{
|
||||
g_return_if_fail (factory != NULL);
|
||||
|
||||
/* we don't free the struct bacause someone might have a handle to it.. */
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_find:
|
||||
* @name: name of schedulerfactory to find
|
||||
*
|
||||
* Search for an schedulerfactory of the given name.
|
||||
*
|
||||
* Returns: #GstSchedulerFactory if found, NULL otherwise
|
||||
*/
|
||||
GstSchedulerFactory *
|
||||
gst_scheduler_factory_find (const gchar * name)
|
||||
{
|
||||
GstPluginFeature *feature;
|
||||
|
||||
g_return_val_if_fail (name != NULL, NULL);
|
||||
|
||||
GST_DEBUG ("gstscheduler: find \"%s\"", name);
|
||||
|
||||
feature = gst_registry_pool_find_feature (name, GST_TYPE_SCHEDULER_FACTORY);
|
||||
|
||||
if (feature)
|
||||
return GST_SCHEDULER_FACTORY (feature);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_create:
|
||||
* @factory: the factory used to create the instance
|
||||
* @parent: the parent element of this scheduler
|
||||
*
|
||||
* Create a new #GstScheduler instance from the
|
||||
* given schedulerfactory with the given parent. @parent will
|
||||
* have its scheduler set to the returned #GstScheduler instance.
|
||||
*
|
||||
* Returns: A new #GstScheduler instance with a reference count of %1.
|
||||
*/
|
||||
GstScheduler *
|
||||
gst_scheduler_factory_create (GstSchedulerFactory * factory,
|
||||
GstElement * parent)
|
||||
{
|
||||
GstScheduler *sched = NULL;
|
||||
|
||||
g_return_val_if_fail (factory != NULL, NULL);
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (parent), NULL);
|
||||
|
||||
if (gst_plugin_feature_ensure_loaded (GST_PLUGIN_FEATURE (factory))) {
|
||||
g_return_val_if_fail (factory->type != 0, NULL);
|
||||
|
||||
sched = GST_SCHEDULER (g_object_new (factory->type, NULL));
|
||||
sched->parent = parent;
|
||||
|
||||
GST_ELEMENT_SCHED (parent) = sched;
|
||||
|
||||
/* let's refcount the scheduler */
|
||||
gst_object_ref (GST_OBJECT (sched));
|
||||
gst_object_sink (GST_OBJECT (sched));
|
||||
}
|
||||
|
||||
return sched;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_make:
|
||||
* @name: the name of the factory used to create the instance
|
||||
* @parent: the parent element of this scheduler
|
||||
*
|
||||
* Create a new #GstScheduler instance from the
|
||||
* schedulerfactory with the given name and parent. @parent will
|
||||
* have its scheduler set to the returned #GstScheduler instance.
|
||||
* If %NULL is passed as @name, the default scheduler name will
|
||||
* be used.
|
||||
*
|
||||
* Returns: A new #GstScheduler instance with a reference count of %1.
|
||||
*/
|
||||
GstScheduler *
|
||||
gst_scheduler_factory_make (const gchar * name, GstElement * parent)
|
||||
{
|
||||
GstSchedulerFactory *factory;
|
||||
const gchar *default_name = gst_scheduler_factory_get_default_name ();
|
||||
|
||||
if (name)
|
||||
factory = gst_scheduler_factory_find (name);
|
||||
else {
|
||||
/* FIXME: do better error handling */
|
||||
if (default_name == NULL)
|
||||
g_error ("No default scheduler name - do you have a registry ?");
|
||||
factory = gst_scheduler_factory_find (default_name);
|
||||
}
|
||||
|
||||
if (factory == NULL)
|
||||
return NULL;
|
||||
|
||||
return gst_scheduler_factory_create (factory, parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_set_default_name:
|
||||
* @name: the name of the factory used as a default
|
||||
*
|
||||
* Set the default schedulerfactory name.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_factory_set_default_name (const gchar * name)
|
||||
{
|
||||
g_free (_default_name);
|
||||
|
||||
_default_name = g_strdup (name);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_get_default_name:
|
||||
*
|
||||
* Get the default schedulerfactory name.
|
||||
*
|
||||
* Returns: the name of the default scheduler.
|
||||
*/
|
||||
const gchar *
|
||||
gst_scheduler_factory_get_default_name (void)
|
||||
{
|
||||
return _default_name;
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
#include <glib.h>
|
||||
#include <gst/gstelement.h>
|
||||
#include <gst/gstbin.h>
|
||||
#include <gst/gstdata.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
@ -40,40 +40,21 @@ G_BEGIN_DECLS
|
|||
typedef enum {
|
||||
/* this scheduler works with a fixed clock */
|
||||
GST_SCHEDULER_FLAG_FIXED_CLOCK = GST_OBJECT_FLAG_LAST,
|
||||
/* this scheduler supports select and lock calls */
|
||||
GST_SCHEDULER_FLAG_NEW_API,
|
||||
|
||||
/* padding */
|
||||
GST_SCHEDULER_FLAG_LAST = GST_OBJECT_FLAG_LAST + 4
|
||||
} GstSchedulerFlags;
|
||||
|
||||
#define GST_SCHEDULER_PARENT(sched) ((sched)->parent)
|
||||
#define GST_SCHEDULER_STATE(sched) ((sched)->state)
|
||||
|
||||
/*typedef struct _GstScheduler GstScheduler; */
|
||||
/*typedef struct _GstSchedulerClass GstSchedulerClass; */
|
||||
typedef enum {
|
||||
GST_SCHEDULER_STATE_NONE,
|
||||
GST_SCHEDULER_STATE_RUNNING,
|
||||
GST_SCHEDULER_STATE_STOPPED,
|
||||
GST_SCHEDULER_STATE_ERROR
|
||||
} GstSchedulerState;
|
||||
|
||||
typedef (*GstMarshalFunc) (gpointer data);
|
||||
struct _GstScheduler {
|
||||
GstObject object;
|
||||
|
||||
GstElement *parent;
|
||||
GstScheduler *parent_sched;
|
||||
|
||||
GstSchedulerState state;
|
||||
GstClock *clock;
|
||||
GstClock *current_clock;
|
||||
|
||||
GList *clock_providers;
|
||||
GList *clock_receivers;
|
||||
|
||||
GList *schedulers;
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
|
@ -81,64 +62,39 @@ struct _GstSchedulerClass {
|
|||
GstObjectClass parent_class;
|
||||
|
||||
/* virtual methods */
|
||||
void (*setup) (GstScheduler *sched);
|
||||
void (*reset) (GstScheduler *sched);
|
||||
/* required */
|
||||
void (*marshal) (GstScheduler *sched, GstMarshalFunc func, gpointer data);
|
||||
void (*add_action) (GstScheduler *sched, GstAction *action);
|
||||
void (*remove_action) (GstScheduler *sched, GstAction *action);
|
||||
/* FIXME: can/want this optional, too? */
|
||||
void (*pad_push) (GstScheduler *sched, GstRealPad *pad, GstData *data);
|
||||
/* optional */
|
||||
void (*update_values) (GstScheduler *sched, GstAction *action);
|
||||
void (*toggle_active) (GstScheduler *sched, GstAction *action);
|
||||
void (*add_element) (GstScheduler *sched, GstElement *element);
|
||||
void (*remove_element) (GstScheduler *sched, GstElement *element);
|
||||
void (*add_scheduler) (GstScheduler *sched, GstScheduler *sched2);
|
||||
void (*remove_scheduler) (GstScheduler *sched, GstScheduler *sched2);
|
||||
GstElementStateReturn (*state_transition) (GstScheduler *sched, GstElement *element, gint transition);
|
||||
void (*scheduling_change) (GstScheduler *sched, GstElement *element);
|
||||
/* next two are optional, require NEW_API flag */
|
||||
/* FIXME 0.9: rename to (un)lock_object */
|
||||
void (*lock_element) (GstScheduler *sched, GstObject *object);
|
||||
void (*unlock_element) (GstScheduler *sched, GstObject *object);
|
||||
gboolean (*yield) (GstScheduler *sched, GstElement *element);
|
||||
gboolean (*interrupt) (GstScheduler *sched, GstElement *element);
|
||||
void (*error) (GstScheduler *sched, GstElement *element);
|
||||
/* FIXME: make this GstRealPad */
|
||||
void (*pad_link) (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
||||
void (*pad_unlink) (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
||||
/* optional, requires NEW_API flag */
|
||||
GstData * (*pad_select) (GstScheduler *sched, GstPad **selected, GstPad **pads);
|
||||
GstClockReturn (*clock_wait) (GstScheduler *sched, GstElement *element,
|
||||
GstClockID id, GstClockTimeDiff *jitter);
|
||||
GstSchedulerState (*iterate) (GstScheduler *sched);
|
||||
/* for debugging */
|
||||
void (*show) (GstScheduler *sched);
|
||||
|
||||
/* signals */
|
||||
void (*object_sync) (GstScheduler *sched, GstClock *clock, GstObject *object,
|
||||
GstClockID id);
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
GType gst_scheduler_get_type (void);
|
||||
|
||||
|
||||
void gst_scheduler_setup (GstScheduler *sched);
|
||||
void gst_scheduler_reset (GstScheduler *sched);
|
||||
void gst_scheduler_add_element (GstScheduler *sched, GstElement *element);
|
||||
void gst_scheduler_remove_element (GstScheduler *sched, GstElement *element);
|
||||
void gst_scheduler_add_scheduler (GstScheduler *sched, GstScheduler *sched2);
|
||||
void gst_scheduler_remove_scheduler (GstScheduler *sched, GstScheduler *sched2);
|
||||
void gst_scheduler_marshal (GstScheduler *sched, GstMarshalFunc func, gpointer data);
|
||||
/* FIXME: make private? */
|
||||
GstElementStateReturn gst_scheduler_state_transition (GstScheduler *sched, GstElement *element, gint transition);
|
||||
void gst_scheduler_scheduling_change (GstScheduler *sched, GstElement *element);
|
||||
#ifndef GST_DISABLE_DEPRECATED
|
||||
void gst_scheduler_lock_element (GstScheduler *sched, GstElement *element);
|
||||
void gst_scheduler_unlock_element (GstScheduler *sched, GstElement *element);
|
||||
#endif
|
||||
gboolean gst_scheduler_yield (GstScheduler *sched, GstElement *element);
|
||||
gboolean gst_scheduler_interrupt (GstScheduler *sched, GstElement *element);
|
||||
void gst_scheduler_error (GstScheduler *sched, GstElement *element);
|
||||
void gst_scheduler_pad_link (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
||||
void gst_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad);
|
||||
#ifndef GST_DISABLE_DEPRECATED
|
||||
GstPad* gst_scheduler_pad_select (GstScheduler *sched, GList *padlist);
|
||||
#endif
|
||||
GstClockReturn gst_scheduler_clock_wait (GstScheduler *sched, GstElement *element,
|
||||
GstClockID id, GstClockTimeDiff *jitter);
|
||||
gboolean gst_scheduler_iterate (GstScheduler *sched);
|
||||
void gst_scheduler_pad_push (GstScheduler *sched, GstRealPad *pad, GstData *data);
|
||||
|
||||
void gst_scheduler_use_clock (GstScheduler *sched, GstClock *clock);
|
||||
void gst_scheduler_set_clock (GstScheduler *sched, GstClock *clock);
|
||||
|
@ -147,53 +103,6 @@ void gst_scheduler_auto_clock (GstScheduler *sched);
|
|||
|
||||
void gst_scheduler_show (GstScheduler *sched);
|
||||
|
||||
/*
|
||||
* creating schedulers
|
||||
*
|
||||
*/
|
||||
#define GST_TYPE_SCHEDULER_FACTORY (gst_scheduler_factory_get_type ())
|
||||
#define GST_SCHEDULER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactory))
|
||||
#define GST_IS_SCHEDULER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SCHEDULER_FACTORY))
|
||||
#define GST_SCHEDULER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactoryClass))
|
||||
#define GST_IS_SCHEDULER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SCHEDULER_FACTORY))
|
||||
#define GST_SCHEDULER_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactoryClass))
|
||||
|
||||
/* change this to change the default scheduler */
|
||||
#define GST_SCHEDULER_DEFAULT_NAME "opt"
|
||||
|
||||
typedef struct _GstSchedulerFactory GstSchedulerFactory;
|
||||
typedef struct _GstSchedulerFactoryClass GstSchedulerFactoryClass;
|
||||
|
||||
struct _GstSchedulerFactory {
|
||||
GstPluginFeature feature;
|
||||
|
||||
gchar *longdesc; /* long description of the scheduler (well, don't overdo it..) */
|
||||
GType type; /* unique GType of the scheduler */
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
struct _GstSchedulerFactoryClass {
|
||||
GstPluginFeatureClass parent;
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
GType gst_scheduler_factory_get_type (void);
|
||||
|
||||
gboolean gst_scheduler_register (GstPlugin *plugin, const gchar *name,
|
||||
const gchar *longdesc, GType type);
|
||||
GstSchedulerFactory* gst_scheduler_factory_new (const gchar *name, const gchar *longdesc, GType type);
|
||||
void gst_scheduler_factory_destroy (GstSchedulerFactory *factory);
|
||||
|
||||
GstSchedulerFactory* gst_scheduler_factory_find (const gchar *name);
|
||||
|
||||
GstScheduler* gst_scheduler_factory_create (GstSchedulerFactory *factory, GstElement *parent);
|
||||
GstScheduler* gst_scheduler_factory_make (const gchar *name, GstElement *parent);
|
||||
|
||||
void gst_scheduler_factory_set_default_name (const gchar* name);
|
||||
G_CONST_RETURN gchar* gst_scheduler_factory_get_default_name (void);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
295
gst/gstschedulerfactory.c
Normal file
295
gst/gstschedulerfactory.c
Normal file
|
@ -0,0 +1,295 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||
* 2000 Wim Taymans <wim.taymans@chello.be>
|
||||
* 2004 Benjamin Otte <otte@gnome.org>
|
||||
*
|
||||
* gstschedulerfactory.c: code for registering schedulers
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "gst_private.h"
|
||||
|
||||
#include "gstscheduler.h"
|
||||
#include "gstschedulerfactory.h"
|
||||
#include "gstinfo.h"
|
||||
#include "gstregistrypool.h"
|
||||
|
||||
static gchar *_default_name = NULL;
|
||||
|
||||
static void gst_scheduler_factory_class_init (GstSchedulerFactoryClass * klass);
|
||||
static void gst_scheduler_factory_init (GstSchedulerFactory * factory);
|
||||
|
||||
static GstPluginFeatureClass *factory_parent_class = NULL;
|
||||
|
||||
/* static guint gst_scheduler_factory_signals[LAST_SIGNAL] = { 0 }; */
|
||||
|
||||
GType
|
||||
gst_scheduler_factory_get_type (void)
|
||||
{
|
||||
static GType schedulerfactory_type = 0;
|
||||
|
||||
if (!schedulerfactory_type) {
|
||||
static const GTypeInfo schedulerfactory_info = {
|
||||
sizeof (GstSchedulerFactoryClass),
|
||||
NULL,
|
||||
NULL,
|
||||
(GClassInitFunc) gst_scheduler_factory_class_init,
|
||||
NULL,
|
||||
NULL,
|
||||
sizeof (GstSchedulerFactory),
|
||||
0,
|
||||
(GInstanceInitFunc) gst_scheduler_factory_init,
|
||||
NULL
|
||||
};
|
||||
|
||||
schedulerfactory_type = g_type_register_static (GST_TYPE_PLUGIN_FEATURE,
|
||||
"GstSchedulerFactory", &schedulerfactory_info, 0);
|
||||
}
|
||||
return schedulerfactory_type;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_scheduler_factory_class_init (GstSchedulerFactoryClass * klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstObjectClass *gstobject_class;
|
||||
GstPluginFeatureClass *gstpluginfeature_class;
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
gstobject_class = (GstObjectClass *) klass;
|
||||
gstpluginfeature_class = (GstPluginFeatureClass *) klass;
|
||||
|
||||
factory_parent_class = g_type_class_ref (GST_TYPE_PLUGIN_FEATURE);
|
||||
|
||||
if (!_default_name) {
|
||||
if (g_getenv ("GST_SCHEDULER")) {
|
||||
_default_name = g_strdup (g_getenv ("GST_SCHEDULER"));
|
||||
} else {
|
||||
_default_name = g_strdup (GST_SCHEDULER_DEFAULT_NAME);
|
||||
}
|
||||
}
|
||||
g_assert (_default_name);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_scheduler_factory_init (GstSchedulerFactory * factory)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* gst_scheduler_register:
|
||||
* @plugin: a #GstPlugin
|
||||
* @name: name of the scheduler to register
|
||||
* @longdesc: description of the scheduler
|
||||
* @type: #GType of the scheduler to register
|
||||
*
|
||||
* Registers a scheduler with GStreamer.
|
||||
*
|
||||
* Returns: TRUE, if the registering succeeded, FALSE on error
|
||||
**/
|
||||
gboolean
|
||||
gst_scheduler_register (GstPlugin * plugin, const gchar * name,
|
||||
const gchar * longdesc, GType type)
|
||||
{
|
||||
GstSchedulerFactory *factory;
|
||||
|
||||
g_return_val_if_fail (plugin != NULL, FALSE);
|
||||
g_return_val_if_fail (name != NULL, FALSE);
|
||||
g_return_val_if_fail (longdesc != NULL, FALSE);
|
||||
g_return_val_if_fail (g_type_is_a (type, GST_TYPE_SCHEDULER), FALSE);
|
||||
|
||||
factory = gst_scheduler_factory_find (name);
|
||||
if (factory) {
|
||||
g_return_val_if_fail (factory->type == 0, FALSE);
|
||||
g_free (factory->longdesc);
|
||||
factory->longdesc = g_strdup (longdesc);
|
||||
factory->type = type;
|
||||
} else {
|
||||
factory = gst_scheduler_factory_new (name, longdesc, type);
|
||||
g_return_val_if_fail (factory, FALSE);
|
||||
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_new:
|
||||
* @name: name of schedulerfactory to create
|
||||
* @longdesc: long description of schedulerfactory to create
|
||||
* @type: the gtk type of the GstScheduler element of this factory
|
||||
*
|
||||
* Create a new schedulerfactory with the given parameters
|
||||
*
|
||||
* Returns: a new #GstSchedulerFactory.
|
||||
*/
|
||||
GstSchedulerFactory *
|
||||
gst_scheduler_factory_new (const gchar * name, const gchar * longdesc,
|
||||
GType type)
|
||||
{
|
||||
GstSchedulerFactory *factory;
|
||||
|
||||
g_return_val_if_fail (name != NULL, NULL);
|
||||
|
||||
factory = gst_scheduler_factory_find (name);
|
||||
|
||||
if (!factory) {
|
||||
factory =
|
||||
GST_SCHEDULER_FACTORY (g_object_new (GST_TYPE_SCHEDULER_FACTORY, NULL));
|
||||
GST_PLUGIN_FEATURE_NAME (factory) = g_strdup (name);
|
||||
} else {
|
||||
g_free (factory->longdesc);
|
||||
}
|
||||
|
||||
factory->longdesc = g_strdup (longdesc);
|
||||
factory->type = type;
|
||||
|
||||
return factory;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_destroy:
|
||||
* @factory: factory to destroy
|
||||
*
|
||||
* Removes the scheduler from the global list.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_factory_destroy (GstSchedulerFactory * factory)
|
||||
{
|
||||
g_return_if_fail (factory != NULL);
|
||||
|
||||
/* we don't free the struct bacause someone might have a handle to it.. */
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_find:
|
||||
* @name: name of schedulerfactory to find
|
||||
*
|
||||
* Search for an schedulerfactory of the given name.
|
||||
*
|
||||
* Returns: #GstSchedulerFactory if found, NULL otherwise
|
||||
*/
|
||||
GstSchedulerFactory *
|
||||
gst_scheduler_factory_find (const gchar * name)
|
||||
{
|
||||
GstPluginFeature *feature;
|
||||
|
||||
g_return_val_if_fail (name != NULL, NULL);
|
||||
|
||||
GST_DEBUG ("gstscheduler: find \"%s\"", name);
|
||||
|
||||
feature = gst_registry_pool_find_feature (name, GST_TYPE_SCHEDULER_FACTORY);
|
||||
|
||||
if (feature)
|
||||
return GST_SCHEDULER_FACTORY (feature);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_create:
|
||||
* @factory: the factory used to create the instance
|
||||
* @parent: the parent element of this scheduler
|
||||
*
|
||||
* Create a new #GstScheduler instance from the
|
||||
* given schedulerfactory with the given parent. @parent will
|
||||
* have its scheduler set to the returned #GstScheduler instance.
|
||||
*
|
||||
* Returns: A new #GstScheduler instance with a reference count of %1.
|
||||
*/
|
||||
GstScheduler *
|
||||
gst_scheduler_factory_create (GstSchedulerFactory * factory,
|
||||
GstElement * parent)
|
||||
{
|
||||
GstScheduler *sched = NULL;
|
||||
|
||||
g_return_val_if_fail (factory != NULL, NULL);
|
||||
g_return_val_if_fail (GST_IS_ELEMENT (parent), NULL);
|
||||
|
||||
if (gst_plugin_feature_ensure_loaded (GST_PLUGIN_FEATURE (factory))) {
|
||||
g_return_val_if_fail (factory->type != 0, NULL);
|
||||
|
||||
sched = GST_SCHEDULER (g_object_new (factory->type, NULL));
|
||||
gst_object_set_parent (GST_OBJECT (sched), GST_OBJECT (parent));
|
||||
|
||||
GST_ELEMENT_SCHED (parent) = sched;
|
||||
}
|
||||
|
||||
return sched;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_make:
|
||||
* @name: the name of the factory used to create the instance
|
||||
* @parent: the parent element of this scheduler
|
||||
*
|
||||
* Create a new #GstScheduler instance from the
|
||||
* schedulerfactory with the given name and parent. @parent will
|
||||
* have its scheduler set to the returned #GstScheduler instance.
|
||||
* If %NULL is passed as @name, the default scheduler name will
|
||||
* be used.
|
||||
*
|
||||
* Returns: A new #GstScheduler instance with a reference count of %1.
|
||||
*/
|
||||
GstScheduler *
|
||||
gst_scheduler_factory_make (const gchar * name, GstElement * parent)
|
||||
{
|
||||
GstSchedulerFactory *factory;
|
||||
const gchar *default_name = gst_scheduler_factory_get_default_name ();
|
||||
|
||||
if (name)
|
||||
factory = gst_scheduler_factory_find (name);
|
||||
else {
|
||||
/* FIXME: do better error handling */
|
||||
if (default_name == NULL)
|
||||
g_error ("No default scheduler name - do you have a registry ?");
|
||||
factory = gst_scheduler_factory_find (default_name);
|
||||
}
|
||||
|
||||
if (factory == NULL)
|
||||
return NULL;
|
||||
|
||||
return gst_scheduler_factory_create (factory, parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_set_default_name:
|
||||
* @name: the name of the factory used as a default
|
||||
*
|
||||
* Set the default schedulerfactory name.
|
||||
*/
|
||||
void
|
||||
gst_scheduler_factory_set_default_name (const gchar * name)
|
||||
{
|
||||
g_free (_default_name);
|
||||
|
||||
_default_name = g_strdup (name);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_scheduler_factory_get_default_name:
|
||||
*
|
||||
* Get the default schedulerfactory name.
|
||||
*
|
||||
* Returns: the name of the default scheduler.
|
||||
*/
|
||||
const gchar *
|
||||
gst_scheduler_factory_get_default_name (void)
|
||||
{
|
||||
return _default_name;
|
||||
}
|
81
gst/gstschedulerfactory.h
Normal file
81
gst/gstschedulerfactory.h
Normal file
|
@ -0,0 +1,81 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||
* 2000 Wim Taymans <wtay@chello.be>
|
||||
* 2004 Benjamin Otte <otte@gnome.org>
|
||||
*
|
||||
* gstschedulerfactory.h: Header for default scheduler factories
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include <glib.h>
|
||||
#include <gst/gstplugin.h>
|
||||
#include <gst/gstpluginfeature.h>
|
||||
|
||||
#ifndef __GST_SCHEDULER_FACTORY_H__
|
||||
#define __GST_SCHEDULER_FACTORY_H__
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
||||
#define GST_TYPE_SCHEDULER_FACTORY (gst_scheduler_factory_get_type ())
|
||||
#define GST_SCHEDULER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactory))
|
||||
#define GST_IS_SCHEDULER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SCHEDULER_FACTORY))
|
||||
#define GST_SCHEDULER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactoryClass))
|
||||
#define GST_IS_SCHEDULER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SCHEDULER_FACTORY))
|
||||
#define GST_SCHEDULER_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_SCHEDULER_FACTORY, GstSchedulerFactoryClass))
|
||||
|
||||
/* change this to change the default scheduler */
|
||||
/* FIXME: use ranks and determine the best scheduler automagically */
|
||||
#define GST_SCHEDULER_DEFAULT_NAME "simple"
|
||||
|
||||
typedef struct _GstSchedulerFactory GstSchedulerFactory;
|
||||
typedef struct _GstSchedulerFactoryClass GstSchedulerFactoryClass;
|
||||
|
||||
struct _GstSchedulerFactory {
|
||||
GstPluginFeature feature;
|
||||
|
||||
gchar *longdesc; /* long description of the scheduler (well, don't overdo it..) */
|
||||
GType type; /* unique GType of the scheduler */
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
struct _GstSchedulerFactoryClass {
|
||||
GstPluginFeatureClass parent;
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
GType gst_scheduler_factory_get_type (void);
|
||||
|
||||
gboolean gst_scheduler_register (GstPlugin *plugin, const gchar *name,
|
||||
const gchar *longdesc, GType type);
|
||||
GstSchedulerFactory* gst_scheduler_factory_new (const gchar *name, const gchar *longdesc, GType type);
|
||||
|
||||
GstSchedulerFactory* gst_scheduler_factory_find (const gchar *name);
|
||||
|
||||
GstScheduler* gst_scheduler_factory_create (GstSchedulerFactory *factory, GstElement *parent);
|
||||
GstScheduler* gst_scheduler_factory_make (const gchar *name, GstElement *parent);
|
||||
|
||||
void gst_scheduler_factory_set_default_name (const gchar* name);
|
||||
G_CONST_RETURN gchar* gst_scheduler_factory_get_default_name (void);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_SCHEDULER_FACTORY_H__ */
|
|
@ -24,10 +24,13 @@
|
|||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef union _GstAction GstAction;
|
||||
typedef struct _GstObject GstObject;
|
||||
typedef struct _GstObjectClass GstObjectClass;
|
||||
typedef struct _GstPad GstPad;
|
||||
typedef struct _GstPadClass GstPadClass;
|
||||
typedef struct _GstRealPad GstRealPad;
|
||||
typedef struct _GstRealPadClass GstRealPadClass;
|
||||
typedef struct _GstPadTemplate GstPadTemplate;
|
||||
typedef struct _GstPadTemplateClass GstPadTemplateClass;
|
||||
typedef struct _GstElement GstElement;
|
||||
|
@ -37,6 +40,8 @@ typedef struct _GstBinClass GstBinClass;
|
|||
typedef struct _GstScheduler GstScheduler;
|
||||
typedef struct _GstSchedulerClass GstSchedulerClass;
|
||||
typedef struct _GstEvent GstEvent;
|
||||
typedef guint64 GstClockTime;
|
||||
typedef gint64 GstClockTimeDiff;
|
||||
|
||||
typedef enum {
|
||||
GST_STATE_VOID_PENDING = 0,
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
#include <gst/gst_private.h>
|
||||
#include <gst/gstelement.h>
|
||||
#include <gst/gsttypefind.h>
|
||||
#include <gst/gstscheduler.h>
|
||||
#include <gst/gstschedulerfactory.h>
|
||||
#include <gst/gsturi.h>
|
||||
#include <gst/gstinfo.h>
|
||||
#include <gst/gstenumtypes.h>
|
||||
|
|
|
@ -1,82 +1,16 @@
|
|||
if GST_DISABLE_OMEGA_COTHREADS
|
||||
omegaschedulers =
|
||||
omegaschedulers_nola =
|
||||
else
|
||||
omegaschedulers = \
|
||||
libgstbasicomegascheduler.la \
|
||||
libgstentryomegascheduler.la \
|
||||
libgstoptomegascheduler.la
|
||||
omegaschedulers_nola = \
|
||||
libgstbasicomegascheduler \
|
||||
libgstentryomegascheduler \
|
||||
libgstoptomegascheduler
|
||||
endif
|
||||
|
||||
plugin_LTLIBRARIES = \
|
||||
$(omegaschedulers) \
|
||||
libgstbasicgthreadscheduler.la \
|
||||
libgstentrygthreadscheduler.la \
|
||||
libgstoptscheduler.la \
|
||||
libgstoptgthreadscheduler.la \
|
||||
libgstfairgthreadscheduler.la
|
||||
libgstsimplescheduler.la
|
||||
|
||||
AS_LIBTOOL_LIBS = \
|
||||
$(omegaschedulers_nola) \
|
||||
libgstbasicgthreadscheduler \
|
||||
libgstentrygthreadscheduler \
|
||||
libgstoptscheduler \
|
||||
libgstoptgthreadscheduler \
|
||||
libgstfairgthreadscheduler
|
||||
libgstsimplescheduler
|
||||
|
||||
if GST_DISABLE_OMEGA_COTHREADS
|
||||
else
|
||||
libgstbasicomegascheduler_la_SOURCES = gstbasicscheduler.c
|
||||
libgstbasicomegascheduler_la_CFLAGS = $(GST_OBJ_CFLAGS) -D_COTHREADS_OMEGA
|
||||
libgstbasicomegascheduler_la_LIBADD = $(GST_OBJ_LIBS) ../libcothreads.la
|
||||
libgstbasicomegascheduler_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
endif
|
||||
|
||||
libgstbasicgthreadscheduler_la_SOURCES = gstbasicscheduler.c
|
||||
libgstbasicgthreadscheduler_la_CFLAGS = $(GST_OBJ_CFLAGS) -D_COTHREADS_GTHREAD
|
||||
libgstbasicgthreadscheduler_la_LIBADD = $(GST_OBJ_LIBS)
|
||||
libgstbasicgthreadscheduler_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
libgstsimplescheduler_la_SOURCES = gstsimplescheduler.c
|
||||
libgstsimplescheduler_la_CFLAGS = $(GST_OBJ_CFLAGS)
|
||||
libgstsimplescheduler_la_LIBADD = $(GST_OBJ_LIBS)
|
||||
libgstsimplescheduler_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
|
||||
libgstentrygthreadscheduler_la_SOURCES = entryscheduler.c
|
||||
libgstentrygthreadscheduler_la_CFLAGS = $(GST_OBJ_CFLAGS) -D_COTHREADS_GTHREAD
|
||||
libgstentrygthreadscheduler_la_LIBADD = $(GST_OBJ_LIBS)
|
||||
libgstentrygthreadscheduler_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
|
||||
if GST_DISABLE_OMEGA_COTHREADS
|
||||
else
|
||||
libgstentryomegascheduler_la_SOURCES = entryscheduler.c
|
||||
libgstentryomegascheduler_la_CFLAGS = $(GST_OBJ_CFLAGS) -D_COTHREADS_OMEGA
|
||||
libgstentryomegascheduler_la_LIBADD = $(GST_OBJ_LIBS) ../libcothreads.la
|
||||
libgstentryomegascheduler_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
endif
|
||||
|
||||
libgstoptscheduler_la_SOURCES = gstoptimalscheduler.c
|
||||
libgstoptscheduler_la_CFLAGS = $(GST_OBJ_CFLAGS)
|
||||
libgstoptscheduler_la_LIBADD = $(GST_OBJ_LIBS)
|
||||
libgstoptscheduler_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
|
||||
if GST_DISABLE_OMEGA_COTHREADS
|
||||
else
|
||||
libgstoptomegascheduler_la_SOURCES = gstoptimalscheduler.c
|
||||
libgstoptomegascheduler_la_CFLAGS = $(GST_OBJ_CFLAGS) -D_COTHREADS_OMEGA -DUSE_COTHREADS
|
||||
libgstoptomegascheduler_la_LIBADD = $(GST_OBJ_LIBS) ../libcothreads.la
|
||||
libgstoptomegascheduler_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
endif
|
||||
|
||||
libgstoptgthreadscheduler_la_SOURCES = gstoptimalscheduler.c
|
||||
libgstoptgthreadscheduler_la_CFLAGS = $(GST_OBJ_CFLAGS) -D_COTHREADS_GTHREAD -DUSE_COTHREADS
|
||||
libgstoptgthreadscheduler_la_LIBADD = $(GST_OBJ_LIBS)
|
||||
libgstoptgthreadscheduler_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
|
||||
libgstfairgthreadscheduler_la_SOURCES = fairscheduler.c faircothreads.c
|
||||
libgstfairgthreadscheduler_la_CFLAGS = $(GST_OBJ_CFLAGS) -D_COTHREADS_GTHREAD
|
||||
libgstfairgthreadscheduler_la_LIBADD = $(GST_OBJ_LIBS)
|
||||
libgstfairgthreadscheduler_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
|
||||
noinst_HEADERS = cothreads_compat.h gthread-cothreads.h faircothreads.h
|
||||
|
||||
if AS_LIBTOOL_WIN32
|
||||
|
||||
|
@ -106,6 +40,8 @@ as-libtool-uninstall-local:
|
|||
|
||||
endif
|
||||
|
||||
|
||||
|
||||
%.lib: %.def
|
||||
dlltool -S $(CC) -f "-c" --export-all-symbols --input-def \
|
||||
%.def --output-lib %.lib
|
||||
|
@ -117,3 +53,4 @@ endif
|
|||
awk '{ print $$3 }' | \
|
||||
sed 's/^/ /' >>%.def.tmp
|
||||
mv %.def.tmp %.def
|
||||
|
||||
|
|
|
@ -1,79 +0,0 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||
* 2000 Wim Taymans <wtay@chello.be>
|
||||
*
|
||||
* cothreads_compat.h: Compatibility macros between cothreads packages
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/* use the old cothreads implementation in gst/cothreads.[ch] */
|
||||
#if defined(_COTHREADS_OMEGA)
|
||||
|
||||
#include "../cothreads.h"
|
||||
|
||||
/* the name of this cothreads type */
|
||||
#define COTHREADS_TYPE omega
|
||||
#define COTHREADS_NAME "omega"
|
||||
#define COTHREADS_NAME_CAPITAL "Omega"
|
||||
|
||||
/* unify the structs
|
||||
*
|
||||
* "cothread" and "cothread_context" need to be defined
|
||||
*/
|
||||
typedef struct _cothread_state cothread;
|
||||
|
||||
/* define functions
|
||||
* the macros are prepended with "do_"
|
||||
*/
|
||||
#define do_cothreads_init(x) /* NOP */
|
||||
|
||||
#define do_cothreads_stackquery(stack,size) cothread_stackquery(stack,size)
|
||||
|
||||
#define do_cothread_switch(to) cothread_switch(to)
|
||||
|
||||
#define do_cothread_create(new_cothread, context, func, argc, argv) \
|
||||
G_STMT_START{ \
|
||||
new_cothread = cothread_create (context); \
|
||||
if (new_cothread) { \
|
||||
cothread_setfunc (new_cothread, (func), (argc), (argv)); \
|
||||
} \
|
||||
}G_STMT_END
|
||||
|
||||
#define do_cothread_setfunc(cothread, context, func, argc, argv) \
|
||||
cothread_setfunc ((cothread), (func), (argc), (argv))
|
||||
|
||||
#define do_cothread_destroy(cothread) cothread_free(cothread)
|
||||
|
||||
#define do_cothread_context_init() (cothread_context_init ())
|
||||
#define do_cothread_context_destroy(context) cothread_context_free (context)
|
||||
|
||||
#define do_cothread_get_current(context) (cothread_current())
|
||||
#define do_cothread_get_main(context) (cothread_current_main())
|
||||
|
||||
|
||||
|
||||
|
||||
/* use the gthread-based cothreads implementation */
|
||||
#elif defined(_COTHREADS_GTHREAD)
|
||||
|
||||
#include "gthread-cothreads.h"
|
||||
|
||||
|
||||
/* bail out with an error if no cothreads package is defined */
|
||||
#else
|
||||
#error "No cothreads package defined"
|
||||
#endif
|
File diff suppressed because it is too large
Load diff
|
@ -1,615 +0,0 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 2004 Martin Soto <martinsoto@users.sourceforge.net>
|
||||
*
|
||||
* faircothread.c: High level cothread implementation for the fair scheduler.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <gst/gst.h>
|
||||
|
||||
#ifdef _COTHREADS_PTH
|
||||
#include "pth-cothreads.h"
|
||||
#else
|
||||
#include "cothreads_compat.h"
|
||||
#endif
|
||||
|
||||
#include "faircothreads.h"
|
||||
|
||||
#if !defined(GST_DISABLE_GST_DEBUG) && defined(FAIRSCHEDULER_USE_GETTID)
|
||||
#include <sys/types.h>
|
||||
#include <linux/unistd.h>
|
||||
|
||||
_syscall0 (pid_t, gettid)
|
||||
#endif
|
||||
GST_DEBUG_CATEGORY_EXTERN (debug_fair_ct);
|
||||
#define GST_CAT_DEFAULT debug_fair_ct
|
||||
|
||||
|
||||
/*
|
||||
* Support for Asynchronous Operations
|
||||
*/
|
||||
|
||||
enum
|
||||
{
|
||||
ASYNC_OP_CHANGE_STATE = 1,
|
||||
ASYNC_OP_AWAKE
|
||||
};
|
||||
|
||||
typedef struct _AsyncOp AsyncOp;
|
||||
typedef struct _AsyncOpChangeState AsyncOpChangeState;
|
||||
typedef struct _AsyncOpAwake AsyncOpAwake;
|
||||
|
||||
struct _AsyncOp
|
||||
{
|
||||
int type;
|
||||
};
|
||||
|
||||
struct _AsyncOpChangeState
|
||||
{
|
||||
AsyncOp parent;
|
||||
GstFairSchedulerCothread *ct; /* Cothread whose state will be
|
||||
changed. */
|
||||
gint new_state; /* New state for the cothread. */
|
||||
};
|
||||
|
||||
struct _AsyncOpAwake
|
||||
{
|
||||
AsyncOp parent;
|
||||
GstFairSchedulerCothread *ct; /* Cothread to awake. */
|
||||
gint priority; /* Priority for the cothread. */
|
||||
};
|
||||
|
||||
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
static gchar *gst_fairscheduler_ct_state_names[] = {
|
||||
"stopped",
|
||||
"suspended",
|
||||
"running"
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Helpers
|
||||
*/
|
||||
|
||||
static int
|
||||
cothread_base_func (int argc, char **argv)
|
||||
{
|
||||
GstFairSchedulerCothread *ct;
|
||||
|
||||
g_return_val_if_fail (argc >= 1, -1);
|
||||
|
||||
ct = (GstFairSchedulerCothread *) argv[0];
|
||||
|
||||
GST_INFO ("queue %p: Cothread %p starting", ct->queue, ct);
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
#ifdef FAIRSCHEDULER_USE_GETTID
|
||||
ct->pid = gettid ();
|
||||
#else
|
||||
ct->pid = 0;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Call the thread function. This looks sort of funny, but there's
|
||||
no other way I know of doing it. */
|
||||
switch (argc - 1) {
|
||||
case 0:
|
||||
ct->func (ct, NULL);
|
||||
break;
|
||||
case 1:
|
||||
ct->func (ct, argv[1], NULL);
|
||||
break;
|
||||
case 2:
|
||||
ct->func (ct, argv[1], argv[2], NULL);
|
||||
break;
|
||||
case 3:
|
||||
ct->func (ct, argv[1], argv[2], argv[3], NULL);
|
||||
break;
|
||||
case 4:
|
||||
ct->func (ct, argv[1], argv[2], argv[3], argv[4], NULL);
|
||||
break;
|
||||
case 5:
|
||||
ct->func (ct, argv[1], argv[2], argv[3], argv[4], argv[5], NULL);
|
||||
break;
|
||||
case 6:
|
||||
ct->func (ct, argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], NULL);
|
||||
break;
|
||||
case 7:
|
||||
ct->func (ct, argv[1], argv[2], argv[3], argv[4], argv[5],
|
||||
argv[6], argv[7], NULL);
|
||||
break;
|
||||
default:
|
||||
g_return_val_if_reached (-1);
|
||||
break;
|
||||
}
|
||||
|
||||
/* After the cothread function is finished, we go to the stopped
|
||||
state. */
|
||||
gst_fair_scheduler_cothread_change_state (ct,
|
||||
GST_FAIRSCHEDULER_CTSTATE_STOPPED);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cothread_activate (GstFairSchedulerCothread * ct, gint priority)
|
||||
{
|
||||
GST_DEBUG ("queue %p: activating cothread %p", ct->queue, ct);
|
||||
|
||||
if (priority > 0) {
|
||||
g_queue_push_head (ct->queue->ct_queue, ct);
|
||||
} else {
|
||||
g_queue_push_tail (ct->queue->ct_queue, ct);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cothread_deactivate (GstFairSchedulerCothread * ct)
|
||||
{
|
||||
GList *node;
|
||||
|
||||
GST_DEBUG ("queue %p: deactivating cothread %p", ct->queue, ct);
|
||||
|
||||
/* Find the node. */
|
||||
node = g_list_find (ct->queue->ct_queue->head, ct);
|
||||
if (node == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (node->next == NULL) {
|
||||
g_queue_pop_tail (ct->queue->ct_queue);
|
||||
} else {
|
||||
ct->queue->ct_queue->head =
|
||||
g_list_remove_link (ct->queue->ct_queue->head, node);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
queue_async_op (GstFairSchedulerCothreadQueue * queue, AsyncOp * op)
|
||||
{
|
||||
g_mutex_lock (queue->async_mutex);
|
||||
g_queue_push_tail (queue->async_queue, op);
|
||||
g_cond_signal (queue->new_async_op);
|
||||
g_mutex_unlock (queue->async_mutex);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Cothreads API
|
||||
*/
|
||||
|
||||
extern GstFairSchedulerCothreadQueue *
|
||||
gst_fair_scheduler_cothread_queue_new (void)
|
||||
{
|
||||
GstFairSchedulerCothreadQueue *new;
|
||||
|
||||
new = g_malloc (sizeof (GstFairSchedulerCothreadQueue));
|
||||
|
||||
new->context = NULL;
|
||||
new->ct_queue = g_queue_new ();
|
||||
|
||||
new->async_queue = g_queue_new ();
|
||||
new->async_mutex = g_mutex_new ();
|
||||
new->new_async_op = g_cond_new ();
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_queue_destroy (GstFairSchedulerCothreadQueue *
|
||||
queue)
|
||||
{
|
||||
GList *iter;
|
||||
|
||||
/* Destroy all remaining cothreads. */
|
||||
for (iter = queue->ct_queue->head; iter != NULL; iter = iter->next) {
|
||||
gst_fair_scheduler_cothread_destroy (
|
||||
(GstFairSchedulerCothread *) iter->data);
|
||||
}
|
||||
g_queue_free (queue->ct_queue);
|
||||
|
||||
for (iter = queue->async_queue->head; iter != NULL; iter = iter->next) {
|
||||
g_free (iter->data);
|
||||
}
|
||||
g_queue_free (queue->async_queue);
|
||||
|
||||
g_mutex_free (queue->async_mutex);
|
||||
g_cond_free (queue->new_async_op);
|
||||
|
||||
g_free (queue);
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_queue_start (GstFairSchedulerCothreadQueue * queue)
|
||||
{
|
||||
if (queue->context == NULL) {
|
||||
do_cothreads_init (NULL);
|
||||
queue->context = do_cothread_context_init ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_queue_stop (GstFairSchedulerCothreadQueue * queue)
|
||||
{
|
||||
if (queue->context != NULL) {
|
||||
do_cothread_context_destroy (queue->context);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
gboolean
|
||||
gst_fair_scheduler_cothread_queue_iterate (GstFairSchedulerCothreadQueue *
|
||||
queue)
|
||||
{
|
||||
GstFairSchedulerCothread *ct;
|
||||
|
||||
g_return_val_if_fail (queue->context != NULL, FALSE);
|
||||
|
||||
GST_LOG ("queue %p: iterating", queue);
|
||||
|
||||
/* Perform any pending asynchronous operations. Checking the queue
|
||||
is safe and more efficient without locking the mutex. */
|
||||
if (!g_queue_is_empty (queue->async_queue)) {
|
||||
AsyncOp *basic_op;
|
||||
|
||||
GST_LOG ("queue %p: processing asynchronous operations", queue);
|
||||
|
||||
g_mutex_lock (queue->async_mutex);
|
||||
|
||||
while (!g_queue_is_empty (queue->async_queue)) {
|
||||
basic_op = (AsyncOp *) g_queue_pop_head (queue->async_queue);
|
||||
|
||||
switch (basic_op->type) {
|
||||
case ASYNC_OP_CHANGE_STATE:
|
||||
{
|
||||
AsyncOpChangeState *op = (AsyncOpChangeState *) basic_op;
|
||||
|
||||
gst_fair_scheduler_cothread_change_state (op->ct, op->new_state);
|
||||
}
|
||||
break;
|
||||
case ASYNC_OP_AWAKE:
|
||||
{
|
||||
AsyncOpAwake *op = (AsyncOpAwake *) basic_op;
|
||||
|
||||
gst_fair_scheduler_cothread_awake (op->ct, op->priority);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_return_val_if_reached (FALSE);
|
||||
break;
|
||||
}
|
||||
|
||||
g_free (basic_op);
|
||||
}
|
||||
|
||||
g_mutex_unlock (queue->async_mutex);
|
||||
}
|
||||
|
||||
/* First cothread in the queue (if any) should get control. */
|
||||
ct = g_queue_peek_head (queue->ct_queue);
|
||||
|
||||
if (ct == NULL) {
|
||||
GTimeVal timeout;
|
||||
|
||||
g_get_current_time (&timeout);
|
||||
g_time_val_add (&timeout, 5000);
|
||||
|
||||
/* No cothread available, wait until some other thread queues an
|
||||
operation. */
|
||||
g_mutex_lock (queue->async_mutex);
|
||||
g_cond_timed_wait (queue->new_async_op, queue->async_mutex, &timeout);
|
||||
g_mutex_unlock (queue->async_mutex);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_return_val_if_fail (ct->state == GST_FAIRSCHEDULER_CTSTATE_RUNNING, FALSE);
|
||||
|
||||
/* Check for a cothread mutex. */
|
||||
if (ct->mutex != NULL) {
|
||||
g_mutex_lock (ct->mutex);
|
||||
ct->mutex = NULL;
|
||||
}
|
||||
|
||||
GST_LOG ("queue %p: giving control to %p", queue, ct);
|
||||
|
||||
/* Handle control to the cothread. */
|
||||
do_cothread_switch (ct->execst);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gst_fair_scheduler_cothread_queue_show (GstFairSchedulerCothreadQueue * queue)
|
||||
{
|
||||
GList *iter;
|
||||
GstFairSchedulerCothread *ct;
|
||||
|
||||
g_print ("\n Running cothreads (last is active):\n");
|
||||
|
||||
for (iter = queue->ct_queue->tail; iter != NULL; iter = iter->prev) {
|
||||
ct = (GstFairSchedulerCothread *) iter->data;
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
g_print (" %p: %s (%d)\n", ct, ct->readable_name->str, ct->pid);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GstFairSchedulerCothread *
|
||||
gst_fair_scheduler_cothread_new (GstFairSchedulerCothreadQueue * queue,
|
||||
GstFairSchedulerCtFunc function, gpointer first_arg, ...)
|
||||
{
|
||||
GstFairSchedulerCothread *new;
|
||||
va_list ap;
|
||||
gpointer arg;
|
||||
|
||||
new = g_malloc (sizeof (GstFairSchedulerCothread));
|
||||
|
||||
new->queue = queue;
|
||||
new->func = function;
|
||||
|
||||
/* The first parameter is always the cothread structure itself. */
|
||||
new->argv[0] = (char *) new;
|
||||
new->argc = 1;
|
||||
|
||||
/* Store the parameters. */
|
||||
va_start (ap, first_arg);
|
||||
arg = first_arg;
|
||||
while (new->argc < GST_FAIRSCHEDULER_MAX_CTARGS && arg != NULL) {
|
||||
new->argv[new->argc] = (char *) arg;
|
||||
new->argc++;
|
||||
arg = va_arg (ap, gpointer);
|
||||
}
|
||||
|
||||
/* Make sure we don't have more parameters than we can handle. */
|
||||
g_return_val_if_fail (arg == NULL, NULL);
|
||||
|
||||
/* Creation of the actual execution state is defered to transition
|
||||
to running/suspended. */
|
||||
new->execst = NULL;
|
||||
|
||||
/* All cothreads are created in the stopped state. */
|
||||
new->state = GST_FAIRSCHEDULER_CTSTATE_STOPPED;
|
||||
|
||||
new->mutex = NULL;
|
||||
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
new->readable_name = g_string_new ("");
|
||||
new->pid = 0;
|
||||
#endif
|
||||
|
||||
GST_DEBUG ("queue %p: cothread %p created", queue, new);
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gst_fair_scheduler_cothread_destroy (GstFairSchedulerCothread * ct)
|
||||
{
|
||||
GST_DEBUG ("queue %p: destroying cothread %p", ct->queue, ct);
|
||||
|
||||
if (ct->state != GST_FAIRSCHEDULER_CTSTATE_STOPPED) {
|
||||
cothread_deactivate (ct);
|
||||
}
|
||||
|
||||
if (ct->execst != NULL) {
|
||||
do_cothread_destroy (ct->execst);
|
||||
}
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
g_string_free (ct->readable_name, TRUE);
|
||||
#endif
|
||||
|
||||
g_free (ct);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gst_fair_scheduler_cothread_change_state (GstFairSchedulerCothread * ct,
|
||||
gint new_state)
|
||||
{
|
||||
if (new_state == ct->state) {
|
||||
return;
|
||||
}
|
||||
|
||||
GST_DEBUG ("queue %p: changing state of %p from %s to %s", ct->queue, ct,
|
||||
gst_fairscheduler_ct_state_names[ct->state],
|
||||
gst_fairscheduler_ct_state_names[new_state]);
|
||||
|
||||
switch (ct->state) {
|
||||
case GST_FAIRSCHEDULER_CTSTATE_STOPPED:
|
||||
/* (Re)Initialize the cothread. */
|
||||
if (ct->execst == NULL) {
|
||||
/* Initialize cothread's execution state. */
|
||||
do_cothread_create (ct->execst, ct->queue->context,
|
||||
cothread_base_func, ct->argc, ct->argv);
|
||||
GST_LOG_OBJECT (ct->queue,
|
||||
"cothread %p has exec state %p", ct, ct->execst);
|
||||
} else {
|
||||
/* Reset cothread's execution state. */
|
||||
do_cothread_setfunc (ct->execst, ct->queue->context,
|
||||
cothread_base_func, ct->argc, ct->argv);
|
||||
}
|
||||
|
||||
ct->sleeping = FALSE;
|
||||
|
||||
if (new_state == GST_FAIRSCHEDULER_CTSTATE_RUNNING) {
|
||||
cothread_activate (ct, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case GST_FAIRSCHEDULER_CTSTATE_RUNNING:
|
||||
if (!ct->sleeping) {
|
||||
cothread_deactivate (ct);
|
||||
}
|
||||
break;
|
||||
|
||||
case GST_FAIRSCHEDULER_CTSTATE_SUSPENDED:
|
||||
if (new_state == GST_FAIRSCHEDULER_CTSTATE_RUNNING && !ct->sleeping) {
|
||||
cothread_activate (ct, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
ct->state = new_state;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gst_fair_scheduler_cothread_change_state_async (GstFairSchedulerCothread * ct,
|
||||
gint new_state)
|
||||
{
|
||||
AsyncOpChangeState *op;
|
||||
|
||||
/* Queue an asynchronous operation. */
|
||||
op = g_new (AsyncOpChangeState, 1);
|
||||
op->parent.type = ASYNC_OP_CHANGE_STATE;
|
||||
op->ct = ct;
|
||||
op->new_state = new_state;
|
||||
|
||||
queue_async_op (ct->queue, (AsyncOp *) op);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gst_fair_scheduler_cothread_sleep (GstFairSchedulerCothreadQueue * queue)
|
||||
{
|
||||
gst_fair_scheduler_cothread_sleep_mutex (queue, NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Go to sleep but unblock the mutex while sleeping.
|
||||
*/
|
||||
void
|
||||
gst_fair_scheduler_cothread_sleep_mutex (GstFairSchedulerCothreadQueue * queue,
|
||||
GMutex * mutex)
|
||||
{
|
||||
GstFairSchedulerCothread *ct;
|
||||
|
||||
g_return_if_fail (queue->context != NULL);
|
||||
|
||||
/* The sleep operation can be invoked when the cothread is already
|
||||
deactivated. */
|
||||
ct = gst_fair_scheduler_cothread_current (queue);
|
||||
if (ct != NULL && ct->execst == do_cothread_get_current (queue->context)) {
|
||||
ct = g_queue_pop_head (queue->ct_queue);
|
||||
ct->sleeping = TRUE;
|
||||
}
|
||||
|
||||
ct->mutex = mutex;
|
||||
if (mutex != NULL) {
|
||||
g_mutex_unlock (mutex);
|
||||
}
|
||||
|
||||
GST_LOG ("queue %p: cothread going to sleep", queue);
|
||||
|
||||
/* Switch back to the main cothread. */
|
||||
do_cothread_switch (do_cothread_get_main (queue->context));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gst_fair_scheduler_cothread_yield (GstFairSchedulerCothreadQueue * queue)
|
||||
{
|
||||
gst_fair_scheduler_cothread_yield_mutex (queue, NULL);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gst_fair_scheduler_cothread_yield_mutex (GstFairSchedulerCothreadQueue * queue,
|
||||
GMutex * mutex)
|
||||
{
|
||||
GstFairSchedulerCothread *ct;
|
||||
|
||||
g_return_if_fail (queue->context != NULL);
|
||||
|
||||
/* The yield operation can be invoked when the cothread is already
|
||||
deactivated. */
|
||||
ct = gst_fair_scheduler_cothread_current (queue);
|
||||
if (ct != NULL && ct->execst == do_cothread_get_current (queue->context)) {
|
||||
ct = g_queue_pop_head (queue->ct_queue);
|
||||
g_queue_push_tail (queue->ct_queue, ct);
|
||||
}
|
||||
|
||||
ct->mutex = mutex;
|
||||
if (mutex != NULL) {
|
||||
g_mutex_unlock (mutex);
|
||||
}
|
||||
|
||||
GST_LOG ("queue %p: cothread yielding control", queue);
|
||||
|
||||
/* Switch back to the main cothread. */
|
||||
do_cothread_switch (do_cothread_get_main (queue->context));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gst_fair_scheduler_cothread_awake (GstFairSchedulerCothread * ct, gint priority)
|
||||
{
|
||||
g_return_if_fail (ct->state != GST_FAIRSCHEDULER_CTSTATE_STOPPED);
|
||||
|
||||
if (!ct->sleeping) {
|
||||
/* Cothread is already awake. */
|
||||
return;
|
||||
}
|
||||
|
||||
ct->sleeping = FALSE;
|
||||
|
||||
if (ct->state == GST_FAIRSCHEDULER_CTSTATE_RUNNING) {
|
||||
cothread_activate (ct, priority);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gst_fair_scheduler_cothread_awake_async (GstFairSchedulerCothread * ct,
|
||||
gint priority)
|
||||
{
|
||||
AsyncOpAwake *op;
|
||||
|
||||
/* Queue an asynchronous operation. */
|
||||
op = g_new (AsyncOpAwake, 1);
|
||||
op->parent.type = ASYNC_OP_AWAKE;
|
||||
op->ct = ct;
|
||||
op->priority = priority;
|
||||
|
||||
queue_async_op (ct->queue, (AsyncOp *) op);
|
||||
}
|
||||
|
||||
|
||||
GstFairSchedulerCothread *
|
||||
gst_fair_scheduler_cothread_current (GstFairSchedulerCothreadQueue * queue)
|
||||
{
|
||||
return g_queue_peek_head (queue->ct_queue);
|
||||
}
|
|
@ -1,163 +0,0 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 2004 Martin Soto <martinsoto@users.sourceforge.net>
|
||||
*
|
||||
* faircothread.h: High level cothread implementation for the fair scheduler.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __FAIRCOTHREADS_H__
|
||||
#define __FAIRCOTHREADS_H__
|
||||
|
||||
|
||||
#ifdef _COTHREADS_PTH
|
||||
#include "pth-cothreads.h"
|
||||
#else
|
||||
#define GTHREAD_COTHREADS_NO_DEFINITIONS
|
||||
#include "cothreads_compat.h"
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct _GstFairSchedulerCothread GstFairSchedulerCothread;
|
||||
typedef struct _GstFairSchedulerCothreadQueue GstFairSchedulerCothreadQueue;
|
||||
|
||||
/* Possible states of a cothread. */
|
||||
enum
|
||||
{
|
||||
GST_FAIRSCHEDULER_CTSTATE_STOPPED,
|
||||
GST_FAIRSCHEDULER_CTSTATE_SUSPENDED,
|
||||
GST_FAIRSCHEDULER_CTSTATE_RUNNING,
|
||||
};
|
||||
|
||||
/* Maximum number of cothread parameters. */
|
||||
#define GST_FAIRSCHEDULER_MAX_CTARGS 7
|
||||
|
||||
/* Cothread function type. */
|
||||
typedef void (*GstFairSchedulerCtFunc) (GstFairSchedulerCothread * ct,
|
||||
gpointer first_arg, ...);
|
||||
|
||||
struct _GstFairSchedulerCothread {
|
||||
GstFairSchedulerCothreadQueue *queue;
|
||||
/* Cothread queue this cothread
|
||||
belongs to. */
|
||||
GstFairSchedulerCtFunc func; /* Cothread function. */
|
||||
char *argv[1 + GST_FAIRSCHEDULER_MAX_CTARGS]; /*
|
||||
Arguments for the cothread function.
|
||||
argv[0] is always the cothread
|
||||
object itself. */
|
||||
int argc; /* Number of stored parameters. */
|
||||
|
||||
cothread *execst; /* Execution state for this cothread. */
|
||||
gint state; /* Current cothread state. */
|
||||
gboolean sleeping; /* Is this cothread sleeping? */
|
||||
|
||||
GMutex *mutex; /* If not null, a mutex to lock before
|
||||
giving control to this cothread. */
|
||||
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
GString *readable_name; /* Readable name for this cothread. */
|
||||
gint pid; /* Process or thread id associated to
|
||||
this cothread. */
|
||||
#endif
|
||||
};
|
||||
|
||||
struct _GstFairSchedulerCothreadQueue {
|
||||
cothread_context *context; /* Cothread context. */
|
||||
GQueue *ct_queue; /* Queue of currently running
|
||||
cothreads. New cothreads are pushed
|
||||
on the tail. If a cothread is
|
||||
executing, it is the one in the
|
||||
head. */
|
||||
|
||||
/* Asynchronous support. */
|
||||
GQueue *async_queue; /* Queue storing asynchronous
|
||||
operations (operations on the queue
|
||||
requested potentially from other
|
||||
threads. */
|
||||
GMutex *async_mutex; /* Mutex to protect acceses to
|
||||
async_queue. */
|
||||
GCond *new_async_op; /* Condition variable to signal the
|
||||
presence of a new asynchronous
|
||||
operation in the queue. */
|
||||
};
|
||||
|
||||
|
||||
extern GstFairSchedulerCothreadQueue *
|
||||
gst_fair_scheduler_cothread_queue_new (void);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_queue_destroy (
|
||||
GstFairSchedulerCothreadQueue * queue);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_queue_start (
|
||||
GstFairSchedulerCothreadQueue * queue);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_queue_stop (
|
||||
GstFairSchedulerCothreadQueue * queue);
|
||||
|
||||
extern gboolean
|
||||
gst_fair_scheduler_cothread_queue_iterate (
|
||||
GstFairSchedulerCothreadQueue * queue);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_queue_show (
|
||||
GstFairSchedulerCothreadQueue * queue);
|
||||
|
||||
|
||||
extern GstFairSchedulerCothread *
|
||||
gst_fair_scheduler_cothread_new (GstFairSchedulerCothreadQueue * queue,
|
||||
GstFairSchedulerCtFunc function, gpointer first_arg, ...);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_destroy (GstFairSchedulerCothread * ct);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_change_state (GstFairSchedulerCothread * ct,
|
||||
gint new_state);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_change_state_async (
|
||||
GstFairSchedulerCothread * ct, gint new_state);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_sleep (GstFairSchedulerCothreadQueue * queue);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_sleep_mutex (
|
||||
GstFairSchedulerCothreadQueue * queue, GMutex * mutex);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_yield (GstFairSchedulerCothreadQueue * queue);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_yield_mutex (
|
||||
GstFairSchedulerCothreadQueue * queue, GMutex * mutex);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_awake (GstFairSchedulerCothread * ct,
|
||||
gint priority);
|
||||
|
||||
extern void
|
||||
gst_fair_scheduler_cothread_awake_async (GstFairSchedulerCothread * ct,
|
||||
gint priority);
|
||||
|
||||
extern GstFairSchedulerCothread *
|
||||
gst_fair_scheduler_cothread_current (GstFairSchedulerCothreadQueue * queue);
|
||||
|
||||
|
||||
#endif /* __FAIRCOTHREADS_H__ */
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
474
gst/schedulers/gstsimplescheduler.c
Normal file
474
gst/schedulers/gstsimplescheduler.c
Normal file
|
@ -0,0 +1,474 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
|
||||
*
|
||||
* gstsimplesimple_scheduler.c: A simple_scheduler as simple as possible
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "gst/gst_private.h"
|
||||
|
||||
#include <gst/gst.h>
|
||||
|
||||
/*** GstCheckSource ***/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GSource source;
|
||||
GSourceFunc check;
|
||||
gpointer check_data;
|
||||
} GstCheckSource;
|
||||
|
||||
static gboolean
|
||||
gst_check_prepare (GSource * source, gint * timeout)
|
||||
{
|
||||
GstCheckSource *s = (GstCheckSource *) source;
|
||||
|
||||
if (s->check (s->check_data)) {
|
||||
*timeout = 0;
|
||||
return TRUE;
|
||||
} else {
|
||||
*timeout = -1;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_check_check (GSource * source)
|
||||
{
|
||||
GstCheckSource *s = (GstCheckSource *) source;
|
||||
|
||||
if (s->check (s->check_data)) {
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_check_dispatch (GSource * source, GSourceFunc callback, gpointer user_data)
|
||||
{
|
||||
if (!callback) {
|
||||
g_warning ("Check source dispatched without callback\n"
|
||||
"You must call g_source_set_callback().");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return callback (user_data);
|
||||
}
|
||||
|
||||
static GSourceFuncs gst_check_funcs = {
|
||||
gst_check_prepare,
|
||||
gst_check_check,
|
||||
gst_check_dispatch,
|
||||
NULL
|
||||
};
|
||||
|
||||
GSource *
|
||||
gst_check_source_new (GSourceFunc check, gpointer check_data)
|
||||
{
|
||||
GSource *source;
|
||||
|
||||
g_return_val_if_fail (check, NULL);
|
||||
source = g_source_new (&gst_check_funcs, sizeof (GstCheckSource));
|
||||
((GstCheckSource *) source)->check = check;
|
||||
((GstCheckSource *) source)->check_data = check_data;
|
||||
|
||||
return source;
|
||||
}
|
||||
|
||||
/*** the scheduler ***/
|
||||
|
||||
/*
|
||||
GST_DEBUG_CATEGORY_STATIC (sched_debug, "simplescheduler", GST_DEBUG_BOLD,
|
||||
"the simplest possible scheduler");
|
||||
#define GST_CAT_DEFAULT sched_debug
|
||||
*/
|
||||
|
||||
#define GST_TYPE_SIMPLE_SCHEDULER (gst_simple_scheduler_get_type ())
|
||||
#define GST_SIMPLE_SCHEDULER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SIMPLE_SCHEDULER, GstSimpleScheduler))
|
||||
#define GST_IS_SIMPLE_SCHEDULER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SIMPLE_SCHEDULER))
|
||||
#define GST_SIMPLE_SCHEDULER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SIMPLE_SCHEDULER,GstSimpleSchedulerClass))
|
||||
#define GST_IS_SIMPLE_SCHEDULER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SIMPLE_SCHEDULER))
|
||||
#define GST_SIMPLE_SCHEDULER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_SIMPLE_SCHEDULER, GstSimpleSchedulerClass))
|
||||
|
||||
typedef struct _GstSimpleScheduler GstSimpleScheduler;
|
||||
typedef struct _GstSimpleSchedulerClass GstSimpleSchedulerClass;
|
||||
|
||||
struct _GstSimpleScheduler
|
||||
{
|
||||
GstScheduler object;
|
||||
|
||||
GHashTable *sources_for_actions;
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
struct _GstSimpleSchedulerClass
|
||||
{
|
||||
GstSchedulerClass parent_class;
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
|
||||
static void gst_simple_scheduler_class_init (GstSimpleSchedulerClass * klass);
|
||||
static void gst_simple_scheduler_init (GstSimpleScheduler * sched);
|
||||
static void gst_simple_scheduler_finalize (GObject * object);
|
||||
|
||||
static void gst_simple_scheduler_add_action (GstScheduler * scheduler,
|
||||
GstAction * action);
|
||||
static void gst_simple_scheduler_remove_action (GstScheduler * scheduler,
|
||||
GstAction * action);
|
||||
static void gst_simple_scheduler_pad_push (GstScheduler * scheduler,
|
||||
GstRealPad * pad, GstData * data);
|
||||
static void gst_simple_scheduler_toggle_active (GstScheduler * scheduler,
|
||||
GstAction * action);
|
||||
static void gst_simple_scheduler_update_values (GstScheduler * scheduler,
|
||||
GstAction * action);
|
||||
|
||||
GstSchedulerClass *parent_class;
|
||||
|
||||
GType
|
||||
gst_simple_scheduler_get_type (void)
|
||||
{
|
||||
static GType _gst_simple_scheduler_type = 0;
|
||||
|
||||
if (!_gst_simple_scheduler_type) {
|
||||
static const GTypeInfo simple_scheduler_info = {
|
||||
sizeof (GstSimpleSchedulerClass),
|
||||
NULL,
|
||||
NULL,
|
||||
(GClassInitFunc) gst_simple_scheduler_class_init,
|
||||
NULL,
|
||||
NULL,
|
||||
sizeof (GstSimpleScheduler),
|
||||
0,
|
||||
(GInstanceInitFunc) gst_simple_scheduler_init,
|
||||
NULL
|
||||
};
|
||||
|
||||
_gst_simple_scheduler_type =
|
||||
g_type_register_static (GST_TYPE_SCHEDULER, "GstSimpleScheduler",
|
||||
&simple_scheduler_info, 0);
|
||||
}
|
||||
return _gst_simple_scheduler_type;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_class_init (GstSimpleSchedulerClass * klass)
|
||||
{
|
||||
GObjectClass *object = G_OBJECT_CLASS (klass);
|
||||
GstSchedulerClass *sched = GST_SCHEDULER_CLASS (klass);
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
object->finalize = gst_simple_scheduler_finalize;
|
||||
|
||||
sched->add_action = gst_simple_scheduler_add_action;
|
||||
sched->remove_action = gst_simple_scheduler_remove_action;
|
||||
sched->pad_push = gst_simple_scheduler_pad_push;
|
||||
sched->toggle_active = gst_simple_scheduler_toggle_active;
|
||||
sched->update_values = gst_simple_scheduler_update_values;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_init (GstSimpleScheduler * sched)
|
||||
{
|
||||
sched->sources_for_actions = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||
}
|
||||
|
||||
#ifndef G_DISABLE_ASSERT
|
||||
static void
|
||||
print_all_actions (gpointer key, gpointer value, gpointer unused)
|
||||
{
|
||||
GstAction *action = key;
|
||||
gchar *str = gst_action_to_string (action);
|
||||
|
||||
g_print (" action %p: %s --- source %p\n", action, str, value);
|
||||
g_free (str);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_finalize (GObject * object)
|
||||
{
|
||||
GstSimpleScheduler *sched = GST_SIMPLE_SCHEDULER (object);
|
||||
|
||||
/* all actions must have been removed by the scheduler's parent before
|
||||
* disposing */
|
||||
#ifndef G_DISABLE_ASSERT
|
||||
if (g_hash_table_size (sched->sources_for_actions) != 0) {
|
||||
g_printerr ("scheduler %p has %u items left:\n", sched,
|
||||
g_hash_table_size (sched->sources_for_actions));
|
||||
g_hash_table_foreach (sched->sources_for_actions, print_all_actions, NULL);
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
#endif
|
||||
g_hash_table_destroy (sched->sources_for_actions);
|
||||
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
release_wakeup_cb (gpointer data)
|
||||
{
|
||||
GstAction *action = data;
|
||||
|
||||
gst_action_wakeup_release (action);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
timeout_elapsed_cb (gpointer data)
|
||||
{
|
||||
GstAction *action = data;
|
||||
|
||||
#ifndef G_DISABLE_CHECKS
|
||||
GstClockTime time = gst_element_get_time (action->any.element);
|
||||
|
||||
if (action->wait.time > time) {
|
||||
GST_WARNING ("time on element %s is %" GST_TIME_FORMAT " too short (it's %"
|
||||
GST_TIME_FORMAT ".\n", GST_ELEMENT_NAME (action->wait.element),
|
||||
GST_TIME_ARGS (action->wait.time - time), GST_TIME_ARGS (time));
|
||||
}
|
||||
#endif
|
||||
gst_action_wait_release (action);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
release_fd_cb (GIOChannel * source, GIOCondition condition, gpointer data)
|
||||
{
|
||||
GstAction *action = data;
|
||||
|
||||
gst_action_fd_release (action, condition);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
push_cb (gpointer action)
|
||||
{
|
||||
GstRealPad *pad = gst_action_get_pad (action);
|
||||
GstData *data;
|
||||
|
||||
GST_LOG ("pushing on %s:%s...", GST_DEBUG_PAD_NAME (pad));
|
||||
if (GST_RPAD_PEER (pad)) {
|
||||
GstRealPad *peer = GST_RPAD_PEER (pad);
|
||||
|
||||
g_assert (peer->sched_private); /* FIXME: relinking in callback? */
|
||||
data = ((GList *) peer->sched_private)->data;
|
||||
peer->sched_private = g_list_remove (peer->sched_private, data);
|
||||
if (peer->sched_private)
|
||||
GST_ERROR ("pad %s:%s had multiple (%u) GstData queued.",
|
||||
GST_DEBUG_PAD_NAME (peer), g_list_length (peer->sched_private) + 1);
|
||||
} else {
|
||||
data = GST_DATA (gst_event_new (GST_EVENT_EOS));
|
||||
}
|
||||
gst_action_release_sink_pad (action, data);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_do_push (GstRealPad * pad, GstData * data)
|
||||
{
|
||||
g_assert (GST_PAD_IS_SRC (pad));
|
||||
if (!GST_PAD_PEER (pad)) {
|
||||
g_assert (pad->sched_private == NULL);
|
||||
gst_data_unref (data);
|
||||
return;
|
||||
}
|
||||
pad->sched_private = g_list_append (pad->sched_private, data);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
pull_cb (gpointer action)
|
||||
{
|
||||
GstData *data;
|
||||
GstRealPad *pad = gst_action_get_pad (action);
|
||||
GstScheduler *sched;
|
||||
|
||||
GST_LOG ("pulling...");
|
||||
gst_object_ref (pad);
|
||||
sched = gst_pad_get_scheduler (GST_PAD (pad));
|
||||
data = gst_action_release_src_pad (action);
|
||||
if (sched == gst_pad_get_scheduler (GST_PAD (pad)))
|
||||
gst_simple_scheduler_do_push (pad, data);
|
||||
gst_object_unref (pad);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
check_no_data (gpointer action)
|
||||
{
|
||||
return !(gst_action_get_element (action)->sched_private);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
check_no_data_srcpad (gpointer action)
|
||||
{
|
||||
return !(gst_action_get_pad (action)->sched_private);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
check_data_sinkpad (gpointer action)
|
||||
{
|
||||
GstRealPad *pad = gst_action_get_pad (action);
|
||||
|
||||
if (!GST_RPAD_PEER (pad))
|
||||
return TRUE;
|
||||
return GST_RPAD_PEER (pad)->sched_private != NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_activate_action (GstScheduler * scheduler,
|
||||
GstAction * action)
|
||||
{
|
||||
GSource *source;
|
||||
GstSimpleScheduler *sched = GST_SIMPLE_SCHEDULER (scheduler);
|
||||
|
||||
g_assert (gst_action_is_active (action));
|
||||
switch (action->type) {
|
||||
case GST_ACTION_WAKEUP:
|
||||
source = gst_check_source_new (check_no_data, action);
|
||||
g_source_set_priority (source, G_PRIORITY_DEFAULT);
|
||||
g_source_set_callback (source, release_wakeup_cb, action, NULL);
|
||||
break;
|
||||
case GST_ACTION_SRC_PAD:
|
||||
source = gst_check_source_new (check_no_data_srcpad, action);
|
||||
g_source_set_callback (source, pull_cb, action, NULL);
|
||||
break;
|
||||
case GST_ACTION_SINK_PAD:
|
||||
source = gst_check_source_new (check_data_sinkpad, action);
|
||||
g_source_set_callback (source, push_cb, action, NULL);
|
||||
break;
|
||||
case GST_ACTION_FD:
|
||||
{
|
||||
GIOChannel *channel = g_io_channel_unix_new (action->fd.fd);
|
||||
|
||||
source = g_io_create_watch (channel, action->fd.condition);
|
||||
g_source_set_callback (source, (GSourceFunc) release_fd_cb, action, NULL);
|
||||
g_io_channel_unref (channel);
|
||||
}
|
||||
break;
|
||||
case GST_ACTION_WAIT:
|
||||
{
|
||||
GstClockTime time = gst_element_get_time (action->any.element);
|
||||
|
||||
GST_LOG_OBJECT (sched,
|
||||
"time is %" GST_TIME_FORMAT ", waiting for %" GST_TIME_FORMAT "\n",
|
||||
GST_TIME_ARGS (time), GST_TIME_ARGS (action->wait.time));
|
||||
if (action->wait.time > time) {
|
||||
time = action->wait.time - time;
|
||||
/* FIXME: make this adjustable by the element's clock */
|
||||
} else {
|
||||
time = 0;
|
||||
}
|
||||
source = g_timeout_source_new (time / (GST_SECOND / 1000));
|
||||
g_source_set_callback (source, timeout_elapsed_cb, action, NULL);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
}
|
||||
/* FIXME: LEAKS */
|
||||
GST_DEBUG_OBJECT (sched, "adding source %p for action %s\n", source,
|
||||
gst_action_to_string (action));
|
||||
g_hash_table_insert (sched->sources_for_actions, action, source);
|
||||
g_source_attach (source, NULL);
|
||||
g_source_unref (source); /* FIXME: need better refcount management? */
|
||||
GST_LOG_OBJECT (sched, "%u active sources now",
|
||||
g_hash_table_size (sched->sources_for_actions));
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_add_action (GstScheduler * scheduler, GstAction * action)
|
||||
{
|
||||
if (gst_action_is_active (action))
|
||||
gst_simple_scheduler_activate_action (scheduler, action);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_deactivate_action (GstScheduler * scheduler,
|
||||
GstAction * action)
|
||||
{
|
||||
GSource *source;
|
||||
GstSimpleScheduler *sched = GST_SIMPLE_SCHEDULER (scheduler);
|
||||
|
||||
source = g_hash_table_lookup (sched->sources_for_actions, action);
|
||||
g_assert (source);
|
||||
g_source_destroy (source);
|
||||
if (!g_hash_table_remove (sched->sources_for_actions, action))
|
||||
g_assert_not_reached ();
|
||||
GST_DEBUG_OBJECT (sched, "%p removed for action %p, %u active sources now",
|
||||
source, action, g_hash_table_size (sched->sources_for_actions));
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_remove_action (GstScheduler * scheduler,
|
||||
GstAction * action)
|
||||
{
|
||||
if (gst_action_is_active (action))
|
||||
gst_simple_scheduler_deactivate_action (scheduler, action);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_toggle_active (GstScheduler * scheduler,
|
||||
GstAction * action)
|
||||
{
|
||||
//g_print ("toggling action %s to be %sactive now\n", gst_action_to_string (action),
|
||||
// gst_action_is_active (action) ? "" : "NOT ");
|
||||
if (gst_action_is_active (action)) {
|
||||
gst_simple_scheduler_activate_action (scheduler, action);
|
||||
} else {
|
||||
gst_simple_scheduler_deactivate_action (scheduler, action);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_update_values (GstScheduler * scheduler,
|
||||
GstAction * action)
|
||||
{
|
||||
if (gst_action_is_active (action)) {
|
||||
gst_simple_scheduler_deactivate_action (scheduler, action);
|
||||
gst_simple_scheduler_activate_action (scheduler, action);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_simple_scheduler_pad_push (GstScheduler * scheduler, GstRealPad * pad,
|
||||
GstData * data)
|
||||
{
|
||||
GST_LOG_OBJECT (scheduler, "pad %s:%s pushed %p", GST_DEBUG_PAD_NAME (pad),
|
||||
data);
|
||||
gst_simple_scheduler_do_push (pad, data);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
plugin_init (GstPlugin * plugin)
|
||||
{
|
||||
if (!gst_scheduler_register (plugin, "simple",
|
||||
"A scheduler as simple as possible", GST_TYPE_SIMPLE_SCHEDULER))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "gstsimplescheduler",
|
||||
"A scheduler as simple as possible", plugin_init, VERSION, GST_LICENSE,
|
||||
GST_PACKAGE, GST_ORIGIN)
|
|
@ -1,221 +0,0 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
|
||||
*
|
||||
* gthread-cothreads.c: cothreads implemented via GThread for compatibility
|
||||
* They're probably slooooooow
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __GTHREAD_COTHREADS_H__
|
||||
#define __GTHREAD_COTHREADS_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include <gst/gstthread.h>
|
||||
|
||||
/* the name of this cothreads */
|
||||
#define COTHREADS_TYPE gthread
|
||||
#define COTHREADS_NAME "gthread"
|
||||
#define COTHREADS_NAME_CAPITAL "GThread"
|
||||
|
||||
/*
|
||||
* Theory of operation:
|
||||
* Instead of using cothreads, GThreads and 1 mutex are used.
|
||||
* Every thread may only run if it holds the mutex. Otherwise it holds its own
|
||||
* cond which has to be signaled to wakeit up.
|
||||
*/
|
||||
|
||||
/* define "cothread", "cothread_context" and "cothread_func" */
|
||||
typedef int (*cothread_func) (int, char **);
|
||||
|
||||
typedef struct _cothread cothread;
|
||||
typedef struct _cothread_context cothread_context;
|
||||
|
||||
struct _cothread_context {
|
||||
GSList * cothreads; /* contains all threads but main */
|
||||
cothread * main;
|
||||
cothread * current;
|
||||
GMutex * mutex;
|
||||
GstThread * gst_thread; /* the GstThread we're running from */
|
||||
};
|
||||
|
||||
struct _cothread {
|
||||
GThread * thread;
|
||||
GCond * cond;
|
||||
cothread_func run;
|
||||
int argc;
|
||||
char ** argv;
|
||||
cothread * creator;
|
||||
gboolean die;
|
||||
cothread_context * context;
|
||||
};
|
||||
|
||||
#ifndef GTHREAD_COTHREADS_NO_DEFINITIONS
|
||||
|
||||
/* define functions
|
||||
* Functions starting with "do_" are used by the scheduler.
|
||||
*/
|
||||
static void do_cothreads_init (void *unused);
|
||||
static cothread_context *do_cothread_context_init (void);
|
||||
static void do_cothread_context_destroy (cothread_context *context);
|
||||
static cothread * cothread_create (cothread_context *context,
|
||||
cothread_func func,
|
||||
int argc,
|
||||
char **argv);
|
||||
#define do_cothread_create(new_cothread, context, func, argc, argv) \
|
||||
G_STMT_START{ \
|
||||
new_cothread = cothread_create ((context), (func), argc, (char**) (argv)); \
|
||||
}G_STMT_END
|
||||
static void do_cothread_switch (cothread *to);
|
||||
static void do_cothread_destroy (cothread *thread);
|
||||
#define do_cothread_get_current(context) ((context)->current)
|
||||
#define do_cothread_get_main(context) ((context)->main)
|
||||
|
||||
static void
|
||||
do_cothreads_init (void *unused)
|
||||
{
|
||||
if (!g_thread_supported ()) g_thread_init (NULL);
|
||||
}
|
||||
static cothread_context *
|
||||
do_cothread_context_init (void)
|
||||
{
|
||||
cothread_context *ret = g_new0 (cothread_context, 1);
|
||||
|
||||
ret->main = g_new0 (cothread, 1);
|
||||
ret->main->thread = g_thread_self ();
|
||||
ret->main->cond = g_cond_new ();
|
||||
ret->main->die = FALSE;
|
||||
ret->main->context = ret;
|
||||
ret->mutex = g_mutex_new ();
|
||||
ret->cothreads = NULL;
|
||||
ret->current = ret->main;
|
||||
ret->gst_thread = gst_thread_get_current();
|
||||
g_mutex_lock (ret->mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
static void
|
||||
do_cothread_context_destroy (cothread_context *context)
|
||||
{
|
||||
g_assert (g_thread_self() == context->main->thread);
|
||||
|
||||
while (context->cothreads) {
|
||||
do_cothread_destroy ((cothread *) context->cothreads->data);
|
||||
}
|
||||
g_mutex_unlock (context->mutex);
|
||||
g_mutex_free (context->mutex);
|
||||
g_cond_free (context->main->cond);
|
||||
g_free (context->main);
|
||||
|
||||
g_free (context);
|
||||
}
|
||||
static void
|
||||
die (cothread *to_die) {
|
||||
g_cond_free (to_die->cond);
|
||||
to_die->context->cothreads = g_slist_remove (to_die->context->cothreads, to_die);
|
||||
g_free (to_die);
|
||||
g_thread_exit (to_die);
|
||||
/* don't unlock the mutex here, the thread waiting for us to die is gonna take it */
|
||||
}
|
||||
static gpointer
|
||||
run_new_thread (gpointer data)
|
||||
{
|
||||
cothread *self = (cothread *) data;
|
||||
|
||||
g_mutex_lock (self->context->mutex);
|
||||
g_private_set (gst_thread_current, self->context->gst_thread);
|
||||
g_cond_signal (self->creator->cond);
|
||||
g_cond_wait (self->cond, self->context->mutex);
|
||||
if (self->die)
|
||||
die (self);
|
||||
while (TRUE) {
|
||||
self->run (self->argc, self->argv);
|
||||
/* compatibility */
|
||||
do_cothread_switch (do_cothread_get_main (self->context));
|
||||
}
|
||||
g_assert_not_reached ();
|
||||
return NULL;
|
||||
}
|
||||
static cothread *
|
||||
cothread_create (cothread_context *context, cothread_func func, int argc, char **argv)
|
||||
{
|
||||
cothread *ret;
|
||||
|
||||
if ((ret = g_new (cothread, 1)) == NULL) {
|
||||
goto out1;
|
||||
}
|
||||
ret->cond = g_cond_new ();
|
||||
ret->run = func;
|
||||
ret->argc = argc;
|
||||
ret->argv = argv;
|
||||
ret->creator = do_cothread_get_current (context);
|
||||
ret->die = FALSE;
|
||||
ret->context = context;
|
||||
context->cothreads = g_slist_prepend (context->cothreads, ret);
|
||||
ret->thread = g_thread_create (run_new_thread, ret, TRUE, NULL);
|
||||
if (ret->thread == NULL) goto out2;
|
||||
g_cond_wait (do_cothread_get_current (context)->cond, context->mutex);
|
||||
return ret;
|
||||
|
||||
out2:
|
||||
context->cothreads = g_slist_remove (context->cothreads, ret);
|
||||
g_free (ret);
|
||||
out1:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void do_cothread_switch (cothread *to)
|
||||
{
|
||||
cothread *self = do_cothread_get_current(to->context);
|
||||
|
||||
if (self != to) {
|
||||
self->context->current = to;
|
||||
g_cond_signal (to->cond);
|
||||
g_cond_wait (self->cond, self->context->mutex);
|
||||
if (self->die)
|
||||
die (self);
|
||||
}
|
||||
}
|
||||
|
||||
#define do_cothread_setfunc(thread,context,_func,_argc,_argv) G_STMT_START {\
|
||||
((cothread *)(thread))->run = (_func); \
|
||||
((cothread *)(thread))->argc = _argc; \
|
||||
((cothread *)(thread))->argv = _argv; \
|
||||
}G_STMT_END
|
||||
|
||||
static void
|
||||
do_cothread_destroy (cothread *thread)
|
||||
{
|
||||
GThread *join;
|
||||
cothread_context *context;
|
||||
g_return_if_fail (thread != thread->context->main);
|
||||
g_return_if_fail (thread != thread->context->current);
|
||||
|
||||
thread->die = TRUE;
|
||||
join = thread->thread;
|
||||
context = thread->context;
|
||||
g_cond_signal (thread->cond);
|
||||
g_mutex_unlock (thread->context->mutex);
|
||||
g_thread_join (join);
|
||||
/* the mutex was locked by the thread that we joined, no need to lock again */
|
||||
}
|
||||
|
||||
#define do_cothread_get_current(context) ((context)->current)
|
||||
#define do_cothread_get_main(context) ((context)->main)
|
||||
|
||||
#endif /* GTHREAD_COTHREADS_NO_DEFINITIONS */
|
||||
|
||||
#endif /* __GTHREAD_COTHREADS_H__ */
|
|
@ -1,16 +1,16 @@
|
|||
plugin_LTLIBRARIES = libgstbytestream.la
|
||||
AS_LIBTOOL_LIB = libgstbytestream
|
||||
lib_LTLIBRARIES = libgstbytestream-@GST_MAJORMINOR@.la
|
||||
AS_LIBTOOL_LIB = libgstbytestream-@GST_MAJORMINOR@
|
||||
|
||||
EXTRA_DIST = $(as_libtool_EXTRA_DIST)
|
||||
noinst_DATA = $(as_libtool_noinst_DATA_files)
|
||||
|
||||
libgstbytestreamincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/bytestream
|
||||
libgstbytestreaminclude_HEADERS = bytestream.h adapter.h filepad.h
|
||||
libgstbytestreaminclude_HEADERS = adapter.h filepad.h
|
||||
|
||||
libgstbytestream_la_SOURCES = bytestream.c adapter.c filepad.c
|
||||
libgstbytestream_la_CFLAGS = $(GST_OBJ_CFLAGS)
|
||||
libgstbytestream_la_LIBS = $(GST_OBJ_LIBS)
|
||||
libgstbytestream_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
libgstbytestream_@GST_MAJORMINOR@_la_SOURCES = adapter.c filepad.c
|
||||
libgstbytestream_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS)
|
||||
libgstbytestream_@GST_MAJORMINOR@_la_LIBS = $(GST_OBJ_LIBS)
|
||||
libgstbytestream_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_OBJ_LDFLAGS) $(as_libtool_LDFLAGS)
|
||||
|
||||
install-data-local: as-libtool-install-data-local
|
||||
|
||||
|
|
|
@ -39,7 +39,8 @@ GST_BOILERPLATE_FULL (GstFilePad, gst_file_pad, GstRealPad, GST_TYPE_REAL_PAD,
|
|||
static void gst_file_pad_dispose (GObject * object);
|
||||
static void gst_file_pad_finalize (GObject * object);
|
||||
|
||||
static void gst_file_pad_chain (GstPad * pad, GstData * data);
|
||||
static void gst_file_pad_chain (GstAction * action, GstRealPad * gst_pad,
|
||||
GstData * data);
|
||||
static void gst_file_pad_parent_set (GstObject * object,
|
||||
GstObject * parent);
|
||||
|
||||
|
@ -65,10 +66,9 @@ gst_file_pad_init (GstFilePad * pad)
|
|||
{
|
||||
GstRealPad *real = GST_REAL_PAD (pad);
|
||||
|
||||
/* must do this for set_chain_function to work */
|
||||
/* must do this for set_action_handler to work */
|
||||
real->direction = GST_PAD_SINK;
|
||||
|
||||
gst_pad_set_chain_function (GST_PAD (real), gst_file_pad_chain);
|
||||
gst_sink_pad_set_action_handler (GST_PAD (pad), gst_file_pad_chain);
|
||||
|
||||
pad->adapter = gst_adapter_new ();
|
||||
pad->in_seek = FALSE;
|
||||
|
@ -99,7 +99,7 @@ gst_file_pad_finalize (GObject * object)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_file_pad_chain (GstPad * gst_pad, GstData * data)
|
||||
gst_file_pad_chain (GstAction * action, GstRealPad * gst_pad, GstData * data)
|
||||
{
|
||||
GstFilePad *pad = GST_FILE_PAD (gst_pad);
|
||||
gboolean got_value;
|
||||
|
@ -162,7 +162,7 @@ gst_file_pad_chain (GstPad * gst_pad, GstData * data)
|
|||
}
|
||||
|
||||
g_return_if_fail (pad->event_func);
|
||||
pad->event_func (gst_pad, event);
|
||||
pad->event_func (GST_PAD (pad), event);
|
||||
} else {
|
||||
if (pad->in_seek) {
|
||||
GST_DEBUG_OBJECT (pad, "discarding buffer %p, we're seeking", data);
|
||||
|
@ -183,8 +183,6 @@ gst_file_pad_parent_set (GstObject * object, GstObject * parent)
|
|||
/* FIXME: we can only be added to elements, right? */
|
||||
element = GST_ELEMENT (parent);
|
||||
|
||||
if (element->loopfunc)
|
||||
g_warning ("attempt to add a GstFilePad to a loopbased element.");
|
||||
if (!GST_FLAG_IS_SET (element, GST_ELEMENT_EVENT_AWARE))
|
||||
g_warning ("elements using GstFilePad must be event-aware.");
|
||||
|
||||
|
|
|
@ -113,7 +113,8 @@ static void gst_fakesink_get_property (GObject * object, guint prop_id,
|
|||
|
||||
static GstElementStateReturn gst_fakesink_change_state (GstElement * element);
|
||||
|
||||
static void gst_fakesink_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_fakesink_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * _data);
|
||||
|
||||
static guint gst_fakesink_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
|
@ -187,8 +188,8 @@ gst_fakesink_init (GstFakeSink * fakesink)
|
|||
pad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
gst_sink_pad_set_action_handler (pad, GST_DEBUG_FUNCPTR (gst_fakesink_chain));
|
||||
gst_element_add_pad (GST_ELEMENT (fakesink), pad);
|
||||
gst_pad_set_chain_function (pad, GST_DEBUG_FUNCPTR (gst_fakesink_chain));
|
||||
|
||||
fakesink->silent = FALSE;
|
||||
fakesink->dump = FALSE;
|
||||
|
@ -231,7 +232,8 @@ gst_fakesink_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
|||
|
||||
sinkpad = gst_pad_new_from_template (templ, name);
|
||||
g_free (name);
|
||||
gst_pad_set_chain_function (sinkpad, GST_DEBUG_FUNCPTR (gst_fakesink_chain));
|
||||
gst_sink_pad_set_action_handler (sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_fakesink_chain));
|
||||
|
||||
gst_element_add_pad (GST_ELEMENT (fakesink), sinkpad);
|
||||
|
||||
|
@ -309,7 +311,7 @@ gst_fakesink_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
}
|
||||
|
||||
static void
|
||||
gst_fakesink_chain (GstPad * pad, GstData * _data)
|
||||
gst_fakesink_chain (GstAction * action, GstRealPad * pad, GstData * _data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstFakeSink *fakesink;
|
||||
|
@ -341,7 +343,7 @@ gst_fakesink_chain (GstPad * pad, GstData * _data)
|
|||
gst_element_set_time (GST_ELEMENT (fakesink), value);
|
||||
}
|
||||
default:
|
||||
gst_pad_event_default (pad, event);
|
||||
gst_pad_event_default (GST_PAD (pad), event);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
|
|
|
@ -64,7 +64,6 @@ enum
|
|||
{
|
||||
ARG_0,
|
||||
ARG_NUM_SOURCES,
|
||||
ARG_LOOP_BASED,
|
||||
ARG_OUTPUT,
|
||||
ARG_DATA,
|
||||
ARG_SIZETYPE,
|
||||
|
@ -179,7 +178,7 @@ GST_BOILERPLATE_FULL (GstFakeSrc, gst_fakesrc, GstElement, GST_TYPE_ELEMENT,
|
|||
|
||||
static GstPad *gst_fakesrc_request_new_pad (GstElement * element,
|
||||
GstPadTemplate * templ, const gchar * unused);
|
||||
static void gst_fakesrc_update_functions (GstFakeSrc * src);
|
||||
static void gst_fakesrc_update_functions (GstFakeSrc * src, GstPad * pad);
|
||||
static void gst_fakesrc_set_property (GObject * object, guint prop_id,
|
||||
const GValue * value, GParamSpec * pspec);
|
||||
static void gst_fakesrc_get_property (GObject * object, guint prop_id,
|
||||
|
@ -188,8 +187,7 @@ static void gst_fakesrc_set_clock (GstElement * element, GstClock * clock);
|
|||
|
||||
static GstElementStateReturn gst_fakesrc_change_state (GstElement * element);
|
||||
|
||||
static GstData *gst_fakesrc_get (GstPad * pad);
|
||||
static void gst_fakesrc_loop (GstElement * element);
|
||||
static GstData *gst_fakesrc_get (GstAction * action, GstRealPad * pad);
|
||||
|
||||
static guint gst_fakesrc_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
|
@ -214,13 +212,9 @@ gst_fakesrc_class_init (GstFakeSrcClass * klass)
|
|||
gobject_class = (GObjectClass *) klass;
|
||||
gstelement_class = (GstElementClass *) klass;
|
||||
|
||||
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NUM_SOURCES,
|
||||
g_param_spec_int ("num-sources", "num-sources", "Number of sources",
|
||||
1, G_MAXINT, 1, G_PARAM_READABLE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOOP_BASED,
|
||||
g_param_spec_boolean ("loop-based", "loop-based",
|
||||
"Enable loop-based operation", FALSE, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_OUTPUT,
|
||||
g_param_spec_enum ("output", "output", "Output method (currently unused)",
|
||||
GST_TYPE_FAKESRC_OUTPUT, FAKESRC_FIRST_LAST_LOOP, G_PARAM_READWRITE));
|
||||
|
@ -299,11 +293,9 @@ gst_fakesrc_init (GstFakeSrc * fakesrc)
|
|||
pad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
gst_fakesrc_update_functions (fakesrc, pad);
|
||||
gst_element_add_pad (GST_ELEMENT (fakesrc), pad);
|
||||
|
||||
fakesrc->loop_based = FALSE;
|
||||
gst_fakesrc_update_functions (fakesrc);
|
||||
|
||||
fakesrc->output = FAKESRC_FIRST_LAST_LOOP;
|
||||
fakesrc->segment_start = -1;
|
||||
fakesrc->segment_end = -1;
|
||||
|
@ -358,39 +350,14 @@ gst_fakesrc_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
|||
name = g_strdup_printf ("src%d", GST_ELEMENT (fakesrc)->numsrcpads);
|
||||
|
||||
srcpad = gst_pad_new_from_template (templ, name);
|
||||
gst_fakesrc_update_functions (fakesrc, srcpad);
|
||||
gst_element_add_pad (GST_ELEMENT (fakesrc), srcpad);
|
||||
gst_fakesrc_update_functions (fakesrc);
|
||||
|
||||
g_free (name);
|
||||
|
||||
return srcpad;
|
||||
}
|
||||
|
||||
static const GstFormat *
|
||||
gst_fakesrc_get_formats (GstPad * pad)
|
||||
{
|
||||
static const GstFormat formats[] = {
|
||||
GST_FORMAT_DEFAULT,
|
||||
0,
|
||||
};
|
||||
|
||||
return formats;
|
||||
}
|
||||
|
||||
static const GstQueryType *
|
||||
gst_fakesrc_get_query_types (GstPad * pad)
|
||||
{
|
||||
static const GstQueryType types[] = {
|
||||
GST_QUERY_TOTAL,
|
||||
GST_QUERY_POSITION,
|
||||
GST_QUERY_START,
|
||||
GST_QUERY_SEGMENT_END,
|
||||
0,
|
||||
};
|
||||
|
||||
return types;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_fakesrc_query (GstPad * pad, GstQueryType type,
|
||||
GstFormat * format, gint64 * value)
|
||||
|
@ -416,19 +383,6 @@ gst_fakesrc_query (GstPad * pad, GstQueryType type,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static const GstEventMask *
|
||||
gst_fakesrc_get_event_mask (GstPad * pad)
|
||||
{
|
||||
static const GstEventMask masks[] = {
|
||||
{GST_EVENT_SEEK, GST_SEEK_FLAG_FLUSH},
|
||||
{GST_EVENT_SEEK_SEGMENT, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT_LOOP},
|
||||
{GST_EVENT_FLUSH, 0},
|
||||
{0, 0},
|
||||
};
|
||||
|
||||
return masks;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_fakesrc_event_handler (GstPad * pad, GstEvent * event)
|
||||
{
|
||||
|
@ -463,34 +417,12 @@ gst_fakesrc_event_handler (GstPad * pad, GstEvent * event)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_fakesrc_update_functions (GstFakeSrc * src)
|
||||
gst_fakesrc_update_functions (GstFakeSrc * src, GstPad * pad)
|
||||
{
|
||||
GList *pads;
|
||||
|
||||
if (src->loop_based) {
|
||||
gst_element_set_loop_function (GST_ELEMENT (src),
|
||||
GST_DEBUG_FUNCPTR (gst_fakesrc_loop));
|
||||
} else {
|
||||
gst_element_set_loop_function (GST_ELEMENT (src), NULL);
|
||||
}
|
||||
|
||||
pads = GST_ELEMENT (src)->pads;
|
||||
while (pads) {
|
||||
GstPad *pad = GST_PAD (pads->data);
|
||||
|
||||
if (src->loop_based) {
|
||||
gst_pad_set_get_function (pad, NULL);
|
||||
} else {
|
||||
gst_pad_set_get_function (pad, GST_DEBUG_FUNCPTR (gst_fakesrc_get));
|
||||
}
|
||||
|
||||
gst_src_pad_set_action_handler (pad, gst_fakesrc_get);
|
||||
gst_real_pad_set_initially_active (GST_REAL_PAD (pad), TRUE);
|
||||
gst_pad_set_event_function (pad, gst_fakesrc_event_handler);
|
||||
gst_pad_set_event_mask_function (pad, gst_fakesrc_get_event_mask);
|
||||
gst_pad_set_query_function (pad, gst_fakesrc_query);
|
||||
gst_pad_set_query_type_function (pad, gst_fakesrc_get_query_types);
|
||||
gst_pad_set_formats_function (pad, gst_fakesrc_get_formats);
|
||||
pads = g_list_next (pads);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -516,10 +448,6 @@ gst_fakesrc_set_property (GObject * object, guint prop_id, const GValue * value,
|
|||
src = GST_FAKESRC (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case ARG_LOOP_BASED:
|
||||
src->loop_based = g_value_get_boolean (value);
|
||||
gst_fakesrc_update_functions (src);
|
||||
break;
|
||||
case ARG_OUTPUT:
|
||||
g_warning ("not yet implemented");
|
||||
break;
|
||||
|
@ -596,9 +524,6 @@ gst_fakesrc_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
case ARG_NUM_SOURCES:
|
||||
g_value_set_int (value, GST_ELEMENT (src)->numsrcpads);
|
||||
break;
|
||||
case ARG_LOOP_BASED:
|
||||
g_value_set_boolean (value, src->loop_based);
|
||||
break;
|
||||
case ARG_OUTPUT:
|
||||
g_value_set_enum (value, src->output);
|
||||
break;
|
||||
|
@ -791,7 +716,7 @@ gst_fakesrc_create_buffer (GstFakeSrc * src)
|
|||
}
|
||||
|
||||
static GstData *
|
||||
gst_fakesrc_get (GstPad * pad)
|
||||
gst_fakesrc_get (GstAction * action, GstRealPad * pad)
|
||||
{
|
||||
GstFakeSrc *src;
|
||||
GstBuffer *buf;
|
||||
|
@ -870,40 +795,6 @@ gst_fakesrc_get (GstPad * pad)
|
|||
return GST_DATA (buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_fakesrc_loop:
|
||||
* @element: the faksesrc to loop
|
||||
*
|
||||
* generate an empty buffer and push it to the next element.
|
||||
*/
|
||||
static void
|
||||
gst_fakesrc_loop (GstElement * element)
|
||||
{
|
||||
GstFakeSrc *src;
|
||||
const GList *pads;
|
||||
|
||||
g_return_if_fail (element != NULL);
|
||||
g_return_if_fail (GST_IS_FAKESRC (element));
|
||||
|
||||
src = GST_FAKESRC (element);
|
||||
|
||||
pads = gst_element_get_pad_list (element);
|
||||
|
||||
while (pads) {
|
||||
GstPad *pad = GST_PAD (pads->data);
|
||||
GstData *data;
|
||||
|
||||
data = gst_fakesrc_get (pad);
|
||||
gst_pad_push (pad, data);
|
||||
|
||||
if (src->eos) {
|
||||
return;
|
||||
}
|
||||
|
||||
pads = g_list_next (pads);
|
||||
}
|
||||
}
|
||||
|
||||
static GstElementStateReturn
|
||||
gst_fakesrc_change_state (GstElement * element)
|
||||
{
|
||||
|
|
|
@ -76,7 +76,6 @@ typedef struct _GstFakeSrcClass GstFakeSrcClass;
|
|||
struct _GstFakeSrc {
|
||||
GstElement element;
|
||||
|
||||
gboolean loop_based;
|
||||
gboolean eos;
|
||||
|
||||
GstFakeSrcOutputType output;
|
||||
|
|
|
@ -69,7 +69,8 @@ static void gst_fdsink_set_property (GObject * object, guint prop_id,
|
|||
static void gst_fdsink_get_property (GObject * object, guint prop_id,
|
||||
GValue * value, GParamSpec * pspec);
|
||||
|
||||
static void gst_fdsink_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_fdsink_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * _data);
|
||||
|
||||
|
||||
static void
|
||||
|
@ -103,14 +104,14 @@ gst_fdsink_init (GstFdSink * fdsink)
|
|||
fdsink->sinkpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
gst_sink_pad_set_action_handler (fdsink->sinkpad, gst_fdsink_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (fdsink), fdsink->sinkpad);
|
||||
gst_pad_set_chain_function (fdsink->sinkpad, gst_fdsink_chain);
|
||||
|
||||
fdsink->fd = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_fdsink_chain (GstPad * pad, GstData * _data)
|
||||
gst_fdsink_chain (GstAction * action, GstRealPad * pad, GstData * _data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstFdSink *fdsink;
|
||||
|
@ -119,7 +120,7 @@ gst_fdsink_chain (GstPad * pad, GstData * _data)
|
|||
g_return_if_fail (GST_IS_PAD (pad));
|
||||
g_return_if_fail (buf != NULL);
|
||||
|
||||
fdsink = GST_FDSINK (gst_pad_get_parent (pad));
|
||||
fdsink = GST_FDSINK (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
g_return_if_fail (fdsink->fd >= 0);
|
||||
|
||||
|
|
|
@ -102,7 +102,7 @@ static void gst_fdsrc_get_property (GObject * object, guint prop_id,
|
|||
|
||||
static GstElementStateReturn gst_fdsrc_change_state (GstElement * element);
|
||||
static gboolean gst_fdsrc_release_locks (GstElement * element);
|
||||
static GstData *gst_fdsrc_get (GstPad * pad);
|
||||
static GstData *gst_fdsrc_get (GstAction * action, GstRealPad * pad);
|
||||
|
||||
|
||||
static void
|
||||
|
@ -164,7 +164,8 @@ gst_fdsrc_init (GstFdSrc * fdsrc)
|
|||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
|
||||
gst_pad_set_get_function (fdsrc->srcpad, gst_fdsrc_get);
|
||||
gst_src_pad_set_action_handler (fdsrc->srcpad, gst_fdsrc_get);
|
||||
gst_real_pad_set_initially_active (GST_REAL_PAD (fdsrc->srcpad), TRUE);
|
||||
gst_element_add_pad (GST_ELEMENT (fdsrc), fdsrc->srcpad);
|
||||
|
||||
fdsrc->fd = 0;
|
||||
|
@ -265,7 +266,7 @@ gst_fdsrc_release_locks (GstElement * element)
|
|||
}
|
||||
|
||||
static GstData *
|
||||
gst_fdsrc_get (GstPad * pad)
|
||||
gst_fdsrc_get (GstAction * action, GstRealPad * pad)
|
||||
{
|
||||
GstFdSrc *src;
|
||||
GstBuffer *buf;
|
||||
|
@ -277,7 +278,7 @@ gst_fdsrc_get (GstPad * pad)
|
|||
gint retval;
|
||||
#endif
|
||||
|
||||
src = GST_FDSRC (gst_pad_get_parent (pad));
|
||||
src = GST_FDSRC (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
/* create the buffer */
|
||||
buf = gst_buffer_new_and_alloc (src->blocksize);
|
||||
|
|
|
@ -66,29 +66,6 @@ enum
|
|||
ARG_LOCATION
|
||||
};
|
||||
|
||||
static const GstFormat *
|
||||
gst_filesink_get_formats (GstPad * pad)
|
||||
{
|
||||
static const GstFormat formats[] = {
|
||||
GST_FORMAT_BYTES,
|
||||
0,
|
||||
};
|
||||
|
||||
return formats;
|
||||
}
|
||||
|
||||
static const GstQueryType *
|
||||
gst_filesink_get_query_types (GstPad * pad)
|
||||
{
|
||||
static const GstQueryType types[] = {
|
||||
GST_QUERY_TOTAL,
|
||||
GST_QUERY_POSITION,
|
||||
0
|
||||
};
|
||||
|
||||
return types;
|
||||
}
|
||||
|
||||
static void gst_filesink_dispose (GObject * object);
|
||||
|
||||
static void gst_filesink_set_property (GObject * object, guint prop_id,
|
||||
|
@ -99,10 +76,11 @@ static void gst_filesink_get_property (GObject * object, guint prop_id,
|
|||
static gboolean gst_filesink_open_file (GstFileSink * sink);
|
||||
static void gst_filesink_close_file (GstFileSink * sink);
|
||||
|
||||
static gboolean gst_filesink_handle_event (GstPad * pad, GstEvent * event);
|
||||
static gboolean gst_filesink_handle_event (GstRealPad * pad, GstEvent * event);
|
||||
static gboolean gst_filesink_pad_query (GstPad * pad, GstQueryType type,
|
||||
GstFormat * format, gint64 * value);
|
||||
static void gst_filesink_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_filesink_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * _data);
|
||||
|
||||
static void gst_filesink_uri_handler_init (gpointer g_iface,
|
||||
gpointer iface_data);
|
||||
|
@ -167,14 +145,12 @@ gst_filesink_init (GstFileSink * filesink)
|
|||
pad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
gst_sink_pad_set_action_handler (pad, gst_filesink_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (filesink), pad);
|
||||
gst_pad_set_chain_function (pad, gst_filesink_chain);
|
||||
|
||||
GST_FLAG_SET (GST_ELEMENT (filesink), GST_ELEMENT_EVENT_AWARE);
|
||||
|
||||
gst_pad_set_query_function (pad, gst_filesink_pad_query);
|
||||
gst_pad_set_query_type_function (pad, gst_filesink_get_query_types);
|
||||
gst_pad_set_formats_function (pad, gst_filesink_get_formats);
|
||||
|
||||
filesink->filename = NULL;
|
||||
filesink->file = NULL;
|
||||
|
@ -336,12 +312,12 @@ gst_filesink_pad_query (GstPad * pad, GstQueryType type,
|
|||
|
||||
/* handle events (search) */
|
||||
static gboolean
|
||||
gst_filesink_handle_event (GstPad * pad, GstEvent * event)
|
||||
gst_filesink_handle_event (GstRealPad * pad, GstEvent * event)
|
||||
{
|
||||
GstEventType type;
|
||||
GstFileSink *filesink;
|
||||
|
||||
filesink = GST_FILESINK (gst_pad_get_parent (pad));
|
||||
filesink = GST_FILESINK (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
if (!(GST_FLAG_IS_SET (filesink, GST_FILESINK_OPEN))) {
|
||||
gst_event_unref (event);
|
||||
|
@ -407,7 +383,7 @@ gst_filesink_handle_event (GstPad * pad, GstEvent * event)
|
|||
gst_element_set_eos (GST_ELEMENT (filesink));
|
||||
break;
|
||||
default:
|
||||
gst_pad_event_default (pad, event);
|
||||
gst_pad_event_default (GST_PAD (pad), event);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -422,7 +398,7 @@ gst_filesink_handle_event (GstPad * pad, GstEvent * event)
|
|||
* take the buffer from the pad and write to file if it's open
|
||||
*/
|
||||
static void
|
||||
gst_filesink_chain (GstPad * pad, GstData * _data)
|
||||
gst_filesink_chain (GstAction * action, GstRealPad * pad, GstData * _data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstFileSink *filesink;
|
||||
|
@ -431,7 +407,7 @@ gst_filesink_chain (GstPad * pad, GstData * _data)
|
|||
g_return_if_fail (GST_IS_PAD (pad));
|
||||
g_return_if_fail (buf != NULL);
|
||||
|
||||
filesink = GST_FILESINK (gst_pad_get_parent (pad));
|
||||
filesink = GST_FILESINK (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
if (GST_IS_EVENT (buf)) {
|
||||
gst_filesink_handle_event (pad, GST_EVENT (buf));
|
||||
|
|
|
@ -125,43 +125,6 @@ enum
|
|||
ARG_TOUCH
|
||||
};
|
||||
|
||||
static const GstEventMask *
|
||||
gst_filesrc_get_event_mask (GstPad * pad)
|
||||
{
|
||||
static const GstEventMask masks[] = {
|
||||
{GST_EVENT_SEEK, GST_SEEK_METHOD_CUR |
|
||||
GST_SEEK_METHOD_SET | GST_SEEK_METHOD_END | GST_SEEK_FLAG_FLUSH},
|
||||
{GST_EVENT_FLUSH, 0},
|
||||
{GST_EVENT_SIZE, 0},
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
return masks;
|
||||
}
|
||||
|
||||
static const GstQueryType *
|
||||
gst_filesrc_get_query_types (GstPad * pad)
|
||||
{
|
||||
static const GstQueryType types[] = {
|
||||
GST_QUERY_TOTAL,
|
||||
GST_QUERY_POSITION,
|
||||
0
|
||||
};
|
||||
|
||||
return types;
|
||||
}
|
||||
|
||||
static const GstFormat *
|
||||
gst_filesrc_get_formats (GstPad * pad)
|
||||
{
|
||||
static const GstFormat formats[] = {
|
||||
GST_FORMAT_BYTES,
|
||||
0,
|
||||
};
|
||||
|
||||
return formats;
|
||||
}
|
||||
|
||||
static void gst_filesrc_dispose (GObject * object);
|
||||
|
||||
static void gst_filesrc_set_property (GObject * object, guint prop_id,
|
||||
|
@ -170,7 +133,7 @@ static void gst_filesrc_get_property (GObject * object, guint prop_id,
|
|||
GValue * value, GParamSpec * pspec);
|
||||
|
||||
static gboolean gst_filesrc_check_filesize (GstFileSrc * src);
|
||||
static GstData *gst_filesrc_get (GstPad * pad);
|
||||
static GstData *gst_filesrc_get (GstAction * action, GstRealPad * pad);
|
||||
static gboolean gst_filesrc_srcpad_event (GstPad * pad, GstEvent * event);
|
||||
static gboolean gst_filesrc_srcpad_query (GstPad * pad, GstQueryType type,
|
||||
GstFormat * format, gint64 * value);
|
||||
|
@ -247,12 +210,10 @@ gst_filesrc_init (GstFileSrc * src)
|
|||
src->srcpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
gst_pad_set_get_function (src->srcpad, gst_filesrc_get);
|
||||
gst_src_pad_set_action_handler (src->srcpad, gst_filesrc_get);
|
||||
gst_real_pad_set_initially_active (GST_REAL_PAD (src->srcpad), TRUE);
|
||||
gst_pad_set_event_function (src->srcpad, gst_filesrc_srcpad_event);
|
||||
gst_pad_set_event_mask_function (src->srcpad, gst_filesrc_get_event_mask);
|
||||
gst_pad_set_query_function (src->srcpad, gst_filesrc_srcpad_query);
|
||||
gst_pad_set_query_type_function (src->srcpad, gst_filesrc_get_query_types);
|
||||
gst_pad_set_formats_function (src->srcpad, gst_filesrc_get_formats);
|
||||
gst_element_add_pad (GST_ELEMENT (src), src->srcpad);
|
||||
|
||||
#ifdef HAVE_MMAP
|
||||
|
@ -686,12 +647,12 @@ gst_filesrc_get_read (GstFileSrc * src)
|
|||
}
|
||||
|
||||
static GstData *
|
||||
gst_filesrc_get (GstPad * pad)
|
||||
gst_filesrc_get (GstAction * action, GstRealPad * pad)
|
||||
{
|
||||
GstFileSrc *src;
|
||||
|
||||
g_return_val_if_fail (pad != NULL, NULL);
|
||||
src = GST_FILESRC (gst_pad_get_parent (pad));
|
||||
src = GST_FILESRC (gst_pad_get_parent (GST_PAD (pad)));
|
||||
g_return_val_if_fail (GST_FLAG_IS_SET (src, GST_FILESRC_OPEN), NULL);
|
||||
|
||||
/* check for flush */
|
||||
|
|
|
@ -31,18 +31,10 @@
|
|||
#include "gstidentity.h"
|
||||
#include <gst/gstmarshal.h>
|
||||
|
||||
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_identity_debug);
|
||||
/*
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_identity_debug, "identity", 0, "identity element");
|
||||
#define GST_CAT_DEFAULT gst_identity_debug
|
||||
*/
|
||||
|
||||
GstElementDetails gst_identity_details = GST_ELEMENT_DETAILS ("Identity",
|
||||
"Generic",
|
||||
|
@ -58,49 +50,32 @@ enum
|
|||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
#define DEFAULT_LOOP_BASED FALSE
|
||||
#define DEFAULT_SLEEP_TIME 0
|
||||
#define DEFAULT_DUPLICATE 1
|
||||
#define DEFAULT_ERROR_AFTER -1
|
||||
#define DEFAULT_DROP_PROBABILITY 0.0
|
||||
#define DEFAULT_DATARATE 0
|
||||
#define DEFAULT_SILENT FALSE
|
||||
#define DEFAULT_DUMP FALSE
|
||||
#define DEFAULT_SYNC FALSE
|
||||
#define DEFAULT_CHECK_PERFECT FALSE
|
||||
|
||||
enum
|
||||
{
|
||||
ARG_0,
|
||||
ARG_LOOP_BASED,
|
||||
ARG_SLEEP_TIME,
|
||||
ARG_DUPLICATE,
|
||||
ARG_ERROR_AFTER,
|
||||
ARG_DROP_PROBABILITY,
|
||||
ARG_DATARATE,
|
||||
ARG_SILENT,
|
||||
ARG_LAST_MESSAGE,
|
||||
ARG_DUMP,
|
||||
ARG_SYNC,
|
||||
ARG_CHECK_PERFECT
|
||||
};
|
||||
|
||||
|
||||
#define _do_init(bla) \
|
||||
GST_DEBUG_CATEGORY_INIT (gst_identity_debug, "identity", 0, "identity element");
|
||||
|
||||
GST_BOILERPLATE_FULL (GstIdentity, gst_identity, GstElement, GST_TYPE_ELEMENT,
|
||||
_do_init);
|
||||
GST_BOILERPLATE (GstIdentity, gst_identity, GstElement, GST_TYPE_ELEMENT);
|
||||
|
||||
static void gst_identity_finalize (GObject * object);
|
||||
static void gst_identity_set_property (GObject * object, guint prop_id,
|
||||
const GValue * value, GParamSpec * pspec);
|
||||
static void gst_identity_get_property (GObject * object, guint prop_id,
|
||||
GValue * value, GParamSpec * pspec);
|
||||
static GstElementStateReturn gst_identity_change_state (GstElement * element);
|
||||
|
||||
static void gst_identity_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_identity_set_clock (GstElement * element, GstClock * clock);
|
||||
static GstElementStateReturn gst_identity_change_state (GstElement * element);
|
||||
static void gst_identity_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * data);
|
||||
static void gst_identity_wakeup (GstAction * action, GstElement * element,
|
||||
gpointer unused);
|
||||
|
||||
|
||||
static guint gst_identity_signals[LAST_SIGNAL] = { 0 };
|
||||
|
@ -110,10 +85,6 @@ gst_identity_base_init (gpointer g_class)
|
|||
{
|
||||
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
||||
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&srctemplate));
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&sinktemplate));
|
||||
gst_element_class_set_details (gstelement_class, &gst_identity_details);
|
||||
}
|
||||
|
||||
|
@ -138,45 +109,36 @@ gst_identity_class_init (GstIdentityClass * klass)
|
|||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
gstelement_class = GST_ELEMENT_CLASS (klass);
|
||||
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOOP_BASED,
|
||||
g_param_spec_boolean ("loop-based", "Loop-based",
|
||||
"Set to TRUE to use loop-based rather than chain-based scheduling",
|
||||
DEFAULT_LOOP_BASED, G_PARAM_READWRITE));
|
||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_identity_get_property);
|
||||
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_identity_set_property);
|
||||
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SLEEP_TIME,
|
||||
g_param_spec_uint ("sleep-time", "Sleep time",
|
||||
"Microseconds to sleep between processing", 0, G_MAXUINT,
|
||||
DEFAULT_SLEEP_TIME, G_PARAM_READWRITE));
|
||||
"Microseconds to sleep between processing", 0, G_MAXUINT, 0,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DUPLICATE,
|
||||
g_param_spec_uint ("duplicate", "Duplicate Buffers",
|
||||
"Push the buffers N times", 0, G_MAXUINT, DEFAULT_DUPLICATE,
|
||||
G_PARAM_READWRITE));
|
||||
"Push the buffers N times", 0, G_MAXUINT, 1, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ERROR_AFTER,
|
||||
g_param_spec_int ("error_after", "Error After", "Error after N buffers",
|
||||
G_MININT, G_MAXINT, DEFAULT_ERROR_AFTER, G_PARAM_READWRITE));
|
||||
G_MININT, G_MAXINT, -1, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DROP_PROBABILITY,
|
||||
g_param_spec_float ("drop_probability", "Drop Probability",
|
||||
"The Probability a buffer is dropped", 0.0, 1.0,
|
||||
DEFAULT_DROP_PROBABILITY, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DATARATE,
|
||||
g_param_spec_int ("datarate", "Datarate",
|
||||
"(Re)timestamps buffers with number of bytes per second (0 = inactive)",
|
||||
0, G_MAXINT, DEFAULT_DATARATE, G_PARAM_READWRITE));
|
||||
"The Probability a buffer is dropped", 0.0, 1.0, 0.0,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT,
|
||||
g_param_spec_boolean ("silent", "silent", "silent", DEFAULT_SILENT,
|
||||
g_param_spec_boolean ("silent", "silent", "silent", FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LAST_MESSAGE,
|
||||
g_param_spec_string ("last-message", "last-message", "last-message", NULL,
|
||||
G_PARAM_READABLE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DUMP,
|
||||
g_param_spec_boolean ("dump", "Dump", "Dump buffer contents",
|
||||
DEFAULT_DUMP, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC,
|
||||
g_param_spec_boolean ("sync", "Synchronize",
|
||||
"Synchronize to pipeline clock", DEFAULT_SYNC, G_PARAM_READWRITE));
|
||||
g_param_spec_boolean ("dump", "Dump", "Dump buffer contents", FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CHECK_PERFECT,
|
||||
g_param_spec_boolean ("check-perfect", "Check For Perfect Stream",
|
||||
"Verify that the stream is time- and data-contiguous",
|
||||
DEFAULT_CHECK_PERFECT, G_PARAM_READWRITE));
|
||||
"Verify that the stream is time- and data-contiguous", FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
gst_identity_signals[SIGNAL_HANDOFF] =
|
||||
g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
||||
|
@ -185,74 +147,82 @@ gst_identity_class_init (GstIdentityClass * klass)
|
|||
GST_TYPE_BUFFER | G_SIGNAL_TYPE_STATIC_SCOPE);
|
||||
|
||||
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_identity_finalize);
|
||||
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_identity_set_property);
|
||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_identity_get_property);
|
||||
|
||||
gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_identity_set_clock);
|
||||
gstelement_class->change_state =
|
||||
GST_DEBUG_FUNCPTR (gst_identity_change_state);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
gst_identity_init (GstIdentity * identity)
|
||||
{
|
||||
identity->sinkpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
GST_FLAG_SET (identity, GST_ELEMENT_EVENT_AWARE);
|
||||
GST_FLAG_SET (identity, GST_ELEMENT_PUSHING);
|
||||
|
||||
identity->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
|
||||
gst_sink_pad_set_action_handler (identity->sinkpad, gst_identity_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (identity), identity->sinkpad);
|
||||
gst_pad_set_chain_function (identity->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_identity_chain));
|
||||
gst_pad_set_link_function (identity->sinkpad, gst_pad_proxy_pad_link);
|
||||
gst_pad_set_getcaps_function (identity->sinkpad, gst_pad_proxy_getcaps);
|
||||
|
||||
identity->srcpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
identity->srcpad = gst_pad_new ("src", GST_PAD_SRC);
|
||||
gst_element_add_pad (GST_ELEMENT (identity), identity->srcpad);
|
||||
gst_pad_set_link_function (identity->srcpad, gst_pad_proxy_pad_link);
|
||||
gst_pad_set_getcaps_function (identity->srcpad, gst_pad_proxy_getcaps);
|
||||
|
||||
identity->loop_based = DEFAULT_LOOP_BASED;
|
||||
identity->sleep_time = DEFAULT_SLEEP_TIME;
|
||||
identity->duplicate = DEFAULT_DUPLICATE;
|
||||
identity->error_after = DEFAULT_ERROR_AFTER;
|
||||
identity->drop_probability = DEFAULT_DROP_PROBABILITY;
|
||||
identity->datarate = DEFAULT_DATARATE;
|
||||
identity->silent = DEFAULT_SILENT;
|
||||
identity->sync = DEFAULT_SYNC;
|
||||
identity->check_perfect = DEFAULT_CHECK_PERFECT;
|
||||
identity->dump = DEFAULT_DUMP;
|
||||
identity->wakeup = gst_element_add_wakeup (GST_ELEMENT (identity), FALSE,
|
||||
gst_identity_wakeup, NULL);
|
||||
|
||||
identity->loop_based = FALSE;
|
||||
identity->sleep_time = 0;
|
||||
identity->duplicate = 1;
|
||||
identity->error_after = -1;
|
||||
identity->drop_probability = 0.0;
|
||||
identity->silent = FALSE;
|
||||
identity->check_perfect = FALSE;
|
||||
identity->prev_timestamp = GST_CLOCK_TIME_NONE;
|
||||
identity->prev_duration = GST_CLOCK_TIME_NONE;
|
||||
identity->prev_offset_end = -1;
|
||||
identity->dump = FALSE;
|
||||
identity->last_message = NULL;
|
||||
identity->srccaps = NULL;
|
||||
|
||||
GST_FLAG_SET (identity, GST_ELEMENT_EVENT_AWARE);
|
||||
GST_FLAG_SET (identity, GST_ELEMENT_WORK_IN_PLACE);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
gst_identity_set_clock (GstElement * element, GstClock * clock)
|
||||
gst_identity_push (GstIdentity * identity, GstBuffer * buf)
|
||||
{
|
||||
GstIdentity *identity = GST_IDENTITY (element);
|
||||
if (!identity->silent) {
|
||||
g_free (identity->last_message);
|
||||
identity->last_message =
|
||||
g_strdup_printf ("chain ******* (%s:%s)i (%d bytes, timestamp: %"
|
||||
GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %"
|
||||
G_GINT64_FORMAT ", offset_end: % " G_GINT64_FORMAT ", flags: %d) %p",
|
||||
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf),
|
||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
||||
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_BUFFER_OFFSET (buf),
|
||||
GST_BUFFER_OFFSET_END (buf), GST_BUFFER_FLAGS (buf), buf);
|
||||
g_object_notify (G_OBJECT (identity), "last-message");
|
||||
}
|
||||
|
||||
gst_object_replace ((GstObject **) & identity->clock, (GstObject *) clock);
|
||||
gst_object_ref (GST_OBJECT (identity));
|
||||
g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0,
|
||||
buf);
|
||||
|
||||
if (identity->sleep_time)
|
||||
g_usleep (identity->sleep_time);
|
||||
|
||||
/* things may happen in handoff signals... */
|
||||
if (GST_ELEMENT_SCHED (identity))
|
||||
gst_pad_push (identity->srcpad, GST_DATA (buf));
|
||||
gst_object_unref (GST_OBJECT (identity));
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gst_identity_chain (GstPad * pad, GstData * _data)
|
||||
gst_identity_chain (GstAction * action, GstRealPad * pad, GstData * data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstIdentity *identity;
|
||||
guint i;
|
||||
|
||||
g_return_if_fail (pad != NULL);
|
||||
g_return_if_fail (GST_IS_PAD (pad));
|
||||
g_return_if_fail (buf != NULL);
|
||||
|
||||
identity = GST_IDENTITY (gst_pad_get_parent (pad));
|
||||
GstBuffer *buf;
|
||||
GstIdentity *identity = GST_IDENTITY (gst_pad_get_parent (GST_PAD (pad)));
|
||||
|
||||
buf = GST_BUFFER (data);
|
||||
if (GST_IS_EVENT (buf)) {
|
||||
GstEvent *event = GST_EVENT (buf);
|
||||
|
||||
|
@ -261,11 +231,12 @@ gst_identity_chain (GstPad * pad, GstData * _data)
|
|||
|
||||
identity->last_message =
|
||||
g_strdup_printf ("chain ******* (%s:%s)E (type: %d) %p",
|
||||
GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE (event), event);
|
||||
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_EVENT_TYPE (event),
|
||||
event);
|
||||
|
||||
g_object_notify (G_OBJECT (identity), "last_message");
|
||||
}
|
||||
gst_pad_event_default (pad, event);
|
||||
gst_pad_event_default (identity->sinkpad, event);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -328,75 +299,31 @@ gst_identity_chain (GstPad * pad, GstData * _data)
|
|||
gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
|
||||
}
|
||||
|
||||
for (i = identity->duplicate; i; i--) {
|
||||
GstClockTime time;
|
||||
|
||||
if (!identity->silent) {
|
||||
g_free (identity->last_message);
|
||||
identity->last_message =
|
||||
g_strdup_printf ("chain ******* (%s:%s)i (%d bytes, timestamp: %"
|
||||
GST_TIME_FORMAT ", duration: %" GST_TIME_FORMAT ", offset: %"
|
||||
G_GINT64_FORMAT ", offset_end: % " G_GINT64_FORMAT ", flags: %d) %p",
|
||||
GST_DEBUG_PAD_NAME (identity->sinkpad), GST_BUFFER_SIZE (buf),
|
||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
||||
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_BUFFER_OFFSET (buf),
|
||||
GST_BUFFER_OFFSET_END (buf), GST_BUFFER_FLAGS (buf), buf);
|
||||
g_object_notify (G_OBJECT (identity), "last-message");
|
||||
}
|
||||
|
||||
time = GST_BUFFER_TIMESTAMP (buf);
|
||||
|
||||
if (identity->datarate > 0) {
|
||||
time = identity->bytes_handled * GST_SECOND / identity->datarate;
|
||||
|
||||
GST_BUFFER_TIMESTAMP (buf) = time;
|
||||
GST_BUFFER_DURATION (buf) =
|
||||
GST_BUFFER_SIZE (buf) * GST_SECOND / identity->datarate;
|
||||
}
|
||||
|
||||
g_signal_emit (G_OBJECT (identity), gst_identity_signals[SIGNAL_HANDOFF], 0,
|
||||
buf);
|
||||
|
||||
if (i > 1)
|
||||
gst_buffer_ref (buf);
|
||||
|
||||
if (identity->sync) {
|
||||
if (identity->clock) {
|
||||
gst_element_wait (GST_ELEMENT (identity), time);
|
||||
}
|
||||
}
|
||||
|
||||
identity->bytes_handled += GST_BUFFER_SIZE (buf);
|
||||
gst_pad_push (identity->srcpad, GST_DATA (buf));
|
||||
|
||||
if (identity->sleep_time)
|
||||
g_usleep (identity->sleep_time);
|
||||
if (identity->duplicate > 1) {
|
||||
identity->current = buf;
|
||||
gst_data_ref (GST_DATA (buf));
|
||||
identity->missing = identity->duplicate - 1;
|
||||
gst_action_set_active (action, FALSE);
|
||||
gst_action_set_active (identity->wakeup, TRUE);
|
||||
}
|
||||
gst_identity_push (identity, buf);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_identity_loop (GstElement * element)
|
||||
gst_identity_wakeup (GstAction * action, GstElement * element, gpointer unused)
|
||||
{
|
||||
GstIdentity *identity;
|
||||
GstBuffer *buf;
|
||||
GstIdentity *identity = GST_IDENTITY (element);
|
||||
GstBuffer *buf = identity->current;
|
||||
|
||||
g_return_if_fail (element != NULL);
|
||||
g_return_if_fail (GST_IS_IDENTITY (element));
|
||||
|
||||
identity = GST_IDENTITY (element);
|
||||
|
||||
buf = GST_BUFFER (gst_pad_pull (identity->sinkpad));
|
||||
if (GST_IS_EVENT (buf)) {
|
||||
GstEvent *event = GST_EVENT (buf);
|
||||
|
||||
if (GST_EVENT_IS_INTERRUPT (event)) {
|
||||
gst_event_unref (event);
|
||||
g_assert (buf);
|
||||
if (--identity->missing) {
|
||||
gst_data_ref (GST_DATA (buf));
|
||||
} else {
|
||||
gst_pad_event_default (identity->sinkpad, event);
|
||||
}
|
||||
} else {
|
||||
gst_identity_chain (identity->sinkpad, GST_DATA (buf));
|
||||
identity->current = NULL;
|
||||
gst_action_set_active (action, FALSE);
|
||||
gst_real_pad_set_active (GST_REAL_PAD (identity->sinkpad), TRUE);
|
||||
}
|
||||
gst_identity_push (identity, buf);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -411,17 +338,6 @@ gst_identity_set_property (GObject * object, guint prop_id,
|
|||
identity = GST_IDENTITY (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case ARG_LOOP_BASED:
|
||||
identity->loop_based = g_value_get_boolean (value);
|
||||
if (identity->loop_based) {
|
||||
gst_element_set_loop_function (GST_ELEMENT (identity),
|
||||
gst_identity_loop);
|
||||
gst_pad_set_chain_function (identity->sinkpad, NULL);
|
||||
} else {
|
||||
gst_pad_set_chain_function (identity->sinkpad, gst_identity_chain);
|
||||
gst_element_set_loop_function (GST_ELEMENT (identity), NULL);
|
||||
}
|
||||
break;
|
||||
case ARG_SLEEP_TIME:
|
||||
identity->sleep_time = g_value_get_uint (value);
|
||||
break;
|
||||
|
@ -440,12 +356,6 @@ gst_identity_set_property (GObject * object, guint prop_id,
|
|||
case ARG_DROP_PROBABILITY:
|
||||
identity->drop_probability = g_value_get_float (value);
|
||||
break;
|
||||
case ARG_DATARATE:
|
||||
identity->datarate = g_value_get_int (value);
|
||||
break;
|
||||
case ARG_SYNC:
|
||||
identity->sync = g_value_get_boolean (value);
|
||||
break;
|
||||
case ARG_CHECK_PERFECT:
|
||||
identity->check_perfect = g_value_get_boolean (value);
|
||||
break;
|
||||
|
@ -467,9 +377,6 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
identity = GST_IDENTITY (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case ARG_LOOP_BASED:
|
||||
g_value_set_boolean (value, identity->loop_based);
|
||||
break;
|
||||
case ARG_SLEEP_TIME:
|
||||
g_value_set_uint (value, identity->sleep_time);
|
||||
break;
|
||||
|
@ -482,9 +389,6 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
case ARG_DROP_PROBABILITY:
|
||||
g_value_set_float (value, identity->drop_probability);
|
||||
break;
|
||||
case ARG_DATARATE:
|
||||
g_value_set_int (value, identity->datarate);
|
||||
break;
|
||||
case ARG_SILENT:
|
||||
g_value_set_boolean (value, identity->silent);
|
||||
break;
|
||||
|
@ -494,9 +398,6 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
case ARG_LAST_MESSAGE:
|
||||
g_value_set_string (value, identity->last_message);
|
||||
break;
|
||||
case ARG_SYNC:
|
||||
g_value_set_boolean (value, identity->sync);
|
||||
break;
|
||||
case ARG_CHECK_PERFECT:
|
||||
g_value_set_boolean (value, identity->check_perfect);
|
||||
break;
|
||||
|
@ -509,29 +410,14 @@ gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
static GstElementStateReturn
|
||||
gst_identity_change_state (GstElement * element)
|
||||
{
|
||||
GstIdentity *identity;
|
||||
|
||||
g_return_val_if_fail (GST_IS_IDENTITY (element), GST_STATE_FAILURE);
|
||||
|
||||
identity = GST_IDENTITY (element);
|
||||
GstIdentity *identity = GST_IDENTITY (element);
|
||||
|
||||
switch (GST_STATE_TRANSITION (element)) {
|
||||
case GST_STATE_NULL_TO_READY:
|
||||
break;
|
||||
case GST_STATE_READY_TO_PAUSED:
|
||||
identity->bytes_handled = 0;
|
||||
identity->prev_timestamp = GST_CLOCK_TIME_NONE;
|
||||
identity->prev_duration = GST_CLOCK_TIME_NONE;
|
||||
identity->prev_offset_end = -1;
|
||||
break;
|
||||
case GST_STATE_PAUSED_TO_PLAYING:
|
||||
case GST_STATE_PLAYING_TO_PAUSED:
|
||||
break;
|
||||
case GST_STATE_PAUSED_TO_READY:
|
||||
g_free (identity->last_message);
|
||||
identity->last_message = NULL;
|
||||
break;
|
||||
case GST_STATE_READY_TO_NULL:
|
||||
if (identity->current) {
|
||||
gst_data_unref (GST_DATA (identity->current));
|
||||
identity->current = NULL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -47,27 +47,27 @@ typedef struct _GstIdentityClass GstIdentityClass;
|
|||
struct _GstIdentity {
|
||||
GstElement element;
|
||||
|
||||
GstPad *sinkpad;
|
||||
GstPad *srcpad;
|
||||
GstPad * sinkpad;
|
||||
GstPad * srcpad;
|
||||
|
||||
GstAction * wakeup;
|
||||
|
||||
gboolean loop_based;
|
||||
guint duplicate;
|
||||
gint error_after;
|
||||
gfloat drop_probability;
|
||||
gint datarate;
|
||||
guint sleep_time;
|
||||
gboolean silent;
|
||||
gboolean dump;
|
||||
gboolean sync;
|
||||
gboolean check_perfect;
|
||||
GstClockTime prev_timestamp;
|
||||
GstClockTime prev_duration;
|
||||
guint64 prev_offset_end;
|
||||
GstClock *clock;
|
||||
gchar *last_message;
|
||||
GstCaps *srccaps;
|
||||
|
||||
guint64 bytes_handled;
|
||||
GstBuffer * current;
|
||||
guint missing;
|
||||
};
|
||||
|
||||
struct _GstIdentityClass {
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,7 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||
* 2000 Wim Taymans <wtay@chello.be>
|
||||
* 2004,2005 Benjamin Otte <otte@gnome.org>
|
||||
*
|
||||
* gstqueue.h:
|
||||
*
|
||||
|
@ -52,9 +53,10 @@ typedef struct _GstQueueSize GstQueueSize;
|
|||
typedef struct _GstQueueClass GstQueueClass;
|
||||
|
||||
struct _GstQueueSize {
|
||||
guint items; /* no. of items */
|
||||
guint buffers; /* no. of buffers */
|
||||
guint bytes; /* no. of bytes */
|
||||
guint64 time; /* amount of time */
|
||||
GstClockTime time; /* amount of time */
|
||||
};
|
||||
|
||||
struct _GstQueue {
|
||||
|
@ -69,39 +71,25 @@ struct _GstQueue {
|
|||
GstQueueSize
|
||||
cur_level, /* currently in the queue */
|
||||
max_size, /* max. amount of data allowed in the queue */
|
||||
min_threshold; /* min. amount of data required to wake reader */
|
||||
min_threshold, /* min. amount of data required to wake reader */
|
||||
max_threshold; /* min. amount of data required to wake writer */
|
||||
|
||||
/* whether we leak data, and at which end */
|
||||
gint leaky;
|
||||
|
||||
/* number of nanoseconds until a blocked queue 'times out'
|
||||
* to receive data and returns a filler event. -1 = disable */
|
||||
guint64 block_timeout;
|
||||
|
||||
/* it the queue should fail on possible deadlocks */
|
||||
gboolean may_deadlock;
|
||||
|
||||
gboolean interrupt;
|
||||
gboolean flush;
|
||||
gboolean got_eos;
|
||||
|
||||
GMutex *qlock; /* lock for queue (vs object lock) */
|
||||
GCond *item_add; /* signals buffers now available for reading */
|
||||
GCond *item_del; /* signals space now available for writing */
|
||||
GCond *event_done; /* upstream event signaller */
|
||||
|
||||
GTimeVal *timeval; /* the timeout for the queue locking */
|
||||
GQueue *events; /* upstream events get decoupled here */
|
||||
|
||||
GstCaps *negotiated_caps;
|
||||
|
||||
GMutex *event_lock; /* lock when handling the events queue */
|
||||
|
||||
gpointer _gst_reserved[GST_PADDING - 1];
|
||||
};
|
||||
|
||||
struct _GstQueueClass {
|
||||
GstElementClass parent_class;
|
||||
|
||||
/* vtable */
|
||||
|
||||
/* signals - 'running' is called from both sides
|
||||
* which might make it sort of non-useful... */
|
||||
void (*underrun) (GstQueue *queue);
|
||||
|
|
|
@ -27,15 +27,10 @@
|
|||
#include "gsttee.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_tee_debug);
|
||||
#if 0
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_tee_debug, "tee", 0, "tee element");
|
||||
#define GST_CAT_DEFAULT gst_tee_debug
|
||||
|
||||
#endif
|
||||
GstElementDetails gst_tee_details = GST_ELEMENT_DETAILS ("Tee pipe fitting",
|
||||
"Generic",
|
||||
"1-to-N pipe fitting",
|
||||
|
@ -63,10 +58,7 @@ GstStaticPadTemplate tee_src_template = GST_STATIC_PAD_TEMPLATE ("src%d",
|
|||
GST_PAD_REQUEST,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
#define _do_init(bla) \
|
||||
GST_DEBUG_CATEGORY_INIT (gst_tee_debug, "tee", 0, "tee element");
|
||||
|
||||
GST_BOILERPLATE_FULL (GstTee, gst_tee, GstElement, GST_TYPE_ELEMENT, _do_init);
|
||||
GST_BOILERPLATE (GstTee, gst_tee, GstElement, GST_TYPE_ELEMENT);
|
||||
|
||||
static GstPad *gst_tee_request_new_pad (GstElement * element,
|
||||
GstPadTemplate * temp, const gchar * unused);
|
||||
|
@ -77,7 +69,10 @@ static void gst_tee_set_property (GObject * object, guint prop_id,
|
|||
static void gst_tee_get_property (GObject * object, guint prop_id,
|
||||
GValue * value, GParamSpec * pspec);
|
||||
|
||||
static void gst_tee_chain (GstPad * pad, GstData * _data);
|
||||
static void gst_tee_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * data);
|
||||
static GstData *gst_tee_get (GstAction * action, GstRealPad * pad);
|
||||
static GstElementStateReturn gst_tee_change_state (GstElement * element);
|
||||
|
||||
|
||||
static void
|
||||
|
@ -85,8 +80,6 @@ gst_tee_base_init (gpointer g_class)
|
|||
{
|
||||
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
||||
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&sinktemplate));
|
||||
gst_element_class_set_details (gstelement_class, &gst_tee_details);
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&tee_src_template));
|
||||
|
@ -114,6 +107,9 @@ gst_tee_class_init (GstTeeClass * klass)
|
|||
gstelement_class = (GstElementClass *) klass;
|
||||
|
||||
|
||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_tee_get_property);
|
||||
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_tee_set_property);
|
||||
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NUM_PADS,
|
||||
g_param_spec_int ("num_pads", "num_pads", "num_pads",
|
||||
0, G_MAXINT, 0, G_PARAM_READABLE));
|
||||
|
@ -126,9 +122,8 @@ gst_tee_class_init (GstTeeClass * klass)
|
|||
|
||||
|
||||
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_tee_finalize);
|
||||
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_tee_set_property);
|
||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_tee_get_property);
|
||||
|
||||
gstelement_class->change_state = gst_tee_change_state;
|
||||
gstelement_class->request_new_pad =
|
||||
GST_DEBUG_FUNCPTR (gst_tee_request_new_pad);
|
||||
}
|
||||
|
@ -136,17 +131,16 @@ gst_tee_class_init (GstTeeClass * klass)
|
|||
static void
|
||||
gst_tee_init (GstTee * tee)
|
||||
{
|
||||
tee->sinkpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
tee->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
|
||||
gst_sink_pad_set_action_handler (tee->sinkpad, gst_tee_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (tee), tee->sinkpad);
|
||||
gst_pad_set_chain_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_chain));
|
||||
gst_pad_set_link_function (tee->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_pad_proxy_pad_link));
|
||||
gst_pad_set_getcaps_function (tee->sinkpad,
|
||||
GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
||||
|
||||
tee->last_message = NULL;
|
||||
GST_FLAG_SET (tee, GST_ELEMENT_EVENT_AWARE);
|
||||
}
|
||||
|
||||
/* helper compare function */
|
||||
|
@ -161,56 +155,6 @@ name_pad_compare (gconstpointer a, gconstpointer b)
|
|||
return strcmp (name, gst_pad_get_name (pad)); /* returns 0 if match */
|
||||
}
|
||||
|
||||
static GstCaps *
|
||||
gst_tee_getcaps (GstPad * _pad)
|
||||
{
|
||||
GstTee *tee = GST_TEE (gst_pad_get_parent (_pad));
|
||||
GstCaps *caps = gst_caps_new_any (), *tmp, *res;
|
||||
GstPad *pad;
|
||||
const GList *pads;
|
||||
|
||||
for (pads = gst_element_get_pad_list (GST_ELEMENT (tee));
|
||||
pads != NULL; pads = pads->next) {
|
||||
pad = GST_PAD (pads->data);
|
||||
if (pad == _pad)
|
||||
continue;
|
||||
|
||||
tmp = gst_pad_get_allowed_caps (pad);
|
||||
res = gst_caps_intersect (caps, tmp);
|
||||
gst_caps_free (tmp);
|
||||
gst_caps_free (caps);
|
||||
caps = res;
|
||||
}
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
static GstPadLinkReturn
|
||||
gst_tee_link (GstPad * _pad, const GstCaps * caps)
|
||||
{
|
||||
GstTee *tee = GST_TEE (gst_pad_get_parent (_pad));
|
||||
GstPadLinkReturn res;
|
||||
GstPad *pad;
|
||||
const GList *pads;
|
||||
|
||||
GST_DEBUG_OBJECT (tee, "Forwarding link to all other pads");
|
||||
|
||||
for (pads = gst_element_get_pad_list (GST_ELEMENT (tee));
|
||||
pads != NULL; pads = pads->next) {
|
||||
pad = GST_PAD (pads->data);
|
||||
if (pad == _pad)
|
||||
continue;
|
||||
|
||||
res = gst_pad_try_set_caps (pad, caps);
|
||||
GST_DEBUG_OBJECT (tee, "Pad %s:%s gave response %d",
|
||||
GST_DEBUG_PAD_NAME (pad), res);
|
||||
if (GST_PAD_LINK_FAILED (res))
|
||||
return res;
|
||||
}
|
||||
|
||||
return GST_PAD_LINK_OK;
|
||||
}
|
||||
|
||||
static GstPad *
|
||||
gst_tee_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
||||
const gchar * unused)
|
||||
|
@ -252,8 +196,11 @@ gst_tee_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
|||
|
||||
srcpad = gst_pad_new_from_template (templ, name);
|
||||
g_free (name);
|
||||
gst_pad_set_link_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_link));
|
||||
gst_pad_set_getcaps_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_getcaps));
|
||||
gst_src_pad_set_action_handler (srcpad, gst_tee_get);
|
||||
gst_pad_set_link_function (srcpad,
|
||||
GST_DEBUG_FUNCPTR (gst_pad_proxy_pad_link));
|
||||
gst_pad_set_getcaps_function (srcpad,
|
||||
GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
|
||||
gst_element_add_pad (GST_ELEMENT (tee), srcpad);
|
||||
GST_PAD_ELEMENT_PRIVATE (srcpad) = NULL;
|
||||
|
||||
|
@ -313,50 +260,82 @@ gst_tee_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_tee_chain:
|
||||
* @pad: the pad to follow
|
||||
* @buf: the buffer to pass
|
||||
*
|
||||
* Chain a buffer on a pad.
|
||||
*/
|
||||
static void
|
||||
gst_tee_chain (GstPad * pad, GstData * _data)
|
||||
static GstData *
|
||||
gst_tee_get (GstAction * action, GstRealPad * pad)
|
||||
{
|
||||
GstData *data;
|
||||
GstTee *tee = GST_TEE (gst_action_get_element (action));
|
||||
|
||||
g_assert (tee->current);
|
||||
if (!tee->silent) {
|
||||
GstData *data = tee->current;
|
||||
|
||||
g_free (tee->last_message);
|
||||
tee->last_message =
|
||||
g_strdup_printf ("request ******* (%s:%s)t (%d bytes, %"
|
||||
G_GUINT64_FORMAT ") %p", GST_DEBUG_PAD_NAME (pad),
|
||||
GST_IS_BUFFER (data) ? GST_BUFFER_SIZE (data) : 0,
|
||||
GST_IS_BUFFER (data) ? GST_BUFFER_TIMESTAMP (data) :
|
||||
GST_CLOCK_TIME_NONE, data);
|
||||
g_object_notify (G_OBJECT (tee), "last_message");
|
||||
}
|
||||
data = tee->current;
|
||||
gst_action_set_active (action, FALSE);
|
||||
tee->missing_pads--;
|
||||
if (tee->missing_pads == 0) {
|
||||
gst_real_pad_set_active (GST_REAL_PAD (tee->sinkpad), TRUE);
|
||||
if (GST_IS_EVENT (tee->current) &&
|
||||
GST_EVENT_TYPE (tee->current) == GST_EVENT_EOS) {
|
||||
gst_element_set_eos (GST_ELEMENT (tee));
|
||||
}
|
||||
tee->current = NULL;
|
||||
} else {
|
||||
gst_data_ref (tee->current);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_tee_chain (GstAction * action, GstRealPad * pad, GstData * data)
|
||||
{
|
||||
GstBuffer *buf = GST_BUFFER (_data);
|
||||
GstTee *tee;
|
||||
const GList *pads;
|
||||
GstTee *tee = GST_TEE (gst_action_get_element (action));
|
||||
|
||||
g_return_if_fail (pad != NULL);
|
||||
g_return_if_fail (GST_IS_PAD (pad));
|
||||
g_return_if_fail (buf != NULL);
|
||||
|
||||
tee = GST_TEE (gst_pad_get_parent (pad));
|
||||
|
||||
gst_buffer_ref_by_count (buf, GST_ELEMENT (tee)->numsrcpads - 1);
|
||||
|
||||
pads = gst_element_get_pad_list (GST_ELEMENT (tee));
|
||||
|
||||
while (pads) {
|
||||
g_assert (tee->current == NULL);
|
||||
g_assert (tee->missing_pads == 0);
|
||||
tee->current = data;
|
||||
for (pads = gst_element_get_pad_list (GST_ELEMENT (tee)); pads;
|
||||
pads = g_list_next (pads)) {
|
||||
GstPad *outpad = GST_PAD (pads->data);
|
||||
|
||||
pads = g_list_next (pads);
|
||||
|
||||
if (GST_PAD_DIRECTION (outpad) != GST_PAD_SRC)
|
||||
continue;
|
||||
|
||||
if (!tee->silent) {
|
||||
g_free (tee->last_message);
|
||||
tee->last_message =
|
||||
g_strdup_printf ("chain ******* (%s:%s)t (%d bytes, %"
|
||||
G_GUINT64_FORMAT ") %p", GST_DEBUG_PAD_NAME (outpad),
|
||||
GST_BUFFER_SIZE (buf), GST_BUFFER_TIMESTAMP (buf), buf);
|
||||
g_object_notify (G_OBJECT (tee), "last_message");
|
||||
gst_real_pad_set_active (GST_REAL_PAD (outpad), TRUE);
|
||||
tee->missing_pads++;
|
||||
}
|
||||
gst_real_pad_set_active (GST_REAL_PAD (tee->sinkpad), FALSE);
|
||||
}
|
||||
|
||||
static GstElementStateReturn
|
||||
gst_tee_change_state (GstElement * element)
|
||||
{
|
||||
GstTee *tee = GST_TEE (element);
|
||||
|
||||
switch (GST_STATE_TRANSITION (element)) {
|
||||
case GST_STATE_PAUSED_TO_READY:
|
||||
if (tee->current) {
|
||||
gst_data_unref (tee->current);
|
||||
tee->current = NULL;
|
||||
tee->missing_pads = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (GST_PAD_IS_USABLE (outpad))
|
||||
gst_pad_push (outpad, GST_DATA (buf));
|
||||
else
|
||||
gst_buffer_unref (buf);
|
||||
}
|
||||
if (GST_ELEMENT_CLASS (parent_class)->change_state)
|
||||
return GST_ELEMENT_CLASS (parent_class)->change_state (element);
|
||||
|
||||
return GST_STATE_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -48,6 +48,9 @@ struct _GstTee {
|
|||
|
||||
GstPad *sinkpad;
|
||||
|
||||
GstData *current; /* current data peers should pull */
|
||||
gint missing_pads; /* number of pads that haven't pulled yet */
|
||||
|
||||
gboolean silent;
|
||||
gchar *last_message;
|
||||
};
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include <gst/gsttypefind.h>
|
||||
#include <gst/gstutils.h>
|
||||
#include <gst/gsterror.h>
|
||||
#include <gst/gstaction.h>
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_type_find_element_debug);
|
||||
#define GST_CAT_DEFAULT gst_type_find_element_debug
|
||||
|
@ -103,16 +104,17 @@ static void gst_type_find_element_set_property (GObject * object,
|
|||
static void gst_type_find_element_get_property (GObject * object,
|
||||
guint prop_id, GValue * value, GParamSpec * pspec);
|
||||
|
||||
static const GstEventMask *gst_type_find_element_src_event_mask (GstPad * pad);
|
||||
static gboolean gst_type_find_element_src_event (GstPad * pad,
|
||||
GstEvent * event);
|
||||
static gboolean gst_type_find_handle_src_query (GstPad * pad,
|
||||
GstQueryType type, GstFormat * fmt, gint64 * value);
|
||||
static void push_buffer_store (GstTypeFindElement * typefind);
|
||||
|
||||
static void gst_type_find_element_chain (GstPad * sinkpad, GstData * data);
|
||||
static GstElementStateReturn
|
||||
gst_type_find_element_change_state (GstElement * element);
|
||||
static void gst_type_find_element_wakeup (GstAction * action,
|
||||
GstElement * element, gpointer unused);
|
||||
static void gst_type_find_element_chain (GstAction * action,
|
||||
GstRealPad * sinkpad, GstData * data);
|
||||
static GstElementStateReturn gst_type_find_element_change_state (GstElement *
|
||||
element);
|
||||
|
||||
static guint gst_type_find_element_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
|
@ -178,33 +180,35 @@ gst_type_find_element_class_init (GstTypeFindElementClass * typefind_class)
|
|||
static void
|
||||
gst_type_find_element_init (GstTypeFindElement * typefind)
|
||||
{
|
||||
GST_FLAG_SET (typefind, GST_ELEMENT_EVENT_AWARE);
|
||||
GST_FLAG_SET (typefind, GST_ELEMENT_PUSHING);
|
||||
|
||||
/* sinkpad */
|
||||
typefind->sink =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get
|
||||
(&type_find_element_sink_template), "sink");
|
||||
gst_pad_set_chain_function (typefind->sink, gst_type_find_element_chain);
|
||||
gst_sink_pad_set_action_handler (typefind->sink, gst_type_find_element_chain);
|
||||
gst_element_add_pad (GST_ELEMENT (typefind), typefind->sink);
|
||||
/* srcpad */
|
||||
typefind->src =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get
|
||||
(&type_find_element_src_template), "src");
|
||||
gst_pad_set_event_function (typefind->src, gst_type_find_element_src_event);
|
||||
gst_pad_set_event_mask_function (typefind->src,
|
||||
gst_type_find_element_src_event_mask);
|
||||
gst_pad_set_query_function (typefind->src,
|
||||
GST_DEBUG_FUNCPTR (gst_type_find_handle_src_query));
|
||||
gst_pad_use_explicit_caps (typefind->src);
|
||||
gst_element_add_pad (GST_ELEMENT (typefind), typefind->src);
|
||||
|
||||
typefind->wakeup = gst_element_add_wakeup (GST_ELEMENT (typefind), FALSE,
|
||||
gst_type_find_element_wakeup, NULL);
|
||||
typefind->caps = NULL;
|
||||
typefind->pending_events = NULL;
|
||||
typefind->min_probability = 1;
|
||||
typefind->max_probability = GST_TYPE_FIND_MAXIMUM;
|
||||
|
||||
typefind->store = gst_buffer_store_new ();
|
||||
|
||||
GST_FLAG_SET (typefind, GST_ELEMENT_EVENT_AWARE);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_type_find_element_dispose (GObject * object)
|
||||
{
|
||||
|
@ -294,20 +298,6 @@ gst_type_find_handle_src_query (GstPad * pad,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static const GstEventMask *
|
||||
gst_type_find_element_src_event_mask (GstPad * pad)
|
||||
{
|
||||
static const GstEventMask mask[] = {
|
||||
{GST_EVENT_SEEK,
|
||||
GST_SEEK_METHOD_SET | GST_SEEK_METHOD_CUR | GST_SEEK_METHOD_END |
|
||||
GST_SEEK_FLAG_FLUSH},
|
||||
/* add more if you want, event masks suck and need to die anyway */
|
||||
{0,}
|
||||
};
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_type_find_element_src_event (GstPad * pad, GstEvent * event)
|
||||
{
|
||||
|
@ -368,6 +358,19 @@ start_typefinding (GstTypeFindElement * typefind)
|
|||
typefind->stream_length_available = TRUE;
|
||||
typefind->stream_length = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
push_buffer_store (GstTypeFindElement * typefind, GstEvent * event)
|
||||
{
|
||||
if (!event)
|
||||
event = gst_event_new_discontinuous (TRUE,
|
||||
GST_FORMAT_DEFAULT, (guint64) 0, GST_FORMAT_BYTES, (guint64) 0,
|
||||
GST_FORMAT_UNDEFINED);
|
||||
typefind->pending_events = g_list_append (typefind->pending_events, event);
|
||||
gst_real_pad_set_active (GST_REAL_PAD (typefind->sink), FALSE);
|
||||
gst_action_set_active (typefind->wakeup, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
stop_typefinding (GstTypeFindElement * typefind)
|
||||
{
|
||||
|
@ -401,7 +404,7 @@ stop_typefinding (GstTypeFindElement * typefind)
|
|||
"could not seek to required position %u, hope for the best", size);
|
||||
typefind->mode = MODE_NORMAL;
|
||||
/* push out our queued buffers here */
|
||||
push_buffer_store (typefind);
|
||||
push_buffer_store (typefind, NULL);
|
||||
} else {
|
||||
typefind->waiting_for_discont_offset = size;
|
||||
}
|
||||
|
@ -409,25 +412,26 @@ stop_typefinding (GstTypeFindElement * typefind)
|
|||
}
|
||||
|
||||
static void
|
||||
push_buffer_store (GstTypeFindElement * typefind)
|
||||
gst_type_find_element_wakeup (GstAction * action, GstElement * element,
|
||||
gpointer unused)
|
||||
{
|
||||
guint size = gst_buffer_store_get_size (typefind->store, 0);
|
||||
guint size;
|
||||
GstBuffer *buffer;
|
||||
const GList *item;
|
||||
GstTypeFindElement *typefind = GST_TYPE_FIND_ELEMENT (element);
|
||||
|
||||
/* handle pending events */
|
||||
for (item = typefind->pending_events; item; item = item->next) {
|
||||
if (typefind->pending_events) {
|
||||
GstEvent *e = item->data;
|
||||
|
||||
typefind->pending_events = g_list_remove (typefind->pending_events,
|
||||
typefind->pending_events->data);
|
||||
gst_pad_push (typefind->src, GST_DATA (e));
|
||||
return;
|
||||
}
|
||||
g_list_free (typefind->pending_events);
|
||||
typefind->pending_events = NULL;
|
||||
|
||||
/* data */
|
||||
gst_pad_push (typefind->src, GST_DATA (gst_event_new_discontinuous (TRUE,
|
||||
GST_FORMAT_DEFAULT, (guint64) 0, GST_FORMAT_BYTES, (guint64) 0,
|
||||
GST_FORMAT_UNDEFINED)));
|
||||
size = gst_buffer_store_get_size (typefind->store, 0);
|
||||
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
|
||||
GST_DEBUG_OBJECT (typefind, "pushing cached data (%u bytes)", size);
|
||||
gst_pad_push (typefind->src, GST_DATA (buffer));
|
||||
|
@ -437,6 +441,8 @@ push_buffer_store (GstTypeFindElement * typefind)
|
|||
}
|
||||
|
||||
gst_buffer_store_clear (typefind->store);
|
||||
gst_action_set_active (action, FALSE);
|
||||
gst_real_pad_set_active (GST_REAL_PAD (typefind->sink), TRUE);
|
||||
}
|
||||
|
||||
static guint64
|
||||
|
@ -496,8 +502,7 @@ gst_type_find_element_handle_event (GstPad * pad, GstEvent * event)
|
|||
g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE],
|
||||
0, entry->probability, entry->caps);
|
||||
stop_typefinding (typefind);
|
||||
push_buffer_store (typefind);
|
||||
gst_pad_event_default (pad, event);
|
||||
push_buffer_store (typefind, event);
|
||||
} else {
|
||||
gst_pad_event_default (pad, event);
|
||||
GST_ELEMENT_ERROR (typefind, STREAM, TYPE_NOT_FOUND, (NULL),
|
||||
|
@ -526,13 +531,11 @@ gst_type_find_element_handle_event (GstPad * pad, GstEvent * event)
|
|||
if (gst_event_discont_get_value (event, GST_FORMAT_BYTES, &off) &&
|
||||
off == typefind->waiting_for_discont_offset) {
|
||||
typefind->mode = MODE_NORMAL;
|
||||
push_buffer_store (typefind);
|
||||
push_buffer_store (typefind, NULL);
|
||||
}
|
||||
gst_event_unref (event);
|
||||
}
|
||||
} else if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
|
||||
push_buffer_store (typefind);
|
||||
gst_pad_event_default (pad, event);
|
||||
push_buffer_store (typefind, event);
|
||||
} else {
|
||||
gst_event_unref (event);
|
||||
}
|
||||
|
@ -618,7 +621,8 @@ compare_type_find_factory (gconstpointer fac1, gconstpointer fac2)
|
|||
return GST_PLUGIN_FEATURE (fac1)->rank - GST_PLUGIN_FEATURE (fac2)->rank;
|
||||
}
|
||||
static void
|
||||
gst_type_find_element_chain (GstPad * pad, GstData * data)
|
||||
gst_type_find_element_chain (GstAction * action, GstRealPad * pad,
|
||||
GstData * data)
|
||||
{
|
||||
GstTypeFindElement *typefind;
|
||||
GList *entries;
|
||||
|
@ -626,9 +630,9 @@ gst_type_find_element_chain (GstPad * pad, GstData * data)
|
|||
GList *walk;
|
||||
GstTypeFind find = { find_peek, find_suggest, NULL, find_element_get_length };
|
||||
|
||||
typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad));
|
||||
typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (GST_PAD (pad)));
|
||||
if (GST_IS_EVENT (data)) {
|
||||
gst_type_find_element_handle_event (pad, GST_EVENT (data));
|
||||
gst_type_find_element_handle_event (GST_PAD (pad), GST_EVENT (data));
|
||||
return;
|
||||
}
|
||||
switch (typefind->mode) {
|
||||
|
|
|
@ -48,6 +48,8 @@ struct _GstTypeFindElement {
|
|||
GstPad * sink;
|
||||
GstPad * src;
|
||||
|
||||
GstAction * wakeup;
|
||||
|
||||
guint min_probability;
|
||||
guint max_probability;
|
||||
GstCaps * caps;
|
||||
|
|
189
po/af.po
189
po/af.po
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-03-24 11:28+0200\n"
|
||||
"Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n"
|
||||
"Language-Team: Afrikaans <i18n@af.org.za>\n"
|
||||
|
@ -15,30 +15,30 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Vertoon die GStreamer weergawe"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Maak alle waarskuwings fataal"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Vertoon beskikbare ontfoutkategorië en stop"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Verstek ontfoutvlak vanaf 1 (slegs fout) tot 5 (enigiets) of 0 vir geen "
|
||||
"afvoer"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "VLAK"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -46,31 +46,27 @@ msgstr ""
|
|||
"Komma-geskeide lys van kategorie_naam:vlak pare om die individuele "
|
||||
"kategorieë op te stel. Byvoorbeeld: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "LYS"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Skakel gekleurde ontfout-afvoer af"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Skakel ontfouting af"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Skakel versnelde SVE-instruksies af"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Aktiveer volledige diagnostiese boodskappe vir inproplaaiing"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "PAAIE"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -79,32 +75,32 @@ msgstr ""
|
|||
"Komma-geskeide lys van inproppe om vooraf te laai by die lys gestoor in die "
|
||||
"omgewingsveranderlike GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "INPROPPE"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr "Moenie segmenteringsfoute tydens inproplaaiing ondervang nie"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "SKEDULEERDER"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Register om te gebruik"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTER"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, fuzzy, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "lys van paaie waaruit inproppe gelaai word (geskei met '"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, fuzzy, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Skeduleerder om te gebruik ('"
|
||||
|
@ -586,52 +582,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
"Daar is geen element beskikbaar om die stroom se mime-tipe %s te hanteer nie."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Geen lêernaam om heen te skryf nie."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Kon nie lêer \"%s\" oopmaak om in te skryf nie."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Fout met toemaak van lêer \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Fout tydens skryf na lêer \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Geen lêernaam om uit te lees nie."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Kon nie lêer \"%s\" oopmaak om te lees nie."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, fuzzy, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Lêer \"%s\" is nie 'n gewone lêer nie."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Mislukking na die vasgestelde aantal probeerslae."
|
||||
|
||||
|
@ -720,123 +710,79 @@ msgstr "kon nie aan bestemming-element vir URI \"%s\" verbind nie"
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "leë pyplyn word nie toegelaat nie"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
#, fuzzy
|
||||
msgid "Print all elements"
|
||||
msgstr "geen element \"%s\""
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr "Gebruik so: gst-xmllaunch <lêer.xml> [ element.eienskap=waarde ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "FOUT: ontleding van xml-lêer '%s' het misluk.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "FOUT: geen topvlak pyplynelement in lêer '%s' nie.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "WAARSKUWING: slegs een topvlak element word tans ondersteun."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "FOUT: onverstaanbare bevellynparameter %d: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "WAARSKUWING: element genaamd '%s' nie gevind nie.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "ETIKET GEVIND : gevind by element \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Wys etikette (ook bekend as metadata)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Wys statusinligting en kennisgewings van eienskappe"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Moenie statusinligting van TIPE wys nie"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "TIPE1, TIPE2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Stoor xml-voorstelling van pyplyn na LÊER en stop"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "LÊER"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Moenie 'n fouthanteerder installeer nie"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Druk \"alloc trace\" (indien aangeskakel tydens kompilering)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Aantal kere wat pyplyn herhaal moet word"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "FOUT: pyplyn kon nie opgestel word nie: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "FOUT: pyplyn kon nie opgestel word nie.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "WAARSKUWING: foutiewe pyplyn: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Probeer om weg te hardloop.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "FOUT: die pyplynelement kon nie gevind word nie.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "LOOP pyplyn ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "FOUT: pyplyn wil nie speel nie.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -871,6 +817,39 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Skakel versnelde SVE-instruksies af"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr ""
|
||||
#~ "Daar is geen element beskikbaar om die stroom se mime-tipe %s te hanteer "
|
||||
#~ "nie."
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Gebruik so: gst-xmllaunch <lêer.xml> [ element.eienskap=waarde ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "FOUT: ontleding van xml-lêer '%s' het misluk.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "FOUT: geen topvlak pyplynelement in lêer '%s' nie.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "WAARSKUWING: slegs een topvlak element word tans ondersteun."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "FOUT: onverstaanbare bevellynparameter %d: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "WAARSKUWING: element genaamd '%s' nie gevind nie.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Stoor xml-voorstelling van pyplyn na LÊER en stop"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "LÊER"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "caps"
|
||||
|
||||
|
|
158
po/az.po
158
po/az.po
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer-0.8.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-03-19 18:40+0200\n"
|
||||
"Last-Translator: Metin Amiroff <metin@karegen.com>\n"
|
||||
"Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n"
|
||||
|
@ -16,89 +16,85 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: KBabel 1.0.2\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "GStreamer buraxılışını göstər"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Bütün xətaları ölümcül et"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "SƏVİYYƏ"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "SİYAHI"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Xəta ayırmasını bağla"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "CIĞIRLAR"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
"environment variable GST_PLUGIN_PATH"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "ƏLAVƏLƏR"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "VAXTLAŞDIRICI"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "İşlədiləcək qeyd bazası"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "QEYDBAZASI"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr ""
|
||||
|
@ -563,51 +559,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr ""
|
||||
|
||||
|
@ -695,122 +686,78 @@ msgstr ""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "FAYL"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -845,5 +792,8 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "FAYL"
|
||||
|
||||
#~ msgid "')"
|
||||
#~ msgstr "')"
|
||||
|
|
200
po/ca.po
200
po/ca.po
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.7pre2\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-12-22 17:44+0100\n"
|
||||
"Last-Translator: Jordi Mallach <jordi@sindominio.net>\n"
|
||||
"Language-Team: Catalan <ca@dodds.net>\n"
|
||||
|
@ -16,30 +16,30 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n!=1;\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Imprimeix la versió de GStreamer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Fes fatals tots els avisos"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Imprimeix les categories de depuració disponibles i surt"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Nivell de depuració per defecte des de 1 (només errors) a 5 (tot) o 0 per a "
|
||||
"cap sortida"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "NIVELL"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -48,31 +48,27 @@ msgstr ""
|
|||
"nivells específics per a les categories individuals. Per exemple: "
|
||||
"GST_AUTOPLUG:5, GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "LLISTA"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Inhabilita la sortida de depuració colorejada"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Inhabilita la depuració"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Inhabilita les intruccions d'UCP accelerades"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Habilita els diagnòstics detallats de càrrega de connectors"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "CAMINS"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -81,34 +77,34 @@ msgstr ""
|
|||
"Llista separada per comes de connectors a precarregar a més de la llista "
|
||||
"emmagatzemada en la variable d'entorn GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "CONNECTORS"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr ""
|
||||
"Inhabilita la captura de violacions de segment durant la càrrega de "
|
||||
"connectors"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "PLANIFICADOR"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Registre a utilitzar"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTRE"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "llista de camins per a carregar connectors (separats per «%s»)"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Planificador a utilitzar (per defecte és «%s»)"
|
||||
|
@ -605,52 +601,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
"No hi ha cap element present per a gestionar el tipus mime %s del flux."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "No s'ha especificat cap nom de fitxer per a l'escriptura."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "No s'ha pogut obrir «%s» per a l'escriptura."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "S'ha produït un error en tancar el fitxer «%s»."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "S'ha produït un error en escriure al fitxer «%s»."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "No s'ha especificat cap fitxer per a llegir."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "No s'ha pogut obrir el fitxer «%s» per a la lectura."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "«%s» és un directori."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "El fitxer «%s» és un sòcol."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Ha fallat després de les iteracions com s'ha demanat."
|
||||
|
||||
|
@ -739,125 +729,78 @@ msgstr "No s'ha pogut enllaçar l'element de sortida per a l'URI «%s»"
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "no es permet un conducte buit"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Imprimeix tots els elements"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
"L'execució ha finalitzat després de %s iteracions (suma %s ns, mitja %s ns, "
|
||||
"mín %s, màx %s).\n"
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr "Forma d'ús: gst-xmllaunch <file.xml> [ element.propietat=valor ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "ERROR: l'anàlisi del fitxer xml «%s» ha fallat.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "ERROR: no hi ha cap conducte de nivell superior en el fitxer «%s».\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "AVÍS: només es gestiona un element de primer nivell ara mateix."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr ""
|
||||
"ERROR: no s'ha pogut analitzar l'argument de la línia d'ordres %d: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "AVÍS: no s'ha trobat l'element anomenat «%s».\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "MARCADOR TROBAT: trobat per l'element «%s».\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Mostra els marcadors (també coneguts com metadades)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Mostra la informació d'estat i notificacions de propietats"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "No mostres informació d'estat de TIPUS"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "TIPUS1,TIPUS2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Desa la representació xml del conducte a FITXER i surt"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "FITXER"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "No instal·les un gestor de fallades"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Imprimeix una traça d'alloc (si s'ha habilitat al compilar)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Nombre de vegades a iterar el conducte"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "ERROR: no s'ha pogut construir el conducte: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "ERROR: no s'ha pogut construir el conducte.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "AVÍS: el conducte és erroni: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " S'està intentant executar tot i així.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "ERROR: l'element «conducte» no s'ha trobat.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "S'ESTÀ EXECUTANT el conducte ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "ERROR: el conducte no vol reproduir-se.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -892,6 +835,47 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] "S'han carregat %d connectors amb %d %s.\n"
|
||||
msgstr[1] "S'han carregat %d connectors amb %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Inhabilita les intruccions d'UCP accelerades"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr ""
|
||||
#~ "No hi ha cap element present per a gestionar el tipus mime %s del flux."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
#~ "max %s ns).\n"
|
||||
#~ msgstr ""
|
||||
#~ "L'execució ha finalitzat després de %s iteracions (suma %s ns, mitja %s "
|
||||
#~ "ns, mín %s, màx %s).\n"
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Forma d'ús: gst-xmllaunch <file.xml> [ element.propietat=valor ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "ERROR: l'anàlisi del fitxer xml «%s» ha fallat.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr ""
|
||||
#~ "ERROR: no hi ha cap conducte de nivell superior en el fitxer «%s».\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "AVÍS: només es gestiona un element de primer nivell ara mateix."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr ""
|
||||
#~ "ERROR: no s'ha pogut analitzar l'argument de la línia d'ordres %d: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "AVÍS: no s'ha trobat l'element anomenat «%s».\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Desa la representació xml del conducte a FITXER i surt"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "FITXER"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "capacitats"
|
||||
|
||||
|
|
198
po/cs.po
198
po/cs.po
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.8\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2005-04-15 14:36+0200\n"
|
||||
"Last-Translator: Miloslav Trmac <mitr@volny.cz>\n"
|
||||
"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
|
||||
|
@ -18,29 +18,29 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
|
||||
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Vypsat verzi GStreamer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Chápat všechna varování jako fatální"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Vypsat dostupné kategorie ladění a skončit"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Implicitní úroveň ladění od 1 (jen chyby) do 5 (vše) nebo 0 pro žádný výstup"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "ÚROVEŇ"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -49,31 +49,27 @@ msgstr ""
|
|||
"konkrétních úrovní pro jednotlivé kategorie. Příklad: GST_AUTOPLUG:5,"
|
||||
"GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "SEZNAM"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Zakázat obarvený ladicí výstup"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Zakázat ladění"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Zakázat akcelerované instrukce CPU"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Povolit podrobnou diagnostiku načítání modulů"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "CESTY"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -82,32 +78,32 @@ msgstr ""
|
|||
"Čárkami oddělený seznam modulů, které přednačíst kromě seznamu uloženém v "
|
||||
"proměnné prostředí GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "MODULY"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr "Zakázat zachycování porušení segmentace při načítání modulů"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "PLÁNOVAČ"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Registr, který používat"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTR"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "seznam cest pro načítání modulů (oddělený '%s')"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Plánovač, který používat (implicitní je '%s')"
|
||||
|
@ -581,51 +577,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr "Není přítomen žádý element pro obsloužení proudu s typem mime %s."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Nezadán název souboru pro zápis."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Nemohu otevřít soubor \"%s\" pro zápis."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Chyba při zavírání souboru \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Chyba při zápisu do souboru \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Nezadán název souboru pro čtení."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Nemohu otevřít soubor \"%s\" pro čtení."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "\"%s\" je adresář."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Soubor \"%s\" je socket."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Selhání po iteracích podle požadavku."
|
||||
|
||||
|
@ -714,127 +705,79 @@ msgstr "nemohu připojit element spotřebiče pro URI \"%s\""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "prázdná roura není povolena"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Vypsat všechny elementy"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
"Provádění skončilo po %s iteracích (celkem %s ns, průměr %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr ""
|
||||
"Použití: gst-xmllaunch <soubor.xml> [ element.vlastnost=hodnota ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "CHYBA: zpracovávání xml souboru '%s' selhalo.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "CHYBA: v souboru '%s' není element nejvyšší úrovně pipeline.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr ""
|
||||
"VAROVÁNÍ: v současné době je podporován jen jeden element nejvyšší úrovně."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "CHYBA: nemohu zpracovat argument %d na příkazovém řádku: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "VAROVÁNÍ: element nazvaný '%s' nenalezen.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "NALEZEN TAG : nalezen elementem \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Vypsat tagy (také známé jako metadata)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Vypsat informace o stavu a upozornění na vlastnosti"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Nevypisovat informace o stavu s TYPEM"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "TYP1,TYP2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Uložit reprezentaci roury v xml do SOUBORu a skončit"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "SOUBOR"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Neinstalovat obsluhu výjimek"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Vypisovat stopu alokace (je-li povoleno při kompilaci)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Kolikrát iterovat rouru"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "CHYBA: nelze vytvořit rouru: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "CHYBA: nelze vytvořit rouru.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "VAROVÁNÍ: chybná roura: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Přesto se ji pokouším spustit.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "CHYBA: element 'pipeline' nebyl nalezen.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "SPOUŠTÍM rouru ...\n"
|
||||
|
||||
# On strike?
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "CHYBA: roura nechce hrát.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -871,6 +814,45 @@ msgstr[0] "Načteno %d modulů s %d %s.\n"
|
|||
msgstr[1] "Načteno %d modulů s %d %s.\n"
|
||||
msgstr[2] "Načteno %d modulů s %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Zakázat akcelerované instrukce CPU"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr "Není přítomen žádý element pro obsloužení proudu s typem mime %s."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
#~ "max %s ns).\n"
|
||||
#~ msgstr ""
|
||||
#~ "Provádění skončilo po %s iteracích (celkem %s ns, průměr %s ns, min %s "
|
||||
#~ "ns, max %s ns).\n"
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Použití: gst-xmllaunch <soubor.xml> [ element.vlastnost=hodnota ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "CHYBA: zpracovávání xml souboru '%s' selhalo.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "CHYBA: v souboru '%s' není element nejvyšší úrovně pipeline.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr ""
|
||||
#~ "VAROVÁNÍ: v současné době je podporován jen jeden element nejvyšší úrovně."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "CHYBA: nemohu zpracovat argument %d na příkazovém řádku: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "VAROVÁNÍ: element nazvaný '%s' nenalezen.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Uložit reprezentaci roury v xml do SOUBORu a skončit"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "SOUBOR"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "schopnosti"
|
||||
|
||||
|
|
189
po/de.po
189
po/de.po
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-06-05 09:32+0100\n"
|
||||
"Last-Translator: Roland Illig <roland.illig@gmx.de>\n"
|
||||
"Language-Team: German <de@li.org>\n"
|
||||
|
@ -15,30 +15,30 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Die Version von GStreamer ausgeben"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Alle Warnungen wie Fehler behandeln"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Verfügbare Debuggingkategorien ausgeben und Programm beenden"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Standarddebugginglevel von 1 (nur Fehler) bis 5 (Alles) oder 0 für keine "
|
||||
"Ausgabe"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "LEVEL"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -47,31 +47,27 @@ msgstr ""
|
|||
"Meldungsarten individuelle Level zuzuordnen. Beispiel: GST_AUTOPLUG:5,"
|
||||
"GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "LIST"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Farbige Debuggingausgabe deaktivieren"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Debugging deaktivieren"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Beschleunigte CPU-Befehle deaktivieren"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Gesprächige Meldungen beim Laden von Plugins aktivieren"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "PATHS"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -80,32 +76,32 @@ msgstr ""
|
|||
"Kommagetrennte Liste von Plugins, die zusätzliche zu den Plugins in der "
|
||||
"Umgebungsvariable GST_PLUGIN_PATH geladen werden"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "PLUGINS"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr "Verfolgen von Speicherfehlern beim Laden von Plugins deaktivieren"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "SCHEDULER"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Zu benutzende Registry"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTRY"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "Pfadliste zum Laden von Plugins (Durch »%s« getrennt)"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Zu benutzender Scheduler (Standard: »%s«)"
|
||||
|
@ -615,53 +611,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
"Es gibt kein Element, das den MIME-Typ »%s« dieses Datenstroms verarbeiten "
|
||||
"kann."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Kein Dateiname zum Schreiben angegeben."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Konnte Datei »%s« nicht zum Schreiben öffnen."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Fehler beim Schließen der Datei »%s«."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Fehler beim Schreiben der Daten »%s«."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Kein Dateiname zum Lesen angegeben."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Konnte die Datei »%s« nicht zum Lesen öffnen."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, fuzzy, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Die Datei »%s« ist keine normale Datei."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Nach dem Durchlaufen fehlgeschlagen. Wie gewünscht."
|
||||
|
||||
|
@ -750,124 +739,80 @@ msgstr "Konnte Zielelement für URI »%s« nicht verbinden"
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "Leere Leitung ist nicht erlaubt"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
#, fuzzy
|
||||
msgid "Print all elements"
|
||||
msgstr "Kein Element »%s«"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr "Aufruf: gst-xmllaunch <file.xml> [ element.eigenschaft=wert ...]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "FEHLER: Parsen der XML-Datei »%s« fehlgeschlagen.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "FEHLER: Kein Hauptleitungselement in Datei »%s«.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "WARNUNG: Zur Zeit wird nur ein Hauptleitungselement unterstützt."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "FEHLER: Konnte das Kommandozeilenargument %d nicht parsen: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "WARNUNG: Element namens »%s« nicht gefunden.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "KENNZEICHEN GEFUNDEN: Von Element »%s« gefunden.\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Kennzeichen (auch bekannt als Metadaten) ausgeben"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Zustandsinformation und Eigenschaftsmitteilungen ausgeben"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Zustandsinformation der Art ART nicht ausgeben"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "ART1,ART2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "XML-Repräsentation der Pipeline in DATEI speichern und beenden"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "DATEI"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Keine Routine zum Abfangen von Fehlern installieren"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr ""
|
||||
"Speicherzuordnungsverfolgung ausgeben (falls zur Compilierzeit aktiviert)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Anzahl, wie oft die Leitung durchlaufen wird"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "FEHLER: Leitung konnte nicht konstruiert werden: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "FEHLER: Leitung konnte nicht konstruiert werden.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "WARNUNG: Fehlerhafte Leitung: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Versuche trotzdem zu laufen.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "FEHLER: Das »pipeline«-Element wurde nicht gefunden.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "FÜHRE Leitung AUS ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "FEHLER: Leitung möchte nicht abgespielt werden.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -902,6 +847,38 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Beschleunigte CPU-Befehle deaktivieren"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr ""
|
||||
#~ "Es gibt kein Element, das den MIME-Typ »%s« dieses Datenstroms "
|
||||
#~ "verarbeiten kann."
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr "Aufruf: gst-xmllaunch <file.xml> [ element.eigenschaft=wert ...]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "FEHLER: Parsen der XML-Datei »%s« fehlgeschlagen.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "FEHLER: Kein Hauptleitungselement in Datei »%s«.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "WARNUNG: Zur Zeit wird nur ein Hauptleitungselement unterstützt."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "FEHLER: Konnte das Kommandozeilenargument %d nicht parsen: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "WARNUNG: Element namens »%s« nicht gefunden.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "XML-Repräsentation der Pipeline in DATEI speichern und beenden"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "DATEI"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "Fähigkeiten"
|
||||
|
||||
|
|
185
po/en_GB.po
185
po/en_GB.po
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-04-26 10:36-0400\n"
|
||||
"Last-Translator: Gareth Owen <gowen72@yahoo.com>\n"
|
||||
"Language-Team: English (British) <en_gb@li.org>\n"
|
||||
|
@ -14,29 +14,29 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Print the GStreamer version"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Make all warnings fatal"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Print available debug categories and exit"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "LEVEL"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -44,31 +44,27 @@ msgstr ""
|
|||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "LIST"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Disable coloured debugging output"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Disable debugging"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Disable accelerated CPU instructions"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Enable verbose plugin loading diagnostics"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "PATHS"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -77,32 +73,32 @@ msgstr ""
|
|||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
"environment variable GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "PLUGINS"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr "Disable trapping of segmentation faults during plugin loading"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "SCHEDULER"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Registry to use"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTRY"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "path list for loading plugins (separated by '%s')"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Scheduler to use (default is '%s')"
|
||||
|
@ -575,51 +571,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr "There is no element present to handle the stream's mime type %s."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "No file name specified for writing."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Could not open file \"%s\" for writing."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Error closing file \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Error while writing to file \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "No file name specified for reading."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Could not open file \"%s\" for reading."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, fuzzy, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "File \"%s\" isn't a regular file."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Failed after iterations as requested."
|
||||
|
||||
|
@ -708,123 +699,79 @@ msgstr "could not link sink element for URI \"%s\""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "empty pipeline not allowed"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
#, fuzzy
|
||||
msgid "Print all elements"
|
||||
msgstr "no element \"%s\""
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "ERROR: parsing of xml file '%s' failed.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "WARNING: only one toplevel element is supported at this time."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "ERROR: could not parse command line argument %d: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "WARNING: element named '%s' not found.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "FOUND TAG : found by element \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Output tags (also known as metadata)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Output status information and property notifications"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Do not output status information of TYPE"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "TYPE1,TYPE2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Save xml representation of pipeline to FILE and exit"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "FILE"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Do not install a fault handler"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Print alloc trace (if enabled at compile time)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Number of times to iterate pipeline"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "ERROR: pipeline could not be constructed: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "ERROR: pipeline could not be constructed.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "WARNING: erroneous pipeline: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Trying to run anyway.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "RUNNING pipeline ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "ERROR: pipeline doesn't want to play.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -859,6 +806,36 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Disable accelerated CPU instructions"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr "There is no element present to handle the stream's mime type %s."
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "ERROR: parsing of xml file '%s' failed.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "WARNING: only one toplevel element is supported at this time."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "ERROR: could not parse command line argument %d: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "WARNING: element named '%s' not found.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Save xml representation of pipeline to FILE and exit"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "FILE"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "caps"
|
||||
|
||||
|
|
193
po/fr.po
193
po/fr.po
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: GStreamer\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-01-13 16:52+0100\n"
|
||||
"Last-Translator: Julien Moutte <julien@moutte.net>\n"
|
||||
"Language-Team: French <fr@li.org>\n"
|
||||
|
@ -15,30 +15,30 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Afficher la version de GStreamer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Rendre tout les avertissements bloquants"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Afficher les catégories de deboguage disponibles et quitter"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Niveau de deboguage par defaut de 1 (que les erreurs) a 5 (tout) ou 0 pour "
|
||||
"n'avoir aucun affichage"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "NIVEAU"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
|
@ -48,32 +48,28 @@ msgstr ""
|
|||
"des niveaux spécifiques pour chaque catégorie.\n"
|
||||
"Exemple: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
#, fuzzy
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Désactiver la couleur dans la sortie de deboguage"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Désactiver la sortie de deboguage"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Désactiver les instructions accélerées du processeur"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Activer un diagnostique détaillé du chargement des plugins"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "CHEMINS"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -82,34 +78,34 @@ msgstr ""
|
|||
"Liste séparée par des virgules de plugins a precharger en plus de la liste "
|
||||
"contenue dans la variable d'environnement GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "PLUGINS"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr ""
|
||||
"Désactiver la detection des erreurs de segmentation pendant le chargement "
|
||||
"des plugins"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "PLANIFICATEUR"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Registre a utiliser"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTRE"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, fuzzy, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "liste de chemins pour le chargement des plugins (séparés par '"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, fuzzy, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Planificateur a utiliser ('"
|
||||
|
@ -606,53 +602,48 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
#, fuzzy
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Echoué a déterminer le type du flux"
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
#, fuzzy
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Echoué a déterminer le type du flux"
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, fuzzy, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Echoué a déterminer le type du flux"
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr ""
|
||||
|
||||
|
@ -742,129 +733,80 @@ msgstr "impossible de lier un element destination pour l'URI \"%s\""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "tube vide non autorisé"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
#, fuzzy
|
||||
msgid "Print all elements"
|
||||
msgstr "pas d'element \"%s\""
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr ""
|
||||
"Utilisation: gst-xmllaunch <fichier.xml> [ element.property=valeur ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "ERREUR: l'interpretation du fichier xml '%s' a echoué.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "ERREUR: pas d'element tube de plus haut niveau dans le fichier '%s'.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr ""
|
||||
"AVERTISSEMENT: actuellement seul un element tube de plus haut niveau est "
|
||||
"supporté."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr ""
|
||||
"ERREUR: impossible d'interpreter l'argument de la ligne de commande numero %"
|
||||
"d: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "AVERTISSEMENT: l'element nommé '%s' est introuvable.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "TAG DECOUVERT : decouvert par l'element \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "tags de sortie (aussi connus sous le nom de metadata)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr ""
|
||||
"Afficher des informations sur le status et les notifications de proprietés"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Ne pas afficher d'informations sur les status de TYPE"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "TYPE1,TYPE2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Sauvegarder la representation xml du tube dans FICHIER et quitter"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "FICHIER"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Ne pas installer un gestionaire de dysfonctionement"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Imprimer les traces d'allocations (si activées lors de la compilation)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Nombres d'iterations du tube a accomplir"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "ERREUR: le tube n'a pas pu etre construit: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "ERREUR: le tube n'a pas pu etre construit.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "AVERTISSEMENT: tube erroné: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Tentative d'execution malgrè tout.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "ERREUR: l'element 'tube' est introuvable.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "EXECUTION du tube en cours ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "ERREUR: le tube refuse de s'executer.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -899,6 +841,39 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Désactiver les instructions accélerées du processeur"
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Utilisation: gst-xmllaunch <fichier.xml> [ element.property=valeur ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "ERREUR: l'interpretation du fichier xml '%s' a echoué.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr ""
|
||||
#~ "ERREUR: pas d'element tube de plus haut niveau dans le fichier '%s'.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr ""
|
||||
#~ "AVERTISSEMENT: actuellement seul un element tube de plus haut niveau est "
|
||||
#~ "supporté."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr ""
|
||||
#~ "ERREUR: impossible d'interpreter l'argument de la ligne de commande "
|
||||
#~ "numero %d: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "AVERTISSEMENT: l'element nommé '%s' est introuvable.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Sauvegarder la representation xml du tube dans FICHIER et quitter"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "FICHIER"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "capacités"
|
||||
|
||||
|
|
198
po/it.po
198
po/it.po
|
@ -108,7 +108,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.7pre2\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-12-21 08:23+0100\n"
|
||||
"Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n"
|
||||
"Language-Team: Italian <tp@lists.linux.it>\n"
|
||||
|
@ -117,30 +117,30 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Stampa la versione di GStreamer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Rende tutti i warning fatali"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Stampa le categorie di debug disponibili ed esce"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Livello di debug predefinito da 1 (solo errori) a 5 (tutto), oppure 0 per "
|
||||
"nessun output"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "LIVELLO"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -149,31 +149,27 @@ msgstr ""
|
|||
"impostare i livelli specifici per ogni singola categoria. Esempio: "
|
||||
"GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "ELENCO"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Disabilita output di debug colorato"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Disabilita debug"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Disabilita istruzioni accelerate CPU"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Abilita diagnostica prolissa del caricamento plugin"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "PERCORSI"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -182,32 +178,32 @@ msgstr ""
|
|||
"Elenco separato da virgole dei plugin da pre-caricare in aggiunta all'elenco "
|
||||
"memorizzato nella variabile d'ambiente GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "PLUGIN"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr "Disabilita il trapping dei segfault durante il caricamento dei plugin"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "SCHEDULER"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Registro da usare"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTRO"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "elenco dei percorsi per caricare i plugin (separati da '%s')"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Scheduler da usare (predefinito è '%s')"
|
||||
|
@ -693,52 +689,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
"Non vi è alcun elemento presente per gestire il tipo MIME %s dello stream."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Nessun nome di file specificato per la scrittura."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Impossibile aprire il file «%s» in scrittura."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Errore nel chiudere il file «%s»."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Errore durante la scrittura sul file «%s»."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Nessun nome di file specificato per la lettura."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Impossibile aprire il file «%s» in lettura."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "«%s» è una directory."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Il file «%s» è un socket."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Fallito dopo le iterazioni come richiesto."
|
||||
|
||||
|
@ -827,125 +817,78 @@ msgstr "impossibile collegare l'elemento sink per l'URI «%s»"
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "pipeline vuota non consentito"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Stampa tutti gli elementi"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
"Eseuzione terminata dopo %s iterazioni (somma %s ns, media %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr "Uso: gst-xmllaunch <FILE.XML> [ ELEMENTO.PROPRIETA=VALORE ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "ERRORE: analisi del file xml «%s» fallita.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "ERRORE: nessun elemento pipeline toplevel nel file «%s».\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "AVVISO: al momento è supportato sono un elemento toplevel."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr ""
|
||||
"ERRORE: impossibile analizzare l'argomento %d della riga di comando: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "AVVISO: elemento di nome «%s» non trovato.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "TAG TROVATO : trovato dall'elemento «%s».\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Stampa i tag (anche noti come metadati)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Stampa informazioni di stato e notifiche delle proprietà"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Non fornisce informazioni di stato per TIPO"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "TIPO1,TIPO2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Salva su FILE una rappresentazione xml della pipeline ed esce"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "FILE"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Non installa un gestore di fault"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Stampa traccia di alloc (se abilitato in compilazione)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Numero di iterazioni della pipeline"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "ERRORE: impossibile costruire la pipeline: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "ERRORE: impossibile costruire la pipeline.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "AVVISO: pipeline errata: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Tentata esecuzione in ogni caso.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "ERRORE: l'elemento «pipeline» non è stato trovato.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "ESECUZIONE della pipeline...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "ERRORE: la pipeline non vuole riprodurre.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -980,6 +923,45 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] "Caricati %d plugin con %d %s.\n"
|
||||
msgstr[1] "Caricati %d plugin con %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Disabilita istruzioni accelerate CPU"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr ""
|
||||
#~ "Non vi è alcun elemento presente per gestire il tipo MIME %s dello stream."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
#~ "max %s ns).\n"
|
||||
#~ msgstr ""
|
||||
#~ "Eseuzione terminata dopo %s iterazioni (somma %s ns, media %s ns, min %s "
|
||||
#~ "ns, max %s ns).\n"
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr "Uso: gst-xmllaunch <FILE.XML> [ ELEMENTO.PROPRIETA=VALORE ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "ERRORE: analisi del file xml «%s» fallita.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "ERRORE: nessun elemento pipeline toplevel nel file «%s».\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "AVVISO: al momento è supportato sono un elemento toplevel."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr ""
|
||||
#~ "ERRORE: impossibile analizzare l'argomento %d della riga di comando: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "AVVISO: elemento di nome «%s» non trovato.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Salva su FILE una rappresentazione xml della pipeline ed esce"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "FILE"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "caps"
|
||||
|
||||
|
|
158
po/nb.po
158
po/nb.po
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.8\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2005-02-17 12:00+0100\n"
|
||||
"Last-Translator: Kjartan Maraas <kmaraas@broadpark.no>\n"
|
||||
"Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
|
||||
|
@ -14,89 +14,85 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Skriv ut versjonsnummer for GStreamer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "La alle advarsler være fatale"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Skriv ut tilgjengelige feilsøkingskategorier og avslutt"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "NIVÅ"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "LISTE"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Deaktiver farget feilsøkingsinformasjon"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Slå av feilsøking"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "STIER"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
"environment variable GST_PLUGIN_PATH"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "TILLEGG"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "PLANLEGGER"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Register som skal brukes"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTER"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Planlegger som skal brukes («%s» er forvalgt)"
|
||||
|
@ -565,51 +561,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Ingen filnavn oppgitt for skriving."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Kunne ikke åpne fil «%s» for skriving."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Feil ved lukking av fil «%s»."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Feil ved skriving til fil «%s»."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Ingen filnavn oppgitt for lesing."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Kunne ikke åpne fil «%s» for lesing."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "«%s» er en katalog."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Fil «%s» er en plugg."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr ""
|
||||
|
||||
|
@ -698,122 +689,78 @@ msgstr ""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "TYPE1,TYPE2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "FIL"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -847,3 +794,6 @@ msgid "Loaded %d plugins with %d feature.\n"
|
|||
msgid_plural "Loaded %d plugins with %d features.\n"
|
||||
msgstr[0] "Lastet %d tillegg med %d %s.\n"
|
||||
msgstr[1] "Lastet %d tillegg med %d %s.\n"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "FIL"
|
||||
|
|
194
po/nl.po
194
po/nl.po
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.4\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-08-05 16:56+0200\n"
|
||||
"Last-Translator: Elros Cyriatan <cyriatan@fastmail.fm>\n"
|
||||
"Language-Team: Dutch <vertaling@nl.linux.org>\n"
|
||||
|
@ -17,30 +17,30 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Geeft de GStreamer versie weer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Alle waarschuwingen fataal maken"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Beschikbare debug-categorieën weergeven en afsluiten"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Standaard debug-niveau van 1 (enkel fouten) tot 5 (alles) of 0 voor geen "
|
||||
"uitvoer"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "NIVEAU"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -49,31 +49,27 @@ msgstr ""
|
|||
"niveau's in te stellen voor de individuele categorieën. Voorbeeld: "
|
||||
"GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "LIJST"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Kleuren uit zetten in debug-uitvoer"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Debugging uit zetten"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Versnelde CPU-instructies uit zetten"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Uitgebreide diagnostiek voor het laden van plugins aan zetten"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "PADEN"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -82,33 +78,33 @@ msgstr ""
|
|||
"Komma-gescheiden lijst van plugins om voor te laden naast de lijst "
|
||||
"opgeslagen in omgevingsvariable GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "PLUGINS"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr ""
|
||||
"Het opvangen van segmentatiefouten uit zetten tijdens laden van plugins"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "PLANNER"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Register om te gebruiken"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTER"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "padlijst voor het laden van plugins (gescheiden door '%s')"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Planner om te gebruiken (standaard is '%s')"
|
||||
|
@ -585,52 +581,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
"Er is geen element aanwezig dat de MIME-soort %s van de stroom kan verwerken."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Geen bestandsnaam gegeven om te schrijven."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Kon bestand \"%s\" niet openen om te schrijven."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Fout bij het sluiten van bestand \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Fout bij het schrijven naar bestand \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Geen bestandsnaam gegeven om te lezen."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Kon bestand \"%s\" niet openen om te lezen."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "\"%s\" is een map."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Bestand \"%s\" is een socket."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Mislukt na iteraties zoals gevraagd."
|
||||
|
||||
|
@ -719,125 +709,78 @@ msgstr "kon doelelement niet verbinden voor URI \"%s\""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "lege pijplijn niet toegelaten"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Alle elementen weergeven"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr ""
|
||||
"Gebruik: gst-xmllaunch <bestand.xml> [ element.eigenschap=waarde ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "FOUT: verwerken van xml-bestand '%s' mislukt.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "FOUT: geen bovenste pijplijn-element gevonden in file '%s'.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr ""
|
||||
"WAARSCHUWING: slechts één element op het hoogste niveau ondersteund op dit "
|
||||
"moment."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "FOUT: kon argument %d op opdrachtregel niet verwerken: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "WAARSCHUWING: element met naam '%s' niet gevonden.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "TAG GEVONDEN : gevonden door element \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Tags (ook bekend als metadata) weergeven"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Statusinformatie en eigenschapswaarschuwingen weergeven"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Statusinformatie van soort SOORT niet weergeven"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "SOORT1,SOORT2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "XML-representatie van pijplijn in BESTAND opslaan en afsluiten"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "BESTAND"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Geen foutafhandelaar installeren"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Toewijzingsspoor weergeven (indien aangezet tijdens compileren)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Aantal keren om de pijplijn te herhalen"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "FOUT: pijplijn kon niet gemaakt worden: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "FOUT: pijplijn kon niet gemaakt worden.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "WAARSCHUWING: foutieve pijplijn: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Probeer toch uit te voeren.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "FOUT: het 'pijplijn' element werd niet gevonden.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "BEZIG met pijplijn ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "FOUT: pijplijn wil niet spelen.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -872,6 +815,41 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] "%d plugins geladen met %d %s.\n"
|
||||
msgstr[1] "%d plugins geladen met %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Versnelde CPU-instructies uit zetten"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr ""
|
||||
#~ "Er is geen element aanwezig dat de MIME-soort %s van de stroom kan "
|
||||
#~ "verwerken."
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Gebruik: gst-xmllaunch <bestand.xml> [ element.eigenschap=waarde ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "FOUT: verwerken van xml-bestand '%s' mislukt.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "FOUT: geen bovenste pijplijn-element gevonden in file '%s'.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr ""
|
||||
#~ "WAARSCHUWING: slechts één element op het hoogste niveau ondersteund op "
|
||||
#~ "dit moment."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "FOUT: kon argument %d op opdrachtregel niet verwerken: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "WAARSCHUWING: element met naam '%s' niet gevonden.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "XML-representatie van pijplijn in BESTAND opslaan en afsluiten"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "BESTAND"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "mogelijkheden"
|
||||
|
||||
|
|
184
po/ru.po
184
po/ru.po
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.8\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2005-02-15 22:33+0300\n"
|
||||
"Last-Translator: Peter Astakhov <astakhovp@mail.ru>\n"
|
||||
"Language-Team: Russian <ru@li.org>\n"
|
||||
|
@ -18,30 +18,30 @@ msgstr ""
|
|||
"100<10||n%100>=20)?1:2);\n"
|
||||
"X-Generator: KBabel 1.9.1\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Печатает версию GStreamer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Расценивать все предупреждения как фатальные"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Печатает доступные категории отладки и выходит"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Уровень отладки по умолчанию от 1 (только ошибки) до 5(все) или 0 - ничего "
|
||||
"не печатать"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "УРОВЕНЬ"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -49,31 +49,27 @@ msgstr ""
|
|||
"Список пар, разделенных запятыми вида имя_категории:уровень для установки "
|
||||
"уровнейотдельных категорий. Пример: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "СПИСОК"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Отключить раскрашенный вывод отладочных сообщений"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Отключить отладку"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Отключить специфические команды процессора"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Разрешить расширенную диагностику при загрузке расширений"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "ПУТИ"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -82,32 +78,32 @@ msgstr ""
|
|||
"Список расширений (через запятую) для загрузки, вдобавок к списку, "
|
||||
"сохраненному в переменной окружения GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "РАСШИРЕНИЯ"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "ПЛАНИРОВЩИК"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr ""
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "список путей для загрузки расширений (разделенных '%s')"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Планировщик для использования (по умолчанию - '%s')"
|
||||
|
@ -588,51 +584,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Не указано имя файла для записи."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Не могу открыть файл \"%s\" для записи."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Ошибка закрытия файла \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Ошибка записи в файл \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Не указано имя файла для чтения."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Не могу открыть файл \"%s\" для чтения."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "\"%s\" - это каталог."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Файл \"%s\" является сокетом."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr ""
|
||||
|
||||
|
@ -721,125 +712,78 @@ msgstr ""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Печатать все элементы"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
"Выполнение завершилось после %s итераций (всего %s ns, среднее %s ns, "
|
||||
"минимум %s ns, максимум %s ns).\n"
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr ""
|
||||
"Использование: gst-xmllaunch <файл.xml> [ элемент.поле=значение ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "ОШИБКА: не могу разобрать xml файл '%s'.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "ОШИБКА: не могу разобрать аргумент командной строки %d: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "ПРЕДУПРЕЖДЕНИЕ: элемент '%s' не найден.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Выводить тэги (такжи называемые 'метаданные')"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "ТИП1, ТИП2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "ФАЙЛ"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Не устанавливать ошибочный обработчик"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Все равно пытаюсь запустить.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -875,3 +819,29 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] "Загружено %d расширений с %d %s.\n"
|
||||
msgstr[1] "Загружено %d расширений с %d %s.\n"
|
||||
msgstr[2] "Загружено %d расширений с %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Отключить специфические команды процессора"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
#~ "max %s ns).\n"
|
||||
#~ msgstr ""
|
||||
#~ "Выполнение завершилось после %s итераций (всего %s ns, среднее %s ns, "
|
||||
#~ "минимум %s ns, максимум %s ns).\n"
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Использование: gst-xmllaunch <файл.xml> [ элемент.поле=значение ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "ОШИБКА: не могу разобрать xml файл '%s'.\n"
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "ОШИБКА: не могу разобрать аргумент командной строки %d: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "ПРЕДУПРЕЖДЕНИЕ: элемент '%s' не найден.\n"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "ФАЙЛ"
|
||||
|
|
189
po/sq.po
189
po/sq.po
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.4\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-08-07 23:46+0200\n"
|
||||
"Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n"
|
||||
"Language-Team: Albanian <begraj@hotmail.com>\n"
|
||||
|
@ -15,30 +15,30 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Printo versionin e GStreamer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Bëj që të gjithë paralajmërimet të jenë fatale"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Printo kategoritë e debug në dispozicion dhe dil"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Niveli i prezgjedhur i debug nga 1 (vetëm gabimi) në 5 (gjithçka) ose 0 për "
|
||||
"jo output"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "NIVELI"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -47,31 +47,27 @@ msgstr ""
|
|||
"etiketa specifike për kategoritë individuale. Shembull: GST_AUTOPLUG:5,"
|
||||
"GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "LISTË"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Ç'aktivo output shumëngjyrësh të debug"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Ç'aktivo debug"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Ç'aktivo instruksionet e përshpejtimit të CPU"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Aktivo kërkesën e plugin të ngarkimit të diagnostikimeve"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "POZICIONET"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -80,33 +76,33 @@ msgstr ""
|
|||
"Lista e plugin, të ndarë me presje, që duhen parangarkuar në plotësim të "
|
||||
"listës së regjistruar tek e ndryshueshmja e ambientit GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "PLUGINS"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr ""
|
||||
"Ç'aktivo regjistrimin e dështimeve të segmentuara gjatë ngarkimit të plugin"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "PLANIFIKUES"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Regjistri që duhet përdorur"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGJISTRI"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "pozicioni i listës për ngarkimin e plugins (ndarë me '%s')"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Planifikuesi që duhet përdorur (i prezgjedhuri është '%s')"
|
||||
|
@ -582,51 +578,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr "Nuk ekziston asnjë element për të trajtuar llojin mime %s të fluksit."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Nuk është përcaktuar asnjë emër file për tu shkruar."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "E pamundur hapja e file \"%s\" në shkrim."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Gabim gjatë mbylljes së file \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Gabim gjatë shkrimit tek file \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Nuk është përcaktuar asnjë emër file për tu lexuar."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "E pamundur hapja e file \"%s\" për lexim."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "\"%s\" është një directory."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "File \"%s\" është një socket."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Dështoi mbas përsëritjeve sikurse të kërkuara."
|
||||
|
||||
|
@ -715,123 +706,78 @@ msgstr "e pamundur lidhja e elementit sink për URI \"%s\""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "nuk lejohet konduktori bosh"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Printo të gjithë elementët"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr "Përdorimi: gst-xmllaunch <file.xml> [ element.property=vlera ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "GABIM: analizimi i file xml '%s' dështoi.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "GABIM: asnjë element i pipline të toplevel tek file '%s'.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "KUJDES: vetëm një element toplevel suportohet aktualisht."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr ""
|
||||
"GABIM: i pamundur analizimi i argumentit %d të rreshtit të komandës: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "KUJDES: elementi me emrin '%s' nuk u gjet.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "NDRYSHIM I GJETUR : u gjet nga elementi \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Tags e output (njohur gjithashtu si metadata)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Njoftime të informacioneve dhe pronësisë së kondicionit të daljes"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Mos jep informacionin e gjendjes së LLOJIT"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "LLOJI1,LLOJI2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Ruaj prezantimin xml të pipeline tek FILE dhe dil"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "FILE"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Mos instalo një ushqyes të dëmtuar"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Printo shenjat e alloc (nëse aktivuar në kohën e kompilimit)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Numri i herëve të përsëritjes së kanalit"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "GABIM: i pamundur ndërtimi i pipeline: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "GABIM: i pamundur ndërtimi i pipeline.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "KUJDES: pipline e gabuar: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Duke u përpjekur të zbatohet sidoqoftë.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "GABIM: elementi 'konduktor' nuk u gjet.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "DUKE ZBATUAR pipeline ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "GABIM: pipeline nuk dëshiron të luajë.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -866,6 +812,39 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] "U ngarkuan %d plugins me %d %s.\n"
|
||||
msgstr[1] "U ngarkuan %d plugins me %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Ç'aktivo instruksionet e përshpejtimit të CPU"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr ""
|
||||
#~ "Nuk ekziston asnjë element për të trajtuar llojin mime %s të fluksit."
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Përdorimi: gst-xmllaunch <file.xml> [ element.property=vlera ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "GABIM: analizimi i file xml '%s' dështoi.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "GABIM: asnjë element i pipline të toplevel tek file '%s'.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "KUJDES: vetëm një element toplevel suportohet aktualisht."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr ""
|
||||
#~ "GABIM: i pamundur analizimi i argumentit %d të rreshtit të komandës: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "KUJDES: elementi me emrin '%s' nuk u gjet.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Ruaj prezantimin xml të pipeline tek FILE dhe dil"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "FILE"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "mbrojtëse"
|
||||
|
||||
|
|
196
po/sr.po
196
po/sr.po
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.8\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2005-01-27 16:58+0100\n"
|
||||
"Last-Translator: Danilo Segan <dsegan@gmx.net>\n"
|
||||
"Language-Team: Serbian <gnu@prevod.org>\n"
|
||||
|
@ -16,30 +16,30 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Испиши издање Гстримера"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Учини сва упозорења кобним"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Испиши доступне категорије за налажење грешака и заврши"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Подразумевани ниво опширности од 1 (само грешке) до 5 (све) или 0 (без "
|
||||
"излаза)"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "НИВО"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -47,31 +47,27 @@ msgstr ""
|
|||
"Запетом раздвојени списак парова име_категорије:ниво за постављање нарочитих "
|
||||
"нивоа за појединачне категорије. Пример: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "СПИСАК"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Искључи обојени излаз за исправљање грешака"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Искључи исправљање грешака"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Искључи убрзане инструкције процесора"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Укључи опширну дијагностику при учитавању додатка"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "ПУТАЊЕ"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -80,32 +76,32 @@ msgstr ""
|
|||
"Запетом раздвојен списак додатака који се предучитавају поред списка из "
|
||||
"променљиве окружења GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "ДОДАЦИ"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr "Искључи пресретање погрешних приступа меморији при учитавању додатака"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "РАСПОРЕЂИВАЧ"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Користи регистар"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "РЕГИСТАР"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "списак путања за учитавање додатака (раздвојених са '%s')"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Користи распоређивач (подразумева се '%s')"
|
||||
|
@ -591,51 +587,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr "Није присутан елемент за баратање током МИМЕ врсте %s."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Није наведено име датотеке за упис."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Не могу да отворим датотеку „%s“ ради уписа."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Грешка при затварању датотеке „%s“."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Грешка при упису у датотеку „%s“."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Није наведено име датотеке за читање."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Не могу да отворим датотеку „%s“ ради читања."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "\"%s\" је директоријум."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Датотека „%s“ је сокет."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Неуспех након траженог броја покушаја."
|
||||
|
||||
|
@ -724,125 +715,78 @@ msgstr "не могу да вежем завршни елемент за адр
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "није допуштен празан цевовод"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Испиши све елементе"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
"Извршавање завршено након %s покушаја (збир %s ns, просек %s ns, мин %s ns, "
|
||||
"макс %s ns).\n"
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr ""
|
||||
"Употреба: gst-xmllaunch <датотека.xml> [ елемент.особина=вредност ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "ГРЕШКА: неуспешно рашчлањивање xml датотеке „%s“.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "ГРЕШКА: нема врховног елемента цевовода у датотеци „%s“.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "УПОЗОРЕЊЕ: тренутно је подржан само један врховни елемент."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "ГРЕШКА: не могу да рашчланим %d. аргумент наредбе: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "УПОЗОРЕЊЕ: елемент са именом „%s“ није нађен.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "НАЂОХ ОЗНАКУ : нашао је елемент „%s“.\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Излазне ознаке (такође познато и као метаподаци)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Испиши податке о стању и обавештења о особинама"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Не исписуј податке о стању за ВРСТУ"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "ВРСТА1,ВРСТА2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Сачувај xml облик цевовода у ДАТОТЕКУ и заврши"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "ДАТОТЕКА"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Не постављај руковаоца грешкама"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Испиши траг доделе меморије (ако је укључено при превођењу)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Број покушаја пуштања цевовода"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "ГРЕШКА: не могу да саставим цевовод: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "ГРЕШКА: не могу да саставим цевовод.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "УПОЗОРЕЊЕ: неисправан цевовод: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Ипак покушавам да покренем.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "ГРЕШКА: елемент „pipeline“ није нађен.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "Покрећем цевовод...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "ГРЕШКА: цевовод не жели да пусти.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -879,6 +823,44 @@ msgstr[0] "Учитано %d додатака са %d %s.\n"
|
|||
msgstr[1] "Учитано %d додатака са %d %s.\n"
|
||||
msgstr[2] "Учитано %d додатака са %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Искључи убрзане инструкције процесора"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr "Није присутан елемент за баратање током МИМЕ врсте %s."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
#~ "max %s ns).\n"
|
||||
#~ msgstr ""
|
||||
#~ "Извршавање завршено након %s покушаја (збир %s ns, просек %s ns, мин %s "
|
||||
#~ "ns, макс %s ns).\n"
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Употреба: gst-xmllaunch <датотека.xml> [ елемент.особина=вредност ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "ГРЕШКА: неуспешно рашчлањивање xml датотеке „%s“.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "ГРЕШКА: нема врховног елемента цевовода у датотеци „%s“.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "УПОЗОРЕЊЕ: тренутно је подржан само један врховни елемент."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "ГРЕШКА: не могу да рашчланим %d. аргумент наредбе: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "УПОЗОРЕЊЕ: елемент са именом „%s“ није нађен.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Сачувај xml облик цевовода у ДАТОТЕКУ и заврши"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "ДАТОТЕКА"
|
||||
|
||||
# bug: this should be full word
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "могућности"
|
||||
|
|
197
po/sv.po
197
po/sv.po
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.7pre2\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-12-21 14:49+0100\n"
|
||||
"Last-Translator: Christian Rose <menthos@menthos.com>\n"
|
||||
"Language-Team: Swedish <sv@li.org>\n"
|
||||
|
@ -17,30 +17,30 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Skriv ut Gstreamer-versionen"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Gör alla varningar ödesdigra"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Skriv ut tillgängliga felsökningskategorier och avsluta"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Standardfelsökningsnivå från 1 (endast fel) till 5 (allting) eller 0 för "
|
||||
"ingen utmatning"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "NIVÅ"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -48,31 +48,27 @@ msgstr ""
|
|||
"Kommaseparerad lista med kategorinamn:nivå-par för att ställa in specifika "
|
||||
"nivåer för de enskilda kategorierna. Exempel: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "LISTA"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Inaktivera färglagd felsökningsutmatning"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Inaktivera felsökning"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Inaktivera accelererade processorinstruktioner"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Aktivera utförlig diagnostik vid inläsning av insticksmoduler"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "SÖKVÄGAR"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
"environment variable GST_PLUGIN_PATH"
|
||||
|
@ -80,33 +76,33 @@ msgstr ""
|
|||
"Kommaseparerad lista med insticksmoduler att förhandsinläsa utöver listan "
|
||||
"som lagras i miljövariabeln GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "INSTICKSMODULER"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr ""
|
||||
"Inaktivera fångst av segmenteringsfel under inläsning av insticksmoduler"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "SCHEMALÄGGARE"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Register att använda"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "REGISTER"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "sökvägslista för inläsning av insticksmoduler (åtskild av \"%s\")"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Schemaläggare att använda (standardvärdet är \"%s\")"
|
||||
|
@ -585,52 +581,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr ""
|
||||
"Det finns inget element tillgängligt för att hantera flödets mime-typ %s."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Inget filnamn angivet för skrivning."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Kunde inte öppna filen \"%s\" för skrivning."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Fel vid stängning av filen \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Fel vid skrivning till filen \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Inget filnamn angivet för läsning."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Kunde inte öppna filen \"%s\" för läsning."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "\"%s\" är en katalog."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Filen \"%s\" är ett uttag."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Misslyckades efter iterationer som begärt."
|
||||
|
||||
|
@ -721,126 +711,80 @@ msgstr "kunde inte länka utgångselementet för URI:n \"%s\""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "tom rörledning är inte tillåtet"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Skriv ut alla element"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
"Körning avslutades efter %s iterationer (totalt %s ns, medel %s ns, min %s "
|
||||
"ns, max %s ns).\n"
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr "Användning: gst-xmllaunch <fil.xml> [ element.egenskap=värde ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "FEL: tolkning av xml-filen \"%s\" misslyckades.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "FEL: inget rörledningselement på översta nivån i filen \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "VARNING: endast ett element på översta nivån stöds just nu."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "FEL: kunde inte tolka kommandoradsargumentet %d: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "VARNING: elementet med namnet \"%s\" hittades inte.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "HITTADE TAGG : hittat av elementet \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Utmatningstaggar (även känt som metadata)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Skriv ut statusinformation och egenskapsnotifieringar"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Skriv inte ut statusinformation av TYP"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "TYP1,TYP2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Spara xml-representation av rörledningen i FIL och avsluta"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "FIL"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Installera inte en felhanterare"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Skriv ut alloc-spår (om aktiverat vid kompileringen)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Antalet gånger som rörledningen ska itereras"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "FEL: rörledningen kunde inte konstrueras: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "FEL: rörledningen kunde inte konstrueras.\n"
|
||||
|
||||
# Felrapporterat i http://bugzilla.gnome.org/show_bug.cgi?id=137431
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "VARNING: felaktig rörledning: %s\n"
|
||||
|
||||
# Felrapporterat i http://bugzilla.gnome.org/show_bug.cgi?id=137431
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Försöker köra ändå.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "FEL: \"pipeline\"-elementet hittades inte.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "KÖR rörledning...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "FEL: rörledningen vill inte spela.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -875,6 +819,45 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] "Läste in %d insticksmoduler med %d %s.\n"
|
||||
msgstr[1] "Läste in %d insticksmoduler med %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Inaktivera accelererade processorinstruktioner"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr ""
|
||||
#~ "Det finns inget element tillgängligt för att hantera flödets mime-typ %s."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
#~ "max %s ns).\n"
|
||||
#~ msgstr ""
|
||||
#~ "Körning avslutades efter %s iterationer (totalt %s ns, medel %s ns, min %"
|
||||
#~ "s ns, max %s ns).\n"
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Användning: gst-xmllaunch <fil.xml> [ element.egenskap=värde ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "FEL: tolkning av xml-filen \"%s\" misslyckades.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "FEL: inget rörledningselement på översta nivån i filen \"%s\".\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "VARNING: endast ett element på översta nivån stöds just nu."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "FEL: kunde inte tolka kommandoradsargumentet %d: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "VARNING: elementet med namnet \"%s\" hittades inte.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Spara xml-representation av rörledningen i FIL och avsluta"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "FIL"
|
||||
|
||||
# Osäker. Jag tror "caps" är kort för "capabilities".
|
||||
#~ msgid "Internal GStreamer error: caps problem. File a bug."
|
||||
#~ msgstr "Internt GStreamer-fel: förmågeproblem. Skicka en felrapport."
|
||||
|
|
185
po/tr.po
185
po/tr.po
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-04-03 03:14+0300\n"
|
||||
"Last-Translator: Baris Cicek <baris@teamforce.name.tr>\n"
|
||||
"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
|
||||
|
@ -14,30 +14,30 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "GStreamer sürünümü yazdır"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Tüm uyarıları ölümcül yap"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Geçerli hata ayıklama sınıflarını yazdır ve çık"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Öntanımlı hata ayıklama seviyesi 1'den (sadece hatalar) 5'e (her şey) kadar "
|
||||
"ya da çıktı olmaması için 0"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "SEVİYE"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -45,31 +45,27 @@ msgstr ""
|
|||
"Ayrı sınıfların belirli seviyeleri için sınıf_ismi:seviye çiftlerinin virgül "
|
||||
"ile ayrılmış listesi. Örnek: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "LİSTE"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Renkli hata ayıklama çıktısını kapat"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Hata ayıklamayı kapat"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Hızlandırılmış CPU işlemlerini kapat"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Ayrıntılı eklenti yükleme detaylarını etkinleştir"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "YOLLAR"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -78,32 +74,32 @@ msgstr ""
|
|||
"Çevre değişkeni GST_PLUGIN_PATH içinde saklanan listeye ek olarak önceden "
|
||||
"yüklenecek eklentilerin virgün ile ayırılmış listesi"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "EKLENTİLER"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr "Eklenti yüklenirken kesimleme hatalarını yakalamayı kapat"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "ZAMANLANDIRICI"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Kullanılacak kayıt"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "KAYIT"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, fuzzy, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "eklenti yüklemek için yol listesi (' ile ayırılmış"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, fuzzy, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Kullanılacak zamanlandırıcı ('"
|
||||
|
@ -583,51 +579,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr "Akımın %s mime türünü işleyebilecek hiç bir öğe yok."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Yazım için hiç bir dosya adı belirtilmedi."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "\"%s\" dosyası yazım için açılamadı."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "\"%s\" kapatılırken hata."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "\"%s\" dosyası yazılırken hata."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Okuma için hiç bir dosya adı belirtilmedi."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "\"%s\" dosyası okuma için açılamadı."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr ""
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, fuzzy, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "\"%s\" dosyası düzenli bir dosya değil."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "İstenildiği gibi tekrarlama başarısız oldu."
|
||||
|
||||
|
@ -716,123 +707,79 @@ msgstr "\"%s\" URI'si için 'sink' öğesi bağlanamadı"
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "boş boruhattına izin verilmiyor"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
#, fuzzy
|
||||
msgid "Print all elements"
|
||||
msgstr "\"%s\" öğesi yok"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr "Kullanım: gst-xmllaunch <dosya.xml> [ öğe.özellik=değer ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "HATA: xml dosyası '%s' ayrıştırması başarısız.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "HATA: '%s' dosyasında üst seviye öğesi bulunamadı.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "UYARI: Şu anda sadece bir tane üst seviye öğesi destekleniyor."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "HATA: komut satırı argümanı %d ayrıştırılamadı: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "UYARI: '%s' isimli öğe bulunamadı.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "ETİKET BULUNDU : \"%s\" öğesi tarafından bulundu.\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Çıktı etiketleri (metadata olarak da bilinir)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Çıktı durum bilgisi ve özellik uyarıları"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "TÜRÜN durum bilgisini gösterme"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "TÜR1,TÜR2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Boruhattının xml belirtimini DOSYA'ya kaydet ve çık"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "DOSYA"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Hatalı işleticiyi kurma"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "'alloc' takibini yazdır (derleme sırasında etkinleştirilmişse)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Boruhattının kaç defa tekrarlanacağı"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "HATA: boruhattı oluşturulamadı: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "HATA: boruhattı oluşturulamadı.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "UYARI: hatalı boruhattı: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Gene de çalıştırma deneniyor.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "HATA: 'pipeline' öğesi bulunamadı.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "BORUHATTI çalıştırılıyor ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "HATA: boruhattı çalmak istemiyor.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -867,6 +814,36 @@ msgid_plural "Loaded %d plugins with %d features.\n"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Hızlandırılmış CPU işlemlerini kapat"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr "Akımın %s mime türünü işleyebilecek hiç bir öğe yok."
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr "Kullanım: gst-xmllaunch <dosya.xml> [ öğe.özellik=değer ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "HATA: xml dosyası '%s' ayrıştırması başarısız.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "HATA: '%s' dosyasında üst seviye öğesi bulunamadı.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "UYARI: Şu anda sadece bir tane üst seviye öğesi destekleniyor."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "HATA: komut satırı argümanı %d ayrıştırılamadı: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "UYARI: '%s' isimli öğe bulunamadı.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Boruhattının xml belirtimini DOSYA'ya kaydet ve çık"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "DOSYA"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "kabiliyetler"
|
||||
|
||||
|
|
190
po/uk.po
190
po/uk.po
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.4\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2004-09-06 15:16+0300\n"
|
||||
"Last-Translator: Maxim V. Dziumanenko <mvd@mylinux.com.ua>\n"
|
||||
"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
|
||||
|
@ -17,30 +17,30 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
|
||||
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Вивести версію GStreamer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Вважати всі попередження помилками"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Вивести наявні категорії налагодження та вийти"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Типовий рівень налагодження від 1 (лише помилки) до 5 (усе), або 0 - без "
|
||||
"налагодження"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "РІВЕНЬ"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -48,31 +48,27 @@ msgstr ""
|
|||
"Перелік розділених комою пар \"назва_категорії:рівень\" для встановлення "
|
||||
"певних рівнів окремим категоріям. Наприклад: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "ПЕРЕЛІК"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Вимкнути оформлення кольором налагоджувальних повідомлень"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Вимкнути налагодження"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Вимкнути прискорені інструкції процесора"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Вимкнути докладну діагностику завантаження модулів"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "ШЛЯХИ"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -81,32 +77,32 @@ msgstr ""
|
|||
"Перелік розділених комою назв модулів, додаткових до переліку, що "
|
||||
"зберігається у змінній оточення GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "МОДУЛІ"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr "Вимкнути перехоплення помилок сегментації при завантаженні модулів"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "ПЛАНУВАЛЬНИК"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Реєстр, що використовується"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "РЕЄСТР"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "перелік шляхів у яких шукаються модулі (розділюються символом '%s')"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Планувальник, що використовується (типовий '%s')"
|
||||
|
@ -591,51 +587,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr "Немає елементу для обробки потоку з MIME типом %s."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Не вказана назва файлу для запису."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Не вдається відкрити файл \"%s\" для запису."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Помилка закривання файлу \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Помилка при записуванні у файл \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Не вказана назва файлу для читання."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Не вдається відкрити файл \"%s\" для читання."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr "\"%s\" є каталогом."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Файл \"%s\" є сокетом."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Помилка після ітерацій у запитаному порядку."
|
||||
|
||||
|
@ -725,124 +716,78 @@ msgstr "не вдається прив'язати елемент-спожива
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "порожній канал не допускається"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Вивести усі елементи"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr ""
|
||||
"Використання: gst-xmllaunch <file.xml> [ елемент.властивість=значення ... ]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "ПОМИЛКА: помилка при аналізі xml файлу \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "ПОМИЛКА: немає верхнього елементу каналу у файлі \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "ПОПЕРЕДЖЕННЯ: наразі підтримується лише один верхній елемент."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr ""
|
||||
"ПОМИЛКА: не вдається проаналізувати аргумент командного рядка %d: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "ПОПЕРЕДЖЕННЯ: елемент з назвою \"%s\" не існує.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "ЗНАЙДЕНО ТЕГ : знайдено у елементі \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Вивести теги (також відомі як метадані)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Вивести інформацію про статус та сповіщення властивостей"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Не виводити інформацію про статус типу ТИП"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "ТИП1,ТИП2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Зберегти xml представлення каналу у файл ФАЙЛ та завершитись"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "ФАЙЛ"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Не встановлювати обробник збоїв"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Вивести трасу розподілу (якщо ввімкнено при компіляції)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Кількість ітерацій каналу"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "ПОМИЛКА: канал не може бути сконструйований: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "ПОМИЛКА: канал не може бути сконструйований.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "ПОПЕРЕДЖЕННЯ: помилковий канал: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Спроба запуститись у будь-якому разі.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "ПОМИЛКА: не знайдений елемент \"pipeline\".\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "ЗАПУСКАЄТЬСЯ канал ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "ПОМИЛКА: канал не може почати відтворення.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -879,6 +824,39 @@ msgstr[0] "Завантажено %d модулів з %d %s.\n"
|
|||
msgstr[1] "Завантажено %d модулів з %d %s.\n"
|
||||
msgstr[2] "Завантажено %d модулів з %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Вимкнути прискорені інструкції процесора"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr "Немає елементу для обробки потоку з MIME типом %s."
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Використання: gst-xmllaunch <file.xml> [ елемент."
|
||||
#~ "властивість=значення ... ]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "ПОМИЛКА: помилка при аналізі xml файлу \"%s\".\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "ПОМИЛКА: немає верхнього елементу каналу у файлі \"%s\".\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "ПОПЕРЕДЖЕННЯ: наразі підтримується лише один верхній елемент."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr ""
|
||||
#~ "ПОМИЛКА: не вдається проаналізувати аргумент командного рядка %d: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "ПОПЕРЕДЖЕННЯ: елемент з назвою \"%s\" не існує.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Зберегти xml представлення каналу у файл ФАЙЛ та завершитись"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "ФАЙЛ"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "можливості"
|
||||
|
||||
|
|
196
po/vi.po
196
po/vi.po
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: gstreamer 0.8.8\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-05-02 19:36+0200\n"
|
||||
"POT-Creation-Date: 2005-05-17 18:37+0200\n"
|
||||
"PO-Revision-Date: 2005-02-05 16:35+1030\n"
|
||||
"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
|
||||
"Language-Team: Vietnamese <gnomevi-list@lists.sourceforge.net> \n"
|
||||
|
@ -15,30 +15,30 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: gst/gst.c:160
|
||||
#: gst/gst.c:157
|
||||
msgid "Print the GStreamer version"
|
||||
msgstr "Hiển thị phiên bản GStreamer"
|
||||
|
||||
#: gst/gst.c:162
|
||||
#: gst/gst.c:159
|
||||
msgid "Make all warnings fatal"
|
||||
msgstr "Lập tất cả cảnh báo là nghiêm trọng"
|
||||
|
||||
#: gst/gst.c:166
|
||||
#: gst/gst.c:163
|
||||
msgid "Print available debug categories and exit"
|
||||
msgstr "Hiển thị tất cả loại gỡ lỗi sẵn sàng rồi thoát"
|
||||
|
||||
#: gst/gst.c:169
|
||||
#: gst/gst.c:166
|
||||
msgid ""
|
||||
"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
|
||||
msgstr ""
|
||||
"Mức gỡ lỗi mặc định từ 1 (chỉ lỗi) đến 5 (bất cứ điều nào) hay 0 (không xuất "
|
||||
"gì)"
|
||||
|
||||
#: gst/gst.c:171
|
||||
#: gst/gst.c:168
|
||||
msgid "LEVEL"
|
||||
msgstr "MỨC"
|
||||
|
||||
#: gst/gst.c:173
|
||||
#: gst/gst.c:170
|
||||
msgid ""
|
||||
"Comma-separated list of category_name:level pairs to set specific levels for "
|
||||
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
@ -46,31 +46,27 @@ msgstr ""
|
|||
"Danh sách định giới bằng dấu phẩy của đôi tên_loại:mức để lập mức dứt khoát "
|
||||
"cho mỗi loại. Thí dụ: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
|
||||
|
||||
#: gst/gst.c:176
|
||||
#: gst/gst.c:173
|
||||
msgid "LIST"
|
||||
msgstr "DANH SÁCH"
|
||||
|
||||
#: gst/gst.c:178
|
||||
#: gst/gst.c:175
|
||||
msgid "Disable colored debugging output"
|
||||
msgstr "Không xuất dữ liệu gỡ lỗi với màu"
|
||||
|
||||
#: gst/gst.c:180
|
||||
#: gst/gst.c:177
|
||||
msgid "Disable debugging"
|
||||
msgstr "Không gỡ lỗi"
|
||||
|
||||
#: gst/gst.c:184
|
||||
msgid "Disable accelerated CPU instructions"
|
||||
msgstr "Không gởi lệnh CPU đã tăng tốc"
|
||||
|
||||
#: gst/gst.c:186
|
||||
#: gst/gst.c:181
|
||||
msgid "Enable verbose plugin loading diagnostics"
|
||||
msgstr "Chẩn đoán chi tiết việc tải trình cầm phít"
|
||||
|
||||
#: gst/gst.c:188
|
||||
#: gst/gst.c:183
|
||||
msgid "PATHS"
|
||||
msgstr "ĐƯỜNG DẪN"
|
||||
|
||||
#: gst/gst.c:191
|
||||
#: gst/gst.c:186
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Comma-separated list of plugins to preload in addition to the list stored in "
|
||||
|
@ -79,32 +75,32 @@ msgstr ""
|
|||
"Danh sách định giới bằng dấu phẩy của các trình cầm phít để tải trước, thêm "
|
||||
"vào danh sách được cất giữ trong biến môi trường GST_PLUGIN_PATH"
|
||||
|
||||
#: gst/gst.c:193
|
||||
#: gst/gst.c:188
|
||||
msgid "PLUGINS"
|
||||
msgstr "CẦM PHÍT"
|
||||
|
||||
#: gst/gst.c:196
|
||||
#: gst/gst.c:191
|
||||
msgid "Disable trapping of segmentation faults during plugin loading"
|
||||
msgstr "Không bắt lỗi phân đoạn trong khi tải trình cầm phít"
|
||||
|
||||
#: gst/gst.c:199
|
||||
#: gst/gst.c:194
|
||||
msgid "SCHEDULER"
|
||||
msgstr "TRÌNH ĐỊNH"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "Registry to use"
|
||||
msgstr "Cơ quan đăng ký để sử dụng"
|
||||
|
||||
#: gst/gst.c:201
|
||||
#: gst/gst.c:196
|
||||
msgid "REGISTRY"
|
||||
msgstr "CƠ QUAN ĐĂNG KÝ"
|
||||
|
||||
#: gst/gst.c:214
|
||||
#: gst/gst.c:209
|
||||
#, c-format
|
||||
msgid "path list for loading plugins (separated by '%s')"
|
||||
msgstr "danh sách đường dẫn để tải trình cầm phít (định giới bằng '%s')"
|
||||
|
||||
#: gst/gst.c:218
|
||||
#: gst/gst.c:213
|
||||
#, c-format
|
||||
msgid "Scheduler to use (default is '%s')"
|
||||
msgstr "Sử dụng trình định này (mặc định là '%s')"
|
||||
|
@ -587,51 +583,46 @@ msgstr ""
|
|||
msgid ", "
|
||||
msgstr ", "
|
||||
|
||||
#: gst/autoplug/gstspider.c:466
|
||||
#, c-format
|
||||
msgid "There is no element present to handle the stream's mime type %s."
|
||||
msgstr "Hiện không có yếu tố có thể quản lý loại mime %s của dòng này."
|
||||
|
||||
#: gst/elements/gstfilesink.c:268
|
||||
#: gst/elements/gstfilesink.c:243
|
||||
msgid "No file name specified for writing."
|
||||
msgstr "Chưa ghi rõ tên tập tin để ghi vào."
|
||||
|
||||
#: gst/elements/gstfilesink.c:275
|
||||
#: gst/elements/gstfilesink.c:250
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for writing."
|
||||
msgstr "Không mở được tập tin \"%s\" để ghi."
|
||||
|
||||
#: gst/elements/gstfilesink.c:294
|
||||
#: gst/elements/gstfilesink.c:269
|
||||
#, c-format
|
||||
msgid "Error closing file \"%s\"."
|
||||
msgstr "Gặp lỗi khi đóng tập tin \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesink.c:364 gst/elements/gstfilesink.c:400
|
||||
#: gst/elements/gstfilesink.c:453
|
||||
#: gst/elements/gstfilesink.c:339 gst/elements/gstfilesink.c:375
|
||||
#: gst/elements/gstfilesink.c:428
|
||||
#, c-format
|
||||
msgid "Error while writing to file \"%s\"."
|
||||
msgstr "Gặp lỗi khi ghi vào tập tin \"%s\"."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:764 gst/elements/gstmultifilesrc.c:298
|
||||
#: gst/elements/gstfilesrc.c:725
|
||||
msgid "No file name specified for reading."
|
||||
msgstr "Chưa ghi rõ tên tập tin để đọc."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:779 gst/elements/gstmultifilesrc.c:306
|
||||
#: gst/elements/gstfilesrc.c:740
|
||||
#, c-format
|
||||
msgid "Could not open file \"%s\" for reading."
|
||||
msgstr "Không mở được tập tin \"%s\" để đọc."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:790
|
||||
#: gst/elements/gstfilesrc.c:751
|
||||
#, c-format
|
||||
msgid "\"%s\" is a directory."
|
||||
msgstr " \"%s\" là thư mục."
|
||||
|
||||
#: gst/elements/gstfilesrc.c:796
|
||||
#: gst/elements/gstfilesrc.c:757
|
||||
#, c-format
|
||||
msgid "File \"%s\" is a socket."
|
||||
msgstr "Tập tin \"%s\" là ổ cắm."
|
||||
|
||||
#: gst/elements/gstidentity.c:306
|
||||
#: gst/elements/gstidentity.c:276
|
||||
msgid "Failed after iterations as requested."
|
||||
msgstr "Không làm được sau khi làm việc ấy số lần được chọn."
|
||||
|
||||
|
@ -725,125 +716,78 @@ msgstr ""
|
|||
msgid "empty pipeline not allowed"
|
||||
msgstr "không cho phép đường ống trống"
|
||||
|
||||
#: tools/gst-inspect.c:1151
|
||||
#: tools/gst-inspect.c:1032
|
||||
msgid "Print all elements"
|
||||
msgstr "Hiển thị tất cả yếu tố"
|
||||
|
||||
#: tools/gst-launch.c:114
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
"max %s ns).\n"
|
||||
msgstr ""
|
||||
"Thi hành xong sau khi làm việc ấy %s lần (tổng số %s ns (phần tỷ giây), số "
|
||||
"trung bình %s ns, tối thiểu %s ns, tối đa %s ns).\n"
|
||||
|
||||
#: tools/gst-launch.c:141
|
||||
msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
msgstr ""
|
||||
"Cách sử dụng: gst-xmllaunch <tập_tin.xml> [ yếu_tố.đặc_tính=trị_số ...]\n"
|
||||
|
||||
#: tools/gst-launch.c:149
|
||||
#, c-format
|
||||
msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
msgstr "LỖI: không phân tách được tập tin xml '%s'.\n"
|
||||
|
||||
#: tools/gst-launch.c:155
|
||||
#, c-format
|
||||
msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
msgstr "LỖI: không có yếu tố đường ống mức đầu trong tập tin '%s'.\n"
|
||||
|
||||
#: tools/gst-launch.c:162
|
||||
#, c-format
|
||||
msgid "WARNING: only one toplevel element is supported at this time."
|
||||
msgstr "CẢNH BÁO: hiện hỗ trợ chỉ một yếu tố mức đầu riêng lẻ."
|
||||
|
||||
#: tools/gst-launch.c:173
|
||||
#, c-format
|
||||
msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
msgstr "LỖI: không phân tách được đối số đường lệnh %d: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:184
|
||||
#, c-format
|
||||
msgid "WARNING: element named '%s' not found.\n"
|
||||
msgstr "CẢNH BÁO: chưa tìm được yếu tố có tên '%s'.\n"
|
||||
|
||||
#: tools/gst-launch.c:327
|
||||
#: tools/gst-launch.c:190
|
||||
#, c-format
|
||||
msgid "FOUND TAG : found by element \"%s\".\n"
|
||||
msgstr "THẺ ĐÃ TÌM : được tìm do yếu tố \"%s\".\n"
|
||||
|
||||
#: tools/gst-launch.c:412
|
||||
#: tools/gst-launch.c:304
|
||||
msgid "Output tags (also known as metadata)"
|
||||
msgstr "Thể xuất (cũng được biết là metadata, dữ liệu về dữ liệu)"
|
||||
|
||||
#: tools/gst-launch.c:414
|
||||
#: tools/gst-launch.c:306
|
||||
msgid "Output status information and property notifications"
|
||||
msgstr "Xuất thông tin trạng thái và thông báo đặc tính"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "Do not output status information of TYPE"
|
||||
msgstr "Không xuất thông tin trạng thái LOẠI"
|
||||
|
||||
#: tools/gst-launch.c:416
|
||||
#: tools/gst-launch.c:308
|
||||
msgid "TYPE1,TYPE2,..."
|
||||
msgstr "LOẠI1,LOẠI2,..."
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "Save xml representation of pipeline to FILE and exit"
|
||||
msgstr "Lưu đường ống dạng xml vào TẬP_TIN rồi thoát"
|
||||
|
||||
#: tools/gst-launch.c:419
|
||||
msgid "FILE"
|
||||
msgstr "TẬP_TIN"
|
||||
|
||||
#: tools/gst-launch.c:422
|
||||
#: tools/gst-launch.c:310
|
||||
msgid "Do not install a fault handler"
|
||||
msgstr "Không cài trình quản lý lỗi"
|
||||
|
||||
#: tools/gst-launch.c:424
|
||||
#: tools/gst-launch.c:312
|
||||
msgid "Print alloc trace (if enabled at compile time)"
|
||||
msgstr "Hiển thị việc chỉ theo cấp phát (nếu được hiệu lực khi biên dich)"
|
||||
|
||||
#: tools/gst-launch.c:426
|
||||
#: tools/gst-launch.c:314
|
||||
msgid "Number of times to iterate pipeline"
|
||||
msgstr "Số lần sử dụng đường ống"
|
||||
|
||||
#: tools/gst-launch.c:496
|
||||
#: tools/gst-launch.c:379
|
||||
#, c-format
|
||||
msgid "ERROR: pipeline could not be constructed: %s.\n"
|
||||
msgstr "LỖI: không cấu tạo đường ống được: %s.\n"
|
||||
|
||||
#: tools/gst-launch.c:500
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:383
|
||||
msgid "ERROR: pipeline could not be constructed.\n"
|
||||
msgstr "LỖI: không cấu tạo đường ống được.\n"
|
||||
|
||||
#: tools/gst-launch.c:504
|
||||
#: tools/gst-launch.c:387
|
||||
#, c-format
|
||||
msgid "WARNING: erroneous pipeline: %s\n"
|
||||
msgstr "CẢNH BÁO: đường ống có lỗi: %s\n"
|
||||
|
||||
#: tools/gst-launch.c:505
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:388
|
||||
msgid " Trying to run anyway.\n"
|
||||
msgstr " Dù sao đang thử chạy.\n"
|
||||
|
||||
#: tools/gst-launch.c:532
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:408
|
||||
msgid "ERROR: the 'pipeline' element wasn't found.\n"
|
||||
msgstr "LỖI: chưa tìm được yếu tố 'đường ống'.\n"
|
||||
|
||||
#: tools/gst-launch.c:539
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:417
|
||||
msgid "RUNNING pipeline ...\n"
|
||||
msgstr "ĐANG CHẠY đường ống ...\n"
|
||||
|
||||
#: tools/gst-launch.c:542
|
||||
#, c-format
|
||||
#: tools/gst-launch.c:421
|
||||
msgid "ERROR: pipeline doesn't want to play.\n"
|
||||
msgstr "LỖI: đường ống không phát được.\n"
|
||||
|
||||
#: tools/gst-launch.c:445
|
||||
#, c-format
|
||||
msgid "Execution ended after %.2fs (%.2fs or %.2f%% idling).\n"
|
||||
msgstr ""
|
||||
|
||||
#: tools/gst-register.c:49
|
||||
#, fuzzy, c-format
|
||||
msgid "Added plugin %s with %d feature.\n"
|
||||
|
@ -876,6 +820,44 @@ msgid "Loaded %d plugins with %d feature.\n"
|
|||
msgid_plural "Loaded %d plugins with %d features.\n"
|
||||
msgstr[0] "Mới tải %d trình cầm phít với %d %s.\n"
|
||||
|
||||
#~ msgid "Disable accelerated CPU instructions"
|
||||
#~ msgstr "Không gởi lệnh CPU đã tăng tốc"
|
||||
|
||||
#~ msgid "There is no element present to handle the stream's mime type %s."
|
||||
#~ msgstr "Hiện không có yếu tố có thể quản lý loại mime %s của dòng này."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
|
||||
#~ "max %s ns).\n"
|
||||
#~ msgstr ""
|
||||
#~ "Thi hành xong sau khi làm việc ấy %s lần (tổng số %s ns (phần tỷ giây), "
|
||||
#~ "số trung bình %s ns, tối thiểu %s ns, tối đa %s ns).\n"
|
||||
|
||||
#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
|
||||
#~ msgstr ""
|
||||
#~ "Cách sử dụng: gst-xmllaunch <tập_tin.xml> [ yếu_tố.đặc_tính=trị_số ...]\n"
|
||||
|
||||
#~ msgid "ERROR: parse of xml file '%s' failed.\n"
|
||||
#~ msgstr "LỖI: không phân tách được tập tin xml '%s'.\n"
|
||||
|
||||
#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
|
||||
#~ msgstr "LỖI: không có yếu tố đường ống mức đầu trong tập tin '%s'.\n"
|
||||
|
||||
#~ msgid "WARNING: only one toplevel element is supported at this time."
|
||||
#~ msgstr "CẢNH BÁO: hiện hỗ trợ chỉ một yếu tố mức đầu riêng lẻ."
|
||||
|
||||
#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
|
||||
#~ msgstr "LỖI: không phân tách được đối số đường lệnh %d: %s.\n"
|
||||
|
||||
#~ msgid "WARNING: element named '%s' not found.\n"
|
||||
#~ msgstr "CẢNH BÁO: chưa tìm được yếu tố có tên '%s'.\n"
|
||||
|
||||
#~ msgid "Save xml representation of pipeline to FILE and exit"
|
||||
#~ msgstr "Lưu đường ống dạng xml vào TẬP_TIN rồi thoát"
|
||||
|
||||
#~ msgid "FILE"
|
||||
#~ msgstr "TẬP_TIN"
|
||||
|
||||
#~ msgid "caps"
|
||||
#~ msgstr "khả năng"
|
||||
|
||||
|
|
|
@ -1,12 +1,5 @@
|
|||
|
||||
SUBDIRS = instantiate memchunk muxing sched threadstate seeking # bufspeed
|
||||
|
||||
if GST_DISABLE_TRACE
|
||||
LAT =
|
||||
else
|
||||
LAT = lat
|
||||
|
||||
endif
|
||||
SUBDIRS = instantiate memchunk seeking # bufspeed
|
||||
|
||||
noinst_PROGRAMS = $(LAT) spidey_bench mass_elements
|
||||
|
||||
|
@ -14,4 +7,4 @@ AM_CFLAGS = $(GST_OBJ_CFLAGS)
|
|||
LIBS = $(GST_OBJ_LIBS)
|
||||
|
||||
EXTRA_DIST = README
|
||||
DIST_SUBDIRS= bufspeed instantiate memchunk muxing sched threadstate seeking
|
||||
DIST_SUBDIRS= bufspeed instantiate memchunk sched threadstate seeking
|
||||
|
|
237
tests/lat.c
237
tests/lat.c
|
@ -1,237 +0,0 @@
|
|||
#include <gst/gst.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* FIXME: WTF does this do? */
|
||||
|
||||
static guint64 max = 0, min = -1, total = 0;
|
||||
static guint count = 0;
|
||||
static guint print_del = 1;
|
||||
static guint iterations = 0;
|
||||
static guint mhz = 0;
|
||||
|
||||
void
|
||||
handoff_src (GstElement * src, GstBuffer * buf, gpointer user_data)
|
||||
{
|
||||
gst_trace_read_tsc (&GST_BUFFER_TIMESTAMP (buf));
|
||||
}
|
||||
|
||||
void
|
||||
handoff_sink (GstElement * sink, GstBuffer * buf, gpointer user_data)
|
||||
{
|
||||
guint64 end, d, avg;
|
||||
guint avg_ns;
|
||||
|
||||
gst_trace_read_tsc (&end);
|
||||
d = end - GST_BUFFER_TIMESTAMP (buf);
|
||||
if (d > max)
|
||||
max = d;
|
||||
if (d < min)
|
||||
min = d;
|
||||
total += d;
|
||||
count++;
|
||||
avg = total / count;
|
||||
avg_ns = (guint) (1000.0 * (double) avg / (double) mhz);
|
||||
|
||||
if ((count % print_del) == 0) {
|
||||
g_print ("%07d:%08" G_GUINT64_FORMAT " min:%08" G_GUINT64_FORMAT " max:%08"
|
||||
G_GUINT64_FORMAT " avg:%08" G_GUINT64_FORMAT " avg-s:0.%09d\r", count,
|
||||
d, min, max, avg, avg_ns);
|
||||
}
|
||||
}
|
||||
|
||||
GstElement *
|
||||
identity_add (GstPipeline * pipeline, GstElement * first, int count)
|
||||
{
|
||||
GstElement *last, *ident;
|
||||
int i;
|
||||
char buf[20];
|
||||
|
||||
last = first;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
snprintf (buf, 20, "identity_%03d", i);
|
||||
ident = gst_element_factory_make ("identity", buf);
|
||||
g_return_val_if_fail (ident != NULL, NULL);
|
||||
g_object_set (G_OBJECT (ident), "silent", TRUE, NULL);
|
||||
gst_bin_add (GST_BIN (pipeline), GST_ELEMENT (ident));
|
||||
gst_pad_link (gst_element_get_pad (last, "src"),
|
||||
gst_element_get_pad (ident, "sink"));
|
||||
last = ident;
|
||||
}
|
||||
|
||||
return last;
|
||||
}
|
||||
|
||||
GstElement *
|
||||
fakesrc (void)
|
||||
{
|
||||
GstElement *src;
|
||||
|
||||
src = gst_element_factory_make ("fakesrc", "src");
|
||||
g_return_val_if_fail (src != NULL, NULL);
|
||||
g_object_set (G_OBJECT (src), "silent", TRUE, NULL);
|
||||
g_object_set (G_OBJECT (src), "num_buffers", iterations, NULL);
|
||||
g_signal_connect (G_OBJECT (src), "handoff", G_CALLBACK (handoff_src), NULL);
|
||||
|
||||
return src;
|
||||
}
|
||||
|
||||
GstElement *
|
||||
fakesink (void)
|
||||
{
|
||||
GstElement *sink;
|
||||
|
||||
sink = gst_element_factory_make ("fakesink", "fakesink");
|
||||
g_return_val_if_fail (sink != NULL, NULL);
|
||||
g_object_set (G_OBJECT (sink), "silent", TRUE, NULL);
|
||||
g_signal_connect (G_OBJECT (sink),
|
||||
"handoff", G_CALLBACK (handoff_sink), NULL);
|
||||
|
||||
return sink;
|
||||
}
|
||||
|
||||
GstPipeline *
|
||||
simple (int argc, int argi, char *argv[])
|
||||
{
|
||||
GstPipeline *pipeline;
|
||||
GstElement *last, *src, *sink;
|
||||
int idents;
|
||||
|
||||
if ((argc - argi) < 1) {
|
||||
fprintf (stderr, "bad params");
|
||||
return NULL;
|
||||
}
|
||||
idents = atoi (argv[argi]);
|
||||
if ((argc - argi) == 2) {
|
||||
gst_scheduler_factory_set_default_name (argv[argi + 1]);
|
||||
}
|
||||
|
||||
pipeline = GST_PIPELINE (gst_pipeline_new ("pipeline"));
|
||||
g_return_val_if_fail (pipeline != NULL, NULL);
|
||||
|
||||
src = fakesrc ();
|
||||
gst_bin_add (GST_BIN (pipeline), GST_ELEMENT (src));
|
||||
last = identity_add (pipeline, src, idents);
|
||||
sink = fakesink ();
|
||||
gst_bin_add (GST_BIN (pipeline), GST_ELEMENT (sink));
|
||||
gst_pad_link (gst_element_get_pad (last, "src"),
|
||||
gst_element_get_pad (sink, "sink"));
|
||||
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
GstPipeline *
|
||||
queue (int argc, int argi, char *argv[])
|
||||
{
|
||||
GstPipeline *pipeline;
|
||||
GstElement *last, *src, *sink, *src_thr, *src_q, *sink_q, *sink_thr;
|
||||
int idents;
|
||||
|
||||
if ((argc - argi) < 1) {
|
||||
fprintf (stderr, "bad params");
|
||||
return NULL;
|
||||
}
|
||||
idents = atoi (argv[argi]);
|
||||
|
||||
if ((argc - argi) == 2) {
|
||||
gst_scheduler_factory_set_default_name (argv[argi + 1]);
|
||||
}
|
||||
|
||||
pipeline = GST_PIPELINE (gst_pipeline_new ("pipeline"));
|
||||
g_return_val_if_fail (pipeline != NULL, NULL);
|
||||
|
||||
src_thr = GST_ELEMENT (gst_thread_new ("src_thread"));
|
||||
g_return_val_if_fail (src_thr != NULL, NULL);
|
||||
|
||||
src = fakesrc ();
|
||||
g_return_val_if_fail (src != NULL, NULL);
|
||||
gst_bin_add (GST_BIN (src_thr), GST_ELEMENT (src));
|
||||
|
||||
src_q = gst_element_factory_make ("queue", "src_q");
|
||||
g_return_val_if_fail (src_q != NULL, NULL);
|
||||
gst_bin_add (GST_BIN (src_thr), GST_ELEMENT (src_q));
|
||||
gst_pad_link (gst_element_get_pad (src, "src"),
|
||||
gst_element_get_pad (src_q, "sink"));
|
||||
|
||||
gst_bin_add (GST_BIN (pipeline), GST_ELEMENT (src_thr));
|
||||
|
||||
last = identity_add (pipeline, src_q, idents);
|
||||
|
||||
sink_q = gst_element_factory_make ("queue", "sink_q");
|
||||
g_return_val_if_fail (sink_q != NULL, NULL);
|
||||
gst_bin_add (GST_BIN (pipeline), GST_ELEMENT (sink_q));
|
||||
gst_pad_link (gst_element_get_pad (last, "src"),
|
||||
gst_element_get_pad (sink_q, "sink"));
|
||||
|
||||
sink_thr = GST_ELEMENT (gst_thread_new ("sink_thread"));
|
||||
g_return_val_if_fail (sink_thr != NULL, NULL);
|
||||
|
||||
sink = fakesink ();
|
||||
g_return_val_if_fail (sink != NULL, NULL);
|
||||
gst_bin_add (GST_BIN (sink_thr), GST_ELEMENT (sink));
|
||||
|
||||
gst_bin_add (GST_BIN (pipeline), GST_ELEMENT (sink_thr));
|
||||
|
||||
gst_pad_link (gst_element_get_pad (sink_q, "src"),
|
||||
gst_element_get_pad (sink, "sink"));
|
||||
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
struct test
|
||||
{
|
||||
char *name;
|
||||
char *params;
|
||||
GstPipeline *(*func) (int argc, int argi, char *argv[]);
|
||||
};
|
||||
|
||||
static struct test tests[] = {
|
||||
{"simple", "ident_count [scheduler_name]", simple},
|
||||
{"queue", "ident_count [scheduler_name]", queue},
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GstPipeline *pipeline;
|
||||
int i;
|
||||
char *name;
|
||||
|
||||
gst_init (&argc, &argv);
|
||||
|
||||
if (argc < 3) {
|
||||
fprintf (stderr,
|
||||
"usage: %s iterations print_del mhz test_name [test_params...]\n",
|
||||
argv[0]);
|
||||
for (i = 0; tests[i].name; i++) {
|
||||
fprintf (stderr, " %s %s\n", tests[i].name, tests[i].params);
|
||||
}
|
||||
exit (1);
|
||||
} else {
|
||||
iterations = atoi (argv[1]);
|
||||
print_del = atoi (argv[2]);
|
||||
mhz = atoi (argv[3]);
|
||||
name = argv[4];
|
||||
}
|
||||
|
||||
pipeline = NULL;
|
||||
for (i = 0; tests[i].name && !pipeline; i++) {
|
||||
if (!strcmp (name, tests[i].name)) {
|
||||
pipeline = tests[i].func (argc, 5, argv);
|
||||
}
|
||||
}
|
||||
g_return_val_if_fail (pipeline != NULL, -1);
|
||||
|
||||
/*xmlSaveFile("lat.gst", gst_xml_write(GST_ELEMENT(pipeline))); */
|
||||
|
||||
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
|
||||
|
||||
while (count < iterations) {
|
||||
gst_bin_iterate (GST_BIN (pipeline));
|
||||
}
|
||||
g_print ("\n");
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
noinst_PROGRAMS = case1
|
||||
|
||||
LDADD = $(GST_OBJ_LIBS)
|
||||
AM_CFLAGS = $(GST_OBJ_CFLAGS)
|
|
@ -1,74 +0,0 @@
|
|||
#include <stdlib.h>
|
||||
#include <gst/gst.h>
|
||||
|
||||
gboolean playing = TRUE;
|
||||
|
||||
static void
|
||||
handoff_signal (GstElement * element, GstBuffer * buf)
|
||||
{
|
||||
g_print ("handoff \"%s\" %" G_GINT64_FORMAT "\n",
|
||||
gst_element_get_name (element), GST_BUFFER_TIMESTAMP (buf));
|
||||
}
|
||||
|
||||
static void
|
||||
eos_signal (GstElement * element)
|
||||
{
|
||||
g_print ("eos received from \"%s\"\n", gst_element_get_name (element));
|
||||
|
||||
playing = FALSE;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GstBin *pipeline;
|
||||
GstElement *src, *tee, *identity1, *identity2, *aggregator, *sink;
|
||||
|
||||
gst_init (&argc, &argv);
|
||||
|
||||
pipeline = GST_BIN (gst_pipeline_new ("pipeline"));
|
||||
g_return_val_if_fail (pipeline != NULL, 1);
|
||||
|
||||
src = gst_element_factory_make ("fakesrc", "src");
|
||||
g_object_set (G_OBJECT (src), "num_buffers", 40, NULL);
|
||||
g_return_val_if_fail (src != NULL, 2);
|
||||
tee = gst_element_factory_make ("tee", "tee");
|
||||
g_return_val_if_fail (tee != NULL, 3);
|
||||
identity1 = gst_element_factory_make ("identity", "identity0");
|
||||
g_return_val_if_fail (identity1 != NULL, 3);
|
||||
identity2 = gst_element_factory_make ("identity", "identity1");
|
||||
g_object_set (G_OBJECT (identity2), "duplicate", 2, NULL);
|
||||
g_object_set (G_OBJECT (identity2), "loop_based", TRUE, NULL);
|
||||
g_return_val_if_fail (identity2 != NULL, 3);
|
||||
aggregator = gst_element_factory_make ("aggregator", "aggregator");
|
||||
g_object_set (G_OBJECT (aggregator), "sched", 4, NULL);
|
||||
g_return_val_if_fail (aggregator != NULL, 3);
|
||||
sink = gst_element_factory_make ("fakesink", "sink");
|
||||
g_return_val_if_fail (sink != NULL, 4);
|
||||
|
||||
gst_bin_add_many (pipeline, src, tee, identity1, identity2, aggregator, sink,
|
||||
NULL);
|
||||
|
||||
gst_element_link_pads (src, "src", tee, "sink");
|
||||
gst_pad_link (gst_element_get_request_pad (tee, "src%d"),
|
||||
gst_element_get_pad (identity1, "sink"));
|
||||
gst_pad_link (gst_element_get_request_pad (tee, "src%d"),
|
||||
gst_element_get_pad (identity2, "sink"));
|
||||
gst_pad_link (gst_element_get_pad (identity1, "src"),
|
||||
gst_element_get_request_pad (aggregator, "sink%d"));
|
||||
gst_pad_link (gst_element_get_pad (identity2, "src"),
|
||||
gst_element_get_request_pad (aggregator, "sink%d"));
|
||||
gst_element_link_pads (aggregator, "src", sink, "sink");
|
||||
|
||||
g_signal_connect (G_OBJECT (src), "eos", G_CALLBACK (eos_signal), NULL);
|
||||
g_signal_connect (G_OBJECT (sink), "handoff",
|
||||
G_CALLBACK (handoff_signal), NULL);
|
||||
|
||||
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
|
||||
|
||||
while (gst_bin_iterate (pipeline));
|
||||
|
||||
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
|
||||
|
||||
exit (0);
|
||||
}
|
|
@ -19,7 +19,7 @@ SUBDIRS = \
|
|||
dlopen dynparams \
|
||||
elements ghostpads indexers negotiation pad \
|
||||
$(GST_PARSE_DIRS) \
|
||||
plugin refcounting schedulers states tags threads
|
||||
plugin refcounting schedulers states tags
|
||||
|
||||
DIST_SUBDIRS = \
|
||||
bins bytestream caps childproxy cleanup clock \
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
include ../Rules
|
||||
|
||||
tests_pass = filepadsink
|
||||
tests_fail = test1
|
||||
tests_fail =
|
||||
tests_ignore =
|
||||
|
||||
test1_SOURCES = test1.c gstbstest.c
|
||||
test1_LDFLAGS = $(top_builddir)/libs/gst/bytestream/libgstbytestream.la
|
||||
|
||||
filepadsink_CFLAGS = $(AM_CFLAGS) -DTHE_FILE=\""$(top_srcdir)/configure.ac"\"
|
||||
filepadsink_LDFLAGS = $(top_builddir)/libs/gst/bytestream/libgstbytestream.la
|
||||
|
|
|
@ -1,419 +0,0 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||
* 2000 Wim Taymans <wtay@chello.be>
|
||||
*
|
||||
* gstbstest.c:
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <gst/gst.h>
|
||||
#include <gst/bytestream/bytestream.h>
|
||||
|
||||
#define GST_TYPE_BSTEST (gst_bstest_get_type())
|
||||
#define GST_BSTEST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BSTEST,GstBsTest))
|
||||
#define GST_BSTEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BSTEST,GstBsTestClass))
|
||||
#define GST_IS_BSTEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BSTEST))
|
||||
#define GST_IS_BSTEST_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BSTEST))
|
||||
|
||||
typedef struct _GstBsTest GstBsTest;
|
||||
typedef struct _GstBsTestClass GstBsTestClass;
|
||||
|
||||
struct _GstBsTest
|
||||
{
|
||||
GstElement element;
|
||||
|
||||
GstPad *sinkpad;
|
||||
GstPad *srcpad;
|
||||
|
||||
GstByteStream *bs;
|
||||
|
||||
gchar *accesspattern;
|
||||
guint num_patterns;
|
||||
gchar **patterns;
|
||||
guint sizemin;
|
||||
guint sizemax;
|
||||
gint count;
|
||||
gboolean silent;
|
||||
};
|
||||
|
||||
struct _GstBsTestClass
|
||||
{
|
||||
GstElementClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_bstest_get_type (void);
|
||||
|
||||
|
||||
GstElementDetails gst_bstest_details = GST_ELEMENT_DETAILS ("ByteStreamTest",
|
||||
"Filter",
|
||||
"Test for the GstByteStream code",
|
||||
"Erik Walthinsen <omega@temple-baptist.com>, "
|
||||
"Wim Taymans <wim.taymans@chello.be>");
|
||||
|
||||
|
||||
/* BsTest signals and args */
|
||||
enum
|
||||
{
|
||||
/* FILL ME */
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
ARG_0,
|
||||
ARG_SIZEMIN,
|
||||
ARG_SIZEMAX,
|
||||
ARG_COUNT,
|
||||
ARG_SILENT,
|
||||
ARG_ACCESSPATTERN,
|
||||
};
|
||||
|
||||
|
||||
static void gst_bstest_base_init (gpointer g_class);
|
||||
static void gst_bstest_class_init (GstBsTestClass * klass);
|
||||
static void gst_bstest_init (GstBsTest * bstest);
|
||||
|
||||
static void gst_bstest_set_property (GObject * object, guint prop_id,
|
||||
const GValue * value, GParamSpec * pspec);
|
||||
static void gst_bstest_get_property (GObject * object, guint prop_id,
|
||||
GValue * value, GParamSpec * pspec);
|
||||
|
||||
static GstElementStateReturn gst_bstest_change_state (GstElement * element);
|
||||
static void gst_bstest_loop (GstElement * element);
|
||||
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
||||
/* static guint gst_bstest_signals[LAST_SIGNAL] = { 0 }; */
|
||||
|
||||
GType
|
||||
gst_bstest_get_type (void)
|
||||
{
|
||||
static GType bstest_type = 0;
|
||||
|
||||
if (!bstest_type) {
|
||||
static const GTypeInfo bstest_info = {
|
||||
sizeof (GstBsTestClass),
|
||||
gst_bstest_base_init,
|
||||
NULL,
|
||||
(GClassInitFunc) gst_bstest_class_init,
|
||||
NULL,
|
||||
NULL,
|
||||
sizeof (GstBsTest),
|
||||
0,
|
||||
(GInstanceInitFunc) gst_bstest_init,
|
||||
};
|
||||
|
||||
bstest_type =
|
||||
g_type_register_static (GST_TYPE_ELEMENT, "BSTest", &bstest_info, 0);
|
||||
}
|
||||
return bstest_type;
|
||||
}
|
||||
static void
|
||||
gst_bstest_base_init (gpointer g_class)
|
||||
{
|
||||
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
|
||||
|
||||
gst_element_class_set_details (gstelement_class, &gst_bstest_details);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_bstest_class_init (GstBsTestClass * klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *gstelement_class;
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
gstelement_class = (GstElementClass *) klass;
|
||||
|
||||
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
||||
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SIZEMIN,
|
||||
g_param_spec_int ("sizemin", "sizemin", "sizemin", 0, G_MAXINT,
|
||||
0, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SIZEMAX,
|
||||
g_param_spec_int ("sizemax", "sizemax", "sizemax", 0, G_MAXINT,
|
||||
384, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ACCESSPATTERN,
|
||||
g_param_spec_string ("accesspattern", "accesspattern", "accesspattern",
|
||||
"r", G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_COUNT,
|
||||
g_param_spec_uint ("count", "count", "count",
|
||||
0, G_MAXUINT, 0, G_PARAM_READWRITE));
|
||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT,
|
||||
g_param_spec_boolean ("silent", "silent", "silent",
|
||||
FALSE, G_PARAM_READWRITE));
|
||||
|
||||
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_bstest_set_property);
|
||||
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_bstest_get_property);
|
||||
|
||||
gstelement_class->change_state = gst_bstest_change_state;
|
||||
|
||||
}
|
||||
|
||||
static GstCaps *
|
||||
gst_bstest_getcaps (GstPad * pad)
|
||||
{
|
||||
GstBsTest *bstest = GST_BSTEST (gst_pad_get_parent (pad));
|
||||
GstPad *otherpad;
|
||||
|
||||
otherpad = (pad == bstest->srcpad) ? bstest->sinkpad : bstest->srcpad;
|
||||
|
||||
return gst_pad_get_allowed_caps (otherpad);
|
||||
}
|
||||
|
||||
GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS_ANY);
|
||||
|
||||
static void
|
||||
gst_bstest_init (GstBsTest * bstest)
|
||||
{
|
||||
bstest->sinkpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
|
||||
"sink");
|
||||
gst_element_add_pad (GST_ELEMENT (bstest), bstest->sinkpad);
|
||||
gst_pad_set_getcaps_function (bstest->sinkpad, gst_bstest_getcaps);
|
||||
|
||||
bstest->srcpad =
|
||||
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
|
||||
"src");
|
||||
gst_element_add_pad (GST_ELEMENT (bstest), bstest->srcpad);
|
||||
gst_pad_set_getcaps_function (bstest->srcpad, gst_bstest_getcaps);
|
||||
|
||||
gst_element_set_loop_function (GST_ELEMENT (bstest), gst_bstest_loop);
|
||||
|
||||
bstest->sizemin = 0;
|
||||
bstest->sizemax = 384;
|
||||
bstest->accesspattern = g_strdup ("r");
|
||||
bstest->patterns = g_strsplit (bstest->accesspattern, ":", 0);
|
||||
bstest->count = 5;
|
||||
bstest->silent = FALSE;
|
||||
bstest->bs = NULL;
|
||||
}
|
||||
|
||||
static guint
|
||||
gst_bstest_get_size (GstBsTest * bstest, gchar * sizestring, guint prevsize)
|
||||
{
|
||||
guint size;
|
||||
|
||||
if (sizestring[0] == 0) {
|
||||
size = bstest->sizemax;
|
||||
} else if (sizestring[0] == 'r') {
|
||||
size =
|
||||
bstest->sizemin +
|
||||
(guint8) (((gfloat) bstest->sizemax) * rand () / (RAND_MAX +
|
||||
(gfloat) bstest->sizemin));
|
||||
} else if (sizestring[0] == '<') {
|
||||
size = prevsize;
|
||||
} else {
|
||||
size = atoi (sizestring);
|
||||
}
|
||||
|
||||
if (size == 0)
|
||||
size++;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_bstest_loop (GstElement * element)
|
||||
{
|
||||
GstBsTest *bstest;
|
||||
GstBuffer *buf = NULL;
|
||||
|
||||
g_return_if_fail (element != NULL);
|
||||
g_return_if_fail (GST_IS_BSTEST (element));
|
||||
|
||||
bstest = GST_BSTEST (element);
|
||||
|
||||
do {
|
||||
guint size = 0;
|
||||
guint i = 0;
|
||||
guint8 *ptr;
|
||||
|
||||
while (i < bstest->num_patterns) {
|
||||
buf = NULL;
|
||||
|
||||
if (bstest->patterns[i][0] == 'r') {
|
||||
size = gst_bstest_get_size (bstest, &bstest->patterns[i][1], size);
|
||||
if (!bstest->silent)
|
||||
g_print ("bstest: ***** read %d bytes\n", size);
|
||||
gst_bytestream_read (bstest->bs, &buf, size);
|
||||
} else if (bstest->patterns[i][0] == 'f') {
|
||||
size = gst_bstest_get_size (bstest, &bstest->patterns[i][1], size);
|
||||
if (!bstest->silent)
|
||||
g_print ("bstest: ***** flush %d bytes\n", size);
|
||||
gst_bytestream_flush (bstest->bs, size);
|
||||
} else if (!strncmp (bstest->patterns[i], "pb", 2)) {
|
||||
size = gst_bstest_get_size (bstest, &bstest->patterns[i][2], size);
|
||||
if (!bstest->silent)
|
||||
g_print ("bstest: ***** peek bytes %d bytes\n", size);
|
||||
gst_bytestream_peek_bytes (bstest->bs, &ptr, size);
|
||||
} else if (bstest->patterns[i][0] == 'p') {
|
||||
size = gst_bstest_get_size (bstest, &bstest->patterns[i][1], size);
|
||||
if (!bstest->silent)
|
||||
g_print ("bstest: ***** peek %d bytes\n", size);
|
||||
gst_bytestream_peek (bstest->bs, &buf, size);
|
||||
gst_buffer_unref (buf);
|
||||
buf = NULL;
|
||||
}
|
||||
|
||||
if (buf)
|
||||
gst_pad_push (bstest->srcpad, GST_DATA (buf));
|
||||
|
||||
i++;
|
||||
}
|
||||
/* } while (!GST_ELEMENT_IS_COTHREAD_STOPPING (element)); */
|
||||
|
||||
} while (0);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_bstest_set_property (GObject * object, guint prop_id, const GValue * value,
|
||||
GParamSpec * pspec)
|
||||
{
|
||||
GstBsTest *bstest;
|
||||
|
||||
/* it's not null if we got it, but it might not be ours */
|
||||
g_return_if_fail (GST_IS_BSTEST (object));
|
||||
|
||||
bstest = GST_BSTEST (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case ARG_SIZEMIN:
|
||||
bstest->sizemin = g_value_get_int (value);
|
||||
break;
|
||||
case ARG_SIZEMAX:
|
||||
bstest->sizemax = g_value_get_int (value);
|
||||
break;
|
||||
case ARG_ACCESSPATTERN:
|
||||
if (bstest->accesspattern) {
|
||||
g_free (bstest->accesspattern);
|
||||
g_strfreev (bstest->patterns);
|
||||
}
|
||||
if (g_value_get_string (value) == NULL) {
|
||||
gst_element_set_state (GST_ELEMENT (object), GST_STATE_NULL);
|
||||
bstest->accesspattern = NULL;
|
||||
bstest->num_patterns = 0;
|
||||
} else {
|
||||
guint i = 0;
|
||||
|
||||
bstest->accesspattern = g_strdup (g_value_get_string (value));
|
||||
bstest->patterns = g_strsplit (bstest->accesspattern, ":", 0);
|
||||
while (bstest->patterns[i++]);
|
||||
bstest->num_patterns = i - 1;
|
||||
}
|
||||
break;
|
||||
case ARG_COUNT:
|
||||
bstest->count = g_value_get_uint (value);
|
||||
break;
|
||||
case ARG_SILENT:
|
||||
bstest->silent = g_value_get_boolean (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_bstest_get_property (GObject * object, guint prop_id, GValue * value,
|
||||
GParamSpec * pspec)
|
||||
{
|
||||
GstBsTest *bstest;
|
||||
|
||||
/* it's not null if we got it, but it might not be ours */
|
||||
g_return_if_fail (GST_IS_BSTEST (object));
|
||||
|
||||
bstest = GST_BSTEST (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case ARG_SIZEMIN:
|
||||
g_value_set_int (value, bstest->sizemin);
|
||||
break;
|
||||
case ARG_SIZEMAX:
|
||||
g_value_set_int (value, bstest->sizemax);
|
||||
break;
|
||||
case ARG_ACCESSPATTERN:
|
||||
g_value_set_string (value, bstest->accesspattern);
|
||||
break;
|
||||
case ARG_COUNT:
|
||||
g_value_set_uint (value, bstest->count);
|
||||
break;
|
||||
case ARG_SILENT:
|
||||
g_value_set_boolean (value, bstest->silent);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static GstElementStateReturn
|
||||
gst_bstest_change_state (GstElement * element)
|
||||
{
|
||||
GstBsTest *bstest;
|
||||
|
||||
g_return_val_if_fail (GST_IS_BSTEST (element), GST_STATE_FAILURE);
|
||||
|
||||
bstest = GST_BSTEST (element);
|
||||
|
||||
if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
|
||||
if (bstest->bs) {
|
||||
gst_bytestream_destroy (bstest->bs);
|
||||
bstest->bs = NULL;
|
||||
}
|
||||
} else {
|
||||
if (!bstest->bs) {
|
||||
bstest->bs = gst_bytestream_new (bstest->sinkpad);
|
||||
}
|
||||
}
|
||||
|
||||
if (GST_ELEMENT_CLASS (parent_class)->change_state)
|
||||
return GST_ELEMENT_CLASS (parent_class)->change_state (element);
|
||||
|
||||
return GST_STATE_SUCCESS;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
plugin_init (GstPlugin * plugin)
|
||||
{
|
||||
/* We need to create an ElementFactory for each element we provide.
|
||||
* This consists of the name of the element, the GType identifier,
|
||||
* and a pointer to the details structure at the top of the file.
|
||||
*/
|
||||
return gst_element_register (plugin, "bstest", GST_RANK_PRIMARY,
|
||||
GST_TYPE_BSTEST);
|
||||
}
|
||||
|
||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
||||
GST_VERSION_MINOR,
|
||||
"bstest",
|
||||
"test for the bytestream element",
|
||||
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN)
|
|
@ -2,6 +2,3 @@ include ../Rules
|
|||
|
||||
tests_pass = cleanup1 cleanup2 cleanup4 cleanup5
|
||||
tests_fail =
|
||||
|
||||
# cleanup3 fails depending on the machine
|
||||
tests_ignore = cleanup3
|
||||
|
|
|
@ -1,68 +0,0 @@
|
|||
#include <gst/gst.h>
|
||||
|
||||
static GstElement *
|
||||
create_pipeline (void)
|
||||
{
|
||||
GstElement *fakesrc, *fakesink;
|
||||
GstElement *pipeline;
|
||||
GstElement *thread, *queue;
|
||||
|
||||
pipeline = gst_pipeline_new ("main_pipeline");
|
||||
|
||||
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
|
||||
thread = gst_thread_new ("thread");
|
||||
fakesink = gst_element_factory_make ("fakesink", "fakesink");
|
||||
queue = gst_element_factory_make ("queue", "queue");
|
||||
gst_bin_add (GST_BIN (thread), fakesink);
|
||||
gst_bin_add (GST_BIN (thread), queue);
|
||||
gst_element_link (queue, fakesink);
|
||||
gst_element_add_ghost_pad (thread, gst_element_get_pad (queue, "sink"),
|
||||
"sink");
|
||||
|
||||
gst_element_link (fakesrc, thread);
|
||||
|
||||
gst_bin_add (GST_BIN (pipeline), fakesrc);
|
||||
gst_bin_add (GST_BIN (pipeline), thread);
|
||||
|
||||
g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
|
||||
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
gint
|
||||
main (gint argc, gchar * argv[])
|
||||
{
|
||||
GstElement *pipeline;
|
||||
gint i = 10000;
|
||||
gint step = 100;
|
||||
|
||||
free (malloc (8)); /* -lefence */
|
||||
|
||||
gst_init (&argc, &argv);
|
||||
|
||||
|
||||
g_mem_chunk_info ();
|
||||
while (i--) {
|
||||
if (i % step == 0)
|
||||
fprintf (stderr, "%10d\r", i);
|
||||
pipeline = create_pipeline ();
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
|
||||
while (gst_bin_iterate (GST_BIN (pipeline)));
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_NULL);
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
|
||||
while (gst_bin_iterate (GST_BIN (pipeline)));
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_NULL);
|
||||
|
||||
gst_object_unref (GST_OBJECT (pipeline));
|
||||
}
|
||||
fprintf (stderr, "\n");
|
||||
g_mem_chunk_info ();
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
include ../Rules
|
||||
|
||||
tests_pass = signedness clock1 clock2
|
||||
tests_pass = signedness clock1
|
||||
tests_fail =
|
||||
tests_ignore =
|
||||
|
|
|
@ -26,6 +26,7 @@ main (int argc, char *argv[])
|
|||
g_print ("Could not create a fakesrc element !\n");
|
||||
return 1;
|
||||
}
|
||||
g_object_set (G_OBJECT (src), "num-buffers", 1, NULL);
|
||||
if ((id = gst_element_factory_make ("identity", "filter")) == NULL) {
|
||||
g_print ("Could not create a identity element !\n");
|
||||
return 1;
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
/*
|
||||
* testsuite program to test clock behaviour
|
||||
*
|
||||
* creates a fakesrc ! identity ! fakesink pipeline
|
||||
* registers a callback on fakesrc and one on fakesink
|
||||
* also register a normal GLib timeout which should not be reached
|
||||
*/
|
||||
|
||||
#include <gst/gst.h>
|
||||
void
|
||||
gst_clock_debug (GstClock * clock, GstElement * fakesink)
|
||||
{
|
||||
g_print ("Clock info: time %" G_GUINT64_FORMAT " - Element info: time %"
|
||||
G_GUINT64_FORMAT "\n", gst_clock_get_time (clock),
|
||||
gst_element_get_time (fakesink));
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GstClock *clock = NULL;
|
||||
GstElement *pipeline, *fakesrc, *fakesink;
|
||||
|
||||
gst_init (&argc, &argv);
|
||||
|
||||
clock = gst_system_clock_obtain ();
|
||||
g_assert (clock != NULL);
|
||||
|
||||
/* we check the time on an element */
|
||||
fakesrc = gst_element_factory_make ("fakesrc", NULL);
|
||||
g_assert (fakesrc);
|
||||
fakesink = gst_element_factory_make ("fakesink", NULL);
|
||||
g_assert (fakesink);
|
||||
pipeline = gst_element_factory_make ("pipeline", NULL);
|
||||
g_assert (pipeline);
|
||||
gst_bin_add_many (GST_BIN (pipeline), fakesink, fakesrc, NULL);
|
||||
gst_element_link (fakesrc, fakesink);
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
|
||||
gst_clock_debug (clock, fakesink);
|
||||
g_usleep (G_USEC_PER_SEC);
|
||||
gst_clock_debug (clock, fakesink);
|
||||
|
||||
gst_element_wait (fakesink, 2 * GST_SECOND);
|
||||
gst_clock_debug (clock, fakesink);
|
||||
|
||||
gst_element_wait (fakesink, 5 * GST_SECOND);
|
||||
gst_clock_debug (clock, fakesink);
|
||||
|
||||
g_usleep (G_USEC_PER_SEC);
|
||||
gst_clock_debug (clock, fakesink);
|
||||
|
||||
/* success */
|
||||
return 0;
|
||||
}
|
|
@ -6,23 +6,15 @@ void
|
|||
do_test (void)
|
||||
{
|
||||
GstElement *pipeline;
|
||||
int i;
|
||||
gboolean ret;
|
||||
|
||||
gst_init (NULL, NULL);
|
||||
|
||||
pipeline = gst_parse_launch ("fakesrc ! fakesink", NULL);
|
||||
pipeline = gst_parse_launch ("fakesrc num-buffers=100 ! fakesink", NULL);
|
||||
g_assert (pipeline != NULL);
|
||||
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
|
||||
for (i = 0; i < 100; i++) {
|
||||
ret = gst_bin_iterate (GST_BIN (pipeline));
|
||||
g_assert (ret);
|
||||
g_print ("%s", (i & 1) ? "+" : "-");
|
||||
}
|
||||
g_print ("\n");
|
||||
gst_bin_iterate (GST_BIN (pipeline));
|
||||
|
||||
gst_object_unref (GST_OBJECT (pipeline));
|
||||
}
|
||||
|
|
|
@ -46,9 +46,9 @@ main (int argc, char *argv[])
|
|||
g_print ("Creating elements\n");
|
||||
if (!(src = element_create ("src", "fakesrc")))
|
||||
return 1;
|
||||
g_object_set (G_OBJECT (src), "sizetype", 2, NULL);
|
||||
if (!(sink = element_create ("sink", "fakesink")))
|
||||
return 1;
|
||||
g_object_set (G_OBJECT (src), "sizetype", 2, "num-buffers", 100, NULL);
|
||||
|
||||
/* add */
|
||||
g_print ("Adding elements to bin\n");
|
||||
|
@ -59,13 +59,6 @@ main (int argc, char *argv[])
|
|||
g_print ("Linking elements\n");
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
|
||||
/* we expect this to give an error */
|
||||
if (gst_bin_iterate (GST_BIN (pipeline)) != FALSE) {
|
||||
g_warning
|
||||
("Iterating a bin with unlinked elements should return FALSE !\n");
|
||||
retval = 1;
|
||||
}
|
||||
|
||||
gst_pad_link (gst_element_get_pad (src, "src"),
|
||||
gst_element_get_pad (sink, "sink"));
|
||||
|
||||
|
@ -73,12 +66,7 @@ main (int argc, char *argv[])
|
|||
g_print ("Doing 1 iteration\n");
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
|
||||
/* we expect this to work */
|
||||
if (gst_bin_iterate (GST_BIN (pipeline)) != TRUE) {
|
||||
g_error ("Iterating a bin with linked elements should return TRUE !\n");
|
||||
retval = 1;
|
||||
}
|
||||
|
||||
gst_bin_iterate (GST_BIN (pipeline));
|
||||
g_print ("Done !\n");
|
||||
return retval;
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue