Mercurial > libavcodec.hg
annotate xvidff.c @ 2497:69adfbbdcdeb libavcodec
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
which isn't the advanced one; and indeed, using adv. profile parser fails.
Using normal parser works, and that's what is done
- attempt at taking care of stride for NORM2 bitplane decoding
- duplication of much code from msmpeg4.c; this code isn't yet used, but
goes down as far as the block layer (mainly Transform Type stuff, the
remains are wild editing without checking). Unusable yet, and lacks the AC
decoding (but a step further in bitstream parsing)
patch by anonymous
author | michael |
---|---|
date | Fri, 04 Feb 2005 02:20:38 +0000 |
parents | 0fcee7879d3f |
children | 9973475ccf1e |
rev | line source |
---|---|
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
1 /* |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
2 * Interface to xvidcore for mpeg4 encoding |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
3 * Copyright (c) 2004 Adam Thayer <krevnik@comcast.net> |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
4 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
5 * This library is free software; you can redistribute it and/or |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
6 * modify it under the terms of the GNU Lesser General Public |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
7 * License as published by the Free Software Foundation; either |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
8 * version 2 of the License, or (at your option) any later version. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
9 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
10 * This library is distributed in the hope that it will be useful, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
13 * Lesser General Public License for more details. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
14 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Lesser General Public |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
16 * License along with this library; if not, write to the Free Software |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
18 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
19 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
20 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
21 * @file xvidmpeg4.c |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
22 * Interface to xvidcore for MPEG-4 compliant encoding. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
23 * @author Adam Thayer (krevnik@comcast.net) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
24 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
25 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
26 #include <xvid.h> |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
27 #include <unistd.h> |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
28 #include "common.h" |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
29 #include "avcodec.h" |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
30 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
31 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
32 * Buffer management macros. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
33 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
34 #define BUFFER_SIZE 1024 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
35 #define BUFFER_REMAINING(x) (BUFFER_SIZE - strlen(x)) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
36 #define BUFFER_CAT(x) (&((x)[strlen(x)])) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
37 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
38 /* For PPC Use */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
39 #if HAVE_ALTIVEC==1 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
40 extern int has_altivec(void); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
41 #endif |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
42 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
43 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
44 * Structure for the private XviD context. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
45 * This stores all the private context for the codec. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
46 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
47 typedef struct xvid_context { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
48 void *encoder_handle; /** Handle for XviD Encoder */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
49 int xsize, ysize; /** Frame size */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
50 int vop_flags; /** VOP flags for XviD Encoder */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
51 int vol_flags; /** VOL flags for XviD Encoder */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
52 int me_flags; /** Motion Estimation flags */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
53 int qscale; /** Do we use constant scale? */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
54 int quicktime_format; /** Are we in a QT-based format? */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
55 AVFrame encoded_picture; /** Encoded frame information */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
56 char *twopassbuffer; /** Character buffer for two-pass */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
57 char *old_twopassbuffer; /** Old character buffer (two-pass) */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
58 char *twopassfile; /** second pass temp file name */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
59 unsigned char *intra_matrix; /** P-Frame Quant Matrix */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
60 unsigned char *inter_matrix; /** I-Frame Quant Matrix */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
61 } xvid_context_t; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
62 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
63 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
64 * Structure for the private first-pass plugin. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
65 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
66 typedef struct xvid_ff_pass1 { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
67 int version; /** XviD version */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
68 xvid_context_t *context; /** Pointer to private context */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
69 } xvid_ff_pass1_t; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
70 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
71 /* Prototypes - See function implementation for details */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
72 int xvid_strip_vol_header(AVCodecContext *avctx, unsigned char *frame, unsigned int header_len, unsigned int frame_len); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
73 int xvid_ff_2pass(void *ref, int opt, void *p1, void *p2); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
74 void xvid_correct_framerate(AVCodecContext *avctx); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
75 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
76 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
77 * Creates the private context for the encoder. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
78 * All buffers are allocated, settings are loaded from the user, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
79 * and the encoder context created. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
80 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
81 * @param avctx AVCodecContext pointer to context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
82 * @return Returns 0 on success, -1 on failure |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
83 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
84 int ff_xvid_encode_init(AVCodecContext *avctx) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
85 int xerr, i; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
86 int xvid_flags = avctx->flags; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
87 xvid_context_t *x = avctx->priv_data; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
88 uint16_t *intra, *inter; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
89 int fd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
90 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
91 xvid_plugin_single_t single; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
92 xvid_ff_pass1_t rc2pass1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
93 xvid_plugin_2pass2_t rc2pass2; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
94 xvid_gbl_init_t xvid_gbl_init; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
95 xvid_enc_create_t xvid_enc_create; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
96 xvid_enc_plugin_t plugins[7]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
97 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
98 /* Bring in VOP flags from ffmpeg command-line */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
99 x->vop_flags = XVID_VOP_HALFPEL; /* Bare minimum quality */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
100 if( xvid_flags & CODEC_FLAG_4MV ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
101 x->vop_flags |= XVID_VOP_INTER4V; /* Level 3 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
102 if( xvid_flags & CODEC_FLAG_TRELLIS_QUANT) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
103 x->vop_flags |= XVID_VOP_TRELLISQUANT; /* Level 5 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
104 if( xvid_flags & CODEC_FLAG_AC_PRED ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
105 x->vop_flags |= XVID_VOP_HQACPRED; /* Level 6 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
106 if( xvid_flags & CODEC_FLAG_GRAY ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
107 x->vop_flags |= XVID_VOP_GREYSCALE; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
108 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
109 /* Decide which ME quality setting to use */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
110 x->me_flags = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
111 switch( avctx->me_method ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
112 case ME_FULL: /* Quality 6 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
113 x->me_flags |= XVID_ME_EXTSEARCH16 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
114 | XVID_ME_EXTSEARCH8; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
115 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
116 case ME_EPZS: /* Quality 4 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
117 x->me_flags |= XVID_ME_ADVANCEDDIAMOND8 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
118 | XVID_ME_HALFPELREFINE8 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
119 | XVID_ME_CHROMA_PVOP |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
120 | XVID_ME_CHROMA_BVOP; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
121 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
122 case ME_LOG: /* Quality 2 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
123 case ME_PHODS: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
124 case ME_X1: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
125 x->me_flags |= XVID_ME_ADVANCEDDIAMOND16 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
126 | XVID_ME_HALFPELREFINE16; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
127 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
128 case ME_ZERO: /* Quality 0 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
129 default: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
130 break; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
131 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
132 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
133 /* Decide how we should decide blocks */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
134 switch( avctx->mb_decision ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
135 case 2: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
136 x->vop_flags |= XVID_VOP_MODEDECISION_RD; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
137 x->me_flags |= XVID_ME_HALFPELREFINE8_RD |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
138 | XVID_ME_QUARTERPELREFINE8_RD |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
139 | XVID_ME_EXTSEARCH_RD |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
140 | XVID_ME_CHECKPREDICTION_RD; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
141 case 1: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
142 if( !(x->vop_flags & XVID_VOP_MODEDECISION_RD) ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
143 x->vop_flags |= XVID_VOP_FAST_MODEDECISION_RD; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
144 x->me_flags |= XVID_ME_HALFPELREFINE16_RD |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
145 | XVID_ME_QUARTERPELREFINE16_RD; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
146 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
147 default: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
148 break; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
149 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
150 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
151 /* Bring in VOL flags from ffmpeg command-line */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
152 x->vol_flags = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
153 if( xvid_flags & CODEC_FLAG_GMC ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
154 x->vol_flags |= XVID_VOL_GMC; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
155 x->me_flags |= XVID_ME_GME_REFINE; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
156 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
157 if( xvid_flags & CODEC_FLAG_QPEL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
158 x->vol_flags |= XVID_VOL_QUARTERPEL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
159 x->me_flags |= XVID_ME_QUARTERPELREFINE16; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
160 if( x->vop_flags & XVID_VOP_INTER4V ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
161 x->me_flags |= XVID_ME_QUARTERPELREFINE8; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
162 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
163 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
164 memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
165 xvid_gbl_init.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
166 xvid_gbl_init.debug = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
167 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
168 #ifdef ARCH_POWERPC |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
169 /* XviD's PPC support is borked, use libavcodec to detect */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
170 #if HAVE_ALTIVEC==1 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
171 if( has_altivec() ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
172 xvid_gbl_init.cpu_flags = XVID_CPU_FORCE | XVID_CPU_ALTIVEC; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
173 } else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
174 #endif |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
175 xvid_gbl_init.cpu_flags = XVID_CPU_FORCE; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
176 #else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
177 /* XviD can detect on x86 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
178 xvid_gbl_init.cpu_flags = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
179 #endif |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
180 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
181 /* Initialize */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
182 xvid_global(NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
183 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
184 /* Create the encoder reference */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
185 memset(&xvid_enc_create, 0, sizeof(xvid_enc_create)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
186 xvid_enc_create.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
187 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
188 /* Store the desired frame size */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
189 xvid_enc_create.width = x->xsize = avctx->width; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
190 xvid_enc_create.height = x->ysize = avctx->height; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
191 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
192 /* XviD can determine the proper profile to use */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
193 /* xvid_enc_create.profile = XVID_PROFILE_S_L3; */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
194 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
195 /* We don't use zones or threads */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
196 xvid_enc_create.zones = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
197 xvid_enc_create.num_zones = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
198 xvid_enc_create.num_threads = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
199 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
200 xvid_enc_create.plugins = plugins; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
201 xvid_enc_create.num_plugins = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
202 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
203 /* Initialize Buffers */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
204 x->twopassbuffer = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
205 x->old_twopassbuffer = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
206 x->twopassfile = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
207 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
208 if( xvid_flags & CODEC_FLAG_PASS1 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
209 memset(&rc2pass1, 0, sizeof(xvid_ff_pass1_t)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
210 rc2pass1.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
211 rc2pass1.context = x; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
212 x->twopassbuffer = av_malloc(BUFFER_SIZE); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
213 x->old_twopassbuffer = av_malloc(BUFFER_SIZE); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
214 if( x->twopassbuffer == NULL || x->old_twopassbuffer == NULL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
215 av_log(avctx, AV_LOG_ERROR, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
216 "XviD: Cannot allocate 2-pass log buffers\n"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
217 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
218 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
219 x->twopassbuffer[0] = x->old_twopassbuffer[0] = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
220 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
221 plugins[xvid_enc_create.num_plugins].func = xvid_ff_2pass; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
222 plugins[xvid_enc_create.num_plugins].param = &rc2pass1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
223 xvid_enc_create.num_plugins++; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
224 } else if( xvid_flags & CODEC_FLAG_PASS2 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
225 memset(&rc2pass2, 0, sizeof(xvid_plugin_2pass2_t)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
226 rc2pass2.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
227 rc2pass2.bitrate = avctx->bit_rate; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
228 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
229 x->twopassfile = av_malloc(BUFFER_SIZE); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
230 if( x->twopassfile == NULL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
231 av_log(avctx, AV_LOG_ERROR, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
232 "XviD: Cannot allocate 2-pass buffer\n"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
233 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
234 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
235 strcpy(x->twopassfile, "/tmp/xvidff.XXXXXX"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
236 fd = mkstemp(x->twopassfile); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
237 if( fd == -1 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
238 av_log(avctx, AV_LOG_ERROR, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
239 "XviD: Cannot write 2-pass pipe\n"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
240 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
241 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
242 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
243 if( avctx->stats_in == NULL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
244 av_log(avctx, AV_LOG_ERROR, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
245 "XviD: No 2-pass information loaded for second pass\n"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
246 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
247 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
248 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
249 if( strlen(avctx->stats_in) > |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
250 write(fd, avctx->stats_in, strlen(avctx->stats_in)) ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
251 close(fd); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
252 av_log(avctx, AV_LOG_ERROR, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
253 "XviD: Cannot write to 2-pass pipe\n"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
254 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
255 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
256 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
257 close(fd); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
258 rc2pass2.filename = x->twopassfile; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
259 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
260 plugins[xvid_enc_create.num_plugins].param = &rc2pass2; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
261 xvid_enc_create.num_plugins++; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
262 } else if( !(xvid_flags & CODEC_FLAG_QSCALE) ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
263 /* Single Pass Bitrate Control! */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
264 memset(&single, 0, sizeof(xvid_plugin_single_t)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
265 single.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
266 single.bitrate = avctx->bit_rate; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
267 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
268 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_single; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
269 plugins[xvid_enc_create.num_plugins].param = &single; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
270 xvid_enc_create.num_plugins++; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
271 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
272 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
273 /* Luminance Masking */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
274 if( 0.0 != avctx->lumi_masking ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
275 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
276 plugins[xvid_enc_create.num_plugins].param = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
277 xvid_enc_create.num_plugins++; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
278 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
279 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
280 /* Frame Rate and Key Frames */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
281 xvid_correct_framerate(avctx); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
282 xvid_enc_create.fincr = avctx->frame_rate_base; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
283 xvid_enc_create.fbase = avctx->frame_rate; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
284 if( avctx->gop_size > 0 ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
285 xvid_enc_create.max_key_interval = avctx->gop_size; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
286 else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
287 xvid_enc_create.max_key_interval = 240; /* XviD's best default */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
288 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
289 /* Quants */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
290 if( xvid_flags & CODEC_FLAG_QSCALE ) x->qscale = 1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
291 else x->qscale = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
292 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
293 xvid_enc_create.min_quant[0] = avctx->qmin; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
294 xvid_enc_create.min_quant[1] = avctx->qmin; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
295 xvid_enc_create.min_quant[2] = avctx->qmin; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
296 xvid_enc_create.max_quant[0] = avctx->qmax; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
297 xvid_enc_create.max_quant[1] = avctx->qmax; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
298 xvid_enc_create.max_quant[2] = avctx->qmax; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
299 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
300 /* Quant Matrices */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
301 x->intra_matrix = x->inter_matrix = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
302 if( avctx->mpeg_quant ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
303 x->vol_flags |= XVID_VOL_MPEGQUANT; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
304 if( (avctx->intra_matrix || avctx->inter_matrix) ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
305 x->vol_flags |= XVID_VOL_MPEGQUANT; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
306 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
307 if( avctx->intra_matrix ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
308 intra = avctx->intra_matrix; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
309 x->intra_matrix = av_malloc(sizeof(unsigned char) * 64); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
310 } else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
311 intra = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
312 if( avctx->inter_matrix ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
313 inter = avctx->inter_matrix; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
314 x->inter_matrix = av_malloc(sizeof(unsigned char) * 64); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
315 } else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
316 inter = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
317 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
318 for( i = 0; i < 64; i++ ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
319 if( intra ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
320 x->intra_matrix[i] = (unsigned char)intra[i]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
321 if( inter ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
322 x->inter_matrix[i] = (unsigned char)inter[i]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
323 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
324 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
325 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
326 /* Misc Settings */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
327 xvid_enc_create.frame_drop_ratio = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
328 xvid_enc_create.global = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
329 if( xvid_flags & CODEC_FLAG_CLOSED_GOP ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
330 xvid_enc_create.global |= XVID_GLOBAL_CLOSED_GOP; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
331 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
332 /* Determines which codec mode we are operating in */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
333 avctx->extradata = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
334 avctx->extradata_size = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
335 if( xvid_flags & CODEC_FLAG_GLOBAL_HEADER ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
336 /* In this case, we are claiming to be MPEG4 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
337 x->quicktime_format = 1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
338 avctx->codec_id = CODEC_ID_MPEG4; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
339 } else { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
340 /* We are claiming to be XviD */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
341 x->quicktime_format = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
342 avctx->codec_tag = ff_get_fourcc("xvid"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
343 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
344 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
345 /* Bframes */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
346 xvid_enc_create.max_bframes = avctx->max_b_frames; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
347 xvid_enc_create.bquant_offset = avctx->b_quant_offset; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
348 xvid_enc_create.bquant_ratio = 100 * avctx->b_quant_factor; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
349 if( avctx->max_b_frames > 0 && !x->quicktime_format ) xvid_enc_create.global |= XVID_GLOBAL_PACKED; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
350 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
351 /* Create encoder context */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
352 xerr = xvid_encore(NULL, XVID_ENC_CREATE, &xvid_enc_create, NULL); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
353 if( xerr ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
354 av_log(avctx, AV_LOG_ERROR, "XviD: Could not create encoder reference\n"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
355 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
356 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
357 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
358 x->encoder_handle = xvid_enc_create.handle; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
359 avctx->coded_frame = &x->encoded_picture; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
360 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
361 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
362 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
363 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
364 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
365 * Encodes a single frame. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
366 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
367 * @param avctx AVCodecContext pointer to context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
368 * @param frame Pointer to encoded frame buffer |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
369 * @param buf_size Size of encoded frame buffer |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
370 * @param data Pointer to AVFrame of unencoded frame |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
371 * @return Returns 0 on success, -1 on failure |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
372 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
373 int ff_xvid_encode_frame(AVCodecContext *avctx, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
374 unsigned char *frame, int buf_size, void *data) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
375 int xerr, i; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
376 char *tmp; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
377 xvid_context_t *x = avctx->priv_data; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
378 AVFrame *picture = data; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
379 AVFrame *p = &(x->encoded_picture); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
380 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
381 xvid_enc_frame_t xvid_enc_frame; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
382 xvid_enc_stats_t xvid_enc_stats; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
383 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
384 /* Start setting up the frame */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
385 memset(&xvid_enc_frame, 0, sizeof(xvid_enc_frame)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
386 xvid_enc_frame.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
387 memset(&xvid_enc_stats, 0, sizeof(xvid_enc_stats)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
388 xvid_enc_stats.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
389 *p = *picture; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
390 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
391 /* Let XviD know where to put the frame. */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
392 xvid_enc_frame.bitstream = frame; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
393 xvid_enc_frame.length = buf_size; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
394 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
395 /* Initialize input image fields */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
396 if( avctx->pix_fmt != PIX_FMT_YUV420P ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
397 av_log(avctx, AV_LOG_ERROR, "XviD: Color spaces other than 420p not supported\n"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
398 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
399 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
400 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
401 xvid_enc_frame.input.csp = XVID_CSP_PLANAR; /* YUV420P */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
402 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
403 for( i = 0; i < 4; i++ ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
404 xvid_enc_frame.input.plane[i] = picture->data[i]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
405 xvid_enc_frame.input.stride[i] = picture->linesize[i]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
406 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
407 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
408 /* Encoder Flags */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
409 xvid_enc_frame.vop_flags = x->vop_flags; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
410 xvid_enc_frame.vol_flags = x->vol_flags; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
411 xvid_enc_frame.motion = x->me_flags; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
412 xvid_enc_frame.type = XVID_TYPE_AUTO; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
413 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
414 /* Quant Setting */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
415 if( x->qscale ) xvid_enc_frame.quant = picture->quality / FF_QP2LAMBDA; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
416 else xvid_enc_frame.quant = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
417 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
418 /* Matrices */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
419 xvid_enc_frame.quant_intra_matrix = x->intra_matrix; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
420 xvid_enc_frame.quant_inter_matrix = x->inter_matrix; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
421 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
422 /* Encode */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
423 xerr = xvid_encore(x->encoder_handle, XVID_ENC_ENCODE, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
424 &xvid_enc_frame, &xvid_enc_stats); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
425 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
426 /* Two-pass log buffer swapping */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
427 avctx->stats_out = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
428 if( x->twopassbuffer ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
429 tmp = x->old_twopassbuffer; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
430 x->old_twopassbuffer = x->twopassbuffer; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
431 x->twopassbuffer = tmp; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
432 x->twopassbuffer[0] = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
433 if( x->old_twopassbuffer[0] != 0 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
434 avctx->stats_out = x->old_twopassbuffer; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
435 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
436 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
437 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
438 if( 0 <= xerr ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
439 p->quality = xvid_enc_stats.quant * FF_QP2LAMBDA; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
440 if( xvid_enc_stats.type == XVID_TYPE_PVOP ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
441 p->pict_type = FF_P_TYPE; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
442 else if( xvid_enc_stats.type == XVID_TYPE_BVOP ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
443 p->pict_type = FF_B_TYPE; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
444 else if( xvid_enc_stats.type == XVID_TYPE_SVOP ) |
2451 | 445 p->pict_type = FF_S_TYPE; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
446 else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
447 p->pict_type = FF_I_TYPE; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
448 if( xvid_enc_frame.out_flags & XVID_KEYFRAME ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
449 p->key_frame = 1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
450 if( x->quicktime_format ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
451 return xvid_strip_vol_header(avctx, frame, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
452 xvid_enc_stats.hlength, xerr); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
453 } else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
454 p->key_frame = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
455 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
456 return xerr; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
457 } else { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
458 av_log(avctx, AV_LOG_ERROR, "XviD: Encoding Error Occurred: %i\n", xerr); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
459 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
460 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
461 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
462 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
463 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
464 * Destroys the private context for the encoder. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
465 * All buffers are freed, and the XviD encoder context is destroyed. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
466 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
467 * @param avctx AVCodecContext pointer to context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
468 * @return Returns 0, success guaranteed |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
469 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
470 int ff_xvid_encode_close(AVCodecContext *avctx) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
471 xvid_context_t *x = avctx->priv_data; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
472 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
473 xvid_encore(x->encoder_handle, XVID_ENC_DESTROY, NULL, NULL); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
474 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
475 if( avctx->extradata != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
476 av_free(avctx->extradata); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
477 if( x->twopassbuffer != NULL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
478 av_free(x->twopassbuffer); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
479 av_free(x->old_twopassbuffer); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
480 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
481 if( x->twopassfile != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
482 av_free(x->twopassfile); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
483 if( x->intra_matrix != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
484 av_free(x->intra_matrix); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
485 if( x->inter_matrix != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
486 av_free(x->inter_matrix); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
487 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
488 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
489 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
490 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
491 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
492 * Routine to create a global VO/VOL header for MP4 container. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
493 * What we do here is extract the header from the XviD bitstream |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
494 * as it is encoded. We also strip the repeated headers from the |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
495 * bitstream when a global header is requested for MPEG-4 ISO |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
496 * compliance. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
497 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
498 * @param avctx AVCodecContext pointer to context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
499 * @param frame Pointer to encoded frame data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
500 * @param header_len Length of header to search |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
501 * @param frame_len Length of encoded frame data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
502 * @return Returns new length of frame data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
503 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
504 int xvid_strip_vol_header(AVCodecContext *avctx, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
505 unsigned char *frame, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
506 unsigned int header_len, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
507 unsigned int frame_len) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
508 int vo_len = 0, i; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
509 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
510 for( i = 0; i < header_len - 3; i++ ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
511 if( frame[i] == 0x00 && |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
512 frame[i+1] == 0x00 && |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
513 frame[i+2] == 0x01 && |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
514 frame[i+3] == 0xB6 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
515 vo_len = i; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
516 break; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
517 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
518 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
519 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
520 if( vo_len > 0 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
521 /* We need to store the header, so extract it */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
522 if( avctx->extradata == NULL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
523 avctx->extradata = av_malloc(vo_len); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
524 memcpy(avctx->extradata, frame, vo_len); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
525 avctx->extradata_size = vo_len; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
526 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
527 /* Less dangerous now, memmove properly copies the two |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
528 chunks of overlapping data */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
529 memmove(frame, &(frame[vo_len]), frame_len - vo_len); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
530 return frame_len - vo_len; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
531 } else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
532 return frame_len; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
533 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
534 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
535 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
536 * Routine to correct a possibly erroneous framerate being fed to us. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
537 * XviD currently chokes on framerates where the ticks per frame is |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
538 * extremely large. This function works to correct problems in this area |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
539 * by estimating a new framerate and taking the simpler fraction of |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
540 * the two presented. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
541 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
542 * @param avctx Context that contains the framerate to correct. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
543 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
544 void xvid_correct_framerate(AVCodecContext *avctx) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
545 int frate, fbase; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
546 int est_frate, est_fbase; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
547 int gcd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
548 float est_fps, fps; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
549 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
550 frate = avctx->frame_rate; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
551 fbase = avctx->frame_rate_base; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
552 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
553 gcd = ff_gcd(frate, fbase); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
554 if( gcd > 1 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
555 frate /= gcd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
556 fbase /= gcd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
557 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
558 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
559 if( frate <= 65000 && fbase <= 65000 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
560 avctx->frame_rate = frate; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
561 avctx->frame_rate_base = fbase; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
562 return; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
563 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
564 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
565 fps = (float)frate / (float)fbase; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
566 est_fps = roundf(fps * 1000.0) / 1000.0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
567 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
568 est_frate = (int)est_fps; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
569 if( est_fps > (int)est_fps ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
570 est_frate = (est_frate + 1) * 1000; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
571 est_fbase = (int)roundf((float)est_frate / est_fps); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
572 } else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
573 est_fbase = 1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
574 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
575 gcd = ff_gcd(est_frate, est_fbase); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
576 if( gcd > 1 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
577 est_frate /= gcd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
578 est_fbase /= gcd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
579 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
580 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
581 if( fbase > est_fbase ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
582 avctx->frame_rate = est_frate; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
583 avctx->frame_rate_base = est_fbase; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
584 av_log(avctx, AV_LOG_DEBUG, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
585 "XviD: framerate re-estimated: %.2f, %.3f%% correction\n", |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
586 est_fps, (((est_fps - fps)/fps) * 100.0)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
587 } else { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
588 avctx->frame_rate = frate; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
589 avctx->frame_rate_base = fbase; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
590 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
591 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
592 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
593 /* |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
594 * XviD 2-Pass Kludge Section |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
595 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
596 * XviD's default 2-pass doesn't allow us to create data as we need to, so |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
597 * this section spends time replacing the first pass plugin so we can write |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
598 * statistic information as libavcodec requests in. We have another kludge |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
599 * that allows us to pass data to the second pass in XviD without a custom |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
600 * rate-control plugin. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
601 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
602 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
603 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
604 * Initializes the two-pass plugin and context. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
605 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
606 * @param param Input construction parameter structure |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
607 * @param handle Private context handle |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
608 * @return Returns XVID_ERR_xxxx on failure, or 0 on success. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
609 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
610 static int xvid_ff_2pass_create(xvid_plg_create_t * param, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
611 void ** handle) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
612 xvid_ff_pass1_t *x = (xvid_ff_pass1_t *)param->param; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
613 char *log = x->context->twopassbuffer; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
614 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
615 /* Do a quick bounds check */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
616 if( log == NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
617 return XVID_ERR_FAIL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
618 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
619 /* We use snprintf() */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
620 /* This is because we can safely prevent a buffer overflow */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
621 log[0] = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
622 snprintf(log, BUFFER_REMAINING(log), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
623 "# ffmpeg 2-pass log file, using xvid codec\n"); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
624 snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
625 "# Do not modify. libxvidcore version: %d.%d.%d\n\n", |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
626 XVID_VERSION_MAJOR(XVID_VERSION), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
627 XVID_VERSION_MINOR(XVID_VERSION), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
628 XVID_VERSION_PATCH(XVID_VERSION)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
629 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
630 *handle = x->context; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
631 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
632 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
633 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
634 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
635 * Destroys the two-pass plugin context. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
636 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
637 * @param ref Context pointer for the plugin |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
638 * @param param Destrooy context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
639 * @return Returns 0, success guaranteed |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
640 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
641 static int xvid_ff_2pass_destroy(xvid_context_t *ref, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
642 xvid_plg_destroy_t *param) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
643 /* Currently cannot think of anything to do on destruction */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
644 /* Still, the framework should be here for reference/use */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
645 if( ref->twopassbuffer != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
646 ref->twopassbuffer[0] = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
647 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
648 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
649 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
650 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
651 * Enables fast encode mode during the first pass. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
652 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
653 * @param ref Context pointer for the plugin |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
654 * @param param Frame data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
655 * @return Returns 0, success guaranteed |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
656 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
657 static int xvid_ff_2pass_before(xvid_context_t *ref, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
658 xvid_plg_data_t *param) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
659 int motion_remove; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
660 int motion_replacements; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
661 int vop_remove; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
662 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
663 /* Nothing to do here, result is changed too much */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
664 if( param->zone && param->zone->mode == XVID_ZONE_QUANT ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
665 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
666 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
667 /* We can implement a 'turbo' first pass mode here */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
668 param->quant = 2; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
669 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
670 /* Init values */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
671 motion_remove = ~XVID_ME_CHROMA_PVOP & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
672 ~XVID_ME_CHROMA_BVOP & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
673 ~XVID_ME_EXTSEARCH16 & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
674 ~XVID_ME_ADVANCEDDIAMOND16; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
675 motion_replacements = XVID_ME_FAST_MODEINTERPOLATE | |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
676 XVID_ME_SKIP_DELTASEARCH | |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
677 XVID_ME_FASTREFINE16 | |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
678 XVID_ME_BFRAME_EARLYSTOP; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
679 vop_remove = ~XVID_VOP_MODEDECISION_RD & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
680 ~XVID_VOP_FAST_MODEDECISION_RD & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
681 ~XVID_VOP_TRELLISQUANT & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
682 ~XVID_VOP_INTER4V & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
683 ~XVID_VOP_HQACPRED; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
684 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
685 param->vol_flags &= ~XVID_VOL_GMC; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
686 param->vop_flags &= vop_remove; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
687 param->motion_flags &= motion_remove; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
688 param->motion_flags |= motion_replacements; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
689 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
690 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
691 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
692 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
693 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
694 * Captures statistic data and writes it during first pass. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
695 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
696 * @param ref Context pointer for the plugin |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
697 * @param param Statistic data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
698 * @return Returns XVID_ERR_xxxx on failure, or 0 on success |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
699 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
700 static int xvid_ff_2pass_after(xvid_context_t *ref, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
701 xvid_plg_data_t *param) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
702 char *log = ref->twopassbuffer; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
703 char *frame_types = " ipbs"; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
704 char frame_type; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
705 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
706 /* Quick bounds check */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
707 if( log == NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
708 return XVID_ERR_FAIL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
709 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
710 /* Convert the type given to us into a character */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
711 if( param->type < 5 && param->type > 0 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
712 frame_type = frame_types[param->type]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
713 } else { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
714 return XVID_ERR_FAIL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
715 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
716 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
717 snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
718 "%c %d %d %d %d %d %d\n", |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
719 frame_type, param->stats.quant, param->stats.kblks, param->stats.mblks, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
720 param->stats.ublks, param->stats.length, param->stats.hlength); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
721 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
722 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
723 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
724 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
725 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
726 * Dispatch function for our custom plugin. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
727 * This handles the dispatch for the XviD plugin. It passes data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
728 * on to other functions for actual processing. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
729 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
730 * @param ref Context pointer for the plugin |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
731 * @param cmd The task given for us to complete |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
732 * @param p1 First parameter (varies) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
733 * @param p2 Second parameter (varies) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
734 * @return Returns XVID_ERR_xxxx on failure, or 0 on success |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
735 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
736 int xvid_ff_2pass(void *ref, int cmd, void *p1, void *p2) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
737 switch( cmd ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
738 case XVID_PLG_INFO: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
739 case XVID_PLG_FRAME: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
740 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
741 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
742 case XVID_PLG_BEFORE: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
743 return xvid_ff_2pass_before(ref, p1); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
744 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
745 case XVID_PLG_CREATE: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
746 return xvid_ff_2pass_create(p1, p2); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
747 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
748 case XVID_PLG_AFTER: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
749 return xvid_ff_2pass_after(ref, p1); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
750 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
751 case XVID_PLG_DESTROY: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
752 return xvid_ff_2pass_destroy(ref, p1); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
753 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
754 default: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
755 return XVID_ERR_FAIL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
756 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
757 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
758 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
759 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
760 * XviD codec definition for libavcodec. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
761 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
762 AVCodec xvid_encoder = { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
763 "xvid", |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
764 CODEC_TYPE_VIDEO, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
765 CODEC_ID_XVID, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
766 sizeof(xvid_context_t), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
767 ff_xvid_encode_init, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
768 ff_xvid_encode_frame, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
769 ff_xvid_encode_close |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
770 }; |