/********** 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 2.1 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-2016 Live Networks, Inc. All rights reserved. // A class encapsulating the state of a MP3 stream // C++ header #ifndef _MP3_STREAM_STATE_HH #define _MP3_STREAM_STATE_HH #ifndef _USAGE_ENVIRONMENT_HH #include "UsageEnvironment.hh" #endif #ifndef _BOOLEAN_HH #include "Boolean.hh" #endif #ifndef _MP3_INTERNALS_HH #include "MP3Internals.hh" #endif #ifndef _NET_COMMON_H #include "NetCommon.h" #endif #include #define XING_TOC_LENGTH 100 class MP3StreamState { public: MP3StreamState(UsageEnvironment& env); virtual ~MP3StreamState(); void assignStream(FILE* fid, unsigned fileSize); unsigned findNextHeader(struct timeval& presentationTime); Boolean readFrame(unsigned char* outBuf, unsigned outBufSize, unsigned& resultFrameSize, unsigned& resultDurationInMicroseconds); // called after findNextHeader() void getAttributes(char* buffer, unsigned bufferSize) const; float filePlayTime() const; // in seconds unsigned fileSize() const { return fFileSize; } void setPresentationTimeScale(unsigned scale) { fPresentationTimeScale = scale; } unsigned getByteNumberFromPositionFraction(float fraction); // 0.0 <= fraction <= 1.0 void seekWithinFile(unsigned seekByteNumber); void checkForXingHeader(); // hack for Xing VBR files protected: // private->protected requested by Pierre l'Hussiez unsigned readFromStream(unsigned char* buf, unsigned numChars); private: MP3FrameParams& fr() {return fCurrentFrame;} MP3FrameParams const& fr() const {return fCurrentFrame;} struct timeval currentFramePlayTime() const; Boolean findNextFrame(); private: UsageEnvironment& fEnv; FILE* fFid; Boolean fFidIsReallyASocket; unsigned fFileSize; unsigned fNumFramesInFile; unsigned fPresentationTimeScale; // used if we're streaming at other than the normal rate Boolean fIsVBR, fHasXingTOC; u_int8_t fXingTOC[XING_TOC_LENGTH]; // set iff "fHasXingTOC" is True MP3FrameParams fCurrentFrame; struct timeval fNextFramePresentationTime; }; #endif