# HG changeset patch # User jbr # Date 1236302711 0 # Node ID b980183eb831d890fd2f34fad11bc5f16b3b473c # Parent de31b10455cc73d30431c33af49d11fe71b375cc flacdec: Add a shared function for parsing a FLAC metadata block header. diff -r de31b10455cc -r b980183eb831 flac.h --- a/flac.h Fri Mar 06 00:54:49 2009 +0000 +++ b/flac.h Fri Mar 06 01:25:11 2009 +0000 @@ -83,4 +83,14 @@ enum FLACExtradataFormat *format, uint8_t **streaminfo_start); +/** + * Parse the metadata block parameters from the header. + * @param[in] block_header header data, at least 4 bytes + * @param[out] last indicator for last metadata block + * @param[out] type metadata block type + * @param[out] size metadata block size + */ +void ff_flac_parse_block_header(const uint8_t *block_header, + int *last, int *type, int *size); + #endif /* AVCODEC_FLAC_H */ diff -r de31b10455cc -r b980183eb831 flacdec.c --- a/flacdec.c Fri Mar 06 00:54:49 2009 +0000 +++ b/flacdec.c Fri Mar 06 01:25:11 2009 +0000 @@ -220,6 +220,18 @@ dump_headers(avctx, s); } +void ff_flac_parse_block_header(const uint8_t *block_header, + int *last, int *type, int *size) +{ + int tmp = bytestream_get_byte(&block_header); + if (last) + *last = tmp & 0x80; + if (type) + *type = tmp & 0x7F; + if (size) + *size = bytestream_get_be24(&block_header); +} + /** * Parse the STREAMINFO from an inline header. * @param s the flac decoding context @@ -235,14 +247,12 @@ /* need more data */ return 0; } - buf += 4; - metadata_type = bytestream_get_byte(&buf) & 0x7F; - metadata_size = bytestream_get_be24(&buf); + ff_flac_parse_block_header(&buf[4], NULL, &metadata_type, &metadata_size); if (metadata_type != FLAC_METADATA_TYPE_STREAMINFO || metadata_size != FLAC_STREAMINFO_SIZE) { return AVERROR_INVALIDDATA; } - ff_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s, buf); + ff_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s, &buf[8]); allocate_buffers(s); s->got_streaminfo = 1; @@ -262,8 +272,8 @@ buf += 4; do { - metadata_last = bytestream_get_byte(&buf) & 0x80; - metadata_size = bytestream_get_be24(&buf); + ff_flac_parse_block_header(buf, &metadata_last, NULL, &metadata_size); + buf += 4; if (buf + metadata_size > buf_end) { /* need more data in order to read the complete header */ return 0;