diff options
Diffstat (limited to 'dshow/Encoder.h')
-rw-r--r-- | dshow/Encoder.h | 172 |
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_) |