Coder Social home page Coder Social logo

ridgerun / gstd-1.x Goto Github PK

View Code? Open in Web Editor NEW
166.0 166.0 50.0 2.96 MB

GStreamer Daemon is a GStreamer framework for controlling audio and video streaming using TCP messages. This version is based on GStreamer 1.x

Home Page: https://developer.ridgerun.com/wiki/index.php?title=Gstd-1.0

License: GNU Lesser General Public License v2.1

Shell 0.89% C 78.20% Makefile 1.93% M4 0.95% Meson 2.40% Python 13.67% JavaScript 1.96%
gstreamer

gstd-1.x's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gstd-1.x's Issues

Build Error

Unable to build GstD:

git checkout develop
./autogen.sh
./configure
make

Making all in docs
make[2]: Entering directory '/home/eramirez/work/RD/gstd-1.x-last/docs'
Making all in reference
make[3]: Entering directory '/home/eramirez/work/RD/gstd-1.x-last/docs/reference'
Making all in gstd
make[4]: Entering directory '/home/eramirez/work/RD/gstd-1.x-last/docs/reference/gstd'
../../../docs/gtk-doc.make:7: *** missing separator.  Stop.
make[4]: Leaving directory '/home/eramirez/work/RD/gstd-1.x-last/docs/reference/gstd'
Makefile:376: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/eramirez/work/RD/gstd-1.x-last/docs/reference'
Makefile:376: recipe for target 'all-recursive' failed
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory '/home/eramirez/work/RD/gstd-1.x-last/docs'
Makefile:430: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/eramirez/work/RD/gstd-1.x-last'
Makefile:362: recipe for target 'all' failed
make: *** [all] Error 2

Can't connect client using unix sockets. Get "Bad Command" status

I've had some troubles in my testing. If I force a network disconnection I also lose connectivity to gstd. The process is still running. I have to keep polling the bus for an eos to restart the stream but it will eventually fail to connect.

I am trying to use unix sockets instead but the client won't connect.

gstd -u
gstd-client -u bus_filter testpipe error+eos
{
  "code" : 10,
  "description" : "Bad command",
  "response" : null
}

Get caps feedback

There are several cases where it is interesting to find the negotiated caps at runtime, e.g: sprop-parameter-sets in an RTP streaming. There are several ways to get this feedback:

  • notify::caps signal in the related pad (preferred)
  • Do a manual query on the pad "caps" property
  • Have the caps posted on the bus as a message

Core dump in GSTD

GSTD daemon dumped all pipelines running on it (gstd-client list_pipelines reported an empty list) and left a core-dump behind. Previously, 5 pipelines had been running on the daemon.

The core dump is as follows:

[Thread debugging using libthread_db enabled]                                                                                                  │·············
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".                                                                     │·············
Core was generated by `/usr/bin/gstd'.                                                                                                         │·············
Program terminated with signal SIGSEGV, Segmentation fault.                                                                                    │·············
#0  strlen () at ../sysdeps/x86_64/strlen.S:106                                                                                                │·············
106     ../sysdeps/x86_64/strlen.S: No such file or directory.                                                                                 │·············
[Current thread is 1 (Thread 0x7f41e4ff9700 (LWP 23565))]                                                                                      │·············
(gdb) bt                                                                                                                                       │·············
#0  strlen () at ../sysdeps/x86_64/strlen.S:106                                                                                                │·············
#1  0x00007f42ae842c0f in ?? () from /usr/lib/x86_64-linux-gnu/libgstd-core.so.0                                                               │·············
#2  0x00007f42ae84c7a3 in ?? () from /usr/lib/x86_64-linux-gnu/libgstd-core.so.0                                                               │·············
#3  0x00007f42ae84db76 in ?? () from /usr/lib/x86_64-linux-gnu/libgstd-core.so.0                                                               │·············
#4  0x00007f42ae84dd8f in gstd_parser_parse_cmd () from /usr/lib/x86_64-linux-gnu/libgstd-core.so.0                                            │·············
#5  0x00007f42ae843ece in ?? () from /usr/lib/x86_64-linux-gnu/libgstd-core.so.0                                                               │·············
#6  0x00007f42ad735e40 in ffi_call_unix64 () from /usr/lib/x86_64-linux-gnu/libffi.so.6                                                        │·············
#7  0x00007f42ad7358ab in ffi_call () from /usr/lib/x86_64-linux-gnu/libffi.so.6                                                               │·············
#8  0x00007f42aef82cf5 in g_cclosure_marshal_generic_va () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0                                  │·············
#9  0x00007f42aef82122 in ?? () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0                                                             │·············
#10 0x00007f42aef9c4b8 in g_signal_emit_valist () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0                                           │·············
#11 0x00007f42aef9d08f in g_signal_emit () from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0                                                  │·············
#12 0x00007f42acf99a28 in ?? () from /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0                                                                 │·············
#13 0x00007f42aecd254e in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0                                                                    │·············
#14 0x00007f42aecd1bb5 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0                                                                    │·············
#15 0x00007f42ae6226ba in start_thread (arg=0x7f41e4ff9700) at pthread_create.c:333                                                            │·············
#16 0x00007f42ae35841d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

Segmentation fault when assigning child proxy properties

The issue was found building a pipeline with gst-inference, which was intended to use 6 models, but failed with a seg fault when adding the fifth one when assigning a child proxy property. The following pipeline was enough to reproduce the issue:

gstd-client pipeline_create p0 inceptionv1 name=inv1_0 labels="$(cat $labels_path_0)" model-location=$model_path_0 backend=tensorflow backend::input-layer=$input_layer_0  backend::output-layer=$output_layer_0 tinyyolov2 name=ty0 labels="$(cat $labels_path_1)" model-location=$model_path_1 backend=tensorflow backend::input-layer=$input_layer_1 backend::output-layer=$output_layer_1 inceptionv3 name=inv3_0 labels="$(cat $labels_path_2)" model-location=$model_path_2 backend=tensorflow backend::input-layer=$input_layer_2  backend::output-layer=$output_layer_2 inceptionv1 name=inv1_1 labels="$(cat $labels_path_3)" model-location=$model_path_3 backend=tensorflow backend::input-layer=$input_layer_3  backend::output-layer=$output_layer_3
tinyyolov2 name=ty1 labels="$(cat $labels_path_4)" model-location=$model_path_4 backend=tensorflow backend::input-layer=$input_layer_4 backend::output-layer=$output_layer_4 

Here's the backtrace obtained with gdb:

Starting program: /usr/local/bin/gstd -D
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
[New Thread 0x7fb76d20a0 (LWP 15374)]
[New Thread 0x7fb6ed10a0 (LWP 15385)]
2020-02-11 17:16:00.285257: I tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library libcudart.so.10.0
(gstd:15371): GLib-GObject-WARNING **: 17:16:00.368: invalid cast from 'GstTensorflow' to 'GstObject'
(gstd:15371): GLib-GObject-WARNING **: 17:16:00.368: invalid cast from 'GstTensorflow' to 'GstObject'
** (gstd:15371): CRITICAL **: 17:16:00.368: gstd_element_append_object_properties: assertion 'GST_IS_OBJECT (object)' failed
Thread 3 "pool" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fb6ed10a0 (LWP 15385)]
strlen () at ../sysdeps/aarch64/strlen.S:94
94	../sysdeps/aarch64/strlen.S: No such file or directory.
(gdb) bt
#0  0x0000007fb7bb9450 in strlen () at ../sysdeps/aarch64/strlen.S:94
#1  0x0000007fb7b85f18 in _IO_vfprintf_internal (s=s@entry=0x7fb6ecf498, format=format@entry=0x7fb7ce1000 "%s::", ap=...) at vfprintf.c:1643
#2  0x0000007fb7c1f04c in __GI___vasprintf_chk (result_ptr=0x7fb6ecf630, flags=1, format=0x7fb7ce1000 "%s::", args=...) at vasprintf_chk.c:66
#3  0x0000007fb7da59bc in g_vasprintf () at /usr/lib/aarch64-linux-gnu/libglib-2.0.so.0
#4  0x0000007fb7d7d590 in g_strdup_vprintf () at /usr/lib/aarch64-linux-gnu/libglib-2.0.so.0
#5  0x0000007fb7d7d640 in g_strdup_printf () at /usr/lib/aarch64-linux-gnu/libglib-2.0.so.0
#6  0x0000007fb7ccf488 in gstd_element_fill_child_properties (self=self@entry=0x55557c4ec0, element=0x7fa8b842b0, hierarchy=hierarchy@entry=0x0) at gstd_element.c:510
#7  0x0000007fb7ccfa24 in gstd_element_fill_properties (self=0x55557c4ec0) at gstd_element.c:535
#8  0x0000007fb7ccfa24 in gstd_element_set_property (object=<optimized out>, property_id=<optimized out>, value=0x7fb6ecf8e8, pspec=0x7fa80044c0) at gstd_element.c:267
#9  0x0000007fb7e34ab8 in  () at /usr/lib/aarch64-linux-gnu/libgobject-2.0.so.0
#10 0x0000007fb6ecfa68 in  ()

Handle deep_notify debug

It would be nice to have an option to enable and disable at runtime the deep_notify debug like gst-launch does with the"-v" option.

Mechanism to request new port

Would be useful to have a mechanism to request a new port to GstD, so GstD returns the new port opened and a new Client can be created using that port.

Pygstd: Improve asynchronous operations

  • Add option for bus_read + bus_filter in the same command
  • Add async version of bus_read
  • Add option for signal_connect + signal_timeout in the same command
  • Add async version of signal_connect

GstD stuck after 32748 iterations of 'gstc_pipeline_bus_wait' on x86_64

Hi GstD team,

There is an issue with the function 'gstc_pipeline_bus_wait', after 32768 iterations on this function the GstD client seems to be blocked.
This issue also happens on i.MX6 but the issue happens at the iteration 251.

This code can be used to replicate the issue:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "libgstc.h"

int
main ()
{
GstClient *client;
GstcStatus ret;
const char *address = "127.0.0.1";
const unsigned int port = 5000;
const long wait_time = -1;
const int keep_open = 1;

ret = gstc_client_new (address, port, wait_time, keep_open, &client);
if (GSTC_OK != ret) {
fprintf (stderr, "There was a problem creating a GstClient: %d\n", ret);
goto out;
}

ret = gstc_client_ping (client);
if (GSTC_OK == ret) {
printf ("GStreamer daemon is alive!\n");
} else {
fprintf (stderr, "Unable to contact server: %d\n", ret);
goto free_client;
}

ret = gstc_pipeline_create (client, "pipe", "videotestsrc is-live=true ! fakesink");
if (GSTC_OK == ret) {
printf ("Pipeline created successfully!\n");
} else {
fprintf (stderr, "Error creating pipeline: %d\n", ret);
goto free_client;
}

ret = gstc_pipeline_play (client, "pipe");
if (GSTC_OK == ret) {
printf ("Pipeline set to playing!\n");
} else {
fprintf (stderr, "Unable to play pipeline: %d\n", ret);
goto free_client;
}

int iteration = 0;
while (1) {
printf("ITERATION #%d \n", iteration);

char *eos;
ret = gstc_pipeline_bus_wait (client, "pipe", "eos", 100000, &eos);
//printf("RETURN value: %d \n", ret);

iteration = iteration + 1;
}

ret = gstc_pipeline_stop (client, "pipe");
if (GSTC_OK == ret) {
printf ("Pipeline set to null!\n");
} else {
fprintf (stderr, "Unable to stop pipeline: %d\n", ret);
goto free_client;
}

ret = gstc_pipeline_delete (client, "pipe");
if (GSTC_OK == ret) {
printf ("Pipeline deleted!\n");
} else {
fprintf (stderr, "Unable to delete pieline: %d\n", ret);
goto free_client;
}
free_client:
gstc_client_free (client);

out:
return ret;
}

This is the output from x86_64:

....
ITERATION #32745
ITERATION #32746
ITERATION #32747
ITERATION #32748

Regards.

Pipeline char limit

There seems to be a hard limit on how long a single command can be. For instance the following pipeline results in a "bad pipeline description" because of string truncation. (While it works with gst-launch).

gstd-client pipeline_create x fakesrc ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity ! identity name=abcd ! fakesink

The limit seems to be around 1024 char for a command because renaming the last identity to abc doesn't result in truncation.

My questions are :

  • where does this limit come from (client, server, TCP frames, ...) ?
  • can we remove this limit ?

Edit:
looks like it comes from here :

const guint size = 1024;

log directories fixed in 0.9.0?

When I built 0.8 targeting the iMX8 gstd would error:
root@imx8mmwasp:~# gstd
Unable to open Gstd log file: No such file or directory

With Marco's help we added a workaround:
mkdir -p /var/run/gstd
mkdir -p /var/log/gstd
before launching gstd.
has this been fixed in 0.9 ?

Compiling giving error in gstd code

I am a newbie in gstd programming, i am not able to compile and link my code (in linux). Its giving following error:

/tmp/cc8jitTv.o: In function main': simple_pipeline.c:(.text+0x48): undefined reference to gstc_client_new'
simple_pipeline.c:(.text+0x7e): undefined reference to gstc_client_ping' simple_pipeline.c:(.text+0xa7): undefined reference to gstc_pipeline_create'
simple_pipeline.c:(.text+0xee): undefined reference to gstc_pipeline_play' simple_pipeline.c:(.text+0x144): undefined reference to gstc_pipeline_stop'
simple_pipeline.c:(.text+0x188): undefined reference to gstc_pipeline_delete' simple_pipeline.c:(.text+0x1e6): undefined reference to gstc_client_free'
collect2: error: ld returned 1 exit status

Please guide me what all things to be kept while compiling my program using gcc command.

Unable to restart gstd after cancelling with killall gstd

I've installed an build gstd and started a test pipeline like this:

gstd &
gstd-client pipeline_create testpipe videotestsrc name=vts ! autovideosink
gstd-client pipeline_play testpipe

It worked however the screen overlay covered my entire screen so I had no access to the terminal and could not switch to it, so had to use Ctrl-C to stop it.
I then used killall gstd.

Now however, whenever I try to run gstd & I get the following error:

jason@nano:/Development/gstd-1.x$ gstd &
[1] 15583
jason@nano:
/Development/gstd-1.x$ Process 15380 died: No such process; trying to remove PID file. (/usr/local/var/run/gstd//gstd.pid)

Any ideas?

Out of memory error with with interpipe on TX2

Hello, the following short Python script runs out of memory and crashes in about 1 minute on a Jetson TX2 development kit that I believe is fully updated. Switching nveglglesink to xvimagesink has same problem with quickly running out of memory, but with fakesink it will run forever. No errors are generated when I attach the pygst logger. Really appreciate any help you can offer. Thanks!

from pygstc.gstc import *
gstd_client = GstdClient()
pipeline_source = 'videotestsrc ! queue ! interpipesink name=source'
pipeline_display = 'interpipesrc listen-to=source ! nveglglessink'
gstd_client.pipeline_create('source',pipeline_source)
gstd_client.pipeline_create('display',pipeline_display)
gstd_client.pipeline_play('source')
gstd_client.pipeline_play('display')

framerate not changing by videorate

Hi
I am trying to change the framerate of an video using videorate element it is working fine with gst-launch

gst-launch-1.0 -e v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480,framerate=30/1 ! vspmfilter outbuf-alloc=true ! \
video/x-raw,format=NV12,width=640,height=480 ! videorate ! video/x-raw,width=640,height=480,framerate=15/1 ! \
omxh264enc target-bitrate=524288 num-p-frames=0 ! h264parse ! rtph264pay pt=96 name=pay0 config-interval=3 ! udpsink host=127.0.0.1 port=5000

the same command I changed to gst-interpipe in this i am not getting streamed video,my gst-interpipe command is

gstd-client pipeline_create p ${vsrc0} ! ${vsrccaps} ! vspmfilter outbuf-alloc=true ! queue ! \
interpipesink name=camera caps=video/x-raw,width=640,height=480,framerate=30/1 sync=false async=false

gstd-client pipeline_create p1 interpipesrc name=src is-live=true listen-to=camera ! queue ! videorate ! 
video/x-raw,width=640,height=480,framerate=15/1 ! ${video_enc_2mbps} ! rtph264pay pt=96 name=pay0 config-interval=3 ! ${RTSPVideoMainStreamSink}


GSTD-1.x libjson-glib-dev dependency indicated by configure

When configuring GSTD-1.x and configure detects that json-glib-1.0 is missing, the requirement that is missing is: libjson-glib-dev.

It would be better to indicate the exact dependency that is missing.

If configure indicates that json-glib-1.0 is missing it can be fixed by installing libjson-glib-dev.

OmxrMcApiProxy_UseBuffer(981)

Hi all,
I am encode raw video using omxh264enc and stream it using rtspsink.But in the terminal where I start gstd server i am getting following error

error log:

root@iwg21m:~# gstd
ts:1534180567.277828 level:0x100000 func:Set_OMX_VIDEO_PARAM_BITRATETYPE(149) tid:1756 mes:IndexSetParameter(BITRATE): eControlRate = -1
ts:1534180609.979215 level:0x100000 func:Set_OMX_VIDEO_PARAM_BITRATETYPE(149) tid:1804 mes:IndexSetParameter(BITRATE): eControlRate = -1
ts:1534180609.979547 level:0x10000 func:OmxrMcApiProxy_UseBuffer(981) tid:1807 mes:Invalid parameter

I am using the below command for streaming:

vsrc0="v4l2src device=/dev/video0"
vsrc1="v4l2src device=/dev/video1"
vsrc2="v4l2src device=/dev/video2"
vsrc3="v4l2src device=/dev/video3"
dev0="/dev/video0"
dev1="/dev/video1"
dev2="/dev/video2"
dev3="/dev/video3"
Sleepbwplay=3
width1=640
height1=480
vsrccaps="video/x-raw,width=$width1,height=$height1"
textoverlay="textoverlay font-desc=\"Sans 12\" valignment=top halignment=left shaded-background=no"
clockoverlay="clockoverlay halignment=right valignment=top shaded-background=no time-format=\"%Y/%m/%d %a %H:%M:%S\""
video_enc_5mbps="omxh264enc target-bitrate=5242880 control-rate=constant num-p-frames=0"
video_enc_2mbps="omxh264enc target-bitrate=2097152 control-rate=constant num-p-frames=0"
video_enc_512kbps="omxh264enc target-bitrate=524288 control-rate=constant num-p-frames=0"
video_enc="omxh264enc target-bitrate=2242880 control-rate=2 num-p-frames=0"
DelayedQueue="queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 min-threshold-time=10000000000"

gstd-client pipeline_create video0src ${vsrc0} ! ${vsrccaps} ! ${textoverlay} text=${dev0} ! ${clockoverlay} \
! vspmfilter ! video/x-raw,width=640,height=480 ! videorate max-rate=6 \
! video/x-raw,width=640,height=480,framerate=30/5 ! queue ! interpipesink name=video0_src
sleep 1
gstd-client pipeline_create video0mainsrc interpipesrc is-live=true listen-to=video0_src ! queue ! ${video_enc_2mbps} ! h264parse ! video/x-h264,stream-format=avc,width=640,height=480,mapping=/stream ! queue ! interpipesink name=video0_main
sleep 1
gstd-client pipeline_create video0main interpipesrc is-live=true listen-to=video0_main ! queue ! rtspsink service=8504

The video streams for sometime and gstd gives Segmentation fault and stop streaming

Thank you all in advance.

Parameter settings lost on pipeline_stop and subsequent play

The parameters for nvoverlaysink are ignored if the pipeline below is stopped and then started:

Test Environment: NVidia Jetson TX-1 with Leopard Imaging IMX 274 sensor and driver with Release 28.1

pipeline_create c2 videotestsrc ! capsfilter name=c2_caps caps=video/x-raw,width=(int)3840,height=(int)2160,format=(string)I420,framerate=(fraction)30/1 ! nvoverlaysink name=c2_ov overlay-x=1890 overlay-y=30 overlay-w=1920 overlay-h=1080
pipeline_play c2

# At this point the video is correctly shown in the upper right corner of a 4K display

pipeline_stop c2
pipeline_play c2

# Now the video fills the screen, ignoring the overlay-* parameters set on nvoverlaysink
# inspecting these elements with element_get shows the correct values

The exact behavior with nvoverlaysink is not a big deal - but if this is a generic problem with losing parameters in pipelines over a stop/play that impacts other elements as well it may be.

NOTE: If element_set is used to modify the parameters to DIFFERENT values while stopped the new values are correctly used on subsequent play. But if element_set is called and simply writes the orignal values the subsequent play does not honor them.

GstD is not closing Unix sockets

Hi GstD team,
When a pipeline is destroyed, the sockets that were created in the pipeline_create are not being closed, this means that GstD dies after 510 pipelines (2 sockets per pipeline are used).
By default each process can used up to 1024 sockets.

Check the script below, it will replicate the issue.

#!/bin/sh
INDEX=0
for (( ; ; ))
do
   echo $INDEX
   INDEX=$(($INDEX+1))
   gstd-client pipeline_create playback videotestsrc is-live=true pattern=ball ! fpsdisplaysink  > log
   sleep 0.5
   gstd-client pipeline_play playback > log
   sleep 0.5
   gstd-client pipeline_stop playback > log
   sleep 0.5
   gstd-client pipeline_delete playback > log
   sleep 0.1

   if [[ $INDEX -gt 550 ]]; then
     break
   fi
done

Using lsof we can check the open sockets

root@var-som-mx6:~# lsof -U | grep gstd
gstd 763 root 9u unix 0xa86bec00 0t0 1953 type=STREAM
gstd 763 root 10u unix 0xa86beec0 0t0 1954 type=STREAM
gstd 763 root 11u unix 0xa8ae3180 0t0 533 type=STREAM
gstd 763 root 12u unix 0xa8ae3440 0t0 534 type=STREAM
gstd 763 root 13u unix 0xa884f9c0 0t0 2691 type=STREAM
gstd 763 root 14u unix 0xa884fc80 0t0 2692 type=STREAM
gstd 763 root 17u unix 0xa8ae39c0 0t0 558 type=STREAM
gstd 763 root 18u unix 0xa8ae2c00 0t0 559 type=STREAM
gstd 763 root 19u unix 0xa8ae1e40 0t0 583 type=STREAM
gstd 763 root 20u unix 0xa8ae1b80 0t0 584 type=STREAM
gstd 763 root 21u unix 0xa8ae2680 0t0 608 type=STREAM
gstd 763 root 22u unix 0xa8ae3c80 0t0 609 type=STREAM
gstd 763 root 23u unix 0xa8ae23c0 0t0 633 type=STREAM
gstd 763 root 24u unix 0xa8ae2ec0 0t0 634 type=STREAM
gstd 763 root 25u unix 0xa8ae3700 0t0 658 type=STREAM
gstd 763 root 26u unix 0xa8ae2100 0t0 659 type=STREAM
gstd 763 root 27u unix 0xa86bf180 0t0 4333 type=STREAM
gstd 763 root 28u unix 0xa86bf440 0t0 4334 type=STREAM
gstd 763 root 29u unix 0xa86bfc80 0t0 4364 type=STREAM
gstd 763 root 30u unix 0xa86bf700 0t0 4365 type=STREAM
gstd 763 root 31u unix 0xa86bf9c0 0t0 4372 type=STREAM
gstd 763 root 32u unix 0xa86be3c0 0t0 4373 type=STREAM
gstd 763 root 33u unix 0xa86be680 0t0 4410 type=STREAM
gstd 763 root 34u unix 0xa86bc840 0t0 4411 type=STREAM
gstd 763 root 35u unix 0xa9520dc0 0t0 739 type=STREAM
gstd 763 root 36u unix 0xa9521080 0t0 740 type=STREAM
gstd 763 root 37u unix 0xa86be100 0t0 4475 type=STREAM
gstd 763 root 38u unix 0xa86be940 0t0 4476 type=STREAM
gstd 763 root 39u unix 0xa93cc2c0 0t0 4504 type=STREAM
gstd 763 root 40u unix 0xa93cc580 0t0 4505 type=STREAM
gstd 763 root 41u unix 0xa93ccdc0 0t0 4533 type=STREAM
gstd 763 root 42u unix 0xa93cd080 0t0 4534 type=STREAM
gstd 763 root 43u unix 0xa93cd8c0 0t0 4563 type=STREAM
gstd 763 root 44u unix 0xa93cdb80 0t0 4564 type=STREAM
gstd 763 root 45u unix 0xa9521340 0t0 747 type=STREAM
gstd 763 root 46u unix 0xa9521600 0t0 748 type=STREAM
gstd 763 root 47u unix 0xa93ce940 0t0 4628 type=STREAM
gstd 763 root 48u unix 0xa93cec00 0t0 4629 type=STREAM
gstd 763 root 49u unix 0xa93cf440 0t0 4657 type=STREAM
gstd 763 root 50u unix 0xa93cf700 0t0 4658 type=STREAM
gstd 763 root 51u unix 0xa93cf9c0 0t0 4695 type=STREAM
gstd 763 root 52u unix 0xa93cfc80 0t0 4696 type=STREAM
gstd 763 root 53u unix 0xa93ce3c0 0t0 4718 type=STREAM
gstd 763 root 54u unix 0xa93ce680 0t0 4719 type=STREAM
gstd 763 root 55u unix 0xa93cde40 0t0 4732 type=STREAM
gstd 763 root 56u unix 0xa93ce100 0t0 4733 type=STREAM
gstd 763 root 57u unix 0xa93cc840 0t0 4763 type=STREAM
gstd 763 root 58u unix 0xa93ccb00 0t0 4764 type=STREAM
...

In the file libgstc/libgstc_socket.c, the sockets are created but never closed.

element_set not supported for g_type "GstCaps"

Trying to set the property caps of a capsfilter element results in error GstdReturnCode 10 GSTD_BAD_COMMAND.

The commands to recreate the problem:

$ gstd-client pipeline_create "no_src" "videotestsrc pattern=6 ! video/x-raw, width=1280, height=720, format=UYVY ! xvimagesink"
$ gstd-client element_set "no_src" "capsfilter0" "caps" "video/x-raw,width=1920,height=1080,format=UYVY"

Unable to handle "GstCaps" types
{
  code : 10
  response : {
    caps : video/x-raw, width=(int)1280, height=(int)720, format=(string)UYVY
  }
}

Looking more closely at the code I found the problem in file gstd_tcp.c in function static GstdReturnCode gstd_tcp_update_by_type (GstdCore *core, GstdObject *obj, gchar *args, gchar **response). The application tries to update the property according to its G_TYPE. Unfortunately the type GstCaps of the caps property of the capsfilter element seems to be unsupported.

Is there a reason for it not being supported, that I am not aware of, or is it just not implemented? It is possible when directly implementing a Gstreamer pipeline in C or Python and modifying the GstCaps.
Is there anyone still working with GStreamer Daemon?
Or is there a workaround for this problem? (I can delete and create a new pipeline, but of course it would be nicer to modify the caps on the fly.)

Unable to run example camera pipeline

I have installed gstd as per the instructions on your wiki site and ran the verification test here:

# Create the pipeline
pipeline_create testpipe videotestsrc name=vts ! autovideosink

# Play the pipeline
pipeline_play testpipe

# Change a property
element_set testpipe vts pattern ball

# Stop the pipeline
pipeline_stop testpipe

# Destroy the pipeline 
pipeline_delete testpipe

This works fine.

Howeveer when I try to run your camera example from here: https://developer.ridgerun.com/wiki/index.php?title=GstInterpipe_-_Example_2:_Digital_Camera

It fails on the creation of each pipeline with his error:

{
  "code" : 2,
  "description" : "Bad pipeline description",
  "response" : null
}

If I copy the elements and run them directly with gst-launch-1.0 they individually seem to work.

Note: I am testing this on an Nvidia jetson nano.

cross-compile error

Just to let you know if it helps to someone.

I've tried to cross-compile gstd (openWRT) and I've got the error:

cannot open < docs/gtk-doc.make: No such file or directory

Creating the file docs/gtk-doc.make with the following content I was able to compile:

GPATH=
TARGET_DIR=
SETUP_FILES=
EXTRA_DIST=
DOC_STAMPS=
SCANOBJ_FILES=
REPORT_FILES=
CLEANFILES=

Can play a perticular pipeline for specified time tplay was not working

How to play my below pipeline for specific time

gstd-client pipeline_create p v4l2src device=/dev/video0 io-mode=dmabuf ! video/x-raw,format=UYVY !
vspmfilter ! video/x-raw,width=480,height=320,format=BGRA ! waylandsink position-x=30 position-y=60 qos=false

gstd-client pipeline_play p

stuck gstd command

After the installation of the gstd-1.x
(clone repository -> ./autogen.h -> ./configure -> make -> sudo make install -> sudo service dbus force-reload).
Using the gstd command to start the tool, this one get stuck showing the next message when is used with strace(attached file).
The Ubuntu version was the 14.04, using the master branch

log_trace_stuck_gstd_1_x.txt

locate gstreamer from sources

Unable to get configure to locate libs in /usr/local/gstreamer/lib. I have to custom build from sources to get SRT support. The packages are out of date.

 Can't find the following GStreamer development packages:

      gstreamer-1.0              >= 1.0.0
      gstreamer-base-1.0         >= 1.0.0

Pygstd: Improve unit tests

Pygstd tests use GstD directly (test_libgstc_python_init.py starts the daemon and test_libgstc_python_stop_gstd.py stops it).
The ideal implementation would be to change it for a GstD mock.

Enhancement Request: Allow setting multiple properties with element_set

The code below enhances element_set to allow setting multiple properties with a single command. If I knew how to submit a pull request, I would, but the source code is below if you want it. The use case is to somewhat atomically set multiple properties, eliminating a bunch of network round trips and potential process creation.

The command line syntax is a natural extension of element_set:

element_set pipeline element property value property value ...

The command must have at least 4 parameters (pipeline, element, property1, value1) and an even number of parameters in total to be accepted. Properties are set one by one. If an error occurs while processing the properties the response information for that error is returned and processing of further parameters is aborted. If all properties are correctly set the response from the last property set is returned.

static GstdReturnCode
gstd_tcp_element_set (GstdSession * session, gchar * action, gchar * args,
    gchar ** response)
{
  GstdReturnCode ret;
  gchar *uri;
  gchar **tokens;
  int i,j;

  g_return_val_if_fail (GSTD_IS_SESSION (session), GSTD_NULL_ARGUMENT);
  g_return_val_if_fail (args, GSTD_NULL_ARGUMENT);
  
  // Start with a clean response buffer. Is this right or does it need to be freed?
  *response = NULL;

  // tokenize and count the args
  tokens = g_strsplit (args, " ", -1);
  i = 0;
  while ( tokens[i] != '\0') { i++; }; 

  if ((i < 4) || (i % 2 == 1)) { return GSTD_BAD_COMMAND; };

  // Update the properties one by one. 
  // Note: If the pipeline needs to be paused it is the user's responsibility
  // to do that BEFORE making the call to element_set
  for (j = 2; j < i; j+=2) {
    // Clear the buffer between calls
    *response = NULL;
    uri = g_strdup_printf ("/pipelines/%s/elements/%s/properties/%s %s",
        tokens[0], tokens[1], tokens[j], tokens[j+1]);
    ret = gstd_tcp_parse_raw_cmd (session, "update", uri, response);
    g_free (uri);
    if (ret) { break; } 
  }

  g_strfreev (tokens);
  return ret;
}

Changing the location property on filesrc

Hi,
I would like to change the source of a filesrc, but I get the message:

** (gstd:46023): WARNING **: 12:24:48.758: Changing the `location' property on filesrc when a file is open is not supported.

Here are my commands:

$ gstd-client pipeline_create testpipe filesrc name=src location=/path/file1.mp4 ! decodebin3 ! autovideosink

$ gstd-client element_set testpipe src location /path/file2.mp4

Is there a way, to close the file and then changing the source?

doesn't build under debian jessie

autogen.sh and configure run without error, however make fails with this error:

gstd_client.c: In function ‘init_readline’:
gstd_client.c:168:3: error: ‘rl_readline_name’ undeclared (first use in this function)
rl_readline_name = "Gstd";

I installed libreadline6, libreadline6-dev, and readline-common but still the make fails

Getting "gst_segment_to_running_time: assertion 'segment->format == format' failed" for simple audio pipelines

Running the following simple audio pipelines with recent gstreamer, gstd and gst-interpipe, I'm getting repeated critical messages from gstd (apparently one message for each buffer):

(gstd:15022): GStreamer-CRITICAL **: gst_segment_to_running_time: assertion 'segment->format == format' failed

However, the pipelines keep running and the audio is indeed ouput to the speakers.

The simple audio pipeline:

#!/bin/bash

killall gstd
gstd &

sleep 1

gstd-client pipeline_create audio_output interpipesrc caps=audio/x-raw,format=S16LE,rate=8000,layout=interleaved,channels=2 listen-to=audio1 is-live=true allow-renegotiation=true format=1 accept-events=1 ! autoaudiosink

gstd-client pipeline_create audio_generate audiotestsrc ! audioconvert ! audio/x-raw,format=S16LE,rate=8000,layout=interleaved,channels=2 ! interpipesink name=audio1

gstd-client pipeline_play audio_generate
gstd-client pipeline_play audio_output

Debug output produced by running G_DEBUG=fatal_warnings gdb gstd and executing above script.

(gdb) run
Starting program: /home/me/bin/gstd 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff3916700 (LWP 15070)]
[New Thread 0x7ffff3115700 (LWP 15077)]
[New Thread 0x7fffe9816700 (LWP 15088)]
[New Thread 0x7fffe9015700 (LWP 15089)]
[New Thread 0x7fffe8814700 (LWP 15096)]
[New Thread 0x7fffc7fff700 (LWP 15097)]

(gstd:15066): GStreamer-CRITICAL **: gst_segment_to_running_time: assertion 'segment->format == format' failed

Thread 7 "interpipesrc0:s" received signal SIGTRAP, Trace/breakpoint trap.
[Switching to Thread 0x7fffc7fff700 (LWP 15097)]
0x00007ffff67ee261 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
(gdb) backtrace
#0  0x00007ffff67ee261 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#1  0x00007ffff67ef66d in g_logv () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#2  0x00007ffff67ef7cf in g_log () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#3  0x00007ffff7380a4a in gst_segment_to_running_time (segment=0x7fffe4022648, format=GST_FORMAT_TIME, position=47731888959) at gstsegment.c:832
#4  0x00007ffff20ae0cd in gst_audio_base_sink_render (bsink=0x7fffe40224f0, buf=0x7fffe0008500) at gstaudiobasesink.c:1989
#5  0x00007ffff7b9089a in gst_base_sink_chain_unlocked (basesink=0x7fffe40224f0, pad=0x7fffe400e3f0, obj=0x7fffe0008500, is_list=0) at gstbasesink.c:3546
#6  0x00007ffff7b91555 in gst_base_sink_chain_main (basesink=0x7fffe40224f0, pad=0x7fffe400e3f0, obj=0x7fffe0008500, is_list=0) at gstbasesink.c:3672
#7  0x00007ffff7b916c4 in gst_base_sink_chain (pad=0x7fffe400e3f0, parent=0x7fffe40224f0, buf=0x7fffe0008500) at gstbasesink.c:3701
#8  0x00007ffff7357101 in gst_pad_chain_data_unchecked (pad=0x7fffe400e3f0, type=4112, data=0x7fffe0008500) at gstpad.c:4272
#9  0x00007ffff7357eb8 in gst_pad_push_data (pad=0x7fffe400e1a0, type=4112, data=0x7fffe0008500) at gstpad.c:4528
#10 0x00007ffff73585e3 in gst_pad_push (pad=0x7fffe400e1a0, buffer=0x7fffe0008500) at gstpad.c:4647
#11 0x00007ffff7b9f4c5 in gst_base_src_loop (pad=0x7fffe400e1a0) at gstbasesrc.c:2957
#12 0x00007ffff73934ed in gst_task_func (task=0x7fffe414d170) at gsttask.c:332
#13 0x00007ffff73946b2 in default_func (tdata=0x7fffe4001390, pool=0x55555576d910) at gsttaskpool.c:69
#14 0x00007ffff6810dce in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#15 0x00007ffff68103d5 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#16 0x00007ffff6116494 in start_thread (arg=0x7fffc7fff700) at pthread_create.c:333
#17 0x00007ffff5e58aff in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:97

Versions used:

gstd-1.x revision 097a086 (Dec 11, 2017)
gstreamer revision 252ce5a093 (Dec 24, 2017)
gst-interpipe revision 10dba89eecc2 (Apr 20, 2017)

I tried various settings of interpipe*, but to no avail.

I would like to get rid of these critical messages, and perhaps understand what is happening. Apologies if this an issue that should be filed in gst-interpipe or gstreamer instead.

gstd as non-root user?

Running gstd assumes write access to /var/log /var/run, etc. There appear to be no command line options (or perhaps they are undocumented?) for overriding this behavior when starting.

Pipeline not changing to play state using "filesink"

In develop branch gstd-client can't change pipeline to play when filesink is used.
Pipeline is being created but State error appears when trying play the pipeline.

Example:

gstd
gstd-client pipeline_create p1 videotestsrc ! x264enc ! mpegtsmux ! filesink location=test.ts
gstd-client pipeline_play p1

{
"code" : 14,
"description" : "State error",
"response" : null
}

framerate is not changing dynamically

Hi all,
I am trying to change the framerate of the video while it is palying (using element_set)
Below is my command for displaying video on HDMI display

gstd-client pipeline_create video0src v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480 \
! vspmfilter outbuf-alloc=true ! capsfilter name=capmain caps="video/x-raw,width=640,height=480,format=BGRA" ! videorate name=ratemain \
! capsfilter name=caprate caps="video/x-raw,framerate=25/1" ! vspmfilter ! video/x-raw,width=480,height=320,format=BGRA ! waylandsink position-x=30 position-y=60 qos=false

gstd-client pipeline_play video0src

when i play this pipeline i am getting proper playing video

Then I try to change the framerate by using following command

gstd-client element_set video0src caprate caps "video/x-raw,framerate=30/10"

My video is freezing when i try to change framerate when it is playing or i will get following error from gstd

root@rthawk:~# gstd
*** Error in `gstd': free(): invalid pointer: 0xb5e8f000 ***
Aborted

Thank you all in advance

Pygstd: Improve build

Right now make install is always trying to install the Python client even if pip3 is not present. This should be a conditional configure.ac.

Handling of GArray type

This is an add-on to an existing closed enhancement request.

gstd-client throws an error when trying to get or set a property of type GArray. Prominent examples would be the aeRegion and wbRegion properties of nvcamerasrc on the NVidia Jetson TX-1.

  1. Can't pass aeRegion on pipeline_create
gstd> pipeline_create p1 nvcamerasrc name=cam0 sensor-id=2 aeRegion="0 0 100 100 0.5" ! nvoverlaysink
{
  "code" : 2,
  "description" : "Bad pipeline description",
  "response" : null
}

  1. If we create a simple pipeline we can't use element_get or read to get aeRegion
gstd> pipeline_create p1 nvcamerasrc name=cam0 sensor-id=2 ! nvoverlaysink

gstd> element_get p1 cam0 aeRegion
{
  "code" : 0,
  "description" : "Success",
  "response" : {
    "name" : "aeRegion",
    "value" : {
        "blurb" : "Property to set region of interest for auto exposure.\n\t\t\t Use GArray, with values of ROI coordinates (top,left,bottom,right)\n\t\t\t and weight in that order, to set the property.",
        "type" : "GArray",
        "access" : "((GstdParamFlags) READ | 226)",
        "construct" : false
    }
}
}

gstd> read pipelines/p1/elements/cam0/properties/aeRegion
{
  "code" : 0,
  "description" : "Success",
  "response" : {
    "name" : "aeRegion",
    "value" : {
        "blurb" : "Property to set region of interest for auto exposure.\n\t\t\t Use GArray, with values of ROI coordinates (top,left,bottom,right)\n\t\t\t and weight in that order, to set the property.",
        "type" : "GArray",
        "access" : "((GstdParamFlags) READ | 226)",
        "construct" : false
    }
}
}

  1. We can't use element_set to set aeRegion
gstd> element_set p1 cam0 aeRegion "100 100 200 200 0.5"
{
  "code" : 13,
  "description" : "Bad value",
  "response" : null
}
gstd> 

Pygstd: Clean imports

psutil, and potentially other imports, are not being used in the code.
Then, add all used imports to setup.py install_requires option.

Extend Gstd to allow deep notify

AC:

  • property can be modified on the fly
  • verbose information is displayed
  • Output provided by -v when using gst-launch
  • enable/disable

Clockoverlay or Textoverly won't work

That's work as expected:
gst-launch-1.0 -v imxv4l2videosrc device=/dev/video0 imx-capture-mode=0 queue-size=1024 ! imxipuvideotransform deinterlace=true deinterlace-method=2 ! clockoverlay shaded-background=true font-desc="Nimbus mono" valignment=1 ! textoverlay shaded-background=true font-desc="Nimbus mono" valignment=1 halignment=2 text="42.1233N 24.1234E" ! imxipuvideosink window-width=640 window-height=480 window-x-coord=800 window-y-coord=400
But if I use gstd and split it in few pipes,
Source pipe

pipeline_create cam_src_pipe imxv4l2videosrc typefind=true imx-capture-mode=0 queue-size=1024 ! imxipuvideotransform deinterlace=true deinterlace-method=2 ! interpipesink name=cam_src sync=true async=false forward-eos=true
pipeline_play cam_src_pipe

Preview pipe

pipeline_create live_preview_pipe interpipesrc name=live_prev_intpsrc listen-to=cam_src is-live=true allow-renegotiation=true enable-sync=true ! queue max-size-buffers=3 leaky=downstream flush-on-eos=true ! clockoverlay shaded-background=true font-desc="Nimbus mono" valignment=1 ! textoverlay shaded-background=true font-desc="Nimbus mono" valignment=1 halignment=2 text="42.1233N 24.1234E" ! imxipuvideosink window-width=640 window-height=480 window-x-coord=800 window-y-coord=400
pipeline_play live_preview_pipe

Record pipe

pipeline_create recording_pipe interpipesrc name=rec_intpsrc listen-to=cam_src is-live=true allow-renegotiation=true enable-sync=false ! queue max-size-buffers=3 leaky=downstream flush-on-eos=true ! clockoverlay shaded-background=true font-desc="Nimbus mono" valignment=1 ! textoverlay shaded-background=true font-desc="Nimbus mono" valignment=1 halignment=2 text="42.1233N 24.1234E" ! imxvpuenc_h264 bitrate=8192 gop-size=16 ! h264parse ! splitmuxsink location=/tmp/rec_%03d.mpg max-size-time=60000000000 max-files=4 muxer=mpegtsmux
pipeline_play recording_pipe

Stream pipe

pipeline_create stream_pipe interpipesrc name=stream_intpsrc listen-to=cam_src is-live=true allow-renegotiation=true enable-sync=false ! queue max-size-buffers=4 leaky=downstream flush-on-eos=true ! clockoverlay shaded-background=true font-desc="Nimbus mono" valignment=1 ! textoverlay shaded-background=true font-desc="Nimbus mono" valignment=1 halignment=2 text="42.1233N 24.1234E" ! imxvpuenc_h264 bitrate=6000 gop-size=16 ! mpegtsmux ! tcpserversink host=0.0.0.0 port=1234 sync=true
pipeline_play stream_pipe

ONLY Stream pipe works with overlay. Nor preview or recording has overlay. But works plain without overlay to be seen.
Could be a bug that and how to fix it?
Tried so many many variants and I'm stuck :/

gstd doesn't allow me to change listening port

Hi,

I've tried to compile the last version of gstd but this version doesn't allow me to change the tcp port to other than 5000.
This is a problem for me because airplay RAOP also uses port 5000 to communicate.

It seems that is has been removed from gstd code, but not from gst-client code.

Create basic playback with Gstd

AC:

  • Create playback pipeline.
  • Implement trick modes (FF, Seeking, RWD).
  • Listen Gst Bus, react to EOS.
  • Change framerate or scaling on the fly using Gstd
  • Is documented at Gstd examples - Python

April 23rd

  • Abstract commands and create a similar interface as gst-play.
  • Add reproduction direction
  • Player doing slow motion and reverse

Warning causes Error when compiling on Xavier

gapless_playback.c: In function ‘main’:
gapless_playback.c:87:3: warning: ignoring return value of ‘asprintf’, declared with attribute warn_unused_result [-Wunused-result]
asprintf (&pipe_description, pipe_description_template, video_name);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This causes an error during gstd compilation on the Xavier board

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.