Compare commits

...

3 Commits
v6.59 ... v6.60

Author SHA1 Message Date
Maxim Devaev
5fe579956e Bump version: 6.59 → 6.60 2026-05-31 19:09:57 +03:00
Maxim Devaev
52dfa38a8f janus: camera basics 2026-05-31 18:28:53 +03:00
Maxim Devaev
8b76b59393 janus: _aplay_thread(): don't see at has_listeners 2026-05-31 17:05:34 +03:00
12 changed files with 30 additions and 35 deletions

View File

@@ -1,7 +1,7 @@
[bumpversion] [bumpversion]
commit = True commit = True
tag = True tag = True
current_version = 6.59 current_version = 6.60
parse = (?P<major>\d+)\.(?P<minor>\d+) parse = (?P<major>\d+)\.(?P<minor>\d+)
serialize = serialize =
{major}.{minor} {major}.{minor}

View File

@@ -70,6 +70,7 @@ us_config_s *us_config_init(const char *config_dir_path) {
} }
} }
config->aplay_dev_name = _get_value(jcfg, "aplay", "device"); config->aplay_dev_name = _get_value(jcfg, "aplay", "device");
config->vplay_sink_name = _get_value(jcfg, "vplay", "sink");
goto ok; goto ok;
@@ -87,6 +88,7 @@ void us_config_destroy(us_config_s *config) {
US_DELETE(config->acap_dev_name, free); US_DELETE(config->acap_dev_name, free);
US_DELETE(config->tc358743_dev_path, free); US_DELETE(config->tc358743_dev_path, free);
US_DELETE(config->aplay_dev_name, free); US_DELETE(config->aplay_dev_name, free);
US_DELETE(config->vplay_sink_name, free);
free(config); free(config);
} }

View File

@@ -34,6 +34,7 @@ typedef struct {
char *tc358743_dev_path; char *tc358743_dev_path;
char *aplay_dev_name; char *aplay_dev_name;
char *vplay_sink_name;
} us_config_s; } us_config_s;

View File

@@ -345,7 +345,7 @@ static void *_aplay_thread(void *arg) {
} }
} }
if (!_HAS_WATCHERS || !_HAS_LISTENERS || !_HAS_SPEAKERS) { if (!_HAS_WATCHERS || !_HAS_SPEAKERS) {
goto close_aplay; goto close_aplay;
} }
@@ -612,21 +612,20 @@ static struct janus_plugin_result *_plugin_handle_message(
uint video_orient = 0; uint video_orient = 0;
bool with_acap = false; bool with_acap = false;
bool with_aplay = false; bool with_aplay = false;
bool with_vplay = false;
{ {
json_t *const params = json_object_get(msg, "params"); json_t *const params = json_object_get(msg, "params");
if (params != NULL) { if (params != NULL) {
{ # define READ_BOOL(x_target, x_key, x_cond) { \
json_t *const obj = json_object_get(params, "audio"); json_t *const m_obj = json_object_get(params, x_key); \
if (obj != NULL && json_is_boolean(obj)) { if (m_obj != NULL && json_is_boolean(m_obj)) { \
with_acap = (us_au_probe(_g_config->acap_dev_name) && json_boolean_value(obj)); x_target = (json_boolean_value(m_obj) && (x_cond)); \
} \
} }
} READ_BOOL(with_acap, "audio", us_au_probe(_g_config->acap_dev_name));
{ READ_BOOL(with_aplay, "mic", us_au_probe(_g_config->aplay_dev_name));
json_t *const obj = json_object_get(params, "mic"); READ_BOOL(with_vplay, "camera", (_g_config->vplay_sink_name != NULL));
if (obj != NULL && json_is_boolean(obj)) { # undef READ_BOOL
with_aplay = (us_au_probe(_g_config->aplay_dev_name) && json_boolean_value(obj));
}
}
{ {
json_t *const obj = json_object_get(params, "orientation"); json_t *const obj = json_object_get(params, "orientation");
if (obj != NULL && json_is_integer(obj)) { if (obj != NULL && json_is_integer(obj)) {
@@ -642,29 +641,21 @@ static struct janus_plugin_result *_plugin_handle_message(
{ {
_LOCK_ALL; _LOCK_ALL;
bool has_listeners = false;
bool has_speakers = false;
US_LIST_ITERATE(_g_clients, client, { US_LIST_ITERATE(_g_clients, client, {
if (client->session == session) { if (client->session == session) {
char *const sdp = us_sdp_create( char *const sdp = us_sdp_create(
client->video_ssrc, client->video_ssrc,
client->audio_ssrc, client->audio_ssrc,
with_acap, with_acap,
with_aplay); with_aplay,
with_vplay);
json_t *const offer_jsep = json_pack("{ssss}", "type", "offer", "sdp", sdp); json_t *const offer_jsep = json_pack("{ssss}", "type", "offer", "sdp", sdp);
PUSH_STATUS("started", NULL, offer_jsep); PUSH_STATUS("started", NULL, offer_jsep);
json_decref(offer_jsep); json_decref(offer_jsep);
free(sdp); free(sdp);
break;
}
});
_UNLOCK_ALL;
}
{
_LOCK_ALL;
bool has_listeners = false;
bool has_speakers = false;
US_LIST_ITERATE(_g_clients, client, {
if (client->session == session) {
atomic_store(&client->transmit_acap, with_acap); atomic_store(&client->transmit_acap, with_acap);
atomic_store(&client->transmit_aplay, with_aplay); atomic_store(&client->transmit_aplay, with_aplay);
atomic_store(&client->video_orient, video_orient); atomic_store(&client->video_orient, video_orient);

View File

@@ -34,7 +34,7 @@
#include "rtpa.h" #include "rtpa.h"
char *us_sdp_create(u32 video_ssrc, u32 audio_ssrc, bool acap, bool aplay) { char *us_sdp_create(u32 video_ssrc, u32 audio_ssrc, bool acap, bool aplay, bool vplay) {
char *video_sdp; char *video_sdp;
{ {
// https://tools.ietf.org/html/rfc6184 // https://tools.ietf.org/html/rfc6184
@@ -56,9 +56,10 @@ char *us_sdp_create(u32 video_ssrc, u32 audio_ssrc, bool acap, bool aplay) {
"a=extmap:1/sendonly urn:3gpp:video-orientation" RN "a=extmap:1/sendonly urn:3gpp:video-orientation" RN
"a=extmap:2/sendonly http://www.webrtc.org/experiments/rtp-hdrext/playout-delay" RN "a=extmap:2/sendonly http://www.webrtc.org/experiments/rtp-hdrext/playout-delay" RN
"a=extmap:3/sendonly http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time" RN "a=extmap:3/sendonly http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time" RN
"a=sendonly" RN, "a=%s" RN,
pl, pl, pl, pl, pl, pl, pl, pl, pl, pl, pl, pl, pl, pl,
video_ssrc); video_ssrc,
(vplay ? "sendrecv" : "sendonly"));
} }
char *audio_sdp; char *audio_sdp;

View File

@@ -25,4 +25,4 @@
#include "uslibs/types.h" #include "uslibs/types.h"
char *us_sdp_create(u32 video_ssrc, u32 audio_ssrc, bool acap, bool aplay); char *us_sdp_create(u32 video_ssrc, u32 audio_ssrc, bool acap, bool aplay, bool vplay);

View File

@@ -1,6 +1,6 @@
.\" Manpage for ustreamer-dump. .\" Manpage for ustreamer-dump.
.\" Open an issue or pull request to https://github.com/pikvm/ustreamer to correct errors or typos .\" Open an issue or pull request to https://github.com/pikvm/ustreamer to correct errors or typos
.TH USTREAMER-DUMP 1 "version 6.59" "January 2021" .TH USTREAMER-DUMP 1 "version 6.60" "January 2021"
.SH NAME .SH NAME
ustreamer-dump \- Dump uStreamer's memory sink to file ustreamer-dump \- Dump uStreamer's memory sink to file

View File

@@ -1,6 +1,6 @@
.\" Manpage for ustreamer. .\" Manpage for ustreamer.
.\" Open an issue or pull request to https://github.com/pikvm/ustreamer to correct errors or typos .\" Open an issue or pull request to https://github.com/pikvm/ustreamer to correct errors or typos
.TH USTREAMER 1 "version 6.59" "November 2020" .TH USTREAMER 1 "version 6.60" "November 2020"
.SH NAME .SH NAME
ustreamer \- stream MJPEG video from any V4L2 device to the network ustreamer \- stream MJPEG video from any V4L2 device to the network

View File

@@ -3,7 +3,7 @@
pkgname=ustreamer pkgname=ustreamer
pkgver=6.59 pkgver=6.60
pkgrel=1 pkgrel=1
pkgdesc="Lightweight and fast MJPEG-HTTP streamer" pkgdesc="Lightweight and fast MJPEG-HTTP streamer"
url="https://github.com/pikvm/ustreamer" url="https://github.com/pikvm/ustreamer"

View File

@@ -9,7 +9,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=ustreamer PKG_NAME:=ustreamer
PKG_VERSION:=6.59 PKG_VERSION:=6.60
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_MAINTAINER:=Maxim Devaev <mdevaev@gmail.com> PKG_MAINTAINER:=Maxim Devaev <mdevaev@gmail.com>

View File

@@ -34,7 +34,7 @@ def main() -> None:
flags = _find_flags() flags = _find_flags()
setup( setup(
name="ustreamer", name="ustreamer",
version="6.59", version="6.60",
description="uStreamer tools", description="uStreamer tools",
author="Maxim Devaev", author="Maxim Devaev",
author_email="mdevaev@gmail.com", author_email="mdevaev@gmail.com",

View File

@@ -26,7 +26,7 @@
#define US_VERSION_MAJOR 6 #define US_VERSION_MAJOR 6
#define US_VERSION_MINOR 59 #define US_VERSION_MINOR 60
#define US_MAKE_VERSION2(_major, _minor) #_major "." #_minor #define US_MAKE_VERSION2(_major, _minor) #_major "." #_minor
#define US_MAKE_VERSION1(_major, _minor) US_MAKE_VERSION2(_major, _minor) #define US_MAKE_VERSION1(_major, _minor) US_MAKE_VERSION2(_major, _minor)