You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
4.2 KiB
254 lines
4.2 KiB
15 years ago
|
/*
|
||
|
describes a picture in yuv format
|
||
|
Copyright (C) 2000 Martin Vogt
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU Library General Public License as published by
|
||
|
the Free Software Foundation.
|
||
|
|
||
|
For more information look at the file COPYRIGHT in this package
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
#include "yuvPicture.h"
|
||
|
|
||
|
#include <iostream>
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
static int instanceCnt=0;
|
||
|
|
||
|
YUVPicture::YUVPicture(int width,int height) {
|
||
|
this->width=width;
|
||
|
this->height=height;
|
||
|
|
||
|
instance=instanceCnt;
|
||
|
instanceCnt++;
|
||
|
imagePtr=NULL;
|
||
|
|
||
|
setImageType(PICTURE_YUVMODE_CR_CB);
|
||
|
|
||
|
|
||
|
startTimeStamp=new TimeStamp();
|
||
|
waitTime=new TimeStamp();
|
||
|
earlyTime=new TimeStamp();
|
||
|
mpegType=-1;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
YUVPicture::~YUVPicture() {
|
||
|
delete imagePtr;
|
||
|
delete earlyTime;
|
||
|
delete startTimeStamp;
|
||
|
delete waitTime;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
int YUVPicture::getHeight() {
|
||
|
return height;
|
||
|
}
|
||
|
|
||
|
|
||
|
int YUVPicture::getWidth() {
|
||
|
return width;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
int YUVPicture::getLumLength() {
|
||
|
return lumLength;
|
||
|
}
|
||
|
|
||
|
|
||
|
int YUVPicture::getColorLength() {
|
||
|
return colorLength;
|
||
|
}
|
||
|
|
||
|
int YUVPicture::getImageSize() {
|
||
|
return imageSize;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
void YUVPicture::print(const char* title) {
|
||
|
cout << title <<":";
|
||
|
printf(" instance:%d ",instance);
|
||
|
printf(" width:%d ",width);
|
||
|
printf(" height:%d ",height);
|
||
|
cout <<" picPerSec:"<<picPerSec;
|
||
|
switch(mpegType) {
|
||
|
case 1:
|
||
|
printf("I_FRAME ");
|
||
|
break;
|
||
|
case 2:
|
||
|
printf("P_FRAME ");
|
||
|
break;
|
||
|
case 3:
|
||
|
printf("B_FRAME ");
|
||
|
break;
|
||
|
case 4:
|
||
|
printf("D_FRAME ");
|
||
|
break;
|
||
|
default:
|
||
|
printf("<unknown> ");
|
||
|
}
|
||
|
printf("\n");
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
void YUVPicture::setPicturePerSecond(float val) {
|
||
|
this->picPerSec=val;
|
||
|
}
|
||
|
|
||
|
|
||
|
float YUVPicture::getPicturePerSecond() {
|
||
|
return picPerSec;
|
||
|
}
|
||
|
|
||
|
|
||
|
void YUVPicture::setStartTimeStamp(TimeStamp* aStamp) {
|
||
|
aStamp->copyTo(startTimeStamp);
|
||
|
}
|
||
|
|
||
|
|
||
|
TimeStamp* YUVPicture::getStartTimeStamp() {
|
||
|
return startTimeStamp;
|
||
|
}
|
||
|
|
||
|
void YUVPicture::setWaitTime(TimeStamp* aStamp) {
|
||
|
aStamp->copyTo(waitTime);
|
||
|
}
|
||
|
|
||
|
|
||
|
TimeStamp* YUVPicture::getWaitTime() {
|
||
|
return waitTime;
|
||
|
}
|
||
|
|
||
|
void YUVPicture::setEarlyTime(TimeStamp* earlyTime) {
|
||
|
this->earlyTime=earlyTime;
|
||
|
}
|
||
|
|
||
|
|
||
|
TimeStamp* YUVPicture::getEarlyTime() {
|
||
|
return earlyTime;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void YUVPicture::setMpegPictureType(int type) {
|
||
|
this->mpegType=type;
|
||
|
}
|
||
|
|
||
|
|
||
|
int YUVPicture::getMpegPictureType() {
|
||
|
return mpegType;
|
||
|
}
|
||
|
|
||
|
|
||
|
void YUVPicture::setImageType(int imageType) {
|
||
|
|
||
|
|
||
|
//
|
||
|
// Reset everything
|
||
|
//
|
||
|
|
||
|
if (imagePtr != NULL) {
|
||
|
delete [] imagePtr;
|
||
|
imagePtr=NULL;
|
||
|
}
|
||
|
this->imageType=imageType;
|
||
|
|
||
|
lumLength=0;
|
||
|
colorLength=0;
|
||
|
Cr_mode=NULL;
|
||
|
Cb_mode=NULL;
|
||
|
luminance_mode=NULL;
|
||
|
|
||
|
|
||
|
//
|
||
|
// YUV Images
|
||
|
//
|
||
|
if ( (imageType == PICTURE_YUVMODE_CR_CB) ||
|
||
|
(imageType == PICTURE_YUVMODE_CB_CR) ) {
|
||
|
|
||
|
|
||
|
lumLength=width * height;
|
||
|
colorLength=width * height / 4;
|
||
|
imageSize=lumLength+colorLength+colorLength;
|
||
|
|
||
|
// the 64 is some "security" space
|
||
|
imagePtr=new unsigned char[imageSize+64];
|
||
|
|
||
|
if (imagePtr == NULL) {
|
||
|
cout << "cannot create image"<<endl;
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
// now caculate pointers to start addresses of lum/Cr/Cb blocks
|
||
|
// we need the yuvPtr for direct dither in hardware
|
||
|
// this should save a memcpy
|
||
|
|
||
|
luminance = imagePtr;
|
||
|
Cr = imagePtr+lumLength;
|
||
|
Cb = imagePtr+lumLength+colorLength;
|
||
|
|
||
|
|
||
|
if ( (luminance == NULL) ||
|
||
|
(Cr == NULL) ||
|
||
|
(Cb == NULL) ) {
|
||
|
cout << "allocation luminance/Cr/Cb error"<<endl;
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
switch(imageType) {
|
||
|
case PICTURE_YUVMODE_CR_CB:
|
||
|
Cr_mode=Cr;
|
||
|
Cb_mode=Cb;
|
||
|
luminance_mode=imagePtr;
|
||
|
break;
|
||
|
case PICTURE_YUVMODE_CB_CR:
|
||
|
Cr_mode=Cb;
|
||
|
Cb_mode=Cr;
|
||
|
luminance_mode=imagePtr;
|
||
|
break;
|
||
|
default:
|
||
|
cout << "unknown yuv mode:"<<imageType<<endl;
|
||
|
}
|
||
|
}
|
||
|
else if ( (imageType == PICTURE_YUVMODE_YUY2) ||
|
||
|
(imageType == PICTURE_YUVMODE_UYVY) ) {
|
||
|
// these yuv-modes are packed
|
||
|
|
||
|
imageSize=width * height * 2;
|
||
|
|
||
|
// the 64 is some "security" space
|
||
|
imagePtr=new unsigned char[imageSize+64];
|
||
|
|
||
|
if (imagePtr == NULL) {
|
||
|
cout << "cannot create image"<<endl;
|
||
|
exit(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// RGB Imcdages
|
||
|
//
|
||
|
|
||
|
if ( (imageType == PICTURE_RGB) ||
|
||
|
(imageType == PICTURE_RGB_FLIPPED) ){
|
||
|
imageSize=width*height*4;
|
||
|
imagePtr=new unsigned char[imageSize];
|
||
|
}
|
||
|
memset(imagePtr,0,imageSize);
|
||
|
}
|