summaryrefslogtreecommitdiffstats
path: root/TOOLS
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-11-04 00:00:38 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-11-04 00:00:38 +0000
commitfb794e7e9105ba97a7f5b32b6098518a536f64fc (patch)
tree692be56166d153913bf6e7a2eb574c9e668b03f0 /TOOLS
parent663c4f8eb04e9ea44ee6744c90ea165b1f48eaee (diff)
downloadmpv-fb794e7e9105ba97a7f5b32b6098518a536f64fc.tar.bz2
mpv-fb794e7e9105ba97a7f5b32b6098518a536f64fc.tar.xz
dump h263 frame headers from vivo
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2666 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'TOOLS')
-rw-r--r--TOOLS/vivodump.c144
1 files changed, 144 insertions, 0 deletions
diff --git a/TOOLS/vivodump.c b/TOOLS/vivodump.c
new file mode 100644
index 0000000000..8b13ceae93
--- /dev/null
+++ b/TOOLS/vivodump.c
@@ -0,0 +1,144 @@
+#include <stdio.h>
+
+static const short h263_format[8][2] = {
+ { 0, 0 },
+ { 128, 96 },
+ { 176, 144 },
+ { 352, 288 },
+ { 704, 576 },
+ { 1408, 1152 },
+};
+
+unsigned char* buffer;
+int bufptr=0;
+int bitcnt=0;
+unsigned char buf=0;
+
+unsigned int x_get_bits(int n){
+ unsigned int x=0;
+ while(n-->0){
+ if(!bitcnt){
+ // fill buff
+ buf=buffer[bufptr++];
+ bitcnt=8;
+ }
+ //x=(x<<1)|(buf&1);buf>>=1;
+ x=(x<<1)|(buf>>7);buf<<=1;
+ --bitcnt;
+ }
+ return x;
+}
+
+#define get_bits(xxx,n) x_get_bits(n)
+#define get_bits1(xxx) x_get_bits(1)
+#define skip_bits(xxx,n) x_get_bits(n)
+#define skip_bits1(xxx) x_get_bits(1)
+
+/* most is hardcoded. should extend to handle all h263 streams */
+int h263_decode_picture_header(unsigned char *b_ptr)
+{
+ int format, width, height;
+
+ buffer=b_ptr;
+ bufptr=bitcnt=buf=0;
+
+ /* picture header */
+ if (get_bits(&s->gb, 22) != 0x20)
+ return -1;
+ skip_bits(&s->gb, 8); /* picture timestamp */
+
+ if (get_bits1(&s->gb) != 1)
+ return -1; /* marker */
+ if (get_bits1(&s->gb) != 0)
+ 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 */
+
+ format = get_bits(&s->gb, 3);
+
+ if (format != 7) {
+ printf("h263_plus = 0 format = %d\n",format);
+ /* H.263v1 */
+ width = h263_format[format][0];
+ height = h263_format[format][1];
+ printf("%d x %d\n",width,height);
+ if (!width)
+ return -1;
+
+ printf("pict_type=%d\n",get_bits1(&s->gb));
+ printf("unrestricted_mv=%d\n",get_bits1(&s->gb));
+#if 1
+ printf("SAC: %d\n",get_bits1(&s->gb));
+ printf("advanced prediction mode: %d\n",get_bits1(&s->gb));
+ printf("PB frame: %d\n",get_bits1(&s->gb));
+#else
+ if (get_bits1(&s->gb) != 0)
+ return -1; /* SAC: off */
+ if (get_bits1(&s->gb) != 0)
+ return -1; /* advanced prediction mode: off */
+ if (get_bits1(&s->gb) != 0)
+ return -1; /* not PB frame */
+#endif
+ printf("qscale=%d\n",get_bits(&s->gb, 5));
+ skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
+ } else {
+ printf("h263_plus = 1\n");
+ /* H.263v2 */
+ if (get_bits(&s->gb, 3) != 1)
+ return -1;
+ if (get_bits(&s->gb, 3) != 6) /* custom source format */
+ return -1;
+ skip_bits(&s->gb, 12);
+ skip_bits(&s->gb, 3);
+ printf("pict_type=%d\n",get_bits(&s->gb, 3) + 1);
+// if (s->pict_type != I_TYPE &&
+// s->pict_type != P_TYPE)
+// return -1;
+ skip_bits(&s->gb, 7);
+ skip_bits(&s->gb, 4); /* aspect ratio */
+ width = (get_bits(&s->gb, 9) + 1) * 4;
+ skip_bits1(&s->gb);
+ height = get_bits(&s->gb, 9) * 4;
+ printf("%d x %d\n",width,height);
+ if (height == 0)
+ return -1;
+ printf("qscale=%d\n",get_bits(&s->gb, 5));
+ }
+
+ /* PEI */
+ while (get_bits1(&s->gb) != 0) {
+ skip_bits(&s->gb, 8);
+ }
+// s->f_code = 1;
+// s->width = width;
+// s->height = height;
+ return 0;
+}
+
+
+int main(){
+int c;
+unsigned int head=-1;
+int pos=0;
+
+while((c=getchar())>=0){
+ ++pos;
+ head=(head<<8)|c;
+ if((head&0xFFFFFF)==0x80){
+ unsigned char buf[33];
+ int i;
+ buf[0]=buf[1]=0; buf[2]=0x80;
+ printf("%08X: 00 00 80",pos);
+ for(i=0;i<30;i++){
+ c=getchar();++pos;
+ printf(" %02X",c);
+ buf[3+i]=c;
+ }
+ printf("\n");
+ h263_decode_picture_header(buf);
+ }
+}
+
+
+}