aboutsummaryrefslogtreecommitdiff
path: root/dshow/Encoder.h
diff options
context:
space:
mode:
Diffstat (limited to 'dshow/Encoder.h')
-rw-r--r--dshow/Encoder.h172
1 files changed, 172 insertions, 0 deletions
diff --git a/dshow/Encoder.h b/dshow/Encoder.h
new file mode 100644
index 0000000..f6794dc
--- /dev/null
+++ b/dshow/Encoder.h
@@ -0,0 +1,172 @@
+/*
+ * LAME MP3 encoder for DirectShow
+ * LAME encoder wrapper
+ *
+ * Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#if !defined(AFX_VITECENCODER_H__40DC8A44_B937_11D2_A381_A2FD7C37FA15__INCLUDED_)
+#define AFX_VITECENCODER_H__40DC8A44_B937_11D2_A381_A2FD7C37FA15__INCLUDED_
+
+#if _MSC_VER >= 1000
+#pragma once
+#endif // _MSC_VER >= 1000
+
+#include <lame.h>
+
+
+const unsigned int dwBitRateValue[2][14] =
+{
+ {32,40,48,56,64,80,96,112,128,160,192,224,256,320}, // MPEG-1
+ {8,16,24,32,40,48,56,64,80,96,112,128,144,160} // MPEG-2/2.5
+};
+/*
+#define STEREO 0
+#define JOINT_STEREO 1
+#define DUAL_CHANNEL 2
+#define MONO 3
+*/
+
+#define OUT_BUFFER_SIZE 16384
+#define OUT_BUFFER_GUARD 8192
+
+#define OUT_BUFFER_MAX (OUT_BUFFER_SIZE - OUT_BUFFER_GUARD)
+
+typedef struct {
+ DWORD dwSampleRate; //SF in Hz
+ DWORD dwBitrate; //BR in bit per second
+ vbr_mode vmVariable;
+ DWORD dwVariableMin; //specify a minimum allowed bitrate
+ DWORD dwVariableMax; //specify a maximum allowed bitrate
+ DWORD dwQuality; //Encoding quality
+ DWORD dwVBRq; // VBR quality setting (0=highest quality, 9=lowest)
+ long lLayer; //Layer: 1 or 2
+
+ MPEG_mode ChMode; //Channel coding mode: see doc
+ DWORD dwForceMS;
+
+ DWORD bCRCProtect; //Is CRC protection activated?
+ DWORD bForceMono;
+ DWORD bSetDuration;
+ DWORD bCopyright; //Is the stream protected by copyright?
+ DWORD bOriginal; //Is the stream an original?
+
+ DWORD dwPES; // PES header. Obsolete
+
+ DWORD dwEnforceVBRmin;
+ DWORD dwVoiceMode;
+ DWORD dwKeepAllFreq;
+ DWORD dwStrictISO;
+ DWORD dwNoShortBlock;
+ DWORD dwXingTag;
+ DWORD dwModeFixed;
+ DWORD bSampleOverlap;
+} MPEG_ENCODER_CONFIG;
+
+
+class CEncoder
+{
+public:
+
+ CEncoder();
+ virtual ~CEncoder();
+
+ // Initialize encoder with PCM stream properties
+ HRESULT SetInputType(LPWAVEFORMATEX lpwfex, bool bJustCheck = FALSE); // returns E_INVALIDARG if not supported
+ // GetInputType - returns current input type
+ HRESULT GetInputType(WAVEFORMATEX *pwfex)
+ {
+ if(m_bInpuTypeSet)
+ {
+ memcpy(pwfex, &m_wfex, sizeof(WAVEFORMATEX));
+ return S_OK;
+ }
+ else
+ return E_UNEXPECTED;
+ }
+
+ // Set MPEG audio parameters
+ HRESULT SetOutputType(MPEG_ENCODER_CONFIG &mabsi); // returns E_INVALIDARG if not supported or
+ // not compatible with input type
+ // Return current MPEG audio settings
+ HRESULT GetOutputType(MPEG_ENCODER_CONFIG* pmabsi)
+ {
+ if (m_bOutpuTypeSet)
+ {
+ memcpy(pmabsi, &m_mabsi, sizeof(MPEG_ENCODER_CONFIG));
+ return S_OK;
+ }
+ else
+ return E_UNEXPECTED;
+ }
+
+ // Set if output stream is a PES. Obsolete
+ void SetPES(bool bPES)
+ {
+ m_mabsi.dwPES = false;//bPES;
+ }
+ // Is output stream a PES. Obsolete
+ BOOL IsPES() const
+ {
+ return (BOOL)m_mabsi.dwPES;
+ }
+
+ // Initialize encoder SDK
+ HRESULT Init();
+ // Close encoder SDK
+ HRESULT Close(IStream* pStream);
+
+ // Encode media sample data
+ int Encode(const short * pdata, int data_size);
+ int GetFrame(const unsigned char ** pframe);
+
+ // Returns block of a mp3 file, witch size integer multiples of cbAlign
+ int GetBlockAligned(const unsigned char ** pblock, int* piBufferSize, const long& cbAlign);
+
+ HRESULT Finish();
+
+protected:
+ HRESULT updateLameTagFrame(IStream* pStream);
+ HRESULT skipId3v2(IStream *pStream, size_t lametag_frame_size);
+ HRESULT maybeSyncWord(IStream *pStream);
+ HRESULT SetDefaultOutputType(LPWAVEFORMATEX lpwfex);
+
+ // Input media type
+ WAVEFORMATEX m_wfex;
+
+ // Output media type
+ MPEG_ENCODER_CONFIG m_mabsi;
+
+ // Compressor private data
+ lame_global_flags * pgf;
+
+ // Compressor miscelaneous state
+ BOOL m_bInpuTypeSet;
+ BOOL m_bOutpuTypeSet;
+
+ BOOL m_bFinished;
+ int m_frameCount;
+
+ unsigned char * m_outFrameBuf;
+ int m_outOffset;
+ int m_outReadOffset;
+
+ CCritSec m_lock;
+};
+
+#endif // !defined(AFX_VITECENCODER_H__40DC8A44_B937_11D2_A381_A2FD7C37FA15__INCLUDED_)