+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_get_string(GetByteContext *bc, uint8_t *str,
+ int strsize, int *length)
+{
+ int stringlen = 0;
+ int readsize;
+ 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_string(GetByteContext *bc, uint8_t *str,
+ int strsize, int *length)
+{
+ if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_STRING)
+ return AVERROR_INVALIDDATA;
+ return ff_amf_get_string(bc, str, strsize, length);
+}
+
+int ff_amf_read_null(GetByteContext *bc)
+{
+ if (bytestream2_get_byte(bc) != AMF_DATA_TYPE_NULL)
+ return AVERROR_INVALIDDATA;
+ return 0;
+}
+
+int ff_rtmp_check_alloc_array(RTMPPacket **prev_pkt, int *nb_prev_pkt,
+ int channel)
+{
+ int nb_alloc;
+ RTMPPacket *ptr;
+ if (channel < *nb_prev_pkt)
+ return 0;
+
+ nb_alloc = channel + 16;
+ // This can't use the av_reallocp family of functions, since we
+ // would need to free each element in the array before the array
+ // itself is freed.
+ ptr = av_realloc_array(*prev_pkt, nb_alloc, sizeof(**prev_pkt));
+ if (!ptr)
+ return AVERROR(ENOMEM);
+ memset(ptr + *nb_prev_pkt, 0, (nb_alloc - *nb_prev_pkt) * sizeof(*ptr));
+ *prev_pkt = ptr;
+ *nb_prev_pkt = nb_alloc;
+ return 0;
+}
+