From e9b267ae024b887e0cb1ecb69b0aad3fd671bf7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 26 Mar 2010 14:55:53 +0100 Subject: [PATCH] flacdec: Improve debugging and add some FIXMEs --- ext/flac/gstflacdec.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/ext/flac/gstflacdec.c b/ext/flac/gstflacdec.c index 309854ab60..e20c3f26ca 100644 --- a/ext/flac/gstflacdec.c +++ b/ext/flac/gstflacdec.c @@ -436,6 +436,10 @@ gst_flac_dec_scan_got_frame (GstFlacDec * flacdec, guint8 * data, guint size, else if (sr == 0x0D || sr == 0x0E) sr_from_end = 16; + /* FIXME: This is can be 36 bit if variable block size is used, + * fortunately not encoder supports this yet and we check for that + * above. + */ val = (guint32) g_utf8_get_char_validated ((gchar *) data + 4, -1); if (val == (guint32) - 1 || val == (guint32) - 2) { @@ -446,16 +450,22 @@ gst_flac_dec_scan_got_frame (GstFlacDec * flacdec, guint8 * data, guint size, headerlen = 4 + g_unichar_to_utf8 ((gunichar) val, NULL) + (bs_from_end / 8) + (sr_from_end / 8); - if (gst_flac_calculate_crc8 (data, headerlen) != data[headerlen]) + if (gst_flac_calculate_crc8 (data, headerlen) != data[headerlen]) { + GST_LOG_OBJECT (flacdec, "invalid checksum"); return FALSE; + } if (flacdec->min_blocksize == flacdec->max_blocksize) { *last_sample_num = (val + 1) * flacdec->min_blocksize; } else { - *last_sample_num = val; /* FIXME: + length of last block in samples */ + *last_sample_num = 0; /* FIXME: + length of last block in samples */ } - if (flacdec->sample_rate > 0) { + /* FIXME: only valid for fixed block size streams */ + GST_DEBUG_OBJECT (flacdec, "frame number: %" G_GINT64_FORMAT, + *last_sample_num); + + if (flacdec->sample_rate > 0 && *last_sample_num != 0) { GST_DEBUG_OBJECT (flacdec, "last sample %" G_GINT64_FORMAT " = %" GST_TIME_FORMAT, *last_sample_num, GST_TIME_ARGS (*last_sample_num * GST_SECOND / flacdec->sample_rate)); @@ -470,7 +480,6 @@ static void gst_flac_dec_scan_for_last_block (GstFlacDec * flacdec, gint64 * samples) { GstFormat format = GST_FORMAT_BYTES; - gint64 file_size, offset; GST_INFO_OBJECT (flacdec, "total number of samples unknown, scanning file"); @@ -480,6 +489,12 @@ gst_flac_dec_scan_for_last_block (GstFlacDec * flacdec, gint64 * samples) return; } + if (flacdec->min_blocksize != flacdec->max_blocksize) { + GST_WARNING_OBJECT (flacdec, "scanning for last sample only works " + "for FLAC files with constant blocksize"); + return; + } + GST_DEBUG_OBJECT (flacdec, "upstream size: %" G_GINT64_FORMAT, file_size); offset = file_size - 1;