diff pwplib/pvp.c @ 0:acb5694e93d9

Initial import.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 18 May 2010 04:25:44 +0300
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pwplib/pvp.c	Tue May 18 04:25:44 2010 +0300
@@ -0,0 +1,180 @@
+/*
+ *  PWPlib: PWP Video Phormat
+ *
+ *  not very functional yet :)
+ *
+ */
+
+#include "config.h"
+
+#ifdef DRIVE_PVP
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "pwplib.h"
+
+void pvp_calcframe(u8*s,int lgtnew,int flags)
+{
+
+   static int lgt=0;
+   static u8*prev=NULL;
+
+   TEMPMALL(u8,buf,lgtnew*2),*d=buf;
+
+   int accum=0;
+
+   if(lgtnew!=lgt)
+   {
+      if(prev!=NULL)free(prev);
+      lgt=lgtnew;
+      prev=malloc(lgt*sizeof(u8));
+      flags|=1;
+   }
+
+   if(flags&1)memset(s,0,lgt*sizeof(u8)); /* support other consts as well? */
+
+   {int i=0,skip=0;
+   for(;i<lgt;i++)
+   {
+      if(s[i]!=prev[i])
+      {
+         while(skip>0)
+         {
+            if(skip<128){*d++=128|((skip-1)&127);skip=0;}
+                   else {*d++=128|127;skip-=128;}
+         }
+
+         {u8*cntp=d;
+          int gap=0;
+
+          while(gap<2 && i<lgt && (d-cntp<126))
+          {
+             d++;
+             *d=s[i];
+
+             if(s[i]==prev[i])gap++;
+                         else gap=0;
+             i++;
+          }
+          d[1]=s[i];
+          d[2]=s[i+1];
+          d+=2-gap;skip+=gap-1;i--;
+          *cntp=(d-cntp-1)&127;
+         }
+      }
+       else skip++;
+   }}
+   memcpy(prev,s,sizeof(u8)*lgt);
+
+   /* header */
+   
+   {u8 head[6];
+    head[0]='p';head[1]='V';head[2]='P';
+    if(flags&1)head[3]='R';else head[3]='r';
+    head[4]=(d-buf)&255;
+    head[5]=(d-buf)>>8;
+    write(1,head,6);
+   }
+
+   write(1,buf,d-buf);
+
+   TEMPFREE(buf);
+}
+
+
+
+/*
+   pvp (pwp video phormat) stream:
+
+   for each frame:
+     'pVP'   signature (used by synch routines etc)
+     u8      frame type
+     u16     frame length, in bytes
+
+   r-frame (lossless rasterdata)
+
+     stored: changes to the previous display frame, rle+huffman compression?
+
+     time delta to the previous frame (in second/256's)
+
+     index=0;
+
+       command
+         - 1xxxxxxx  skip 0..127 bytes
+         - 0xxxxxxx  0..127 bytes of data follow
+
+   R-frame (lossless raster keyframe)
+
+     stored as delta to a constant (zero) table
+
+   i/I-frames == like r/R but for ibm char/attribute-pair screendump
+
+   we need some kind of compression for the lossless frames.
+
+   we also need a low-bandwidth lossy compression for longer movies and
+   tv streams.
+
+   g-frame (gsm audio in 8kHz)  for moviez
+
+   b-frame (beep audio)  
+     (B-frame == update everything?  write a B-frame when every channel
+      changes or when above given threshold)
+
+     length of output (in second/256's)
+     chan# (8bit), freq(16bit), vol(8bit), pulsestat(8bit)
+
+   c-frame (commentary)
+
+     first byte==importance level (signed byte, 0==for names, copyrights etc)
+     rest==ascii string
+
+     may also contain things like stupid irclog, subtitles, textual
+     descriptions of the video etc
+
+*/
+
+void pvp_sound(int ch,int note,int vol,int ratio)
+{
+   
+}
+
+void pvp_loopflush()
+{
+/*
+   timer_counter();
+   pwplib.player();
+
+   save b-frames
+*/
+}
+
+void pvp_dump_rast()
+{
+  if(pwplib.setup[SETUP_LOSSY])
+  conv_losestuff(pwplib.videobuf.d,
+    pwplib.videobuf.height*pwplib.videobuf.width,1);
+
+   pvp_calcframe(pwplib.videobuf.d,
+     pwplib.videobuf.width*pwplib.videobuf.height,0);
+}
+
+void pvp_dump_ibm()
+{
+   pvp_calcframe(pwplib.videobuf.d,
+     pwplib.videobuf.width*pwplib.videobuf.height*2,0);
+}
+
+void pvp_init()
+{
+   pwplib.videobuf.height=50;
+   pwplib.videobuf.width=80;
+   
+   pwplib.dump_attr=&pvp_dump_ibm;
+   pwplib.dump_rast=&pvp_dump_rast;
+   pwplib.sound=pvp_sound;
+   pwplib.loopflush=&pvp_loopflush;
+}
+
+#endif