typo fix
[mplayer/greg.git] / TOOLS / vivodump.c
blobbd6d3db3a1a75d6f0a26267cfe6b8914f2d7a554
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <inttypes.h>
6 #include "loader/wine/mmreg.h"
7 #include "loader/wine/avifmt.h"
8 #include "loader/wine/vfw.h"
10 #include "stream/stream.h"
11 #include "libmpdemux/muxer.h"
12 #include "libmpdemux/demuxer.h"
14 char *info_name;
15 char *info_artist;
16 char *info_genre;
17 char *info_subject;
18 char *info_copyright;
19 char *info_sourceform;
20 char *info_comment;
22 static const short h263_format[8][2] = {
23 { 0, 0 },
24 { 128, 96 },
25 { 176, 144 },
26 { 352, 288 },
27 { 704, 576 },
28 { 1408, 1152 },
29 { 320, 240 }
32 unsigned char* buffer;
33 int bufptr=0;
34 int bitcnt=0;
35 unsigned char buf=0;
37 unsigned int x_get_bits(int n){
38 unsigned int x=0;
39 while(n-->0){
40 if(!bitcnt){
41 // fill buff
42 buf=buffer[bufptr++];
43 bitcnt=8;
45 //x=(x<<1)|(buf&1);buf>>=1;
46 x=(x<<1)|(buf>>7);buf<<=1;
47 --bitcnt;
49 return x;
52 #define get_bits(xxx,n) x_get_bits(n)
53 #define get_bits1(xxx) x_get_bits(1)
54 #define skip_bits(xxx,n) x_get_bits(n)
55 #define skip_bits1(xxx) x_get_bits(1)
57 int format;
58 int width=320;
59 int height=240;
61 /* most is hardcoded. should extend to handle all h263 streams */
62 int h263_decode_picture_header(unsigned char *b_ptr)
64 int i;
66 for(i=0;i<16;i++) printf(" %02X",b_ptr[i]); printf("\n");
68 buffer=b_ptr;
69 bufptr=bitcnt=buf=0;
71 /* picture header */
72 if (get_bits(&s->gb, 22) != 0x20){
73 printf("bad picture header\n");
74 return -1;
76 skip_bits(&s->gb, 8); /* picture timestamp */
78 if (get_bits1(&s->gb) != 1){
79 printf("bad marker\n");
80 return -1; /* marker */
82 if (get_bits1(&s->gb) != 0){
83 printf("bad h263 id\n");
84 return -1; /* h263 id */
86 skip_bits1(&s->gb); /* split screen off */
87 skip_bits1(&s->gb); /* camera off */
88 skip_bits1(&s->gb); /* freeze picture release off */
90 format = get_bits(&s->gb, 3);
92 if (format != 7) {
93 printf("h263_plus = 0 format = %d\n",format);
94 /* H.263v1 */
95 width = h263_format[format][0];
96 height = h263_format[format][1];
97 printf("%d x %d\n",width,height);
98 // if (!width) return -1;
100 printf("pict_type=%d\n",get_bits1(&s->gb));
101 printf("unrestricted_mv=%d\n",get_bits1(&s->gb));
102 #if 1
103 printf("SAC: %d\n",get_bits1(&s->gb));
104 printf("advanced prediction mode: %d\n",get_bits1(&s->gb));
105 printf("PB frame: %d\n",get_bits1(&s->gb));
106 #else
107 if (get_bits1(&s->gb) != 0)
108 return -1; /* SAC: off */
109 if (get_bits1(&s->gb) != 0)
110 return -1; /* advanced prediction mode: off */
111 if (get_bits1(&s->gb) != 0)
112 return -1; /* not PB frame */
113 #endif
114 printf("qscale=%d\n",get_bits(&s->gb, 5));
115 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
116 } else {
117 printf("h263_plus = 1\n");
118 /* H.263v2 */
119 if (get_bits(&s->gb, 3) != 1){
120 printf("H.263v2 A error\n");
121 return -1;
123 if (get_bits(&s->gb, 3) != 6){ /* custom source format */
124 printf("custom source format\n");
125 return -1;
127 skip_bits(&s->gb, 12);
128 skip_bits(&s->gb, 3);
129 printf("pict_type=%d\n",get_bits(&s->gb, 3) + 1);
130 // if (s->pict_type != I_TYPE &&
131 // s->pict_type != P_TYPE)
132 // return -1;
133 skip_bits(&s->gb, 7);
134 skip_bits(&s->gb, 4); /* aspect ratio */
135 width = (get_bits(&s->gb, 9) + 1) * 4;
136 skip_bits1(&s->gb);
137 height = get_bits(&s->gb, 9) * 4;
138 printf("%d x %d\n",width,height);
139 //if (height == 0)
140 // return -1;
141 printf("qscale=%d\n",get_bits(&s->gb, 5));
144 /* PEI */
145 while (get_bits1(&s->gb) != 0) {
146 skip_bits(&s->gb, 8);
148 // s->f_code = 1;
149 // s->width = width;
150 // s->height = height;
151 return 0;
154 int postable[32768];
156 int main(int argc,char ** argv){
157 int c;
158 FILE *f;
159 FILE *f2;
160 muxer_t* avi;
161 muxer_stream_t* mux;
162 //unsigned char* buffer=malloc(0x200000);
163 int i,len;
164 int v_id=0;
165 int flag2=0;
166 int prefix=0;
168 // check if enough args were given
169 if ( argc < 3 ){
170 printf("Too few arguments given!\n"
171 "Usage: %s <input_file> <output_file>\n", argv[0]);
173 return -1;
175 // input
176 if(!(f=fopen(argv[1],"rb"))){
177 printf("Couldn't open input file.\n");
178 return -1;
180 // output
181 if(!(f2=fopen(argv[2],"wb"))){
182 printf("Couldn't open output file.\n");
183 return -1;
186 avi=muxer_new_muxer(MUXER_TYPE_AVI,f2);
187 mux=muxer_new_stream(avi,MUXER_TYPE_VIDEO);
189 mux->buffer_size=0x200000;
190 mux->buffer=malloc(mux->buffer_size);
192 mux->h.dwScale=1;
193 mux->h.dwRate=10;
195 mux->bih=malloc(sizeof(BITMAPINFOHEADER));
196 mux->bih->biSize=sizeof(BITMAPINFOHEADER);
197 mux->bih->biPlanes=1;
198 mux->bih->biBitCount=24;
199 mux->bih->biCompression=0x6f766976;// 7669766f;
200 muxer_write_header(avi);
203 c=fgetc(f); if(c) printf("error! not vivo file?\n");
204 len=0;
205 while((c=fgetc(f))>=0x80) len+=0x80*(c&0x0F);
206 len+=c;
207 printf("hdr1: %d\n",len);
208 for(i=0;i<len;i++) fgetc(f);
211 while((c=fgetc(f))>=0){
213 printf("%08lX %02X\n",ftell(f),c);
215 prefix=0;
216 if(c==0x82){
217 prefix=1;
218 //continue;
219 c=fgetc(f);
220 printf("%08lX %02X\n",ftell(f),c);
223 if(c==0x00){
224 // header
225 int len=0;
226 while((c=fgetc(f))>=0x80) len+=0x80*(c&0x0F);
227 len+=c;
228 printf("header: 00 (%d)\n",len);
229 for(i=0;i<len;i++) fgetc(f);
230 continue;
233 if((c&0xF0)==0x40){
234 // audio
235 len=24;
236 if(prefix) len=fgetc(f);
237 printf("audio: %02X (%d)\n",c,len);
238 for(i=0;i<len;i++) fgetc(f);
239 continue;
241 if((c&0xF0)==0x30){
242 // audio
243 len=40;
244 if(prefix) len=fgetc(f);
245 printf("audio: %02X (%d)\n",c,len);
246 for(i=0;i<len;i++) fgetc(f);
247 continue;
249 if(flag2 || (((c&0xF0)==0x10 || (c&0xF0)==0x20) && (c&0x0F)!=(v_id&0xF))){
250 // end of frame:
251 printf("Frame size: %d\n",mux->buffer_len);
252 h263_decode_picture_header(mux->buffer);
253 muxer_write_chunk(mux,mux->buffer_len,0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
254 mux->buffer_len=0;
256 if((v_id&0xF0)==0x10) fprintf(stderr,"hmm. last video packet %02X\n",v_id);
258 flag2=0;
259 if((c&0xF0)==0x10){
260 // 128 byte
261 len=128;
262 if(prefix) len=fgetc(f);
263 printf("video: %02X (%d)\n",c,len);
264 fread(mux->buffer+mux->buffer_len,len,1,f);
265 mux->buffer_len+=len;
266 v_id=c;
267 continue;
269 if((c&0xF0)==0x20){
270 int len=fgetc(f);
271 printf("video: %02X (%d)\n",c,len);
272 fread(mux->buffer+mux->buffer_len,len,1,f);
273 mux->buffer_len+=len;
274 flag2=1;
275 v_id=c;
276 continue;
278 printf("error: %02X!\n",c);
279 exit(1);
282 if(!width) width=320;
283 if(!height) height=240;
285 mux->bih->biWidth=width;
286 mux->bih->biHeight=height;
287 mux->bih->biSizeImage=3*width*height;
289 muxer_write_index(avi);
290 fseek(f2,0,SEEK_SET);
291 muxer_write_header(avi);
293 return 0;