mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Version 2.1.5
VDR developer version 2.1.5 is now available at ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.5.tar.bz2 A 'diff' against the previous version is available at ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.4-2.1.5.diff MD5 checksums: ce561eef64c13e24e4817f70a6d9d5b0 vdr-2.1.5.tar.bz2 f433e78d90bc414bd9d858ca6e58e539 vdr-2.1.4-2.1.5.diff WARNING: ======== This is a *developer* version. Even though *I* use it in my productive environment, I strongly recommend that you only use it under controlled conditions and for testing and debugging. From the HISTORY file: - Now checking whether the primary device actually has a decoder before retuning the current channel after a change in its parameters. This fixes broken recordings on the primary device on "headless" systems. - Increased MIN_TS_PACKETS_FOR_FRAME_DETECTOR to 100 and introduced counting the number of actual video TS packets in cTsPayload in order to be able to record channels that sometimes need even more than 10 TS packets for detecting frame borders (reported by Oliver Endriss). - Fixed sorting recordings by time in the Recordings menu if "Setup/OSD/Recording directories" is set to "no". - Fixed clearing non-editable members in the channel editor (thanks to Rolf Ahrenberg). - Updated the Estonian OSD texts (thanks to Arthur Konovalov). - Further clarified the semantics of cCamSlot::Decrypt(). - Fixed flickering if subtitles are active while the OSD demo is running. - Fixed numbering frames. Previously they were numbered starting from 1, while it is apparently standard to number them from 0. Any existing recordings with editing marks (which will now be off by one) can still be cut with all VDR versions from 1.7.32, because these will automatically adjust editing marks to I-frames. Users of stable releases shouldn't notice any problems. - Fixed a possible crash in the OSD demo (reported by Christopher Reimer). - Fixed some compiler warnings with Clang 3.4.1 (reported by Paul Menzel). - Added LinkageTypePremiere to libsi/si.h and eit.c to avoid a compiler warning with Clang 3.4.1 (suggested by Tony Houghten). - Replaced the NULL pointer assignment in ~cReceiver() to force a segfault with a call to abort() (suggested by Tony Houghten). - Fixed learning keyboard remote control codes (thanks to Lars Hanisch). - Improved PAT/PMT scanning to speed up initial tuning to encrypted channels on transponders with many PAT entries (reported by Mariusz Bialonczyk). - Fixed the replay progress display for very long recordings. - Fixed detecting broken video data streams when recording. - Fixed handling frame detection buffer length (reported by Eike Sauer).
This commit is contained in:
parent
67e322b0dd
commit
797dc7d1a1
15
CONTRIBUTORS
15
CONTRIBUTORS
@ -707,6 +707,8 @@ Oliver Endriss <o.endriss@gmx.de>
|
|||||||
for suggesting to make all bonded devices (except for the master) turn off their LNB
|
for suggesting to make all bonded devices (except for the master) turn off their LNB
|
||||||
power completely to avoid problems when receiving vertically polarized transponders
|
power completely to avoid problems when receiving vertically polarized transponders
|
||||||
for suggesting to eliminate MAXDVBDEVICES
|
for suggesting to eliminate MAXDVBDEVICES
|
||||||
|
for reporting that there are channels that need even more than 10 TS packets in order
|
||||||
|
to detect the frame type
|
||||||
|
|
||||||
Reinhard Walter Buchner <rw.buchner@freenet.de>
|
Reinhard Walter Buchner <rw.buchner@freenet.de>
|
||||||
for adding some satellites to 'sources.conf'
|
for adding some satellites to 'sources.conf'
|
||||||
@ -1180,6 +1182,7 @@ Rolf Ahrenberg <Rolf.Ahrenberg@sci.fi>
|
|||||||
for suggesting to prompt the user for confirmation before overwriting an already
|
for suggesting to prompt the user for confirmation before overwriting an already
|
||||||
existing edited version of a recording
|
existing edited version of a recording
|
||||||
for adding code for parsing LCN and AVC descriptors to libsi
|
for adding code for parsing LCN and AVC descriptors to libsi
|
||||||
|
for fixing clearing non-editable members in the channel editor
|
||||||
|
|
||||||
Ralf Klueber <ralf.klueber@vodafone.com>
|
Ralf Klueber <ralf.klueber@vodafone.com>
|
||||||
for reporting a bug in cutting a recording if there is only a single editing mark
|
for reporting a bug in cutting a recording if there is only a single editing mark
|
||||||
@ -2885,6 +2888,7 @@ Lars Hanisch <dvb@flensrocker.de>
|
|||||||
for making the Recordings menu able to be called with a cRecordingFilter, which allows
|
for making the Recordings menu able to be called with a cRecordingFilter, which allows
|
||||||
the caller to have it display only a certain subset of the recordings
|
the caller to have it display only a certain subset of the recordings
|
||||||
for adding handling UTF-8 'umlaut' characters to cKbdRemote
|
for adding handling UTF-8 'umlaut' characters to cKbdRemote
|
||||||
|
for fixing learning keyboard remote control codes
|
||||||
|
|
||||||
Alex Lasnier <alex@fepg.org>
|
Alex Lasnier <alex@fepg.org>
|
||||||
for adding tuning support for ATSC devices
|
for adding tuning support for ATSC devices
|
||||||
@ -2904,6 +2908,7 @@ Paul Menzel <paulepanter@users.sourceforge.net>
|
|||||||
for reporting a possible memory leak in the "pictures" plugin
|
for reporting a possible memory leak in the "pictures" plugin
|
||||||
for removing an obsolete local variable in dvbsdffosd.c
|
for removing an obsolete local variable in dvbsdffosd.c
|
||||||
for reporting a possible NULL pointer dereference in osddemo.c
|
for reporting a possible NULL pointer dereference in osddemo.c
|
||||||
|
for reporting some compiler warnings with Clang 3.4.1
|
||||||
|
|
||||||
Radek Stastny <dedkus@gmail.com>
|
Radek Stastny <dedkus@gmail.com>
|
||||||
for translating OSD texts to the Czech language
|
for translating OSD texts to the Czech language
|
||||||
@ -2923,6 +2928,7 @@ Christopher Reimer <reimer.christopher@freenet.de>
|
|||||||
for suggesting to make sure that plugins include the VDR header files from the actual
|
for suggesting to make sure that plugins include the VDR header files from the actual
|
||||||
VDR source directory when doing "make plugins"
|
VDR source directory when doing "make plugins"
|
||||||
for reverting the change from version 1.5.7 that made all logging go to LOG_ERR
|
for reverting the change from version 1.5.7 that made all logging go to LOG_ERR
|
||||||
|
for reporting a possible crash in the OSD demo
|
||||||
|
|
||||||
Stefan Huskamp <coca_cola1@gmx.de>
|
Stefan Huskamp <coca_cola1@gmx.de>
|
||||||
for suggesting to make entering characters via the number keys
|
for suggesting to make entering characters via the number keys
|
||||||
@ -3248,6 +3254,7 @@ Thomas Reufer <thomas@reufer.ch>
|
|||||||
Eike Sauer <EikeSauer@t-online.de>
|
Eike Sauer <EikeSauer@t-online.de>
|
||||||
for reporting a problem with channels that need more than 5 TS packets for detecting
|
for reporting a problem with channels that need more than 5 TS packets for detecting
|
||||||
frame borders
|
frame borders
|
||||||
|
for reporting a problem in handling the frame detection buffer length
|
||||||
|
|
||||||
Christian Paulick <cpaulick@xeatre.tv>
|
Christian Paulick <cpaulick@xeatre.tv>
|
||||||
for reporting a problem with frame detection in MPEG-2 streams that have "bottom fields"
|
for reporting a problem with frame detection in MPEG-2 streams that have "bottom fields"
|
||||||
@ -3256,3 +3263,11 @@ Christian Paulick <cpaulick@xeatre.tv>
|
|||||||
Mariusz Bialonczyk <manio@skyboo.net>
|
Mariusz Bialonczyk <manio@skyboo.net>
|
||||||
for reporting a problem with live streaming of encrypted channels, when there are no
|
for reporting a problem with live streaming of encrypted channels, when there are no
|
||||||
CA descriptors, yet, on initial tuning
|
CA descriptors, yet, on initial tuning
|
||||||
|
for reporting that acquiring the CA descriptors takes way too long on transponders
|
||||||
|
with many PAT entries, and his help in debugging this
|
||||||
|
|
||||||
|
Tony Houghton <h@realh.co.uk>
|
||||||
|
for suggesting to add LinkageTypePremiere to libsi/si.h and eit.c to avoid a compiler
|
||||||
|
warning with Clang 3.4.1
|
||||||
|
for suggesting to replace the NULL pointer assignment in ~cReceiver() to force a
|
||||||
|
segfault with a call to abort()
|
||||||
|
33
HISTORY
33
HISTORY
@ -8169,3 +8169,36 @@ Video Disk Recorder Revision History
|
|||||||
by Mariusz Bialonczyk).
|
by Mariusz Bialonczyk).
|
||||||
- Fixed a superfluous call to the skin's SetRecording() function after renaming a
|
- Fixed a superfluous call to the skin's SetRecording() function after renaming a
|
||||||
recording (reported by Christoph Haubrich).
|
recording (reported by Christoph Haubrich).
|
||||||
|
|
||||||
|
2014-02-23: Version 2.1.5
|
||||||
|
|
||||||
|
- Now checking whether the primary device actually has a decoder before retuning the
|
||||||
|
current channel after a change in its parameters. This fixes broken recordings on
|
||||||
|
the primary device on "headless" systems.
|
||||||
|
- Increased MIN_TS_PACKETS_FOR_FRAME_DETECTOR to 100 and introduced counting the number
|
||||||
|
of actual video TS packets in cTsPayload in order to be able to record channels that
|
||||||
|
sometimes need even more than 10 TS packets for detecting frame borders (reported by
|
||||||
|
Oliver Endriss).
|
||||||
|
- Fixed sorting recordings by time in the Recordings menu if "Setup/OSD/Recording
|
||||||
|
directories" is set to "no".
|
||||||
|
- Fixed clearing non-editable members in the channel editor (thanks to Rolf Ahrenberg).
|
||||||
|
- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
|
||||||
|
- Further clarified the semantics of cCamSlot::Decrypt().
|
||||||
|
- Fixed flickering if subtitles are active while the OSD demo is running.
|
||||||
|
- Fixed numbering frames. Previously they were numbered starting from 1, while it
|
||||||
|
is apparently standard to number them from 0. Any existing recordings with editing
|
||||||
|
marks (which will now be off by one) can still be cut with all VDR versions from
|
||||||
|
1.7.32, because these will automatically adjust editing marks to I-frames.
|
||||||
|
Users of stable releases shouldn't notice any problems.
|
||||||
|
- Fixed a possible crash in the OSD demo (reported by Christopher Reimer).
|
||||||
|
- Fixed some compiler warnings with Clang 3.4.1 (reported by Paul Menzel).
|
||||||
|
- Added LinkageTypePremiere to libsi/si.h and eit.c to avoid a compiler warning with
|
||||||
|
Clang 3.4.1 (suggested by Tony Houghten).
|
||||||
|
- Replaced the NULL pointer assignment in ~cReceiver() to force a segfault with
|
||||||
|
a call to abort() (suggested by Tony Houghten).
|
||||||
|
- Fixed learning keyboard remote control codes (thanks to Lars Hanisch).
|
||||||
|
- Improved PAT/PMT scanning to speed up initial tuning to encrypted channels on
|
||||||
|
transponders with many PAT entries (reported by Mariusz Bialonczyk).
|
||||||
|
- Fixed the replay progress display for very long recordings.
|
||||||
|
- Fixed detecting broken video data streams when recording.
|
||||||
|
- Fixed handling frame detection buffer length (reported by Eike Sauer).
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
static const char *VERSION = "2.1.4";
|
static const char *VERSION = "2.1.5";
|
||||||
static const char *DESCRIPTION = trNOOP("HD Full Featured DVB device");
|
static const char *DESCRIPTION = trNOOP("HD Full Featured DVB device");
|
||||||
static const char *MAINMENUENTRY = "dvbhddevice";
|
static const char *MAINMENUENTRY = "dvbhddevice";
|
||||||
|
|
||||||
|
@ -42,7 +42,6 @@ private:
|
|||||||
tFont mFonts[MAX_NUM_FONTS];
|
tFont mFonts[MAX_NUM_FONTS];
|
||||||
uint32_t mBitmapPalette;
|
uint32_t mBitmapPalette;
|
||||||
uint32_t mBitmapColors[256];
|
uint32_t mBitmapColors[256];
|
||||||
uint32_t mBitmapNumColors;
|
|
||||||
|
|
||||||
bool mSupportsUtf8Text;
|
bool mSupportsUtf8Text;
|
||||||
|
|
||||||
@ -555,7 +554,6 @@ private:
|
|||||||
uint32_t mDisplay;
|
uint32_t mDisplay;
|
||||||
uint32_t mBitmapPalette;
|
uint32_t mBitmapPalette;
|
||||||
uint32_t mBitmapColors[256];
|
uint32_t mBitmapColors[256];
|
||||||
uint32_t mBitmapNumColors;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void SetActive(bool On);
|
virtual void SetActive(bool On);
|
||||||
|
@ -63,3 +63,8 @@ VDR Plugin 'osddemo' Revision History
|
|||||||
2014-01-01: Version 2.1.1
|
2014-01-01: Version 2.1.1
|
||||||
|
|
||||||
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
- Avoiding unnecessary pkg-config warnings in plugin Makefiles.
|
||||||
|
|
||||||
|
2014-02-06: Version 2.1.2
|
||||||
|
|
||||||
|
- Fixed flickering if subtitles are active while the OSD demo is running.
|
||||||
|
- Fixed a possible crash in the OSD demo (reported by Christopher Reimer).
|
||||||
|
@ -3,13 +3,13 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: osddemo.c 3.1 2014/01/05 10:56:18 kls Exp $
|
* $Id: osddemo.c 3.3 2014/02/06 11:51:53 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <vdr/osd.h>
|
#include <vdr/osd.h>
|
||||||
#include <vdr/plugin.h>
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
static const char *VERSION = "2.1.1";
|
static const char *VERSION = "2.1.2";
|
||||||
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
static const char *DESCRIPTION = "Demo of arbitrary OSD setup";
|
||||||
static const char *MAINMENUENTRY = "Osd Demo";
|
static const char *MAINMENUENTRY = "Osd Demo";
|
||||||
|
|
||||||
@ -119,7 +119,7 @@ cLineGame::~cLineGame()
|
|||||||
|
|
||||||
void cLineGame::Show(void)
|
void cLineGame::Show(void)
|
||||||
{
|
{
|
||||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop(), 50);
|
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
||||||
if (osd) {
|
if (osd) {
|
||||||
int x1 = cOsd::OsdWidth() - 1;
|
int x1 = cOsd::OsdWidth() - 1;
|
||||||
int y1 = cOsd::OsdHeight() - 1;
|
int y1 = cOsd::OsdHeight() - 1;
|
||||||
@ -480,6 +480,8 @@ void cTrueColorDemo::Action(void)
|
|||||||
if (Delta < FrameTime)
|
if (Delta < FrameTime)
|
||||||
cCondWait::SleepMs(FrameTime - Delta);
|
cCondWait::SleepMs(FrameTime - Delta);
|
||||||
}
|
}
|
||||||
|
destroyablePixmap = NULL;
|
||||||
|
toggleablePixmap = NULL;
|
||||||
delete OsdFont;
|
delete OsdFont;
|
||||||
delete SmlFont;
|
delete SmlFont;
|
||||||
delete LrgFont;
|
delete LrgFont;
|
||||||
@ -496,7 +498,7 @@ bool cTrueColorDemo::SetArea(void)
|
|||||||
|
|
||||||
void cTrueColorDemo::Show(void)
|
void cTrueColorDemo::Show(void)
|
||||||
{
|
{
|
||||||
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop(), 50);
|
osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
|
||||||
if (osd) {
|
if (osd) {
|
||||||
if (SetArea()) {
|
if (SetArea()) {
|
||||||
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: player.c 3.0 2012/04/28 11:58:15 kls Exp $
|
* $Id: player.c 3.1 2014/02/08 12:48:12 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
@ -211,7 +211,7 @@ cString cPictureControl::GetHeader(void)
|
|||||||
|
|
||||||
eOSState cPictureControl::ProcessKey(eKeys Key)
|
eOSState cPictureControl::ProcessKey(eKeys Key)
|
||||||
{
|
{
|
||||||
switch (Key) {
|
switch (int(Key)) {
|
||||||
case kUp:
|
case kUp:
|
||||||
case kPlay: slideShowDelay.Set();
|
case kPlay: slideShowDelay.Set();
|
||||||
slideShow = true;
|
slideShow = true;
|
||||||
|
6
ci.c
6
ci.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: ci.c 3.10 2014/01/22 09:46:38 kls Exp $
|
* $Id: ci.c 3.11 2014/02/08 12:25:55 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ci.h"
|
#include "ci.h"
|
||||||
@ -864,7 +864,7 @@ void cCiDateTime::SendDateTime(void)
|
|||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
struct tTime { uint16_t mjd; uint8_t h, m, s; short offset; };
|
struct tTime { uint16_t mjd; uint8_t h, m, s; short offset; };
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
tTime T = { mjd : htons(MJD), h : DEC2BCD(tm_gmt.tm_hour), m : DEC2BCD(tm_gmt.tm_min), s : DEC2BCD(tm_gmt.tm_sec), offset : short(htons(tm_loc.tm_gmtoff / 60)) };
|
tTime T = { .mjd = htons(MJD), .h = DEC2BCD(tm_gmt.tm_hour), .m = DEC2BCD(tm_gmt.tm_min), .s = DEC2BCD(tm_gmt.tm_sec), .offset = short(htons(tm_loc.tm_gmtoff / 60)) };
|
||||||
bool OldDumpTPDUDataTransfer = DumpTPDUDataTransfer;
|
bool OldDumpTPDUDataTransfer = DumpTPDUDataTransfer;
|
||||||
DumpTPDUDataTransfer &= DumpDateTime;
|
DumpTPDUDataTransfer &= DumpDateTime;
|
||||||
if (DumpDateTime)
|
if (DumpDateTime)
|
||||||
@ -1004,7 +1004,7 @@ void cCiMMI::Process(int Length, const uint8_t *Data)
|
|||||||
case DCC_SET_MMI_MODE:
|
case DCC_SET_MMI_MODE:
|
||||||
if (l == 2 && *++d == MM_HIGH_LEVEL) {
|
if (l == 2 && *++d == MM_HIGH_LEVEL) {
|
||||||
struct tDisplayReply { uint8_t id; uint8_t mode; };
|
struct tDisplayReply { uint8_t id; uint8_t mode; };
|
||||||
tDisplayReply dr = { id : DRI_MMI_MODE_ACK, mode : MM_HIGH_LEVEL };
|
tDisplayReply dr = { .id = DRI_MMI_MODE_ACK, .mode = MM_HIGH_LEVEL };
|
||||||
dbgprotocol("Slot %d: ==> Display Reply (%d)\n", Tc()->CamSlot()->SlotNumber(), SessionId());
|
dbgprotocol("Slot %d: ==> Display Reply (%d)\n", Tc()->CamSlot()->SlotNumber(), SessionId());
|
||||||
SendData(AOT_DISPLAY_REPLY, 2, (uint8_t *)&dr);
|
SendData(AOT_DISPLAY_REPLY, 2, (uint8_t *)&dr);
|
||||||
}
|
}
|
||||||
|
12
ci.h
12
ci.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: ci.h 3.6 2014/01/20 12:01:01 kls Exp $
|
* $Id: ci.h 3.7 2014/01/31 09:21:21 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CI_H
|
#ifndef __CI_H
|
||||||
@ -250,10 +250,12 @@ public:
|
|||||||
///< 2. If the CAM works directly on Data and decrypts the TS "in place" it
|
///< 2. If the CAM works directly on Data and decrypts the TS "in place" it
|
||||||
///< shall decrypt at least the very first TS packet in Data, set Count to
|
///< shall decrypt at least the very first TS packet in Data, set Count to
|
||||||
///< TS_SIZE and return Data. It may decrypt as many TS packets in Data as it
|
///< TS_SIZE and return Data. It may decrypt as many TS packets in Data as it
|
||||||
///< wants, but it must decrypt at least the very first TS packet. Only this
|
///< wants, but it must decrypt at least the very first TS packet (if at all
|
||||||
///< very first TS packet will be further processed after the call to this
|
///< possible - if, for whatever reasons, it can't decrypt the very first
|
||||||
///< function. The next call will be done with Data pointing to the TS packet
|
///< packet, it must return it regardless). Only this very first TS packet will
|
||||||
///< immediately following the previous one.
|
///< be further processed after the call to this function. The next call will
|
||||||
|
///< be done with Data pointing to the TS packet immediately following the
|
||||||
|
///< previous one.
|
||||||
///< 3. If the CAM needs to copy the data into a buffer of its own, and/or send
|
///< 3. If the CAM needs to copy the data into a buffer of its own, and/or send
|
||||||
///< the data to some file handle for processing and later retrieval, it shall
|
///< the data to some file handle for processing and later retrieval, it shall
|
||||||
///< set Count to the number of bytes it has read from Data and return a pointer
|
///< set Count to the number of bytes it has read from Data and return a pointer
|
||||||
|
10
config.h
10
config.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: config.h 3.6 2014/01/07 09:03:29 kls Exp $
|
* $Id: config.h 3.7 2014/01/26 12:31:58 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CONFIG_H
|
#ifndef __CONFIG_H
|
||||||
@ -22,13 +22,13 @@
|
|||||||
|
|
||||||
// VDR's own version number:
|
// VDR's own version number:
|
||||||
|
|
||||||
#define VDRVERSION "2.1.4"
|
#define VDRVERSION "2.1.5"
|
||||||
#define VDRVERSNUM 20104 // Version * 10000 + Major * 100 + Minor
|
#define VDRVERSNUM 20105 // Version * 10000 + Major * 100 + Minor
|
||||||
|
|
||||||
// The plugin API's version number:
|
// The plugin API's version number:
|
||||||
|
|
||||||
#define APIVERSION "2.1.4"
|
#define APIVERSION "2.1.5"
|
||||||
#define APIVERSNUM 20104 // Version * 10000 + Major * 100 + Minor
|
#define APIVERSNUM 20105 // Version * 10000 + Major * 100 + Minor
|
||||||
|
|
||||||
// When loading plugins, VDR searches them by their APIVERSION, which
|
// When loading plugins, VDR searches them by their APIVERSION, which
|
||||||
// may be smaller than VDRVERSION in case there have been no changes to
|
// may be smaller than VDRVERSION in case there have been no changes to
|
||||||
|
3
device.c
3
device.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: device.c 3.11 2014/01/21 11:12:01 kls Exp $
|
* $Id: device.c 3.12 2014/02/18 13:12:39 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
@ -794,6 +794,7 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
|||||||
if (SetChannelDevice(Channel, LiveView)) {
|
if (SetChannelDevice(Channel, LiveView)) {
|
||||||
// Start section handling:
|
// Start section handling:
|
||||||
if (sectionHandler) {
|
if (sectionHandler) {
|
||||||
|
patFilter->Trigger(Channel->Sid());
|
||||||
sectionHandler->SetChannel(Channel);
|
sectionHandler->SetChannel(Channel);
|
||||||
sectionHandler->SetStatus(true);
|
sectionHandler->SetStatus(true);
|
||||||
}
|
}
|
||||||
|
3
dvbspu.h
3
dvbspu.h
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* parts of this file are derived from the OMS program.
|
* parts of this file are derived from the OMS program.
|
||||||
*
|
*
|
||||||
* $Id: dvbspu.h 3.0 2013/01/20 10:15:47 kls Exp $
|
* $Id: dvbspu.h 3.1 2014/02/08 12:27:34 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __DVBSPU_H
|
#ifndef __DVBSPU_H
|
||||||
@ -101,7 +101,6 @@ class cDvbSpuDecoder:public cSpuDecoder {
|
|||||||
uint8_t *spu;
|
uint8_t *spu;
|
||||||
uint32_t spupts;
|
uint32_t spupts;
|
||||||
bool clean;
|
bool clean;
|
||||||
bool ready;
|
|
||||||
bool restricted_osd;
|
bool restricted_osd;
|
||||||
|
|
||||||
enum spFlag { spNONE, spHIDE, spSHOW, spMENU };
|
enum spFlag { spNONE, spHIDE, spSHOW, spMENU };
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Original author: Marco Schluessler <marco@lordzodiac.de>
|
* Original author: Marco Schluessler <marco@lordzodiac.de>
|
||||||
* With some input from the "subtitles plugin" by Pekka Virtanen <pekka.virtanen@sci.fi>
|
* With some input from the "subtitles plugin" by Pekka Virtanen <pekka.virtanen@sci.fi>
|
||||||
*
|
*
|
||||||
* $Id: dvbsubtitle.c 3.4 2013/09/07 10:39:46 kls Exp $
|
* $Id: dvbsubtitle.c 3.5 2014/02/08 12:29:13 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dvbsubtitle.h"
|
#include "dvbsubtitle.h"
|
||||||
@ -34,7 +34,6 @@ static bool DebugDisplay = DebugVerbose || DebugNormal;
|
|||||||
static bool DebugPages = DebugVerbose || DebugNormal;
|
static bool DebugPages = DebugVerbose || DebugNormal;
|
||||||
static bool DebugRegions = DebugVerbose || DebugNormal;
|
static bool DebugRegions = DebugVerbose || DebugNormal;
|
||||||
static bool DebugObjects = DebugVerbose || DebugNormal;
|
static bool DebugObjects = DebugVerbose || DebugNormal;
|
||||||
static bool DebugBitmaps = DebugVerbose || DebugNormal;
|
|
||||||
static bool DebugConverter = DebugVerbose;
|
static bool DebugConverter = DebugVerbose;
|
||||||
static bool DebugSegments = DebugVerbose;
|
static bool DebugSegments = DebugVerbose;
|
||||||
static bool DebugPixel = DebugVerbose;
|
static bool DebugPixel = DebugVerbose;
|
||||||
@ -45,7 +44,6 @@ static bool DebugOutput = DebugVerbose;
|
|||||||
#define dbgpages(a...) if (DebugPages) SD.WriteHtml(a)
|
#define dbgpages(a...) if (DebugPages) SD.WriteHtml(a)
|
||||||
#define dbgregions(a...) if (DebugRegions) SD.WriteHtml(a)
|
#define dbgregions(a...) if (DebugRegions) SD.WriteHtml(a)
|
||||||
#define dbgobjects(a...) if (DebugObjects) SD.WriteHtml(a)
|
#define dbgobjects(a...) if (DebugObjects) SD.WriteHtml(a)
|
||||||
#define dbgbitmaps(a...) if (DebugBitmaps) SD.WriteHtml(a)
|
|
||||||
#define dbgconverter(a...) if (DebugConverter) SD.WriteHtml(a)
|
#define dbgconverter(a...) if (DebugConverter) SD.WriteHtml(a)
|
||||||
#define dbgsegments(a...) if (DebugSegments) SD.WriteHtml(a)
|
#define dbgsegments(a...) if (DebugSegments) SD.WriteHtml(a)
|
||||||
#define dbgpixel(a...) if (DebugPixel) SD.WriteHtml(a)
|
#define dbgpixel(a...) if (DebugPixel) SD.WriteHtml(a)
|
||||||
|
4
eit.c
4
eit.c
@ -8,7 +8,7 @@
|
|||||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||||
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
|
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
|
||||||
*
|
*
|
||||||
* $Id: eit.c 3.3 2013/11/03 13:55:00 kls Exp $
|
* $Id: eit.c 3.5 2014/02/08 14:20:27 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "eit.h"
|
#include "eit.h"
|
||||||
@ -220,7 +220,7 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
|
|||||||
case SI::LinkageDescriptorTag: {
|
case SI::LinkageDescriptorTag: {
|
||||||
SI::LinkageDescriptor *ld = (SI::LinkageDescriptor *)d;
|
SI::LinkageDescriptor *ld = (SI::LinkageDescriptor *)d;
|
||||||
tChannelID linkID(Source, ld->getOriginalNetworkId(), ld->getTransportStreamId(), ld->getServiceId());
|
tChannelID linkID(Source, ld->getOriginalNetworkId(), ld->getTransportStreamId(), ld->getServiceId());
|
||||||
if (ld->getLinkageType() == 0xB0) { // Premiere World
|
if (ld->getLinkageType() == SI::LinkageTypePremiere) { // Premiere World
|
||||||
bool hit = StartTime <= Now && Now < StartTime + Duration;
|
bool hit = StartTime <= Now && Now < StartTime + Duration;
|
||||||
if (hit) {
|
if (hit) {
|
||||||
char linkName[ld->privateData.getLength() + 1];
|
char linkName[ld->privateData.getLength() + 1];
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: descriptor.h 3.1 2013/10/30 10:16:18 kls Exp $
|
* $Id: descriptor.h 3.2 2014/02/08 12:44:17 kls Exp $
|
||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
@ -489,8 +489,6 @@ public:
|
|||||||
StructureLoop<Language> languageLoop;
|
StructureLoop<Language> languageLoop;
|
||||||
protected:
|
protected:
|
||||||
virtual void Parse();
|
virtual void Parse();
|
||||||
private:
|
|
||||||
const descr_iso_639_language *s;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class PDCDescriptor : public Descriptor {
|
class PDCDescriptor : public Descriptor {
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: si.h 3.1 2013/10/30 10:16:18 kls Exp $
|
* $Id: si.h 3.2 2014/02/08 14:11:32 kls Exp $
|
||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
@ -210,7 +210,8 @@ enum LinkageType { LinkageTypeInformationService = 0x01,
|
|||||||
LinkageTypeRCSMap = 0x07,
|
LinkageTypeRCSMap = 0x07,
|
||||||
LinkageTypeMobileHandover = 0x08,
|
LinkageTypeMobileHandover = 0x08,
|
||||||
LinkageTypeSystemSoftwareUpdateService = 0x09,
|
LinkageTypeSystemSoftwareUpdateService = 0x09,
|
||||||
LinkageTypeTSContainingSsuBatOrNit = 0x0A
|
LinkageTypeTSContainingSsuBatOrNit = 0x0A,
|
||||||
|
LinkageTypePremiere = 0xB0
|
||||||
};
|
};
|
||||||
|
|
||||||
enum AudioType { AudioTypeUndefined = 0x00,
|
enum AudioType { AudioTypeUndefined = 0x00,
|
||||||
|
10
menu.c
10
menu.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: menu.c 3.16 2014/01/25 12:40:28 kls Exp $
|
* $Id: menu.c 3.19 2014/02/08 12:36:12 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -181,9 +181,13 @@ cMenuEditChannel::cMenuEditChannel(cChannel *Channel, bool New)
|
|||||||
strn0cpy(name, data.name, sizeof(name));
|
strn0cpy(name, data.name, sizeof(name));
|
||||||
if (New) {
|
if (New) {
|
||||||
channel = NULL;
|
channel = NULL;
|
||||||
|
// clear non-editable members:
|
||||||
data.nid = 0;
|
data.nid = 0;
|
||||||
data.tid = 0;
|
data.tid = 0;
|
||||||
data.rid = 0;
|
data.rid = 0;
|
||||||
|
*data.shortName = 0;
|
||||||
|
*data.provider = 0;
|
||||||
|
*data.portalName = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Setup();
|
Setup();
|
||||||
@ -979,7 +983,7 @@ eOSState cMenuEditTimer::ProcessKey(eKeys Key)
|
|||||||
if (!*data.file)
|
if (!*data.file)
|
||||||
strcpy(data.file, data.Channel()->ShortName(true));
|
strcpy(data.file, data.Channel()->ShortName(true));
|
||||||
if (timer) {
|
if (timer) {
|
||||||
if (memcmp(timer, &data, sizeof(data)) != 0)
|
if (memcmp((void *)timer, &data, sizeof(data)) != 0)
|
||||||
*timer = data;
|
*timer = data;
|
||||||
if (addIfConfirmed)
|
if (addIfConfirmed)
|
||||||
Timers.Add(timer);
|
Timers.Add(timer);
|
||||||
@ -3024,7 +3028,7 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys Key)
|
|||||||
ModifiedAppearance = true;
|
ModifiedAppearance = true;
|
||||||
if (strcmp(data.FontFix, Setup.FontFix) || !DoubleEqual(data.FontFixSizeP, Setup.FontFixSizeP))
|
if (strcmp(data.FontFix, Setup.FontFix) || !DoubleEqual(data.FontFixSizeP, Setup.FontFixSizeP))
|
||||||
ModifiedAppearance = true;
|
ModifiedAppearance = true;
|
||||||
if (data.AlwaysSortFoldersFirst != Setup.AlwaysSortFoldersFirst)
|
if (data.AlwaysSortFoldersFirst != Setup.AlwaysSortFoldersFirst || data.RecordingDirs != Setup.RecordingDirs)
|
||||||
Recordings.ClearSortNames();
|
Recordings.ClearSortNames();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
133
pat.c
133
pat.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: pat.c 3.2 2014/01/04 11:17:24 kls Exp $
|
* $Id: pat.c 3.4 2014/02/19 08:57:43 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pat.h"
|
#include "pat.h"
|
||||||
@ -12,9 +12,8 @@
|
|||||||
#include "channels.h"
|
#include "channels.h"
|
||||||
#include "libsi/section.h"
|
#include "libsi/section.h"
|
||||||
#include "libsi/descriptor.h"
|
#include "libsi/descriptor.h"
|
||||||
#include "thread.h"
|
|
||||||
|
|
||||||
#define PMT_SCAN_TIMEOUT 10 // seconds
|
#define PMT_SCAN_TIMEOUT 1000 // ms
|
||||||
|
|
||||||
// --- cCaDescriptor ---------------------------------------------------------
|
// --- cCaDescriptor ---------------------------------------------------------
|
||||||
|
|
||||||
@ -273,94 +272,115 @@ int GetCaPids(int Source, int Transponder, int ServiceId, const int *CaSystemIds
|
|||||||
|
|
||||||
// --- cPatFilter ------------------------------------------------------------
|
// --- cPatFilter ------------------------------------------------------------
|
||||||
|
|
||||||
|
//#define DEBUG_PAT_PMT
|
||||||
|
#ifdef DEBUG_PAT_PMT
|
||||||
|
#define DBGLOG(a...) { cString s = cString::sprintf(a); fprintf(stderr, "%s\n", *s); dsyslog("%s", *s); }
|
||||||
|
#else
|
||||||
|
#define DBGLOG(a...)
|
||||||
|
#endif
|
||||||
|
|
||||||
cPatFilter::cPatFilter(void)
|
cPatFilter::cPatFilter(void)
|
||||||
{
|
{
|
||||||
pmtIndex = 0;
|
Trigger(0);
|
||||||
pmtPid = 0;
|
|
||||||
pmtSid = 0;
|
|
||||||
lastPmtScan = 0;
|
|
||||||
numPmtEntries = 0;
|
|
||||||
Set(0x00, 0x00); // PAT
|
Set(0x00, 0x00); // PAT
|
||||||
}
|
}
|
||||||
|
|
||||||
void cPatFilter::SetStatus(bool On)
|
void cPatFilter::SetStatus(bool On)
|
||||||
{
|
{
|
||||||
|
cMutexLock MutexLock(&mutex);
|
||||||
|
DBGLOG("PAT filter set status %d", On);
|
||||||
cFilter::SetStatus(On);
|
cFilter::SetStatus(On);
|
||||||
pmtIndex = 0;
|
Trigger();
|
||||||
pmtPid = 0;
|
|
||||||
pmtSid = 0;
|
|
||||||
lastPmtScan = 0;
|
|
||||||
numPmtEntries = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cPatFilter::Trigger(void)
|
void cPatFilter::Trigger(int Sid)
|
||||||
{
|
{
|
||||||
|
cMutexLock MutexLock(&mutex);
|
||||||
|
patVersion = -1;
|
||||||
|
pmtIndex = -1;
|
||||||
numPmtEntries = 0;
|
numPmtEntries = 0;
|
||||||
|
if (Sid >= 0) {
|
||||||
|
sid = Sid;
|
||||||
|
DBGLOG("PAT filter trigger SID %d", Sid);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cPatFilter::PmtVersionChanged(int PmtPid, int Sid, int Version)
|
bool cPatFilter::PmtVersionChanged(int PmtPid, int Sid, int Version, bool SetNewVersion)
|
||||||
{
|
{
|
||||||
uint64_t v = Version;
|
int Id = MakePmtId(PmtPid, Sid);
|
||||||
v <<= 32;
|
|
||||||
uint64_t id = (PmtPid | (Sid << 16)) & 0x00000000FFFFFFFFLL;
|
|
||||||
for (int i = 0; i < numPmtEntries; i++) {
|
for (int i = 0; i < numPmtEntries; i++) {
|
||||||
if ((pmtVersion[i] & 0x00000000FFFFFFFFLL) == id) {
|
if (pmtId[i] == Id) {
|
||||||
bool Changed = (pmtVersion[i] & 0x000000FF00000000LL) != v;
|
if (pmtVersion[i] != Version) {
|
||||||
if (Changed)
|
if (SetNewVersion)
|
||||||
pmtVersion[i] = id | v;
|
pmtVersion[i] = Version;
|
||||||
return Changed;
|
else
|
||||||
|
DBGLOG("PMT %d %2d %5d %2d -> %2d", Transponder(), i, PmtPid, pmtVersion[i], Version);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (numPmtEntries < MAXPMTENTRIES)
|
return false;
|
||||||
pmtVersion[numPmtEntries++] = id | v;
|
}
|
||||||
return true;
|
|
||||||
|
void cPatFilter::SwitchToNextPmtPid(void)
|
||||||
|
{
|
||||||
|
if (pmtIndex >= 0) {
|
||||||
|
Del(GetPmtPid(pmtIndex), SI::TableIdPMT);
|
||||||
|
pmtIndex = (pmtIndex + 1) % numPmtEntries;
|
||||||
|
Add(GetPmtPid(pmtIndex), SI::TableIdPMT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
|
void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
|
||||||
{
|
{
|
||||||
|
cMutexLock MutexLock(&mutex);
|
||||||
if (Pid == 0x00) {
|
if (Pid == 0x00) {
|
||||||
if (Tid == 0x00) {
|
if (Tid == SI::TableIdPAT) {
|
||||||
if (pmtPid && time(NULL) - lastPmtScan > PMT_SCAN_TIMEOUT) {
|
SI::PAT pat(Data, false);
|
||||||
Del(pmtPid, 0x02);
|
if (!pat.CheckCRCAndParse())
|
||||||
pmtPid = 0;
|
return;
|
||||||
pmtIndex++;
|
if (pat.getVersionNumber() != patVersion) {
|
||||||
lastPmtScan = time(NULL);
|
DBGLOG("PAT %d %d -> %d", Transponder(), patVersion, pat.getVersionNumber());
|
||||||
}
|
if (pmtIndex >= 0) {
|
||||||
if (!pmtPid) {
|
Del(GetPmtPid(pmtIndex), SI::TableIdPMT);
|
||||||
SI::PAT pat(Data, false);
|
pmtIndex = -1;
|
||||||
if (!pat.CheckCRCAndParse())
|
}
|
||||||
return;
|
numPmtEntries = 0;
|
||||||
SI::PAT::Association assoc;
|
SI::PAT::Association assoc;
|
||||||
int Index = 0;
|
|
||||||
for (SI::Loop::Iterator it; pat.associationLoop.getNext(assoc, it); ) {
|
for (SI::Loop::Iterator it; pat.associationLoop.getNext(assoc, it); ) {
|
||||||
if (!assoc.isNITPid()) {
|
if (!assoc.isNITPid() && numPmtEntries < MAXPMTENTRIES) {
|
||||||
if (Index++ >= pmtIndex && Channels.GetByServiceID(Source(), Transponder(), assoc.getServiceId())) {
|
DBGLOG(" PMT pid %2d %5d SID %5d", numPmtEntries, assoc.getPid(), assoc.getServiceId());
|
||||||
pmtPid = assoc.getPid();
|
pmtId[numPmtEntries] = MakePmtId(assoc.getPid(), assoc.getServiceId());
|
||||||
pmtSid = assoc.getServiceId();
|
pmtVersion[numPmtEntries] = -1;
|
||||||
Add(pmtPid, 0x02);
|
if (sid == assoc.getServiceId()) {
|
||||||
break;
|
pmtIndex = numPmtEntries;
|
||||||
|
DBGLOG("sid = %d pmtIndex = %d", sid, pmtIndex);
|
||||||
}
|
}
|
||||||
|
numPmtEntries++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!pmtPid)
|
if (numPmtEntries > 0 && pmtIndex < 0)
|
||||||
pmtIndex = 0;
|
pmtIndex = 0;
|
||||||
|
Add(GetPmtPid(pmtIndex), SI::TableIdPMT);
|
||||||
|
patVersion = pat.getVersionNumber();
|
||||||
|
timer.Set(PMT_SCAN_TIMEOUT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (Pid == pmtPid && Tid == SI::TableIdPMT && Source() && Transponder()) {
|
else if (Tid == SI::TableIdPMT && Source() && Transponder()) {
|
||||||
|
timer.Set(PMT_SCAN_TIMEOUT);
|
||||||
SI::PMT pmt(Data, false);
|
SI::PMT pmt(Data, false);
|
||||||
if (!pmt.CheckCRCAndParse())
|
if (!pmt.CheckCRCAndParse())
|
||||||
return;
|
return;
|
||||||
if (pmt.getServiceId() != pmtSid)
|
if (!PmtVersionChanged(Pid, pmt.getTableIdExtension(), pmt.getVersionNumber())) {
|
||||||
return; // skip broken PMT records
|
SwitchToNextPmtPid();
|
||||||
if (!PmtVersionChanged(pmtPid, pmt.getTableIdExtension(), pmt.getVersionNumber())) {
|
|
||||||
lastPmtScan = 0; // this triggers the next scan
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!Channels.Lock(true, 10)) {
|
if (!Channels.Lock(true, 10))
|
||||||
numPmtEntries = 0; // to make sure we try again
|
|
||||||
return;
|
return;
|
||||||
}
|
PmtVersionChanged(Pid, pmt.getTableIdExtension(), pmt.getVersionNumber(), true);
|
||||||
|
SwitchToNextPmtPid();
|
||||||
cChannel *Channel = Channels.GetByServiceID(Source(), Transponder(), pmt.getServiceId());
|
cChannel *Channel = Channels.GetByServiceID(Source(), Transponder(), pmt.getServiceId());
|
||||||
if (Channel) {
|
if (Channel) {
|
||||||
SI::CaDescriptor *d;
|
SI::CaDescriptor *d;
|
||||||
@ -596,7 +616,12 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
}
|
}
|
||||||
Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors));
|
Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors));
|
||||||
}
|
}
|
||||||
lastPmtScan = 0; // this triggers the next scan
|
|
||||||
Channels.Unlock();
|
Channels.Unlock();
|
||||||
}
|
}
|
||||||
|
if (timer.TimedOut()) {
|
||||||
|
if (pmtIndex >= 0)
|
||||||
|
DBGLOG("PMT timeout %d", pmtIndex);
|
||||||
|
SwitchToNextPmtPid();
|
||||||
|
timer.Set(PMT_SCAN_TIMEOUT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
20
pat.h
20
pat.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: pat.h 3.2 2014/01/04 11:16:48 kls Exp $
|
* $Id: pat.h 3.3 2014/02/18 11:22:34 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __PAT_H
|
#ifndef __PAT_H
|
||||||
@ -12,24 +12,30 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
|
#include "thread.h"
|
||||||
|
|
||||||
#define MAXPMTENTRIES 64
|
#define MAXPMTENTRIES 64
|
||||||
|
|
||||||
class cPatFilter : public cFilter {
|
class cPatFilter : public cFilter {
|
||||||
private:
|
private:
|
||||||
time_t lastPmtScan;
|
cMutex mutex;
|
||||||
|
cTimeMs timer;
|
||||||
|
int patVersion;
|
||||||
int pmtIndex;
|
int pmtIndex;
|
||||||
int pmtPid;
|
int pmtId[MAXPMTENTRIES];
|
||||||
int pmtSid;
|
int pmtVersion[MAXPMTENTRIES];
|
||||||
uint64_t pmtVersion[MAXPMTENTRIES];
|
|
||||||
int numPmtEntries;
|
int numPmtEntries;
|
||||||
bool PmtVersionChanged(int PmtPid, int Sid, int Version);
|
int sid;
|
||||||
|
int GetPmtPid(int Index) { return pmtId[Index] & 0x0000FFFF; }
|
||||||
|
int MakePmtId(int PmtPid, int Sid) { return PmtPid | (Sid << 16); }
|
||||||
|
bool PmtVersionChanged(int PmtPid, int Sid, int Version, bool SetNewVersion = false);
|
||||||
|
void SwitchToNextPmtPid(void);
|
||||||
protected:
|
protected:
|
||||||
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
|
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
|
||||||
public:
|
public:
|
||||||
cPatFilter(void);
|
cPatFilter(void);
|
||||||
virtual void SetStatus(bool On);
|
virtual void SetStatus(bool On);
|
||||||
void Trigger(void);
|
void Trigger(int Sid = -1);
|
||||||
};
|
};
|
||||||
|
|
||||||
int GetCaDescriptors(int Source, int Transponder, int ServiceId, const int *CaSystemIds, int BufSize, uchar *Data, int EsPid);
|
int GetCaDescriptors(int Source, int Transponder, int ServiceId, const int *CaSystemIds, int BufSize, uchar *Data, int EsPid);
|
||||||
|
62
po/et_EE.po
62
po/et_EE.po
@ -697,14 +697,14 @@ msgid "Button$Now"
|
|||||||
msgstr "Hetkel"
|
msgstr "Hetkel"
|
||||||
|
|
||||||
msgid "Button$Schedule"
|
msgid "Button$Schedule"
|
||||||
msgstr "Ajakava"
|
msgstr "Kava"
|
||||||
|
|
||||||
msgid "Can't switch channel!"
|
msgid "Can't switch channel!"
|
||||||
msgstr "Kanali vahetus ei ole võimalik!"
|
msgstr "Kanali vahetus ei ole võimalik!"
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Schedule - %s"
|
msgid "Schedule - %s"
|
||||||
msgstr "Ajakava - %s"
|
msgstr "Kava - %s"
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "This event - %s"
|
msgid "This event - %s"
|
||||||
@ -724,71 +724,71 @@ msgid "CAM not responding!"
|
|||||||
msgstr "CAM ei vasta"
|
msgstr "CAM ei vasta"
|
||||||
|
|
||||||
msgid "Edit path"
|
msgid "Edit path"
|
||||||
msgstr ""
|
msgstr "Muuda teed"
|
||||||
|
|
||||||
msgid "Folder"
|
msgid "Folder"
|
||||||
msgstr ""
|
msgstr "Kaust"
|
||||||
|
|
||||||
msgid "This folder is currently in use - no changes are possible!"
|
msgid "This folder is currently in use - no changes are possible!"
|
||||||
msgstr ""
|
msgstr "Kaust on juba kasutusel - muutmine ei ole võimalik!"
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Move entire folder containing %d recordings?"
|
msgid "Move entire folder containing %d recordings?"
|
||||||
msgstr ""
|
msgstr "Teisaldada kaust mis sisaldab %d salvestust?"
|
||||||
|
|
||||||
msgid "Error while moving folder!"
|
msgid "Error while moving folder!"
|
||||||
msgstr ""
|
msgstr "Kausta teisaldamise viga!"
|
||||||
|
|
||||||
msgid "Edit recording"
|
msgid "Edit recording"
|
||||||
msgstr ""
|
msgstr "Salvestuse redigeerimine"
|
||||||
|
|
||||||
msgid "This recording is currently in use - no changes are possible!"
|
msgid "This recording is currently in use - no changes are possible!"
|
||||||
msgstr ""
|
msgstr "Salvestus hetkel kasutusel - muutmine ei ole võimalik!"
|
||||||
|
|
||||||
msgid "Button$Cancel cutting"
|
msgid "Button$Cancel cutting"
|
||||||
msgstr ""
|
msgstr "Lõikamise tühistamine"
|
||||||
|
|
||||||
msgid "Button$Stop cutting"
|
msgid "Button$Stop cutting"
|
||||||
msgstr ""
|
msgstr "Lõikamise peatamine"
|
||||||
|
|
||||||
msgid "Button$Cancel moving"
|
msgid "Button$Cancel moving"
|
||||||
msgstr ""
|
msgstr "Teisaldamise tühistamine"
|
||||||
|
|
||||||
msgid "Button$Stop moving"
|
msgid "Button$Stop moving"
|
||||||
msgstr ""
|
msgstr "Teisaldamise peatamine"
|
||||||
|
|
||||||
msgid "Button$Cancel copying"
|
msgid "Button$Cancel copying"
|
||||||
msgstr ""
|
msgstr "Kopeerimise tühistamine"
|
||||||
|
|
||||||
msgid "Button$Stop copying"
|
msgid "Button$Stop copying"
|
||||||
msgstr ""
|
msgstr "Kopeerimise peatamine"
|
||||||
|
|
||||||
msgid "Button$Cut"
|
msgid "Button$Cut"
|
||||||
msgstr ""
|
msgstr "Lõika"
|
||||||
|
|
||||||
msgid "Button$Delete marks"
|
msgid "Button$Delete marks"
|
||||||
msgstr ""
|
msgstr "Markerite kustutamine"
|
||||||
|
|
||||||
msgid "Recording vanished!"
|
msgid "Recording vanished!"
|
||||||
msgstr ""
|
msgstr "Salvestus kadunud!"
|
||||||
|
|
||||||
msgid "Edited version already exists - overwrite?"
|
msgid "Edited version already exists - overwrite?"
|
||||||
msgstr ""
|
msgstr "Redigeeritud versioon juba olemas - kirjutada üle?"
|
||||||
|
|
||||||
msgid "Error while queueing recording for cutting!"
|
msgid "Error while queueing recording for cutting!"
|
||||||
msgstr ""
|
msgstr "Salvestuse lõikamiseks lisamine ebaõnnestus!"
|
||||||
|
|
||||||
msgid "Delete editing marks for this recording?"
|
msgid "Delete editing marks for this recording?"
|
||||||
msgstr ""
|
msgstr "Kustutada selle salvestuse markerid?"
|
||||||
|
|
||||||
msgid "Error while deleting editing marks!"
|
msgid "Error while deleting editing marks!"
|
||||||
msgstr ""
|
msgstr "Markerite kustutamine ebaõnnestus!"
|
||||||
|
|
||||||
msgid "Error while changing priority/lifetime!"
|
msgid "Error while changing priority/lifetime!"
|
||||||
msgstr ""
|
msgstr "Prioriteedi/eluea muutmine ebaõnnestus!"
|
||||||
|
|
||||||
msgid "Error while changing folder/name!"
|
msgid "Error while changing folder/name!"
|
||||||
msgstr ""
|
msgstr "Kausta/nime muutmine ebaõnnestus!"
|
||||||
|
|
||||||
msgid "Recording info"
|
msgid "Recording info"
|
||||||
msgstr "Salvestuse info"
|
msgstr "Salvestuse info"
|
||||||
@ -1283,13 +1283,13 @@ msgstr "Jätkata"
|
|||||||
|
|
||||||
#. TRANSLATORS: note the leading blank!
|
#. TRANSLATORS: note the leading blank!
|
||||||
msgid " Cancel editing"
|
msgid " Cancel editing"
|
||||||
msgstr " Katkestada redigeerimine"
|
msgstr " Tühistada töötlemine"
|
||||||
|
|
||||||
msgid "Stop recording?"
|
msgid "Stop recording?"
|
||||||
msgstr "Lõpetada salvestamine?"
|
msgstr "Lõpetada salvestamine?"
|
||||||
|
|
||||||
msgid "Cancel editing?"
|
msgid "Cancel editing?"
|
||||||
msgstr "Tühistada redigeermine?"
|
msgstr "Tühistada töötlemine?"
|
||||||
|
|
||||||
msgid "No audio available!"
|
msgid "No audio available!"
|
||||||
msgstr "Audio kättesaamatu!"
|
msgstr "Audio kättesaamatu!"
|
||||||
@ -1371,7 +1371,7 @@ msgid "Can't shutdown - option '-s' not given!"
|
|||||||
msgstr "Väljalülitamine ebaõnnestus - '-s' parameeter puudub!"
|
msgstr "Väljalülitamine ebaõnnestus - '-s' parameeter puudub!"
|
||||||
|
|
||||||
msgid "Editing - shut down anyway?"
|
msgid "Editing - shut down anyway?"
|
||||||
msgstr "Redigeerimine aktiive - lülitada välja?"
|
msgstr "Töötlemine aktiive - lülitada välja?"
|
||||||
|
|
||||||
msgid "Recording - shut down anyway?"
|
msgid "Recording - shut down anyway?"
|
||||||
msgstr "Salvestamine aktiivne - lülitada välja?"
|
msgstr "Salvestamine aktiivne - lülitada välja?"
|
||||||
@ -1388,7 +1388,7 @@ msgid "Plugin %s wakes up in %ld min, continue?"
|
|||||||
msgstr "Laiendusmoodul %s ärkab %ld minuti pärast, jätkata?"
|
msgstr "Laiendusmoodul %s ärkab %ld minuti pärast, jätkata?"
|
||||||
|
|
||||||
msgid "Editing - restart anyway?"
|
msgid "Editing - restart anyway?"
|
||||||
msgstr "Redigeerimine aktiivne - restart?"
|
msgstr "Töötlemine aktiivne - restart?"
|
||||||
|
|
||||||
msgid "Recording - restart anyway?"
|
msgid "Recording - restart anyway?"
|
||||||
msgstr "Salvestamine aktiivne - restart?"
|
msgstr "Salvestamine aktiivne - restart?"
|
||||||
@ -1423,7 +1423,7 @@ msgstr "ESITUS"
|
|||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Moving dish to %.1f..."
|
msgid "Moving dish to %.1f..."
|
||||||
msgstr "Antenni pööramine positsioonile %.1f..."
|
msgstr "Liikumine positsioonile %.1f..."
|
||||||
|
|
||||||
msgid "ST:TNG Panels"
|
msgid "ST:TNG Panels"
|
||||||
msgstr "ST:TNG Panels"
|
msgstr "ST:TNG Panels"
|
||||||
@ -1476,10 +1476,10 @@ msgid "Switching primary DVB..."
|
|||||||
msgstr "Esmase DVB seadme ümberlülitus..."
|
msgstr "Esmase DVB seadme ümberlülitus..."
|
||||||
|
|
||||||
msgid "Editing process failed!"
|
msgid "Editing process failed!"
|
||||||
msgstr "Redigeerimine ebaõnnestus!"
|
msgstr "Töötlemine ebaõnnestus!"
|
||||||
|
|
||||||
msgid "Editing process finished"
|
msgid "Editing process finished"
|
||||||
msgstr "Redigeerimine lõpetatud"
|
msgstr "Töötlemine lõpetatud"
|
||||||
|
|
||||||
msgid "Press any key to cancel restart"
|
msgid "Press any key to cancel restart"
|
||||||
msgstr "Restardi katkestamiseks vajuta suvalist klahvi"
|
msgstr "Restardi katkestamiseks vajuta suvalist klahvi"
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: receiver.c 3.1 2014/01/01 12:03:00 kls Exp $
|
* $Id: receiver.c 3.2 2014/02/08 15:57:30 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "receiver.h"
|
#include "receiver.h"
|
||||||
@ -22,10 +22,10 @@ cReceiver::cReceiver(const cChannel *Channel, int Priority)
|
|||||||
cReceiver::~cReceiver()
|
cReceiver::~cReceiver()
|
||||||
{
|
{
|
||||||
if (device) {
|
if (device) {
|
||||||
const char *msg = "ERROR: cReceiver has not been detached yet! This is a design fault and VDR will segfault now!";
|
const char *msg = "ERROR: cReceiver has not been detached yet! This is a design fault and VDR will abort now!";
|
||||||
esyslog("%s", msg);
|
esyslog("%s", msg);
|
||||||
fprintf(stderr, "%s\n", msg);
|
fprintf(stderr, "%s\n", msg);
|
||||||
*(char *)0 = 0; // cause a segfault
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: recorder.c 3.2 2014/01/01 12:46:37 kls Exp $
|
* $Id: recorder.c 3.3 2014/02/21 09:19:52 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "recorder.h"
|
#include "recorder.h"
|
||||||
@ -155,13 +155,13 @@ void cRecorder::Action(void)
|
|||||||
recordFile->Write(pmt, TS_SIZE);
|
recordFile->Write(pmt, TS_SIZE);
|
||||||
fileSize += TS_SIZE;
|
fileSize += TS_SIZE;
|
||||||
}
|
}
|
||||||
|
t.Set(MAXBROKENTIMEOUT);
|
||||||
}
|
}
|
||||||
if (recordFile->Write(b, Count) < 0) {
|
if (recordFile->Write(b, Count) < 0) {
|
||||||
LOG_ERROR_STR(fileName->Name());
|
LOG_ERROR_STR(fileName->Name());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fileSize += Count;
|
fileSize += Count;
|
||||||
t.Set(MAXBROKENTIMEOUT);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ringBuffer->Del(Count);
|
ringBuffer->Del(Count);
|
||||||
|
34
recording.c
34
recording.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: recording.c 3.13 2014/01/18 12:54:56 kls Exp $
|
* $Id: recording.c 3.16 2014/02/08 11:16:02 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "recording.h"
|
#include "recording.h"
|
||||||
@ -969,14 +969,22 @@ char *cRecording::SortName(void) const
|
|||||||
{
|
{
|
||||||
char **sb = (RecordingsSortMode == rsmName) ? &sortBufferName : &sortBufferTime;
|
char **sb = (RecordingsSortMode == rsmName) ? &sortBufferName : &sortBufferTime;
|
||||||
if (!*sb) {
|
if (!*sb) {
|
||||||
char *s = strdup(FileName() + strlen(cVideoDirectory::Name()));
|
if (RecordingsSortMode == rsmTime && !Setup.RecordingDirs) {
|
||||||
if (RecordingsSortMode != rsmName || Setup.AlwaysSortFoldersFirst)
|
char buf[32];
|
||||||
s = StripEpisodeName(s, RecordingsSortMode != rsmName);
|
struct tm tm_r;
|
||||||
strreplace(s, '/', '0'); // some locales ignore '/' when sorting
|
strftime(buf, sizeof(buf), "%Y%m%d%H%I", localtime_r(&start, &tm_r));
|
||||||
int l = strxfrm(NULL, s, 0) + 1;
|
*sb = strdup(buf);
|
||||||
*sb = MALLOC(char, l);
|
}
|
||||||
strxfrm(*sb, s, l);
|
else {
|
||||||
free(s);
|
char *s = strdup(FileName() + strlen(cVideoDirectory::Name()));
|
||||||
|
if (RecordingsSortMode != rsmName || Setup.AlwaysSortFoldersFirst)
|
||||||
|
s = StripEpisodeName(s, RecordingsSortMode != rsmName);
|
||||||
|
strreplace(s, '/', '0'); // some locales ignore '/' when sorting
|
||||||
|
int l = strxfrm(NULL, s, 0) + 1;
|
||||||
|
*sb = MALLOC(char, l);
|
||||||
|
strxfrm(*sb, s, l);
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return *sb;
|
return *sb;
|
||||||
}
|
}
|
||||||
@ -2915,7 +2923,7 @@ cString IndexToHMSF(int Index, bool WithFrame, double FramesPerSecond)
|
|||||||
Sign = "-";
|
Sign = "-";
|
||||||
}
|
}
|
||||||
double Seconds;
|
double Seconds;
|
||||||
int f = int(modf((Index + 0.5) / FramesPerSecond, &Seconds) * FramesPerSecond + 1);
|
int f = int(modf((Index + 0.5) / FramesPerSecond, &Seconds) * FramesPerSecond);
|
||||||
int s = int(Seconds);
|
int s = int(Seconds);
|
||||||
int m = s / 60 % 60;
|
int m = s / 60 % 60;
|
||||||
int h = s / 3600;
|
int h = s / 3600;
|
||||||
@ -2925,12 +2933,12 @@ cString IndexToHMSF(int Index, bool WithFrame, double FramesPerSecond)
|
|||||||
|
|
||||||
int HMSFToIndex(const char *HMSF, double FramesPerSecond)
|
int HMSFToIndex(const char *HMSF, double FramesPerSecond)
|
||||||
{
|
{
|
||||||
int h, m, s, f = 1;
|
int h, m, s, f = 0;
|
||||||
int n = sscanf(HMSF, "%d:%d:%d.%d", &h, &m, &s, &f);
|
int n = sscanf(HMSF, "%d:%d:%d.%d", &h, &m, &s, &f);
|
||||||
if (n == 1)
|
if (n == 1)
|
||||||
return h - 1; // plain frame number
|
return h; // plain frame number
|
||||||
if (n >= 3)
|
if (n >= 3)
|
||||||
return int(round((h * 3600 + m * 60 + s) * FramesPerSecond)) + f - 1;
|
return int(round((h * 3600 + m * 60 + s) * FramesPerSecond)) + f;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
remote.c
4
remote.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: remote.c 3.1 2013/12/25 12:45:43 kls Exp $
|
* $Id: remote.c 3.2 2014/02/15 12:40:39 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
@ -298,7 +298,7 @@ int cKbdRemote::MapCodeToFunc(uint64_t Code)
|
|||||||
|
|
||||||
void cKbdRemote::PutKey(uint64_t Code, bool Repeat, bool Release)
|
void cKbdRemote::PutKey(uint64_t Code, bool Repeat, bool Release)
|
||||||
{
|
{
|
||||||
if (rawMode || !Put(Code, Repeat, Release)) {
|
if (rawMode || (!Put(Code, Repeat, Release) && !IsLearning())) {
|
||||||
if (int func = MapCodeToFunc(Code))
|
if (int func = MapCodeToFunc(Code))
|
||||||
Put(KBDKEY(func), Repeat, Release);
|
Put(KBDKEY(func), Repeat, Release);
|
||||||
}
|
}
|
||||||
|
60
remux.c
60
remux.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: remux.c 3.1 2014/01/18 11:27:30 kls Exp $
|
* $Id: remux.c 3.3 2014/02/21 11:51:55 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "remux.h"
|
#include "remux.h"
|
||||||
@ -23,6 +23,10 @@ static bool DebugFrames = false;
|
|||||||
#define dbgpatpmt(a...) if (DebugPatPmt) fprintf(stderr, a)
|
#define dbgpatpmt(a...) if (DebugPatPmt) fprintf(stderr, a)
|
||||||
#define dbgframes(a...) if (DebugFrames) fprintf(stderr, a)
|
#define dbgframes(a...) if (DebugFrames) fprintf(stderr, a)
|
||||||
|
|
||||||
|
#define MAX_TS_PACKETS_FOR_VIDEO_FRAME_DETECTION 6
|
||||||
|
#define WRN_TS_PACKETS_FOR_VIDEO_FRAME_DETECTION (MAX_TS_PACKETS_FOR_VIDEO_FRAME_DETECTION / 2)
|
||||||
|
#define WRN_TS_PACKETS_FOR_FRAME_DETECTOR (MIN_TS_PACKETS_FOR_FRAME_DETECTOR / 2)
|
||||||
|
|
||||||
#define EMPTY_SCANNER (0xFFFFFFFF)
|
#define EMPTY_SCANNER (0xFFFFFFFF)
|
||||||
|
|
||||||
ePesHeader AnalyzePesHeader(const uchar *Data, int Count, int &PesPayloadOffset, bool *ContinuationHeader)
|
ePesHeader AnalyzePesHeader(const uchar *Data, int Count, int &PesPayloadOffset, bool *ContinuationHeader)
|
||||||
@ -231,7 +235,7 @@ cTsPayload::cTsPayload(void)
|
|||||||
data = NULL;
|
data = NULL;
|
||||||
length = 0;
|
length = 0;
|
||||||
pid = -1;
|
pid = -1;
|
||||||
index = 0;
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
cTsPayload::cTsPayload(uchar *Data, int Length, int Pid)
|
cTsPayload::cTsPayload(uchar *Data, int Length, int Pid)
|
||||||
@ -239,12 +243,25 @@ cTsPayload::cTsPayload(uchar *Data, int Length, int Pid)
|
|||||||
Setup(Data, Length, Pid);
|
Setup(Data, Length, Pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uchar cTsPayload::SetEof(void)
|
||||||
|
{
|
||||||
|
length = index; // triggers EOF
|
||||||
|
return 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cTsPayload::Reset(void)
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
numPacketsPid = 0;
|
||||||
|
numPacketsOther = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void cTsPayload::Setup(uchar *Data, int Length, int Pid)
|
void cTsPayload::Setup(uchar *Data, int Length, int Pid)
|
||||||
{
|
{
|
||||||
data = Data;
|
data = Data;
|
||||||
length = Length;
|
length = Length;
|
||||||
pid = Pid >= 0 ? Pid : TsPid(Data);
|
pid = Pid >= 0 ? Pid : TsPid(Data);
|
||||||
index = 0;
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
uchar cTsPayload::GetByte(void)
|
uchar cTsPayload::GetByte(void)
|
||||||
@ -255,20 +272,20 @@ uchar cTsPayload::GetByte(void)
|
|||||||
if (data[index] == TS_SYNC_BYTE && index + TS_SIZE <= length) { // to make sure we are at a TS header start and drop incomplete TS packets at the end
|
if (data[index] == TS_SYNC_BYTE && index + TS_SIZE <= length) { // to make sure we are at a TS header start and drop incomplete TS packets at the end
|
||||||
uchar *p = data + index;
|
uchar *p = data + index;
|
||||||
if (TsPid(p) == pid) { // only handle TS packets for the initial PID
|
if (TsPid(p) == pid) { // only handle TS packets for the initial PID
|
||||||
|
if (numPacketsPid++ > MAX_TS_PACKETS_FOR_VIDEO_FRAME_DETECTION)
|
||||||
|
return SetEof();
|
||||||
if (TsHasPayload(p)) {
|
if (TsHasPayload(p)) {
|
||||||
if (index > 0 && TsPayloadStart(p)) { // checking index to not skip the very first TS packet
|
if (index > 0 && TsPayloadStart(p)) // checking index to not skip the very first TS packet
|
||||||
length = index; // triggers EOF
|
return SetEof();
|
||||||
return 0x00;
|
|
||||||
}
|
|
||||||
index += TsPayloadOffset(p);
|
index += TsPayloadOffset(p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
numPacketsOther++;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
length = index; // triggers EOF
|
return SetEof();
|
||||||
return 0x00;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return data[index++];
|
return data[index++];
|
||||||
@ -302,6 +319,8 @@ void cTsPayload::SetByte(uchar Byte, int Index)
|
|||||||
bool cTsPayload::Find(uint32_t Code)
|
bool cTsPayload::Find(uint32_t Code)
|
||||||
{
|
{
|
||||||
int OldIndex = index;
|
int OldIndex = index;
|
||||||
|
int OldNumPacketsPid = numPacketsPid;
|
||||||
|
int OldNumPacketsOther = numPacketsOther;
|
||||||
uint32_t Scanner = EMPTY_SCANNER;
|
uint32_t Scanner = EMPTY_SCANNER;
|
||||||
while (!Eof()) {
|
while (!Eof()) {
|
||||||
Scanner = (Scanner << 8) | GetByte();
|
Scanner = (Scanner << 8) | GetByte();
|
||||||
@ -309,9 +328,19 @@ bool cTsPayload::Find(uint32_t Code)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
index = OldIndex;
|
index = OldIndex;
|
||||||
|
numPacketsPid = OldNumPacketsPid;
|
||||||
|
numPacketsOther = OldNumPacketsOther;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cTsPayload::Statistics(void) const
|
||||||
|
{
|
||||||
|
if (numPacketsPid + numPacketsOther > WRN_TS_PACKETS_FOR_FRAME_DETECTOR)
|
||||||
|
dsyslog("WARNING: required (%d+%d) TS packets to determine frame type", numPacketsOther, numPacketsPid);
|
||||||
|
if (numPacketsPid > WRN_TS_PACKETS_FOR_VIDEO_FRAME_DETECTION)
|
||||||
|
dsyslog("WARNING: required %d video TS packets to determine frame type", numPacketsPid);
|
||||||
|
}
|
||||||
|
|
||||||
// --- cPatPmtGenerator ------------------------------------------------------
|
// --- cPatPmtGenerator ------------------------------------------------------
|
||||||
|
|
||||||
cPatPmtGenerator::cPatPmtGenerator(const cChannel *Channel)
|
cPatPmtGenerator::cPatPmtGenerator(const cChannel *Channel)
|
||||||
@ -1120,11 +1149,11 @@ int cMpeg2Parser::Parse(const uchar *Data, int Length, int Pid)
|
|||||||
dbgframes("%c", FrameTypes[FrameType]);
|
dbgframes("%c", FrameTypes[FrameType]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
tsPayload.Statistics();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (tsPayload.AtPayloadStart() // stop at any new payload start to have the buffer refilled if necessary
|
if (tsPayload.AtPayloadStart() // stop at any new payload start to have the buffer refilled if necessary
|
||||||
|| (tsPayload.Available() < MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE // stop if the available data is below the limit...
|
|| tsPayload.Eof()) // or if we're out of data
|
||||||
&& (tsPayload.Available() <= 0 || tsPayload.AtTsStart()))) // ...but only if there is no more data at all, or if we are at a TS boundary
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return tsPayload.Used();
|
return tsPayload.Used();
|
||||||
@ -1266,6 +1295,8 @@ int cH264Parser::Parse(const uchar *Data, int Length, int Pid)
|
|||||||
case nutCodedSliceIdr: if (gotAccessUnitDelimiter && gotSequenceParameterSet) {
|
case nutCodedSliceIdr: if (gotAccessUnitDelimiter && gotSequenceParameterSet) {
|
||||||
ParseSliceHeader();
|
ParseSliceHeader();
|
||||||
gotAccessUnitDelimiter = false;
|
gotAccessUnitDelimiter = false;
|
||||||
|
if (newFrame)
|
||||||
|
tsPayload.Statistics();
|
||||||
return tsPayload.Used();
|
return tsPayload.Used();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1273,8 +1304,7 @@ int cH264Parser::Parse(const uchar *Data, int Length, int Pid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tsPayload.AtPayloadStart() // stop at any new payload start to have the buffer refilled if necessary
|
if (tsPayload.AtPayloadStart() // stop at any new payload start to have the buffer refilled if necessary
|
||||||
|| (tsPayload.Available() < MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE // stop if the available data is below the limit...
|
|| tsPayload.Eof()) // or if we're out of data
|
||||||
&& (tsPayload.Available() <= 0 || tsPayload.AtTsStart()))) // ...but only if there is no more data at all, or if we are at a TS boundary
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return tsPayload.Used();
|
return tsPayload.Used();
|
||||||
|
14
remux.h
14
remux.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: remux.h 3.1 2014/01/16 10:15:50 kls Exp $
|
* $Id: remux.h 3.3 2014/02/08 12:41:50 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __REMUX_H
|
#ifndef __REMUX_H
|
||||||
@ -217,8 +217,11 @@ private:
|
|||||||
int length;
|
int length;
|
||||||
int pid;
|
int pid;
|
||||||
int index; // points to the next byte to process
|
int index; // points to the next byte to process
|
||||||
|
int numPacketsPid; // the number of TS packets with the given PID (for statistical purposes)
|
||||||
|
int numPacketsOther; // the number of TS packets with other PIDs (for statistical purposes)
|
||||||
|
uchar SetEof(void);
|
||||||
protected:
|
protected:
|
||||||
void Reset(void) { index = 0; }
|
void Reset(void);
|
||||||
public:
|
public:
|
||||||
cTsPayload(void);
|
cTsPayload(void);
|
||||||
cTsPayload(uchar *Data, int Length, int Pid = -1);
|
cTsPayload(uchar *Data, int Length, int Pid = -1);
|
||||||
@ -246,6 +249,10 @@ public:
|
|||||||
///< is counted with its full size.
|
///< is counted with its full size.
|
||||||
bool Eof(void) const { return index >= length; }
|
bool Eof(void) const { return index >= length; }
|
||||||
///< Returns true if all available bytes of the TS payload have been processed.
|
///< Returns true if all available bytes of the TS payload have been processed.
|
||||||
|
void Statistics(void) const;
|
||||||
|
///< May be called after a new frame has been detected, and will log a warning
|
||||||
|
///< if the number of TS packets required to determine the frame type exceeded
|
||||||
|
///< some safety limits.
|
||||||
uchar GetByte(void);
|
uchar GetByte(void);
|
||||||
///< Gets the next byte of the TS payload, skipping any intermediate TS header data.
|
///< Gets the next byte of the TS payload, skipping any intermediate TS header data.
|
||||||
bool SkipBytes(int Bytes);
|
bool SkipBytes(int Bytes);
|
||||||
@ -462,7 +469,7 @@ void PesDump(const char *Name, const u_char *Data, int Length);
|
|||||||
|
|
||||||
// Frame detector:
|
// Frame detector:
|
||||||
|
|
||||||
#define MIN_TS_PACKETS_FOR_FRAME_DETECTOR 10
|
#define MIN_TS_PACKETS_FOR_FRAME_DETECTOR 100
|
||||||
|
|
||||||
class cFrameParser;
|
class cFrameParser;
|
||||||
|
|
||||||
@ -476,7 +483,6 @@ private:
|
|||||||
bool independentFrame;
|
bool independentFrame;
|
||||||
uint32_t ptsValues[MaxPtsValues]; // 32 bit is enough - we only need the delta
|
uint32_t ptsValues[MaxPtsValues]; // 32 bit is enough - we only need the delta
|
||||||
int numPtsValues;
|
int numPtsValues;
|
||||||
int numFrames;
|
|
||||||
int numIFrames;
|
int numIFrames;
|
||||||
bool isVideo;
|
bool isVideo;
|
||||||
double framesPerSecond;
|
double framesPerSecond;
|
||||||
|
6
sdt.c
6
sdt.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: sdt.c 3.1 2014/01/04 15:02:31 kls Exp $
|
* $Id: sdt.c 3.2 2014/02/18 10:37:50 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sdt.h"
|
#include "sdt.h"
|
||||||
@ -94,7 +94,7 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
}
|
}
|
||||||
else if (*pn && Setup.UpdateChannels >= 4) {
|
else if (*pn && Setup.UpdateChannels >= 4) {
|
||||||
channel = Channels.NewChannel(Channel(), pn, ps, pp, sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId());
|
channel = Channels.NewChannel(Channel(), pn, ps, pp, sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId());
|
||||||
patFilter->Trigger();
|
patFilter->Trigger(SiSdtService.getServiceId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default: ;
|
default: ;
|
||||||
@ -120,7 +120,7 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
cChannel *link = Channels.GetByChannelID(tChannelID(Source(), Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId()));
|
cChannel *link = Channels.GetByChannelID(tChannelID(Source(), Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId()));
|
||||||
if (!link && Setup.UpdateChannels >= 4) {
|
if (!link && Setup.UpdateChannels >= 4) {
|
||||||
link = Channels.NewChannel(Channel(), "NVOD", "", "", Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId());
|
link = Channels.NewChannel(Channel(), "NVOD", "", "", Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId());
|
||||||
patFilter->Trigger();
|
patFilter->Trigger(Service.getServiceId());
|
||||||
}
|
}
|
||||||
if (link) {
|
if (link) {
|
||||||
if (!LinkChannels)
|
if (!LinkChannels)
|
||||||
|
4
skins.h
4
skins.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: skins.h 3.2 2013/11/03 14:07:34 kls Exp $
|
* $Id: skins.h 3.3 2014/02/17 11:05:29 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __SKINS_H
|
#ifndef __SKINS_H
|
||||||
@ -280,7 +280,7 @@ protected:
|
|||||||
class cProgressBar : public cBitmap {
|
class cProgressBar : public cBitmap {
|
||||||
protected:
|
protected:
|
||||||
int total;
|
int total;
|
||||||
int Pos(int p) { return p * Width() / total; }
|
int Pos(int p) { return int(int64_t(p) * Width() / total); }
|
||||||
void Mark(int x, bool Start, bool Current, tColor ColorMark, tColor ColorCurrent);
|
void Mark(int x, bool Start, bool Current, tColor ColorMark, tColor ColorCurrent);
|
||||||
public:
|
public:
|
||||||
cProgressBar(int Width, int Height, int Current, int Total, const cMarks *Marks, tColor ColorSeen, tColor ColorRest, tColor ColorSelected, tColor ColorMark, tColor ColorCurrent);
|
cProgressBar(int Width, int Height, int Current, int Total, const cMarks *Marks, tColor ColorSeen, tColor ColorRest, tColor ColorSelected, tColor ColorMark, tColor ColorCurrent);
|
||||||
|
4
vdr.c
4
vdr.c
@ -22,7 +22,7 @@
|
|||||||
*
|
*
|
||||||
* The project's page is at http://www.tvdr.de
|
* The project's page is at http://www.tvdr.de
|
||||||
*
|
*
|
||||||
* $Id: vdr.c 3.9 2014/01/25 10:47:39 kls Exp $
|
* $Id: vdr.c 3.10 2014/01/26 12:27:51 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -917,7 +917,7 @@ int main(int argc, char *argv[])
|
|||||||
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
||||||
if (Channel->Modification(CHANNELMOD_RETUNE)) {
|
if (Channel->Modification(CHANNELMOD_RETUNE)) {
|
||||||
cRecordControls::ChannelDataModified(Channel);
|
cRecordControls::ChannelDataModified(Channel);
|
||||||
if (Channel->Number() == cDevice::CurrentChannel()) {
|
if (Channel->Number() == cDevice::CurrentChannel() && cDevice::PrimaryDevice()->HasDecoder()) {
|
||||||
if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring()) {
|
if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring()) {
|
||||||
if (cDevice::ActualDevice()->ProvidesTransponder(Channel)) { // avoids retune on devices that don't really access the transponder
|
if (cDevice::ActualDevice()->ProvidesTransponder(Channel)) { // avoids retune on devices that don't really access the transponder
|
||||||
isyslog("retuning due to modification of channel %d", Channel->Number());
|
isyslog("retuning due to modification of channel %d", Channel->Number());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user