Mercurial > hg > forks > pwpunix
comparison pwplib/pvp.c @ 0:acb5694e93d9
Initial import.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 18 May 2010 04:25:44 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:acb5694e93d9 |
---|---|
1 /* | |
2 * PWPlib: PWP Video Phormat | |
3 * | |
4 * not very functional yet :) | |
5 * | |
6 */ | |
7 | |
8 #include "config.h" | |
9 | |
10 #ifdef DRIVE_PVP | |
11 | |
12 #include <stdlib.h> | |
13 #include <stdio.h> | |
14 #include <string.h> | |
15 | |
16 #include "pwplib.h" | |
17 | |
18 void pvp_calcframe(u8*s,int lgtnew,int flags) | |
19 { | |
20 | |
21 static int lgt=0; | |
22 static u8*prev=NULL; | |
23 | |
24 TEMPMALL(u8,buf,lgtnew*2),*d=buf; | |
25 | |
26 int accum=0; | |
27 | |
28 if(lgtnew!=lgt) | |
29 { | |
30 if(prev!=NULL)free(prev); | |
31 lgt=lgtnew; | |
32 prev=malloc(lgt*sizeof(u8)); | |
33 flags|=1; | |
34 } | |
35 | |
36 if(flags&1)memset(s,0,lgt*sizeof(u8)); /* support other consts as well? */ | |
37 | |
38 {int i=0,skip=0; | |
39 for(;i<lgt;i++) | |
40 { | |
41 if(s[i]!=prev[i]) | |
42 { | |
43 while(skip>0) | |
44 { | |
45 if(skip<128){*d++=128|((skip-1)&127);skip=0;} | |
46 else {*d++=128|127;skip-=128;} | |
47 } | |
48 | |
49 {u8*cntp=d; | |
50 int gap=0; | |
51 | |
52 while(gap<2 && i<lgt && (d-cntp<126)) | |
53 { | |
54 d++; | |
55 *d=s[i]; | |
56 | |
57 if(s[i]==prev[i])gap++; | |
58 else gap=0; | |
59 i++; | |
60 } | |
61 d[1]=s[i]; | |
62 d[2]=s[i+1]; | |
63 d+=2-gap;skip+=gap-1;i--; | |
64 *cntp=(d-cntp-1)&127; | |
65 } | |
66 } | |
67 else skip++; | |
68 }} | |
69 memcpy(prev,s,sizeof(u8)*lgt); | |
70 | |
71 /* header */ | |
72 | |
73 {u8 head[6]; | |
74 head[0]='p';head[1]='V';head[2]='P'; | |
75 if(flags&1)head[3]='R';else head[3]='r'; | |
76 head[4]=(d-buf)&255; | |
77 head[5]=(d-buf)>>8; | |
78 write(1,head,6); | |
79 } | |
80 | |
81 write(1,buf,d-buf); | |
82 | |
83 TEMPFREE(buf); | |
84 } | |
85 | |
86 | |
87 | |
88 /* | |
89 pvp (pwp video phormat) stream: | |
90 | |
91 for each frame: | |
92 'pVP' signature (used by synch routines etc) | |
93 u8 frame type | |
94 u16 frame length, in bytes | |
95 | |
96 r-frame (lossless rasterdata) | |
97 | |
98 stored: changes to the previous display frame, rle+huffman compression? | |
99 | |
100 time delta to the previous frame (in second/256's) | |
101 | |
102 index=0; | |
103 | |
104 command | |
105 - 1xxxxxxx skip 0..127 bytes | |
106 - 0xxxxxxx 0..127 bytes of data follow | |
107 | |
108 R-frame (lossless raster keyframe) | |
109 | |
110 stored as delta to a constant (zero) table | |
111 | |
112 i/I-frames == like r/R but for ibm char/attribute-pair screendump | |
113 | |
114 we need some kind of compression for the lossless frames. | |
115 | |
116 we also need a low-bandwidth lossy compression for longer movies and | |
117 tv streams. | |
118 | |
119 g-frame (gsm audio in 8kHz) for moviez | |
120 | |
121 b-frame (beep audio) | |
122 (B-frame == update everything? write a B-frame when every channel | |
123 changes or when above given threshold) | |
124 | |
125 length of output (in second/256's) | |
126 chan# (8bit), freq(16bit), vol(8bit), pulsestat(8bit) | |
127 | |
128 c-frame (commentary) | |
129 | |
130 first byte==importance level (signed byte, 0==for names, copyrights etc) | |
131 rest==ascii string | |
132 | |
133 may also contain things like stupid irclog, subtitles, textual | |
134 descriptions of the video etc | |
135 | |
136 */ | |
137 | |
138 void pvp_sound(int ch,int note,int vol,int ratio) | |
139 { | |
140 | |
141 } | |
142 | |
143 void pvp_loopflush() | |
144 { | |
145 /* | |
146 timer_counter(); | |
147 pwplib.player(); | |
148 | |
149 save b-frames | |
150 */ | |
151 } | |
152 | |
153 void pvp_dump_rast() | |
154 { | |
155 if(pwplib.setup[SETUP_LOSSY]) | |
156 conv_losestuff(pwplib.videobuf.d, | |
157 pwplib.videobuf.height*pwplib.videobuf.width,1); | |
158 | |
159 pvp_calcframe(pwplib.videobuf.d, | |
160 pwplib.videobuf.width*pwplib.videobuf.height,0); | |
161 } | |
162 | |
163 void pvp_dump_ibm() | |
164 { | |
165 pvp_calcframe(pwplib.videobuf.d, | |
166 pwplib.videobuf.width*pwplib.videobuf.height*2,0); | |
167 } | |
168 | |
169 void pvp_init() | |
170 { | |
171 pwplib.videobuf.height=50; | |
172 pwplib.videobuf.width=80; | |
173 | |
174 pwplib.dump_attr=&pvp_dump_ibm; | |
175 pwplib.dump_rast=&pvp_dump_rast; | |
176 pwplib.sound=pvp_sound; | |
177 pwplib.loopflush=&pvp_loopflush; | |
178 } | |
179 | |
180 #endif |