changeset 2696:d0f26c572633

vivo 2.0 support
author arpi
date Sun, 04 Nov 2001 19:47:19 +0000
parents af8b2c0e4dad
children 1eaf3f89e49f
files TOOLS/vivodump.c
diffstat 1 files changed, 66 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/TOOLS/vivodump.c	Sun Nov 04 19:39:08 2001 +0000
+++ b/TOOLS/vivodump.c	Sun Nov 04 19:47:19 2001 +0000
@@ -15,6 +15,7 @@
     { 352, 288 },
     { 704, 576 },
     { 1408, 1152 },
+    { 320, 240 }
 };
 
 unsigned char* buffer;
@@ -42,24 +43,35 @@
 #define skip_bits(xxx,n) x_get_bits(n)
 #define skip_bits1(xxx) x_get_bits(1)
 
-    int format, width, height;
+int format;
+int width=320;
+int height=240;
 
 /* most is hardcoded. should extend to handle all h263 streams */
 int h263_decode_picture_header(unsigned char *b_ptr)
 {
+    int i;
+        
+    for(i=0;i<16;i++) printf(" %02X",b_ptr[i]); printf("\n");
     
     buffer=b_ptr;
     bufptr=bitcnt=buf=0;
 
     /* picture header */
-    if (get_bits(&s->gb, 22) != 0x20)
+    if (get_bits(&s->gb, 22) != 0x20){
+	printf("bad picture header\n");
         return -1;
+    }
     skip_bits(&s->gb, 8); /* picture timestamp */
 
-    if (get_bits1(&s->gb) != 1)
+    if (get_bits1(&s->gb) != 1){
+	printf("bad marker\n");
         return -1;	/* marker */
-    if (get_bits1(&s->gb) != 0)
+    }
+    if (get_bits1(&s->gb) != 0){
+	printf("bad h263 id\n");
         return -1;	/* h263 id */
+    }
     skip_bits1(&s->gb);	/* split screen off */
     skip_bits1(&s->gb);	/* camera  off */
     skip_bits1(&s->gb);	/* freeze picture release off */
@@ -72,8 +84,7 @@
         width = h263_format[format][0];
         height = h263_format[format][1];
 	printf("%d x %d\n",width,height);
-        if (!width)
-            return -1;
+//        if (!width) return -1;
 
 	printf("pict_type=%d\n",get_bits1(&s->gb));
 	printf("unrestricted_mv=%d\n",get_bits1(&s->gb));
@@ -94,10 +105,14 @@
     } else {
         printf("h263_plus = 1\n");
         /* H.263v2 */
-        if (get_bits(&s->gb, 3) != 1)
+        if (get_bits(&s->gb, 3) != 1){
+	    printf("H.263v2 A error\n");
             return -1;
-        if (get_bits(&s->gb, 3) != 6) /* custom source format */
+	}
+        if (get_bits(&s->gb, 3) != 6){ /* custom source format */
+	    printf("custom source format\n");
             return -1;
+	}
         skip_bits(&s->gb, 12);
         skip_bits(&s->gb, 3);
 	printf("pict_type=%d\n",get_bits(&s->gb, 3) + 1);
@@ -110,8 +125,8 @@
         skip_bits1(&s->gb);
         height = get_bits(&s->gb, 9) * 4;
 	printf("%d x %d\n",width,height);
-        if (height == 0)
-            return -1;
+        //if (height == 0)
+        //    return -1;
 	printf("qscale=%d\n",get_bits(&s->gb, 5));
     }
 
@@ -132,14 +147,15 @@
 unsigned int head=-1;
 int pos=0;
 int frames=0;
-FILE *f=fopen("bion1vd-28.viv","rb");
-FILE *f2=fopen("bion1vd-28.avi","wb");
+FILE *f=fopen("GB1.viv","rb");
+FILE *f2=fopen("GB1.avi","wb");
 aviwrite_t* avi=aviwrite_new_muxer();
 aviwrite_stream_t* mux=aviwrite_new_stream(avi,AVIWRITE_TYPE_VIDEO);
 //unsigned char* buffer=malloc(0x200000);
-int i;
+int i,len;
 int v_id=0;
 int flag=0;
+int flag2=0;
 
 mux->buffer_size=0x200000;
 mux->buffer=malloc(mux->buffer_size);
@@ -154,25 +170,52 @@
 mux->bih->biCompression=0x6f766976;//      7669766f;
 aviwrite_write_header(avi,f2);
 
+/*
+c=fgetc(f); if(c) printf("error! not vivo file?\n");
+len=0;
+while((c=fgetc(f))>=0x80) len+=0x80*(c&0x0F);
+len+=c;
+printf("hdr1: %d\n",len);
+for(i=0;i<len;i++) fgetc(f);
+*/
+
 while((c=fgetc(f))>=0){
-    if(!flag && c!=0x40 && c!=0x10) continue;
-    flag=1;
+
+//    printf("%02X\n",c);
 
-    printf("%02X\n",c);
+    if(c==0x00){
+	// header
+	int len=0;
+	while((c=fgetc(f))>=0x80) len+=0x80*(c&0x0F);
+	len+=c;
+	printf("header: 00 (%d)\n",len);
+	for(i=0;i<len;i++) fgetc(f);
+	continue;
+    }
+
     if((c&0xF0)==0x40){
 	// audio
 	printf("audio: %02X (24)\n",c);
 	for(i=0;i<24;i++) fgetc(f);
 	continue;
     }
-    if(((c&0xF0)==0x10 || (c&0xF0)==0x20) && (c&0x0F)!=v_id){
+    if((c&0xF0)==0x30){
+	// audio
+	printf("audio: %02X (40)\n",c);
+	for(i=0;i<40;i++) fgetc(f);
+	continue;
+    }
+    if(flag2 || (((c&0xF0)==0x10 || (c&0xF0)==0x20) && (c&0x0F)!=(v_id&0xF))){
 	// end of frame:
 	printf("Frame size: %d\n",mux->buffer_len);
 	h263_decode_picture_header(mux->buffer);
 	aviwrite_write_chunk(avi,mux,f2,mux->buffer_len,0x10);
 	mux->buffer_len=0;
+	
+	if((v_id&0xF0)==0x10) fprintf(stderr,"hmm. last video packet %02X\n",v_id);
     }
-    v_id=c&0x0F;
+    v_id=c;
+    flag2=0;
     if((c&0xF0)==0x10){
 	// 128 byte
 	printf("video: %02X (128)\n",c);
@@ -181,16 +224,19 @@
 	continue;
     }
     if((c&0xF0)==0x20){
-	// 128 byte
 	int len=fgetc(f);
 	printf("video: %02X (%d)\n",c,len);
 	fread(mux->buffer+mux->buffer_len,len,1,f);
 	mux->buffer_len+=len;
+	flag2=1;
 	continue;
     }
-    printf("error!\n");
+    printf("error: %02X!\n",c);
 }
 
+if(!width) width=320;
+if(!height) height=240;
+
 mux->bih->biWidth=width;
 mux->bih->biHeight=height;
 mux->bih->biSizeImage=3*width*height;