view 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 source

/*
 *  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