mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Version 1.3.23
- The setup option "DVB/Video display format" is now only available if "Video format" is set to "4:3" (suggested by Mikko Salo). - Updated the Russian OSD texts (thanks to Vyacheslav Dikonov). - Dropped CA support for the old '-icam' firmware. - Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). - Updated the Swedish OSD texts (thanks to Tomas Prybil). - Fixed a few French OSD texts that were in the wrong place. - Improved matching timers to EPG events, especially in case there are several events with the same VPS time. - Fixed cDolbyRepacker to allow recording ProSieben HD broadcasts (thanks to Reinhard Nissl). - Fixed cDvbDevice::SetVideoDisplayFormat() in case of 16:9 (thanks to Marco Schlüßler). - The running status of a VPS event is now only taken seriously if that event has been seen within the last 30 seconds - otherwise recording is done as if no VPS was available. - The day of a timer is now stored as a full date in ISO notation ("YYYY-MM-DD") in 'timers.conf' and for the result of the SVDRP command LSTT (based in parts on a patch by Roman Krenický). - Some fixes to avoid compiler warnings in gcc 4.0 (thanks to Ville Skyttä for reporting these). - Single shot timers are now reliably deleted when they have expired. - Fixed setting the colored button help after deleting a recording in case the next menu entry is a directory (thanks to Steffen Beyer). - Improved falling back to normal recording if the VPS data hasn't been seen for more than 30 seconds. - Added a missing cMutexLock to cRemote::HasKeys() (thanks to Wolfgang Rohdewald). - All log entries regarding timers now contain a short description of the timer.
This commit is contained in:
46
remux.c
46
remux.c
@@ -11,7 +11,7 @@
|
||||
* The cDolbyRepacker code was originally written by Reinhard Nissl <rnissl@gmx.de>,
|
||||
* and adapted to the VDR coding style by Klaus.Schmidinger@cadsoft.de.
|
||||
*
|
||||
* $Id: remux.c 1.31 2005/02/13 14:36:23 kls Exp $
|
||||
* $Id: remux.c 1.33 2005/03/20 13:18:15 kls Exp $
|
||||
*/
|
||||
|
||||
#include "remux.h"
|
||||
@@ -46,6 +46,8 @@ private:
|
||||
int fragmentTodo;
|
||||
uchar pesHeader[6 + 3 + 255 + 4 + 4];
|
||||
int pesHeaderLen;
|
||||
uchar pesHeaderBackup[6 + 3 + 255];
|
||||
int pesHeaderBackupLen;
|
||||
uchar chk1;
|
||||
uchar chk2;
|
||||
int ac3todo;
|
||||
@@ -57,8 +59,8 @@ private:
|
||||
get_length,
|
||||
output_packet
|
||||
} state;
|
||||
void ResetPesHeader(void);
|
||||
void AppendSubStreamID(void);
|
||||
void ResetPesHeader(bool ContinuationFrame = false);
|
||||
void AppendSubStreamID(bool ContinuationFrame = false);
|
||||
bool FinishRemainder(cRingBufferLinear *ResultBuffer, const uchar *const Data, const int Todo, int &Done, int &Bite);
|
||||
bool StartNewPacket(cRingBufferLinear *ResultBuffer, const uchar *const Data, const int Todo, int &Done, int &Bite);
|
||||
public:
|
||||
@@ -103,23 +105,26 @@ cDolbyRepacker::cDolbyRepacker(void)
|
||||
Reset();
|
||||
}
|
||||
|
||||
void cDolbyRepacker::AppendSubStreamID(void)
|
||||
void cDolbyRepacker::AppendSubStreamID(bool ContinuationFrame)
|
||||
{
|
||||
if (subStreamId) {
|
||||
pesHeader[pesHeaderLen++] = subStreamId;
|
||||
// number of ac3 frames "starting" in this packet (1 by design).
|
||||
pesHeader[pesHeaderLen++] = 0x01;
|
||||
// offset to start of first ac3 frame (0 means "no ac3 frame starting"
|
||||
// so 1 (by design) addresses the first byte after the next two bytes).
|
||||
pesHeader[pesHeaderLen++] = 0x00;
|
||||
pesHeader[pesHeaderLen++] = 0x00;
|
||||
pesHeader[pesHeaderLen++] = 0x00;
|
||||
pesHeader[pesHeaderLen++] = (ContinuationFrame ? 0x00 : 0x01);
|
||||
}
|
||||
}
|
||||
|
||||
void cDolbyRepacker::ResetPesHeader(void)
|
||||
void cDolbyRepacker::ResetPesHeader(bool ContinuationFrame)
|
||||
{
|
||||
pesHeader[6] = 0x80;
|
||||
pesHeader[7] = 0x00;
|
||||
pesHeader[8] = 0x00;
|
||||
pesHeaderLen = 9;
|
||||
AppendSubStreamID();
|
||||
AppendSubStreamID(ContinuationFrame);
|
||||
}
|
||||
|
||||
void cDolbyRepacker::Reset(void)
|
||||
@@ -131,6 +136,7 @@ void cDolbyRepacker::Reset(void)
|
||||
chk2 = 0;
|
||||
fragmentLen = 0;
|
||||
fragmentTodo = 0;
|
||||
pesHeaderBackupLen = 0;
|
||||
}
|
||||
|
||||
bool cDolbyRepacker::FinishRemainder(cRingBufferLinear *ResultBuffer, const uchar *const Data, const int Todo, int &Done, int &Bite)
|
||||
@@ -229,12 +235,17 @@ int cDolbyRepacker::Put(cRingBufferLinear *ResultBuffer, const uchar *Data, int
|
||||
if ((Data[6] & 0xC0) != 0x80)
|
||||
return 0;
|
||||
|
||||
// backup PES header
|
||||
if (Data[6] != 0x80 || Data[7] != 0x00 || Data[8] != 0x00) {
|
||||
pesHeaderBackupLen = 6 + 3 + Data[8];
|
||||
memcpy(pesHeaderBackup, Data, pesHeaderBackupLen);
|
||||
}
|
||||
|
||||
// skip PES header
|
||||
int done = 6 + 3 + Data[8];
|
||||
int todo = Count - done;
|
||||
const uchar *data = Data + done;
|
||||
bool headerCopied = false;
|
||||
|
||||
|
||||
// look for 0x0B 0x77 <chk1> <chk2> <frameSize>
|
||||
while (todo > 0) {
|
||||
switch (state) {
|
||||
@@ -242,10 +253,10 @@ int cDolbyRepacker::Put(cRingBufferLinear *ResultBuffer, const uchar *Data, int
|
||||
if (*data == 0x0B) {
|
||||
++(int &)state;
|
||||
// copy header information once for later use
|
||||
if (!headerCopied) {
|
||||
headerCopied = true;
|
||||
pesHeaderLen = 6 + 3 + Data[8];
|
||||
memcpy(pesHeader, Data, pesHeaderLen);
|
||||
if (pesHeaderBackupLen > 0) {
|
||||
pesHeaderLen = pesHeaderBackupLen;
|
||||
pesHeaderBackupLen = 0;
|
||||
memcpy(pesHeader, pesHeaderBackup, pesHeaderLen);
|
||||
AppendSubStreamID();
|
||||
}
|
||||
}
|
||||
@@ -279,9 +290,8 @@ int cDolbyRepacker::Put(cRingBufferLinear *ResultBuffer, const uchar *Data, int
|
||||
ac3todo = 2 * frameSizes[*data];
|
||||
// frameSizeCode was invalid => restart searching
|
||||
if (ac3todo <= 0) {
|
||||
// reset PES header instead of using/copying a wrong one
|
||||
// reset PES header instead of using a wrong one
|
||||
ResetPesHeader();
|
||||
headerCopied = true;
|
||||
if (chk1 == 0x0B) {
|
||||
if (chk2 == 0x77) {
|
||||
state = store_chk1;
|
||||
@@ -320,8 +330,8 @@ int cDolbyRepacker::Put(cRingBufferLinear *ResultBuffer, const uchar *Data, int
|
||||
// start a new packet
|
||||
if (!StartNewPacket(ResultBuffer, data, todo, done, bite))
|
||||
return done;
|
||||
// prepare for next packet
|
||||
ResetPesHeader();
|
||||
// prepare for next (continuation) packet
|
||||
ResetPesHeader(state == output_packet);
|
||||
}
|
||||
data += bite;
|
||||
done += bite;
|
||||
|
Reference in New Issue
Block a user