/********** This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. (See .) This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA **********/ // "liveMedia" // Copyright (c) 1996-2024 Live Networks, Inc. All rights reserved. // Interleaving of MP3 ADUs // C++ header #ifndef _MP3_ADU_INTERLEAVING_HH #define _MP3_ADU_INTERLEAVING_HH #ifndef _FRAMED_FILTER_HH #include "FramedFilter.hh" #endif // A data structure used to represent an interleaving #define MAX_CYCLE_SIZE 256 class LIVEMEDIA_API Interleaving { public: Interleaving(unsigned cycleSize, unsigned char const* cycleArray); virtual ~Interleaving(); unsigned cycleSize() const {return fCycleSize;} unsigned char lookupInverseCycle(unsigned char index) const { return fInverseCycle[index]; } private: unsigned fCycleSize; unsigned char fInverseCycle[MAX_CYCLE_SIZE]; }; // This class is used only as a base for the following two: class LIVEMEDIA_API MP3ADUinterleaverBase: public FramedFilter { protected: MP3ADUinterleaverBase(UsageEnvironment& env, FramedSource* inputSource); // abstract base class virtual ~MP3ADUinterleaverBase(); static FramedSource* getInputSource(UsageEnvironment& env, char const* inputSourceName); static void afterGettingFrame(void* clientData, unsigned numBytesRead, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds); virtual void afterGettingFrame(unsigned numBytesRead, struct timeval presentationTime, unsigned durationInMicroseconds) = 0; }; // This class is used to convert an ADU sequence from non-interleaved // to interleaved form: class LIVEMEDIA_API MP3ADUinterleaver: public MP3ADUinterleaverBase { public: static MP3ADUinterleaver* createNew(UsageEnvironment& env, Interleaving const& interleaving, FramedSource* inputSource); protected: MP3ADUinterleaver(UsageEnvironment& env, Interleaving const& interleaving, FramedSource* inputSource); // called only by createNew() virtual ~MP3ADUinterleaver(); private: // redefined virtual functions: virtual void doGetNextFrame(); virtual void afterGettingFrame(unsigned numBytesRead, struct timeval presentationTime, unsigned durationInMicroseconds); private: void releaseOutgoingFrame(); private: Interleaving const fInterleaving; class InterleavingFrames* fFrames; unsigned char fPositionOfNextIncomingFrame; unsigned fII, fICC; }; // This class is used to convert an ADU sequence from interleaved // to non-interleaved form: class LIVEMEDIA_API MP3ADUdeinterleaver: public MP3ADUinterleaverBase { public: static MP3ADUdeinterleaver* createNew(UsageEnvironment& env, FramedSource* inputSource); protected: MP3ADUdeinterleaver(UsageEnvironment& env, FramedSource* inputSource); // called only by createNew() virtual ~MP3ADUdeinterleaver(); private: // redefined virtual functions: virtual void doGetNextFrame(); virtual void afterGettingFrame(unsigned numBytesRead, struct timeval presentationTime, unsigned durationInMicroseconds); private: void releaseOutgoingFrame(); private: class DeinterleavingFrames* fFrames; unsigned fIIlastSeen, fICClastSeen; }; #endif