OBJECTS1 = main.o command.o log.o tcp.o dsock.o thread.o timers.o i18n.o \
message.o messagequeue.o \
vdr.o recman.o recording.o channel.o rectimer.o event.o directory.o \
- player.o vfeed.o afeed.o afeedr.o \
+ player.o vfeed.o afeed.o \
demuxer.o demuxervdr.o stream.o draintarget.o \
viewman.o box.o region.o colour.o view.o \
vinfo.o vwallpaper.o vvolume.o vrecordinglist.o vlivebanner.o vmute.o \
audioEnabled = 1;
}
-#ifndef NEW_DEMUXER
-int AFeed::init(int tfd)
+int AFeed::init()
{
- fd = tfd;
return 1;
}
-#else
-int AFeed::init(DrainTarget* tdt)
-{
- dt = tdt;
- return 1;
-}
-#endif
int AFeed::shutdown()
{
if (audioEnabled)
{
-#ifndef NEW_DEMUXER
- alen = Demuxer::getInstance()->writeAudio(fd); // FIXME ?
-#else
- alen = Demuxer::getInstance()->writeAudio(dt); // FIXME ?
-#endif
+ alen = Demuxer::getInstance()->writeAudio();
if (alen)
{
#include "log.h"
#include "demuxer.h"
#include "callback.h"
-#include "draintarget.h"
#ifdef WIN32
#include "threadwin.h"
{
public:
AFeed(Callback* tcb);
-#ifndef NEW_DEMUXER
- int init(int fd);
-#else
- int init(DrainTarget* tdt);
-#endif
+
+ int init();
int shutdown();
int start();
void threadMethod();
void threadPostStopCleanup() {};
int audioEnabled;
-#ifndef NEW_DEMUXER
- int fd;
-#else
- DrainTarget* dt;
-#endif
Callback& cb;
};
+++ /dev/null
-/*
- Copyright 2004-2005 Chris Tallon
-
- This file is part of VOMP.
-
- VOMP is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- VOMP is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with VOMP; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include "afeedr.h"
-
-AFeedR::AFeedR(Callback* tcb, Stream* tstream)
-: cb(*tcb), stream(*tstream)
-{
-}
-
-#ifndef NEW_DEMUXER
-int AFeedR::init(int tfd)
-{
- fd = tfd;
- return 1;
-}
-#else
-int AFeedR::init(DrainTarget* tdt)
-{
- dt = tdt;
- return 1;
-}
-#endif
-
-
-int AFeedR::shutdown()
-{
- // FIXME
- return 1;
-}
-
-int AFeedR::start()
-{
- return threadStart();
-}
-
-void AFeedR::stop()
-{
- threadCancel();
-}
-
-void AFeedR::threadMethod()
-{
- Log::getInstance()->log("AFeedR", Log::DEBUG, "Started");
-
- int alen;
-
- while(1)
- {
-#ifndef NEW_DEMUXER
- alen = stream.drain(fd);
-#else
- alen = stream.drain(dt);
- threadCheckExit();
-#endif
-
- if (alen)
- {
- Log::getInstance()->log("AFeedR", Log::DEBUG, "Written %i", alen);
- cb.call(this);
- }
- else
- {
- MILLISLEEP(100);
- }
- }
-}
-
+++ /dev/null
-/*
- Copyright 2004-2005 Chris Tallon
-
- This file is part of VOMP.
-
- VOMP is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- VOMP is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with VOMP; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#ifndef AFEEDR_H
-#define AFEEDR_H
-
-#include <stdio.h>
-#include <time.h>
-
-#include "log.h"
-#include "callback.h"
-#include "stream.h"
-#include "draintarget.h"
-
-#ifdef WIN32
-#include "threadwin.h"
-#else
-#include "threadp.h"
-#endif
-
-class AFeedR : public Thread_TYPE
-{
- public:
- AFeedR(Callback* tcb, Stream* tstream);
-#ifndef NEW_DEMUXER
- int init(int fd);
-#else
- int init(DrainTarget* tdt);
-#endif
- int shutdown();
-
- int start();
- void stop();
-
- private:
- void threadMethod();
- void threadPostStopCleanup() {};
-#ifndef NEW_DEMUXER
- int fd;
-#else
- DrainTarget* dt;
-#endif
- Callback& cb;
- Stream& stream;
-};
-
-#endif
virtual int setVolume(int volume)=0;
virtual int mute()=0;
virtual int unMute()=0;
- virtual int write(char *buf, int len)=0;
- virtual int getFD()=0; // FIXME MVP specific
+
+#ifndef NEW_DEMUXER
+ virtual int write(UCHAR* buffer, ULONG length)=0;
+#endif
int volumeUp();
int volumeDown();
return 1;
}
-int AudioMVP::getFD()
-{
- if (!initted) return 0;
-
- return fdAudio;
-}
-
-int AudioMVP::write(char *buf, int len)
-{
- return 0; //write(fdAudio, buf, len);
-}
-
int AudioMVP::setStreamType(UCHAR type)
{
if (!initted) return 0;
#endif
-// unused
+#ifdef NEW_DEMUXER
+
UINT AudioMVP::DeliverMediaSample(MediaPacket packet, UCHAR* buffer, UINT *samplepos)
{
return 0;
{
}
+#else
+
+int AudioMVP::write(UCHAR* buffer, ULONG length)
+{
+ return ::write(fdAudio, buffer, length);
+}
+
+#endif
int setVolume(int volume);
int mute();
int unMute();
- int write(char *buf, int len);
- int getFD();
+#ifdef NEW_DEMUXER
//Writing Data to Audiodevice -- unused in MVP code so far
virtual UINT DeliverMediaSample(MediaPacket packet, UCHAR* buffer, UINT *samplepos);
virtual long long SetStartOffset(long long curreftime, bool *rsync) { return 0; };
virtual void ResetTimeOffsets();
+#else
+ int write(UCHAR* buffer, ULONG length);
+#endif
#ifdef DEV
int test();
{
initted = 0;
firstsynched=false;
-
+
}
AudioWin::~AudioWin()
{
-
+
}
return 1;
}
-int AudioWin::getFD()
-{
- return 0;
-}
-
int AudioWin::write(char *buf, int len)
{
return 0; //write(fdAudio, buf, len);
if (packet.synched) {
ms->SetSyncPoint(TRUE);
ms->SetTime(&reftime1,&reftime2);
-
+
//ms->SetTime(NULL,NULL);
ms->SetMediaTime(NULL, NULL);
- if (reftime1<0) ms->SetPreroll(TRUE);
- else ms->SetPreroll(FALSE);
+ if (reftime1<0) ms->SetPreroll(TRUE);
+ else ms->SetPreroll(FALSE);
}else {
ms->SetSyncPoint(FALSE);
ms->SetTime(NULL,NULL);
ms->SetMediaTime(NULL, NULL);
- ms->SetPreroll(FALSE);
- MessageBox(0,"here I'm","Hallo",0);
+ ms->SetPreroll(FALSE);
+ MessageBox(0,"here I'm","Hallo",0);
// ms->SetSyncPoint(TRUE);
}
}
int mute();
int unMute();
int write(char *buf, int len);
- int getFD();
// Writing Data to Audiodevice
virtual UINT DeliverMediaSample(MediaPacket packet, UCHAR* buffer, UINT *samplepos);
virtual long long SetStartOffset(long long curreftime, bool *rsync);
- virtual void ResetTimeOffsets();
+ virtual void ResetTimeOffsets();
private:
bool firstsynched;
return instance;
}
-int Demuxer::init(Callback* tcallback)
+int Demuxer::init(Callback* tcallback, DrainTarget* audio, DrainTarget* video)
{
if (!initted)
{
- if ( !videostream.init(demuxMemoryV) ||
- !audiostream.init(demuxMemoryA))
+ if ( !videostream.init(video, demuxMemoryV) ||
+ !audiostream.init(audio, demuxMemoryA))
{
Log::getInstance()->log("Demuxer", Log::CRIT, "Failed to initialize demuxer");
shutdown();
return 0;
}
-#ifdef NEW_DEMUXER
- videostream.setDrainTarget(Video::getInstance());
- audiostream.setDrainTarget(Audio::getInstance());
-#endif
}
reset();
else
arcnt = 0;
}
-#ifndef NEW_DEMUXER
-int Demuxer::writeAudio(int fd)
-{
- return audiostream.drain(fd);
-}
-int Demuxer::writeVideo(int fd)
+int Demuxer::writeAudio()
{
- return videostream.drain(fd);
-}
-#else
-int Demuxer::writeAudio(DrainTarget* dt)
-{
- return audiostream.drain(dt);
+ return audiostream.drain();
}
-int Demuxer::writeVideo(DrainTarget* dt)
+int Demuxer::writeVideo()
{
- return videostream.drain(dt);
+ return videostream.drain();
}
-#endif
Demuxer::PESPacket::PESPacket()
{
#include "callback.h"
#include "draintarget.h"
-#include "audio.h"
-#include "video.h"
-
class Demuxer
{
public: //MS Visual C++ need this, private does not work for DemuxerVDR, Marten
Demuxer();
virtual ~Demuxer();
static Demuxer* getInstance();
- int init(Callback* callback);
+ int init(Callback* callback, DrainTarget* audio, DrainTarget* video);
void reset();
virtual void flush();
void flushAudio();
void seek();
void setVideoStream(int id);
void setAudioStream(int id);
-#ifndef NEW_DEMUXER
- int writeAudio(int fd);
- int writeVideo(int fd);
-#else
- int writeAudio(DrainTarget* dt);
- int writeVideo(DrainTarget* dt);
-#endif
+ int writeAudio();
+ int writeVideo();
virtual int scan(UCHAR* buf, int len) = 0;
virtual int findVideoPTS(UCHAR* buf, int len, ULLONG* dest) = 0;
along with VOMP; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "draintarget.h"
-DrainTarget::DrainTarget(){
+#include "draintarget.h"
+DrainTarget::DrainTarget()
+{
}
-DrainTarget::~DrainTarget(){
-
+DrainTarget::~DrainTarget()
+{
}
#include <list>
+#ifdef NEW_DEMUXER
-
-struct MediaPacket{
+struct MediaPacket
+{
ULLONG recording_byte_pos; //position in recording
ULLONG pts;
ULONG pos_buffer; //position in stream buffer
typedef list<MediaPacket> MediaPacketList;
+#endif
+
+class DrainTarget
+{
+ public:
+ DrainTarget();
+ virtual ~DrainTarget();
+
+#ifdef NEW_DEMUXER
-class DrainTarget {
-public:
- DrainTarget();
- virtual ~DrainTarget();
- virtual UINT DeliverMediaSample(MediaPacket packet, UCHAR* buffer,
- UINT *samplepos)=0;
+ virtual UINT DeliverMediaSample(MediaPacket packet, UCHAR* buffer, UINT *samplepos)=0;
-/* This function behaviour should be:
-Try to deliver the Data from packet.pos_buffer+samplepos to packet.pos_buffer+packet.length,
-with considering the bufferwraparound according to buffersize.
-Then increasing samplepos, so that on the next call delivering can proceed. So if writebytes are
-writen samplepos=samplepos+writebytes!
-If samplepos>=packet.length is returned, the next packet can be used for the next call.*/
+ /* This function behaviour should be:
+ Try to deliver the Data from packet.pos_buffer+samplepos to packet.pos_buffer+packet.length,
+ with considering the bufferwraparound according to buffersize.
+ Then increasing samplepos, so that on the next call delivering can proceed. So if writebytes are
+ writen samplepos=samplepos+writebytes!
+ If samplepos>=packet.length is returned, the next packet can be used for the next call.*/
+
+ virtual long long SetStartOffset(long long curreftime, bool *rsync)=0;
+ virtual void ResetTimeOffsets()=0;
+
+#else
+ virtual int write(UCHAR* buffer, ULONG length)=0;
+#endif
- virtual long long SetStartOffset(long long curreftime, bool *rsync)=0;
- virtual void ResetTimeOffsets()=0;
};
#include "viewman.h"
#include "command.h"
-#ifdef WIN32
- #include "mtdwin.h"
- #include "remotewin.h"
- #include "ledwin.h"
- #include "osdwin.h"
- #include "audiowin.h"
- #include "videowin.h"
-#else
- #include "mtdmvp.h"
- #include "remotemvp.h"
- #include "ledmvp.h"
- #include "osdmvp.h"
- #include "audiomvp.h"
- #include "videomvp.h"
-#endif
+#include "mtdmvp.h"
+#include "remotemvp.h"
+#include "ledmvp.h"
+#include "osdmvp.h"
+#include "audiomvp.h"
+#include "videomvp.h"
#ifndef WIN32
void sighandler(int signalReceived);
demuxer = new DemuxerVDR();
if (!demuxer) return 0;
- if (!demuxer->init(this))
+ if (!demuxer->init(this, audio, video))
{
logger->log("Player", Log::ERR, "Demuxer failed to init");
shutdown();
return 0;
}
-#ifndef NEW_DEMUXER
- vfeed.init(video->getFD());
- afeed.init(audio->getFD());
-#else
- vfeed.init(video);
- afeed.init(audio);
-#endif
+
+ vfeed.init();
+ afeed.init();
video->stop();
video->blank();
Stream::Stream()
{
initted = 0;
+ draintarget=NULL;
#ifdef NEW_DEMUXER
cur_packet_pos=0;
- draintarget=NULL;
#endif
}
}
-int Stream::init(int bufsize)
+int Stream::init(DrainTarget* tdt, int bufsize)
{
outbuf = (UCHAR*) malloc(bufsize);
if (!outbuf) return 0;
+ draintarget = tdt;
bufferSize = bufsize;
bufferHead = 0;
bufferTail = 0;
#ifndef NEW_DEMUXER
-int Stream::drain(int fd)
+int Stream::drain()
{
int ret = 0;
int head = bufferHead;
{
// Drain up to the marker.
#ifndef WIN32
- written = write(fd, outbuf + tail, (mark - tail));
+ written = draintarget->write(outbuf + tail, (mark - tail));
#else
written=mark-tail;
MILLISLEEP(1);
if (tail == head) return ret; // Empty
#ifndef WIN32
- written = write(fd, outbuf + tail, (head - tail));
+ written = draintarget->write(outbuf + tail, (head - tail));
#else
written=(head - tail);
MILLISLEEP(1);
bufferTail = tail + written;
return ret;
}
+
#else
-int Stream::drain(DrainTarget* dt)
+
+int Stream::drain()
{
int ret = 0;
int written=1;
- draintarget=dt;
+// draintarget=dt; // this is now set in init, is this ok?
public:
Stream();
~Stream();
- int init(int bufsize);
+ int init(DrainTarget* tdt, int bufsize);
void shutdown();
void flush();
#ifndef NEW_DEMUXER
int put(UCHAR* inbuf, int len);
#else
- int put(UCHAR* inbuf, int len,ULLONG curpos);
+ int put(UCHAR* inbuf, int len,ULLONG curpos);
#endif
-#ifndef NEW_DEMUXER
- int drain(int fd);
-#else
- int drain(DrainTarget* fd);
- void setDrainTarget(DrainTarget *dt) {if (dt) draintarget=dt;};
-#endif
+ int drain();
private:
#ifdef NEW_DEMUXER
MediaPacketList mediapackets;
UINT cur_packet_pos;
- DrainTarget* draintarget;
#endif
+ DrainTarget* draintarget;
int initted;
UCHAR* outbuf;
int bufferSize;
{
}
-#ifndef NEW_DEMUXER
-int VFeed::init(int tfd)
+int VFeed::init()
{
- fd = tfd;
return 1;
}
-#else
-int VFeed::init(DrainTarget* tdt)
-{
- dt = tdt;
- return 1;
-}
-#endif
int VFeed::shutdown()
{
while(1)
{
-#ifndef NEW_DEMUXER
- vlen = Demuxer::getInstance()->writeVideo(fd); // FIXME
-#else
threadCheckExit();
- vlen = Demuxer::getInstance()->writeVideo(dt); // FIXME
-#endif
+ vlen = Demuxer::getInstance()->writeVideo();
+
if (vlen)
{
// Log::getInstance()->log("VFeed", Log::DEBUG, "Written %i", vlen);
#include "log.h"
#include "demuxer.h"
#include "callback.h"
-#include "draintarget.h"
#ifdef WIN32
#include "threadwin.h"
{
public:
VFeed(Callback* tcb);
-#ifndef NEW_DEMUXER
- int init(int fd);
-#else
- int init(DrainTarget *tdt);
-#endif
+ int init();
int shutdown();
private:
void threadMethod();
void threadPostStopCleanup() {};
-#ifndef NEW_DEMUXER
- int fd;
-#else
- DrainTarget *dt;
-#endif
-
Callback& cb;
};
virtual int signalOff()=0;
virtual int attachFrameBuffer()=0; // What does this do?
virtual ULONG timecodeToFrameNumber(ULLONG timecode)=0;
- virtual int getFD()=0;
virtual ULLONG getCurrentTimestamp()=0;
+#ifndef NEW_DEMUXER
+ virtual int write(UCHAR* buffer, ULONG length)=0;
+#endif
+
virtual void turnVideoOn(){};
virtual void turnVideoOff(){};
virtual ULLONG frameNumberToTimecode(ULONG timecode) { return 0; };
return 1;
}
-int VideoMVP::getFD()
-{
- if (!initted) return 0;
-
- return fdVideo;
-}
-
ULLONG VideoMVP::getCurrentTimestamp()
{
sync_data_t timestamps;
}
#endif
-// unused
+
+
+#ifdef NEW_DEMUXER
+
UINT VideoMVP::DeliverMediaSample(MediaPacket packet, UCHAR* buffer, UINT *samplepos)
{
return 0;
void VideoMVP::ResetTimeOffsets()
{
}
+
+#else
+
+int VideoMVP::write(UCHAR* buffer, ULONG length)
+{
+ return ::write(fdVideo, buffer, length);
+}
+
+#endif
+
int signalOff();
int attachFrameBuffer(); // What does this do?
ULONG timecodeToFrameNumber(ULLONG timecode);
- int getFD();
ULLONG getCurrentTimestamp();
+#ifdef NEW_DEMUXER
//Writing Data to Videodevice
virtual UINT DeliverMediaSample(MediaPacket packet, UCHAR* buffer, UINT *samplepos);
virtual long long SetStartOffset(long long curreftime, bool *rsync) { return 0; };
virtual void ResetTimeOffsets();
+#else
+ int write(UCHAR* buffer, ULONG length);
+#endif
#ifdef DEV
int test();
pseudotvsize=0;
videoposx=0;
videoposy=0;
-
+
}
{
CleanupDS();
CloseHandle(filtermutex);
-
+
instance = NULL;
{
if (!initted) return 0;
if (mode==QUARTER || mode==EIGHTH) {
- videoposx=x;
- videoposy=y;
+ videoposx=x;
+ videoposy=y;
}
return 1;
}
//Build filter graph
HRESULT hres;
-
+
if (hres=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,(void**)&dsgraphbuilder)!=S_OK) {
return 0;
sourcefilter=new DsSourceFilter(); //Creating our Source filter for pushing Data
// to DirectShow
if (hres=dsgraphbuilder->AddFilter(sourcefilter,L"Vomp Win Source Filter")!=S_OK) {
- Log::getInstance()->log("VideoWin", Log::WARN , "Failed adding Vomp Source Filter!");
+ Log::getInstance()->log("VideoWin", Log::WARN , "Failed adding Vomp Source Filter!");
CleanupDS();
ReleaseMutex(filtermutex);
return 0;
}
//if (audioon) {
if (hres=dsgraphbuilder->Render(sourcefilter->GetPin(0)/*audio*/)!=S_OK) {
- Log::getInstance()->log("VideoWin", Log::WARN , "Failed rendering audio!");
+ Log::getInstance()->log("VideoWin", Log::WARN , "Failed rendering audio!");
CleanupDS();
ReleaseMutex(filtermutex);
return 0;
//}
#ifdef DO_VIDEO
if (videoon) {
- //We alloc the vmr9 as next step
- if (hres=CoCreateInstance(CLSID_VideoMixingRenderer9,0,
- CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**) &dsvmrrenderer)!=S_OK) {
- Log::getInstance()->log("VideoWin", Log::WARN ,"Failed creating VMR9 renderer!");
- CleanupDS();
- ReleaseMutex(filtermutex);
- }
- /*VMR 9 stuff**/
- if (hres=dsgraphbuilder->AddFilter(dsvmrrenderer,L"VMR9")!=S_OK) {
- CleanupDS();
- Log::getInstance()->log("VideoWin", Log::WARN ,"Failed adding VMR9 renderer!");
- ReleaseMutex(filtermutex);
- return 0;
- }
- IVMRFilterConfig9* vmrfilconfig;
- if (dsvmrrenderer->QueryInterface(IID_IVMRFilterConfig9,(void**)&vmrfilconfig)!=S_OK) {
- CleanupDS();
- Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Filterconfig interface!");
- ReleaseMutex(filtermutex);
- return 0;
- }
- vmrfilconfig->SetRenderingMode(VMR9Mode_Renderless);
- vmrfilconfig->Release();
-
- if (dsvmrrenderer->QueryInterface(IID_IVMRSurfaceAllocatorNotify9,(void**)& dsvmrsurfnotify)!=S_OK) {
- CleanupDS();
- Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Surface Allocator interface!");
- ReleaseMutex(filtermutex);
- return 0;
- }
- allocatorvmr=new DsAllocator();
- dsvmrsurfnotify->AdviseSurfaceAllocator(NULL,allocatorvmr);
- allocatorvmr->AdviseNotify(dsvmrsurfnotify);
-
-
-
- /*VMR 9 stuff end */
- IFilterGraph2*fg2=NULL;
- if (dsgraphbuilder->QueryInterface(IID_IFilterGraph2,(void**)&fg2)!=S_OK) {
- Log::getInstance()->log("VideoWin", Log::WARN , "Failed querying for FilterGraph2 Interface!");
- CleanupDS();
- ReleaseMutex(filtermutex);
- return 0;
- }
- if (hres=fg2->RenderEx(sourcefilter->GetPin(1)/*video*/,
- AM_RENDEREX_RENDERTOEXISTINGRENDERERS,NULL)!=S_OK) {
- Log::getInstance()->log("VideoWin", Log::WARN , "Failed rendering Video!");
- CleanupDS();
- ReleaseMutex(filtermutex);
- return 0;
- }
+ //We alloc the vmr9 as next step
+ if (hres=CoCreateInstance(CLSID_VideoMixingRenderer9,0,
+ CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**) &dsvmrrenderer)!=S_OK) {
+ Log::getInstance()->log("VideoWin", Log::WARN ,"Failed creating VMR9 renderer!");
+ CleanupDS();
+ ReleaseMutex(filtermutex);
+ }
+ /*VMR 9 stuff**/
+ if (hres=dsgraphbuilder->AddFilter(dsvmrrenderer,L"VMR9")!=S_OK) {
+ CleanupDS();
+ Log::getInstance()->log("VideoWin", Log::WARN ,"Failed adding VMR9 renderer!");
+ ReleaseMutex(filtermutex);
+ return 0;
+ }
+ IVMRFilterConfig9* vmrfilconfig;
+ if (dsvmrrenderer->QueryInterface(IID_IVMRFilterConfig9,(void**)&vmrfilconfig)!=S_OK) {
+ CleanupDS();
+ Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Filterconfig interface!");
+ ReleaseMutex(filtermutex);
+ return 0;
+ }
+ vmrfilconfig->SetRenderingMode(VMR9Mode_Renderless);
+ vmrfilconfig->Release();
+
+ if (dsvmrrenderer->QueryInterface(IID_IVMRSurfaceAllocatorNotify9,(void**)& dsvmrsurfnotify)!=S_OK) {
+ CleanupDS();
+ Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Surface Allocator interface!");
+ ReleaseMutex(filtermutex);
+ return 0;
+ }
+ allocatorvmr=new DsAllocator();
+ dsvmrsurfnotify->AdviseSurfaceAllocator(NULL,allocatorvmr);
+ allocatorvmr->AdviseNotify(dsvmrsurfnotify);
+
+
+
+ /*VMR 9 stuff end */
+ IFilterGraph2*fg2=NULL;
+ if (dsgraphbuilder->QueryInterface(IID_IFilterGraph2,(void**)&fg2)!=S_OK) {
+ Log::getInstance()->log("VideoWin", Log::WARN , "Failed querying for FilterGraph2 Interface!");
+ CleanupDS();
+ ReleaseMutex(filtermutex);
+ return 0;
+ }
+ if (hres=fg2->RenderEx(sourcefilter->GetPin(1)/*video*/,
+ AM_RENDEREX_RENDERTOEXISTINGRENDERERS,NULL)!=S_OK) {
+ Log::getInstance()->log("VideoWin", Log::WARN , "Failed rendering Video!");
+ CleanupDS();
+ ReleaseMutex(filtermutex);
+ return 0;
+ }
}
#endif
if (hres=CoCreateInstance(CLSID_SystemClock,NULL,CLSCTX_INPROC_SERVER,
IID_IReferenceClock,(void**)&dsrefclock)!=S_OK) {
return 0;
}
-
+
dsgraphbuilder->QueryInterface(IID_IMediaFilter,(void **) &dsmediafilter);
dsmediafilter->SetSyncSource(dsrefclock);
return 1;
}
-int VideoWin::getFD()
+ULLONG VideoWin::getCurrentTimestamp()
{
- if (!initted) return 0;
+ REFERENCE_TIME cr_time,startoffset;
- return fdVideo;
-}
+ if (!dsrefclock || !sourcefilter) return 0;
-ULLONG VideoWin::getCurrentTimestamp()
-{
- REFERENCE_TIME cr_time,startoffset;
-
- if (!dsrefclock || !sourcefilter) return 0;
-
- dsrefclock->GetTime(&cr_time);
- startoffset=sourcefilter->getStartOffset();
- cr_time-=startoffset;
- cr_time-=lastreftimeRT;
- ULLONG result=frameNumberToTimecode(
- VDR::getInstance()->frameNumberFromPosition(lastreftimeBYTE));
- result+=(ULLONG)(cr_time/10000LL*90LL);
- return result;
+ dsrefclock->GetTime(&cr_time);
+ startoffset=sourcefilter->getStartOffset();
+ cr_time-=startoffset;
+ cr_time-=lastreftimeRT;
+ ULLONG result=frameNumberToTimecode(
+ VDR::getInstance()->frameNumberFromPosition(lastreftimeBYTE));
+ result+=(ULLONG)(cr_time/10000LL*90LL);
+ return result;
}
cur_video_media_sample=NULL;
}
if (dsvmrsurfnotify) {
- dsvmrsurfnotify->Release();
- dsvmrsurfnotify=NULL;
+ dsvmrsurfnotify->Release();
+ dsvmrsurfnotify=NULL;
}
if (dsvmrrenderer) {
- dsvmrrenderer->Release();
- dsvmrrenderer=NULL;
+ dsvmrrenderer->Release();
+ dsvmrrenderer=NULL;
}
-
+
if (allocatorvmr) {
- allocatorvmr->Release();
- allocatorvmr=NULL;
+ allocatorvmr->Release();
+ allocatorvmr=NULL;
}
-
+
if (dsrefclock) {
- dsrefclock->Release();
- dsrefclock=NULL;
+ dsrefclock->Release();
+ dsrefclock=NULL;
}
if (dsmediafilter) {
- dsmediafilter->Release();
- dsmediafilter=NULL;
+ dsmediafilter->Release();
+ dsmediafilter=NULL;
}
if (dsmediacontrol) {
ms->SetTime(&reftime1,&reftime2);
//ms->SetTime(NULL,NULL);
ms->SetMediaTime(NULL, NULL);
- if (reftime1<0) ms->SetPreroll(TRUE);
- else ms->SetPreroll(FALSE);
- /*Timecode handling*/
- lastreftimeRT=reftime1;
- lastreftimeBYTE=packet.recording_byte_pos;
+ if (reftime1<0) ms->SetPreroll(TRUE);
+ else ms->SetPreroll(FALSE);
+ /*Timecode handling*/
+ lastreftimeRT=reftime1;
+ lastreftimeBYTE=packet.recording_byte_pos;
}else {
ms->SetSyncPoint(FALSE);
ms->SetTime(NULL,NULL);
ms->SetMediaTime(NULL, NULL);
- ms->SetPreroll(FALSE);
-
+ ms->SetPreroll(FALSE);
+
// ms->SetSyncPoint(TRUE);
}
}
startoffset=curreftime;//offset is set for audio
offsetnotset=false;
offsetvideonotset=false;
-
-
+
+
} else {
if (offsetvideonotset) {
offsetvideonotset=false;
lastreftimeBYTE=0;
lastreftimeRT=0;
-
+
}
int setFormat(UCHAR format);
int setConnection(UCHAR connection);
int setAspectRatio(UCHAR aspectRatio); // This one does the pin 8 scart widescreen switching
- UCHAR getAspectRatio(){return aspectRatio;};
- UCHAR getMode(){return mode;};
- UCHAR getPseudoTVsize() {return pseudotvsize;};
- int setMode(UCHAR mode);
+ UCHAR getAspectRatio(){return aspectRatio;};
+ UCHAR getMode(){return mode;};
+ UCHAR getPseudoTVsize() {return pseudotvsize;};
+ int setMode(UCHAR mode);
int setTVsize(UCHAR size); // Is the TV a widescreen?
int setDefaultAspect();
int setSource();
int signalOff();
int attachFrameBuffer(); // What does this do?
ULONG timecodeToFrameNumber(ULLONG timecode);
- ULLONG frameNumberToTimecode(ULONG framenumber);
- int getFD();
+ ULLONG frameNumberToTimecode(ULONG framenumber);
ULLONG getCurrentTimestamp();
//Writing Data to Videodevice
virtual long long SetStartOffset(long long curreftime, bool *rsync);
long long SetStartAudioOffset(long long curreftime, bool *rsync);
- virtual void ResetTimeOffsets();
+ virtual void ResetTimeOffsets();
void SetAudioState(bool state){audioon=state;};
void turnVideoOn(){videoon=true;};
void turnVideoOff(){videoon=false;};
- unsigned int getPosx() {return videoposx;};
- unsigned int getPosy() {return videoposy;};
+ unsigned int getPosx() {return videoposx;};
+ unsigned int getPosy() {return videoposy;};
#ifdef DEV
int test();