diff options
Diffstat (limited to 'audio/quelcom/files/patch-lib::qmp3frameheader.cc')
-rw-r--r-- | audio/quelcom/files/patch-lib::qmp3frameheader.cc | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/audio/quelcom/files/patch-lib::qmp3frameheader.cc b/audio/quelcom/files/patch-lib::qmp3frameheader.cc new file mode 100644 index 000000000000..5dab510576eb --- /dev/null +++ b/audio/quelcom/files/patch-lib::qmp3frameheader.cc @@ -0,0 +1,289 @@ +--- lib/qmp3frameheader.cc.orig Fri Feb 23 21:29:12 2001 ++++ lib/qmp3frameheader.cc Fri Feb 13 19:17:38 2004 +@@ -4,6 +4,7 @@ + + # include "qmp3frameheader.hh" + # include "qexception.hh" ++# include "endian.hh" + + #ifdef NLS + # include <locale.h> +@@ -46,21 +47,20 @@ + + static u_int32_t samplesPerFrame[4] = { 1152, 1152, 384, 0 }; + +-string qmp3frameheader::getLayer() { return string(layers[header->layer]);} +-u_int32_t qmp3frameheader::getSamplesPerFrame() { return samplesPerFrame[header->layer]; } +-string qmp3frameheader::getVersion() { return string(versions[header->version]);} ++string qmp3frameheader::getLayer() { return string(layers[header.layer]);} ++u_int32_t qmp3frameheader::getSamplesPerFrame() { return samplesPerFrame[header.layer]; } ++string qmp3frameheader::getVersion() { return string(versions[header.version]);} + + +-caddr_t qmp3frameheader::getMap() {return (caddr_t)header;} ++caddr_t qmp3frameheader::getMap() {return (caddr_t)mappedheader;} + void qmp3frameheader::remap(caddr_t p) { +- +- header = (struct header*)p; ++ setHeader(p); + } + +-u_int32_t qmp3frameheader::getSignature() {return (*(u_int32_t*)header)&MASK;} ++u_int32_t qmp3frameheader::getSignature() {return letohl(*(u_int32_t *)mappedheader)&MASK;} + u_int32_t qmp3frameheader::getSampleRate() { + +- return samplerates[header->version][header->samplerate]; ++ return samplerates[header.version][header.samplerate]; + } + + +@@ -76,28 +76,32 @@ + + + bool qmp3frameheader::valid (caddr_t p) { ++ struct header header; ++ ++ if (p == NULL) ++ return false; + +- struct header *header = (struct header*)p; ++ copyHeader(&header, p); + +- return ( (header->sync1 == 0xff) && +- (header->sync2 == 0x7) && +- (header->version != UNDEFINED_VERSION) && +- (header->layer != 0) && +- (header->bitrate != 0x0f) && +- (header->samplerate != 0x03) && +- (header->emphasis != 0x02) ); ++ return ( (header.sync1 == 0xff) && ++ (header.sync2 == 0x7) && ++ (header.version != UNDEFINED_VERSION) && ++ (header.layer != 0) && ++ (header.bitrate != 0x0f) && ++ (header.samplerate != 0x03) && ++ (header.emphasis != 0x02) ); + } + + + bool qmp3frameheader::valid () { + +- return ! ( (header->sync1 != 0xff) || +- (header->sync2 != 0x7) || +- (header->version == UNDEFINED_VERSION) || +- (header->layer == 0) || +- (header->bitrate == 0x0f) || +- (header->samplerate == 0x03) || +- (header->emphasis == 0x02) ); ++ return ! ( (header.sync1 != 0xff) || ++ (header.sync2 != 0x7) || ++ (header.version == UNDEFINED_VERSION) || ++ (header.layer == 0) || ++ (header.bitrate == 0x0f) || ++ (header.samplerate == 0x03) || ++ (header.emphasis == 0x02) ); + } + + +@@ -105,26 +109,28 @@ + + + bool qmp3frameheader::compatible(caddr_t p, u_int32_t signature) { +- return ((*(u_int32_t*)p)&(MASK)) == signature; ++ return (letohl(*(u_int32_t *)p)&MASK) == signature; + } + + + u_int32_t qmp3frameheader::setNext(u_int32_t bufsize) { ++ caddr_t supposed= (char*)mappedheader+getLength(); + +- caddr_t supposed= (char*)header+getLength(); ++ setHeader(seek_header(supposed,bufsize,getSignature())); + +- header = (struct header*) seek_header(supposed,bufsize,getSignature()); +- +- return (char*)header-(char*)supposed; ++ return (char*)mappedheader-(char*)supposed; + } + + u_int32_t qmp3frameheader::setNext(caddr_t endstream) { + +- caddr_t previous = (caddr_t) header; ++ caddr_t previous = (caddr_t) mappedheader; ++ caddr_t next; ++ ++ next = seek_header((char*)mappedheader+getLength(),(char*)endstream-(char*)mappedheader+1,getSignature()); + +- header = (struct header*) seek_header((char*)header+getLength(),(char*)endstream-(char*)header+1,getSignature()); ++ setHeader(next); + +- return (char*)header-(char*)previous-getLength(); ++ return (char*)mappedheader-(char*)previous-getLength(); + } + + +@@ -156,7 +162,59 @@ + + qmp3frameheader::qmp3frameheader(caddr_t p, u_int32_t bufsize, u_int32_t signature) { + +- header = (struct header*) seek_header(p,bufsize,signature); ++ setHeader(seek_header(p,bufsize,signature)); ++} ++ ++ ++void qmp3frameheader::setHeader(caddr_t p) ++{ ++ mappedheader = (struct header *)p; ++ copyHeader(&header, p); ++} ++ ++void qmp3frameheader::copyHeader(struct header *header, caddr_t p) ++{ ++ unsigned char b = *(unsigned char *)p; ++ ++ header->sync1 = b; ++ ++ b = *(++p); ++ header->protection = b & 0x1; ++ header->layer = (b>>1) & 0x3; ++ header->version = (b>>3) & 0x3; ++ header->sync2 = (b>>5) & 0x7; ++ ++ b = *(++p); ++ header->privat = b & 0x1; ++ header->padding = (b>>1) & 0x1; ++ header->samplerate = (b>>2) & 0x3; ++ header->bitrate = (b>>4) & 0xf; ++ ++ b = *(++p); ++ header->emphasis = b & 0x3; ++ header->original = (b>>2) & 0x1; ++ header->copyright = (b>>3) & 0x1; ++ header->mode_extension = (b>>4) & 0x3; ++ header->channel_mode = (b>>6) & 0x3; ++} ++ ++void qmp3frameheader::copyHeader(caddr_t p, struct header &header) ++{ ++ *(p++) = header.sync1; ++ ++ *(p++) = (header.protection | ++ header.layer << 1 | ++ header.version << 3 | ++ header.sync2 << 5); ++ *(p++) = (header.privat | ++ header.padding << 1 | ++ header.samplerate << 2 | ++ header.bitrate << 4); ++ *(p++) = (header.emphasis | ++ header.original << 2 | ++ header.copyright << 3 | ++ header.mode_extension << 4 | ++ header.channel_mode << 6); + } + + +@@ -164,20 +222,20 @@ + + switch (f) { + +- case SYNC1: return header->sync1; +- case SYNC2: return header->sync2; +- case _VERSION: return header->version; +- case LAYER: return header->layer; +- case PROTECTION: return header->protection; +- case BITRATE: return header->bitrate; +- case SAMPLERATE: return header->samplerate; +- case PADDING: return header->padding; +- case PRIVAT: return header->privat; +- case CHANNEL_MODE: return header->channel_mode; +- case MODE_EXTENSION: return header->mode_extension; +- case COPYRIGHT: return header->copyright; +- case ORIGINAL: return header->original; +- case EMPHASIS: return header->emphasis; ++ case SYNC1: return header.sync1; ++ case SYNC2: return header.sync2; ++ case _VERSION: return header.version; ++ case LAYER: return header.layer; ++ case PROTECTION: return header.protection; ++ case BITRATE: return header.bitrate; ++ case SAMPLERATE: return header.samplerate; ++ case PADDING: return header.padding; ++ case PRIVAT: return header.privat; ++ case CHANNEL_MODE: return header.channel_mode; ++ case MODE_EXTENSION: return header.mode_extension; ++ case COPYRIGHT: return header.copyright; ++ case ORIGINAL: return header.original; ++ case EMPHASIS: return header.emphasis; + default: + throw qexception(__PRETTY_FUNCTION__,_("invalid field")); + // i pintar el valor... +@@ -189,34 +247,35 @@ + + switch (f) { + +- case SYNC1: header->sync1 = v; break; +- case SYNC2: header->sync2 = v; break; +- case _VERSION: header->version = v; break; +- case LAYER: header->layer = v; break; +- case PROTECTION: header->protection = v; break; +- case BITRATE: header->bitrate = v; break; +- case SAMPLERATE: header->samplerate = v; break; +- case PADDING: header->padding = v; break; +- case PRIVAT: header->privat = v; break; +- case CHANNEL_MODE: header->channel_mode = v; break; +- case MODE_EXTENSION: header->mode_extension = v; break; +- case COPYRIGHT: header->copyright = v; break; +- case ORIGINAL: header->original = v; break; +- case EMPHASIS: header->emphasis = v; break; ++ case SYNC1: header.sync1 = v; break; ++ case SYNC2: header.sync2 = v; break; ++ case _VERSION: header.version = v; break; ++ case LAYER: header.layer = v; break; ++ case PROTECTION: header.protection = v; break; ++ case BITRATE: header.bitrate = v; break; ++ case SAMPLERATE: header.samplerate = v; break; ++ case PADDING: header.padding = v; break; ++ case PRIVAT: header.privat = v; break; ++ case CHANNEL_MODE: header.channel_mode = v; break; ++ case MODE_EXTENSION: header.mode_extension = v; break; ++ case COPYRIGHT: header.copyright = v; break; ++ case ORIGINAL: header.original = v; break; ++ case EMPHASIS: header.emphasis = v; break; + default: + throw qexception(__PRETTY_FUNCTION__,_("invalid field")); + // i pintar el valor... + } ++ copyHeader((caddr_t)mappedheader, header); + } + + + u_int32_t qmp3frameheader::getLength() { + +- if (header->layer!=LAYER3) ++ if (header.layer!=LAYER3) + throw qexception (__PRETTY_FUNCTION__,_("layer not supported")); + // i dir quin valor... + +- return (144 * getBitRate() * 1000) / getSampleRate() + header->padding; ++ return (144 * getBitRate() * 1000) / getSampleRate() + header.padding; + } + + u_int32_t qmp3frameheader::getMsDuration() { +@@ -236,13 +295,13 @@ + + u_int32_t qmp3frameheader::getBitRate() { + +- if (header->layer!=LAYER3) ++ if (header.layer!=LAYER3) + throw qexception (__PRETTY_FUNCTION__,_("only layer III is supported")); + +- if (header->version==UNDEFINED_VERSION) ++ if (header.version==UNDEFINED_VERSION) + throw qexception (__PRETTY_FUNCTION__,_("undefined version")); + +- return layer3_bitrates[header->version][header->bitrate]; ++ return layer3_bitrates[header.version][header.bitrate]; + } + + |