Code Monkey home page Code Monkey logo

gstreamill's Introduction

i4TV

Data structure - sorted sets:

key: stroke series field: hanzi value: weight

gstreamill's People

Contributors

hiccupzhu avatar yungang avatar zhangping avatar zqdlove avatar

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  avatar  avatar  avatar  avatar  avatar  avatar

gstreamill's Issues

autorestart job failure

43798 ?        Sl   5127:41  \_ /usr/bin/gstreamill -l /var/log/gstreamill -n Q0NUVi0y -q 4154
43799 ?        Sl   5155:28  \_ /usr/bin/gstreamill -l /var/log/gstreamill -n Q0NUVi01 -q 4154
43800 ?        Sl   5028:38  \_ /usr/bin/gstreamill -l /var/log/gstreamill -n Q0NUVi00 -q 4154
43801 ?        Sl   4872:54  \_ /usr/bin/gstreamill -l /var/log/gstreamill -n Q0NUVi0x -q 4208
44085 ?        S      0:00  \_ /usr/bin/gstreamill -l /var/log/gstreamill -n Q0NUVi0z -q 4154

subprocess log:

9076 Nov 16 19:47:15.435173 WARN   gstreamill source.c:710: encoder stream video can not catch up source output.
9077 Nov 16 19:47:15.440641 WARN   videodecoder gstvideodecoder.c:2365: decreasing timestamp (26:30:41.441037796 < 5124095:34:30.592897632)
9078 Nov 16 19:47:15.975623 WARN   videodecoder gstvideodecoder.c:2365: decreasing timestamp (26:30:41.921037796 < 5124095:34:31.032897632)
9079 Nov 16 19:47:16.434490 WARN   videodecoder gstvideodecoder.c:2365: decreasing timestamp (26:30:42.401037958 < 5124095:34:31.472897632)
9080 Nov 16 19:47:16.899478 WARN   videodecoder gstvideodecoder.c:2365: decreasing timestamp (26:30:42.881040092 < 5124095:34:31.912897632)
9081 Nov 16 19:47:17.424976 WARN   videodecoder gstvideodecoder.c:2365: decreasing timestamp (26:30:43.361041868 < 5124095:34:32.352897632)
9082 Nov 16 19:47:18.275650 WARN   gstreamill job.c:799: Set source pipeline to play state ok
9083 Nov 16 19:47:18.280427 WARN   gstreamill job.c:822: Set encoder encoder.0 to play state ok
9084 Nov 16 19:47:18.285469 WARN   gstreamill job.c:822: Set encoder encoder.1 to play state ok
9085 Nov 16 19:47:18.286736 WARN   gstreamill job.c:825: Set job CCTV-3 to play state ok
9086 Nov 16 19:47:18.287210 WARN   gstreamill main.c:357: livejob CCTV-3 starting ...
9087 Nov 16 19:47:18.352677 WARN   default descriptions.c:612: Unexpected MPEG-1 layer in audio/mpeg, mpegversion=(int)1
9088 Nov 16 19:47:18.364753 WARN   default descriptions.c:612: Unexpected MPEG-1 layer in audio/mpeg, mpegversion=(int)1
9089 Nov 16 19:47:18.374080 WARN   default descriptions.c:612: Unexpected MPEG-1 layer in audio/mpeg, mpegversion=(int)1
9090 Nov 16 19:47:18.393448 WARN   default descriptions.c:612: Unexpected MPEG-1 layer in audio/mpeg, mpegversion=(int)1
9091 Nov 16 19:47:18.404053 WARN   default descriptions.c:612: Unexpected MPEG-1 layer in audio/mpeg, mpegversion=(int)1
9092 Nov 16 19:47:18.423645 WARN   default descriptions.c:612: Unexpected MPEG-1 layer in audio/mpeg, mpegversion=(int)1
9093 Nov 16 19:47:18.433961 WARN   default descriptions.c:612: Unexpected MPEG-1 layer in audio/mpeg, mpegversion=(int)1
9094 Nov 16 19:47:18.897408 WARN   videodecoder gstvideodecoder.c:2365: decreasing timestamp (0:00:00.782786642 < 0:00:00.822786642)
9095 Nov 16 19:47:19.361947 WARN   videodecoder gstvideodecoder.c:2365: decreasing timestamp (0:00:01.262767076 < 0:00:01.262786642)
9096 Nov 16 19:47:56.647030 WARN   gstreamill source.c:710: encoder stream audio can not catch up source output.
9097 Nov 16 19:47:58.302053 WARN   gstreamill source.c:710: encoder stream audio can not catch up source output.
9098 Nov 16 19:47:59.588322 WARN   gstreamill source.c:710: encoder stream audio can not catch up source output.
9099 Nov 16 19:48:01.234969 WARN   gstreamill source.c:710: encoder stream audio can not catch up source output.

main process log:

 4748 Nov 16 19:47:31.689968 ERROR  gstreamill gstreamill.c:551: /var/lib/gstreamill/dvr/CCTV-5/1/13*.ts
 4749 Nov 16 19:48:01.791698 ERROR  gstreamill gstreamill.c:383: CCTV-3.encoder.0.audio heartbeat error 7427142290, restart
 4750 Nov 16 19:48:01.791912 WARN   gstreamill gstreamill.c:297: Restart job CCTV-3, pid 43797.
 4751 Nov 16 19:48:01.857299 ERROR  gstreamill gstreamill.c:783: Live job CCTV-3 exit on an unhandled signal, restart.
 4752 Nov 16 19:48:01.870754 ERROR  gstreamill gstreamill.c:786: Restart job CCTV-3 success
 4753 Nov 16 19:57:31.239949 ERROR  gstreamill gstreamill.c:551: /var/lib/gstreamill/dvr/CCTV-1/0/141605264*.ts

Bus Error

Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `/usr/local/bin/gstreamill'.
Program terminated with signal SIGBUS, Bus error.
#0  encoder_stat (encoder=0x7f6e50019800) at gstreamill.c:1162
1162            time = gst_date_time_new_from_unix_epoch_local_time (stat->last_heartbeat/GST_SECOND);
(gdb) bt
#0  encoder_stat (encoder=0x7f6e50019800) at gstreamill.c:1162
#1  0x0000000000409d87 in encoders_stat (job=0x7f6e5001c030) at gstreamill.c:1206
#2  gstreamill_job_stat (gstreamill=<optimized out>, uri=uri@entry=0x2bb7918 "/stat/gstreamill/job/CCTV-4A") at gstreamill.c:1303
#3  0x0000000000414de7 in request_gstreamill_stat (request_data=0x2bab0d0, httpmgmt=0x21b49c0) at httpmgmt.c:239
#4  httpmgmt_dispatcher (data=0x2bab0d0, user_data=0x21b49c0) at httpmgmt.c:843
#5  0x000000000040a915 in invoke_user_callback (http_server=0x2849d90, request_data_pointer=0x284a060) at httpserver.c:746
#6  0x00007f6e6d42889c in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#7  0x00007f6e6d427f15 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#8  0x00007f6e6cd3c182 in start_thread (arg=0x7f6e5eff5700) at pthread_create.c:312
#9  0x00007f6e6c82330d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

Can't create eny job from examples folder

Use last version gstreamill-0.5.3-alt2 from tag 0.5.3
[slava@dubrwork ~]$ rpm -qa | grep gst | grep '1.0' |sort
gst-plugins1.0-tools-1.4.3-alt1
gst-plugins-bad1.0-1.4.3-alt1
gst-plugins-bad1.0-doc-1.4.3-alt1
gst-plugins-base1.0-1.4.3-alt1
gst-plugins-good1.0-1.4.3-alt1
gst-plugins-good1.0-devel-doc-1.4.3-alt1
gst-plugins-nice1.0-0.1.4-alt1
gst-plugins-ugly1.0-1.4.3-alt1
gst-plugins-ugly1.0-devel-doc-1.4.3-alt1
gstreamer1.0-1.4.3-alt1
gstreamer1.0-utils-1.4.3-alt1
libgst-plugins1.0-1.4.3-alt1
libgst-plugins1.0-gir-1.4.3-alt1
libgstreamer1.0-1.4.3-alt1
libgstreamer1.0-gir-1.4.3-alt1

When I create test job and any job from examples folder I get the error:
окт 24 10:05:49.944839 ERROR gstreamill jobdesc.c:27: parse job error

The job config:
{
"name": "test1",
"type": "testsrc",
"source": {
"elements": {
"videotestsrc": {
"caps": "video/x-raw,width=720,height=576,framerate=25/1"
},
"audiotestsrc": {
"property": {
"wave": 8
}
}
},
"bins": [
"videotestsrc ! appsink name=video",
"audiotestsrc ! appsink name=audio"
]
},
"encoders": [],
"m3u8streaming": {
"version": 3,
"window-size": 10,
"segment-duration": 3
}
}

Seems it's bug.

Running second job leads to constant restarting of both jobs.

Use last build from be8a842 . Create 2 jobs based on examples/ip.job
When run second job, first and second stop working and restart every 5-10sec.

Log from second job

*** Dec 01 19:52:26 : job ip102 starting ***

Dec 01 19:52:26.633062 FIXME default gstutils.c:3636: Creating random stream-id, consider implementing a deterministic way of creating a stream-id
Dec 01 19:52:26.633345 FIXME default gstutils.c:3636: Creating random stream-id, consider implementing a deterministic way of creating a stream-id
Dec 01 19:52:26.634766 FIXME default gstutils.c:3636: Creating random stream-id, consider implementing a deterministic way of creating a stream-id

*** Dec 01 19:52:26 : job ip102 started ***

Dec 01 19:52:26.635095 FIXME default gstutils.c:3636: Creating random stream-id, consider implementing a deterministic way of creating a stream-id
Dec 01 19:52:26.680282 WARN mpegtsbase mpegtsbase.c:526: Stream already present !
Dec 01 19:52:26.680382 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:26.691928 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:26.696734 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:26.750065 WARN mpegtsbase mpegtsbase.c:526: Stream already present !
Dec 01 19:52:26.750134 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:26.753768 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:26.754564 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:26.799087 WARN mpegtsbase mpegtsbase.c:526: Stream already present !
Dec 01 19:52:26.799285 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:26.816654 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:26.875771 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:26.878910 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:26.938997 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:26.983895 WARN mpegtsbase mpegtsbase.c:526: Stream already present !
Dec 01 19:52:26.983990 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:26.984067 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:26.993414 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:27.9146 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:27.39912 WARN mpegtsbase mpegtsbase.c:526: Stream already present !
Dec 01 19:52:27.40009 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:27.40071 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:27.66241 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:27.108363 WARN mpegtsbase mpegtsbase.c:526: Stream already present !
Dec 01 19:52:27.108465 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:27.108574 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:27.116179 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:27.176243 WARN mpegtsbase mpegtsbase.c:526: Stream already present !
Dec 01 19:52:27.176350 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:27.179525 ERROR mpegtsbase mpegtsbase.c:983: Attempted to apply a PMT on a program that wasn't created
Dec 01 19:52:27.182947 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:27.238134 WARN mpegtsbase mpegtsbase.c:526: Stream already present !
Dec 01 19:52:27.238298 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES
Dec 01 19:52:27.238406 WARN tsdemux tsdemux.c:1300: Didn't get the first packet of this PES

Wrong location of configs and other files.

In master I see, that all configs moved to /usr/share. It seems not good place. Propose make such folder structure:
/etc/gstreamill/gstreamill.conf - main config. RW for group
/etc/gstreamill/jobs.d - config for jobs. RW for group
/var/lib/gstreamill - place for dvr and transcode. RW for group
/usr/share/gstreamill - place for admin interface. RO

What do you think?

-a -m option bug

sudo gdb src/gstreamill
GNU gdb (GDB) 7.6.1-ubuntu
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
http://www.gnu.org/software/gdb/bugs/...
Reading symbols from /home/dqzhangp/workdir/gstreamill/src/gstreamill...done.
(gdb) r --gst-debug=gstreamill:4 -m 10081 -a 10080 -j examples/test.job
Starting program: /home/dqzhangp/workdir/gstreamill/src/gstreamill --gst-debug=gstreamill:4 -m 10081 -a 10080 -j examples/test.job
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0:00:00.021903574 3066 0x7a8490 WARN gstreamill main.c:265:main: gstreamill started ...
[New Thread 0x7ffff5ba0700 (LWP 3070)]
[New Thread 0x7ffff7fef740 (LWP 3071)]

Program received signal SIGSEGV, Segmentation fault.
__GI_____strtol_l_internal (nptr=0x0, endptr=endptr@entry=0x0, base=base@entry=10, group=group@entry=0, loc=0x7ffff6d0d040 <_nl_global_locale>)
at ../stdlib/strtol_l.c:298
298 ../stdlib/strtol_l.c: No such file or directory.
(gdb) bt
#0 __GI_____strtol_l_internal (nptr=0x0, endptr=endptr@entry=0x0, base=base@entry=10, group=group@entry=0, loc=0x7ffff6d0d040 <_nl_global_locale>)

at ../stdlib/strtol_l.c:298

#1 0x00007ffff69881b2 in __GI_strtol (nptr=, endptr=endptr@entry=0x0, base=base@entry=10) at ../stdlib/strtol.c:109
#2 0x0000000000411bc3 in atoi (__nptr=) at /usr/include/stdlib.h:280
#3 httpstreaming_start (httpstreaming=0x7a8610, maxthreads=maxthreads@entry=10) at httpstreaming.c:506
#4 0x0000000000406283 in main (argc=1, argv=0x7fffffffe508) at main.c:275

nginx webdav not started cause gstreamill crash

with "push-server-uri" : "http://192.168.7.84/cctv1" and nginx webdav not start will cause gstreamill crash:

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `src/gstreamill --gst-debug=gstreamill:4'.
Program terminated with signal 11, Segmentation fault.
#0 ___fprintf_chk (fp=fp@entry=0x0, flag=flag@entry=1, format=format@entry=0x419e66 "%s %s%s %s:%d: %s\n") at fprintf_chk.c:31

31 fprintf_chk.c: No such file or directory.
(gdb) bt
#0 ___fprintf_chk (fp=fp@entry=0x0, flag=flag@entry=1, format=format@entry=0x419e66 "%s %s%s %s:%d: %s\n") at fprintf_chk.c:31
#1 0x0000000000412459 in fprintf (__fmt=0x419e66 "%s %s%s %s:%d: %s\n", __stream=0x0) at /usr/include/x86_64-linux-gnu/bits/stdio2.h:97
#2 log_func (category=, level=, file=0x419438 "encoder.c", function=, line=795, object=,

message=0x7f2c1fff6bb0, user_data=0xd23660) at log.c:147

#3 0x00007f2d3926dcdc in gst_debug_log_valist () from /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#4 0x00007f2d3926de47 in gst_debug_log () from /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#5 0x000000000040f581 in encoder_output_rap_timestamp (encoder_output=encoder_output@entry=0x7f2d1c013a98, rap_addr=4197356) at encoder.c:795
#6 0x0000000000410158 in notify_function (sv=sv@entry=...) at job.c:631
#7 0x00007f2d38ac2d4f in notification_function (arg=) at ../nptl/sysdeps/unix/sysv/linux/mq_notify.c:106
#8 0x00007f2d388a8f6e in start_thread (arg=0x7f2c1fff7700) at pthread_create.c:311
#9 0x00007f2d383919cd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113

circle buffer refactor

encoder output to circle buffer, other read, that cause problem #11 #12 #14 , so the circle buffer should be refactor.

encoder.c move_last_rap
encoder.c encoder_output_rap_timestamp
job.c : m3u8push_thread_func

master process eat cpu

948 ? Ssl 748:25 src/gstreamill --gst-debug=gstreamill:4
24095 ? Sl 292:02 _ /home/zhangping/workdir/gstreamill/src/gstreamill -l /var/log/gstreamill -n cctv6 -q 3556 --gst-debug=gstreamill:4
16310 ? Sl 65:42 _ /home/zhangping/workdir/gstreamill/src/gstreamill -l /var/log/gstreamill -n cctv8 -q 3556 --gst-debug=gstreamill:4
16377 ? Sl 65:28 _ /home/zhangping/workdir/gstreamill/src/gstreamill -l /var/log/gstreamill -n cctv1 -q 3560 --gst-debug=gstreamill:4
17003 ? Sl 62:54 _ /home/zhangping/workdir/gstreamill/src/gstreamill -l /var/log/gstreamill -n cctv5 -q 3556 --gst-debug=gstreamill:4
18952 ? Sl 132:41 _ /home/zhangping/workdir/gstreamill/src/gstreamill -l /var/log/gstreamill -n cctv7 -q 3610 --gst-debug=gstreamill:4
19079 ? Sl 62:46 _ /home/zhangping/workdir/gstreamill/src/gstreamill -l /var/log/gstreamill -n cctv2 -q 3583 --gst-debug=gstreamill:4

udp进udp出,跑半小时后界面死掉

udp进udp出,标清电视转码,播放一段时间后界面死掉,但是工作进程还占用cpu和内存资源,无法恢复,只能杀掉进程并删除pid文件服务才能重启,但是该udp任务就不能重新启用。

subprocess crash

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `/home/zhangping/workdir/gstreamill/src/gstreamill -l /var/log/gstreamill -n cct'.
Program terminated with signal 11, Segmentation fault.
#0 __memcpy_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1474

1474 ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S: No such file or directory.
(gdb) bt
#0 __memcpy_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1474
#1 0x000000000040e632 in memcpy (__len=18446744073709551612, __src=0x7f97e7ffe84c, __dest=)

at /usr/include/x86_64-linux-gnu/bits/string3.h:51

#2 move_last_rap (encoder=encoder@entry=0x1616980, buffer=buffer@entry=0x7f97e0054d20) at encoder.c:227
#3 0x000000000040fbf6 in new_sample_callback (sink=, user_data=0x1616980) at encoder.c:345
#4 0x00007f9807e28806 in ?? () from /usr/lib/x86_64-linux-gnu/libgstapp-1.0.so.0
#5 0x00007f980696dfc0 in ?? () from /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0
#6 0x00007f980696f524 in ?? () from /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0
#7 0x00007f9807b80baa in ?? () from /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#8 0x00007f97fac24d42 in ?? () from /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstcoreelements.so
#9 0x00007f9807bae189 in ?? () from /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#10 0x00007f980763bab6 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#11 0x00007f980763b0f5 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#12 0x00007f98071b0f6e in start_thread (arg=0x7f97e7fff700) at pthread_create.c:311
#13 0x00007f9806c999cd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113

m3u8 playlist problem of transcode hls output

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-TARGETDURATION:10

#EXTINF:10,ciao
segment00000.ts
#EXTINF:10,ciao

it can't be played normally use vlc.

clean /dev/shm and mq before start gstreamill

clean /dev/shm and mq before start gstreamill in upstart job and systemd service unit.

after gstreamill crash, there are files unclean in /dev/shm and mq filesystem, which make start subprocess failure.

Main process crash

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `gstreamill'.
Program terminated with signal 6, Aborted.
#0  0x00007fb473f79f77 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56      ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007fb473f79f77 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007fb473f7d5e8 in __GI_abort () at abort.c:90
#2  0x00007fb473fb74fb in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7fb4740c8f10 "*** %s ***: %s terminated\n")
    at ../sysdeps/unix/sysv/linux/libc_fatal.c:199
#3  0x00007fb47405508c in __GI___fortify_fail (msg=<optimized out>, msg@entry=0x7fb4740c8ea7 "buffer overflow detected") at fortify_fail.c:37
#4  0x00007fb474054020 in __GI___chk_fail () at chk_fail.c:28
#5  0x000000000040f1b8 in memcpy (__len=<optimized out>, __src=<optimized out>, __dest=<optimized out>) at /usr/include/x86_64-linux-gnu/bits/string3.h:51
#6  encoder_output_rap_timestamp (encoder_output=0xa4a, encoder_output@entry=0x7fb458011250, rap_addr=2641, rap_addr@entry=18446744071559692473)
    at encoder.c:760
#7  0x000000000041275e in get_mpeg2ts_segment (encoder_output=0x7fb458011250, request_data=0x21adbb0) at httpstreaming.c:311
#8  httpstreaming_dispatcher (data=0x21adbb0, user_data=0x1e806a0) at httpstreaming.c:440
#9  0x000000000040b728 in thread_pool_func (data=0x1e896a8, user_data=0x1e89400) at httpserver.c:803
#10 0x00007fb4749dfaa6 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#11 0x00007fb4749df0e5 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#12 0x00007fb474554f6e in start_thread (arg=0x7fb46bfff700) at pthread_create.c:311
#13 0x00007fb47403d9cd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113

python test/httpmgmt.py cause crash

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `src/gstreamill'.
Program terminated with signal 11, Segmentation fault.
#0 0x000000000040761f in child_watch_cb (pid=22361, status=, livejob=0x7fc0140029f0) at gstreamill.c:674

674 *(livejob->output->state) = GST_STATE_NULL;
(gdb) bt
#0 0x000000000040761f in child_watch_cb (pid=22361, status=, livejob=0x7fc0140029f0) at gstreamill.c:674
#1 0x00007fc03088e424 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#2 0x00007fc0308913b6 in g_main_context_dispatch () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#3 0x00007fc030891708 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#4 0x00007fc030891b0a in g_main_loop_run () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#5 0x0000000000406676 in main (argc=1, argv=0x7fffbbed4d88) at main.c:308

create_livejob_process failure bug

Wed Dec 18 19:57:01 2013: INFO gstreamill gstreamill.c:830: live job arrived.
Wed Dec 18 19:57:01 2013: ERROR gstreamill gstreamill.c:737: Start livejob test error, reason: Failed to create pipe for communicating with child process (Too many open files).

create_livejob_process failure is ignore

segmentation fault

warning: Can't read pathname for load map: Input/output error.
[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/local/bin/gstreamill -l /var/log/gstreamill -n cctv21 -q 3151 --gst-debug='.
Program terminated with signal 11, Segmentation fault.
#0  __memcpy_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1474
1474    ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S: No such file or directory.
(gdb) bt
#0  __memcpy_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1474
#1  0x000000000040e1f2 in move_last_rap (encoder=0x76d8d0, buffer=0x7fa5640fa5e0) at encoder.c:226
#2  0x000000000040f5d6 in udp_streaming (buffer=0x7fa5640fa5e0, encoder=0x76d8d0) at encoder.c:299
#3  encoder_appsink_callback (sink=<optimized out>, user_data=0x76d8d0) at encoder.c:357
#4  0x00007fa58a4e7806 in ?? () from /usr/lib/x86_64-linux-gnu/libgstapp-1.0.so.0
#5  0x00007fa58902cfc0 in ?? () from /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0
#6  0x00007fa58902e524 in ?? () from /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0
#7  0x00007fa58a23fbaa in ?? () from /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#8  0x00007fa57f4c1d42 in ?? () from /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstcoreelements.so
#9  0x00007fa58a26d189 in ?? () from /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#10 0x00007fa589cfaab6 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#11 0x00007fa589cfa0f5 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#12 0x00007fa58986ff6e in start_thread (arg=0x7fa5737fe700) at pthread_create.c:311
#13 0x00007fa5893589cd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113

Invalid timestamps stream

When I play stream by ffplay or avplay I get a lot of messages like:

[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473409041, dts=473409048, size=944
[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473405441, dts=473412638, size=1071
[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473416234, dts=473419840, size=1016
[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473423437, dts=473427031, size=713
[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473430628, dts=473434226, size=1207
[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473437824, dts=473441430, size=1298
[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473445026, dts=473448620, size=1918
[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473452219, dts=473459416, size=1145
[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473463015, dts=473466612, size=1240
[mpegts @ 0x7f5e48005b60] Invalid timestamps stream=0, pts=473470207, dts=473473814, size=1761

Add property to udpstreaming section

For stream via UDP used section

"udpstreaming" : "127.0.0.1:22345"

How can add other options to udpsink ?
For example bind-address or multicast-iface ?

no output after 4 days 14:33:54

channel log:

Jan 21 08:19:36 WARN mpegtsmux mpegtsmux.c:1010: ignoring DTS going backward
Jan 21 08:19:36 WARN videodecoder gstvideodecoder.c:2315: decreasing timestamp (14:41:09.692418392 < 14:41:09.772420341)
Jan 21 08:19:36 WARN mpegtsmux mpegtsmux.c:1010: ignoring DTS going backward
Jan 21 08:19:36 WARN mpegtsmux mpegtsmux.c:1010: ignoring DTS going backward
Jan 21 08:19:36 WARN x264enc :0: non-strictly-monotonic PTS

Jan 21 08:19:36 WARN mpegtsmux mpegtsmux.c:1010: ignoring DTS going backward
Jan 21 08:19:37 WARN x264enc :0: non-strictly-monotonic PTS

Jan 21 08:19:37 WARN mpegtsmux mpegtsmux.c:1010: ignoring DTS going backward
Jan 21 08:19:37 WARN x264enc :0: invalid DTS: PTS is less than DTS

Jan 21 08:19:37 WARN videodecoder gstvideodecoder.c:2315: decreasing timestamp (14:41:09.812415527 < 14:41:09.892417429)
Jan 21 08:19:37 WARN x264enc :0: invalid DTS: PTS is less than DTS

access playlist.m3u8 failure

access http://192.168.1.1:20119/live/CCTV-1/encoder/0/playlist.m3u8 failure
access http://192.168.1.1:20119/live/CCTV-1/encoder/0 success

log fallow:
18174 Oct 16 20:33:52.287214 ERROR gstreamill job.c:477: Segment not found!
18175 Oct 16 20:33:54.996570 ERROR gstreamill encoder.c:870: FATAL: CCTV-1.encoder.1 rap_addr value is 18446744072591216340
18176 Oct 16 20:33:54.996710 ERROR gstreamill job.c:477: Segment not found!
18177 Oct 16 20:33:58.139506 ERROR gstreamill encoder.c:870: FATAL: CCTV-1.encoder.1 rap_addr value is 18446744072591216340
18178 Oct 16 20:33:58.139598 ERROR gstreamill job.c:477: Segment not found!
18179 Oct 16 20:34:01.498866 ERROR gstreamill encoder.c:870: FATAL: CCTV-1.encoder.1 rap_addr value is 18446744072591216340
18180 Oct 16 20:34:01.498993 ERROR gstreamill job.c:477: Segment not found!
18181 Oct 16 20:34:04.411247 ERROR gstreamill encoder.c:870: FATAL: CCTV-1.encoder.1 rap_addr value is 18446744072591216340
18182 Oct 16 20:34:04.411433 ERROR gstreamill job.c:477: Segment not found!
18183 Oct 16 20:34:07.430129 ERROR gstreamill encoder.c:870: FATAL: CCTV-1.encoder.1 rap_addr value is 18446744072591216340
18184 Oct 16 20:34:07.430337 ERROR gstreamill job.c:477: Segment not found!
18185 Oct 16 20:34:10.597925 ERROR gstreamill encoder.c:870: FATAL: CCTV-1.encoder.1 rap_addr value is 18446744072591216340
18186 Oct 16 20:34:10.598049 ERROR gstreamill job.c:477: Segment not found!
18187 Oct 16 20:34:13.204793 ERROR gstreamill encoder.c:870: FATAL: CCTV-1.encoder.1 rap_addr value is 18446744072591216340

httpserver api usage

replace httpserver_write with httpserver user_callback, that means asynchronou write.

httpserver_write cause pipe broken

Internal data flow error and pause

Jun 02 10:15:58 WARN GST_PADS gstpad.c:3669: could not send sticky events
Jun 02 10:15:58 INFO task gsttask.c:300: Task going to paused
Jun 02 10:15:58 INFO task gsttask.c:300: Task going to paused
Jun 02 10:15:58 WARN basesrc gstbasesrc.c:2865: error: Internal data flow error.
Jun 02 10:15:58 WARN basesrc gstbasesrc.c:2865: error: streaming task paused, reason not-negotiated (-4)
Jun 02 10:15:58 INFO GST_ERROR_SYSTEM gstelement.c:1835: posting message: Internal data flow error.
Jun 02 10:15:58 INFO GST_ERROR_SYSTEM gstelement.c:1858: posted error message: Internal data flow error.
Jun 02 10:15:58 INFO task gsttask.c:300: Task going to paused
Jun 02 10:15:58 WARN gstreamill source.c:221: source error: Internal data flow error.

pause and halt, dont exit.

aac audio mpegtsmux failure under CentOS7

gst-launch-1.0 -v audiotestsrc ! voaacenc ! mpegtsmux ! fakesink --gst-debug=mpegtsmux:7,voaacenc:7

gst-launch-1.0 -v audiotestsrc ! voaacenc ! aacparse ! mpegtsmux ! fakesink
^
see here --------------------------------------

You need a parser to convert the voaacenc output to the stream format
that mpegtsmux requires. From the complete debug logs you would see that
something there complains about incompatible caps.

Always add parsers after encoders and before muxers, unless there is no
parser.

Sebastian Dröge, Centricular Ltd · http://www.centricular.com

worker process crash

#0  0x00007f8a7a80c6de in ?? () from /usr/lib/x86_64-linux-gnu/libvo-aacenc.so.0
#1  0x00007f8a7a80f23b in ?? () from /usr/lib/x86_64-linux-gnu/libvo-aacenc.so.0
#2  0x00007f8a7a8182f4 in ?? () from /usr/lib/x86_64-linux-gnu/libvo-aacenc.so.0
#3  0x00007f8a7a80d145 in ?? () from /usr/lib/x86_64-linux-gnu/libvo-aacenc.so.0
#4  0x00007f8a7a80c95f in ?? () from /usr/lib/x86_64-linux-gnu/libvo-aacenc.so.0
#5  0x00007f8a7aa2a4e2 in gst_voaacenc_handle_frame (benc=0xfa8680, buf=0x7f8a6c01c4c0) at gstvoaacenc.c:486
#6  0x00007f8a7c8ef58d in gst_audio_encoder_push_buffers (enc=enc@entry=0xfa8680, force=force@entry=0) at gstaudioencoder.c:978
#7  0x00007f8a7c8efafc in gst_audio_encoder_chain (pad=<optimized out>, parent=0xfa8680, buffer=0x7f8a6c012a40) at gstaudioencoder.c:1197
#8  0x00007f8a8983ad08 in gst_pad_chain_data_unchecked (data=0x7f8a6c012a40, type=4112, pad=0xfa4500) at gstpad.c:3760
#9  gst_pad_push_data (pad=0xfa42d0, type=type@entry=4112, data=<optimized out>) at gstpad.c:3990
#10 0x00007f8a898419b6 in gst_pad_push (pad=<optimized out>, buffer=<optimized out>) at gstpad.c:4093
#11 0x00007f8a880582a9 in gst_base_transform_chain (pad=<optimized out>, parent=0xfa16e0, buffer=<optimized out>) at gstbasetransform.c:2237
#12 0x00007f8a8983ad08 in gst_pad_chain_data_unchecked (data=0x7f8a6c01e8d0, type=4112, pad=0xfa40a0) at gstpad.c:3760
#13 gst_pad_push_data (pad=0xf91d80, type=type@entry=4112, data=<optimized out>, data@entry=0x7f8a6c01e8d0) at gstpad.c:3990
#14 0x00007f8a898419b6 in gst_pad_push (pad=<optimized out>, buffer=buffer@entry=0x7f8a6c01e8d0) at gstpad.c:4093
#15 0x00007f8a7d3c5eb0 in gst_queue_push_one (queue=0xf96260) at gstqueue.c:1115
#16 gst_queue_loop (pad=<optimized out>) at gstqueue.c:1244
#17 0x00007f8a89868549 in gst_task_func (task=0xfdd5f0) at gsttask.c:316
#18 0x00007f8a88d1c89c in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#19 0x00007f8a88d1bf15 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#20 0x00007f8a88890182 in start_thread (arg=0x7f8a6affd700) at pthread_create.c:312
#21 0x00007f8a8837730d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

deinterlace make m3u8 duration change from 10s to 5s

add deinterlace after video decode:
... mpeg2dec ! queue ! deinterlace ! queue ! appsink name = video

the output segment duration is 5s, but it's 10s in job file:
"segment-duration" : 10.00

0:00:06.970572065 30100 0x7fe468020980 ERROR gstreamill livejob.c:575:notify_function: add segement 0.ts
0:00:11.991578931 30100 0x7fe468020c90 ERROR gstreamill livejob.c:575:notify_function: add segement 5770853909.ts
0:00:17.011150355 30100 0x7fe46800c900 ERROR gstreamill livejob.c:575:notify_function: add segement 10770734416.ts
0:00:22.015128171 30100 0x7fe46c004520 ERROR gstreamill livejob.c:575:notify_function: add segement 15770611535.ts

DVR support

Time shift url format:

http://host.name.or.ip:port/dvr/job_name/playlist.m3u8?offset=-nnnn

or

 http://host.name.or.ip:port/dvr/job_name/encoder/n/playlist.m3u8?offset=-nnnn

nnnn = nnnn seconds, minus means before。

DVR url format

http://host.name.or.ip:port/dvr/job_name/playlist.m3u8?start=nnn&duration=ddd

or

http://host.name.or.ip:port/dvr/job_name/encoder/n/playlist.m3u8?start=nnn&duration=ddd

start = unix time
duration = seconds

multi bitrate dvr should have corresponding sequence

GET /dvr/CCTV-10/encoder/1/playlist.m3u8?offset=-1350 HTTP/1.1
Host: 192.168.7.40:20119
User-Agent: VLC/2.1.5 LibVLC/2.1.5
Range: bytes=0-
Connection: close
Icy-MetaData: 1

HTTP/1.1 200 Ok
Server: gstreamill-0.5.3
Content-Type: application/vnd.apple.mpegurl
Content-Length: 257
Access-Control-Allow-Origin: *
Cache-Control: max-age=60
Connection: Close

EXTM3U

EXT-X-VERSION:3

EXT-X-ALLOW-CACHE:NO

EXT-X-MEDIA-SEQUENCE:177345

EXT-X-TARGETDURATION:3

EXTINF:3.00,

1414139295775469_177345_3000000000.ts

EXTINF:3.00,

1414139298288771_177346_3000000000.ts

EXTINF:3.00,

1414139309651873_177347_3000000000.ts


180858 != 177345


GET /dvr/CCTV-10/encoder/0/playlist.m3u8?offset=-1350 HTTP/1.1
Host: 192.168.7.40:20119
User-Agent: VLC/2.1.5 LibVLC/2.1.5
Range: bytes=0-
Connection: close
Icy-MetaData: 1

HTTP/1.1 200 Ok
Server: gstreamill-0.5.3
Content-Type: application/vnd.apple.mpegurl
Content-Length: 257
Access-Control-Allow-Origin: *
Cache-Control: max-age=60
Connection: Close

EXTM3U

EXT-X-VERSION:3

EXT-X-ALLOW-CACHE:NO

EXT-X-MEDIA-SEQUENCE:180858

EXT-X-TARGETDURATION:3

EXTINF:3.00,

1414139295912776_180858_3000000000.ts

EXTINF:3.00,

1414139298864660_180859_3000000000.ts

EXTINF:3.00,

1414139301863288_180860_3000000000.ts

rss error

job hungui-6 is transcode job, rss is < 0
Jun 03 17:58:12 INFO gstreamill gstreamill.c:460: Job hungui-6's average cpu: 8%, cpu: 8%, rss: -2008379392

添加高清转码任务后服务频繁重启

添加高清转码任务,不管有没有勾选DVR选项,服务后台运行后,频繁重启,vlc无法播放
但是前台调试模式运行,只打印警告信息,vlc可播放

怎么用呀?

怎么推流到gstreamill 服务器上呀?

能否给个例子

use unix domain socket instead mqueue

use unix domain socket instead mqueue,

使用mqueue的时候,如果多个(比如5个)job频繁重启,就会造成mq_notify突然消失,使得主进程不响应子进程的分片消息。

因此决定采用unix damin socket.

start job failure

reproduce: repeat start and stop job over http

Thu Dec 19 16:52:23 2013: INFO gstreamill httpmgmt.c:236: new request arrived, socket is 13, uri is /stop/test
Thu Dec 19 16:52:33 2013: ERROR gstreamill httpserver.c:408: accept error Too many open files
Thu Dec 19 16:52:33 2013: INFO gstreamill httpmgmt.c:236: new request arrived, socket is 13, uri is /start
Thu Dec 19 16:52:33 2013: INFO gstreamill gstreamill.c:834: live job arrived.
Thu Dec 19 16:52:33 2013: ERROR gstreamill livejob.c:1670: ftruncate error: Bad file descriptor
Thu Dec 19 16:52:43 2013: ERROR gstreamill httpserver.c:408: accept error Too many open files
Thu Dec 19 16:52:43 2013: INFO gstreamill httpmgmt.c:236: new request arrived, socket is 13, uri is /stop/test
Thu Dec 19 16:52:53 2013: ERROR gstreamill httpserver.c:408: accept error Too many open files
Thu Dec 19 16:52:53 2013: INFO gstreamill httpmgmt.c:236: new request arrived, socket is 13, uri is /start

timeshift tv playing break

-rw-r--r-- 1 gstreamill gstreamill 357776 Oct 24 13:50 1414129833798941_307507_3000000000.ts
-rw-r--r-- 1 gstreamill gstreamill 427524 Oct 24 13:50 1414129836833052_307508_3000000000.ts
-rw-r--r-- 1 gstreamill gstreamill 400076 Oct 24 13:50 1414129839929286_307509_3000000000.ts
-rw-r--r-- 1 gstreamill gstreamill 375636 Oct 24 13:50 1414129842774120_307510_3000000000.ts
-rw-r--r-- 1 gstreamill gstreamill 429592 Oct 24 13:50 1414129845815109_307511_3000000000.ts
-rw-r--r-- 1 gstreamill gstreamill 339728 Oct 24 13:50 1414129848872426_307512_3000000000.ts
a hole of 1414129862 - 1414129848 = 12s
-rw-r--r-- 1 gstreamill gstreamill 387856 Oct 24 13:51 1414129862808764_307513_3000000000.ts
-rw-r--r-- 1 gstreamill gstreamill 412108 Oct 24 13:51 1414129865837019_307514_3000000000.ts
-rw-r--r-- 1 gstreamill gstreamill 371876 Oct 24 13:51 1414129868825547_307515_3000000000.ts
-rw-r--r-- 1 gstreamill gstreamill 430344 Oct 24 13:51 1414129871648973_307516_3000000000.ts
-rw-r--r-- 1 gstreamill gstreamill 383344 Oct 24 13:51 1414129874692193_307517_3000000000.ts

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.