mirror of
https://github.com/albfan/miraclecast.git
synced 2025-03-09 23:38:56 +00:00
integrate miracle-sender with miracast-srcctl
This commit is contained in:
parent
8a935e1893
commit
047775303b
6 changed files with 370 additions and 182 deletions
|
|
@ -94,7 +94,7 @@ static void src_handle_setup(struct ctl_src *s,
|
|||
goto error;
|
||||
}
|
||||
|
||||
char buf[128];
|
||||
char buf[256];
|
||||
snprintf(buf, sizeof(buf), "RTP/AVP/UDP;unicast;client_port=%d", s->sink.rtp_ports.port0);
|
||||
r = rtsp_message_append(rep, "<s>",
|
||||
"Transport", buf);
|
||||
|
|
@ -181,6 +181,8 @@ static void src_handle_play(struct ctl_src *s,
|
|||
goto error;
|
||||
}
|
||||
|
||||
ctl_fn_src_playing(s);
|
||||
|
||||
return;
|
||||
|
||||
error:
|
||||
|
|
@ -518,27 +520,6 @@ error:
|
|||
return r;
|
||||
}
|
||||
|
||||
static int src_set_format(struct ctl_src *s,
|
||||
unsigned int cea_res,
|
||||
unsigned int vesa_res,
|
||||
unsigned int hh_res)
|
||||
{
|
||||
int hres, vres;
|
||||
|
||||
// if ((vfd_get_cea_resolution(cea_res, &hres, &vres) == 0) ||
|
||||
// (vfd_get_vesa_resolution(vesa_res, &hres, &vres) == 0) ||
|
||||
// (vfd_get_hh_resolution(hh_res, &hres, &vres) == 0)) {
|
||||
// if (hres && vres) {
|
||||
// s->hres = hres;
|
||||
// s->vres = vres;
|
||||
// ctl_fn_sink_resolution_set(s);
|
||||
// return 0;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void src_handle(struct ctl_src *s,
|
||||
struct rtsp_message *m)
|
||||
{
|
||||
|
|
@ -634,7 +615,7 @@ static void src_connected(struct ctl_src *s)
|
|||
sd_event_source_set_enabled(s->fd_source, SD_EVENT_OFF);
|
||||
|
||||
len = sizeof(addr);
|
||||
int fd = accept(s->fd, (struct sockaddr *) &addr, &len);
|
||||
int fd = accept4(s->fd, (struct sockaddr *) &addr, &len, SOCK_CLOEXEC);
|
||||
|
||||
r = getsockopt(fd, SOL_SOCKET, SO_ERROR, &val, &len);
|
||||
if (r < 0) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,4 @@
|
|||
/*
|
||||
* vim: set tabstop=4:softtabstop=4:shiftwidth=4:noexpandtab
|
||||
*
|
||||
* MiracleCast - Wifi-Display/Miracast Implementation
|
||||
*
|
||||
* MiracleCast is free software; you can redistribute it and/or modify it
|
||||
|
|
@ -82,8 +80,6 @@ struct ctl_src {
|
|||
char *local;
|
||||
char *session;
|
||||
char url[256];
|
||||
// char *uibc_config;
|
||||
// char *uibc_setting;
|
||||
struct sockaddr_storage addr;
|
||||
size_t addr_size;
|
||||
int fd;
|
||||
|
|
|
|||
|
|
@ -253,6 +253,7 @@ void ctl_fn_peer_disconnected(struct ctl_peer *p);
|
|||
void ctl_fn_link_new(struct ctl_link *l);
|
||||
void ctl_fn_link_free(struct ctl_link *l);
|
||||
|
||||
void ctl_fn_src_playing(struct ctl_src *s);
|
||||
void ctl_fn_src_connected(struct ctl_src *s);
|
||||
void ctl_fn_src_disconnected(struct ctl_src *s);
|
||||
|
||||
|
|
|
|||
198
src/ctl/srcctl.c
198
src/ctl/srcctl.c
|
|
@ -33,8 +33,11 @@
|
|||
#include <systemd/sd-journal.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include "ctl.h"
|
||||
//#include "ctl-sink.h"
|
||||
#include "ctl-src.h"
|
||||
#include "wfd.h"
|
||||
#include "shl_macro.h"
|
||||
#include "shl_util.h"
|
||||
|
|
@ -47,12 +50,14 @@ static sd_event_source *scan_timeout;
|
|||
static sd_event_source *src_timeout;
|
||||
static unsigned int src_timeout_time;
|
||||
static bool src_connected;
|
||||
//static pid_t sink_pid;
|
||||
//
|
||||
static pid_t src_pid;
|
||||
|
||||
//static char *selected_ link;
|
||||
static struct ctl_link *running_link;
|
||||
static struct ctl_peer *running_peer;
|
||||
static struct ctl_peer *pending_peer;
|
||||
|
||||
void launch_sender(struct ctl_src *s);
|
||||
//
|
||||
//char *gst_scale_res;
|
||||
int gst_audio_en = 1;
|
||||
|
|
@ -452,109 +457,81 @@ static const struct cli_cmd cli_cmds[] = {
|
|||
{ "help", NULL, CLI_M, CLI_MORE, 0, NULL, "Print help" },
|
||||
{ },
|
||||
};
|
||||
//
|
||||
//static void spawn_gst(struct ctl_sink *s)
|
||||
//{
|
||||
// pid_t pid;
|
||||
// int fd_journal;
|
||||
// sigset_t mask;
|
||||
//
|
||||
// if (sink_pid > 0)
|
||||
// return;
|
||||
//
|
||||
// pid = fork();
|
||||
// if (pid < 0) {
|
||||
// return cli_vERRNO();
|
||||
// } else if (!pid) {
|
||||
// /* child */
|
||||
//
|
||||
// sigemptyset(&mask);
|
||||
// sigprocmask(SIG_SETMASK, &mask, NULL);
|
||||
//
|
||||
// /* redirect stdout/stderr to journal */
|
||||
// fd_journal = sd_journal_stream_fd("miracle-sinkctl-gst",
|
||||
// LOG_DEBUG,
|
||||
// false);
|
||||
// if (fd_journal >= 0) {
|
||||
// /* dup journal-fd to stdout and stderr */
|
||||
// dup2(fd_journal, 1);
|
||||
// dup2(fd_journal, 2);
|
||||
// } else {
|
||||
// /* no journal? redirect stdout to parent's stderr */
|
||||
// dup2(2, 1);
|
||||
// }
|
||||
//
|
||||
// launch_player(s);
|
||||
// _exit(1);
|
||||
// } else {
|
||||
// sink_pid = pid;
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//void launch_player(struct ctl_sink *s) {
|
||||
// char *argv[64];
|
||||
// char resolution[64];
|
||||
// char port[64];
|
||||
// char uibc_portStr[64];
|
||||
// int i = 0;
|
||||
// char* player;
|
||||
// if (uibc) {
|
||||
// player = "uibc-viewer";
|
||||
// } else {
|
||||
// player = "miracle-gst";
|
||||
// }
|
||||
//
|
||||
// argv[i++] = player;
|
||||
// if (uibc) {
|
||||
// argv[i++] = s->target;
|
||||
// sprintf(uibc_portStr, "%d", uibc_port);
|
||||
// argv[i++] = uibc_portStr;
|
||||
// }
|
||||
// if (cli_max_sev >= 7)
|
||||
// argv[i++] = "-d 3";
|
||||
// if (gst_audio_en)
|
||||
// argv[i++] = "-a";
|
||||
// if (gst_scale_res) {
|
||||
// argv[i++] = "-s";
|
||||
// argv[i++] = gst_scale_res;
|
||||
// }
|
||||
// argv[i++] = "-p";
|
||||
// sprintf(port, "%d", rstp_port);
|
||||
// argv[i++] = port;
|
||||
//
|
||||
|
||||
static void spawn_gst(struct ctl_src *s)
|
||||
{
|
||||
pid_t pid;
|
||||
int fd_journal;
|
||||
sigset_t mask;
|
||||
|
||||
if (src_pid > 0)
|
||||
return;
|
||||
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
return cli_vERRNO();
|
||||
} else if (!pid) {
|
||||
/* child */
|
||||
|
||||
sigemptyset(&mask);
|
||||
sigprocmask(SIG_SETMASK, &mask, NULL);
|
||||
|
||||
/* redirect stdout/stderr to journal */
|
||||
fd_journal = sd_journal_stream_fd("miracle-srcctl-gst",
|
||||
LOG_DEBUG,
|
||||
false);
|
||||
if (fd_journal >= 0) {
|
||||
/* dup journal-fd to stdout and stderr */
|
||||
dup2(fd_journal, 1);
|
||||
dup2(fd_journal, 2);
|
||||
} else {
|
||||
/* no journal? redirect stdout to parent's stderr */
|
||||
dup2(2, 1);
|
||||
}
|
||||
|
||||
launch_sender(s);
|
||||
_exit(1);
|
||||
} else {
|
||||
src_pid = pid;
|
||||
}
|
||||
}
|
||||
|
||||
void launch_sender(struct ctl_src *s) {
|
||||
char * argv[64];
|
||||
char resolution[64];
|
||||
char port[64];
|
||||
char uibc_portStr[64];
|
||||
int i = 0;
|
||||
|
||||
argv[i++] = "miracle-sender";
|
||||
//if (gst_audio_en) {
|
||||
// argv[i++] = "--acodec";
|
||||
// argv[i++] = "aac";
|
||||
//}
|
||||
argv[i++] = "--host";
|
||||
argv[i++] = inet_ntoa(((struct sockaddr_in *) &s->addr)->sin_addr);
|
||||
argv[i++] = "-p";
|
||||
sprintf(port, "%d", rstp_port);
|
||||
argv[i++] = port;
|
||||
|
||||
// if (s->hres && s->vres) {
|
||||
// sprintf(resolution, "%dx%d", s->hres, s->vres);
|
||||
// argv[i++] = "-r";
|
||||
// argv[i++] = resolution;
|
||||
// }
|
||||
//
|
||||
// argv[i] = NULL;
|
||||
//
|
||||
// i = 0;
|
||||
// int size = 0;
|
||||
// while (argv[i]) {
|
||||
// size += strlen(argv[i++] + 1);
|
||||
// }
|
||||
//
|
||||
// char* player_command = malloc(size);
|
||||
// i = 0;
|
||||
// strcpy(player_command, argv[i++]);
|
||||
// while (argv[i]) {
|
||||
// strcat(player_command, " ");
|
||||
// strcat(player_command, argv[i++]);
|
||||
// }
|
||||
// log_debug("player command: %s", player_command);
|
||||
// //free(player_command);
|
||||
// if (execvpe(argv[0], argv, environ) < 0) {
|
||||
// cli_debug("stream player failed (%d): %m", errno);
|
||||
// int i = 0;
|
||||
// cli_debug("printing environment: ");
|
||||
// while (environ[i]) {
|
||||
// cli_debug("%s", environ[i++]);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//
|
||||
|
||||
argv[i] = NULL;
|
||||
|
||||
if (execvpe(argv[0], argv, environ) < 0) {
|
||||
cli_debug("stream sender failed (%d): %m", errno);
|
||||
int i = 0;
|
||||
cli_debug("printing environment: ");
|
||||
while (environ[i]) {
|
||||
cli_debug("%s", environ[i++]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void launch_uibc_daemon(int port) {
|
||||
// char *argv[64];
|
||||
// char portStr[64];
|
||||
|
|
@ -571,11 +548,11 @@ static const struct cli_cmd cli_cmds[] = {
|
|||
//
|
||||
//static void kill_gst(void)
|
||||
//{
|
||||
// if (sink_pid <= 0)
|
||||
// if (src_pid <= 0)
|
||||
// return;
|
||||
//
|
||||
// kill(sink_pid, SIGTERM);
|
||||
// sink_pid = 0;
|
||||
// kill(src_pid, SIGTERM);
|
||||
// src_pid = 0;
|
||||
//}
|
||||
|
||||
void ctl_fn_src_connected(struct ctl_src *s)
|
||||
|
|
@ -595,12 +572,13 @@ void ctl_fn_src_disconnected(struct ctl_src *s)
|
|||
}
|
||||
}
|
||||
|
||||
//void ctl_fn_sink_resolution_set(struct ctl_sink *s)
|
||||
//{
|
||||
// cli_printf("SINK set resolution %dx%d\n", s->hres, s->vres);
|
||||
// if (sink_connected)
|
||||
// spawn_gst(s);
|
||||
//}
|
||||
void ctl_fn_src_playing(struct ctl_src *s)
|
||||
{
|
||||
cli_printf("SRC got play request\n");
|
||||
// TODO src_connected must be true, why if() failed?
|
||||
//if (src_connected)
|
||||
spawn_gst(s);
|
||||
}
|
||||
|
||||
void ctl_fn_peer_new(struct ctl_peer *p)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue