+ dump_headers(s);
+}
+
+/**
+ * Parse a list of metadata blocks. This list of blocks must begin with
+ * the fLaC marker.
+ * @param s the flac decoding context containing the gb bit reader used to
+ * parse metadata
+ * @return 1 if some metadata was read, 0 if no fLaC marker was found
+ */
+static int metadata_parse(FLACContext *s)
+{
+ int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0;
+
+ if (show_bits_long(&s->gb, 32) == MKBETAG('f','L','a','C')) {
+ skip_bits(&s->gb, 32);
+
+ av_log(s->avctx, AV_LOG_DEBUG, "STREAM HEADER\n");
+ do {
+ metadata_last = get_bits1(&s->gb);
+ metadata_type = get_bits(&s->gb, 7);
+ metadata_size = get_bits_long(&s->gb, 24);
+
+ av_log(s->avctx, AV_LOG_DEBUG,
+ " metadata block: flag = %d, type = %d, size = %d\n",
+ metadata_last, metadata_type, metadata_size);
+ if (metadata_size) {
+ switch (metadata_type) {
+ case METADATA_TYPE_STREAMINFO:
+ metadata_streaminfo(s);
+ streaminfo_updated = 1;
+ break;
+
+ default:
+ for (i=0; i<metadata_size; i++)
+ skip_bits(&s->gb, 8);
+ }
+ }
+ } while (!metadata_last);
+
+ if (streaminfo_updated)
+ allocate_buffers(s);
+ return 1;
+ }
+ return 0;