annotate xvidff.c @ 4317:5a2ee0bc2739 libavcodec

skip motion estimation and encoding of non direct-0,0 MBs if the next MB is skiped (mpeg4 doesnt allow such MBs and in the past we did ME and encoding until at the end we droped them, so this should be faster though i didnt benchmark it, benchmark welcome)
author michael
date Thu, 21 Dec 2006 15:20:02 +0000
parents 508f089d0b28
children f99e40a7155b
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"
4004
f7e99d20ef62 Rename internal.h --> xvid_internal.h, it clashes with libavutil/internal.h.
diego
parents: 3947
diff changeset
32 #include "xvid_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;
4023
508f089d0b28 Have xvid encoder wrapper honnor -vtag option
gpoirier
parents: 4004
diff changeset
338 if(!avctx->codec_tag)
508f089d0b28 Have xvid encoder wrapper honnor -vtag option
gpoirier
parents: 4004
diff changeset
339 avctx->codec_tag = ff_get_fourcc("xvid");
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
340 }
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
341
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
342 /* Bframes */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
343 xvid_enc_create.max_bframes = avctx->max_b_frames;
3202
89348aaf566e fixing bquant_offset
michael
parents: 3036
diff changeset
344 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
345 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
346 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
347
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
348 /* Create encoder context */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
349 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
350 if( xerr ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
351 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
352 return -1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
353 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
354
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
355 x->encoder_handle = xvid_enc_create.handle;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
356 avctx->coded_frame = &x->encoded_picture;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
357
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
358 return 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
359 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
360
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
361 /**
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
362 * Encodes a single frame.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
363 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
364 * @param avctx AVCodecContext pointer to context
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
365 * @param frame Pointer to encoded frame buffer
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
366 * @param buf_size Size of encoded frame buffer
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
367 * @param data Pointer to AVFrame of unencoded frame
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
368 * @return Returns 0 on success, -1 on failure
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
369 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
370 int ff_xvid_encode_frame(AVCodecContext *avctx,
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
371 unsigned char *frame, int buf_size, void *data) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
372 int xerr, i;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
373 char *tmp;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
374 xvid_context_t *x = avctx->priv_data;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
375 AVFrame *picture = data;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
376 AVFrame *p = &(x->encoded_picture);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
377
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
378 xvid_enc_frame_t xvid_enc_frame;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
379 xvid_enc_stats_t xvid_enc_stats;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
380
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
381 /* Start setting up the frame */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
382 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
383 xvid_enc_frame.version = XVID_VERSION;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
384 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
385 xvid_enc_stats.version = XVID_VERSION;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
386 *p = *picture;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
387
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
388 /* Let XviD know where to put the frame. */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
389 xvid_enc_frame.bitstream = frame;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
390 xvid_enc_frame.length = buf_size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
391
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
392 /* Initialize input image fields */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
393 if( avctx->pix_fmt != PIX_FMT_YUV420P ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
394 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
395 return -1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
396 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
397
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
398 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
399
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
400 for( i = 0; i < 4; i++ ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
401 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
402 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
403 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
404
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
405 /* Encoder Flags */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
406 xvid_enc_frame.vop_flags = x->vop_flags;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
407 xvid_enc_frame.vol_flags = x->vol_flags;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
408 xvid_enc_frame.motion = x->me_flags;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
409 xvid_enc_frame.type = XVID_TYPE_AUTO;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
410
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
411 /* Quant Setting */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
412 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
413 else xvid_enc_frame.quant = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
414
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
415 /* Matrices */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
416 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
417 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
418
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
419 /* Encode */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
420 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
421 &xvid_enc_frame, &xvid_enc_stats);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
422
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
423 /* Two-pass log buffer swapping */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
424 avctx->stats_out = NULL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
425 if( x->twopassbuffer ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
426 tmp = x->old_twopassbuffer;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
427 x->old_twopassbuffer = x->twopassbuffer;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
428 x->twopassbuffer = tmp;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
429 x->twopassbuffer[0] = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
430 if( x->old_twopassbuffer[0] != 0 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
431 avctx->stats_out = x->old_twopassbuffer;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
432 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
433 }
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
434
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
435 if( 0 <= xerr ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
436 p->quality = xvid_enc_stats.quant * FF_QP2LAMBDA;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
437 if( xvid_enc_stats.type == XVID_TYPE_PVOP )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
438 p->pict_type = FF_P_TYPE;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
439 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
440 p->pict_type = FF_B_TYPE;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
441 else if( xvid_enc_stats.type == XVID_TYPE_SVOP )
2451
michael
parents: 2131
diff changeset
442 p->pict_type = FF_S_TYPE;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
443 else
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
444 p->pict_type = FF_I_TYPE;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
445 if( xvid_enc_frame.out_flags & XVID_KEYFRAME ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
446 p->key_frame = 1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
447 if( x->quicktime_format )
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
448 return xvid_strip_vol_header(avctx, frame,
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
449 xvid_enc_stats.hlength, xerr);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
450 } else
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
451 p->key_frame = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
452
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
453 return xerr;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
454 } else {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
455 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
456 return -1;
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 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
459
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
460 /**
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
461 * Destroys the private context for the encoder.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
462 * 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
463 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
464 * @param avctx AVCodecContext pointer to context
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
465 * @return Returns 0, success guaranteed
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
466 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
467 int ff_xvid_encode_close(AVCodecContext *avctx) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
468 xvid_context_t *x = avctx->priv_data;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
469
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
470 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
471
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
472 if( avctx->extradata != NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
473 av_free(avctx->extradata);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
474 if( x->twopassbuffer != NULL ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
475 av_free(x->twopassbuffer);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
476 av_free(x->old_twopassbuffer);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
477 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
478 if( x->twopassfile != NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
479 av_free(x->twopassfile);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
480 if( x->intra_matrix != NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
481 av_free(x->intra_matrix);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
482 if( x->inter_matrix != NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
483 av_free(x->inter_matrix);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
484
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
485 return 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
486 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
487
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
488 /**
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
489 * 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
490 * 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
491 * 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
492 * 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
493 * compliance.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
494 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
495 * @param avctx AVCodecContext pointer to context
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
496 * @param frame Pointer to encoded frame data
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
497 * @param header_len Length of header to search
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
498 * @param frame_len Length of encoded frame data
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
499 * @return Returns new length of frame data
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
500 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
501 int xvid_strip_vol_header(AVCodecContext *avctx,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
502 unsigned char *frame,
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
503 unsigned int header_len,
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
504 unsigned int frame_len) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
505 int vo_len = 0, i;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
506
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
507 for( i = 0; i < header_len - 3; i++ ) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
508 if( frame[i] == 0x00 &&
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
509 frame[i+1] == 0x00 &&
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
510 frame[i+2] == 0x01 &&
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
511 frame[i+3] == 0xB6 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
512 vo_len = i;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
513 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
514 }
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
515 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
516
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
517 if( vo_len > 0 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
518 /* 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
519 if( avctx->extradata == NULL ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
520 avctx->extradata = av_malloc(vo_len);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
521 memcpy(avctx->extradata, frame, vo_len);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
522 avctx->extradata_size = vo_len;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
523 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
524 /* Less dangerous now, memmove properly copies the two
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
525 chunks of overlapping data */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
526 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
527 return frame_len - vo_len;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
528 } else
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
529 return frame_len;
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 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
533 * Routine to correct a possibly erroneous framerate being fed to us.
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
534 * 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
535 * extremely large. This function works to correct problems in this area
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
536 * 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
537 * the two presented.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
538 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
539 * @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
540 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
541 void xvid_correct_framerate(AVCodecContext *avctx) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
542 int frate, fbase;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
543 int est_frate, est_fbase;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
544 int gcd;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
545 float est_fps, fps;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
546
2637
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
547 frate = avctx->time_base.den;
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
548 fbase = avctx->time_base.num;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
549
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
550 gcd = ff_gcd(frate, fbase);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
551 if( gcd > 1 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
552 frate /= gcd;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
553 fbase /= gcd;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
554 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
555
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
556 if( frate <= 65000 && fbase <= 65000 ) {
2637
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
557 avctx->time_base.den = frate;
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
558 avctx->time_base.num = fbase;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
559 return;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
560 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
561
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
562 fps = (float)frate / (float)fbase;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
563 est_fps = roundf(fps * 1000.0) / 1000.0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
564
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
565 est_frate = (int)est_fps;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
566 if( est_fps > (int)est_fps ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
567 est_frate = (est_frate + 1) * 1000;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
568 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
569 } else
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
570 est_fbase = 1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
571
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
572 gcd = ff_gcd(est_frate, est_fbase);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
573 if( gcd > 1 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
574 est_frate /= gcd;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
575 est_fbase /= gcd;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
576 }
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
577
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
578 if( fbase > est_fbase ) {
2637
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
579 avctx->time_base.den = est_frate;
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
580 avctx->time_base.num = est_fbase;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
581 av_log(avctx, AV_LOG_DEBUG,
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
582 "XviD: framerate re-estimated: %.2f, %.3f%% correction\n",
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
583 est_fps, (((est_fps - fps)/fps) * 100.0));
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
584 } else {
2637
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
585 avctx->time_base.den = frate;
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
586 avctx->time_base.num = fbase;
2131
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 /*
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
591 * XviD 2-Pass Kludge Section
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
592 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
593 * 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
594 * 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
595 * 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
596 * 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
597 * rate-control plugin.
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 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
601 * Initializes the two-pass plugin and context.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
602 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
603 * @param param Input construction parameter structure
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
604 * @param handle Private context handle
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
605 * @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
606 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
607 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
608 void ** handle) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
609 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
610 char *log = x->context->twopassbuffer;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
611
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
612 /* Do a quick bounds check */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
613 if( log == NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
614 return XVID_ERR_FAIL;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
615
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
616 /* We use snprintf() */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
617 /* 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
618 log[0] = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
619 snprintf(log, BUFFER_REMAINING(log),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
620 "# 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
621 snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
622 "# 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
623 XVID_VERSION_MAJOR(XVID_VERSION),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
624 XVID_VERSION_MINOR(XVID_VERSION),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
625 XVID_VERSION_PATCH(XVID_VERSION));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
626
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
627 *handle = x->context;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
628 return 0;
2131
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 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
632 * Destroys the two-pass plugin context.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
633 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
634 * @param ref Context pointer for the plugin
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
635 * @param param Destrooy context
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
636 * @return Returns 0, success guaranteed
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
637 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
638 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
639 xvid_plg_destroy_t *param) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
640 /* 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
641 /* 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
642 if( ref->twopassbuffer != NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
643 ref->twopassbuffer[0] = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
644 return 0;
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 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
648 * Enables fast encode mode during the first pass.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
649 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
650 * @param ref Context pointer for the plugin
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
651 * @param param Frame data
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
652 * @return Returns 0, success guaranteed
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
653 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
654 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
655 xvid_plg_data_t *param) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
656 int motion_remove;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
657 int motion_replacements;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
658 int vop_remove;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
659
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
660 /* 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
661 if( param->zone && param->zone->mode == XVID_ZONE_QUANT )
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
662 return 0;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
663
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
664 /* We can implement a 'turbo' first pass mode here */
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
665 param->quant = 2;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
666
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
667 /* Init values */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
668 motion_remove = ~XVID_ME_CHROMA_PVOP &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
669 ~XVID_ME_CHROMA_BVOP &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
670 ~XVID_ME_EXTSEARCH16 &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
671 ~XVID_ME_ADVANCEDDIAMOND16;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
672 motion_replacements = XVID_ME_FAST_MODEINTERPOLATE |
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
673 XVID_ME_SKIP_DELTASEARCH |
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
674 XVID_ME_FASTREFINE16 |
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
675 XVID_ME_BFRAME_EARLYSTOP;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
676 vop_remove = ~XVID_VOP_MODEDECISION_RD &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
677 ~XVID_VOP_FAST_MODEDECISION_RD &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
678 ~XVID_VOP_TRELLISQUANT &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
679 ~XVID_VOP_INTER4V &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
680 ~XVID_VOP_HQACPRED;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
681
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
682 param->vol_flags &= ~XVID_VOL_GMC;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
683 param->vop_flags &= vop_remove;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
684 param->motion_flags &= motion_remove;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
685 param->motion_flags |= motion_replacements;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
686
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
687 return 0;
2131
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 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
691 * 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
692 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
693 * @param ref Context pointer for the plugin
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
694 * @param param Statistic data
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
695 * @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
696 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
697 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
698 xvid_plg_data_t *param) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
699 char *log = ref->twopassbuffer;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
700 char *frame_types = " ipbs";
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
701 char frame_type;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
702
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
703 /* Quick bounds check */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
704 if( log == NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
705 return XVID_ERR_FAIL;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
706
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
707 /* 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
708 if( param->type < 5 && param->type > 0 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
709 frame_type = frame_types[param->type];
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
710 } else {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
711 return XVID_ERR_FAIL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
712 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
713
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
714 snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
715 "%c %d %d %d %d %d %d\n",
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
716 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
717 param->stats.ublks, param->stats.length, param->stats.hlength);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
718
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
719 return 0;
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 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
723 * Dispatch function for our custom plugin.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
724 * 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
725 * on to other functions for actual processing.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
726 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
727 * @param ref Context pointer for the plugin
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
728 * @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
729 * @param p1 First parameter (varies)
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
730 * @param p2 Second parameter (varies)
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
731 * @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
732 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
733 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
734 switch( cmd ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
735 case XVID_PLG_INFO:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
736 case XVID_PLG_FRAME:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
737 return 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
738
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
739 case XVID_PLG_BEFORE:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
740 return xvid_ff_2pass_before(ref, p1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
741
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
742 case XVID_PLG_CREATE:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
743 return xvid_ff_2pass_create(p1, p2);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
744
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
745 case XVID_PLG_AFTER:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
746 return xvid_ff_2pass_after(ref, p1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
747
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
748 case XVID_PLG_DESTROY:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
749 return xvid_ff_2pass_destroy(ref, p1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
750
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
751 default:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
752 return XVID_ERR_FAIL;
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 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
757 * XviD codec definition for libavcodec.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
758 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
759 AVCodec xvid_encoder = {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
760 "xvid",
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
761 CODEC_TYPE_VIDEO,
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
762 CODEC_ID_XVID,
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
763 sizeof(xvid_context_t),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
764 ff_xvid_encode_init,
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
765 ff_xvid_encode_frame,
3343
35757cceddd0 10l to whoever wrote this
michael
parents: 3233
diff changeset
766 ff_xvid_encode_close,
35757cceddd0 10l to whoever wrote this
michael
parents: 3233
diff changeset
767 .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
768 };