diff options
author | Jordi Ortiz <nenjordi@gmail.com> | 2012-08-01 11:25:19 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2012-08-02 14:06:44 +0200 |
commit | 50468f93e3940ba78836dfdac5165c20ae75327a (patch) | |
tree | 9ecdf69ddb838f5c3e58eb6a59ea31bb82bd43e7 /libavformat | |
parent | cfb1091898684e1b433ef138c83389ba4390c9b7 (diff) | |
download | ffmpeg-streaming-50468f93e3940ba78836dfdac5165c20ae75327a.zip ffmpeg-streaming-50468f93e3940ba78836dfdac5165c20ae75327a.tar.gz |
rtmp: add functions for reading AMF values
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/rtmppkt.c | 45 | ||||
-rw-r--r-- | libavformat/rtmppkt.h | 42 |
2 files changed, 87 insertions, 0 deletions
diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c index 4ce238d..f69ce82 100644 --- a/libavformat/rtmppkt.c +++ b/libavformat/rtmppkt.c @@ -71,6 +71,51 @@ void ff_amf_write_object_end(uint8_t **dst) bytestream_put_be24(dst, AMF_DATA_TYPE_OBJECT_END); } +int ff_amf_read_bool(GetByteContext *bc, int *val) +{ + if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_BOOL) + return AVERROR_INVALIDDATA; + *val = bytestream2_get_byte(bc); + return 0; +} + +int ff_amf_read_number(GetByteContext *bc, double *val) +{ + uint64_t read; + if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_NUMBER) + return AVERROR_INVALIDDATA; + read = bytestream2_get_be64(bc); + *val = av_int2double(read); + return 0; +} + +int ff_amf_read_string(GetByteContext *bc, uint8_t *str, + int strsize, int *length) +{ + int stringlen = 0; + int readsize; + if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_STRING) + return AVERROR_INVALIDDATA; + stringlen = bytestream2_get_be16(bc); + if (stringlen + 1 > strsize) + return AVERROR(EINVAL); + readsize = bytestream2_get_buffer(bc, str, stringlen); + if (readsize != stringlen) { + av_log(NULL, AV_LOG_WARNING, + "Unable to read as many bytes as AMF string signaled\n"); + } + str[readsize] = '\0'; + *length = FFMIN(stringlen, readsize); + return 0; +} + +int ff_amf_read_null(GetByteContext *bc) +{ + if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_NULL) + return AVERROR_INVALIDDATA; + return 0; +} + int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, int chunk_size, RTMPPacket *prev_pkt) { diff --git a/libavformat/rtmppkt.h b/libavformat/rtmppkt.h index a83d0fe..cd5be5a 100644 --- a/libavformat/rtmppkt.h +++ b/libavformat/rtmppkt.h @@ -231,6 +231,48 @@ void ff_amf_write_field_name(uint8_t **dst, const char *str); */ void ff_amf_write_object_end(uint8_t **dst); +/** + * Read AMF boolean value. + * + *@param[in,out] gbc GetByteContext initialized with AMF-formatted data + *@param[out] val 0 or 1 + *@return 0 on success or an AVERROR code on failure +*/ +int ff_amf_read_bool(GetByteContext *gbc, int *val); + +/** + * Read AMF number value. + * + *@param[in,out] gbc GetByteContext initialized with AMF-formatted data + *@param[out] val read value + *@return 0 on success or an AVERROR code on failure +*/ +int ff_amf_read_number(GetByteContext *gbc, double *val); + +/** + * Read AMF string value. + * + * Appends a trailing \0 to output string in order to + * ease later parsing. + * + *@param[in,out] gbc GetByteContext initialized with AMF-formatted data + *@param[out] str read string + *@param[in] strsize buffer size available to store the read string + *@param[out] length read string length + *@return 0 on success or an AVERROR code on failure +*/ +int ff_amf_read_string(GetByteContext *gbc, uint8_t *str, + int strsize, int *length); + +/** + * Read AMF NULL value. + * + *@param[in,out] gbc GetByteContext initialized with AMF-formatted data + *@return 0 on success or an AVERROR code on failure +*/ +int ff_amf_read_null(GetByteContext *gbc); + + /** @} */ // AMF funcs #endif /* AVFORMAT_RTMPPKT_H */ |