1
0
Fork 0
mirror of https://github.com/albfan/miraclecast.git synced 2025-03-09 23:38:56 +00:00

ctl: divide M6 (SETUP) and M7 (PLAY) stages

In M7 message session ID should be included. Session ID is returned in M6
response. So we should wait for M6 response.

Signed-off-by: Andrey Gusakov <adnrey.gusakov@cogentembedded.com>
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
Andrey Gusakov 2014-06-27 06:07:57 +04:00 committed by David Herrmann
parent 67de17a511
commit 40484a022a

View file

@ -40,6 +40,7 @@ struct ctl_sink {
sd_event *event;
char *target;
char *session;
struct sockaddr_storage addr;
size_t addr_size;
int fd;
@ -134,6 +135,48 @@ static void sink_handle_get_parameter(struct ctl_sink *s,
return cli_vERR(r);
}
static int sink_setup_fn(struct rtsp *bus, struct rtsp_message *m, void *data)
{
_rtsp_message_unref_ struct rtsp_message *rep = NULL;
struct ctl_sink *s = data;
const char *session;
char *ns;
int r;
cli_debug("INCOMING: %s\n", rtsp_message_get_raw(m));
r = rtsp_message_read(m, "<s>", "Session", &session);
if (r < 0)
return cli_ERR(r);
ns = strdup(session);
if (!ns)
return cli_ENOMEM();
free(s->session);
s->session = ns;
r = rtsp_message_new_request(s->rtsp,
&rep,
"PLAY",
"rtsp://localhost/wfd1.0/streamid=0");
if (r < 0)
return cli_ERR(r);
r = rtsp_message_append(rep, "<s>", "Session", s->session);
if (r < 0)
return cli_ERR(r);
rtsp_message_seal(rep);
cli_debug("OUTGOING: %s\n", rtsp_message_get_raw(rep));
r = rtsp_call_async(s->rtsp, rep, sink_req_fn, NULL, 0, NULL);
if (r < 0)
return cli_ERR(r);
return 0;
}
static void sink_handle_set_parameter(struct ctl_sink *s,
struct rtsp_message *m)
{
@ -176,24 +219,7 @@ static void sink_handle_set_parameter(struct ctl_sink *s,
rtsp_message_seal(rep);
cli_debug("OUTGOING: %s\n", rtsp_message_get_raw(rep));
r = rtsp_call_async(s->rtsp, rep, sink_req_fn, NULL, 0, NULL);
if (r < 0)
return cli_vERR(r);
rtsp_message_unref(rep);
rep = NULL;
r = rtsp_message_new_request(s->rtsp,
&rep,
"PLAY",
"rtsp://localhost/wfd1.0/streamid=0");
if (r < 0)
return cli_vERR(r);
rtsp_message_seal(rep);
cli_debug("OUTGOING: %s\n", rtsp_message_get_raw(rep));
r = rtsp_call_async(s->rtsp, rep, sink_req_fn, NULL, 0, NULL);
r = rtsp_call_async(s->rtsp, rep, sink_setup_fn, s, 0, NULL);
if (r < 0)
return cli_vERR(r);
}
@ -406,6 +432,7 @@ void ctl_sink_free(struct ctl_sink *s)
ctl_sink_close(s);
free(s->target);
free(s->session);
sd_event_unref(s->event);
free(s);
}