Blame dshow/Encoder.h

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