summaryrefslogtreecommitdiff
path: root/audio/quelcom/files/patch-lib::qmp3frameheader.cc
diff options
context:
space:
mode:
Diffstat (limited to 'audio/quelcom/files/patch-lib::qmp3frameheader.cc')
-rw-r--r--audio/quelcom/files/patch-lib::qmp3frameheader.cc289
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];
+ }
+
+