Windows2003-3790/enduser/netmeeting/av/codecs/dec/dech263/sv_h263.h
2020-09-30 16:53:55 +02:00

533 lines
15 KiB
C

/*
* @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<<H263_SCALED_IDCT_BITS)
/* Some macros */
#define sign(a) ((a) < 0 ? -1 : 1)
#define mnint(a) ((a) < 0 ? (int)(a - 0.5) : (int)(a + 0.5))
#define mshort(a) ((a) < 0.0 ? (short)(a - 0.5) : (short)(a + 0.5))
#define mmax(a, b) ((a) > (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 <n> " ) */
#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 <n>" */
#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 <headerlength> */
#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_