Mercurial > libavcodec.hg
annotate libxvidff.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | e0feb5fa4e97 |
children | 67786aecf351 |
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 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8673
diff
changeset
|
23 * @file libavcodec/libxvidff.c |
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 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
28 #include <xvid.h> |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
29 #include <unistd.h> |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
30 #include "avcodec.h" |
8613 | 31 #include "libavutil/intreadwrite.h" |
5101
c3f2379b80db
Give all wrappers for external libraries names starting with lib.
diego
parents:
4962
diff
changeset
|
32 #include "libxvid_internal.h" |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
33 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
34 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
35 * Buffer management macros. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
36 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
37 #define BUFFER_SIZE 1024 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
38 #define BUFFER_REMAINING(x) (BUFFER_SIZE - strlen(x)) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
39 #define BUFFER_CAT(x) (&((x)[strlen(x)])) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
40 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
41 /* For PPC Use */ |
8250 | 42 int has_altivec(void); |
2131
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 /** |
6908 | 45 * Structure for the private Xvid context. |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
46 * 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
|
47 */ |
8315 | 48 struct xvid_context { |
6908 | 49 void *encoder_handle; /** Handle for Xvid encoder */ |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
50 int xsize, ysize; /** Frame size */ |
6908 | 51 int vop_flags; /** VOP flags for Xvid encoder */ |
52 int vol_flags; /** VOL flags for Xvid encoder */ | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
53 int me_flags; /** Motion Estimation flags */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
54 int qscale; /** Do we use constant scale? */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
55 int quicktime_format; /** Are we in a QT-based format? */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
56 AVFrame encoded_picture; /** Encoded frame information */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
57 char *twopassbuffer; /** Character buffer for two-pass */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
58 char *old_twopassbuffer; /** Old character buffer (two-pass) */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
59 char *twopassfile; /** second pass temp file name */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
60 unsigned char *intra_matrix; /** P-Frame Quant Matrix */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
61 unsigned char *inter_matrix; /** I-Frame Quant Matrix */ |
8315 | 62 }; |
2967 | 63 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
64 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
65 * Structure for the private first-pass plugin. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
66 */ |
8315 | 67 struct xvid_ff_pass1 { |
6908 | 68 int version; /** Xvid version */ |
8315 | 69 struct xvid_context *context; /** Pointer to private context */ |
70 }; | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
71 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
72 /* Prototypes - See function implementation for details */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
73 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
|
74 int xvid_ff_2pass(void *ref, int opt, void *p1, void *p2); |
2967 | 75 void xvid_correct_framerate(AVCodecContext *avctx); |
76 | |
77 /** | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
78 * Creates the private context for the encoder. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
79 * 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
|
80 * and the encoder context created. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
81 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
82 * @param avctx AVCodecContext pointer to context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
83 * @return Returns 0 on success, -1 on failure |
2967 | 84 */ |
11321
e0feb5fa4e97
Make the following functions static (and remove ff_), they are only used
cehoyos
parents:
10146
diff
changeset
|
85 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
|
86 int xerr, i; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
87 int xvid_flags = avctx->flags; |
8315 | 88 struct xvid_context *x = avctx->priv_data; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
89 uint16_t *intra, *inter; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
90 int fd; |
2967 | 91 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
92 xvid_plugin_single_t single; |
8315 | 93 struct xvid_ff_pass1 rc2pass1; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
94 xvid_plugin_2pass2_t rc2pass2; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
95 xvid_gbl_init_t xvid_gbl_init; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
96 xvid_enc_create_t xvid_enc_create; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
97 xvid_enc_plugin_t plugins[7]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
98 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
99 /* Bring in VOP flags from ffmpeg command-line */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
100 x->vop_flags = XVID_VOP_HALFPEL; /* Bare minimum quality */ |
2967 | 101 if( xvid_flags & CODEC_FLAG_4MV ) |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
102 x->vop_flags |= XVID_VOP_INTER4V; /* Level 3 */ |
7034 | 103 if( avctx->trellis |
104 ) | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
105 x->vop_flags |= XVID_VOP_TRELLISQUANT; /* Level 5 */ |
2967 | 106 if( xvid_flags & CODEC_FLAG_AC_PRED ) |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
107 x->vop_flags |= XVID_VOP_HQACPRED; /* Level 6 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
108 if( xvid_flags & CODEC_FLAG_GRAY ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
109 x->vop_flags |= XVID_VOP_GREYSCALE; |
2967 | 110 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
111 /* Decide which ME quality setting to use */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
112 x->me_flags = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
113 switch( avctx->me_method ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
114 case ME_FULL: /* Quality 6 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
115 x->me_flags |= XVID_ME_EXTSEARCH16 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
116 | XVID_ME_EXTSEARCH8; |
2967 | 117 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
118 case ME_EPZS: /* Quality 4 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
119 x->me_flags |= XVID_ME_ADVANCEDDIAMOND8 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
120 | XVID_ME_HALFPELREFINE8 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
121 | XVID_ME_CHROMA_PVOP |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
122 | XVID_ME_CHROMA_BVOP; |
2967 | 123 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
124 case ME_LOG: /* Quality 2 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
125 case ME_PHODS: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
126 case ME_X1: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
127 x->me_flags |= XVID_ME_ADVANCEDDIAMOND16 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
128 | XVID_ME_HALFPELREFINE16; |
2967 | 129 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
130 case ME_ZERO: /* Quality 0 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
131 default: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
132 break; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
133 } |
2967 | 134 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
135 /* Decide how we should decide blocks */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
136 switch( avctx->mb_decision ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
137 case 2: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
138 x->vop_flags |= XVID_VOP_MODEDECISION_RD; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
139 x->me_flags |= XVID_ME_HALFPELREFINE8_RD |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
140 | XVID_ME_QUARTERPELREFINE8_RD |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
141 | XVID_ME_EXTSEARCH_RD |
2967 | 142 | XVID_ME_CHECKPREDICTION_RD; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
143 case 1: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
144 if( !(x->vop_flags & XVID_VOP_MODEDECISION_RD) ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
145 x->vop_flags |= XVID_VOP_FAST_MODEDECISION_RD; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
146 x->me_flags |= XVID_ME_HALFPELREFINE16_RD |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
147 | XVID_ME_QUARTERPELREFINE16_RD; |
2967 | 148 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
149 default: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
150 break; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
151 } |
2967 | 152 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
153 /* Bring in VOL flags from ffmpeg command-line */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
154 x->vol_flags = 0; |
2967 | 155 if( xvid_flags & CODEC_FLAG_GMC ) { |
156 x->vol_flags |= XVID_VOL_GMC; | |
157 x->me_flags |= XVID_ME_GME_REFINE; | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
158 } |
2967 | 159 if( xvid_flags & CODEC_FLAG_QPEL ) { |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
160 x->vol_flags |= XVID_VOL_QUARTERPEL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
161 x->me_flags |= XVID_ME_QUARTERPELREFINE16; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
162 if( x->vop_flags & XVID_VOP_INTER4V ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
163 x->me_flags |= XVID_ME_QUARTERPELREFINE8; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
164 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
165 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
166 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
|
167 xvid_gbl_init.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
168 xvid_gbl_init.debug = 0; |
2967 | 169 |
8590 | 170 #if ARCH_PPC |
6908 | 171 /* Xvid's PPC support is borked, use libavcodec to detect */ |
8590 | 172 #if HAVE_ALTIVEC |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
173 if( has_altivec() ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
174 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
|
175 } else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
176 #endif |
2967 | 177 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
|
178 #else |
6908 | 179 /* Xvid can detect on x86 */ |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
180 xvid_gbl_init.cpu_flags = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
181 #endif |
2967 | 182 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
183 /* Initialize */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
184 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
|
185 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
186 /* Create the encoder reference */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
187 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
|
188 xvid_enc_create.version = XVID_VERSION; |
2967 | 189 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
190 /* Store the desired frame size */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
191 xvid_enc_create.width = x->xsize = avctx->width; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
192 xvid_enc_create.height = x->ysize = avctx->height; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
193 |
6908 | 194 /* 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
|
195 /* xvid_enc_create.profile = XVID_PROFILE_S_L3; */ |
2967 | 196 |
6665
c22932db0ebb
Make Xvid wrapper use threads (with support for newest CVS Xvid only)
superdump
parents:
6517
diff
changeset
|
197 /* We don't use zones */ |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
198 xvid_enc_create.zones = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
199 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
|
200 |
c22932db0ebb
Make Xvid wrapper use threads (with support for newest CVS Xvid only)
superdump
parents:
6517
diff
changeset
|
201 xvid_enc_create.num_threads = avctx->thread_count; |
2967 | 202 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
203 xvid_enc_create.plugins = plugins; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
204 xvid_enc_create.num_plugins = 0; |
2967 | 205 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
206 /* Initialize Buffers */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
207 x->twopassbuffer = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
208 x->old_twopassbuffer = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
209 x->twopassfile = NULL; |
2967 | 210 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
211 if( xvid_flags & CODEC_FLAG_PASS1 ) { |
8315 | 212 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
|
213 rc2pass1.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
214 rc2pass1.context = x; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
215 x->twopassbuffer = av_malloc(BUFFER_SIZE); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
216 x->old_twopassbuffer = av_malloc(BUFFER_SIZE); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
217 if( x->twopassbuffer == NULL || x->old_twopassbuffer == NULL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
218 av_log(avctx, AV_LOG_ERROR, |
6908 | 219 "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
|
220 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
221 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
222 x->twopassbuffer[0] = x->old_twopassbuffer[0] = 0; |
2967 | 223 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
224 plugins[xvid_enc_create.num_plugins].func = xvid_ff_2pass; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
225 plugins[xvid_enc_create.num_plugins].param = &rc2pass1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
226 xvid_enc_create.num_plugins++; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
227 } else if( xvid_flags & CODEC_FLAG_PASS2 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
228 memset(&rc2pass2, 0, sizeof(xvid_plugin_2pass2_t)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
229 rc2pass2.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
230 rc2pass2.bitrate = avctx->bit_rate; |
2967 | 231 |
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3202
diff
changeset
|
232 fd = av_tempfile("xvidff.", &(x->twopassfile)); |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
233 if( fd == -1 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
234 av_log(avctx, AV_LOG_ERROR, |
6908 | 235 "Xvid: Cannot write 2-pass pipe\n"); |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
236 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
237 } |
2967 | 238 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
239 if( avctx->stats_in == NULL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
240 av_log(avctx, AV_LOG_ERROR, |
6908 | 241 "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
|
242 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
243 } |
2967 | 244 |
245 if( strlen(avctx->stats_in) > | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
246 write(fd, avctx->stats_in, strlen(avctx->stats_in)) ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
247 close(fd); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
248 av_log(avctx, AV_LOG_ERROR, |
6908 | 249 "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
|
250 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
251 } |
2967 | 252 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
253 close(fd); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
254 rc2pass2.filename = x->twopassfile; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
255 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
256 plugins[xvid_enc_create.num_plugins].param = &rc2pass2; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
257 xvid_enc_create.num_plugins++; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
258 } else if( !(xvid_flags & CODEC_FLAG_QSCALE) ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
259 /* Single Pass Bitrate Control! */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
260 memset(&single, 0, sizeof(xvid_plugin_single_t)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
261 single.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
262 single.bitrate = avctx->bit_rate; |
2967 | 263 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
264 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_single; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
265 plugins[xvid_enc_create.num_plugins].param = &single; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
266 xvid_enc_create.num_plugins++; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
267 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
268 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
269 /* Luminance Masking */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
270 if( 0.0 != avctx->lumi_masking ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
271 plugins[xvid_enc_create.num_plugins].func = xvid_plugin_lumimasking; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
272 plugins[xvid_enc_create.num_plugins].param = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
273 xvid_enc_create.num_plugins++; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
274 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
275 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
276 /* Frame Rate and Key Frames */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
277 xvid_correct_framerate(avctx); |
2637 | 278 xvid_enc_create.fincr = avctx->time_base.num; |
279 xvid_enc_create.fbase = avctx->time_base.den; | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
280 if( avctx->gop_size > 0 ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
281 xvid_enc_create.max_key_interval = avctx->gop_size; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
282 else |
6908 | 283 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
|
284 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
285 /* Quants */ |
2967 | 286 if( xvid_flags & CODEC_FLAG_QSCALE ) x->qscale = 1; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
287 else x->qscale = 0; |
2967 | 288 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
289 xvid_enc_create.min_quant[0] = avctx->qmin; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
290 xvid_enc_create.min_quant[1] = avctx->qmin; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
291 xvid_enc_create.min_quant[2] = avctx->qmin; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
292 xvid_enc_create.max_quant[0] = avctx->qmax; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
293 xvid_enc_create.max_quant[1] = avctx->qmax; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
294 xvid_enc_create.max_quant[2] = avctx->qmax; |
2967 | 295 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
296 /* Quant Matrices */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
297 x->intra_matrix = x->inter_matrix = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
298 if( avctx->mpeg_quant ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
299 x->vol_flags |= XVID_VOL_MPEGQUANT; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
300 if( (avctx->intra_matrix || avctx->inter_matrix) ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
301 x->vol_flags |= XVID_VOL_MPEGQUANT; |
2967 | 302 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
303 if( avctx->intra_matrix ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
304 intra = avctx->intra_matrix; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
305 x->intra_matrix = av_malloc(sizeof(unsigned char) * 64); |
2967 | 306 } else |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
307 intra = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
308 if( avctx->inter_matrix ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
309 inter = avctx->inter_matrix; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
310 x->inter_matrix = av_malloc(sizeof(unsigned char) * 64); |
2967 | 311 } else |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
312 inter = NULL; |
2967 | 313 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
314 for( i = 0; i < 64; i++ ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
315 if( intra ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
316 x->intra_matrix[i] = (unsigned char)intra[i]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
317 if( inter ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
318 x->inter_matrix[i] = (unsigned char)inter[i]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
319 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
320 } |
2967 | 321 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
322 /* Misc Settings */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
323 xvid_enc_create.frame_drop_ratio = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
324 xvid_enc_create.global = 0; |
2967 | 325 if( xvid_flags & CODEC_FLAG_CLOSED_GOP ) |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
326 xvid_enc_create.global |= XVID_GLOBAL_CLOSED_GOP; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
327 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
328 /* Determines which codec mode we are operating in */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
329 avctx->extradata = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
330 avctx->extradata_size = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
331 if( xvid_flags & CODEC_FLAG_GLOBAL_HEADER ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
332 /* In this case, we are claiming to be MPEG4 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
333 x->quicktime_format = 1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
334 avctx->codec_id = CODEC_ID_MPEG4; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
335 } else { |
6908 | 336 /* We are claiming to be Xvid */ |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
337 x->quicktime_format = 0; |
4023 | 338 if(!avctx->codec_tag) |
8612 | 339 avctx->codec_tag = AV_RL32("xvid"); |
2967 | 340 } |
341 | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
342 /* Bframes */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
343 xvid_enc_create.max_bframes = avctx->max_b_frames; |
3202 | 344 xvid_enc_create.bquant_offset = 100 * avctx->b_quant_offset; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
345 xvid_enc_create.bquant_ratio = 100 * avctx->b_quant_factor; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
346 if( avctx->max_b_frames > 0 && !x->quicktime_format ) xvid_enc_create.global |= XVID_GLOBAL_PACKED; |
2967 | 347 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
348 /* Create encoder context */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
349 xerr = xvid_encore(NULL, XVID_ENC_CREATE, &xvid_enc_create, NULL); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
350 if( xerr ) { |
6908 | 351 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
|
352 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
353 } |
2967 | 354 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
355 x->encoder_handle = xvid_enc_create.handle; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
356 avctx->coded_frame = &x->encoded_picture; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
357 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
358 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
359 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
360 |
2967 | 361 /** |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
362 * Encodes a single frame. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
363 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
364 * @param avctx AVCodecContext pointer to context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
365 * @param frame Pointer to encoded frame buffer |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
366 * @param buf_size Size of encoded frame buffer |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
367 * @param data Pointer to AVFrame of unencoded frame |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
368 * @return Returns 0 on success, -1 on failure |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
369 */ |
11321
e0feb5fa4e97
Make the following functions static (and remove ff_), they are only used
cehoyos
parents:
10146
diff
changeset
|
370 static int xvid_encode_frame(AVCodecContext *avctx, |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
371 unsigned char *frame, int buf_size, void *data) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
372 int xerr, i; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
373 char *tmp; |
8315 | 374 struct xvid_context *x = avctx->priv_data; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
375 AVFrame *picture = data; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
376 AVFrame *p = &(x->encoded_picture); |
2967 | 377 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
378 xvid_enc_frame_t xvid_enc_frame; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
379 xvid_enc_stats_t xvid_enc_stats; |
2967 | 380 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
381 /* Start setting up the frame */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
382 memset(&xvid_enc_frame, 0, sizeof(xvid_enc_frame)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
383 xvid_enc_frame.version = XVID_VERSION; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
384 memset(&xvid_enc_stats, 0, sizeof(xvid_enc_stats)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
385 xvid_enc_stats.version = XVID_VERSION; |
2967 | 386 *p = *picture; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
387 |
6908 | 388 /* 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
|
389 xvid_enc_frame.bitstream = frame; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
390 xvid_enc_frame.length = buf_size; |
2967 | 391 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
392 /* Initialize input image fields */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
393 if( avctx->pix_fmt != PIX_FMT_YUV420P ) { |
6908 | 394 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
|
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 xvid_enc_frame.input.csp = XVID_CSP_PLANAR; /* YUV420P */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
399 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
400 for( i = 0; i < 4; i++ ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
401 xvid_enc_frame.input.plane[i] = picture->data[i]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
402 xvid_enc_frame.input.stride[i] = picture->linesize[i]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
403 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
404 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
405 /* Encoder Flags */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
406 xvid_enc_frame.vop_flags = x->vop_flags; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
407 xvid_enc_frame.vol_flags = x->vol_flags; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
408 xvid_enc_frame.motion = x->me_flags; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
409 xvid_enc_frame.type = XVID_TYPE_AUTO; |
2967 | 410 |
6670 | 411 /* Pixel aspect ratio setting */ |
412 if (avctx->sample_aspect_ratio.num < 1 || avctx->sample_aspect_ratio.num > 255 || | |
413 avctx->sample_aspect_ratio.den < 1 || avctx->sample_aspect_ratio.den > 255) { | |
414 av_log(avctx, AV_LOG_ERROR, "Invalid pixel aspect ratio %i/%i\n", | |
415 avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den); | |
416 return -1; | |
417 } | |
418 xvid_enc_frame.par = XVID_PAR_EXT; | |
419 xvid_enc_frame.par_width = avctx->sample_aspect_ratio.num; | |
420 xvid_enc_frame.par_height = avctx->sample_aspect_ratio.den; | |
421 | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
422 /* Quant Setting */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
423 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
|
424 else xvid_enc_frame.quant = 0; |
2967 | 425 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
426 /* Matrices */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
427 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
|
428 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
|
429 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
430 /* Encode */ |
2967 | 431 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
|
432 &xvid_enc_frame, &xvid_enc_stats); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
433 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
434 /* Two-pass log buffer swapping */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
435 avctx->stats_out = NULL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
436 if( x->twopassbuffer ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
437 tmp = x->old_twopassbuffer; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
438 x->old_twopassbuffer = x->twopassbuffer; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
439 x->twopassbuffer = tmp; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
440 x->twopassbuffer[0] = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
441 if( x->old_twopassbuffer[0] != 0 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
442 avctx->stats_out = x->old_twopassbuffer; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
443 } |
2967 | 444 } |
445 | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
446 if( 0 <= xerr ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
447 p->quality = xvid_enc_stats.quant * FF_QP2LAMBDA; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
448 if( xvid_enc_stats.type == XVID_TYPE_PVOP ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
449 p->pict_type = FF_P_TYPE; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
450 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
|
451 p->pict_type = FF_B_TYPE; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
452 else if( xvid_enc_stats.type == XVID_TYPE_SVOP ) |
2451 | 453 p->pict_type = FF_S_TYPE; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
454 else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
455 p->pict_type = FF_I_TYPE; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
456 if( xvid_enc_frame.out_flags & XVID_KEYFRAME ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
457 p->key_frame = 1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
458 if( x->quicktime_format ) |
2967 | 459 return xvid_strip_vol_header(avctx, frame, |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
460 xvid_enc_stats.hlength, xerr); |
2967 | 461 } else |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
462 p->key_frame = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
463 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
464 return xerr; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
465 } else { |
6908 | 466 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
|
467 return -1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
468 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
469 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
470 |
2967 | 471 /** |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
472 * Destroys the private context for the encoder. |
6908 | 473 * 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
|
474 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
475 * @param avctx AVCodecContext pointer to context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
476 * @return Returns 0, success guaranteed |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
477 */ |
11321
e0feb5fa4e97
Make the following functions static (and remove ff_), they are only used
cehoyos
parents:
10146
diff
changeset
|
478 static av_cold int xvid_encode_close(AVCodecContext *avctx) { |
8315 | 479 struct xvid_context *x = avctx->priv_data; |
2967 | 480 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
481 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
|
482 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
483 if( avctx->extradata != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
484 av_free(avctx->extradata); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
485 if( x->twopassbuffer != NULL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
486 av_free(x->twopassbuffer); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
487 av_free(x->old_twopassbuffer); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
488 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
489 if( x->twopassfile != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
490 av_free(x->twopassfile); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
491 if( x->intra_matrix != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
492 av_free(x->intra_matrix); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
493 if( x->inter_matrix != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
494 av_free(x->inter_matrix); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
495 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
496 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
497 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
498 |
2967 | 499 /** |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
500 * Routine to create a global VO/VOL header for MP4 container. |
6908 | 501 * 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
|
502 * 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
|
503 * 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
|
504 * compliance. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
505 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
506 * @param avctx AVCodecContext pointer to context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
507 * @param frame Pointer to encoded frame data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
508 * @param header_len Length of header to search |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
509 * @param frame_len Length of encoded frame data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
510 * @return Returns new length of frame data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
511 */ |
2967 | 512 int xvid_strip_vol_header(AVCodecContext *avctx, |
513 unsigned char *frame, | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
514 unsigned int header_len, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
515 unsigned int frame_len) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
516 int vo_len = 0, i; |
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 for( i = 0; i < header_len - 3; i++ ) { |
2967 | 519 if( frame[i] == 0x00 && |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
520 frame[i+1] == 0x00 && |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
521 frame[i+2] == 0x01 && |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
522 frame[i+3] == 0xB6 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
523 vo_len = i; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
524 break; |
2967 | 525 } |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
526 } |
2967 | 527 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
528 if( vo_len > 0 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
529 /* 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
|
530 if( avctx->extradata == NULL ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
531 avctx->extradata = av_malloc(vo_len); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
532 memcpy(avctx->extradata, frame, vo_len); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
533 avctx->extradata_size = vo_len; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
534 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
535 /* Less dangerous now, memmove properly copies the two |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
536 chunks of overlapping data */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
537 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
|
538 return frame_len - vo_len; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
539 } else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
540 return frame_len; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
541 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
542 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
543 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
544 * Routine to correct a possibly erroneous framerate being fed to us. |
6908 | 545 * 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
|
546 * extremely large. This function works to correct problems in this area |
2967 | 547 * 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
|
548 * the two presented. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
549 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
550 * @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
|
551 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
552 void xvid_correct_framerate(AVCodecContext *avctx) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
553 int frate, fbase; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
554 int est_frate, est_fbase; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
555 int gcd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
556 float est_fps, fps; |
2967 | 557 |
2637 | 558 frate = avctx->time_base.den; |
559 fbase = avctx->time_base.num; | |
2967 | 560 |
8611 | 561 gcd = av_gcd(frate, fbase); |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
562 if( gcd > 1 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
563 frate /= gcd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
564 fbase /= gcd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
565 } |
2967 | 566 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
567 if( frate <= 65000 && fbase <= 65000 ) { |
2637 | 568 avctx->time_base.den = frate; |
569 avctx->time_base.num = fbase; | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
570 return; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
571 } |
2967 | 572 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
573 fps = (float)frate / (float)fbase; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
574 est_fps = roundf(fps * 1000.0) / 1000.0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
575 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
576 est_frate = (int)est_fps; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
577 if( est_fps > (int)est_fps ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
578 est_frate = (est_frate + 1) * 1000; |
2967 | 579 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
|
580 } else |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
581 est_fbase = 1; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
582 |
8611 | 583 gcd = av_gcd(est_frate, est_fbase); |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
584 if( gcd > 1 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
585 est_frate /= gcd; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
586 est_fbase /= gcd; |
2967 | 587 } |
588 | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
589 if( fbase > est_fbase ) { |
2637 | 590 avctx->time_base.den = est_frate; |
591 avctx->time_base.num = est_fbase; | |
2967 | 592 av_log(avctx, AV_LOG_DEBUG, |
6908 | 593 "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
|
594 est_fps, (((est_fps - fps)/fps) * 100.0)); |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
595 } else { |
2637 | 596 avctx->time_base.den = frate; |
597 avctx->time_base.num = fbase; | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
598 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
599 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
600 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
601 /* |
6908 | 602 * Xvid 2-Pass Kludge Section |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
603 * |
6908 | 604 * 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
|
605 * 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
|
606 * statistic information as libavcodec requests in. We have another kludge |
6908 | 607 * 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
|
608 * rate-control plugin. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
609 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
610 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
611 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
612 * Initializes the two-pass plugin and context. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
613 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
614 * @param param Input construction parameter structure |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
615 * @param handle Private context handle |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
616 * @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
|
617 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
618 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
|
619 void ** handle) { |
8315 | 620 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
|
621 char *log = x->context->twopassbuffer; |
2967 | 622 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
623 /* Do a quick bounds check */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
624 if( log == NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
625 return XVID_ERR_FAIL; |
2967 | 626 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
627 /* We use snprintf() */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
628 /* 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
|
629 log[0] = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
630 snprintf(log, BUFFER_REMAINING(log), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
631 "# 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
|
632 snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
633 "# 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
|
634 XVID_VERSION_MAJOR(XVID_VERSION), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
635 XVID_VERSION_MINOR(XVID_VERSION), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
636 XVID_VERSION_PATCH(XVID_VERSION)); |
2967 | 637 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
638 *handle = x->context; |
2967 | 639 return 0; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
640 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
641 |
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 * Destroys the two-pass plugin context. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
644 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
645 * @param ref Context pointer for the plugin |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
646 * @param param Destrooy context |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
647 * @return Returns 0, success guaranteed |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
648 */ |
8315 | 649 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
|
650 xvid_plg_destroy_t *param) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
651 /* 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
|
652 /* 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
|
653 if( ref->twopassbuffer != NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
654 ref->twopassbuffer[0] = 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
655 return 0; |
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 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
658 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
659 * Enables fast encode mode during the first pass. |
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 * @param ref Context pointer for the plugin |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
662 * @param param Frame data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
663 * @return Returns 0, success guaranteed |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
664 */ |
8315 | 665 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
|
666 xvid_plg_data_t *param) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
667 int motion_remove; |
2967 | 668 int motion_replacements; |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
669 int vop_remove; |
2967 | 670 |
671 /* 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
|
672 if( param->zone && param->zone->mode == XVID_ZONE_QUANT ) |
2967 | 673 return 0; |
674 | |
675 /* We can implement a 'turbo' first pass mode here */ | |
676 param->quant = 2; | |
677 | |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
678 /* Init values */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
679 motion_remove = ~XVID_ME_CHROMA_PVOP & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
680 ~XVID_ME_CHROMA_BVOP & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
681 ~XVID_ME_EXTSEARCH16 & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
682 ~XVID_ME_ADVANCEDDIAMOND16; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
683 motion_replacements = XVID_ME_FAST_MODEINTERPOLATE | |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
684 XVID_ME_SKIP_DELTASEARCH | |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
685 XVID_ME_FASTREFINE16 | |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
686 XVID_ME_BFRAME_EARLYSTOP; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
687 vop_remove = ~XVID_VOP_MODEDECISION_RD & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
688 ~XVID_VOP_FAST_MODEDECISION_RD & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
689 ~XVID_VOP_TRELLISQUANT & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
690 ~XVID_VOP_INTER4V & |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
691 ~XVID_VOP_HQACPRED; |
2967 | 692 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
693 param->vol_flags &= ~XVID_VOL_GMC; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
694 param->vop_flags &= vop_remove; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
695 param->motion_flags &= motion_remove; |
2967 | 696 param->motion_flags |= motion_replacements; |
697 | |
698 return 0; | |
2131
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 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
702 * Captures statistic data and writes it during first pass. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
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 Statistic data |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
706 * @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
|
707 */ |
8315 | 708 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
|
709 xvid_plg_data_t *param) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
710 char *log = ref->twopassbuffer; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
711 char *frame_types = " ipbs"; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
712 char frame_type; |
2967 | 713 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
714 /* Quick bounds check */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
715 if( log == NULL ) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
716 return XVID_ERR_FAIL; |
2967 | 717 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
718 /* 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
|
719 if( param->type < 5 && param->type > 0 ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
720 frame_type = frame_types[param->type]; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
721 } else { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
722 return XVID_ERR_FAIL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
723 } |
2967 | 724 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
725 snprintf(BUFFER_CAT(log), BUFFER_REMAINING(log), |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
726 "%c %d %d %d %d %d %d\n", |
2967 | 727 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
|
728 param->stats.ublks, param->stats.length, param->stats.hlength); |
2967 | 729 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
730 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
731 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
732 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
733 /** |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
734 * Dispatch function for our custom plugin. |
6908 | 735 * 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
|
736 * on to other functions for actual processing. |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
737 * |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
738 * @param ref Context pointer for the plugin |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
739 * @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
|
740 * @param p1 First parameter (varies) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
741 * @param p2 Second parameter (varies) |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
742 * @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
|
743 */ |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
744 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
|
745 switch( cmd ) { |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
746 case XVID_PLG_INFO: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
747 case XVID_PLG_FRAME: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
748 return 0; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
749 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
750 case XVID_PLG_BEFORE: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
751 return xvid_ff_2pass_before(ref, p1); |
2967 | 752 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
753 case XVID_PLG_CREATE: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
754 return xvid_ff_2pass_create(p1, p2); |
2967 | 755 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
756 case XVID_PLG_AFTER: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
757 return xvid_ff_2pass_after(ref, p1); |
2967 | 758 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
759 case XVID_PLG_DESTROY: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
760 return xvid_ff_2pass_destroy(ref, p1); |
2967 | 761 |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
762 default: |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
763 return XVID_ERR_FAIL; |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
764 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
765 } |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
766 |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
767 /** |
6908 | 768 * Xvid codec definition for libavcodec. |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
769 */ |
5103
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
770 AVCodec libxvid_encoder = { |
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
771 "libxvid", |
2131
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
772 CODEC_TYPE_VIDEO, |
060053df9538
XviD Support patch by (Adam Thayer <krevnik at comcast dot net>)
michael
parents:
diff
changeset
|
773 CODEC_ID_XVID, |
8315 | 774 sizeof(struct xvid_context), |
11321
e0feb5fa4e97
Make the following functions static (and remove ff_), they are only used
cehoyos
parents:
10146
diff
changeset
|
775 xvid_encode_init, |
e0feb5fa4e97
Make the following functions static (and remove ff_), they are only used
cehoyos
parents:
10146
diff
changeset
|
776 xvid_encode_frame, |
e0feb5fa4e97
Make the following functions static (and remove ff_), they are only used
cehoyos
parents:
10146
diff
changeset
|
777 xvid_encode_close, |
10146
38cfe222e1a4
Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents:
8718
diff
changeset
|
778 .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
|
779 .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
|
780 }; |