annotate xvidff.c @ 3990:746a60ba3177 libavcodec

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