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.
tdemultimedia/mpeglib/lib/output/dspX11OutputStream.cpp

237 lines
4.6 KiB

/*
concret OutputClass
Copyright (C) 1999 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 "dspX11OutputStream.h"
#include "../util/audio/dspWrapper.h"
#include "windowOut.h"
#include "avSyncer.h"
#include "yuvDumper.h"
#include <iostream>
using namespace std;
DspX11OutputStream::DspX11OutputStream(int bufferSize) {
dspWrapper=new DSPWrapper();
x11Window=new WindowOut();
avSyncer=new AVSyncer(bufferSize);
yuvDumper=new YUVDumper();
audioTime=new AudioTime();
lPerformance=false;
lneedInit=false;
lVideoInit=false;
lBufferSet=false;
lYUVDump=false;
}
DspX11OutputStream::~DspX11OutputStream() {
delete dspWrapper;
delete x11Window;
delete avSyncer;
delete audioTime;
delete yuvDumper;
}
int DspX11OutputStream::audioSetup(int frequency,int stereo,
int sign,int big,int sixteen) {
dspWrapper->audioSetup(stereo,sixteen,sign,big,frequency);
audioTime->setFormat(stereo,sixteen,frequency,sign,big);
avSyncer->audioSetup(frequency,stereo,sign,big,sixteen);
if (dspWrapper->isOpenDevice() == true) {
if (lBufferSet==false) {
int size=dspWrapper->getAudioBufferSize();
avSyncer->setAudioBufferSize(size);
}
}
return true;
}
void DspX11OutputStream::audioClose(void) {
avSyncer->audioClose();
dspWrapper->closeDevice();
}
void DspX11OutputStream::audioOpen() {
if (dspWrapper->isOpenDevice() == false) {
dspWrapper->openDevice();
if (lBufferSet==false) {
int size=dspWrapper->getAudioBufferSize();
avSyncer->setAudioBufferSize(size);
}
}
}
int DspX11OutputStream::audioPlay(TimeStamp* startStamp,
TimeStamp* endStamp,char *buffer, int size) {
if (lneedInit) {
cout << "FIXME. work on audioFrames!!"<<endl;
lneedInit=false;
}
if (lPerformance==false) {
//
// Now feed data smoothly into the dsp/avSyncer
//
int pos=0;
int rest=size;
int inc=getPreferredDeliverSize();
int len;
while (rest > 0) {
len=rest;
if (len>inc) {
len=inc;
}
if (dspWrapper->isOpenDevice()) {
if (dspWrapper->audioPlay(buffer,len) != len) {
cout << "write error to dsp"<<endl;
lneedInit=true;
return size-rest;
}
}
avSyncer->audioPlay(startStamp,endStamp,buffer,len);
buffer+=len;
rest-=len;
}
return size;
} else {
return size;
}
}
int DspX11OutputStream::getPreferredDeliverSize() {
if (avSyncer->getPreferredDeliverSize() <= 500) {
return 500;
}
return avSyncer->getPreferredDeliverSize();
}
int DspX11OutputStream::openWindow(int width, int height,const char *title) {
int back=x11Window->openWindow(width,height,title);
setOutputInit(true);
if (lYUVDump) {
yuvDumper->openWindow(width,height,title);
}
return back;
}
int DspX11OutputStream::x11WindowId() {
return x11Window->x11WindowId();
}
void DspX11OutputStream::closeWindow() {
x11Window->closeWindow();
}
void DspX11OutputStream::flushWindow() {
x11Window->flushWindow();
}
PictureArray* DspX11OutputStream::lockPictureArray() {
return x11Window->lockPictureArray();
}
void DspX11OutputStream::unlockPictureArray(PictureArray* pictureArray) {
YUVPicture* pic=pictureArray->getYUVPictureCallback();
if (lYUVDump) {
yuvDumper->unlockPictureArray(pictureArray);
}
if (avSyncer->syncPicture(pic)==false) {
return;
}
x11Window->unlockPictureArray(pictureArray);
}
int DspX11OutputStream::getFrameusec() {
return avSyncer->getFrameusec();
}
int DspX11OutputStream::getOutputInit() {
return lVideoInit;
}
void DspX11OutputStream::setOutputInit(int lInit) {
this->lVideoInit=lInit;
}
void DspX11OutputStream::config(const char* key,
const char* value,void* user_data) {
cout << "key:"<<key<<endl;
if (strcmp(key,"-s")==0) {
avSyncer->config(key,value,user_data);
}
if (strcmp(key,"-b")==0) {
lBufferSet=true;
int size=strtol(value,(char **)NULL,10);
cout << "simulated audio buffersize:"<<size<<" bytes"<<endl;
avSyncer->setAudioBufferSize(size);
}
if (strcmp(key,"-p")==0) {
lPerformance=true;
avSyncer->config(key,value,user_data);
}
if (strcmp(key,"yufDump")==0) {
int method=atoi(value);
switch(method) {
case 2:
yuvDumper->setMethod(_DUMP_YUV_AS_STREAM);
break;
default:
cout << "unknown dump method"<<endl;
}
lYUVDump=true;
}
x11Window->config(key,value,user_data);
}
AVSyncer* DspX11OutputStream::getAVSyncer() {
return avSyncer;
}