annotate libxvidff.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 9fef0a8ddd63
children
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
2131
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
12097
e8a29b278ebf Move av_tempfile() to libxvidff.c as only the xvid wrapper needs it
mru
parents: 12024
diff changeset
28 /* needed for mkstemp() */
e8a29b278ebf Move av_tempfile() to libxvidff.c as only the xvid wrapper needs it
mru
parents: 12024
diff changeset
29 #define _XOPEN_SOURCE 600
e8a29b278ebf Move av_tempfile() to libxvidff.c as only the xvid wrapper needs it
mru
parents: 12024
diff changeset
30
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
31 #include <xvid.h>
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
32 #include <unistd.h>
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
33 #include "avcodec.h"
12475
9fef0a8ddd63 Move mm_support() from libavcodec to libavutil, make it a public
stefano
parents: 12474
diff changeset
34 #include "libavutil/cpu.h"
8613
e75610c5da69 Fix compilation with --enable-libxvid.
cehoyos
parents: 8612
diff changeset
35 #include "libavutil/intreadwrite.h"
5101
c3f2379b80db Give all wrappers for external libraries names starting with lib.
diego
parents: 4962
diff changeset
36 #include "libxvid_internal.h"
12097
e8a29b278ebf Move av_tempfile() to libxvidff.c as only the xvid wrapper needs it
mru
parents: 12024
diff changeset
37 #if !HAVE_MKSTEMP
e8a29b278ebf Move av_tempfile() to libxvidff.c as only the xvid wrapper needs it
mru
parents: 12024
diff changeset
38 #include <fcntl.h>
e8a29b278ebf Move av_tempfile() to libxvidff.c as only the xvid wrapper needs it
mru
parents: 12024
diff changeset
39 #endif
2131
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 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
42 * Buffer management macros.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
43 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
44 #define BUFFER_SIZE 1024
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
45 #define BUFFER_REMAINING(x) (BUFFER_SIZE - strlen(x))
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
46 #define BUFFER_CAT(x) (&((x)[strlen(x)]))
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
47
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
48 /**
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
49 * Structure for the private Xvid context.
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
50 * 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
51 */
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
52 struct xvid_context {
12283
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
53 void *encoder_handle; /**< Handle for Xvid encoder */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
54 int xsize; /**< Frame x size */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
55 int ysize; /**< Frame y size */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
56 int vop_flags; /**< VOP flags for Xvid encoder */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
57 int vol_flags; /**< VOL flags for Xvid encoder */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
58 int me_flags; /**< Motion Estimation flags */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
59 int qscale; /**< Do we use constant scale? */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
60 int quicktime_format; /**< Are we in a QT-based format? */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
61 AVFrame encoded_picture; /**< Encoded frame information */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
62 char *twopassbuffer; /**< Character buffer for two-pass */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
63 char *old_twopassbuffer; /**< Old character buffer (two-pass) */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
64 char *twopassfile; /**< second pass temp file name */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
65 unsigned char *intra_matrix; /**< P-Frame Quant Matrix */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
66 unsigned char *inter_matrix; /**< I-Frame Quant Matrix */
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
67 };
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
68
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
69 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
70 * Structure for the private first-pass plugin.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
71 */
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
72 struct xvid_ff_pass1 {
12283
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
73 int version; /**< Xvid version */
a08f20066719 Fix doxy that refers to the wrong variable.
michael
parents: 12122
diff changeset
74 struct xvid_context *context; /**< Pointer to private context */
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
75 };
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
76
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
77 /* Prototypes - See function implementation for details */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
78 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
79 int xvid_ff_2pass(void *ref, int opt, void *p1, void *p2);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
80 void xvid_correct_framerate(AVCodecContext *avctx);
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
81
12122
dc6039ad4c7e Current Cygwin has mkstemp().
victor
parents: 12119
diff changeset
82 /* Wrapper to work around the lack of mkstemp() on mingw.
12118
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
83 * Also, tries to create file in /tmp first, if possible.
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
84 * *prefix can be a character constant; *filename will be allocated internally.
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
85 * @return file descriptor of opened file (or -1 on error)
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
86 * and opened file name in **filename. */
12119
4530b6b4d931 libxvid: add some const fixing a warning
mru
parents: 12118
diff changeset
87 int ff_tempfile(const char *prefix, char **filename) {
12118
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
88 int fd=-1;
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
89 #if !HAVE_MKSTEMP
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
90 *filename = tempnam(".", prefix);
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
91 #else
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
92 size_t len = strlen(prefix) + 12; /* room for "/tmp/" and "XXXXXX\0" */
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
93 *filename = av_malloc(len);
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
94 #endif
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
95 /* -----common section-----*/
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
96 if (*filename == NULL) {
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
97 av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot allocate file name\n");
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
98 return -1;
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
99 }
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
100 #if !HAVE_MKSTEMP
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
101 fd = open(*filename, O_RDWR | O_BINARY | O_CREAT, 0444);
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
102 #else
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
103 snprintf(*filename, len, "/tmp/%sXXXXXX", prefix);
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
104 fd = mkstemp(*filename);
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
105 if (fd < 0) {
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
106 snprintf(*filename, len, "./%sXXXXXX", prefix);
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
107 fd = mkstemp(*filename);
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
108 }
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
109 #endif
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
110 /* -----common section-----*/
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
111 if (fd < 0) {
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
112 av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot open temporary file %s\n", *filename);
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
113 return -1;
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
114 }
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
115 return fd; /* success */
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
116 }
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
117
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
118 #if CONFIG_LIBXVID_ENCODER
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
119
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
120 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
121 * Create the private context for the encoder.
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
122 * 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
123 * and the encoder context created.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
124 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
125 * @param avctx AVCodecContext pointer to context
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
126 * @return Returns 0 on success, -1 on failure
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
127 */
11321
e0feb5fa4e97 Make the following functions static (and remove ff_), they are only used
cehoyos
parents: 10146
diff changeset
128 static av_cold int xvid_encode_init(AVCodecContext *avctx) {
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
129 int xerr, i;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
130 int xvid_flags = avctx->flags;
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
131 struct xvid_context *x = avctx->priv_data;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
132 uint16_t *intra, *inter;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
133 int fd;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
134
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
135 xvid_plugin_single_t single;
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
136 struct xvid_ff_pass1 rc2pass1;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
137 xvid_plugin_2pass2_t rc2pass2;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
138 xvid_gbl_init_t xvid_gbl_init;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
139 xvid_enc_create_t xvid_enc_create;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
140 xvid_enc_plugin_t plugins[7];
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
141
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
142 /* Bring in VOP flags from ffmpeg command-line */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
143 x->vop_flags = XVID_VOP_HALFPEL; /* Bare minimum quality */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
144 if( xvid_flags & CODEC_FLAG_4MV )
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
145 x->vop_flags |= XVID_VOP_INTER4V; /* Level 3 */
7034
130784da5595 uniformize trellis quant option
bcoudurier
parents: 6908
diff changeset
146 if( avctx->trellis
130784da5595 uniformize trellis quant option
bcoudurier
parents: 6908
diff changeset
147 )
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
148 x->vop_flags |= XVID_VOP_TRELLISQUANT; /* Level 5 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
149 if( xvid_flags & CODEC_FLAG_AC_PRED )
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
150 x->vop_flags |= XVID_VOP_HQACPRED; /* Level 6 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
151 if( xvid_flags & CODEC_FLAG_GRAY )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
152 x->vop_flags |= XVID_VOP_GREYSCALE;
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 /* Decide which ME quality setting to use */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
155 x->me_flags = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
156 switch( avctx->me_method ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
157 case ME_FULL: /* Quality 6 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
158 x->me_flags |= XVID_ME_EXTSEARCH16
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
159 | XVID_ME_EXTSEARCH8;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
160
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
161 case ME_EPZS: /* Quality 4 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
162 x->me_flags |= XVID_ME_ADVANCEDDIAMOND8
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
163 | XVID_ME_HALFPELREFINE8
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
164 | XVID_ME_CHROMA_PVOP
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
165 | XVID_ME_CHROMA_BVOP;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
166
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
167 case ME_LOG: /* Quality 2 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
168 case ME_PHODS:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
169 case ME_X1:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
170 x->me_flags |= XVID_ME_ADVANCEDDIAMOND16
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
171 | XVID_ME_HALFPELREFINE16;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
172
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
173 case ME_ZERO: /* Quality 0 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
174 default:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
175 break;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
176 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
177
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
178 /* Decide how we should decide blocks */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
179 switch( avctx->mb_decision ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
180 case 2:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
181 x->vop_flags |= XVID_VOP_MODEDECISION_RD;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
182 x->me_flags |= XVID_ME_HALFPELREFINE8_RD
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
183 | XVID_ME_QUARTERPELREFINE8_RD
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
184 | XVID_ME_EXTSEARCH_RD
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
185 | XVID_ME_CHECKPREDICTION_RD;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
186 case 1:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
187 if( !(x->vop_flags & XVID_VOP_MODEDECISION_RD) )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
188 x->vop_flags |= XVID_VOP_FAST_MODEDECISION_RD;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
189 x->me_flags |= XVID_ME_HALFPELREFINE16_RD
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
190 | XVID_ME_QUARTERPELREFINE16_RD;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
191
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
192 default:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
193 break;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
194 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
195
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
196 /* Bring in VOL flags from ffmpeg command-line */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
197 x->vol_flags = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
198 if( xvid_flags & CODEC_FLAG_GMC ) {
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
199 x->vol_flags |= XVID_VOL_GMC;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
200 x->me_flags |= XVID_ME_GME_REFINE;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
201 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
202 if( xvid_flags & CODEC_FLAG_QPEL ) {
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
203 x->vol_flags |= XVID_VOL_QUARTERPEL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
204 x->me_flags |= XVID_ME_QUARTERPELREFINE16;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
205 if( x->vop_flags & XVID_VOP_INTER4V )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
206 x->me_flags |= XVID_ME_QUARTERPELREFINE8;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
207 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
208
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
209 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
210 xvid_gbl_init.version = XVID_VERSION;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
211 xvid_gbl_init.debug = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
212
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8496
diff changeset
213 #if ARCH_PPC
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
214 /* Xvid's PPC support is borked, use libavcodec to detect */
8590
7a463923ecd1 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 8496
diff changeset
215 #if HAVE_ALTIVEC
12475
9fef0a8ddd63 Move mm_support() from libavcodec to libavutil, make it a public
stefano
parents: 12474
diff changeset
216 if (av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC) {
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
217 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
218 } else
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
219 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
220 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
221 #else
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
222 /* Xvid can detect on x86 */
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
223 xvid_gbl_init.cpu_flags = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
224 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
225
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
226 /* Initialize */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
227 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
228
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
229 /* Create the encoder reference */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
230 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
231 xvid_enc_create.version = XVID_VERSION;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
232
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
233 /* Store the desired frame size */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
234 xvid_enc_create.width = x->xsize = avctx->width;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
235 xvid_enc_create.height = x->ysize = avctx->height;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
236
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
237 /* Xvid can determine the proper profile to use */
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
238 /* xvid_enc_create.profile = XVID_PROFILE_S_L3; */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
239
6665
c22932db0ebb Make Xvid wrapper use threads (with support for newest CVS Xvid only)
superdump
parents: 6517
diff changeset
240 /* We don't use zones */
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
241 xvid_enc_create.zones = NULL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
242 xvid_enc_create.num_zones = 0;
6665
c22932db0ebb Make Xvid wrapper use threads (with support for newest CVS Xvid only)
superdump
parents: 6517
diff changeset
243
c22932db0ebb Make Xvid wrapper use threads (with support for newest CVS Xvid only)
superdump
parents: 6517
diff changeset
244 xvid_enc_create.num_threads = avctx->thread_count;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
245
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
246 xvid_enc_create.plugins = plugins;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
247 xvid_enc_create.num_plugins = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
248
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
249 /* Initialize Buffers */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
250 x->twopassbuffer = NULL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
251 x->old_twopassbuffer = NULL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
252 x->twopassfile = NULL;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
253
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
254 if( xvid_flags & CODEC_FLAG_PASS1 ) {
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
255 memset(&rc2pass1, 0, sizeof(struct xvid_ff_pass1));
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
256 rc2pass1.version = XVID_VERSION;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
257 rc2pass1.context = x;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
258 x->twopassbuffer = av_malloc(BUFFER_SIZE);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
259 x->old_twopassbuffer = av_malloc(BUFFER_SIZE);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
260 if( x->twopassbuffer == NULL || x->old_twopassbuffer == NULL ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
261 av_log(avctx, AV_LOG_ERROR,
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
262 "Xvid: Cannot allocate 2-pass log buffers\n");
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
263 return -1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
264 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
265 x->twopassbuffer[0] = x->old_twopassbuffer[0] = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
266
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
267 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
268 plugins[xvid_enc_create.num_plugins].param = &rc2pass1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
269 xvid_enc_create.num_plugins++;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
270 } else if( xvid_flags & CODEC_FLAG_PASS2 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
271 memset(&rc2pass2, 0, sizeof(xvid_plugin_2pass2_t));
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
272 rc2pass2.version = XVID_VERSION;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
273 rc2pass2.bitrate = avctx->bit_rate;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
274
12098
95f57b61c9b3 Rename av_tempfile() to ff_tempfile()
mru
parents: 12097
diff changeset
275 fd = ff_tempfile("xvidff.", &(x->twopassfile));
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
276 if( fd == -1 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
277 av_log(avctx, AV_LOG_ERROR,
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
278 "Xvid: Cannot write 2-pass pipe\n");
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
279 return -1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
280 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
281
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
282 if( avctx->stats_in == NULL ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
283 av_log(avctx, AV_LOG_ERROR,
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
284 "Xvid: No 2-pass information loaded for second pass\n");
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
285 return -1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
286 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
287
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
288 if( strlen(avctx->stats_in) >
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
289 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
290 close(fd);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
291 av_log(avctx, AV_LOG_ERROR,
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
292 "Xvid: Cannot write to 2-pass pipe\n");
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
293 return -1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
294 }
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 close(fd);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
297 rc2pass2.filename = x->twopassfile;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
298 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
299 plugins[xvid_enc_create.num_plugins].param = &rc2pass2;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
300 xvid_enc_create.num_plugins++;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
301 } else if( !(xvid_flags & CODEC_FLAG_QSCALE) ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
302 /* Single Pass Bitrate Control! */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
303 memset(&single, 0, sizeof(xvid_plugin_single_t));
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
304 single.version = XVID_VERSION;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
305 single.bitrate = avctx->bit_rate;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
306
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
307 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
308 plugins[xvid_enc_create.num_plugins].param = &single;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
309 xvid_enc_create.num_plugins++;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
310 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
311
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
312 /* Luminance Masking */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
313 if( 0.0 != avctx->lumi_masking ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
314 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
315 plugins[xvid_enc_create.num_plugins].param = NULL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
316 xvid_enc_create.num_plugins++;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
317 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
318
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
319 /* Frame Rate and Key Frames */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
320 xvid_correct_framerate(avctx);
2637
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
321 xvid_enc_create.fincr = avctx->time_base.num;
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
322 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
323 if( avctx->gop_size > 0 )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
324 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
325 else
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
326 xvid_enc_create.max_key_interval = 240; /* Xvid's best default */
2131
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 /* Quants */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
329 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
330 else x->qscale = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
331
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
332 xvid_enc_create.min_quant[0] = avctx->qmin;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
333 xvid_enc_create.min_quant[1] = avctx->qmin;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
334 xvid_enc_create.min_quant[2] = avctx->qmin;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
335 xvid_enc_create.max_quant[0] = avctx->qmax;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
336 xvid_enc_create.max_quant[1] = avctx->qmax;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
337 xvid_enc_create.max_quant[2] = avctx->qmax;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
338
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
339 /* Quant Matrices */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
340 x->intra_matrix = x->inter_matrix = NULL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
341 if( avctx->mpeg_quant )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
342 x->vol_flags |= XVID_VOL_MPEGQUANT;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
343 if( (avctx->intra_matrix || avctx->inter_matrix) ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
344 x->vol_flags |= XVID_VOL_MPEGQUANT;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
345
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
346 if( avctx->intra_matrix ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
347 intra = avctx->intra_matrix;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
348 x->intra_matrix = av_malloc(sizeof(unsigned char) * 64);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
349 } else
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
350 intra = NULL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
351 if( avctx->inter_matrix ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
352 inter = avctx->inter_matrix;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
353 x->inter_matrix = av_malloc(sizeof(unsigned char) * 64);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
354 } else
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
355 inter = NULL;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
356
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
357 for( i = 0; i < 64; i++ ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
358 if( intra )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
359 x->intra_matrix[i] = (unsigned char)intra[i];
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
360 if( inter )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
361 x->inter_matrix[i] = (unsigned char)inter[i];
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
362 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
363 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
364
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
365 /* Misc Settings */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
366 xvid_enc_create.frame_drop_ratio = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
367 xvid_enc_create.global = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
368 if( xvid_flags & CODEC_FLAG_CLOSED_GOP )
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
369 xvid_enc_create.global |= XVID_GLOBAL_CLOSED_GOP;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
370
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
371 /* Determines which codec mode we are operating in */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
372 avctx->extradata = NULL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
373 avctx->extradata_size = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
374 if( xvid_flags & CODEC_FLAG_GLOBAL_HEADER ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
375 /* 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
376 x->quicktime_format = 1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
377 avctx->codec_id = CODEC_ID_MPEG4;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
378 } else {
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
379 /* We are claiming to be Xvid */
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
380 x->quicktime_format = 0;
4023
508f089d0b28 Have xvid encoder wrapper honnor -vtag option
gpoirier
parents: 4004
diff changeset
381 if(!avctx->codec_tag)
8612
b20c590170cc remove ff_get_fourcc() and use AV_RL32() instead
aurel
parents: 8611
diff changeset
382 avctx->codec_tag = AV_RL32("xvid");
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
383 }
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
384
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
385 /* Bframes */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
386 xvid_enc_create.max_bframes = avctx->max_b_frames;
3202
89348aaf566e fixing bquant_offset
michael
parents: 3036
diff changeset
387 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
388 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
389 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
390
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
391 /* Create encoder context */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
392 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
393 if( xerr ) {
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
394 av_log(avctx, AV_LOG_ERROR, "Xvid: Could not create encoder reference\n");
2131
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 x->encoder_handle = xvid_enc_create.handle;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
399 avctx->coded_frame = &x->encoded_picture;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
400
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
401 return 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
402 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
403
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
404 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
405 * Encode a single frame.
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
406 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
407 * @param avctx AVCodecContext pointer to context
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
408 * @param frame Pointer to encoded frame buffer
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
409 * @param buf_size Size of encoded frame buffer
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
410 * @param data Pointer to AVFrame of unencoded frame
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
411 * @return Returns 0 on success, -1 on failure
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
412 */
11321
e0feb5fa4e97 Make the following functions static (and remove ff_), they are only used
cehoyos
parents: 10146
diff changeset
413 static int xvid_encode_frame(AVCodecContext *avctx,
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
414 unsigned char *frame, int buf_size, void *data) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
415 int xerr, i;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
416 char *tmp;
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
417 struct xvid_context *x = avctx->priv_data;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
418 AVFrame *picture = data;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
419 AVFrame *p = &(x->encoded_picture);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
420
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
421 xvid_enc_frame_t xvid_enc_frame;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
422 xvid_enc_stats_t xvid_enc_stats;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
423
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
424 /* Start setting up the frame */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
425 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
426 xvid_enc_frame.version = XVID_VERSION;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
427 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
428 xvid_enc_stats.version = XVID_VERSION;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
429 *p = *picture;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
430
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
431 /* Let Xvid know where to put the frame. */
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
432 xvid_enc_frame.bitstream = frame;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
433 xvid_enc_frame.length = buf_size;
2967
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 /* Initialize input image fields */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
436 if( avctx->pix_fmt != PIX_FMT_YUV420P ) {
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
437 av_log(avctx, AV_LOG_ERROR, "Xvid: Color spaces other than 420p not supported\n");
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
438 return -1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
439 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
440
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
441 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
442
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
443 for( i = 0; i < 4; i++ ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
444 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
445 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
446 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
447
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
448 /* Encoder Flags */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
449 xvid_enc_frame.vop_flags = x->vop_flags;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
450 xvid_enc_frame.vol_flags = x->vol_flags;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
451 xvid_enc_frame.motion = x->me_flags;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
452 xvid_enc_frame.type = XVID_TYPE_AUTO;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
453
6670
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
454 /* Pixel aspect ratio setting */
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
455 if (avctx->sample_aspect_ratio.num < 1 || avctx->sample_aspect_ratio.num > 255 ||
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
456 avctx->sample_aspect_ratio.den < 1 || avctx->sample_aspect_ratio.den > 255) {
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
457 av_log(avctx, AV_LOG_ERROR, "Invalid pixel aspect ratio %i/%i\n",
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
458 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den);
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
459 return -1;
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
460 }
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
461 xvid_enc_frame.par = XVID_PAR_EXT;
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
462 xvid_enc_frame.par_width = avctx->sample_aspect_ratio.num;
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
463 xvid_enc_frame.par_height = avctx->sample_aspect_ratio.den;
33d3c14d5a57 Set pixel aspect ratio for libxvid wrapper.
benoit
parents: 6665
diff changeset
464
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
465 /* Quant Setting */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
466 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
467 else xvid_enc_frame.quant = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
468
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
469 /* Matrices */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
470 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
471 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
472
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
473 /* Encode */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
474 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
475 &xvid_enc_frame, &xvid_enc_stats);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
476
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
477 /* Two-pass log buffer swapping */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
478 avctx->stats_out = NULL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
479 if( x->twopassbuffer ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
480 tmp = x->old_twopassbuffer;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
481 x->old_twopassbuffer = x->twopassbuffer;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
482 x->twopassbuffer = tmp;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
483 x->twopassbuffer[0] = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
484 if( x->old_twopassbuffer[0] != 0 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
485 avctx->stats_out = x->old_twopassbuffer;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
486 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
487 }
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 if( 0 <= xerr ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
490 p->quality = xvid_enc_stats.quant * FF_QP2LAMBDA;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
491 if( xvid_enc_stats.type == XVID_TYPE_PVOP )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
492 p->pict_type = FF_P_TYPE;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
493 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
494 p->pict_type = FF_B_TYPE;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
495 else if( xvid_enc_stats.type == XVID_TYPE_SVOP )
2451
michael
parents: 2131
diff changeset
496 p->pict_type = FF_S_TYPE;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
497 else
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
498 p->pict_type = FF_I_TYPE;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
499 if( xvid_enc_frame.out_flags & XVID_KEYFRAME ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
500 p->key_frame = 1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
501 if( x->quicktime_format )
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
502 return xvid_strip_vol_header(avctx, frame,
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
503 xvid_enc_stats.hlength, xerr);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
504 } else
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
505 p->key_frame = 0;
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 return xerr;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
508 } else {
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
509 av_log(avctx, AV_LOG_ERROR, "Xvid: Encoding Error Occurred: %i\n", xerr);
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
510 return -1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
511 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
512 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
513
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
514 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
515 * Destroy the private context for the encoder.
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
516 * All buffers are freed, and the Xvid encoder context is destroyed.
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
517 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
518 * @param avctx AVCodecContext pointer to context
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
519 * @return Returns 0, success guaranteed
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
520 */
11321
e0feb5fa4e97 Make the following functions static (and remove ff_), they are only used
cehoyos
parents: 10146
diff changeset
521 static av_cold int xvid_encode_close(AVCodecContext *avctx) {
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
522 struct xvid_context *x = avctx->priv_data;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
523
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
524 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
525
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
526 if( avctx->extradata != NULL )
11543
965eca23972e libxvid: Clear extradata pointer when freeing it.
ramiro
parents: 11468
diff changeset
527 av_freep(&avctx->extradata);
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
528 if( x->twopassbuffer != NULL ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
529 av_free(x->twopassbuffer);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
530 av_free(x->old_twopassbuffer);
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 if( x->twopassfile != NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
533 av_free(x->twopassfile);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
534 if( x->intra_matrix != NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
535 av_free(x->intra_matrix);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
536 if( x->inter_matrix != NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
537 av_free(x->inter_matrix);
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 return 0;
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
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
542 /**
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
543 * Routine to create a global VO/VOL header for MP4 container.
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
544 * What we do here is extract the header from the Xvid bitstream
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
545 * 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
546 * 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
547 * compliance.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
548 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
549 * @param avctx AVCodecContext pointer to context
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
550 * @param frame Pointer to encoded frame data
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
551 * @param header_len Length of header to search
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
552 * @param frame_len Length of encoded frame data
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
553 * @return Returns new length of frame data
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 int xvid_strip_vol_header(AVCodecContext *avctx,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
556 unsigned char *frame,
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
557 unsigned int header_len,
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
558 unsigned int frame_len) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
559 int vo_len = 0, i;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
560
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
561 for( i = 0; i < header_len - 3; i++ ) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
562 if( frame[i] == 0x00 &&
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
563 frame[i+1] == 0x00 &&
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
564 frame[i+2] == 0x01 &&
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
565 frame[i+3] == 0xB6 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
566 vo_len = i;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
567 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
568 }
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
569 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
570
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
571 if( vo_len > 0 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
572 /* 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
573 if( avctx->extradata == NULL ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
574 avctx->extradata = av_malloc(vo_len);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
575 memcpy(avctx->extradata, frame, vo_len);
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
576 avctx->extradata_size = vo_len;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
577 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
578 /* Less dangerous now, memmove properly copies the two
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
579 chunks of overlapping data */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
580 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
581 return frame_len - vo_len;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
582 } else
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
583 return frame_len;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
584 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
585
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
586 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
587 * Routine to correct a possibly erroneous framerate being fed to us.
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
588 * 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
589 * extremely large. This function works to correct problems in this area
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
590 * 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
591 * the two presented.
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 * @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
594 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
595 void xvid_correct_framerate(AVCodecContext *avctx) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
596 int frate, fbase;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
597 int est_frate, est_fbase;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
598 int gcd;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
599 float est_fps, fps;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
600
2637
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
601 frate = avctx->time_base.den;
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
602 fbase = avctx->time_base.num;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
603
8611
a637db9f59b1 export gcd function as av_gcd()
aurel
parents: 8590
diff changeset
604 gcd = av_gcd(frate, fbase);
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
605 if( gcd > 1 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
606 frate /= gcd;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
607 fbase /= gcd;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
608 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
609
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
610 if( frate <= 65000 && fbase <= 65000 ) {
2637
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
611 avctx->time_base.den = frate;
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
612 avctx->time_base.num = fbase;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
613 return;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
614 }
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 fps = (float)frate / (float)fbase;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
617 est_fps = roundf(fps * 1000.0) / 1000.0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
618
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
619 est_frate = (int)est_fps;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
620 if( est_fps > (int)est_fps ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
621 est_frate = (est_frate + 1) * 1000;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
622 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
623 } else
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
624 est_fbase = 1;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
625
8611
a637db9f59b1 export gcd function as av_gcd()
aurel
parents: 8590
diff changeset
626 gcd = av_gcd(est_frate, est_fbase);
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
627 if( gcd > 1 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
628 est_frate /= gcd;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
629 est_fbase /= gcd;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
630 }
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
631
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
632 if( fbase > est_fbase ) {
2637
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
633 avctx->time_base.den = est_frate;
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
634 avctx->time_base.num = est_fbase;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
635 av_log(avctx, AV_LOG_DEBUG,
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
636 "Xvid: framerate re-estimated: %.2f, %.3f%% correction\n",
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
637 est_fps, (((est_fps - fps)/fps) * 100.0));
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
638 } else {
2637
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
639 avctx->time_base.den = frate;
ef44d24680d1 switch to native time bases
michael
parents: 2574
diff changeset
640 avctx->time_base.num = fbase;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
641 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
642 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
643
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
644 /*
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
645 * Xvid 2-Pass Kludge Section
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
646 *
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
647 * Xvid's default 2-pass doesn't allow us to create data as we need to, so
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
648 * 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
649 * statistic information as libavcodec requests in. We have another kludge
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
650 * that allows us to pass data to the second pass in Xvid without a custom
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
651 * rate-control plugin.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
652 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
653
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
654 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
655 * Initialize the two-pass plugin and context.
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
656 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
657 * @param param Input construction parameter structure
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
658 * @param handle Private context handle
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
659 * @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
660 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
661 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
662 void ** handle) {
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
663 struct xvid_ff_pass1 *x = (struct xvid_ff_pass1 *)param->param;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
664 char *log = x->context->twopassbuffer;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
665
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
666 /* Do a quick bounds check */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
667 if( log == NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
668 return XVID_ERR_FAIL;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
669
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
670 /* We use snprintf() */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
671 /* 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
672 log[0] = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
673 snprintf(log, BUFFER_REMAINING(log),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
674 "# 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
675 snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
676 "# 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
677 XVID_VERSION_MAJOR(XVID_VERSION),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
678 XVID_VERSION_MINOR(XVID_VERSION),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
679 XVID_VERSION_PATCH(XVID_VERSION));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
680
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
681 *handle = x->context;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
682 return 0;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
683 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
684
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
685 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
686 * Destroy the two-pass plugin context.
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
687 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
688 * @param ref Context pointer for the plugin
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
689 * @param param Destrooy context
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
690 * @return Returns 0, success guaranteed
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
691 */
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
692 static int xvid_ff_2pass_destroy(struct xvid_context *ref,
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
693 xvid_plg_destroy_t *param) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
694 /* 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
695 /* 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
696 if( ref->twopassbuffer != NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
697 ref->twopassbuffer[0] = 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
698 return 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
699 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
700
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
701 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
702 * Enable fast encode mode during the first pass.
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
703 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
704 * @param ref Context pointer for the plugin
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
705 * @param param Frame data
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
706 * @return Returns 0, success guaranteed
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
707 */
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
708 static int xvid_ff_2pass_before(struct xvid_context *ref,
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
709 xvid_plg_data_t *param) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
710 int motion_remove;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
711 int motion_replacements;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
712 int vop_remove;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
713
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
714 /* 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
715 if( param->zone && param->zone->mode == XVID_ZONE_QUANT )
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
716 return 0;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
717
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
718 /* We can implement a 'turbo' first pass mode here */
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
719 param->quant = 2;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
720
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
721 /* Init values */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
722 motion_remove = ~XVID_ME_CHROMA_PVOP &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
723 ~XVID_ME_CHROMA_BVOP &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
724 ~XVID_ME_EXTSEARCH16 &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
725 ~XVID_ME_ADVANCEDDIAMOND16;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
726 motion_replacements = XVID_ME_FAST_MODEINTERPOLATE |
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
727 XVID_ME_SKIP_DELTASEARCH |
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
728 XVID_ME_FASTREFINE16 |
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
729 XVID_ME_BFRAME_EARLYSTOP;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
730 vop_remove = ~XVID_VOP_MODEDECISION_RD &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
731 ~XVID_VOP_FAST_MODEDECISION_RD &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
732 ~XVID_VOP_TRELLISQUANT &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
733 ~XVID_VOP_INTER4V &
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
734 ~XVID_VOP_HQACPRED;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
735
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
736 param->vol_flags &= ~XVID_VOL_GMC;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
737 param->vop_flags &= vop_remove;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
738 param->motion_flags &= motion_remove;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
739 param->motion_flags |= motion_replacements;
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
740
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
741 return 0;
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
742 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
743
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
744 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11644
diff changeset
745 * Capture statistic data and write it during first pass.
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
746 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
747 * @param ref Context pointer for the plugin
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
748 * @param param Statistic data
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
749 * @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
750 */
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
751 static int xvid_ff_2pass_after(struct xvid_context *ref,
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
752 xvid_plg_data_t *param) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
753 char *log = ref->twopassbuffer;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
754 char *frame_types = " ipbs";
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
755 char frame_type;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
756
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
757 /* Quick bounds check */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
758 if( log == NULL )
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
759 return XVID_ERR_FAIL;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
760
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
761 /* 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
762 if( param->type < 5 && param->type > 0 ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
763 frame_type = frame_types[param->type];
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
764 } else {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
765 return XVID_ERR_FAIL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
766 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
767
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
768 snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log),
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
769 "%c %d %d %d %d %d %d\n",
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
770 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
771 param->stats.ublks, param->stats.length, param->stats.hlength);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
772
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
773 return 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
774 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
775
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
776 /**
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
777 * Dispatch function for our custom plugin.
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
778 * This handles the dispatch for the Xvid plugin. It passes data
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
779 * on to other functions for actual processing.
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
780 *
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
781 * @param ref Context pointer for the plugin
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
782 * @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
783 * @param p1 First parameter (varies)
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
784 * @param p2 Second parameter (varies)
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
785 * @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
786 */
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
787 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
788 switch( cmd ) {
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
789 case XVID_PLG_INFO:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
790 case XVID_PLG_FRAME:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
791 return 0;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
792
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
793 case XVID_PLG_BEFORE:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
794 return xvid_ff_2pass_before(ref, p1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
795
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
796 case XVID_PLG_CREATE:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
797 return xvid_ff_2pass_create(p1, p2);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
798
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
799 case XVID_PLG_AFTER:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
800 return xvid_ff_2pass_after(ref, p1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
801
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
802 case XVID_PLG_DESTROY:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
803 return xvid_ff_2pass_destroy(ref, p1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2821
diff changeset
804
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
805 default:
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
806 return XVID_ERR_FAIL;
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
807 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
808 }
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
809
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
810 /**
6908
25dcd46b8160 cosmetics: XviD is now called Xvid.
diego
parents: 6788
diff changeset
811 * Xvid codec definition for libavcodec.
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
812 */
5103
1deb3e53da27 Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents: 5101
diff changeset
813 AVCodec libxvid_encoder = {
1deb3e53da27 Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents: 5101
diff changeset
814 "libxvid",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11543
diff changeset
815 AVMEDIA_TYPE_VIDEO,
11468
67786aecf351 libxvid is producing standard mpeg4 so it don't need its own codec id
aurel
parents: 11321
diff changeset
816 CODEC_ID_MPEG4,
8315
7ccdcc976edd Do not invade _t POSIX namespace.
diego
parents: 8250
diff changeset
817 sizeof(struct xvid_context),
11321
e0feb5fa4e97 Make the following functions static (and remove ff_), they are only used
cehoyos
parents: 10146
diff changeset
818 xvid_encode_init,
e0feb5fa4e97 Make the following functions static (and remove ff_), they are only used
cehoyos
parents: 10146
diff changeset
819 xvid_encode_frame,
e0feb5fa4e97 Make the following functions static (and remove ff_), they are only used
cehoyos
parents: 10146
diff changeset
820 xvid_encode_close,
10146
38cfe222e1a4 Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents: 8718
diff changeset
821 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 7034
diff changeset
822 .long_name= NULL_IF_CONFIG_SMALL("libxvidcore MPEG-4 part 2"),
2131
060053df9538 XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff changeset
823 };
12118
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
824
14f1cfd2f1f2 Allow using libxvid RC without enabling encoding wrapper
mru
parents: 12098
diff changeset
825 #endif /* CONFIG_LIBXVID_ENCODER */