On 16/09/13 11:19, Martin Storsjö wrote:
> On Sun, 15 Sep 2013, Luca Barbato wrote:
>
>> Will be reused for supporting play.
>> ---
>> libavformat/rtmpproto.c | 121
>> +++++++++++++++++++++++++++++++-----------------
>> 1 file changed, 78 insertions(+), 43 deletions(-)
>>
>> diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
>> index 48eed56..03f5761 100644
>> --- a/libavformat/rtmpproto.c
>> +++ b/libavformat/rtmpproto.c
>> @@ -1764,13 +1764,84 @@ static int handle_invoke_error(URLContext *s,
>> RTMPPacket *pkt)
>> return ret;
>> }
>>
>> +static int write_begin(URLContext *s)
>> +{
>> + RTMPContext *rt = s->priv_data;
>> + PutByteContext pbc;
>> + RTMPPacket spkt = { 0 };
>> + int ret;
>> +
>> + // Send Stream Begin 1
>> + if ((ret = ff_rtmp_packet_create(&spkt, RTMP_NETWORK_CHANNEL,
>> + RTMP_PT_PING, 0, 6)) < 0) {
>> + av_log(s, AV_LOG_ERROR, "Unable to create response packet\n");
>> + return ret;
>> + }
>> +
>> + bytestream2_init_writer(&pbc, spkt.data, spkt.size);
>> + bytestream2_put_be16(&pbc, 0); // 0 -> Stream Begin
>> + bytestream2_put_be32(&pbc, rt->nb_streamid);
>> +
>> + ret = ff_rtmp_packet_write(rt->stream, &spkt, rt->out_chunk_size,
>> + rt->prev_pkt[1]);
>> +
>> + ff_rtmp_packet_destroy(&spkt);
>> +
>> + return ret;
>> +}
>> +
>> +static int write_status(URLContext *s, RTMPPacket *pkt,
>> + const char *status, const char *filename)
>> +{
>> + RTMPContext *rt = s->priv_data;
>> + RTMPPacket spkt = { 0 };
>> + char statusmsg[128];
>> + uint8_t *pp;
>> + int ret;
>> +
>> + if ((ret = ff_rtmp_packet_create(&spkt, RTMP_SYSTEM_CHANNEL,
>> + RTMP_PT_INVOKE, 0,
>> + RTMP_PKTDATA_DEFAULT_SIZE)) < 0) {
>> + av_log(s, AV_LOG_ERROR, "Unable to create response packet\n");
>> + return ret;
>> + }
>> +
>> + pp = spkt.data;
>> + spkt.extra = pkt->extra;
>> + ff_amf_write_string(&pp, "onStatus");
>> + ff_amf_write_number(&pp, 0);
>> + ff_amf_write_null(&pp);
>> +
>> + ff_amf_write_object_start(&pp);
>> + ff_amf_write_field_name(&pp, "level");
>> + ff_amf_write_string(&pp, "status");
>> + ff_amf_write_field_name(&pp, "code");
>> + ff_amf_write_string(&pp, status);
>> + ff_amf_write_field_name(&pp, "description");
>> + snprintf(statusmsg, sizeof(statusmsg),
>> + "%s is now published", filename);
>> + ff_amf_write_string(&pp, statusmsg);
>> + ff_amf_write_field_name(&pp, "details");
>> + ff_amf_write_string(&pp, filename);
>> + ff_amf_write_field_name(&pp, "clientid");
>> + snprintf(statusmsg, sizeof(statusmsg), "%s", LIBAVFORMAT_IDENT);
>> + ff_amf_write_string(&pp, statusmsg);
>> + ff_amf_write_object_end(&pp);
>> +
>> + spkt.size = pp - spkt.data;
>> + ret = ff_rtmp_packet_write(rt->stream, &spkt, rt->out_chunk_size,
>> + rt->prev_pkt[1]);
>> + ff_rtmp_packet_destroy(&spkt);
>> +
>> + return ret;
>> +}
>> +
>> static int send_invoke_response(URLContext *s, RTMPPacket *pkt)
>> {
>> RTMPContext *rt = s->priv_data;
>> double seqnum;
>> char filename[64];
>> char command[64];
>> - char statusmsg[128];
>> int stringlen;
>> char *pchar;
>> const uint8_t *p = pkt->data;
>> @@ -1786,6 +1857,8 @@ static int send_invoke_response(URLContext *s,
>> RTMPPacket *pkt)
>> return AVERROR_INVALIDDATA;
>> }
>>
>> + av_log(s, AV_LOG_ERROR, "Command %s\n", command);
>> +
>
> Please don't include this debug logging in the commit
>
>> ret = ff_amf_read_number(&gbc, &seqnum);
>> if (ret)
>> return ret;
>> @@ -1823,52 +1896,13 @@ static int send_invoke_response(URLContext *s,
>> RTMPPacket *pkt)
>> pp = spkt.data;
>> ff_amf_write_string(&pp, "onFCPublish");
>> } else if (!strcmp(command, "publish")) {
>> - PutByteContext pbc;
>> - // Send Stream Begin 1
>> - if ((ret = ff_rtmp_packet_create(&spkt, RTMP_NETWORK_CHANNEL,
>> - RTMP_PT_PING, 0, 6)) < 0) {
>> - av_log(s, AV_LOG_ERROR, "Unable to create response
>> packet\n");
>> - return ret;
>> - }
>> - pp = spkt.data;
>> - bytestream2_init_writer(&pbc, pp, spkt.size);
>> - bytestream2_put_be16(&pbc, 0); // 0 -> Stream Begin
>> - bytestream2_put_be32(&pbc, rt->nb_streamid);
>> - ret = ff_rtmp_packet_write(rt->stream, &spkt,
>> rt->out_chunk_size,
>> - rt->prev_pkt[1]);
>> - ff_rtmp_packet_destroy(&spkt);
>> + ret = write_begin(s);
>> if (ret < 0)
>> return ret;
>>
>> // Send onStatus(NetStream.Publish.Start)
>> - if ((ret = ff_rtmp_packet_create(&spkt, RTMP_SYSTEM_CHANNEL,
>> - RTMP_PT_INVOKE, 0,
>> - RTMP_PKTDATA_DEFAULT_SIZE))
>> < 0) {
>> - av_log(s, AV_LOG_ERROR, "Unable to create response
>> packet\n");
>> - return ret;
>> - }
>> - spkt.extra = pkt->extra;
>> - pp = spkt.data;
>> - ff_amf_write_string(&pp, "onStatus");
>> - ff_amf_write_number(&pp, 0);
>> - ff_amf_write_null(&pp);
>> -
>> - ff_amf_write_object_start(&pp);
>> - ff_amf_write_field_name(&pp, "level");
>> - ff_amf_write_string(&pp, "status");
>> - ff_amf_write_field_name(&pp, "code");
>> - ff_amf_write_string(&pp, "NetStream.Publish.Start");
>> - ff_amf_write_field_name(&pp, "description");
>> - snprintf(statusmsg, sizeof(statusmsg),
>> - "%s is now published", filename);
>> - ff_amf_write_string(&pp, statusmsg);
>> - ff_amf_write_field_name(&pp, "details");
>> - ff_amf_write_string(&pp, filename);
>> - ff_amf_write_field_name(&pp, "clientid");
>> - snprintf(statusmsg, sizeof(statusmsg), "%s", LIBAVFORMAT_IDENT);
>> - ff_amf_write_string(&pp, statusmsg);
>> - ff_amf_write_object_end(&pp);
>> -
>> + return write_status(s, pkt, "NetStream.Publish.Start",
>> + filename);
>> } else {
>> if ((ret = ff_rtmp_packet_create(&spkt, RTMP_SYSTEM_CHANNEL,
>> RTMP_PT_INVOKE, 0,
>> @@ -2016,6 +2050,7 @@ static int handle_invoke(URLContext *s,
>> RTMPPacket *pkt)
>> ff_amf_match_string(pkt->data, pkt->size,
>> "FCPublish") ||
>> ff_amf_match_string(pkt->data, pkt->size,
>> "publish") ||
>> ff_amf_match_string(pkt->data, pkt->size,
>> "_checkbw") ||
>> + ff_amf_match_string(pkt->data, pkt->size,
>> "play") ||
>> ff_amf_match_string(pkt->data, pkt->size,
>> "createStream")) {
>> if ((ret = send_invoke_response(s, pkt)) < 0)
>> return ret;
>
> Doesn't this belong in patch 2/2?
>
> Other than this, this one looks ok.
You are right, I'll move the hunk where it belongs.
lu
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel