亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cpi_player_codec_mpeg.c

?? < VC++視頻音頻開發>> 這本書的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * MPEG 音頻解碼 (using MAD)
 */
#include "stdafx.h"
#include "globals.h"
#include "CPI_Player_CoDec.h"
#include "libmad/mad.h"
// #include "mmsystem.h"
#include "CPI_Stream.h"
#include "CPI_ID3.h"
#pragma comment(lib, "winmm.lib")

# define SAMPLE_DEPTH	16
# define scale(x, y)	dither((x), (y))

struct xing {
    long flags;
    unsigned long frames;
    unsigned long bytes;
    unsigned char toc[100];
    long scale;
};

enum {
    XING_FRAMES = 0x00000001L,
    XING_BYTES  = 0x00000002L,
    XING_TOC    = 0x00000004L,
    XING_SCALE  = 0x00000008L
};

# define XING_MAGIC	(('X' << 24) | ('i' << 16) | ('n' << 8) | 'g')

struct dither {
    mad_fixed_t error[3];
    mad_fixed_t random;
};

typedef struct {
    CPs_InStream* m_pInStream;

    unsigned long size;				

    CPs_CoDecOptions options;	

    struct xing xing;				

    struct mad_stream stream;	
    struct mad_frame frame;		
    struct mad_synth synth;			

    unsigned int samplecount;		

    mad_timer_t timer;			
    mad_timer_t length;				
    unsigned long rate;				
    unsigned long frames;		

    CPs_FileInfo info;			

    unsigned char buffer[40000];	
    unsigned int buflen;		
} CPs_CoDec_MPEG;


static
int parse_xing(struct xing *xing, struct mad_bitptr ptr, unsigned int bitlen)
{
    if (bitlen < 64 || mad_bit_read(&ptr, 32) != XING_MAGIC)
        goto fail;

    xing->flags = mad_bit_read(&ptr, 32);
    bitlen -= 64;

    if (xing->flags & XING_FRAMES) {
        if (bitlen < 32)
            goto fail;

        xing->frames = mad_bit_read(&ptr, 32);
        bitlen -= 32;
    }

    if (xing->flags & XING_BYTES) {
        if (bitlen < 32)
            goto fail;

        xing->bytes = mad_bit_read(&ptr, 32);
        bitlen -= 32;
    }

    if (xing->flags & XING_TOC) {
        int i;

        if (bitlen < 800)
            goto fail;

        for (i = 0; i < 100; ++i)
            xing->toc[i] = (unsigned char) mad_bit_read(&ptr, 8);

        bitlen -= 800;
    }

    if (xing->flags & XING_SCALE) {
        if (bitlen < 32)
            goto fail;

        xing->scale = mad_bit_read(&ptr, 32);
        bitlen -= 32;
    }

    return 0;

fail:
    xing->flags = 0;
    return -1;
}


static
int scan_header(CPs_InStream* pInStream, struct mad_header *header, struct xing *xing)
{
    struct mad_stream stream;
    struct mad_frame frame;
    unsigned char buffer[8192];
    unsigned int buflen = 0;
    int count = 0, result = 0;

    mad_stream_init(&stream);
    mad_frame_init(&frame);

    if (xing)
        xing->flags = 0;

    while (1) {
        if (buflen < sizeof(buffer)) {
            DWORD bytes;

            if(pInStream->Read(pInStream, buffer + buflen, sizeof(buffer) - buflen, &bytes) == FALSE
                    || bytes == 0)
            {
                result = -1;
                break;
            }

            buflen += bytes;
        }

        mad_stream_buffer(&stream, buffer, buflen);

        while (1) {
            if (mad_frame_decode(&frame, &stream) == -1) {
                if (!MAD_RECOVERABLE(stream.error))
                    break;

                continue;
            }

            if (count++ ||
                    (xing && parse_xing(xing, stream.anc_ptr,
                                        stream.anc_bitlen) == 0))
                break;
        }

        if (count || stream.error != MAD_ERROR_BUFLEN)
            break;

        memmove(buffer, stream.next_frame,
                buflen = &buffer[buflen] - stream.next_frame);
    }

    if (count) {
        if (header)
            *header = frame.header;
    }
    else
        result = -1;

    mad_frame_finish(&frame);
    mad_stream_finish(&stream);

    return result;
}



static __inline
unsigned long prng(unsigned long state)
{
    return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL;
}


static __inline
signed int dither(mad_fixed_t sample, struct dither *dither)
{
    unsigned int scalebits;
    mad_fixed_t output, mask, random;

    enum {
        MIN = -MAD_F_ONE,
        MAX =  MAD_F_ONE - 1
    };

    sample += dither->error[0] - dither->error[1] + dither->error[2];

    dither->error[2] = dither->error[1];
    dither->error[1] = dither->error[0] / 2;

    output = sample + (1L << (MAD_F_FRACBITS + 1 - SAMPLE_DEPTH - 1));

    scalebits = MAD_F_FRACBITS + 1 - SAMPLE_DEPTH;
    mask = (1L << scalebits) - 1;

    random  = prng(dither->random);
    output += (random & mask) - (dither->random & mask);

    dither->random = random;

    if (output > MAX) {
        output = MAX;

        if (sample > MAX)
            sample = MAX;
    }
    else if (output < MIN) {
        output = MIN;

        if (sample < MIN)
            sample = MIN;
    }

    output &= ~mask;

    dither->error[0] = sample - output;

    return output >> scalebits;
}


static
void pack_pcm(unsigned char **pcm, unsigned int nsamples,
              mad_fixed_t const *ch1, mad_fixed_t const *ch2)
{
    register signed int s0, s1;
    static struct dither d0, d1;

    if (ch2) {  /* stereo */
        while (nsamples--) {
            s0 = scale(*ch1++, &d0);
            s1 = scale(*ch2++, &d1);
# if SAMPLE_DEPTH == 16
            (*pcm)[0 + 0] = s0 >> 0;
            (*pcm)[0 + 1] = s0 >> 8;
            (*pcm)[2 + 0] = s1 >> 0;
            (*pcm)[2 + 1] = s1 >> 8;

            *pcm += 2 * 2;
# elif SAMPLE_DEPTH == 8
            (*pcm)[0] = s0 ^ 0x80;
            (*pcm)[1] = s1 ^ 0x80;

            *pcm += 2;
# else
#  error "bad SAMPLE_DEPTH"
# endif
        }
    }
    else {  /* mono */
        while (nsamples--) {
            s0 = scale(*ch1++, &d0);

# if SAMPLE_DEPTH == 16
            (*pcm)[0] = s0 >> 0;
            (*pcm)[1] = s0 >> 8;

            *pcm += 2;
# elif SAMPLE_DEPTH == 8
            *(*pcm)++ = s0 ^ 0x80;
# endif
        }
    }
}


static void cleanup(CPs_CoDec_MPEG *context)
{
    if(context->m_pInStream)
    {
        context->m_pInStream->Uninitialise(context->m_pInStream);
        context->m_pInStream = NULL;

        mad_synth_finish(&context->synth);
        mad_frame_finish(&context->frame);
        mad_stream_finish(&context->stream);
    }
}

void CPP_OMMP3_Uninitialise(CPs_CoDecModule* pModule);
BOOL CPP_OMMP3_OpenFile(CPs_CoDecModule* pModule, const char* pcFilename, DWORD dwCookie, HWND hWndOwner);
void CPP_OMMP3_CloseFile(CPs_CoDecModule* pModule);
void CPP_OMMP3_Seek(CPs_CoDecModule* pModule, const int iNumerator, const int iDenominator);
void CPP_OMMP3_GetFileInfo(CPs_CoDecModule* pModule, CPs_FileInfo* pInfo);
//
BOOL CPP_OMMP3_GetPCMBlock(CPs_CoDecModule* pModule, void* pBlock, DWORD* pdwBlockSize);
int CPP_OMMP3_GetCurrentPos_secs(CPs_CoDecModule* pModule);
//
void CP_InitialiseCodec_MPEG(CPs_CoDecModule* pCoDec)
{
    CPs_CoDec_MPEG *pContext;

    pCoDec->Uninitialise = CPP_OMMP3_Uninitialise;
    pCoDec->OpenFile = CPP_OMMP3_OpenFile;
    pCoDec->CloseFile = CPP_OMMP3_CloseFile;
    pCoDec->Seek = CPP_OMMP3_Seek;
    pCoDec->GetFileInfo = CPP_OMMP3_GetFileInfo;

    pCoDec->GetPCMBlock = CPP_OMMP3_GetPCMBlock;
    pCoDec->GetCurrentPos_secs = CPP_OMMP3_GetCurrentPos_secs;

    pCoDec->m_pModuleCookie = malloc(sizeof(CPs_CoDec_MPEG));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲激情第一区| 成人av片在线观看| 国内久久婷婷综合| av在线不卡电影| 色婷婷av一区二区| 日本高清不卡aⅴ免费网站| 在线观看欧美黄色| 欧美日韩电影一区| 欧美一区二区网站| 日韩一二三区视频| 久久久久国产精品麻豆| 亚洲欧洲av色图| 亚洲r级在线视频| 麻豆91在线观看| 国产成人精品亚洲日本在线桃色| 在线视频国产一区| 这里只有精品电影| 国产女同互慰高潮91漫画| 亚洲欧美日韩中文字幕一区二区三区 | 欧美浪妇xxxx高跟鞋交| 欧美一级欧美一级在线播放| 2020国产成人综合网| 国产精品久久久久久妇女6080 | 理论片日本一区| 狠狠色狠狠色综合系列| 色香蕉久久蜜桃| 欧美一区二区三区色| 国产亚洲自拍一区| 亚洲精品久久久蜜桃| 青青草91视频| 成人精品电影在线观看| 在线观看三级视频欧美| 久久久五月婷婷| 亚洲午夜成aⅴ人片| 国产在线乱码一区二区三区| 一本在线高清不卡dvd| 欧美一区二区三区免费| 狠狠色狠狠色合久久伊人| 欧美综合色免费| 国产精品婷婷午夜在线观看| 无码av中文一区二区三区桃花岛| 国产精品一区二区三区四区| 欧美日韩精品一区二区三区 | 91高清视频免费看| 国产网站一区二区| 久久99精品久久久久久| 五月婷婷激情综合网| 色综合久久中文字幕| 久久免费的精品国产v∧| 麻豆中文一区二区| 欧美在线一区二区| √…a在线天堂一区| 精品一区二区久久久| 欧美人狂配大交3d怪物一区| 综合久久给合久久狠狠狠97色| 国产一区二区免费视频| 日韩午夜av电影| 午夜视频久久久久久| 欧美性猛交xxxx黑人交| 亚洲婷婷综合色高清在线| 成人av免费在线播放| 2021中文字幕一区亚洲| 久久国产福利国产秒拍| 日韩三级视频中文字幕| 日本不卡免费在线视频| 欧美久久一区二区| 午夜精品一区二区三区免费视频| 在线观看视频91| 一级中文字幕一区二区| 在线观看日韩国产| 亚洲黄色片在线观看| 色域天天综合网| 亚洲女同一区二区| 色就色 综合激情| 亚洲伊人伊色伊影伊综合网| 91精彩视频在线| 亚洲国产色一区| 在线电影一区二区三区| 日韩va亚洲va欧美va久久| 日韩一二在线观看| 韩国精品在线观看| 中文字幕精品三区| fc2成人免费人成在线观看播放 | 国产成人精品综合在线观看| 久久精品欧美日韩| 国产91露脸合集magnet | www.成人网.com| 亚洲综合一区在线| 在线播放亚洲一区| 久久疯狂做爰流白浆xx| 久久久久久久久久久久电影| 国产91精品在线观看| 亚洲男人都懂的| 国产综合久久久久久鬼色| 偷窥国产亚洲免费视频| 欧美精品一区二区久久久| 色伊人久久综合中文字幕| 国产剧情一区二区三区| 天堂蜜桃91精品| 亚洲欧美日韩久久| 久久综合色婷婷| 日韩视频免费观看高清在线视频| 色视频一区二区| 日本成人中文字幕在线视频| 成人综合激情网| 综合色中文字幕| 欧美久久免费观看| 国产一区二区三区免费观看| 中日韩av电影| 欧美视频精品在线观看| 国产毛片精品一区| 一个色综合av| 精品处破学生在线二十三| 99久久99久久精品免费看蜜桃| 亚洲国产精品久久一线不卡| 精品精品欲导航| 成人app在线| 日韩激情在线观看| 久久久噜噜噜久噜久久综合| 91在线视频免费观看| 五月天激情综合| 国产欧美视频在线观看| 欧洲日韩一区二区三区| 久久精品久久99精品久久| 久久丝袜美腿综合| 在线观看日韩国产| 国产一区二区在线免费观看| 亚洲乱码一区二区三区在线观看| 日韩三级在线免费观看| 91免费观看视频在线| 秋霞成人午夜伦在线观看| 国产精品免费网站在线观看| 欧美美女一区二区在线观看| 日韩av电影天堂| 欧美一区二区三区啪啪| 这里只有精品视频在线观看| 26uuu国产一区二区三区| 国产精品毛片久久久久久| 伊人夜夜躁av伊人久久| 日欧美一区二区| 成人动漫一区二区在线| 欧美日韩精品一区二区三区| 久久综合九色综合97婷婷女人 | 久久久天堂av| 欧洲av在线精品| 国产精品性做久久久久久| 首页综合国产亚洲丝袜| 欧美videossexotv100| 亚洲日本乱码在线观看| 蜜臀av一区二区在线免费观看| 国产不卡在线视频| 欧美日韩精品一区二区三区蜜桃 | 日本一区二区不卡视频| 亚洲精选视频免费看| 精品一区二区日韩| 欧美天堂一区二区三区| 国产欧美久久久精品影院| 天堂精品中文字幕在线| fc2成人免费人成在线观看播放| 日韩精品中午字幕| 亚洲一区二区三区在线播放| 国产成人av在线影院| 欧美一区二区三区四区久久| 午夜精品福利一区二区三区av| 亚洲国产激情av| 色综合天天综合在线视频| 欧美日韩在线一区二区| 国产香蕉久久精品综合网| 亚洲成a天堂v人片| 91麻豆精东视频| 亚洲精品第1页| √…a在线天堂一区| 成人免费在线播放视频| 久久九九久精品国产免费直播| 欧美自拍丝袜亚洲| 91影院在线免费观看| 成人高清视频在线观看| 国产伦理精品不卡| 国产中文一区二区三区| 麻豆精品精品国产自在97香蕉| 日本欧美一区二区在线观看| 午夜精品久久久久| 天天av天天翘天天综合网| 亚洲第一成年网| 午夜影院久久久| 午夜欧美大尺度福利影院在线看 | 国产精品综合一区二区| 美女一区二区视频| 美女视频一区在线观看| 麻豆专区一区二区三区四区五区| 中文字幕欧美区| 欧美日韩免费电影| 亚洲777理论| 一区二区三区欧美在线观看| 中文字幕中文字幕一区二区| 国产精品热久久久久夜色精品三区| 国产日韩欧美综合一区| 国产欧美一区二区在线| 国产欧美一区二区精品忘忧草 | 国产98色在线|日韩|