mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
134 lines
2.4 KiB
C++
134 lines
2.4 KiB
C++
|
#include "Decoder.h"
|
||
|
|
||
|
|
||
|
bool Decoder::initted;
|
||
|
unsigned char *Decoder::clp;
|
||
|
unsigned char Decoder::clp_table[1024];
|
||
|
|
||
|
int Decoder::DecodeFrame(YV12_PLANES *yv12, int *width, int *height, int *keyframe)
|
||
|
{
|
||
|
if (getheader())
|
||
|
{
|
||
|
if (firstFrame)
|
||
|
{
|
||
|
if (init())
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
Frame frame;
|
||
|
getpicture(frame);
|
||
|
yv12->y.baseAddr = frame[0];
|
||
|
yv12->y.rowBytes = coded_picture_width;
|
||
|
yv12->u.baseAddr = frame[1];
|
||
|
yv12->u.rowBytes = chrom_width;
|
||
|
yv12->v.baseAddr = frame[2];
|
||
|
yv12->v.rowBytes = chrom_width;
|
||
|
|
||
|
*width = horizontal_size;
|
||
|
*height = vertical_size;
|
||
|
*keyframe = (pict_type == PCT_INTRA)?1:0;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
Decoder::Decoder()
|
||
|
{
|
||
|
for (int cc=0; cc<3; cc++)
|
||
|
{
|
||
|
refframe[cc]=0;
|
||
|
newframe[cc]=0;
|
||
|
oldrefframe[cc]=0;
|
||
|
edgeframe[cc]=0;
|
||
|
edgeframeorig[cc]=0;
|
||
|
}
|
||
|
|
||
|
horizontal_size=0;
|
||
|
vertical_size=0;
|
||
|
mb_width=0;
|
||
|
mb_height=0;
|
||
|
coded_picture_width=0;
|
||
|
coded_picture_height=0;
|
||
|
chrom_width=0;
|
||
|
chrom_height=0;
|
||
|
pict_type=0;
|
||
|
fault=0;
|
||
|
refidct=0;
|
||
|
quant=0;
|
||
|
escapemode=0;
|
||
|
|
||
|
firstFrame=true;
|
||
|
if (!initted)
|
||
|
{
|
||
|
/* clip table */
|
||
|
clp=&clp_table[384];
|
||
|
|
||
|
for (int i=-384; i<640; i++)
|
||
|
clp[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
|
||
|
|
||
|
initted=true;
|
||
|
}
|
||
|
idct.init();
|
||
|
}
|
||
|
|
||
|
Decoder::~Decoder()
|
||
|
{
|
||
|
for (int cc=0; cc<3; cc++)
|
||
|
{
|
||
|
free(refframe[cc]);
|
||
|
free(oldrefframe[cc]);
|
||
|
free(edgeframeorig[cc]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define ROUNDUP16(size) (((size)+15) & ~15)
|
||
|
|
||
|
int Decoder::init()
|
||
|
{
|
||
|
int cc;
|
||
|
unsigned int size;
|
||
|
|
||
|
mb_width = (horizontal_size+15)/16;
|
||
|
mb_height = (vertical_size +15)/16;
|
||
|
coded_picture_width = ROUNDUP16(horizontal_size);
|
||
|
coded_picture_height = ROUNDUP16(vertical_size);
|
||
|
chrom_width = coded_picture_width>>1;
|
||
|
chrom_height = coded_picture_height>>1;
|
||
|
|
||
|
if (coded_picture_width >= (65536 - 64)
|
||
|
|| coded_picture_height >= (65536 - 64))
|
||
|
return 1;
|
||
|
|
||
|
for (cc=0; cc<3; cc++)
|
||
|
{
|
||
|
if (cc==0)
|
||
|
size = coded_picture_width*coded_picture_height;
|
||
|
else
|
||
|
size = chrom_width*chrom_height;
|
||
|
|
||
|
refframe[cc] = (unsigned char *)malloc(size);
|
||
|
oldrefframe[cc] = (unsigned char *)malloc(size);
|
||
|
}
|
||
|
|
||
|
for (cc=0; cc<3; cc++)
|
||
|
{
|
||
|
if (cc==0)
|
||
|
{
|
||
|
size = (coded_picture_width+64)*(coded_picture_height+64);
|
||
|
edgeframeorig[cc] = (unsigned char *)malloc(size);
|
||
|
|
||
|
edgeframe[cc] = edgeframeorig[cc] + (coded_picture_width+64) * 32 + 32;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
size = (chrom_width+32)*(chrom_height+32);
|
||
|
edgeframeorig[cc] = (unsigned char *)malloc(size);
|
||
|
|
||
|
edgeframe[cc] = edgeframeorig[cc] + (chrom_width+32) * 16 + 16;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|