1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License along
13  * with this program; if not, write to the Free Software Foundation, Inc.,
14  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
15  */
16 
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <inttypes.h>
21 
22 #include "loader/wine/mmreg.h"
23 #include "loader/wine/vfw.h"
24 
25 #include "stream/stream.h"
26 #include "libmpdemux/muxer.h"
27 #include "libmpdemux/demuxer.h"
28 
29 /* linking hacks */
30 char *info_name;
31 char *info_artist;
32 char *info_genre;
33 char *info_subject;
34 char *info_copyright;
35 char *info_sourceform;
36 char *info_comment;
37 
38 char* out_filename = NULL;
39 char* force_fourcc=NULL;
40 char* passtmpfile="divx2pass.log";
41 
42 static const short h263_format[8][2] = {
43     { 0, 0 },
44     { 128, 96 },
45     { 176, 144 },
46     { 352, 288 },
47     { 704, 576 },
48     { 1408, 1152 },
49     { 320, 240 }
50 };
51 
52 unsigned char* buffer;
53 int bufptr=0;
54 int bitcnt=0;
55 unsigned char buf=0;
56 
x_get_bits(int n)57 static unsigned int x_get_bits(int n){
58     unsigned int x=0;
59     while(n-->0){
60 	if(!bitcnt){
61 	    // fill buff
62 	    buf=buffer[bufptr++];
63 	    bitcnt=8;
64 	}
65 	//x=(x<<1)|(buf&1);buf>>=1;
66 	x=(x<<1)|(buf>>7);buf<<=1;
67 	--bitcnt;
68     }
69     return x;
70 }
71 
72 #define get_bits(xxx,n) x_get_bits(n)
73 #define get_bits1(xxx) x_get_bits(1)
74 #define skip_bits(xxx,n) x_get_bits(n)
75 #define skip_bits1(xxx) x_get_bits(1)
76 
77 int format;
78 int width=320;
79 int height=240;
80 
81 /* most is hardcoded. should extend to handle all h263 streams */
h263_decode_picture_header(unsigned char * b_ptr)82 static int h263_decode_picture_header(unsigned char *b_ptr)
83 {
84     int i;
85 
86     for(i=0;i<16;i++) printf(" %02X",b_ptr[i]); printf("\n");
87 
88     buffer=b_ptr;
89     bufptr=bitcnt=buf=0;
90 
91     /* picture header */
92     if (get_bits(&s->gb, 22) != 0x20){
93 	printf("bad picture header\n");
94         return -1;
95     }
96     skip_bits(&s->gb, 8); /* picture timestamp */
97 
98     if (get_bits1(&s->gb) != 1){
99 	printf("bad marker\n");
100         return -1;	/* marker */
101     }
102     if (get_bits1(&s->gb) != 0){
103 	printf("bad h263 id\n");
104         return -1;	/* h263 id */
105     }
106     skip_bits1(&s->gb);	/* split screen off */
107     skip_bits1(&s->gb);	/* camera  off */
108     skip_bits1(&s->gb);	/* freeze picture release off */
109 
110     format = get_bits(&s->gb, 3);
111 
112     if (format != 7) {
113         printf("h263_plus = 0  format = %d\n",format);
114         /* H.263v1 */
115         width = h263_format[format][0];
116         height = h263_format[format][1];
117 	printf("%d x %d\n",width,height);
118 //        if (!width) return -1;
119 
120 	printf("pict_type=%d\n",get_bits1(&s->gb));
121 	printf("unrestricted_mv=%d\n",get_bits1(&s->gb));
122 #if 1
123 	printf("SAC: %d\n",get_bits1(&s->gb));
124 	printf("advanced prediction mode: %d\n",get_bits1(&s->gb));
125 	printf("PB frame: %d\n",get_bits1(&s->gb));
126 #else
127         if (get_bits1(&s->gb) != 0)
128             return -1;	/* SAC: off */
129         if (get_bits1(&s->gb) != 0)
130             return -1;	/* advanced prediction mode: off */
131         if (get_bits1(&s->gb) != 0)
132             return -1;	/* not PB frame */
133 #endif
134 	printf("qscale=%d\n",get_bits(&s->gb, 5));
135         skip_bits1(&s->gb);	/* Continuous Presence Multipoint mode: off */
136     } else {
137         printf("h263_plus = 1\n");
138         /* H.263v2 */
139         if (get_bits(&s->gb, 3) != 1){
140 	    printf("H.263v2 A error\n");
141             return -1;
142 	}
143         if (get_bits(&s->gb, 3) != 6){ /* custom source format */
144 	    printf("custom source format\n");
145             return -1;
146 	}
147         skip_bits(&s->gb, 12);
148         skip_bits(&s->gb, 3);
149 	printf("pict_type=%d\n",get_bits(&s->gb, 3) + 1);
150 //        if (s->pict_type != I_TYPE &&
151 //            s->pict_type != P_TYPE)
152 //            return -1;
153         skip_bits(&s->gb, 7);
154         skip_bits(&s->gb, 4); /* aspect ratio */
155         width = (get_bits(&s->gb, 9) + 1) * 4;
156         skip_bits1(&s->gb);
157         height = get_bits(&s->gb, 9) * 4;
158 	printf("%d x %d\n",width,height);
159         //if (height == 0)
160         //    return -1;
161 	printf("qscale=%d\n",get_bits(&s->gb, 5));
162     }
163 
164     /* PEI */
165     while (get_bits1(&s->gb) != 0) {
166         skip_bits(&s->gb, 8);
167     }
168 //    s->f_code = 1;
169 //    s->width = width;
170 //    s->height = height;
171     return 0;
172 }
173 
174 int postable[32768];
175 
main(int argc,char ** argv)176 int main(int argc,char ** argv){
177 int c;
178 FILE *f;
179 FILE *f2;
180 muxer_t* avi;
181 muxer_stream_t* mux;
182 //unsigned char* buffer=malloc(0x200000);
183 int i,len;
184 int v_id=0;
185 int flag2=0;
186 int prefix=0;
187 
188 // check if enough args were given
189 if ( argc < 3 ){
190     printf("Too few arguments given!\n"
191            "Usage: %s <input_file> <output_file>\n", argv[0]);
192 
193     return -1;
194 }
195 // input
196 if(!(f=fopen(argv[1],"rb"))){
197        printf("Couldn't open input file.\n");
198        return -1;
199 }
200 // output
201 if(!(f2=fopen(argv[2],"wb"))){
202        printf("Couldn't open output file.\n");
203        return -1;
204 }
205 
206 avi=muxer_new_muxer(MUXER_TYPE_AVI,f2);
207 mux=muxer_new_stream(avi,MUXER_TYPE_VIDEO);
208 
209 mux->buffer_size=0x200000;
210 mux->buffer=malloc(mux->buffer_size);
211 
212 mux->h.dwScale=1;
213 mux->h.dwRate=10;
214 
215 mux->bih=malloc(sizeof(*mux->bih));
216 mux->bih->biSize=sizeof(*mux->bih);
217 mux->bih->biPlanes=1;
218 mux->bih->biBitCount=24;
219 mux->bih->biCompression=0x6f766976;//      7669766f;
220 muxer_write_header(avi);
221 
222 /*
223 c=fgetc(f); if(c) printf("error! not vivo file?\n");
224 len=0;
225 while((c=fgetc(f))>=0x80) len+=0x80*(c&0x0F);
226 len+=c;
227 printf("hdr1: %d\n",len);
228 for(i=0;i<len;i++) fgetc(f);
229 */
230 
231 while((c=fgetc(f))>=0){
232 
233     printf("%08lX  %02X\n",ftell(f),c);
234 
235     prefix=0;
236     if(c==0x82){
237 	prefix=1;
238 	//continue;
239 	c=fgetc(f);
240 	printf("%08lX  %02X\n",ftell(f),c);
241     }
242 
243     if(c==0x00){
244 	// header
245 	int len=0;
246 	while((c=fgetc(f))>=0x80) len+=0x80*(c&0x0F);
247 	len+=c;
248 	printf("header: 00 (%d)\n",len);
249 	for(i=0;i<len;i++) fgetc(f);
250 	continue;
251     }
252 
253     if((c&0xF0)==0x40){
254 	// audio
255 	len=24;
256 	if(prefix) len=fgetc(f);
257 	printf("audio: %02X (%d)\n",c,len);
258 	for(i=0;i<len;i++) fgetc(f);
259 	continue;
260     }
261     if((c&0xF0)==0x30){
262 	// audio
263 	len=40;
264 	if(prefix) len=fgetc(f);
265 	printf("audio: %02X (%d)\n",c,len);
266 	for(i=0;i<len;i++) fgetc(f);
267 	continue;
268     }
269     if(flag2 || (((c&0xF0)==0x10 || (c&0xF0)==0x20) && (c&0x0F)!=(v_id&0xF))){
270 	// end of frame:
271 	printf("Frame size: %d\n",mux->buffer_len);
272 	h263_decode_picture_header(mux->buffer);
273 	muxer_write_chunk(mux,mux->buffer_len,0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
274 	mux->buffer_len=0;
275 
276 	if((v_id&0xF0)==0x10) fprintf(stderr,"hmm. last video packet %02X\n",v_id);
277     }
278     flag2=0;
279     if((c&0xF0)==0x10){
280 	// 128 byte
281 	len=128;
282 	if(prefix) len=fgetc(f);
283 	printf("video: %02X (%d)\n",c,len);
284 	fread(mux->buffer+mux->buffer_len,len,1,f);
285 	mux->buffer_len+=len;
286     v_id=c;
287 	continue;
288     }
289     if((c&0xF0)==0x20){
290 	int len=fgetc(f);
291 	printf("video: %02X (%d)\n",c,len);
292 	fread(mux->buffer+mux->buffer_len,len,1,f);
293 	mux->buffer_len+=len;
294 	flag2=1;
295     v_id=c;
296 	continue;
297     }
298     printf("error: %02X!\n",c);
299     exit(1);
300 }
301 
302 if(!width) width=320;
303 if(!height) height=240;
304 
305 mux->bih->biWidth=width;
306 mux->bih->biHeight=height;
307 mux->bih->biSizeImage=3*width*height;
308 
309 muxer_write_index(avi);
310 fseek(f2,0,SEEK_SET);
311 muxer_write_header(avi);
312 
313 return 0;
314 }
315