mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-11-14 20:24:55 -05:00
Compare commits
5 commits
60506addba
...
60c92a1a72
Author | SHA1 | Date | |
---|---|---|---|
|
60c92a1a72 | ||
|
a6172211aa | ||
|
72238c28ad | ||
|
0003d3d743 | ||
|
d4764400d6 |
76 changed files with 2 additions and 19316 deletions
|
@ -1,693 +1,2 @@
|
||||||
// disabled 30 May 2012 as per email from Tejas w.r.t. to Rovi deal ending
|
|
||||||
#if 0
|
#if 0
|
||||||
#include "main.h"
|
|
||||||
#include "../nu/AutoUrl.h"
|
|
||||||
#include "../nu/AutoWide.h"
|
|
||||||
#include "../nu/GrowBuf.h"
|
|
||||||
#include "api.h"
|
|
||||||
#include "../xml/obj_xml.h"
|
|
||||||
#include "../xml/ifc_xmlreadercallback.h"
|
|
||||||
#include "..\Components\wac_network\wac_network_http_receiver_api.h"
|
|
||||||
#include <api/service/waservicefactory.h>
|
|
||||||
#include <api/service/svcs/svc_imgload.h>
|
|
||||||
#include "XMLString.h"
|
|
||||||
#include <tataki/export.h>
|
|
||||||
#include <tataki/bitmap/bitmap.h>
|
|
||||||
#include <tataki/canvas/bltcanvas.h>
|
|
||||||
#include <strsafe.h>
|
|
||||||
|
|
||||||
static INT_PTR CALLBACK artDownloader(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
||||||
static INT_PTR CALLBACK scrollChildHostProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
||||||
static INT_PTR CALLBACK scrollChildProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
||||||
static INT_PTR CALLBACK imageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
||||||
|
|
||||||
#define HTTP_BUFFER_SIZE 32768
|
|
||||||
|
|
||||||
#define WM_ADDCHILD WM_USER+0
|
|
||||||
#define WM_SELECTED WM_USER+1
|
|
||||||
#define WM_UPDATESTATUS WM_USER+2
|
|
||||||
#define AddImageToList(hChild, param) SendMessageW(hChild,WM_ADDCHILD,0,(LPARAM)param)
|
|
||||||
#define GetParam(hwndDlg) (ArtParser*)GetWindowLongPtrW(hwndDlg,GWLP_USERDATA)
|
|
||||||
#define GetParamC(hwndDlg) (ImgDownloader*)GetWindowLongPtrW(hwndDlg,GWLP_USERDATA)
|
|
||||||
#define UpdateStatus(hwndDlg) PostMessageW(hwndDlg,WM_UPDATESTATUS,0,0)
|
|
||||||
|
|
||||||
class ImgDownloader
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ImgDownloader(const wchar_t *_desc, const char *_url) : done(false), http(0), started(false), error(false), imgbuf(0), imgbufsize(0), imgbufused(0)
|
|
||||||
{
|
|
||||||
desc = _wcsdup(_desc);
|
|
||||||
url = _strdup(_url);
|
|
||||||
}
|
|
||||||
~ImgDownloader()
|
|
||||||
{
|
|
||||||
free(desc);
|
|
||||||
free(url);
|
|
||||||
free(imgbuf);
|
|
||||||
waServiceFactory *httpFactory = WASABI_API_SVC->service_getServiceByGuid(httpreceiverGUID);
|
|
||||||
if(httpFactory && http)
|
|
||||||
httpFactory->releaseInterface(http);
|
|
||||||
}
|
|
||||||
bool run();
|
|
||||||
|
|
||||||
wchar_t *desc;
|
|
||||||
char *url;
|
|
||||||
bool done, error;
|
|
||||||
api_httpreceiver *http;
|
|
||||||
|
|
||||||
BYTE *imgbuf;
|
|
||||||
int imgbufsize;
|
|
||||||
int imgbufused;
|
|
||||||
private:
|
|
||||||
bool started;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ArtParser : public ifc_xmlreadercallback
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ArtParser(artFetchData * data);
|
|
||||||
~ArtParser();
|
|
||||||
|
|
||||||
wchar_t curAlbumStr[512] = {0};
|
|
||||||
void ArtParser::StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params);
|
|
||||||
void ArtParser::TextHandler(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str);
|
|
||||||
|
|
||||||
int run();
|
|
||||||
|
|
||||||
artFetchData * data;
|
|
||||||
|
|
||||||
bool doneXML;
|
|
||||||
int curImage, numImages, failedImages;
|
|
||||||
|
|
||||||
bool error;
|
|
||||||
HWND hwndDlg;
|
|
||||||
obj_xml *parser;
|
|
||||||
waServiceFactory *parserFactory, *httpFactory;
|
|
||||||
api_httpreceiver *http;
|
|
||||||
std::vector<ImgDownloader*> imgDownload;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
#define CBCLASS ArtParser
|
|
||||||
START_DISPATCH_INLINE;
|
|
||||||
VCB(ONSTARTELEMENT, StartTag);
|
|
||||||
VCB(ONCHARDATA, TextHandler);
|
|
||||||
END_DISPATCH;
|
|
||||||
#undef CBCLASS
|
|
||||||
};
|
|
||||||
|
|
||||||
wchar_t tmp_album[512] = {0}, tmp_artist[512] = {0}, tmp_year[5] = {0};
|
|
||||||
int RetrieveAlbumArt(artFetchData * data)
|
|
||||||
{
|
|
||||||
if(!data || data->size < sizeof(artFetchData))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
int ret = 1;
|
|
||||||
Tataki::Init(serviceManager);
|
|
||||||
{
|
|
||||||
ArtParser param(data);
|
|
||||||
if(!param.error)
|
|
||||||
ret = LPDialogBoxParamW(IDD_ARTDOWNLOADER,data->parent,artDownloader,(LPARAM)¶m);
|
|
||||||
|
|
||||||
while (ret == 2) // Keep in loop till user aborts custom search
|
|
||||||
{
|
|
||||||
// TODO: benski> maybe we should save the old values and restore at the end
|
|
||||||
data->album = tmp_album;
|
|
||||||
data->artist = tmp_artist;
|
|
||||||
data->year = _wtoi(tmp_year);
|
|
||||||
// Martin> we should also set the other values back to null
|
|
||||||
// benski> i'm not sure if we want to set these id fields to NULL
|
|
||||||
// but we'll go with it for now
|
|
||||||
data->amgAlbumId = NULL;
|
|
||||||
data->amgArtistId = NULL;
|
|
||||||
data->gracenoteFileId = NULL;
|
|
||||||
WASABI_API_MEMMGR->sysFree(data->imgData);
|
|
||||||
data->imgData = NULL;
|
|
||||||
data->imgDataLen = NULL;
|
|
||||||
|
|
||||||
ArtParser param(data);
|
|
||||||
ret = LPDialogBoxParamW(IDD_ARTDOWNLOADER,data->parent,artDownloader,(LPARAM)¶m);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Tataki::Quit();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define USER_AGENT_SIZE (10 /*User-Agent*/ + 2 /*: */ + 6 /*Winamp*/ + 1 /*/*/ + 1 /*5*/ + 3/*.21*/ + 1 /*Null*/)
|
|
||||||
static void SetUserAgent(api_httpreceiver *http)
|
|
||||||
{
|
|
||||||
char user_agent[USER_AGENT_SIZE] = {0};
|
|
||||||
StringCchCopyA(user_agent, USER_AGENT_SIZE, "User-Agent: Winamp/"APP_VERSION); // as a nice side effect, this will cut off any extra digits after the first two. e.g. 5.111 becomes 5.11
|
|
||||||
http->addheader(user_agent);
|
|
||||||
}
|
|
||||||
|
|
||||||
class UrlBuilder : private GrowBuf
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
UrlBuilder(const char * base) : first(1) { set(base); }
|
|
||||||
~UrlBuilder(){}
|
|
||||||
void AddParam(const char * key, const wchar_t * value) { AddParamI(key,(char*)AutoUrl(value)); }
|
|
||||||
void AddParam(const char * key, int value) { char buf[16]; StringCchPrintfA(buf,16,"%d",value); AddParamI(key,buf); }
|
|
||||||
void Finish() { GrowBuf::add((void*)"",1); }
|
|
||||||
const char * Get() { return (const char*)get(); } // don't call this without first calling finish!
|
|
||||||
private:
|
|
||||||
void AddParamI(const char * key, const char * value) { if(first){ first=0; add("?");} else add("&"); add(key); add("="); add(value); }
|
|
||||||
void add(const char * x) { GrowBuf::add((char*)x,strlen(x)); }
|
|
||||||
void set(const char * x) { GrowBuf::set((char*)x,strlen(x)); }
|
|
||||||
int first;
|
|
||||||
};
|
|
||||||
|
|
||||||
static wchar_t* format(const wchar_t *in, wchar_t *buf, int len)
|
|
||||||
{
|
|
||||||
wchar_t *p = buf;
|
|
||||||
int inbracket = 0;
|
|
||||||
while(in && *in)
|
|
||||||
{
|
|
||||||
if(p >= buf + len - 1) break;
|
|
||||||
else if(*in == L'[' || *in == L'(' || *in == L'<') inbracket++;
|
|
||||||
else if(*in == L']' || *in == L')' || *in == L'>') inbracket--;
|
|
||||||
else if(!inbracket) *(p++) = *in;
|
|
||||||
in++;
|
|
||||||
}
|
|
||||||
*p=0;
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
ArtParser::ArtParser(artFetchData * data) : data(data), error(false), parserFactory(0), parser(0), http(0), httpFactory(0), doneXML(false), curImage(0), numImages(0), failedImages(0)
|
|
||||||
{
|
|
||||||
curAlbumStr[0]=0;
|
|
||||||
|
|
||||||
parserFactory = WASABI_API_SVC->service_getServiceByGuid(obj_xmlGUID);
|
|
||||||
if (parserFactory)
|
|
||||||
parser = (obj_xml *)parserFactory->getInterface();
|
|
||||||
|
|
||||||
if (parser)
|
|
||||||
{
|
|
||||||
parser->xmlreader_registerCallback(L"document\fartwork", this);
|
|
||||||
parser->xmlreader_registerCallback(L"response\fdata\fartwork", this);
|
|
||||||
parser->xmlreader_open();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
error=true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// construct xml url
|
|
||||||
UrlBuilder url("http://client.winamp.com/metadata/artwork.php");
|
|
||||||
|
|
||||||
wchar_t temp[2048] = {0};
|
|
||||||
|
|
||||||
if(data->artist && data->artist[0] && _wcsicmp(data->artist, L"Various Artists") && _wcsicmp(data->artist, L"VA") && _wcsicmp(data->artist, L"OST"))
|
|
||||||
url.AddParam("artist",format(data->artist,temp,2048));
|
|
||||||
|
|
||||||
if(data->album && data->album[0])
|
|
||||||
url.AddParam("album",format(data->album,temp,2048));
|
|
||||||
|
|
||||||
if(data->year)
|
|
||||||
url.AddParam("recorddate",data->year);
|
|
||||||
|
|
||||||
if(data->amgAlbumId)
|
|
||||||
url.AddParam("amgalbumid",data->amgAlbumId);
|
|
||||||
|
|
||||||
if(data->amgArtistId)
|
|
||||||
url.AddParam("amgartistid",data->amgArtistId);
|
|
||||||
|
|
||||||
if(data->gracenoteFileId && data->gracenoteFileId[0])
|
|
||||||
url.AddParam("tagid",data->gracenoteFileId);
|
|
||||||
|
|
||||||
url.Finish();
|
|
||||||
|
|
||||||
httpFactory = WASABI_API_SVC->service_getServiceByGuid(httpreceiverGUID);
|
|
||||||
if(httpFactory) http = (api_httpreceiver *)httpFactory->getInterface();
|
|
||||||
|
|
||||||
if(http)
|
|
||||||
{
|
|
||||||
http->AllowCompression();
|
|
||||||
http->open(API_DNS_AUTODNS, HTTP_BUFFER_SIZE, config_proxy);
|
|
||||||
SetUserAgent(http);
|
|
||||||
http->connect(url.Get());
|
|
||||||
}
|
|
||||||
else error = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ArtParser::~ArtParser()
|
|
||||||
{
|
|
||||||
imgDownload.deleteAll();
|
|
||||||
if(parser)
|
|
||||||
{
|
|
||||||
parser->xmlreader_unregisterCallback(this);
|
|
||||||
parser->xmlreader_close();
|
|
||||||
if(parserFactory)
|
|
||||||
parserFactory->releaseInterface(parser);
|
|
||||||
}
|
|
||||||
parser = 0;
|
|
||||||
parserFactory = 0;
|
|
||||||
if(http && httpFactory)
|
|
||||||
httpFactory->releaseInterface(http);
|
|
||||||
http = 0;
|
|
||||||
httpFactory = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArtParser::StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
|
|
||||||
{
|
|
||||||
const wchar_t* artist = params->getItemValue(L"amgArtistDispName");
|
|
||||||
const wchar_t* album = params->getItemValue(L"amgDispName");
|
|
||||||
const wchar_t* year = params->getItemValue(L"recordDate");
|
|
||||||
StringCchPrintfW(curAlbumStr,512,L"%s - %s (%s)",artist?artist:L"",album?album:L"",year?year:L"");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ArtParser::TextHandler(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str)
|
|
||||||
{
|
|
||||||
numImages++;
|
|
||||||
imgDownload.push_back(new ImgDownloader(curAlbumStr,AutoChar(str)));
|
|
||||||
UpdateStatus(hwndDlg);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ArtParser::run()
|
|
||||||
{
|
|
||||||
int ret = http->run();
|
|
||||||
if (ret == -1) // connection failed
|
|
||||||
{
|
|
||||||
error=true;
|
|
||||||
UpdateStatus(hwndDlg);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int replycode = http->getreplycode();
|
|
||||||
switch (replycode)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
case 100:
|
|
||||||
return 1;
|
|
||||||
case 200:
|
|
||||||
{
|
|
||||||
char downloadedData[HTTP_BUFFER_SIZE] = {0};
|
|
||||||
int xmlResult = API_XML_SUCCESS;
|
|
||||||
int downloadSize = http->get_bytes(downloadedData, HTTP_BUFFER_SIZE);
|
|
||||||
if(downloadSize)
|
|
||||||
xmlResult = parser->xmlreader_feed((void *)downloadedData, downloadSize);
|
|
||||||
else if(!downloadSize && ret == 1)
|
|
||||||
{ // we're finished!
|
|
||||||
xmlResult = parser->xmlreader_feed(0,0);
|
|
||||||
doneXML=true;
|
|
||||||
UpdateStatus(hwndDlg);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
error=true;
|
|
||||||
UpdateStatus(hwndDlg);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ImgDownloader::run()
|
|
||||||
{
|
|
||||||
if(!started)
|
|
||||||
{
|
|
||||||
started = true;
|
|
||||||
waServiceFactory *httpFactory = WASABI_API_SVC->service_getServiceByGuid(httpreceiverGUID);
|
|
||||||
if(httpFactory) http = (api_httpreceiver *)httpFactory->getInterface();
|
|
||||||
if(http)
|
|
||||||
{
|
|
||||||
http->open(API_DNS_AUTODNS, HTTP_BUFFER_SIZE, config_proxy);
|
|
||||||
SetUserAgent(http);
|
|
||||||
http->connect(url);
|
|
||||||
}
|
|
||||||
imgbuf = (BYTE*)malloc(HTTP_BUFFER_SIZE);
|
|
||||||
imgbufsize = HTTP_BUFFER_SIZE;
|
|
||||||
}
|
|
||||||
if(!http || !imgbuf)
|
|
||||||
{
|
|
||||||
error=true;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int ret = http->run();
|
|
||||||
if(ret == -1) //error
|
|
||||||
{
|
|
||||||
error=true;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int replycode = http->getreplycode();
|
|
||||||
switch (replycode)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
case 100:
|
|
||||||
return 1;
|
|
||||||
case 200:
|
|
||||||
{
|
|
||||||
int downloadSize = http->get_bytes(imgbuf+imgbufused, imgbufsize - imgbufused);
|
|
||||||
imgbufused += downloadSize;
|
|
||||||
if(imgbufused + 4096 >= imgbufsize)
|
|
||||||
{
|
|
||||||
imgbufsize += HTTP_BUFFER_SIZE;
|
|
||||||
imgbuf = (BYTE*)realloc(imgbuf,imgbufsize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!downloadSize && ret == 1)
|
|
||||||
done=true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static INT_PTR CALLBACK artDownloader(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
|
||||||
{
|
|
||||||
static HWND m_child;
|
|
||||||
switch(uMsg)
|
|
||||||
{
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
{
|
|
||||||
m_child = LPCreateDialogW(IDD_ARTDOWNLOADER_SCROLLHOST,hwndDlg,(WNDPROC)scrollChildHostProc);
|
|
||||||
SetWindowLong(hwndDlg,GWLP_USERDATA,lParam);
|
|
||||||
ArtParser * parser = (ArtParser *)lParam;
|
|
||||||
parser->hwndDlg = hwndDlg;
|
|
||||||
SetTimer(hwndDlg,0,50,NULL);
|
|
||||||
SetTimer(hwndDlg,1,50,NULL);
|
|
||||||
UpdateStatus(hwndDlg);
|
|
||||||
if(parser->data->showCancelAll) ShowWindow(GetDlgItem(hwndDlg,IDC_CANCELALL),SW_SHOWNA);
|
|
||||||
wchar_t old[100]=L"";
|
|
||||||
GetWindowTextW(hwndDlg,old,100);
|
|
||||||
wchar_t buf[256]=L"";
|
|
||||||
if(parser->data->artist && parser->data->artist[0] && parser->data->album && parser->data->album[0])
|
|
||||||
StringCchPrintfW(buf,256,L"%s: %s - %s",old,parser->data->artist,parser->data->album);
|
|
||||||
else if(parser->data->album && parser->data->album[0])
|
|
||||||
StringCchPrintfW(buf,256,L"%s: %s",old,parser->data->album);
|
|
||||||
else if(parser->data->artist && parser->data->artist[0])
|
|
||||||
StringCchPrintfW(buf,256,L"%s: %s",old,parser->data->artist);
|
|
||||||
|
|
||||||
if(buf[0])
|
|
||||||
SetWindowTextW(hwndDlg,buf);
|
|
||||||
|
|
||||||
SetWindowTextW(GetDlgItem(hwndDlg,IDC_SEARCHREFINE_ARTIST), parser->data->artist);
|
|
||||||
SetWindowTextW(GetDlgItem(hwndDlg,IDC_SEARCHREFINE_ALBUM), parser->data->album);
|
|
||||||
wchar_t yearbuf[5]=L"";
|
|
||||||
_itow(parser->data->year,yearbuf,10);
|
|
||||||
SetWindowTextW(GetDlgItem(hwndDlg,IDC_SEARCHREFINE_YEAR), (parser->data->year?yearbuf:L""));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_SELECTED:
|
|
||||||
{
|
|
||||||
ArtParser * parser = GetParam(hwndDlg);
|
|
||||||
HWND selchild = (HWND)wParam;
|
|
||||||
ImgDownloader *d = (ImgDownloader *)lParam;
|
|
||||||
if(parser && d && d->imgbuf && d->imgbufused)
|
|
||||||
{
|
|
||||||
if (!AGAVE_API_AMGSUCKS || AGAVE_API_AMGSUCKS->WriteAlbumArt(d->imgbuf, d->imgbufused, &parser->data->imgData, &parser->data->imgDataLen) != 0)
|
|
||||||
{
|
|
||||||
void * img = WASABI_API_MEMMGR->sysMalloc(d->imgbufused);
|
|
||||||
memcpy(img,d->imgbuf,d->imgbufused);
|
|
||||||
parser->data->imgData = img;
|
|
||||||
parser->data->imgDataLen = d->imgbufused;
|
|
||||||
}
|
|
||||||
char * dot = strrchr(d->url,'.');
|
|
||||||
if(dot) lstrcpynW(parser->data->type,AutoWide(dot+1),10);
|
|
||||||
EndDialog(hwndDlg,0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_UPDATESTATUS:
|
|
||||||
{
|
|
||||||
ArtParser * parser = GetParam(hwndDlg);
|
|
||||||
if(parser)
|
|
||||||
{
|
|
||||||
wchar_t s[100] = {0};
|
|
||||||
if(parser->error) getStringW(IDS_ART_SEARCH_FAILED,s,100);
|
|
||||||
else if(parser->doneXML) getStringW(IDS_ART_SEARCH_FINISHED,s,100);
|
|
||||||
else getStringW(IDS_ART_SEARCH_PROGRESS,s,100);
|
|
||||||
wchar_t buf[512] = {0};
|
|
||||||
StringCchPrintfW(buf,512,getStringW(IDS_ART_SEARCH_STATUS,0,0),s,parser->numImages,parser->curImage - parser->failedImages,parser->failedImages,parser->numImages - parser->curImage);
|
|
||||||
SetDlgItemTextW(hwndDlg,IDC_STATUS,buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_TIMER:
|
|
||||||
{
|
|
||||||
ArtParser * parser = GetParam(hwndDlg);
|
|
||||||
switch(wParam)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
if(parser && !parser->run())
|
|
||||||
KillTimer(hwndDlg,0);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if(parser && parser->imgDownload.size())
|
|
||||||
{
|
|
||||||
ImgDownloader *d = parser->imgDownload.at(0);
|
|
||||||
if(d->error)
|
|
||||||
{
|
|
||||||
parser->failedImages++;
|
|
||||||
parser->curImage++;
|
|
||||||
parser->imgDownload.eraseindex(0);
|
|
||||||
delete d;
|
|
||||||
UpdateStatus(hwndDlg);
|
|
||||||
}
|
|
||||||
else if(d->done)
|
|
||||||
{
|
|
||||||
parser->curImage++;
|
|
||||||
parser->imgDownload.eraseindex(0);
|
|
||||||
AddImageToList(m_child,d);
|
|
||||||
UpdateStatus(hwndDlg);
|
|
||||||
}
|
|
||||||
else d->run();
|
|
||||||
}
|
|
||||||
if(parser->error || parser->doneXML)
|
|
||||||
{
|
|
||||||
if(parser->curImage == parser->numImages)
|
|
||||||
{
|
|
||||||
KillTimer(hwndDlg,1);
|
|
||||||
if(!parser->numImages)
|
|
||||||
{
|
|
||||||
wchar_t title[100] = {0};
|
|
||||||
getStringW(IDS_ART_SEARCH_NOT_FOUND_TITLE,title,100);
|
|
||||||
MessageBoxW(hwndDlg,getStringW(IDS_ART_SEARCH_NOT_FOUND,0,0),title,0);
|
|
||||||
//EndDialog(hwndDlg,-1); //CUT, since we have now a custom search
|
|
||||||
}
|
|
||||||
EnableWindow(GetDlgItem(hwndDlg, IDC_SEARCHAGAIN), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_DESTROY:
|
|
||||||
{
|
|
||||||
SetWindowLong(hwndDlg,GWLP_USERDATA,0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_CLOSE:
|
|
||||||
EndDialog(hwndDlg,-1);
|
|
||||||
break;
|
|
||||||
case WM_COMMAND:
|
|
||||||
switch(LOWORD(wParam))
|
|
||||||
{
|
|
||||||
case IDCANCEL:
|
|
||||||
EndDialog(hwndDlg,-1);
|
|
||||||
break;
|
|
||||||
case IDC_CANCELALL:
|
|
||||||
EndDialog(hwndDlg,-2);
|
|
||||||
break;
|
|
||||||
case IDC_SEARCHAGAIN: // copy text field params to parser
|
|
||||||
ArtParser * parser = GetParam(hwndDlg);
|
|
||||||
|
|
||||||
// Let the first search process finish
|
|
||||||
if (!(parser->doneXML || parser->error))
|
|
||||||
{
|
|
||||||
//TODO change this string
|
|
||||||
MessageBoxW(hwndDlg, L"Please wait till the current retrieval is finished", L"", 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetDlgItemTextW(hwndDlg,IDC_SEARCHREFINE_ALBUM, tmp_album, 512);
|
|
||||||
GetDlgItemTextW(hwndDlg,IDC_SEARCHREFINE_ARTIST, tmp_artist, 512);
|
|
||||||
GetDlgItemTextW(hwndDlg,IDC_SEARCHREFINE_YEAR, tmp_year, 5);
|
|
||||||
|
|
||||||
// End Dialog w/ returning 2: indicates that teh users wants to start a custom search
|
|
||||||
EndDialog(hwndDlg,2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// from FileInfo.cpp
|
|
||||||
extern HBITMAP getBitmap(ARGB32 * data, int dw, int dh, int targetW, int targetH, HWND parent);
|
|
||||||
extern ARGB32 * decompressImage(const void *data, int datalen, int * dataW, int * dataH);
|
|
||||||
|
|
||||||
HBITMAP loadImage(const void * data, int datalen, int w, int h, HWND parent, int *dw=0, int *dh=0)
|
|
||||||
{
|
|
||||||
int dataW=0, dataH=0;
|
|
||||||
ARGB32* ret = decompressImage(data,datalen,&dataW,&dataH);
|
|
||||||
|
|
||||||
if(dw) *dw = dataW;
|
|
||||||
if(dh) *dh = dataH;
|
|
||||||
if(!ret) return 0;
|
|
||||||
HBITMAP r = getBitmap(ret, dataW, dataH, w, h, parent);
|
|
||||||
WASABI_API_MEMMGR->sysFree(ret);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GetDlgParent(hwndDlg) GetParent(GetParent(GetParent(hwndDlg)))
|
|
||||||
static INT_PTR CALLBACK imageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
|
||||||
{
|
|
||||||
switch(uMsg)
|
|
||||||
{
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
{
|
|
||||||
SetWindowLong(hwndDlg,GWLP_USERDATA,lParam);
|
|
||||||
ImgDownloader *d = (ImgDownloader *)lParam;
|
|
||||||
int w=0,h=0;
|
|
||||||
HBITMAP bm = loadImage(d->imgbuf,d->imgbufused,140,140,hwndDlg,&w,&h);
|
|
||||||
SendDlgItemMessage(hwndDlg,IDC_IMAGE,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)bm);
|
|
||||||
wchar_t buf[1024] = {0};
|
|
||||||
StringCchPrintfW(buf,1024,L"%s: %dx%d (%d kB)",d->desc,w,h,(d->imgbufused/1024));
|
|
||||||
SetDlgItemTextW(hwndDlg,IDC_IMGTEXT,buf);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_DESTROY:
|
|
||||||
{
|
|
||||||
ImgDownloader *d = GetParamC(hwndDlg);
|
|
||||||
SetWindowLong(hwndDlg,GWLP_USERDATA,0);
|
|
||||||
if(d) delete d;
|
|
||||||
HBITMAP bm = (HBITMAP)SendDlgItemMessage(hwndDlg,IDC_IMAGE,STM_SETIMAGE,IMAGE_BITMAP,0);
|
|
||||||
if(bm) DeleteObject(bm);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_COMMAND:
|
|
||||||
if(LOWORD(wParam) != IDC_SELECT)
|
|
||||||
break;
|
|
||||||
// else run through
|
|
||||||
case WM_LBUTTONDBLCLK:
|
|
||||||
SendMessageW(GetDlgParent(hwndDlg),WM_SELECTED,(WPARAM)hwndDlg,(LPARAM)GetParamC(hwndDlg));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// scroll shit, nothing interesting is happening down here...
|
|
||||||
|
|
||||||
static INT_PTR CALLBACK scrollChildHostProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
|
||||||
{
|
|
||||||
//static HWND m_child;
|
|
||||||
switch(uMsg)
|
|
||||||
{
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
{
|
|
||||||
RECT r;
|
|
||||||
HWND hw = GetParent(hwndDlg);
|
|
||||||
GetWindowRect(GetDlgItem(hw,IDC_PLACEHOLDER),&r);
|
|
||||||
ScreenToClient(hw,(LPPOINT)&r);
|
|
||||||
ScreenToClient(hw,((LPPOINT)&r)+1);
|
|
||||||
SetWindowPos(hwndDlg,NULL,r.left,r.top,r.right-r.left,r.bottom-r.top,SWP_NOZORDER|SWP_NOACTIVATE);
|
|
||||||
LPCreateDialogW(IDD_ARTDOWNLOADER_SCROLLCHILD,hwndDlg,(WNDPROC)scrollChildProc);
|
|
||||||
|
|
||||||
SCROLLINFO si={sizeof(si),SIF_RANGE|SIF_PAGE,0};
|
|
||||||
si.nPage = (r.right - r.left);
|
|
||||||
SetScrollInfo(hwndDlg,SB_HORZ,&si,TRUE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_ADDCHILD:
|
|
||||||
{
|
|
||||||
HWND m_child = GetWindow(hwndDlg,GW_CHILD);
|
|
||||||
HWND newChild = (HWND)SendMessageW(m_child,uMsg,wParam,lParam);
|
|
||||||
RECT r,r2;
|
|
||||||
GetClientRect(m_child,&r);
|
|
||||||
GetClientRect(hwndDlg,&r2);
|
|
||||||
SCROLLINFO si={sizeof(si),SIF_RANGE|SIF_PAGE,0};
|
|
||||||
si.nMin = 0;
|
|
||||||
si.nMax = (r.right - r.left);
|
|
||||||
si.nPage = (r2.right - r2.left);
|
|
||||||
if(si.nMax < 0) si.nMax = 0;
|
|
||||||
SetScrollInfo(hwndDlg,SB_HORZ,&si,TRUE);
|
|
||||||
return (INT_PTR)newChild;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_HSCROLL:
|
|
||||||
{
|
|
||||||
HWND m_child = GetWindow(hwndDlg,GW_CHILD);
|
|
||||||
int v=0;
|
|
||||||
RECT r;
|
|
||||||
RECT r2;
|
|
||||||
GetClientRect(hwndDlg,&r2);
|
|
||||||
GetClientRect(m_child,&r);
|
|
||||||
int action = LOWORD(wParam);
|
|
||||||
|
|
||||||
if (r2.right < r.right) {
|
|
||||||
if (action == SB_THUMBPOSITION || action == SB_THUMBTRACK) {
|
|
||||||
SCROLLINFO si={sizeof(si),SIF_TRACKPOS|SIF_POS};
|
|
||||||
GetScrollInfo(hwndDlg,SB_HORZ,&si);
|
|
||||||
v=si.nTrackPos;
|
|
||||||
}
|
|
||||||
else if (action == SB_TOP)
|
|
||||||
v=0;
|
|
||||||
else if (action == SB_BOTTOM)
|
|
||||||
v=r.right-r2.right;
|
|
||||||
else if (action == SB_PAGEDOWN || action == SB_LINEDOWN) {
|
|
||||||
SCROLLINFO si={sizeof(si),SIF_TRACKPOS|SIF_POS};
|
|
||||||
GetScrollInfo(hwndDlg,SB_HORZ,&si);
|
|
||||||
if(action == SB_LINEDOWN)
|
|
||||||
v=si.nPos + (r2.right)/10;
|
|
||||||
else
|
|
||||||
v=si.nPos + r2.right;
|
|
||||||
if (v > r.right-r2.right) v=r.right-r2.right;
|
|
||||||
}
|
|
||||||
else if (action == SB_PAGEUP || action == SB_LINEUP) {
|
|
||||||
SCROLLINFO si={sizeof(si),SIF_TRACKPOS|SIF_POS};
|
|
||||||
GetScrollInfo(hwndDlg,SB_HORZ,&si);
|
|
||||||
if(action == SB_LINEUP)
|
|
||||||
v=si.nPos - (r2.right)/10;
|
|
||||||
else
|
|
||||||
v=si.nPos - r2.right;
|
|
||||||
if (v < 0) v=0;
|
|
||||||
}
|
|
||||||
else return 0;
|
|
||||||
|
|
||||||
SetScrollPos(hwndDlg,SB_HORZ,v,!(action == SB_THUMBPOSITION || action == SB_THUMBTRACK));
|
|
||||||
SetWindowPos(m_child,NULL,0-v,0,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
SetScrollPos(hwndDlg,SB_HORZ,0,!(action == SB_THUMBPOSITION || action == SB_THUMBTRACK));
|
|
||||||
SetWindowPos(m_child,NULL,0,0,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static INT_PTR CALLBACK scrollChildProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
|
||||||
{
|
|
||||||
switch(uMsg)
|
|
||||||
{
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
{
|
|
||||||
RECT r;
|
|
||||||
GetClientRect(hwndDlg,&r);
|
|
||||||
SetWindowPos(hwndDlg,0,0,0,0,r.bottom,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_ADDCHILD:
|
|
||||||
{
|
|
||||||
HWND newChild = LPCreateDialogParamW(IDD_ARTDOWNLOADER_IMAGE,hwndDlg,imageProc,lParam);
|
|
||||||
RECT r,r2;
|
|
||||||
GetClientRect(hwndDlg,&r);
|
|
||||||
GetClientRect(newChild,&r2);
|
|
||||||
SetWindowPos(hwndDlg,0,0,0,r.right + r2.right,r.bottom,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
|
|
||||||
SetWindowPos(newChild,0,r.right,0,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
|
|
||||||
ShowWindow(newChild,SW_SHOWNA);
|
|
||||||
return (INT_PTR)newChild;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
|
@ -1,40 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/DataIO.h,v 1.1 2009/04/28 20:21:06 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* filename: DataIO.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: Data I/O include header
|
|
||||||
*
|
|
||||||
* $Header: /cvs/root/winamp/vlb/DataIO.h,v 1.1 2009/04/28 20:21:06 audiodsp Exp $
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef DATAIOCONTROL
|
|
||||||
#define DATAIOCONTROL
|
|
||||||
|
|
||||||
#define DATA_IO_READ 0
|
|
||||||
#define DATA_IO_WRITE 1
|
|
||||||
|
|
||||||
#define DATA_IO_ERROR_NONE 0
|
|
||||||
#define DATA_IO_ERROR_INVALID -1
|
|
||||||
|
|
||||||
|
|
||||||
class DataIOControl{
|
|
||||||
public:
|
|
||||||
virtual int IO( void*pvBuffer,
|
|
||||||
int iSize,
|
|
||||||
int iCount)=0;
|
|
||||||
virtual int Seek(long lOffset, int iOrigin)=0;
|
|
||||||
// virtual int Close()=0;
|
|
||||||
virtual int EndOf()=0;
|
|
||||||
virtual int DICGetLastError()=0;
|
|
||||||
virtual int DICGetDirection()=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,193 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/DolbyPayload.h,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* filename: DolbyPayload.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: Dolby SE bitstream parser include file
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef _DolbyPayload_h_
|
|
||||||
#define _DolbyPayload_h_
|
|
||||||
|
|
||||||
//This is the quickest way to get all the Dolby Payload into the AAC Decoder but not the best!
|
|
||||||
#include<math.h>
|
|
||||||
#include<stdlib.h>
|
|
||||||
#include<stdio.h>
|
|
||||||
#include"bitstream.h"
|
|
||||||
|
|
||||||
#define DSPmax(a,b) (((a) > (b)) ? (a) : (b));
|
|
||||||
#define DSPmin(a,b) (((a) < (b)) ? (a) : (b));
|
|
||||||
|
|
||||||
#define DNS
|
|
||||||
#define SIGNAL_SUB
|
|
||||||
#define DOLBY_MAX_NUM_SFB 64
|
|
||||||
#define DOLBY_BLOCK_LEN_LONG 1024
|
|
||||||
#define SS_BUF_LEN_LONG 150
|
|
||||||
#define SS_BUF_LEN_SHORT 18
|
|
||||||
#define SS_COPYSTART 50
|
|
||||||
#define SS_STEP_LONG 10 /* note that SS_STEP_LONG must divide into SS_BUF_LEN_LONG without remainder,
|
|
||||||
to assure that all values in normCopy array are power normalized.*/
|
|
||||||
#define SS_STEP_SHORT 3 /* note that SS_STEP_SHORT must divide into SS_BUF_LEN_SHORT without remainder,
|
|
||||||
to assure that all values in normCopy array are power normalized.*/
|
|
||||||
|
|
||||||
#define GLOBAL_ATTEN 0.08f
|
|
||||||
#define NS_ATTEN1_LONG 0.975f
|
|
||||||
#define NS_ATTEN2_LONG 0.90f
|
|
||||||
#define NS_ATTEN1_SHORT 0.90f /* 0.816 would be attenuation factor to apply same per octave attenuation as
|
|
||||||
short block, but it is desireable to allow gentler rolloff for short blocks.
|
|
||||||
Thus set to 0.90. */
|
|
||||||
#define NS_ATTEN2_SHORT 0.7f /* To apply the same per octave attenuation as long block, the slope would
|
|
||||||
be too sharp (greater than 6dB from bin to bin), thus allow a gentler slope
|
|
||||||
for short blocks due to flat nature of short block spectra. */
|
|
||||||
#define NSFILT_COEF 0.3f
|
|
||||||
#define BACKWARD_MASK_COMP 0.95f
|
|
||||||
#define START_BIN_LONG 50
|
|
||||||
#define START_BIN_SHORT (START_BIN_LONG / 8)
|
|
||||||
#define SE_MAX_NUM_BANDS 80
|
|
||||||
#define MAX_NUM_POWER_VALUES SE_MAX_NUM_BANDS
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define SE_BAND_IGNORE_BITS 3
|
|
||||||
#define SE_NSHAPE_ORDER 2
|
|
||||||
#define NOISE_LENGTH 10000
|
|
||||||
#define NUM_BANDRES_OPTIONS 2
|
|
||||||
#define SE_BANDRES_2_67_DB 0
|
|
||||||
#define SE_BANDRES_1_33_DB 1
|
|
||||||
#define NUM_BLOCKTYPES 4
|
|
||||||
#define MAX_NUM_WINDOW_GROUPS 8
|
|
||||||
#define SE_DNS_PWR_BITS_SHORT 3
|
|
||||||
#define SE_DNS_PWR_BITS_LONG 4
|
|
||||||
#define SE_SPECT_FLAT_BITS_LONG 8
|
|
||||||
#define SE_SPECT_FLAT_BITS_SHORT 4
|
|
||||||
#define SE_REF_ENERG_BITS_LONG 8
|
|
||||||
#define SE_REF_ENERG_BITS_SHORT 7
|
|
||||||
|
|
||||||
// buffer model control variables
|
|
||||||
#define NEW_BUFFER_MODEL /* if #defined, uses the new buffer model which accounts for */
|
|
||||||
/* frequency alignment between non-short and short frames */
|
|
||||||
//#define DEBUG_PRINT_BUFFER_MODEL /* if #defined, prints out buffer model. Check the exact if statement */
|
|
||||||
/* in the code to see whether or not the long or short buffer model is being printed out */
|
|
||||||
|
|
||||||
#define USE_XFORM_HYSTERESIS
|
|
||||||
#define XFORM_HYSTERESIS_LENGTH 2 /* Hysteresis for switching SE transform lengths. Relevant
|
|
||||||
* only if USE_XFORM_HYSTERESIS is #define'd.
|
|
||||||
* NOTE: Should be between 2 and (2 * NRDB per SE frame) inclusive or
|
|
||||||
* even a clean switch (from single to double or vice-versa) will
|
|
||||||
* elicit an unnecessary sound card close/re-open/glitch (twice).
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct SECTION_INFORMATION_STRUCT{
|
|
||||||
int aiSectionCount[MAX_NUM_WINDOW_GROUPS];
|
|
||||||
int aaiSectionCodebooks[MAX_NUM_WINDOW_GROUPS][DOLBY_MAX_NUM_SFB];
|
|
||||||
int aaiSectionStart[MAX_NUM_WINDOW_GROUPS][DOLBY_MAX_NUM_SFB];
|
|
||||||
int aaiSectionEnd[MAX_NUM_WINDOW_GROUPS][DOLBY_MAX_NUM_SFB];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DNS_INFORMATION_STRUCT{
|
|
||||||
int iWindowSequence;
|
|
||||||
int iGroupCount;
|
|
||||||
int iGroupLength[MAX_NUM_WINDOW_GROUPS];
|
|
||||||
int iMaxSFB;
|
|
||||||
int iLastBin;
|
|
||||||
const int *piBandOffsets;
|
|
||||||
const SECTION_INFORMATION_STRUCT *psSectionInfoStruct;
|
|
||||||
float aafDNSRatio[MAX_NUM_WINDOW_GROUPS][DOLBY_MAX_NUM_SFB];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DOLBY_PAYLOAD_STRUCT{
|
|
||||||
int iDolbyBitStreamWarning;
|
|
||||||
int iUsesDoubleLengthXForm;
|
|
||||||
int iSEPowerResolution;
|
|
||||||
int iChannels;
|
|
||||||
int iSampleRateIndex;
|
|
||||||
int iSampleRate;
|
|
||||||
int num_se_bands[2];
|
|
||||||
int seBands[2][MAX_NUM_WINDOW_GROUPS][SE_MAX_NUM_BANDS];
|
|
||||||
int sfm[2][MAX_NUM_WINDOW_GROUPS];
|
|
||||||
int delta_power_values[2][MAX_NUM_WINDOW_GROUPS][MAX_NUM_POWER_VALUES];
|
|
||||||
float fdamp[2][MAX_NUM_WINDOW_GROUPS];
|
|
||||||
int SE_num_ignored_upper_bands[2];
|
|
||||||
int aiMaxSFB[2];
|
|
||||||
int aiTotalSFB[2];
|
|
||||||
int aiCopyStop[2];
|
|
||||||
int iGroupLength[2][MAX_NUM_WINDOW_GROUPS];
|
|
||||||
int iGroupCount[2];
|
|
||||||
|
|
||||||
DNS_INFORMATION_STRUCT asDNSInfoStruct[2];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Huffman
|
|
||||||
{
|
|
||||||
int index;
|
|
||||||
int len;
|
|
||||||
unsigned long cw;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
struct Huffman_lookup
|
|
||||||
{
|
|
||||||
int index;
|
|
||||||
int len;
|
|
||||||
int cw;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int sr;
|
|
||||||
unsigned int* SE_bands_bw;
|
|
||||||
unsigned char SE_max_num_se_bands;
|
|
||||||
unsigned char SE_num_ignored_upper_bands;
|
|
||||||
} SE_Band_Info_struct;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int powerResolution;
|
|
||||||
Huffman* cwLengthLookupTable;
|
|
||||||
Huffman_lookup* cwValueLookupTable;
|
|
||||||
int num_codewords;
|
|
||||||
} SE_power_resolution_table_struct;
|
|
||||||
|
|
||||||
|
|
||||||
void applyDNS( float *pfSpectralData,
|
|
||||||
DNS_INFORMATION_STRUCT*psDNSInfoStruct,
|
|
||||||
int iPrevWnd);
|
|
||||||
|
|
||||||
|
|
||||||
unsigned char computeSeBandInfo (unsigned int SRate, /* input: Sample Rate */
|
|
||||||
unsigned int first_SE_bin, /* input: bin number of the first bin of the extension range */
|
|
||||||
SE_Band_Info_struct* pSE_Band_Info_struct, /* input: SE band info struct ptr */
|
|
||||||
int* SE_bands_bw, /* output: SE bandwidths, in bins (array; memory assumed to be already allocated) */
|
|
||||||
int* num_SE_bands);
|
|
||||||
|
|
||||||
int spectralExtInfo( int cnt,
|
|
||||||
DOLBY_PAYLOAD_STRUCT *seData,
|
|
||||||
CDolbyBitStream*poBitStream);
|
|
||||||
void spectralExtend(float* pfData,
|
|
||||||
int iCopyStart,
|
|
||||||
int iCopyStop,
|
|
||||||
int iSfm,
|
|
||||||
int iBandCount,
|
|
||||||
int* piBands,
|
|
||||||
int* delta_power_values,
|
|
||||||
float fDamp,
|
|
||||||
int iHBlockSize,
|
|
||||||
int wnd,
|
|
||||||
int SEPowerResolution,
|
|
||||||
int iPreviousWnd,
|
|
||||||
float* avgCopyEnergies);
|
|
||||||
|
|
||||||
void computeAvgCopyEnergies(float* pfData,
|
|
||||||
int iCopyStart,
|
|
||||||
int iCopyStop,
|
|
||||||
int num_se_bands,
|
|
||||||
int* piBands,
|
|
||||||
int halfWindowLength,
|
|
||||||
int iWindowSequence,
|
|
||||||
float* avgCopyEnergies);
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,27 +0,0 @@
|
||||||
#include "NSVFactory.h"
|
|
||||||
#include "nsv_vlb.h"
|
|
||||||
#include "api__vlb.h"
|
|
||||||
#include "../nsv/nsvlib.h"
|
|
||||||
|
|
||||||
IAudioDecoder *NSVFactory::CreateAudioDecoder(FOURCC format, IAudioOutput **output)
|
|
||||||
{
|
|
||||||
switch (format)
|
|
||||||
{
|
|
||||||
case NSV_MAKETYPE('V', 'L', 'B', ' '):
|
|
||||||
{
|
|
||||||
VLB_Decoder *dec;
|
|
||||||
WASABI_API_MEMMGR->New(&dec);
|
|
||||||
return dec;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define CBCLASS NSVFactory
|
|
||||||
START_DISPATCH;
|
|
||||||
CB(SVC_NSVFACTORY_CREATEAUDIODECODER, CreateAudioDecoder)
|
|
||||||
END_DISPATCH;
|
|
||||||
#undef CBCLASS
|
|
|
@ -1,15 +0,0 @@
|
||||||
#ifndef NULLSOFT_VLB_NSVFACTORY_H
|
|
||||||
#define NULLSOFT_VLB_NSVFACTORY_H
|
|
||||||
|
|
||||||
#include "../nsv/svc_nsvFactory.h"
|
|
||||||
|
|
||||||
class NSVFactory : public svc_nsvFactory
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
IAudioDecoder *CreateAudioDecoder(FOURCC format, IAudioOutput **output) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
RECVS_DISPATCH;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,116 +0,0 @@
|
||||||
#include "VLBIO.h"
|
|
||||||
#include "vlbout.h"
|
|
||||||
#include "api__vlb.h"
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// VLB Data Input Class
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
void VLBIn::Fill( unsigned char *buf, int nbytes )
|
|
||||||
{
|
|
||||||
int writepos = pos + size;
|
|
||||||
|
|
||||||
if (writepos >= BUFSIZE) writepos -= BUFSIZE;
|
|
||||||
|
|
||||||
if (writepos + nbytes > BUFSIZE)
|
|
||||||
{
|
|
||||||
int l = BUFSIZE - writepos;
|
|
||||||
memcpy(data + writepos, buf, l);
|
|
||||||
buf += l;
|
|
||||||
writepos += l;
|
|
||||||
size += l;
|
|
||||||
nbytes -= l;
|
|
||||||
if (writepos >= BUFSIZE) writepos -= BUFSIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy( data + writepos, buf, nbytes );
|
|
||||||
size += nbytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
int VLBIn::IO( void *buf, int s, int n )
|
|
||||||
{
|
|
||||||
int nbytes = s * n;
|
|
||||||
void *obuf = buf;
|
|
||||||
if ( nbytes > size )
|
|
||||||
{
|
|
||||||
nbytes = size - nbytes % s;
|
|
||||||
}
|
|
||||||
if (!nbytes) return 0;
|
|
||||||
|
|
||||||
int bleft = nbytes;
|
|
||||||
|
|
||||||
if (pos + nbytes > BUFSIZE)
|
|
||||||
{
|
|
||||||
int l = BUFSIZE - pos;
|
|
||||||
memcpy(buf, data + pos, l);
|
|
||||||
bleft -= l;
|
|
||||||
pos = 0;
|
|
||||||
buf = (char *)buf + l;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(buf, data + pos, bleft);
|
|
||||||
|
|
||||||
size -= nbytes;
|
|
||||||
pos += bleft;
|
|
||||||
if (pos >= BUFSIZE) pos = 0;
|
|
||||||
|
|
||||||
return nbytes / s;
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// VLB Data Output Class
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#define ADD_SAMPLE(T,S) { *(T *)(data + ((size + pos) & (OBUFSIZE-1))) = S; size += sizeof(T); }
|
|
||||||
|
|
||||||
#if !defined(__alpha) && !defined(_WIN64)
|
|
||||||
static __inline long float_to_long(double t)
|
|
||||||
{
|
|
||||||
long r;
|
|
||||||
__asm fld t
|
|
||||||
__asm fistp r
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define float_to_long(x) ((long)( x ))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int VLBOut::IO( float **buf, int samples )
|
|
||||||
{
|
|
||||||
if ( iError ) return iError;
|
|
||||||
|
|
||||||
long l;
|
|
||||||
for ( int i = 0; i < samples; i++ )
|
|
||||||
for ( int j = 0; j < format.ucNChannels; j++ )
|
|
||||||
{
|
|
||||||
l = float_to_long( buf[j][i] );
|
|
||||||
if ( l > 32767 ) l = 32767;
|
|
||||||
if ( l < -32768 ) l = -32768;
|
|
||||||
ADD_SAMPLE(short, (short)l)
|
|
||||||
}
|
|
||||||
|
|
||||||
return iError;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VLBOut::PullBytes( unsigned char *buf, int nbytes )
|
|
||||||
{
|
|
||||||
if (pos + nbytes >= OBUFSIZE)
|
|
||||||
{
|
|
||||||
int l = OBUFSIZE - pos;
|
|
||||||
memcpy(buf, data + pos, l);
|
|
||||||
pos = 0;
|
|
||||||
buf += l;
|
|
||||||
nbytes -= l;
|
|
||||||
size -= l;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy( buf, data + pos, nbytes );
|
|
||||||
size -= nbytes;
|
|
||||||
pos += nbytes;
|
|
||||||
if (pos >= OBUFSIZE) pos = 0;
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include "dataio.h"
|
|
||||||
#include "vlbout.h"
|
|
||||||
class VLBIn : public DataIOControl
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
VLBIn() { pos = size = 0; }
|
|
||||||
virtual int IO( void *buf, int size, int count );
|
|
||||||
virtual int Seek( long offset, int origin )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
virtual int Close() { return 0; }
|
|
||||||
virtual int EndOf( void ) { return 0; }
|
|
||||||
virtual int DICGetLastError() { return DATA_IO_ERROR_NONE; }
|
|
||||||
virtual int DICGetDirection() { return DATA_IO_READ; }
|
|
||||||
int GetInputFree() { return BUFSIZE - size; }
|
|
||||||
int GetSize() { return size; }
|
|
||||||
void Fill( unsigned char *buf, int nbytes );
|
|
||||||
void Empty() { pos = size = 0; }
|
|
||||||
private:
|
|
||||||
unsigned char data[BUFSIZE];
|
|
||||||
int size, pos;
|
|
||||||
};
|
|
|
@ -1,79 +0,0 @@
|
||||||
#include "VLBDecoder.h"
|
|
||||||
VLBDecoder::VLBDecoder()
|
|
||||||
{
|
|
||||||
decoder = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
VLBDecoder::~VLBDecoder()
|
|
||||||
{
|
|
||||||
delete decoder;
|
|
||||||
}
|
|
||||||
|
|
||||||
int VLBDecoder::Open(DataIOControl *paacInput)
|
|
||||||
{
|
|
||||||
if (decoder)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
decoder = new CAacDecoderApi(paacInput);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VLBDecoder::Close()
|
|
||||||
{
|
|
||||||
delete decoder;
|
|
||||||
decoder=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
long VLBDecoder::Synchronize(AACStreamParameters *paacStreamParameters)
|
|
||||||
{
|
|
||||||
if (decoder)
|
|
||||||
{
|
|
||||||
long status = decoder->Synchronize(paacStreamParameters);
|
|
||||||
if (status == 0)
|
|
||||||
{
|
|
||||||
info.ucNChannels = (unsigned char) paacStreamParameters->num_channels;
|
|
||||||
info.uiSampleRate = paacStreamParameters->sampling_frequency;
|
|
||||||
|
|
||||||
dataout.SetFormatInfo(&info);
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return ERR_SYNC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
long VLBDecoder::DecodeFrame(AACStreamParameters *paacStreamParameters)
|
|
||||||
{
|
|
||||||
if (decoder)
|
|
||||||
return decoder->DecodeFrame(&dataout, paacStreamParameters);
|
|
||||||
else
|
|
||||||
return ERR_INVALID_BITSTREAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VLBDecoder::Flush()
|
|
||||||
{
|
|
||||||
dataout.Empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t VLBDecoder::Read(void *buffer, size_t bufferlen)
|
|
||||||
{
|
|
||||||
if (dataout.BytesAvail() > 0)
|
|
||||||
{
|
|
||||||
size_t l = dataout.BytesAvail();
|
|
||||||
if (l > bufferlen)
|
|
||||||
l = bufferlen;
|
|
||||||
dataout.PullBytes((unsigned char *)buffer, (int)l);
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CBCLASS VLBDecoder
|
|
||||||
START_DISPATCH;
|
|
||||||
CB(OBJ_VLBDECODER_OPEN, Open)
|
|
||||||
VCB(OBJ_VLBDECODER_CLOSE, Close)
|
|
||||||
CB(OBJ_VLBDECODER_SYNCHRONIZE, Synchronize)
|
|
||||||
CB(OBJ_VLBDECODER_DECODEFRAME, DecodeFrame)
|
|
||||||
VCB(OBJ_VLBDECODER_FLUSH, Flush)
|
|
||||||
CB(OBJ_VLBDECODER_READ, Read)
|
|
||||||
END_DISPATCH;
|
|
|
@ -1,21 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include "obj_vlbDecoder.h"
|
|
||||||
#include "vlbout.h"
|
|
||||||
class VLBDecoder : public obj_vlbDecoder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
VLBDecoder();
|
|
||||||
~VLBDecoder();
|
|
||||||
int Open(DataIOControl *paacInput);
|
|
||||||
void Close();
|
|
||||||
long Synchronize(AACStreamParameters *paacStreamParameters);
|
|
||||||
long DecodeFrame(AACStreamParameters *paacStreamParameters);
|
|
||||||
void Flush();
|
|
||||||
size_t Read(void *buffer, size_t bufferlen);
|
|
||||||
protected:
|
|
||||||
RECVS_DISPATCH;
|
|
||||||
private:
|
|
||||||
CAacDecoderApi *decoder;
|
|
||||||
VLBOut dataout;
|
|
||||||
AUDIO_FORMATINFO info;
|
|
||||||
};
|
|
|
@ -1,434 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/aacdecoder.cpp,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: aacdecoder.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: decoder main object
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "aacdecoder.h"
|
|
||||||
#include "bitstream.h"
|
|
||||||
#include "bitsequence.h"
|
|
||||||
#include "channelinfo.h"
|
|
||||||
|
|
||||||
#include<stdio.h>
|
|
||||||
// // //
|
|
||||||
|
|
||||||
CAacDecoder::CAacDecoder (CDolbyBitStream& bs)
|
|
||||||
: m_bs (bs), sce (bs), cpe (bs), lfe (bs), dse (bs),bIgnoreDolbyStream(false), bLookForDSEInfoStream(true),
|
|
||||||
bHasDSEInfoStream(false)
|
|
||||||
{
|
|
||||||
m_BlockNumber = 0 ;
|
|
||||||
m_SelectedProgram = 0 ;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
CAacDecoder::~CAacDecoder ()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAacDecoder::SetEqualization (bool wantEQ, float Mask [])
|
|
||||||
{
|
|
||||||
sce.SetEqualization (wantEQ, Mask) ;
|
|
||||||
cpe.SetEqualization (wantEQ, Mask) ;
|
|
||||||
lfe.SetEqualization (wantEQ, Mask) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAacDecoder::ReadFillElement (void)
|
|
||||||
{
|
|
||||||
CVLBBitSequence count (4) ;
|
|
||||||
if (count.Read (m_bs) == 15)
|
|
||||||
{
|
|
||||||
CVLBBitSequence esc_count (8) ;
|
|
||||||
esc_count.Read (m_bs) ;
|
|
||||||
|
|
||||||
count = esc_count + 14 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVLBBitSequence fill_byte (8) ;
|
|
||||||
for (int i = 0 ; i < count ; i++)
|
|
||||||
{
|
|
||||||
fill_byte.Read (m_bs) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void CAacDecoder::ReadDolbyFillElement (void)
|
|
||||||
{
|
|
||||||
CVLBBitSequence count (4) ;
|
|
||||||
int iCountInBytes;
|
|
||||||
int iCountInBits;
|
|
||||||
|
|
||||||
if (count.Read (m_bs) == 15)
|
|
||||||
{
|
|
||||||
CVLBBitSequence esc_count (8) ;
|
|
||||||
esc_count.Read (m_bs) ;
|
|
||||||
|
|
||||||
count = esc_count + 14 ;
|
|
||||||
}
|
|
||||||
iCountInBytes=(int)count;
|
|
||||||
iCountInBits = iCountInBytes * 8;
|
|
||||||
|
|
||||||
CVLBBitSequence fill_byte (8) ;
|
|
||||||
CVLBBitSequence fill_nibble(4);
|
|
||||||
if(iCountInBytes){
|
|
||||||
fill_nibble.Read(m_bs);
|
|
||||||
if(bLookForDSEInfoStream && ((int)fill_nibble)==15){
|
|
||||||
iCountInBits=spectralExtInfo(iCountInBytes,&sDSEInfo,&m_bs);
|
|
||||||
|
|
||||||
// Debug: simulate a bitstream error. This will cause the
|
|
||||||
// MDCT record to be zeroed-out at higher frequencies prior to
|
|
||||||
// the inverse transform.
|
|
||||||
// iCountInBits = iCountInBytes*8 - 4;
|
|
||||||
// sDSEInfo.iDolbyBitStreamWarning = 942;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bHasDSEInfoStream=true;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
|
|
||||||
// read out the rest of the byte; adjust bits read counter
|
|
||||||
fill_nibble.Read(m_bs);
|
|
||||||
iCountInBits -= 8;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there was an error in reading the SE bitstream, or if there are fill
|
|
||||||
// bits left in the same fill element, then read out the rest of the Fill Element.
|
|
||||||
|
|
||||||
while(iCountInBits > 8)
|
|
||||||
{
|
|
||||||
fill_byte.Read (m_bs);
|
|
||||||
iCountInBits -= 8;
|
|
||||||
}
|
|
||||||
if (iCountInBits > 0 && iCountInBits <= 8)
|
|
||||||
{
|
|
||||||
m_bs.Get(iCountInBits);
|
|
||||||
iCountInBits -= iCountInBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAacDecoder::FrameInit(CStreamInfo &info)
|
|
||||||
{
|
|
||||||
if (m_bs.IsAdifHeaderPresent ())
|
|
||||||
{
|
|
||||||
m_AdifHeader.Read (m_bs) ;
|
|
||||||
|
|
||||||
info.SetBitRate (m_AdifHeader.GetBitRate ()) ;
|
|
||||||
info.SetOriginalCopy(m_AdifHeader.GetOriginalCopy());
|
|
||||||
info.SetHome(m_AdifHeader.GetHome());
|
|
||||||
|
|
||||||
info.SetSamplingRateIndex(m_AdifHeader.GetProgramConfig(0).GetSamplingFrequencyIndex());
|
|
||||||
info.SetSamplingRate(CChannelInfo::SamplingRateFromIndex(info.GetSamplingRateIndex ()));
|
|
||||||
info.SetChannels(m_AdifHeader.GetProgramConfig(0).GetNumChannels());
|
|
||||||
info.SetProfile(m_AdifHeader.GetProgramConfig(0).GetProfile());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//MSV:
|
|
||||||
void CAacDecoder::InitDSEInfo( CDolbyBitStream*poBS,
|
|
||||||
CChannelElement *poChannelElement)
|
|
||||||
{
|
|
||||||
// note that poChannelElement can be either poSingleChannel or poChannelPair.
|
|
||||||
// depending on a mono or stereo vlb bitstream. We will deal with poChannelElement
|
|
||||||
// (base class) calls in this function for either type of Channel Element, with the
|
|
||||||
// exception of calling Get[Left|Right]Block() for ChannelPair Elements.
|
|
||||||
int numChannels = poChannelElement->GetNumberOfChannels();
|
|
||||||
int channelIndex;
|
|
||||||
|
|
||||||
if (numChannels == 1 || numChannels == 2)
|
|
||||||
{
|
|
||||||
CBlock *poCBlock[2];
|
|
||||||
CChannelInfo *poCChannelInfo;
|
|
||||||
|
|
||||||
// This is garaunteed to set poCLongBlock to valid values,
|
|
||||||
// since we've already checked the number of channels!
|
|
||||||
|
|
||||||
// GetChannelInfo could be made a virtual function of the base class, thus
|
|
||||||
// avoiding the need to specifically call different versions of GetChannelInfo()
|
|
||||||
// below, but this would require moving more code to the Base Class, which is
|
|
||||||
// unnecessarily complex. Note, however, that for CPE's, there poChannelInfo returns
|
|
||||||
// a pointer to an array of 2 ChannelInfo objects.
|
|
||||||
if (numChannels == 1)
|
|
||||||
{
|
|
||||||
poCBlock[0]=(CBlock*)( ((CSingleChannel*)poChannelElement)->GetBlock() );
|
|
||||||
poCChannelInfo = ((CSingleChannel*)poChannelElement)->GetChannelInfo();
|
|
||||||
|
|
||||||
} else { // num_channels == 2
|
|
||||||
poCBlock[0]=(CBlock*)( ((CChannelPair*)poChannelElement)->GetLeftBlock() );
|
|
||||||
poCBlock[1]=(CBlock*)( ((CChannelPair*)poChannelElement)->GetRightBlock() );
|
|
||||||
poCChannelInfo = ((CChannelPair*)poChannelElement)->GetChannelInfo();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Fill Out Dolby Payload Structure:
|
|
||||||
sDSEInfo.iChannels=numChannels;
|
|
||||||
|
|
||||||
// sampling rate is same for both channels; just use sr info from the left (0th) channel
|
|
||||||
sDSEInfo.iSampleRateIndex=poCChannelInfo[0].GetSamplingIndex();
|
|
||||||
sDSEInfo.iSampleRate=poCChannelInfo[0].GetSamplingFrequency();
|
|
||||||
|
|
||||||
// all other information must be read for left and right channels
|
|
||||||
for (channelIndex=0;channelIndex<numChannels;channelIndex++)
|
|
||||||
{
|
|
||||||
sDSEInfo.aiMaxSFB[channelIndex]=poCChannelInfo[channelIndex].GetScaleFactorBandsTransmitted();
|
|
||||||
sDSEInfo.aiTotalSFB[channelIndex]=poCChannelInfo[channelIndex].GetScaleFactorBandsTotal();
|
|
||||||
sDSEInfo.asDNSInfoStruct[channelIndex].psSectionInfoStruct=poCBlock[channelIndex]->GetSectionInfo();
|
|
||||||
sDSEInfo.asDNSInfoStruct[channelIndex].iWindowSequence=poCChannelInfo[channelIndex].GetWindowSequence();
|
|
||||||
sDSEInfo.asDNSInfoStruct[channelIndex].iGroupCount=poCChannelInfo[channelIndex].GetWindowGroups();
|
|
||||||
sDSEInfo.asDNSInfoStruct[channelIndex].iLastBin=poCChannelInfo[channelIndex].GetLastBin();
|
|
||||||
sDSEInfo.asDNSInfoStruct[channelIndex].iMaxSFB=poCChannelInfo[channelIndex].GetScaleFactorBandsTransmitted();
|
|
||||||
sDSEInfo.asDNSInfoStruct[channelIndex].piBandOffsets=poCChannelInfo[channelIndex].GetScaleFactorBandOffsets();
|
|
||||||
sDSEInfo.aiCopyStop[channelIndex]=poCChannelInfo[channelIndex].GetLastBin();
|
|
||||||
|
|
||||||
sDSEInfo.iGroupCount[channelIndex]=poCChannelInfo[channelIndex].GetWindowGroups();
|
|
||||||
for (int i=0;i<sDSEInfo.asDNSInfoStruct[channelIndex].iGroupCount;i++)
|
|
||||||
{
|
|
||||||
sDSEInfo.iGroupLength[channelIndex][i] = poCChannelInfo[channelIndex].GetWindowGroupLength(i);
|
|
||||||
sDSEInfo.asDNSInfoStruct[channelIndex].iGroupLength[i] = poCChannelInfo[channelIndex].GetWindowGroupLength(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
bLookForDSEInfoStream=false;
|
|
||||||
}
|
|
||||||
if(bIgnoreDolbyStream) bLookForDSEInfoStream=false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ELEMENT_TYPE_SCE 0
|
|
||||||
#define ELEMENT_TYPE_CPE 1
|
|
||||||
#define ELEMENT_TYPE_IGNORE 3
|
|
||||||
|
|
||||||
void CAacDecoder::DecodeFrame (AudioIOControl *poAudioIO, CStreamInfo &info)
|
|
||||||
{
|
|
||||||
int iRepeatCount = m_bs.GetNRDB() + 1;
|
|
||||||
|
|
||||||
for(int n = 0; n < iRepeatCount; n++)
|
|
||||||
{
|
|
||||||
bool bHasElement;
|
|
||||||
int iElementType;
|
|
||||||
|
|
||||||
m_SelectedProgram = 0;
|
|
||||||
bLookForDSEInfoStream = true;
|
|
||||||
bHasDSEInfoStream = false;
|
|
||||||
|
|
||||||
bHasElement = false;
|
|
||||||
iElementType = ELEMENT_TYPE_IGNORE;
|
|
||||||
// support Audio_Data_Interchange_Format header, if present
|
|
||||||
|
|
||||||
CProgramConfig &pce = m_AdifHeader.GetProgramConfig(m_SelectedProgram);
|
|
||||||
|
|
||||||
if ((m_BlockNumber == 0) && m_bs.IsAdifHeaderPresent())
|
|
||||||
{
|
|
||||||
info.SetSamplingRateIndex (pce.GetSamplingFrequencyIndex());
|
|
||||||
info.SetProfile (pce.GetProfile());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
info.SetChannels(0);
|
|
||||||
info.SetSamplingRate (CChannelInfo::SamplingRateFromIndex(info.GetSamplingRateIndex ()));
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
CVLBBitSequence type (3), tag (4);
|
|
||||||
|
|
||||||
m_bs.ByteAlign();
|
|
||||||
|
|
||||||
while (type != CAacDecoder::ID_END)
|
|
||||||
{
|
|
||||||
type.Read(m_bs);
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case CAacDecoder::ID_SCE:
|
|
||||||
if(bHasElement)
|
|
||||||
{
|
|
||||||
|
|
||||||
throw EUnimplemented();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_bs.SetPositionMarker(CDolbyBitStream::ChannelElementStart);
|
|
||||||
|
|
||||||
tag.Read (m_bs);
|
|
||||||
sce.Read (info);
|
|
||||||
|
|
||||||
m_bs.SetPositionMarker(CDolbyBitStream::ChannelElementStop);
|
|
||||||
|
|
||||||
if(!bHasElement)
|
|
||||||
{
|
|
||||||
iElementType = ELEMENT_TYPE_SCE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw EUnimplemented();
|
|
||||||
iElementType = ELEMENT_TYPE_IGNORE;
|
|
||||||
}
|
|
||||||
|
|
||||||
info.IncChannels(1);
|
|
||||||
bHasElement = true;
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case CAacDecoder::ID_CPE:
|
|
||||||
if(bHasElement)
|
|
||||||
{
|
|
||||||
throw EUnimplemented();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_bs.SetPositionMarker(CDolbyBitStream::ChannelElementStart);
|
|
||||||
|
|
||||||
tag.Read(m_bs);
|
|
||||||
cpe.Read(info);
|
|
||||||
|
|
||||||
m_bs.SetPositionMarker(CDolbyBitStream::ChannelElementStop);
|
|
||||||
|
|
||||||
if(!bHasElement)
|
|
||||||
{
|
|
||||||
iElementType = ELEMENT_TYPE_CPE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw EUnimplemented();
|
|
||||||
iElementType = ELEMENT_TYPE_IGNORE;
|
|
||||||
}
|
|
||||||
|
|
||||||
info.IncChannels (2);
|
|
||||||
bHasElement = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CAacDecoder::ID_CCE:
|
|
||||||
|
|
||||||
throw EUnimplemented();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CAacDecoder::ID_LFE:
|
|
||||||
|
|
||||||
m_bs.SetPositionMarker(CDolbyBitStream::ChannelElementStart);
|
|
||||||
|
|
||||||
tag.Read(m_bs);
|
|
||||||
lfe.Read(info);
|
|
||||||
|
|
||||||
m_bs.SetPositionMarker(CDolbyBitStream::ChannelElementStop);
|
|
||||||
|
|
||||||
if (pce.AddChannel(tag,false))
|
|
||||||
{
|
|
||||||
throw EUnimplemented();
|
|
||||||
info.IncChannels(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
iElementType = ELEMENT_TYPE_IGNORE;
|
|
||||||
bHasElement = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CAacDecoder::ID_DSE:
|
|
||||||
|
|
||||||
tag.Read(m_bs);
|
|
||||||
dse.Read();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CAacDecoder::ID_PCE:
|
|
||||||
|
|
||||||
m_AdifHeader.GetProgramConfig(tag.Read(m_bs)).Read(m_bs);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CAacDecoder::ID_FIL:
|
|
||||||
|
|
||||||
switch(iElementType)
|
|
||||||
{
|
|
||||||
case ELEMENT_TYPE_SCE:
|
|
||||||
InitDSEInfo(&m_bs,&sce);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ELEMENT_TYPE_CPE:
|
|
||||||
InitDSEInfo(&m_bs,&cpe);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReadDolbyFillElement();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CAacDecoder::ID_END:
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Check for main profile. abort is bitstream is main profile
|
|
||||||
|
|
||||||
#ifndef MAIN_PROFILE
|
|
||||||
if (info.GetProfile() == 0)
|
|
||||||
{
|
|
||||||
throw EIllegalProfile();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(poAudioIO) //Only perform actual decode if we have a valid output buffer object pointer
|
|
||||||
{
|
|
||||||
switch(iElementType)
|
|
||||||
{
|
|
||||||
case ELEMENT_TYPE_SCE:
|
|
||||||
if (pce.AddChannel(tag,false))
|
|
||||||
{
|
|
||||||
if(bHasDSEInfoStream)
|
|
||||||
{
|
|
||||||
sce.DecodeDolby(poAudioIO,&sDSEInfo,info);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sce.Decode(poAudioIO,info);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ELEMENT_TYPE_CPE:
|
|
||||||
if (pce.AddChannel (tag,true))
|
|
||||||
{
|
|
||||||
|
|
||||||
if(bHasDSEInfoStream)
|
|
||||||
{
|
|
||||||
cpe.DecodeDolby(poAudioIO,&sDSEInfo,info);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cpe.Decode(poAudioIO,info,2);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
info.SetNumberOfFrontChannels (info.GetChannels ());
|
|
||||||
info.SetChannelMask (Speaker_FrontLeft + Speaker_FrontRight);
|
|
||||||
|
|
||||||
m_BlockNumber++;
|
|
||||||
|
|
||||||
if(n && poAudioIO) m_bs.DecrementBlocks();//NRDB == N-1!
|
|
||||||
|
|
||||||
m_bs.ByteAlign();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (poAudioIO == NULL)
|
|
||||||
{
|
|
||||||
m_bs.SetFrameReadButNotDecoded();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_bs.ClearFrameReadButNotDecoded();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,215 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/aacdecoder.h,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: aacdecoder.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: decoder main object
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __AACDECODER_H__
|
|
||||||
#define __AACDECODER_H__
|
|
||||||
|
|
||||||
#include "channel.h"
|
|
||||||
#include "programcfg.h"
|
|
||||||
#include "datastream.h"
|
|
||||||
#include "exception.h"
|
|
||||||
#include "adif.h"
|
|
||||||
#include "streaminfo.h"
|
|
||||||
#include "aacdecoderapi.h"
|
|
||||||
#include "bitbuffer.h"
|
|
||||||
#include "DolbyPayload.h"
|
|
||||||
#include "audio_io.h"
|
|
||||||
|
|
||||||
|
|
||||||
//typedef struct {
|
|
||||||
// short file_format;
|
|
||||||
// long bitrate;
|
|
||||||
//} AACStreamParameters;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
long frame_length;
|
|
||||||
short protection_absent;
|
|
||||||
short copyright;
|
|
||||||
short original_copy;
|
|
||||||
char copyright_id[9];
|
|
||||||
} AACFrameParameters;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
short pce_instance_tag;
|
|
||||||
short profile;
|
|
||||||
long sampling_frequency;
|
|
||||||
short num_channels;
|
|
||||||
short num_front_channels;
|
|
||||||
short num_side_channels;
|
|
||||||
short num_back_channels;
|
|
||||||
short num_lfe_channels;
|
|
||||||
short num_coupling_channels;
|
|
||||||
short *pcoupling_channel_tags;
|
|
||||||
short mono_mixdown_present;
|
|
||||||
short stereo_mixdown_present;
|
|
||||||
short matrix_mixdown_present;
|
|
||||||
short pseudo_surround_present;
|
|
||||||
short drc_present;
|
|
||||||
unsigned int prog_ref_level;
|
|
||||||
char *comment_field_data;
|
|
||||||
} AACProgramParameters;
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
short pce_instance_tag;
|
|
||||||
short channel_config;
|
|
||||||
unsigned int *pcoupling_channel_tags;
|
|
||||||
short drc_factor_high;
|
|
||||||
short drc_factor_low;
|
|
||||||
unsigned int target_level;
|
|
||||||
} AACDecodeParameters;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CDolbyBitStream ;
|
|
||||||
|
|
||||||
/** MPEG-2 AAC Decoder Top Level Object.
|
|
||||||
|
|
||||||
This is the main decoder object that interfaces with the application code.
|
|
||||||
It wraps the bitstream element objects and calls their individual decoding methods.
|
|
||||||
To indicate unexpected events and error conditions that prevent correct operation,
|
|
||||||
an exception derived from \Ref{CAacException} will be thrown that should be caught
|
|
||||||
by the calling application's decoding loop.
|
|
||||||
|
|
||||||
\URL[High Level Objects - Overview Diagram]{overview.html}
|
|
||||||
|
|
||||||
\URL[MPEG-2 AAC Decoder Block Diagram]{scheme.html}
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CAacDecoder
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
/** Former API parameter structures */
|
|
||||||
|
|
||||||
AACStreamParameters *pAACStreamParameters;
|
|
||||||
AACFrameParameters *pAACFrameParameters;
|
|
||||||
AACProgramParameters *pAACProgramParameters[AAC_MAX_PROGRAMS];
|
|
||||||
AACDecodeParameters *pAACDecodeParameters;
|
|
||||||
|
|
||||||
|
|
||||||
/** Object Constructor.
|
|
||||||
|
|
||||||
Instantiates a decoder object capable of decoding one stream of
|
|
||||||
MPEG-2 AAC Audio Data.
|
|
||||||
|
|
||||||
@param bs The \Ref{CDolbyBitStream} object that the decoder will read from.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CAacDecoder (CDolbyBitStream &bs) ;
|
|
||||||
~CAacDecoder () ;
|
|
||||||
|
|
||||||
|
|
||||||
/** Frame Initialization Method.
|
|
||||||
|
|
||||||
This method initializes the frame and encodes the ADIF header.
|
|
||||||
|
|
||||||
@param info The configuration information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void FrameInit(CStreamInfo &info);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Main Decoding Method.
|
|
||||||
|
|
||||||
This method delivers one frame of decoded pcm audio data.
|
|
||||||
|
|
||||||
@param pcmbuf The decoded data will be written to the buffer provided by the application.
|
|
||||||
This buffer must be allocated large enough to hold one frame.
|
|
||||||
@param info The configuration information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void DecodeFrame (AudioIOControl *poAudioIO, CStreamInfo &info) ;
|
|
||||||
|
|
||||||
/** Equalizer Configuration Method.
|
|
||||||
|
|
||||||
This method configures the built-in spectral equalizer.
|
|
||||||
|
|
||||||
@param wantEQ Turn the Equalizer on/off.
|
|
||||||
@param Mask An array of 16 coefficients that will be applied to the spectral data
|
|
||||||
of all active channel elements in ascending order.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void SetEqualization (bool wantEQ, float Mask []) ;
|
|
||||||
|
|
||||||
/** Status Information Method.
|
|
||||||
|
|
||||||
This method returns the number of raw_data_blocks decoded until now.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int GetNumberOfBlocksDecoded (void)
|
|
||||||
{
|
|
||||||
return m_BlockNumber ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int GetDolbyBitstreamWarning(void)
|
|
||||||
{
|
|
||||||
return sDSEInfo.iDolbyBitStreamWarning;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool HasDolbySpectralExtension(){return bHasDSEInfoStream;}
|
|
||||||
bool HasDoubleLengthXForm(){return (sDSEInfo.iUsesDoubleLengthXForm ? true : false);}
|
|
||||||
void IgnoreDolbyStream(bool bIgnore){bIgnoreDolbyStream=bIgnore;}
|
|
||||||
|
|
||||||
CAdifHeader* GetAdifHeader(void) { return &m_AdifHeader; }
|
|
||||||
/*Default Not Ignore*/
|
|
||||||
private:
|
|
||||||
//MSV:
|
|
||||||
void InitDSEInfo(CDolbyBitStream*poBS,CChannelElement*poChannelElement);
|
|
||||||
private:
|
|
||||||
bool bLookForDSEInfoStream;
|
|
||||||
bool bHasDSEInfoStream;
|
|
||||||
bool bIgnoreDolbyStream;
|
|
||||||
DOLBY_PAYLOAD_STRUCT sDSEInfo;
|
|
||||||
protected :
|
|
||||||
|
|
||||||
void ReadFillElement (void) ;
|
|
||||||
void ReadDolbyFillElement (void) ;
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
ID_SCE = 0,
|
|
||||||
ID_CPE,
|
|
||||||
ID_CCE,
|
|
||||||
ID_LFE,
|
|
||||||
ID_DSE,
|
|
||||||
ID_PCE,
|
|
||||||
ID_FIL,
|
|
||||||
ID_END
|
|
||||||
} ;
|
|
||||||
|
|
||||||
CDolbyBitStream &m_bs ;
|
|
||||||
|
|
||||||
CSingleChannel sce ;
|
|
||||||
CChannelPair cpe ;
|
|
||||||
CSingleChannel lfe ;
|
|
||||||
CDataStream dse ;
|
|
||||||
|
|
||||||
CAdifHeader m_AdifHeader ;
|
|
||||||
|
|
||||||
int m_BlockNumber ;
|
|
||||||
int m_SelectedProgram ;
|
|
||||||
|
|
||||||
DECLARE_EXCEPTION(EUnimplemented, AAC_UNIMPLEMENTED, "Unimplemented Feature Used") ;
|
|
||||||
DECLARE_EXCEPTION(EDolbyNotSupported, AAC_DOLBY_NOT_SUPPORTED, "Not Supported") ;
|
|
||||||
DECLARE_EXCEPTION(EIllegalProfile, AAC_ILLEGAL_PROFILE, "Illegal Profile") ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,441 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/aacdecoderapi.cpp,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: aacdecode.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: AAC decoder API
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "aacdecoderapi.h"
|
|
||||||
#include "aacdecoder.h"
|
|
||||||
#include "plainfile.h"
|
|
||||||
#include "bitbuffer.h"
|
|
||||||
#include "streaminfo.h"
|
|
||||||
#include "DataIO.h"
|
|
||||||
|
|
||||||
// sample frequency table
|
|
||||||
// converts sample frequency index to actual sample frequency
|
|
||||||
const unsigned int CAacDecoderApi::sfTab[16] =
|
|
||||||
{
|
|
||||||
96000,
|
|
||||||
88200,
|
|
||||||
64000,
|
|
||||||
48000,
|
|
||||||
44100,
|
|
||||||
32000,
|
|
||||||
24000,
|
|
||||||
22050,
|
|
||||||
16000,
|
|
||||||
12000,
|
|
||||||
11025,
|
|
||||||
8000,
|
|
||||||
0, // reserved
|
|
||||||
0, // reserved
|
|
||||||
0, // reserved
|
|
||||||
0 // reserved
|
|
||||||
};
|
|
||||||
|
|
||||||
DECLARE_EXCEPTION(ESyncError, AAC_SYNCERROR, "Synchronization Error!") ;
|
|
||||||
|
|
||||||
|
|
||||||
CAacDecoderApi::CAacDecoderApi (DataIOControl *paacInput) :
|
|
||||||
cbValid(0),
|
|
||||||
cbActual(0),
|
|
||||||
decoder(NULL),
|
|
||||||
input(NULL),
|
|
||||||
buffer(NULL),
|
|
||||||
info(NULL)
|
|
||||||
{
|
|
||||||
info = new CStreamInfo;
|
|
||||||
|
|
||||||
input = new CPlainFile(paacInput);
|
|
||||||
|
|
||||||
buffer = new CDolbyBitBuffer;
|
|
||||||
|
|
||||||
decoder = input->IsAdifHeaderPresent () ? new CAacDecoder (*input) : new CAacDecoder (*buffer);
|
|
||||||
|
|
||||||
decoder->FrameInit(*info);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CAacDecoderApi::~CAacDecoderApi ()
|
|
||||||
{
|
|
||||||
delete decoder;
|
|
||||||
delete input;
|
|
||||||
delete buffer;
|
|
||||||
delete info;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
long CAacDecoderApi::Synchronize(AACStreamParameters *pAACStreamParameters)
|
|
||||||
{
|
|
||||||
long lReturn = ERR_SYNC_ERROR;
|
|
||||||
int iResyncCount = 5;
|
|
||||||
|
|
||||||
if (input->IsAdifHeaderPresent ())
|
|
||||||
{
|
|
||||||
/* Cannot resync to an ADIF stream! */
|
|
||||||
lReturn = ERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
#if defined (_DEBUG)
|
|
||||||
// cout << "Resynchronizing" << endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
buffer->ClearBytesSkipped();
|
|
||||||
while(lReturn != ERR_NO_ERROR && lReturn != ERR_END_OF_FILE && iResyncCount)
|
|
||||||
{
|
|
||||||
|
|
||||||
//Reset the block count:
|
|
||||||
buffer->ResetBlocks();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!cbValid)
|
|
||||||
{
|
|
||||||
cbValid = input->Read (readbuf, cbSize);
|
|
||||||
|
|
||||||
if (!cbValid)
|
|
||||||
buffer->SetEOF();
|
|
||||||
else
|
|
||||||
cbActual = cbValid;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer->Feed(readbuf, cbActual, cbValid);
|
|
||||||
|
|
||||||
if (buffer->IsDecodableFrame(*info))
|
|
||||||
{
|
|
||||||
lReturn = ERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw ESyncError();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Try to decode the first Raw Data Block to Get Dolby Info:
|
|
||||||
unsigned int uiValidBits1;
|
|
||||||
unsigned int uiValidBits2;
|
|
||||||
unsigned int uiBitsUsed;
|
|
||||||
|
|
||||||
uiValidBits1 = buffer->GetBitState();
|
|
||||||
|
|
||||||
decoder->DecodeFrame(NULL, *info); //this is only for ADTS!
|
|
||||||
|
|
||||||
uiValidBits2 = buffer->GetBitState();
|
|
||||||
uiBitsUsed = uiValidBits1 - uiValidBits2;
|
|
||||||
|
|
||||||
buffer->PushBack((int)uiBitsUsed);
|
|
||||||
|
|
||||||
if (!info->GetProtectionAbsent())
|
|
||||||
{
|
|
||||||
unsigned int CRCsyndrome;
|
|
||||||
buffer->IsCrcConsistent(&CRCsyndrome);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(CAacException& e)
|
|
||||||
{
|
|
||||||
/* If an exception was thrown, we have to clear this flag so that the next
|
|
||||||
* call to IsDecodableFrame() will not simply return 'true' without actually
|
|
||||||
* sync'ing and parsing the header.
|
|
||||||
*/
|
|
||||||
buffer->ClearFrameReadButNotDecoded();
|
|
||||||
|
|
||||||
lReturn = TranslateException(e);
|
|
||||||
iResyncCount--;
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
/* All exceptions thrown should be derived from CAacException and therefore
|
|
||||||
* should be caught above. Just in case, though we'll add this catch() statement
|
|
||||||
* to catch things like access violations, etc.
|
|
||||||
*/
|
|
||||||
lReturn = ERR_UNEXPECTED_ERROR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lReturn)
|
|
||||||
{
|
|
||||||
if (FillStreamParameters(pAACStreamParameters))
|
|
||||||
{
|
|
||||||
lReturn = WARN_STREAM_PARAM_CHANGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* frame_length is used here to pass up the # of bytes
|
|
||||||
* processed. This is actually the # of bytes skipped
|
|
||||||
* during the Synchronization() call.
|
|
||||||
*/
|
|
||||||
pAACStreamParameters->frame_length = buffer->GetBytesSkipped();
|
|
||||||
|
|
||||||
/* Clear the number of bytes skipped so that bytes_skipped
|
|
||||||
* no longer accumulates across calls to IsDecodableFrame()
|
|
||||||
*/
|
|
||||||
buffer->ClearBytesSkipped();
|
|
||||||
}
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
long CAacDecoderApi::DecodeFrame (AudioIOControl *poAudioIO,
|
|
||||||
AACStreamParameters *pAACStreamParameters)
|
|
||||||
{
|
|
||||||
long lReturn = ERR_NO_ERROR;
|
|
||||||
|
|
||||||
buffer->ClearBytesSkipped();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!input->IsAdifHeaderPresent ())
|
|
||||||
{
|
|
||||||
if (!cbValid)
|
|
||||||
{
|
|
||||||
cbValid = input->Read (readbuf, cbSize);
|
|
||||||
|
|
||||||
if (!cbValid)
|
|
||||||
buffer->SetEOF();
|
|
||||||
else
|
|
||||||
cbActual = cbValid;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// feed up to 'cbActual' bytes into decoder buffer
|
|
||||||
//
|
|
||||||
|
|
||||||
buffer->Feed(readbuf, cbActual, cbValid);
|
|
||||||
|
|
||||||
//
|
|
||||||
// sync
|
|
||||||
//
|
|
||||||
|
|
||||||
if (!buffer->IsDecodableFrame(*info))
|
|
||||||
{
|
|
||||||
lReturn = ERR_INVALID_BITSTREAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse the entire frame so that CRC can be verified *before* performing the decode. */
|
|
||||||
unsigned int uiValidBits1;
|
|
||||||
unsigned int uiValidBits2;
|
|
||||||
unsigned int uiBitsUsed;
|
|
||||||
|
|
||||||
uiValidBits1 = buffer->GetBitState();
|
|
||||||
|
|
||||||
/* (NULL == parse frame only) */
|
|
||||||
decoder->DecodeFrame(NULL, *info); //
|
|
||||||
|
|
||||||
uiValidBits2 = buffer->GetBitState();
|
|
||||||
uiBitsUsed = uiValidBits1 - uiValidBits2;
|
|
||||||
|
|
||||||
/* This function performs a final sanity check for frame synchronization.
|
|
||||||
* It will read in the next 15 bits looking for the 0xFFF frame
|
|
||||||
* sync word, id, and layer. If it does not find a legal sync, it will throw an
|
|
||||||
* ESyncError() exception.
|
|
||||||
*/
|
|
||||||
VerifySync();
|
|
||||||
|
|
||||||
/* Push back entire frame (this does not include the header) before calling DecodeFrame() a second
|
|
||||||
* time to actually decode.
|
|
||||||
*/
|
|
||||||
buffer->PushBack((int)uiBitsUsed);
|
|
||||||
|
|
||||||
/* Verify CRC prior to actual decode. */
|
|
||||||
if (!info->GetProtectionAbsent())
|
|
||||||
{
|
|
||||||
unsigned int CRCsyndrome;
|
|
||||||
|
|
||||||
/* If the CRC is invalid, this function will throw an ECRCError() */
|
|
||||||
buffer->IsCrcConsistent(&CRCsyndrome);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform actual decode. */
|
|
||||||
decoder->DecodeFrame(poAudioIO, *info);
|
|
||||||
|
|
||||||
if (FillStreamParameters(pAACStreamParameters))
|
|
||||||
{
|
|
||||||
/* Output parameter (Fs, NumChans, etc.) has changed */
|
|
||||||
lReturn = WARN_STREAM_PARAM_CHANGE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (CAacException& e)
|
|
||||||
{
|
|
||||||
/* Map the exception to a return code. */
|
|
||||||
lReturn = TranslateException(e);
|
|
||||||
|
|
||||||
/* frame_length is used here to pass up the # of bytes
|
|
||||||
* processed. An error has occurred so no bytes were
|
|
||||||
* processed. CAacDecoderAPI::Synchronication() will
|
|
||||||
* be called next to search for next syncword and return
|
|
||||||
* the number of bytes processed (i.e. bytes skipped).
|
|
||||||
*/
|
|
||||||
pAACStreamParameters->frame_length = 0;
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
/* All exceptions thrown should be derived from CAacException and therefore
|
|
||||||
* should be caught above. Just in case, though we'll add this catch() statement
|
|
||||||
* to catch things like access violations, etc.
|
|
||||||
*/
|
|
||||||
lReturn = ERR_UNEXPECTED_ERROR;
|
|
||||||
|
|
||||||
/* frame_length is used here to pass up the # of bytes
|
|
||||||
* processed. An error has occurred so no bytes were
|
|
||||||
* processed. CAacDecoderAPI::Synchronication() will
|
|
||||||
* be called next to search for next syncword and return
|
|
||||||
* the number of bytes processed (i.e. bytes skipped).
|
|
||||||
*/
|
|
||||||
pAACStreamParameters->frame_length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/********** PRIVATE METHODS ***********/
|
|
||||||
|
|
||||||
long CAacDecoderApi::TranslateException(CAacException& e)
|
|
||||||
{
|
|
||||||
long lReturn = ERR_SUBROUTINE_ERROR; /* Default to generic subroutine error. */
|
|
||||||
|
|
||||||
static const int ErrorMap[][2] =
|
|
||||||
{
|
|
||||||
{AAC_UNIMPLEMENTED, ERR_SUBROUTINE_ERROR },
|
|
||||||
{AAC_NOTADIFHEADER, ERR_INVALID_ADIF_HEADER },
|
|
||||||
{AAC_DOESNOTEXIST, ERR_INVALID_BITSTREAM },
|
|
||||||
{AAC_ENDOFSTREAM, ERR_END_OF_FILE },
|
|
||||||
{AAC_SYNCERROR, ERR_SYNC_ERROR },
|
|
||||||
{AAC_CRCERROR, WARN_CRC_FAILED },
|
|
||||||
{AAC_INPUT_BUFFER_EMPTY, ERR_SYNC_ERROR },
|
|
||||||
{AAC_INVALIDCODEBOOK, ERR_SUBROUTINE_ERROR },
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
{AAC_INVALIDPREDICTORRESET, ERR_SUBROUTINE_ERROR },
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{AAC_UNSUPPORTEDWINDOWSHAPE,ERR_SUBROUTINE_ERROR },
|
|
||||||
{AAC_DOLBY_NOT_SUPPORTED, ERR_SUBROUTINE_ERROR },
|
|
||||||
{AAC_ILLEGAL_PROFILE, ERR_ILLEGAL_PROFILE }
|
|
||||||
};
|
|
||||||
|
|
||||||
#if defined (_DEBUG)
|
|
||||||
// cout << e.Explain() << endl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int i = 0; i < sizeof(ErrorMap) / (2 * sizeof(int)); i++)
|
|
||||||
{
|
|
||||||
if (e.What() == ErrorMap[i][0])
|
|
||||||
{
|
|
||||||
lReturn = ErrorMap[i][1];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CAacDecoderApi::VerifySync(void)
|
|
||||||
{
|
|
||||||
/* This function performs a final sanity check for frame synchronization.
|
|
||||||
* It will read in the next 16 bits looking for one of two things:
|
|
||||||
*
|
|
||||||
* 1) The 0xFFF frame sync word plus 1-bit ID and 2-bit layer.
|
|
||||||
* 2) 0x5249 (RI) of a RIFF header (in the case of concatenated RIFF+ADTS files).
|
|
||||||
*
|
|
||||||
* If it does not find a legal sync, it will throw an ESyncError() exception.
|
|
||||||
* Either way, all bits read will be pushed back.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int nSyncWord = buffer->Get(16);
|
|
||||||
|
|
||||||
buffer->PushBack(16);
|
|
||||||
|
|
||||||
/* When looking for ADTS sync, examine only the 15 MS bits because the LSB is the
|
|
||||||
* 'protection absent' flag.
|
|
||||||
*/
|
|
||||||
if (!buffer->EndOf() && (nSyncWord & 0xFFFE) != 0xFFF8 && (nSyncWord != 0x5249))
|
|
||||||
{
|
|
||||||
throw ESyncError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CAacDecoderApi::FillStreamParameters(AACStreamParameters *pAACStreamParameters)
|
|
||||||
{
|
|
||||||
bool bParamChanged = false; //Assume no audio parameter change.
|
|
||||||
static int nPreviousFs = 0;
|
|
||||||
static int nPreviousNumChannels = 0;
|
|
||||||
|
|
||||||
if (input->IsAdifHeaderPresent ())
|
|
||||||
{
|
|
||||||
pAACStreamParameters->stream_format = ADIF;
|
|
||||||
}
|
|
||||||
else if (input->IsRiffHeaderPresent ())
|
|
||||||
{
|
|
||||||
pAACStreamParameters->stream_format = RIFFADTS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pAACStreamParameters->stream_format = ADTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(decoder->HasDolbySpectralExtension() && decoder->HasDoubleLengthXForm())
|
|
||||||
{
|
|
||||||
// When UseDblLengthXfrm is set, the function info->GetSamplingRate
|
|
||||||
// will double the sampling rate that it returns. Therefore,
|
|
||||||
// pAACStreamParameters->sampling_frequency gets set to the correct
|
|
||||||
// sampling rate in the code line below this one.
|
|
||||||
info->SetUseDblLengthXfrm(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->SetUseDblLengthXfrm(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
pAACStreamParameters->sampling_frequency = info->GetSamplingRate();
|
|
||||||
pAACStreamParameters->num_channels = info->GetChannels();
|
|
||||||
pAACStreamParameters->bitrate = info->GetBitRate();
|
|
||||||
|
|
||||||
/* frame_length is used here to pass up the # of bytes
|
|
||||||
* processed. bytes_skipped needs to be added in here
|
|
||||||
* to account for concatenated RIFF+ADTS files.
|
|
||||||
*/
|
|
||||||
pAACStreamParameters->frame_length = info->GetFrameLength() + buffer->GetBytesSkipped();
|
|
||||||
pAACStreamParameters->protection_absent = info->GetProtectionAbsent();
|
|
||||||
pAACStreamParameters->copyright = info->GetOriginalCopy();
|
|
||||||
pAACStreamParameters->original_copy = info->GetHome();
|
|
||||||
|
|
||||||
|
|
||||||
if (nPreviousFs && nPreviousNumChannels)
|
|
||||||
{
|
|
||||||
if (pAACStreamParameters->sampling_frequency != nPreviousFs)
|
|
||||||
{
|
|
||||||
bParamChanged = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pAACStreamParameters->num_channels != nPreviousNumChannels)
|
|
||||||
{
|
|
||||||
bParamChanged = true;
|
|
||||||
|
|
||||||
/* Reset the number of channels to 0 so that AacDecoder::DecodeFrame() can
|
|
||||||
* re-add them as it parses the new bitstream.
|
|
||||||
*/
|
|
||||||
decoder->GetAdifHeader()->GetProgramConfig(0).ResetNonMCConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nPreviousFs = pAACStreamParameters->sampling_frequency;
|
|
||||||
nPreviousNumChannels = pAACStreamParameters->num_channels;
|
|
||||||
|
|
||||||
return bParamChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,150 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/aacdecoderapi.h,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: aacdecoderapi.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: AAC decoder API
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __AACDECODERAPI_H__
|
|
||||||
#define __AACDECODERAPI_H__
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "DataIO.h"
|
|
||||||
#include "audio_io.h"
|
|
||||||
|
|
||||||
/** AAC defines */
|
|
||||||
#define AAC_MAX_PROGRAMS 16
|
|
||||||
|
|
||||||
#define ADTS 0
|
|
||||||
#define ADIF 1
|
|
||||||
#define RIFFADTS 2
|
|
||||||
|
|
||||||
/** API return value defines */
|
|
||||||
#define ERR_NO_ERROR (0)
|
|
||||||
|
|
||||||
/* Fatal errors (must re-sync) */
|
|
||||||
#define ERR_INVALID_BITSTREAM (1)
|
|
||||||
#define ERR_INVALID_ADIF_HEADER (2)
|
|
||||||
#define ERR_SYNC_ERROR (3)
|
|
||||||
#define ERR_SUBROUTINE_ERROR (4)
|
|
||||||
#define ERR_END_OF_FILE (5)
|
|
||||||
#define ERR_INVALID_ADTS_HEADER (6)
|
|
||||||
#define ERR_INPUT_BUFFER_ERROR (7)
|
|
||||||
#define ERR_OUTPUT_BUFFER_ERROR (8)
|
|
||||||
#define ERR_ILLEGAL_PROFILE (9)
|
|
||||||
#define ERR_ILLEGAL_SAMP_RATE (10)
|
|
||||||
#define ERR_ILLEGAL_DATA_RATE (11)
|
|
||||||
#define ERR_ILLEGAL_CHANNELS (12)
|
|
||||||
#define ERR_CANNOT_SYNC_TO_ADIF (13)
|
|
||||||
#define ERR_UNEXPECTED_ERROR (14)
|
|
||||||
#define ERR_USER_ABORT (15)
|
|
||||||
#define MAX_EXEC_ERRORS (16)//Insert new errors before this
|
|
||||||
|
|
||||||
/* Warnings (keep decoding) */
|
|
||||||
#define WARN_CRC_FAILED (-1)
|
|
||||||
#define WARN_STREAM_PARAM_CHANGE (-2)
|
|
||||||
|
|
||||||
/** structure defines for MPEG-2 AAC API Object */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
long sampling_frequency;
|
|
||||||
long num_channels;
|
|
||||||
long bitrate;
|
|
||||||
short stream_format;
|
|
||||||
long frame_length;
|
|
||||||
short protection_absent;
|
|
||||||
short copyright;
|
|
||||||
short original_copy;
|
|
||||||
|
|
||||||
} AACStreamParameters;
|
|
||||||
|
|
||||||
|
|
||||||
/* Forward declarations */
|
|
||||||
class CAacDecoder;
|
|
||||||
class CPlainFile;
|
|
||||||
class CDolbyBitBuffer;
|
|
||||||
class CStreamInfo;
|
|
||||||
class CAacException;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** MPEG-2 AAC API Object.
|
|
||||||
|
|
||||||
This is the API object that interfaces with the application code.
|
|
||||||
It wraps the bitstream element objects and calls their individual decoding methods.
|
|
||||||
To indicate unexpected events and error conditions that prevent correct operation,
|
|
||||||
an exception derived from \Ref{CAacException} will be thrown that should be caught
|
|
||||||
by the calling application's decoding loop.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CAacDecoderApi
|
|
||||||
{
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
cbSize = 2048
|
|
||||||
};
|
|
||||||
|
|
||||||
CAacDecoder *decoder;
|
|
||||||
CPlainFile *input;
|
|
||||||
CDolbyBitBuffer *buffer;
|
|
||||||
CStreamInfo *info;
|
|
||||||
|
|
||||||
unsigned char readbuf[cbSize];
|
|
||||||
|
|
||||||
unsigned int cbValid, cbActual;
|
|
||||||
const static unsigned int sfTab[16];
|
|
||||||
|
|
||||||
long TranslateException(CAacException& e);
|
|
||||||
void VerifySync(void);
|
|
||||||
bool FillStreamParameters(AACStreamParameters *paacStreamParameters);
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
/** Object Constructor.
|
|
||||||
|
|
||||||
Instantiates a decoder object capable of decoding one stream of
|
|
||||||
MPEG-2 AAC Audio Data.
|
|
||||||
|
|
||||||
bs The \Ref{CBitStream} object that the decoder will read from.
|
|
||||||
*/
|
|
||||||
|
|
||||||
CAacDecoderApi(DataIOControl *paacInput);
|
|
||||||
|
|
||||||
/** Object Destructor.
|
|
||||||
*/
|
|
||||||
|
|
||||||
~CAacDecoderApi();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** AAC API Synchronize Method
|
|
||||||
Synchronizes to stream
|
|
||||||
*/
|
|
||||||
|
|
||||||
long Synchronize(AACStreamParameters *paacStreamParameters);
|
|
||||||
|
|
||||||
|
|
||||||
/** AAC Decoding Method.
|
|
||||||
|
|
||||||
This method delivers one frame of decoded pcm audio data.
|
|
||||||
|
|
||||||
info The configuration information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
long DecodeFrame ( AudioIOControl *ppcmOutput,
|
|
||||||
AACStreamParameters *paacStreamParameters) ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,88 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/adif.cpp,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: adif.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: audio data interchange format header
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "adif.h"
|
|
||||||
|
|
||||||
// CAUTION: some elements read more than 16bits,
|
|
||||||
// this is not supported by CDolbyBitStream::Get().
|
|
||||||
|
|
||||||
CAdifHeader::CAdifHeader ()
|
|
||||||
: m_CopyrightIdPresent (1),
|
|
||||||
m_OriginalCopy (1),
|
|
||||||
m_Home (1),
|
|
||||||
m_BitstreamType (1),
|
|
||||||
m_NumProgramConfigElements (4)
|
|
||||||
{
|
|
||||||
m_BitRate = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CAdifHeader::~CAdifHeader ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#include<stdio.h>
|
|
||||||
void CAdifHeader::Read (CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
char A[4];
|
|
||||||
A[0]=(char)(bs.Get (8));
|
|
||||||
A[1]=(char)(bs.Get (8));
|
|
||||||
A[2]=(char)(bs.Get (8));
|
|
||||||
A[3]=(char)(bs.Get (8));
|
|
||||||
if (A[0]!= 'A') throw ENoAdifHeader () ;
|
|
||||||
if (A[1]!= 'D') throw ENoAdifHeader () ;
|
|
||||||
if (A[2]!= 'I') throw ENoAdifHeader () ;
|
|
||||||
if (A[3]!= 'F') throw ENoAdifHeader () ;
|
|
||||||
|
|
||||||
if (m_CopyrightIdPresent.Read (bs))
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < 9 ; i++)
|
|
||||||
{
|
|
||||||
bs.Get (8) ; // CopyrightId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_OriginalCopy.Read (bs) ;
|
|
||||||
m_Home.Read (bs) ;
|
|
||||||
m_BitstreamType.Read (bs) ;
|
|
||||||
|
|
||||||
m_BitRate = bs.Get (16) ;
|
|
||||||
m_BitRate <<= 7 ;
|
|
||||||
m_BitRate |= bs.Get (7) ;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
m_NumProgramConfigElements.Read (bs) ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i <= m_NumProgramConfigElements ; i++)
|
|
||||||
{
|
|
||||||
if (m_BitstreamType == 0)
|
|
||||||
{
|
|
||||||
// we don't care much about adif_buffer_fullness
|
|
||||||
|
|
||||||
bs.Get (16) ;
|
|
||||||
bs.Get (4) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ProgramConfigElement[i].Read (bs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CProgramConfig &CAdifHeader::GetProgramConfig (int index)
|
|
||||||
{
|
|
||||||
return m_ProgramConfigElement [index] ;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,87 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/adif.h,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: adif.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: audio data interchange format header
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __ADIF_H__
|
|
||||||
#define __ADIF_H__
|
|
||||||
|
|
||||||
#include "bitsequence.h"
|
|
||||||
#include "programcfg.h"
|
|
||||||
#include "exception.h"
|
|
||||||
|
|
||||||
class CDolbyBitStream ;
|
|
||||||
|
|
||||||
/** Audio Data Interchange Format.
|
|
||||||
|
|
||||||
This class is able to read the header information from an ADIF file
|
|
||||||
and serves as a container for the Program Configuration Elements
|
|
||||||
\Ref{CProgramConfig} found in the bitstream.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CAdifHeader
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CAdifHeader () ;
|
|
||||||
~CAdifHeader () ;
|
|
||||||
|
|
||||||
void Read (CDolbyBitStream &bs) ;
|
|
||||||
|
|
||||||
CProgramConfig &GetProgramConfig (int index) ;
|
|
||||||
|
|
||||||
unsigned int GetBitRate (void) const
|
|
||||||
{
|
|
||||||
return m_BitRate ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetNumProgramConfigElements (void) const
|
|
||||||
{
|
|
||||||
return m_NumProgramConfigElements;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetOriginalCopy (void) const
|
|
||||||
{
|
|
||||||
return m_OriginalCopy;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetHome (void) const
|
|
||||||
{
|
|
||||||
return m_Home;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MaximumPCEs = 16
|
|
||||||
} ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_CopyrightIdPresent ;
|
|
||||||
CVLBBitSequence m_OriginalCopy ;
|
|
||||||
CVLBBitSequence m_Home ;
|
|
||||||
CVLBBitSequence m_BitstreamType ;
|
|
||||||
CVLBBitSequence m_NumProgramConfigElements ;
|
|
||||||
|
|
||||||
CProgramConfig m_ProgramConfigElement [MaximumPCEs] ;
|
|
||||||
|
|
||||||
unsigned int m_BitRate ;
|
|
||||||
|
|
||||||
DECLARE_EXCEPTION(ENoAdifHeader, AAC_NOTADIFHEADER, "Not Valid ADIF Header") ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,12 +0,0 @@
|
||||||
#ifndef NULLSOFT_APIH
|
|
||||||
#define NULLSOFT_APIH
|
|
||||||
|
|
||||||
#include <api/service/api_service.h>
|
|
||||||
extern api_service *serviceManager;
|
|
||||||
#define WASABI_API_SVC serviceManager
|
|
||||||
|
|
||||||
|
|
||||||
#include <api/memmgr/api_memmgr.h>
|
|
||||||
extern api_memmgr *memmgrApi;
|
|
||||||
#define WASABI_API_MEMMGR memmgrApi
|
|
||||||
#endif
|
|
|
@ -1,48 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/audio_io.cpp,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* filename: audio_io.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: Audio I/O include file
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "audio_io_dsp.h"
|
|
||||||
#include "audio_io.h"
|
|
||||||
|
|
||||||
AudioIOControl::AudioIOControl()
|
|
||||||
:psFormatInfo(NULL),
|
|
||||||
iError(AUDIO_ERROR_NONE)
|
|
||||||
{}
|
|
||||||
|
|
||||||
AudioIOControl::AudioIOControl(AudioIOControl&oCopyObject)
|
|
||||||
:psFormatInfo(oCopyObject.psFormatInfo),
|
|
||||||
iError(oCopyObject.iError)
|
|
||||||
{}
|
|
||||||
|
|
||||||
AudioIOControl& AudioIOControl::operator=(AudioIOControl&oAssignmentObject)
|
|
||||||
{
|
|
||||||
psFormatInfo=oAssignmentObject.psFormatInfo;
|
|
||||||
iError=oAssignmentObject.iError;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioIOControl::~AudioIOControl()
|
|
||||||
{}
|
|
||||||
|
|
||||||
int AudioIOControl::SetFormatInfo(AUDIO_FORMATINFO*psFormatInfo)
|
|
||||||
{
|
|
||||||
this->psFormatInfo=psFormatInfo;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AUDIO_FORMATINFO *AudioIOControl::GetFormatInfo() const
|
|
||||||
{
|
|
||||||
return psFormatInfo;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,92 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/audio_io.h,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: audio_io.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: Audio i/o header file
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
//Base Audio Device Errors:
|
|
||||||
#ifndef AUDIO_ERROR
|
|
||||||
#define AUDIO_ERROR
|
|
||||||
|
|
||||||
#define AUDIO_ERROR_NONE 0
|
|
||||||
#define AUDIO_ERROR_ENDOF 1
|
|
||||||
#define AUDIO_ERROR_NO_DEVICE -1
|
|
||||||
#define AUDIO_ERROR_DEVICE_FAIL -2
|
|
||||||
|
|
||||||
#endif
|
|
||||||
//Known Audio Formats:
|
|
||||||
#ifndef AUDIO_FORMAT
|
|
||||||
#define AUDIO_FORMAT
|
|
||||||
|
|
||||||
#define AUDIO_FORMAT_PRIVATE 0
|
|
||||||
#define AUDIO_FORMAT_WAV 1
|
|
||||||
#define AUDIO_FORMAT_AU 2
|
|
||||||
#define AUDIO_FORMAT_IMA_ADPCM 3
|
|
||||||
#define AUDIO_FORMAT_WAVMAPPING 4
|
|
||||||
#define AUDIO_FORMAT_DIRECTSOUND 5
|
|
||||||
#define AUDIO_FORMAT_CD_AUDIO 6
|
|
||||||
|
|
||||||
#define AUDIO_FORMAT_GENERIC_FILE 97
|
|
||||||
#define AUDIO_FORMAT_UNKNOWN 100
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//Audio Format Info Structure:
|
|
||||||
#ifndef AUDIO_FORMAT_INFO
|
|
||||||
#define AUDIO_FORMAT_INFO
|
|
||||||
|
|
||||||
#define AUDIO_INPUT 0
|
|
||||||
#define AUDIO_OUTPUT 1
|
|
||||||
|
|
||||||
class AUDIO_FORMATINFO{
|
|
||||||
public:
|
|
||||||
unsigned int uiSampleRate;
|
|
||||||
unsigned char ucNChannels;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AUDIO_IO_CONTROL
|
|
||||||
#define AUDIO_IO_CONTROL
|
|
||||||
|
|
||||||
class AudioIOControl{
|
|
||||||
private:
|
|
||||||
AUDIO_FORMATINFO *psFormatInfo;
|
|
||||||
public:
|
|
||||||
AudioIOControl();
|
|
||||||
AudioIOControl(AudioIOControl&);
|
|
||||||
AudioIOControl(int _iNChannels, unsigned int _uiSampleRate);
|
|
||||||
~AudioIOControl();
|
|
||||||
|
|
||||||
virtual AudioIOControl& operator=(AudioIOControl&);
|
|
||||||
|
|
||||||
virtual int SetFormatInfo(AUDIO_FORMATINFO*);
|
|
||||||
|
|
||||||
const AUDIO_FORMATINFO *GetFormatInfo() const;
|
|
||||||
|
|
||||||
//virtual int IO(unsigned char**,int)=0;
|
|
||||||
//virtual int IO(short**,int)=0;
|
|
||||||
virtual int IO(float**,int)=0;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int iError;
|
|
||||||
short *pshOutBuf;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* AUDIO_IO_CONTROL */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,532 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/audio_io_dsp.cpp,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* filename: audio_io.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: Audio I/O include file
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "audio_io_dsp.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#define CLIP_DLY 1
|
|
||||||
|
|
||||||
static double scaletab[NSCALETAB];
|
|
||||||
|
|
||||||
static const double invsampratetab[NSAMPRATE] =
|
|
||||||
{ 0.00001041667,
|
|
||||||
0.00001133787,
|
|
||||||
0.00001562500,
|
|
||||||
0.00002083333,
|
|
||||||
0.00002267574,
|
|
||||||
0.00003125000,
|
|
||||||
0.00004166667,
|
|
||||||
0.00004535147,
|
|
||||||
0.00006250000,
|
|
||||||
0.00008333333,
|
|
||||||
0.00009070295,
|
|
||||||
0.00012500000
|
|
||||||
};
|
|
||||||
|
|
||||||
static short limitcnttab[NSAMPRATE] =
|
|
||||||
{
|
|
||||||
96000/(CLIPDLY * XLIMDELAY),
|
|
||||||
88200/(CLIPDLY * XLIMDELAY),
|
|
||||||
64000/(CLIPDLY * XLIMDELAY),
|
|
||||||
48000/(CLIPDLY * XLIMDELAY),
|
|
||||||
44100/(CLIPDLY * XLIMDELAY),
|
|
||||||
32000/(CLIPDLY * XLIMDELAY),
|
|
||||||
24000/(CLIPDLY * XLIMDELAY),
|
|
||||||
22050/(CLIPDLY * XLIMDELAY),
|
|
||||||
16000/(CLIPDLY * XLIMDELAY),
|
|
||||||
12000/(CLIPDLY * XLIMDELAY),
|
|
||||||
11025/(CLIPDLY * XLIMDELAY),
|
|
||||||
8000/(CLIPDLY * XLIMDELAY)
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
AudioIODSP::AudioIODSP(int _iNChannels, unsigned int _uiSampRate)
|
|
||||||
: iNChannels(_iNChannels), uiSampRate(_uiSampRate)
|
|
||||||
{
|
|
||||||
int chan, i;
|
|
||||||
double upper, lower, limdelta, upperlim;
|
|
||||||
|
|
||||||
hsClipDly = new DLY_VARS*[iNChannels];
|
|
||||||
hsSmoothVars = new SMOOTH_VARS*[iNChannels];
|
|
||||||
for (chan = 0; chan < iNChannels; chan++)
|
|
||||||
{
|
|
||||||
hsClipDly[chan] = new DLY_VARS;
|
|
||||||
hsClipDly[chan]->bufptr = new float[DLYBUFSZ];
|
|
||||||
for (i = 0; i < DLYBUFSZ; i++)
|
|
||||||
{
|
|
||||||
hsClipDly[chan]->bufptr[i] = 0.0f;
|
|
||||||
}
|
|
||||||
hsClipDly[chan]->bufsize = DLYBUFSZ;
|
|
||||||
hsClipDly[chan]->delay = CLIPDLY;
|
|
||||||
hsClipDly[chan]->index = 0;
|
|
||||||
|
|
||||||
hsSmoothVars[chan] = new SMOOTH_VARS;
|
|
||||||
hsSmoothVars[chan]->dcy_count = 0;
|
|
||||||
hsSmoothVars[chan]->dcy_samp = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pshOutBuf = new short[iNChannels*DLYBUFSZ];
|
|
||||||
for (i = 0; i < iNChannels*DLYBUFSZ; i++)
|
|
||||||
{
|
|
||||||
pshOutBuf[i] = 0;
|
|
||||||
}
|
|
||||||
pfDlyBuf = new float[DLYBUFSZ];
|
|
||||||
|
|
||||||
bHardClip = false;
|
|
||||||
|
|
||||||
for (chan = 0; chan < MAXCHANNELS; chan++)
|
|
||||||
{
|
|
||||||
fPrevClipScale[chan] = 1.0;
|
|
||||||
for (i = 0; i < CLIPDLY; i++)
|
|
||||||
{
|
|
||||||
fPrevDlyBuf[chan][i] = 0.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < DLYBUFSZ; i++)
|
|
||||||
{
|
|
||||||
pfDlyBuf[i] = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
upper = PEAKLIMIT;
|
|
||||||
lower = PMAXF;
|
|
||||||
limdelta = (upper - lower) / (NSCALETAB - 1);
|
|
||||||
for (i = 0; i < NSCALETAB; i++)
|
|
||||||
{
|
|
||||||
upperlim = lower + i * limdelta;
|
|
||||||
scaletab[i] = (float)(lower / upperlim - INTERP_CORRECTION_FACT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
AudioIODSP::~AudioIODSP()
|
|
||||||
{
|
|
||||||
int chan;
|
|
||||||
|
|
||||||
if (hsClipDly != NULL)
|
|
||||||
{
|
|
||||||
for (chan = 0; chan < iNChannels; chan++)
|
|
||||||
{
|
|
||||||
delete[] hsClipDly[chan]->bufptr;
|
|
||||||
delete hsClipDly[chan];
|
|
||||||
}
|
|
||||||
delete [] hsClipDly;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hsSmoothVars != NULL)
|
|
||||||
{
|
|
||||||
for (chan = 0; chan < iNChannels; chan++)
|
|
||||||
{
|
|
||||||
delete hsSmoothVars[chan];
|
|
||||||
}
|
|
||||||
delete [] hsSmoothVars;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pshOutBuf != NULL)
|
|
||||||
{
|
|
||||||
delete[] pshOutBuf;
|
|
||||||
}
|
|
||||||
if (pfDlyBuf != NULL)
|
|
||||||
{
|
|
||||||
delete[] pfDlyBuf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioIODSP::SetSamplingRate(unsigned int _uiSampRate)
|
|
||||||
{
|
|
||||||
int iSRateIndex;
|
|
||||||
float invSamp;
|
|
||||||
|
|
||||||
this->uiSampRate = _uiSampRate;
|
|
||||||
|
|
||||||
/* Set up limiter decay/delay params. */
|
|
||||||
|
|
||||||
switch (uiSampRate)
|
|
||||||
{
|
|
||||||
case (8000):
|
|
||||||
iSRateIndex = 0;
|
|
||||||
break;
|
|
||||||
case (11025):
|
|
||||||
iSRateIndex = 1;
|
|
||||||
break;
|
|
||||||
case (12000):
|
|
||||||
iSRateIndex = 2;
|
|
||||||
break;
|
|
||||||
case (16000):
|
|
||||||
iSRateIndex = 3;
|
|
||||||
break;
|
|
||||||
case (22050):
|
|
||||||
iSRateIndex = 4;
|
|
||||||
break;
|
|
||||||
case (24000):
|
|
||||||
iSRateIndex = 5;
|
|
||||||
break;
|
|
||||||
case (32000):
|
|
||||||
iSRateIndex = 6;
|
|
||||||
break;
|
|
||||||
case (44100):
|
|
||||||
iSRateIndex = 7;
|
|
||||||
break;
|
|
||||||
case (48000):
|
|
||||||
iSRateIndex = 8;
|
|
||||||
break;
|
|
||||||
case (64000):
|
|
||||||
iSRateIndex = 9;
|
|
||||||
break;
|
|
||||||
case (88200):
|
|
||||||
iSRateIndex = 10;
|
|
||||||
break;
|
|
||||||
case (96000):
|
|
||||||
iSRateIndex = 11;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
bHardClip = true; /* Non-standard sample rate. Enable hard limiter in this case. */
|
|
||||||
}
|
|
||||||
|
|
||||||
invSamp = (float)invsampratetab[iSRateIndex]; /* inverse of samp rate*/
|
|
||||||
initLimitCnt = limitcnttab[iSRateIndex];
|
|
||||||
dcyDelta = (float)(1.0 - invSamp * 2.0 * CLIPDLY);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioIODSP::Float_to_Int(float **fInput, int *iOutput, int iLength, int grpIndex, int bitResolution)
|
|
||||||
{
|
|
||||||
short sTemp, outNdx, chan, samp;
|
|
||||||
int iPWordLengthLim, iNWordLengthLim;
|
|
||||||
float fSamp;
|
|
||||||
short interleaveOut = iNChannels;
|
|
||||||
|
|
||||||
for (chan = 0; chan < iNChannels; chan++)
|
|
||||||
{
|
|
||||||
outNdx = chan;
|
|
||||||
for (samp = 0; samp < iLength; samp++)
|
|
||||||
{
|
|
||||||
fSamp = fInput[chan][grpIndex * iLength + samp];
|
|
||||||
iPWordLengthLim = (1 << (bitResolution - 1)) - 1;
|
|
||||||
iNWordLengthLim = -iPWordLengthLim - 1;
|
|
||||||
|
|
||||||
fSamp=(fSamp > (float)iPWordLengthLim) ? (float)iPWordLengthLim : fSamp;
|
|
||||||
fSamp=(fSamp < (float)iNWordLengthLim) ? (float)iNWordLengthLim : fSamp;
|
|
||||||
|
|
||||||
sTemp = (fSamp >= 0.0f) ? (short)(fSamp + 0.5f) : (short)(fSamp - 0.5f);
|
|
||||||
iOutput[outNdx] = (int)(sTemp >> bitResolution);
|
|
||||||
outNdx += interleaveOut;
|
|
||||||
} // and samp loop
|
|
||||||
} // end chan loop
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AudioIODSP::Float_to_Short_Clip(float **fInput, short *sOutput, int iLength, int grpIndex)
|
|
||||||
{
|
|
||||||
short samp;
|
|
||||||
short chan;
|
|
||||||
short interleaveIn = 1;
|
|
||||||
short interleaveOut = iNChannels;
|
|
||||||
float fSamp;
|
|
||||||
int outNdx;
|
|
||||||
|
|
||||||
#ifdef CLIP_DLY
|
|
||||||
short dlysamp;
|
|
||||||
float fClipScale;
|
|
||||||
float limitAmount;
|
|
||||||
float fLookAhead;
|
|
||||||
float *pfDlyBufW = pfDlyBuf + CLIPDLY;
|
|
||||||
float *pfDlyBuf_LookAhead, *fPrevDlyPtr;
|
|
||||||
float currLimitAmount;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
assert(iLength >= CLIPDLY);
|
|
||||||
|
|
||||||
for (chan = 0; chan < iNChannels; chan++)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef CLIP_DLY
|
|
||||||
fPrevDlyPtr = fPrevDlyBuf[chan];
|
|
||||||
for (samp = 0; samp < CLIPDLY; samp++)
|
|
||||||
{
|
|
||||||
pfDlyBuf[samp] = fPrevDlyPtr[samp];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* !!! The following line may cause a compile time warning or BoundsChecker error !!!
|
|
||||||
This is a speed optimization and is intended to work this way. fPrevDlyPtr will point
|
|
||||||
to a location outside of the buffer. The code that followswill not write to this location. */
|
|
||||||
fPrevDlyPtr -= (iLength - CLIPDLY); /* cue up the Prev buffer to allow samp to begin indexing
|
|
||||||
at position zero when samp = iLength - CLIPDLY */
|
|
||||||
|
|
||||||
outNdx = chan;
|
|
||||||
pfDlyBuf_LookAhead = fInput[chan] + grpIndex * iLength;
|
|
||||||
for (samp = 0; samp < iLength; samp++)
|
|
||||||
{
|
|
||||||
/* Call CalcAtten() to compute the amount of gain attenuation to apply to bring the current sample
|
|
||||||
below the clip threshold. Note that CalcAtten contains a delay and decay factor for each channel
|
|
||||||
to govern transitioning out of limiting. Thus even if the current sample does not clip, the value
|
|
||||||
fClipScale could be < 1.0 due to the hysteresis of the limiter in CalcAtten. */
|
|
||||||
|
|
||||||
fLookAhead = (float)fabs(fInput[chan][samp + grpIndex * iLength]);
|
|
||||||
fClipScale = CalcAtten(hsSmoothVars[chan], fLookAhead, PMAXF);
|
|
||||||
|
|
||||||
/* Limit current sample to not clip, as determined by the return value from CalcAtten() */
|
|
||||||
|
|
||||||
currLimitAmount = pfDlyBuf_LookAhead[samp] * fClipScale;
|
|
||||||
(samp < iLength - CLIPDLY) ? (pfDlyBufW[samp] = currLimitAmount) :
|
|
||||||
(fPrevDlyPtr[samp] = currLimitAmount);
|
|
||||||
limitAmount = fPrevClipScale[chan] - fClipScale; /* limitAmount > 0: going further into limiting */
|
|
||||||
/* limitAmount < 0: coming out of limiting */
|
|
||||||
|
|
||||||
/* if difference between limit amount from previous sample, and current limit limit amount is non-zero,
|
|
||||||
proceed back through previous samples to apply more (or less) clipping. Delta clipping amount is
|
|
||||||
difference between current and previous clip amount. Note that the delta clipping amount slopes
|
|
||||||
linearly to zero additional clipping as dlysamp advances towards CLIPDLY samples from the current sample.*/
|
|
||||||
|
|
||||||
if (limitAmount > 0.0)
|
|
||||||
{
|
|
||||||
for (dlysamp = -1; dlysamp > -CLIPDLY; dlysamp--)
|
|
||||||
{
|
|
||||||
currLimitAmount = (float)(1.0 - limitAmount * (CLIPDLY + dlysamp) * CLIPNORM);
|
|
||||||
(samp + dlysamp < iLength - CLIPDLY) ? (pfDlyBufW[samp + dlysamp] *= currLimitAmount) :
|
|
||||||
(fPrevDlyPtr[samp + dlysamp] *= currLimitAmount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fPrevClipScale[chan] = fClipScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (samp = 0; samp < iLength; samp++)
|
|
||||||
{
|
|
||||||
fSamp = pfDlyBuf[samp];
|
|
||||||
if (bHardClip)
|
|
||||||
{
|
|
||||||
fSamp=(fSamp > 32767.0f) ? 32767.0f : fSamp;
|
|
||||||
fSamp=(fSamp < -32768.0f) ? -32768.0f : fSamp;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
assert(fSamp <= 32767.0);
|
|
||||||
assert(fSamp >= -32768.0);
|
|
||||||
}
|
|
||||||
sOutput[outNdx] = (fSamp >= 0.0f) ? (short)(fSamp + 0.5f) : (short)(fSamp - 0.5f);
|
|
||||||
outNdx += interleaveOut;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
outNdx = chan;
|
|
||||||
for (samp = 0; samp < iLength; samp++)
|
|
||||||
{
|
|
||||||
fSamp = fInput[chan][grpIndex * iLength + samp];
|
|
||||||
fSamp=(fSamp>32767.0f)?32767.0f:fSamp;
|
|
||||||
fSamp=(fSamp<-32768.0f)?-32768.0f:fSamp;
|
|
||||||
sOutput[outNdx]=(fSamp>=0.0f)?(short)(fSamp+0.5f):(short)(fSamp-0.5f);
|
|
||||||
outNdx += interleaveOut;
|
|
||||||
} /* end samp loop */
|
|
||||||
#endif
|
|
||||||
} /* end chan loop */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////
|
|
||||||
// AudioIODSP::Limiter
|
|
||||||
//
|
|
||||||
// Input: fBuffer[chans][samples] - data to be limited
|
|
||||||
// iLength - # of samples to be limited
|
|
||||||
// grpIndex - which chunk of data to limit
|
|
||||||
//
|
|
||||||
// Output: fBuffer[chans][samples] - limited data is written over
|
|
||||||
// input data
|
|
||||||
///////////////////////////////////////////////////////////////////
|
|
||||||
void AudioIODSP::ApplyLimiter(float **fBuffer, int iLength, int grpIndex)
|
|
||||||
{
|
|
||||||
short samp;
|
|
||||||
short chan;
|
|
||||||
float fSamp;
|
|
||||||
|
|
||||||
#ifdef CLIP_DLY
|
|
||||||
short dlysamp;
|
|
||||||
float fClipScale;
|
|
||||||
float limitAmount;
|
|
||||||
float fLookAhead;
|
|
||||||
float *pfDlyBufW = pfDlyBuf + CLIPDLY;
|
|
||||||
float *pfDlyBuf_LookAhead, *fPrevDlyPtr;
|
|
||||||
float currLimitAmount;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
assert(iLength >= CLIPDLY);
|
|
||||||
|
|
||||||
for (chan = 0; chan < iNChannels; chan++)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef CLIP_DLY
|
|
||||||
fPrevDlyPtr = fPrevDlyBuf[chan];
|
|
||||||
for (samp = 0; samp < CLIPDLY; samp++)
|
|
||||||
{
|
|
||||||
pfDlyBuf[samp] = fPrevDlyPtr[samp];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* !!! The following line may cause a compile time warning or BoundsChecker error !!!
|
|
||||||
This is a speed optimization and is intended to work this way. fPrevDlyPtr will point
|
|
||||||
to a location outside of the buffer. The code that followswill not write to this location. */
|
|
||||||
fPrevDlyPtr -= (iLength - CLIPDLY); /* cue up the Prev buffer to allow samp to begin indexing
|
|
||||||
at position zero when samp = iLength - CLIPDLY */
|
|
||||||
|
|
||||||
pfDlyBuf_LookAhead = fBuffer[chan] + grpIndex * iLength;
|
|
||||||
for (samp = 0; samp < iLength; samp++)
|
|
||||||
{
|
|
||||||
/* Call CalcAtten() to compute the amount of gain attenuation to apply to bring the current sample
|
|
||||||
below the clip threshold. Note that CalcAtten contains a delay and decay factor for each channel
|
|
||||||
to govern transitioning out of limiting. Thus even if the current sample does not clip, the value
|
|
||||||
fClipScale could be < 1.0 due to the hysteresis of the limiter in CalcAtten. */
|
|
||||||
|
|
||||||
fLookAhead = (float)fabs(fBuffer[chan][samp + grpIndex * iLength]);
|
|
||||||
fClipScale = CalcAtten(hsSmoothVars[chan], fLookAhead, PMAXF);
|
|
||||||
|
|
||||||
/* Limit current sample to not clip, as determined by the return value from CalcAtten() */
|
|
||||||
|
|
||||||
currLimitAmount = pfDlyBuf_LookAhead[samp] * fClipScale;
|
|
||||||
(samp < iLength - CLIPDLY) ? (pfDlyBufW[samp] = currLimitAmount) :
|
|
||||||
(fPrevDlyPtr[samp] = currLimitAmount);
|
|
||||||
limitAmount = fPrevClipScale[chan] - fClipScale; /* limitAmount > 0: going further into limiting */
|
|
||||||
/* limitAmount < 0: coming out of limiting */
|
|
||||||
|
|
||||||
/* if difference between limit amount from previous sample, and current limit limit amount is non-zero,
|
|
||||||
proceed back through previous samples to apply more (or less) clipping. Delta clipping amount is
|
|
||||||
difference between current and previous clip amount. Note that the delta clipping amount slopes
|
|
||||||
linearly to zero additional clipping as dlysamp advances towards CLIPDLY samples from the current sample.*/
|
|
||||||
|
|
||||||
if (limitAmount > 0.0)
|
|
||||||
{
|
|
||||||
for (dlysamp = -1; dlysamp > -CLIPDLY; dlysamp--)
|
|
||||||
{
|
|
||||||
currLimitAmount = (float)(1.0 - limitAmount * (CLIPDLY + dlysamp) * CLIPNORM);
|
|
||||||
(samp + dlysamp < iLength - CLIPDLY) ? (pfDlyBufW[samp + dlysamp] *= currLimitAmount) :
|
|
||||||
(fPrevDlyPtr[samp + dlysamp] *= currLimitAmount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fPrevClipScale[chan] = fClipScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (samp = 0; samp < iLength; samp++)
|
|
||||||
{
|
|
||||||
fSamp = pfDlyBuf[samp];
|
|
||||||
if (bHardClip)
|
|
||||||
{
|
|
||||||
fSamp=(fSamp > 32767.0f) ? 32767.0f : fSamp;
|
|
||||||
fSamp=(fSamp < -32768.0f) ? -32768.0f : fSamp;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
assert(fSamp <= 32767.0);
|
|
||||||
assert(fSamp >= -32768.0);
|
|
||||||
}
|
|
||||||
fBuffer[chan][samp + grpIndex * iLength] = (fSamp >= 0.0f) ? (fSamp + 0.5f) : (fSamp - 0.5f);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
for (samp = 0; samp < iLength; samp++)
|
|
||||||
{
|
|
||||||
fSamp = fBuffer[chan][grpIndex * iLength + samp];
|
|
||||||
fSamp=(fSamp>32767.0f)?32767.0f:fSamp;
|
|
||||||
fSamp=(fSamp<-32768.0f)?-32768.0f:fSamp;
|
|
||||||
fBuffer[chan][grpIndex * iLength + samp] = (fSamp>=0.0f)?(fSamp+0.5f):(fSamp-0.5f);
|
|
||||||
} /* end samp loop */
|
|
||||||
#endif
|
|
||||||
} /* end chan loop */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/****
|
|
||||||
calcatten()
|
|
||||||
|
|
||||||
This routine calculates the amount of attenuation that must be applied to
|
|
||||||
prevent clipping beyond PMAXF (32768.0f). The output scale value varies
|
|
||||||
between thresh-6 dB and thresh. The input value is the maximum sample. If the
|
|
||||||
max sample is greater than thresh, then compute a scalefactor that:
|
|
||||||
|
|
||||||
1. Is proportional to the amount fMaxSamp exceeds thresh.
|
|
||||||
2. Reflects recent history of clipping by applying a delay and decay
|
|
||||||
in transitioning out of clipping.
|
|
||||||
****/
|
|
||||||
|
|
||||||
inline float AudioIODSP::CalcAtten(SMOOTH_VARS *smoothvars, float fMaxSamp, float thresh)
|
|
||||||
{
|
|
||||||
float scale;
|
|
||||||
float interp;
|
|
||||||
short index;
|
|
||||||
float limvalscl;
|
|
||||||
|
|
||||||
if ((fMaxSamp > thresh) || (smoothvars->dcy_samp > thresh))
|
|
||||||
{
|
|
||||||
if (fMaxSamp > PEAKLIMITM1) /* Hard limit in case fSample is 10 dB above full scale */
|
|
||||||
{
|
|
||||||
scale = (float)PMAXF / fMaxSamp;
|
|
||||||
smoothvars->dcy_samp = (float)PEAKLIMITM1;
|
|
||||||
smoothvars->dcy_count = initLimitCnt;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/****
|
|
||||||
If the input maximum sample is greater than the previous maximum sample, then
|
|
||||||
assign the new maximum as the sample to be delayed and decayed. On each
|
|
||||||
subsequent call to CalcAtten(), if there are no samples greater than dcy_samp,
|
|
||||||
then dcy_samp will hold its value for initLimitCnt calls to CalcAtten() before
|
|
||||||
sloping down to thresh.
|
|
||||||
****/
|
|
||||||
if (fMaxSamp > smoothvars->dcy_samp)
|
|
||||||
{
|
|
||||||
smoothvars->dcy_samp = fMaxSamp;
|
|
||||||
smoothvars->dcy_count = initLimitCnt;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (smoothvars->dcy_count != 0) /* If delay before decay onset, decrement */
|
|
||||||
{
|
|
||||||
smoothvars->dcy_count--;
|
|
||||||
}
|
|
||||||
else if (smoothvars->dcy_samp > thresh)
|
|
||||||
{
|
|
||||||
smoothvars->dcy_samp = smoothvars->dcy_samp * dcyDelta;
|
|
||||||
}
|
|
||||||
/* else smoothvars->dcy_samp < thresh which will cause scale = 1.0 and smoothvars->dcy_samp = 0.0
|
|
||||||
for subsequent samples. */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This finds the scaled inverse of limval using a lookup table. Note that
|
|
||||||
since limval should always be less than 1.0, the index will always be less
|
|
||||||
than 32 and scaletab[index+1] will not go beyond the bounds of its array.*/
|
|
||||||
|
|
||||||
if (smoothvars->dcy_samp > thresh)
|
|
||||||
{
|
|
||||||
limvalscl = (float)((smoothvars->dcy_samp - thresh) * CX_LIMSCALE);
|
|
||||||
index = (short)limvalscl;
|
|
||||||
interp = limvalscl - index;
|
|
||||||
|
|
||||||
scale = (float)(scaletab[index] + interp * (scaletab[index+1] - scaletab[index]));
|
|
||||||
}
|
|
||||||
else /* This else case is only entered if dcyDelta scales dcy_samp to be less than thresh */
|
|
||||||
{
|
|
||||||
scale = 1.0;
|
|
||||||
smoothvars->dcy_samp = 0.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
scale = 1.0;
|
|
||||||
smoothvars->dcy_samp = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (scale);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/audio_io_dsp.h,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: audio_io_dsp.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: Audio DSP processing header file
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __AUDIO_IO_DSP_H__
|
|
||||||
#define __AUDIO_IO_DSP_H__
|
|
||||||
|
|
||||||
#define CLIPDLY 10
|
|
||||||
#define CLIPNORM (1.0/CLIPDLY)
|
|
||||||
#define DLYBUFSZ 128
|
|
||||||
#define PMAXF 32767.0f
|
|
||||||
#define PMAXFM1 (PMAXF-1)
|
|
||||||
#define NMAXF -32768.0f
|
|
||||||
#define MAXCHANNELS 2
|
|
||||||
#define NSAMPRATE 12
|
|
||||||
#define XLIMDELAY 5 // delay is 1/5 second before decay stage of clip delay return segment.
|
|
||||||
#define NSCALETAB 33
|
|
||||||
#define PEAKLIMIT (3.16*PMAXF) // Allows for 10 dB of smoothed limiting. Any overshoot greater
|
|
||||||
// than 10 dB is hard limited.
|
|
||||||
#define PEAKLIMITM1 (PEAKLIMIT-1)
|
|
||||||
#define INTERP_CORRECTION_FACT 0.013 // compensates for error between actual inverse and estimated inverse
|
|
||||||
// in scaletab table.
|
|
||||||
#define CX_LIMSCALE ((NSCALETAB-1)/(PEAKLIMIT-PMAXF))
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
short index;
|
|
||||||
short delay;
|
|
||||||
short bufsize;
|
|
||||||
float *bufptr;
|
|
||||||
} DLY_VARS;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
short dcy_count;
|
|
||||||
float dcy_samp;
|
|
||||||
} SMOOTH_VARS;
|
|
||||||
|
|
||||||
|
|
||||||
class AudioIODSP{
|
|
||||||
private:
|
|
||||||
DLY_VARS **hsClipDly;
|
|
||||||
SMOOTH_VARS **hsSmoothVars;
|
|
||||||
int iNChannels;
|
|
||||||
bool bHardClip;
|
|
||||||
float *pfDlyBuf;
|
|
||||||
float fPrevDlyBuf[MAXCHANNELS][CLIPDLY];
|
|
||||||
float fPrevClipScale[MAXCHANNELS];
|
|
||||||
short initLimitCnt; // Amount of time to delay before decaying the limiter scaling value.
|
|
||||||
float dcyDelta; // Dcy_delta is the amount to attenuate the limiter scaling value
|
|
||||||
// on each call to CalcAtten().
|
|
||||||
unsigned int uiSampRate;
|
|
||||||
float AudioIODSP::CalcAtten(SMOOTH_VARS *smoothvars, float fMaxSamp, float thresh);
|
|
||||||
|
|
||||||
public:
|
|
||||||
short *pshOutBuf;
|
|
||||||
|
|
||||||
AudioIODSP(int _iNChannels, unsigned int _uiSampRate = 0);
|
|
||||||
~AudioIODSP();
|
|
||||||
void Float_to_Short_Clip(float **fInput, short *sOutput, int iLength, int grpIndex);
|
|
||||||
void Float_to_Int(float **fInput, int *iOutput, int iLength, int grpIndex,
|
|
||||||
int bitResolution);
|
|
||||||
|
|
||||||
void ApplyLimiter(float **fBuffer, int iLength, int grpIndex);
|
|
||||||
void SetSamplingRate(unsigned int _uiSampRate);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __AUDIO_IO_DSP_H__ */
|
|
||||||
|
|
|
@ -1,599 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/bitbuffer.cpp,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: bitbuffer.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: memory input class with transport format
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "bitbuffer.h"
|
|
||||||
#include "streaminfo.h"
|
|
||||||
|
|
||||||
static const unsigned int Adts_Value_SyncWord = 0xFFF ;
|
|
||||||
static const unsigned int Adts_Value_SyncMSByte = 0xFF ;
|
|
||||||
static const unsigned int Adts_Value_MinHeaderLength = 56 ;
|
|
||||||
|
|
||||||
static const unsigned int Adts_Length_SyncWord = 12 ;
|
|
||||||
static const unsigned int Adts_Length_Id = 1 ;
|
|
||||||
static const unsigned int Adts_Length_Layer = 2 ;
|
|
||||||
static const unsigned int Adts_Length_ProtectionAbsent = 1 ;
|
|
||||||
static const unsigned int Adts_Length_Profile = 2 ;
|
|
||||||
static const unsigned int Adts_Length_SamplingFrequencyIndex = 4 ;
|
|
||||||
static const unsigned int Adts_Length_PrivateBit = 1 ;
|
|
||||||
static const unsigned int Adts_Length_ChannelConfiguration = 3 ;
|
|
||||||
static const unsigned int Adts_Length_OriginalCopy = 1 ;
|
|
||||||
static const unsigned int Adts_Length_Home = 1 ;
|
|
||||||
|
|
||||||
static const unsigned int Adts_Length_CopyrightIdentificationBit = 1 ;
|
|
||||||
static const unsigned int Adts_Length_CopyrightIdentificationStart = 1 ;
|
|
||||||
static const unsigned int Adts_Length_FrameLength = 13 ;
|
|
||||||
static const unsigned int Adts_Length_BufferFullness = 11 ;
|
|
||||||
static const unsigned int Adts_Length_NumberOfRawDataBlocksInFrame = 2 ;
|
|
||||||
|
|
||||||
static const unsigned int Adts_Length_CrcCheck = 16 ;
|
|
||||||
|
|
||||||
static char copyright_id[COPYRIGHT_SIZE];
|
|
||||||
static char copyright_id_temp[COPYRIGHT_SIZE];
|
|
||||||
static unsigned int cid_bitcount;
|
|
||||||
static unsigned int cid_bytecount;
|
|
||||||
|
|
||||||
DECLARE_EXCEPTION(ECRCError, AAC_CRCERROR, "CRC calculation failed");
|
|
||||||
DECLARE_EXCEPTION(EInputBufferError, AAC_INPUT_BUFFER_EMPTY, "No sync word found!");
|
|
||||||
DECLARE_EXCEPTION(ESyncError, AAC_SYNCERROR, "Synchronization Error!") ;
|
|
||||||
|
|
||||||
CDolbyBitBuffer::CDolbyBitBuffer ()
|
|
||||||
: CDolbyBitStream ()
|
|
||||||
{
|
|
||||||
m_IsADTSCompliant=true;
|
|
||||||
|
|
||||||
m_bFrameReadButNotDecoded = false;
|
|
||||||
|
|
||||||
Initialize () ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CDolbyBitBuffer::~CDolbyBitBuffer()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDolbyBitBuffer::Initialize (void)
|
|
||||||
{
|
|
||||||
m_ValidBits = 0 ;
|
|
||||||
m_ReadOffset = 0 ;
|
|
||||||
m_BitCnt = 0 ;
|
|
||||||
m_BitNdx = 0 ;
|
|
||||||
|
|
||||||
m_EOF = false ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i < BufferSize ; i++)
|
|
||||||
{
|
|
||||||
m_Buffer [i] = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_BlocksLeftInFrame = 0 ;
|
|
||||||
m_Markers = 0 ;
|
|
||||||
|
|
||||||
m_FrameCrcValue = InvalidCrcValue ;
|
|
||||||
|
|
||||||
cid_bitcount = BYTE_SIZE; // init copyright id bit counter
|
|
||||||
cid_bytecount = COPYRIGHT_SIZE; // inti copyright id byte counter
|
|
||||||
|
|
||||||
buffer_fullness = 0;
|
|
||||||
last_buffer_fullness = 0;
|
|
||||||
last_frame_length = 0;
|
|
||||||
bytes_skipped = 0;
|
|
||||||
hold_bytes_skipped = false;
|
|
||||||
number_of_raw_data_blocks_in_frame = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
long CDolbyBitBuffer::Get (int nBits)
|
|
||||||
{
|
|
||||||
unsigned short tmp, tmp1 ;
|
|
||||||
|
|
||||||
int nWordNdx = (m_BitNdx >> 4) << 1 ;
|
|
||||||
int nBitsAvail = 16 - (m_BitNdx & 15) ;
|
|
||||||
|
|
||||||
tmp = m_Buffer [nWordNdx] ;
|
|
||||||
tmp <<= 8 ;
|
|
||||||
tmp |= m_Buffer [nWordNdx + 1] ;
|
|
||||||
tmp <<= (m_BitNdx & 15) ;
|
|
||||||
|
|
||||||
if (nBits > nBitsAvail)
|
|
||||||
{
|
|
||||||
nWordNdx = (nWordNdx + 2) & (BufferSize - 1) ;
|
|
||||||
tmp1 = m_Buffer [nWordNdx] ;
|
|
||||||
tmp1 <<= 8 ;
|
|
||||||
tmp1 |= m_Buffer [nWordNdx + 1] ;
|
|
||||||
|
|
||||||
tmp1 >>= (16 - (m_BitNdx & 15)) ;
|
|
||||||
tmp |= tmp1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp >>= (16 - nBits) ;
|
|
||||||
|
|
||||||
m_BitNdx = (m_BitNdx+nBits) & (BufferBits - 1) ;
|
|
||||||
m_BitCnt += nBits ;
|
|
||||||
m_ValidBits -= nBits ;
|
|
||||||
|
|
||||||
return tmp ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDolbyBitBuffer::PushBack (int n)
|
|
||||||
{
|
|
||||||
m_BitCnt -= n ;
|
|
||||||
m_ValidBits += n ;
|
|
||||||
m_BitNdx = (m_BitNdx - n) & (BufferBits - 1) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDolbyBitBuffer::ByteAlign (void)
|
|
||||||
{
|
|
||||||
long alignment = m_BitCnt % 8 ;
|
|
||||||
|
|
||||||
if (alignment)
|
|
||||||
{
|
|
||||||
Get (8 - alignment) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_BitCnt = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CDolbyBitBuffer::IsDecodableFrame (CStreamInfo &info)
|
|
||||||
{
|
|
||||||
ByteAlign ();
|
|
||||||
|
|
||||||
if (FrameReadButNotDecoded())
|
|
||||||
{
|
|
||||||
ClearFrameReadButNotDecoded();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
tryagain :
|
|
||||||
|
|
||||||
SetPositionMarker (AncillaryElementStart) ;
|
|
||||||
bytes_skipped += GetBitCount() >> 3;
|
|
||||||
|
|
||||||
if (m_ValidBits < Adts_Value_MinHeaderLength)
|
|
||||||
{
|
|
||||||
if (m_EOF) throw EEndOfFile () ;
|
|
||||||
else return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Since the 1-bit ID must be 1 and the 2-bit layer must be 0, we can
|
|
||||||
* look for 15 bits of sync rather than just 12. We'll get 16 bits from the
|
|
||||||
* buffer and mask the top 15 bits for ease of readability.
|
|
||||||
*/
|
|
||||||
if ((Get(Adts_Length_SyncWord + 4) & 0xFFFE) != 0xFFF8)
|
|
||||||
{
|
|
||||||
PushBack (Adts_Length_SyncWord + 4) ;
|
|
||||||
|
|
||||||
while (m_ValidBits >> 3)
|
|
||||||
{
|
|
||||||
if (Get (8) == Adts_Value_SyncMSByte)
|
|
||||||
{
|
|
||||||
PushBack (8) ;
|
|
||||||
|
|
||||||
if ((Get(Adts_Length_SyncWord + 4) & 0xFFFE) == 0xFFF8)
|
|
||||||
{
|
|
||||||
PushBack (Adts_Length_SyncWord + 4) ;
|
|
||||||
goto tryagain ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Push back 8 of the 16 bits we read. This will advance us by a byte. */
|
|
||||||
PushBack (Adts_Length_SyncWord - 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// syncword not found in BitBuffer so accumulate
|
|
||||||
// bytes skipped before throwing an error
|
|
||||||
bytes_skipped += GetBitCount() >> 3;
|
|
||||||
|
|
||||||
// eaten up input
|
|
||||||
if (m_EOF)
|
|
||||||
{
|
|
||||||
throw EEndOfFile();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw EInputBufferError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Push back the 4 extra bits we read beyond the 12-bit sync word. */
|
|
||||||
PushBack(4);
|
|
||||||
|
|
||||||
// adts_fixed_header
|
|
||||||
|
|
||||||
id = Get (Adts_Length_Id) ;
|
|
||||||
layer = Get (Adts_Length_Layer) ;
|
|
||||||
protection_absent = Get (Adts_Length_ProtectionAbsent) ;
|
|
||||||
profile = Get (Adts_Length_Profile) ;
|
|
||||||
sampling_frequency_index = Get (Adts_Length_SamplingFrequencyIndex) ;
|
|
||||||
private_bit = Get (Adts_Length_PrivateBit) ;
|
|
||||||
channel_configuration = Get (Adts_Length_ChannelConfiguration) ;
|
|
||||||
original_copy = Get (Adts_Length_OriginalCopy) ;
|
|
||||||
home = Get (Adts_Length_Home) ;
|
|
||||||
|
|
||||||
// adts_variable_header
|
|
||||||
|
|
||||||
copyright_identification_bit = Get (Adts_Length_CopyrightIdentificationBit) ;
|
|
||||||
copyright_identification_start = Get (Adts_Length_CopyrightIdentificationStart) ;
|
|
||||||
frame_length = Get (Adts_Length_FrameLength) ;
|
|
||||||
buffer_fullness = Get (Adts_Length_BufferFullness) ;
|
|
||||||
number_of_raw_data_blocks_in_frame = Get (Adts_Length_NumberOfRawDataBlocksInFrame) ;
|
|
||||||
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
if ((m_ValidBits >> 3) < (frame_length - (Adts_Value_MinHeaderLength / 8)))
|
|
||||||
{
|
|
||||||
if (m_EOF)
|
|
||||||
throw EEndOfFile () ;
|
|
||||||
|
|
||||||
PushBack (Adts_Value_MinHeaderLength) ;
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetPositionMarker (AncillaryElementStop) ;
|
|
||||||
|
|
||||||
// adts_error_check
|
|
||||||
|
|
||||||
if (!protection_absent)
|
|
||||||
{
|
|
||||||
m_FrameCrcValue = Get (Adts_Length_CrcCheck) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (layer != 0)
|
|
||||||
{
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
ByteAlign () ;
|
|
||||||
|
|
||||||
// // // Copy data from ADTS header to info structure
|
|
||||||
info.SetProtectionAbsent(protection_absent);
|
|
||||||
info.SetOriginalCopy(original_copy);
|
|
||||||
info.SetHome(home);
|
|
||||||
info.SetFrameLength(frame_length);
|
|
||||||
|
|
||||||
// Assemble copyright ID
|
|
||||||
if (copyright_identification_start)
|
|
||||||
{
|
|
||||||
cid_bitcount = 0;
|
|
||||||
cid_bytecount = 0;
|
|
||||||
for (i=0; i<COPYRIGHT_SIZE; i++)
|
|
||||||
copyright_id[i] = copyright_id_temp[i];
|
|
||||||
copyright_id_temp[cid_bytecount++] = copyright_identification_bit;
|
|
||||||
cid_bitcount++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (cid_bitcount++ < BYTE_SIZE && cid_bytecount < COPYRIGHT_SIZE)
|
|
||||||
{
|
|
||||||
copyright_id_temp[cid_bytecount] <<= 1 | (copyright_identification_bit & 1);
|
|
||||||
if (cid_bitcount >= BYTE_SIZE)
|
|
||||||
{
|
|
||||||
cid_bitcount = 0;
|
|
||||||
cid_bytecount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// here, if counter overflow: delete copyright info
|
|
||||||
for (i=0; i<COPYRIGHT_SIZE; i++)
|
|
||||||
copyright_id[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < COPYRIGHT_SIZE; i++)
|
|
||||||
info.SetCopyrightID(copyright_id[i], i); // write copyright ID to info structure
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int nextsync = m_BitNdx >> 3 ;
|
|
||||||
unsigned int header_length = 7 + (protection_absent ? 0 : 2) ;
|
|
||||||
nextsync += frame_length - header_length ;
|
|
||||||
nextsync %= BufferSize ;
|
|
||||||
|
|
||||||
// this is the only place where we assume the bitstream to be
|
|
||||||
// aligned on byte boundaries (which is true for software),
|
|
||||||
// maybe someday we might want to remove this restriction.
|
|
||||||
|
|
||||||
/* If a 'RIFF' header is detected (due to concatenated RIFF+ADTS files), look beyond it
|
|
||||||
* for the next ADTS sync.
|
|
||||||
*/
|
|
||||||
if (m_Buffer[nextsync] == 'R' &&
|
|
||||||
m_Buffer[(nextsync + 1) % BufferSize] == 'I' &&
|
|
||||||
m_Buffer[(nextsync + 2) % BufferSize] == 'F' &&
|
|
||||||
m_Buffer[(nextsync + 3) % BufferSize] == 'F'
|
|
||||||
)
|
|
||||||
{
|
|
||||||
bool bFoundDataChunk = true;
|
|
||||||
unsigned int uiMarker = nextsync;
|
|
||||||
|
|
||||||
while (m_Buffer[nextsync] != 'd' ||
|
|
||||||
m_Buffer[(nextsync + 1) % BufferSize] != 'a' ||
|
|
||||||
m_Buffer[(nextsync + 2) % BufferSize] != 't' ||
|
|
||||||
m_Buffer[(nextsync + 3) % BufferSize] != 'a'
|
|
||||||
)
|
|
||||||
{
|
|
||||||
nextsync = (nextsync + 1) % BufferSize;
|
|
||||||
|
|
||||||
if (nextsync == uiMarker)
|
|
||||||
{
|
|
||||||
/* We've gone all the way around our circular buffer without ever finding a 'data' chunk. */
|
|
||||||
bFoundDataChunk = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bFoundDataChunk)
|
|
||||||
{
|
|
||||||
/* Skip over data chunk ID and length. The next bytes should be our ADTS sync word. */
|
|
||||||
nextsync += 8;
|
|
||||||
nextsync %= BufferSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_Buffer[nextsync] == Adts_Value_SyncMSByte && (m_Buffer[(nextsync + 1) % BufferSize] & 0xFE) == 0xF8)
|
|
||||||
{
|
|
||||||
if (info.GetRawSamplingRate ())
|
|
||||||
{
|
|
||||||
float flen = (float) (info.GetSamplesPerFrame () * (number_of_raw_data_blocks_in_frame + 1)) ;
|
|
||||||
float bitrate = (float) (8 * last_frame_length + 32 * (buffer_fullness - last_buffer_fullness)) ;
|
|
||||||
|
|
||||||
m_ActualBitrate += (unsigned int) (bitrate / (flen / info.GetRawSamplingRate ())) ;
|
|
||||||
|
|
||||||
last_buffer_fullness = buffer_fullness ;
|
|
||||||
last_frame_length = frame_length ;
|
|
||||||
|
|
||||||
info.SetBitRate (m_ActualBitrate) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
info.SetSamplingRateIndex (sampling_frequency_index) ;
|
|
||||||
info.SetProfile (profile) ;
|
|
||||||
info.SetChannelConfig (channel_configuration) ;
|
|
||||||
|
|
||||||
m_BlocksLeftInFrame = number_of_raw_data_blocks_in_frame ;
|
|
||||||
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!m_EOF)
|
|
||||||
{
|
|
||||||
// syncword not found in next frame, but
|
|
||||||
// current frame's header has already been
|
|
||||||
// read, so add it to the # of bytes skipped
|
|
||||||
bytes_skipped += header_length;
|
|
||||||
|
|
||||||
// hold on to the bytes skipped so that we can
|
|
||||||
// accumulate them across multiple calls to
|
|
||||||
// the function IsDecodableFrame
|
|
||||||
HoldBytesSkipped();
|
|
||||||
|
|
||||||
throw ESyncError();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CDolbyBitBuffer::ClearBytesSkipped(void)
|
|
||||||
{
|
|
||||||
if (!hold_bytes_skipped)
|
|
||||||
{
|
|
||||||
bytes_skipped = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// clear flag for next time around
|
|
||||||
hold_bytes_skipped = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CDolbyBitBuffer::Feed (unsigned char pBuf [], unsigned int cbSize, unsigned int &cbValid)
|
|
||||||
{
|
|
||||||
pBuf = &pBuf [cbSize - cbValid] ;
|
|
||||||
|
|
||||||
unsigned int bTotal = 0 ;
|
|
||||||
|
|
||||||
unsigned int bToRead = (BufferBits - m_ValidBits) >> 3 ;
|
|
||||||
unsigned int noOfBytes = (bToRead < cbValid) ? bToRead : cbValid ;
|
|
||||||
|
|
||||||
while (noOfBytes > 0)
|
|
||||||
{
|
|
||||||
// split read to buffer size
|
|
||||||
|
|
||||||
bToRead = BufferSize - m_ReadOffset ;
|
|
||||||
bToRead = (bToRead < noOfBytes) ? bToRead : noOfBytes ;
|
|
||||||
|
|
||||||
// copy 'bToRead' bytes from 'ptr' to inputbuffer
|
|
||||||
|
|
||||||
for (unsigned int i = 0 ; i < bToRead ; i++)
|
|
||||||
{
|
|
||||||
m_Buffer [m_ReadOffset + i] = pBuf [i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// add noOfBits to number of valid bits in buffer
|
|
||||||
|
|
||||||
m_ValidBits += bToRead * 8 ;
|
|
||||||
bTotal += bToRead ;
|
|
||||||
pBuf += bToRead ;
|
|
||||||
|
|
||||||
m_ReadOffset = (m_ReadOffset + bToRead) & (BufferSize - 1) ;
|
|
||||||
noOfBytes -= bToRead ;
|
|
||||||
}
|
|
||||||
|
|
||||||
cbValid -= bTotal ;
|
|
||||||
|
|
||||||
// invalidate crc markers
|
|
||||||
|
|
||||||
m_FrameCrcValue = InvalidCrcValue ;
|
|
||||||
m_Markers = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// crc stuff
|
|
||||||
|
|
||||||
void CDolbyBitBuffer::SetPositionMarker (MarkerPosition position)
|
|
||||||
{
|
|
||||||
switch (position)
|
|
||||||
{
|
|
||||||
case SecondIndividualChannelStart :
|
|
||||||
|
|
||||||
m_Markers++ ;
|
|
||||||
|
|
||||||
case ChannelElementStart :
|
|
||||||
case AncillaryElementStart :
|
|
||||||
|
|
||||||
m_MarkerList [m_Markers] = CMarker (position, m_ValidBits, m_BitCnt, m_BitNdx) ;
|
|
||||||
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case ChannelElementStop :
|
|
||||||
case AncillaryElementStop :
|
|
||||||
|
|
||||||
for (int i = 0 ; i < ((m_MarkerList [m_Markers].what == SecondIndividualChannelStart) ? 2 : 1) ; i++)
|
|
||||||
{
|
|
||||||
int delimiter = m_BitNdx + ((m_BitNdx > m_MarkerList [m_Markers - i].m_BitNdx) ? 0 : BufferBits) ;
|
|
||||||
m_MarkerList [m_Markers - i].m_elementBits = delimiter - m_MarkerList [m_Markers - i].m_BitNdx ;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_Markers++ ;
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDolbyBitBuffer::IsCrcConsistent (unsigned int *crcValue)
|
|
||||||
{
|
|
||||||
if (m_FrameCrcValue == InvalidCrcValue)
|
|
||||||
return;
|
|
||||||
|
|
||||||
CMarker current (CurrentPosition, m_ValidBits, m_BitCnt, m_BitNdx) ;
|
|
||||||
|
|
||||||
*crcValue = 0xFFFF ;
|
|
||||||
|
|
||||||
for (unsigned int i = 0 ; i < m_Markers ; i++)
|
|
||||||
{
|
|
||||||
RestoreMarker (m_MarkerList [i]) ;
|
|
||||||
|
|
||||||
switch (m_MarkerList [i].what)
|
|
||||||
{
|
|
||||||
case ChannelElementStart :
|
|
||||||
|
|
||||||
UpdateCrc (*crcValue, m_MarkerList [i].m_elementBits, 192) ;
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case SecondIndividualChannelStart :
|
|
||||||
|
|
||||||
UpdateCrc (*crcValue, m_MarkerList [i].m_elementBits, 128) ;
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case AncillaryElementStart :
|
|
||||||
|
|
||||||
UpdateCrc (*crcValue, m_MarkerList [i].m_elementBits) ;
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RestoreMarker (current) ;
|
|
||||||
|
|
||||||
if (*crcValue != m_FrameCrcValue)
|
|
||||||
throw ECRCError();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDolbyBitBuffer::UpdateCrc (unsigned int &crcValue, int numberOfBits, int minimumBits)
|
|
||||||
{
|
|
||||||
static const unsigned int HIGHBIT_MASK = 0x8000 ;
|
|
||||||
static const unsigned int CRC_POLY = 0x8005 ;
|
|
||||||
|
|
||||||
static const unsigned int crcTable [] =
|
|
||||||
{
|
|
||||||
0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
|
|
||||||
0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
|
|
||||||
0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
|
|
||||||
0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
|
|
||||||
0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
|
|
||||||
0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
|
|
||||||
0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
|
|
||||||
0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
|
|
||||||
0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
|
|
||||||
0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
|
|
||||||
0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
|
|
||||||
0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
|
|
||||||
0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
|
|
||||||
0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
|
|
||||||
0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
|
|
||||||
0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
|
|
||||||
0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
|
|
||||||
0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
|
|
||||||
0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
|
|
||||||
0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
|
|
||||||
0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
|
|
||||||
0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
|
|
||||||
0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
|
|
||||||
0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
|
|
||||||
0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
|
|
||||||
0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
|
|
||||||
0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
|
|
||||||
0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
|
|
||||||
0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
|
|
||||||
0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
|
|
||||||
0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
|
|
||||||
0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
|
|
||||||
} ;
|
|
||||||
|
|
||||||
if (minimumBits && (numberOfBits > minimumBits))
|
|
||||||
numberOfBits = minimumBits ;
|
|
||||||
|
|
||||||
for (int bytes = 0 ; bytes < (numberOfBits >> 3) ; bytes++)
|
|
||||||
{
|
|
||||||
crcValue = ((crcValue << 8) & 0xFF00) ^ crcTable [((crcValue >> 8) ^ Get (8)) & 0x00FF] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int bits = 0 ; bits < (numberOfBits & 0x07) ; bits++)
|
|
||||||
{
|
|
||||||
int flag = ((crcValue & HIGHBIT_MASK) ? 1 : 0) ^ Get (1) ;
|
|
||||||
|
|
||||||
crcValue <<= 1 ;
|
|
||||||
crcValue &= 0xFFFF ;
|
|
||||||
|
|
||||||
if (flag) crcValue ^= CRC_POLY ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (minimumBits && (minimumBits > numberOfBits))
|
|
||||||
{
|
|
||||||
numberOfBits = minimumBits - numberOfBits ;
|
|
||||||
|
|
||||||
for (int bytes = 0 ; bytes < (numberOfBits >> 3) ; bytes++)
|
|
||||||
{
|
|
||||||
crcValue = ((crcValue << 8) & 0xFF00) ^ crcTable [(crcValue >> 8) & 0x00FF] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int bits = 0 ; bits < (numberOfBits & 0x07) ; bits++)
|
|
||||||
{
|
|
||||||
int flag = (crcValue & HIGHBIT_MASK) ? 1 : 0 ;
|
|
||||||
|
|
||||||
crcValue <<= 1 ;
|
|
||||||
crcValue &= 0xFFFF ;
|
|
||||||
|
|
||||||
if (flag) crcValue ^= CRC_POLY ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,292 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/bitbuffer.h,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: bitbuffer.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: memory input class with transport format
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __BITBUFFER_H__
|
|
||||||
#define __BITBUFFER_H__
|
|
||||||
|
|
||||||
#include "bitstream.h"
|
|
||||||
#include "aacdecoderapi.h"
|
|
||||||
|
|
||||||
|
|
||||||
class CStreamInfo ;
|
|
||||||
|
|
||||||
/** A Memory-Based Input Class.
|
|
||||||
|
|
||||||
This class implements a memory-based \Ref{CDolbyBitStream} interface with an ADTS
|
|
||||||
transport layer. It performs basic detection and synchronization work.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CDolbyBitBuffer : public CDolbyBitStream
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CDolbyBitBuffer () ;
|
|
||||||
virtual ~CDolbyBitBuffer () ;
|
|
||||||
|
|
||||||
// implementation of the CDolbyBitStream interface
|
|
||||||
|
|
||||||
virtual void ByteAlign (void) ;
|
|
||||||
virtual void PushBack (int n) ;
|
|
||||||
virtual long Get (int n) ;
|
|
||||||
|
|
||||||
unsigned int GetBitState() {return m_ValidBits;}
|
|
||||||
virtual void DecrementBlocks() { m_BlocksLeftInFrame--;}
|
|
||||||
virtual void ResetBlocks() {m_BlocksLeftInFrame=0;}
|
|
||||||
virtual void SetPositionMarker (MarkerPosition position) ;
|
|
||||||
|
|
||||||
/** Data Feed Method.
|
|
||||||
|
|
||||||
This method feeds a number of input bytes from an external source into
|
|
||||||
the modulo bitbuffer that the decoder will read from. The call consumes
|
|
||||||
up to cbSize bytes from a given array pBuf. cbValid will be updated
|
|
||||||
to indicate the number of valid bytes left in pBuf. If cbValid
|
|
||||||
equals zero, all the data in the input array has been consumed and
|
|
||||||
the buffer should be refilled from the external source.
|
|
||||||
|
|
||||||
@param pBuf Pointer to input buffer with bitstream data.
|
|
||||||
@param cbSize Total size of pBuf input buffer array.
|
|
||||||
@param cbValid Number of valid bytes left in pBuf array.
|
|
||||||
*/
|
|
||||||
|
|
||||||
virtual void Feed (unsigned char pBuf [], unsigned int cbSize, unsigned int &cbValid) ;
|
|
||||||
|
|
||||||
/** Bitstream Synchronization Method.
|
|
||||||
|
|
||||||
Call this method to see if there is decodable data in this bitbuffer
|
|
||||||
object. Only ever let the decoder read a frame from this object if
|
|
||||||
the IsDecodableFrame() method returned true. In addition, this method
|
|
||||||
will fill in a \Ref{CStreamInfo} object on success to indicate the detected
|
|
||||||
bitstream parameters.
|
|
||||||
|
|
||||||
@param info The configuration information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool IsDecodableFrame (CStreamInfo &info) ;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** CRC Evaluation Method.
|
|
||||||
|
|
||||||
Call this method to see if the optional CRC error protection checksum
|
|
||||||
carried in the ADTS transport header matches the most recently decoded
|
|
||||||
audio frame.
|
|
||||||
|
|
||||||
If error protection information is of concern, this method must be
|
|
||||||
called immediately after the decoder has read an entire audio frame
|
|
||||||
from this bitbuffer object.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void IsCrcConsistent (unsigned int *crcValue) ;
|
|
||||||
|
|
||||||
/** EOF Notification Method.
|
|
||||||
|
|
||||||
After being notified by this method, the bitbuffer will throw an
|
|
||||||
EEndOfFile exception the next time it runs out of data.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void SetEOF (void)
|
|
||||||
{
|
|
||||||
m_EOF = true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EndOf(void)
|
|
||||||
{
|
|
||||||
return m_EOF;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void SetFrameReadButNotDecoded(void)
|
|
||||||
{
|
|
||||||
m_bFrameReadButNotDecoded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void ClearFrameReadButNotDecoded(void)
|
|
||||||
{
|
|
||||||
m_bFrameReadButNotDecoded = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool FrameReadButNotDecoded(void)
|
|
||||||
{
|
|
||||||
return m_bFrameReadButNotDecoded;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual unsigned int GetBitCount(void)
|
|
||||||
{
|
|
||||||
return m_BitCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Initialization/Reset Method.
|
|
||||||
|
|
||||||
Clears the buffer's internal memory and removes any possibly pending data.
|
|
||||||
*/
|
|
||||||
|
|
||||||
virtual void Initialize (void) ;
|
|
||||||
|
|
||||||
virtual unsigned int GetFrameLength(){return frame_length;}
|
|
||||||
virtual unsigned int GetNRDB(){return number_of_raw_data_blocks_in_frame;}
|
|
||||||
|
|
||||||
long GetBytesSkipped(void) { return bytes_skipped; }
|
|
||||||
void ClearBytesSkipped(void);
|
|
||||||
void HoldBytesSkipped(void) { hold_bytes_skipped = true; }
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
BufferSize = 8192,
|
|
||||||
BufferBits = BufferSize*8,
|
|
||||||
|
|
||||||
InvalidCrcValue = 0xFFFFFFFF,
|
|
||||||
MaximumMarkers = 25*4
|
|
||||||
} ;
|
|
||||||
|
|
||||||
unsigned int m_ValidBits;
|
|
||||||
unsigned int m_ReadOffset;
|
|
||||||
unsigned int m_BitCnt;
|
|
||||||
unsigned int m_BitNdx;
|
|
||||||
|
|
||||||
unsigned int m_BlocksLeftInFrame ;
|
|
||||||
unsigned int m_FrameCrcValue ;
|
|
||||||
|
|
||||||
bool m_EOF ;
|
|
||||||
bool m_bFrameReadButNotDecoded;
|
|
||||||
|
|
||||||
unsigned char m_Buffer [BufferSize] ;
|
|
||||||
|
|
||||||
// adts_fixed_header
|
|
||||||
|
|
||||||
unsigned int id;
|
|
||||||
unsigned int layer;
|
|
||||||
unsigned int protection_absent;
|
|
||||||
unsigned int profile;
|
|
||||||
unsigned int sampling_frequency_index;
|
|
||||||
unsigned int private_bit;
|
|
||||||
unsigned int channel_configuration;
|
|
||||||
unsigned int original_copy;
|
|
||||||
unsigned int home;
|
|
||||||
|
|
||||||
// adts_variable_header
|
|
||||||
|
|
||||||
unsigned int copyright_identification_bit;
|
|
||||||
unsigned int copyright_identification_start;
|
|
||||||
unsigned int frame_length;
|
|
||||||
unsigned int buffer_fullness;
|
|
||||||
unsigned int last_buffer_fullness;
|
|
||||||
unsigned int last_frame_length;
|
|
||||||
unsigned int number_of_raw_data_blocks_in_frame;
|
|
||||||
|
|
||||||
// used to track # of bytes skipped
|
|
||||||
// during a re-synchronization
|
|
||||||
|
|
||||||
long bytes_skipped;
|
|
||||||
bool hold_bytes_skipped;
|
|
||||||
|
|
||||||
DECLARE_EXCEPTION(EUnimplemented, AAC_UNIMPLEMENTED, "Unimplemented Feature Used") ;
|
|
||||||
|
|
||||||
// bitrate averaging helper class
|
|
||||||
|
|
||||||
class CAverageNumber
|
|
||||||
{
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MaximumSize = 16
|
|
||||||
} ;
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CAverageNumber ()
|
|
||||||
{
|
|
||||||
m_Index = 0 ;
|
|
||||||
m_ActualCount=0;
|
|
||||||
for (int i = 0 ; i < MaximumSize ; i++)
|
|
||||||
m_Value [i] = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
~CAverageNumber () {}
|
|
||||||
|
|
||||||
CAverageNumber &operator += (unsigned int val)
|
|
||||||
{
|
|
||||||
m_Value [m_Index++ % MaximumSize] = val ;
|
|
||||||
if(m_ActualCount<MaximumSize) m_ActualCount++;
|
|
||||||
return *this ;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator unsigned int() const
|
|
||||||
{
|
|
||||||
unsigned int val = 0 ;
|
|
||||||
|
|
||||||
for (unsigned int i = 0 ; i < m_ActualCount ; i++)
|
|
||||||
val += m_Value [i] ;
|
|
||||||
if(m_ActualCount) val/=m_ActualCount;
|
|
||||||
else val=0;
|
|
||||||
return (val) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
unsigned int m_Value [MaximumSize] ;
|
|
||||||
unsigned int m_Index ;
|
|
||||||
unsigned int m_ActualCount;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
CAverageNumber m_ActualBitrate ;
|
|
||||||
|
|
||||||
|
|
||||||
// crc
|
|
||||||
|
|
||||||
void UpdateCrc (unsigned int &crcValue, int numberOfBits, int minimumBits = 0) ;
|
|
||||||
|
|
||||||
class CMarker
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CMarker () {}
|
|
||||||
~CMarker () {}
|
|
||||||
|
|
||||||
CMarker (MarkerPosition pos, unsigned int validBits, unsigned int bitCnt, unsigned int bitNdx)
|
|
||||||
{
|
|
||||||
what = pos ;
|
|
||||||
|
|
||||||
m_ValidBits = validBits ;
|
|
||||||
m_BitCnt = bitCnt ;
|
|
||||||
m_BitNdx = bitNdx ;
|
|
||||||
}
|
|
||||||
|
|
||||||
MarkerPosition what ;
|
|
||||||
|
|
||||||
unsigned int m_elementBits ;
|
|
||||||
|
|
||||||
unsigned int m_ValidBits;
|
|
||||||
unsigned int m_BitCnt;
|
|
||||||
unsigned int m_BitNdx;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
CMarker m_MarkerList [MaximumMarkers] ;
|
|
||||||
unsigned int m_Markers ;
|
|
||||||
|
|
||||||
void RestoreMarker (CMarker &marker)
|
|
||||||
{
|
|
||||||
m_ValidBits = marker.m_ValidBits ;
|
|
||||||
m_BitCnt = marker.m_BitCnt ;
|
|
||||||
m_BitNdx = marker.m_BitNdx ;
|
|
||||||
}
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,54 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/bitsequence.cpp,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: bitsequence.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: bitstream helper object
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "bitsequence.h"
|
|
||||||
#include "bitstream.h"
|
|
||||||
|
|
||||||
CVLBBitSequence::CVLBBitSequence (const int length, const int value)
|
|
||||||
{
|
|
||||||
m_Length = length ;
|
|
||||||
m_Value = value ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVLBBitSequence::CVLBBitSequence (const int length /* == 0 */)
|
|
||||||
{
|
|
||||||
m_Length = length ;
|
|
||||||
m_Value = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVLBBitSequence::~CVLBBitSequence ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CVLBBitSequence &CVLBBitSequence::operator= (int value)
|
|
||||||
{
|
|
||||||
m_Length = 0 ;
|
|
||||||
m_Value = value ;
|
|
||||||
return *this ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVLBBitSequence &CVLBBitSequence::operator+= (int value)
|
|
||||||
{
|
|
||||||
m_Value += value ;
|
|
||||||
return *this ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CVLBBitSequence::Read (CDolbyBitStream &bs, const int length)
|
|
||||||
{
|
|
||||||
m_Length = length ;
|
|
||||||
return Read (bs) ;
|
|
||||||
}
|
|
|
@ -1,63 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/bitsequence.h,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: bitsequence.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: bitstream helper object
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __VLB_BITSEQUENCE_H__
|
|
||||||
#define __VLB_BITSEQUENCE_H__
|
|
||||||
|
|
||||||
#include "bitstream.h"
|
|
||||||
|
|
||||||
/** Bitstream Parser Utility.
|
|
||||||
|
|
||||||
This helper class is basically a numerical value that can read itself from a
|
|
||||||
\Ref{CDolbyBitStream} interface for convenience. The decoder almost completely
|
|
||||||
does the bitstream parsing through CVLBBitSequence rather than \Ref{CDolbyBitStream} directly.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CVLBBitSequence
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CVLBBitSequence (const int length = 0) ;
|
|
||||||
CVLBBitSequence (const int length, const int value) ;
|
|
||||||
|
|
||||||
~CVLBBitSequence () ;
|
|
||||||
|
|
||||||
int Read (CDolbyBitStream& bs, const int length) ;
|
|
||||||
|
|
||||||
int Read (CDolbyBitStream& bs)
|
|
||||||
{
|
|
||||||
m_Value = bs.Get (m_Length) ;
|
|
||||||
return m_Value ;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator int() const
|
|
||||||
{
|
|
||||||
return m_Value ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVLBBitSequence &operator=(int) ;
|
|
||||||
CVLBBitSequence &operator+=(int) ;
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
int m_Length ;
|
|
||||||
int m_Value ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,150 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/bitstream.h,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: bitstream.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: input abstract base class
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __VLB_BITSTREAM_H__
|
|
||||||
#define __VLB_BITSTREAM_H__
|
|
||||||
|
|
||||||
#include "exception.h"
|
|
||||||
|
|
||||||
/** General Bitstream Input Base Class.
|
|
||||||
|
|
||||||
This abstract base class defines the interface that the \Ref{CAacDecoder} object will
|
|
||||||
read all of its bitstream input data from. Specialized classes for specific
|
|
||||||
application scenarios have to be derived from this interface.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CDolbyBitStream
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
/// Object Constructor.
|
|
||||||
|
|
||||||
CDolbyBitStream ()
|
|
||||||
{
|
|
||||||
m_AdifHeaderPresent = false ;
|
|
||||||
m_RiffHeaderPresent = false ;
|
|
||||||
m_IsADTSCompliant = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Object Destructor.
|
|
||||||
|
|
||||||
virtual ~CDolbyBitStream () {}
|
|
||||||
|
|
||||||
/** Byte Alignment Method.
|
|
||||||
|
|
||||||
This method performs the byte_alignment() syntactic method on the input stream,
|
|
||||||
i.e. some bits will be discarded so that the next bits to be read would be aligned
|
|
||||||
on a byte boundary with respect to the last call to ByteAlign().
|
|
||||||
*/
|
|
||||||
|
|
||||||
virtual void ByteAlign (void) = 0 ;
|
|
||||||
|
|
||||||
/** Push Back Method.
|
|
||||||
|
|
||||||
This method ungets a number of bits erroneously read by the last Get() call.
|
|
||||||
NB: The number of bits to be stuffed back into the stream may never exceed the
|
|
||||||
number of bits returned by the immediately preceding Get() call.
|
|
||||||
|
|
||||||
@param n The number of bits to be pushed back.
|
|
||||||
*/
|
|
||||||
|
|
||||||
virtual void PushBack (int n) = 0 ;
|
|
||||||
|
|
||||||
/** Get Bits Method.
|
|
||||||
|
|
||||||
This method returns a number of sequential bits from the input bitstream.
|
|
||||||
This is the one and only read operation that the decoder will ever perform,
|
|
||||||
i.e. _all_ the data goes through this call.
|
|
||||||
|
|
||||||
@param n The number of bits to be retrieved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
virtual long Get (int n) = 0 ;
|
|
||||||
|
|
||||||
/** ADIF detection Method.
|
|
||||||
|
|
||||||
This method indicates whether the decoder should read in and parse an ADIF header
|
|
||||||
before starting to decode the first frame of audio data.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool IsAdifHeaderPresent (void)
|
|
||||||
{
|
|
||||||
return m_AdifHeaderPresent ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** RIFF/ADTS detection Method.
|
|
||||||
|
|
||||||
This method indicates whether the decoder should read in and parse a RIFF header
|
|
||||||
before starting to decode the first frame of audio data.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool IsRiffHeaderPresent (void)
|
|
||||||
{
|
|
||||||
return m_RiffHeaderPresent;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsADTSCompliant (void)
|
|
||||||
{
|
|
||||||
return m_IsADTSCompliant;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CRC Markers for SetPositionMarker ().
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
ChannelElementStart,
|
|
||||||
ChannelElementStop,
|
|
||||||
AncillaryElementStart,
|
|
||||||
AncillaryElementStop,
|
|
||||||
SecondIndividualChannelStart,
|
|
||||||
CurrentPosition
|
|
||||||
} MarkerPosition ;
|
|
||||||
|
|
||||||
/** Position Marker Setting Method.
|
|
||||||
|
|
||||||
The decoder core can call this method to set position markers
|
|
||||||
in the bitstream. this facility can be used to implement
|
|
||||||
error-protection mechanisms in a derived class, for example,
|
|
||||||
if the underlying transport layer supports such a feature.
|
|
||||||
*/
|
|
||||||
|
|
||||||
virtual void SetPositionMarker (MarkerPosition position) {}
|
|
||||||
virtual void DecrementBlocks(){}
|
|
||||||
virtual void ResetBlocks() {}
|
|
||||||
virtual unsigned int GetFrameLength(){return 0;} //UNKNOWN IN ADIF
|
|
||||||
virtual unsigned int GetNRDB(){return 0;} //UNKNOWN IN ADIF
|
|
||||||
virtual void SetFrameReadButNotDecoded(void){}
|
|
||||||
virtual void ClearFrameReadButNotDecoded(void){}
|
|
||||||
virtual bool FrameReadButNotDecoded(void){return false;}
|
|
||||||
|
|
||||||
virtual unsigned int GetBitCount(void) {return 0;};
|
|
||||||
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
DECLARE_EXCEPTION(EDoesNotExist, AAC_DOESNOTEXIST, "Bitstream does not exist") ;
|
|
||||||
DECLARE_EXCEPTION(EEndOfFile, AAC_ENDOFSTREAM, "End of file reached") ;
|
|
||||||
|
|
||||||
bool m_AdifHeaderPresent;
|
|
||||||
bool m_RiffHeaderPresent;
|
|
||||||
bool m_IsADTSCompliant;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,224 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/block.cpp,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: block.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: base class for CLongBlock, CShortBlock
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include <math.h> // pow()
|
|
||||||
|
|
||||||
#include "block.h"
|
|
||||||
#include "bitstream.h"
|
|
||||||
#include "channelinfo.h"
|
|
||||||
|
|
||||||
CBlock::CBlock (CChannelInfo &info)
|
|
||||||
: m_IcsInfo (info)
|
|
||||||
{
|
|
||||||
m_LongWindow [0] = m_OnlyLongWindowSine ;
|
|
||||||
m_ShortWindow [0] = m_OnlyShortWindowSine ;
|
|
||||||
|
|
||||||
#ifdef ONLY_SINE_WINDOW
|
|
||||||
m_LongWindow [1] = m_OnlyLongWindowSine ;
|
|
||||||
m_ShortWindow [1] = m_OnlyShortWindowSine ;
|
|
||||||
#else
|
|
||||||
m_LongWindow [1] = m_OnlyLongWindowKBD ;
|
|
||||||
m_ShortWindow [1] = m_OnlyShortWindowKBD ;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
CBlock::~CBlock ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int CBlock::DecodeHuffmanWord (CDolbyBitStream &bs, const unsigned int (*CodeBook) [HuffmanEntries])
|
|
||||||
{
|
|
||||||
unsigned int val, len ;
|
|
||||||
unsigned int index = 0, bits = HuffmanBits ;
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
val = CodeBook [index][bs.Get (HuffmanBits)] ;
|
|
||||||
len = val >> 16 ;
|
|
||||||
|
|
||||||
if (len == 0)
|
|
||||||
{
|
|
||||||
index = val & 0xFFFF ;
|
|
||||||
bits += HuffmanBits ;
|
|
||||||
continue ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (len != bits)
|
|
||||||
{
|
|
||||||
bs.PushBack (bits - len) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
val &= 0xFFFF ;
|
|
||||||
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return val ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CBlock::GetEscape (CDolbyBitStream &bs, const int q)
|
|
||||||
{
|
|
||||||
int i, off, neg ;
|
|
||||||
|
|
||||||
if (q < 0)
|
|
||||||
{
|
|
||||||
if (q != -16) return q ;
|
|
||||||
|
|
||||||
neg = 1 ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (q != +16) return q ;
|
|
||||||
|
|
||||||
neg = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 4 ; ; i++)
|
|
||||||
{
|
|
||||||
if (bs.Get (1) == 0)
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i > 16)
|
|
||||||
{
|
|
||||||
off = bs.Get (i - 16) << 16 ;
|
|
||||||
off |= bs.Get (16) ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
off = bs.Get (i) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = off + (1 << i) ;
|
|
||||||
|
|
||||||
if (neg) i = -i ;
|
|
||||||
|
|
||||||
return i ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CBlock::UnpackIndex (int idx, int *qp, const CodeBookDescription *hcb)
|
|
||||||
{
|
|
||||||
if (hcb->Dimension == 4)
|
|
||||||
{
|
|
||||||
int index = idx << 2 ;
|
|
||||||
|
|
||||||
qp [0] = hcb->NTuples [index] ;
|
|
||||||
qp [1] = hcb->NTuples [index + 1] ;
|
|
||||||
qp [2] = hcb->NTuples [index + 2] ;
|
|
||||||
qp [3] = hcb->NTuples [index + 3] ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int index = idx << 1 ;
|
|
||||||
|
|
||||||
qp [0] = hcb->NTuples [index] ;
|
|
||||||
qp [1] = hcb->NTuples [index + 1] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return hcb->Dimension ;
|
|
||||||
}
|
|
||||||
|
|
||||||
float CBlock::InverseQuantize (int q)
|
|
||||||
{
|
|
||||||
if (q > 0)
|
|
||||||
{
|
|
||||||
if (q < InverseQuantTableSize)
|
|
||||||
{
|
|
||||||
return (m_InverseQuantTable [q]) ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return (static_cast<float>(pow (static_cast<float>(q), 4.0F / 3.0F))) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
q = -q ;
|
|
||||||
|
|
||||||
if (q < InverseQuantTableSize)
|
|
||||||
{
|
|
||||||
return (-m_InverseQuantTable [q]) ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return (static_cast<float>(-pow (static_cast<float>(q), 4.0F / 3.0F))) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBlock::Read (CDolbyBitStream &bs, const int global_gain)
|
|
||||||
{
|
|
||||||
ReadSectionData (bs) ;
|
|
||||||
ReadScaleFactorData (bs, global_gain) ;
|
|
||||||
|
|
||||||
m_PulseData.Read (bs) ;
|
|
||||||
m_Tns.Read (m_IcsInfo, bs) ;
|
|
||||||
|
|
||||||
CVLBBitSequence GainControlDataPresent (1) ;
|
|
||||||
|
|
||||||
GainControlDataPresent.Read (bs) ;
|
|
||||||
if (GainControlDataPresent)
|
|
||||||
{
|
|
||||||
throw EUnimplemented () ;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReadSpectralData (bs) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBlock::ApplyTools (void)
|
|
||||||
{
|
|
||||||
m_Tns.Apply (m_IcsInfo, *this) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CBlock &operator+= (CBlock &lhs, CBlock &rhs)
|
|
||||||
{
|
|
||||||
// operator+= sums up the spectral bins of two blocks
|
|
||||||
// in the frequency domain (must switch together)
|
|
||||||
|
|
||||||
// add two long blocks
|
|
||||||
|
|
||||||
if (lhs.m_IcsInfo.IsLongBlock () && rhs.m_IcsInfo.IsLongBlock ())
|
|
||||||
{
|
|
||||||
if (lhs.m_IcsInfo.GetWindowShape () == rhs.m_IcsInfo.GetWindowShape ())
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < CLongBlock::MaximumBins ; i++)
|
|
||||||
{
|
|
||||||
lhs.AccessSpectralData () [i] += rhs.AccessSpectralData () [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add two short blocks
|
|
||||||
|
|
||||||
else if (lhs.m_IcsInfo.IsShortBlock () && rhs.m_IcsInfo.IsShortBlock ())
|
|
||||||
{
|
|
||||||
if (lhs.m_IcsInfo.GetWindowShape () == rhs.m_IcsInfo.GetWindowShape ())
|
|
||||||
{
|
|
||||||
for (int win = 0 ; win < CShortBlock::MaximumWindows ; win++)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < CShortBlock::MaximumBins ; i++)
|
|
||||||
{
|
|
||||||
lhs.AccessSpectralData (win) [i] += rhs.AccessSpectralData (win) [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return lhs ;
|
|
||||||
}
|
|
343
Src/vlb/block.h
343
Src/vlb/block.h
|
@ -1,343 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/block.h,v 1.2 2011/06/13 02:06:02 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: block.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: Defines abstract base class CBlock
|
|
||||||
*
|
|
||||||
* $Header: /cvs/root/winamp/vlb/block.h,v 1.2 2011/06/13 02:06:02 audiodsp Exp $
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __BLOCK_H__
|
|
||||||
#define __BLOCK_H__
|
|
||||||
|
|
||||||
#include "exception.h"
|
|
||||||
|
|
||||||
#include "pulsedata.h"
|
|
||||||
#include "tns.h"
|
|
||||||
#include "DolbyPayload.h"
|
|
||||||
|
|
||||||
class CChannelInfo ;
|
|
||||||
class CDolbyBitStream ;
|
|
||||||
class COverlapAddBuffer ;
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
class CPrediction ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Spectral Data For Current Frame.
|
|
||||||
|
|
||||||
This abstract base class defines the interface and some common helper functions
|
|
||||||
for the classes holding the spectral coefficients of the current frame.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CBlock
|
|
||||||
{
|
|
||||||
// allow tools to call AccessXXX() methods
|
|
||||||
|
|
||||||
friend class CJointStereo ;
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
friend class CPrediction ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
friend class CTns ;
|
|
||||||
|
|
||||||
friend class CCouplingChannel ;
|
|
||||||
|
|
||||||
friend CBlock &operator+= (CBlock &, CBlock &) ;
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CBlock (CChannelInfo &) ;
|
|
||||||
virtual ~CBlock () ;
|
|
||||||
|
|
||||||
void Read (CDolbyBitStream &bs, const int global_gain) ;
|
|
||||||
|
|
||||||
virtual void ApplyTools (void) ;
|
|
||||||
|
|
||||||
virtual void FrequencyToTime (COverlapAddBuffer &, float [], const int) = 0 ;
|
|
||||||
//MSV
|
|
||||||
virtual void FrequencyToTime_Fast (COverlapAddBuffer&) = 0 ;
|
|
||||||
virtual void FrequencyToTime (COverlapAddBuffer &) = 0;
|
|
||||||
virtual SECTION_INFORMATION_STRUCT* GetSectionInfo() = 0;
|
|
||||||
// gimmicks
|
|
||||||
|
|
||||||
virtual void ApplyEqualizationMask (float Mask []) = 0 ;
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
EqualizationMaskLength = 16,
|
|
||||||
|
|
||||||
ZERO_HCB = 0,
|
|
||||||
ESCBOOK = 11,
|
|
||||||
NSPECBOOKS = ESCBOOK + 1,
|
|
||||||
BOOKSCL = NSPECBOOKS,
|
|
||||||
RESERVED_HCB = 13,
|
|
||||||
INTENSITY_HCB2 = 14,
|
|
||||||
INTENSITY_HCB = 15,
|
|
||||||
|
|
||||||
InverseQuantTableSize = 1024,
|
|
||||||
ExpTableSize = 128,
|
|
||||||
|
|
||||||
HuffmanBits = 4,
|
|
||||||
HuffmanEntries = (1 << HuffmanBits)
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
virtual float *AccessSpectralData (int window = 0) = 0 ;
|
|
||||||
virtual float *AccessOutput() =0;
|
|
||||||
virtual short *AccessShortOutput() =0;
|
|
||||||
short FloatToShort (float pcm)
|
|
||||||
{
|
|
||||||
if (pcm < 0.0F)
|
|
||||||
{
|
|
||||||
pcm = -pcm ;
|
|
||||||
pcm += 0.5F ;
|
|
||||||
|
|
||||||
return (pcm > 32768.0F) ? -32768 : -((short) pcm) ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pcm += 0.5F ;
|
|
||||||
|
|
||||||
return (pcm > 32767.0F) ? 32767 : (short) pcm ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected :
|
|
||||||
|
|
||||||
// overridable readers
|
|
||||||
|
|
||||||
virtual void ReadSectionData (CDolbyBitStream &bs) = 0 ;
|
|
||||||
virtual void ReadScaleFactorData (CDolbyBitStream &bs, const int global_gain) = 0 ;
|
|
||||||
virtual void ReadSpectralData (CDolbyBitStream &bs) = 0 ;
|
|
||||||
|
|
||||||
// tools interface
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual int *AccessCodeBooks (int group) = 0 ;
|
|
||||||
virtual int *AccessScaleFactors (int group) = 0 ;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
CChannelInfo &m_IcsInfo ;
|
|
||||||
CPulseData m_PulseData ;
|
|
||||||
CTns m_Tns ;
|
|
||||||
|
|
||||||
// Huffman Decoding
|
|
||||||
|
|
||||||
typedef struct tagCodeBookDescription
|
|
||||||
{
|
|
||||||
int Dimension ;
|
|
||||||
bool IsSigned ;
|
|
||||||
const unsigned int (*CodeBook)[HuffmanEntries] ;
|
|
||||||
const int *NTuples ;
|
|
||||||
} CodeBookDescription ;
|
|
||||||
|
|
||||||
int DecodeHuffmanWord (CDolbyBitStream &bs, const unsigned int (*CodeBook) [HuffmanEntries]) ;
|
|
||||||
int UnpackIndex (int idx, int *qp, const CodeBookDescription *hcb) ;
|
|
||||||
int GetEscape (CDolbyBitStream &bs, const int q) ;
|
|
||||||
|
|
||||||
static const CodeBookDescription HuffmanCodeBooks [13] ;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
float InverseQuantize (int q) ;
|
|
||||||
|
|
||||||
int m_SectBits ;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// window functions
|
|
||||||
|
|
||||||
static const float m_OnlyLongWindowSine [1024] ;
|
|
||||||
static const float m_OnlyLongWindowKBD [1024] ;
|
|
||||||
|
|
||||||
static const float m_OnlyShortWindowSine [128] ;
|
|
||||||
static const float m_OnlyShortWindowKBD [128] ;
|
|
||||||
|
|
||||||
const float *m_LongWindow [2] ;
|
|
||||||
const float *m_ShortWindow [2] ;
|
|
||||||
|
|
||||||
// imdct
|
|
||||||
|
|
||||||
void Split (const float [], float [], float [], const float [], int) ;
|
|
||||||
void Merge (float [], const float [], const float [], int ) ;
|
|
||||||
|
|
||||||
void Dct1024 (float vec [], const float cosTerms []) ;
|
|
||||||
void Dct128 (float vec [], const float cosTerms []) ;
|
|
||||||
void Dct16 (float vec [], const float cosTerms []) ;
|
|
||||||
|
|
||||||
// speed-up tabes
|
|
||||||
|
|
||||||
static const float m_InverseQuantTable [CBlock::InverseQuantTableSize] ;
|
|
||||||
static const float m_ExpTable [CBlock::ExpTableSize] ;
|
|
||||||
|
|
||||||
// exceptions
|
|
||||||
|
|
||||||
DECLARE_EXCEPTION(EInvalidCodeBook, AAC_INVALIDCODEBOOK, "Invalid Huffman Codebook") ;
|
|
||||||
DECLARE_EXCEPTION(EUnimplemented, AAC_UNIMPLEMENTED, "Unimplemented Feature Used") ;
|
|
||||||
|
|
||||||
// platform dependent stuff
|
|
||||||
|
|
||||||
#if defined (WIN32) && defined (_M_IX86)
|
|
||||||
|
|
||||||
void PentiumOverlap (float output [], float spec [], float prev [], unsigned int stride);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
/** Spectral Data For One Long Block.
|
|
||||||
|
|
||||||
This class holds the spectral coefficients for the current frame in case it's
|
|
||||||
a start block, a stop block or a regular long block.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CLongBlock : public CBlock
|
|
||||||
{
|
|
||||||
friend CBlock &operator+= (CBlock &, CBlock &) ;
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CLongBlock (CChannelInfo &) ;
|
|
||||||
virtual ~CLongBlock () ;
|
|
||||||
|
|
||||||
virtual void FrequencyToTime (COverlapAddBuffer &, float [], const int) ;
|
|
||||||
//MSV
|
|
||||||
virtual void FrequencyToTime_Fast (COverlapAddBuffer &) ;
|
|
||||||
virtual void FrequencyToTime (COverlapAddBuffer &);
|
|
||||||
// gimmicks
|
|
||||||
|
|
||||||
virtual void ApplyEqualizationMask (float Mask []) ;
|
|
||||||
//MSV:
|
|
||||||
virtual SECTION_INFORMATION_STRUCT* GetSectionInfo(){return (&sSectionInfoStruct);}
|
|
||||||
|
|
||||||
virtual float *AccessSpectralData (int window = 0) ;
|
|
||||||
virtual float *AccessOutput() {return m_Output;}
|
|
||||||
virtual short *AccessShortOutput() {return m_ShortOutput;}
|
|
||||||
private:
|
|
||||||
SECTION_INFORMATION_STRUCT sSectionInfoStruct;
|
|
||||||
protected :
|
|
||||||
|
|
||||||
// overridden readers
|
|
||||||
|
|
||||||
virtual void ReadSectionData (CDolbyBitStream &bs) ;
|
|
||||||
virtual void ReadScaleFactorData (CDolbyBitStream &bs, int const global_gain) ;
|
|
||||||
virtual void ReadSpectralData (CDolbyBitStream &bs) ;
|
|
||||||
|
|
||||||
// tools interface
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual int *AccessCodeBooks (int group) ;
|
|
||||||
virtual int *AccessScaleFactors (int group) ;
|
|
||||||
int GetMaximumBins() { return MaximumBins; } ;
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
void InverseTransform (float data []) ;
|
|
||||||
void ApplyWindowFunction (COverlapAddBuffer &Previous) ;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MaximumScaleFactorBands = 64,
|
|
||||||
MaximumBins = 1024
|
|
||||||
} ;
|
|
||||||
|
|
||||||
int m_CodeBook [CLongBlock::MaximumScaleFactorBands] ;
|
|
||||||
int m_ScaleFactor [CLongBlock::MaximumScaleFactorBands] ;
|
|
||||||
|
|
||||||
float m_SpectralCoefficient [2 * CLongBlock::MaximumBins] ;
|
|
||||||
float m_Output[1024];
|
|
||||||
short m_ShortOutput[1024];
|
|
||||||
// platform dependent stuff
|
|
||||||
|
|
||||||
#if defined (WIN32) && defined (_M_IX86)
|
|
||||||
|
|
||||||
void PentiumWindow (float spec [], const float prev [], const float curr []) ;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
/** Spectral Data For One Short Block.
|
|
||||||
|
|
||||||
This class holds the spectral coefficients for the current frame in case it's
|
|
||||||
a short block, i.e. consists of eight short windows.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CShortBlock : public CBlock
|
|
||||||
{
|
|
||||||
friend CBlock &operator+= (CBlock &, CBlock &) ;
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CShortBlock (CChannelInfo &) ;
|
|
||||||
virtual ~CShortBlock () ;
|
|
||||||
|
|
||||||
virtual void FrequencyToTime (COverlapAddBuffer &, float [], const int) ;
|
|
||||||
//MSV
|
|
||||||
virtual void FrequencyToTime_Fast (COverlapAddBuffer &) ;
|
|
||||||
virtual void FrequencyToTime (COverlapAddBuffer &);
|
|
||||||
// gimmicks
|
|
||||||
|
|
||||||
virtual void ApplyEqualizationMask (float Mask []) ;
|
|
||||||
virtual float *AccessSpectralData (int window = 0) ;
|
|
||||||
virtual float *AccessOutput() {return m_Output;}
|
|
||||||
virtual short *AccessShortOutput() {return m_ShortOutput;}
|
|
||||||
virtual SECTION_INFORMATION_STRUCT* GetSectionInfo(){return (&sSectionInfoStruct);}
|
|
||||||
private:
|
|
||||||
SECTION_INFORMATION_STRUCT sSectionInfoStruct;
|
|
||||||
protected :
|
|
||||||
|
|
||||||
// overridden readers
|
|
||||||
|
|
||||||
virtual void ReadSectionData (CDolbyBitStream &bs) ;
|
|
||||||
virtual void ReadScaleFactorData (CDolbyBitStream &bs, const int global_gain) ;
|
|
||||||
virtual void ReadSpectralData (CDolbyBitStream &bs) ;
|
|
||||||
|
|
||||||
// tools interface
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual int *AccessCodeBooks (int group) ;
|
|
||||||
virtual int *AccessScaleFactors (int group) ;
|
|
||||||
|
|
||||||
// private
|
|
||||||
|
|
||||||
void InverseTransform (float data []) ;
|
|
||||||
void TransformWindows (COverlapAddBuffer &Previous, float EightWindowsBuffer []) ;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MaximumWindows = 8,
|
|
||||||
MaximumGroups = MaximumWindows,
|
|
||||||
|
|
||||||
MaximumScaleFactorBands = 16,
|
|
||||||
MaximumBins = 128
|
|
||||||
} ;
|
|
||||||
|
|
||||||
int m_CodeBook [CShortBlock::MaximumGroups][CShortBlock::MaximumScaleFactorBands] ;
|
|
||||||
int m_ScaleFactor [CShortBlock::MaximumGroups][CShortBlock::MaximumScaleFactorBands] ;
|
|
||||||
|
|
||||||
float m_SpectralCoefficient [CShortBlock::MaximumWindows][2 * CShortBlock::MaximumBins] ;
|
|
||||||
float m_Output[1024];
|
|
||||||
short m_ShortOutput[1024];
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,843 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/channel.cpp,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: channel.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: independent channel stream object
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include <new.h> // displacement new
|
|
||||||
|
|
||||||
#include "channel.h"
|
|
||||||
#include "bitstream.h"
|
|
||||||
#include "bitsequence.h"
|
|
||||||
|
|
||||||
// // // Base class for CSingleChannel, CChannelPair
|
|
||||||
|
|
||||||
CChannelElement::CChannelElement (CDolbyBitStream &bs)
|
|
||||||
: m_bs (bs),
|
|
||||||
m_GlobalGain (8)
|
|
||||||
{
|
|
||||||
m_WantEqualizer = false ;
|
|
||||||
m_WantSpectralData = false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CChannelElement::~CChannelElement ()
|
|
||||||
{}
|
|
||||||
|
|
||||||
CBlock *CChannelElement::ReadICS (CChannelInfo &ics_info, unsigned long *memory)
|
|
||||||
{
|
|
||||||
// allocates and reads one individual_channel_stream
|
|
||||||
|
|
||||||
m_GlobalGain.Read (m_bs) ;
|
|
||||||
|
|
||||||
if (!ics_info.IsValid ())
|
|
||||||
{
|
|
||||||
ics_info.Read (m_bs) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CBlock *block ;
|
|
||||||
|
|
||||||
if (ics_info.IsLongBlock ())
|
|
||||||
{
|
|
||||||
block = new (static_cast<void *>(memory)) CLongBlock (ics_info) ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
block = new (static_cast<void *>(memory)) CShortBlock (ics_info) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
block->Read (m_bs, m_GlobalGain) ;
|
|
||||||
|
|
||||||
// 'block' points to the same location as 'memory', but keeping the
|
|
||||||
// m_Block pointers as class members saves us a lot of typecasting
|
|
||||||
|
|
||||||
return block ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CChannelElement::SetEqualization (bool wantEQ, float Mask [])
|
|
||||||
{
|
|
||||||
m_WantEqualizer = wantEQ ;
|
|
||||||
|
|
||||||
if (wantEQ)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < CBlock::EqualizationMaskLength ; i++)
|
|
||||||
{
|
|
||||||
m_EqualizerMask [i] = Mask [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// // // CSingleChannel wraps single_channel_element()
|
|
||||||
|
|
||||||
CSingleChannel::CSingleChannel (CDolbyBitStream &theBitstream)
|
|
||||||
: CChannelElement (theBitstream)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
m_Prediction.FullReset () ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
poIMDCTObject=new IMDCTObject(4096,256);
|
|
||||||
poNormalIMDCTObject=new IMDCTObject(2048,128);
|
|
||||||
ppfData=new float*[1];
|
|
||||||
ppshData=new short*[1];
|
|
||||||
|
|
||||||
m_poAudioDSP = new AudioIODSP(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
CSingleChannel::~CSingleChannel ()
|
|
||||||
{
|
|
||||||
delete poIMDCTObject;
|
|
||||||
delete poNormalIMDCTObject;
|
|
||||||
delete[] ppfData;
|
|
||||||
delete[] ppshData;
|
|
||||||
delete m_poAudioDSP;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CSingleChannel::Read (const CStreamInfo &si)
|
|
||||||
{
|
|
||||||
m_IcsInfo.Reset (si) ;
|
|
||||||
|
|
||||||
m_Block = ReadICS (m_IcsInfo, m_BlockMemory) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CSingleChannel::Decode (AudioIOControl *poAudioIO, CStreamInfo &info, int stride /* = 1 */)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (m_IcsInfo.IsMainProfile ())
|
|
||||||
{
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
m_Prediction.Apply (m_IcsInfo, *m_Block) ;
|
|
||||||
#else
|
|
||||||
throw EIllegalProfile();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
m_Block->ApplyTools () ;
|
|
||||||
|
|
||||||
if (m_WantEqualizer)
|
|
||||||
{
|
|
||||||
m_Block->ApplyEqualizationMask (m_EqualizerMask) ;
|
|
||||||
}
|
|
||||||
m_Block->FrequencyToTime_Fast (m_Previous) ;
|
|
||||||
ppfData[0]=m_Block->AccessOutput();
|
|
||||||
|
|
||||||
// ApplyLimiter is called to minimize distortion from clipping. The limiter can only
|
|
||||||
// be applied to 128 samples at a time so there must be several calls to limit all 1024
|
|
||||||
// samples in a block. This is due to the way the buffer allocation is done in the
|
|
||||||
// constructor of the AudioIODSP class.
|
|
||||||
int iLength = 1024;
|
|
||||||
int grpIndex = 0;
|
|
||||||
short sThisLength = (iLength < DLYBUFSZ) ? iLength : DLYBUFSZ;
|
|
||||||
|
|
||||||
m_poAudioDSP->SetSamplingRate(info.GetSamplingRate());
|
|
||||||
for (int sSamp = 0; sSamp < iLength; sSamp += sThisLength)
|
|
||||||
{
|
|
||||||
m_poAudioDSP->ApplyLimiter(ppfData, sThisLength, grpIndex);
|
|
||||||
sThisLength = ((iLength - sThisLength * grpIndex++) < DLYBUFSZ) ?
|
|
||||||
(iLength - sThisLength * grpIndex++) : DLYBUFSZ;
|
|
||||||
}
|
|
||||||
poAudioIO->IO(ppfData,1024);
|
|
||||||
m_Block->~CBlock () ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CSingleChannel::DecodeDolby ( AudioIOControl *poAudioIO,
|
|
||||||
DOLBY_PAYLOAD_STRUCT *psDSEInfo,
|
|
||||||
CStreamInfo &info,
|
|
||||||
int stride /* = 1 */)
|
|
||||||
{
|
|
||||||
int iWindowType;
|
|
||||||
int iWindowShape;
|
|
||||||
int i,j,grp_index,win_in_grp_index;
|
|
||||||
int startingBinForThisWindow, startingBaseBandBin, halfWindowLength;
|
|
||||||
int overall_window_number1, overall_window_number2;
|
|
||||||
int firstWinThisGrp;
|
|
||||||
float avgCopyEnergies[8][SE_MAX_NUM_BANDS];
|
|
||||||
int iBandCounter;
|
|
||||||
|
|
||||||
// previous window sequence
|
|
||||||
// need to keep this variable around to handle legacy code which forces
|
|
||||||
// spectral extend to rely on a special case for WindowSequence == 3
|
|
||||||
|
|
||||||
static int previousWindowSequence = 0;
|
|
||||||
|
|
||||||
// get pointer to spectral data
|
|
||||||
// these calls really need to depend on the blocktype -
|
|
||||||
// short blocks require the window number (0-7) to be passed
|
|
||||||
// to AccessSpectralData(); long blocks do not require this argument.
|
|
||||||
|
|
||||||
ppfData[0]=m_Block->AccessSpectralData();
|
|
||||||
|
|
||||||
// Apply DNS here.
|
|
||||||
// Only apply DNS if we have valid DNS information read from the SE bitstream.
|
|
||||||
// If there was a SE bitstream reading error of *any* kind, do not apply DNS.
|
|
||||||
|
|
||||||
if (psDSEInfo->iDolbyBitStreamWarning == 0)
|
|
||||||
{
|
|
||||||
// applyDNS() applies to all window groups at the same time, so there is
|
|
||||||
// no need to call applyDNS() for each window group individually.
|
|
||||||
applyDNS(ppfData[0],&psDSEInfo->asDNSInfoStruct[0],previousWindowSequence);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
if (m_IcsInfo.IsMainProfile ())
|
|
||||||
{
|
|
||||||
m_Prediction.Apply (m_IcsInfo, *m_Block) ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
iWindowType=m_IcsInfo.GetWindowSequence();
|
|
||||||
iWindowShape=m_IcsInfo.GetWindowShape();
|
|
||||||
|
|
||||||
//Do TNS:
|
|
||||||
m_Block->ApplyTools () ;
|
|
||||||
|
|
||||||
// Spectral Extension.
|
|
||||||
|
|
||||||
// for each window group...
|
|
||||||
overall_window_number1 = 0;
|
|
||||||
overall_window_number2 = 0;
|
|
||||||
|
|
||||||
for(grp_index=0;grp_index<psDSEInfo->iGroupCount[0];grp_index++)
|
|
||||||
{
|
|
||||||
firstWinThisGrp = overall_window_number1;
|
|
||||||
|
|
||||||
// for each window within the current window group...
|
|
||||||
for(win_in_grp_index=0;
|
|
||||||
win_in_grp_index<psDSEInfo->iGroupLength[0][grp_index];
|
|
||||||
win_in_grp_index++,overall_window_number1++)
|
|
||||||
{
|
|
||||||
|
|
||||||
// compute some parameters depedent on short/long blocktype, window group number, and transform length
|
|
||||||
if (psDSEInfo->asDNSInfoStruct[0].iWindowSequence == 2)
|
|
||||||
{
|
|
||||||
// SHORT BLOCKS
|
|
||||||
startingBinForThisWindow = overall_window_number1*256;
|
|
||||||
startingBaseBandBin = 12;
|
|
||||||
halfWindowLength = (psDSEInfo->iUsesDoubleLengthXForm) ? 256 : 128;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// LONG, STOP, START blocks
|
|
||||||
startingBinForThisWindow = 0;
|
|
||||||
#ifdef NEW_BUFFER_MODEL
|
|
||||||
startingBaseBandBin = 96;
|
|
||||||
#else
|
|
||||||
startingBaseBandBin = 100;
|
|
||||||
#endif
|
|
||||||
halfWindowLength = (psDSEInfo->iUsesDoubleLengthXForm) ? 2048 : 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
computeAvgCopyEnergies(&ppfData[0][startingBinForThisWindow],
|
|
||||||
startingBaseBandBin,
|
|
||||||
psDSEInfo->aiCopyStop[0],
|
|
||||||
psDSEInfo->num_se_bands[0],
|
|
||||||
psDSEInfo->seBands[0][grp_index],
|
|
||||||
halfWindowLength,
|
|
||||||
psDSEInfo->asDNSInfoStruct[0].iWindowSequence,
|
|
||||||
avgCopyEnergies[overall_window_number1]);
|
|
||||||
}/* win_in_grp_index */
|
|
||||||
|
|
||||||
/* compute average energies for each group before passing into spectral extend */
|
|
||||||
// accumulate energies for this group
|
|
||||||
|
|
||||||
for(win_in_grp_index=1;
|
|
||||||
win_in_grp_index<psDSEInfo->iGroupLength[0][grp_index];
|
|
||||||
win_in_grp_index++)
|
|
||||||
{
|
|
||||||
for(iBandCounter=0;iBandCounter<psDSEInfo->num_se_bands[0];iBandCounter++)
|
|
||||||
{
|
|
||||||
avgCopyEnergies[firstWinThisGrp][iBandCounter] += avgCopyEnergies[firstWinThisGrp + win_in_grp_index][iBandCounter];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// find the average energy for this group
|
|
||||||
for(iBandCounter=0;iBandCounter<psDSEInfo->num_se_bands[0];iBandCounter++)
|
|
||||||
{
|
|
||||||
avgCopyEnergies[firstWinThisGrp][iBandCounter] /= psDSEInfo->iGroupLength[0][grp_index];
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy this average energy to all values in the avgCopyEnergies array which correspond to windows in the current group
|
|
||||||
for(win_in_grp_index=1;
|
|
||||||
win_in_grp_index<psDSEInfo->iGroupLength[0][grp_index];
|
|
||||||
win_in_grp_index++)
|
|
||||||
{
|
|
||||||
for(iBandCounter=0;iBandCounter<psDSEInfo->num_se_bands[0];iBandCounter++)
|
|
||||||
{
|
|
||||||
avgCopyEnergies[firstWinThisGrp + win_in_grp_index][iBandCounter] = avgCopyEnergies[firstWinThisGrp][iBandCounter];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// for each window within the current window group...
|
|
||||||
for (win_in_grp_index=0;
|
|
||||||
win_in_grp_index<psDSEInfo->iGroupLength[0][grp_index];
|
|
||||||
win_in_grp_index++,overall_window_number2++)
|
|
||||||
{
|
|
||||||
firstWinThisGrp = overall_window_number2;
|
|
||||||
|
|
||||||
// check to see if dolby bitstream was read correctly.
|
|
||||||
// If so, spectral extend all windows, whether we're dealing with a long block or short block
|
|
||||||
if (psDSEInfo->iDolbyBitStreamWarning == 0)
|
|
||||||
{
|
|
||||||
// compute some parameters dependent short/long blocktype, window group number, and transform length
|
|
||||||
if (psDSEInfo->asDNSInfoStruct[0].iWindowSequence == 2)
|
|
||||||
{
|
|
||||||
// SHORT blocks
|
|
||||||
// The constant 256 is ugly here - but is equal to (2 * CShortBlock::MaximumBins).
|
|
||||||
// This is the spacing of the mdct coefficients in the buffer ppfData[n], independent
|
|
||||||
// of whether we're using a single or double length transform.
|
|
||||||
startingBinForThisWindow = overall_window_number2*256;
|
|
||||||
startingBaseBandBin = 12;
|
|
||||||
halfWindowLength = (psDSEInfo->iUsesDoubleLengthXForm) ? 256 : 128;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// LONG, STOP, START blocks
|
|
||||||
startingBinForThisWindow = 0;
|
|
||||||
#ifdef NEW_BUFFER_MODEL
|
|
||||||
startingBaseBandBin = 96;
|
|
||||||
#else
|
|
||||||
startingBaseBandBin = 100;
|
|
||||||
#endif
|
|
||||||
halfWindowLength = (psDSEInfo->iUsesDoubleLengthXForm) ? 2048 : 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
spectralExtend(&ppfData[0][startingBinForThisWindow],
|
|
||||||
startingBaseBandBin,
|
|
||||||
psDSEInfo->aiCopyStop[0],
|
|
||||||
psDSEInfo->sfm[0][grp_index],
|
|
||||||
psDSEInfo->num_se_bands[0],
|
|
||||||
psDSEInfo->seBands[0][grp_index],
|
|
||||||
psDSEInfo->delta_power_values[0][grp_index],
|
|
||||||
psDSEInfo->fdamp[0][grp_index],
|
|
||||||
halfWindowLength,
|
|
||||||
psDSEInfo->asDNSInfoStruct[0].iWindowSequence,
|
|
||||||
psDSEInfo->iSEPowerResolution,
|
|
||||||
previousWindowSequence,
|
|
||||||
avgCopyEnergies[overall_window_number2]);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// zero out the extension band of each window if there was a bitstream error.
|
|
||||||
// be careful here- we may be dealing with many short blocks or a single long block
|
|
||||||
|
|
||||||
if (psDSEInfo->asDNSInfoStruct[0].iWindowSequence == 2)
|
|
||||||
{
|
|
||||||
// SHORT blocks
|
|
||||||
for(i=0;i<8;i++) {
|
|
||||||
for(j=psDSEInfo->aiCopyStop[0]; j<256; j++)
|
|
||||||
{
|
|
||||||
ppfData[0][i*256+j]=0.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// LONG, STOP, START blocks
|
|
||||||
for (i = psDSEInfo->aiCopyStop[0]; i<2048; i++)
|
|
||||||
{
|
|
||||||
ppfData[0][i] = 0.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // if psDSEInfo->iDolbyBitStreamWarning...
|
|
||||||
|
|
||||||
} // for win_in_grp_index
|
|
||||||
|
|
||||||
} // for grp_index
|
|
||||||
|
|
||||||
/* Double all TCs if using a double length x-form so we do not lose 6dB
|
|
||||||
* after the imdct.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (psDSEInfo->iUsesDoubleLengthXForm)
|
|
||||||
{
|
|
||||||
for (i = 0; i < 2048; i++)
|
|
||||||
{
|
|
||||||
ppfData[0][i] *= 2.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// do the transform
|
|
||||||
if (psDSEInfo->iUsesDoubleLengthXForm)
|
|
||||||
{
|
|
||||||
poIMDCTObject->Transform(ppfData[0],iWindowType,iWindowShape);
|
|
||||||
|
|
||||||
// The limiter can only be applied to 128 samples at a time
|
|
||||||
// so there must be several calls to limit all 2048 samples
|
|
||||||
// in a block. This is due to the way the buffer allocation
|
|
||||||
// is done in the constructor of the AudioIODSP class
|
|
||||||
int iLength = 2048;
|
|
||||||
int grpIndex = 0;
|
|
||||||
int sThisLength = (iLength < DLYBUFSZ) ? iLength : DLYBUFSZ;
|
|
||||||
|
|
||||||
m_poAudioDSP->SetSamplingRate(info.GetSamplingRate());
|
|
||||||
for (int sSamp = 0; sSamp < iLength; sSamp += sThisLength)
|
|
||||||
{
|
|
||||||
// Limiter is applied to ppfData
|
|
||||||
m_poAudioDSP->ApplyLimiter(ppfData, sThisLength, grpIndex);
|
|
||||||
sThisLength = ((iLength - sThisLength * grpIndex++) < DLYBUFSZ) ?
|
|
||||||
(iLength - sThisLength * grpIndex++) : DLYBUFSZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
poAudioIO->IO(ppfData,2048);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
poNormalIMDCTObject->Transform(ppfData[0],iWindowType,iWindowShape);
|
|
||||||
|
|
||||||
// Apply Limiter so that distortion from clipping is minimized
|
|
||||||
|
|
||||||
// The limiter can only be applied to 128 samples at a time
|
|
||||||
// so there must be several calls to limit all 2048 samples
|
|
||||||
// in a block. This is due to the way the buffer allocation
|
|
||||||
// is done in the constructor of the AudioIODSP class
|
|
||||||
int iLength = 1024;
|
|
||||||
int grpIndex = 0;
|
|
||||||
short sThisLength = (iLength < DLYBUFSZ) ? iLength : DLYBUFSZ;
|
|
||||||
|
|
||||||
m_poAudioDSP->SetSamplingRate(info.GetSamplingRate());
|
|
||||||
for (int sSamp = 0; sSamp < iLength; sSamp += sThisLength)
|
|
||||||
{
|
|
||||||
// Limiter is applied to ppfData
|
|
||||||
m_poAudioDSP->ApplyLimiter(ppfData, sThisLength, grpIndex);
|
|
||||||
sThisLength = ((iLength - sThisLength * grpIndex++) < DLYBUFSZ) ?
|
|
||||||
(iLength - sThisLength * grpIndex++) : DLYBUFSZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
poAudioIO->IO(ppfData,1024);
|
|
||||||
}
|
|
||||||
|
|
||||||
// update previousWindowSequence
|
|
||||||
previousWindowSequence = psDSEInfo->asDNSInfoStruct[0].iWindowSequence;
|
|
||||||
|
|
||||||
m_Block->~CBlock () ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// // // CChannelPair wraps channel_pair_element()
|
|
||||||
|
|
||||||
CChannelPair::CChannelPair (CDolbyBitStream &theBitstream)
|
|
||||||
: CChannelElement (theBitstream),
|
|
||||||
m_CommonWindow (1)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
m_Prediction [L].FullReset () ;
|
|
||||||
m_Prediction [R].FullReset () ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ppoIMDCTObject = new IMDCTObject* [2];
|
|
||||||
ppoNormalIMDCTObject = new IMDCTObject* [2];
|
|
||||||
|
|
||||||
for (int n = 0; n < 2; n++)
|
|
||||||
{
|
|
||||||
ppoIMDCTObject[n] = new IMDCTObject(4096,256);
|
|
||||||
ppoNormalIMDCTObject[n] = new IMDCTObject(2048,128);
|
|
||||||
}
|
|
||||||
|
|
||||||
ppfData = new float*[2];
|
|
||||||
ppshData = new short*[2];
|
|
||||||
|
|
||||||
m_poAudioDSP = new AudioIODSP(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
CChannelPair::~CChannelPair ()
|
|
||||||
{
|
|
||||||
for (int n = 0; n < 2; n++)
|
|
||||||
{
|
|
||||||
delete ppoIMDCTObject[n];
|
|
||||||
delete ppoNormalIMDCTObject[n];
|
|
||||||
}
|
|
||||||
delete[] ppoIMDCTObject;
|
|
||||||
delete[] ppoNormalIMDCTObject;
|
|
||||||
|
|
||||||
delete[] ppfData;
|
|
||||||
delete[] ppshData;
|
|
||||||
delete m_poAudioDSP;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CChannelPair::Read (const CStreamInfo &si)
|
|
||||||
{
|
|
||||||
m_IcsInfo [L].Reset (si) ;
|
|
||||||
m_IcsInfo [R].Reset (si) ;
|
|
||||||
|
|
||||||
if (m_CommonWindow.Read (m_bs))
|
|
||||||
{
|
|
||||||
m_IcsInfo [L].Read (m_bs) ;
|
|
||||||
m_IcsInfo [R] = m_IcsInfo [L] ;
|
|
||||||
|
|
||||||
m_JointStereo.Read (m_IcsInfo [L], m_bs) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_Block [L] = ReadICS (m_IcsInfo [L], m_BlockMemory [L]) ;
|
|
||||||
m_bs.SetPositionMarker (CDolbyBitStream::SecondIndividualChannelStart) ;
|
|
||||||
m_Block [R] = ReadICS (m_IcsInfo [R], m_BlockMemory [R]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CChannelPair::Decode (AudioIOControl *poAudioIO, CStreamInfo &info, int stride /* = 1 */)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
// - apply prediction tool to left (coded) channel
|
|
||||||
// - calculate right channel from intensity position
|
|
||||||
// - apply prediction tool to right channel
|
|
||||||
|
|
||||||
// unfortunately this breaks m_JointStereo::Apply() into two steps
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (m_CommonWindow)
|
|
||||||
{
|
|
||||||
m_JointStereo.ApplyMS (m_IcsInfo [L], *m_Block [L], *m_Block [R]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
if (m_IcsInfo [L].IsMainProfile ())
|
|
||||||
{
|
|
||||||
m_Prediction [L].Apply (m_IcsInfo [L], *m_Block [L]) ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (m_CommonWindow)
|
|
||||||
{
|
|
||||||
m_JointStereo.ApplyIS (m_IcsInfo [L], *m_Block [L], *m_Block [R]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
if (m_IcsInfo [R].IsMainProfile ())
|
|
||||||
{
|
|
||||||
m_Prediction [R].Apply (m_IcsInfo [R], *m_Block [R]) ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int channel = 0 ; channel < Channels ; channel++)
|
|
||||||
{
|
|
||||||
m_Block [channel]->ApplyTools () ;
|
|
||||||
|
|
||||||
if (m_WantEqualizer)
|
|
||||||
{
|
|
||||||
m_Block [channel]->ApplyEqualizationMask (m_EqualizerMask) ;
|
|
||||||
}
|
|
||||||
m_Block [channel]->FrequencyToTime_Fast (m_Previous [channel]) ;
|
|
||||||
ppfData[channel]=m_Block[channel]->AccessOutput();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyLimiter is called to minimize distortion from clipping. The limiter can only
|
|
||||||
// be applied to 128 samples at a time so there must be several calls to limit all
|
|
||||||
// samples in a block. This is due to the way the buffer allocation is done in the
|
|
||||||
// constructor of the AudioIODSP class.0
|
|
||||||
int iLength = 1024;
|
|
||||||
int grpIndex = 0;
|
|
||||||
int sThisLength = (iLength < DLYBUFSZ) ? iLength : DLYBUFSZ;
|
|
||||||
|
|
||||||
m_poAudioDSP->SetSamplingRate(info.GetSamplingRate());
|
|
||||||
for (int sSamp = 0; sSamp < iLength; sSamp += sThisLength)
|
|
||||||
{
|
|
||||||
m_poAudioDSP->ApplyLimiter(ppfData, sThisLength, grpIndex);
|
|
||||||
sThisLength = ((iLength - sThisLength * grpIndex++) < DLYBUFSZ) ?
|
|
||||||
(iLength - sThisLength * grpIndex++) : DLYBUFSZ;
|
|
||||||
}
|
|
||||||
poAudioIO->IO(ppfData,1024);
|
|
||||||
m_Block [L]->~CBlock () ;
|
|
||||||
m_Block [R]->~CBlock () ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CChannelPair::DecodeDolby (AudioIOControl *poAudioIO,
|
|
||||||
DOLBY_PAYLOAD_STRUCT *psDSEInfo,
|
|
||||||
CStreamInfo &info,
|
|
||||||
int stride /* = 1 */)
|
|
||||||
{
|
|
||||||
int channel, win_in_grp_index;
|
|
||||||
int iWindowType;
|
|
||||||
int iWindowShape;
|
|
||||||
int i,j,grp_index;
|
|
||||||
|
|
||||||
int startingBinForThisWindow;
|
|
||||||
int startingBaseBandBin;
|
|
||||||
int halfWindowLength;
|
|
||||||
int overall_window_number1, overall_window_number2;
|
|
||||||
float avgCopyEnergies[8][SE_MAX_NUM_BANDS];
|
|
||||||
int iBandCounter;
|
|
||||||
int firstWinThisGrp;
|
|
||||||
|
|
||||||
// need to keep this variable around to handle legacy code which forces
|
|
||||||
// spectral extend to rely on a special case for WindowSequence == 3
|
|
||||||
|
|
||||||
static int previousWindowSequence[2] = {0,0};
|
|
||||||
|
|
||||||
// apply DNS to each channel
|
|
||||||
// these calls really need to depend on the blocktype -
|
|
||||||
// short blocks require the window number (0-7) to be passed
|
|
||||||
// to AccessSpectralData(); long blocks do not require this argument.
|
|
||||||
ppfData[L]=m_Block[L]->AccessSpectralData();
|
|
||||||
ppfData[R]=m_Block[R]->AccessSpectralData();
|
|
||||||
|
|
||||||
// Apply DNS here
|
|
||||||
// Only apply DNS if we have valid DNS information read from the SE bitstream.
|
|
||||||
// If there was a SE bitstream reading error of *any* kind, do not apply DNS
|
|
||||||
|
|
||||||
|
|
||||||
if (psDSEInfo->iDolbyBitStreamWarning == 0)
|
|
||||||
{
|
|
||||||
// applyDNS() applies to all window groups at the same time, so there is
|
|
||||||
// no need to call applyDNS() for each window group individually.
|
|
||||||
applyDNS(ppfData[L],&psDSEInfo->asDNSInfoStruct[L],previousWindowSequence[L]);
|
|
||||||
applyDNS(ppfData[R],&psDSEInfo->asDNSInfoStruct[R],previousWindowSequence[R]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
// - apply prediction tool to left (coded) channel
|
|
||||||
// - calculate right channel from intensity position
|
|
||||||
// - apply prediction tool to right channel
|
|
||||||
|
|
||||||
// unfortunately this breaks m_JointStereo::Apply() into two steps
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (m_CommonWindow)
|
|
||||||
{
|
|
||||||
m_JointStereo.ApplyMS (m_IcsInfo [L], *m_Block [L], *m_Block [R]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
if (m_IcsInfo [L].IsMainProfile ())
|
|
||||||
{
|
|
||||||
m_Prediction [L].Apply (m_IcsInfo [L], *m_Block [L]) ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (m_CommonWindow)
|
|
||||||
{
|
|
||||||
m_JointStereo.ApplyIS (m_IcsInfo [L], *m_Block [L], *m_Block [R]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
if (m_IcsInfo [R].IsMainProfile ())
|
|
||||||
{
|
|
||||||
m_Prediction [R].Apply (m_IcsInfo [R], *m_Block [R]) ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (channel = 0 ; channel < Channels ; channel++)
|
|
||||||
{
|
|
||||||
iWindowType=m_IcsInfo[channel].GetWindowSequence();
|
|
||||||
iWindowShape=m_IcsInfo[channel].GetWindowShape();
|
|
||||||
ppfData[channel]=m_Block[channel]->AccessSpectralData();
|
|
||||||
|
|
||||||
// Apply TNS
|
|
||||||
m_Block [channel]->ApplyTools () ;
|
|
||||||
|
|
||||||
// Spectral Extension for Stereo Goes Here!
|
|
||||||
|
|
||||||
// for each window group...
|
|
||||||
overall_window_number1 = 0;
|
|
||||||
overall_window_number2 = 0;
|
|
||||||
|
|
||||||
for (grp_index=0;grp_index<psDSEInfo->iGroupCount[channel];grp_index++)
|
|
||||||
{
|
|
||||||
firstWinThisGrp = overall_window_number1;
|
|
||||||
|
|
||||||
// another window_in_group loop: compute average energy in this group for all bands in the current group
|
|
||||||
for (win_in_grp_index=0;
|
|
||||||
win_in_grp_index<psDSEInfo->iGroupLength[channel][grp_index];
|
|
||||||
win_in_grp_index++,overall_window_number1++)
|
|
||||||
{
|
|
||||||
|
|
||||||
// compute some parameters dependent short/long blocktype, window group number, and transform length
|
|
||||||
if (psDSEInfo->asDNSInfoStruct[channel].iWindowSequence == 2)
|
|
||||||
{
|
|
||||||
// SHORT blocks
|
|
||||||
// The constant 256 is ugly here - but is equal to (2 * CShortBlock::MaximumBins).
|
|
||||||
// This is the spacing of the mdct coefficients in the buffer ppfData[n], independent
|
|
||||||
// of whether we're using a single or double length transform.
|
|
||||||
startingBinForThisWindow = overall_window_number1*256;
|
|
||||||
startingBaseBandBin = 12;
|
|
||||||
halfWindowLength = (psDSEInfo->iUsesDoubleLengthXForm) ? 256 : 128;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// LONG, STOP, START blocks
|
|
||||||
startingBinForThisWindow = 0;
|
|
||||||
#ifdef NEW_BUFFER_MODEL
|
|
||||||
startingBaseBandBin = 96;
|
|
||||||
#else
|
|
||||||
startingBaseBandBin = 100;
|
|
||||||
#endif
|
|
||||||
halfWindowLength = (psDSEInfo->iUsesDoubleLengthXForm) ? 2048 : 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
computeAvgCopyEnergies(&ppfData[channel][startingBinForThisWindow],
|
|
||||||
startingBaseBandBin,
|
|
||||||
psDSEInfo->aiCopyStop[channel],
|
|
||||||
psDSEInfo->num_se_bands[channel],
|
|
||||||
psDSEInfo->seBands[channel][grp_index],
|
|
||||||
halfWindowLength,
|
|
||||||
psDSEInfo->asDNSInfoStruct[channel].iWindowSequence,
|
|
||||||
avgCopyEnergies[overall_window_number1]);
|
|
||||||
|
|
||||||
} /* win_in_grp_index */
|
|
||||||
|
|
||||||
/* compute average energies for each group before passing into spectral extend */
|
|
||||||
// accumulate energies for this group
|
|
||||||
|
|
||||||
for(win_in_grp_index=1;
|
|
||||||
win_in_grp_index<psDSEInfo->iGroupLength[channel][grp_index];
|
|
||||||
win_in_grp_index++)
|
|
||||||
{
|
|
||||||
for(iBandCounter=0;iBandCounter<psDSEInfo->num_se_bands[channel];iBandCounter++)
|
|
||||||
{
|
|
||||||
avgCopyEnergies[firstWinThisGrp][iBandCounter] += avgCopyEnergies[firstWinThisGrp + win_in_grp_index][iBandCounter];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// find the average energy for this group
|
|
||||||
for(iBandCounter=0;iBandCounter<psDSEInfo->num_se_bands[channel];iBandCounter++)
|
|
||||||
{
|
|
||||||
avgCopyEnergies[firstWinThisGrp][iBandCounter] /= psDSEInfo->iGroupLength[channel][grp_index];
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy this average energy to all values in the avgCopyEnergies array which correspond to windows in the current group
|
|
||||||
for(win_in_grp_index=1;
|
|
||||||
win_in_grp_index<psDSEInfo->iGroupLength[channel][grp_index];
|
|
||||||
win_in_grp_index++)
|
|
||||||
{
|
|
||||||
for(iBandCounter=0;iBandCounter<psDSEInfo->num_se_bands[channel];iBandCounter++)
|
|
||||||
{
|
|
||||||
avgCopyEnergies[firstWinThisGrp + win_in_grp_index][iBandCounter] = avgCopyEnergies[firstWinThisGrp][iBandCounter];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// for each window within the current window group...
|
|
||||||
for (win_in_grp_index=0;
|
|
||||||
win_in_grp_index<psDSEInfo->iGroupLength[channel][grp_index];
|
|
||||||
win_in_grp_index++,overall_window_number2++)
|
|
||||||
{
|
|
||||||
firstWinThisGrp = overall_window_number2;
|
|
||||||
|
|
||||||
// check to see if dolby bitstream was read correctly.
|
|
||||||
// If so, spectral extend all windows, whether we're dealing with a long block or short block
|
|
||||||
if (psDSEInfo->iDolbyBitStreamWarning == 0)
|
|
||||||
{
|
|
||||||
// compute some parameters dependent short/long blocktype, window group number, and transform length
|
|
||||||
if (psDSEInfo->asDNSInfoStruct[channel].iWindowSequence == 2)
|
|
||||||
{
|
|
||||||
// SHORT blocks
|
|
||||||
// The constant 256 is ugly here - but is equal to (2 * CShortBlock::MaximumBins).
|
|
||||||
// This is the spacing of the mdct coefficients in the buffer ppfData[n], independent
|
|
||||||
// of whether we're using a single or double length transform.
|
|
||||||
startingBinForThisWindow = overall_window_number2*256;
|
|
||||||
startingBaseBandBin = 12;
|
|
||||||
halfWindowLength = (psDSEInfo->iUsesDoubleLengthXForm) ? 256 : 128;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// LONG, STOP, START blocks
|
|
||||||
startingBinForThisWindow = 0;
|
|
||||||
#ifdef NEW_BUFFER_MODEL
|
|
||||||
startingBaseBandBin = 96;
|
|
||||||
#else
|
|
||||||
startingBaseBandBin = 100;
|
|
||||||
#endif
|
|
||||||
halfWindowLength = (psDSEInfo->iUsesDoubleLengthXForm) ? 2048 : 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
spectralExtend (&ppfData[channel][startingBinForThisWindow],
|
|
||||||
startingBaseBandBin,
|
|
||||||
psDSEInfo->aiCopyStop[channel],
|
|
||||||
psDSEInfo->sfm[channel][grp_index],
|
|
||||||
psDSEInfo->num_se_bands[channel],
|
|
||||||
psDSEInfo->seBands[channel][grp_index],
|
|
||||||
psDSEInfo->delta_power_values[channel][grp_index],
|
|
||||||
psDSEInfo->fdamp[channel][grp_index],
|
|
||||||
halfWindowLength,
|
|
||||||
psDSEInfo->asDNSInfoStruct[channel].iWindowSequence,
|
|
||||||
psDSEInfo->iSEPowerResolution,
|
|
||||||
previousWindowSequence[channel],
|
|
||||||
avgCopyEnergies[overall_window_number2]);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// zero out the extension band of each window if there was a bitstream error.
|
|
||||||
// be careful here- we may be dealing with many short blocks or a single long block
|
|
||||||
|
|
||||||
if (psDSEInfo->asDNSInfoStruct[channel].iWindowSequence == 2)
|
|
||||||
{
|
|
||||||
// SHORT blocks
|
|
||||||
for(i=0;i<8;i++) {
|
|
||||||
for(j=psDSEInfo->aiCopyStop[channel]; j<256; j++)
|
|
||||||
{
|
|
||||||
ppfData[channel][i*256+j]=0.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// LONG, STOP, START blocks
|
|
||||||
for (i = psDSEInfo->aiCopyStop[channel]; i<2048; i++)
|
|
||||||
{
|
|
||||||
ppfData[channel][i] = 0.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // if psDSEInfo->iDolbyBitStreamWarning...
|
|
||||||
|
|
||||||
} // for win_in_grp_index...
|
|
||||||
|
|
||||||
} // for grp_index...
|
|
||||||
|
|
||||||
/* Double all TCs if using a double length x-form so we do not lose 6dB
|
|
||||||
* after the imdct.
|
|
||||||
*/
|
|
||||||
if (psDSEInfo->iUsesDoubleLengthXForm)
|
|
||||||
{
|
|
||||||
for (i = 0; i < 2048; i++)
|
|
||||||
{
|
|
||||||
ppfData[channel][i] *= 2.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// do the transform
|
|
||||||
if (psDSEInfo->iUsesDoubleLengthXForm)
|
|
||||||
{
|
|
||||||
ppoIMDCTObject[channel]->Transform(ppfData[channel],iWindowType,iWindowShape);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ppoNormalIMDCTObject[channel]->Transform(ppfData[channel],iWindowType,iWindowShape);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // for channel
|
|
||||||
|
|
||||||
int iLength = (psDSEInfo->iUsesDoubleLengthXForm) ? 2048 : 1024;
|
|
||||||
int grpIndex = 0;
|
|
||||||
int sThisLength = (iLength < DLYBUFSZ) ? iLength : DLYBUFSZ;
|
|
||||||
|
|
||||||
m_poAudioDSP->SetSamplingRate(info.GetSamplingRate());
|
|
||||||
for (int sSamp = 0; sSamp < iLength; sSamp += sThisLength)
|
|
||||||
{
|
|
||||||
m_poAudioDSP->ApplyLimiter(ppfData, sThisLength, grpIndex);
|
|
||||||
sThisLength = ((iLength - sThisLength * grpIndex++) < DLYBUFSZ) ?
|
|
||||||
(iLength - sThisLength * grpIndex++) : DLYBUFSZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
poAudioIO->IO(ppfData, iLength);
|
|
||||||
|
|
||||||
// update previousWindowSequence
|
|
||||||
previousWindowSequence[L] = psDSEInfo->asDNSInfoStruct[L].iWindowSequence;
|
|
||||||
previousWindowSequence[R] = psDSEInfo->asDNSInfoStruct[R].iWindowSequence;
|
|
||||||
|
|
||||||
m_Block [L]->~CBlock () ;
|
|
||||||
m_Block [R]->~CBlock () ;
|
|
||||||
}
|
|
|
@ -1,280 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/channel.h,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: channel.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: independent channel stream object
|
|
||||||
*
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __CHANNEL_H__
|
|
||||||
#define __CHANNEL_H__
|
|
||||||
|
|
||||||
#include "block.h"
|
|
||||||
#include "bitsequence.h"
|
|
||||||
#include "channelinfo.h"
|
|
||||||
#include "overlapadd.h"
|
|
||||||
#include "stereo.h"
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
#include "prediction.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "dolby_imdct.h"
|
|
||||||
#include "DolbyPayload.h"
|
|
||||||
#include "audio_io.h"
|
|
||||||
#include "audio_io_dsp.h"
|
|
||||||
|
|
||||||
class CDolbyBitStream ;
|
|
||||||
class CStreamInfo ;
|
|
||||||
class AudioIODSP ;
|
|
||||||
|
|
||||||
/** Base Class For Channel Elements.
|
|
||||||
|
|
||||||
This abstract base class defines the interface and some common internal
|
|
||||||
helper functions for channel elements.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CChannelElement
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CChannelElement (CDolbyBitStream &bs) ;
|
|
||||||
virtual ~CChannelElement () ;
|
|
||||||
|
|
||||||
/** Data type for time-domain output samples.
|
|
||||||
|
|
||||||
Change this to float if you prefer the decoder core to deliver its time
|
|
||||||
domain output data as floating point rather than 16 bit short integer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef short PcmType ;
|
|
||||||
|
|
||||||
/** Main serialization method.
|
|
||||||
|
|
||||||
This method completely retrieves the channel element's state from the
|
|
||||||
associated bitstream object. All syntactic element members will be
|
|
||||||
called to perform their respective bitstream parsing and read in
|
|
||||||
their values from the MPEG stream.
|
|
||||||
|
|
||||||
This interface method must be implemented by any derived class.
|
|
||||||
|
|
||||||
@param info This container objects holds relevant information on
|
|
||||||
the current stream's sampling rate, profile etc. which
|
|
||||||
is required to correctly interpret some bitfields.
|
|
||||||
*/
|
|
||||||
|
|
||||||
virtual void Read (const CStreamInfo &) = 0 ;
|
|
||||||
|
|
||||||
/** Main decoding method.
|
|
||||||
|
|
||||||
This is the actual workhorse function, it performs all processing
|
|
||||||
required for reconstruction of one complete frame of output data.
|
|
||||||
All active tools will be called to perform their work on the
|
|
||||||
spectral coefficients of our \Ref{CBlock} member object(s) and frequency
|
|
||||||
to time domain transform will be performed on all subwindows.
|
|
||||||
|
|
||||||
@param pcmbuf The output array to hold one frame of decoded data.
|
|
||||||
@param stride The interleave stride used to write the audio chunks.
|
|
||||||
*/
|
|
||||||
|
|
||||||
virtual void Decode (AudioIOControl *poAudioIO, CStreamInfo &info, int stride = 1) = 0 ;
|
|
||||||
|
|
||||||
/** Number of channels information method.
|
|
||||||
|
|
||||||
This method simply returns the number of output channels that the
|
|
||||||
implementing class will provide.
|
|
||||||
|
|
||||||
@return Number of channels.
|
|
||||||
*/
|
|
||||||
|
|
||||||
virtual int GetNumberOfChannels (void)
|
|
||||||
{
|
|
||||||
return 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Pseudo-EQ configuration method.
|
|
||||||
|
|
||||||
This is really just a gimmick and not encouraged for use in any
|
|
||||||
serious application. A coefficient mask can be provided that will
|
|
||||||
be applied to the spectral bins of our \Ref{CBlock} Members. Will
|
|
||||||
introduce bad aliasing artefacts.
|
|
||||||
|
|
||||||
@param wantEQ Flag to turn pseudo-EQ on/off. False by default.
|
|
||||||
@param Mask An array of CBlock::EqualizationMaskLength coefficients.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void SetEqualization (bool wantEQ, float Mask []) ;
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
CBlock *ReadICS (CChannelInfo &ics_info, unsigned long *memory) ;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
BlockMemorySize = ((sizeof (CLongBlock) > sizeof (CShortBlock)) ?
|
|
||||||
sizeof (CLongBlock) : sizeof (CShortBlock)) /
|
|
||||||
sizeof (unsigned long) + 1
|
|
||||||
} ;
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
CDolbyBitStream &m_bs ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_GlobalGain ;
|
|
||||||
|
|
||||||
bool m_WantEqualizer ;
|
|
||||||
bool m_WantSpectralData ;
|
|
||||||
|
|
||||||
float m_EqualizerMask [CBlock::EqualizationMaskLength] ;
|
|
||||||
|
|
||||||
AudioIODSP * m_poAudioDSP;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
/** SCE Single Channel Element.
|
|
||||||
|
|
||||||
This class holds the data for one single audio channel, as represented
|
|
||||||
by the ID_SCE bitstream element, and defines its parsing and decoding order.
|
|
||||||
|
|
||||||
It consists of one \Ref{CBlock} member that holds the actual spectral bins for
|
|
||||||
a long block or a short block, and a time domain overlap-add buffer.
|
|
||||||
This class implements the \Ref{CChannelElement} interface.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
/* If MAIN_PROFILE is enabled, ID_SCE also includes an
|
|
||||||
instance of the \Ref{CPrediction} class to hold the state information for the
|
|
||||||
optional main profile backward-adaptive prediction tool. The predictor state
|
|
||||||
and overlap-add buffers are persistent between calls, so instances of this
|
|
||||||
class are not stateless and should only be used for one specific element
|
|
||||||
instance tag.
|
|
||||||
|
|
||||||
*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class CSingleChannel : public CChannelElement
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CSingleChannel (CDolbyBitStream &bs) ;
|
|
||||||
~CSingleChannel () ;
|
|
||||||
|
|
||||||
virtual void Read (const CStreamInfo &) ;
|
|
||||||
virtual void Decode (AudioIOControl *poAudioIO, CStreamInfo &info, int stride = 1) ;
|
|
||||||
void DecodeDolby (AudioIOControl *poAudioIO,
|
|
||||||
DOLBY_PAYLOAD_STRUCT *psDSEInfo,
|
|
||||||
CStreamInfo &info,
|
|
||||||
int stride = 1) ;
|
|
||||||
virtual int GetNumberOfChannels (void)
|
|
||||||
{
|
|
||||||
return 1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
//MSV:
|
|
||||||
CBlock* GetBlock(){return m_Block;}
|
|
||||||
CChannelInfo *GetChannelInfo(){return &m_IcsInfo;}
|
|
||||||
protected :
|
|
||||||
|
|
||||||
CChannelInfo m_IcsInfo ;
|
|
||||||
CBlock *m_Block ;
|
|
||||||
|
|
||||||
COverlapAddBuffer m_Previous ;
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
CPrediction m_Prediction ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
unsigned long m_BlockMemory [CChannelElement::BlockMemorySize] ;
|
|
||||||
private:
|
|
||||||
IMDCTObject *poIMDCTObject;
|
|
||||||
IMDCTObject *poNormalIMDCTObject;
|
|
||||||
float **ppfData;
|
|
||||||
short **ppshData;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
/** CPE Channel Pair Element.
|
|
||||||
|
|
||||||
This class holds the data for one pair of audio channels, as represented
|
|
||||||
by the ID_CPE bitstream element, and defines their parsing and decoding order.
|
|
||||||
|
|
||||||
It consists of a Left/Right-Pair of \Ref{CBlock} members that hold the actual
|
|
||||||
spectral bins for a long block or a short window sequence, a pair of
|
|
||||||
time domain overlap-add buffers and prediction tools, plus a joint stereo
|
|
||||||
processing tool and associated side information. The predictor state
|
|
||||||
and overlap-add buffers are persistent between calls, so instances of this
|
|
||||||
class are state-dependent and should only be used for one specific element
|
|
||||||
instance tag.
|
|
||||||
|
|
||||||
This class implements the \Ref{CChannelElement} interface.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CChannelPair : public CChannelElement
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CChannelPair (CDolbyBitStream &bs) ;
|
|
||||||
~CChannelPair () ;
|
|
||||||
|
|
||||||
virtual void Read (const CStreamInfo &) ;
|
|
||||||
virtual void Decode (AudioIOControl *poAudioIO, CStreamInfo &info, int stride = 1) ;
|
|
||||||
void DecodeDolby (AudioIOControl *poAudioIO,
|
|
||||||
DOLBY_PAYLOAD_STRUCT *psDSEInfo,
|
|
||||||
CStreamInfo &info,
|
|
||||||
int stride = 1) ;
|
|
||||||
virtual int GetNumberOfChannels (void)
|
|
||||||
{
|
|
||||||
return CChannelPair::Channels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
//MSV:
|
|
||||||
CBlock* GetLeftBlock(){return m_Block[0];}
|
|
||||||
CBlock* GetRightBlock(){return m_Block[1];}
|
|
||||||
CChannelInfo *GetChannelInfo(){return m_IcsInfo;}
|
|
||||||
protected :
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
L = 0,
|
|
||||||
R = 1,
|
|
||||||
Channels = 2
|
|
||||||
} ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_CommonWindow ;
|
|
||||||
|
|
||||||
CChannelInfo m_IcsInfo [Channels] ;
|
|
||||||
CBlock *m_Block [Channels] ;
|
|
||||||
|
|
||||||
COverlapAddBuffer m_Previous [Channels] ;
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
CPrediction m_Prediction [Channels] ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CJointStereo m_JointStereo ;
|
|
||||||
|
|
||||||
unsigned long m_BlockMemory [Channels][CChannelElement::BlockMemorySize] ;
|
|
||||||
private:
|
|
||||||
IMDCTObject **ppoIMDCTObject;
|
|
||||||
IMDCTObject **ppoNormalIMDCTObject;
|
|
||||||
float **ppfData;
|
|
||||||
short **ppshData;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
DECLARE_EXCEPTION(EIllegalProfile, AAC_ILLEGAL_PROFILE, "Illegal Profile") ;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
|
@ -1,261 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/channelinfo.cpp,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: channelinfo.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: independent channel stream info object
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "channelinfo.h"
|
|
||||||
#include "streaminfo.h"
|
|
||||||
|
|
||||||
// // // CChannelInfo wraps ics_info()
|
|
||||||
|
|
||||||
CChannelInfo::CChannelInfo ()
|
|
||||||
: m_IcsReservedBit (1),
|
|
||||||
m_WindowSequence (2),
|
|
||||||
m_WindowShape (1),
|
|
||||||
m_ScaleFactorGrouping (7),
|
|
||||||
m_PredictorDataPresent (1)
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
,
|
|
||||||
m_PredictorReset (1),
|
|
||||||
m_PredictorResetGroupNumber (5)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
m_Valid = false ;
|
|
||||||
m_TotalSfBands = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CChannelInfo::~CChannelInfo ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int CChannelInfo::GetProfile (void) const
|
|
||||||
{
|
|
||||||
return m_Profile ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CChannelInfo::IsValid (void) const
|
|
||||||
{
|
|
||||||
return m_Valid ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CChannelInfo::Reset (const CStreamInfo &si)
|
|
||||||
{
|
|
||||||
m_Valid = false ;
|
|
||||||
m_TotalSfBands = 0 ;
|
|
||||||
|
|
||||||
m_SamplingRateIndex = si.GetSamplingRateIndex () ;
|
|
||||||
m_Profile = si.GetProfile () ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CChannelInfo::IsLongBlock (void) const
|
|
||||||
{
|
|
||||||
return (m_WindowSequence != EightShortSequence) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CChannelInfo::IsShortBlock (void) const
|
|
||||||
{
|
|
||||||
return (m_WindowSequence == EightShortSequence) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CChannelInfo::IsMainProfile (void) const
|
|
||||||
{
|
|
||||||
return (m_Profile == ProfileMain) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CChannelInfo::GetWindowsPerFrame (void) const
|
|
||||||
{
|
|
||||||
return (m_WindowSequence == EightShortSequence) ? 8 : 1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CChannelInfo::GetWindowSequence (void) const
|
|
||||||
{
|
|
||||||
return m_WindowSequence ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CChannelInfo::GetWindowGroups (void) const
|
|
||||||
{
|
|
||||||
return m_WindowGroups ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CChannelInfo::GetWindowGroupLength (int index) const
|
|
||||||
{
|
|
||||||
return m_WindowGroupLength [index] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// scale factor band indices
|
|
||||||
|
|
||||||
const int *CChannelInfo::GetScaleFactorBandOffsets (void) const
|
|
||||||
{
|
|
||||||
if (IsLongBlock ())
|
|
||||||
{
|
|
||||||
return m_SamplingRateInfoTable [m_SamplingRateIndex].ScaleFactorBands_Long ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return m_SamplingRateInfoTable [m_SamplingRateIndex].ScaleFactorBands_Short ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int CChannelInfo::GetLastBin()
|
|
||||||
{
|
|
||||||
if (IsLongBlock())
|
|
||||||
{
|
|
||||||
return m_SamplingRateInfoTable[m_SamplingRateIndex].ScaleFactorBands_Long[m_MaxSfBands];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return m_SamplingRateInfoTable[m_SamplingRateIndex].ScaleFactorBands_Short[m_MaxSfBands];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int CChannelInfo::GetSamplingFrequency (void) const
|
|
||||||
{
|
|
||||||
return SamplingRateFromIndex (m_SamplingRateIndex) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CChannelInfo::SamplingRateFromIndex (int index)
|
|
||||||
{
|
|
||||||
return m_SamplingRateInfoTable [index].SamplingFrequency ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
int CChannelInfo::GetMaximumPredictionBands (void) const
|
|
||||||
{
|
|
||||||
return m_SamplingRateInfoTable [m_SamplingRateIndex].MaximumPredictionBands ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CChannelInfo::DeactivatePrediction (int band)
|
|
||||||
{
|
|
||||||
if (band < GetMaximumPredictionBands ())
|
|
||||||
{
|
|
||||||
m_PredictionUsed [band] = false ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void CChannelInfo::Read (CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
m_IcsReservedBit.Read (bs) ;
|
|
||||||
|
|
||||||
m_WindowSequence.Read (bs) ;
|
|
||||||
m_WindowShape.Read (bs) ;
|
|
||||||
|
|
||||||
#ifdef ONLY_SINE_WINDOW
|
|
||||||
if (m_WindowShape == 1)
|
|
||||||
throw EUnsupportedWindowShape () ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (IsLongBlock ())
|
|
||||||
{
|
|
||||||
m_TotalSfBands = m_SamplingRateInfoTable [m_SamplingRateIndex].NumberOfScaleFactorBands_Long ;
|
|
||||||
|
|
||||||
m_MaxSfBands.Read (bs, 6) ;
|
|
||||||
|
|
||||||
if (m_PredictorDataPresent.Read (bs))
|
|
||||||
{
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
if (m_PredictorReset.Read (bs))
|
|
||||||
{
|
|
||||||
m_PredictorResetGroupNumber.Read (bs) ;
|
|
||||||
|
|
||||||
if ((m_PredictorResetGroupNumber < 1) || (m_PredictorResetGroupNumber > 30))
|
|
||||||
{
|
|
||||||
throw EInvalidPredictorReset () ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int maxpred = (GetScaleFactorBandsTransmitted () < GetMaximumPredictionBands ()) ?
|
|
||||||
GetScaleFactorBandsTransmitted () : GetMaximumPredictionBands () ;
|
|
||||||
|
|
||||||
for (int band = 0 ; band < maxpred ; band++)
|
|
||||||
{
|
|
||||||
m_PredictionUsed [band] = bs.Get (1) ? true : false ;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
throw EIllegalProfile();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
m_WindowGroups = 1 ;
|
|
||||||
m_WindowGroupLength [0] = 1 ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_TotalSfBands = m_SamplingRateInfoTable [m_SamplingRateIndex].NumberOfScaleFactorBands_Short ;
|
|
||||||
|
|
||||||
m_MaxSfBands.Read (bs, 4) ;
|
|
||||||
m_ScaleFactorGrouping.Read (bs) ;
|
|
||||||
|
|
||||||
// // // expand group lengths
|
|
||||||
|
|
||||||
m_WindowGroups = 0 ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i < 7 ; i++)
|
|
||||||
{
|
|
||||||
int mask = 1 << (6 - i) ;
|
|
||||||
|
|
||||||
m_WindowGroupLength [i] = 1 ;
|
|
||||||
|
|
||||||
if (m_ScaleFactorGrouping & mask)
|
|
||||||
{
|
|
||||||
m_WindowGroupLength [m_WindowGroups]++ ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_WindowGroups++ ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// loop runs to i < 7 only
|
|
||||||
|
|
||||||
m_WindowGroupLength [7] = 1 ;
|
|
||||||
m_WindowGroups++ ;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_Valid = true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CChannelInfo::GetMaximumTnsBands (void) const
|
|
||||||
{
|
|
||||||
static const int tns_max_bands_tbl [12][4] =
|
|
||||||
{
|
|
||||||
/* entry for each sampling rate
|
|
||||||
* 1 Main/LC long window
|
|
||||||
* 2 Main/LC short window
|
|
||||||
* 3 SSR long window
|
|
||||||
* 4 SSR short window
|
|
||||||
*/
|
|
||||||
|
|
||||||
{ 31, 9, 28, 7 }, /* 96000 */
|
|
||||||
{ 31, 9, 28, 7 }, /* 88200 */
|
|
||||||
{ 34, 10, 27, 7 }, /* 64000 */
|
|
||||||
{ 40, 14, 26, 6 }, /* 48000 */
|
|
||||||
{ 42, 14, 26, 6 }, /* 44100 */
|
|
||||||
{ 51, 14, 26, 6 }, /* 32000 */
|
|
||||||
{ 46, 14, 29, 7 }, /* 24000 */
|
|
||||||
{ 46, 14, 29, 7 }, /* 22050 */
|
|
||||||
{ 42, 14, 23, 8 }, /* 16000 */
|
|
||||||
{ 42, 14, 23, 8 }, /* 12000 */
|
|
||||||
{ 42, 14, 23, 8 }, /* 11025 */
|
|
||||||
{ 39, 14, 19, 7 }, /* 8000 */
|
|
||||||
} ;
|
|
||||||
|
|
||||||
int i = IsLongBlock () ? 0 : 1 ;
|
|
||||||
i += (GetProfile () == ProfileSSR) ? 2 : 0 ;
|
|
||||||
|
|
||||||
return tns_max_bands_tbl [m_SamplingRateIndex][i] ;
|
|
||||||
}
|
|
|
@ -1,196 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/channelinfo.h,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: channelinfo.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: independent channel stream info object
|
|
||||||
*
|
|
||||||
* $Header: /cvs/root/winamp/vlb/channelinfo.h,v 1.1 2009/04/28 20:21:08 audiodsp Exp $
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __CHANNELINFO_H__
|
|
||||||
#define __CHANNELINFO_H__
|
|
||||||
|
|
||||||
#include "bitsequence.h"
|
|
||||||
#include "exception.h"
|
|
||||||
#include "streaminfo.h"
|
|
||||||
|
|
||||||
class CDolbyBitStream ;
|
|
||||||
class CProgramConfig ;
|
|
||||||
class CStreamInfo ;
|
|
||||||
|
|
||||||
/** Channel Element Side Information.
|
|
||||||
|
|
||||||
This class provides information essential to various parts of the decoder.
|
|
||||||
It reads the ics_info() bitstream elements and provides accordingly mapped
|
|
||||||
access to some static tables, first of all scale factor band widths.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CChannelInfo
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
OnlyLongSequence = 0,
|
|
||||||
LongStartSequence,
|
|
||||||
EightShortSequence,
|
|
||||||
LongStopSequence,
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
PredictionBandsTotal = 42,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ProfileMain = 0,
|
|
||||||
ProfileLowComplexity,
|
|
||||||
ProfileSSR,
|
|
||||||
ProfileReserved
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
CChannelInfo () ;
|
|
||||||
~CChannelInfo () ;
|
|
||||||
|
|
||||||
void Read (CDolbyBitStream &bs) ;
|
|
||||||
|
|
||||||
bool IsValid (void) const ;
|
|
||||||
bool IsLongBlock (void) const ;
|
|
||||||
bool IsShortBlock (void) const ;
|
|
||||||
bool IsMainProfile (void) const ;
|
|
||||||
|
|
||||||
void Reset (const CStreamInfo &) ;
|
|
||||||
|
|
||||||
int GetProfile (void) const ;
|
|
||||||
|
|
||||||
int GetWindowShape (void) const
|
|
||||||
{
|
|
||||||
return m_WindowShape ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int GetWindowSequence (void) const ;
|
|
||||||
int GetWindowsPerFrame (void) const ;
|
|
||||||
|
|
||||||
int GetWindowGroups (void) const ;
|
|
||||||
int GetWindowGroupLength (int index) const ;
|
|
||||||
|
|
||||||
int GetScaleFactorBandsTransmitted (void) const
|
|
||||||
{
|
|
||||||
return m_MaxSfBands ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int GetScaleFactorBandsTotal (void) const
|
|
||||||
{
|
|
||||||
return m_TotalSfBands ;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int *GetScaleFactorBandOffsets (void) const ;
|
|
||||||
|
|
||||||
int GetSamplingFrequency (void) const ;
|
|
||||||
int GetMaximumTnsBands (void) const ;
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
// // // Prediction
|
|
||||||
|
|
||||||
int GetMaximumPredictionBands (void) const ;
|
|
||||||
|
|
||||||
bool GetPredictorDataPresent (void) const
|
|
||||||
{
|
|
||||||
return m_PredictorDataPresent ? true : false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GetPredictionUsedForBand (int band) const
|
|
||||||
{
|
|
||||||
return m_PredictionUsed [band] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GetPerformPredictorReset (void) const
|
|
||||||
{
|
|
||||||
if (GetPredictorDataPresent ())
|
|
||||||
{
|
|
||||||
return m_PredictorReset ? true : false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int GetPredictorResetGroupNumber (void) const
|
|
||||||
{
|
|
||||||
return m_PredictorResetGroupNumber ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeactivatePrediction (int band) ;
|
|
||||||
|
|
||||||
// // //
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int SamplingRateFromIndex (int index) ;
|
|
||||||
|
|
||||||
int GetSamplingIndex(){return m_SamplingRateIndex;}
|
|
||||||
int GetLastBin() ;
|
|
||||||
|
|
||||||
protected :
|
|
||||||
bool m_Valid ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_IcsReservedBit ;
|
|
||||||
CVLBBitSequence m_WindowSequence ;
|
|
||||||
CVLBBitSequence m_WindowShape ;
|
|
||||||
CVLBBitSequence m_MaxSfBands ;
|
|
||||||
CVLBBitSequence m_ScaleFactorGrouping ;
|
|
||||||
|
|
||||||
// prediction
|
|
||||||
|
|
||||||
CVLBBitSequence m_PredictorDataPresent ;
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
CVLBBitSequence m_PredictorReset ;
|
|
||||||
CVLBBitSequence m_PredictorResetGroupNumber ;
|
|
||||||
|
|
||||||
bool m_PredictionUsed [CChannelInfo::PredictionBandsTotal] ;
|
|
||||||
|
|
||||||
// // //
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int m_TotalSfBands ;
|
|
||||||
int m_SamplingRateIndex, m_Profile ;
|
|
||||||
|
|
||||||
int m_WindowGroups, m_WindowGroupLength [8] ;
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
DECLARE_EXCEPTION(EInvalidPredictorReset, AAC_INVALIDPREDICTORRESET, "Invalid Predictor Reset Group Indicated") ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DECLARE_EXCEPTION(EUnsupportedWindowShape, AAC_UNSUPPORTEDWINDOWSHAPE, "Unsupported Window Shape Used") ;
|
|
||||||
DECLARE_EXCEPTION(EIllegalProfile, AAC_ILLEGAL_PROFILE, "Illegal Profile") ;
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int SamplingFrequency ;
|
|
||||||
int NumberOfScaleFactorBands_Long ;
|
|
||||||
const int *ScaleFactorBands_Long ;
|
|
||||||
int NumberOfScaleFactorBands_Short ;
|
|
||||||
const int *ScaleFactorBands_Short ;
|
|
||||||
int MaximumPredictionBands ;
|
|
||||||
} SamplingRateInfo ;
|
|
||||||
|
|
||||||
static const SamplingRateInfo m_SamplingRateInfoTable [16] ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,52 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/datastream.cpp,v 1.1 2009/04/28 20:21:08 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: datastream.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: data stream element
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "datastream.h"
|
|
||||||
|
|
||||||
CDataStream::CDataStream (CDolbyBitStream &bs)
|
|
||||||
: m_bs (bs),
|
|
||||||
m_DataByteAlignFlag (1),
|
|
||||||
m_Count (8),
|
|
||||||
m_EscCount (8)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CDataStream::~CDataStream ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDataStream::Read (void)
|
|
||||||
{
|
|
||||||
m_DataByteAlignFlag.Read (m_bs) ;
|
|
||||||
|
|
||||||
m_Count.Read (m_bs) ;
|
|
||||||
|
|
||||||
if (m_Count == 255)
|
|
||||||
{
|
|
||||||
m_Count += m_EscCount.Read (m_bs) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_DataByteAlignFlag)
|
|
||||||
{
|
|
||||||
m_bs.ByteAlign () ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0 ; i < m_Count ; i++)
|
|
||||||
{
|
|
||||||
m_DataStreamByte [i].Read (m_bs, 8) ;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,60 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/datastream.h,v 1.1 2009/04/28 20:21:09 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: datastream.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: data stream element
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __DATASTREAM_H__
|
|
||||||
#define __DATASTREAM_H__
|
|
||||||
|
|
||||||
#include "bitsequence.h"
|
|
||||||
|
|
||||||
/** DSE Data Stream Element.
|
|
||||||
|
|
||||||
This class represents a data stream element, that may be used to transport
|
|
||||||
additional user data embedded within the audio bitstream.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CDataStream
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
CDataStream (CDolbyBitStream &) ;
|
|
||||||
~CDataStream () ;
|
|
||||||
|
|
||||||
void Read (void) ;
|
|
||||||
|
|
||||||
int Length (void)
|
|
||||||
{
|
|
||||||
return m_Count ;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
CDolbyBitStream &m_bs ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_DataByteAlignFlag ;
|
|
||||||
CVLBBitSequence m_Count ;
|
|
||||||
CVLBBitSequence m_EscCount ;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MaximumElementLength = 512
|
|
||||||
} ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_DataStreamByte [MaximumElementLength] ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,847 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/dolby_imdct.cpp,v 1.1 2009/04/28 20:21:09 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* filename: dolby_imdct.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: IMDCT transform routines
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include"dolby_imdct.h"
|
|
||||||
#ifdef INTERPOLATE_WINDOW
|
|
||||||
#include "window_tab.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* #defines related to Izero and CalculateKBDWindowExact */
|
|
||||||
#define IzeroEPSILON 1E-21 /* Max error acceptable in Izero */
|
|
||||||
#define M_PI 3.14159265358979323846264338327950288f
|
|
||||||
|
|
||||||
/*------------------------ Window Functions ---------------------------*/
|
|
||||||
|
|
||||||
void Sine_Window(float*pfWindow,int iSize)
|
|
||||||
{
|
|
||||||
#ifdef INTERPOLATE_WINDOW
|
|
||||||
int count, j;
|
|
||||||
|
|
||||||
switch (iSize)
|
|
||||||
{
|
|
||||||
case 256:
|
|
||||||
for(j=0; j < iSize/2 ;j++)
|
|
||||||
{
|
|
||||||
pfWindow[j]=(float)(sin_short[j]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 512:
|
|
||||||
count = 0;
|
|
||||||
for (j = 0; j < iSize/4-1; j++)
|
|
||||||
{
|
|
||||||
pfWindow[count++] = (float) sin_short[j];
|
|
||||||
pfWindow[count++] = (float) ((sin_short[j] + sin_short[j + 1]) * 0.5);
|
|
||||||
}
|
|
||||||
pfWindow[count++] = (float) sin_short[j];
|
|
||||||
pfWindow[count] = (float) 1.0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2048:
|
|
||||||
for(j=0; j < iSize/2 ;j++)
|
|
||||||
{
|
|
||||||
pfWindow[j]=(float)(sin_long[j]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4096:
|
|
||||||
count = 0;
|
|
||||||
for (j = 0; j < iSize/4-1; j++)
|
|
||||||
{
|
|
||||||
pfWindow[count++] = (float) sin_long[j];
|
|
||||||
pfWindow[count++] = (float) ((sin_long[j] + sin_long[j + 1]) * 0.5);
|
|
||||||
}
|
|
||||||
pfWindow[count++] = (float) sin_long[j];
|
|
||||||
pfWindow[count] = (float) 1.0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int n;
|
|
||||||
for(n=0;n<iSize/2;n++){
|
|
||||||
pfWindow[n]=(float)(sin(pi*((float)n+0.5)/(float)iSize));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static float Izero(float x)
|
|
||||||
{
|
|
||||||
float sum,
|
|
||||||
u,
|
|
||||||
halfx,
|
|
||||||
temp;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
sum = u = 1.0f;
|
|
||||||
n = 1;
|
|
||||||
|
|
||||||
halfx = x / 2.0f;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
temp = halfx / (float) n;
|
|
||||||
n += 1;
|
|
||||||
temp *= temp;
|
|
||||||
u *= temp;
|
|
||||||
sum += u;
|
|
||||||
} while (u >= IzeroEPSILON * sum);
|
|
||||||
return (sum);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
functionname: CalculateKBDWindowExact
|
|
||||||
description: calculates the window coefficients for the Kaiser-Bessel
|
|
||||||
derived window
|
|
||||||
returns:
|
|
||||||
input: window length, alpha
|
|
||||||
output: window coefficients
|
|
||||||
|
|
||||||
*****************************************************************************/
|
|
||||||
void CalculateKBDWindowExact(float * win, float alpha, int length)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
float IBeta;
|
|
||||||
float tmp;
|
|
||||||
float sum = 0.0;
|
|
||||||
|
|
||||||
alpha *= M_PI;
|
|
||||||
IBeta = 1.0f / Izero(alpha);
|
|
||||||
|
|
||||||
/* calculate lower half of Kaiser Bessel window */
|
|
||||||
for (i = 0; i < (length >> 1); i++)
|
|
||||||
{
|
|
||||||
tmp = 4.0f * (float) i / (float) length - 1.0f;
|
|
||||||
win[i] = Izero(alpha * ((float) sqrt(1.0f - tmp * tmp))) * IBeta;
|
|
||||||
sum += win[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
sum = 1.0f / sum;
|
|
||||||
tmp = 0.0;
|
|
||||||
|
|
||||||
/* calculate lower half of window */
|
|
||||||
for (i = 0; i < (length >> 1); i++)
|
|
||||||
{
|
|
||||||
tmp += win[i];
|
|
||||||
win[i] = (float) sqrt(tmp * sum);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void KBD_Window(float*pfWindow,int iSize)
|
|
||||||
{
|
|
||||||
#ifdef INTERPOLATE_WINDOW
|
|
||||||
int count, j;
|
|
||||||
|
|
||||||
switch (iSize)
|
|
||||||
{
|
|
||||||
case 256:
|
|
||||||
for(j=0; j < iSize/2 ;j++)
|
|
||||||
{
|
|
||||||
pfWindow[j]=(float)(KBD_short[j]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 512:
|
|
||||||
count = 0;
|
|
||||||
for (j = 0; j < iSize/4-1; j++)
|
|
||||||
{
|
|
||||||
pfWindow[count++] = (float) KBD_short[j];
|
|
||||||
pfWindow[count++] = (float) ((KBD_short[j] + KBD_short[j + 1]) * 0.5);
|
|
||||||
}
|
|
||||||
pfWindow[count++] = (float) KBD_short[j];
|
|
||||||
pfWindow[count] = (float) 1.0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2048:
|
|
||||||
for(j=0; j < iSize/2 ;j++)
|
|
||||||
{
|
|
||||||
pfWindow[j]=(float)(KBD_long[j]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4096:
|
|
||||||
count = 0;
|
|
||||||
for (j = 0; j < iSize/4-1; j++)
|
|
||||||
{
|
|
||||||
pfWindow[count++] = (float) KBD_long[j];
|
|
||||||
pfWindow[count++] = (float) ((KBD_long[j] + KBD_long[j + 1]) * 0.5);
|
|
||||||
}
|
|
||||||
pfWindow[count++] = (float) KBD_long[j];
|
|
||||||
pfWindow[count] = (float) 1.0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* The stock AAC MP4 encoder calculates KBD windows with different alphas
|
|
||||||
depending on the blocklength. We must match those windows here. */
|
|
||||||
|
|
||||||
switch(iSize)
|
|
||||||
{
|
|
||||||
case 256:
|
|
||||||
case 512:
|
|
||||||
CalculateKBDWindowExact(pfWindow, 6.0, iSize);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2048:
|
|
||||||
case 4096:
|
|
||||||
CalculateKBDWindowExact(pfWindow, 4.0, iSize);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
CalculateKBDWindowExact(pfWindow, 4.0, iSize);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*----------------------- DOLBY IMDCT ---------------------------------*/
|
|
||||||
|
|
||||||
IMDCTObject::IMDCTObject(int _iLongSize,
|
|
||||||
int _iOverlap)
|
|
||||||
:iLongSize(_iLongSize),
|
|
||||||
iHLongSize(_iLongSize/2),
|
|
||||||
iOverlap(_iOverlap),
|
|
||||||
iOldShape(0)
|
|
||||||
{
|
|
||||||
if(iLongSize==0){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(iOverlap==0){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int n,k;
|
|
||||||
|
|
||||||
//Obtain memory for Short Windows:
|
|
||||||
//These arrays are larger than they need to be,
|
|
||||||
//but are made this large for convenience
|
|
||||||
iShortSize = iLongSize / 8;
|
|
||||||
iHShortSize = iHLongSize / 8;
|
|
||||||
pfShortWindowSin = new float[iHLongSize];
|
|
||||||
pfShortWindowKBD = new float[iHLongSize];
|
|
||||||
|
|
||||||
//Obtain memory for Longwindows:
|
|
||||||
pfLongWindowSin=new float[iHLongSize];
|
|
||||||
pfS2LWindowSin=new float[iHLongSize];
|
|
||||||
|
|
||||||
pfLongWindowKBD=new float[iHLongSize];
|
|
||||||
pfS2LWindowKBD=new float[iHLongSize];
|
|
||||||
|
|
||||||
//Obtain memory for temporary buffer:
|
|
||||||
pfTempBuffer=new float[iLongSize];
|
|
||||||
pfEightWindowsBuffer=new float[iLongSize];
|
|
||||||
pfSavedBuffer=new float[iHLongSize];
|
|
||||||
for(n=0;n<iHLongSize;n++) pfSavedBuffer[n]=0;
|
|
||||||
|
|
||||||
//Create Windows:
|
|
||||||
KBD_Window(pfLongWindowKBD,iLongSize);
|
|
||||||
Sine_Window(pfLongWindowSin,iLongSize);
|
|
||||||
|
|
||||||
//Create S2L Window:
|
|
||||||
KBD_Window(pfShortWindowKBD,iOverlap*2); // temporary
|
|
||||||
for(k=0,n=iHLongSize/2-iOverlap/2;k<iOverlap;k++,n++){
|
|
||||||
pfS2LWindowKBD[n]=pfShortWindowKBD[k];
|
|
||||||
}
|
|
||||||
for(n=0;n<iHLongSize/2-iOverlap/2;n++){
|
|
||||||
pfS2LWindowKBD[n]=0.0f;
|
|
||||||
}
|
|
||||||
for(n=iHLongSize/2+iOverlap/2;n<iHLongSize;n++){
|
|
||||||
pfS2LWindowKBD[n]=1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create correct length short window
|
|
||||||
KBD_Window(pfShortWindowKBD,iShortSize);
|
|
||||||
|
|
||||||
//Create S2L Window:
|
|
||||||
Sine_Window(pfShortWindowSin,iOverlap*2); // temporary
|
|
||||||
for(k=0,n=iHLongSize/2-iOverlap/2;k<iOverlap;k++,n++){
|
|
||||||
pfS2LWindowSin[n]=pfShortWindowSin[k];
|
|
||||||
}
|
|
||||||
for(n=0;n<iHLongSize/2-iOverlap/2;n++){
|
|
||||||
pfS2LWindowSin[n]=0.0f;
|
|
||||||
}
|
|
||||||
for(n=iHLongSize/2+iOverlap/2;n<iHLongSize;n++){
|
|
||||||
pfS2LWindowSin[n]=1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create correct length short window
|
|
||||||
Sine_Window(pfShortWindowSin,iShortSize);
|
|
||||||
|
|
||||||
// Compute Long Twiddles
|
|
||||||
iLongFFTSize=iLongSize/4;
|
|
||||||
pfReal=new float[iLongFFTSize];
|
|
||||||
pfImag=new float[iLongFFTSize];
|
|
||||||
pfRealLongTwiddle=new float[iLongFFTSize];
|
|
||||||
pfImagLongTwiddle=new float[iLongFFTSize];
|
|
||||||
pfRealLongTwiddle[0]=(float)(cos(0.125*2.0*pi/(float)iLongSize));
|
|
||||||
pfImagLongTwiddle[0]=(float)(sin(0.125*2.0*pi/(float)iLongSize));
|
|
||||||
for(n=1;n<iLongFFTSize;n++){
|
|
||||||
pfRealLongTwiddle[n]=(float)(cos(2.0*pi/(float)iLongSize))*pfRealLongTwiddle[n-1]-
|
|
||||||
(float)(sin(2.0*pi/(float)iLongSize))*pfImagLongTwiddle[n-1];
|
|
||||||
pfImagLongTwiddle[n]=(float)(cos(2.0*pi/(float)iLongSize))*pfImagLongTwiddle[n-1]+
|
|
||||||
(float)(sin(2.0*pi/(float)iLongSize))*pfRealLongTwiddle[n-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute Short Twiddles
|
|
||||||
// these twiddles may be redundant - they may be able to be computed as a function
|
|
||||||
// of the long twiddles
|
|
||||||
iShortFFTSize=iShortSize/4;
|
|
||||||
pfRealShort=new float[iShortFFTSize];
|
|
||||||
pfImagShort=new float[iShortFFTSize];
|
|
||||||
pfRealShortTwiddle=new float[iShortFFTSize];
|
|
||||||
pfImagShortTwiddle=new float[iShortFFTSize];
|
|
||||||
pfRealShortTwiddle[0]=(float)(cos(0.125*2.0*pi/(float)iShortSize));
|
|
||||||
pfImagShortTwiddle[0]=(float)(sin(0.125*2.0*pi/(float)iShortSize));
|
|
||||||
for(n=1;n<iShortFFTSize;n++){
|
|
||||||
pfRealShortTwiddle[n]=(float)(cos(2.0*pi/(float)iShortSize))*pfRealShortTwiddle[n-1]-
|
|
||||||
(float)(sin(2.0*pi/(float)iShortSize))*pfImagShortTwiddle[n-1];
|
|
||||||
pfImagShortTwiddle[n]=(float)(cos(2.0*pi/(float)iShortSize))*pfImagShortTwiddle[n-1]+
|
|
||||||
(float)(sin(2.0*pi/(float)iShortSize))*pfRealShortTwiddle[n-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
IMDCTObject::IMDCTObject()
|
|
||||||
:iLongSize(0),
|
|
||||||
iOverlap(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
IMDCTObject::IMDCTObject(IMDCTObject&oCopy)
|
|
||||||
:iLongSize(oCopy.iLongSize),
|
|
||||||
iHLongSize(iLongSize/2),
|
|
||||||
iOverlap(oCopy.iOverlap),
|
|
||||||
iOldShape(oCopy.iOldShape)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(iLongSize==0){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(iOverlap==0){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int n,k;
|
|
||||||
|
|
||||||
//Obtain memory for Short Windows:
|
|
||||||
//These arrays are larger than they need to be,
|
|
||||||
//but are made this large for convenience
|
|
||||||
iShortSize = iLongSize / 8;
|
|
||||||
iHShortSize = iHLongSize / 8;
|
|
||||||
pfShortWindowSin = new float[iHLongSize];
|
|
||||||
pfShortWindowKBD = new float[iHLongSize];
|
|
||||||
|
|
||||||
//Obtain memory for windows:
|
|
||||||
pfLongWindowSin=new float[iHLongSize];
|
|
||||||
pfS2LWindowSin=new float[iHLongSize];
|
|
||||||
|
|
||||||
pfLongWindowKBD=new float[iHLongSize];
|
|
||||||
pfS2LWindowKBD=new float[iHLongSize];
|
|
||||||
|
|
||||||
//Obtain memory for temporary buffer:
|
|
||||||
pfTempBuffer=new float[iLongSize];
|
|
||||||
pfEightWindowsBuffer=new float[iLongSize];
|
|
||||||
pfSavedBuffer=new float[iHLongSize];
|
|
||||||
for(n=0;n<iHLongSize;n++) pfSavedBuffer[n]=0;
|
|
||||||
|
|
||||||
//Create Windows:
|
|
||||||
KBD_Window(pfLongWindowKBD,iLongSize);
|
|
||||||
Sine_Window(pfLongWindowSin,iLongSize);
|
|
||||||
|
|
||||||
//Create S2L Window:
|
|
||||||
KBD_Window(pfShortWindowKBD,iOverlap*2); // temporary
|
|
||||||
for(k=0,n=iHLongSize/2-iOverlap/2;k<iOverlap;k++,n++){
|
|
||||||
pfS2LWindowKBD[n]=pfShortWindowKBD[k];
|
|
||||||
}
|
|
||||||
for(n=0;n<iHLongSize/2-iOverlap/2;n++){
|
|
||||||
pfS2LWindowKBD[n]=0.0f;
|
|
||||||
}
|
|
||||||
for(n=iHLongSize/2+iOverlap/2;n<iHLongSize;n++){
|
|
||||||
pfS2LWindowKBD[n]=1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create correct length short window
|
|
||||||
KBD_Window(pfShortWindowKBD,iShortSize);
|
|
||||||
|
|
||||||
//Create S2L Window:
|
|
||||||
Sine_Window(pfShortWindowSin,iOverlap*2); // temporary
|
|
||||||
for(k=0,n=iHLongSize/2-iOverlap/2;k<iOverlap;k++,n++){
|
|
||||||
pfS2LWindowSin[n]=pfShortWindowSin[k];
|
|
||||||
}
|
|
||||||
for(n=0;n<iHLongSize/2-iOverlap/2;n++){
|
|
||||||
pfS2LWindowSin[n]=0.0f;
|
|
||||||
}
|
|
||||||
for(n=iHLongSize/2+iOverlap/2;n<iHLongSize;n++){
|
|
||||||
pfS2LWindowSin[n]=1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create correct length short window
|
|
||||||
Sine_Window(pfShortWindowSin,iShortSize);
|
|
||||||
|
|
||||||
// Compute Long Twiddles
|
|
||||||
iLongFFTSize=iLongSize/4;
|
|
||||||
pfReal=new float[iLongFFTSize];
|
|
||||||
pfImag=new float[iLongFFTSize];
|
|
||||||
pfRealLongTwiddle=new float[iLongFFTSize];
|
|
||||||
pfImagLongTwiddle=new float[iLongFFTSize];
|
|
||||||
pfRealLongTwiddle[0]=(float)(cos(0.125*2.0*pi/(float)iLongSize));
|
|
||||||
pfImagLongTwiddle[0]=(float)(sin(0.125*2.0*pi/(float)iLongSize));
|
|
||||||
for(n=1;n<iLongFFTSize;n++){
|
|
||||||
pfRealLongTwiddle[n]=(float)(cos(2.0*pi/(float)iLongSize))*pfRealLongTwiddle[n-1]-
|
|
||||||
(float)(sin(2.0*pi/(float)iLongSize))*pfImagLongTwiddle[n-1];
|
|
||||||
pfImagLongTwiddle[n]=(float)(cos(2.0*pi/(float)iLongSize))*pfImagLongTwiddle[n-1]+
|
|
||||||
(float)(sin(2.0*pi/(float)iLongSize))*pfRealLongTwiddle[n-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute Short Twiddles
|
|
||||||
// these twiddles may be redundant - they may be able to be computed as a function
|
|
||||||
// of the long twiddles
|
|
||||||
iShortFFTSize=iShortSize/4;
|
|
||||||
pfRealShort=new float[iShortFFTSize];
|
|
||||||
pfImagShort=new float[iShortFFTSize];
|
|
||||||
pfRealShortTwiddle=new float[iShortFFTSize];
|
|
||||||
pfImagShortTwiddle=new float[iShortFFTSize];
|
|
||||||
pfRealShortTwiddle[0]=(float)(cos(0.125*2.0*pi/(float)iShortSize));
|
|
||||||
pfImagShortTwiddle[0]=(float)(sin(0.125*2.0*pi/(float)iShortSize));
|
|
||||||
for(n=1;n<iShortFFTSize;n++){
|
|
||||||
pfRealShortTwiddle[n]=(float)(cos(2.0*pi/(float)iShortSize))*pfRealShortTwiddle[n-1]-
|
|
||||||
(float)(sin(2.0*pi/(float)iShortSize))*pfImagShortTwiddle[n-1];
|
|
||||||
pfImagShortTwiddle[n]=(float)(cos(2.0*pi/(float)iShortSize))*pfImagShortTwiddle[n-1]+
|
|
||||||
(float)(sin(2.0*pi/(float)iShortSize))*pfRealShortTwiddle[n-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
IMDCTObject& IMDCTObject::operator=(IMDCTObject&oCopy)
|
|
||||||
{
|
|
||||||
if(iLongSize!=0&&iOverlap!=0){
|
|
||||||
delete[] pfLongWindowKBD;
|
|
||||||
delete[] pfS2LWindowKBD;
|
|
||||||
|
|
||||||
delete[] pfLongWindowSin;
|
|
||||||
delete[] pfS2LWindowSin;
|
|
||||||
|
|
||||||
delete[] pfShortWindowSin;
|
|
||||||
delete[] pfShortWindowKBD;
|
|
||||||
|
|
||||||
delete[] pfSavedBuffer;
|
|
||||||
delete[] pfReal;
|
|
||||||
delete[] pfImag;
|
|
||||||
delete[] pfRealLongTwiddle;
|
|
||||||
delete[] pfImagLongTwiddle;
|
|
||||||
|
|
||||||
delete[] pfRealShort;
|
|
||||||
delete[] pfImagShort;
|
|
||||||
delete[] pfRealShortTwiddle;
|
|
||||||
delete[] pfImagShortTwiddle;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
iLongSize=oCopy.iLongSize;
|
|
||||||
iHLongSize=iLongSize/2;
|
|
||||||
|
|
||||||
iShortSize=oCopy.iShortSize;
|
|
||||||
iHShortSize=iShortSize/2;
|
|
||||||
|
|
||||||
iOverlap=oCopy.iOverlap;
|
|
||||||
iOldShape=oCopy.iOldShape;
|
|
||||||
if(iLongSize==0){
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
if(iOverlap==0){
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
int n,k;
|
|
||||||
|
|
||||||
//Obtain memory for Short Windows:
|
|
||||||
//These arrays are larger than they need to be,
|
|
||||||
//but are made this large for convenience
|
|
||||||
iShortSize = iLongSize / 8;
|
|
||||||
iHShortSize = iHLongSize / 8;
|
|
||||||
pfShortWindowSin = new float[iHLongSize];
|
|
||||||
pfShortWindowKBD = new float[iHLongSize];
|
|
||||||
|
|
||||||
//Obtain memory for windows:
|
|
||||||
pfLongWindowSin=new float[iHLongSize];
|
|
||||||
pfS2LWindowSin=new float[iHLongSize];
|
|
||||||
|
|
||||||
pfLongWindowKBD=new float[iHLongSize];
|
|
||||||
pfS2LWindowKBD=new float[iHLongSize];
|
|
||||||
|
|
||||||
//Obtain memory for temporary buffer:
|
|
||||||
pfTempBuffer=new float[iLongSize];
|
|
||||||
pfEightWindowsBuffer=new float[iLongSize];
|
|
||||||
pfSavedBuffer=new float[iHLongSize];
|
|
||||||
for(n=0;n<iHLongSize;n++) pfSavedBuffer[n]=0;
|
|
||||||
|
|
||||||
//Create Windows:
|
|
||||||
KBD_Window(pfLongWindowKBD,iLongSize);
|
|
||||||
Sine_Window(pfLongWindowSin,iLongSize);
|
|
||||||
|
|
||||||
//Create S2L Window:
|
|
||||||
KBD_Window(pfShortWindowKBD,iOverlap*2); // temporary
|
|
||||||
for(k=0,n=iHLongSize/2-iOverlap/2;k<iOverlap;k++,n++){
|
|
||||||
pfS2LWindowKBD[n]=pfShortWindowKBD[k];
|
|
||||||
}
|
|
||||||
for(n=0;n<iHLongSize/2-iOverlap/2;n++){
|
|
||||||
pfS2LWindowKBD[n]=0.0f;
|
|
||||||
}
|
|
||||||
for(n=iHLongSize/2+iOverlap/2;n<iHLongSize;n++){
|
|
||||||
pfS2LWindowKBD[n]=1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create correct length short window
|
|
||||||
KBD_Window(pfShortWindowKBD,iShortSize);
|
|
||||||
|
|
||||||
//Create S2L Window:
|
|
||||||
Sine_Window(pfShortWindowSin,iOverlap*2); // temporary
|
|
||||||
for(k=0,n=iHLongSize/2-iOverlap/2;k<iOverlap;k++,n++){
|
|
||||||
pfS2LWindowSin[n]=pfShortWindowSin[k];
|
|
||||||
}
|
|
||||||
for(n=0;n<iHLongSize/2-iOverlap/2;n++){
|
|
||||||
pfS2LWindowSin[n]=0.0f;
|
|
||||||
}
|
|
||||||
for(n=iHLongSize/2+iOverlap/2;n<iHLongSize;n++){
|
|
||||||
pfS2LWindowSin[n]=1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Create correct length short window
|
|
||||||
Sine_Window(pfShortWindowSin,iShortSize);
|
|
||||||
|
|
||||||
// Compute Long Twiddles
|
|
||||||
iLongFFTSize=iLongSize/4;
|
|
||||||
pfReal=new float[iLongFFTSize];
|
|
||||||
pfImag=new float[iLongFFTSize];
|
|
||||||
pfRealLongTwiddle=new float[iLongFFTSize];
|
|
||||||
pfImagLongTwiddle=new float[iLongFFTSize];
|
|
||||||
pfRealLongTwiddle[0]=(float)(cos(0.125*2.0*pi/(float)iLongSize));
|
|
||||||
pfImagLongTwiddle[0]=(float)(sin(0.125*2.0*pi/(float)iLongSize));
|
|
||||||
for(n=1;n<iLongFFTSize;n++){
|
|
||||||
pfRealLongTwiddle[n]=(float)(cos(2.0*pi/(float)iLongSize))*pfRealLongTwiddle[n-1]-
|
|
||||||
(float)(sin(2.0*pi/(float)iLongSize))*pfImagLongTwiddle[n-1];
|
|
||||||
pfImagLongTwiddle[n]=(float)(cos(2.0*pi/(float)iLongSize))*pfImagLongTwiddle[n-1]+
|
|
||||||
(float)(sin(2.0*pi/(float)iLongSize))*pfRealLongTwiddle[n-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute Short Twiddles
|
|
||||||
// these twiddles may be redundant - they may be able to be computed as a function
|
|
||||||
// of the long twiddles
|
|
||||||
iShortFFTSize=iShortSize/4;
|
|
||||||
pfRealShort=new float[iShortFFTSize];
|
|
||||||
pfImagShort=new float[iShortFFTSize];
|
|
||||||
pfRealShortTwiddle=new float[iShortFFTSize];
|
|
||||||
pfImagShortTwiddle=new float[iShortFFTSize];
|
|
||||||
pfRealShortTwiddle[0]=(float)(cos(0.125*2.0*pi/(float)iShortSize));
|
|
||||||
pfImagShortTwiddle[0]=(float)(sin(0.125*2.0*pi/(float)iShortSize));
|
|
||||||
for(n=1;n<iShortFFTSize;n++){
|
|
||||||
pfRealShortTwiddle[n]=(float)(cos(2.0*pi/(float)iShortSize))*pfRealShortTwiddle[n-1]-
|
|
||||||
(float)(sin(2.0*pi/(float)iShortSize))*pfImagShortTwiddle[n-1];
|
|
||||||
pfImagShortTwiddle[n]=(float)(cos(2.0*pi/(float)iShortSize))*pfImagShortTwiddle[n-1]+
|
|
||||||
(float)(sin(2.0*pi/(float)iShortSize))*pfRealShortTwiddle[n-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
IMDCTObject::~IMDCTObject()
|
|
||||||
{
|
|
||||||
if(iLongSize!=0&&iOverlap!=0){
|
|
||||||
delete[] pfLongWindowKBD;
|
|
||||||
delete[] pfS2LWindowKBD;
|
|
||||||
|
|
||||||
delete[] pfLongWindowSin;
|
|
||||||
delete[] pfS2LWindowSin;
|
|
||||||
|
|
||||||
delete[] pfShortWindowSin;
|
|
||||||
delete[] pfShortWindowKBD;
|
|
||||||
|
|
||||||
delete[] pfSavedBuffer;
|
|
||||||
delete[] pfReal;
|
|
||||||
delete[] pfImag;
|
|
||||||
delete[] pfRealLongTwiddle;
|
|
||||||
delete[] pfImagLongTwiddle;
|
|
||||||
|
|
||||||
delete[] pfRealShort;
|
|
||||||
delete[] pfImagShort;
|
|
||||||
delete[] pfRealShortTwiddle;
|
|
||||||
delete[] pfImagShortTwiddle;
|
|
||||||
|
|
||||||
delete[] pfTempBuffer;
|
|
||||||
delete[] pfEightWindowsBuffer;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int IMDCTObject::Transform( float*pfData,
|
|
||||||
int iWindowType,
|
|
||||||
int iWindowShape)
|
|
||||||
{
|
|
||||||
int n,k;
|
|
||||||
float *pfWindowFirst;
|
|
||||||
float *pfWindowSecond;
|
|
||||||
int eightShortSequenceFlag;
|
|
||||||
float* pfDataShortBlock;
|
|
||||||
|
|
||||||
switch(iWindowType){
|
|
||||||
case 0:
|
|
||||||
if(iOldShape == SINE_WINDOW){
|
|
||||||
pfWindowFirst=pfLongWindowSin;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
pfWindowFirst=pfLongWindowKBD;
|
|
||||||
}
|
|
||||||
if(iWindowShape == SINE_WINDOW){
|
|
||||||
pfWindowSecond=pfLongWindowSin;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
pfWindowSecond=pfLongWindowKBD;
|
|
||||||
}
|
|
||||||
eightShortSequenceFlag = 0;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if(iOldShape == SINE_WINDOW){
|
|
||||||
pfWindowFirst=pfLongWindowSin;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
pfWindowFirst=pfLongWindowKBD;
|
|
||||||
}
|
|
||||||
if(iWindowShape == SINE_WINDOW){
|
|
||||||
pfWindowSecond=pfS2LWindowSin;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
pfWindowSecond=pfS2LWindowKBD;
|
|
||||||
}
|
|
||||||
eightShortSequenceFlag = 0;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
eightShortSequenceFlag = 1;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
if(iOldShape == SINE_WINDOW){
|
|
||||||
pfWindowFirst=pfS2LWindowSin;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
pfWindowFirst=pfS2LWindowKBD;
|
|
||||||
}
|
|
||||||
if(iWindowShape == SINE_WINDOW){
|
|
||||||
pfWindowSecond=pfLongWindowSin;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
pfWindowSecond=pfLongWindowKBD;
|
|
||||||
}
|
|
||||||
eightShortSequenceFlag = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//printf("Invalid Window Type\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eightShortSequenceFlag == 0)
|
|
||||||
{
|
|
||||||
//Copy Data
|
|
||||||
memcpy(pfTempBuffer,pfData,iHLongSize*sizeof(float));
|
|
||||||
|
|
||||||
//IMDCT:
|
|
||||||
imdct(pfTempBuffer, LONG_BLOCK);
|
|
||||||
//DGC Goes Here
|
|
||||||
//Window
|
|
||||||
for(n=0,k=iHLongSize-1;n<iHLongSize;n++,k--){
|
|
||||||
pfTempBuffer[n]*=pfWindowFirst[n];
|
|
||||||
pfTempBuffer[n+iHLongSize]*=pfWindowSecond[k];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//Copy coefficient Data to a (possibly larger) array in preparation
|
|
||||||
//for imdct.
|
|
||||||
//CNC: the use of the constact 256 is really ugly here!!!
|
|
||||||
//256 = (2 * CShortBlock::MaximumBins), but this expression
|
|
||||||
//is inconvenient to insert in the code below due to access restrictions.
|
|
||||||
//The hardcoding of the constant 256 refers to the fixed spacing
|
|
||||||
//of the mdct coefficients in the data pfData, independent of whether
|
|
||||||
//or not we're dealing with a single or a double length transform.
|
|
||||||
//Note: the imdct only requires N/2 freq. coefficients to
|
|
||||||
//produce N (time aliased) time samples. In the case of a double
|
|
||||||
//length transform, we'll need to copy the spectrally extended
|
|
||||||
//short blocks, one by one, to their proper place in the larger
|
|
||||||
//array, pfEightWindowsBuffer. Since the source and destination
|
|
||||||
//arrays might be of different sizes due to using a single *or* a
|
|
||||||
//double length transform, the block-to-block spacing of the mdct
|
|
||||||
//coefficients could be different in each of the arrays.
|
|
||||||
for (n=0;n<8;n++)
|
|
||||||
{
|
|
||||||
memcpy(&pfEightWindowsBuffer[n*iShortSize],
|
|
||||||
&pfData[n*256],
|
|
||||||
256*sizeof(float));
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear the TempBuffer, which will hold the time-aliased
|
|
||||||
// output for the entire frame (all overlap-added short blocks)
|
|
||||||
for (k = 0 ; k < iLongSize ; k++)
|
|
||||||
{
|
|
||||||
pfTempBuffer[k] = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(n=0;n<8;n++)
|
|
||||||
{
|
|
||||||
// IMDCT
|
|
||||||
pfDataShortBlock = &pfEightWindowsBuffer[n*iShortSize];
|
|
||||||
imdct(pfDataShortBlock,SHORT_BLOCK);
|
|
||||||
|
|
||||||
// DGC goes here
|
|
||||||
|
|
||||||
// Window the time-aliased, time domain data.. Take into account possible window shape switching on
|
|
||||||
// the first of the eight short windows.
|
|
||||||
// Note that the AAC standard says that
|
|
||||||
// "The window shape of the previous block influences the first of the eight short blocks (w_0(m)) only."
|
|
||||||
// ISO/IEC 13818-7:1997(E), page 78.
|
|
||||||
// This means that the rising edge of the zeroth short block must match the previous window frame's window
|
|
||||||
// shape. However, all subsequent rising and falling edges of remaining short blocks should reflect the
|
|
||||||
// currently decoded window shape type.
|
|
||||||
|
|
||||||
if (n==0)
|
|
||||||
{
|
|
||||||
// rising edge depends on old shape
|
|
||||||
if (iOldShape == SINE_WINDOW)
|
|
||||||
{
|
|
||||||
for (k=0;k<iHShortSize;k++)
|
|
||||||
{
|
|
||||||
pfDataShortBlock[k]*=pfShortWindowSin[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (iOldShape == KBD_WINDOW)
|
|
||||||
{
|
|
||||||
for (k=0;k<iHShortSize;k++)
|
|
||||||
{
|
|
||||||
pfDataShortBlock[k]*=pfShortWindowKBD[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// falling edge reflects new shape
|
|
||||||
if (iWindowShape == SINE_WINDOW)
|
|
||||||
{
|
|
||||||
for (k=0;k<iHShortSize;k++)
|
|
||||||
{
|
|
||||||
pfDataShortBlock[k+iHShortSize]*=pfShortWindowSin[iHShortSize-k-1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (iWindowShape == KBD_WINDOW)
|
|
||||||
{
|
|
||||||
for (k=0;k<iHShortSize;k++)
|
|
||||||
{
|
|
||||||
pfDataShortBlock[k+iHShortSize]*=pfShortWindowKBD[iHShortSize-k-1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // n != 0
|
|
||||||
{
|
|
||||||
if (iWindowShape == SINE_WINDOW)
|
|
||||||
{
|
|
||||||
for (k=0;k<iHShortSize;k++)
|
|
||||||
{
|
|
||||||
pfDataShortBlock[k]*=pfShortWindowSin[k];
|
|
||||||
pfDataShortBlock[k+iHShortSize]*=pfShortWindowSin[iHShortSize-k-1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (iWindowShape == KBD_WINDOW)
|
|
||||||
{
|
|
||||||
for (k=0;k<iHShortSize;k++)
|
|
||||||
{
|
|
||||||
pfDataShortBlock[k]*=pfShortWindowKBD[k];
|
|
||||||
pfDataShortBlock[k+iHShortSize]*=pfShortWindowKBD[iHShortSize-k-1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// overlap add the 8 windows in this block
|
|
||||||
for (k = 0 ; k < iShortSize ; k++)
|
|
||||||
{
|
|
||||||
pfTempBuffer[(iLongSize/4 - iShortSize/4) + (iHShortSize * n) + k] += pfDataShortBlock[k] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // for n...
|
|
||||||
|
|
||||||
} // if (eightShortSequenceFlag...)
|
|
||||||
|
|
||||||
//OLA:
|
|
||||||
for(n=0;n<iHLongSize;n++){
|
|
||||||
pfData[n]=pfTempBuffer[n]+pfSavedBuffer[n];
|
|
||||||
}
|
|
||||||
//Update Saved Buffer:
|
|
||||||
memcpy(pfSavedBuffer,&pfTempBuffer[iHLongSize],iHLongSize*sizeof(float));
|
|
||||||
|
|
||||||
iOldShape=iWindowShape;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void IMDCTObject::imdct(float*pfData, int blockType)
|
|
||||||
{
|
|
||||||
float fTempReal,fTempImag;
|
|
||||||
float fFactor;
|
|
||||||
int n,k,iLast,iRotation,iMiddle,iSize;
|
|
||||||
|
|
||||||
float *realData, *imagData, *realTwiddle, *imagTwiddle;
|
|
||||||
|
|
||||||
if (blockType == LONG_BLOCK)
|
|
||||||
{
|
|
||||||
iLast=iLongFFTSize;
|
|
||||||
iRotation=iLongFFTSize/2;
|
|
||||||
iMiddle=iHLongSize;
|
|
||||||
iSize=iLongSize;
|
|
||||||
fFactor=2.0f/(float)iLongSize;
|
|
||||||
realData = pfReal;
|
|
||||||
imagData = pfImag;
|
|
||||||
realTwiddle = pfRealLongTwiddle;
|
|
||||||
imagTwiddle = pfImagLongTwiddle;
|
|
||||||
}
|
|
||||||
else if (blockType == SHORT_BLOCK)
|
|
||||||
{
|
|
||||||
iLast=iShortFFTSize;
|
|
||||||
iRotation=iShortFFTSize/2;
|
|
||||||
iMiddle=iHShortSize;
|
|
||||||
iSize=iShortSize;
|
|
||||||
fFactor=2.0f/(float)iShortSize;
|
|
||||||
realData = pfRealShort;
|
|
||||||
imagData = pfImagShort;
|
|
||||||
realTwiddle = pfRealShortTwiddle;
|
|
||||||
imagTwiddle = pfImagShortTwiddle;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(k=0;k<iLast;k++){
|
|
||||||
n=2*k;
|
|
||||||
fTempReal=-pfData[n];
|
|
||||||
fTempImag=pfData[iMiddle-1-n];
|
|
||||||
|
|
||||||
realData[k]=fTempReal*realTwiddle[k]-fTempImag*imagTwiddle[k];
|
|
||||||
imagData[k]=-fTempImag*realTwiddle[k]-fTempReal*imagTwiddle[k];
|
|
||||||
}
|
|
||||||
fftl(realData,imagData,iLast);
|
|
||||||
for(k=0;k<iLast;k++){
|
|
||||||
//conj!
|
|
||||||
fTempReal=fFactor*(realData[k]*realTwiddle[k]+imagData[k]*imagTwiddle[k]);
|
|
||||||
fTempImag=fFactor*(-imagData[k]*realTwiddle[k]+realData[k]*imagTwiddle[k]);
|
|
||||||
|
|
||||||
n=2*k;
|
|
||||||
pfData[iMiddle+iLast-1-n]=fTempReal;
|
|
||||||
pfData[iLast+n]=fTempImag;
|
|
||||||
if(k<iRotation){
|
|
||||||
pfData[iMiddle+iLast+n]=fTempReal;
|
|
||||||
pfData[iLast-1-n]=-fTempImag;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
pfData[n-iLast]=-fTempReal;
|
|
||||||
pfData[iLast+iSize-1-n]=fTempImag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,94 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/dolby_imdct.h,v 1.1 2009/04/28 20:21:09 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* filename: dolby_mdct.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: Inverse MDCT include file
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef _DOLBY_IMDCT_H
|
|
||||||
#define _DOLBY_IMDCT_H
|
|
||||||
#include<math.h>
|
|
||||||
#include<string.h>
|
|
||||||
#include"fft.h"
|
|
||||||
|
|
||||||
/*#define INTERPOLATE_WINDOW */
|
|
||||||
|
|
||||||
class IMDCTObject{
|
|
||||||
|
|
||||||
public:
|
|
||||||
IMDCTObject(int _iLongSize,
|
|
||||||
int _iOverlap);
|
|
||||||
IMDCTObject();
|
|
||||||
IMDCTObject(IMDCTObject&oCopy);
|
|
||||||
IMDCTObject& operator=(IMDCTObject&oCopy);
|
|
||||||
~IMDCTObject();
|
|
||||||
|
|
||||||
int Transform( float*pfData,
|
|
||||||
int iWindowType,
|
|
||||||
int iWindowShape);
|
|
||||||
|
|
||||||
private:
|
|
||||||
enum {
|
|
||||||
LONG_BLOCK,
|
|
||||||
SHORT_BLOCK
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
LONG_WINDOW = 0,
|
|
||||||
START_WINDOW = 1,
|
|
||||||
EIGHT_SHORT_SEQUENCE = 2,
|
|
||||||
STOP_WINDOW = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
SINE_WINDOW = 0,
|
|
||||||
KBD_WINDOW = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
void imdct(float* pfData, int blocktype);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int iLongSize;
|
|
||||||
int iShortSize;
|
|
||||||
int iHLongSize;
|
|
||||||
int iHShortSize;
|
|
||||||
int iOverlap;
|
|
||||||
int iOldShape;
|
|
||||||
|
|
||||||
//Windows:
|
|
||||||
float*pfLongWindowSin;
|
|
||||||
float*pfS2LWindowSin;
|
|
||||||
float*pfShortWindowSin;
|
|
||||||
|
|
||||||
float*pfLongWindowKBD;
|
|
||||||
float*pfS2LWindowKBD;
|
|
||||||
float*pfShortWindowKBD;
|
|
||||||
|
|
||||||
|
|
||||||
float*pfTempBuffer;
|
|
||||||
float*pfEightWindowsBuffer;
|
|
||||||
|
|
||||||
float*pfSavedBuffer;
|
|
||||||
|
|
||||||
//MDCT Data:
|
|
||||||
int iLongFFTSize;
|
|
||||||
int iShortFFTSize;
|
|
||||||
float*pfReal;
|
|
||||||
float*pfImag;
|
|
||||||
float*pfRealLongTwiddle;
|
|
||||||
float*pfImagLongTwiddle;
|
|
||||||
|
|
||||||
float*pfRealShort;
|
|
||||||
float*pfImagShort;
|
|
||||||
float*pfRealShortTwiddle;
|
|
||||||
float*pfImagShortTwiddle;
|
|
||||||
|
|
||||||
};
|
|
||||||
#endif
|
|
|
@ -1,91 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/exception.h,v 1.1 2009/04/28 20:21:09 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: exception.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: common exception object
|
|
||||||
*
|
|
||||||
* $Header: /cvs/root/winamp/vlb/exception.h,v 1.1 2009/04/28 20:21:09 audiodsp Exp $
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __EXCEPTION_H__
|
|
||||||
#define __EXCEPTION_H__
|
|
||||||
|
|
||||||
#define AAC_OK 0x0000
|
|
||||||
|
|
||||||
#define AAC_FAILURE_BASE 0x1000
|
|
||||||
|
|
||||||
#define AAC_UNIMPLEMENTED (AAC_FAILURE_BASE | 1)
|
|
||||||
#define AAC_NOTADIFHEADER (AAC_FAILURE_BASE | 2)
|
|
||||||
#define AAC_DOESNOTEXIST (AAC_FAILURE_BASE | 3)
|
|
||||||
#define AAC_ENDOFSTREAM (AAC_FAILURE_BASE | 4)
|
|
||||||
#define AAC_SYNCERROR (AAC_FAILURE_BASE | 5)
|
|
||||||
#define AAC_CRCERROR (AAC_FAILURE_BASE | 6)
|
|
||||||
#define AAC_INPUT_BUFFER_EMPTY (AAC_FAILURE_BASE | 7)
|
|
||||||
#define AAC_INVALIDCODEBOOK (AAC_FAILURE_BASE | 8)
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
#define AAC_INVALIDPREDICTORRESET (AAC_FAILURE_BASE | 9)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define AAC_UNSUPPORTEDWINDOWSHAPE (AAC_FAILURE_BASE | 10)
|
|
||||||
#define AAC_DOLBY_NOT_SUPPORTED (AAC_FAILURE_BASE | 11)
|
|
||||||
#define AAC_ILLEGAL_PROFILE (AAC_FAILURE_BASE | 12)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
/** Base Class For Exceptions.
|
|
||||||
|
|
||||||
This class defines the interface that all exceptions possibly thrown by
|
|
||||||
\Ref{CAacDecoder} or its input objects are derived from.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CAacException
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
/// Exception Constructor.
|
|
||||||
|
|
||||||
CAacException (int _value, char *_text) : value(_value), text(_text) {} ;
|
|
||||||
|
|
||||||
/// Exception Destructor.
|
|
||||||
|
|
||||||
~CAacException () {} ;
|
|
||||||
|
|
||||||
/** Exception Code Method.
|
|
||||||
|
|
||||||
This method returns an exception status code, that can be used programatically.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int What () { return value ; }
|
|
||||||
|
|
||||||
/** Exception Text Method.
|
|
||||||
|
|
||||||
This method returns a pointer to a plain text explanation of what happened.
|
|
||||||
It might be used e.g. for user notification messages or the like.
|
|
||||||
*/
|
|
||||||
|
|
||||||
char *Explain () { return text ; }
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
int value ;
|
|
||||||
char *text ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#define DECLARE_EXCEPTION(a,b,c) class a : public CAacException { public : a () : CAacException (b, c) {} ; }
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,65 +0,0 @@
|
||||||
#include "factory_nsvVlb.h"
|
|
||||||
#include "NSVFactory.h"
|
|
||||||
|
|
||||||
static const char serviceName[] = "Dolby VLB NSV Decoder";
|
|
||||||
|
|
||||||
// {69D8A07C-ECE4-44f8-9C40-12506422A882}
|
|
||||||
static const GUID nsv_vlb_guid =
|
|
||||||
{ 0x69d8a07c, 0xece4, 0x44f8, { 0x9c, 0x40, 0x12, 0x50, 0x64, 0x22, 0xa8, 0x82 } };
|
|
||||||
|
|
||||||
|
|
||||||
static NSVFactory nsvFactory;
|
|
||||||
FOURCC NSVVLBFactory::GetServiceType()
|
|
||||||
{
|
|
||||||
return WaSvc::NSVFACTORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *NSVVLBFactory::GetServiceName()
|
|
||||||
{
|
|
||||||
return serviceName;
|
|
||||||
}
|
|
||||||
|
|
||||||
GUID NSVVLBFactory::GetGUID()
|
|
||||||
{
|
|
||||||
return nsv_vlb_guid;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *NSVVLBFactory::GetInterface(int global_lock)
|
|
||||||
{
|
|
||||||
svc_nsvFactory *ifc = &nsvFactory;
|
|
||||||
return ifc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int NSVVLBFactory::SupportNonLockingInterface()
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int NSVVLBFactory::ReleaseInterface(void *ifc)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *NSVVLBFactory::GetTestString()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int NSVVLBFactory::ServiceNotify(int msg, int param1, int param2)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define CBCLASS NSVVLBFactory
|
|
||||||
START_DISPATCH;
|
|
||||||
CB(WASERVICEFACTORY_GETSERVICETYPE, GetServiceType)
|
|
||||||
CB(WASERVICEFACTORY_GETSERVICENAME, GetServiceName)
|
|
||||||
CB(WASERVICEFACTORY_GETGUID, GetGUID)
|
|
||||||
CB(WASERVICEFACTORY_GETINTERFACE, GetInterface)
|
|
||||||
CB(WASERVICEFACTORY_SUPPORTNONLOCKINGGETINTERFACE, SupportNonLockingInterface)
|
|
||||||
CB(WASERVICEFACTORY_RELEASEINTERFACE, ReleaseInterface)
|
|
||||||
CB(WASERVICEFACTORY_GETTESTSTRING, GetTestString)
|
|
||||||
CB(WASERVICEFACTORY_SERVICENOTIFY, ServiceNotify)
|
|
||||||
END_DISPATCH;
|
|
||||||
#undef CBCLASS
|
|
|
@ -1,25 +0,0 @@
|
||||||
#ifndef NULLSOFT_FACTORY_NSVFACTORY_H
|
|
||||||
#define NULLSOFT_FACTORY_NSVFACTORY_H
|
|
||||||
|
|
||||||
//#include "api__vlb.h"
|
|
||||||
#include <api/service/waservicefactory.h>
|
|
||||||
#include <api/service/services.h>
|
|
||||||
|
|
||||||
class NSVVLBFactory : public waServiceFactory
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FOURCC GetServiceType();
|
|
||||||
const char *GetServiceName();
|
|
||||||
GUID GetGUID();
|
|
||||||
void *GetInterface(int global_lock);
|
|
||||||
int SupportNonLockingInterface();
|
|
||||||
int ReleaseInterface(void *ifc);
|
|
||||||
const char *GetTestString();
|
|
||||||
int ServiceNotify(int msg, int param1, int param2);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
RECVS_DISPATCH;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,66 +0,0 @@
|
||||||
//#define GUID_EQUALS_DEFINED
|
|
||||||
#include "api__vlb.h"
|
|
||||||
#include "factory_vlbdecoder.h"
|
|
||||||
#include "VlbDecoder.h"
|
|
||||||
|
|
||||||
static const char serviceName[] = "Dolby VLB Decoder";
|
|
||||||
|
|
||||||
FOURCC VLBDecoderFactory::GetServiceType()
|
|
||||||
{
|
|
||||||
return WaSvc::OBJECT;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *VLBDecoderFactory::GetServiceName()
|
|
||||||
{
|
|
||||||
return serviceName;
|
|
||||||
}
|
|
||||||
|
|
||||||
GUID VLBDecoderFactory::GetGUID()
|
|
||||||
{
|
|
||||||
return obj_vlbDecoderGUID;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *VLBDecoderFactory::GetInterface(int global_lock)
|
|
||||||
{
|
|
||||||
obj_vlbDecoder *ifc=new VLBDecoder;
|
|
||||||
// if (global_lock)
|
|
||||||
// WASABI_API_SVC->service_lock(this, (void *)ifc);
|
|
||||||
return ifc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int VLBDecoderFactory::SupportNonLockingInterface()
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int VLBDecoderFactory::ReleaseInterface(void *ifc)
|
|
||||||
{
|
|
||||||
//WASABI_API_SVC->service_unlock(ifc);
|
|
||||||
obj_vlbDecoder *decoder = static_cast<obj_vlbDecoder *>(ifc);
|
|
||||||
VLBDecoder *vlbDecoder = static_cast<VLBDecoder *>(decoder);
|
|
||||||
delete vlbDecoder;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *VLBDecoderFactory::GetTestString()
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int VLBDecoderFactory::ServiceNotify(int msg, int param1, int param2)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CBCLASS VLBDecoderFactory
|
|
||||||
START_DISPATCH;
|
|
||||||
CB(WASERVICEFACTORY_GETSERVICETYPE, GetServiceType)
|
|
||||||
CB(WASERVICEFACTORY_GETSERVICENAME, GetServiceName)
|
|
||||||
CB(WASERVICEFACTORY_GETGUID, GetGUID)
|
|
||||||
CB(WASERVICEFACTORY_GETINTERFACE, GetInterface)
|
|
||||||
CB(WASERVICEFACTORY_SUPPORTNONLOCKINGGETINTERFACE, SupportNonLockingInterface)
|
|
||||||
CB(WASERVICEFACTORY_RELEASEINTERFACE, ReleaseInterface)
|
|
||||||
CB(WASERVICEFACTORY_GETTESTSTRING, GetTestString)
|
|
||||||
CB(WASERVICEFACTORY_SERVICENOTIFY, ServiceNotify)
|
|
||||||
END_DISPATCH;
|
|
||||||
#undef CBCLASS
|
|
|
@ -1,23 +0,0 @@
|
||||||
#ifndef NULLSOFT_FACTORY_VLBDECODER_H
|
|
||||||
#define NULLSOFT_FACTORY_VLBDECODER_H
|
|
||||||
|
|
||||||
#include <api/service/waservicefactory.h>
|
|
||||||
#include <api/service/services.h>
|
|
||||||
|
|
||||||
class VLBDecoderFactory : public waServiceFactory
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FOURCC GetServiceType();
|
|
||||||
const char *GetServiceName();
|
|
||||||
GUID GetGUID();
|
|
||||||
void *GetInterface(int global_lock);
|
|
||||||
int SupportNonLockingInterface();
|
|
||||||
int ReleaseInterface(void *ifc);
|
|
||||||
const char *GetTestString();
|
|
||||||
int ServiceNotify(int msg, int param1, int param2);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
RECVS_DISPATCH;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
317
Src/vlb/fft.cpp
317
Src/vlb/fft.cpp
|
@ -1,317 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/fft.cpp,v 1.1 2009/04/28 20:21:09 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* filename: fft.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: Standard FFT routine
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
/* Description: This function calculates a 1024,256 or 128 point fft via
|
|
||||||
decimation in frequency algorithm described in "Digital Signal
|
|
||||||
Processing" by Oppenheim and Schafer, refer to pages 304 (flow
|
|
||||||
chart) and 330-332 (Fotran program in problem 5). Modified to
|
|
||||||
get only desired block sizes. */
|
|
||||||
|
|
||||||
#include"fft.h"
|
|
||||||
|
|
||||||
#ifndef PI
|
|
||||||
#define PI 3.14159265358979
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define HOTSWAP(a,b) fTemp=a; a=b; b=fTemp;
|
|
||||||
void fftl(float *pfReal, float *pfImag,int iSize)
|
|
||||||
{
|
|
||||||
static int iInit=0;
|
|
||||||
static int iPower2=0;
|
|
||||||
static int iTransformSize=0;
|
|
||||||
static float *pfTwiddleReal=0;
|
|
||||||
static float *pfTwiddleImag=0;
|
|
||||||
|
|
||||||
if(iSize!=iTransformSize){
|
|
||||||
iInit=0;
|
|
||||||
}
|
|
||||||
if(!iInit){
|
|
||||||
int iCounter;
|
|
||||||
|
|
||||||
if((iSize-1)&iSize){
|
|
||||||
//printf("FFT Length Must be Radix 2!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(pfTwiddleReal);
|
|
||||||
free(pfTwiddleImag);
|
|
||||||
|
|
||||||
iTransformSize=iSize;
|
|
||||||
|
|
||||||
pfTwiddleReal=(float*)malloc(iSize/2*sizeof(float));
|
|
||||||
pfTwiddleImag=(float*)malloc(iSize/2*sizeof(float));
|
|
||||||
|
|
||||||
for(iCounter=0;iCounter<iSize/2;iCounter++){
|
|
||||||
pfTwiddleReal[iCounter]=(float)(cos(2.0*PI/(double)iSize*(double)iCounter));
|
|
||||||
pfTwiddleImag[iCounter]=(float)(-1.0*sin(2.0*PI/(double)iSize*(double)iCounter));
|
|
||||||
}
|
|
||||||
iPower2=0;
|
|
||||||
for(iCounter=1;iCounter<iSize;iCounter<<=1) iPower2++;
|
|
||||||
|
|
||||||
iInit++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform Fast Fourier Transform: */
|
|
||||||
|
|
||||||
/* With Help From Figure 6.11 pp 464 */
|
|
||||||
/* John G. Proakis,"Digital Signal Processing," 3rd Edt. */
|
|
||||||
/* 1996 Prentice Hall */
|
|
||||||
|
|
||||||
int iSkip;
|
|
||||||
int iFFTCounter;
|
|
||||||
int iCounter1;
|
|
||||||
int iCounter2;
|
|
||||||
int iOffset;
|
|
||||||
int iHSize;
|
|
||||||
|
|
||||||
iHSize=iSize>>1;
|
|
||||||
iFFTCounter=1;
|
|
||||||
for(iSkip=iHSize;iSkip>0;iSkip>>=1){
|
|
||||||
iOffset=0;
|
|
||||||
for(iCounter1=0;iCounter1<iFFTCounter;iCounter1++){
|
|
||||||
int iOffset1;
|
|
||||||
int iOffset2;
|
|
||||||
int iTwiddleOffset;
|
|
||||||
iOffset1=iOffset;
|
|
||||||
iOffset2=iOffset1+iSkip;
|
|
||||||
iTwiddleOffset=0;
|
|
||||||
for(iCounter2=0;iCounter2<iSkip;iCounter2++){
|
|
||||||
float fTemp;
|
|
||||||
|
|
||||||
fTemp=pfReal[iOffset1];
|
|
||||||
pfReal[iOffset1]+=pfReal[iOffset2];
|
|
||||||
pfReal[iOffset2]=fTemp-pfReal[iOffset2];
|
|
||||||
|
|
||||||
fTemp=pfImag[iOffset1];
|
|
||||||
pfImag[iOffset1]+=pfImag[iOffset2];
|
|
||||||
pfImag[iOffset2]=fTemp-pfImag[iOffset2];
|
|
||||||
|
|
||||||
|
|
||||||
if(iCounter2){
|
|
||||||
fTemp=pfReal[iOffset2];
|
|
||||||
pfReal[iOffset2]=pfReal[iOffset2]*pfTwiddleReal[iTwiddleOffset]-
|
|
||||||
pfImag[iOffset2]*pfTwiddleImag[iTwiddleOffset];
|
|
||||||
|
|
||||||
pfImag[iOffset2]=fTemp*pfTwiddleImag[iTwiddleOffset]+
|
|
||||||
pfImag[iOffset2]*pfTwiddleReal[iTwiddleOffset];
|
|
||||||
}
|
|
||||||
iOffset1++;
|
|
||||||
iOffset2++;
|
|
||||||
iTwiddleOffset+=iFFTCounter;
|
|
||||||
}
|
|
||||||
iOffset+=(iSkip<<1);
|
|
||||||
}
|
|
||||||
iFFTCounter<<=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*Reorder Data: */
|
|
||||||
iCounter1=0;
|
|
||||||
for(iCounter2=0;iCounter2<iSize-1;iCounter2++){
|
|
||||||
int iCounter3;
|
|
||||||
if(iCounter2<iCounter1){
|
|
||||||
float fTemp;
|
|
||||||
HOTSWAP(pfReal[iCounter2],pfReal[iCounter1]);
|
|
||||||
HOTSWAP(pfImag[iCounter2],pfImag[iCounter1]);
|
|
||||||
}
|
|
||||||
iCounter3=iHSize;
|
|
||||||
while(iCounter3<=iCounter1){
|
|
||||||
iCounter1-=iCounter3;
|
|
||||||
iCounter3=iCounter3>>1;
|
|
||||||
}
|
|
||||||
iCounter1=iCounter1+iCounter3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
void fftl(float* xreal,float* ximag,int N)
|
|
||||||
{
|
|
||||||
int m,mm1;
|
|
||||||
static int init=0;
|
|
||||||
int nv2,nm1,mp;
|
|
||||||
static float wreal[13][13],wimag[13][13];
|
|
||||||
int i,j,k,l;
|
|
||||||
int ip,le,le1;
|
|
||||||
float treal,timag,ureal,uimag;
|
|
||||||
if (init==0){
|
|
||||||
memset((char*) wreal,0,sizeof(wreal));
|
|
||||||
memset((char*)wimag,0,sizeof(wimag));
|
|
||||||
m=13;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[0][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[0][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=12;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[1][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[1][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=11;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[2][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[2][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=10;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[3][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[3][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=9;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[4][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[4][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=8;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[5][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[5][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=7;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[6][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[6][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=6;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[7][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[7][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=5;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[8][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[8][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=4;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[9][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[9][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=3;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[10][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[10][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=2;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[11][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[11][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
m=1;
|
|
||||||
for(l=0;l<m;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
wreal[12][l]=(float)(cosl(pi/le1));
|
|
||||||
wimag[12][l]=-1.0f*(float)(sinl(pi/le1));
|
|
||||||
}
|
|
||||||
init++;
|
|
||||||
}
|
|
||||||
switch(N){
|
|
||||||
case 8192: m=13;mp=0;break;
|
|
||||||
case 4096: m=12;mp=1;break;
|
|
||||||
case 2048: m=11;mp=2;break;
|
|
||||||
case 1024: m=10;mp=3;break;
|
|
||||||
case 512: m=9;mp=4;break;
|
|
||||||
case 256:m=8;mp=5;break;
|
|
||||||
case 128:m=7;mp=6;break;
|
|
||||||
case 64:m=6;mp=7;break;
|
|
||||||
case 32:m=5;mp=8;break;
|
|
||||||
case 16:m=4;mp=9;break;
|
|
||||||
case 8:m=3;mp=10;break;
|
|
||||||
case 4:m=2;mp=11;break;
|
|
||||||
case 2:m=1;mp=12;break;
|
|
||||||
default: printf("FFT ERROR! %d\n",N);return;
|
|
||||||
}
|
|
||||||
mm1=m-1;
|
|
||||||
nv2=N>>1;
|
|
||||||
nm1=N-1;
|
|
||||||
for(l=0;l<mm1;l++){
|
|
||||||
le=1<<(m-l);
|
|
||||||
le1=le>>1;
|
|
||||||
ureal=1;
|
|
||||||
uimag=0;
|
|
||||||
for(j=0;j<le1;j++){
|
|
||||||
for(i=j;i<N;i+=le){
|
|
||||||
ip=i+le1;
|
|
||||||
treal=xreal[i]+xreal[ip];
|
|
||||||
timag=ximag[i]+ximag[ip];
|
|
||||||
xreal[ip]=xreal[i]-xreal[ip];
|
|
||||||
ximag[ip]=ximag[i]-ximag[ip];
|
|
||||||
xreal[i]=treal;
|
|
||||||
ximag[i]=timag;
|
|
||||||
treal=xreal[ip];
|
|
||||||
xreal[ip]=xreal[ip]*ureal-ximag[ip]*uimag;
|
|
||||||
ximag[ip]=ximag[ip]*ureal+treal*uimag;
|
|
||||||
}
|
|
||||||
treal=ureal;
|
|
||||||
ureal=ureal*wreal[mp][l]-uimag*wimag[mp][l];
|
|
||||||
uimag=uimag*wreal[mp][l]+treal*wimag[mp][l];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(i=0;i<N;i+=2){
|
|
||||||
ip=i+1;
|
|
||||||
treal=xreal[i]+xreal[ip];
|
|
||||||
timag=ximag[i]+ximag[ip];
|
|
||||||
xreal[ip]=xreal[i]-xreal[ip];
|
|
||||||
ximag[ip]=ximag[i]-ximag[ip];
|
|
||||||
xreal[i]=treal;
|
|
||||||
ximag[i]=timag;
|
|
||||||
}
|
|
||||||
j=0;
|
|
||||||
for(i=0;i<nm1;i++){
|
|
||||||
if(i<j){
|
|
||||||
treal=xreal[j];
|
|
||||||
timag=ximag[j];
|
|
||||||
xreal[j]=xreal[i];
|
|
||||||
ximag[j]=ximag[i];
|
|
||||||
xreal[i]=treal;
|
|
||||||
ximag[i]=timag;
|
|
||||||
}
|
|
||||||
k=nv2;
|
|
||||||
while(k<=j){
|
|
||||||
j=j-k;
|
|
||||||
k=k>>1;
|
|
||||||
}
|
|
||||||
j=j+k;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/fft.h,v 1.1 2009/04/28 20:21:09 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* filename: fft.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: FFT include file
|
|
||||||
*
|
|
||||||
* $Header: /cvs/root/winamp/vlb/fft.h,v 1.1 2009/04/28 20:21:09 audiodsp Exp $
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include<math.h>
|
|
||||||
#include<string.h>
|
|
||||||
#include<stdlib.h>
|
|
||||||
#include<stdio.h>
|
|
||||||
#ifndef FFTH
|
|
||||||
#define FFTH
|
|
||||||
|
|
||||||
#ifndef pi
|
|
||||||
#define pi 3.1415926535897932384626434f
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void fftl(float* ,float* ,int );
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,875 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/imdct.cpp,v 1.2 2011/06/13 02:06:03 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: imdct.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: inverse modified discrete cosine transform
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "block.h"
|
|
||||||
|
|
||||||
static const float CosTable_2048 [2048] =
|
|
||||||
{
|
|
||||||
0.500000F, 0.500001F, 0.500004F, 0.500007F, 0.500012F, 0.500018F, 0.500025F, 0.500033F,
|
|
||||||
0.500043F, 0.500053F, 0.500065F, 0.500078F, 0.500092F, 0.500107F, 0.500124F, 0.500141F,
|
|
||||||
0.500160F, 0.500180F, 0.500201F, 0.500224F, 0.500247F, 0.500272F, 0.500298F, 0.500325F,
|
|
||||||
0.500353F, 0.500383F, 0.500413F, 0.500445F, 0.500478F, 0.500512F, 0.500548F, 0.500584F,
|
|
||||||
0.500622F, 0.500661F, 0.500701F, 0.500742F, 0.500785F, 0.500828F, 0.500873F, 0.500919F,
|
|
||||||
0.500966F, 0.501015F, 0.501064F, 0.501115F, 0.501167F, 0.501220F, 0.501275F, 0.501330F,
|
|
||||||
0.501387F, 0.501445F, 0.501504F, 0.501564F, 0.501626F, 0.501689F, 0.501752F, 0.501818F,
|
|
||||||
0.501884F, 0.501951F, 0.502020F, 0.502090F, 0.502161F, 0.502233F, 0.502307F, 0.502381F,
|
|
||||||
0.502457F, 0.502535F, 0.502613F, 0.502692F, 0.502773F, 0.502855F, 0.502938F, 0.503023F,
|
|
||||||
0.503108F, 0.503195F, 0.503283F, 0.503372F, 0.503463F, 0.503554F, 0.503647F, 0.503741F,
|
|
||||||
0.503837F, 0.503933F, 0.504031F, 0.504130F, 0.504230F, 0.504331F, 0.504434F, 0.504538F,
|
|
||||||
0.504643F, 0.504750F, 0.504857F, 0.504966F, 0.505076F, 0.505187F, 0.505300F, 0.505414F,
|
|
||||||
0.505529F, 0.505645F, 0.505762F, 0.505881F, 0.506001F, 0.506122F, 0.506245F, 0.506369F,
|
|
||||||
0.506494F, 0.506620F, 0.506747F, 0.506876F, 0.507006F, 0.507137F, 0.507270F, 0.507404F,
|
|
||||||
0.507539F, 0.507675F, 0.507813F, 0.507952F, 0.508092F, 0.508233F, 0.508376F, 0.508520F,
|
|
||||||
0.508665F, 0.508812F, 0.508960F, 0.509109F, 0.509259F, 0.509411F, 0.509564F, 0.509718F,
|
|
||||||
0.509874F, 0.510030F, 0.510189F, 0.510348F, 0.510509F, 0.510671F, 0.510834F, 0.510999F,
|
|
||||||
0.511165F, 0.511332F, 0.511501F, 0.511671F, 0.511842F, 0.512014F, 0.512188F, 0.512363F,
|
|
||||||
0.512540F, 0.512718F, 0.512897F, 0.513077F, 0.513259F, 0.513442F, 0.513627F, 0.513813F,
|
|
||||||
0.514000F, 0.514189F, 0.514379F, 0.514570F, 0.514762F, 0.514956F, 0.515152F, 0.515348F,
|
|
||||||
0.515547F, 0.515746F, 0.515947F, 0.516149F, 0.516352F, 0.516557F, 0.516764F, 0.516971F,
|
|
||||||
0.517180F, 0.517391F, 0.517603F, 0.517816F, 0.518031F, 0.518247F, 0.518464F, 0.518683F,
|
|
||||||
0.518903F, 0.519125F, 0.519348F, 0.519572F, 0.519798F, 0.520025F, 0.520254F, 0.520484F,
|
|
||||||
0.520716F, 0.520949F, 0.521183F, 0.521419F, 0.521657F, 0.521895F, 0.522136F, 0.522377F,
|
|
||||||
0.522620F, 0.522865F, 0.523111F, 0.523359F, 0.523608F, 0.523858F, 0.524110F, 0.524363F,
|
|
||||||
0.524618F, 0.524875F, 0.525132F, 0.525392F, 0.525653F, 0.525915F, 0.526179F, 0.526444F,
|
|
||||||
0.526711F, 0.526979F, 0.527249F, 0.527521F, 0.527793F, 0.528068F, 0.528344F, 0.528621F,
|
|
||||||
0.528900F, 0.529181F, 0.529463F, 0.529747F, 0.530032F, 0.530319F, 0.530607F, 0.530897F,
|
|
||||||
0.531189F, 0.531482F, 0.531776F, 0.532072F, 0.532370F, 0.532670F, 0.532970F, 0.533273F,
|
|
||||||
0.533577F, 0.533883F, 0.534190F, 0.534499F, 0.534810F, 0.535122F, 0.535436F, 0.535751F,
|
|
||||||
0.536069F, 0.536387F, 0.536708F, 0.537030F, 0.537353F, 0.537679F, 0.538006F, 0.538334F,
|
|
||||||
0.538665F, 0.538997F, 0.539331F, 0.539666F, 0.540003F, 0.540342F, 0.540682F, 0.541024F,
|
|
||||||
0.541368F, 0.541714F, 0.542061F, 0.542410F, 0.542761F, 0.543113F, 0.543468F, 0.543824F,
|
|
||||||
0.544181F, 0.544541F, 0.544902F, 0.545265F, 0.545630F, 0.545996F, 0.546365F, 0.546735F,
|
|
||||||
0.547107F, 0.547480F, 0.547856F, 0.548233F, 0.548612F, 0.548993F, 0.549376F, 0.549760F,
|
|
||||||
0.550147F, 0.550535F, 0.550925F, 0.551317F, 0.551711F, 0.552107F, 0.552504F, 0.552903F,
|
|
||||||
0.553305F, 0.553708F, 0.554113F, 0.554520F, 0.554929F, 0.555340F, 0.555752F, 0.556167F,
|
|
||||||
0.556584F, 0.557002F, 0.557422F, 0.557845F, 0.558269F, 0.558695F, 0.559124F, 0.559554F,
|
|
||||||
0.559986F, 0.560420F, 0.560857F, 0.561295F, 0.561735F, 0.562177F, 0.562621F, 0.563068F,
|
|
||||||
0.563516F, 0.563966F, 0.564419F, 0.564873F, 0.565330F, 0.565788F, 0.566249F, 0.566712F,
|
|
||||||
0.567177F, 0.567644F, 0.568113F, 0.568584F, 0.569057F, 0.569533F, 0.570010F, 0.570490F,
|
|
||||||
0.570972F, 0.571456F, 0.571942F, 0.572430F, 0.572921F, 0.573414F, 0.573909F, 0.574406F,
|
|
||||||
0.574905F, 0.575407F, 0.575911F, 0.576417F, 0.576925F, 0.577436F, 0.577948F, 0.578463F,
|
|
||||||
0.578981F, 0.579501F, 0.580023F, 0.580547F, 0.581073F, 0.581602F, 0.582134F, 0.582667F,
|
|
||||||
0.583203F, 0.583742F, 0.584282F, 0.584825F, 0.585371F, 0.585919F, 0.586469F, 0.587022F,
|
|
||||||
0.587577F, 0.588134F, 0.588694F, 0.589257F, 0.589822F, 0.590389F, 0.590959F, 0.591531F,
|
|
||||||
0.592106F, 0.592684F, 0.593264F, 0.593846F, 0.594431F, 0.595019F, 0.595609F, 0.596201F,
|
|
||||||
0.596797F, 0.597395F, 0.597995F, 0.598598F, 0.599204F, 0.599812F, 0.600423F, 0.601037F,
|
|
||||||
0.601653F, 0.602272F, 0.602894F, 0.603519F, 0.604146F, 0.604776F, 0.605408F, 0.606044F,
|
|
||||||
0.606682F, 0.607323F, 0.607967F, 0.608613F, 0.609262F, 0.609915F, 0.610570F, 0.611227F,
|
|
||||||
0.611888F, 0.612552F, 0.613218F, 0.613887F, 0.614560F, 0.615235F, 0.615913F, 0.616594F,
|
|
||||||
0.617278F, 0.617965F, 0.618655F, 0.619348F, 0.620044F, 0.620743F, 0.621445F, 0.622150F,
|
|
||||||
0.622859F, 0.623570F, 0.624284F, 0.625002F, 0.625722F, 0.626446F, 0.627173F, 0.627903F,
|
|
||||||
0.628636F, 0.629373F, 0.630113F, 0.630856F, 0.631602F, 0.632351F, 0.633104F, 0.633860F,
|
|
||||||
0.634619F, 0.635382F, 0.636147F, 0.636917F, 0.637689F, 0.638465F, 0.639245F, 0.640028F,
|
|
||||||
0.640814F, 0.641604F, 0.642397F, 0.643193F, 0.643994F, 0.644797F, 0.645604F, 0.646415F,
|
|
||||||
0.647229F, 0.648047F, 0.648869F, 0.649694F, 0.650523F, 0.651355F, 0.652191F, 0.653031F,
|
|
||||||
0.653874F, 0.654721F, 0.655572F, 0.656427F, 0.657285F, 0.658147F, 0.659014F, 0.659883F,
|
|
||||||
0.660757F, 0.661635F, 0.662516F, 0.663402F, 0.664291F, 0.665184F, 0.666082F, 0.666983F,
|
|
||||||
0.667888F, 0.668798F, 0.669711F, 0.670629F, 0.671550F, 0.672476F, 0.673406F, 0.674340F,
|
|
||||||
0.675278F, 0.676220F, 0.677167F, 0.678118F, 0.679073F, 0.680033F, 0.680996F, 0.681964F,
|
|
||||||
0.682937F, 0.683914F, 0.684895F, 0.685881F, 0.686871F, 0.687866F, 0.688865F, 0.689869F,
|
|
||||||
0.690877F, 0.691890F, 0.692907F, 0.693929F, 0.694956F, 0.695987F, 0.697024F, 0.698064F,
|
|
||||||
0.699110F, 0.700160F, 0.701216F, 0.702276F, 0.703341F, 0.704411F, 0.705485F, 0.706565F,
|
|
||||||
0.707650F, 0.708739F, 0.709834F, 0.710934F, 0.712039F, 0.713149F, 0.714264F, 0.715384F,
|
|
||||||
0.716510F, 0.717641F, 0.718777F, 0.719918F, 0.721065F, 0.722217F, 0.723374F, 0.724537F,
|
|
||||||
0.725705F, 0.726879F, 0.728058F, 0.729243F, 0.730434F, 0.731630F, 0.732832F, 0.734039F,
|
|
||||||
0.735252F, 0.736471F, 0.737696F, 0.738926F, 0.740162F, 0.741405F, 0.742653F, 0.743907F,
|
|
||||||
0.745167F, 0.746433F, 0.747705F, 0.748984F, 0.750268F, 0.751559F, 0.752856F, 0.754159F,
|
|
||||||
0.755468F, 0.756784F, 0.758106F, 0.759435F, 0.760770F, 0.762112F, 0.763460F, 0.764814F,
|
|
||||||
0.766176F, 0.767544F, 0.768918F, 0.770300F, 0.771688F, 0.773083F, 0.774485F, 0.775894F,
|
|
||||||
0.777309F, 0.778732F, 0.780162F, 0.781599F, 0.783043F, 0.784495F, 0.785953F, 0.787419F,
|
|
||||||
0.788892F, 0.790373F, 0.791861F, 0.793356F, 0.794859F, 0.796370F, 0.797888F, 0.799414F,
|
|
||||||
0.800948F, 0.802489F, 0.804038F, 0.805596F, 0.807161F, 0.808734F, 0.810315F, 0.811904F,
|
|
||||||
0.813502F, 0.815108F, 0.816721F, 0.818344F, 0.819974F, 0.821614F, 0.823261F, 0.824917F,
|
|
||||||
0.826582F, 0.828256F, 0.829938F, 0.831629F, 0.833329F, 0.835038F, 0.836756F, 0.838483F,
|
|
||||||
0.840219F, 0.841964F, 0.843719F, 0.845482F, 0.847256F, 0.849038F, 0.850830F, 0.852632F,
|
|
||||||
0.854444F, 0.856265F, 0.858096F, 0.859937F, 0.861788F, 0.863648F, 0.865519F, 0.867400F,
|
|
||||||
0.869292F, 0.871193F, 0.873105F, 0.875028F, 0.876961F, 0.878905F, 0.880859F, 0.882824F,
|
|
||||||
0.884800F, 0.886787F, 0.888786F, 0.890795F, 0.892815F, 0.894847F, 0.896890F, 0.898945F,
|
|
||||||
0.901011F, 0.903089F, 0.905178F, 0.907279F, 0.909393F, 0.911518F, 0.913655F, 0.915805F,
|
|
||||||
0.917967F, 0.920141F, 0.922328F, 0.924528F, 0.926740F, 0.928965F, 0.931202F, 0.933453F,
|
|
||||||
0.935717F, 0.937994F, 0.940285F, 0.942589F, 0.944906F, 0.947238F, 0.949582F, 0.951941F,
|
|
||||||
0.954314F, 0.956701F, 0.959102F, 0.961518F, 0.963948F, 0.966392F, 0.968851F, 0.971326F,
|
|
||||||
0.973815F, 0.976319F, 0.978838F, 0.981373F, 0.983923F, 0.986489F, 0.989071F, 0.991668F,
|
|
||||||
0.994282F, 0.996911F, 0.999557F, 1.002220F, 1.004899F, 1.007595F, 1.010307F, 1.013037F,
|
|
||||||
1.015784F, 1.018548F, 1.021330F, 1.024129F, 1.026946F, 1.029781F, 1.032635F, 1.035506F,
|
|
||||||
1.038396F, 1.041305F, 1.044233F, 1.047179F, 1.050145F, 1.053130F, 1.056134F, 1.059158F,
|
|
||||||
1.062202F, 1.065266F, 1.068351F, 1.071455F, 1.074581F, 1.077727F, 1.080894F, 1.084083F,
|
|
||||||
1.087293F, 1.090524F, 1.093778F, 1.097053F, 1.100351F, 1.103671F, 1.107014F, 1.110380F,
|
|
||||||
1.113769F, 1.117181F, 1.120618F, 1.124077F, 1.127561F, 1.131070F, 1.134603F, 1.138160F,
|
|
||||||
1.141743F, 1.145351F, 1.148985F, 1.152645F, 1.156330F, 1.160042F, 1.163781F, 1.167547F,
|
|
||||||
1.171340F, 1.175160F, 1.179008F, 1.182885F, 1.186789F, 1.190723F, 1.194685F, 1.198676F,
|
|
||||||
1.202698F, 1.206749F, 1.210830F, 1.214942F, 1.219085F, 1.223259F, 1.227464F, 1.231702F,
|
|
||||||
1.235972F, 1.240274F, 1.244610F, 1.248978F, 1.253381F, 1.257818F, 1.262289F, 1.266795F,
|
|
||||||
1.271336F, 1.275913F, 1.280526F, 1.285176F, 1.289863F, 1.294587F, 1.299348F, 1.304148F,
|
|
||||||
1.308987F, 1.313865F, 1.318782F, 1.323740F, 1.328738F, 1.333777F, 1.338858F, 1.343980F,
|
|
||||||
1.349146F, 1.354354F, 1.359606F, 1.364902F, 1.370242F, 1.375628F, 1.381060F, 1.386537F,
|
|
||||||
1.392062F, 1.397635F, 1.403255F, 1.408924F, 1.414643F, 1.420411F, 1.426230F, 1.432101F,
|
|
||||||
1.438023F, 1.443998F, 1.450026F, 1.456108F, 1.462245F, 1.468437F, 1.474685F, 1.480990F,
|
|
||||||
1.487353F, 1.493775F, 1.500255F, 1.506796F, 1.513397F, 1.520061F, 1.526786F, 1.533575F,
|
|
||||||
1.540429F, 1.547348F, 1.554332F, 1.561384F, 1.568504F, 1.575692F, 1.582951F, 1.590281F,
|
|
||||||
1.597682F, 1.605157F, 1.612705F, 1.620329F, 1.628029F, 1.635807F, 1.643663F, 1.651598F,
|
|
||||||
1.659615F, 1.667714F, 1.675896F, 1.684163F, 1.692516F, 1.700956F, 1.709485F, 1.718104F,
|
|
||||||
1.726814F, 1.735617F, 1.744514F, 1.753508F, 1.762598F, 1.771788F, 1.781078F, 1.790470F,
|
|
||||||
1.799966F, 1.809568F, 1.819277F, 1.829095F, 1.839024F, 1.849066F, 1.859222F, 1.869495F,
|
|
||||||
1.879887F, 1.890399F, 1.901034F, 1.911794F, 1.922681F, 1.933697F, 1.944844F, 1.956126F,
|
|
||||||
1.967544F, 1.979101F, 1.990799F, 2.002640F, 2.014629F, 2.026766F, 2.039056F, 2.051500F,
|
|
||||||
2.064102F, 2.076865F, 2.089791F, 2.102884F, 2.116148F, 2.129585F, 2.143198F, 2.156992F,
|
|
||||||
2.170970F, 2.185135F, 2.199492F, 2.214044F, 2.228794F, 2.243748F, 2.258910F, 2.274283F,
|
|
||||||
2.289872F, 2.305682F, 2.321717F, 2.337982F, 2.354483F, 2.371223F, 2.388209F, 2.405446F,
|
|
||||||
2.422939F, 2.440694F, 2.458717F, 2.477015F, 2.495592F, 2.514456F, 2.533614F, 2.553072F,
|
|
||||||
2.572837F, 2.592917F, 2.613318F, 2.634050F, 2.655119F, 2.676535F, 2.698305F, 2.720439F,
|
|
||||||
2.742945F, 2.765834F, 2.789114F, 2.812796F, 2.836891F, 2.861409F, 2.886361F, 2.911759F,
|
|
||||||
2.937614F, 2.963941F, 2.990750F, 3.018056F, 3.045872F, 3.074214F, 3.103095F, 3.132531F,
|
|
||||||
3.162538F, 3.193134F, 3.224335F, 3.256160F, 3.288627F, 3.321755F, 3.355566F, 3.390081F,
|
|
||||||
3.425320F, 3.461309F, 3.498070F, 3.535629F, 3.574011F, 3.613245F, 3.653358F, 3.694381F,
|
|
||||||
3.736344F, 3.779280F, 3.823224F, 3.868211F, 3.914279F, 3.961467F, 4.009816F, 4.059369F,
|
|
||||||
4.110172F, 4.162272F, 4.215721F, 4.270570F, 4.326876F, 4.384697F, 4.444094F, 4.505134F,
|
|
||||||
4.567885F, 4.632419F, 4.698814F, 4.767152F, 4.837518F, 4.910005F, 4.984708F, 5.061732F,
|
|
||||||
5.141187F, 5.223187F, 5.307859F, 5.395334F, 5.485753F, 5.579268F, 5.676041F, 5.776243F,
|
|
||||||
5.880061F, 5.987694F, 6.099355F, 6.215275F, 6.335701F, 6.460902F, 6.591167F, 6.726808F,
|
|
||||||
6.868167F, 7.015611F, 7.169541F, 7.330395F, 7.498651F, 7.674831F, 7.859508F, 8.053311F,
|
|
||||||
8.256933F, 8.471140F, 8.696777F, 8.934786F, 9.186211F, 9.452218F, 9.734114F, 10.033366F,
|
|
||||||
10.351625F, 10.690763F, 11.052902F, 11.440462F, 11.856219F, 12.303363F, 12.785587F, 13.307186F,
|
|
||||||
13.873188F, 14.489513F, 15.163182F, 15.902588F, 16.717843F, 17.621247F, 18.627913F, 19.756614F,
|
|
||||||
21.030970F, 22.481117F, 24.146120F, 26.077544F, 28.344889F, 31.044135F, 34.311669F, 38.348066F,
|
|
||||||
43.460868F, 50.146880F, 59.264216F, 72.433758F, 93.128825F, 130.380047F, 217.299736F, 651.898673F,
|
|
||||||
0.500001F, 0.500005F, 0.500015F, 0.500029F, 0.500048F, 0.500071F, 0.500099F, 0.500132F,
|
|
||||||
0.500170F, 0.500212F, 0.500260F, 0.500311F, 0.500368F, 0.500429F, 0.500495F, 0.500566F,
|
|
||||||
0.500641F, 0.500722F, 0.500806F, 0.500896F, 0.500991F, 0.501090F, 0.501194F, 0.501302F,
|
|
||||||
0.501416F, 0.501534F, 0.501657F, 0.501785F, 0.501917F, 0.502055F, 0.502197F, 0.502344F,
|
|
||||||
0.502496F, 0.502652F, 0.502814F, 0.502980F, 0.503151F, 0.503327F, 0.503508F, 0.503694F,
|
|
||||||
0.503885F, 0.504080F, 0.504281F, 0.504486F, 0.504696F, 0.504911F, 0.505131F, 0.505357F,
|
|
||||||
0.505587F, 0.505822F, 0.506062F, 0.506307F, 0.506557F, 0.506812F, 0.507072F, 0.507337F,
|
|
||||||
0.507607F, 0.507882F, 0.508162F, 0.508448F, 0.508738F, 0.509034F, 0.509335F, 0.509641F,
|
|
||||||
0.509952F, 0.510268F, 0.510590F, 0.510916F, 0.511248F, 0.511585F, 0.511928F, 0.512276F,
|
|
||||||
0.512629F, 0.512987F, 0.513351F, 0.513720F, 0.514094F, 0.514474F, 0.514859F, 0.515250F,
|
|
||||||
0.515646F, 0.516048F, 0.516455F, 0.516867F, 0.517285F, 0.517709F, 0.518138F, 0.518573F,
|
|
||||||
0.519014F, 0.519460F, 0.519912F, 0.520369F, 0.520832F, 0.521301F, 0.521776F, 0.522256F,
|
|
||||||
0.522742F, 0.523235F, 0.523733F, 0.524236F, 0.524746F, 0.525262F, 0.525784F, 0.526311F,
|
|
||||||
0.526845F, 0.527385F, 0.527930F, 0.528482F, 0.529041F, 0.529605F, 0.530175F, 0.530752F,
|
|
||||||
0.531335F, 0.531924F, 0.532520F, 0.533122F, 0.533730F, 0.534345F, 0.534966F, 0.535594F,
|
|
||||||
0.536228F, 0.536869F, 0.537516F, 0.538170F, 0.538831F, 0.539498F, 0.540172F, 0.540853F,
|
|
||||||
0.541541F, 0.542235F, 0.542937F, 0.543645F, 0.544361F, 0.545083F, 0.545813F, 0.546549F,
|
|
||||||
0.547293F, 0.548044F, 0.548802F, 0.549568F, 0.550341F, 0.551121F, 0.551908F, 0.552704F,
|
|
||||||
0.553506F, 0.554316F, 0.555134F, 0.555959F, 0.556793F, 0.557633F, 0.558482F, 0.559339F,
|
|
||||||
0.560203F, 0.561075F, 0.561956F, 0.562844F, 0.563741F, 0.564646F, 0.565559F, 0.566480F,
|
|
||||||
0.567410F, 0.568348F, 0.569295F, 0.570250F, 0.571214F, 0.572186F, 0.573167F, 0.574157F,
|
|
||||||
0.575156F, 0.576163F, 0.577180F, 0.578206F, 0.579240F, 0.580284F, 0.581338F, 0.582400F,
|
|
||||||
0.583472F, 0.584554F, 0.585644F, 0.586745F, 0.587855F, 0.588975F, 0.590105F, 0.591245F,
|
|
||||||
0.592395F, 0.593555F, 0.594725F, 0.595905F, 0.597095F, 0.598296F, 0.599508F, 0.600730F,
|
|
||||||
0.601963F, 0.603206F, 0.604460F, 0.605726F, 0.607002F, 0.608289F, 0.609588F, 0.610898F,
|
|
||||||
0.612219F, 0.613552F, 0.614897F, 0.616253F, 0.617621F, 0.619001F, 0.620393F, 0.621797F,
|
|
||||||
0.623214F, 0.624643F, 0.626084F, 0.627538F, 0.629004F, 0.630484F, 0.631976F, 0.633481F,
|
|
||||||
0.635000F, 0.636532F, 0.638077F, 0.639636F, 0.641208F, 0.642795F, 0.644395F, 0.646009F,
|
|
||||||
0.647638F, 0.649281F, 0.650938F, 0.652610F, 0.654297F, 0.655999F, 0.657716F, 0.659448F,
|
|
||||||
0.661195F, 0.662959F, 0.664737F, 0.666532F, 0.668343F, 0.670169F, 0.672013F, 0.673872F,
|
|
||||||
0.675749F, 0.677642F, 0.679552F, 0.681480F, 0.683425F, 0.685387F, 0.687368F, 0.689366F,
|
|
||||||
0.691383F, 0.693418F, 0.695471F, 0.697543F, 0.699635F, 0.701745F, 0.703875F, 0.706025F,
|
|
||||||
0.708194F, 0.710383F, 0.712593F, 0.714824F, 0.717075F, 0.719347F, 0.721640F, 0.723955F,
|
|
||||||
0.726292F, 0.728650F, 0.731031F, 0.733435F, 0.735861F, 0.738310F, 0.740783F, 0.743279F,
|
|
||||||
0.745799F, 0.748344F, 0.750913F, 0.753507F, 0.756126F, 0.758770F, 0.761440F, 0.764136F,
|
|
||||||
0.766859F, 0.769608F, 0.772385F, 0.775188F, 0.778020F, 0.780880F, 0.783768F, 0.786685F,
|
|
||||||
0.789632F, 0.792608F, 0.795614F, 0.798650F, 0.801717F, 0.804816F, 0.807946F, 0.811109F,
|
|
||||||
0.814304F, 0.817532F, 0.820793F, 0.824088F, 0.827418F, 0.830782F, 0.834182F, 0.837618F,
|
|
||||||
0.841090F, 0.844599F, 0.848146F, 0.851730F, 0.855353F, 0.859015F, 0.862717F, 0.866459F,
|
|
||||||
0.870241F, 0.874065F, 0.877931F, 0.881840F, 0.885793F, 0.889789F, 0.893830F, 0.897916F,
|
|
||||||
0.902048F, 0.906227F, 0.910454F, 0.914729F, 0.919053F, 0.923426F, 0.927851F, 0.932326F,
|
|
||||||
0.936854F, 0.941435F, 0.946070F, 0.950760F, 0.955506F, 0.960308F, 0.965168F, 0.970087F,
|
|
||||||
0.975065F, 0.980104F, 0.985204F, 0.990367F, 0.995595F, 1.000887F, 1.006245F, 1.011670F,
|
|
||||||
1.017164F, 1.022727F, 1.028362F, 1.034068F, 1.039848F, 1.045703F, 1.051635F, 1.057644F,
|
|
||||||
1.063732F, 1.069900F, 1.076151F, 1.082486F, 1.088906F, 1.095413F, 1.102008F, 1.108694F,
|
|
||||||
1.115472F, 1.122344F, 1.129313F, 1.136378F, 1.143544F, 1.150812F, 1.158183F, 1.165661F,
|
|
||||||
1.173247F, 1.180943F, 1.188752F, 1.196677F, 1.204719F, 1.212882F, 1.221168F, 1.229579F,
|
|
||||||
1.238119F, 1.246790F, 1.255595F, 1.264538F, 1.273620F, 1.282847F, 1.292220F, 1.301744F,
|
|
||||||
1.311421F, 1.321256F, 1.331252F, 1.341414F, 1.351744F, 1.362248F, 1.372929F, 1.383793F,
|
|
||||||
1.394842F, 1.406083F, 1.417521F, 1.429159F, 1.441004F, 1.453060F, 1.465334F, 1.477831F,
|
|
||||||
1.490557F, 1.503518F, 1.516721F, 1.530173F, 1.543880F, 1.557850F, 1.572089F, 1.586607F,
|
|
||||||
1.601410F, 1.616508F, 1.631908F, 1.647620F, 1.663654F, 1.680019F, 1.696725F, 1.713783F,
|
|
||||||
1.731204F, 1.748999F, 1.767181F, 1.785761F, 1.804754F, 1.824172F, 1.844031F, 1.864344F,
|
|
||||||
1.885128F, 1.906398F, 1.928172F, 1.950468F, 1.973305F, 1.996701F, 2.020679F, 2.045258F,
|
|
||||||
2.070463F, 2.096317F, 2.122844F, 2.150072F, 2.178029F, 2.206743F, 2.236246F, 2.266570F,
|
|
||||||
2.297749F, 2.329820F, 2.362822F, 2.396796F, 2.431783F, 2.467831F, 2.504988F, 2.543305F,
|
|
||||||
2.582837F, 2.623642F, 2.665783F, 2.709326F, 2.754341F, 2.800904F, 2.849096F, 2.899003F,
|
|
||||||
2.950718F, 3.004340F, 3.059976F, 3.117742F, 3.177762F, 3.240168F, 3.305107F, 3.372734F,
|
|
||||||
3.443220F, 3.516748F, 3.593520F, 3.673754F, 3.757688F, 3.845585F, 3.937730F, 4.034439F,
|
|
||||||
4.136057F, 4.242967F, 4.355593F, 4.474405F, 4.599924F, 4.732735F, 4.873491F, 5.022924F,
|
|
||||||
5.181861F, 5.351237F, 5.532114F, 5.725702F, 5.933388F, 6.156768F, 6.397687F, 6.658295F,
|
|
||||||
6.941104F, 7.249074F, 7.585716F, 7.955227F, 8.362662F, 8.814173F, 9.317313F, 9.881472F,
|
|
||||||
10.518458F, 11.243340F, 12.075649F, 13.041169F, 14.174650F, 15.524081F, 17.157657F, 19.175663F,
|
|
||||||
21.731872F, 25.074687F, 29.633163F, 36.217742F, 46.565084F, 65.190503F, 108.650157F, 325.949442F,
|
|
||||||
0.500002F, 0.500021F, 0.500059F, 0.500115F, 0.500191F, 0.500285F, 0.500398F, 0.500530F,
|
|
||||||
0.500681F, 0.500851F, 0.501040F, 0.501247F, 0.501474F, 0.501720F, 0.501986F, 0.502270F,
|
|
||||||
0.502574F, 0.502896F, 0.503239F, 0.503601F, 0.503982F, 0.504383F, 0.504803F, 0.505243F,
|
|
||||||
0.505703F, 0.506183F, 0.506683F, 0.507204F, 0.507744F, 0.508304F, 0.508885F, 0.509487F,
|
|
||||||
0.510109F, 0.510752F, 0.511416F, 0.512101F, 0.512807F, 0.513535F, 0.514283F, 0.515054F,
|
|
||||||
0.515846F, 0.516660F, 0.517497F, 0.518355F, 0.519236F, 0.520140F, 0.521066F, 0.522015F,
|
|
||||||
0.522988F, 0.523984F, 0.525003F, 0.526047F, 0.527114F, 0.528206F, 0.529322F, 0.530463F,
|
|
||||||
0.531629F, 0.532820F, 0.534036F, 0.535279F, 0.536547F, 0.537842F, 0.539163F, 0.540512F,
|
|
||||||
0.541887F, 0.543290F, 0.544721F, 0.546180F, 0.547668F, 0.549184F, 0.550730F, 0.552305F,
|
|
||||||
0.553910F, 0.555546F, 0.557212F, 0.558909F, 0.560638F, 0.562399F, 0.564192F, 0.566019F,
|
|
||||||
0.567878F, 0.569771F, 0.571699F, 0.573661F, 0.575658F, 0.577692F, 0.579761F, 0.581868F,
|
|
||||||
0.584012F, 0.586194F, 0.588414F, 0.590674F, 0.592973F, 0.595313F, 0.597695F, 0.600118F,
|
|
||||||
0.602583F, 0.605092F, 0.607644F, 0.610242F, 0.612884F, 0.615574F, 0.618310F, 0.621094F,
|
|
||||||
0.623927F, 0.626809F, 0.629742F, 0.632727F, 0.635764F, 0.638855F, 0.642000F, 0.645200F,
|
|
||||||
0.648458F, 0.651772F, 0.655146F, 0.658580F, 0.662075F, 0.665633F, 0.669254F, 0.672940F,
|
|
||||||
0.676693F, 0.680514F, 0.684404F, 0.688365F, 0.692398F, 0.696505F, 0.700688F, 0.704947F,
|
|
||||||
0.709286F, 0.713706F, 0.718208F, 0.722795F, 0.727468F, 0.732230F, 0.737083F, 0.742028F,
|
|
||||||
0.747069F, 0.752207F, 0.757445F, 0.762785F, 0.768230F, 0.773783F, 0.779446F, 0.785223F,
|
|
||||||
0.791116F, 0.797128F, 0.803263F, 0.809523F, 0.815913F, 0.822436F, 0.829096F, 0.835896F,
|
|
||||||
0.842840F, 0.849933F, 0.857179F, 0.864583F, 0.872148F, 0.879881F, 0.887785F, 0.895867F,
|
|
||||||
0.904132F, 0.912585F, 0.921233F, 0.930082F, 0.939138F, 0.948408F, 0.957900F, 0.967620F,
|
|
||||||
0.977577F, 0.987778F, 0.998232F, 1.008949F, 1.019937F, 1.031206F, 1.042766F, 1.054629F,
|
|
||||||
1.066806F, 1.079308F, 1.092148F, 1.105340F, 1.118897F, 1.132833F, 1.147165F, 1.161909F,
|
|
||||||
1.177081F, 1.192700F, 1.208786F, 1.225358F, 1.242438F, 1.260049F, 1.278215F, 1.296963F,
|
|
||||||
1.316319F, 1.336312F, 1.356974F, 1.378338F, 1.400439F, 1.423314F, 1.447005F, 1.471554F,
|
|
||||||
1.497008F, 1.523416F, 1.550832F, 1.579313F, 1.608922F, 1.639725F, 1.671794F, 1.705209F,
|
|
||||||
1.740054F, 1.776420F, 1.814409F, 1.854130F, 1.895701F, 1.939254F, 1.984932F, 2.032892F,
|
|
||||||
2.083307F, 2.136369F, 2.192289F, 2.251303F, 2.313671F, 2.379685F, 2.449672F, 2.523998F,
|
|
||||||
2.603077F, 2.687375F, 2.777424F, 2.873830F, 2.977284F, 3.088586F, 3.208658F, 3.338574F,
|
|
||||||
3.479591F, 3.633190F, 3.801124F, 3.985493F, 4.188825F, 4.414194F, 4.665379F, 4.947073F,
|
|
||||||
5.265181F, 5.627237F, 6.043007F, 6.525382F, 7.091739F, 7.766070F, 8.582473F, 9.591092F,
|
|
||||||
10.868813F, 12.539837F, 14.818691F, 18.110597F, 23.283884F, 32.596211F, 54.325654F, 162.974915F,
|
|
||||||
0.500009F, 0.500085F, 0.500235F, 0.500462F, 0.500763F, 0.501141F, 0.501595F, 0.502125F,
|
|
||||||
0.502733F, 0.503417F, 0.504180F, 0.505021F, 0.505941F, 0.506941F, 0.508022F, 0.509184F,
|
|
||||||
0.510428F, 0.511756F, 0.513168F, 0.514666F, 0.516250F, 0.517923F, 0.519685F, 0.521538F,
|
|
||||||
0.523483F, 0.525522F, 0.527657F, 0.529889F, 0.532221F, 0.534654F, 0.537191F, 0.539834F,
|
|
||||||
0.542585F, 0.545447F, 0.548422F, 0.551514F, 0.554724F, 0.558057F, 0.561515F, 0.565101F,
|
|
||||||
0.568820F, 0.572675F, 0.576671F, 0.580810F, 0.585098F, 0.589539F, 0.594138F, 0.598901F,
|
|
||||||
0.603832F, 0.608937F, 0.614223F, 0.619696F, 0.625362F, 0.631228F, 0.637303F, 0.643593F,
|
|
||||||
0.650108F, 0.656856F, 0.663846F, 0.671089F, 0.678595F, 0.686375F, 0.694442F, 0.702808F,
|
|
||||||
0.711486F, 0.720491F, 0.729838F, 0.739544F, 0.749625F, 0.760102F, 0.770993F, 0.782320F,
|
|
||||||
0.794107F, 0.806377F, 0.819158F, 0.832478F, 0.846368F, 0.860861F, 0.875993F, 0.891804F,
|
|
||||||
0.908335F, 0.925632F, 0.943746F, 0.962731F, 0.982646F, 1.003557F, 1.025536F, 1.048659F,
|
|
||||||
1.073015F, 1.098699F, 1.125816F, 1.154484F, 1.184833F, 1.217009F, 1.251175F, 1.287515F,
|
|
||||||
1.326234F, 1.367566F, 1.411777F, 1.459169F, 1.510089F, 1.564935F, 1.624170F, 1.688329F,
|
|
||||||
1.758041F, 1.834046F, 1.917221F, 2.008616F, 2.109495F, 2.221394F, 2.346203F, 2.486268F,
|
|
||||||
2.644542F, 2.824791F, 3.031899F, 3.272312F, 3.554715F, 3.891108F, 4.298538F, 4.802076F,
|
|
||||||
5.440166F, 6.274908F, 7.413567F, 9.058751F, 11.644627F, 16.300023F, 27.163978F, 81.487842F,
|
|
||||||
0.500038F, 0.500339F, 0.500943F, 0.501851F, 0.503065F, 0.504590F, 0.506431F, 0.508592F,
|
|
||||||
0.511082F, 0.513906F, 0.517076F, 0.520600F, 0.524491F, 0.528761F, 0.533425F, 0.538499F,
|
|
||||||
0.544002F, 0.549953F, 0.556375F, 0.563292F, 0.570731F, 0.578722F, 0.587299F, 0.596499F,
|
|
||||||
0.606362F, 0.616936F, 0.628269F, 0.640420F, 0.653452F, 0.667435F, 0.682450F, 0.698587F,
|
|
||||||
0.715946F, 0.734645F, 0.754813F, 0.776601F, 0.800180F, 0.825749F, 0.853537F, 0.883811F,
|
|
||||||
0.916884F, 0.953126F, 0.992973F, 1.036949F, 1.085685F, 1.139949F, 1.200683F, 1.269061F,
|
|
||||||
1.346558F, 1.435055F, 1.536994F, 1.655597F, 1.795205F, 1.961818F, 2.163958F, 2.414160F,
|
|
||||||
2.731645F, 3.147462F, 3.715243F, 4.536291F, 5.827688F, 8.153849F, 13.584290F, 40.744688F,
|
|
||||||
0.500151F, 0.501358F, 0.503789F, 0.507471F, 0.512451F, 0.518793F, 0.526577F, 0.535910F,
|
|
||||||
0.546920F, 0.559770F, 0.574655F, 0.591819F, 0.611557F, 0.634239F, 0.660320F, 0.690372F,
|
|
||||||
0.725121F, 0.765494F, 0.812702F, 0.868345F, 0.934584F, 1.014408F, 1.112072F, 1.233833F,
|
|
||||||
1.389294F, 1.593972F, 1.874676F, 2.282050F, 2.924628F, 4.084611F, 6.796751F, 20.373878F,
|
|
||||||
0.500603F, 0.505471F, 0.515447F, 0.531043F, 0.553104F, 0.582935F, 0.622504F, 0.674808F,
|
|
||||||
0.744536F, 0.839350F, 0.972568F, 1.169440F, 1.484165F, 2.057781F, 3.407608F, 10.190008F,
|
|
||||||
0.502419F, 0.522499F, 0.566944F, 0.646822F, 0.788155F, 1.060678F, 1.722447F, 5.101149F,
|
|
||||||
0.509796F, 0.601345F, 0.899976F, 2.562915F, 0.541196F, 1.306563F, 0.707107F, 0.000000F
|
|
||||||
} ;
|
|
||||||
|
|
||||||
static const float CosTable_256 [256] =
|
|
||||||
{
|
|
||||||
0.500009F, 0.500085F, 0.500235F, 0.500462F, 0.500763F, 0.501141F, 0.501595F, 0.502125F,
|
|
||||||
0.502733F, 0.503417F, 0.504180F, 0.505021F, 0.505941F, 0.506941F, 0.508022F, 0.509184F,
|
|
||||||
0.510428F, 0.511756F, 0.513168F, 0.514666F, 0.516250F, 0.517923F, 0.519685F, 0.521538F,
|
|
||||||
0.523483F, 0.525522F, 0.527657F, 0.529889F, 0.532221F, 0.534654F, 0.537191F, 0.539834F,
|
|
||||||
0.542585F, 0.545447F, 0.548422F, 0.551514F, 0.554724F, 0.558057F, 0.561515F, 0.565101F,
|
|
||||||
0.568820F, 0.572675F, 0.576671F, 0.580810F, 0.585098F, 0.589539F, 0.594138F, 0.598901F,
|
|
||||||
0.603832F, 0.608937F, 0.614223F, 0.619696F, 0.625362F, 0.631228F, 0.637303F, 0.643593F,
|
|
||||||
0.650108F, 0.656856F, 0.663846F, 0.671089F, 0.678595F, 0.686375F, 0.694442F, 0.702808F,
|
|
||||||
0.711486F, 0.720491F, 0.729838F, 0.739544F, 0.749625F, 0.760102F, 0.770993F, 0.782320F,
|
|
||||||
0.794107F, 0.806377F, 0.819158F, 0.832478F, 0.846368F, 0.860861F, 0.875993F, 0.891804F,
|
|
||||||
0.908335F, 0.925632F, 0.943746F, 0.962731F, 0.982646F, 1.003557F, 1.025536F, 1.048659F,
|
|
||||||
1.073015F, 1.098699F, 1.125816F, 1.154484F, 1.184833F, 1.217009F, 1.251175F, 1.287515F,
|
|
||||||
1.326234F, 1.367566F, 1.411777F, 1.459169F, 1.510089F, 1.564935F, 1.624170F, 1.688329F,
|
|
||||||
1.758041F, 1.834046F, 1.917221F, 2.008616F, 2.109495F, 2.221394F, 2.346203F, 2.486268F,
|
|
||||||
2.644542F, 2.824791F, 3.031899F, 3.272312F, 3.554715F, 3.891108F, 4.298538F, 4.802076F,
|
|
||||||
5.440166F, 6.274908F, 7.413567F, 9.058751F, 11.644627F, 16.300023F, 27.163978F, 81.487842F,
|
|
||||||
0.500038F, 0.500339F, 0.500943F, 0.501851F, 0.503065F, 0.504590F, 0.506431F, 0.508592F,
|
|
||||||
0.511082F, 0.513906F, 0.517076F, 0.520600F, 0.524491F, 0.528761F, 0.533425F, 0.538499F,
|
|
||||||
0.544002F, 0.549953F, 0.556375F, 0.563292F, 0.570731F, 0.578722F, 0.587299F, 0.596499F,
|
|
||||||
0.606362F, 0.616936F, 0.628269F, 0.640420F, 0.653452F, 0.667435F, 0.682450F, 0.698587F,
|
|
||||||
0.715946F, 0.734645F, 0.754813F, 0.776601F, 0.800180F, 0.825749F, 0.853537F, 0.883811F,
|
|
||||||
0.916884F, 0.953126F, 0.992973F, 1.036949F, 1.085685F, 1.139949F, 1.200683F, 1.269061F,
|
|
||||||
1.346558F, 1.435055F, 1.536994F, 1.655597F, 1.795205F, 1.961818F, 2.163958F, 2.414160F,
|
|
||||||
2.731645F, 3.147462F, 3.715243F, 4.536291F, 5.827688F, 8.153849F, 13.584290F, 40.744688F,
|
|
||||||
0.500151F, 0.501358F, 0.503789F, 0.507471F, 0.512451F, 0.518793F, 0.526577F, 0.535910F,
|
|
||||||
0.546920F, 0.559770F, 0.574655F, 0.591819F, 0.611557F, 0.634239F, 0.660320F, 0.690372F,
|
|
||||||
0.725121F, 0.765494F, 0.812702F, 0.868345F, 0.934584F, 1.014408F, 1.112072F, 1.233833F,
|
|
||||||
1.389294F, 1.593972F, 1.874676F, 2.282050F, 2.924628F, 4.084611F, 6.796751F, 20.373878F,
|
|
||||||
0.500603F, 0.505471F, 0.515447F, 0.531043F, 0.553104F, 0.582935F, 0.622504F, 0.674808F,
|
|
||||||
0.744536F, 0.839350F, 0.972568F, 1.169440F, 1.484165F, 2.057781F, 3.407608F, 10.190008F,
|
|
||||||
0.502419F, 0.522499F, 0.566944F, 0.646822F, 0.788155F, 1.060678F, 1.722447F, 5.101149F,
|
|
||||||
0.509796F, 0.601345F, 0.899976F, 2.562915F, 0.541196F, 1.306563F, 0.707107F, 0.000000F
|
|
||||||
} ;
|
|
||||||
|
|
||||||
void CBlock::Dct16 (float vec [], const float cosTerms [])
|
|
||||||
{
|
|
||||||
float tmp_e0, tmp_e1, tmp_e2, tmp_e3, tmp_e4, tmp_e5, tmp_e6, tmp_e7 ;
|
|
||||||
float tmp_o0, tmp_o1, tmp_o2, tmp_o3, tmp_o4, tmp_o5, tmp_o6, tmp_o7 ;
|
|
||||||
|
|
||||||
tmp_e0 = vec [0] + vec [15] ;
|
|
||||||
tmp_e1 = vec [1] + vec [14] ;
|
|
||||||
tmp_e2 = vec [2] + vec [13] ;
|
|
||||||
tmp_e3 = vec [3] + vec [12] ;
|
|
||||||
tmp_e4 = vec [4] + vec [11] ;
|
|
||||||
tmp_e5 = vec [5] + vec [10] ;
|
|
||||||
tmp_e6 = vec [6] + vec [9] ;
|
|
||||||
tmp_e7 = vec [7] + vec [8] ;
|
|
||||||
|
|
||||||
tmp_o0 = (vec [0] - vec [15]) * cosTerms [0] ;
|
|
||||||
tmp_o1 = (vec [1] - vec [14]) * cosTerms [1] ;
|
|
||||||
tmp_o2 = (vec [2] - vec [13]) * cosTerms [2] ;
|
|
||||||
tmp_o3 = (vec [3] - vec [12]) * cosTerms [3] ;
|
|
||||||
tmp_o4 = (vec [4] - vec [11]) * cosTerms [4] ;
|
|
||||||
tmp_o5 = (vec [5] - vec [10]) * cosTerms [5] ;
|
|
||||||
tmp_o6 = (vec [6] - vec [9]) * cosTerms [6] ;
|
|
||||||
tmp_o7 = (vec [7] - vec [8]) * cosTerms [7] ;
|
|
||||||
|
|
||||||
// dct8 (tmp_e, cosTerms + 8) ;
|
|
||||||
|
|
||||||
float itmp_e0, itmp_e1, itmp_e2, itmp_e3 ;
|
|
||||||
float itmp_o0, itmp_o1, itmp_o2, itmp_o3 ;
|
|
||||||
|
|
||||||
itmp_e0 = tmp_e0 + tmp_e7 ;
|
|
||||||
itmp_e1 = tmp_e1 + tmp_e6 ;
|
|
||||||
itmp_e2 = tmp_e2 + tmp_e5 ;
|
|
||||||
itmp_e3 = tmp_e3 + tmp_e4 ;
|
|
||||||
|
|
||||||
itmp_o0 = (tmp_e0 - tmp_e7) * cosTerms [8] ;
|
|
||||||
itmp_o1 = (tmp_e1 - tmp_e6) * cosTerms [9] ;
|
|
||||||
itmp_o2 = (tmp_e2 - tmp_e5) * cosTerms [10] ;
|
|
||||||
itmp_o3 = (tmp_e3 - tmp_e4) * cosTerms [11] ;
|
|
||||||
|
|
||||||
float cosTerms12 = cosTerms [12] ;
|
|
||||||
float cosTerms13 = cosTerms [13] ;
|
|
||||||
float cosTerms14 = cosTerms [14] ;
|
|
||||||
|
|
||||||
// even part
|
|
||||||
|
|
||||||
float tmp0, tmp1, tmp2, tmp3 ;
|
|
||||||
|
|
||||||
tmp0 = itmp_e0 + itmp_e3 ;
|
|
||||||
tmp1 = (itmp_e0 - itmp_e3) * cosTerms12 ;
|
|
||||||
tmp2 = itmp_e1 + itmp_e2 ;
|
|
||||||
tmp3 = (itmp_e1 - itmp_e2) * cosTerms13 ;
|
|
||||||
|
|
||||||
vec [0] = tmp0 + tmp2 ;
|
|
||||||
vec [4] = tmp1 + tmp3;
|
|
||||||
vec [12] = (tmp1 - tmp3) * cosTerms14 ;
|
|
||||||
vec [8] = (tmp0 - tmp2) * cosTerms14 ;
|
|
||||||
vec [4] += vec [12] ;
|
|
||||||
|
|
||||||
// odd part
|
|
||||||
|
|
||||||
tmp0 = itmp_o0 + itmp_o3 ;
|
|
||||||
tmp2 = itmp_o1 + itmp_o2 ;
|
|
||||||
tmp1 = (itmp_o0 - itmp_o3) * cosTerms12 ;
|
|
||||||
tmp3 = (itmp_o1 - itmp_o2) * cosTerms13 ;
|
|
||||||
|
|
||||||
itmp_o0 = tmp0 + tmp2 ;
|
|
||||||
itmp_o1 = tmp1 + tmp3;
|
|
||||||
itmp_o3 = (tmp1 - tmp3) * cosTerms14 ;
|
|
||||||
itmp_o2 = (tmp0 - tmp2) * cosTerms14 ;
|
|
||||||
itmp_o1 += itmp_o3 ;
|
|
||||||
|
|
||||||
vec [2] = itmp_o0 + itmp_o1 ;
|
|
||||||
vec [6] = itmp_o1 + itmp_o2 ;
|
|
||||||
vec [10] = itmp_o2 + itmp_o3 ;
|
|
||||||
vec [14] = itmp_o3 ;
|
|
||||||
|
|
||||||
// dct8 (tmp_o, cosTerms + 8) ;
|
|
||||||
|
|
||||||
itmp_e0 = tmp_o0 + tmp_o7 ;
|
|
||||||
itmp_e1 = tmp_o1 + tmp_o6 ;
|
|
||||||
itmp_e2 = tmp_o2 + tmp_o5 ;
|
|
||||||
itmp_e3 = tmp_o3 + tmp_o4 ;
|
|
||||||
|
|
||||||
itmp_o0 = (tmp_o0 - tmp_o7) * cosTerms [8] ;
|
|
||||||
itmp_o1 = (tmp_o1 - tmp_o6) * cosTerms [9] ;
|
|
||||||
itmp_o2 = (tmp_o2 - tmp_o5) * cosTerms [10] ;
|
|
||||||
itmp_o3 = (tmp_o3 - tmp_o4) * cosTerms [11] ;
|
|
||||||
|
|
||||||
// even part
|
|
||||||
|
|
||||||
tmp0 = itmp_e0 + itmp_e3 ;
|
|
||||||
tmp1 = (itmp_e0 - itmp_e3) * cosTerms12 ;
|
|
||||||
tmp2 = itmp_e1 + itmp_e2 ;
|
|
||||||
tmp3 = (itmp_e1 - itmp_e2) * cosTerms13 ;
|
|
||||||
|
|
||||||
tmp_o0 = tmp0 + tmp2 ;
|
|
||||||
tmp_o2 = tmp1 + tmp3;
|
|
||||||
tmp_o6 = (tmp1 - tmp3) * cosTerms14 ;
|
|
||||||
tmp_o4 = (tmp0 - tmp2) * cosTerms14 ;
|
|
||||||
tmp_o2 += tmp_o6 ;
|
|
||||||
|
|
||||||
// odd part
|
|
||||||
|
|
||||||
tmp0 = itmp_o0 + itmp_o3 ;
|
|
||||||
tmp2 = itmp_o1 + itmp_o2 ;
|
|
||||||
tmp1 = (itmp_o0 - itmp_o3) * cosTerms12 ;
|
|
||||||
tmp3 = (itmp_o1 - itmp_o2) * cosTerms13 ;
|
|
||||||
|
|
||||||
itmp_o0 = tmp0 + tmp2 ;
|
|
||||||
itmp_o1 = tmp1 + tmp3;
|
|
||||||
itmp_o3 = (tmp1 - tmp3) * cosTerms14 ;
|
|
||||||
itmp_o2 = (tmp0 - tmp2) * cosTerms14 ;
|
|
||||||
itmp_o1 += itmp_o3 ;
|
|
||||||
|
|
||||||
tmp_o1 = itmp_o0 + itmp_o1 ;
|
|
||||||
tmp_o3 = itmp_o1 + itmp_o2 ;
|
|
||||||
tmp_o5 = itmp_o2 + itmp_o3 ;
|
|
||||||
|
|
||||||
vec [1] = tmp_o0 + tmp_o1 ;
|
|
||||||
vec [3] = tmp_o1 + tmp_o2 ;
|
|
||||||
vec [5] = tmp_o2 + tmp_o3 ;
|
|
||||||
vec [7] = tmp_o3 + tmp_o4 ;
|
|
||||||
vec [9] = tmp_o4 + tmp_o5 ;
|
|
||||||
vec [11] = tmp_o5 + tmp_o6 ;
|
|
||||||
vec [13] = tmp_o6 + itmp_o3 ;
|
|
||||||
vec [15] = itmp_o3 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBlock::Dct128 (float vec [], const float cosTerms [])
|
|
||||||
{
|
|
||||||
float tmp_e4 [64], tmp_o4 [64] ;
|
|
||||||
float tmp_e5 [32], tmp_o5 [32] ;
|
|
||||||
float tmp_e6 [16], tmp_o6 [16] ;
|
|
||||||
|
|
||||||
Split (vec, tmp_e4, tmp_o4, cosTerms, 128) ;
|
|
||||||
Split (tmp_e4, tmp_e5, tmp_o5, cosTerms + 64, 64) ;
|
|
||||||
Split (tmp_e5, tmp_e6, tmp_o6, cosTerms + 96, 32) ;
|
|
||||||
|
|
||||||
Dct16 (tmp_e6, cosTerms + 112) ; // Even Terms
|
|
||||||
Dct16 (tmp_o6, cosTerms + 112) ; // Odd Terms
|
|
||||||
|
|
||||||
Merge (tmp_e5, tmp_e6, tmp_o6, 32) ;
|
|
||||||
Split (tmp_o5, tmp_e6, tmp_o6, cosTerms + 96, 32) ;
|
|
||||||
|
|
||||||
Dct16 (tmp_e6, cosTerms + 112) ; // Even Terms
|
|
||||||
Dct16 (tmp_o6, cosTerms + 112) ; // Odd Terms
|
|
||||||
|
|
||||||
Merge (tmp_o5, tmp_e6, tmp_o6, 32) ;
|
|
||||||
Merge (tmp_e4, tmp_e5, tmp_o5, 64) ;
|
|
||||||
|
|
||||||
Split (tmp_o4, tmp_e5, tmp_o5, cosTerms + 64, 64) ;
|
|
||||||
Split (tmp_e5, tmp_e6, tmp_o6, cosTerms + 96, 32) ;
|
|
||||||
|
|
||||||
Dct16 (tmp_e6, cosTerms + 112) ; // Even Terms
|
|
||||||
Dct16 (tmp_o6, cosTerms + 112) ; // Odd Terms
|
|
||||||
|
|
||||||
Merge (tmp_e5, tmp_e6, tmp_o6, 32) ;
|
|
||||||
Split (tmp_o5, tmp_e6, tmp_o6, cosTerms + 96, 32) ;
|
|
||||||
|
|
||||||
Dct16 (tmp_e6, cosTerms + 112) ; // Even Terms
|
|
||||||
Dct16 (tmp_o6, cosTerms + 112) ; // Odd Terms
|
|
||||||
|
|
||||||
Merge (tmp_o5, tmp_e6, tmp_o6, 32) ;
|
|
||||||
Merge (tmp_o4, tmp_e5, tmp_o5, 64) ;
|
|
||||||
Merge (vec, tmp_e4, tmp_o4, 128) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBlock::Dct1024 (float vec [], const float cosTerms [])
|
|
||||||
{
|
|
||||||
float tmp_e0 [512], tmp_o0 [512] ;
|
|
||||||
float tmp_e1 [256], tmp_o1 [256] ;
|
|
||||||
float tmp_e2 [128], tmp_o2 [128] ;
|
|
||||||
|
|
||||||
Split (vec, tmp_e0, tmp_o0, cosTerms, 1024) ;
|
|
||||||
Split (tmp_e0, tmp_e1, tmp_o1, cosTerms + 512, 512) ;
|
|
||||||
Split (tmp_e1, tmp_e2, tmp_o2, cosTerms + 768, 256) ;
|
|
||||||
|
|
||||||
Dct128 (tmp_e2, cosTerms + 896) ; // Even Terms
|
|
||||||
Dct128 (tmp_o2, cosTerms + 896) ; // Odd Terms
|
|
||||||
|
|
||||||
Merge (tmp_e1, tmp_e2, tmp_o2, 256) ;
|
|
||||||
Split (tmp_o1, tmp_e2, tmp_o2, cosTerms + 768, 256) ;
|
|
||||||
|
|
||||||
Dct128 (tmp_e2, cosTerms + 896) ; // Even Terms
|
|
||||||
Dct128 (tmp_o2, cosTerms + 896) ; // Odd Terms
|
|
||||||
|
|
||||||
Merge (tmp_o1, tmp_e2, tmp_o2, 256) ;
|
|
||||||
Merge (tmp_e0, tmp_e1, tmp_o1, 512) ;
|
|
||||||
|
|
||||||
Split (tmp_o0, tmp_e1, tmp_o1, cosTerms + 512, 512) ;
|
|
||||||
Split (tmp_e1, tmp_e2, tmp_o2, cosTerms + 768, 256) ;
|
|
||||||
|
|
||||||
Dct128 (tmp_e2, cosTerms + 896) ; // Even Terms
|
|
||||||
Dct128 (tmp_o2, cosTerms + 896) ; // Odd Terms
|
|
||||||
|
|
||||||
Merge (tmp_e1, tmp_e2, tmp_o2, 256) ;
|
|
||||||
Split (tmp_o1, tmp_e2, tmp_o2, cosTerms + 768, 256) ;
|
|
||||||
|
|
||||||
Dct128 (tmp_e2, cosTerms + 896) ; // Even Terms
|
|
||||||
Dct128 (tmp_o2, cosTerms + 896) ; // Odd Terms
|
|
||||||
|
|
||||||
Merge (tmp_o1, tmp_e2, tmp_o2, 256) ;
|
|
||||||
Merge (tmp_o0, tmp_e1, tmp_o1, 512) ;
|
|
||||||
Merge (vec, tmp_e0, tmp_o0, 1024) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLongBlock::InverseTransform (float data [])
|
|
||||||
{
|
|
||||||
const int N = 2048 ;
|
|
||||||
|
|
||||||
float tmp_out [N / 2] ;
|
|
||||||
|
|
||||||
int i ;
|
|
||||||
|
|
||||||
for (i = 0 ; i < N / 2 ; i++)
|
|
||||||
{
|
|
||||||
tmp_out [i] = (data [i] * (2.0F / N))* CosTable_2048 [i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
Dct1024 (tmp_out, &CosTable_2048 [N / 2]) ;
|
|
||||||
|
|
||||||
for (i = 0 ; i < N / 2 - 1 ; i++)
|
|
||||||
{
|
|
||||||
tmp_out [i] += tmp_out [i + 1] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0 ; i < N / 4 ; i++)
|
|
||||||
{
|
|
||||||
data [i] = tmp_out [N / 4 + i] ;
|
|
||||||
data [N / 2 - i - 1] = -tmp_out [N / 4 + i] ;
|
|
||||||
data [N / 2 + N / 4 + i] = -tmp_out [i] ;
|
|
||||||
data [N / 2 + N / 4 - i - 1] = -tmp_out [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CShortBlock::InverseTransform (float data [])
|
|
||||||
{
|
|
||||||
const int N = 256 ;
|
|
||||||
|
|
||||||
float tmp_out [N / 2] ;
|
|
||||||
|
|
||||||
int i ;
|
|
||||||
|
|
||||||
for (i = 0 ; i < N / 2 ; i++)
|
|
||||||
{
|
|
||||||
tmp_out [i] = (data [i] * (2.0F / N)) * CosTable_256 [i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
Dct128 (tmp_out, &CosTable_256 [N / 2]) ;
|
|
||||||
|
|
||||||
for (i = 0 ; i < N / 2 - 1 ; i++)
|
|
||||||
{
|
|
||||||
tmp_out [i] += tmp_out [i + 1] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0 ; i < N / 4 ; i++)
|
|
||||||
{
|
|
||||||
data [i] = tmp_out [N / 4 + i] ;
|
|
||||||
data [N / 2 - i - 1] = -tmp_out [N / 4 + i] ;
|
|
||||||
data [N / 2 + N / 4 + i] = -tmp_out [i] ;
|
|
||||||
data [N / 2 + N / 4 - i -1] = -tmp_out [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined (WIN32) && defined (_M_IX86)
|
|
||||||
#pragma message (__FILE__": using x86 inline assembler")
|
|
||||||
|
|
||||||
void CBlock::Split (const float vector [], float tmp_e [], float tmp_o [], const float cosTerms [], int vecsize)
|
|
||||||
{
|
|
||||||
// tmp_e [i] = t0 + t1 ;
|
|
||||||
// tmp_o [i] = (t0 - t1) * cosTerms [i] ;
|
|
||||||
|
|
||||||
_asm
|
|
||||||
{
|
|
||||||
mov ecx, vecsize
|
|
||||||
shr ecx, 1
|
|
||||||
|
|
||||||
mov esi, dword ptr [vector]
|
|
||||||
mov edi, dword ptr [cosTerms]
|
|
||||||
|
|
||||||
mov eax, dword ptr [tmp_e]
|
|
||||||
mov ebx, dword ptr [tmp_o]
|
|
||||||
|
|
||||||
mov edx, dword ptr [vecsize]
|
|
||||||
shl edx, 2
|
|
||||||
add edx, esi
|
|
||||||
|
|
||||||
fldz
|
|
||||||
|
|
||||||
label :
|
|
||||||
|
|
||||||
fld dword ptr [esi]
|
|
||||||
fld dword ptr [esi]
|
|
||||||
|
|
||||||
fsub dword ptr [edx-4]
|
|
||||||
fxch st(1)
|
|
||||||
|
|
||||||
fadd dword ptr [edx-4]
|
|
||||||
fxch st(2)
|
|
||||||
|
|
||||||
fld dword ptr [esi+4]
|
|
||||||
fld dword ptr [esi+4]
|
|
||||||
|
|
||||||
fsub dword ptr [edx-8]
|
|
||||||
fxch st(1)
|
|
||||||
|
|
||||||
fadd dword ptr [edx-8]
|
|
||||||
fxch st(3)
|
|
||||||
|
|
||||||
fmul dword ptr [edi]
|
|
||||||
fxch st(4)
|
|
||||||
|
|
||||||
fstp dword ptr [eax]
|
|
||||||
|
|
||||||
fmul dword ptr [edi+4]
|
|
||||||
fxch st(2)
|
|
||||||
|
|
||||||
fstp dword ptr [eax+4]
|
|
||||||
fxch st(2)
|
|
||||||
|
|
||||||
fstp dword ptr [ebx]
|
|
||||||
|
|
||||||
add esi, 8
|
|
||||||
add edi, 8
|
|
||||||
|
|
||||||
fstp dword ptr [ebx+4]
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
fld dword ptr [esi]
|
|
||||||
fld dword ptr [esi]
|
|
||||||
|
|
||||||
fsub dword ptr [edx-12]
|
|
||||||
fxch st(1)
|
|
||||||
|
|
||||||
fadd dword ptr [edx-12]
|
|
||||||
fxch st(2)
|
|
||||||
|
|
||||||
fld dword ptr [esi+4]
|
|
||||||
fld dword ptr [esi+4]
|
|
||||||
|
|
||||||
fsub dword ptr [edx-16]
|
|
||||||
fxch st(1)
|
|
||||||
|
|
||||||
fadd dword ptr [edx-16]
|
|
||||||
fxch st(3)
|
|
||||||
|
|
||||||
fmul dword ptr [edi]
|
|
||||||
fxch st(4)
|
|
||||||
|
|
||||||
fstp dword ptr [eax+8]
|
|
||||||
|
|
||||||
fmul dword ptr [edi+4]
|
|
||||||
fxch st(2)
|
|
||||||
|
|
||||||
fstp dword ptr [eax+12]
|
|
||||||
fxch st(2)
|
|
||||||
|
|
||||||
fstp dword ptr [ebx+8]
|
|
||||||
|
|
||||||
add esi, 8
|
|
||||||
add edi, 8
|
|
||||||
|
|
||||||
fstp dword ptr [ebx+12]
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
sub edx, 16
|
|
||||||
add eax, 16
|
|
||||||
|
|
||||||
add ebx, 16
|
|
||||||
sub ecx, 4
|
|
||||||
|
|
||||||
jne label
|
|
||||||
|
|
||||||
fstp st(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBlock::Merge (float vector [], const float tmp_e [], const float tmp_o [], int vecsize)
|
|
||||||
{
|
|
||||||
__asm
|
|
||||||
{
|
|
||||||
mov ecx, vecsize
|
|
||||||
shr ecx, 1
|
|
||||||
sub ecx, 8
|
|
||||||
|
|
||||||
mov edx, dword ptr [tmp_o]
|
|
||||||
mov edi, dword ptr [tmp_e]
|
|
||||||
|
|
||||||
mov esi, dword ptr [vector]
|
|
||||||
|
|
||||||
label :
|
|
||||||
|
|
||||||
fld dword ptr [edx + ecx*4]
|
|
||||||
fadd dword ptr [edx + ecx*4 + 4]
|
|
||||||
|
|
||||||
fld dword ptr [edx + ecx*4 + 4]
|
|
||||||
fadd dword ptr [edx + ecx*4 + 8]
|
|
||||||
|
|
||||||
fld dword ptr [edx + ecx*4 + 8]
|
|
||||||
fadd dword ptr [edx + ecx*4 + 12]
|
|
||||||
|
|
||||||
fld dword ptr [edx + ecx*4 + 12]
|
|
||||||
fadd dword ptr [edx + ecx*4 + 16]
|
|
||||||
fxch st(3)
|
|
||||||
|
|
||||||
fstp dword ptr [esi + ecx*8 + 4]
|
|
||||||
|
|
||||||
mov eax, dword ptr [edi + ecx*4]
|
|
||||||
mov ebx, dword ptr [edi + ecx*4 + 4]
|
|
||||||
|
|
||||||
fstp dword ptr [esi + ecx*8 + 20]
|
|
||||||
|
|
||||||
mov dword ptr [esi + ecx*8], eax
|
|
||||||
mov dword ptr [esi + ecx*8 + 8], ebx
|
|
||||||
|
|
||||||
fstp dword ptr [esi + ecx*8 + 12]
|
|
||||||
|
|
||||||
mov eax, dword ptr [edi + ecx*4 + 8]
|
|
||||||
mov ebx, dword ptr [edi + ecx*4 + 12]
|
|
||||||
|
|
||||||
fstp dword ptr [esi + ecx*8 + 28]
|
|
||||||
|
|
||||||
mov dword ptr [esi + ecx*8 + 16], eax
|
|
||||||
mov dword ptr [esi + ecx*8 + 24], ebx
|
|
||||||
|
|
||||||
fld dword ptr [edx + ecx*4 + 16]
|
|
||||||
fadd dword ptr [edx + ecx*4 + 20]
|
|
||||||
|
|
||||||
fld dword ptr [edx + ecx*4 + 20]
|
|
||||||
fadd dword ptr [edx + ecx*4 + 24]
|
|
||||||
|
|
||||||
fld dword ptr [edx + ecx*4 + 24]
|
|
||||||
fadd dword ptr [edx + ecx*4 + 28]
|
|
||||||
|
|
||||||
fld dword ptr [edx + ecx*4 + 28]
|
|
||||||
fadd dword ptr [edx + ecx*4 + 32]
|
|
||||||
fxch st(3)
|
|
||||||
|
|
||||||
fstp dword ptr [esi + ecx*8 + 36]
|
|
||||||
|
|
||||||
mov eax, dword ptr [edi + ecx*4 + 16]
|
|
||||||
mov ebx, dword ptr [edi + ecx*4 + 20]
|
|
||||||
|
|
||||||
fstp dword ptr [esi + ecx*8 + 52]
|
|
||||||
|
|
||||||
mov dword ptr [esi + ecx*8 + 32], eax
|
|
||||||
mov dword ptr [esi + ecx*8 + 40], ebx
|
|
||||||
|
|
||||||
fstp dword ptr [esi + ecx*8 + 44]
|
|
||||||
|
|
||||||
mov eax, dword ptr [edi + ecx*4 + 24]
|
|
||||||
mov ebx, dword ptr [edi + ecx*4 + 28]
|
|
||||||
|
|
||||||
fstp dword ptr [esi + ecx*8 + 60]
|
|
||||||
|
|
||||||
mov dword ptr [esi + ecx*8 + 48], eax
|
|
||||||
mov dword ptr [esi + ecx*8 + 56], ebx
|
|
||||||
|
|
||||||
sub ecx, 8
|
|
||||||
jne label
|
|
||||||
|
|
||||||
// zero element
|
|
||||||
|
|
||||||
fld dword ptr [edx]
|
|
||||||
fadd dword ptr [edx + 4]
|
|
||||||
|
|
||||||
fld dword ptr [edx + 4]
|
|
||||||
fadd dword ptr [edx + 8]
|
|
||||||
|
|
||||||
fld dword ptr [edx + 8]
|
|
||||||
fadd dword ptr [edx + 12]
|
|
||||||
|
|
||||||
fld dword ptr [edx + 12]
|
|
||||||
fadd dword ptr [edx + 16]
|
|
||||||
fxch st(3)
|
|
||||||
|
|
||||||
fstp dword ptr [esi + 4]
|
|
||||||
|
|
||||||
mov eax, dword ptr [edi]
|
|
||||||
mov ebx, dword ptr [edi + 4]
|
|
||||||
|
|
||||||
fstp dword ptr [esi + 20]
|
|
||||||
|
|
||||||
mov dword ptr [esi], eax
|
|
||||||
mov dword ptr [esi + 8], ebx
|
|
||||||
|
|
||||||
fstp dword ptr [esi + 12]
|
|
||||||
|
|
||||||
mov eax, dword ptr [edi + 8]
|
|
||||||
mov ebx, dword ptr [edi + 12]
|
|
||||||
|
|
||||||
fstp dword ptr [esi + 28]
|
|
||||||
|
|
||||||
mov dword ptr [esi + 16], eax
|
|
||||||
mov dword ptr [esi + 24], ebx
|
|
||||||
|
|
||||||
fld dword ptr [edx + 16]
|
|
||||||
fadd dword ptr [edx + 20]
|
|
||||||
|
|
||||||
fld dword ptr [edx + 20]
|
|
||||||
fadd dword ptr [edx + 24]
|
|
||||||
|
|
||||||
fld dword ptr [edx + 24]
|
|
||||||
fadd dword ptr [edx + 28]
|
|
||||||
|
|
||||||
fld dword ptr [edx + 28]
|
|
||||||
fadd dword ptr [edx + 32]
|
|
||||||
fxch st(3)
|
|
||||||
|
|
||||||
fstp dword ptr [esi + 36]
|
|
||||||
|
|
||||||
mov eax, dword ptr [edi + 16]
|
|
||||||
mov ebx, dword ptr [edi + 20]
|
|
||||||
|
|
||||||
fstp dword ptr [esi + 52]
|
|
||||||
|
|
||||||
mov dword ptr [esi + 32], eax
|
|
||||||
mov dword ptr [esi + 40], ebx
|
|
||||||
|
|
||||||
fstp dword ptr [esi + 44]
|
|
||||||
|
|
||||||
mov eax, dword ptr [edi + 24]
|
|
||||||
mov ebx, dword ptr [edi + 28]
|
|
||||||
|
|
||||||
fstp dword ptr [esi + 60]
|
|
||||||
|
|
||||||
mov dword ptr [esi + 48], eax
|
|
||||||
mov dword ptr [esi + 56], ebx
|
|
||||||
}
|
|
||||||
|
|
||||||
vector [vecsize - 2] = tmp_e [vecsize / 2 - 1] ;
|
|
||||||
vector [vecsize - 1] = tmp_o [vecsize / 2 - 1] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
void CBlock::Split (const float vector [], float tmp_e [], float tmp_o [], const float cosTerms [], int vecsize)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < vecsize / 2 ; i++)
|
|
||||||
{
|
|
||||||
tmp_e [i] = vector [i] + vector [vecsize - i - 1] ;
|
|
||||||
tmp_o [i] = (vector [i] - vector [vecsize - i - 1]) * cosTerms [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CBlock::Merge (float vector [], const float tmp_e [], const float tmp_o [], int vecsize)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < vecsize / 2 - 1 ; i++)
|
|
||||||
{
|
|
||||||
vector [i * 2] = tmp_e [i] ;
|
|
||||||
vector [i * 2 + 1] = tmp_o [i] + tmp_o [i + 1] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
vector [vecsize - 2] = tmp_e [vecsize / 2 - 1] ;
|
|
||||||
vector [vecsize - 1] = tmp_o [vecsize / 2 - 1] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,512 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/longblock.cpp,v 1.2 2011/06/13 02:06:03 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: longblock.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: long window sequence object
|
|
||||||
*
|
|
||||||
* $Header: /cvs/root/winamp/vlb/longblock.cpp,v 1.2 2011/06/13 02:06:03 audiodsp Exp $
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include <math.h> // pow()
|
|
||||||
|
|
||||||
#include "block.h"
|
|
||||||
#include "bitstream.h"
|
|
||||||
#include "channelinfo.h"
|
|
||||||
#include "overlapadd.h"
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
#include "prediction.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ctor/dtor
|
|
||||||
|
|
||||||
CLongBlock::CLongBlock (CChannelInfo &info)
|
|
||||||
: CBlock (info)
|
|
||||||
{
|
|
||||||
m_SectBits = 5 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CLongBlock::~CLongBlock ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// low-level access
|
|
||||||
|
|
||||||
float *CLongBlock::AccessSpectralData (int /* window = 0 */)
|
|
||||||
{
|
|
||||||
return m_SpectralCoefficient ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int *CLongBlock::AccessCodeBooks (int /* group */)
|
|
||||||
{
|
|
||||||
return m_CodeBook ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int *CLongBlock::AccessScaleFactors (int /* group */)
|
|
||||||
{
|
|
||||||
return m_ScaleFactor ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// readers
|
|
||||||
#include<stdio.h>
|
|
||||||
#include<conio.h>
|
|
||||||
#include<stdlib.h>
|
|
||||||
void CLongBlock::ReadSectionData (CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
CVLBBitSequence sect_cb (4) ;
|
|
||||||
CVLBBitSequence sect_len_incr (m_SectBits) ;
|
|
||||||
|
|
||||||
int sect_esc_val = (1 << m_SectBits) - 1 ;
|
|
||||||
|
|
||||||
int band ; // msdev not ansi
|
|
||||||
|
|
||||||
//Section Information:
|
|
||||||
int iNumberOfSections;
|
|
||||||
iNumberOfSections=0;
|
|
||||||
sSectionInfoStruct.aiSectionCount[0]=0;
|
|
||||||
sSectionInfoStruct.aaiSectionStart[0][0]=0;
|
|
||||||
for (band = 0 ; band < m_IcsInfo.GetScaleFactorBandsTransmitted () ; )
|
|
||||||
{
|
|
||||||
|
|
||||||
sect_cb.Read (bs) ;
|
|
||||||
sect_len_incr.Read (bs) ;
|
|
||||||
|
|
||||||
int sect_len = 0 ;
|
|
||||||
|
|
||||||
while (sect_len_incr == sect_esc_val)
|
|
||||||
{
|
|
||||||
sect_len += sect_esc_val ;
|
|
||||||
sect_len_incr.Read (bs) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
sect_len += sect_len_incr ;
|
|
||||||
|
|
||||||
for (int top = band + sect_len ; band < top ; band++)
|
|
||||||
{
|
|
||||||
m_CodeBook [band] = sect_cb ;
|
|
||||||
|
|
||||||
if ((m_CodeBook [band] == BOOKSCL) ||
|
|
||||||
(m_CodeBook [band] == RESERVED_HCB)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
throw EInvalidCodeBook () ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sSectionInfoStruct.aaiSectionCodebooks[0][iNumberOfSections]=sect_cb;
|
|
||||||
sSectionInfoStruct.aaiSectionStart[0][iNumberOfSections+1]=band;
|
|
||||||
sSectionInfoStruct.aaiSectionEnd[0][iNumberOfSections]=band;
|
|
||||||
sSectionInfoStruct.aiSectionCount[0]++;
|
|
||||||
iNumberOfSections++;
|
|
||||||
}
|
|
||||||
if(band < m_IcsInfo.GetScaleFactorBandsTotal() && m_IcsInfo.GetScaleFactorBandsTransmitted()){
|
|
||||||
sSectionInfoStruct.aaiSectionCodebooks[0][iNumberOfSections]=ZERO_HCB;
|
|
||||||
sSectionInfoStruct.aaiSectionEnd[0][iNumberOfSections]= m_IcsInfo.GetScaleFactorBandsTotal ();
|
|
||||||
sSectionInfoStruct.aiSectionCount[0]++;
|
|
||||||
iNumberOfSections++;
|
|
||||||
}
|
|
||||||
for ( ; band < m_IcsInfo.GetScaleFactorBandsTotal () ; band++)
|
|
||||||
{
|
|
||||||
m_CodeBook [band] = ZERO_HCB ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLongBlock::ReadScaleFactorData (CDolbyBitStream &bs, const int global_gain)
|
|
||||||
{
|
|
||||||
const CodeBookDescription *hcb = &HuffmanCodeBooks [BOOKSCL] ;
|
|
||||||
|
|
||||||
int factor = global_gain ;
|
|
||||||
int position = 0 ;
|
|
||||||
|
|
||||||
int temp ;
|
|
||||||
|
|
||||||
for (int band = 0 ; band < m_IcsInfo.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
switch (m_CodeBook [band])
|
|
||||||
{
|
|
||||||
case ZERO_HCB : // zero book
|
|
||||||
|
|
||||||
m_ScaleFactor [band] = 0 ;
|
|
||||||
break ;
|
|
||||||
|
|
||||||
default : // regular scale factor
|
|
||||||
|
|
||||||
temp = DecodeHuffmanWord (bs, hcb->CodeBook) ;
|
|
||||||
factor += temp - 60 ; // MIDFAC 1.5 dB
|
|
||||||
|
|
||||||
m_ScaleFactor [band] = factor - 100 ;
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case INTENSITY_HCB : // intensity steering
|
|
||||||
case INTENSITY_HCB2 :
|
|
||||||
|
|
||||||
temp = DecodeHuffmanWord (bs, hcb->CodeBook) ;
|
|
||||||
position += temp - 60 ;
|
|
||||||
|
|
||||||
m_ScaleFactor [band] = position - 100 ;
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
// use of intensity stereo overrides prediction_used mask
|
|
||||||
m_IcsInfo.DeactivatePrediction (band) ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLongBlock::ReadSpectralData (CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
int QuantizedCoef [MaximumBins] ;
|
|
||||||
|
|
||||||
int index, band ; // msdev for scoping not ansi
|
|
||||||
|
|
||||||
for (index = 0 ; index < MaximumBins ; index++)
|
|
||||||
{
|
|
||||||
QuantizedCoef [index] = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int *BandOffsets = m_IcsInfo.GetScaleFactorBandOffsets () ;
|
|
||||||
|
|
||||||
for (band = 0 ; band < m_IcsInfo.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
if ((m_CodeBook [band] == ZERO_HCB) ||
|
|
||||||
(m_CodeBook [band] == INTENSITY_HCB) ||
|
|
||||||
(m_CodeBook [band] == INTENSITY_HCB2)
|
|
||||||
)
|
|
||||||
continue ;
|
|
||||||
|
|
||||||
const CodeBookDescription *hcb = &HuffmanCodeBooks [m_CodeBook [band]] ;
|
|
||||||
|
|
||||||
int step = 0 ;
|
|
||||||
|
|
||||||
for (index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index += step)
|
|
||||||
{
|
|
||||||
step = UnpackIndex (DecodeHuffmanWord (bs, hcb->CodeBook), &QuantizedCoef [index], hcb) ;
|
|
||||||
|
|
||||||
if (!hcb->IsSigned)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < step ; i++)
|
|
||||||
{
|
|
||||||
if (QuantizedCoef [index + i])
|
|
||||||
{
|
|
||||||
if (bs.Get (1)) // sign bit
|
|
||||||
{
|
|
||||||
QuantizedCoef [index + i] = -QuantizedCoef [index + i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_CodeBook [band] == ESCBOOK)
|
|
||||||
{
|
|
||||||
QuantizedCoef [index] = GetEscape (bs, QuantizedCoef [index]) ;
|
|
||||||
QuantizedCoef [index + 1] = GetEscape (bs, QuantizedCoef [index + 1]) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_PulseData.Apply (m_IcsInfo, QuantizedCoef) ;
|
|
||||||
|
|
||||||
// dequantize and apply scalefactors
|
|
||||||
|
|
||||||
for (index = 0, band = 0 ; band < m_IcsInfo.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
float factor = static_cast<float>(m_ScaleFactor [band]) ;
|
|
||||||
|
|
||||||
if ((factor >= 0) && (factor < ExpTableSize))
|
|
||||||
{
|
|
||||||
factor = m_ExpTable [m_ScaleFactor [band]] ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (m_ScaleFactor [band] == -100)
|
|
||||||
{
|
|
||||||
for (index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [index] = 0.0F ;
|
|
||||||
}
|
|
||||||
|
|
||||||
continue ;
|
|
||||||
}
|
|
||||||
|
|
||||||
factor = static_cast<float>(pow (2.0F, 0.25F * factor)) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [index] = InverseQuantize (QuantizedCoef [index]) * factor ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// zero out spectral data beyond max_sfb
|
|
||||||
// index is now first bin of max_sfb+1
|
|
||||||
|
|
||||||
for ( ; index < MaximumBins ; index++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [index] = 0.0F ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLongBlock::ApplyWindowFunction (COverlapAddBuffer &Previous)
|
|
||||||
{
|
|
||||||
int i ;
|
|
||||||
|
|
||||||
switch (m_IcsInfo.GetWindowSequence ())
|
|
||||||
{
|
|
||||||
case CChannelInfo::OnlyLongSequence :
|
|
||||||
|
|
||||||
#if defined (WIN32) && defined (_M_IX86)
|
|
||||||
|
|
||||||
PentiumWindow (m_SpectralCoefficient, m_LongWindow [Previous.GetWindowShape ()], m_LongWindow [m_IcsInfo.GetWindowShape ()]) ;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
for (i = 0 ; i < 1024 ; i++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [i] *= m_LongWindow [Previous.GetWindowShape ()][i] ;
|
|
||||||
m_SpectralCoefficient [1024 + i] *= m_LongWindow [m_IcsInfo.GetWindowShape ()][1023 - i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case CChannelInfo::LongStartSequence :
|
|
||||||
|
|
||||||
for (i = 0 ; i < 1024 ; i++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [i] *= m_LongWindow [Previous.GetWindowShape ()][i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0 ; i < 128 ; i++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [1472 + i] *= m_ShortWindow [m_IcsInfo.GetWindowShape ()][127 - i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1600 ; i < 2048 ; i++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [i] = 0.0F ;
|
|
||||||
}
|
|
||||||
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case CChannelInfo::LongStopSequence :
|
|
||||||
|
|
||||||
for (i = 0 ; i < 448 ; i++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [i] = 0.0F ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0 ; i < 128 ; i++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [448 + i] *= m_ShortWindow [Previous.GetWindowShape ()][i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0 ; i < 1024 ; i++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [1024 + i] *= m_LongWindow [m_IcsInfo.GetWindowShape ()][1023 - i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
|
|
||||||
Previous.SetWindowShape (m_IcsInfo.GetWindowShape ()) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLongBlock::FrequencyToTime_Fast (COverlapAddBuffer &Previous)
|
|
||||||
{
|
|
||||||
InverseTransform (m_SpectralCoefficient) ;
|
|
||||||
ApplyWindowFunction (Previous) ;
|
|
||||||
|
|
||||||
#if defined (WIN32) && defined (_M_IX86)
|
|
||||||
|
|
||||||
PentiumOverlap (m_Output, m_SpectralCoefficient, Previous.AccessBuffer (), 1) ;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
for (int i = 0 ; i < 1024 ; i++)
|
|
||||||
{
|
|
||||||
// add first half and old data
|
|
||||||
|
|
||||||
m_Output[i] = m_SpectralCoefficient [i] + Previous [i] ;
|
|
||||||
|
|
||||||
// store second half as old data
|
|
||||||
|
|
||||||
Previous [i] = m_SpectralCoefficient [1024 + i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLongBlock::FrequencyToTime (COverlapAddBuffer &Previous, float Output [], const int stride)
|
|
||||||
{
|
|
||||||
InverseTransform (m_SpectralCoefficient) ;
|
|
||||||
ApplyWindowFunction (Previous) ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i < 1024 ; i++)
|
|
||||||
{
|
|
||||||
// add first half and old data
|
|
||||||
|
|
||||||
Output [i * stride] = m_SpectralCoefficient [i] + Previous [i] ;
|
|
||||||
|
|
||||||
// store second half as old data
|
|
||||||
|
|
||||||
Previous [i] = m_SpectralCoefficient [1024 + i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLongBlock::FrequencyToTime (COverlapAddBuffer &Previous)
|
|
||||||
{
|
|
||||||
InverseTransform (m_SpectralCoefficient) ;
|
|
||||||
ApplyWindowFunction (Previous) ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i < 1024 ; i++)
|
|
||||||
{
|
|
||||||
m_Output[i]=m_SpectralCoefficient [i] + Previous [i] ;
|
|
||||||
Previous [i] = m_SpectralCoefficient [1024 + i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLongBlock::ApplyEqualizationMask (float Mask [])
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < EqualizationMaskLength ; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0 ; j < (MaximumBins / EqualizationMaskLength) ; j++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [(MaximumBins / EqualizationMaskLength) * i + j] *= Mask [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined (WIN32) && defined (_M_IX86)
|
|
||||||
#pragma message (__FILE__": using x86 inline assembler")
|
|
||||||
|
|
||||||
// this CBlock method goes here, because we'd prefer it to be inlined
|
|
||||||
// with CLongBlock. not all compilers support inter-module optimizations.
|
|
||||||
|
|
||||||
void CBlock::PentiumOverlap (float output [], float spec [], float prev [], unsigned int stride)
|
|
||||||
{
|
|
||||||
const float minval = -32767.0F ;
|
|
||||||
|
|
||||||
__asm
|
|
||||||
{
|
|
||||||
shl stride, 2 // stride *= sizeof(float)
|
|
||||||
|
|
||||||
mov esi, dword ptr [output] // esi is pcm output pointer
|
|
||||||
|
|
||||||
mov ebx, 0x00 // ebx is buffer index
|
|
||||||
|
|
||||||
mov edx, dword ptr [spec]
|
|
||||||
mov ecx, dword ptr [prev]
|
|
||||||
|
|
||||||
entry:
|
|
||||||
|
|
||||||
fld dword ptr [edx + ebx*4] // get: spec [i]
|
|
||||||
fadd dword ptr [ecx + ebx*4] // get: spec [i] + prev [i]
|
|
||||||
mov eax, dword ptr [edx + ebx*4 + 0x1000] // get: spec [1024 + i]
|
|
||||||
mov dword ptr [ecx + ebx*4],eax // put: prev [i] = spec [1024 + i]
|
|
||||||
fst dword ptr [esi] // put: output [i] = spec [i] + prev [i]
|
|
||||||
|
|
||||||
add esi, stride
|
|
||||||
|
|
||||||
fstp st(0)
|
|
||||||
|
|
||||||
inc ebx
|
|
||||||
cmp ebx, 1024
|
|
||||||
jne entry
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CLongBlock::PentiumWindow (float spec [], const float prev [], const float curr [])
|
|
||||||
{
|
|
||||||
__asm
|
|
||||||
{
|
|
||||||
mov ebx, 0x0100
|
|
||||||
|
|
||||||
mov edx, dword ptr [spec]
|
|
||||||
mov esi, dword ptr [curr]
|
|
||||||
mov ecx, dword ptr [prev]
|
|
||||||
|
|
||||||
add esi, 4 * 0x03FC
|
|
||||||
|
|
||||||
entry:
|
|
||||||
|
|
||||||
// previous shape
|
|
||||||
|
|
||||||
fldz
|
|
||||||
|
|
||||||
fld dword ptr [edx]
|
|
||||||
fmul dword ptr [ecx]
|
|
||||||
fxch
|
|
||||||
|
|
||||||
fld dword ptr [edx + 0x04]
|
|
||||||
fmul dword ptr [ecx + 0x04]
|
|
||||||
fxch
|
|
||||||
|
|
||||||
fld dword ptr [edx + 0x08]
|
|
||||||
fmul dword ptr [ecx + 0x08]
|
|
||||||
fxch
|
|
||||||
|
|
||||||
fld dword ptr [edx + 0x0C]
|
|
||||||
fmul dword ptr [ecx + 0x0C]
|
|
||||||
fxch st(4)
|
|
||||||
|
|
||||||
fstp dword ptr [edx]
|
|
||||||
fxch st(2)
|
|
||||||
|
|
||||||
fstp dword ptr [edx + 0x04]
|
|
||||||
fstp dword ptr [edx + 0x08]
|
|
||||||
fxch
|
|
||||||
|
|
||||||
fstp dword ptr [edx + 0x0C]
|
|
||||||
|
|
||||||
// current shape
|
|
||||||
|
|
||||||
fld dword ptr [edx + 0x1000]
|
|
||||||
fmul dword ptr [esi + 0x0C]
|
|
||||||
fxch
|
|
||||||
|
|
||||||
fld dword ptr [edx + 0x1004]
|
|
||||||
fmul dword ptr [esi + 0x08]
|
|
||||||
fxch
|
|
||||||
|
|
||||||
fld dword ptr [edx + 0x1008]
|
|
||||||
fmul dword ptr [esi + 0x04]
|
|
||||||
fxch
|
|
||||||
|
|
||||||
fld dword ptr [edx + 0x100C]
|
|
||||||
fmul dword ptr [esi]
|
|
||||||
|
|
||||||
fxch st(4)
|
|
||||||
fstp dword ptr [edx + 0x1000]
|
|
||||||
|
|
||||||
fxch st(2)
|
|
||||||
fstp dword ptr [edx + 0x1004]
|
|
||||||
|
|
||||||
fstp dword ptr [edx + 0x1008]
|
|
||||||
|
|
||||||
fstp st(0)
|
|
||||||
fstp dword ptr [edx + 0x100C]
|
|
||||||
|
|
||||||
add edx, 0x10
|
|
||||||
sub esi, 0x10
|
|
||||||
add ecx, 0x10
|
|
||||||
|
|
||||||
dec ebx
|
|
||||||
jne entry
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,170 +0,0 @@
|
||||||
#include "nsv_vlb.h"
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// NSV VLB Decoder
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
VLB_Decoder::VLB_Decoder()
|
|
||||||
{
|
|
||||||
aacdec = new CAacDecoderApi( &datain );
|
|
||||||
fused = 0;
|
|
||||||
needsync = 1;
|
|
||||||
packets_in_since_flush = 0;
|
|
||||||
packets_decoded_since_flush = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
VLB_Decoder::~VLB_Decoder()
|
|
||||||
{
|
|
||||||
delete aacdec;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VLB_Decoder::flush()
|
|
||||||
{
|
|
||||||
datain.Empty();
|
|
||||||
dataout.Empty();
|
|
||||||
|
|
||||||
//OutputDebugString("FLUSH\n");
|
|
||||||
|
|
||||||
|
|
||||||
// JF> this seems to be necessary for me at least, to have aacdec's internal buffer and state get reset :/
|
|
||||||
// (especially for AAC files, but I got it to do weird stuff on VLB files too :/)
|
|
||||||
// might be cleaner to see if we can just clear it somehow manually.. hmm..
|
|
||||||
delete aacdec;
|
|
||||||
aacdec = new CAacDecoderApi( &datain );
|
|
||||||
fused = 0;
|
|
||||||
needsync = 1;
|
|
||||||
packets_in_since_flush = 0;
|
|
||||||
packets_decoded_since_flush = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int VLB_Decoder::decode( void *in, int in_len,
|
|
||||||
void *out, int *out_len,
|
|
||||||
unsigned int out_fmt[8] )
|
|
||||||
{
|
|
||||||
// This function gets called with 1 nsv frame's worth of audio data.
|
|
||||||
// That could mean 1 OR MORE audio packets. (or zero?)
|
|
||||||
// Just process the smallest amount (1 packet) and return 0 if you
|
|
||||||
// finished processing this big chunk, or 1 if you need to work on
|
|
||||||
// extracting more audio (from this same nsv frame) on the next call.
|
|
||||||
|
|
||||||
// RETURN VALUES:
|
|
||||||
// 1: call me again w/same buffer (and contents) next time
|
|
||||||
// 0: give me a new buffer (w/new frame contents) next time
|
|
||||||
|
|
||||||
AUDIO_FORMATINFO info;
|
|
||||||
|
|
||||||
int rval = 1;
|
|
||||||
|
|
||||||
if (!dataout.BytesAvail())
|
|
||||||
{
|
|
||||||
int l = datain.GetInputFree(); // the # of bytes that datain still has room for
|
|
||||||
if ( l > in_len - fused ) l = in_len - fused;
|
|
||||||
|
|
||||||
if ( l > 0)
|
|
||||||
{
|
|
||||||
datain.Fill( (unsigned char *)in + fused, l );
|
|
||||||
fused += l;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************/
|
|
||||||
if (in_len > 0)
|
|
||||||
packets_in_since_flush++;
|
|
||||||
#define PACKETS_TO_PREBUFFER_BEFORE_SYNCHRONIZE 2
|
|
||||||
if (needsync && packets_in_since_flush < PACKETS_TO_PREBUFFER_BEFORE_SYNCHRONIZE)
|
|
||||||
{
|
|
||||||
// Don't allow ourselves to call Synchronize() until we've actually received
|
|
||||||
// TWO audio packets. We need two because Synchronize() peeks ahead beyond
|
|
||||||
// the first packet, and throws an exception if the second one isn't also available.
|
|
||||||
// (note that if we were worried about getting partial frames from the nsv decoder,
|
|
||||||
// we'd want to set PACKETS_TO_PREBUFFER==3...)
|
|
||||||
fused = 0;
|
|
||||||
*out_len = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*********************************/
|
|
||||||
|
|
||||||
if (!datain.GetSize())
|
|
||||||
{
|
|
||||||
if ( fused >= in_len ) rval = fused = 0; // get more data
|
|
||||||
*out_len = 0;
|
|
||||||
return rval;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needsync)
|
|
||||||
{
|
|
||||||
int status = aacdec->Synchronize( ¶ms ); // returns # of bytes skipped forward through 'datain' in params.frame_length
|
|
||||||
if (status)
|
|
||||||
{
|
|
||||||
// ERROR
|
|
||||||
*out_len = 0;
|
|
||||||
if ( fused >= in_len ) rval = fused = 0; // get more data
|
|
||||||
return rval;
|
|
||||||
}
|
|
||||||
|
|
||||||
needsync = 0;
|
|
||||||
|
|
||||||
// NOTE: as long as the NSV file was encoded properly (i.e. all vlb audio packets were
|
|
||||||
// sent to the encoder intact, never split among two nsv frames), we don't have to worry
|
|
||||||
// about ever getting back a partial frame from the NSV decoder; it will sync for us,
|
|
||||||
// and hand us the 1st complete audio packet it can find.
|
|
||||||
// In short: Synchronize() should always return with params.frame_length==0.
|
|
||||||
/*
|
|
||||||
int bytes_skipped = params.frame_length;
|
|
||||||
if (bytes_skipped)
|
|
||||||
{
|
|
||||||
// here we assume that the first packet was partially or entirely skipped through
|
|
||||||
// (but that the 2nd and 3rd packets were 100% okay), so we won't try to decode
|
|
||||||
// that first packet.
|
|
||||||
packets_in_since_flush--;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
info.ucNChannels = (unsigned char) params.num_channels;
|
|
||||||
info.uiSampleRate = params.sampling_frequency;
|
|
||||||
|
|
||||||
dataout.SetFormatInfo( &info );
|
|
||||||
}
|
|
||||||
|
|
||||||
while (packets_decoded_since_flush < packets_in_since_flush)
|
|
||||||
{
|
|
||||||
int status = aacdec->DecodeFrame( &dataout, ¶ms ); // returns # of bytes consumed from 'datain' in params.frame_length
|
|
||||||
packets_decoded_since_flush++;
|
|
||||||
if ( status > ERR_NO_ERROR && status != ERR_END_OF_FILE)
|
|
||||||
{
|
|
||||||
// ERROR
|
|
||||||
flush();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (packets_decoded_since_flush > 64)
|
|
||||||
{
|
|
||||||
// avoid overflow, but don't let either of these vars drop back to 0, 1, or 2!
|
|
||||||
packets_in_since_flush -= 32;
|
|
||||||
packets_decoded_since_flush -= 32;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int l = dataout.BytesAvail();
|
|
||||||
if (l > 0)
|
|
||||||
{
|
|
||||||
if ( l > *out_len ) l = *out_len;
|
|
||||||
else *out_len = l;
|
|
||||||
|
|
||||||
dataout.PullBytes( (unsigned char *)out, l );
|
|
||||||
|
|
||||||
info = dataout.GetFormatInfo();
|
|
||||||
|
|
||||||
out_fmt[0] = NSV_MAKETYPE( 'P', 'C', 'M', ' ' );
|
|
||||||
out_fmt[1] = info.uiSampleRate;
|
|
||||||
out_fmt[2] = info.ucNChannels;
|
|
||||||
out_fmt[3] = 16;
|
|
||||||
out_fmt[4] = params.bitrate;
|
|
||||||
}
|
|
||||||
else *out_len = 0;
|
|
||||||
|
|
||||||
return rval;
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include "aacdecoderapi.h"
|
|
||||||
#include "vlbout.h"
|
|
||||||
#include "VLBIO.h"
|
|
||||||
#include "../nsv/dec_if.h"
|
|
||||||
#include "../nsv/nsvlib.h"
|
|
||||||
/*
|
|
||||||
#if (defined WIN32 && !defined __ICL)
|
|
||||||
// Ignore libraries the aacplus library references (but doesn't need)
|
|
||||||
#pragma comment(linker, "-nodefaultlib:libmmt.lib")
|
|
||||||
#pragma comment(linker, "-nodefaultlib:libircmt.lib")
|
|
||||||
#pragma comment(linker, "-nodefaultlib:svml_disp.lib")
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Class Declarations
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
class VLB_Decoder : public IAudioDecoder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
VLB_Decoder();
|
|
||||||
~VLB_Decoder();
|
|
||||||
int decode( void *in, int in_len,
|
|
||||||
void *out, int *out_len,
|
|
||||||
unsigned int out_fmt[8] );
|
|
||||||
void flush();
|
|
||||||
private:
|
|
||||||
//FILE* m_f;
|
|
||||||
CAacDecoderApi *aacdec;
|
|
||||||
VLBIn datain;
|
|
||||||
VLBOut dataout;
|
|
||||||
AACStreamParameters params;
|
|
||||||
int fused;
|
|
||||||
int needsync;
|
|
||||||
int packets_in_since_flush;
|
|
||||||
int packets_decoded_since_flush;
|
|
||||||
};
|
|
|
@ -1 +0,0 @@
|
||||||
#include "obj_vlbDecoder.h"
|
|
|
@ -1,65 +0,0 @@
|
||||||
#ifndef NULLSOFT_VLB_OBJ_VLBDECODER_H
|
|
||||||
#define NULLSOFT_VLB_OBJ_VLBDECODER_H
|
|
||||||
#include "aacdecoderapi.h"
|
|
||||||
#include <bfc/dispatch.h>
|
|
||||||
|
|
||||||
class obj_vlbDecoder : public Dispatchable
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
obj_vlbDecoder() {}
|
|
||||||
~obj_vlbDecoder() {}
|
|
||||||
public:
|
|
||||||
int Open(DataIOControl *paacInput);
|
|
||||||
void Close();
|
|
||||||
long Synchronize(AACStreamParameters *paacStreamParameters);
|
|
||||||
long DecodeFrame(AACStreamParameters *paacStreamParameters);
|
|
||||||
void Flush();
|
|
||||||
size_t Read(void *buffer, size_t bufferlen);
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
OBJ_VLBDECODER_OPEN = 0,
|
|
||||||
OBJ_VLBDECODER_CLOSE = 1,
|
|
||||||
OBJ_VLBDECODER_SYNCHRONIZE = 2,
|
|
||||||
OBJ_VLBDECODER_DECODEFRAME = 3,
|
|
||||||
OBJ_VLBDECODER_FLUSH = 4,
|
|
||||||
OBJ_VLBDECODER_READ = 5,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
inline int obj_vlbDecoder::Open(DataIOControl *paacInput)
|
|
||||||
{
|
|
||||||
return _call(OBJ_VLBDECODER_OPEN, (int)0, paacInput);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void obj_vlbDecoder::Close()
|
|
||||||
{
|
|
||||||
_voidcall(OBJ_VLBDECODER_CLOSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline long obj_vlbDecoder::Synchronize(AACStreamParameters *paacStreamParameters)
|
|
||||||
{
|
|
||||||
return _call(OBJ_VLBDECODER_SYNCHRONIZE, (long)ERR_SYNC_ERROR, paacStreamParameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline long obj_vlbDecoder::DecodeFrame(AACStreamParameters *paacStreamParameters)
|
|
||||||
{
|
|
||||||
return _call(OBJ_VLBDECODER_DECODEFRAME, (long)ERR_INVALID_BITSTREAM, paacStreamParameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void obj_vlbDecoder::Flush()
|
|
||||||
{
|
|
||||||
_voidcall(OBJ_VLBDECODER_FLUSH);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t obj_vlbDecoder::Read(void *buffer, size_t bufferlen)
|
|
||||||
{
|
|
||||||
return _call(OBJ_VLBDECODER_READ, (size_t)0, buffer, bufferlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
// {A9F0E37C-69BA-48d7-BFEB-1C85A9F5A2FA}
|
|
||||||
static const GUID obj_vlbDecoderGUID =
|
|
||||||
{ 0xa9f0e37c, 0x69ba, 0x48d7, { 0xbf, 0xeb, 0x1c, 0x85, 0xa9, 0xf5, 0xa2, 0xfa } };
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,89 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/overlapadd.h,v 1.2 2011/06/13 02:06:03 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: overlapadd.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: time domain overlap add buffer object
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __OVERLAPADD_H__
|
|
||||||
#define __OVERLAPADD_H__
|
|
||||||
|
|
||||||
/** Buffer For Time Domain Overlap/Add Data.
|
|
||||||
|
|
||||||
This simple helper class provides a self-initializing buffer for one frame
|
|
||||||
worth of time domain signal data, associated window shape information and
|
|
||||||
appropriate access methods.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class COverlapAddBuffer
|
|
||||||
{
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
BufferSize = 1024
|
|
||||||
} ;
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
COverlapAddBuffer ()
|
|
||||||
{
|
|
||||||
m_WindowShape = 0 ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i < COverlapAddBuffer::BufferSize ; i++)
|
|
||||||
{
|
|
||||||
m_Buffer [i] = 0.0F ;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
~COverlapAddBuffer () {} ;
|
|
||||||
|
|
||||||
// buffer access
|
|
||||||
|
|
||||||
float &operator [] (int index)
|
|
||||||
{
|
|
||||||
return m_Buffer [index] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// window shape access
|
|
||||||
|
|
||||||
int GetWindowShape (void) const
|
|
||||||
{
|
|
||||||
return m_WindowShape ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetWindowShape (int shape)
|
|
||||||
{
|
|
||||||
m_WindowShape = shape ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined (WIN32) && defined (_M_IX86)
|
|
||||||
|
|
||||||
float *AccessBuffer (void)
|
|
||||||
{
|
|
||||||
return m_Buffer ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
int m_WindowShape ;
|
|
||||||
|
|
||||||
float m_Buffer [COverlapAddBuffer::BufferSize] ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,168 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/plainfile.cpp,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: plainfile.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: tiny file reader input class
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "plainfile.h"
|
|
||||||
#include <memory.h>
|
|
||||||
#include <stddef.h> // for intptr_t
|
|
||||||
const unsigned long CPlainFile::m_ValidMask [32] =
|
|
||||||
{
|
|
||||||
0x00000000, 0x00000001, 0x00000003, 0x00000007,
|
|
||||||
0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F,
|
|
||||||
0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
|
|
||||||
0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF,
|
|
||||||
0x0000FFFF, 0x0001FFFF, 0x0003FFFF, 0x0007FFFF,
|
|
||||||
0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
|
|
||||||
0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF,
|
|
||||||
0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF
|
|
||||||
} ;
|
|
||||||
|
|
||||||
// public
|
|
||||||
|
|
||||||
CPlainFile::CPlainFile (DataIOControl *aacData)
|
|
||||||
: CDolbyBitStream ()
|
|
||||||
{
|
|
||||||
m_InputData = aacData ;
|
|
||||||
if (m_InputData->DICGetLastError()) throw EDoesNotExist () ;
|
|
||||||
|
|
||||||
m_ValidBits = 0 ;
|
|
||||||
m_Data = 0 ;
|
|
||||||
|
|
||||||
// detect adif header
|
|
||||||
m_sendadifbits=0;
|
|
||||||
|
|
||||||
#if 0 // FUCK ADIF HEADERS, THEY BLOW DONKEYBALLZ
|
|
||||||
memset(m_tmpadifbits,0,sizeof(m_tmpadifbits));
|
|
||||||
|
|
||||||
m_InputData->IO(m_tmpadifbits, 1, 4) ;
|
|
||||||
//m_InputData->Seek(0,SEEK_SET) ;
|
|
||||||
|
|
||||||
char *adif=m_tmpadifbits;
|
|
||||||
|
|
||||||
if ((adif [0] == 'A') &&
|
|
||||||
(adif [1] == 'D') &&
|
|
||||||
(adif [2] == 'I') &&
|
|
||||||
(adif [3] == 'F')
|
|
||||||
)
|
|
||||||
{
|
|
||||||
m_AdifHeaderPresent = true ;
|
|
||||||
m_sendadifbits=0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if ((adif [0] == 'R') &&
|
|
||||||
(adif [1] == 'I') &&
|
|
||||||
(adif [2] == 'F') &&
|
|
||||||
(adif [3] == 'F')
|
|
||||||
)
|
|
||||||
{
|
|
||||||
m_RiffHeaderPresent = true ;
|
|
||||||
m_sendadifbits=0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
CPlainFile::~CPlainFile ()
|
|
||||||
{
|
|
||||||
//fclose (m_InputFile) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
long CPlainFile::Get (int n)
|
|
||||||
{
|
|
||||||
if (m_ValidBits <= 16)
|
|
||||||
{
|
|
||||||
m_Data = (m_Data << 16) | GetShort () ;
|
|
||||||
m_ValidBits += 16 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ValidBits -= n ;
|
|
||||||
return ((m_Data >> m_ValidBits) & m_ValidMask [n]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPlainFile::ByteAlign (void)
|
|
||||||
{
|
|
||||||
if (m_ValidBits <= 16)
|
|
||||||
{
|
|
||||||
m_Data = (m_Data << 16) | GetShort () ;
|
|
||||||
m_ValidBits += 16 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (m_ValidBits & 0x07)
|
|
||||||
{
|
|
||||||
m_ValidBits-- ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPlainFile::PushBack (int n)
|
|
||||||
{
|
|
||||||
m_ValidBits += n ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CPlainFile::Read (void *pData, int cBytes)
|
|
||||||
{
|
|
||||||
if(m_sendadifbits)
|
|
||||||
{
|
|
||||||
cBytes-=4; //CT> I assume that it'll always be >4 at this point in the exec.
|
|
||||||
memcpy(pData,m_tmpadifbits,4);
|
|
||||||
intptr_t a=(intptr_t)pData+4;
|
|
||||||
pData=(void*)a;
|
|
||||||
m_sendadifbits=0;
|
|
||||||
}
|
|
||||||
return m_InputData->IO(pData,1,cBytes) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// protected
|
|
||||||
|
|
||||||
long CPlainFile::GetShort (void)
|
|
||||||
{
|
|
||||||
int c1;
|
|
||||||
int c2;
|
|
||||||
m_InputData->IO(&c1,1,1);
|
|
||||||
m_InputData->IO(&c2,1,1);
|
|
||||||
if (m_InputData->EndOf())
|
|
||||||
throw EEndOfFile () ;
|
|
||||||
c1&=0xff;
|
|
||||||
c2&=0xff;
|
|
||||||
return (c1 << 8) | c2 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SYNCWORD 0x0fff
|
|
||||||
#define SYNCMASK 0x0fff
|
|
||||||
#define SYNCLENGTH 12
|
|
||||||
#define REMLENGTH 16
|
|
||||||
#define MAX_SEARCH 100000
|
|
||||||
|
|
||||||
int CPlainFile::LockAndLoad()
|
|
||||||
{
|
|
||||||
int iCount;
|
|
||||||
unsigned int dwSync;
|
|
||||||
dwSync=0;
|
|
||||||
iCount=0;
|
|
||||||
while(iCount<MAX_SEARCH && dwSync!=SYNCWORD){
|
|
||||||
int iTemp;
|
|
||||||
dwSync<<=8;
|
|
||||||
m_InputData->IO(&iTemp,1,1);
|
|
||||||
if (m_InputData->EndOf())
|
|
||||||
throw EEndOfFile () ;
|
|
||||||
dwSync+=iTemp;
|
|
||||||
dwSync&=SYNCMASK;
|
|
||||||
iCount++;
|
|
||||||
}
|
|
||||||
m_Data=dwSync;
|
|
||||||
m_ValidBits=REMLENGTH;
|
|
||||||
if(iCount<MAX_SEARCH) return 1;
|
|
||||||
else return 0;
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/plainfile.h,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: plainfile.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: tiny file reader input class
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __PLAINFILE_H__
|
|
||||||
#define __PLAINFILE_H__
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "bitstream.h"
|
|
||||||
#include "DataIO.h"
|
|
||||||
|
|
||||||
/** A Simple File Reading Input Class.
|
|
||||||
|
|
||||||
This class is a simple input class adhering to the CDolbyBitStream interface. It can
|
|
||||||
be used to read raw and ADIF-style bitstreams.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CPlainFile : public CDolbyBitStream
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CPlainFile (DataIOControl *aacData) ;
|
|
||||||
virtual ~CPlainFile () ;
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
virtual void ByteAlign (void) ;
|
|
||||||
virtual long Get (int n) ;
|
|
||||||
|
|
||||||
virtual void PushBack (int n) ;
|
|
||||||
|
|
||||||
/** Raw Block Read Method.
|
|
||||||
|
|
||||||
This method sequentially reads chunks of data from the input file.
|
|
||||||
|
|
||||||
@param pData The buffer where the data chunk should be stored.
|
|
||||||
@param cBytes The number of bytes to read.
|
|
||||||
@return The number of bytes actually read.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int Read (void *pData, int cBytes) ;
|
|
||||||
|
|
||||||
int LockAndLoad();
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
long GetShort (void) ;
|
|
||||||
|
|
||||||
DataIOControl *m_InputData ;
|
|
||||||
|
|
||||||
int m_ValidBits ;
|
|
||||||
unsigned long m_Data ;
|
|
||||||
|
|
||||||
static const unsigned long m_ValidMask [32] ;
|
|
||||||
|
|
||||||
char m_tmpadifbits[4]; //CT
|
|
||||||
int m_sendadifbits;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,244 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/prediction.cpp,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: prediction.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: prediction tool
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "prediction.h"
|
|
||||||
#include "channelinfo.h"
|
|
||||||
#include "block.h"
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
// CQuantizedFloat
|
|
||||||
|
|
||||||
const float CPrediction::CQuantizedFloat::m_Mantissa [128] =
|
|
||||||
{
|
|
||||||
0.953125F, 0.945313F, 0.937500F, 0.929688F, 0.925781F, 0.917969F, 0.910156F, 0.902344F,
|
|
||||||
0.898438F, 0.890625F, 0.882813F, 0.878906F, 0.871094F, 0.867188F, 0.859375F, 0.851563F,
|
|
||||||
0.847656F, 0.839844F, 0.835938F, 0.828125F, 0.824219F, 0.820313F, 0.812500F, 0.808594F,
|
|
||||||
0.800781F, 0.796875F, 0.792969F, 0.785156F, 0.781250F, 0.777344F, 0.773438F, 0.765625F,
|
|
||||||
0.761719F, 0.757813F, 0.753906F, 0.750000F, 0.742188F, 0.738281F, 0.734375F, 0.730469F,
|
|
||||||
0.726563F, 0.722656F, 0.718750F, 0.714844F, 0.710938F, 0.707031F, 0.699219F, 0.695313F,
|
|
||||||
0.691406F, 0.687500F, 0.683594F, 0.679688F, 0.679688F, 0.675781F, 0.671875F, 0.667969F,
|
|
||||||
0.664063F, 0.660156F, 0.656250F, 0.652344F, 0.648438F, 0.644531F, 0.640625F, 0.640625F,
|
|
||||||
0.636719F, 0.632813F, 0.628906F, 0.625000F, 0.621094F, 0.621094F, 0.617188F, 0.613281F,
|
|
||||||
0.609375F, 0.605469F, 0.605469F, 0.601563F, 0.597656F, 0.593750F, 0.593750F, 0.589844F,
|
|
||||||
0.585938F, 0.582031F, 0.582031F, 0.578125F, 0.574219F, 0.574219F, 0.570313F, 0.566406F,
|
|
||||||
0.566406F, 0.562500F, 0.558594F, 0.558594F, 0.554688F, 0.550781F, 0.550781F, 0.546875F,
|
|
||||||
0.542969F, 0.542969F, 0.539063F, 0.539063F, 0.535156F, 0.531250F, 0.531250F, 0.527344F,
|
|
||||||
0.527344F, 0.523438F, 0.519531F, 0.519531F, 0.515625F, 0.515625F, 0.511719F, 0.511719F,
|
|
||||||
0.507813F, 0.507813F, 0.503906F, 0.503906F, 0.500000F, 0.498047F, 0.496094F, 0.494141F,
|
|
||||||
0.492188F, 0.490234F, 0.488281F, 0.486328F, 0.484375F, 0.482422F, 0.480469F, 0.478516F
|
|
||||||
} ;
|
|
||||||
|
|
||||||
const float CPrediction::CQuantizedFloat::m_Exponent [256] =
|
|
||||||
{
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F, 0.000000e+000F,
|
|
||||||
5.000000e-001F, 2.500000e-001F, 1.250000e-001F, 6.250000e-002F, 3.125000e-002F, 1.562500e-002F, 7.812500e-003F, 3.906250e-003F,
|
|
||||||
1.953125e-003F, 9.765625e-004F, 4.882813e-004F, 2.441406e-004F, 1.220703e-004F, 6.103516e-005F, 3.051758e-005F, 1.525879e-005F,
|
|
||||||
7.629395e-006F, 3.814697e-006F, 1.907349e-006F, 9.536743e-007F, 4.768372e-007F, 2.384186e-007F, 1.192093e-007F, 5.960464e-008F,
|
|
||||||
2.980232e-008F, 1.490116e-008F, 7.450581e-009F, 3.725290e-009F, 1.862645e-009F, 9.313226e-010F, 4.656613e-010F, 2.328306e-010F,
|
|
||||||
1.164153e-010F, 5.820766e-011F, 2.910383e-011F, 1.455192e-011F, 7.275958e-012F, 3.637979e-012F, 1.818989e-012F, 9.094947e-013F,
|
|
||||||
4.547474e-013F, 2.273737e-013F, 1.136868e-013F, 5.684342e-014F, 2.842171e-014F, 1.421085e-014F, 7.105427e-015F, 3.552714e-015F,
|
|
||||||
1.776357e-015F, 8.881784e-016F, 4.440892e-016F, 2.220446e-016F, 1.110223e-016F, 5.551115e-017F, 2.775558e-017F, 1.387779e-017F,
|
|
||||||
6.938894e-018F, 3.469447e-018F, 1.734723e-018F, 8.673617e-019F, 4.336809e-019F, 2.168404e-019F, 1.084202e-019F, 5.421011e-020F,
|
|
||||||
2.710505e-020F, 1.355253e-020F, 6.776264e-021F, 3.388132e-021F, 1.694066e-021F, 8.470329e-022F, 4.235165e-022F, 2.117582e-022F,
|
|
||||||
1.058791e-022F, 5.293956e-023F, 2.646978e-023F, 1.323489e-023F, 6.617445e-024F, 3.308722e-024F, 1.654361e-024F, 8.271806e-025F,
|
|
||||||
4.135903e-025F, 2.067952e-025F, 1.033976e-025F, 5.169879e-026F, 2.584939e-026F, 1.292470e-026F, 6.462349e-027F, 3.231174e-027F,
|
|
||||||
1.615587e-027F, 8.077936e-028F, 4.038968e-028F, 2.019484e-028F, 1.009742e-028F, 5.048710e-029F, 2.524355e-029F, 1.262177e-029F,
|
|
||||||
6.310887e-030F, 3.155444e-030F, 1.577722e-030F, 7.888609e-031F, 3.944305e-031F, 1.972152e-031F, 9.860761e-032F, 4.930381e-032F,
|
|
||||||
2.465190e-032F, 1.232595e-032F, 6.162976e-033F, 3.081488e-033F, 1.540744e-033F, 7.703720e-034F, 3.851860e-034F, 1.925930e-034F,
|
|
||||||
9.629650e-035F, 4.814825e-035F, 2.407412e-035F, 1.203706e-035F, 6.018531e-036F, 3.009266e-036F, 1.504633e-036F, 7.523164e-037F,
|
|
||||||
3.761582e-037F, 1.880791e-037F, 9.403955e-038F, 4.701977e-038F, 2.350989e-038F, 1.175494e-038F, 5.877472e-039F, 0.000000e+000F
|
|
||||||
} ;
|
|
||||||
|
|
||||||
float CPrediction::CQuantizedFloat::GetBDivVar (void)
|
|
||||||
{
|
|
||||||
// description: compute division of B/VAR by means of two look up tables
|
|
||||||
// returns: single precision float (B/VAR)
|
|
||||||
|
|
||||||
unsigned int mntInd = m_Value & 0x007F0000 ; // extract the 7-bit mantissa index
|
|
||||||
unsigned int expInd = m_Value & 0x7F800000 ; // extract the 8-bit exponent index
|
|
||||||
|
|
||||||
return m_Mantissa [mntInd >> 16] * m_Exponent [expInd >> 23] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
// CPredictionState
|
|
||||||
|
|
||||||
float CPrediction::CPredictionState::FloatRoundInfinity (float x)
|
|
||||||
{
|
|
||||||
// description: rounds 32 bit single precision number to 16 bit precision
|
|
||||||
// float towards infinity (non IEEE comform)
|
|
||||||
// returns: rounded float
|
|
||||||
// input: 32 bit single precision float
|
|
||||||
|
|
||||||
unsigned int t = DWORDCAST(x) ;
|
|
||||||
unsigned int flag = t & 0x8000 ;
|
|
||||||
|
|
||||||
t &= 0xFFFF0000L ; // zero out bits below LSB
|
|
||||||
x = FLOATCAST(t) ;
|
|
||||||
|
|
||||||
// if the below-LSB part of the mantissa is 0.5 or above, round to inf
|
|
||||||
|
|
||||||
if (flag)
|
|
||||||
{
|
|
||||||
// we need to add 1 LSB. However, since the mantissa always includes
|
|
||||||
// a hidden MSB of 1, i.e. 2^e * 1, we need to subtract that afterwards.
|
|
||||||
|
|
||||||
unsigned int c1 = t & 0xFF800000L ; // 2^e * 1
|
|
||||||
unsigned int c2 = c1 | 0x00010000L ; // LSB
|
|
||||||
|
|
||||||
x -= FLOATCAST(c1);
|
|
||||||
x += FLOATCAST(c2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return x ;
|
|
||||||
}
|
|
||||||
|
|
||||||
float CPrediction::CPredictionState::GetPredictedValue (void)
|
|
||||||
{
|
|
||||||
// description: performs prediction for one MDCT bin
|
|
||||||
// returns: predicted value
|
|
||||||
// input: state variable handle, prediction buffer handle
|
|
||||||
|
|
||||||
float k [CPrediction::Order] ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i < CPrediction::Order ; i++)
|
|
||||||
{
|
|
||||||
// compute (b / VAR) * COR
|
|
||||||
|
|
||||||
k [i] = m_var [i].GetBDivVar () * m_cor [i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// compute the estimate, round it to nearest infinity and store it
|
|
||||||
|
|
||||||
return FloatRoundInfinity (k [0] * m_r [0] + k [1] * m_r [1]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPrediction::CPredictionState::Update (float value)
|
|
||||||
{
|
|
||||||
const float ALPHA = 0.90625F ;
|
|
||||||
const float A = 0.953125F ;
|
|
||||||
|
|
||||||
float e [CPrediction::Order] ;
|
|
||||||
|
|
||||||
float k0 = m_cor [0] * m_var [0].GetBDivVar () ;
|
|
||||||
|
|
||||||
e [0] = value ;
|
|
||||||
e [1] = e [0] - k0 * m_r [0] ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i < CPrediction::Order ; i++)
|
|
||||||
{
|
|
||||||
float r = m_r [i] ;
|
|
||||||
|
|
||||||
m_var [i] = ALPHA * m_var [i] + (0.5F) * (r * r + e [i] * e [i]) ;
|
|
||||||
m_cor [i] = ALPHA * m_cor [i] + e [i] * r ;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_r [1] = A * (m_r [0] - k0 * e [0]) ;
|
|
||||||
m_r [0] = A * e [0] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
// CPrediction
|
|
||||||
|
|
||||||
CPrediction::CPrediction ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CPrediction::~CPrediction ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPrediction::FullReset (void)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < CPrediction::MaximumPredictedBins ; i++)
|
|
||||||
{
|
|
||||||
m_State [i].Reset () ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPrediction::Apply (const CChannelInfo &info, CBlock &spectrum)
|
|
||||||
{
|
|
||||||
// short blocks
|
|
||||||
|
|
||||||
if (info.IsShortBlock ())
|
|
||||||
{
|
|
||||||
FullReset () ;
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// long blocks
|
|
||||||
|
|
||||||
const int *BandOffsets = info.GetScaleFactorBandOffsets () ;
|
|
||||||
|
|
||||||
// apply predicted value to transmitted error value
|
|
||||||
|
|
||||||
if (info.GetPredictorDataPresent ())
|
|
||||||
{
|
|
||||||
for (int band = 0 ; band < info.GetMaximumPredictionBands () ; band++)
|
|
||||||
{
|
|
||||||
if (info.GetPredictionUsedForBand (band))
|
|
||||||
{
|
|
||||||
for (int index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index++)
|
|
||||||
{
|
|
||||||
spectrum.AccessSpectralData () [index] += m_State [index].GetPredictedValue () ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// update state
|
|
||||||
|
|
||||||
for (int band = 0 ; band < info.GetMaximumPredictionBands () ; band++)
|
|
||||||
{
|
|
||||||
for (int index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index++)
|
|
||||||
{
|
|
||||||
m_State [index].Update (spectrum.AccessSpectralData () [index]) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// perform cyclic reset
|
|
||||||
|
|
||||||
if (info.GetPerformPredictorReset ())
|
|
||||||
{
|
|
||||||
int group = info.GetPredictorResetGroupNumber () - 1 ;
|
|
||||||
int maxbin = BandOffsets [info.GetMaximumPredictionBands ()] ;
|
|
||||||
|
|
||||||
for (int index = group ; index < maxbin ; index += 30)
|
|
||||||
{
|
|
||||||
m_State [index].Reset () ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,127 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/prediction.h,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: prediction.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: prediction tool
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __PREDICTION_H__
|
|
||||||
#define __PREDICTION_H__
|
|
||||||
|
|
||||||
#define DWORDCAST(x) (*(unsigned int*)&(x))
|
|
||||||
#define FLOATCAST(x) (*(float*)&(x))
|
|
||||||
|
|
||||||
class CChannelInfo ;
|
|
||||||
class CBlock ;
|
|
||||||
|
|
||||||
/** Intra Channel Prediction.
|
|
||||||
|
|
||||||
This class represents the MPEG-2 AAC Main Profile intra channel prediction
|
|
||||||
tool. It holds the state information for a second order backward-adaptive
|
|
||||||
lattice structure predictor for each spectral component, and can be applied
|
|
||||||
to the spectral coefficients in the main profile only.
|
|
||||||
|
|
||||||
Prediction is a profile-dependent tool and the CPrediction implementation
|
|
||||||
follows the Read()/Apply() convention used for all tools.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CPrediction
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
CPrediction () ;
|
|
||||||
~CPrediction () ;
|
|
||||||
|
|
||||||
void Apply (const CChannelInfo &info, CBlock &spectrum) ;
|
|
||||||
|
|
||||||
void FullReset (void) ;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MaximumPredictedBins = 672,
|
|
||||||
Order = 2 // Order of the backward adaptive lattice filter
|
|
||||||
} ;
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
class CQuantizedFloat
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
operator float () const
|
|
||||||
{
|
|
||||||
return FLOATCAST(m_Value) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CQuantizedFloat &operator=(float assigned)
|
|
||||||
{
|
|
||||||
m_Value = DWORDCAST(assigned) & 0xFFFF0000 ;
|
|
||||||
return *this ;
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetBDivVar (void) ;
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
unsigned int m_Value ;
|
|
||||||
|
|
||||||
static const float m_Mantissa [128] ;
|
|
||||||
static const float m_Exponent [256] ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
// State variables of the backward adaptive predictor
|
|
||||||
// (according to lattice structure in IS)
|
|
||||||
|
|
||||||
class CPredictionState
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
CPredictionState ()
|
|
||||||
{
|
|
||||||
Reset () ;
|
|
||||||
}
|
|
||||||
|
|
||||||
~CPredictionState () {}
|
|
||||||
|
|
||||||
float GetPredictedValue (void) ;
|
|
||||||
void Update (float value) ;
|
|
||||||
|
|
||||||
void Reset (void)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < Order ; i++)
|
|
||||||
{
|
|
||||||
m_cor [i] = 0.0F ;
|
|
||||||
m_var [i] = 1.0F ;
|
|
||||||
m_r [i] = 0.0F ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
float FloatRoundInfinity (float x) ;
|
|
||||||
|
|
||||||
CQuantizedFloat m_r [Order] ; // r coefficient
|
|
||||||
CQuantizedFloat m_cor [Order] ; // correlation coefficient
|
|
||||||
CQuantizedFloat m_var [Order] ; // variance coefficient
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
CPredictionState m_State [MaximumPredictedBins] ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
|
@ -1,302 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/programcfg.cpp,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: programcfg.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: program config element
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "programcfg.h"
|
|
||||||
|
|
||||||
CProgramConfig::CProgramConfig ()
|
|
||||||
: m_ElementInstanceTag (4),
|
|
||||||
m_Profile (2),
|
|
||||||
m_SamplingFrequencyIndex (4),
|
|
||||||
m_NumLfeChannelElements (2),
|
|
||||||
m_NumAssocDataElements (3),
|
|
||||||
m_NumValidCcElements (4),
|
|
||||||
|
|
||||||
m_MonoMixdownPresent (1),
|
|
||||||
m_MonoMixdownElementNumber (4),
|
|
||||||
|
|
||||||
m_StereoMixdownPresent (1),
|
|
||||||
m_StereoMixdownElementNumber (4),
|
|
||||||
|
|
||||||
m_MatrixMixdownIndexPresent (1),
|
|
||||||
m_MatrixMixdownIndex (2),
|
|
||||||
m_PseudoSurroundEnable (1),
|
|
||||||
|
|
||||||
m_CommentFieldBytes (8)
|
|
||||||
{
|
|
||||||
m_ExplicitMapping = false ;
|
|
||||||
m_NonMC_ConfigSet = false ;
|
|
||||||
|
|
||||||
for (int row = FrontRow ; row < SpeakerRows ; row++)
|
|
||||||
{
|
|
||||||
m_NumberOfChannels [row] = 0 ;
|
|
||||||
m_NumberOfChannelElements [row] = 0 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CProgramConfig::~CProgramConfig ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CProgramConfig::ResetNonMCConfig(void)
|
|
||||||
{
|
|
||||||
m_ExplicitMapping = false ;
|
|
||||||
m_NonMC_ConfigSet = false ;
|
|
||||||
|
|
||||||
for (int row = FrontRow ; row < SpeakerRows ; row++)
|
|
||||||
{
|
|
||||||
m_NumberOfChannels [row] = 0 ;
|
|
||||||
m_NumberOfChannelElements [row] = 0 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CProgramConfig::Read (CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
int i, row;
|
|
||||||
|
|
||||||
m_ElementInstanceTag.Read(bs) ;
|
|
||||||
m_Profile.Read (bs) ;
|
|
||||||
m_SamplingFrequencyIndex.Read (bs) ;
|
|
||||||
|
|
||||||
for (row = FrontRow ; row < SpeakerRows ; row++)
|
|
||||||
m_NumberOfChannelElements [row].Read (bs, 4) ;
|
|
||||||
|
|
||||||
m_NumLfeChannelElements.Read (bs) ;
|
|
||||||
m_NumAssocDataElements.Read (bs) ;
|
|
||||||
m_NumValidCcElements.Read (bs) ;
|
|
||||||
|
|
||||||
if (m_MonoMixdownPresent.Read (bs))
|
|
||||||
{
|
|
||||||
m_MonoMixdownElementNumber.Read (bs) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_StereoMixdownPresent.Read (bs))
|
|
||||||
{
|
|
||||||
m_StereoMixdownElementNumber.Read (bs) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_MatrixMixdownIndexPresent.Read (bs))
|
|
||||||
{
|
|
||||||
m_MatrixMixdownIndex.Read (bs) ;
|
|
||||||
m_PseudoSurroundEnable.Read (bs) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_NumChannels = 0;
|
|
||||||
for (row = FrontRow ; row < SpeakerRows ; row++)
|
|
||||||
{
|
|
||||||
m_NumberOfChannels [row] = 0 ;
|
|
||||||
|
|
||||||
for (i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
|
|
||||||
{
|
|
||||||
m_ChannelElementIsCpe [row][i].Read (bs, 1) ;
|
|
||||||
m_ChannelElementTagSelect [row][i].Read (bs, 4) ;
|
|
||||||
|
|
||||||
m_NumberOfChannels [row] += m_ChannelElementIsCpe [row][i] ? 2 : 1 ;
|
|
||||||
m_NumChannels += m_NumberOfChannels [row];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0 ; i < m_NumLfeChannelElements ; i++)
|
|
||||||
{
|
|
||||||
m_LfeElementTagSelect [i].Read (bs, 4) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0 ; i < m_NumAssocDataElements ; i++)
|
|
||||||
{
|
|
||||||
m_AssocDataElementTagSelect [i].Read (bs, 4) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0 ; i < m_NumValidCcElements ; i++)
|
|
||||||
{
|
|
||||||
m_CcElementIsIndSw [i].Read (bs, 1) ;
|
|
||||||
m_ValidCcElementTagSelect [i].Read (bs, 4) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// comment
|
|
||||||
|
|
||||||
bs.ByteAlign () ;
|
|
||||||
|
|
||||||
m_CommentFieldBytes.Read (bs) ;
|
|
||||||
|
|
||||||
CVLBBitSequence text (8) ;
|
|
||||||
|
|
||||||
for (i = 0 ; i < m_CommentFieldBytes ; i++)
|
|
||||||
{
|
|
||||||
text.Read (bs) ;
|
|
||||||
|
|
||||||
if (i < MaximumCommentLength)
|
|
||||||
{
|
|
||||||
m_Comment [i] = text ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ExplicitMapping = true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// the decoder calls this method with every
|
|
||||||
// new element id found in the bitstream.
|
|
||||||
|
|
||||||
bool CProgramConfig::AddChannel (const int tag, const bool isCPE)
|
|
||||||
{
|
|
||||||
if (!m_NonMC_ConfigSet)
|
|
||||||
{
|
|
||||||
m_NonMC_Tag = tag ;
|
|
||||||
m_NonMC_IsCPE = isCPE ;
|
|
||||||
m_NonMC_ConfigSet = true ;
|
|
||||||
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return ((m_NonMC_IsCPE == isCPE) && (m_NonMC_Tag == tag)) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CProgramConfig::AddSingleChannel (const int tag)
|
|
||||||
{
|
|
||||||
if (m_ExplicitMapping)
|
|
||||||
{
|
|
||||||
for (int row = 0 ; row < SpeakerRows ; row++)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
|
|
||||||
{
|
|
||||||
if ((m_ChannelElementTagSelect [row][i] == tag) && !m_ChannelElementIsCpe [row][i])
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CProgramConfig::AddChannelPair (const int tag)
|
|
||||||
{
|
|
||||||
if (m_ExplicitMapping)
|
|
||||||
{
|
|
||||||
for (int row = FrontRow ; row < SpeakerRows ; row++)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
|
|
||||||
{
|
|
||||||
if ((m_ChannelElementTagSelect [row][i] == tag) && m_ChannelElementIsCpe [row][i])
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CProgramConfig::AddCouplingChannel (const int tag)
|
|
||||||
{
|
|
||||||
if (m_ExplicitMapping)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < m_NumValidCcElements ; i++)
|
|
||||||
{
|
|
||||||
if (m_ValidCcElementTagSelect [i] == tag)
|
|
||||||
{
|
|
||||||
// inc num_coupling_chan;
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CProgramConfig::AddLowFrequencyChannel (const int tag)
|
|
||||||
{
|
|
||||||
if (m_ExplicitMapping)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < m_NumLfeChannelElements ; i++)
|
|
||||||
{
|
|
||||||
if (m_LfeElementTagSelect [i] == tag) return true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CProgramConfig::IsChannelLocatedAt (const int row, const int tag)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
|
|
||||||
{
|
|
||||||
if (!m_ChannelElementIsCpe [row][i] && (m_ChannelElementTagSelect [row][i] == tag))
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CProgramConfig::IsChannelPairLocatedAt (const int row, const int tag)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
|
|
||||||
{
|
|
||||||
if (m_ChannelElementIsCpe [row][i] && (m_ChannelElementTagSelect [row][i] == tag))
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CProgramConfig::GetNumberOfElements (const int row)
|
|
||||||
{
|
|
||||||
return m_NumberOfChannelElements [row] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CProgramConfig::GetNumberOfChannels (const int row)
|
|
||||||
{
|
|
||||||
return m_NumberOfChannels [row] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CProgramConfig::GetElementTag (const int row, const int index)
|
|
||||||
{
|
|
||||||
return m_ChannelElementTagSelect [row][index] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CProgramConfig::IsChannelPair (const int row, const int index)
|
|
||||||
{
|
|
||||||
return m_ChannelElementIsCpe [row][index] ? true : false ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CProgramConfig::GetNumberOfLowFrequencyChannels (void)
|
|
||||||
{
|
|
||||||
return m_NumLfeChannelElements ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CProgramConfig::GetLowFrequencyChannelTag (const int index)
|
|
||||||
{
|
|
||||||
return m_LfeElementTagSelect [index] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char* CProgramConfig::GetCommentFieldData (void)
|
|
||||||
{
|
|
||||||
char* comment = new char[m_CommentFieldBytes];
|
|
||||||
|
|
||||||
for (int i = 0; i < m_CommentFieldBytes; i++)
|
|
||||||
comment[i] = m_Comment[i];
|
|
||||||
|
|
||||||
return comment;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,222 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/programcfg.h,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: programcfg.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: program config element
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __PROGRAMCFG_H__
|
|
||||||
#define __PROGRAMCFG_H__
|
|
||||||
|
|
||||||
#include "bitsequence.h"
|
|
||||||
|
|
||||||
class CDolbyBitStream ;
|
|
||||||
|
|
||||||
/** PCE Program Configuration Element.
|
|
||||||
|
|
||||||
This class holds the program configuration data read from the bitstream
|
|
||||||
and maps the decoded channels according to the currently active program.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CProgramConfig
|
|
||||||
{
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
FrontRow = 0,
|
|
||||||
SideRow = 1,
|
|
||||||
BackRow = 2,
|
|
||||||
SpeakerRows = 3,
|
|
||||||
|
|
||||||
MaximumChannels = 16,
|
|
||||||
MaximumCommentLength = 64
|
|
||||||
} ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_ElementInstanceTag;
|
|
||||||
CVLBBitSequence m_Profile ;
|
|
||||||
CVLBBitSequence m_SamplingFrequencyIndex ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_NumLfeChannelElements ;
|
|
||||||
CVLBBitSequence m_NumAssocDataElements ;
|
|
||||||
CVLBBitSequence m_NumValidCcElements ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_MonoMixdownPresent ;
|
|
||||||
CVLBBitSequence m_MonoMixdownElementNumber ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_StereoMixdownPresent ;
|
|
||||||
CVLBBitSequence m_StereoMixdownElementNumber ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_MatrixMixdownIndexPresent ;
|
|
||||||
CVLBBitSequence m_MatrixMixdownIndex ;
|
|
||||||
CVLBBitSequence m_PseudoSurroundEnable ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_NumberOfChannelElements [SpeakerRows] ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_ChannelElementIsCpe [SpeakerRows][MaximumChannels] ;
|
|
||||||
CVLBBitSequence m_ChannelElementTagSelect [SpeakerRows][MaximumChannels] ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_LfeElementTagSelect [MaximumChannels] ;
|
|
||||||
CVLBBitSequence m_AssocDataElementTagSelect [MaximumChannels] ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_CcElementIsIndSw [MaximumChannels] ;
|
|
||||||
CVLBBitSequence m_ValidCcElementTagSelect [MaximumChannels] ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_CommentFieldBytes ;
|
|
||||||
char m_Comment [MaximumCommentLength] ;
|
|
||||||
|
|
||||||
unsigned int m_NumChannels;
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
CProgramConfig () ;
|
|
||||||
~CProgramConfig () ;
|
|
||||||
|
|
||||||
void ResetNonMCConfig(void);
|
|
||||||
|
|
||||||
void Read (CDolbyBitStream &bs) ;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
bool AddChannel (const int tag, const bool isCPE) ;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
bool AddSingleChannel (const int tag) ;
|
|
||||||
bool AddChannelPair (const int tag) ;
|
|
||||||
bool AddCouplingChannel (const int tag) ;
|
|
||||||
bool AddLowFrequencyChannel (const int tag) ;
|
|
||||||
|
|
||||||
// explicit query
|
|
||||||
|
|
||||||
bool IsFrontChannel (const int tag) { return IsChannelLocatedAt (FrontRow, tag) ; }
|
|
||||||
bool IsFrontChannelPair (const int tag) { return IsChannelPairLocatedAt (FrontRow, tag) ; }
|
|
||||||
|
|
||||||
bool IsBackChannel (const int tag) { return IsChannelLocatedAt (BackRow, tag) ; }
|
|
||||||
bool IsBackChannelPair (const int tag) { return IsChannelPairLocatedAt (BackRow, tag) ; }
|
|
||||||
|
|
||||||
// query by index
|
|
||||||
|
|
||||||
int GetNumberOfElements (const int row) ;
|
|
||||||
int GetNumberOfChannels (const int row) ;
|
|
||||||
|
|
||||||
int GetElementTag (const int row, const int index) ;
|
|
||||||
bool IsChannelPair (const int row, const int index) ;
|
|
||||||
|
|
||||||
int GetNumberOfLowFrequencyChannels (void) ;
|
|
||||||
int GetLowFrequencyChannelTag (const int index) ;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
bool HasSpeakerMapping (void) const
|
|
||||||
{
|
|
||||||
return m_ExplicitMapping ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetElementInstnaceTag (void) const
|
|
||||||
{
|
|
||||||
return m_ElementInstanceTag ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetProfile (void) const
|
|
||||||
{
|
|
||||||
return m_Profile ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetSamplingFrequencyIndex (void) const
|
|
||||||
{
|
|
||||||
return m_SamplingFrequencyIndex ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetNumChannels (void) const
|
|
||||||
{
|
|
||||||
return m_NumChannels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetNumFrontChannels (void) const
|
|
||||||
{
|
|
||||||
return m_NumberOfChannelElements[FrontRow] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetNumSideChannels (void) const
|
|
||||||
{
|
|
||||||
return m_NumberOfChannelElements[SideRow] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetNumBackChannels (void) const
|
|
||||||
{
|
|
||||||
return m_NumberOfChannelElements[BackRow] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetNumLfeChannels (void) const
|
|
||||||
{
|
|
||||||
return m_NumLfeChannelElements ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetNumCouplingChannels (void) const
|
|
||||||
{
|
|
||||||
return m_NumValidCcElements ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetCouplingChannelTag (int index) const
|
|
||||||
{
|
|
||||||
return m_ValidCcElementTagSelect[index] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetMonoMixdownPresent (void) const
|
|
||||||
{
|
|
||||||
return m_MonoMixdownPresent ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetStereoMixdownPresent (void) const
|
|
||||||
{
|
|
||||||
return m_StereoMixdownPresent ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetMatrixMixdownPresent (void) const
|
|
||||||
{
|
|
||||||
return m_MatrixMixdownIndexPresent ;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetPseudoSurroundPresent (void) const
|
|
||||||
{
|
|
||||||
return m_PseudoSurroundEnable ;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* GetCommentFieldData (void);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
bool IsChannelLocatedAt (const int row, const int tag) ;
|
|
||||||
bool IsChannelPairLocatedAt (const int row, const int tag) ;
|
|
||||||
|
|
||||||
// non-multichannel configuration
|
|
||||||
|
|
||||||
bool m_NonMC_ConfigSet ;
|
|
||||||
bool m_NonMC_IsCPE ;
|
|
||||||
|
|
||||||
int m_NonMC_Tag ;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
bool m_ExplicitMapping ;
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int m_NumberOfChannels [SpeakerRows] ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,62 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/pulsedata.cpp,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: pulsedata.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: pulse data tool
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include "pulsedata.h"
|
|
||||||
#include "bitstream.h"
|
|
||||||
#include "channelinfo.h"
|
|
||||||
|
|
||||||
CPulseData::CPulseData ()
|
|
||||||
: m_PulseDataPresent (1),
|
|
||||||
m_NumberPulse (2),
|
|
||||||
m_PulseStartBand (6)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CPulseData::~CPulseData ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPulseData::Read (CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
if (m_PulseDataPresent.Read (bs))
|
|
||||||
{
|
|
||||||
m_NumberPulse.Read (bs) ;
|
|
||||||
m_PulseStartBand.Read (bs) ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i <= m_NumberPulse ; i++)
|
|
||||||
{
|
|
||||||
m_PulseOffset [i].Read (bs, 5) ;
|
|
||||||
m_PulseAmp [i].Read (bs, 4) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPulseData::Apply (const CChannelInfo &info, int coef [])
|
|
||||||
{
|
|
||||||
if (m_PulseDataPresent)
|
|
||||||
{
|
|
||||||
int k = info.GetScaleFactorBandOffsets () [(int) m_PulseStartBand] ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i <= m_NumberPulse ; i++)
|
|
||||||
{
|
|
||||||
k += m_PulseOffset [i] ;
|
|
||||||
|
|
||||||
if (coef [k] > 0) coef [k] += m_PulseAmp [i] ;
|
|
||||||
else coef [k] -= m_PulseAmp [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/pulsedata.h,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: pulsedata.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: pulse data tool
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __PULSEDATA_H__
|
|
||||||
#define __PULSEDATA_H__
|
|
||||||
|
|
||||||
#include "bitsequence.h"
|
|
||||||
|
|
||||||
class CChannelInfo ;
|
|
||||||
|
|
||||||
/** Pulse Data Processing.
|
|
||||||
|
|
||||||
This class represents the pulse data noiseless coding tool for decoding and
|
|
||||||
applying pulse data to the spectral coefficients of the current block.
|
|
||||||
|
|
||||||
The Pulse Data tool is not profile-dependent and the CPulseData implementation
|
|
||||||
follows the Read()/Apply() convention used for all tools.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CPulseData
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
CPulseData () ;
|
|
||||||
~CPulseData () ;
|
|
||||||
|
|
||||||
void Read (CDolbyBitStream &bs) ;
|
|
||||||
void Apply (const CChannelInfo &info, int coef []) ;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MaximumLines = 4
|
|
||||||
} ;
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
CVLBBitSequence m_PulseDataPresent ;
|
|
||||||
CVLBBitSequence m_NumberPulse ;
|
|
||||||
CVLBBitSequence m_PulseStartBand ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_PulseOffset [MaximumLines] ;
|
|
||||||
CVLBBitSequence m_PulseAmp [MaximumLines] ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,17 +0,0 @@
|
||||||
//{{NO_DEPENDENCIES}}
|
|
||||||
// Microsoft Developer Studio generated include file.
|
|
||||||
// Used by logo.rc
|
|
||||||
//
|
|
||||||
#define IDB_BITMAP1 101
|
|
||||||
#define IDB_BITMAP2 102
|
|
||||||
|
|
||||||
// Next default values for new objects
|
|
||||||
//
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 103
|
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
|
||||||
#endif
|
|
||||||
#endif
|
|
|
@ -1,14 +0,0 @@
|
||||||
//{{NO_DEPENDENCIES}}
|
|
||||||
// Microsoft Visual C++ generated include file.
|
|
||||||
// Used by vlb.rc
|
|
||||||
|
|
||||||
// Next default values for new objects
|
|
||||||
//
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 101
|
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
|
||||||
#endif
|
|
||||||
#endif
|
|
|
@ -1,420 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/shortblock.cpp,v 1.2 2011/06/13 02:06:03 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: shortblock.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: eight short window sequence object
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include <math.h> // pow()
|
|
||||||
|
|
||||||
#include "block.h"
|
|
||||||
#include "bitstream.h"
|
|
||||||
#include "channelinfo.h"
|
|
||||||
#include "overlapadd.h"
|
|
||||||
|
|
||||||
#ifdef MAIN_PROFILE
|
|
||||||
#include "prediction.h"
|
|
||||||
#endif
|
|
||||||
// ctor/dtor
|
|
||||||
|
|
||||||
CShortBlock::CShortBlock (CChannelInfo &info)
|
|
||||||
: CBlock (info)
|
|
||||||
{
|
|
||||||
m_SectBits = 3 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
CShortBlock::~CShortBlock ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// low-level access
|
|
||||||
|
|
||||||
float *CShortBlock::AccessSpectralData (int window)
|
|
||||||
{
|
|
||||||
return m_SpectralCoefficient [window] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int *CShortBlock::AccessCodeBooks (int group)
|
|
||||||
{
|
|
||||||
return m_CodeBook [group] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int *CShortBlock::AccessScaleFactors (int group)
|
|
||||||
{
|
|
||||||
return m_ScaleFactor [group] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// readers
|
|
||||||
|
|
||||||
void CShortBlock::ReadSectionData (CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
CVLBBitSequence sect_cb (4) ;
|
|
||||||
CVLBBitSequence sect_len_incr (m_SectBits) ;
|
|
||||||
|
|
||||||
int sect_esc_val = (1 << m_SectBits) - 1 ;
|
|
||||||
|
|
||||||
//Section Information:
|
|
||||||
int iNumberOfSections;
|
|
||||||
|
|
||||||
for (int group = 0 ; group < m_IcsInfo.GetWindowGroups () ; group++)
|
|
||||||
{
|
|
||||||
int band ; // msdev not ansi
|
|
||||||
|
|
||||||
// initialize first group's section info
|
|
||||||
iNumberOfSections=0;
|
|
||||||
sSectionInfoStruct.aiSectionCount[group]=0;
|
|
||||||
sSectionInfoStruct.aaiSectionStart[group][0]=0;
|
|
||||||
|
|
||||||
for (band = 0 ; band < m_IcsInfo.GetScaleFactorBandsTransmitted () ; )
|
|
||||||
{
|
|
||||||
sect_cb.Read (bs) ;
|
|
||||||
sect_len_incr.Read (bs) ;
|
|
||||||
|
|
||||||
int sect_len = 0 ;
|
|
||||||
|
|
||||||
while (sect_len_incr == sect_esc_val)
|
|
||||||
{
|
|
||||||
sect_len += sect_esc_val ;
|
|
||||||
sect_len_incr.Read (bs) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
sect_len += sect_len_incr ;
|
|
||||||
|
|
||||||
for (int top = band + sect_len ; band < top ; band++)
|
|
||||||
{
|
|
||||||
m_CodeBook [group][band] = sect_cb ;
|
|
||||||
|
|
||||||
if ((m_CodeBook [group][band] == BOOKSCL) ||
|
|
||||||
(m_CodeBook [group][band] == RESERVED_HCB)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
throw EInvalidCodeBook () ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sSectionInfoStruct.aaiSectionCodebooks[group][iNumberOfSections]=sect_cb;
|
|
||||||
sSectionInfoStruct.aaiSectionStart[group][iNumberOfSections+1]=band;
|
|
||||||
sSectionInfoStruct.aaiSectionEnd[group][iNumberOfSections]=band;
|
|
||||||
sSectionInfoStruct.aiSectionCount[group]++;
|
|
||||||
iNumberOfSections++;
|
|
||||||
|
|
||||||
} // for band
|
|
||||||
|
|
||||||
if(band < m_IcsInfo.GetScaleFactorBandsTotal() && m_IcsInfo.GetScaleFactorBandsTransmitted()){
|
|
||||||
sSectionInfoStruct.aaiSectionCodebooks[group][iNumberOfSections]=ZERO_HCB;
|
|
||||||
sSectionInfoStruct.aaiSectionEnd[group][iNumberOfSections]= m_IcsInfo.GetScaleFactorBandsTotal ();
|
|
||||||
sSectionInfoStruct.aiSectionCount[group]++;
|
|
||||||
iNumberOfSections++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( ; band < m_IcsInfo.GetScaleFactorBandsTotal () ; band++)
|
|
||||||
{
|
|
||||||
m_CodeBook [group][band] = ZERO_HCB ;
|
|
||||||
}
|
|
||||||
} // for group..
|
|
||||||
}
|
|
||||||
|
|
||||||
void CShortBlock::ReadScaleFactorData (CDolbyBitStream &bs, const int global_gain)
|
|
||||||
{
|
|
||||||
const CodeBookDescription *hcb = &HuffmanCodeBooks [BOOKSCL] ;
|
|
||||||
|
|
||||||
int factor = global_gain ;
|
|
||||||
int position = 0 ;
|
|
||||||
|
|
||||||
int temp ;
|
|
||||||
|
|
||||||
for (int group = 0 ; group < m_IcsInfo.GetWindowGroups () ; group++)
|
|
||||||
{
|
|
||||||
for (int band = 0 ; band < m_IcsInfo.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
switch (m_CodeBook [group][band])
|
|
||||||
{
|
|
||||||
case ZERO_HCB : // zero book
|
|
||||||
|
|
||||||
m_ScaleFactor [group][band] = 0 ;
|
|
||||||
break ;
|
|
||||||
|
|
||||||
default : // decode scale factor
|
|
||||||
|
|
||||||
temp = DecodeHuffmanWord (bs, hcb->CodeBook) ;
|
|
||||||
factor += temp - 60 ; // MIDFAC 1.5 dB
|
|
||||||
|
|
||||||
m_ScaleFactor [group][band] = factor - 100 ;
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case INTENSITY_HCB : // intensity steering
|
|
||||||
case INTENSITY_HCB2 :
|
|
||||||
|
|
||||||
temp = DecodeHuffmanWord (bs, hcb->CodeBook) ;
|
|
||||||
position += temp - 60 ;
|
|
||||||
|
|
||||||
m_ScaleFactor [group][band] = position - 100 ;
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CShortBlock::ReadSpectralData (CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
const int *BandOffsets = m_IcsInfo.GetScaleFactorBandOffsets () ;
|
|
||||||
|
|
||||||
int QuantizedCoef [MaximumWindows][MaximumBins] ;
|
|
||||||
|
|
||||||
int window, group ;
|
|
||||||
|
|
||||||
// // // clear coeffs
|
|
||||||
|
|
||||||
for (window = 0 ; window < MaximumWindows ; window++)
|
|
||||||
{
|
|
||||||
for (int index = 0 ; index < MaximumBins ; index++)
|
|
||||||
{
|
|
||||||
QuantizedCoef [window][index] = 0 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// // // read interleaved coeffs
|
|
||||||
|
|
||||||
int groupoffset = 0 ;
|
|
||||||
|
|
||||||
for (group = 0 ; group < m_IcsInfo.GetWindowGroups () ; group++)
|
|
||||||
{
|
|
||||||
for (int band = 0 ; band < m_IcsInfo.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
const CodeBookDescription *hcb = &HuffmanCodeBooks [m_CodeBook [group][band]] ;
|
|
||||||
|
|
||||||
for (int groupwin = 0 ; groupwin < m_IcsInfo.GetWindowGroupLength (group) ; groupwin++)
|
|
||||||
{
|
|
||||||
if ((m_CodeBook [group][band] == ZERO_HCB) ||
|
|
||||||
(m_CodeBook [group][band] == INTENSITY_HCB) ||
|
|
||||||
(m_CodeBook [group][band] == INTENSITY_HCB2)
|
|
||||||
)
|
|
||||||
continue ;
|
|
||||||
|
|
||||||
int window = groupoffset + groupwin ;
|
|
||||||
int step = 0 ;
|
|
||||||
|
|
||||||
for (int index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index += step)
|
|
||||||
{
|
|
||||||
step = UnpackIndex (DecodeHuffmanWord (bs, hcb->CodeBook), &QuantizedCoef [window][index], hcb) ;
|
|
||||||
|
|
||||||
if (!hcb->IsSigned)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < step ; i++)
|
|
||||||
{
|
|
||||||
if (QuantizedCoef [window][index + i])
|
|
||||||
{
|
|
||||||
if (bs.Get (1)) // sign bit
|
|
||||||
{
|
|
||||||
QuantizedCoef [window][index + i] = -QuantizedCoef [window][index + i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_CodeBook [group][band] == ESCBOOK)
|
|
||||||
{
|
|
||||||
QuantizedCoef [window][index] = GetEscape (bs, QuantizedCoef [window][index]) ;
|
|
||||||
QuantizedCoef [window][index + 1] = GetEscape (bs, QuantizedCoef [window][index + 1]) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
groupoffset += m_IcsInfo.GetWindowGroupLength (group) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// // //
|
|
||||||
|
|
||||||
for (window = 0, group = 0 ; group < m_IcsInfo.GetWindowGroups () ; group++)
|
|
||||||
{
|
|
||||||
for (int groupwin = 0 ; groupwin < m_IcsInfo.GetWindowGroupLength (group) ; groupwin++, window++)
|
|
||||||
{
|
|
||||||
// dequantize
|
|
||||||
|
|
||||||
for (int index = 0 ; index < MaximumBins ; index++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [window][index] = InverseQuantize (QuantizedCoef [window][index]) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// apply scalefactors
|
|
||||||
|
|
||||||
for (int band = 0 ; band < m_IcsInfo.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
float factor = static_cast<float>(m_ScaleFactor [group][band]) ;
|
|
||||||
|
|
||||||
if ((factor >= 0) && (factor < ExpTableSize))
|
|
||||||
{
|
|
||||||
factor = m_ExpTable [m_ScaleFactor [group][band]] ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
factor = static_cast<float>(pow (2.0F, 0.25F * factor)) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_ScaleFactor [group][band] != -100)
|
|
||||||
{
|
|
||||||
for (int index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [window][index] *= factor ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (int index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [window][index] = 0.0F ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CShortBlock::TransformWindows (COverlapAddBuffer &Previous, float EightWindowsBuffer [])
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < 2048 ; i++)
|
|
||||||
{
|
|
||||||
EightWindowsBuffer [i] = 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int window = 0 ; window < MaximumWindows ; window++)
|
|
||||||
{
|
|
||||||
float *theSpectrum = m_SpectralCoefficient [window] ;
|
|
||||||
|
|
||||||
InverseTransform (theSpectrum) ;
|
|
||||||
|
|
||||||
if (window == 0)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < 128 ; i++)
|
|
||||||
{
|
|
||||||
theSpectrum [i] *= m_ShortWindow [Previous.GetWindowShape ()][i] ;
|
|
||||||
theSpectrum [128 + i] *= m_ShortWindow [m_IcsInfo.GetWindowShape ()][127 - i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < 128 ; i++)
|
|
||||||
{
|
|
||||||
theSpectrum [i] *= m_ShortWindow [m_IcsInfo.GetWindowShape ()][i] ;
|
|
||||||
theSpectrum [128 + i] *= m_ShortWindow [m_IcsInfo.GetWindowShape ()][127 - i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// overlap add the 8 windows in this block
|
|
||||||
|
|
||||||
for (int i = 0 ; i < 256 ; i++)
|
|
||||||
{
|
|
||||||
EightWindowsBuffer [448 + 128 * window + i] += theSpectrum [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Previous.SetWindowShape (m_IcsInfo.GetWindowShape ()) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void CShortBlock::FrequencyToTime (COverlapAddBuffer &Previous, short Output [], const int stride)
|
|
||||||
{
|
|
||||||
float EightWindowsBuffer [2048] ;
|
|
||||||
|
|
||||||
TransformWindows (Previous, EightWindowsBuffer) ;
|
|
||||||
|
|
||||||
#if defined (WIN32) && defined (_M_IX86)
|
|
||||||
|
|
||||||
PentiumOverlap (m_Output, EightWindowsBuffer, Previous.AccessBuffer (), stride) ;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
for (int j = 0 ; j < 1024 ; j++)
|
|
||||||
{
|
|
||||||
// add first half and old data
|
|
||||||
|
|
||||||
Output [j * stride] = FloatToShort (EightWindowsBuffer [j] + Previous [j]) ;
|
|
||||||
|
|
||||||
// store second half as old data
|
|
||||||
|
|
||||||
Previous [j] = EightWindowsBuffer [1024 + j] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
void CShortBlock::FrequencyToTime_Fast (COverlapAddBuffer &Previous)
|
|
||||||
{
|
|
||||||
float EightWindowsBuffer [2048] ;
|
|
||||||
|
|
||||||
TransformWindows (Previous, EightWindowsBuffer) ;
|
|
||||||
|
|
||||||
#if defined (WIN32) && defined (_M_IX86)
|
|
||||||
|
|
||||||
PentiumOverlap (m_Output, EightWindowsBuffer, Previous.AccessBuffer (), 1) ;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
for (int j = 0 ; j < 1024 ; j++)
|
|
||||||
{
|
|
||||||
// add first half and old data
|
|
||||||
|
|
||||||
m_Output [j] = EightWindowsBuffer [j] + Previous [j];
|
|
||||||
|
|
||||||
// store second half as old data
|
|
||||||
|
|
||||||
Previous [j] = EightWindowsBuffer [1024 + j] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void CShortBlock::FrequencyToTime (COverlapAddBuffer &Previous, float Output [], const int stride)
|
|
||||||
{
|
|
||||||
float EightWindowsBuffer [2048] ;
|
|
||||||
|
|
||||||
TransformWindows (Previous, EightWindowsBuffer) ;
|
|
||||||
|
|
||||||
for (int j = 0 ; j < 1024 ; j++)
|
|
||||||
{
|
|
||||||
// add first half and old data
|
|
||||||
|
|
||||||
Output [j * stride] = EightWindowsBuffer [j] + Previous [j] ;
|
|
||||||
|
|
||||||
// store second half as old data
|
|
||||||
|
|
||||||
Previous [j] = EightWindowsBuffer [1024 + j] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CShortBlock::FrequencyToTime (COverlapAddBuffer &Previous)
|
|
||||||
{
|
|
||||||
float EightWindowsBuffer [2048] ;
|
|
||||||
TransformWindows (Previous, EightWindowsBuffer) ;
|
|
||||||
for (int j = 0 ; j < 1024 ; j++)
|
|
||||||
{
|
|
||||||
m_Output [j] = EightWindowsBuffer [j] + Previous [j] ;
|
|
||||||
Previous [j] = EightWindowsBuffer [1024 + j] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CShortBlock::ApplyEqualizationMask (float Mask [])
|
|
||||||
{
|
|
||||||
for (int window = 0 ; window < MaximumWindows ; window++)
|
|
||||||
{
|
|
||||||
for (int i = 0 ; i < EqualizationMaskLength ; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0 ; j < (MaximumBins / EqualizationMaskLength) ; j++)
|
|
||||||
{
|
|
||||||
m_SpectralCoefficient [window][(MaximumBins / EqualizationMaskLength) * i + j] *= Mask [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,158 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/stereo.cpp,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: stereo.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: mid/side and intensity stereo processing
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "stereo.h"
|
|
||||||
#include "bitstream.h"
|
|
||||||
#include "channelinfo.h"
|
|
||||||
#include "block.h"
|
|
||||||
|
|
||||||
CJointStereo::CJointStereo ()
|
|
||||||
: m_MsMaskPresent (2)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CJointStereo::~CJointStereo ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CJointStereo::Read (const CChannelInfo &info, CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
m_MsMaskPresent.Read (bs) ;
|
|
||||||
|
|
||||||
int group, band ;
|
|
||||||
|
|
||||||
switch (m_MsMaskPresent)
|
|
||||||
{
|
|
||||||
case 0 : // no M/S
|
|
||||||
|
|
||||||
for (group = 0 ; group < info.GetWindowGroups () ; group++)
|
|
||||||
{
|
|
||||||
for (band = 0 ; band < info.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
m_MsUsed [group][band] = false ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case 1 : // read ms_used
|
|
||||||
|
|
||||||
for (group = 0 ; group < info.GetWindowGroups () ; group++)
|
|
||||||
{
|
|
||||||
for (band = 0 ; band < info.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
m_MsUsed [group][band] = bs.Get (1) ? true : false ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break ;
|
|
||||||
|
|
||||||
case 2 : // full spectrum M/S
|
|
||||||
|
|
||||||
for (group = 0 ; group < info.GetWindowGroups () ; group++)
|
|
||||||
{
|
|
||||||
for (band = 0 ; band < info.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
m_MsUsed [group][band] = true ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// mid / side
|
|
||||||
|
|
||||||
void CJointStereo::ApplyMS (const CChannelInfo &info, CBlock &left, CBlock &right)
|
|
||||||
{
|
|
||||||
const int *BandOffsets = info.GetScaleFactorBandOffsets () ;
|
|
||||||
|
|
||||||
for (int window = 0, group = 0 ; group < info.GetWindowGroups () ; group++)
|
|
||||||
{
|
|
||||||
for (int groupwin = 0 ; groupwin < info.GetWindowGroupLength (group) ; groupwin++, window++)
|
|
||||||
{
|
|
||||||
float *LeftSpectrum = left.AccessSpectralData (window) ;
|
|
||||||
float *RightSpectrum = right.AccessSpectralData (window) ;
|
|
||||||
|
|
||||||
for (int band = 0 ; band < info.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
if (m_MsUsed [group][band] == true)
|
|
||||||
{
|
|
||||||
for (int index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index++)
|
|
||||||
{
|
|
||||||
float LeftCoefficient = LeftSpectrum [index] ;
|
|
||||||
float RightCoefficient = RightSpectrum [index] ;
|
|
||||||
|
|
||||||
LeftSpectrum [index] = LeftCoefficient + RightCoefficient ;
|
|
||||||
RightSpectrum [index] = LeftCoefficient - RightCoefficient ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// intensity
|
|
||||||
|
|
||||||
void CJointStereo::ApplyIS (const CChannelInfo &info, CBlock &left, CBlock &right)
|
|
||||||
{
|
|
||||||
const int *BandOffsets = info.GetScaleFactorBandOffsets () ;
|
|
||||||
|
|
||||||
for (int window = 0, group = 0 ; group < info.GetWindowGroups () ; group++)
|
|
||||||
{
|
|
||||||
int *CodeBook = right.AccessCodeBooks (group) ;
|
|
||||||
int *ScaleFactor = right.AccessScaleFactors (group) ;
|
|
||||||
|
|
||||||
for (int groupwin = 0 ; groupwin < info.GetWindowGroupLength (group) ; groupwin++, window++)
|
|
||||||
{
|
|
||||||
float *LeftSpectrum = left.AccessSpectralData (window) ;
|
|
||||||
float *RightSpectrum = right.AccessSpectralData (window) ;
|
|
||||||
|
|
||||||
for (int band = 0 ; band < info.GetScaleFactorBandsTransmitted () ; band++)
|
|
||||||
{
|
|
||||||
if ((CodeBook [band] == CBlock::INTENSITY_HCB) ||
|
|
||||||
(CodeBook [band] == CBlock::INTENSITY_HCB2)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
float scale = (float) pow (0.5F, 0.25F * (ScaleFactor [band] + 100)) ;
|
|
||||||
|
|
||||||
if (m_MsUsed [group][band])
|
|
||||||
{
|
|
||||||
if (CodeBook [band] == CBlock::INTENSITY_HCB) // _NOT_ in-phase
|
|
||||||
{
|
|
||||||
scale *= -1 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (CodeBook [band] == CBlock::INTENSITY_HCB2) // out-of-phase
|
|
||||||
{
|
|
||||||
scale *= -1 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int index = BandOffsets [band] ; index < BandOffsets [band + 1] ; index++)
|
|
||||||
{
|
|
||||||
RightSpectrum [index] = LeftSpectrum [index] * scale ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/stereo.h,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: stereo.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: mid/side and intensity stereo processing
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __STEREO_H__
|
|
||||||
#define __STEREO_H__
|
|
||||||
|
|
||||||
#include "bitsequence.h"
|
|
||||||
|
|
||||||
class CChannelInfo ;
|
|
||||||
class CBlock ;
|
|
||||||
|
|
||||||
/** Joint Stereo Processing.
|
|
||||||
|
|
||||||
This class represents the stereo processing tool for decoding mid/side and
|
|
||||||
intensity coded bands of spectral coefficients.
|
|
||||||
|
|
||||||
The Stereo Processing tool is not profile-dependent and the CJointStereo
|
|
||||||
implementation follows the Read()/Apply() convention used for all tools
|
|
||||||
as far as applicable.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CJointStereo
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
CJointStereo () ;
|
|
||||||
~CJointStereo () ;
|
|
||||||
|
|
||||||
void Read (const CChannelInfo &info, CDolbyBitStream &bs) ;
|
|
||||||
|
|
||||||
void ApplyMS (const CChannelInfo &info, CBlock &left, CBlock &right) ;
|
|
||||||
void ApplyIS (const CChannelInfo &info, CBlock &left, CBlock &right) ;
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MaximumGroups = 8,
|
|
||||||
MaximumBands = 64
|
|
||||||
} ;
|
|
||||||
|
|
||||||
bool m_MsUsed [CJointStereo::MaximumGroups][CJointStereo::MaximumBands] ;
|
|
||||||
|
|
||||||
CVLBBitSequence m_MsMaskPresent ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,394 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/streaminfo.h,v 1.1 2009/04/28 20:21:11 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: streaminfo.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: current bitstream parameters
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __STREAMINFO_H__
|
|
||||||
#define __STREAMINFO_H__
|
|
||||||
|
|
||||||
#define COPYRIGHT_SIZE 9
|
|
||||||
#define BYTE_SIZE 8
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned int m_SamplingRateIndex ;
|
|
||||||
unsigned int m_SamplingRate ;
|
|
||||||
unsigned int m_Profile ;
|
|
||||||
unsigned int m_ChannelConfig ;
|
|
||||||
unsigned int m_Channels ;
|
|
||||||
unsigned int m_BitRate ;
|
|
||||||
|
|
||||||
unsigned int m_ProtectionAbsent;
|
|
||||||
unsigned int m_OriginalCopy;
|
|
||||||
unsigned int m_Home;
|
|
||||||
char m_CopyrightID[COPYRIGHT_SIZE];
|
|
||||||
unsigned int m_FrameLength;
|
|
||||||
|
|
||||||
unsigned int m_ChannelMask ;
|
|
||||||
|
|
||||||
unsigned int m_NumberOfFrontChannels ;
|
|
||||||
unsigned int m_NumberOfSideChannels ;
|
|
||||||
unsigned int m_NumberOfBackChannels ;
|
|
||||||
unsigned int m_NumberOfLfeChannels ;
|
|
||||||
|
|
||||||
unsigned int m_ADTSFrameLength;
|
|
||||||
unsigned int m_ADTSNumberOfRawDataBlocks;
|
|
||||||
|
|
||||||
bool m_UseDblLengthXfrm;
|
|
||||||
|
|
||||||
} STREAMINFO, * PSTREAMINFO ;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
|
|
||||||
/** Stream Configuration and Information.
|
|
||||||
|
|
||||||
This class holds configuration and information data for a stream to be decoded. It
|
|
||||||
provides the calling application as well as the decoder with substantial information,
|
|
||||||
e.g. profile, sampling rate, number of channels found in the bitstream etc.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CStreamInfo : protected STREAMINFO
|
|
||||||
{
|
|
||||||
|
|
||||||
public :
|
|
||||||
|
|
||||||
/// Object Constructor. Initializes all the STREAMINFO members to zero.
|
|
||||||
|
|
||||||
CStreamInfo ()
|
|
||||||
{
|
|
||||||
m_SamplingRateIndex = 0 ;
|
|
||||||
m_SamplingRate = 0 ;
|
|
||||||
m_Profile = 0 ;
|
|
||||||
m_ChannelConfig = 0 ;
|
|
||||||
m_Channels = 0 ;
|
|
||||||
m_BitRate = 0 ;
|
|
||||||
m_UseDblLengthXfrm = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~CStreamInfo()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetUseDblLengthXfrm(bool flag)
|
|
||||||
{
|
|
||||||
m_UseDblLengthXfrm = flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Configures the sampling rate by index.
|
|
||||||
|
|
||||||
void SetSamplingRateIndex (unsigned int sf)
|
|
||||||
{
|
|
||||||
m_SamplingRateIndex = sf ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the sampling rate by index.
|
|
||||||
|
|
||||||
unsigned int GetSamplingRateIndex (void) const
|
|
||||||
{
|
|
||||||
return m_SamplingRateIndex ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the decoder profile.
|
|
||||||
|
|
||||||
void SetProfile (unsigned int profile)
|
|
||||||
{
|
|
||||||
m_Profile = profile ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the decoder profile.
|
|
||||||
|
|
||||||
unsigned int GetProfile (void) const
|
|
||||||
{
|
|
||||||
return m_Profile ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the channel configuration.
|
|
||||||
|
|
||||||
void SetChannelConfig (unsigned int config)
|
|
||||||
{
|
|
||||||
m_ChannelConfig = config ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the channel configuration.
|
|
||||||
|
|
||||||
unsigned int GetChannelConfig (void) const
|
|
||||||
{
|
|
||||||
return m_ChannelConfig ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the number of decoded channels (by value).
|
|
||||||
|
|
||||||
void SetChannels (unsigned int chan)
|
|
||||||
{
|
|
||||||
m_Channels = chan ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the number of decoded channels (incrementally).
|
|
||||||
|
|
||||||
void IncChannels (unsigned int chan)
|
|
||||||
{
|
|
||||||
m_Channels += chan ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the number of decoded channels.
|
|
||||||
|
|
||||||
unsigned int GetChannels (void) const
|
|
||||||
{
|
|
||||||
return m_Channels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the bitrate.
|
|
||||||
|
|
||||||
void SetBitRate (unsigned int bps)
|
|
||||||
{
|
|
||||||
m_BitRate = bps ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the bitrate.
|
|
||||||
|
|
||||||
unsigned int GetBitRate (void) const
|
|
||||||
{
|
|
||||||
return m_BitRate ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the sampling rate by value.
|
|
||||||
|
|
||||||
void SetSamplingRate (unsigned int sf)
|
|
||||||
{
|
|
||||||
m_SamplingRate = sf ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the sampling rate by value.
|
|
||||||
|
|
||||||
unsigned int GetSamplingRate (void) const
|
|
||||||
{
|
|
||||||
if (m_UseDblLengthXfrm)
|
|
||||||
{
|
|
||||||
return m_SamplingRate << 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return m_SamplingRate ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the sampling rate by value.
|
|
||||||
|
|
||||||
unsigned int GetRawSamplingRate (void) const
|
|
||||||
{
|
|
||||||
return m_SamplingRate ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the protection absent flag.
|
|
||||||
|
|
||||||
void SetProtectionAbsent (unsigned int pa)
|
|
||||||
{
|
|
||||||
m_ProtectionAbsent = pa ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the protection absent flag.
|
|
||||||
|
|
||||||
unsigned int GetProtectionAbsent (void) const
|
|
||||||
{
|
|
||||||
return m_ProtectionAbsent ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the original copy flag.
|
|
||||||
|
|
||||||
void SetOriginalCopy (unsigned int oc)
|
|
||||||
{
|
|
||||||
m_OriginalCopy = oc ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the original copy flag.
|
|
||||||
|
|
||||||
unsigned int GetOriginalCopy (void) const
|
|
||||||
{
|
|
||||||
return m_OriginalCopy ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the home flag.
|
|
||||||
|
|
||||||
void SetHome (unsigned int h)
|
|
||||||
{
|
|
||||||
m_Home = h ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the home flag.
|
|
||||||
|
|
||||||
unsigned int GetHome (void) const
|
|
||||||
{
|
|
||||||
return m_Home ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the copyright id.
|
|
||||||
|
|
||||||
void SetCopyrightID (char cid, int index)
|
|
||||||
{
|
|
||||||
m_CopyrightID[index] = cid ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the copyright id.
|
|
||||||
|
|
||||||
char GetCopyrightID (int index) const
|
|
||||||
{
|
|
||||||
return m_CopyrightID[index] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the frame length.
|
|
||||||
|
|
||||||
void SetFrameLength (unsigned int fl)
|
|
||||||
{
|
|
||||||
m_FrameLength = fl ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the frame length.
|
|
||||||
|
|
||||||
unsigned int GetFrameLength (void) const
|
|
||||||
{
|
|
||||||
return m_FrameLength ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configures the channel present indicator mask
|
|
||||||
|
|
||||||
void SetChannelMask (unsigned int channelMask)
|
|
||||||
{
|
|
||||||
m_ChannelMask = channelMask ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the channel present indicator mask
|
|
||||||
|
|
||||||
unsigned int GetChannelMask (void)
|
|
||||||
{
|
|
||||||
return m_ChannelMask ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the number of front channels
|
|
||||||
|
|
||||||
void SetNumberOfFrontChannels (unsigned int frontChannels)
|
|
||||||
{
|
|
||||||
m_NumberOfFrontChannels = frontChannels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the number of front channels
|
|
||||||
|
|
||||||
int GetNumberOfFrontChannels (void)
|
|
||||||
{
|
|
||||||
return m_NumberOfFrontChannels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the number of side channels
|
|
||||||
|
|
||||||
void SetNumberOfSideChannels (unsigned int sideChannels)
|
|
||||||
{
|
|
||||||
m_NumberOfSideChannels = sideChannels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the number of side channels
|
|
||||||
|
|
||||||
int GetNumberOfSideChannels (void)
|
|
||||||
{
|
|
||||||
return m_NumberOfSideChannels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configures the number of back channels
|
|
||||||
|
|
||||||
void SetNumberOfBackChannels (unsigned int backChannels)
|
|
||||||
{
|
|
||||||
m_NumberOfBackChannels = backChannels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the number of back channels
|
|
||||||
|
|
||||||
int GetNumberOfBackChannels (void)
|
|
||||||
{
|
|
||||||
return m_NumberOfBackChannels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configures the number of Low Frequency Enhancement channels
|
|
||||||
|
|
||||||
void SetNumberOfLfeChannels (unsigned int lfeChannels)
|
|
||||||
{
|
|
||||||
m_NumberOfLfeChannels = lfeChannels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieves the number of Low Frequency Enhancement channels
|
|
||||||
|
|
||||||
int GetNumberOfLfeChannels (void)
|
|
||||||
{
|
|
||||||
return m_NumberOfLfeChannels ;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
SamplesPerFrame = 1024
|
|
||||||
} ;
|
|
||||||
|
|
||||||
/// Retrieves the number of delivered samples per audio frame.
|
|
||||||
|
|
||||||
unsigned int GetSamplesPerFrame (void) const
|
|
||||||
{
|
|
||||||
return SamplesPerFrame ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Retrieves the number of delivered bytes per audio frame
|
|
||||||
|
|
||||||
unsigned int GetOutputBytes (void) const
|
|
||||||
{
|
|
||||||
return GetSamplesPerFrame () * GetChannels () * sizeof (short) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setSampleRate();
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// constants for speaker positions and channel index mapping
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
Channel_FrontLeft = 0,
|
|
||||||
Channel_FrontRight = 1,
|
|
||||||
Channel_FrontCenter = 2,
|
|
||||||
Channel_LowFrequency = 3,
|
|
||||||
Channel_BackLeft = 4,
|
|
||||||
Channel_BackRight = 5,
|
|
||||||
Channel_FrontLeftOfCenter = 6,
|
|
||||||
Channel_FrontRightOfCenter = 7,
|
|
||||||
Channel_BackCenter = 8,
|
|
||||||
Channel_SideLeft = 9,
|
|
||||||
Channel_SideRight = 10,
|
|
||||||
Speaker_StandardPositions,
|
|
||||||
|
|
||||||
Speaker_FrontLeft = 1 << Channel_FrontLeft,
|
|
||||||
Speaker_FrontRight = 1 << Channel_FrontRight,
|
|
||||||
Speaker_FrontCenter = 1 << Channel_FrontCenter,
|
|
||||||
Speaker_LowFrequency = 1 << Channel_LowFrequency,
|
|
||||||
Speaker_BackLeft = 1 << Channel_BackLeft,
|
|
||||||
Speaker_BackRight = 1 << Channel_BackRight,
|
|
||||||
Speaker_FrontLeftOfCenter = 1 << Channel_FrontLeftOfCenter,
|
|
||||||
Speaker_FrontRightOfCenter = 1 << Channel_FrontRightOfCenter,
|
|
||||||
Speaker_BackCenter = 1 << Channel_BackCenter,
|
|
||||||
Speaker_SideLeft = 1 << Channel_SideLeft,
|
|
||||||
Speaker_SideRight = 1 << Channel_SideRight,
|
|
||||||
|
|
||||||
Speaker_FrontSpeakers = Speaker_FrontLeft + Speaker_FrontRight + Speaker_FrontCenter
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
1175
Src/vlb/tables.cpp
1175
Src/vlb/tables.cpp
File diff suppressed because it is too large
Load diff
214
Src/vlb/tns.cpp
214
Src/vlb/tns.cpp
|
@ -1,214 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/tns.cpp,v 1.1 2009/04/28 20:21:11 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: tns.cpp
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: temporal noise shaping
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "tns.h"
|
|
||||||
#include "channelinfo.h"
|
|
||||||
#include "block.h"
|
|
||||||
|
|
||||||
CTns::CTns ()
|
|
||||||
: m_TnsDataPresent (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CTns::~CTns ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTns::Read (const CChannelInfo &info, CDolbyBitStream &bs)
|
|
||||||
{
|
|
||||||
m_TnsDataPresent.Read (bs) ;
|
|
||||||
if (!m_TnsDataPresent) return ;
|
|
||||||
|
|
||||||
CVLBBitSequence n_filt (info.IsLongBlock () ? 2 : 1) ;
|
|
||||||
CVLBBitSequence length (info.IsLongBlock () ? 6 : 4) ;
|
|
||||||
CVLBBitSequence order (info.IsLongBlock () ? 5 : 3) ;
|
|
||||||
|
|
||||||
CVLBBitSequence direction (1) ;
|
|
||||||
CVLBBitSequence coef_compress (1) ;
|
|
||||||
CVLBBitSequence coef_res (1) ;
|
|
||||||
|
|
||||||
for (int window = 0 ; window < info.GetWindowsPerFrame () ; window++)
|
|
||||||
{
|
|
||||||
m_NumberOfFilters [window] = n_filt.Read (bs) ;
|
|
||||||
|
|
||||||
if (n_filt)
|
|
||||||
{
|
|
||||||
coef_res.Read (bs) ;
|
|
||||||
|
|
||||||
int nextstopband = info.GetScaleFactorBandsTotal () ;
|
|
||||||
|
|
||||||
for (int index = 0 ; index < n_filt ; index++)
|
|
||||||
{
|
|
||||||
CFilter &filter = m_Filter [window][index] ;
|
|
||||||
|
|
||||||
length.Read (bs) ;
|
|
||||||
|
|
||||||
filter.m_StartBand = nextstopband - length ;
|
|
||||||
filter.m_StopBand = nextstopband ;
|
|
||||||
|
|
||||||
nextstopband = filter.m_StartBand ;
|
|
||||||
|
|
||||||
filter.m_Order = order.Read (bs) ;
|
|
||||||
|
|
||||||
if (order)
|
|
||||||
{
|
|
||||||
filter.m_Direction = direction.Read (bs) ? -1 : 1 ;
|
|
||||||
|
|
||||||
coef_compress.Read (bs) ;
|
|
||||||
|
|
||||||
filter.m_Resolution = coef_res + 3 ;
|
|
||||||
|
|
||||||
static const int sgn_mask [] = { 0x2, 0x4, 0x8 } ;
|
|
||||||
static const int neg_mask [] = { ~0x3, ~0x7, ~0xF } ;
|
|
||||||
|
|
||||||
int s_mask = sgn_mask [coef_res + 1 - coef_compress] ;
|
|
||||||
int n_mask = neg_mask [coef_res + 1 - coef_compress] ;
|
|
||||||
|
|
||||||
for (int i = 0 ; i < order ; i++)
|
|
||||||
{
|
|
||||||
CVLBBitSequence coef (filter.m_Resolution - coef_compress) ;
|
|
||||||
coef.Read (bs) ;
|
|
||||||
|
|
||||||
filter.m_Coeff [i] = ((int) coef & s_mask) ? ((int) coef | n_mask) : (int) coef ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTns::Apply (const CChannelInfo &info, CBlock &spectrum)
|
|
||||||
{
|
|
||||||
if (!m_TnsDataPresent) return ;
|
|
||||||
|
|
||||||
float CoeffLPC [MaximumOrder + 1] ;
|
|
||||||
|
|
||||||
for (int window = 0 ; window < info.GetWindowsPerFrame () ; window++)
|
|
||||||
{
|
|
||||||
for (int index = 0 ; index < m_NumberOfFilters [window] ; index++)
|
|
||||||
{
|
|
||||||
CFilter &filter = m_Filter [window][index] ;
|
|
||||||
|
|
||||||
DecodeCoefficients (filter, CoeffLPC) ;
|
|
||||||
|
|
||||||
int start = Minimum (filter.m_StartBand, info.GetMaximumTnsBands (),
|
|
||||||
info.GetScaleFactorBandsTransmitted ()) ;
|
|
||||||
|
|
||||||
start = info.GetScaleFactorBandOffsets () [start] ;
|
|
||||||
|
|
||||||
int stop = Minimum (filter.m_StopBand, info.GetMaximumTnsBands (),
|
|
||||||
info.GetScaleFactorBandsTransmitted ()) ;
|
|
||||||
|
|
||||||
stop = info.GetScaleFactorBandOffsets () [stop] ;
|
|
||||||
|
|
||||||
int size = stop - start ;
|
|
||||||
|
|
||||||
if (size <= 0) continue ;
|
|
||||||
|
|
||||||
Filter (&spectrum.AccessSpectralData (window) [start], size,
|
|
||||||
filter.m_Direction, CoeffLPC, filter.m_Order) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTns::DecodeCoefficients (CFilter &filter, float *a)
|
|
||||||
{
|
|
||||||
float tmp [MaximumOrder + 1], b [MaximumOrder + 1] ;
|
|
||||||
|
|
||||||
// Inverse quantization
|
|
||||||
|
|
||||||
const float pi2 = 3.14159265358979323846F / 2.0F ;
|
|
||||||
|
|
||||||
float iqfac = ((1 << (filter.m_Resolution - 1)) - 0.5F) / pi2 ;
|
|
||||||
float iqfac_m = ((1 << (filter.m_Resolution - 1)) + 0.5F) / pi2 ;
|
|
||||||
|
|
||||||
int i ;
|
|
||||||
|
|
||||||
for (i = 0 ; i < filter.m_Order ; i++)
|
|
||||||
{
|
|
||||||
tmp [i + 1] = (float) sin (filter.m_Coeff [i] / ((filter.m_Coeff [i] >= 0) ? iqfac : iqfac_m)) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Conversion to LPC coefficients - Markel and Gray, pg. 95
|
|
||||||
|
|
||||||
a [0] = 1.0F ;
|
|
||||||
|
|
||||||
for (int m = 1 ; m <= filter.m_Order ; m++)
|
|
||||||
{
|
|
||||||
b [0] = a [0] ;
|
|
||||||
|
|
||||||
for (i = 1 ; i < m ; i++)
|
|
||||||
{
|
|
||||||
b [i] = a [i] + tmp [m] * a [m - i] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
b [m] = tmp [m] ;
|
|
||||||
|
|
||||||
for (i = 0 ; i <= m ; i++)
|
|
||||||
{
|
|
||||||
a [i] = b [i] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTns::Filter (float *spec, int size, int inc, float *lpc, int order)
|
|
||||||
{
|
|
||||||
// - Simple all-pole filter of order "order" defined by
|
|
||||||
// y(n) = x(n) - a(2)*y(n-1) - ... - a(order+1)*y(n-order)
|
|
||||||
//
|
|
||||||
// - The state variables of the filter are initialized to zero every time
|
|
||||||
//
|
|
||||||
// - The output data is written over the input data ("in-place operation")
|
|
||||||
//
|
|
||||||
// - An input vector of "size" samples is processed and the index increment
|
|
||||||
// to the next data sample is given by "inc"
|
|
||||||
|
|
||||||
int i, j;
|
|
||||||
float y, state [MaximumOrder] ;
|
|
||||||
|
|
||||||
for (i = 0 ; i < order ; i++)
|
|
||||||
{
|
|
||||||
state [i] = 0.0F ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inc == -1)
|
|
||||||
{
|
|
||||||
spec += size - 1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0 ; i < size ; i++)
|
|
||||||
{
|
|
||||||
y = *spec;
|
|
||||||
|
|
||||||
for (j = 0 ; j < order ; j++)
|
|
||||||
{
|
|
||||||
y -= lpc [j + 1] * state [j] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = order - 1 ; j > 0 ; j--)
|
|
||||||
{
|
|
||||||
state [j] = state [j - 1] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
state [0] = y ;
|
|
||||||
*spec = y ;
|
|
||||||
spec += inc ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,86 +0,0 @@
|
||||||
/* $Header: /cvs/root/winamp/vlb/tns.h,v 1.1 2009/04/28 20:21:11 audiodsp Exp $ */
|
|
||||||
|
|
||||||
/***************************************************************************\
|
|
||||||
*
|
|
||||||
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
|
||||||
* Reserved. Do not copy. Do not distribute.
|
|
||||||
* Confidential information.
|
|
||||||
*
|
|
||||||
* (C) copyright Fraunhofer - IIS (1998)
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* filename: tns.h
|
|
||||||
* project : MPEG-2 AAC Decoder
|
|
||||||
* contents/description: temporal noise shaping
|
|
||||||
*
|
|
||||||
\***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __TNS_H__
|
|
||||||
#define __TNS_H__
|
|
||||||
|
|
||||||
#include "bitsequence.h"
|
|
||||||
|
|
||||||
class CChannelInfo ;
|
|
||||||
class CBlock ;
|
|
||||||
|
|
||||||
/** Temporal Noise Shaping.
|
|
||||||
|
|
||||||
This class represents the temporal noise shaping tool for decoding and
|
|
||||||
applying tns filter data to the spectral coefficients of the current block.
|
|
||||||
|
|
||||||
TNS is a profile-dependent tool and the CTns implementation follows the
|
|
||||||
Read()/Apply() convention used for all tools.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CTns
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
CTns () ;
|
|
||||||
~CTns () ;
|
|
||||||
|
|
||||||
void Read (const CChannelInfo &info, CDolbyBitStream &bs) ;
|
|
||||||
void Apply (const CChannelInfo &info, CBlock &spectrum) ;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
MaximumWindows = 8,
|
|
||||||
MaximumBands = 49,
|
|
||||||
MaximumOrder = 31,
|
|
||||||
MaximumFilters = 3
|
|
||||||
} ;
|
|
||||||
|
|
||||||
protected :
|
|
||||||
|
|
||||||
CVLBBitSequence m_TnsDataPresent ;
|
|
||||||
|
|
||||||
class CFilter
|
|
||||||
{
|
|
||||||
public :
|
|
||||||
|
|
||||||
int m_StartBand ;
|
|
||||||
int m_StopBand ;
|
|
||||||
|
|
||||||
int m_Direction ;
|
|
||||||
int m_Resolution ;
|
|
||||||
|
|
||||||
int m_Order ;
|
|
||||||
int m_Coeff [MaximumOrder] ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
int m_NumberOfFilters [MaximumWindows] ;
|
|
||||||
CFilter m_Filter [MaximumWindows][MaximumFilters] ;
|
|
||||||
|
|
||||||
int Minimum (int a, int b, int c)
|
|
||||||
{
|
|
||||||
int t = (a < b ) ? a : b ;
|
|
||||||
return (t < c) ? t : c ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DecodeCoefficients (CFilter &filter, float *a) ;
|
|
||||||
void Filter (float *spec, int size, int inc, float *lpc, int order) ;
|
|
||||||
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,39 +0,0 @@
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Version
|
|
||||||
//
|
|
||||||
#include "../Winamp/buildType.h"
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
|
||||||
FILEVERSION WINAMP_PRODUCTVER
|
|
||||||
PRODUCTVERSION WINAMP_PRODUCTVER
|
|
||||||
FILEFLAGSMASK 0x17L
|
|
||||||
#ifdef _DEBUG
|
|
||||||
FILEFLAGS 0x1L
|
|
||||||
#else
|
|
||||||
FILEFLAGS 0x0L
|
|
||||||
#endif
|
|
||||||
FILEOS 0x4L
|
|
||||||
FILETYPE 0x2L
|
|
||||||
FILESUBTYPE 0x0L
|
|
||||||
BEGIN
|
|
||||||
BLOCK "StringFileInfo"
|
|
||||||
BEGIN
|
|
||||||
BLOCK "040904b0"
|
|
||||||
BEGIN
|
|
||||||
VALUE "CompanyName", "Winamp SA"
|
|
||||||
VALUE "FileDescription", "Winamp 5.x System Component"
|
|
||||||
VALUE "FileVersion", STR_WINAMP_PRODUCTVER
|
|
||||||
VALUE "InternalName", "vlb.w5s"
|
|
||||||
VALUE "LegalCopyright", "Copyright © 2005-2023 Winamp SA"
|
|
||||||
VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA"
|
|
||||||
VALUE "OriginalFilename", "vlb.w5s"
|
|
||||||
VALUE "ProductName", "Winamp VLB Decoder Service"
|
|
||||||
VALUE "ProductVersion", STR_WINAMP_PRODUCTVER
|
|
||||||
END
|
|
||||||
END
|
|
||||||
BLOCK "VarFileInfo"
|
|
||||||
BEGIN
|
|
||||||
VALUE "Translation", 0x409, 1200
|
|
||||||
END
|
|
||||||
END
|
|
|
@ -1,76 +0,0 @@
|
||||||
// Microsoft Visual C++ generated resource script.
|
|
||||||
//
|
|
||||||
#include "resource1.h"
|
|
||||||
|
|
||||||
#define APSTUDIO_READONLY_SYMBOLS
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Generated from the TEXTINCLUDE 2 resource.
|
|
||||||
//
|
|
||||||
#include "afxres.h"
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
#undef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// English (U.S.) resources
|
|
||||||
|
|
||||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
|
||||||
#ifdef _WIN32
|
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|
||||||
#pragma code_page(1252)
|
|
||||||
#endif //_WIN32
|
|
||||||
|
|
||||||
#endif // English (U.S.) resources
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// English (U.K.) resources
|
|
||||||
|
|
||||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
|
|
||||||
#ifdef _WIN32
|
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
|
|
||||||
#pragma code_page(1252)
|
|
||||||
#endif //_WIN32
|
|
||||||
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// TEXTINCLUDE
|
|
||||||
//
|
|
||||||
|
|
||||||
1 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"resource1.h\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
2 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"#include ""afxres.h""\r\n"
|
|
||||||
"\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
3 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"#include ""version.rc2""\r\n"
|
|
||||||
"\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
#endif // APSTUDIO_INVOKED
|
|
||||||
|
|
||||||
#endif // English (U.K.) resources
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef APSTUDIO_INVOKED
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Generated from the TEXTINCLUDE 3 resource.
|
|
||||||
//
|
|
||||||
#include "version.rc2"
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
#endif // not APSTUDIO_INVOKED
|
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 16
|
|
||||||
VisualStudioVersion = 16.0.29424.173
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vlb", "vlb.vcxproj", "{2E7AB185-8E16-4458-BF5A-853B6619CC3B}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Debug|x64 = Debug|x64
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
Release|x64 = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{2E7AB185-8E16-4458-BF5A-853B6619CC3B}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{2E7AB185-8E16-4458-BF5A-853B6619CC3B}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{2E7AB185-8E16-4458-BF5A-853B6619CC3B}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{2E7AB185-8E16-4458-BF5A-853B6619CC3B}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{2E7AB185-8E16-4458-BF5A-853B6619CC3B}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{2E7AB185-8E16-4458-BF5A-853B6619CC3B}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{2E7AB185-8E16-4458-BF5A-853B6619CC3B}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{2E7AB185-8E16-4458-BF5A-853B6619CC3B}.Release|x64.Build.0 = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
SolutionGuid = {74224C5F-B8F5-4611-AA1F-A0CD1F71234B}
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1,324 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug|x64">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|x64">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{2E7AB185-8E16-4458-BF5A-853B6619CC3B}</ProjectGuid>
|
|
||||||
<RootNamespace>vlb</RootNamespace>
|
|
||||||
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
|
|
||||||
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
|
|
||||||
<TargetExt>.w5s</TargetExt>
|
|
||||||
<IncludePath>$(IncludePath)</IncludePath>
|
|
||||||
<LibraryPath>$(LibraryPath)</LibraryPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
|
|
||||||
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
|
|
||||||
<TargetExt>.w5s</TargetExt>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
|
|
||||||
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
|
|
||||||
<TargetExt>.w5s</TargetExt>
|
|
||||||
<IncludePath>$(IncludePath)</IncludePath>
|
|
||||||
<LibraryPath>$(LibraryPath)</LibraryPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
|
|
||||||
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
|
|
||||||
<TargetExt>.w5s</TargetExt>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<VcpkgConfiguration>Debug</VcpkgConfiguration>
|
|
||||||
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
|
|
||||||
<VcpkgConfiguration>Debug</VcpkgConfiguration>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<AdditionalIncludeDirectories>../Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<MinimalRebuild>false</MinimalRebuild>
|
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
|
||||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
|
||||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
|
||||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
|
||||||
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
|
||||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
|
||||||
<ImportLibrary>$(ProjectDir)x86_Debug\$(ProjectName).lib</ImportLibrary>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
|
||||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
|
||||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
||||||
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
<PostBuildEvent>
|
|
||||||
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\
|
|
||||||
xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
|
|
||||||
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
|
|
||||||
</PostBuildEvent>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<AdditionalIncludeDirectories>../Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<MinimalRebuild>false</MinimalRebuild>
|
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
|
||||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
|
||||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
|
||||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
|
||||||
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
|
||||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
|
||||||
<ImportLibrary>$(ProjectDir)x64_Debug\$(ProjectName).lib</ImportLibrary>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
|
||||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
||||||
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
|
||||||
</Link>
|
|
||||||
<PostBuildEvent>
|
|
||||||
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\
|
|
||||||
xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
|
|
||||||
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
|
|
||||||
</PostBuildEvent>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<Optimization>MinSpace</Optimization>
|
|
||||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
|
||||||
<AdditionalIncludeDirectories>../Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<StringPooling>true</StringPooling>
|
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
|
||||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
|
||||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
|
||||||
<ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>None</DebugInformationFormat>
|
|
||||||
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
|
||||||
<ImportLibrary>$(ProjectDir)x86_Release\$(ProjectName).lib</ImportLibrary>
|
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
|
||||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
|
||||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
||||||
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
|
||||||
</Link>
|
|
||||||
<PostBuildEvent>
|
|
||||||
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
|
|
||||||
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
|
|
||||||
</PostBuildEvent>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<Optimization>MinSpace</Optimization>
|
|
||||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
|
||||||
<AdditionalIncludeDirectories>../Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<StringPooling>true</StringPooling>
|
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
|
||||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
|
||||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
|
||||||
<ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>None</DebugInformationFormat>
|
|
||||||
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
|
||||||
<ImportLibrary>$(ProjectDir)x64_Release\$(ProjectName).lib</ImportLibrary>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
|
||||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
|
||||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
||||||
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
|
||||||
</Link>
|
|
||||||
<PostBuildEvent>
|
|
||||||
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
|
|
||||||
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
|
|
||||||
</PostBuildEvent>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="aacdecoder.cpp" />
|
|
||||||
<ClCompile Include="aacdecoderapi.cpp" />
|
|
||||||
<ClCompile Include="adif.cpp" />
|
|
||||||
<ClCompile Include="audio_io.cpp" />
|
|
||||||
<ClCompile Include="audio_io_dsp.cpp" />
|
|
||||||
<ClCompile Include="bitbuffer.cpp" />
|
|
||||||
<ClCompile Include="bitsequence.cpp" />
|
|
||||||
<ClCompile Include="block.cpp" />
|
|
||||||
<ClCompile Include="channel.cpp" />
|
|
||||||
<ClCompile Include="channelinfo.cpp" />
|
|
||||||
<ClCompile Include="datastream.cpp" />
|
|
||||||
<ClCompile Include="DolbyPayload.cpp" />
|
|
||||||
<ClCompile Include="dolby_imdct.cpp" />
|
|
||||||
<ClCompile Include="factory_nsvVlb.cpp" />
|
|
||||||
<ClCompile Include="factory_vlbDecoder.cpp" />
|
|
||||||
<ClCompile Include="fft.cpp" />
|
|
||||||
<ClCompile Include="imdct.cpp" />
|
|
||||||
<ClCompile Include="longblock.cpp" />
|
|
||||||
<ClCompile Include="NSVFactory.cpp" />
|
|
||||||
<ClCompile Include="nsv_vlb.cpp" />
|
|
||||||
<ClCompile Include="obj_vlbDecoder.cpp" />
|
|
||||||
<ClCompile Include="plainfile.cpp" />
|
|
||||||
<ClCompile Include="prediction.cpp" />
|
|
||||||
<ClCompile Include="programcfg.cpp" />
|
|
||||||
<ClCompile Include="pulsedata.cpp" />
|
|
||||||
<ClCompile Include="shortblock.cpp" />
|
|
||||||
<ClCompile Include="stereo.cpp" />
|
|
||||||
<ClCompile Include="tables.cpp" />
|
|
||||||
<ClCompile Include="tns.cpp" />
|
|
||||||
<ClCompile Include="VlbDecoder.cpp" />
|
|
||||||
<ClCompile Include="VLBIO.cpp" />
|
|
||||||
<ClCompile Include="w5s.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="aacdecoder.h" />
|
|
||||||
<ClInclude Include="aacdecoderapi.h" />
|
|
||||||
<ClInclude Include="adif.h" />
|
|
||||||
<ClInclude Include="api__vlb.h" />
|
|
||||||
<ClInclude Include="audio_io.h" />
|
|
||||||
<ClInclude Include="audio_io_dsp.h" />
|
|
||||||
<ClInclude Include="bitbuffer.h" />
|
|
||||||
<ClInclude Include="bitsequence.h" />
|
|
||||||
<ClInclude Include="bitstream.h" />
|
|
||||||
<ClInclude Include="block.h" />
|
|
||||||
<ClInclude Include="channel.h" />
|
|
||||||
<ClInclude Include="channelinfo.h" />
|
|
||||||
<ClInclude Include="DataIO.h" />
|
|
||||||
<ClInclude Include="datastream.h" />
|
|
||||||
<ClInclude Include="DolbyPayload.h" />
|
|
||||||
<ClInclude Include="dolby_imdct.h" />
|
|
||||||
<ClInclude Include="exception.h" />
|
|
||||||
<ClInclude Include="factory_nsvVlb.h" />
|
|
||||||
<ClInclude Include="factory_vlbDecoder.h" />
|
|
||||||
<ClInclude Include="fft.h" />
|
|
||||||
<ClInclude Include="NSVFactory.h" />
|
|
||||||
<ClInclude Include="nsv_vlb.h" />
|
|
||||||
<ClInclude Include="obj_vlbDecoder.h" />
|
|
||||||
<ClInclude Include="overlapadd.h" />
|
|
||||||
<ClInclude Include="plainfile.h" />
|
|
||||||
<ClInclude Include="prediction.h" />
|
|
||||||
<ClInclude Include="programcfg.h" />
|
|
||||||
<ClInclude Include="pulsedata.h" />
|
|
||||||
<ClInclude Include="resource.h" />
|
|
||||||
<ClInclude Include="resource1.h" />
|
|
||||||
<ClInclude Include="stereo.h" />
|
|
||||||
<ClInclude Include="streaminfo.h" />
|
|
||||||
<ClInclude Include="tns.h" />
|
|
||||||
<ClInclude Include="VlbDecoder.h" />
|
|
||||||
<ClInclude Include="window_tab.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ResourceCompile Include="vlb.rc" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Wasabi\Wasabi.vcxproj">
|
|
||||||
<Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
|
@ -1,224 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="w5s.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="VLBIO.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="VlbDecoder.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="tns.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="tables.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="stereo.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="shortblock.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="pulsedata.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="programcfg.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="prediction.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="plainfile.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="obj_vlbDecoder.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="NSVFactory.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="nsv_vlb.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="longblock.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="imdct.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="fft.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="factory_vlbDecoder.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="factory_nsvVlb.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="dolby_imdct.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="DolbyPayload.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="datastream.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="channelinfo.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="channel.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="block.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="bitsequence.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="bitbuffer.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="audio_io_dsp.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="audio_io.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="adif.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="aacdecoderapi.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="aacdecoder.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="aacdecoder.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="aacdecoderapi.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="adif.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="api__vlb.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="audio_io.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="audio_io_dsp.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="bitbuffer.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="bitsequence.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="bitstream.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="block.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="channel.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="channelinfo.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="DataIO.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="datastream.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="dolby_imdct.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="DolbyPayload.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="exception.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="factory_nsvVlb.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="factory_vlbDecoder.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="fft.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="nsv_vlb.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="NSVFactory.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="obj_vlbDecoder.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="overlapadd.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="plainfile.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="prediction.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="programcfg.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="pulsedata.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="resource.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="resource1.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="stereo.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="streaminfo.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="tns.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="VlbDecoder.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="window_tab.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{2b3efc06-1046-47a4-956e-af652b688c1f}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Ressource Files">
|
|
||||||
<UniqueIdentifier>{0398d98a-dea2-4fea-bf3b-abb9658ea82f}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{21521068-58d4-46cd-91ed-25876514b0f0}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ResourceCompile Include="vlb.rc">
|
|
||||||
<Filter>Ressource Files</Filter>
|
|
||||||
</ResourceCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,20 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#define BUFSIZE 16384
|
|
||||||
#define OBUFSIZE 65536
|
|
||||||
#include "audio_io.h"
|
|
||||||
class VLBOut : public AudioIOControl {
|
|
||||||
public:
|
|
||||||
VLBOut() { size = pos = 0; }
|
|
||||||
virtual ~VLBOut() { }
|
|
||||||
virtual int IO( float **, int );
|
|
||||||
virtual int SetFormatInfo( AUDIO_FORMATINFO *info ) { format = *info; return AUDIO_ERROR_NONE; }
|
|
||||||
AUDIO_FORMATINFO GetFormatInfo() { return format; }
|
|
||||||
|
|
||||||
int BytesAvail() { return size; }
|
|
||||||
virtual void PullBytes( unsigned char *buf, int nbytes );
|
|
||||||
void Empty(){ size = 0; }
|
|
||||||
private:
|
|
||||||
unsigned char data[OBUFSIZE];
|
|
||||||
int size,pos;
|
|
||||||
AUDIO_FORMATINFO format;
|
|
||||||
};
|
|
|
@ -1,78 +0,0 @@
|
||||||
#include "factory_vlbDecoder.h"
|
|
||||||
#include "factory_nsvVlb.h"
|
|
||||||
#include "api__vlb.h"
|
|
||||||
#include <bfc/platform/export.h>
|
|
||||||
|
|
||||||
#include "../Agave/Component/ifc_wa5component.h"
|
|
||||||
|
|
||||||
class VLBComponent : public ifc_wa5component
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void RegisterServices(api_service *service);
|
|
||||||
int RegisterServicesSafeModeOk();
|
|
||||||
void DeregisterServices(api_service *service);
|
|
||||||
protected:
|
|
||||||
RECVS_DISPATCH;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class api_T>
|
|
||||||
void ServiceBuild(api_T *&api_t, GUID factoryGUID_t)
|
|
||||||
{
|
|
||||||
if (WASABI_API_SVC)
|
|
||||||
{
|
|
||||||
waServiceFactory *factory = WASABI_API_SVC->service_getServiceByGuid(factoryGUID_t);
|
|
||||||
if (factory)
|
|
||||||
api_t = reinterpret_cast<api_T *>( factory->getInterface() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class api_T>
|
|
||||||
void ServiceRelease(api_T *api_t, GUID factoryGUID_t)
|
|
||||||
{
|
|
||||||
if (WASABI_API_SVC && api_t)
|
|
||||||
{
|
|
||||||
waServiceFactory *factory = WASABI_API_SVC->service_getServiceByGuid(factoryGUID_t);
|
|
||||||
if (factory)
|
|
||||||
factory->releaseInterface(api_t);
|
|
||||||
}
|
|
||||||
api_t = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
VLBDecoderFactory vlbDecoderFactory;
|
|
||||||
NSVVLBFactory nsvDecoderFactory;
|
|
||||||
VLBComponent vlbComponent;
|
|
||||||
api_service *WASABI_API_SVC=0;
|
|
||||||
api_memmgr *WASABI_API_MEMMGR = 0;
|
|
||||||
|
|
||||||
void VLBComponent::RegisterServices(api_service *service)
|
|
||||||
{
|
|
||||||
WASABI_API_SVC = service;
|
|
||||||
WASABI_API_SVC->service_register(&vlbDecoderFactory);
|
|
||||||
WASABI_API_SVC->service_register(&nsvDecoderFactory);
|
|
||||||
ServiceBuild(WASABI_API_MEMMGR, memMgrApiServiceGuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
int VLBComponent::RegisterServicesSafeModeOk()
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VLBComponent::DeregisterServices(api_service *service)
|
|
||||||
{
|
|
||||||
service->service_deregister(&vlbDecoderFactory);
|
|
||||||
service->service_deregister(&nsvDecoderFactory);
|
|
||||||
ServiceRelease(WASABI_API_MEMMGR, memMgrApiServiceGuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" DLLEXPORT ifc_wa5component *GetWinamp5SystemComponent()
|
|
||||||
{
|
|
||||||
return &vlbComponent;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CBCLASS VLBComponent
|
|
||||||
START_DISPATCH;
|
|
||||||
VCB(API_WA5COMPONENT_REGISTERSERVICES, RegisterServices)
|
|
||||||
CB(15, RegisterServicesSafeModeOk)
|
|
||||||
VCB(API_WA5COMPONENT_DEREEGISTERSERVICES, DeregisterServices)
|
|
||||||
END_DISPATCH;
|
|
||||||
#undef CBCLASS
|
|
2336
Src/vlb/window_tab.h
2336
Src/vlb/window_tab.h
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
echo "Cleanup the environment....."
|
echo "Cleanup the environment..."
|
||||||
IF EXIST "Src\external_dependencies\vcpkg" (
|
IF EXIST "Src\external_dependencies\vcpkg" (
|
||||||
echo Deleting "Src\external_dependencies\vcpkg" ...
|
echo Deleting "Src\external_dependencies\vcpkg" ...
|
||||||
rmdir /S /Q "Src\external_dependencies\vcpkg"
|
rmdir /S /Q "Src\external_dependencies\vcpkg"
|
||||||
|
@ -49,7 +49,7 @@ IF NOT EXIST .\vcpkg (
|
||||||
echo Patching ports...
|
echo Patching ports...
|
||||||
xcopy /K /Y /H /C /I /E .\vcpkg-ports\* .\vcpkg\ports\*
|
xcopy /K /Y /H /C /I /E .\vcpkg-ports\* .\vcpkg\ports\*
|
||||||
|
|
||||||
echo Installing packages....
|
echo Installing packages...
|
||||||
cd .\vcpkg
|
cd .\vcpkg
|
||||||
.\vcpkg install alac:x86-windows-static-md
|
.\vcpkg install alac:x86-windows-static-md
|
||||||
.\vcpkg install expat:x86-windows-static-md expat:x86-windows-static
|
.\vcpkg install expat:x86-windows-static-md expat:x86-windows-static
|
||||||
|
|
Loading…
Reference in a new issue