On 16/09/13 17:22, Josh Allmann wrote:
> On 16 September 2013 05:00, Luca Barbato <[email protected]> wrote:
>> Will be reused for supporting play.
>> ---
>>  libavformat/rtmpproto.c | 118 
>> ++++++++++++++++++++++++++++++------------------
>>  1 file changed, 75 insertions(+), 43 deletions(-)
>>
>> diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
>> index 48eed56..771d31f 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);
> 
> Maybe replace the direct usage filename with a snprintf into statusmsg
> to constrain the length.

Alternatively ff_amf_write_string can use something different from strlen.

Anyway I'd do that in yet another patch.

lu

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to