mirror of
https://github.com/albfan/miraclecast.git
synced 2025-03-09 23:38:56 +00:00
RTSP: parse SET_PARAMETER resolution
Signed-off-by: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
This commit is contained in:
parent
ca07b34f3b
commit
62460a9e89
3 changed files with 50 additions and 2 deletions
|
@ -35,6 +35,7 @@
|
||||||
#include "rtsp.h"
|
#include "rtsp.h"
|
||||||
#include "shl_macro.h"
|
#include "shl_macro.h"
|
||||||
#include "shl_util.h"
|
#include "shl_util.h"
|
||||||
|
#include "wfd.h"
|
||||||
|
|
||||||
struct ctl_sink {
|
struct ctl_sink {
|
||||||
sd_event *event;
|
sd_event *event;
|
||||||
|
@ -55,6 +56,9 @@ struct ctl_sink {
|
||||||
uint32_t resolutions_cea;
|
uint32_t resolutions_cea;
|
||||||
uint32_t resolutions_vesa;
|
uint32_t resolutions_vesa;
|
||||||
uint32_t resolutions_hh;
|
uint32_t resolutions_hh;
|
||||||
|
|
||||||
|
int hres;
|
||||||
|
int vres;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -190,6 +194,27 @@ static int sink_setup_fn(struct rtsp *bus, struct rtsp_message *m, void *data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sink_set_format(struct ctl_sink *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, hres, vres);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static void sink_handle_set_parameter(struct ctl_sink *s,
|
static void sink_handle_set_parameter(struct ctl_sink *s,
|
||||||
struct rtsp_message *m)
|
struct rtsp_message *m)
|
||||||
{
|
{
|
||||||
|
@ -197,6 +222,7 @@ static void sink_handle_set_parameter(struct ctl_sink *s,
|
||||||
const char *trigger;
|
const char *trigger;
|
||||||
const char *url;
|
const char *url;
|
||||||
char *nu;
|
char *nu;
|
||||||
|
unsigned int cea_res, vesa_res, hh_res;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
r = rtsp_message_new_reply_for(m, &rep, RTSP_CODE_OK, NULL);
|
r = rtsp_message_new_reply_for(m, &rep, RTSP_CODE_OK, NULL);
|
||||||
|
@ -227,6 +253,15 @@ static void sink_handle_set_parameter(struct ctl_sink *s,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* M4 again */
|
||||||
|
r = rtsp_message_read(m, "{<****hhh>}", "wfd_video_formats",
|
||||||
|
&cea_res, &vesa_res, &hh_res);
|
||||||
|
if (r == 0) {
|
||||||
|
r = sink_set_format(s, cea_res, vesa_res, hh_res);
|
||||||
|
if (r)
|
||||||
|
return cli_vERR(r);
|
||||||
|
}
|
||||||
|
|
||||||
/* M5 */
|
/* M5 */
|
||||||
r = rtsp_message_read(m, "{<s>}", "wfd_trigger_method", &trigger);
|
r = rtsp_message_read(m, "{<s>}", "wfd_trigger_method", &trigger);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
|
|
@ -266,6 +266,7 @@ void ctl_fn_link_free(struct ctl_link *l);
|
||||||
|
|
||||||
void ctl_fn_sink_connected(struct ctl_sink *s);
|
void ctl_fn_sink_connected(struct ctl_sink *s);
|
||||||
void ctl_fn_sink_disconnected(struct ctl_sink *s);
|
void ctl_fn_sink_disconnected(struct ctl_sink *s);
|
||||||
|
void ctl_fn_sink_resolution_set(struct ctl_sink *s, int hres, int vres);
|
||||||
|
|
||||||
void cli_fn_help(void);
|
void cli_fn_help(void);
|
||||||
|
|
||||||
|
|
|
@ -325,9 +325,10 @@ static const struct cli_cmd cli_cmds[] = {
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void spawn_gst(void)
|
static void spawn_gst(int hres, int vres)
|
||||||
{
|
{
|
||||||
char *argv[64];
|
char *argv[64];
|
||||||
|
char resolution[64];
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int fd_journal, i;
|
int fd_journal, i;
|
||||||
sigset_t mask;
|
sigset_t mask;
|
||||||
|
@ -367,6 +368,11 @@ static void spawn_gst(void)
|
||||||
argv[i++] = "-s";
|
argv[i++] = "-s";
|
||||||
argv[i++] = gst_scale_res;
|
argv[i++] = gst_scale_res;
|
||||||
}
|
}
|
||||||
|
if (hres && vres) {
|
||||||
|
sprintf(resolution, "%dx%d", hres, vres);
|
||||||
|
argv[i++] = "-r";
|
||||||
|
argv[i++] = resolution;
|
||||||
|
}
|
||||||
argv[i] = NULL;
|
argv[i] = NULL;
|
||||||
|
|
||||||
execve(argv[0], argv, environ);
|
execve(argv[0], argv, environ);
|
||||||
|
@ -389,7 +395,6 @@ void ctl_fn_sink_connected(struct ctl_sink *s)
|
||||||
{
|
{
|
||||||
cli_notice("SINK connected");
|
cli_notice("SINK connected");
|
||||||
sink_connected = true;
|
sink_connected = true;
|
||||||
spawn_gst();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctl_fn_sink_disconnected(struct ctl_sink *s)
|
void ctl_fn_sink_disconnected(struct ctl_sink *s)
|
||||||
|
@ -403,6 +408,13 @@ void ctl_fn_sink_disconnected(struct ctl_sink *s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ctl_fn_sink_resolution_set(struct ctl_sink *s, int hres, int vres)
|
||||||
|
{
|
||||||
|
cli_printf("SINK set resolution %dx%d\n", hres, vres);
|
||||||
|
if (sink_connected)
|
||||||
|
spawn_gst(hres, vres);
|
||||||
|
}
|
||||||
|
|
||||||
void ctl_fn_peer_new(struct ctl_peer *p)
|
void ctl_fn_peer_new(struct ctl_peer *p)
|
||||||
{
|
{
|
||||||
if (p->l != running_link || shl_isempty(p->wfd_subelements))
|
if (p->l != running_link || shl_isempty(p->wfd_subelements))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue