[vdr] Collecting patches for vdr-xine-0.9.4

2011-01-17 Thread Reinhard Nissl
Hi,

it looks like I can find more time this week to work on vdr-xine.

I've seen some patches for vdr-xine-0.9.3 (and xine-lib) in the
mailing list which address so far unsupported audio formats if I
recall correctly, as vdr-xine still uses PES and my c*Repackers.

I'd like to invite you to send them again to me (privately). A
sample recording would be appreciated too.

Bye.
-- 
Dipl.-Inform. (FH) Reinhard Nissl
mailto:rni...@gmx.de

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] Collecting patches for vdr-xine-0.9.4

2011-01-17 Thread Jose Alberto Reguero
On Lunes, 17 de Enero de 2011 21:37:06 Reinhard Nissl escribió:
 Hi,
 
 it looks like I can find more time this week to work on vdr-xine.
 
 I've seen some patches for vdr-xine-0.9.3 (and xine-lib) in the
 mailing list which address so far unsupported audio formats if I
 recall correctly, as vdr-xine still uses PES and my c*Repackers.
 
 I'd like to invite you to send them again to me (privately). A
 sample recording would be appreciated too.
 
 Bye.

Attached are two patches to play dolby digital plus audio with vdr-xine. One 
for vdr-xine and another for xine-lib. There is an aditional patch to play 
dolby digital plus audio with xine-lib and a ts file.

Jose Alberto
diff -ur xine-0.9.3/vdr172remux.c xine-0.9.3.new/vdr172remux.c
--- xine-0.9.3/vdr172remux.c	2009-04-12 13:52:32.0 +0200
+++ xine-0.9.3.new/vdr172remux.c	2010-09-29 01:58:34.79803 +0200
@@ -1703,8 +1703,20 @@
 
   const uchar *Payload = Data + PesPayloadOffset;
   const int PayloadCount = Count - PesPayloadOffset;
+  bool ac3;
+  int framesize;
+  unsigned short size;
 
-  if (Data[3] == 0xBD  PayloadCount = 9  ((Payload[0]  0xF0) == 0x80)  Payload[4] == 0x0B  Payload[5] == 0x77  frameSizes[Payload[8]]  0) {
+  if (PayloadCount  10)
+ return -1;
+  ac3 = ((Payload[9]  3)  0x1f) = 10; 
+  if ( ac3)
+ framesize = frameSizes[Payload[8]];
+  else {
+ size = Payload[7] + Payload[6] * 256;
+ framesize = ((size  0x07FF) + 1)  1;
+  }
+  if (Data[3] == 0xBD  ((Payload[0]  0xF0) == 0x80)  Payload[4] == 0x0B  Payload[5] == 0x77  framesize  0) {
  if (TrackIndex)
 *TrackIndex = Payload[0] - 0x80;
 
@@ -1860,6 +1872,7 @@
   int done = 6 + 3 + Data[8];
   int todo = Count - done;
   const uchar *data = Data + done;
+  unsigned short size;
 
   // look for 0x0B 0x77 chk1 chk2 frameSize
   while (todo  0) {
@@ -1906,7 +1919,12 @@
state++;
continue;
   case get_length:
-   ac3todo = 2 * frameSizes[*data];
+   if (((*(data + 1)  3)  0x1f) = 10)
+  ac3todo = 2 * frameSizes[*data];
+   else {
+  size = chk2 + chk1 * 256;
+  ac3todo = ((size  0x07FF) + 1)  1;
+   }  
// frameSizeCode was invalid = restart searching
if (ac3todo = 0) {
   // reset PES header instead of using a wrong one
@@ -1971,6 +1989,10 @@
 
 int cDolbyRepacker::BreakAt(const uchar *Data, int Count)
 {
+  bool ac3;
+  int framesize;
+  unsigned short size;
+
   if (initiallySyncing)
  return -1; // fill the packet buffer completely until we have synced once
   // enough data for test?
@@ -1984,12 +2006,20 @@
   if (ac3todo  0)
  return headerLen + ac3todo;
   // enough data for test?
-  if (Count  headerLen + 5)
+  if (Count  headerLen + 6)
  return -1;
   const uchar *data = Data + headerLen;
   // break after ac3 frame?
-  if (data[0] == 0x0B  data[1] == 0x77  frameSizes[data[4]]  0)
- return headerLen + 2 * frameSizes[data[4]];
+  ac3 = ((data[5]  3)  0x1f) = 10; 
+  if ( ac3)
+ framesize = 2 * frameSizes[data[4]];
+  else {
+ size = data[3] + data[2] * 256;
+ framesize = ((size  0x07FF) + 1)  1;
+  }
+ if (data[0] == 0x0B  data[1] == 0x77  framesize  0)
+ return headerLen + framesize;
+
   return -1;
 }
 
diff -r 9679028a161b src/demuxers/demux_mpeg_pes.c
--- a/src/demuxers/demux_mpeg_pes.c	Wed Jul 21 15:52:00 2010 +
+++ b/src/demuxers/demux_mpeg_pes.c	Tue Sep 21 00:54:22 2010 +0200
@@ -103,6 +103,7 @@
 
   uint8_t   preview_data[ MAX_PREVIEW_SIZE ];
   off_t preview_size, preview_done;
+  uint8_t   preview_eac3;
 } demux_mpeg_pes_t ;
 
 typedef struct {
@@ -931,10 +932,21 @@
 
   buf-content   = p+4;
   buf-size  = this-packet_len-4;
-  if (track  0x8) {
-buf-type  = BUF_AUDIO_DTS + (track  0x07); /* DVDs only have 8 tracks */
+  if (((p[9]  3)  0x1f) = 10) {
+if (track  0x8) {
+  buf-type  = BUF_AUDIO_DTS + (track  0x07); /* DVDs only have 8 tracks */
+} else {
+  buf-type  = BUF_AUDIO_A52 + track;
+}
   } else {
-buf-type  = BUF_AUDIO_A52 + track;
+buf-type  = BUF_AUDIO_EAC3;
+if (this-preview_eac3  2)
+  this-preview_eac3++;
+if (this-preview_eac3 == 1)
+  buf-decoder_flags = BUF_FLAG_HEADER | BUF_FLAG_FRAME_END;
+else {
+  buf-decoder_flags |= BUF_FLAG_FRAME_END;
+}
   }
   buf-pts   = this-pts;
   if( !this-preview_mode )
@@ -1548,6 +1560,7 @@
*/
   this-last_cell_time = 0;
   this-send_newpts = 1;
+  this-preview_eac3 = 0;
   if( !playing ) {
 
 this-buf_flag_seek = 0;
diff -r 03d01d484189 src/demuxers/demux_ts.c
--- a/src/demuxers/demux_ts.c	Thu Sep 23 18:19:29 2010 +0100
+++ b/src/demuxers/demux_ts.c	Sun Oct 03 23:47:39 2010 +0200
@@ -847,7 +847,6 @@
   m-type  = BUF_SPU_DVD + spu_id;