X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpegvideo.h;h=aaffb86ef028bc7dec9932f46cb3e044d0a740f7;hb=90d30402b41a557e726fbb79f0fc7d6fac237eee;hp=b1c2f9373186c16c87c26fbd95303b2895bc1651;hpb=00f0564f4439f060c7ad38760078c4e9eb879257;p=ffmpeg diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index b1c2f937318..aaffb86ef02 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -32,6 +32,8 @@ #include "bitstream.h" #include "ratecontrol.h" #include "parser.h" +#include "mpeg12data.h" +#include "rl.h" #define FRAME_SKIPPED 100 ///< return value for header parsers if frame is not coded @@ -43,8 +45,6 @@ enum OutputFormat { FMT_H264, }; -#define EDGE_WIDTH 16 - #define MPEG_BUF_SIZE (16 * 1024) #define QMAT_SHIFT_MMX 16 @@ -61,17 +61,6 @@ enum OutputFormat { #define ME_MAP_SHIFT 3 #define ME_MAP_MV_BITS 11 -/* run length table */ -#define MAX_RUN 64 -#define MAX_LEVEL 64 - -#define I_TYPE FF_I_TYPE ///< Intra -#define P_TYPE FF_P_TYPE ///< Predicted -#define B_TYPE FF_B_TYPE ///< Bi-dir predicted -#define S_TYPE FF_S_TYPE ///< S(GMC)-VOP MPEG4 -#define SI_TYPE FF_SI_TYPE ///< Switching Intra -#define SP_TYPE FF_SP_TYPE ///< Switching Predicted - #define MAX_MB_BYTES (30*16*16*3/8 + 120) #define INPLACE_OFFSET 16 @@ -86,19 +75,6 @@ enum OutputFormat { #define EXT_START_CODE 0x000001b5 #define USER_START_CODE 0x000001b2 -/** - * Scantable. - */ -typedef struct ScanTable{ - const uint8_t *scantable; - uint8_t permutated[64]; - uint8_t raster_end[64]; -#ifdef ARCH_POWERPC - /** Used by dct_quantise_alitvec to find last-non-zero */ - DECLARE_ALIGNED_8(uint8_t, inverse[64]); -#endif -} ScanTable; - /** * Picture. */ @@ -111,7 +87,7 @@ typedef struct Picture{ uint8_t *interpolated[3]; int16_t (*motion_val_base[2])[2]; uint32_t *mb_type_base; -#define MB_TYPE_INTRA MB_TYPE_INTRA4x4 //default mb_type if theres just one type +#define MB_TYPE_INTRA MB_TYPE_INTRA4x4 //default mb_type if there is just one type #define IS_INTRA4x4(a) ((a)&MB_TYPE_INTRA4x4) #define IS_INTRA16x16(a) ((a)&MB_TYPE_INTRA16x16) #define IS_PCM(a) ((a)&MB_TYPE_INTRA_PCM) @@ -138,11 +114,13 @@ typedef struct Picture{ int field_poc[2]; ///< h264 top/bottom POC int poc; ///< h264 frame POC - int frame_num; ///< h264 frame_num - int pic_id; ///< h264 pic_num or long_term_pic_idx + int frame_num; ///< h264 frame_num (raw frame_num from slice header) + int pic_id; /**< h264 pic_num (short -> no wrap version of pic_num, + pic_num & max_pic_num; long -> long_pic_num) */ int long_ref; ///< 1->long term reference 0->short term reference - int ref_poc[2][16]; ///< h264 POCs of the frames used as reference - int ref_count[2]; ///< number of entries in ref_poc + int ref_poc[2][2][16]; ///< h264 POCs of the frames used as reference (FIXME need per slice) + int ref_count[2][2]; ///< number of entries in ref_poc (FIXME need per slice) + int mbaff; ///< h264 1 -> MBAFF frame 0-> not MBAFF int mb_var_sum; ///< sum of MB variance for current frame int mc_mb_var_sum; ///< motion compensated MB variance for current frame @@ -332,7 +310,7 @@ typedef struct MpegEncContext { int *lambda_table; int adaptive_quant; ///< use adaptive quantization int dquant; ///< qscale difference to prev qscale - int pict_type; ///< I_TYPE, P_TYPE, B_TYPE, ... + int pict_type; ///< FF_I_TYPE, FF_P_TYPE, FF_B_TYPE, ... int last_pict_type; //FIXME removes int last_non_b_pict_type; ///< used for mpeg4 gmc b-frames & ratecontrol int dropable; @@ -368,8 +346,8 @@ typedef struct MpegEncContext { uint8_t (*b_field_select_table[2][2]); int me_method; ///< ME algorithm int mv_dir; -#define MV_DIR_BACKWARD 1 -#define MV_DIR_FORWARD 2 +#define MV_DIR_FORWARD 1 +#define MV_DIR_BACKWARD 2 #define MV_DIRECT 4 ///< bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4) int mv_type; #define MV_TYPE_16X16 0 ///< 1 vector for the whole mb @@ -502,7 +480,7 @@ typedef struct MpegEncContext { GetBitContext last_resync_gb; ///< used to search for the next resync marker int mb_num_left; ///< number of MBs left in this video packet (for partitioned Slices only) int next_p_frame_damaged; ///< set if the next p frame is damaged, to avoid showing trashed b frames - int error_resilience; + int error_recognition; ParseContext parse_context; @@ -698,30 +676,14 @@ void MPV_frame_end(MpegEncContext *s); int MPV_encode_init(AVCodecContext *avctx); int MPV_encode_end(AVCodecContext *avctx); int MPV_encode_picture(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data); -#ifdef HAVE_MMX void MPV_common_init_mmx(MpegEncContext *s); -#endif -#ifdef ARCH_ALPHA void MPV_common_init_axp(MpegEncContext *s); -#endif -#ifdef HAVE_MLIB void MPV_common_init_mlib(MpegEncContext *s); -#endif -#ifdef HAVE_MMI void MPV_common_init_mmi(MpegEncContext *s); -#endif -#ifdef ARCH_ARMV4L void MPV_common_init_armv4l(MpegEncContext *s); -#endif -#ifdef ARCH_POWERPC -void MPV_common_init_ppc(MpegEncContext *s); -#endif -extern void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w); +void MPV_common_init_altivec(MpegEncContext *s); void ff_clean_intra_table_entries(MpegEncContext *s); -void ff_init_scantable(uint8_t *, ScanTable *st, const uint8_t *src_scantable); void ff_draw_horiz_band(MpegEncContext *s, int y, int h); -void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h, - int src_x, int src_y, int w, int h); void ff_mpeg_flush(AVCodecContext *avctx); void ff_print_debug_info(MpegEncContext *s, AVFrame *pict); void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix); @@ -734,10 +696,12 @@ void ff_er_frame_start(MpegEncContext *s); void ff_er_frame_end(MpegEncContext *s); void ff_er_add_slice(MpegEncContext *s, int startx, int starty, int endx, int endy, int status); - -extern enum PixelFormat ff_yuv420p_list[2]; +int ff_dct_common_init(MpegEncContext *s); +void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64], + const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra); void ff_init_block_index(MpegEncContext *s); +void ff_copy_picture(Picture *dst, Picture *src); static inline void ff_update_block_index(MpegEncContext *s){ const int block_size= 8>>s->avctx->lowres; @@ -765,14 +729,9 @@ static inline int get_bits_diff(MpegEncContext *s){ static inline int ff_h263_round_chroma(int x){ static const uint8_t h263_chroma_roundtab[16] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, }; - if (x >= 0) - return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1)); - else { - x = -x; - return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1)); - } + return h263_chroma_roundtab[x & 0xf] + (x >> 3); } /* motion_est.c */ @@ -784,19 +743,16 @@ int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type); void ff_fix_long_p_mvs(MpegEncContext * s); void ff_fix_long_mvs(MpegEncContext * s, uint8_t *field_select_table, int field_select, int16_t (*mv_table)[2], int f_code, int type, int truncate); -void ff_init_me(MpegEncContext *s); +int ff_init_me(MpegEncContext *s); int ff_pre_estimate_p_frame_motion(MpegEncContext * s, int mb_x, int mb_y); -inline int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, +int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr, int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2], int ref_mv_scale, int size, int h); -inline int ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, +int ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index, int ref_index, int size, int h, int add_rate); /* mpeg12.c */ -extern const uint16_t ff_mpeg1_default_intra_matrix[64]; -extern const uint16_t ff_mpeg1_default_non_intra_matrix[64]; extern const uint8_t ff_mpeg1_dc_scale_table[128]; -extern const AVRational ff_frame_rate_tab[]; void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number); void mpeg1_encode_mb(MpegEncContext *s, @@ -807,8 +763,6 @@ void ff_mpeg1_encode_slice_header(MpegEncContext *s); void ff_mpeg1_clean_buffers(MpegEncContext *s); int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size); -#include "rl.h" - extern const uint8_t ff_mpeg4_y_dc_scale_table[32]; extern const uint8_t ff_mpeg4_c_dc_scale_table[32]; extern const uint8_t ff_aic_dc_scale_table[32]; @@ -832,7 +786,7 @@ int ff_h261_get_picture_format(int width, int height); int ff_h263_decode_init(AVCodecContext *avctx); int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - uint8_t *buf, int buf_size); + const uint8_t *buf, int buf_size); int ff_h263_decode_end(AVCodecContext *avctx); void h263_encode_mb(MpegEncContext *s, DCTELEM block[6][64], @@ -849,11 +803,7 @@ void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, int dir); void ff_set_mpeg4_time(MpegEncContext * s); void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number); -#ifdef CONFIG_ENCODERS void h263_encode_init(MpegEncContext *s); -#else -static void h263_encode_init(MpegEncContext *s) {assert(0);} -#endif void h263_decode_init_vlc(MpegEncContext *s); int h263_decode_picture_header(MpegEncContext *s); int ff_h263_decode_gob_header(MpegEncContext *s);