#pragma once

#include "kpi_decoder.h"
#include "kpi_impl.h"
#include <emmintrin.h> 
#include <intrin.h>

#include "xerisa.h"
#include "erisaplay.h"

class EKpiFile : public ESLFileObject
{
private:
    IKpiFile *m_pFile;
public:
    ESLFileObject * Duplicate(void) const { return NULL; };
    // ファイルから読み込む
    unsigned long int Read(void * ptrBuffer, unsigned long int nBytes);
    // ファイルへ書き出す
    unsigned long int Write(const void * ptrBuffer, unsigned long int nBytes) { return 0; }
    void SetKpiFile(IKpiFile *pFile) { m_pFile = pFile; pFile->AddRef(); }
    // ファイルの長さを取得
    virtual unsigned long int GetLength(void)const;
    // ファイルポインタを移動
    virtual unsigned long int Seek(long int nOffsetPos, SeekOrigin fSeekFrom);
    // ファイルポインタを取得
    virtual unsigned long int GetPosition(void) const;
    // ファイルの終端を現在の位置に設定する
    virtual ESLError SetEndOfFile(void) { return eslErrNotSupported; }

    // クラス情報
    DECLARE_CLASS_INFO(EKpiFile, ESLFileObject)

    EKpiFile(void) { m_pFile = NULL; }
    virtual ~EKpiFile(void) {
        if (m_pFile) {
            m_pFile->Release();
        }
    }
};

class KbMioDecoder : public KbKpiUnknownImpl<IKpiDecoder>
{
private:
    MIODynamicPlayer m_player;
    EKpiFile m_file;
    BYTE *m_buffer;
    DWORD m_dwBufSize;
    DWORD m_dwBufIndex;
    KPI_MEDIAINFO m_MediaInfo;
public:
    DWORD __fastcall Open(const KPI_MEDIAINFO *cpRequest,
                          IKpiFile *pFile, 
                          IKpiFolder *pFolder);
    DWORD  WINAPI Select(DWORD dwNumber,
                         const KPI_MEDIAINFO **ppMediaInfo,
                         IKpiTagInfo *pTagInfo,
                         DWORD dwTagGetFlags);
    UINT64 WINAPI Seek(UINT64 qwPosSample, DWORD dwFlag);
    DWORD  WINAPI Render(BYTE *pBuffer, DWORD dwSizeSample);
    DWORD  WINAPI UpdateConfig(void *pvReserved){return 0;}
    KbMioDecoder(void);
    ~KbMioDecoder(void);
};
