[vlc-commits] flac packetizer: simplify header parsing
Rafaël Carré
git at videolan.org
Sat Nov 16 01:12:00 CET 2013
vlc | branch: master | Rafaël Carré <funman at videolan.org> | Fri Nov 15 21:23:57 2013 +0100| [39e48a79fdeaada567219b81c4f6847e3efc0124] | committer: Rafaël Carré
flac packetizer: simplify header parsing
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=39e48a79fdeaada567219b81c4f6847e3efc0124
---
modules/packetizer/flac.c | 233 ++++++++++++++++-----------------------------
1 file changed, 81 insertions(+), 152 deletions(-)
diff --git a/modules/packetizer/flac.c b/modules/packetizer/flac.c
index 9de4b12..a7e7aeb 100644
--- a/modules/packetizer/flac.c
+++ b/modules/packetizer/flac.c
@@ -247,9 +247,6 @@ static int SyncInfo(decoder_t *p_dec, uint8_t *p_buf,
unsigned int * pi_bits_per_sample)
{
decoder_sys_t *p_sys = p_dec->p_sys;
- int i_header, i_temp, i_read;
- unsigned i_blocksize = 0;
- int i_blocksize_hint = 0, i_sample_rate_hint = 0;
/* Check syncword */
if (p_buf[0] != 0xFF || (p_buf[1] & 0xFE) != 0xF8)
@@ -260,184 +257,111 @@ static int SyncInfo(decoder_t *p_dec, uint8_t *p_buf,
return 0;
/* Find blocksize (framelength) */
- switch (i_temp = p_buf[2] >> 4) {
- case 0:
+ int blocksize_hint = 0;
+ unsigned blocksize = p_buf[2] >> 4;
+ if (blocksize >= 8) {
+ blocksize = 256 << (blocksize - 8);
+ } else if (blocksize == 0) { /* value 0 is reserved */
if (p_sys->b_stream_info &&
p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize)
- i_blocksize = p_sys->stream_info.min_blocksize;
- else return 0; /* We can't do anything with this */
- break;
-
- case 1:
- i_blocksize = 192;
- break;
-
- case 2:
- case 3:
- case 4:
- case 5:
- i_blocksize = 576 << (i_temp - 2);
- break;
-
- case 6:
- case 7:
- i_blocksize_hint = i_temp;
- break;
-
- case 8:
- case 9:
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- i_blocksize = 256 << (i_temp - 8);
- break;
+ blocksize = p_sys->stream_info.min_blocksize;
+ else
+ return 0; /* We can't do anything with this */
+ } else if (blocksize == 1) {
+ blocksize = 192;
+ } else if (blocksize == 6 || blocksize == 7) {
+ blocksize_hint = blocksize;
+ blocksize = 0;
+ } else /* 2, 3, 4, 5 */ {
+ blocksize = 576 << (blocksize - 2);
}
- if (p_sys->b_stream_info &&
- (i_blocksize < p_sys->stream_info.min_blocksize ||
- i_blocksize > p_sys->stream_info.max_blocksize))
- return 0;
+
+ if (p_sys->b_stream_info)
+ if (blocksize < p_sys->stream_info.min_blocksize ||
+ blocksize > p_sys->stream_info.max_blocksize)
+ return 0;
/* Find samplerate */
- switch (i_temp = p_buf[2] & 0x0f) {
- case 0:
+ int samplerate_hint = p_buf[2] & 0xf;;
+ unsigned int samplerate;
+ if (samplerate_hint == 0) {
if (p_sys->b_stream_info)
- *pi_sample_rate = p_sys->stream_info.sample_rate;
- else return 0; /* We can't do anything with this */
- break;
-
- case 1:
- *pi_sample_rate = 88200;
- break;
-
- case 2:
- *pi_sample_rate = 176400;
- break;
-
- case 3:
- *pi_sample_rate = 192000;
- break;
-
- case 4:
- *pi_sample_rate = 8000;
- break;
-
- case 5:
- *pi_sample_rate = 16000;
- break;
-
- case 6:
- *pi_sample_rate = 22050;
- break;
-
- case 7:
- *pi_sample_rate = 24000;
- break;
-
- case 8:
- *pi_sample_rate = 32000;
- break;
-
- case 9:
- *pi_sample_rate = 44100;
- break;
-
- case 10:
- *pi_sample_rate = 48000;
- break;
-
- case 11:
- *pi_sample_rate = 96000;
- break;
-
- case 12:
- case 13:
- case 14:
- i_sample_rate_hint = i_temp;
- break;
-
- case 15:
- return 0;
+ samplerate = p_sys->stream_info.sample_rate;
+ else
+ return 0; /* We can't do anything with this */
+ } else if (samplerate_hint == 15) {
+ return 0; /* invalid */
+ } else if (samplerate_hint < 12) {
+ static const int16_t flac_samplerate[12] = {
+ 0, 8820, 17640, 19200,
+ 800, 1600, 2205, 2400,
+ 3200, 4410, 4800, 9600,
+ };
+ samplerate = flac_samplerate[samplerate_hint] * 10;
+ } else {
+ samplerate = 0; /* at end of header */
}
/* Find channels */
- i_temp = (unsigned)(p_buf[3] >> 4);
- if (i_temp & 8) {
- if ((i_temp & 7) >= 3)
+ unsigned channels = p_buf[3] >> 4;
+ if (channels >= 8) {
+ if (channels >= 11) /* reserved */
return 0;
- *pi_channels = 2;
+ channels = 2;
} else
- *pi_channels = i_temp + 1;
+ channels++;
+
/* Find bits per sample */
- switch (i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1) {
- case 0:
+ static const int8_t flac_bits_per_sample[8] = {
+ 0, 8, 12, -1, 16, 20, 24, -1
+ };
+ int bits_per_sample = flac_bits_per_sample[(p_buf[3] & 0x0e) >> 1];
+ if (bits_per_sample == 0) {
if (p_sys->b_stream_info)
- *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
+ bits_per_sample = p_sys->stream_info.bits_per_sample;
else
return 0;
- break;
-
- case 1:
- *pi_bits_per_sample = 8;
- break;
-
- case 2:
- *pi_bits_per_sample = 12;
- break;
-
- case 4:
- *pi_bits_per_sample = 16;
- break;
-
- case 5:
- *pi_bits_per_sample = 20;
- break;
+ } else if (bits_per_sample < 0)
+ return 0;
- case 6:
- *pi_bits_per_sample = 24;
- break;
- case 3:
- case 7:
+ /* reserved for future use */
+ if (p_buf[3] & 0x01)
return 0;
- break;
- }
-
- /* Zero padding bit */
- if (p_buf[3] & 0x01) return 0;
/* End of fixed size header */
- i_header = 4;
+ int i_header = 4;
/* Check Sample/Frame number */
+ int i_read;
if (read_utf8(&p_buf[i_header++], &i_read) == INT64_C(0xffffffffffffffff))
return 0;
i_header += i_read;
/* Read blocksize */
- if (i_blocksize_hint) {
- int i_val1 = p_buf[i_header++];
- if (i_blocksize_hint == 7) {
- int i_val2 = p_buf[i_header++];
- i_val1 = (i_val1 << 8) | i_val2;
+ if (blocksize_hint) {
+ blocksize = p_buf[i_header++];
+ if (blocksize_hint == 7) {
+ blocksize <<= 8;
+ blocksize |= p_buf[i_header++];
}
- i_blocksize = i_val1 + 1;
+ blocksize++;
}
/* Read sample rate */
- if (i_sample_rate_hint) {
- int i_val1 = p_buf[i_header++];
- if (i_sample_rate_hint != 12) {
- int i_val2 = p_buf[i_header++];
- i_val1 = (i_val1 << 8) | i_val2;
+ if (samplerate == 0) {
+ samplerate = p_buf[i_header++];
+ if (samplerate_hint != 12) { /* 16 bits */
+ samplerate <<= 8;
+ samplerate |= p_buf[i_header++];
}
- if (i_sample_rate_hint == 12) *pi_sample_rate = i_val1 * 1000;
- else if (i_sample_rate_hint == 13) *pi_sample_rate = i_val1;
- else *pi_sample_rate = i_val1 * 10;
+
+ if (samplerate_hint == 12)
+ samplerate *= 1000;
+ else if (samplerate_hint == 14)
+ samplerate *= 10;
}
/* Check the CRC-8 byte */
@@ -446,15 +370,20 @@ static int SyncInfo(decoder_t *p_dec, uint8_t *p_buf,
/* Sanity check using stream info header when possible */
if (p_sys->b_stream_info) {
- if (i_blocksize < p_sys->stream_info.min_blocksize ||
- i_blocksize > p_sys->stream_info.max_blocksize)
+ if (blocksize < p_sys->stream_info.min_blocksize ||
+ blocksize > p_sys->stream_info.max_blocksize)
return 0;
- if (*pi_bits_per_sample != p_sys->stream_info.bits_per_sample)
+ if ((unsigned)bits_per_sample != p_sys->stream_info.bits_per_sample)
return 0;
- if (*pi_sample_rate != p_sys->stream_info.sample_rate)
+ if (samplerate != p_sys->stream_info.sample_rate)
return 0;
}
- return i_blocksize;
+
+ *pi_bits_per_sample = bits_per_sample;
+ *pi_sample_rate = samplerate;
+ *pi_channels = channels;
+
+ return blocksize;
}
/* */
More information about the vlc-commits
mailing list