vivodump.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 295 行

C
295
字号
#include <mplaylib.h>#include <mplaylib.h>#include <mplaylib.h>#include <inttypes.h>#include "loader/wine/mmreg.h"#include "loader/wine/avifmt.h"#include "loader/wine/vfw.h"#include "stream/stream.h"#include "libmpdemux/muxer.h"#include "libmpdemux/demuxer.h"char *info_name;char *info_artist;char *info_genre;char *info_subject;char *info_copyright;char *info_sourceform;char *info_comment;static const short h263_format[8][2] = {    { 0, 0 },    { 128, 96 },    { 176, 144 },    { 352, 288 },    { 704, 576 },    { 1408, 1152 },    { 320, 240 }};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)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){	printf("bad picture header\n");        return -1;    }    skip_bits(&s->gb, 8); /* picture timestamp */    if (get_bits1(&s->gb) != 1){	printf("bad marker\n");        return -1;	/* marker */    }    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 */    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){	    printf("H.263v2 A error\n");            return -1;	}        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);//        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 postable[32768];int main(int argc,char ** argv){int c;FILE *f;FILE *f2;muxer_t* avi;muxer_stream_t* mux;//unsigned char* buffer=malloc(0x200000);int i,len;int v_id=0;int flag2=0;int prefix=0;// check if enough args were givenif ( argc < 3 ){    printf("Too few arguments given!\n"           "Usage: %s <input_file> <output_file>\n", argv[0]);    return -1;}// inputif(!(f=fopen(argv[1],"rb"))){       printf("Couldn't open input file.\n");       return -1;}// outputif(!(f2=fopen(argv[2],"wb"))){       printf("Couldn't open output file.\n");       return -1;}avi=muxer_new_muxer(MUXER_TYPE_AVI,f2);mux=muxer_new_stream(avi,MUXER_TYPE_VIDEO);mux->buffer_size=0x200000;mux->buffer=malloc(mux->buffer_size);mux->h.dwScale=1; mux->h.dwRate=10; mux->bih=malloc(sizeof(BITMAPINFOHEADER));mux->bih->biSize=sizeof(BITMAPINFOHEADER);mux->bih->biPlanes=1;mux->bih->biBitCount=24;mux->bih->biCompression=0x6f766976;//      7669766f;muxer_write_header(avi);/*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){    printf("%08X  %02X\n",ftell(f),c);    prefix=0;    if(c==0x82){	prefix=1;	//continue;	c=fgetc(f);	printf("%08X  %02X\n",ftell(f),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	len=24;	if(prefix) len=fgetc(f);	printf("audio: %02X (%d)\n",c,len);	for(i=0;i<len;i++) fgetc(f);	continue;    }    if((c&0xF0)==0x30){	// audio	len=40;	if(prefix) len=fgetc(f);	printf("audio: %02X (%d)\n",c,len);	for(i=0;i<len;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);	muxer_write_chunk(mux,mux->buffer_len,0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE);	mux->buffer_len=0;		if((v_id&0xF0)==0x10) fprintf(stderr,"hmm. last video packet %02X\n",v_id);    }    flag2=0;    if((c&0xF0)==0x10){	// 128 byte	len=128;	if(prefix) len=fgetc(f);	printf("video: %02X (%d)\n",c,len);	fread(mux->buffer+mux->buffer_len,len,1,f);	mux->buffer_len+=len;    v_id=c;	continue;    }    if((c&0xF0)==0x20){	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;    v_id=c;	continue;    }    printf("error: %02X!\n",c);    exit(1);}if(!width) width=320;if(!height) height=240;mux->bih->biWidth=width;mux->bih->biHeight=height;mux->bih->biSizeImage=3*width*height;muxer_write_index(avi);fseek(f2,0,SEEK_SET);muxer_write_header(avi);return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?