Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[vdr] Re: AW: Problem with DVD-AC3-Playback and VDR0.98




Hallo Dr. Werner Fink


----- Original Message -----
From: "Dr. Werner Fink" <werner@suse.de>
Sent: Tuesday, November 20, 2001 4:39 PM

>
> On Tue, Nov 20, 2001 at 02:40:19PM +0100, Stephan Schreiber wrote:
> >
> > > With VDR0.98 and DVD-Playback come Error-Message:
> > > ** CRC failed - skipping frame ** ... unbroken up to break of
> > > DVD-Playback!
> > > The VDR0.98 and VDR-Recording-Files with AC3 is ok
> > > and AC3-Playback works..
> >
> > Andreas wrote, it is ac3dec's fault because it expects the ac3 frames to
be
> > complete, but in the case of DVD it seems syncing makes them arrive only
> > partially and thus they have to be reassembled by the ac3 -> spdif tool.
> >
> > ac3dec and ac3play show the same behaviour there, and I couldn't get
> > ac3iec958 to work either.
>
> To get ac3iec958 to work you may try the appended patch ...
wo bekomme ich dieses Paket (*tar.gz) zum  download?
Das Paket was ich jetzt benutze, macht probleme beim patchen und beim
kompilieren!
(dort habe ich es her: http://www.theiling.de/downloads/ )



MFG ... Uwe


>
>         Werner
>
> --------------------------------------------------------------------------
---
> --- ac3spdif.cpp
> +++ ac3spdif.cpp Mon Nov 19 17:26:52 2001
> @@ -10,6 +10,8 @@
>  // COPYING that is shipped together with this file.
>  //
>
> +#define _GNU_SOURCE
> +
>  #ifdef HAVE_CONFIG_H
>  #  include "config.h"
>  #endif
> @@ -36,6 +38,10 @@
>  #include <stdlib.h>
>  #include <string.h>
>
> +#ifdef HAVE_UNISTD_H
> +#  include <unistd.h>
> +#endif
> +
>  #define CACHE_SIZE 16384
>  #define BUFF_SIZE  2048
>
> @@ -45,6 +51,35 @@
>  typedef unsigned short u16;
>  typedef unsigned int   u32;
>
> +static inline ssize_t safein  (int fd, u8 *ptr, size_t s)
> +{
> +    ssize_t r = 0;
> +    do {
> + r = read (fd, ptr, s);
> +    } while (r < 0 && (errno == EINTR || errno == EAGAIN));
> +
> +    return r;
> +}
> +
> +static inline ssize_t safeout (int fd, const u8 *ptr, size_t s)
> +{
> +    ssize_t p = 0;
> +    while (s > 0) {
> + p = write (fd, ptr, s);
> + if (p < 0) {
> +     if (errno == EPIPE)
> + exit (0);
> +     if (errno == EINTR || errno == EAGAIN)
> + continue;
> +     goto out;
> + }
> + ptr += p;
> + s -= p;
> +    }
> +out:
> +    return p;
> +}
> +
>  static inline bool strequ (char const *a, char const *b)
>  {
>      return strcmp (a, b) == 0;
> @@ -59,7 +94,7 @@
>      u8    buff[CACHE_SIZE];
>      int   fd;
>      bool  eos;
> -    int   count;
> +    ssize_t   count;
>      int   ptr;
>
>  public:
> @@ -77,7 +112,7 @@
>              return;
>          if (ptr >= count)
>          {
> -            count= read (fd, buff, CACHE_SIZE);
> +            count= safein (fd, buff, CACHE_SIZE);
>              if (count <= 0)
>                  eos= true;
>
> @@ -135,7 +170,7 @@
>              swab (buff, buff, ptr);
>  #endif
>
> -        int count= write (fd, buff, ptr);
> +        ssize_t count= safeout (fd, buff, ptr);
>          if (count < 0)
>              err= true;
>
> @@ -355,6 +390,7 @@
>
>      void put (AC3SyncInfo const &si, u8 const *data)
>      {
> + // output data length
>          int byte_length=  si.frame_size * 2;
>          int total_length= 4 + byte_length;
>          int pad_count=    1536 * 4 - total_length;
> @@ -397,7 +433,7 @@
>
>          /* AC3 Sync Frame */
>          out.put16 (0x0b77); /* sync word of the AC3 sync frame */
> -        for (int i= 2; i < si.frame_size * 2; i++)
> +        for (int i= 2; i < byte_length; i++)
>              out.put (*data++);
>
>          /* Zero padding */
>
>




Home | Main Index | Thread Index