[vlc-commits] decklink output: black out video if no new pictures are coming
Rafaël Carré
git at videolan.org
Mon Jul 15 14:47:10 CEST 2013
vlc | branch: master | Rafaël Carré <funman at videolan.org> | Tue Jul 9 14:29:37 2013 +0200| [d1114a9d641b13571edc53f291464a0159b502e9] | committer: Rafaël Carré
decklink output: black out video if no new pictures are coming
Default delay 5 seconds, configurable with --decklink-vout-nosignal-delay
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d1114a9d641b13571edc53f291464a0159b502e9
---
modules/video_output/decklink.cpp | 34 +++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/modules/video_output/decklink.cpp b/modules/video_output/decklink.cpp
index 35bfeca..66220da 100644
--- a/modules/video_output/decklink.cpp
+++ b/modules/video_output/decklink.cpp
@@ -66,6 +66,12 @@ static const int pi_channels_maps[CHANNELS_MAX+1] =
};
#endif
+#define NOSIGNAL_INDEX_TEXT N_("Timelength after which we assume there is no signal.")
+#define NOSIGNAL_INDEX_LONGTEXT N_(\
+ "Timelength after which we assume there is no signal.\n"\
+ "After this delay we black out the video."\
+ )
+
#define CARD_INDEX_TEXT N_("Output card")
#define CARD_INDEX_LONGTEXT N_(\
"DeckLink output card, if multiple exist. " \
@@ -125,6 +131,7 @@ struct vout_display_sys_t
{
picture_pool_t *pool;
bool tenbits;
+ int nosignal_delay;
};
/* Only one audio output module and one video output module
@@ -191,6 +198,8 @@ vlc_module_begin()
MODE_TEXT, MODE_LONGTEXT, true)
add_bool(VIDEO_CFG_PREFIX "tenbits", false,
VIDEO_TENBITS_TEXT, VIDEO_TENBITS_LONGTEXT, true)
+ add_integer(VIDEO_CFG_PREFIX "nosignal-delay", 5,
+ NOSIGNAL_INDEX_TEXT, NOSIGNAL_INDEX_LONGTEXT, true)
add_submodule ()
@@ -601,13 +610,35 @@ static void DisplayVideo(vout_display_t *vd, picture_t *picture, subpicture_t *)
{
vout_display_sys_t *sys = vd->sys;
struct decklink_sys_t *decklink_sys = GetDLSys(VLC_OBJECT(vd));
+ mtime_t now = mdate();
if (!picture)
return;
+ if (now - picture->date > sys->nosignal_delay * CLOCK_FREQ) {
+ msg_Dbg(vd, "no signal");
+ if (sys->tenbits) { // I422_10L
+ plane_t *y = &picture->p[0];
+ memset(y->p_pixels, 0x0, y->i_lines * y->i_pitch);
+ for (int i = 1; i < picture->i_planes; i++) {
+ plane_t *p = &picture->p[i];
+ size_t len = p->i_lines * p->i_pitch / 2;
+ int16_t *data = (int16_t*)p->p_pixels;
+ for (size_t j = 0; j < len; j++) // XXX: SIMD
+ data[j] = 0x200;
+ }
+ } else { // UYVY
+ size_t len = picture->p[0].i_lines * picture->p[0].i_pitch;
+ for (size_t i = 0; i < len; i+= 2) { // XXX: SIMD
+ picture->p[0].p_pixels[i+0] = 0x80;
+ picture->p[0].p_pixels[i+1] = 0;
+ }
+ }
+ picture->date = now;
+ }
+
HRESULT result;
int w, h, stride, length;
- mtime_t now;
w = decklink_sys->i_width;
h = decklink_sys->i_height;
@@ -692,6 +723,7 @@ static int OpenVideo(vlc_object_t *p_this)
return VLC_ENOMEM;
sys->tenbits = var_InheritBool(p_this, VIDEO_CFG_PREFIX "tenbits");
+ sys->nosignal_delay = var_InheritInteger(p_this, VIDEO_CFG_PREFIX "nosignal-delay");
decklink_sys = OpenDecklink(vd);
if (!decklink_sys) {
More information about the vlc-commits
mailing list