00001
00006 #include <algorithm>
00007
00008 #include "mythcontext.h"
00009 #include "mythlogging.h"
00010 #include "iptvmediasink.h"
00011 #include "streamlisteners.h"
00012
00013 #define LOC QString("IPTVSink:")
00014
00015 IPTVMediaSink::IPTVMediaSink(UsageEnvironment &env,
00016 unsigned int bufferSize) :
00017 MediaSink(env),
00018 _buf(NULL), _buf_size(bufferSize),
00019 _env(env), _lock(QMutex::Recursive)
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 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- begin")
00077 .arg((uint64_t)item,0,16));
00078 if (item)
00079 {
00080 RemoveListener(item);
00081 QMutexLocker locker(&_lock);
00082 _listeners.push_back(item);
00083 }
00084 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end")
00085 .arg((uint64_t)item,0,16));
00086 }
00087
00088 void IPTVMediaSink::RemoveListener(TSDataListener *item)
00089 {
00090 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- begin 1")
00091 .arg((uint64_t)item,0,16));
00092 QMutexLocker locker(&_lock);
00093 vector<TSDataListener*>::iterator it =
00094 find(_listeners.begin(), _listeners.end(), item);
00095 if (it != _listeners.end())
00096 {
00097 *it = *_listeners.rbegin();
00098 _listeners.resize(_listeners.size() - 1);
00099 }
00100 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end 6")
00101 .arg((uint64_t)item,0,16));
00102 }
00103
00104