aboutsummaryrefslogtreecommitdiffstats
path: root/codecs/mp3/include/xinglmc.h
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>1999-12-07 05:45:48 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>1999-12-07 05:45:48 +0000
commit878dd470f235a2c945f2410927175a45f052b234 (patch)
tree4fc09f73bccf2e5017fd2dab7019e076351cab9b /codecs/mp3/include/xinglmc.h
parent070e10a75492938462eeac565c78c8c16a02fc74 (diff)
Version 0.1.1 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@95 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'codecs/mp3/include/xinglmc.h')
-rwxr-xr-xcodecs/mp3/include/xinglmc.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/codecs/mp3/include/xinglmc.h b/codecs/mp3/include/xinglmc.h
new file mode 100755
index 000000000..b03caa1e8
--- /dev/null
+++ b/codecs/mp3/include/xinglmc.h
@@ -0,0 +1,166 @@
+/*____________________________________________________________________________
+
+ FreeAmp - The Free MP3 Player
+ Portions Copyright (C) 1998-1999 EMusic.com
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ $Id$
+
+____________________________________________________________________________*/
+
+#ifndef INCLUDED_XINGLMC_H_
+#define INCLUDED_XINGLMC_H_
+
+/* system headers */
+#include <stdlib.h>
+#include <time.h>
+
+/* project headers */
+#include "config.h"
+
+#include "pmi.h"
+#include "pmo.h"
+#include "mutex.h"
+#include "event.h"
+#include "lmc.h"
+#include "thread.h"
+#include "mutex.h"
+#include "queue.h"
+#include "semaphore.h"
+
+extern "C"
+{
+#include "mhead.h"
+#include "port.h"
+}
+
+#define BS_BUFBYTES 60000U
+#define PCM_BUFBYTES 60000U
+
+typedef struct
+{
+ int (*decode_init) (MPEG_HEAD * h, int framebytes_arg,
+ int reduction_code, int transform_code,
+ int convert_code, int freq_limit);
+ void (*decode_info) (DEC_INFO * info);
+ IN_OUT(*decode) (unsigned char *bs, short *pcm);
+}
+AUDIO;
+
+#define FRAMES_FLAG 0x0001
+#define BYTES_FLAG 0x0002
+#define TOC_FLAG 0x0004
+#define VBR_SCALE_FLAG 0x0008
+
+#define FRAMES_AND_BYTES (FRAMES_FLAG | BYTES_FLAG)
+
+// structure to receive extracted header
+// toc may be NULL
+typedef struct
+{
+ int h_id; // from MPEG header, 0=MPEG2, 1=MPEG1
+ int samprate; // determined from MPEG header
+ int flags; // from Xing header data
+ int frames; // total bit stream frames from Xing header data
+ int bytes; // total bit stream bytes from Xing header data
+ int vbr_scale; // encoded vbr scale from Xing header data
+ unsigned char *toc; // pointer to unsigned char toc_buffer[100]
+ // may be NULL if toc not desired
+} XHEADDATA;
+
+enum
+{
+ lmcError_MinimumError = 1000,
+ lmcError_DecodeFailed,
+ lmcError_AudioDecodeInitFailed,
+ lmcError_DecoderThreadFailed,
+ lmcError_PMIError,
+ lmcError_PMOError,
+ lmcError_MaximumError
+};
+
+class XingLMC:public LogicalMediaConverter
+{
+
+ public:
+ XingLMC(FAContext *context);
+ virtual ~XingLMC();
+
+ virtual uint32 CalculateSongLength(const char *url);
+
+ virtual Error ChangePosition(int32 position);
+
+ virtual Error CanDecode();
+ virtual void Clear();
+ virtual Error ExtractMediaInfo();
+
+ virtual void SetPMI(PhysicalMediaInput *pmi) { m_pPmi = pmi; };
+ virtual void SetPMO(PhysicalMediaOutput *pmo) { m_pPmo = pmo; };
+ virtual Error Prepare(PullBuffer *pInputBuffer, PullBuffer *&pOutBuffer);
+ virtual Error InitDecoder();
+
+ virtual Error SetEQData(float *);
+ virtual Error SetEQData(bool);
+
+ virtual vector<char *> *GetExtensions(void);
+
+ private:
+
+ static void DecodeWorkerThreadFunc(void *);
+ void DecodeWork();
+ Error BeginRead(void *&pBuffer, unsigned int iBytesNeeded,
+ bool bBufferUp = true);
+ Error BlockingBeginRead(void *&pBuffer,
+ unsigned int iBytesNeeded);
+ Error EndRead(size_t iBytesUsed);
+ Error AdvanceBufferToNextFrame();
+ Error GetHeadInfo();
+ Error GetBitstreamStats(float &fTotalSeconds, float &fMsPerFrame,
+ int &iTotalFrames, int &iSampleRate,
+ int &iLayer);
+
+ int GetXingHeader(XHEADDATA *X, unsigned char *buf);
+ int SeekPoint(unsigned char TOC[100], int file_bytes, float percent);
+ int ExtractI4(unsigned char *buf);
+
+ PhysicalMediaInput *m_pPmi;
+ PhysicalMediaOutput *m_pPmo;
+
+ int m_iMaxWriteSize;
+ int32 m_frameBytes, m_iBufferUpInterval, m_iBufferSize;
+ size_t m_lFileSize;
+ MPEG_HEAD m_sMpegHead;
+ int32 m_iBitRate;
+ bool m_bBufferingUp;
+ Thread *m_decoderThread;
+
+ int32 m_frameCounter;
+ time_t m_iBufferUpdate;
+ char *m_szUrl;
+ const char *m_szError;
+ AUDIO m_audioMethods;
+ XHEADDATA *m_pXingHeader;
+
+ // These vars are used for a nasty hack.
+ FILE *m_fpFile;
+ char *m_pLocalReadBuffer;
+};
+
+#endif /* _XINGLMC_H */
+
+
+
+