diff options
author | Christian Gmeiner <christian.gmeiner@gmail.com> | 2009-12-04 13:00:27 +0100 |
---|---|---|
committer | Christian Gmeiner <christian.gmeiner@gmail.com> | 2009-12-04 13:00:27 +0100 |
commit | d15c4b99f8ba0346fe724ba31adc41c227762723 (patch) | |
tree | 63d5df5779fedd83204bf6cad06c9ee94c0172e0 | |
parent | 67efb215bf774d66313fafa6b02fb742bf71fc61 (diff) | |
download | vdr-plugin-dxr3-d15c4b99f8ba0346fe724ba31adc41c227762723.tar.gz vdr-plugin-dxr3-d15c4b99f8ba0346fe724ba31adc41c227762723.tar.bz2 |
rework checking of mpeg audio header
-rw-r--r-- | dxr3audiodecoder.c | 76 | ||||
-rw-r--r-- | dxr3audiodecoder.h | 4 |
2 files changed, 44 insertions, 36 deletions
diff --git a/dxr3audiodecoder.c b/dxr3audiodecoder.c index 4547020..e7002db 100644 --- a/dxr3audiodecoder.c +++ b/dxr3audiodecoder.c @@ -60,9 +60,6 @@ cDxr3AudioDecoder::cDxr3AudioDecoder() : rbuf(50000), ac3dtsDecoder(&rbuf) esyslog("[dxr3-decoder] failed to open codec %s.", audio->name); exit(-1); } - - lastHeader[0] = 0xFF; - lastHeader[1] = lastHeader[2] = lastHeader[3] = 0; } // ================================== @@ -90,9 +87,7 @@ void cDxr3AudioDecoder::Init() foundHeader = false; decodeAudio = true; - - //lastHeader[0] = 0xFF; - //lastHeader[1] = lastHeader[2] = lastHeader[3] = 0; + lastBitrate = 0xff; // init with an invalid value - see checkMpegAudioHdr; } // ================================== @@ -105,22 +100,19 @@ void cDxr3AudioDecoder::Decode(cDxr3PesFrame *frame, uint32_t pts, cDxr3SyncBuff const uint8_t *buf = frame->GetPayload(); int length = frame->GetPayloadLength(); - for (int i = 0; i < length-4 && !foundHeader; i++) { - unsigned int tempHead = *((unsigned int*)(buf+i)); - if (HeadCheck(tempHead)) { - if ((buf[i+2] & 0xFC) != (lastHeader[2] & 0xFC)) { - dsyslog("dxr3: audiodecoder: found different audio header" - " (new: %#x, old: %#x), (re)initializing", - *((uint32_t*) lastHeader), *((uint32_t*) (buf+i))); + if (checkMpegAudioHdr(buf)) { + + // look if Bitrate has changed + if ((buf[2] & 0xf0) != (lastBitrate & 0xf0)) { + dsyslog("[dxr3-audiodecoder] found new audio header"); + // we need now to reinit the deocder and to store the new + // part from the audio header Init(); - lastHeader[0] = buf[i]; - lastHeader[1] = buf[i+1]; - lastHeader[2] = buf[i+2]; - lastHeader[3] = buf[i+3]; - } - foundHeader = true; + lastBitrate = buf[2]; } + + foundHeader = true; } if (audioSynched) { @@ -281,24 +273,40 @@ void cDxr3AudioDecoder::decode(cDxr3PesFrame *frame) // ================================== //! checking routine -bool cDxr3AudioDecoder::HeadCheck(unsigned long head) +bool cDxr3AudioDecoder::checkMpegAudioHdr(const uint8_t *head) { - bool retval = false; - - uint8_t* phead = (uint8_t*) (&head); - if (phead[0] != 0xFF) { - retval = false; - } else if (phead[1] != 0xFC && phead[1] != 0xFE) { - retval = false; - } else if ((phead[2] & 0xF0) == 0xF0) { - retval = false; - } else if ((phead[2] & 0xC) == 0xC) { - retval = false; - } else { - retval = true; + // all informations about the mpeg audio header + // can be found at http://www.datavoyage.com/mpgscript/mpeghdr.htm + + // the header conists of four 8bit elements, described as + // AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM + + // all As must be set to 1 + if (head[0] != 0xff || (head[1] & 0xe0) != 0xe0) { + return false; + } + + // B is not allowed to be 01 (bits), as it is a reserved value + if ((head[1] & 0x18) == 0x8) { + return false; + } + + // C is not allowed to be 00 (bits), as it is a reserved value + if ((head[1] & 0x6) == 0x0) { + return false; + } + + // all Es are not allowed to be 1 + if ((head[2] & 0xf0) == 0xf0) { + return false; + } + + // all Fs are not allowed to be 1 + if ((head[2] & 0xc) == 0xc) { + return false; } - return retval; + return true; } // Local variables: diff --git a/dxr3audiodecoder.h b/dxr3audiodecoder.h index 6216579..55437c8 100644 --- a/dxr3audiodecoder.h +++ b/dxr3audiodecoder.h @@ -57,7 +57,7 @@ public: } private: - bool HeadCheck(unsigned long head); + bool checkMpegAudioHdr(const uint8_t *head); AVCodec *audio; AVCodecContext *contextAudio; @@ -69,7 +69,7 @@ private: bool foundHeader; bool decodeAudio; - uint8_t lastHeader[4]; + uint8_t lastBitrate; uint8_t pcmbuf[AVCODEC_MAX_AUDIO_FRAME_SIZE]; }; |