www.pudn.com > avi 到 mpeg 的转换程序及源代码.zip > GLOBAL.H


/* global.h, global variables, function prototypes                          */

/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */

/*
 * Disclaimer of Warranty
 *
 * These software programs are available to the user without any license fee or
 * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
 * any and all warranties, whether express, implied, or statuary, including any
 * implied warranties or merchantability or of fitness for a particular
 * purpose.  In no event shall the copyright-holder be liable for any
 * incidental, punitive, or consequential damages of any kind whatsoever
 * arising from the use of these programs.
 *
 * This disclaimer of warranty extends to the user of these programs and user's
 * customers, employees, agents, transferees, successors, and assigns.
 *
 * The MPEG Software Simulation Group does not represent or warrant that the
 * programs furnished hereunder are free of infringement of any third-party
 * patents.
 *
 * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
 * are subject to royalty fees to patent holders.  Many of these patents are
 * general enough such that they are unavoidable regardless of implementation
 * design.
 *
 */ 
 
/* 
 * 4/4/97 - John Schlichther 
 * 
 * extensively altered to create avi2mpg1 - avi to mpeg-1 encoder 
 * 
 * Since avi file, and the avi subsystem are platform dependant, cross 
 * platform compatibility removed, many optional features disabled or 
 * removed, code generally trimmed to a minimum. 
 * 
 */ 
 
#include "avi2m1v.h"
#include  
#include  
#include  

/* prototypes of global functions */ 
 
/* choose between declaration (GLOBAL undefined) 
 * and definition (GLOBAL defined) 
 * GLOBAL is defined in exactly one file (avi2mpg1.c) 
 */ 
 
#ifndef GLOBAL 
#define EXTERN extern 
#else 
#define EXTERN 
#endif 
 
/* conform.c */
void range_checks(void);
 
/* fdctref.c */
void init_fdct(void);
void fdct(short *block);

/* idct.c */
void idct(short *block);
void init_idct(void);

/* motion.c */
void motion_estimation(unsigned char *oldorg, unsigned char *neworg,
  unsigned char *oldref, unsigned char *newref, unsigned char *cur,
  unsigned char *curref, int sxf, int syf, int sxb, int syb,
  struct mbinfo *mbi, int secondfield, int ipflag);

/* avi2m1v.c */ 
int avi2m1v(char *);
void error(char *text);

/* predict.c */
void predict(unsigned char *reff[], unsigned char *refb[],
  unsigned char *cur[3], int secondfield, struct mbinfo *mbi);

/* putbits.c */
void initbits(void);
void putbits(int val, int n);
void alignbits(void);
int bitcount(void);

/* puthdr.c */
void putseqhdr(void);
void putseqext(void);
void putseqdispext(void);
void putuserdata(char *userdata);
void putgophdr(int frame, int closed_gop);
void putpicthdr(void);
void putpictcodext(void);
void putseqend(void);

/* putmpg.c */
void putintrablk(short *blk, int cc);
void putnonintrablk(short *blk);
void putmv(int dmv, int f_code);

/* putpic.c */
void putpict(unsigned char *frame);

/* putseq.c */
void putseq(void);

/* putvlc.c */
void putDClum(int val);
void putDCchrom(int val);
void putACfirst(int run, int val);
void putAC(int run, int signed_level, int vlcformat);
void putaddrinc(int addrinc);
void putmbtype(int pict_type, int mb_type);
void putmotioncode(int motion_code);
void putdmv(int dmv);
void putcbp(int cbp);

/* quantize.c */
int quant_intra(short *src, short *dst, int dc_prec,
  unsigned char *quant_mat, int mquant);
int quant_non_intra(short *src, short *dst,
  unsigned char *quant_mat, int mquant);
void iquant_intra(short *src, short *dst, int dc_prec,
  unsigned char *quant_mat, int mquant);
void iquant_non_intra(short *src, short *dst,
  unsigned char *quant_mat, int mquant);

/* ratectl.c */
void rc_init_seq(void);
void rc_init_GOP(int np, int nb);
void rc_init_pict(unsigned char *frame);
void rc_update_pict(void);
int rc_start_mb(void);
int rc_calc_mquant(int j);
void vbv_end_of_picture(void);
void calc_vbv_delay(void);

/* readpic.c */
void readframe(unsigned long lCurFrame, unsigned char *frame[]);

/* stats.c */
void calcSNR(unsigned char *org[3], unsigned char *rec[3]);
void stats(void);

/* transfrm.c */
void transform(unsigned char *pred[], unsigned char *cur[],
  struct mbinfo *mbi, short blocks[][64]);
void itransform(unsigned char *pred[], unsigned char *cur[],
  struct mbinfo *mbi, short blocks[][64]);
void dct_type_estimation(unsigned char *pred, unsigned char *cur,
  struct mbinfo *mbi);

/* writepic.c */
void writeframe(char *fname, unsigned char *frame[]);


/* global variables */ 
 
EXTERN char version[]
#ifdef GLOBAL
  ="avi2mpg1 V1.5, 97/11/19"
#endif
;

EXTERN char author[]
#ifdef GLOBAL
  ="(C) 1997, John Schlichther"
#endif
; 
 
EXTERN PAVISTREAM pVideoStream, pAudioStream; 
EXTERN AVISTREAMINFO pAudioStreamInfo; 
EXTERN unsigned long length; 
EXTERN WAVEFORMATEX pWavFormat; 
EXTERN unsigned int vbv_ovflow; 
EXTERN unsigned int vbv_unflow; 
EXTERN char video_param_filename[_MAX_PATH]; 
EXTERN unsigned int use_v_param_file;
EXTERN unsigned long last_good_video_frame; 
EXTERN unsigned int fake_bad_frames; 
EXTERN unsigned int video_only; 
EXTERN unsigned int frame_repl; 
EXTERN unsigned int vbv_size; 
EXTERN unsigned int bad_frame_count; 
EXTERN unsigned int bad_audio_count; 
EXTERN int m_search_size; 
EXTERN time_t   start_time; 
EXTERN unsigned long bytes_processed; 
 
// multiplex error counts 
 
EXTERN unsigned int audio_time_out; 
EXTERN unsigned int video_time_out; 
EXTERN unsigned int audio_end_early; 
EXTERN unsigned int video_end_early; 
 
/* zig-zag scan */
EXTERN unsigned char zig_zag_scan[64]
#ifdef GLOBAL
=
{
  0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
  12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
  35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
  58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
}
#endif
;

/* alternate scan */
EXTERN unsigned char alternate_scan[64]
#ifdef GLOBAL
=
{
  0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
  41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
  51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
  53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
}
#endif
;

/* default intra quantization matrix */
EXTERN unsigned char default_intra_quantizer_matrix[64]
#ifdef GLOBAL
=
{
   8, 16, 19, 22, 26, 27, 29, 34,
  16, 16, 22, 24, 27, 29, 34, 37,
  19, 22, 26, 27, 29, 34, 34, 38,
  22, 22, 26, 27, 29, 34, 37, 40,
  22, 26, 27, 29, 32, 35, 40, 48,
  26, 27, 29, 32, 35, 40, 48, 58,
  26, 27, 29, 34, 38, 46, 56, 69,
  27, 29, 35, 38, 46, 56, 69, 83
}
#endif
;

/* non-linear quantization coefficient table */
EXTERN unsigned char non_linear_mquant_table[32]
#ifdef GLOBAL
=
{
   0, 1, 2, 3, 4, 5, 6, 7,
   8,10,12,14,16,18,20,22,
  24,28,32,36,40,44,48,52,
  56,64,72,80,88,96,104,112
}
#endif
;

/* non-linear mquant table for mapping from scale to code
 * since reconstruction levels are not bijective with the index map,
 * it is up to the designer to determine most of the quantization levels
 */

EXTERN unsigned char map_non_linear_mquant[113] 
#ifdef GLOBAL
=
{
0,1,2,3,4,5,6,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
16,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,
22,22,23,23,23,23,24,24,24,24,24,24,24,25,25,25,25,25,25,25,26,26,
26,26,26,26,26,26,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,29,
29,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,31,31,31,31,31
}
#endif
;

/* picture data arrays */

/* reconstructed frames */
EXTERN unsigned char *newrefframe[3], *oldrefframe[3], *auxframe[3];
/* original frames */
EXTERN unsigned char *neworgframe[3], *oldorgframe[3], *auxorgframe[3];
/* prediction of current frame */
EXTERN unsigned char *predframe[3];
/* 8*8 block data */
EXTERN short (*blocks)[64];
/* intra / non_intra quantization matrices */
EXTERN unsigned char intra_q[64], inter_q[64];
EXTERN unsigned char chrom_intra_q[64],chrom_inter_q[64];
/* prediction values for DCT coefficient (0,0) */
EXTERN int dc_dct_pred[3];
/* macroblock side information array */
EXTERN struct mbinfo *mbinfo;
/* motion estimation parameters */
EXTERN struct motion_data *motion_data;
/* clipping (=saturation) table */
EXTERN unsigned char *clp; 
 
/* U V temporary buffers */ 
EXTERN unsigned char *Ubuffer, *Vbuffer;

/* name strings */
EXTERN char id_string[256], tplorg[256], tplref[256];
EXTERN char iqname[256], niqname[256];
EXTERN char statname[256];
EXTERN char errortext[256];

EXTERN FILE *outfile, *statfile; /* file descriptors */
EXTERN int inputtype;            /* format of input frames */

EXTERN int quiet;                /* suppress warnings */


/* coding model parameters */

EXTERN int N;           /* number of frames in Group of Pictures */
EXTERN int M;           /* distance between I/P frames */
EXTERN int P;           /* intra slice refresh interval */
EXTERN int nframes;     /* total number of frames to encode */
EXTERN int frame0, tc0; /* number and timecode of first frame */
EXTERN int fieldpic;    /* use field pictures */ 
 
EXTERN unsigned int system_byterate_parm; 
EXTERN unsigned int audio_bitrate_parm; 
EXTERN unsigned int audio_layer_parm; 
EXTERN unsigned int joint_stereo_parm; 
EXTERN unsigned int vcd_parm; 
EXTERN unsigned int crop_size; 
EXTERN unsigned int crop_horz; 
EXTERN unsigned int crop_vert; 
EXTERN unsigned int forced_frame_rate; 
 
/* sequence specific data (sequence header) */

EXTERN int horizontal_size, vertical_size; /* frame size (pels) */
EXTERN int width, height;                  /* encoded frame size (pels) multiples of 16 or 32 */
EXTERN int chrom_width,chrom_height,block_count;
EXTERN int mb_width, mb_height;            /* frame size (macroblocks) */
EXTERN int width2, height2, mb_height2, chrom_width2; /* picture size */
EXTERN int aspectratio;                    /* aspect ratio information (pel or display) */
EXTERN int frame_rate_code;                /* coded value of frame rate */
EXTERN double frame_rate;                  /* frames per second */
EXTERN double bit_rate;                    /* bits per second */
EXTERN int vbv_buffer_size;                /* size of VBV buffer (* 16 kbit) */
EXTERN int constrparms;                    /* constrained parameters flag (MPEG-1 only) */
EXTERN int load_iquant, load_niquant;      /* use non-default quant. matrices */
EXTERN int load_ciquant,load_cniquant;


/* sequence specific data (sequence extension) */

EXTERN int profile, level; /* syntax / parameter constraints */
EXTERN int prog_seq;       /* progressive sequence */
EXTERN int chroma_format;
EXTERN int low_delay;      /* no B pictures, skipped pictures */


/* sequence specific data (sequence display extension) */

EXTERN int video_format;             /* component, PAL, NTSC, SECAM or MAC */
EXTERN int color_primaries;          /* source primary chromaticity coordinates */
EXTERN int transfer_characteristics; /* opto-electronic transfer char. (gamma) */
EXTERN int matrix_coefficients;      /* Eg,Eb,Er / Y,Cb,Cr matrix coefficients */
EXTERN int display_horizontal_size, display_vertical_size; /* display size */


/* picture specific data (picture header) */

EXTERN int temp_ref;  /* temporal reference */
EXTERN int pict_type; /* picture coding type (I, P or B) */
EXTERN int vbv_delay; /* video buffering verifier delay (1/90000 seconds) */


/* picture specific data (picture coding extension) */

EXTERN int forw_hor_f_code, forw_vert_f_code;
EXTERN int back_hor_f_code, back_vert_f_code; /* motion vector ranges */
EXTERN int dc_prec;                           /* DC coefficient precision for intra coded blocks */
EXTERN int pict_struct;                       /* picture structure (frame, top / bottom field) */
EXTERN int topfirst;                          /* display top field first */
                                    /* use only frame prediction and frame DCT (I,P,B,current) */
EXTERN int frame_pred_dct_tab[3], frame_pred_dct;
EXTERN int conceal_tab[3];                    /* use concealment motion vectors (I,P,B) */
EXTERN int qscale_tab[3], q_scale_type;       /* linear/non-linear quantizaton table */
EXTERN int intravlc_tab[3], intravlc;         /* intra vlc format (I,P,B,current) */
EXTERN int altscan_tab[3], altscan;           /* alternate scan (I,P,B,current) */
EXTERN int repeatfirst;                       /* repeat first field after second field */
EXTERN int prog_frame;                        /* progressive frame */