Skip to content

Commit

Permalink
IPTV recording in E2
Browse files Browse the repository at this point in the history
Servicerefs starting with 4097:... can now be recorded.
Note: Code for recording 1:... servicerefs was not changed. IPTV plugins
maybe need to be adapted to support recording.

	modified:   RecordTimer.py
	modified:   ServiceReference.py
	modified:   lib/python/Components/TimerSanityCheck.py
	modified:   lib/service/Makefile.inc
	modified:   lib/service/iservice.h
	modified:   lib/service/servicedvbrecord.h
	modified:   lib/service/servicehdmi.h
	modified:   lib/service/servicemp3.cpp
	modified:   lib/service/servicemp3.h
	new file:   lib/service/servicemp3record.cpp
	new file:   lib/service/servicemp3record.h

Signed-off-by: littlesat <littlesat99@yahoo.com>
  • Loading branch information
betacentauri authored and rossi2000 committed Jul 12, 2015
1 parent 5842919 commit c59bfcc
Show file tree
Hide file tree
Showing 11 changed files with 604 additions and 34 deletions.
8 changes: 6 additions & 2 deletions RecordTimer.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ def tryPrepare(self):
if event_id is None:
event_id = -1

prep_res=self.record_service.prepare(self.Filename + ".ts", self.begin, self.end, event_id, name.replace("\n", ""), description.replace("\n", ""), ' '.join(self.tags), bool(self.descramble), bool(self.record_ecm))
prep_res=self.record_service.prepare(self.Filename + self.record_service.getFilenameExtension(), self.begin, self.end, event_id, name.replace("\n", ""), description.replace("\n", ""), ' '.join(self.tags), bool(self.descramble), bool(self.record_ecm))
if prep_res:
if prep_res == -255:
self.log(4, "failed to write meta information")
Expand Down Expand Up @@ -322,7 +322,7 @@ def activate(self):
# i.e. cable / sat.. then the second recording needs an own extension... when we create the file
# here than calculateFilename is happy
if not self.justplay:
open(self.Filename + ".ts", "w").close()
open(self.Filename + self.record_service.getFilenameExtension(), "w").close()
# Give the Trashcan a chance to clean up
try:
Trashcan.instance.cleanIfIdle()
Expand Down Expand Up @@ -669,6 +669,10 @@ def gotRecordEvent(self, record, event):
Notifications.AddPopup(text = text, type = MessageBox.TYPE_INFO, timeout = 3)
elif event == iRecordableService.evRecordAborted:
NavigationInstance.instance.RecordTimer.removeEntry(self)
elif event == iRecordableService.evGstRecordEnded:
if self.repeated:
self.processRepeated(findRunningEvent = False)
NavigationInstance.instance.RecordTimer.doActivate(self)

# we have record_service as property to automatically subscribe to record service events
def setRecordService(self, service):
Expand Down
2 changes: 1 addition & 1 deletion ServiceReference.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def getFlags(self):

def isRecordable(self):
ref = self.ref
return ref.flags & eServiceReference.isGroup or (ref.type == eServiceReference.idDVB or ref.type == eServiceReference.idDVB + 0x100 or ref.type == 0x2000)
return ref.flags & eServiceReference.isGroup or (ref.type == eServiceReference.idDVB or ref.type == eServiceReference.idDVB + 0x100 or ref.type == 0x2000 or ref.type == 0x1001)

def getPlayingref(ref):
playingref = None
Expand Down
5 changes: 3 additions & 2 deletions lib/python/Components/TimerSanityCheck.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,9 @@ def checkTimerlist(self, ext_timer=1):
else:
fakeRecResult = -1
if not fakeRecResult: # tune okay
feinfo = fakeRecService.frontendInfo().getFrontendData()
tunerType.append(feinfo.get("tuner_type"))
feinfo = fakeRecService.frontendInfo()
if feinfo:
tunerType.append(feinfo.getFrontendData().get("tuner_type"))
else: # tune failed.. so we must go another way to get service type (DVB-S, DVB-T, DVB-C)

def getServiceType(ref): # helper function to get a service type of a service reference
Expand Down
2 changes: 2 additions & 0 deletions lib/service/Makefile.inc
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ service_libenigma_service_a_SOURCES = \
service/servicedvbrecord.cpp \
service/servicefs.cpp \
service/servicemp3.cpp \
service/servicemp3record.cpp \
service/servicem2ts.cpp \
service/servicedvbstream.cpp \
service/servicehdmi.cpp
Expand All @@ -25,6 +26,7 @@ serviceinclude_HEADERS = \
service/servicedvbrecord.h \
service/servicefs.h \
service/servicemp3.h \
service/servicemp3record.h \
service/servicem2ts.h \
service/servicedvbstream.h \
service/servicehdmi.h
Expand Down
2 changes: 2 additions & 0 deletions lib/service/iservice.h
Original file line number Diff line number Diff line change
Expand Up @@ -985,6 +985,7 @@ class iRecordableService_ENUMS
evRecordWriteError,
evNewEventInfo,
evRecordAborted,
evGstRecordEnded,
};
enum {
NoError=0,
Expand Down Expand Up @@ -1017,6 +1018,7 @@ class iRecordableService: public iRecordableService_ENUMS, public iObject
virtual SWIG_VOID(RESULT) frontendInfo(ePtr<iFrontendInformation> &SWIG_OUTPUT)=0;
virtual SWIG_VOID(RESULT) stream(ePtr<iStreamableService> &SWIG_OUTPUT)=0;
virtual SWIG_VOID(RESULT) subServices(ePtr<iSubserviceList> &SWIG_OUTPUT)=0;
virtual SWIG_VOID(RESULT) getFilenameExtension(std::string &SWIG_OUTPUT)=0;
};
SWIG_TEMPLATE_TYPEDEF(ePtr<iRecordableService>, iRecordableServicePtr);

Expand Down
1 change: 1 addition & 0 deletions lib/service/servicedvbrecord.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class eDVBServiceRecord: public eDVBServiceBase,
RESULT getError(int &error) { error = m_error; return 0; }
RESULT frontendInfo(ePtr<iFrontendInformation> &ptr);
RESULT subServices(ePtr<iSubserviceList> &ptr);
RESULT getFilenameExtension(std::string &ext) { ext = ".ts"; return 0; };

// iStreamableService
ePtr<iStreamData> getStreamingData();
Expand Down
1 change: 1 addition & 0 deletions lib/service/servicehdmi.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ class eServiceHDMIRecord: public eDVBServiceBase, public iRecordableService, pub
RESULT frontendInfo(ePtr<iFrontendInformation> &ptr);
RESULT stream(ePtr<iStreamableService> &ptr);
RESULT subServices(ePtr<iSubserviceList> &ptr);
RESULT getFilenameExtension(std::string &ext) { ext = ".ts"; return 0; };

private:
enum { stateIdle, statePrepared, stateRecording };
Expand Down
9 changes: 8 additions & 1 deletion lib/service/servicemp3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <lib/components/file_eraser.h>
#include <lib/gui/esubtitle.h>
#include <lib/service/servicemp3.h>
#include <lib/service/servicemp3record.h>
#include <lib/service/service.h>
#include <lib/gdi/gpixmap.h>

Expand Down Expand Up @@ -102,6 +103,7 @@ eServiceFactoryMP3::eServiceFactoryMP3()
extensions.push_back("asf");
extensions.push_back("wmv");
extensions.push_back("wma");
extensions.push_back("stream");
sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions);
}

Expand Down Expand Up @@ -129,6 +131,11 @@ RESULT eServiceFactoryMP3::play(const eServiceReference &ref, ePtr<iPlayableServ

RESULT eServiceFactoryMP3::record(const eServiceReference &ref, ePtr<iRecordableService> &ptr)
{
if (ref.path.find("://") != std::string::npos)
{
ptr = new eServiceMP3Record((eServiceReference&)ref);
return 0;
}
ptr=0;
return -1;
}
Expand Down Expand Up @@ -712,7 +719,7 @@ void eServiceMP3::updateEpgCacheNowNext()

DEFINE_REF(eServiceMP3);

DEFINE_REF(eServiceMP3::GstMessageContainer);
DEFINE_REF(GstMessageContainer);

RESULT eServiceMP3::connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)
{
Expand Down
56 changes: 28 additions & 28 deletions lib/service/servicemp3.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,38 @@ class eServiceMP3InfoContainer: public iServiceInfoContainer

double getDouble(unsigned int index) const;
unsigned char *getBuffer(unsigned int &size) const;

void setDouble(double value);
void setBuffer(GstBuffer *buffer);
};

class GstMessageContainer: public iObject
{
DECLARE_REF(GstMessageContainer);
GstMessage *messagePointer;
GstPad *messagePad;
GstBuffer *messageBuffer;
int messageType;

public:
GstMessageContainer(int type, GstMessage *msg, GstPad *pad, GstBuffer *buffer)
{
messagePointer = msg;
messagePad = pad;
messageBuffer = buffer;
messageType = type;
}
~GstMessageContainer()
{
if (messagePointer) gst_message_unref(messagePointer);
if (messagePad) gst_object_unref(messagePad);
if (messageBuffer) gst_buffer_unref(messageBuffer);
}
int getType() { return messageType; }
operator GstMessage *() { return messagePointer; }
operator GstPad *() { return messagePad; }
operator GstBuffer *() { return messageBuffer; }
};

typedef struct _GstElement GstElement;

typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFLAC, atWMA } audiotype_t;
Expand Down Expand Up @@ -295,33 +322,6 @@ class eServiceMP3: public iPlayableService, public iPauseableService,
GstElement *m_gst_playbin, *audioSink, *videoSink;
GstTagList *m_stream_tags;

class GstMessageContainer: public iObject
{
DECLARE_REF(GstMessageContainer);
GstMessage *messagePointer;
GstPad *messagePad;
GstBuffer *messageBuffer;
int messageType;

public:
GstMessageContainer(int type, GstMessage *msg, GstPad *pad, GstBuffer *buffer)
{
messagePointer = msg;
messagePad = pad;
messageBuffer = buffer;
messageType = type;
}
~GstMessageContainer()
{
if (messagePointer) gst_message_unref(messagePointer);
if (messagePad) gst_object_unref(messagePad);
if (messageBuffer) gst_buffer_unref(messageBuffer);
}
int getType() { return messageType; }
operator GstMessage *() { return messagePointer; }
operator GstPad *() { return messagePad; }
operator GstBuffer *() { return messageBuffer; }
};
eFixedMessagePump<ePtr<GstMessageContainer> > m_pump;

audiotype_t gstCheckAudioPad(GstStructure* structure);
Expand Down
Loading

0 comments on commit c59bfcc

Please sign in to comment.