Mercurial > libavcodec.hg
annotate libxvidff.c @ 12494:94eaea836bf4 libavcodec
Check avctx width/height more thoroughly (e.g. all values 0 except width would
have been accepted before).
Also do not fail if they are invalid but instead override them to 0.
This allows decoding e.g. MPEG video when only the container values are corrupted.
For encoding a value of 0,0 of course makes no sense, but was allowed
through before and will be caught by an extra check in the encode function.
author | reimar |
---|---|
date | Wed, 15 Sep 2010 04:46:55 +0000 |
parents | 9fef0a8ddd63 |
children |
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 | 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 | 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 | 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 | 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 | 52 struct xvid_context { |
12283 | 53 void *encoder_handle; /**< Handle for Xvid encoder */ |
54 int xsize; /**< Frame x size */ | |
55 int ysize; /**< Frame y size */ | |
56 int vop_flags; /**< VOP flags for Xvid encoder */ | |
57 int vol_flags; /**< VOL flags for Xvid encoder */ | |
58 int me_flags; /**< Motion Estimation flags */ | |
59 int qscale; /**< Do we use constant scale? */ | |
60 int quicktime_format; /**< Are we in a QT-based format? */ | |
61 AVFrame encoded_picture; /**< Encoded frame information */ | |
62 char *twopassbuffer; /**< Character buffer for two-pass */ | |
63 char *old_twopassbuffer; /**< Old character buffer (two-pass) */ | |
64 char *twopassfile; /**< second pass temp file name */ | |
65 unsigned char *intra_matrix; /**< P-Frame Quant Matrix */ | |
66 unsigned char *inter_matrix; /**< I-Frame Quant Matrix */ | |
8315 | 67 }; |
2967 | 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 | 72 struct xvid_ff_pass1 { |
12283 | 73 int version; /**< Xvid version */ |
74 struct xvid_context *context; /**< Pointer to private context */ | |
8315 | 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 | 80 void xvid_correct_framerate(AVCodecContext *avctx); |
81 | |
12122 | 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 | 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 | 120 /** |
12024 | 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 | 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 | 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 | 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 | 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 | 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 | 146 if( avctx->trellis |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 198 if( xvid_flags & CODEC_FLAG_GMC ) { |
199 x->vol_flags |= XVID_VOL_GMC; | |
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 | 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 | 212 |
8590 | 213 #if ARCH_PPC |
6908 | 214 /* Xvid's PPC support is borked, use libavcodec to detect */ |
8590 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 274 |
12098 | 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 | 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 | 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 | 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 | 287 |
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 | 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 | 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 | 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 | 321 xvid_enc_create.fincr = avctx->time_base.num; |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 354 } else |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
355 inter = NULL; |
2967 | 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 | 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 | 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 | 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 | 381 if(!avctx->codec_tag) |
8612 | 382 avctx->codec_tag = AV_RL32("xvid"); |
2967 | 383 } |
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 | 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 | 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 | 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 | 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 | 404 /** |
12024 | 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 | 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 | 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 | 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 | 429 *p = *picture; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
430 |
6908 | 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 | 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 | 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 | 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 | 453 |
6670 | 454 /* Pixel aspect ratio setting */ |
455 if (avctx->sample_aspect_ratio.num < 1 || avctx->sample_aspect_ratio.num > 255 || | |
456 avctx->sample_aspect_ratio.den < 1 || avctx->sample_aspect_ratio.den > 255) { | |
457 av_log(avctx, AV_LOG_ERROR, "Invalid pixel aspect ratio %i/%i\n", | |
458 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den); | |
459 return -1; | |
460 } | |
461 xvid_enc_frame.par = XVID_PAR_EXT; | |
462 xvid_enc_frame.par_width = avctx->sample_aspect_ratio.num; | |
463 xvid_enc_frame.par_height = avctx->sample_aspect_ratio.den; | |
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 | 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 | 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 | 487 } |
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 | 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 | 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 | 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 | 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 | 514 /** |
12024 | 515 * Destroy the private context for the encoder. |
6908 | 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 | 522 struct xvid_context *x = avctx->priv_data; |
2967 | 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 | 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 | 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 | 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 | 555 int xvid_strip_vol_header(AVCodecContext *avctx, |
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 | 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 | 568 } |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
569 } |
2967 | 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 | 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 | 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 | 600 |
2637 | 601 frate = avctx->time_base.den; |
602 fbase = avctx->time_base.num; | |
2967 | 603 |
8611 | 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 | 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 | 611 avctx->time_base.den = frate; |
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 | 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 | 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 | 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 | 630 } |
631 | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
632 if( fbase > est_fbase ) { |
2637 | 633 avctx->time_base.den = est_frate; |
634 avctx->time_base.num = est_fbase; | |
2967 | 635 av_log(avctx, AV_LOG_DEBUG, |
6908 | 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 | 639 avctx->time_base.den = frate; |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 680 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
681 *handle = x->context; |
2967 | 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 | 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 | 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 | 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 | 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 | 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 | 713 |
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 | 716 return 0; |
717 | |
718 /* We can implement a 'turbo' first pass mode here */ | |
719 param->quant = 2; | |
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 | 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 | 739 param->motion_flags |= motion_replacements; |
740 | |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 */ |