1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-12 18:06:18 +00:00
mpv/libmpeg2/mpeg2_internal.h
arpi_esp d34041569e Initial revision
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2 b3059339-0415-0410-9bf9-f77b7e298cf2
2001-02-24 20:28:24 +00:00

221 lines
6.6 KiB
C

#include <inttypes.h>
/*
* mpeg2_internal.h
* Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
*
* This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
*
* mpeg2dec is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* mpeg2dec is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
// hack mode - temporary
// 0 = decode B pictures in a small slice buffer, display slice per slice
// 1 = decode in a frame buffer, display slice per slice
// 2 = decode in a frame buffer, display whole frames
#define HACK_MODE 0
// macroblock modes
#define MACROBLOCK_INTRA 1
#define MACROBLOCK_PATTERN 2
#define MACROBLOCK_MOTION_BACKWARD 4
#define MACROBLOCK_MOTION_FORWARD 8
#define MACROBLOCK_QUANT 16
#define DCT_TYPE_INTERLACED 32
// motion_type
#define MOTION_TYPE_MASK (3*64)
#define MOTION_TYPE_BASE 64
#define MC_FIELD (1*64)
#define MC_FRAME (2*64)
#define MC_16X8 (2*64)
#define MC_DMV (3*64)
//picture structure
#define TOP_FIELD 1
#define BOTTOM_FIELD 2
#define FRAME_PICTURE 3
//picture coding type
#define I_TYPE 1
#define P_TYPE 2
#define B_TYPE 3
#define D_TYPE 4
//The picture struct contains all of the top level state
//information (ie everything except slice and macroblock
//state)
typedef struct picture_s {
//-- sequence header stuff --
uint8_t intra_quantizer_matrix [64];
uint8_t non_intra_quantizer_matrix [64];
//The width and height of the picture snapped to macroblock units
int coded_picture_width;
int coded_picture_height;
//-- picture header stuff --
//what type of picture this is (I,P,or B) D from MPEG-1 isn't supported
int picture_coding_type;
//-- picture coding extension stuff --
//quantization factor for motion vectors
int f_code[2][2];
//quantization factor for intra dc coefficients
int intra_dc_precision;
//top/bottom/both fields
int picture_structure;
//bool to indicate all predictions are frame based
int frame_pred_frame_dct;
//bool to indicate whether intra blocks have motion vectors
// (for concealment)
int concealment_motion_vectors;
//bit to indicate which quantization table to use
int q_scale_type;
//bool to use different vlc tables
int intra_vlc_format;
//last macroblock in the picture
int last_mba;
//width of picture in macroblocks
int mb_width;
//stuff derived from bitstream
//pointer to the zigzag scan we're supposed to be using
uint8_t * scan;
//Pointer to the current planar frame buffer (Y,Cr,CB)
uint8_t * current_frame[3];
//storage for reference frames plus a b-frame
uint8_t * forward_reference_frame[3];
uint8_t * backward_reference_frame[3];
uint8_t * throwaway_frame[3];
uint8_t * pp_frame[3]; // postprocess
//uint8_t * throwaway_frame;
int pp_options; // postprocess
int second_field;
// MPEG1 - testing
uint8_t mpeg1;
//these things are not needed by the decoder
//NOTICE : this is a temporary interface, we will build a better one later.
int aspect_ratio_information;
int frame_rate_code;
int progressive_sequence;
int top_field_first; // this one is actually used for DMV MC
int repeat_first_field;
int progressive_frame;
// added by A'rpi/ESP-team:
int repeat_count;
int bitrate;
int frame_rate;
int display_picture_width;
int display_picture_height;
} picture_t;
typedef struct motion_s {
uint8_t * ref[2][3];
int pmv[2][2];
int f_code[2];
} motion_t;
// state that is carried from one macroblock to the next inside of a same slice
typedef struct slice_s {
// bit parsing stuff
uint32_t bitstream_buf; // current 32 bit working set of buffer
int bitstream_bits; // used bits in working set
uint8_t * bitstream_ptr; // buffer with stream data
//Motion vectors
//The f_ and b_ correspond to the forward and backward motion
//predictors
motion_t b_motion;
motion_t f_motion;
// predictor for DC coefficients in intra blocks
int16_t dc_dct_pred[3];
uint16_t quantizer_scale; // remove
} slice_t;
typedef struct mpeg2_config_s {
//Bit flags that enable various things
uint32_t flags;
} mpeg2_config_t;
//The only global variable,
//the config struct
extern mpeg2_config_t config;
// slice.c
void header_state_init (picture_t * picture);
int header_process_picture_header (picture_t * picture, uint8_t * buffer);
int header_process_sequence_header (picture_t * picture, uint8_t * buffer);
int header_process_extension (picture_t * picture, uint8_t * buffer);
// idct.c
void idct_init (void);
// idct_mlib.c
void idct_block_copy_mlib (int16_t * block, uint8_t * dest, int stride);
void idct_block_add_mlib (int16_t * block, uint8_t * dest, int stride);
// idct_mmx.c
void idct_block_copy_mmxext (int16_t *block, uint8_t * dest, int stride);
void idct_block_add_mmxext (int16_t *block, uint8_t * dest, int stride);
void idct_block_copy_mmx (int16_t *block, uint8_t * dest, int stride);
void idct_block_add_mmx (int16_t *block, uint8_t * dest, int stride);
void idct_mmx_init (void);
// motion_comp.c
void motion_comp_init (void);
typedef struct mc_functions_s
{
void (* put [8]) (uint8_t *dst, uint8_t *, int32_t, int32_t);
void (* avg [8]) (uint8_t *dst, uint8_t *, int32_t, int32_t);
} mc_functions_t;
#define MOTION_COMP_EXTERN(x) mc_functions_t mc_functions_##x = \
{ \
{MC_put_16_##x, MC_put_x16_##x, MC_put_y16_##x, MC_put_xy16_##x, \
MC_put_8_##x, MC_put_x8_##x, MC_put_y8_##x, MC_put_xy8_##x}, \
{MC_avg_16_##x, MC_avg_x16_##x, MC_avg_y16_##x, MC_avg_xy16_##x, \
MC_avg_8_##x, MC_avg_x8_##x, MC_avg_y8_##x, MC_avg_xy8_##x} \
};
extern mc_functions_t mc_functions_c;
extern mc_functions_t mc_functions_mmx;
extern mc_functions_t mc_functions_mmxext;
extern mc_functions_t mc_functions_3dnow;
extern mc_functions_t mc_functions_mlib;
// slice.c
int slice_process (picture_t *picture, uint8_t code, uint8_t * buffer);
// stats.c
void stats_header (uint8_t code, uint8_t * buffer);
#define MBC 45
#define MBR 36
extern int quant_store[MBR+1][MBC+1]; // [Review]