diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/avcodec.h')
-rw-r--r-- | src/libffmpeg/libavcodec/avcodec.h | 293 |
1 files changed, 269 insertions, 24 deletions
diff --git a/src/libffmpeg/libavcodec/avcodec.h b/src/libffmpeg/libavcodec/avcodec.h index 05b27d8c2..68b67154d 100644 --- a/src/libffmpeg/libavcodec/avcodec.h +++ b/src/libffmpeg/libavcodec/avcodec.h @@ -3,6 +3,11 @@ #include "common.h" +#define LIBAVCODEC_VERSION_INT 0x000406 +#define LIBAVCODEC_VERSION "0.4.6" +#define LIBAVCODEC_BUILD 4614 +#define LIBAVCODEC_BUILD_STR "4614" + enum CodecID { CODEC_ID_NONE, CODEC_ID_MPEG1VIDEO, @@ -17,18 +22,31 @@ enum CodecID { CODEC_ID_MSMPEG4V1, CODEC_ID_MSMPEG4V2, CODEC_ID_MSMPEG4V3, + CODEC_ID_WMV1, + CODEC_ID_WMV2, CODEC_ID_H263P, CODEC_ID_H263I, + /* various pcm "codecs" */ + CODEC_ID_PCM_S16LE, + CODEC_ID_PCM_S16BE, + CODEC_ID_PCM_U16LE, + CODEC_ID_PCM_U16BE, + CODEC_ID_PCM_S8, + CODEC_ID_PCM_U8, + CODEC_ID_PCM_MULAW, + CODEC_ID_PCM_ALAW, }; #define CODEC_ID_MSMPEG4 CODEC_ID_MSMPEG4V3 enum CodecType { + CODEC_TYPE_UNKNOWN = -1, CODEC_TYPE_VIDEO, CODEC_TYPE_AUDIO, }; enum PixelFormat { + PIX_FMT_ANY = -1, PIX_FMT_YUV420P, PIX_FMT_YUV422, PIX_FMT_RGB24, @@ -45,14 +63,24 @@ enum SampleFormat { /* in bytes */ #define AVCODEC_MAX_AUDIO_FRAME_SIZE 18432 -/* motion estimation type */ +/* motion estimation type, EPZS by default */ +enum Motion_Est_ID { + ME_ZERO = 1, + ME_FULL, + ME_LOG, + ME_PHODS, + ME_EPZS, + ME_X1 +}; + +/* only for ME compatiblity with old apps */ extern int motion_estimation_method; -#define ME_ZERO 0 -#define ME_FULL 1 -#define ME_LOG 2 -#define ME_PHODS 3 -#define ME_EPZS 4 -#define ME_X1 5 + +/* ME algos sorted by quality */ +static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG, + ME_X1, ME_EPZS, ME_FULL }; + +#define FF_MAX_B_FRAMES 4 /* encoding support */ /* note not everything is supported yet */ @@ -60,10 +88,17 @@ extern int motion_estimation_method; #define CODEC_FLAG_HQ 0x0001 /* high quality (non real time) encoding */ #define CODEC_FLAG_QSCALE 0x0002 /* use fixed qscale */ #define CODEC_FLAG_4MV 0x0004 /* 4 MV per MB allowed */ -#define CODEC_FLAG_B 0x0008 /* use B frames */ #define CODEC_FLAG_QPEL 0x0010 /* use qpel MC */ #define CODEC_FLAG_GMC 0x0020 /* use GMC */ #define CODEC_FLAG_TYPE 0x0040 /* fixed I/P frame type, from avctx->key_frame */ +#define CODEC_FLAG_PART 0x0080 /* use data partitioning */ +/* parent program gurantees that the input for b-frame containing streams is not written to + for at least s->max_b_frames+1 frames, if this is not set than the input will be copied */ +#define CODEC_FLAG_INPUT_PRESERVED 0x0100 +#define CODEC_FLAG_PASS1 0x0200 /* use internal 2pass ratecontrol in first pass mode */ +#define CODEC_FLAG_PASS2 0x0400 /* use internal 2pass ratecontrol in second pass mode */ +#define CODEC_FLAG_EXTERN_HUFF 0x1000 /* use external huffman table (for mjpeg) */ +#define CODEC_FLAG_GRAY 0x2000 /* only decode/encode grayscale */ /* codec capabilities */ @@ -78,6 +113,15 @@ typedef struct AVCodecContext { int flags; int sub_id; /* some codecs needs additionnal format info. It is stored there */ + + int me_method; /* ME algorithm used for video coding */ + + /* extra data from parent application to codec, e.g. huffman table + for mjpeg */ + /* the parent should allocate and free this buffer */ + void *extradata; + int extradata_size; + /* video only */ int frame_rate; /* frames per sec multiplied by FRAME_RATE_BASE */ int width, height; @@ -88,8 +132,10 @@ typedef struct AVCodecContext { #define FF_ASPECT_16_9_625 4 #define FF_ASPECT_16_9_525 5 int gop_size; /* 0 = intra only */ - int pix_fmt; /* pixel format, see PIX_FMT_xxx */ - + enum PixelFormat pix_fmt; /* pixel format, see PIX_FMT_xxx */ + int repeat_pict; /* when decoding, this signal how much the picture */ + /* must be delayed. */ + /* extra_delay = (repeat_pict / 2) * (1/fps) */ /* if non NULL, 'draw_horiz_band' is called by the libavcodec decoder to draw an horizontal band. It improve cache usage. Not all codecs can do that. You must check the codec capabilities @@ -104,23 +150,48 @@ typedef struct AVCodecContext { int sample_fmt; /* sample format, currenly unused */ /* the following data should not be initialized */ - int frame_size; /* in samples, initialized when calling 'init' */ - int frame_number; /* audio or video frame number */ - int key_frame; /* true if the previous compressed frame was - a key frame (intra, or seekable) */ + int frame_size; /* in samples, initialized when calling 'init' */ + int frame_number; /* audio or video frame number */ + int real_pict_num; /* returns the real picture number of + previous encoded frame */ + int key_frame; /* true if the previous compressed frame was + a key frame (intra, or seekable) */ + int pict_type; /* picture type of the previous + encoded frame */ +/* FIXME: these should have FF_ */ +#define I_TYPE 1 // Intra +#define P_TYPE 2 // Predicted +#define B_TYPE 3 // Bi-dir predicted +#define S_TYPE 4 // S(GMC)-VOP MPEG4 + + int delay; /* number of frames the decoded output + will be delayed relative to the encoded input */ + uint8_t *mbskip_table; /* =1 if MB didnt change, is only valid for I/P frames + stride= mb_width = (width+15)>>4 */ + + /* encoding parameters */ int quality; /* quality of the previous encoded frame - (between 1 (good) and 31 (bad)) */ + (between 1 (good) and 31 (bad)) + this is allso used to set the quality in vbr mode + and the per frame quality in CODEC_FLAG_TYPE (second pass mode) */ float qcompress; /* amount of qscale change between easy & hard scenes (0.0-1.0)*/ float qblur; /* amount of qscale smoothing over time (0.0-1.0) */ int qmin; /* min qscale */ int qmax; /* max qscale */ int max_qdiff; /* max qscale difference between frames */ + int max_b_frames; /* maximum b frames, the output will be delayed by max_b_frames+1 relative to the input */ + float b_quant_factor;/* qscale factor between ips and b frames */ + int rc_strategy; + int b_frame_strategy; + + int hurry_up; /* when set to 1 during decoding, b frames will be skiped + when set to 2 idct/dequant will be skipped too */ struct AVCodec *codec; void *priv_data; /* The following data is for RTP friendly coding */ - /* By now only H.263/H.263+ coder honours this */ + /* By now only H.263/H.263+/MPEG4 coder honours this */ int rtp_mode; /* 1 for activate RTP friendly-mode */ /* highers numbers represent more error-prone */ /* enviroments, by now just "1" exist */ @@ -145,7 +216,7 @@ typedef struct AVCodecContext { float psnr_y; float psnr_cb; float psnr_cr; - + /* statistics, used for 2-pass encoding */ int mv_bits; int header_bits; @@ -156,13 +227,57 @@ typedef struct AVCodecContext { int skip_count; int misc_bits; // cbp, mb_type int frame_bits; - + /* the following fields are ignored */ void *opaque; /* can be used to carry app specific stuff */ char codec_name[32]; - int codec_type; /* see CODEC_TYPE_xxx */ - int codec_id; /* see CODEC_ID_xxx */ + enum CodecType codec_type; /* see CODEC_TYPE_xxx */ + enum CodecID codec_id; /* see CODEC_ID_xxx */ unsigned int codec_tag; /* codec tag, only used if unknown codec */ + + int workaround_bugs; /* workaround bugs in encoders which cannot be detected automatically */ + int luma_elim_threshold; + int chroma_elim_threshold; + int strict_std_compliance; /* strictly follow the std (MPEG4, ...) */ + float b_quant_offset;/* qscale offset between ips and b frames, not implemented yet */ + int error_resilience; + +#ifndef MBC +#define MBC 128 +#define MBR 96 +#endif + int *quant_store; /* field for communicating with external postprocessing */ + unsigned qstride; + //FIXME this should be reordered after kabis API is finished ... + /* + Note: Below are located reserved fields for further usage + It requires for ABI !!! + If you'll perform some changes then borrow new space from these fields + (void * can be safety replaced with struct * ;) + P L E A S E ! ! ! + IMPORTANT: Never change order of already declared fields!!! + */ + unsigned long long int + ull_res0,ull_res1,ull_res2,ull_res3,ull_res4,ull_res5, + ull_res6,ull_res7,ull_res8,ull_res9,ull_res10,ull_res11,ull_res12; + float + flt_res0,flt_res1,flt_res2,flt_res3,flt_res4,flt_res5, + flt_res6,flt_res7,flt_res8,flt_res9,flt_res10,flt_res11; + void + *ptr_res0,*ptr_res1,*ptr_res2,*ptr_res3,*ptr_res4,*ptr_res5, + *ptr_res6,*ptr_res7,*ptr_res8,*ptr_res9,*ptr_res10,*ptr_res11; + unsigned long int + ul_res0,ul_res1,ul_res2,ul_res3,ul_res4,ul_res5, + ul_res6,ul_res7,ul_res8,ul_res9,ul_res10,ul_res11,ul_res12; + unsigned int + ui_res0,ui_res1,ui_res2,ui_res3,ui_res4,ui_res5, + ui_res6; + unsigned short int + us_res0,us_res1,us_res2,us_res3,us_res4,us_res5, + us_res6,us_res7,us_res8,us_res9,us_res10,us_res11,us_res12; + unsigned char + uc_res0,uc_res1,uc_res2,uc_res3,uc_res4,uc_res5, + uc_res6,uc_res7,uc_res8,uc_res9,uc_res10,uc_res11,uc_res12; } AVCodecContext; typedef struct AVCodec { @@ -177,6 +292,23 @@ typedef struct AVCodec { UINT8 *buf, int buf_size); int capabilities; struct AVCodec *next; + /* + Note: Below are located reserved fields for further usage + It requires for ABI !!! + If you'll perform some changes then borrow new space from these fields + (void * can be safety replaced with struct * ;) + P L E A S E ! ! ! + IMPORTANT: Never change order of already declared fields!!! + */ + unsigned long long int + ull_res0,ull_res1,ull_res2,ull_res3,ull_res4,ull_res5, + ull_res6,ull_res7,ull_res8,ull_res9,ull_res10,ull_res11,ull_res12; + float + flt_res0,flt_res1,flt_res2,flt_res3,flt_res4,flt_res5, + flt_res6,flt_res7,flt_res8,flt_res9,flt_res10,flt_res11,flt_res12; + void + *ptr_res0,*ptr_res1,*ptr_res2,*ptr_res3,*ptr_res4,*ptr_res5, + *ptr_res6,*ptr_res7,*ptr_res8,*ptr_res9,*ptr_res10,*ptr_res11,*ptr_res12; } AVCodec; /* three components are given, that's all */ @@ -185,15 +317,47 @@ typedef struct AVPicture { int linesize[3]; } AVPicture; +extern AVCodec ac3_encoder; +extern AVCodec mp2_encoder; +extern AVCodec mp3lame_encoder; +extern AVCodec mpeg1video_encoder; +extern AVCodec h263_encoder; +extern AVCodec h263p_encoder; +extern AVCodec rv10_encoder; +extern AVCodec mjpeg_encoder; +extern AVCodec mpeg4_encoder; +extern AVCodec msmpeg4v1_encoder; +extern AVCodec msmpeg4v2_encoder; +extern AVCodec msmpeg4v3_encoder; + extern AVCodec h263_decoder; extern AVCodec mpeg4_decoder; extern AVCodec msmpeg4v1_decoder; extern AVCodec msmpeg4v2_decoder; extern AVCodec msmpeg4v3_decoder; +extern AVCodec wmv1_decoder; extern AVCodec mpeg_decoder; extern AVCodec h263i_decoder; extern AVCodec rv10_decoder; extern AVCodec mjpeg_decoder; +extern AVCodec mp2_decoder; +extern AVCodec mp3_decoder; + +/* pcm codecs */ +#define PCM_CODEC(id, name) \ +extern AVCodec name ## _decoder; \ +extern AVCodec name ## _encoder; + +PCM_CODEC(CODEC_ID_PCM_S16LE, pcm_s16le); +PCM_CODEC(CODEC_ID_PCM_S16BE, pcm_s16be); +PCM_CODEC(CODEC_ID_PCM_U16LE, pcm_u16le); +PCM_CODEC(CODEC_ID_PCM_U16BE, pcm_u16be); +PCM_CODEC(CODEC_ID_PCM_S8, pcm_s8); +PCM_CODEC(CODEC_ID_PCM_U8, pcm_u8); +PCM_CODEC(CODEC_ID_PCM_ALAW, pcm_alaw); +PCM_CODEC(CODEC_ID_PCM_MULAW, pcm_mulaw); + +#undef PCM_CODEC /* dummy raw video codec */ extern AVCodec rawvideo_codec; @@ -242,8 +406,14 @@ int avpicture_deinterlace(AVPicture *dst, AVPicture *src, extern AVCodec *first_avcodec; +/* returns LIBAVCODEC_VERSION_INT constant */ +unsigned avcodec_version(void); +/* returns LIBAVCODEC_BUILD constant */ +unsigned avcodec_build(void); void avcodec_init(void); +void avcodec_set_bit_exact(void); + void register_avcodec(AVCodec *format); AVCodec *avcodec_find_encoder(enum CodecID id); AVCodec *avcodec_find_encoder_by_name(const char *name); @@ -267,12 +437,87 @@ int avcodec_close(AVCodecContext *avctx); void avcodec_register_all(void); +void avcodec_flush_buffers(AVCodecContext *avctx); + #ifdef FF_POSTPROCESS -#ifndef MBC -#define MBC 48 -#define MBR 36 -#endif extern int quant_store[MBR+1][MBC+1]; // [Review] #endif + +/** + * Interface for 0.5.0 version + * + * do not even think about it's usage for this moment + */ + +typedef struct { + // compressed size used from given memory buffer + int size; + /// I/P/B frame type + int frame_type; +} avc_enc_result_t; + +/** + * Commands + * order can't be changed - once it was defined + */ +typedef enum { + // general commands + AVC_OPEN_BY_NAME = 0xACA000, + AVC_OPEN_BY_CODEC_ID, + AVC_OPEN_BY_FOURCC, + AVC_CLOSE, + + AVC_FLUSH, + // pin - struct { uint8_t* src, uint_t src_size } + // pout - struct { AVPicture* img, consumed_bytes, + AVC_DECODE, + // pin - struct { AVPicture* img, uint8_t* dest, uint_t dest_size } + // pout - uint_t used_from_dest_size + AVC_ENCODE, + + // query/get video commands + AVC_GET_VERSION = 0xACB000, + AVC_GET_WIDTH, + AVC_GET_HEIGHT, + AVC_GET_DELAY, + AVC_GET_QUANT_TABLE, + // ... + + // query/get audio commands + AVC_GET_FRAME_SIZE = 0xABC000, + + // maybe define some simple structure which + // might be passed to the user - but they can't + // contain any codec specific parts and these + // calls are usualy necessary only few times + + // set video commands + AVC_SET_WIDTH = 0xACD000, + AVC_SET_HEIGHT, + + // set video encoding commands + AVC_SET_FRAME_RATE = 0xACD800, + AVC_SET_QUALITY, + AVC_SET_HURRY_UP, + + // set audio commands + AVC_SET_SAMPLE_RATE = 0xACE000, + AVC_SET_CHANNELS, + +} avc_cmd_t; + +/** + * \param handle allocated private structure by libavcodec + * for initialization pass NULL - will be returned pout + * user is supposed to know nothing about its structure + * \param cmd type of operation to be performed + * \param pint input parameter + * \param pout output parameter + * + * \returns command status - eventually for query command it might return + * integer resulting value + */ +int avcodec(void* handle, avc_cmd_t cmd, void* pin, void* pout); + #endif /* AVCODEC_H */ |