Mailing List archive

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

[vdr] Re: Playing DVD ?



On Sat, Aug 30, 2003 at 03:31:15AM +0200, Oliver Endriss wrote:
> On Wednesday 27 August 2003 13:13, Oliver Endriss wrote:
> > I'll take this issue to the dvb mailing list. But first we should have
> > a solution which makes vdr happy. ;-)
> 
> Update:  
> My driver patch will probably not be accepted, since the API does not
> allow PES data in VIDEO_STILLPICTURE ioctl calls.

This is really bad because you're patch works perfect
... the cur marks can be moved and the pictures will
be refreshed.  Btw: What's the reason of not allowing
PES data in the VIDEO_STILLPICTURE ioctl calls.

And is there a way to extend this VIDEO_STILLPICTURE ioctl
in such a way that it is backward compatible with ES
data?


       Werner
> 
> So I created a patch which fixes the problem in vdr:
> ---------------------------------------------------------------------
> --- dvbdevice.c.org	Sat Aug 30 02:56:25 2003
> +++ dvbdevice.c	Sat Aug 30 02:53:05 2003
> @@ -897,10 +897,60 @@ void cDvbDevice::StillPicture(const ucha
>     could be used, please let me know!
>     kls 2002-03-23
>  */
> -//#define VIDEO_STILLPICTURE_WORKS_WITH_VDR_FRAMES
> +#define VIDEO_STILLPICTURE_WORKS_WITH_VDR_FRAMES
>  #ifdef VIDEO_STILLPICTURE_WORKS_WITH_VDR_FRAMES
> -  video_still_picture sp = { (char *)Data, Length };
> -  CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
> +
> +  if (Data[0] == 0x00 && Data[1] == 0x00 &&
> +      Data[2] == 0x01 && (Data[3] & 0xe0) == 0xe0)
> +  {
> +      // PES data
> +      char *buf;
> +      int i = 0;
> +      int blen = 0;
> +
> +      buf = (char *) malloc(Length);
> +      if (!buf)
> +          return;
> +	       
> +      while (i < Length-4)
> +      {
> +          if (Data[i] == 0x00 && Data[i+1] == 0x00 && 
> +              Data[i+2] == 0x01 && (Data[i+3] & 0xe0) == 0xe0)
> +          {
> +              // skip PES header
> +              int offs = i+6;
> +              int len = Data[i+4]*256 + Data[i+5];
> +
> +              // skip header extension
> +              if ((Data[i+6] & 0xc0) == 0x80)
> +              {
> +                  offs += 3;
> +                  offs += Data[i+8];
> +                  len -= 3;
> +                  len -= Data[i+8];
> +              }
> +
> +              memcpy (&buf[blen], &Data[offs], len);
> +
> +              i = offs+len;
> +              blen += len;
> +          }
> +          else
> +              i++;
> +      }
> +
> +      video_still_picture sp = { buf, blen };
> +      CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
> +
> +      free(buf);
> +  }
> +  else
> +  {
> +      // non-PES data
> +      video_still_picture sp = { (char *)Data, Length };
> +      CHECK(ioctl(fd_video, VIDEO_STILLPICTURE, &sp));
> +  }
> +
>  #else
>  #define MIN_IFRAME 400000
>    for (int i = MIN_IFRAME / Length + 1; i > 0; i--) {
> ---------------------------------------------------------------------
> 
> The patch removes all PES headers and passes ES to the driver.
> It should work with CVS drivers 2003-08-23 or later.
> 
> For driver release 1.0.0 the following patch is required:
> ---------------------------------------------------------------------
> --- /tmp/linuxtv-dvb-1.0.0/driver/av7110/av7110.c	Tue Jul 22 17:13:18 2003
> +++ av7110.c	Sat Aug 30 03:20:26 2003
> @@ -4241,9 +4241,10 @@ play_iframe(av7110_t *av7110, u8 *buf, u
>                  if (AV_StartPlay(av7110, RP_VIDEO) < 0) {
>  			return -EBUSY;
>  		}
> -                n=MIN_IFRAME/len+1;
>          }
>  
> +        n=MIN_IFRAME/len+1;
> +
>  	/* FIXME: nonblock? */
>  	dvb_play(av7110, iframe_header, sizeof(iframe_header), 0, 1, 0);
>  
> ---------------------------------------------------------------------
>  
> Have fun,
> 
> Oliver


-- 
Info:
To unsubscribe send a mail to ecartis@linuxtv.org with "unsubscribe vdr" as subject.



Home | Main Index | Thread Index