X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=wma_common.c;h=ee7f451eebbadd65bac712baf1cc042879452281;hp=5ea92c73948f70a66ff80aa830adba857f582a4f;hb=4744d937c4160898d1fe151257606430750e580c;hpb=03900fe178fa1dc6b371424c8a96f91be52877e2;ds=inline diff --git a/wma_common.c b/wma_common.c index 5ea92c73..ee7f451e 100644 --- a/wma_common.c +++ b/wma_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Andre Noll + * Copyright (C) 2009-2012 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -21,17 +21,27 @@ #include "imdct.h" #include "wma.h" -const char *search_pattern(const char *pattern, int pattern_len, const char *buf, int buf_size) +/** + * Find the first occurrence of the given pattern. + * + * \param pattern The pattern to search for. + * \param pattern_len The length of the pattern in bytes. + * \param buf The buffer to search for the pattern. + * \param buf_size The number of bytes in \a buf. + * + * \return A pointer into \a buf or \p NULL if the pattern was not found. + */ +const char *search_pattern(const char *pattern, int pattern_len, + const char *buf, int buf_size) { const char *p, *end = buf + buf_size; - if (pattern_len > buf_size) - return NULL; + /* TODO: Use suffix arrays to speed up the search. */ for (p = buf; p + pattern_len < end; p++) { if (memcmp(p, pattern, pattern_len)) continue; PARA_DEBUG_LOG("found %d byte pattern@%d\n", - pattern_len, p - buf); + pattern_len, (int)(p - buf)); return p; } PARA_NOTICE_LOG("%d byte pattern not found\n", pattern_len); @@ -48,11 +58,11 @@ static int find_audio_stream_info(const char *buf, int len) if (!p) return -E_WMA_NO_GUID; - PARA_DEBUG_LOG("found audio stream guid@%0zx\n", p - buf); - return p - buf; + PARA_DEBUG_LOG("found audio stream guid@%0x\n", (int)(p - buf)); + return p - buf + 16; } -static int read_header_len(char *buf, int len) +static int read_header_len(const char *buf, int len) { uint16_t header_len; @@ -64,13 +74,19 @@ static int read_header_len(char *buf, int len) } /** + * Read an asf audio file header. + * + * \param buf The input buffer. + * \param loaded Number of bytes in \a buf. + * \param ahi Result pointer. + * * \return Negative on errors, zero if more data is needed in order to read the - * full header. Positive header length on success. + * full header, 1 on success. */ -int read_asf_header(char *buf, int loaded, struct asf_header_info *ahi) +int read_asf_header(const char *buf, int loaded, struct asf_header_info *ahi) { int ret; - char *start; + const char *start; ahi->header_len = read_header_len(buf, loaded); if (ahi->header_len == 0) /* too short to read header len */ @@ -80,9 +96,10 @@ int read_asf_header(char *buf, int loaded, struct asf_header_info *ahi) ret = find_audio_stream_info(buf, ahi->header_len); if (ret < 0) return ret; - ahi->audio_stream_info_start = ret + 16; + if (ret + 62 > loaded) + return 0; + ahi->audio_stream_info_start = ret; start = buf + ahi->audio_stream_info_start; - ahi->channels = ((uint8_t *)start)[40]; ahi->sample_rate = read_u16(start + 42); PARA_NOTICE_LOG("%d channels, sample rate: %d\n", ahi->channels, @@ -101,7 +118,7 @@ int read_asf_header(char *buf, int loaded, struct asf_header_info *ahi) return 1; } -const uint8_t log2_tab[256] = { +static const uint8_t log2_tab[256] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -120,7 +137,14 @@ const uint8_t log2_tab[256] = { 7, 7, 7, 7, 7, 7, 7, 7 }; -int wma_log2(unsigned int v) +/** + * Compute the base-2 logarithm. + * + * \param v The value to compute the logarithm of. + * + * \return An integer approximation of log2(v). + */ +__a_const int wma_log2(unsigned int v) { int n = 0; if (v & 0xffff0000) {