mpegvideo.h
Go to the documentation of this file.
1 /*
2  * Generic DCT based hybrid video encoder
3  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4  * Copyright (c) 2002-2004 Michael Niedermayer
5  *
6  * This file is part of Libav.
7  *
8  * Libav is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * Libav is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with Libav; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
28 #ifndef AVCODEC_MPEGVIDEO_H
29 #define AVCODEC_MPEGVIDEO_H
30 
31 #include "avcodec.h"
32 #include "dsputil.h"
33 #include "get_bits.h"
34 #include "put_bits.h"
35 #include "ratecontrol.h"
36 #include "parser.h"
37 #include "mpeg12data.h"
38 #include "rl.h"
39 #include "videodsp.h"
40 
41 #include "libavutil/opt.h"
42 
43 #define FRAME_SKIPPED 100
44 
51 };
52 
53 #define MPEG_BUF_SIZE (16 * 1024)
54 
55 #define QMAT_SHIFT_MMX 16
56 #define QMAT_SHIFT 22
57 
58 #define MAX_FCODE 7
59 #define MAX_MV 2048
60 
61 #define MAX_THREADS 16
62 
63 #define MAX_PICTURE_COUNT 32
64 
65 #define ME_MAP_SIZE 64
66 #define ME_MAP_SHIFT 3
67 #define ME_MAP_MV_BITS 11
68 
69 #define MAX_MB_BYTES (30*16*16*3/8 + 120)
70 
71 #define INPLACE_OFFSET 16
72 
73 /* Start codes. */
74 #define SEQ_END_CODE 0x000001b7
75 #define SEQ_START_CODE 0x000001b3
76 #define GOP_START_CODE 0x000001b8
77 #define PICTURE_START_CODE 0x00000100
78 #define SLICE_MIN_START_CODE 0x00000101
79 #define SLICE_MAX_START_CODE 0x000001af
80 #define EXT_START_CODE 0x000001b5
81 #define USER_START_CODE 0x000001b2
82 
87 #define DELAYED_PIC_REF 4
88 
89 struct MpegEncContext;
90 
94 typedef struct Picture{
95  struct AVFrame f;
96 
102  int16_t (*motion_val_base[2])[2];
103  uint32_t *mb_type_base;
104 #define MB_TYPE_INTRA MB_TYPE_INTRA4x4 //default mb_type if there is just one type
105 #define IS_INTRA4x4(a) ((a)&MB_TYPE_INTRA4x4)
106 #define IS_INTRA16x16(a) ((a)&MB_TYPE_INTRA16x16)
107 #define IS_PCM(a) ((a)&MB_TYPE_INTRA_PCM)
108 #define IS_INTRA(a) ((a)&7)
109 #define IS_INTER(a) ((a)&(MB_TYPE_16x16|MB_TYPE_16x8|MB_TYPE_8x16|MB_TYPE_8x8))
110 #define IS_SKIP(a) ((a)&MB_TYPE_SKIP)
111 #define IS_INTRA_PCM(a) ((a)&MB_TYPE_INTRA_PCM)
112 #define IS_INTERLACED(a) ((a)&MB_TYPE_INTERLACED)
113 #define IS_DIRECT(a) ((a)&MB_TYPE_DIRECT2)
114 #define IS_GMC(a) ((a)&MB_TYPE_GMC)
115 #define IS_16X16(a) ((a)&MB_TYPE_16x16)
116 #define IS_16X8(a) ((a)&MB_TYPE_16x8)
117 #define IS_8X16(a) ((a)&MB_TYPE_8x16)
118 #define IS_8X8(a) ((a)&MB_TYPE_8x8)
119 #define IS_SUB_8X8(a) ((a)&MB_TYPE_16x16) //note reused
120 #define IS_SUB_8X4(a) ((a)&MB_TYPE_16x8) //note reused
121 #define IS_SUB_4X8(a) ((a)&MB_TYPE_8x16) //note reused
122 #define IS_SUB_4X4(a) ((a)&MB_TYPE_8x8) //note reused
123 #define IS_ACPRED(a) ((a)&MB_TYPE_ACPRED)
124 #define IS_QUANT(a) ((a)&MB_TYPE_QUANT)
125 #define IS_DIR(a, part, list) ((a) & (MB_TYPE_P0L0<<((part)+2*(list))))
126 #define USES_LIST(a, list) ((a) & ((MB_TYPE_P0L0|MB_TYPE_P1L0)<<(2*(list))))
127 #define HAS_CBP(a) ((a)&MB_TYPE_CBP)
128 
129  int field_poc[2];
130  int poc;
131  int frame_num;
133  int pic_id;
135  int long_ref;
136  int ref_poc[2][2][32];
137  int ref_count[2][2];
138  int mbaff;
140 
143  uint16_t *mb_var;
144  uint16_t *mc_mb_var;
147  int b_frame_score; /* */
150 } Picture;
151 
155 typedef struct MotionEstContext{
157  int skip;
158  int co_located_mv[4][2];
159  int direct_basis_mv[4][2];
165  uint32_t *map;
166  uint32_t *score_map;
167  unsigned map_generation;
176  int flags;
178  int mb_flags;
179  int pre_pass;
180  int dia_size;
181  int xmin;
182  int xmax;
183  int ymin;
184  int ymax;
185  int pred_x;
186  int pred_y;
187  uint8_t *src[4][4];
188  uint8_t *ref[4][4];
189  int stride;
190  int uvstride;
191  /* temp variables for picture complexity calculation */
195 /* cmp, chroma_cmp;*/
203  int *mx_ptr, int *my_ptr, int dmin,
204  int src_index, int ref_index,
205  int size, int h);
207 
211 typedef struct MpegEncContext {
212  AVClass *class;
214  /* the following parameters must be initialized before encoding */
215  int width, height;
216  int gop_size;
218  int bit_rate;
220  int h263_pred;
221  int pb_frame;
222 
223 /* the following codec id fields are deprecated in favor of codec_id */
224  int h263_plus;
225  int h263_flv;
226 
227  enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */
229  int encoding;
230  int flags;
231  int flags2;
237  int codec_tag;
239  /* the following fields are managed internally by the encoder */
240 
241  /* sequence parameters */
245  int picture_number; //FIXME remove, unclear definition
248  int mb_stride;
249  int b8_stride;
250  int b4_stride;
252  int mb_num;
253  int linesize;
258 
260  int ac_pred;
262  int h263_aic;
263 
264  /* scantables */
269 
270  /* WARNING: changes above this line require updates to hardcoded
271  * offsets used in asm. */
272 
274 
277  int64_t dts_delta;
281  int64_t reordered_pts;
282 
285 
287  int end_mb_y;
290 
296 
302 
308 
314 
321  int last_dc[3];
322  int16_t *dc_val_base;
323  int16_t *dc_val[3];
329  int16_t (*ac_val_base)[16];
330  int16_t (*ac_val[3])[16];
341 
342  int qscale;
344  unsigned int lambda;
345  unsigned int lambda2;
348  int dquant;
349  int pict_type;
350  int last_pict_type; //FIXME removes
355  int skipdct;
356 
357  /* motion compensation */
360 
363  int f_code;
364  int b_code;
365  int16_t (*p_mv_table_base)[2];
366  int16_t (*b_forw_mv_table_base)[2];
367  int16_t (*b_back_mv_table_base)[2];
370  int16_t (*b_direct_mv_table_base)[2];
371  int16_t (*p_field_mv_table_base[2][2])[2];
372  int16_t (*b_field_mv_table_base[2][2][2])[2];
373  int16_t (*p_mv_table)[2];
374  int16_t (*b_forw_mv_table)[2];
375  int16_t (*b_back_mv_table)[2];
376  int16_t (*b_bidir_forw_mv_table)[2];
377  int16_t (*b_bidir_back_mv_table)[2];
378  int16_t (*b_direct_mv_table)[2];
379  int16_t (*p_field_mv_table[2][2])[2];
380  int16_t (*b_field_mv_table[2][2][2])[2];
383  int me_method;
384  int mv_dir;
385 #define MV_DIR_FORWARD 1
386 #define MV_DIR_BACKWARD 2
387 #define MV_DIRECT 4
388  int mv_type;
389 #define MV_TYPE_16X16 0
390 #define MV_TYPE_8X8 1
391 #define MV_TYPE_16X8 2
392 #define MV_TYPE_FIELD 3
393 #define MV_TYPE_DMV 4
394 
399  int mv[2][4][2];
400  int field_select[2][2];
401  int last_mv[2][2][2];
403  int16_t direct_scale_mv[2][64];
404 
406 
410  /* macroblock layer */
411  int mb_x, mb_y;
413  int mb_intra;
414  uint16_t *mb_type;
415 #define CANDIDATE_MB_TYPE_INTRA 0x01
416 #define CANDIDATE_MB_TYPE_INTER 0x02
417 #define CANDIDATE_MB_TYPE_INTER4V 0x04
418 #define CANDIDATE_MB_TYPE_SKIPPED 0x08
419 //#define MB_TYPE_GMC 0x10
420 
421 #define CANDIDATE_MB_TYPE_DIRECT 0x10
422 #define CANDIDATE_MB_TYPE_FORWARD 0x20
423 #define CANDIDATE_MB_TYPE_BACKWARD 0x40
424 #define CANDIDATE_MB_TYPE_BIDIR 0x80
425 
426 #define CANDIDATE_MB_TYPE_INTER_I 0x100
427 #define CANDIDATE_MB_TYPE_FORWARD_I 0x200
428 #define CANDIDATE_MB_TYPE_BACKWARD_I 0x400
429 #define CANDIDATE_MB_TYPE_BIDIR_I 0x800
430 
431 #define CANDIDATE_MB_TYPE_DIRECT0 0x1000
432 
433  int block_index[6];
434  int block_wrap[6];
436 
437  int *mb_index2xy;
438 
440  uint16_t intra_matrix[64];
441  uint16_t chroma_intra_matrix[64];
442  uint16_t inter_matrix[64];
443  uint16_t chroma_inter_matrix[64];
444 #define QUANT_BIAS_SHIFT 8
455 #define UNI_AC_ENC_INDEX(run,level) ((run)*128 + (level))
456 
457  int coded_score[8];
458 
460  int (*q_intra_matrix)[64];
461  int (*q_inter_matrix)[64];
463  uint16_t (*q_intra_matrix16)[2][64];
464  uint16_t (*q_inter_matrix16)[2][64];
465 
466  /* noise reduction */
467  int (*dct_error_sum)[64];
468  int dct_count[2];
469  uint16_t (*dct_offset)[64];
470 
471  void *opaque;
472 
473  /* bit rate control */
474  int64_t total_bits;
478 
479  /* statistics, used for 2-pass encoding */
480  int mv_bits;
484  int i_count;
485  int f_count;
486  int b_count;
488  int misc_bits;
489  int last_bits;
490 
491  /* error concealment / resync */
494 #define VP_START 1
495 #define ER_AC_ERROR 2
496 #define ER_DC_ERROR 4
497 #define ER_MV_ERROR 8
498 #define ER_AC_END 16
499 #define ER_DC_END 32
500 #define ER_MV_END 64
501 
502 #define ER_MB_ERROR (ER_AC_ERROR|ER_DC_ERROR|ER_MV_ERROR)
503 #define ER_MB_END (ER_AC_END|ER_DC_END|ER_MV_END)
504 
511 
513 
514  /* H.263 specific */
516  int obmc;
518  int mb_info;
522 
523  /* H.263+ specific */
524  int umvplus;
531 
532  /* mpeg4 specific */
535  int time_base;
536  int64_t time;
538  uint16_t pp_time;
539  uint16_t pb_time;
540  uint16_t pp_field_time;
541  uint16_t pb_field_time;
542  int shape;
551  uint16_t sprite_traj[4][2];
552  int sprite_offset[2][2];
553  int sprite_delta[2][2];
554  int sprite_shift[2];
555  int mcsel;
561  int new_pred;
563  int aspect_ratio_info; //FIXME remove
568  int rvlc;
570  int low_delay;
571  int vo_type;
578  int t_frame;
583 
584  /* divx specific, used to workaround (many) bugs in divx5 */
588  uint8_t *bitstream_buffer; //Divx 5.01 puts several frames in a single one, this is used to reorder them
591 
593 
594  /* lavc specific stuff, used to workaround bugs in libavcodec */
596 
597  /* RV10 specific */
601 
602  /* MJPEG specific */
604  int mjpeg_vsample[3];
605  int mjpeg_hsample[3];
606 
607  /* MSMPEG4 specific */
621  int (*ac_stats)[2][MAX_LEVEL+1][MAX_RUN+1][2];
623  int mspel;
624 
625  /* decompression specific */
627 
628  /* Mpeg1 specific */
633 
634  /* MPEG-2-specific - I wished not to have to support this mess. */
636  int mpeg_f_code[2][2];
638 /* picture type */
639 #define PICT_TOP_FIELD 1
640 #define PICT_BOTTOM_FIELD 2
641 #define PICT_FRAME 3
642 
653 #define CHROMA_420 1
654 #define CHROMA_422 2
655 #define CHROMA_444 3
656  int chroma_x_shift;//depend on pix_format, that depend on chroma_format
658 
660  int full_pel[2];
666 
667  /* RTP specific */
668  int rtp_mode;
669 
671  int swap_uv; //vcr2 codec is an MPEG-2 variant with U and V swapped
672  DCTELEM (*pblocks[12])[64];
673 
674  DCTELEM (*block)[64];
675  DCTELEM (*blocks)[8][64]; // for HQ mode we need to keep the best block
676  int (*decode_mb)(struct MpegEncContext *s, DCTELEM block[6][64]); // used by some codecs to avoid a switch()
677 #define SLICE_OK 0
678 #define SLICE_ERROR -1
679 #define SLICE_END -2
680 #define SLICE_NOEND -3
681 
683  DCTELEM *block/*align 16*/, int n, int qscale);
685  DCTELEM *block/*align 16*/, int n, int qscale);
687  DCTELEM *block/*align 16*/, int n, int qscale);
689  DCTELEM *block/*align 16*/, int n, int qscale);
691  DCTELEM *block/*align 16*/, int n, int qscale);
693  DCTELEM *block/*align 16*/, int n, int qscale);
695  DCTELEM *block/*align 16*/, int n, int qscale);
697  DCTELEM *block/*align 16*/, int n, int qscale);
698  void (*dct_unquantize_intra)(struct MpegEncContext *s, // unquantizer to use (mpeg4 can use both)
699  DCTELEM *block/*align 16*/, int n, int qscale);
700  void (*dct_unquantize_inter)(struct MpegEncContext *s, // unquantizer to use (mpeg4 can use both)
701  DCTELEM *block/*align 16*/, int n, int qscale);
702  int (*dct_quantize)(struct MpegEncContext *s, DCTELEM *block/*align 16*/, int n, int qscale, int *overflow);
703  int (*fast_dct_quantize)(struct MpegEncContext *s, DCTELEM *block/*align 16*/, int n, int qscale, int *overflow);
705 
706  int mpv_flags;
708 
709  /* error resilience stuff */
711 
712  /* temp buffers for rate control */
713  float *cplx_tab, *bits_tab;
714 
715  /* flag to indicate a reinitialization is required, e.g. after
716  * a frame size change */
719 
720 #define REBASE_PICTURE(pic, new_ctx, old_ctx) (pic ? \
721  (pic >= old_ctx->picture && pic < old_ctx->picture+old_ctx->picture_count ?\
722  &new_ctx->picture[pic - old_ctx->picture] : (Picture*) ((uint8_t*)pic - (uint8_t*)old_ctx + (uint8_t*)new_ctx))\
723  : NULL)
724 
725 /* mpegvideo_enc common options */
726 #define FF_MPV_FLAG_SKIP_RD 0x0001
727 #define FF_MPV_FLAG_STRICT_GOP 0x0002
728 #define FF_MPV_FLAG_QP_RD 0x0004
729 #define FF_MPV_FLAG_CBP_RD 0x0008
730 
731 #define FF_MPV_OFFSET(x) offsetof(MpegEncContext, x)
732 #define FF_MPV_OPT_FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
733 #define FF_MPV_COMMON_OPTS \
734 { "mpv_flags", "Flags common for all mpegvideo-based encoders.", FF_MPV_OFFSET(mpv_flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "mpv_flags" },\
735 { "skip_rd", "RD optimal MB level residual skipping", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_SKIP_RD }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
736 { "strict_gop", "Strictly enforce gop size", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_STRICT_GOP }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
737 { "qp_rd", "Use rate distortion optimization for qp selection", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_QP_RD }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
738 { "cbp_rd", "use rate distortion optimization for CBP", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_CBP_RD }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
739 { "luma_elim_threshold", "single coefficient elimination threshold for luminance (negative values also consider dc coefficient)",\
740  FF_MPV_OFFSET(luma_elim_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },\
741 { "chroma_elim_threshold", "single coefficient elimination threshold for chrominance (negative values also consider dc coefficient)",\
742  FF_MPV_OFFSET(chroma_elim_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },\
743 { "quantizer_noise_shaping", NULL, FF_MPV_OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FF_MPV_OPT_FLAGS },
744 
745 extern const AVOption ff_mpv_generic_options[];
746 
747 #define FF_MPV_GENERIC_CLASS(name) \
748 static const AVClass name ## _class = {\
749  .class_name = #name " encoder",\
750  .item_name = av_default_item_name,\
751  .option = ff_mpv_generic_options,\
752  .version = LIBAVUTIL_VERSION_INT,\
753 };
754 
761 
767 void ff_MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]);
773  const AVFrame *frame, int *got_packet);
781 void ff_draw_horiz_band(MpegEncContext *s, int y, int h);
784 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix);
785 void ff_release_unused_pictures(MpegEncContext *s, int remove_current);
786 int ff_find_unused_picture(MpegEncContext *s, int shared);
792 const uint8_t *avpriv_mpv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state);
793 void ff_set_qscale(MpegEncContext * s, int qscale);
794 
797 void ff_er_add_slice(MpegEncContext *s, int startx, int starty, int endx, int endy, int status);
798 
800 void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
801  const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra);
802 int ff_dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
803 
805 void ff_copy_picture(Picture *dst, Picture *src);
806 
808  uint8_t *dest_y, uint8_t *dest_cb,
809  uint8_t *dest_cr, int dir,
810  uint8_t **ref_picture,
811  op_pixels_func (*pix_op)[4],
812  qpel_mc_func (*qpix_op)[16]);
813 
818 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared);
819 
820 extern const enum AVPixelFormat ff_pixfmt_list_420[];
821 extern const enum AVPixelFormat ff_hwaccel_pixfmt_list_420[];
822 
823 static inline void ff_update_block_index(MpegEncContext *s){
824  const int block_size = 8;
825 
826  s->block_index[0]+=2;
827  s->block_index[1]+=2;
828  s->block_index[2]+=2;
829  s->block_index[3]+=2;
830  s->block_index[4]++;
831  s->block_index[5]++;
832  s->dest[0]+= 2*block_size;
833  s->dest[1]+= block_size;
834  s->dest[2]+= block_size;
835 }
836 
837 static inline int get_bits_diff(MpegEncContext *s){
838  const int bits= put_bits_count(&s->pb);
839  const int last= s->last_bits;
840 
841  s->last_bits = bits;
842 
843  return bits - last;
844 }
845 
846 static inline int ff_h263_round_chroma(int x){
847  static const uint8_t h263_chroma_roundtab[16] = {
848  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
849  0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1,
850  };
851  return h263_chroma_roundtab[x & 0xf] + (x >> 3);
852 }
853 
854 /* motion_est.c */
856  int mb_x, int mb_y);
858  int mb_x, int mb_y);
859 int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type);
861 void ff_fix_long_mvs(MpegEncContext * s, uint8_t *field_select_table, int field_select,
862  int16_t (*mv_table)[2], int f_code, int type, int truncate);
863 int ff_init_me(MpegEncContext *s);
865 int ff_epzs_motion_search(MpegEncContext * s, int *mx_ptr, int *my_ptr,
866  int P[10][2], int src_index, int ref_index, int16_t (*last_mv)[2],
867  int ref_mv_scale, int size, int h);
868 int ff_get_mb_score(MpegEncContext * s, int mx, int my, int src_index,
869  int ref_index, int size, int h, int add_rate);
870 
871 /* mpeg12.c */
872 extern const uint8_t ff_mpeg1_dc_scale_table[128];
873 extern const uint8_t * const ff_mpeg2_dc_scale_table[4];
874 
877  DCTELEM block[6][64],
878  int motion_x, int motion_y);
882 int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s);
883 
884 extern const uint8_t ff_aic_dc_scale_table[32];
885 extern const uint8_t ff_h263_chroma_qscale_table[32];
886 extern const uint8_t ff_h263_loop_filter_strength[32];
887 
888 /* h261.c */
892  DCTELEM block[6][64],
893  int motion_x, int motion_y);
897 
898 
899 /* rv10.c */
901 int ff_rv_decode_dc(MpegEncContext *s, int n);
903 
904 
905 /* msmpeg4.c */
909  DCTELEM block[6][64],
910  int motion_x, int motion_y);
912 int ff_msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size);
917 void ff_wmv2_add_mb(MpegEncContext *s, DCTELEM block[6][64], uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr);
919  uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
920  uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
921  int motion_x, int motion_y, int h);
924  DCTELEM block[6][64],
925  int motion_x, int motion_y);
926 
927 #endif /* AVCODEC_MPEGVIDEO_H */