00001
00006 #include <algorithm>
00007
00008 #include "mythcontext.h"
00009 #include "iptvmediasink.h"
00010 #include "streamlisteners.h"
00011
00012 #define LOC QString("IPTVSink:")
00013 #define LOC_ERR QString("IPTVSink, Error:")
00014
00015 IPTVMediaSink::IPTVMediaSink(UsageEnvironment &env,
00016 unsigned int bufferSize) :
00017 MediaSink(env),
00018 _buf(NULL), _buf_size(bufferSize),
00019 _env(env), _lock(true)
00020 {
00021 _buf = new unsigned char[_buf_size];
00022 }
00023
00024 IPTVMediaSink::~IPTVMediaSink()
00025 {
00026 if (_buf)
00027 {
00028 delete[] _buf;
00029 _buf = NULL;
00030 }
00031 }
00032
00033 IPTVMediaSink *IPTVMediaSink::CreateNew(UsageEnvironment &env,
00034 unsigned int bufferSize)
00035 {
00036 return new IPTVMediaSink(env, bufferSize);
00037 }
00038
00039 Boolean IPTVMediaSink::continuePlaying(void)
00040 {
00041 if (fSource)
00042 {
00043 fSource->getNextFrame(_buf, _buf_size, afterGettingFrame, this,
00044 onSourceClosure, this);
00045 return True;
00046 }
00047
00048 return False;
00049 }
00050
00051 void IPTVMediaSink::afterGettingFrame(
00052 void* clientData,
00053 unsigned int frameSize,
00054 unsigned int ,
00055 struct timeval presentationTime,
00056 unsigned int )
00057 {
00058 IPTVMediaSink *sink = (IPTVMediaSink*) clientData;
00059 sink->afterGettingFrame1(frameSize, presentationTime);
00060 }
00061
00062 void IPTVMediaSink::afterGettingFrame1(unsigned int frameSize,
00063 struct timeval)
00064 {
00065 _lock.lock();
00066 vector<TSDataListener*>::iterator it = _listeners.begin();
00067 for (; it != _listeners.end(); ++it)
00068 (*it)->AddData(_buf, frameSize);
00069 _lock.unlock();
00070
00071 continuePlaying();
00072 }
00073
00074 void IPTVMediaSink::AddListener(TSDataListener *item)
00075 {
00076 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- begin");
00077 if (item)
00078 {
00079 RemoveListener(item);
00080 QMutexLocker locker(&_lock);
00081 _listeners.push_back(item);
00082 }
00083 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end");
00084 }
00085
00086 void IPTVMediaSink::RemoveListener(TSDataListener *item)
00087 {
00088 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- begin 1");
00089 QMutexLocker locker(&_lock);
00090 vector<TSDataListener*>::iterator it =
00091 find(_listeners.begin(), _listeners.end(), item);
00092 if (it != _listeners.end())
00093 {
00094 *it = *_listeners.rbegin();
00095 _listeners.resize(_listeners.size() - 1);
00096 }
00097 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 6");
00098 }
00099
00100