/* * @DEC_COPYRIGHT@ */ /* * HISTORY * $Log: $ * $EndLog$ */ /***************************************************************************** ** Copyright (c) Digital Equipment Corporation, 1996 ** ** ** ** All Rights Reserved. Unpublished rights reserved under the copyright ** ** laws of the United States. ** ** ** ** The software contained on this media is proprietary to and embodies ** ** the confidential technology of Digital Equipment Corporation. ** ** Possession, use, duplication or dissemination of the software and ** ** media is authorized only pursuant to a valid written license from ** ** Digital Equipment Corporation. ** ** ** ** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. ** ** Government is subject to restrictions as set forth in Subparagraph ** ** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. ** ******************************************************************************/ /**************************************************************************** * * sv_h263.h * Wei-Lien Hsu * Date: December 11, 1996 * ****************************************************************************/ #ifndef _SV_H263_ #define _SV_H263_ #include "SC.h" #include "h263.h" /* Scaled IDCT precision */ #define H263_SCALED_IDCT_BITS 20 #define H263_SCALED_IDCT_MULT (1< (b) ? (a) : (b)) #define mmin(a, b) ((a) < (b) ? (a) : (b)) #ifndef INT_MAX #define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */ #endif #ifdef WIN32 #ifndef floorf #define floorf floor #endif #endif #define H263_mfloor(a) ((a) < 0 ? (int)(a - 0.5) : (int)(a)) #define H263_limit(x) \ { \ if (x > 255) x = 255; \ if (x < 0) x = 0; \ } #define H263_S_CODE #define H263_NO_VEC 999 #define H263_DEF_OUTPUTNAME "DECOUT" #define H263_T_YUV 0 #define H263_T_SIF 1 #define H263_T_TGA 2 #define H263_T_PPM 3 #define H263_T_X11 4 #define H263_T_YUV_CONC 5 #define H263_T_WIN 6 /* MBC = DEF_PELS/MB_SIZE, MBR = DEF_LINES/MB_SIZE$*/ /* this is necessary for the max resolution 16CIF */ #define H263_MBC 88 #define H263_MBR 72 #define H263_YES 1 #define H263_NO 0 #define H263_ON 1 #define H263_OFF 0 /************************** H263 Decoder ********************************/ /* ** Structures used to pass around the H263 decompression information. ** Part of SvCodecInfo_t structure. */ typedef struct SvH263DecompressInfo_s { ScBoolean_t inited; /* was this info initialized yet */ int quality; /* output */ char *outputname; int outtype; /* printf's */ int quiet; int trace; char errortext[256]; unsigned int frame_rate; unsigned int bit_rate; /* encode bitrate */ unsigned char *refframe[3], *oldrefframe[3]; unsigned char *bframe[3], *newframe[3]; unsigned char *edgeframe[3], *edgeframeorig[3]; unsigned char *exnewframe[3]; int MV[2][5][H263_MBR+1][H263_MBC+2]; int modemap[H263_MBR+1][H263_MBC+2]; unsigned char *clp; int horizontal_size, vertical_size; int mb_width, mb_height; int coded_picture_width, coded_picture_height; int chrom_width, chrom_height, blk_cnt; int pict_type, newgob; int mv_outside_frame, syntax_arith_coding; int adv_pred_mode, pb_frame; int long_vectors; int fault, expand; int verbose; int refidct; int matrix_coefficients; int temp_ref, quant, source_format; int framenum; int trd, trb, bscan, bquant; #if 0 /* bit input */ int infile; unsigned char rdbfr[2051]; unsigned char *rdptr; unsigned qword inbfr; unsigned qword position; int incnt; int bitcnt; #endif /* block data [12] */ int (*block)[66]; void *dbg; /* debug handle */ } SvH263DecompressInfo_t; /************************************* H263 Encoder *************************************/ /* If you are not using the included Makefile, or want to override the Makefile, you can uncomment one or more of the defines below instead */ /* #define PRINTMV */ /* to print MVs to stdout while coding. */ /* #define PRINTQ */ /* to print the quantizer used during coding */ /* #define FASTIDCT */ /* for a fast single precision IDCT. */ /* #define OFFLINE_RATE_CONTROL */ /* for the rate control optimized for offline encoding. */ /* #define QCIF */ /* to change the coding format uncommment the above line and change to SQCIF, QCIF, CIF, CIF4, or CIF16 */ /* From config.h */ /* for FAST search */ #define H263_SRCH_RANGE 24 /*************************************************************************/ /* Default modes */ /* see http://www.nta.no/brukere/DVC/h263_options.html */ /* Added by Nuno on 06/27/96 to support prefiltering */ /* use prefiltering as default */ #define H263_DEF_PREFILT_MODE H263_NO /*************************************************************************/ /* Search windows */ /* default integer pel search seek distance ( also option "-s " ) */ #define H263_DEF_SEEK_DIST 15 /* default integer search window for 8x8 search centered around 16x16 vector. When it is zero only half pel estimation around the integer 16x16 vector will be performed */ /* for best performance, keep this small, preferably zero, but do your own simulations if you want to try something else */ #define H263_DEF_8X8_WIN 0 /* default search window for PB delta vectors */ /* keep this small also */ #define H263_DEF_PBDELTA_WIN 2 /*************************************************************************/ /* Miscellaneous */ /* write repeated reconstructed frames to disk (useful for variable * framerate, since sequence will be saved at 25 Hz) * Can be changed at run-time with option "-m" */ #define H263_DEF_WRITE_REPEATED H263_NO /* write bitstream trace to files trace.intra / trace * (also option "-t") */ #define H263_DEF_WRITE_TRACE H263_NO /* start rate control after DEF_START_RATE_CONTROL % of sequence * has been encoded. Can be changed at run-time with option "-R " */ #define H263_DEF_START_RATE_CONTROL 0 /* headerlength on concatenated 4:1:1 YUV input file * Can be changed at run-time with option -e */ #define H263_DEF_HEADERLENGTH 0 /* insert sync after each DEF_INSERT_SYNC for increased error robustness * 0 means do not insert extra syncs */ #define H263_DEF_INSERT_SYNC 0 /*************************************************************************/ /* ME methods */ #define H263_FULL_SEARCH 0 #define H263_TWO_LEVELS_7_1 1 #define H263_TWO_LEVELS_421_1 2 #define H263_TWO_LEVELS_7_polint 3 #define H263_TWO_LEVELS_7_pihp 4 #define H263_FINDHALFPEL 0 #define H263_POLINT 1 #define H263_IDLE 2 #define H263_DCT8BY8 0 #define H263_DCT16COEFF 1 #define H263_DCT4BY4 2 /* prefiltering */ #define H263_GAUSS 1 #define H263_MORPH 2 /* morph.c */ #define H263_DEF_HPME_METHOD H263_FINDHALFPEL #define H263_DEF_DCT_METHOD H263_DCT8BY8 #define H263_DEF_VSNR 0 /* FALSE */ #define H263_DEF_SOURCE_FORMAT H263_SF_QCIF /* Added by Nuno to support prefiltering */ #define H263_DEF_PYR_DEPTH 3 #define H263_DEF_PREF_PYR_TYPE H263_GAUSS #define H263_MAX_PYR_DEPTH 5 #define H263_DEF_STAT_PREF_STATE H263_NO /* This should not be changed */ #define H263_MB_SIZE 16 /* Parameters from TMN */ #define H263_PREF_NULL_VEC 100 #define H263_PREF_16_VEC 200 #define H263_PREF_PBDELTA_NULL_VEC 50 #define H263_MAX_CALC_QUALITY 0xFFFFFFFF #define H263_MIN_CALC_QUALITY 0x00000000 /****************************/ /* Motionvector structure */ typedef struct H263_motionvector { short x; /* Horizontal comp. of mv */ short y; /* Vertical comp. of mv */ short x_half; /* Horizontal half-pel acc. */ short y_half; /* Vertical half-pel acc. */ short min_error; /* Min error for this vector */ short Mode; /* Necessary for adv. pred. mode */ } H263_MotionVector; /* Point structure */ typedef struct H263_point { short x; short y; } H263_Point; /* Structure with image data */ typedef struct H263_pict_image { unsigned char *lum; /* Luminance plane */ unsigned char *Cr; /* Cr plane */ unsigned char *Cb; /* Cb plane */ } H263_PictImage; /* Added by Nuno on 06/24/96 to support filtering of the prediction error */ typedef struct pred_image { short *lum; /* Luminance plane */ short *Cr; /* Cr plane */ short *Cb; /* Cb plane */ } PredImage; /* Group of pictures structure. */ /* Picture structure */ typedef struct H263_pict { int prev; int curr; int TR; /* Time reference */ int bit_rate; int src_frame_rate; float target_frame_rate; int source_format; int picture_coding_type; int spare; int unrestricted_mv_mode; int PB; int QUANT; int DQUANT; int MB; int seek_dist; /* Motion vector search window */ int use_gobsync; /* flag for gob_sync */ int MODB; /* B-frame mode */ int BQUANT; /* which quantizer to use for B-MBs in PB-frame */ int TRB; /* Time reference for B-picture */ float QP_mean; /* mean quantizer */ } H263_Pict; /* Slice structure */ /* typedef struct H263_slice { unsigned int vert_pos; unsigned int quant_scale; } H263_Slice; */ /* Macroblock structure */ /* typedef struct H263_macroblock { int mb_address; int macroblock_type; int skipped; H263_MotionVector motion; } H263_Macroblock; */ /* Structure for macroblock data */ typedef struct mb_structure { short lum[16][16]; short Cr[8][8]; short Cb[8][8]; } H263_MB_Structure; /* Added by Nuno on 06/24/96 to support filtering of the prediction error */ typedef struct working_buffer { short *qcoeff_P; /* P frame coefficient */ unsigned char *ipol_image; /* interpolated image */ } H263_WORKING_BUFFER; /* Structure for counted bits */ typedef struct H263_bits_counted { int Y; int C; int vec; int CBPY; int CBPCM; int MODB; int CBPB; int COD; int header; int DQUANT; int total; int no_inter; int no_inter4v; int no_intra; /* NB: Remember to change AddBits(), ZeroBits() and AddBitsPicture() when entries are added here */ } H263_Bits; /* Structure for data for data from previous macroblock */ /* Structure for average results and virtal buffer data */ typedef struct H263_results { float SNR_l; /* SNR for luminance */ float SNR_Cr; /* SNR for chrominance */ float SNR_Cb; float QP_mean; /* Mean quantizer */ } H263_Results; /**************** RTP *****************/ #define RTP_H263_INTRA_CODED 0x00000001 #define RTP_H263_PB_FRAME 0x00000002 #define RTP_H263_AP 0x00000004 #define RTP_H263_SAC 0x00000008 #define H263_RTP_MODE_A PARAM_FORMATEXT_RTPA #define H263_RTP_MODE_B PARAM_FORMATEXT_RTPB #define H263_RTP_MODE_C PARAM_FORMATEXT_RTPC #define H263_RTP_DEFAULT_MODE RTP_H263_MODE_A #define H263_RTP_MAX_PACKETS 64*2 typedef struct SvH263BSInfo_s { unsigned dword dwFlag; unsigned dword dwBitOffset; unsigned char Mode; unsigned char MBA; unsigned char Quant; unsigned char GOBN; char HMV1; char VMV1; char HMV2; char VMV2; } SvH263BSInfo_t; typedef struct SvH263BSTrailer_s { unsigned dword dwVersion; unsigned dword dwFlags; unsigned dword dwUniqueCode; unsigned dword dwCompressedSize; unsigned dword dwNumberOfPackets; unsigned char SourceFormat; unsigned char TR; unsigned char TRB; unsigned char DBQ; } SvH263BSTrailer_t; typedef struct SvH263RTPInfo_s { SvH263BSTrailer_t trailer; SvH263BSInfo_t bsinfo[H263_RTP_MAX_PACKETS]; dword packet_id; ScBSPosition_t pic_start_position, packet_start_position; ScBSPosition_t pre_GOB_position, pre_MB_position; } SvH263RTPInfo_t; /* ** Structures used to pass around the H263 compression information. ** Part of SvCodecInfo_t structure. */ typedef struct SvH263CompressInfo_s { ScBoolean_t inited; /* was this info initialized yet */ /* options */ int quality; unsigned dword calc_quality; /* calculated quality */ int advanced; int syntax_arith_coding; int pb_frames; int unrestricted; int extbitstream; /* extended bitstream (rtp) */ int packetsize; /* packet size (rtp) */ /* for FAST search */ unsigned char *block_subs2, *srch_area_subs2; /* Global variables */ int headerlength; int source_format; int mb_width; int mb_height; int pels; int cpels; int lines; int trace; int mv_outside_frame; int long_vectors; float target_framerate; int prefilter; /* Added by Nuno on 06/24/96 to support prefiltering */ H263_PictImage *prev_image; H263_PictImage *curr_image; H263_PictImage *curr_recon; H263_PictImage *prev_recon; /* To support filtering of the prediction error */ H263_PictImage **curr_filtd; H263_PictImage *curr_clean; H263_PictImage *curr_selects; H263_PictImage *B_selects; /* PB-frame specific */ H263_PictImage *B_recon; H263_PictImage *B_image; H263_PictImage **B_filtd; H263_PictImage *B_clean; H263_Pict *pic; H263_WORKING_BUFFER *wk_buffers; /* for Motion Estimation */ H263_MotionVector *MV[6][H263_MBR+1][H263_MBC+2]; unsigned char PREF_LEVEL[4][3], MOTresh[4]; int PYR_DEPTH, PrefPyrType, H263_StaticPref, PETresh[3]; H263_Bits *bits ; H263_Bits *total_bits; H263_Bits *intra_bits ; H263_Results *res; H263_Results *total_res; H263_Results *b_res ; /* bitrate control */ int buffer_fullness; int buffer_frames_stored; int first_loop_finished, start_rate_control; unsigned char **PreFilterLevel; int bit_rate; int total_frames_passed, PPFlag; int first_frameskip, next_frameskip, chosen_frameskip; float orig_frameskip; int frames,bframes,pframes,pdist,bdist; int distance_to_next_frame; int QP, QP_init, QPI; float ref_frame_rate, orig_frame_rate; float frame_rate, seconds; int ME_method; int HPME_method; int refidct; int DCT_method; int vsnr; int start, end; int frame_no; SvH263RTPInfo_t *RTPInfo; int VARgob[16]; char *seqfilename; char *streamname; void *dbg; /* debug handle */ } SvH263CompressInfo_t; #endif _SV_H263_