Mercurial > libavcodec.hg
annotate mpegvideo_enc.c @ 7744:7477cbdacb20 libavcodec
Fix lossless jpeg encoder to comply to spec and store full redundant
residuals, Note this does not change RGB32 as we need to check this
against some decoder that supports it.
author | michael |
---|---|
date | Sat, 30 Aug 2008 20:39:12 +0000 |
parents | b8ad314749ff |
children | f692318902dc |
rev | line source |
---|---|
5204 | 1 /* |
2 * The simplest mpeg encoder (well, it was the simplest!) | |
3 * Copyright (c) 2000,2001 Fabrice Bellard. | |
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> | |
5 * | |
5214 | 6 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at> |
7 * | |
5204 | 8 * This file is part of FFmpeg. |
9 * | |
10 * FFmpeg is free software; you can redistribute it and/or | |
11 * modify it under the terms of the GNU Lesser General Public | |
12 * License as published by the Free Software Foundation; either | |
13 * version 2.1 of the License, or (at your option) any later version. | |
14 * | |
15 * FFmpeg is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 * Lesser General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU Lesser General Public | |
21 * License along with FFmpeg; if not, write to the Free Software | |
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
23 */ | |
24 | |
25 /** | |
26 * @file mpegvideo_enc.c | |
27 * The simplest mpeg encoder (well, it was the simplest!). | |
28 */ | |
29 | |
30 #include "avcodec.h" | |
31 #include "dsputil.h" | |
32 #include "mpegvideo.h" | |
33 #include "mpegvideo_common.h" | |
34 #include "mjpegenc.h" | |
35 #include "msmpeg4.h" | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
36 #include "h263.h" |
5204 | 37 #include "faandct.h" |
38 #include <limits.h> | |
39 | |
40 //#undef NDEBUG | |
41 //#include <assert.h> | |
42 | |
43 static int encode_picture(MpegEncContext *s, int picture_number); | |
44 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale); | |
45 static int sse_mb(MpegEncContext *s); | |
46 | |
47 /* enable all paranoid tests for rounding, overflows, etc... */ | |
48 //#define PARANOID | |
49 | |
50 //#define DEBUG | |
51 | |
52 static const uint16_t aanscales[64] = { | |
53 /* precomputed values scaled up by 14 bits */ | |
54 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, | |
55 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, | |
56 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, | |
57 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, | |
58 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, | |
59 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, | |
60 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446, | |
61 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247 | |
62 }; | |
63 | |
6401 | 64 static const uint16_t inv_aanscales[64] = { |
65 4096, 2953, 3135, 3483, 4096, 5213, 7568, 14846, | |
66 2953, 2129, 2260, 2511, 2953, 3759, 5457, 10703, | |
67 3135, 2260, 2399, 2666, 3135, 3990, 5793, 11363, | |
68 3483, 2511, 2666, 2962, 3483, 4433, 6436, 12625, | |
69 4096, 2953, 3135, 3483, 4096, 5213, 7568, 14846, | |
70 5213, 3759, 3990, 4433, 5213, 6635, 9633, 18895, | |
71 7568, 5457, 5793, 6436, 7568, 9633, 13985, 27432, | |
72 14846, 10703, 11363, 12625, 14846, 18895, 27432, 53809, | |
73 }; | |
74 | |
5204 | 75 static uint8_t default_mv_penalty[MAX_FCODE+1][MAX_MV*2+1]; |
76 static uint8_t default_fcode_tab[MAX_MV*2+1]; | |
77 | |
5789 | 78 void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64], |
5204 | 79 const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra) |
80 { | |
81 int qscale; | |
82 int shift=0; | |
83 | |
84 for(qscale=qmin; qscale<=qmax; qscale++){ | |
85 int i; | |
86 if (dsp->fdct == ff_jpeg_fdct_islow | |
87 #ifdef FAAN_POSTSCALE | |
88 || dsp->fdct == ff_faandct | |
89 #endif | |
90 ) { | |
91 for(i=0;i<64;i++) { | |
92 const int j= dsp->idct_permutation[i]; | |
93 /* 16 <= qscale * quant_matrix[i] <= 7905 */ | |
94 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */ | |
95 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */ | |
96 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ | |
97 | |
98 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / | |
99 (qscale * quant_matrix[j])); | |
100 } | |
101 } else if (dsp->fdct == fdct_ifast | |
102 #ifndef FAAN_POSTSCALE | |
103 || dsp->fdct == ff_faandct | |
104 #endif | |
105 ) { | |
106 for(i=0;i<64;i++) { | |
107 const int j= dsp->idct_permutation[i]; | |
108 /* 16 <= qscale * quant_matrix[i] <= 7905 */ | |
109 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */ | |
110 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */ | |
111 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ | |
112 | |
113 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / | |
114 (aanscales[i] * qscale * quant_matrix[j])); | |
115 } | |
116 } else { | |
117 for(i=0;i<64;i++) { | |
118 const int j= dsp->idct_permutation[i]; | |
119 /* We can safely suppose that 16 <= quant_matrix[i] <= 255 | |
120 So 16 <= qscale * quant_matrix[i] <= 7905 | |
121 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905 | |
122 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67 | |
123 */ | |
124 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j])); | |
125 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]); | |
126 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]); | |
127 | |
128 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1; | |
129 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]); | |
130 } | |
131 } | |
132 | |
133 for(i=intra; i<64; i++){ | |
134 int64_t max= 8191; | |
135 if (dsp->fdct == fdct_ifast | |
136 #ifndef FAAN_POSTSCALE | |
137 || dsp->fdct == ff_faandct | |
138 #endif | |
139 ) { | |
140 max= (8191LL*aanscales[i]) >> 14; | |
141 } | |
142 while(((max * qmat[qscale][i]) >> shift) > INT_MAX){ | |
143 shift++; | |
144 } | |
145 } | |
146 } | |
147 if(shift){ | |
148 av_log(NULL, AV_LOG_INFO, "Warning, QMAT_SHIFT is larger than %d, overflows possible\n", QMAT_SHIFT - shift); | |
149 } | |
150 } | |
151 | |
152 static inline void update_qscale(MpegEncContext *s){ | |
153 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7); | |
154 s->qscale= av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax); | |
155 | |
156 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT; | |
157 } | |
158 | |
159 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix){ | |
160 int i; | |
161 | |
162 if(matrix){ | |
163 put_bits(pb, 1, 1); | |
164 for(i=0;i<64;i++) { | |
165 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]); | |
166 } | |
167 }else | |
168 put_bits(pb, 1, 0); | |
169 } | |
170 | |
171 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){ | |
172 int i; | |
173 | |
174 dst->pict_type = src->pict_type; | |
175 dst->quality = src->quality; | |
176 dst->coded_picture_number = src->coded_picture_number; | |
177 dst->display_picture_number = src->display_picture_number; | |
178 // dst->reference = src->reference; | |
179 dst->pts = src->pts; | |
180 dst->interlaced_frame = src->interlaced_frame; | |
181 dst->top_field_first = src->top_field_first; | |
182 | |
183 if(s->avctx->me_threshold){ | |
184 if(!src->motion_val[0]) | |
185 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n"); | |
186 if(!src->mb_type) | |
187 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n"); | |
188 if(!src->ref_index[0]) | |
189 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n"); | |
190 if(src->motion_subsample_log2 != dst->motion_subsample_log2) | |
191 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesn't match! (%d!=%d)\n", | |
192 src->motion_subsample_log2, dst->motion_subsample_log2); | |
193 | |
194 memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0])); | |
195 | |
196 for(i=0; i<2; i++){ | |
197 int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1; | |
198 int height= ((16*s->mb_height)>>src->motion_subsample_log2); | |
199 | |
200 if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){ | |
201 memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t)); | |
202 } | |
203 if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){ | |
204 memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t)); | |
205 } | |
206 } | |
207 } | |
208 } | |
209 | |
210 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){ | |
211 #define COPY(a) dst->a= src->a | |
212 COPY(pict_type); | |
213 COPY(current_picture); | |
214 COPY(f_code); | |
215 COPY(b_code); | |
216 COPY(qscale); | |
217 COPY(lambda); | |
218 COPY(lambda2); | |
219 COPY(picture_in_gop_number); | |
220 COPY(gop_picture_number); | |
221 COPY(frame_pred_frame_dct); //FIXME don't set in encode_header | |
222 COPY(progressive_frame); //FIXME don't set in encode_header | |
223 COPY(partitioned_frame); //FIXME don't set in encode_header | |
224 #undef COPY | |
225 } | |
226 | |
227 /** | |
228 * sets the given MpegEncContext to defaults for encoding. | |
229 * the changed fields will not depend upon the prior state of the MpegEncContext. | |
230 */ | |
231 static void MPV_encode_defaults(MpegEncContext *s){ | |
232 int i; | |
233 MPV_common_defaults(s); | |
234 | |
235 for(i=-16; i<16; i++){ | |
236 default_fcode_tab[i + MAX_MV]= 1; | |
237 } | |
238 s->me.mv_penalty= default_mv_penalty; | |
239 s->fcode_tab= default_fcode_tab; | |
240 } | |
241 | |
242 /* init video encoder */ | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6497
diff
changeset
|
243 av_cold int MPV_encode_init(AVCodecContext *avctx) |
5204 | 244 { |
245 MpegEncContext *s = avctx->priv_data; | |
246 int i; | |
247 int chroma_h_shift, chroma_v_shift; | |
248 | |
249 MPV_encode_defaults(s); | |
250 | |
251 switch (avctx->codec_id) { | |
252 case CODEC_ID_MPEG2VIDEO: | |
253 if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P){ | |
254 av_log(avctx, AV_LOG_ERROR, "only YUV420 and YUV422 are supported\n"); | |
255 return -1; | |
256 } | |
257 break; | |
258 case CODEC_ID_LJPEG: | |
259 case CODEC_ID_MJPEG: | |
260 if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUVJ422P && | |
261 ((avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P) || avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL)){ | |
262 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n"); | |
263 return -1; | |
264 } | |
265 break; | |
266 default: | |
267 if(avctx->pix_fmt != PIX_FMT_YUV420P){ | |
268 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n"); | |
269 return -1; | |
270 } | |
271 } | |
272 | |
273 switch (avctx->pix_fmt) { | |
274 case PIX_FMT_YUVJ422P: | |
275 case PIX_FMT_YUV422P: | |
276 s->chroma_format = CHROMA_422; | |
277 break; | |
278 case PIX_FMT_YUVJ420P: | |
279 case PIX_FMT_YUV420P: | |
280 default: | |
281 s->chroma_format = CHROMA_420; | |
282 break; | |
283 } | |
284 | |
285 s->bit_rate = avctx->bit_rate; | |
286 s->width = avctx->width; | |
287 s->height = avctx->height; | |
288 if(avctx->gop_size > 600 && avctx->strict_std_compliance>FF_COMPLIANCE_EXPERIMENTAL){ | |
289 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n"); | |
290 avctx->gop_size=600; | |
291 } | |
292 s->gop_size = avctx->gop_size; | |
293 s->avctx = avctx; | |
294 s->flags= avctx->flags; | |
295 s->flags2= avctx->flags2; | |
296 s->max_b_frames= avctx->max_b_frames; | |
297 s->codec_id= avctx->codec->id; | |
298 s->luma_elim_threshold = avctx->luma_elim_threshold; | |
299 s->chroma_elim_threshold= avctx->chroma_elim_threshold; | |
300 s->strict_std_compliance= avctx->strict_std_compliance; | |
301 s->data_partitioning= avctx->flags & CODEC_FLAG_PART; | |
302 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0; | |
303 s->mpeg_quant= avctx->mpeg_quant; | |
304 s->rtp_mode= !!avctx->rtp_payload_size; | |
305 s->intra_dc_precision= avctx->intra_dc_precision; | |
306 s->user_specified_pts = AV_NOPTS_VALUE; | |
307 | |
308 if (s->gop_size <= 1) { | |
309 s->intra_only = 1; | |
310 s->gop_size = 12; | |
311 } else { | |
312 s->intra_only = 0; | |
313 } | |
314 | |
315 s->me_method = avctx->me_method; | |
316 | |
317 /* Fixed QSCALE */ | |
318 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE); | |
319 | |
320 s->adaptive_quant= ( s->avctx->lumi_masking | |
321 || s->avctx->dark_masking | |
322 || s->avctx->temporal_cplx_masking | |
323 || s->avctx->spatial_cplx_masking | |
324 || s->avctx->p_masking | |
325 || s->avctx->border_masking | |
326 || (s->flags&CODEC_FLAG_QP_RD)) | |
327 && !s->fixed_qscale; | |
328 | |
329 s->obmc= !!(s->flags & CODEC_FLAG_OBMC); | |
330 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER); | |
331 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN); | |
332 s->intra_vlc_format= !!(s->flags2 & CODEC_FLAG2_INTRA_VLC); | |
333 s->q_scale_type= !!(s->flags2 & CODEC_FLAG2_NON_LINEAR_QUANT); | |
334 | |
7034 | 335 #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0) |
336 if (s->flags & CODEC_FLAG_TRELLIS_QUANT) | |
337 avctx->trellis = 1; | |
338 #endif | |
339 | |
5204 | 340 if(avctx->rc_max_rate && !avctx->rc_buffer_size){ |
341 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n"); | |
342 return -1; | |
343 } | |
344 | |
345 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){ | |
346 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n"); | |
347 } | |
348 | |
349 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){ | |
350 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n"); | |
351 return -1; | |
352 } | |
353 | |
354 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){ | |
355 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n"); | |
356 return -1; | |
357 } | |
358 | |
5420 | 359 if(avctx->rc_max_rate && avctx->rc_max_rate == avctx->bit_rate && avctx->rc_max_rate != avctx->rc_min_rate){ |
360 av_log(avctx, AV_LOG_INFO, "impossible bitrate constraints, this will fail\n"); | |
361 } | |
362 | |
5204 | 363 if(avctx->rc_buffer_size && avctx->bit_rate*av_q2d(avctx->time_base) > avctx->rc_buffer_size){ |
364 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n"); | |
365 return -1; | |
366 } | |
367 | |
368 if(avctx->bit_rate*av_q2d(avctx->time_base) > avctx->bit_rate_tolerance){ | |
369 av_log(avctx, AV_LOG_ERROR, "bitrate tolerance too small for bitrate\n"); | |
370 return -1; | |
371 } | |
372 | |
373 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate | |
374 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO) | |
375 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){ | |
376 | |
377 av_log(avctx, AV_LOG_INFO, "Warning vbv_delay will be set to 0xFFFF (=VBR) as the specified vbv buffer is too large for the given bitrate!\n"); | |
378 } | |
379 | |
380 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4 | |
381 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){ | |
382 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n"); | |
383 return -1; | |
384 } | |
385 | |
386 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){ | |
387 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decision\n"); | |
388 return -1; | |
389 } | |
390 | |
391 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){ | |
392 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n"); | |
393 return -1; | |
394 } | |
395 | |
396 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){ | |
397 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n"); | |
398 return -1; | |
399 } | |
400 | |
401 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){ | |
402 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n"); | |
403 return -1; | |
404 } | |
405 | |
406 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){ | |
407 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n"); | |
408 return -1; | |
409 } | |
410 | |
411 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN)) | |
412 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){ | |
413 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n"); | |
414 return -1; | |
415 } | |
416 | |
417 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too | |
418 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supported by codec\n"); | |
419 return -1; | |
420 } | |
421 | |
7034 | 422 if((s->flags & CODEC_FLAG_CBP_RD) && !avctx->trellis){ |
5204 | 423 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n"); |
424 return -1; | |
425 } | |
426 | |
427 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){ | |
428 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n"); | |
429 return -1; | |
430 } | |
431 | |
432 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){ | |
6486 | 433 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection are not supported yet, set threshold to 1000000000\n"); |
5204 | 434 return -1; |
435 } | |
436 | |
437 if((s->flags2 & CODEC_FLAG2_INTRA_VLC) && s->codec_id != CODEC_ID_MPEG2VIDEO){ | |
438 av_log(avctx, AV_LOG_ERROR, "intra vlc table not supported by codec\n"); | |
439 return -1; | |
440 } | |
441 | |
442 if(s->flags & CODEC_FLAG_LOW_DELAY){ | |
7502 | 443 if (s->codec_id != CODEC_ID_MPEG2VIDEO){ |
444 av_log(avctx, AV_LOG_ERROR, "low delay forcing is only available for mpeg2\n"); | |
5204 | 445 return -1; |
446 } | |
447 if (s->max_b_frames != 0){ | |
448 av_log(avctx, AV_LOG_ERROR, "b frames cannot be used with low delay\n"); | |
449 return -1; | |
450 } | |
451 } | |
452 | |
453 if(s->q_scale_type == 1){ | |
454 if(s->codec_id != CODEC_ID_MPEG2VIDEO){ | |
455 av_log(avctx, AV_LOG_ERROR, "non linear quant is only available for mpeg2\n"); | |
456 return -1; | |
457 } | |
458 if(avctx->qmax > 12){ | |
459 av_log(avctx, AV_LOG_ERROR, "non linear quant only supports qmax <= 12 currently\n"); | |
460 return -1; | |
461 } | |
462 } | |
463 | |
464 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4 | |
465 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO | |
466 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){ | |
467 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n"); | |
468 return -1; | |
469 } | |
470 | |
471 if(s->avctx->thread_count > 1) | |
472 s->rtp_mode= 1; | |
473 | |
474 if(!avctx->time_base.den || !avctx->time_base.num){ | |
475 av_log(avctx, AV_LOG_ERROR, "framerate not set\n"); | |
476 return -1; | |
477 } | |
478 | |
479 i= (INT_MAX/2+128)>>8; | |
480 if(avctx->me_threshold >= i){ | |
481 av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1); | |
482 return -1; | |
483 } | |
484 if(avctx->mb_threshold >= i){ | |
485 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1); | |
486 return -1; | |
487 } | |
488 | |
489 if(avctx->b_frame_strategy && (avctx->flags&CODEC_FLAG_PASS2)){ | |
490 av_log(avctx, AV_LOG_INFO, "notice: b_frame_strategy only affects the first pass\n"); | |
491 avctx->b_frame_strategy = 0; | |
492 } | |
493 | |
494 i= ff_gcd(avctx->time_base.den, avctx->time_base.num); | |
495 if(i > 1){ | |
496 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n"); | |
497 avctx->time_base.den /= i; | |
498 avctx->time_base.num /= i; | |
499 // return -1; | |
500 } | |
501 | |
502 if(s->codec_id==CODEC_ID_MJPEG){ | |
503 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x | |
504 s->inter_quant_bias= 0; | |
505 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){ | |
506 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x | |
507 s->inter_quant_bias= 0; | |
508 }else{ | |
509 s->intra_quant_bias=0; | |
510 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x | |
511 } | |
512 | |
513 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS) | |
514 s->intra_quant_bias= avctx->intra_quant_bias; | |
515 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS) | |
516 s->inter_quant_bias= avctx->inter_quant_bias; | |
517 | |
518 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift); | |
519 | |
520 if(avctx->codec_id == CODEC_ID_MPEG4 && s->avctx->time_base.den > (1<<16)-1){ | |
521 av_log(avctx, AV_LOG_ERROR, "timebase not supported by mpeg 4 standard\n"); | |
522 return -1; | |
523 } | |
524 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1; | |
525 | |
526 switch(avctx->codec->id) { | |
527 case CODEC_ID_MPEG1VIDEO: | |
528 s->out_format = FMT_MPEG1; | |
529 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY); | |
530 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); | |
531 break; | |
532 case CODEC_ID_MPEG2VIDEO: | |
533 s->out_format = FMT_MPEG1; | |
534 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY); | |
535 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); | |
536 s->rtp_mode= 1; | |
537 break; | |
538 case CODEC_ID_LJPEG: | |
539 case CODEC_ID_MJPEG: | |
540 s->out_format = FMT_MJPEG; | |
541 s->intra_only = 1; /* force intra only for jpeg */ | |
542 s->mjpeg_vsample[0] = 2; | |
543 s->mjpeg_vsample[1] = 2>>chroma_v_shift; | |
544 s->mjpeg_vsample[2] = 2>>chroma_v_shift; | |
545 s->mjpeg_hsample[0] = 2; | |
546 s->mjpeg_hsample[1] = 2>>chroma_h_shift; | |
547 s->mjpeg_hsample[2] = 2>>chroma_h_shift; | |
548 if (!(ENABLE_MJPEG_ENCODER || ENABLE_LJPEG_ENCODER) | |
549 || ff_mjpeg_encode_init(s) < 0) | |
550 return -1; | |
551 avctx->delay=0; | |
552 s->low_delay=1; | |
553 break; | |
554 case CODEC_ID_H261: | |
555 if (!ENABLE_H261_ENCODER) return -1; | |
556 if (ff_h261_get_picture_format(s->width, s->height) < 0) { | |
557 av_log(avctx, AV_LOG_ERROR, "The specified picture size of %dx%d is not valid for the H.261 codec.\nValid sizes are 176x144, 352x288\n", s->width, s->height); | |
558 return -1; | |
559 } | |
560 s->out_format = FMT_H261; | |
561 avctx->delay=0; | |
562 s->low_delay=1; | |
563 break; | |
564 case CODEC_ID_H263: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
565 if (!ENABLE_H263_ENCODER) return -1; |
5204 | 566 if (h263_get_picture_format(s->width, s->height) == 7) { |
567 av_log(avctx, AV_LOG_INFO, "The specified picture size of %dx%d is not valid for the H.263 codec.\nValid sizes are 128x96, 176x144, 352x288, 704x576, and 1408x1152. Try H.263+.\n", s->width, s->height); | |
568 return -1; | |
569 } | |
570 s->out_format = FMT_H263; | |
571 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0; | |
572 avctx->delay=0; | |
573 s->low_delay=1; | |
574 break; | |
575 case CODEC_ID_H263P: | |
576 s->out_format = FMT_H263; | |
577 s->h263_plus = 1; | |
578 /* Fx */ | |
579 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0; | |
580 s->h263_aic= (avctx->flags & CODEC_FLAG_AC_PRED) ? 1:0; | |
581 s->modified_quant= s->h263_aic; | |
582 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0; | |
583 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0; | |
584 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0; | |
585 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus; | |
586 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0; | |
587 | |
588 /* /Fx */ | |
589 /* These are just to be sure */ | |
590 avctx->delay=0; | |
591 s->low_delay=1; | |
592 break; | |
593 case CODEC_ID_FLV1: | |
594 s->out_format = FMT_H263; | |
595 s->h263_flv = 2; /* format = 1; 11-bit codes */ | |
596 s->unrestricted_mv = 1; | |
597 s->rtp_mode=0; /* don't allow GOB */ | |
598 avctx->delay=0; | |
599 s->low_delay=1; | |
600 break; | |
601 case CODEC_ID_RV10: | |
602 s->out_format = FMT_H263; | |
603 avctx->delay=0; | |
604 s->low_delay=1; | |
605 break; | |
606 case CODEC_ID_RV20: | |
607 s->out_format = FMT_H263; | |
608 avctx->delay=0; | |
609 s->low_delay=1; | |
610 s->modified_quant=1; | |
611 s->h263_aic=1; | |
612 s->h263_plus=1; | |
613 s->loop_filter=1; | |
614 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus; | |
615 break; | |
616 case CODEC_ID_MPEG4: | |
617 s->out_format = FMT_H263; | |
618 s->h263_pred = 1; | |
619 s->unrestricted_mv = 1; | |
620 s->low_delay= s->max_b_frames ? 0 : 1; | |
621 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); | |
622 break; | |
623 case CODEC_ID_MSMPEG4V1: | |
624 s->out_format = FMT_H263; | |
625 s->h263_msmpeg4 = 1; | |
626 s->h263_pred = 1; | |
627 s->unrestricted_mv = 1; | |
628 s->msmpeg4_version= 1; | |
629 avctx->delay=0; | |
630 s->low_delay=1; | |
631 break; | |
632 case CODEC_ID_MSMPEG4V2: | |
633 s->out_format = FMT_H263; | |
634 s->h263_msmpeg4 = 1; | |
635 s->h263_pred = 1; | |
636 s->unrestricted_mv = 1; | |
637 s->msmpeg4_version= 2; | |
638 avctx->delay=0; | |
639 s->low_delay=1; | |
640 break; | |
641 case CODEC_ID_MSMPEG4V3: | |
642 s->out_format = FMT_H263; | |
643 s->h263_msmpeg4 = 1; | |
644 s->h263_pred = 1; | |
645 s->unrestricted_mv = 1; | |
646 s->msmpeg4_version= 3; | |
647 s->flipflop_rounding=1; | |
648 avctx->delay=0; | |
649 s->low_delay=1; | |
650 break; | |
651 case CODEC_ID_WMV1: | |
652 s->out_format = FMT_H263; | |
653 s->h263_msmpeg4 = 1; | |
654 s->h263_pred = 1; | |
655 s->unrestricted_mv = 1; | |
656 s->msmpeg4_version= 4; | |
657 s->flipflop_rounding=1; | |
658 avctx->delay=0; | |
659 s->low_delay=1; | |
660 break; | |
661 case CODEC_ID_WMV2: | |
662 s->out_format = FMT_H263; | |
663 s->h263_msmpeg4 = 1; | |
664 s->h263_pred = 1; | |
665 s->unrestricted_mv = 1; | |
666 s->msmpeg4_version= 5; | |
667 s->flipflop_rounding=1; | |
668 avctx->delay=0; | |
669 s->low_delay=1; | |
670 break; | |
671 default: | |
672 return -1; | |
673 } | |
674 | |
675 avctx->has_b_frames= !s->low_delay; | |
676 | |
677 s->encoding = 1; | |
678 | |
679 /* init */ | |
680 if (MPV_common_init(s) < 0) | |
681 return -1; | |
682 | |
5211
413c5e2eff68
move mpeg encoder specific initialization in the encoder specific file
aurel
parents:
5209
diff
changeset
|
683 if(!s->dct_quantize) |
413c5e2eff68
move mpeg encoder specific initialization in the encoder specific file
aurel
parents:
5209
diff
changeset
|
684 s->dct_quantize = dct_quantize_c; |
413c5e2eff68
move mpeg encoder specific initialization in the encoder specific file
aurel
parents:
5209
diff
changeset
|
685 if(!s->denoise_dct) |
413c5e2eff68
move mpeg encoder specific initialization in the encoder specific file
aurel
parents:
5209
diff
changeset
|
686 s->denoise_dct = denoise_dct_c; |
413c5e2eff68
move mpeg encoder specific initialization in the encoder specific file
aurel
parents:
5209
diff
changeset
|
687 s->fast_dct_quantize = s->dct_quantize; |
7034 | 688 if(avctx->trellis) |
5211
413c5e2eff68
move mpeg encoder specific initialization in the encoder specific file
aurel
parents:
5209
diff
changeset
|
689 s->dct_quantize = dct_quantize_trellis_c; |
413c5e2eff68
move mpeg encoder specific initialization in the encoder specific file
aurel
parents:
5209
diff
changeset
|
690 |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
691 if((ENABLE_H263P_ENCODER || ENABLE_RV20_ENCODER) && s->modified_quant) |
5204 | 692 s->chroma_qscale_table= ff_h263_chroma_qscale_table; |
693 s->progressive_frame= | |
694 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN)); | |
695 s->quant_precision=5; | |
696 | |
697 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp); | |
698 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp); | |
699 | |
700 if (ENABLE_H261_ENCODER && s->out_format == FMT_H261) | |
701 ff_h261_encode_init(s); | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
702 if (ENABLE_ANY_H263_ENCODER && s->out_format == FMT_H263) |
5204 | 703 h263_encode_init(s); |
704 if (ENABLE_MSMPEG4_ENCODER && s->msmpeg4_version) | |
705 ff_msmpeg4_encode_init(s); | |
5208 | 706 if ((ENABLE_MPEG1VIDEO_ENCODER || ENABLE_MPEG2VIDEO_ENCODER) |
707 && s->out_format == FMT_MPEG1) | |
5204 | 708 ff_mpeg1_encode_init(s); |
709 | |
710 /* init q matrix */ | |
711 for(i=0;i<64;i++) { | |
712 int j= s->dsp.idct_permutation[i]; | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
713 if(ENABLE_MPEG4_ENCODER && s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){ |
5204 | 714 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i]; |
715 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i]; | |
716 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){ | |
717 s->intra_matrix[j] = | |
718 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i]; | |
719 }else | |
720 { /* mpeg1/2 */ | |
721 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i]; | |
722 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i]; | |
723 } | |
724 if(s->avctx->intra_matrix) | |
725 s->intra_matrix[j] = s->avctx->intra_matrix[i]; | |
726 if(s->avctx->inter_matrix) | |
727 s->inter_matrix[j] = s->avctx->inter_matrix[i]; | |
728 } | |
729 | |
730 /* precompute matrix */ | |
731 /* for mjpeg, we do include qscale in the matrix */ | |
732 if (s->out_format != FMT_MJPEG) { | |
5789 | 733 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16, |
5204 | 734 s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1); |
5789 | 735 ff_convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16, |
5204 | 736 s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0); |
737 } | |
738 | |
739 if(ff_rate_control_init(s) < 0) | |
740 return -1; | |
741 | |
742 return 0; | |
743 } | |
744 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6497
diff
changeset
|
745 av_cold int MPV_encode_end(AVCodecContext *avctx) |
5204 | 746 { |
747 MpegEncContext *s = avctx->priv_data; | |
748 | |
749 ff_rate_control_uninit(s); | |
750 | |
751 MPV_common_end(s); | |
752 if ((ENABLE_MJPEG_ENCODER || ENABLE_LJPEG_ENCODER) && s->out_format == FMT_MJPEG) | |
753 ff_mjpeg_encode_close(s); | |
754 | |
755 av_freep(&avctx->extradata); | |
756 | |
757 return 0; | |
758 } | |
759 | |
760 static int get_sae(uint8_t *src, int ref, int stride){ | |
761 int x,y; | |
762 int acc=0; | |
763 | |
764 for(y=0; y<16; y++){ | |
765 for(x=0; x<16; x++){ | |
766 acc+= FFABS(src[x+y*stride] - ref); | |
767 } | |
768 } | |
769 | |
770 return acc; | |
771 } | |
772 | |
773 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){ | |
774 int x, y, w, h; | |
775 int acc=0; | |
776 | |
777 w= s->width &~15; | |
778 h= s->height&~15; | |
779 | |
780 for(y=0; y<h; y+=16){ | |
781 for(x=0; x<w; x+=16){ | |
782 int offset= x + y*stride; | |
783 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16); | |
784 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8; | |
785 int sae = get_sae(src + offset, mean, stride); | |
786 | |
787 acc+= sae + 500 < sad; | |
788 } | |
789 } | |
790 return acc; | |
791 } | |
792 | |
793 | |
794 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){ | |
795 AVFrame *pic=NULL; | |
796 int64_t pts; | |
797 int i; | |
798 const int encoding_delay= s->max_b_frames; | |
799 int direct=1; | |
800 | |
801 if(pic_arg){ | |
802 pts= pic_arg->pts; | |
803 pic_arg->display_picture_number= s->input_picture_number++; | |
804 | |
805 if(pts != AV_NOPTS_VALUE){ | |
806 if(s->user_specified_pts != AV_NOPTS_VALUE){ | |
807 int64_t time= pts; | |
808 int64_t last= s->user_specified_pts; | |
809 | |
810 if(time <= last){ | |
811 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%"PRId64", last=%"PRId64"\n", pts, s->user_specified_pts); | |
812 return -1; | |
813 } | |
814 } | |
815 s->user_specified_pts= pts; | |
816 }else{ | |
817 if(s->user_specified_pts != AV_NOPTS_VALUE){ | |
818 s->user_specified_pts= | |
819 pts= s->user_specified_pts + 1; | |
820 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n", pts); | |
821 }else{ | |
822 pts= pic_arg->display_picture_number; | |
823 } | |
824 } | |
825 } | |
826 | |
827 if(pic_arg){ | |
828 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0; | |
829 if(pic_arg->linesize[0] != s->linesize) direct=0; | |
830 if(pic_arg->linesize[1] != s->uvlinesize) direct=0; | |
831 if(pic_arg->linesize[2] != s->uvlinesize) direct=0; | |
832 | |
833 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize); | |
834 | |
835 if(direct){ | |
836 i= ff_find_unused_picture(s, 1); | |
837 | |
838 pic= (AVFrame*)&s->picture[i]; | |
839 pic->reference= 3; | |
840 | |
841 for(i=0; i<4; i++){ | |
842 pic->data[i]= pic_arg->data[i]; | |
843 pic->linesize[i]= pic_arg->linesize[i]; | |
844 } | |
845 alloc_picture(s, (Picture*)pic, 1); | |
846 }else{ | |
847 i= ff_find_unused_picture(s, 0); | |
848 | |
849 pic= (AVFrame*)&s->picture[i]; | |
850 pic->reference= 3; | |
851 | |
852 alloc_picture(s, (Picture*)pic, 0); | |
853 | |
854 if( pic->data[0] + INPLACE_OFFSET == pic_arg->data[0] | |
855 && pic->data[1] + INPLACE_OFFSET == pic_arg->data[1] | |
856 && pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]){ | |
857 // empty | |
858 }else{ | |
859 int h_chroma_shift, v_chroma_shift; | |
860 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift); | |
861 | |
862 for(i=0; i<3; i++){ | |
863 int src_stride= pic_arg->linesize[i]; | |
864 int dst_stride= i ? s->uvlinesize : s->linesize; | |
865 int h_shift= i ? h_chroma_shift : 0; | |
866 int v_shift= i ? v_chroma_shift : 0; | |
867 int w= s->width >>h_shift; | |
868 int h= s->height>>v_shift; | |
869 uint8_t *src= pic_arg->data[i]; | |
870 uint8_t *dst= pic->data[i]; | |
871 | |
872 if(!s->avctx->rc_buffer_size) | |
873 dst +=INPLACE_OFFSET; | |
874 | |
875 if(src_stride==dst_stride) | |
876 memcpy(dst, src, src_stride*h); | |
877 else{ | |
878 while(h--){ | |
879 memcpy(dst, src, w); | |
880 dst += dst_stride; | |
881 src += src_stride; | |
882 } | |
883 } | |
884 } | |
885 } | |
886 } | |
887 copy_picture_attributes(s, pic, pic_arg); | |
888 pic->pts= pts; //we set this here to avoid modifiying pic_arg | |
889 } | |
890 | |
891 /* shift buffer entries */ | |
892 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++) | |
893 s->input_picture[i-1]= s->input_picture[i]; | |
894 | |
895 s->input_picture[encoding_delay]= (Picture*)pic; | |
896 | |
897 return 0; | |
898 } | |
899 | |
900 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){ | |
901 int x, y, plane; | |
902 int score=0; | |
903 int64_t score64=0; | |
904 | |
905 for(plane=0; plane<3; plane++){ | |
906 const int stride= p->linesize[plane]; | |
907 const int bw= plane ? 1 : 2; | |
908 for(y=0; y<s->mb_height*bw; y++){ | |
909 for(x=0; x<s->mb_width*bw; x++){ | |
910 int off= p->type == FF_BUFFER_TYPE_SHARED ? 0: 16; | |
911 int v= s->dsp.frame_skip_cmp[1](s, p->data[plane] + 8*(x + y*stride)+off, ref->data[plane] + 8*(x + y*stride), stride, 8); | |
912 | |
913 switch(s->avctx->frame_skip_exp){ | |
914 case 0: score= FFMAX(score, v); break; | |
915 case 1: score+= FFABS(v);break; | |
916 case 2: score+= v*v;break; | |
917 case 3: score64+= FFABS(v*v*(int64_t)v);break; | |
918 case 4: score64+= v*v*(int64_t)(v*v);break; | |
919 } | |
920 } | |
921 } | |
922 } | |
923 | |
924 if(score) score64= score; | |
925 | |
926 if(score64 < s->avctx->frame_skip_threshold) | |
927 return 1; | |
928 if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8)) | |
929 return 1; | |
930 return 0; | |
931 } | |
932 | |
933 static int estimate_best_b_count(MpegEncContext *s){ | |
934 AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id); | |
935 AVCodecContext *c= avcodec_alloc_context(); | |
936 AVFrame input[FF_MAX_B_FRAMES+2]; | |
937 const int scale= s->avctx->brd_scale; | |
938 int i, j, out_size, p_lambda, b_lambda, lambda2; | |
939 int outbuf_size= s->width * s->height; //FIXME | |
940 uint8_t *outbuf= av_malloc(outbuf_size); | |
941 int64_t best_rd= INT64_MAX; | |
942 int best_b_count= -1; | |
943 | |
944 assert(scale>=0 && scale <=3); | |
945 | |
946 // emms_c(); | |
6481 | 947 p_lambda= s->last_lambda_for[FF_P_TYPE]; //s->next_picture_ptr->quality; |
948 b_lambda= s->last_lambda_for[FF_B_TYPE]; //p_lambda *FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset; | |
5204 | 949 if(!b_lambda) b_lambda= p_lambda; //FIXME we should do this somewhere else |
950 lambda2= (b_lambda*b_lambda + (1<<FF_LAMBDA_SHIFT)/2 ) >> FF_LAMBDA_SHIFT; | |
951 | |
952 c->width = s->width >> scale; | |
953 c->height= s->height>> scale; | |
954 c->flags= CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR | CODEC_FLAG_INPUT_PRESERVED /*| CODEC_FLAG_EMU_EDGE*/; | |
955 c->flags|= s->avctx->flags & CODEC_FLAG_QPEL; | |
956 c->mb_decision= s->avctx->mb_decision; | |
957 c->me_cmp= s->avctx->me_cmp; | |
958 c->mb_cmp= s->avctx->mb_cmp; | |
959 c->me_sub_cmp= s->avctx->me_sub_cmp; | |
960 c->pix_fmt = PIX_FMT_YUV420P; | |
961 c->time_base= s->avctx->time_base; | |
962 c->max_b_frames= s->max_b_frames; | |
963 | |
964 if (avcodec_open(c, codec) < 0) | |
965 return -1; | |
966 | |
967 for(i=0; i<s->max_b_frames+2; i++){ | |
968 int ysize= c->width*c->height; | |
969 int csize= (c->width/2)*(c->height/2); | |
970 Picture pre_input, *pre_input_ptr= i ? s->input_picture[i-1] : s->next_picture_ptr; | |
971 | |
972 avcodec_get_frame_defaults(&input[i]); | |
973 input[i].data[0]= av_malloc(ysize + 2*csize); | |
974 input[i].data[1]= input[i].data[0] + ysize; | |
975 input[i].data[2]= input[i].data[1] + csize; | |
976 input[i].linesize[0]= c->width; | |
977 input[i].linesize[1]= | |
978 input[i].linesize[2]= c->width/2; | |
979 | |
980 if(pre_input_ptr && (!i || s->input_picture[i-1])) { | |
981 pre_input= *pre_input_ptr; | |
982 | |
983 if(pre_input.type != FF_BUFFER_TYPE_SHARED && i) { | |
984 pre_input.data[0]+=INPLACE_OFFSET; | |
985 pre_input.data[1]+=INPLACE_OFFSET; | |
986 pre_input.data[2]+=INPLACE_OFFSET; | |
987 } | |
988 | |
989 s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0], pre_input.data[0], pre_input.linesize[0], c->width, c->height); | |
990 s->dsp.shrink[scale](input[i].data[1], input[i].linesize[1], pre_input.data[1], pre_input.linesize[1], c->width>>1, c->height>>1); | |
991 s->dsp.shrink[scale](input[i].data[2], input[i].linesize[2], pre_input.data[2], pre_input.linesize[2], c->width>>1, c->height>>1); | |
992 } | |
993 } | |
994 | |
995 for(j=0; j<s->max_b_frames+1; j++){ | |
996 int64_t rd=0; | |
997 | |
998 if(!s->input_picture[j]) | |
999 break; | |
1000 | |
1001 c->error[0]= c->error[1]= c->error[2]= 0; | |
1002 | |
6481 | 1003 input[0].pict_type= FF_I_TYPE; |
5204 | 1004 input[0].quality= 1 * FF_QP2LAMBDA; |
1005 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[0]); | |
1006 // rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT; | |
1007 | |
1008 for(i=0; i<s->max_b_frames+1; i++){ | |
1009 int is_p= i % (j+1) == j || i==s->max_b_frames; | |
1010 | |
6481 | 1011 input[i+1].pict_type= is_p ? FF_P_TYPE : FF_B_TYPE; |
5204 | 1012 input[i+1].quality= is_p ? p_lambda : b_lambda; |
1013 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[i+1]); | |
1014 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3); | |
1015 } | |
1016 | |
1017 /* get the delayed frames */ | |
1018 while(out_size){ | |
1019 out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL); | |
1020 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3); | |
1021 } | |
1022 | |
1023 rd += c->error[0] + c->error[1] + c->error[2]; | |
1024 | |
1025 if(rd < best_rd){ | |
1026 best_rd= rd; | |
1027 best_b_count= j; | |
1028 } | |
1029 } | |
1030 | |
1031 av_freep(&outbuf); | |
1032 avcodec_close(c); | |
1033 av_freep(&c); | |
1034 | |
1035 for(i=0; i<s->max_b_frames+2; i++){ | |
1036 av_freep(&input[i].data[0]); | |
1037 } | |
1038 | |
1039 return best_b_count; | |
1040 } | |
1041 | |
1042 static void select_input_picture(MpegEncContext *s){ | |
1043 int i; | |
1044 | |
1045 for(i=1; i<MAX_PICTURE_COUNT; i++) | |
1046 s->reordered_input_picture[i-1]= s->reordered_input_picture[i]; | |
1047 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL; | |
1048 | |
1049 /* set next picture type & ordering */ | |
1050 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){ | |
1051 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){ | |
1052 s->reordered_input_picture[0]= s->input_picture[0]; | |
6481 | 1053 s->reordered_input_picture[0]->pict_type= FF_I_TYPE; |
5204 | 1054 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++; |
1055 }else{ | |
1056 int b_frames; | |
1057 | |
1058 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){ | |
1059 if(s->picture_in_gop_number < s->gop_size && skip_check(s, s->input_picture[0], s->next_picture_ptr)){ | |
1060 //FIXME check that te gop check above is +-1 correct | |
1061 //av_log(NULL, AV_LOG_DEBUG, "skip %p %"PRId64"\n", s->input_picture[0]->data[0], s->input_picture[0]->pts); | |
1062 | |
1063 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){ | |
1064 for(i=0; i<4; i++) | |
1065 s->input_picture[0]->data[i]= NULL; | |
1066 s->input_picture[0]->type= 0; | |
1067 }else{ | |
1068 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER | |
1069 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL); | |
1070 | |
1071 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]); | |
1072 } | |
1073 | |
1074 emms_c(); | |
1075 ff_vbv_update(s, 0); | |
1076 | |
1077 goto no_output_pic; | |
1078 } | |
1079 } | |
1080 | |
1081 if(s->flags&CODEC_FLAG_PASS2){ | |
1082 for(i=0; i<s->max_b_frames+1; i++){ | |
1083 int pict_num= s->input_picture[0]->display_picture_number + i; | |
1084 | |
1085 if(pict_num >= s->rc_context.num_entries) | |
1086 break; | |
1087 if(!s->input_picture[i]){ | |
6481 | 1088 s->rc_context.entry[pict_num-1].new_pict_type = FF_P_TYPE; |
5204 | 1089 break; |
1090 } | |
1091 | |
1092 s->input_picture[i]->pict_type= | |
1093 s->rc_context.entry[pict_num].new_pict_type; | |
1094 } | |
1095 } | |
1096 | |
1097 if(s->avctx->b_frame_strategy==0){ | |
1098 b_frames= s->max_b_frames; | |
1099 while(b_frames && !s->input_picture[b_frames]) b_frames--; | |
1100 }else if(s->avctx->b_frame_strategy==1){ | |
1101 for(i=1; i<s->max_b_frames+1; i++){ | |
1102 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){ | |
1103 s->input_picture[i]->b_frame_score= | |
1104 get_intra_count(s, s->input_picture[i ]->data[0], | |
1105 s->input_picture[i-1]->data[0], s->linesize) + 1; | |
1106 } | |
1107 } | |
1108 for(i=0; i<s->max_b_frames+1; i++){ | |
1109 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/s->avctx->b_sensitivity) break; | |
1110 } | |
1111 | |
1112 b_frames= FFMAX(0, i-1); | |
1113 | |
1114 /* reset scores */ | |
1115 for(i=0; i<b_frames+1; i++){ | |
1116 s->input_picture[i]->b_frame_score=0; | |
1117 } | |
1118 }else if(s->avctx->b_frame_strategy==2){ | |
1119 b_frames= estimate_best_b_count(s); | |
1120 }else{ | |
1121 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n"); | |
1122 b_frames=0; | |
1123 } | |
1124 | |
1125 emms_c(); | |
1126 //static int b_count=0; | |
1127 //b_count+= b_frames; | |
1128 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count); | |
1129 | |
1130 for(i= b_frames - 1; i>=0; i--){ | |
1131 int type= s->input_picture[i]->pict_type; | |
6481 | 1132 if(type && type != FF_B_TYPE) |
5204 | 1133 b_frames= i; |
1134 } | |
6481 | 1135 if(s->input_picture[b_frames]->pict_type == FF_B_TYPE && b_frames == s->max_b_frames){ |
5204 | 1136 av_log(s->avctx, AV_LOG_ERROR, "warning, too many b frames in a row\n"); |
1137 } | |
1138 | |
1139 if(s->picture_in_gop_number + b_frames >= s->gop_size){ | |
1140 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){ | |
1141 b_frames= s->gop_size - s->picture_in_gop_number - 1; | |
1142 }else{ | |
1143 if(s->flags & CODEC_FLAG_CLOSED_GOP) | |
1144 b_frames=0; | |
6481 | 1145 s->input_picture[b_frames]->pict_type= FF_I_TYPE; |
5204 | 1146 } |
1147 } | |
1148 | |
1149 if( (s->flags & CODEC_FLAG_CLOSED_GOP) | |
1150 && b_frames | |
6481 | 1151 && s->input_picture[b_frames]->pict_type== FF_I_TYPE) |
5204 | 1152 b_frames--; |
1153 | |
1154 s->reordered_input_picture[0]= s->input_picture[b_frames]; | |
6481 | 1155 if(s->reordered_input_picture[0]->pict_type != FF_I_TYPE) |
1156 s->reordered_input_picture[0]->pict_type= FF_P_TYPE; | |
5204 | 1157 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++; |
1158 for(i=0; i<b_frames; i++){ | |
1159 s->reordered_input_picture[i+1]= s->input_picture[i]; | |
6481 | 1160 s->reordered_input_picture[i+1]->pict_type= FF_B_TYPE; |
5204 | 1161 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++; |
1162 } | |
1163 } | |
1164 } | |
1165 no_output_pic: | |
1166 if(s->reordered_input_picture[0]){ | |
6481 | 1167 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=FF_B_TYPE ? 3 : 0; |
5204 | 1168 |
1169 copy_picture(&s->new_picture, s->reordered_input_picture[0]); | |
1170 | |
1171 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED || s->avctx->rc_buffer_size){ | |
1172 // input is a shared pix, so we can't modifiy it -> alloc a new one & ensure that the shared one is reuseable | |
1173 | |
1174 int i= ff_find_unused_picture(s, 0); | |
1175 Picture *pic= &s->picture[i]; | |
1176 | |
1177 pic->reference = s->reordered_input_picture[0]->reference; | |
1178 alloc_picture(s, pic, 0); | |
1179 | |
1180 /* mark us unused / free shared pic */ | |
1181 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_INTERNAL) | |
1182 s->avctx->release_buffer(s->avctx, (AVFrame*)s->reordered_input_picture[0]); | |
1183 for(i=0; i<4; i++) | |
1184 s->reordered_input_picture[0]->data[i]= NULL; | |
1185 s->reordered_input_picture[0]->type= 0; | |
1186 | |
1187 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]); | |
1188 | |
1189 s->current_picture_ptr= pic; | |
1190 }else{ | |
1191 // input is not a shared pix -> reuse buffer for current_pix | |
1192 | |
1193 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER | |
1194 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL); | |
1195 | |
1196 s->current_picture_ptr= s->reordered_input_picture[0]; | |
1197 for(i=0; i<4; i++){ | |
1198 s->new_picture.data[i]+= INPLACE_OFFSET; | |
1199 } | |
1200 } | |
1201 copy_picture(&s->current_picture, s->current_picture_ptr); | |
1202 | |
1203 s->picture_number= s->new_picture.display_picture_number; | |
1204 //printf("dpn:%d\n", s->picture_number); | |
1205 }else{ | |
1206 memset(&s->new_picture, 0, sizeof(Picture)); | |
1207 } | |
1208 } | |
1209 | |
1210 int MPV_encode_picture(AVCodecContext *avctx, | |
1211 unsigned char *buf, int buf_size, void *data) | |
1212 { | |
1213 MpegEncContext *s = avctx->priv_data; | |
1214 AVFrame *pic_arg = data; | |
1215 int i, stuffing_count; | |
1216 | |
1217 for(i=0; i<avctx->thread_count; i++){ | |
1218 int start_y= s->thread_context[i]->start_mb_y; | |
1219 int end_y= s->thread_context[i]-> end_mb_y; | |
1220 int h= s->mb_height; | |
1221 uint8_t *start= buf + (size_t)(((int64_t) buf_size)*start_y/h); | |
1222 uint8_t *end = buf + (size_t)(((int64_t) buf_size)* end_y/h); | |
1223 | |
1224 init_put_bits(&s->thread_context[i]->pb, start, end - start); | |
1225 } | |
1226 | |
1227 s->picture_in_gop_number++; | |
1228 | |
1229 if(load_input_picture(s, pic_arg) < 0) | |
1230 return -1; | |
1231 | |
1232 select_input_picture(s); | |
1233 | |
1234 /* output? */ | |
1235 if(s->new_picture.data[0]){ | |
1236 s->pict_type= s->new_picture.pict_type; | |
1237 //emms_c(); | |
1238 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale); | |
1239 MPV_frame_start(s, avctx); | |
1240 vbv_retry: | |
1241 if (encode_picture(s, s->picture_number) < 0) | |
1242 return -1; | |
1243 | |
1244 avctx->real_pict_num = s->picture_number; | |
1245 avctx->header_bits = s->header_bits; | |
1246 avctx->mv_bits = s->mv_bits; | |
1247 avctx->misc_bits = s->misc_bits; | |
1248 avctx->i_tex_bits = s->i_tex_bits; | |
1249 avctx->p_tex_bits = s->p_tex_bits; | |
1250 avctx->i_count = s->i_count; | |
1251 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx | |
1252 avctx->skip_count = s->skip_count; | |
1253 | |
1254 MPV_frame_end(s); | |
1255 | |
1256 if (ENABLE_MJPEG_ENCODER && s->out_format == FMT_MJPEG) | |
1257 ff_mjpeg_encode_picture_trailer(s); | |
1258 | |
1259 if(avctx->rc_buffer_size){ | |
1260 RateControlContext *rcc= &s->rc_context; | |
1261 int max_size= rcc->buffer_index/3; | |
1262 | |
1263 if(put_bits_count(&s->pb) > max_size && s->lambda < s->avctx->lmax){ | |
1264 s->next_lambda= FFMAX(s->lambda+1, s->lambda*(s->qscale+1) / s->qscale); | |
1265 if(s->adaptive_quant){ | |
1266 int i; | |
1267 for(i=0; i<s->mb_height*s->mb_stride; i++) | |
1268 s->lambda_table[i]= FFMAX(s->lambda_table[i]+1, s->lambda_table[i]*(s->qscale+1) / s->qscale); | |
1269 } | |
1270 s->mb_skipped = 0; //done in MPV_frame_start() | |
6481 | 1271 if(s->pict_type==FF_P_TYPE){ //done in encode_picture() so we must undo it |
5204 | 1272 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4) |
1273 s->no_rounding ^= 1; | |
1274 } | |
6481 | 1275 if(s->pict_type!=FF_B_TYPE){ |
5204 | 1276 s->time_base= s->last_time_base; |
1277 s->last_non_b_time= s->time - s->pp_time; | |
1278 } | |
1279 // av_log(NULL, AV_LOG_ERROR, "R:%d ", s->next_lambda); | |
1280 for(i=0; i<avctx->thread_count; i++){ | |
1281 PutBitContext *pb= &s->thread_context[i]->pb; | |
1282 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf); | |
1283 } | |
1284 goto vbv_retry; | |
1285 } | |
1286 | |
1287 assert(s->avctx->rc_max_rate); | |
1288 } | |
1289 | |
1290 if(s->flags&CODEC_FLAG_PASS1) | |
1291 ff_write_pass1_stats(s); | |
1292 | |
1293 for(i=0; i<4; i++){ | |
1294 s->current_picture_ptr->error[i]= s->current_picture.error[i]; | |
1295 avctx->error[i] += s->current_picture_ptr->error[i]; | |
1296 } | |
1297 | |
1298 if(s->flags&CODEC_FLAG_PASS1) | |
1299 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb)); | |
1300 flush_put_bits(&s->pb); | |
1301 s->frame_bits = put_bits_count(&s->pb); | |
1302 | |
1303 stuffing_count= ff_vbv_update(s, s->frame_bits); | |
1304 if(stuffing_count){ | |
1305 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){ | |
1306 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n"); | |
1307 return -1; | |
1308 } | |
1309 | |
1310 switch(s->codec_id){ | |
1311 case CODEC_ID_MPEG1VIDEO: | |
1312 case CODEC_ID_MPEG2VIDEO: | |
1313 while(stuffing_count--){ | |
1314 put_bits(&s->pb, 8, 0); | |
1315 } | |
1316 break; | |
1317 case CODEC_ID_MPEG4: | |
1318 put_bits(&s->pb, 16, 0); | |
1319 put_bits(&s->pb, 16, 0x1C3); | |
1320 stuffing_count -= 4; | |
1321 while(stuffing_count--){ | |
1322 put_bits(&s->pb, 8, 0xFF); | |
1323 } | |
1324 break; | |
1325 default: | |
1326 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n"); | |
1327 } | |
1328 flush_put_bits(&s->pb); | |
1329 s->frame_bits = put_bits_count(&s->pb); | |
1330 } | |
1331 | |
1332 /* update mpeg1/2 vbv_delay for CBR */ | |
1333 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1 | |
1334 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){ | |
1335 int vbv_delay; | |
1336 | |
1337 assert(s->repeat_first_field==0); | |
1338 | |
1339 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate); | |
1340 assert(vbv_delay < 0xFFFF); | |
1341 | |
1342 s->vbv_delay_ptr[0] &= 0xF8; | |
1343 s->vbv_delay_ptr[0] |= vbv_delay>>13; | |
1344 s->vbv_delay_ptr[1] = vbv_delay>>5; | |
1345 s->vbv_delay_ptr[2] &= 0x07; | |
1346 s->vbv_delay_ptr[2] |= vbv_delay<<3; | |
1347 } | |
1348 s->total_bits += s->frame_bits; | |
1349 avctx->frame_bits = s->frame_bits; | |
1350 }else{ | |
1351 assert((pbBufPtr(&s->pb) == s->pb.buf)); | |
1352 s->frame_bits=0; | |
1353 } | |
1354 assert((s->frame_bits&7)==0); | |
1355 | |
1356 return s->frame_bits/8; | |
1357 } | |
1358 | |
1359 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold) | |
1360 { | |
1361 static const char tab[64]= | |
1362 {3,2,2,1,1,1,1,1, | |
1363 1,1,1,1,1,1,1,1, | |
1364 1,1,1,1,1,1,1,1, | |
1365 0,0,0,0,0,0,0,0, | |
1366 0,0,0,0,0,0,0,0, | |
1367 0,0,0,0,0,0,0,0, | |
1368 0,0,0,0,0,0,0,0, | |
1369 0,0,0,0,0,0,0,0}; | |
1370 int score=0; | |
1371 int run=0; | |
1372 int i; | |
1373 DCTELEM *block= s->block[n]; | |
1374 const int last_index= s->block_last_index[n]; | |
1375 int skip_dc; | |
1376 | |
1377 if(threshold<0){ | |
1378 skip_dc=0; | |
1379 threshold= -threshold; | |
1380 }else | |
1381 skip_dc=1; | |
1382 | |
6497 | 1383 /* Are all we could set to zero already zero? */ |
5204 | 1384 if(last_index<=skip_dc - 1) return; |
1385 | |
1386 for(i=0; i<=last_index; i++){ | |
1387 const int j = s->intra_scantable.permutated[i]; | |
1388 const int level = FFABS(block[j]); | |
1389 if(level==1){ | |
1390 if(skip_dc && i==0) continue; | |
1391 score+= tab[run]; | |
1392 run=0; | |
1393 }else if(level>1){ | |
1394 return; | |
1395 }else{ | |
1396 run++; | |
1397 } | |
1398 } | |
1399 if(score >= threshold) return; | |
1400 for(i=skip_dc; i<=last_index; i++){ | |
1401 const int j = s->intra_scantable.permutated[i]; | |
1402 block[j]=0; | |
1403 } | |
1404 if(block[0]) s->block_last_index[n]= 0; | |
1405 else s->block_last_index[n]= -1; | |
1406 } | |
1407 | |
1408 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index) | |
1409 { | |
1410 int i; | |
1411 const int maxlevel= s->max_qcoeff; | |
1412 const int minlevel= s->min_qcoeff; | |
1413 int overflow=0; | |
1414 | |
1415 if(s->mb_intra){ | |
1416 i=1; //skip clipping of intra dc | |
1417 }else | |
1418 i=0; | |
1419 | |
1420 for(;i<=last_index; i++){ | |
1421 const int j= s->intra_scantable.permutated[i]; | |
1422 int level = block[j]; | |
1423 | |
1424 if (level>maxlevel){ | |
1425 level=maxlevel; | |
1426 overflow++; | |
1427 }else if(level<minlevel){ | |
1428 level=minlevel; | |
1429 overflow++; | |
1430 } | |
1431 | |
1432 block[j]= level; | |
1433 } | |
1434 | |
1435 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE) | |
1436 av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel); | |
1437 } | |
1438 | |
5909 | 1439 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride){ |
5204 | 1440 int x, y; |
1441 //FIXME optimize | |
1442 for(y=0; y<8; y++){ | |
1443 for(x=0; x<8; x++){ | |
1444 int x2, y2; | |
1445 int sum=0; | |
1446 int sqr=0; | |
1447 int count=0; | |
1448 | |
1449 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){ | |
1450 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){ | |
1451 int v= ptr[x2 + y2*stride]; | |
1452 sum += v; | |
1453 sqr += v*v; | |
1454 count++; | |
1455 } | |
1456 } | |
1457 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count; | |
1458 } | |
1459 } | |
1460 } | |
1461 | |
1462 static av_always_inline void encode_mb_internal(MpegEncContext *s, int motion_x, int motion_y, int mb_block_height, int mb_block_count) | |
1463 { | |
1464 int16_t weight[8][64]; | |
1465 DCTELEM orig[8][64]; | |
1466 const int mb_x= s->mb_x; | |
1467 const int mb_y= s->mb_y; | |
1468 int i; | |
1469 int skip_dct[8]; | |
1470 int dct_offset = s->linesize*8; //default for progressive frames | |
1471 uint8_t *ptr_y, *ptr_cb, *ptr_cr; | |
1472 int wrap_y, wrap_c; | |
1473 | |
1474 for(i=0; i<mb_block_count; i++) skip_dct[i]=s->skipdct; | |
1475 | |
1476 if(s->adaptive_quant){ | |
1477 const int last_qp= s->qscale; | |
1478 const int mb_xy= mb_x + mb_y*s->mb_stride; | |
1479 | |
1480 s->lambda= s->lambda_table[mb_xy]; | |
1481 update_qscale(s); | |
1482 | |
1483 if(!(s->flags&CODEC_FLAG_QP_RD)){ | |
1484 s->qscale= s->current_picture_ptr->qscale_table[mb_xy]; | |
1485 s->dquant= s->qscale - last_qp; | |
1486 | |
1487 if(s->out_format==FMT_H263){ | |
1488 s->dquant= av_clip(s->dquant, -2, 2); | |
1489 | |
1490 if(s->codec_id==CODEC_ID_MPEG4){ | |
1491 if(!s->mb_intra){ | |
6481 | 1492 if(s->pict_type == FF_B_TYPE){ |
5204 | 1493 if(s->dquant&1 || s->mv_dir&MV_DIRECT) |
1494 s->dquant= 0; | |
1495 } | |
1496 if(s->mv_type==MV_TYPE_8X8) | |
1497 s->dquant=0; | |
1498 } | |
1499 } | |
1500 } | |
1501 } | |
1502 ff_set_qscale(s, last_qp + s->dquant); | |
1503 }else if(s->flags&CODEC_FLAG_QP_RD) | |
1504 ff_set_qscale(s, s->qscale + s->dquant); | |
1505 | |
1506 wrap_y = s->linesize; | |
1507 wrap_c = s->uvlinesize; | |
1508 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16; | |
1509 ptr_cb = s->new_picture.data[1] + (mb_y * mb_block_height * wrap_c) + mb_x * 8; | |
1510 ptr_cr = s->new_picture.data[2] + (mb_y * mb_block_height * wrap_c) + mb_x * 8; | |
1511 | |
1512 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){ | |
1513 uint8_t *ebuf= s->edge_emu_buffer + 32; | |
1514 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height); | |
1515 ptr_y= ebuf; | |
1516 ff_emulated_edge_mc(ebuf+18*wrap_y , ptr_cb, wrap_c, 8, mb_block_height, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | |
1517 ptr_cb= ebuf+18*wrap_y; | |
1518 ff_emulated_edge_mc(ebuf+18*wrap_y+8, ptr_cr, wrap_c, 8, mb_block_height, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | |
1519 ptr_cr= ebuf+18*wrap_y+8; | |
1520 } | |
1521 | |
1522 if (s->mb_intra) { | |
1523 if(s->flags&CODEC_FLAG_INTERLACED_DCT){ | |
1524 int progressive_score, interlaced_score; | |
1525 | |
1526 s->interlaced_dct=0; | |
1527 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8) | |
1528 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400; | |
1529 | |
1530 if(progressive_score > 0){ | |
1531 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8) | |
1532 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8); | |
1533 if(progressive_score > interlaced_score){ | |
1534 s->interlaced_dct=1; | |
1535 | |
1536 dct_offset= wrap_y; | |
1537 wrap_y<<=1; | |
1538 if (s->chroma_format == CHROMA_422) | |
1539 wrap_c<<=1; | |
1540 } | |
1541 } | |
1542 } | |
1543 | |
1544 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y); | |
1545 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y); | |
1546 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y); | |
1547 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y); | |
1548 | |
1549 if(s->flags&CODEC_FLAG_GRAY){ | |
1550 skip_dct[4]= 1; | |
1551 skip_dct[5]= 1; | |
1552 }else{ | |
1553 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c); | |
1554 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c); | |
1555 if(!s->chroma_y_shift){ /* 422 */ | |
1556 s->dsp.get_pixels(s->block[6], ptr_cb + (dct_offset>>1), wrap_c); | |
1557 s->dsp.get_pixels(s->block[7], ptr_cr + (dct_offset>>1), wrap_c); | |
1558 } | |
1559 } | |
1560 }else{ | |
1561 op_pixels_func (*op_pix)[4]; | |
1562 qpel_mc_func (*op_qpix)[16]; | |
1563 uint8_t *dest_y, *dest_cb, *dest_cr; | |
1564 | |
1565 dest_y = s->dest[0]; | |
1566 dest_cb = s->dest[1]; | |
1567 dest_cr = s->dest[2]; | |
1568 | |
6481 | 1569 if ((!s->no_rounding) || s->pict_type==FF_B_TYPE){ |
5204 | 1570 op_pix = s->dsp.put_pixels_tab; |
1571 op_qpix= s->dsp.put_qpel_pixels_tab; | |
1572 }else{ | |
1573 op_pix = s->dsp.put_no_rnd_pixels_tab; | |
1574 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab; | |
1575 } | |
1576 | |
1577 if (s->mv_dir & MV_DIR_FORWARD) { | |
1578 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix); | |
1579 op_pix = s->dsp.avg_pixels_tab; | |
1580 op_qpix= s->dsp.avg_qpel_pixels_tab; | |
1581 } | |
1582 if (s->mv_dir & MV_DIR_BACKWARD) { | |
1583 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix); | |
1584 } | |
1585 | |
1586 if(s->flags&CODEC_FLAG_INTERLACED_DCT){ | |
1587 int progressive_score, interlaced_score; | |
1588 | |
1589 s->interlaced_dct=0; | |
1590 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8) | |
1591 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400; | |
1592 | |
1593 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400; | |
1594 | |
1595 if(progressive_score>0){ | |
1596 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8) | |
1597 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8); | |
1598 | |
1599 if(progressive_score > interlaced_score){ | |
1600 s->interlaced_dct=1; | |
1601 | |
1602 dct_offset= wrap_y; | |
1603 wrap_y<<=1; | |
1604 if (s->chroma_format == CHROMA_422) | |
1605 wrap_c<<=1; | |
1606 } | |
1607 } | |
1608 } | |
1609 | |
1610 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y); | |
1611 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y); | |
1612 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y); | |
1613 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y); | |
1614 | |
1615 if(s->flags&CODEC_FLAG_GRAY){ | |
1616 skip_dct[4]= 1; | |
1617 skip_dct[5]= 1; | |
1618 }else{ | |
1619 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c); | |
1620 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c); | |
1621 if(!s->chroma_y_shift){ /* 422 */ | |
1622 s->dsp.diff_pixels(s->block[6], ptr_cb + (dct_offset>>1), dest_cb + (dct_offset>>1), wrap_c); | |
1623 s->dsp.diff_pixels(s->block[7], ptr_cr + (dct_offset>>1), dest_cr + (dct_offset>>1), wrap_c); | |
1624 } | |
1625 } | |
1626 /* pre quantization */ | |
1627 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){ | |
1628 //FIXME optimize | |
1629 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1; | |
1630 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1; | |
1631 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1; | |
1632 if(s->dsp.sad[1](NULL, ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y, 8) < 20*s->qscale) skip_dct[3]= 1; | |
1633 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1; | |
1634 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1; | |
1635 if(!s->chroma_y_shift){ /* 422 */ | |
1636 if(s->dsp.sad[1](NULL, ptr_cb +(dct_offset>>1), dest_cb +(dct_offset>>1), wrap_c, 8) < 20*s->qscale) skip_dct[6]= 1; | |
1637 if(s->dsp.sad[1](NULL, ptr_cr +(dct_offset>>1), dest_cr +(dct_offset>>1), wrap_c, 8) < 20*s->qscale) skip_dct[7]= 1; | |
1638 } | |
1639 } | |
1640 } | |
1641 | |
1642 if(s->avctx->quantizer_noise_shaping){ | |
5909 | 1643 if(!skip_dct[0]) get_visual_weight(weight[0], ptr_y , wrap_y); |
1644 if(!skip_dct[1]) get_visual_weight(weight[1], ptr_y + 8, wrap_y); | |
1645 if(!skip_dct[2]) get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y); | |
1646 if(!skip_dct[3]) get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y); | |
1647 if(!skip_dct[4]) get_visual_weight(weight[4], ptr_cb , wrap_c); | |
1648 if(!skip_dct[5]) get_visual_weight(weight[5], ptr_cr , wrap_c); | |
5204 | 1649 if(!s->chroma_y_shift){ /* 422 */ |
5909 | 1650 if(!skip_dct[6]) get_visual_weight(weight[6], ptr_cb + (dct_offset>>1), wrap_c); |
1651 if(!skip_dct[7]) get_visual_weight(weight[7], ptr_cr + (dct_offset>>1), wrap_c); | |
5204 | 1652 } |
1653 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*mb_block_count); | |
1654 } | |
1655 | |
1656 /* DCT & quantize */ | |
1657 assert(s->out_format!=FMT_MJPEG || s->qscale==8); | |
1658 { | |
1659 for(i=0;i<mb_block_count;i++) { | |
1660 if(!skip_dct[i]){ | |
1661 int overflow; | |
1662 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow); | |
1663 // FIXME we could decide to change to quantizer instead of clipping | |
1664 // JS: I don't think that would be a good idea it could lower quality instead | |
1665 // of improve it. Just INTRADC clipping deserves changes in quantizer | |
1666 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]); | |
1667 }else | |
1668 s->block_last_index[i]= -1; | |
1669 } | |
1670 if(s->avctx->quantizer_noise_shaping){ | |
1671 for(i=0;i<mb_block_count;i++) { | |
1672 if(!skip_dct[i]){ | |
1673 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale); | |
1674 } | |
1675 } | |
1676 } | |
1677 | |
1678 if(s->luma_elim_threshold && !s->mb_intra) | |
1679 for(i=0; i<4; i++) | |
1680 dct_single_coeff_elimination(s, i, s->luma_elim_threshold); | |
1681 if(s->chroma_elim_threshold && !s->mb_intra) | |
1682 for(i=4; i<mb_block_count; i++) | |
1683 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold); | |
1684 | |
1685 if(s->flags & CODEC_FLAG_CBP_RD){ | |
1686 for(i=0;i<mb_block_count;i++) { | |
1687 if(s->block_last_index[i] == -1) | |
1688 s->coded_score[i]= INT_MAX/256; | |
1689 } | |
1690 } | |
1691 } | |
1692 | |
1693 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){ | |
1694 s->block_last_index[4]= | |
1695 s->block_last_index[5]= 0; | |
1696 s->block[4][0]= | |
1697 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale; | |
1698 } | |
1699 | |
1700 //non c quantize code returns incorrect block_last_index FIXME | |
1701 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){ | |
1702 for(i=0; i<mb_block_count; i++){ | |
1703 int j; | |
1704 if(s->block_last_index[i]>0){ | |
1705 for(j=63; j>0; j--){ | |
1706 if(s->block[i][ s->intra_scantable.permutated[j] ]) break; | |
1707 } | |
1708 s->block_last_index[i]= j; | |
1709 } | |
1710 } | |
1711 } | |
1712 | |
1713 /* huffman encode */ | |
1714 switch(s->codec_id){ //FIXME funct ptr could be slightly faster | |
1715 case CODEC_ID_MPEG1VIDEO: | |
1716 case CODEC_ID_MPEG2VIDEO: | |
5208 | 1717 if (ENABLE_MPEG1VIDEO_ENCODER || ENABLE_MPEG2VIDEO_ENCODER) |
5209 | 1718 mpeg1_encode_mb(s, s->block, motion_x, motion_y); |
1719 break; | |
5204 | 1720 case CODEC_ID_MPEG4: |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
1721 if (ENABLE_MPEG4_ENCODER) |
5278 | 1722 mpeg4_encode_mb(s, s->block, motion_x, motion_y); |
1723 break; | |
5204 | 1724 case CODEC_ID_MSMPEG4V2: |
1725 case CODEC_ID_MSMPEG4V3: | |
1726 case CODEC_ID_WMV1: | |
1727 if (ENABLE_MSMPEG4_ENCODER) | |
1728 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); | |
1729 break; | |
1730 case CODEC_ID_WMV2: | |
1731 if (ENABLE_WMV2_ENCODER) | |
1732 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); | |
1733 break; | |
1734 case CODEC_ID_H261: | |
1735 if (ENABLE_H261_ENCODER) | |
1736 ff_h261_encode_mb(s, s->block, motion_x, motion_y); | |
1737 break; | |
1738 case CODEC_ID_H263: | |
1739 case CODEC_ID_H263P: | |
1740 case CODEC_ID_FLV1: | |
1741 case CODEC_ID_RV10: | |
1742 case CODEC_ID_RV20: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
1743 if (ENABLE_H263_ENCODER || ENABLE_H263P_ENCODER || |
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
1744 ENABLE_FLV_ENCODER || ENABLE_RV10_ENCODER || ENABLE_RV20_ENCODER) |
5278 | 1745 h263_encode_mb(s, s->block, motion_x, motion_y); |
1746 break; | |
5204 | 1747 case CODEC_ID_MJPEG: |
1748 if (ENABLE_MJPEG_ENCODER) | |
1749 ff_mjpeg_encode_mb(s, s->block); | |
1750 break; | |
1751 default: | |
1752 assert(0); | |
1753 } | |
1754 } | |
1755 | |
1756 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y) | |
1757 { | |
1758 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6); | |
1759 else encode_mb_internal(s, motion_x, motion_y, 16, 8); | |
1760 } | |
1761 | |
1762 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){ | |
1763 int i; | |
1764 | |
1765 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop? | |
1766 | |
1767 /* mpeg1 */ | |
1768 d->mb_skip_run= s->mb_skip_run; | |
1769 for(i=0; i<3; i++) | |
1770 d->last_dc[i]= s->last_dc[i]; | |
1771 | |
1772 /* statistics */ | |
1773 d->mv_bits= s->mv_bits; | |
1774 d->i_tex_bits= s->i_tex_bits; | |
1775 d->p_tex_bits= s->p_tex_bits; | |
1776 d->i_count= s->i_count; | |
1777 d->f_count= s->f_count; | |
1778 d->b_count= s->b_count; | |
1779 d->skip_count= s->skip_count; | |
1780 d->misc_bits= s->misc_bits; | |
1781 d->last_bits= 0; | |
1782 | |
1783 d->mb_skipped= 0; | |
1784 d->qscale= s->qscale; | |
1785 d->dquant= s->dquant; | |
6074 | 1786 |
1787 d->esc3_level_length= s->esc3_level_length; | |
5204 | 1788 } |
1789 | |
1790 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){ | |
1791 int i; | |
1792 | |
1793 memcpy(d->mv, s->mv, 2*4*2*sizeof(int)); | |
1794 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop? | |
1795 | |
1796 /* mpeg1 */ | |
1797 d->mb_skip_run= s->mb_skip_run; | |
1798 for(i=0; i<3; i++) | |
1799 d->last_dc[i]= s->last_dc[i]; | |
1800 | |
1801 /* statistics */ | |
1802 d->mv_bits= s->mv_bits; | |
1803 d->i_tex_bits= s->i_tex_bits; | |
1804 d->p_tex_bits= s->p_tex_bits; | |
1805 d->i_count= s->i_count; | |
1806 d->f_count= s->f_count; | |
1807 d->b_count= s->b_count; | |
1808 d->skip_count= s->skip_count; | |
1809 d->misc_bits= s->misc_bits; | |
1810 | |
1811 d->mb_intra= s->mb_intra; | |
1812 d->mb_skipped= s->mb_skipped; | |
1813 d->mv_type= s->mv_type; | |
1814 d->mv_dir= s->mv_dir; | |
1815 d->pb= s->pb; | |
1816 if(s->data_partitioning){ | |
1817 d->pb2= s->pb2; | |
1818 d->tex_pb= s->tex_pb; | |
1819 } | |
1820 d->block= s->block; | |
1821 for(i=0; i<8; i++) | |
1822 d->block_last_index[i]= s->block_last_index[i]; | |
1823 d->interlaced_dct= s->interlaced_dct; | |
1824 d->qscale= s->qscale; | |
6074 | 1825 |
1826 d->esc3_level_length= s->esc3_level_length; | |
5204 | 1827 } |
1828 | |
1829 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type, | |
1830 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2], | |
1831 int *dmin, int *next_block, int motion_x, int motion_y) | |
1832 { | |
1833 int score; | |
1834 uint8_t *dest_backup[3]; | |
1835 | |
1836 copy_context_before_encode(s, backup, type); | |
1837 | |
1838 s->block= s->blocks[*next_block]; | |
1839 s->pb= pb[*next_block]; | |
1840 if(s->data_partitioning){ | |
1841 s->pb2 = pb2 [*next_block]; | |
1842 s->tex_pb= tex_pb[*next_block]; | |
1843 } | |
1844 | |
1845 if(*next_block){ | |
1846 memcpy(dest_backup, s->dest, sizeof(s->dest)); | |
1847 s->dest[0] = s->rd_scratchpad; | |
1848 s->dest[1] = s->rd_scratchpad + 16*s->linesize; | |
1849 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8; | |
1850 assert(s->linesize >= 32); //FIXME | |
1851 } | |
1852 | |
1853 encode_mb(s, motion_x, motion_y); | |
1854 | |
1855 score= put_bits_count(&s->pb); | |
1856 if(s->data_partitioning){ | |
1857 score+= put_bits_count(&s->pb2); | |
1858 score+= put_bits_count(&s->tex_pb); | |
1859 } | |
1860 | |
1861 if(s->avctx->mb_decision == FF_MB_DECISION_RD){ | |
1862 MPV_decode_mb(s, s->block); | |
1863 | |
1864 score *= s->lambda2; | |
1865 score += sse_mb(s) << FF_LAMBDA_SHIFT; | |
1866 } | |
1867 | |
1868 if(*next_block){ | |
1869 memcpy(s->dest, dest_backup, sizeof(s->dest)); | |
1870 } | |
1871 | |
1872 if(score<*dmin){ | |
1873 *dmin= score; | |
1874 *next_block^=1; | |
1875 | |
1876 copy_context_after_encode(best, s, type); | |
1877 } | |
1878 } | |
1879 | |
1880 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){ | |
1881 uint32_t *sq = ff_squareTbl + 256; | |
1882 int acc=0; | |
1883 int x,y; | |
1884 | |
1885 if(w==16 && h==16) | |
1886 return s->dsp.sse[0](NULL, src1, src2, stride, 16); | |
1887 else if(w==8 && h==8) | |
1888 return s->dsp.sse[1](NULL, src1, src2, stride, 8); | |
1889 | |
1890 for(y=0; y<h; y++){ | |
1891 for(x=0; x<w; x++){ | |
1892 acc+= sq[src1[x + y*stride] - src2[x + y*stride]]; | |
1893 } | |
1894 } | |
1895 | |
1896 assert(acc>=0); | |
1897 | |
1898 return acc; | |
1899 } | |
1900 | |
1901 static int sse_mb(MpegEncContext *s){ | |
1902 int w= 16; | |
1903 int h= 16; | |
1904 | |
1905 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16; | |
1906 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16; | |
1907 | |
1908 if(w==16 && h==16) | |
1909 if(s->avctx->mb_cmp == FF_CMP_NSSE){ | |
1910 return s->dsp.nsse[0](s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16) | |
1911 +s->dsp.nsse[1](s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8) | |
1912 +s->dsp.nsse[1](s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8); | |
1913 }else{ | |
1914 return s->dsp.sse[0](NULL, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16) | |
1915 +s->dsp.sse[1](NULL, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8) | |
1916 +s->dsp.sse[1](NULL, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8); | |
1917 } | |
1918 else | |
1919 return sse(s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], w, h, s->linesize) | |
1920 +sse(s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], w>>1, h>>1, s->uvlinesize) | |
1921 +sse(s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], w>>1, h>>1, s->uvlinesize); | |
1922 } | |
1923 | |
1924 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){ | |
1925 MpegEncContext *s= arg; | |
1926 | |
1927 | |
1928 s->me.pre_pass=1; | |
1929 s->me.dia_size= s->avctx->pre_dia_size; | |
1930 s->first_slice_line=1; | |
1931 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) { | |
1932 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) { | |
1933 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y); | |
1934 } | |
1935 s->first_slice_line=0; | |
1936 } | |
1937 | |
1938 s->me.pre_pass=0; | |
1939 | |
1940 return 0; | |
1941 } | |
1942 | |
1943 static int estimate_motion_thread(AVCodecContext *c, void *arg){ | |
1944 MpegEncContext *s= arg; | |
1945 | |
1946 ff_check_alignment(); | |
1947 | |
1948 s->me.dia_size= s->avctx->dia_size; | |
1949 s->first_slice_line=1; | |
1950 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) { | |
1951 s->mb_x=0; //for block init below | |
1952 ff_init_block_index(s); | |
1953 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) { | |
1954 s->block_index[0]+=2; | |
1955 s->block_index[1]+=2; | |
1956 s->block_index[2]+=2; | |
1957 s->block_index[3]+=2; | |
1958 | |
1959 /* compute motion vector & mb_type and store in context */ | |
6481 | 1960 if(s->pict_type==FF_B_TYPE) |
5204 | 1961 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y); |
1962 else | |
1963 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y); | |
1964 } | |
1965 s->first_slice_line=0; | |
1966 } | |
1967 return 0; | |
1968 } | |
1969 | |
1970 static int mb_var_thread(AVCodecContext *c, void *arg){ | |
1971 MpegEncContext *s= arg; | |
1972 int mb_x, mb_y; | |
1973 | |
1974 ff_check_alignment(); | |
1975 | |
1976 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) { | |
1977 for(mb_x=0; mb_x < s->mb_width; mb_x++) { | |
1978 int xx = mb_x * 16; | |
1979 int yy = mb_y * 16; | |
1980 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx; | |
1981 int varc; | |
1982 int sum = s->dsp.pix_sum(pix, s->linesize); | |
1983 | |
1984 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8; | |
1985 | |
1986 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc; | |
1987 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8; | |
1988 s->me.mb_var_sum_temp += varc; | |
1989 } | |
1990 } | |
1991 return 0; | |
1992 } | |
1993 | |
1994 static void write_slice_end(MpegEncContext *s){ | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
1995 if(ENABLE_MPEG4_ENCODER && s->codec_id==CODEC_ID_MPEG4){ |
5204 | 1996 if(s->partitioned_frame){ |
1997 ff_mpeg4_merge_partitions(s); | |
1998 } | |
1999 | |
2000 ff_mpeg4_stuffing(&s->pb); | |
2001 }else if(ENABLE_MJPEG_ENCODER && s->out_format == FMT_MJPEG){ | |
2002 ff_mjpeg_encode_stuffing(&s->pb); | |
2003 } | |
2004 | |
2005 align_put_bits(&s->pb); | |
2006 flush_put_bits(&s->pb); | |
2007 | |
2008 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame) | |
2009 s->misc_bits+= get_bits_diff(s); | |
2010 } | |
2011 | |
2012 static int encode_thread(AVCodecContext *c, void *arg){ | |
2013 MpegEncContext *s= arg; | |
2014 int mb_x, mb_y, pdif = 0; | |
7520 | 2015 int chr_h= 16>>s->chroma_y_shift; |
5204 | 2016 int i, j; |
2017 MpegEncContext best_s, backup_s; | |
2018 uint8_t bit_buf[2][MAX_MB_BYTES]; | |
2019 uint8_t bit_buf2[2][MAX_MB_BYTES]; | |
2020 uint8_t bit_buf_tex[2][MAX_MB_BYTES]; | |
2021 PutBitContext pb[2], pb2[2], tex_pb[2]; | |
2022 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y); | |
2023 | |
2024 ff_check_alignment(); | |
2025 | |
2026 for(i=0; i<2; i++){ | |
2027 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES); | |
2028 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES); | |
2029 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES); | |
2030 } | |
2031 | |
2032 s->last_bits= put_bits_count(&s->pb); | |
2033 s->mv_bits=0; | |
2034 s->misc_bits=0; | |
2035 s->i_tex_bits=0; | |
2036 s->p_tex_bits=0; | |
2037 s->i_count=0; | |
2038 s->f_count=0; | |
2039 s->b_count=0; | |
2040 s->skip_count=0; | |
2041 | |
2042 for(i=0; i<3; i++){ | |
2043 /* init last dc values */ | |
2044 /* note: quant matrix value (8) is implied here */ | |
2045 s->last_dc[i] = 128 << s->intra_dc_precision; | |
2046 | |
2047 s->current_picture.error[i] = 0; | |
2048 } | |
2049 s->mb_skip_run = 0; | |
2050 memset(s->last_mv, 0, sizeof(s->last_mv)); | |
2051 | |
2052 s->last_mv_dir = 0; | |
2053 | |
2054 switch(s->codec_id){ | |
2055 case CODEC_ID_H263: | |
2056 case CODEC_ID_H263P: | |
2057 case CODEC_ID_FLV1: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2058 if (ENABLE_H263_ENCODER || ENABLE_H263P_ENCODER || ENABLE_FLV_ENCODER) |
5278 | 2059 s->gob_index = ff_h263_get_gob_height(s); |
5204 | 2060 break; |
2061 case CODEC_ID_MPEG4: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2062 if(ENABLE_MPEG4_ENCODER && s->partitioned_frame) |
5204 | 2063 ff_mpeg4_init_partitions(s); |
2064 break; | |
2065 } | |
2066 | |
2067 s->resync_mb_x=0; | |
2068 s->resync_mb_y=0; | |
2069 s->first_slice_line = 1; | |
2070 s->ptr_lastgob = s->pb.buf; | |
2071 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) { | |
2072 // printf("row %d at %X\n", s->mb_y, (int)s); | |
2073 s->mb_x=0; | |
2074 s->mb_y= mb_y; | |
2075 | |
2076 ff_set_qscale(s, s->qscale); | |
2077 ff_init_block_index(s); | |
2078 | |
2079 for(mb_x=0; mb_x < s->mb_width; mb_x++) { | |
2080 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this | |
2081 int mb_type= s->mb_type[xy]; | |
2082 // int d; | |
2083 int dmin= INT_MAX; | |
2084 int dir; | |
2085 | |
2086 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){ | |
2087 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
2088 return -1; | |
2089 } | |
2090 if(s->data_partitioning){ | |
2091 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES | |
2092 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){ | |
2093 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
2094 return -1; | |
2095 } | |
2096 } | |
2097 | |
2098 s->mb_x = mb_x; | |
2099 s->mb_y = mb_y; // moved into loop, can get changed by H.261 | |
2100 ff_update_block_index(s); | |
2101 | |
2102 if(ENABLE_H261_ENCODER && s->codec_id == CODEC_ID_H261){ | |
2103 ff_h261_reorder_mb_index(s); | |
2104 xy= s->mb_y*s->mb_stride + s->mb_x; | |
2105 mb_type= s->mb_type[xy]; | |
2106 } | |
2107 | |
2108 /* write gob / video packet header */ | |
2109 if(s->rtp_mode){ | |
2110 int current_packet_size, is_gob_start; | |
2111 | |
2112 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf); | |
2113 | |
2114 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0; | |
2115 | |
2116 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1; | |
2117 | |
2118 switch(s->codec_id){ | |
2119 case CODEC_ID_H263: | |
2120 case CODEC_ID_H263P: | |
2121 if(!s->h263_slice_structured) | |
2122 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0; | |
2123 break; | |
2124 case CODEC_ID_MPEG2VIDEO: | |
2125 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1; | |
2126 case CODEC_ID_MPEG1VIDEO: | |
2127 if(s->mb_skip_run) is_gob_start=0; | |
2128 break; | |
2129 } | |
2130 | |
2131 if(is_gob_start){ | |
2132 if(s->start_mb_y != mb_y || mb_x!=0){ | |
2133 write_slice_end(s); | |
2134 | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2135 if(ENABLE_MPEG4_ENCODER && s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){ |
5204 | 2136 ff_mpeg4_init_partitions(s); |
2137 } | |
2138 } | |
2139 | |
2140 assert((put_bits_count(&s->pb)&7) == 0); | |
2141 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob; | |
2142 | |
2143 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){ | |
2144 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y; | |
2145 int d= 100 / s->avctx->error_rate; | |
2146 if(r % d == 0){ | |
2147 current_packet_size=0; | |
2148 #ifndef ALT_BITSTREAM_WRITER | |
2149 s->pb.buf_ptr= s->ptr_lastgob; | |
2150 #endif | |
2151 assert(pbBufPtr(&s->pb) == s->ptr_lastgob); | |
2152 } | |
2153 } | |
2154 | |
2155 if (s->avctx->rtp_callback){ | |
2156 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x; | |
2157 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb); | |
2158 } | |
2159 | |
2160 switch(s->codec_id){ | |
2161 case CODEC_ID_MPEG4: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2162 if (ENABLE_MPEG4_ENCODER) { |
5278 | 2163 ff_mpeg4_encode_video_packet_header(s); |
2164 ff_mpeg4_clean_buffers(s); | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2165 } |
5204 | 2166 break; |
2167 case CODEC_ID_MPEG1VIDEO: | |
2168 case CODEC_ID_MPEG2VIDEO: | |
5208 | 2169 if (ENABLE_MPEG1VIDEO_ENCODER || ENABLE_MPEG2VIDEO_ENCODER) { |
5209 | 2170 ff_mpeg1_encode_slice_header(s); |
2171 ff_mpeg1_clean_buffers(s); | |
5208 | 2172 } |
5204 | 2173 break; |
2174 case CODEC_ID_H263: | |
2175 case CODEC_ID_H263P: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2176 if (ENABLE_H263_ENCODER || ENABLE_H263P_ENCODER) |
5278 | 2177 h263_encode_gob_header(s, mb_y); |
5204 | 2178 break; |
2179 } | |
2180 | |
2181 if(s->flags&CODEC_FLAG_PASS1){ | |
2182 int bits= put_bits_count(&s->pb); | |
2183 s->misc_bits+= bits - s->last_bits; | |
2184 s->last_bits= bits; | |
2185 } | |
2186 | |
2187 s->ptr_lastgob += current_packet_size; | |
2188 s->first_slice_line=1; | |
2189 s->resync_mb_x=mb_x; | |
2190 s->resync_mb_y=mb_y; | |
2191 } | |
2192 } | |
2193 | |
2194 if( (s->resync_mb_x == s->mb_x) | |
2195 && s->resync_mb_y+1 == s->mb_y){ | |
2196 s->first_slice_line=0; | |
2197 } | |
2198 | |
2199 s->mb_skipped=0; | |
2200 s->dquant=0; //only for QP_RD | |
2201 | |
2202 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD | |
2203 int next_block=0; | |
2204 int pb_bits_count, pb2_bits_count, tex_pb_bits_count; | |
2205 | |
2206 copy_context_before_encode(&backup_s, s, -1); | |
2207 backup_s.pb= s->pb; | |
2208 best_s.data_partitioning= s->data_partitioning; | |
2209 best_s.partitioned_frame= s->partitioned_frame; | |
2210 if(s->data_partitioning){ | |
2211 backup_s.pb2= s->pb2; | |
2212 backup_s.tex_pb= s->tex_pb; | |
2213 } | |
2214 | |
2215 if(mb_type&CANDIDATE_MB_TYPE_INTER){ | |
2216 s->mv_dir = MV_DIR_FORWARD; | |
2217 s->mv_type = MV_TYPE_16X16; | |
2218 s->mb_intra= 0; | |
2219 s->mv[0][0][0] = s->p_mv_table[xy][0]; | |
2220 s->mv[0][0][1] = s->p_mv_table[xy][1]; | |
2221 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb, | |
2222 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]); | |
2223 } | |
2224 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){ | |
2225 s->mv_dir = MV_DIR_FORWARD; | |
2226 s->mv_type = MV_TYPE_FIELD; | |
2227 s->mb_intra= 0; | |
2228 for(i=0; i<2; i++){ | |
2229 j= s->field_select[0][i] = s->p_field_select_table[i][xy]; | |
2230 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0]; | |
2231 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1]; | |
2232 } | |
2233 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb, | |
2234 &dmin, &next_block, 0, 0); | |
2235 } | |
2236 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){ | |
2237 s->mv_dir = MV_DIR_FORWARD; | |
2238 s->mv_type = MV_TYPE_16X16; | |
2239 s->mb_intra= 0; | |
2240 s->mv[0][0][0] = 0; | |
2241 s->mv[0][0][1] = 0; | |
2242 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb, | |
2243 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]); | |
2244 } | |
2245 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){ | |
2246 s->mv_dir = MV_DIR_FORWARD; | |
2247 s->mv_type = MV_TYPE_8X8; | |
2248 s->mb_intra= 0; | |
2249 for(i=0; i<4; i++){ | |
2250 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0]; | |
2251 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1]; | |
2252 } | |
2253 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb, | |
2254 &dmin, &next_block, 0, 0); | |
2255 } | |
2256 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){ | |
2257 s->mv_dir = MV_DIR_FORWARD; | |
2258 s->mv_type = MV_TYPE_16X16; | |
2259 s->mb_intra= 0; | |
2260 s->mv[0][0][0] = s->b_forw_mv_table[xy][0]; | |
2261 s->mv[0][0][1] = s->b_forw_mv_table[xy][1]; | |
2262 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb, | |
2263 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]); | |
2264 } | |
2265 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){ | |
2266 s->mv_dir = MV_DIR_BACKWARD; | |
2267 s->mv_type = MV_TYPE_16X16; | |
2268 s->mb_intra= 0; | |
2269 s->mv[1][0][0] = s->b_back_mv_table[xy][0]; | |
2270 s->mv[1][0][1] = s->b_back_mv_table[xy][1]; | |
2271 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb, | |
2272 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]); | |
2273 } | |
2274 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){ | |
2275 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; | |
2276 s->mv_type = MV_TYPE_16X16; | |
2277 s->mb_intra= 0; | |
2278 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0]; | |
2279 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1]; | |
2280 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0]; | |
2281 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1]; | |
2282 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb, | |
2283 &dmin, &next_block, 0, 0); | |
2284 } | |
2285 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){ | |
2286 s->mv_dir = MV_DIR_FORWARD; | |
2287 s->mv_type = MV_TYPE_FIELD; | |
2288 s->mb_intra= 0; | |
2289 for(i=0; i<2; i++){ | |
2290 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy]; | |
2291 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0]; | |
2292 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1]; | |
2293 } | |
2294 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb, | |
2295 &dmin, &next_block, 0, 0); | |
2296 } | |
2297 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){ | |
2298 s->mv_dir = MV_DIR_BACKWARD; | |
2299 s->mv_type = MV_TYPE_FIELD; | |
2300 s->mb_intra= 0; | |
2301 for(i=0; i<2; i++){ | |
2302 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy]; | |
2303 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0]; | |
2304 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1]; | |
2305 } | |
2306 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb, | |
2307 &dmin, &next_block, 0, 0); | |
2308 } | |
2309 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){ | |
2310 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; | |
2311 s->mv_type = MV_TYPE_FIELD; | |
2312 s->mb_intra= 0; | |
2313 for(dir=0; dir<2; dir++){ | |
2314 for(i=0; i<2; i++){ | |
2315 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy]; | |
2316 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0]; | |
2317 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1]; | |
2318 } | |
2319 } | |
2320 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb, | |
2321 &dmin, &next_block, 0, 0); | |
2322 } | |
2323 if(mb_type&CANDIDATE_MB_TYPE_INTRA){ | |
2324 s->mv_dir = 0; | |
2325 s->mv_type = MV_TYPE_16X16; | |
2326 s->mb_intra= 1; | |
2327 s->mv[0][0][0] = 0; | |
2328 s->mv[0][0][1] = 0; | |
2329 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb, | |
2330 &dmin, &next_block, 0, 0); | |
2331 if(s->h263_pred || s->h263_aic){ | |
2332 if(best_s.mb_intra) | |
2333 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1; | |
2334 else | |
2335 ff_clean_intra_table_entries(s); //old mode? | |
2336 } | |
2337 } | |
2338 | |
2339 if((s->flags & CODEC_FLAG_QP_RD) && dmin < INT_MAX){ | |
2340 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD | |
2341 const int last_qp= backup_s.qscale; | |
2342 int qpi, qp, dc[6]; | |
2343 DCTELEM ac[6][16]; | |
2344 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0; | |
2345 static const int dquant_tab[4]={-1,1,-2,2}; | |
2346 | |
2347 assert(backup_s.dquant == 0); | |
2348 | |
2349 //FIXME intra | |
2350 s->mv_dir= best_s.mv_dir; | |
2351 s->mv_type = MV_TYPE_16X16; | |
2352 s->mb_intra= best_s.mb_intra; | |
2353 s->mv[0][0][0] = best_s.mv[0][0][0]; | |
2354 s->mv[0][0][1] = best_s.mv[0][0][1]; | |
2355 s->mv[1][0][0] = best_s.mv[1][0][0]; | |
2356 s->mv[1][0][1] = best_s.mv[1][0][1]; | |
2357 | |
6481 | 2358 qpi = s->pict_type == FF_B_TYPE ? 2 : 0; |
5204 | 2359 for(; qpi<4; qpi++){ |
2360 int dquant= dquant_tab[qpi]; | |
2361 qp= last_qp + dquant; | |
2362 if(qp < s->avctx->qmin || qp > s->avctx->qmax) | |
2363 continue; | |
2364 backup_s.dquant= dquant; | |
2365 if(s->mb_intra && s->dc_val[0]){ | |
2366 for(i=0; i<6; i++){ | |
2367 dc[i]= s->dc_val[0][ s->block_index[i] ]; | |
2368 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16); | |
2369 } | |
2370 } | |
2371 | |
2372 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb, | |
2373 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]); | |
2374 if(best_s.qscale != qp){ | |
2375 if(s->mb_intra && s->dc_val[0]){ | |
2376 for(i=0; i<6; i++){ | |
2377 s->dc_val[0][ s->block_index[i] ]= dc[i]; | |
2378 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16); | |
2379 } | |
2380 } | |
2381 } | |
2382 } | |
2383 } | |
2384 } | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2385 if(ENABLE_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){ |
5204 | 2386 int mx= s->b_direct_mv_table[xy][0]; |
2387 int my= s->b_direct_mv_table[xy][1]; | |
2388 | |
2389 backup_s.dquant = 0; | |
2390 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; | |
2391 s->mb_intra= 0; | |
2392 ff_mpeg4_set_direct_mv(s, mx, my); | |
2393 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb, | |
2394 &dmin, &next_block, mx, my); | |
2395 } | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2396 if(ENABLE_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){ |
5204 | 2397 backup_s.dquant = 0; |
2398 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; | |
2399 s->mb_intra= 0; | |
2400 ff_mpeg4_set_direct_mv(s, 0, 0); | |
2401 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb, | |
2402 &dmin, &next_block, 0, 0); | |
2403 } | |
2404 if(!best_s.mb_intra && s->flags2&CODEC_FLAG2_SKIP_RD){ | |
2405 int coded=0; | |
2406 for(i=0; i<6; i++) | |
2407 coded |= s->block_last_index[i]; | |
2408 if(coded){ | |
2409 int mx,my; | |
2410 memcpy(s->mv, best_s.mv, sizeof(s->mv)); | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2411 if(ENABLE_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){ |
5204 | 2412 mx=my=0; //FIXME find the one we actually used |
2413 ff_mpeg4_set_direct_mv(s, mx, my); | |
2414 }else if(best_s.mv_dir&MV_DIR_BACKWARD){ | |
2415 mx= s->mv[1][0][0]; | |
2416 my= s->mv[1][0][1]; | |
2417 }else{ | |
2418 mx= s->mv[0][0][0]; | |
2419 my= s->mv[0][0][1]; | |
2420 } | |
2421 | |
2422 s->mv_dir= best_s.mv_dir; | |
2423 s->mv_type = best_s.mv_type; | |
2424 s->mb_intra= 0; | |
2425 /* s->mv[0][0][0] = best_s.mv[0][0][0]; | |
2426 s->mv[0][0][1] = best_s.mv[0][0][1]; | |
2427 s->mv[1][0][0] = best_s.mv[1][0][0]; | |
2428 s->mv[1][0][1] = best_s.mv[1][0][1];*/ | |
2429 backup_s.dquant= 0; | |
2430 s->skipdct=1; | |
2431 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb, | |
2432 &dmin, &next_block, mx, my); | |
2433 s->skipdct=0; | |
2434 } | |
2435 } | |
2436 | |
2437 s->current_picture.qscale_table[xy]= best_s.qscale; | |
2438 | |
2439 copy_context_after_encode(s, &best_s, -1); | |
2440 | |
2441 pb_bits_count= put_bits_count(&s->pb); | |
2442 flush_put_bits(&s->pb); | |
2443 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count); | |
2444 s->pb= backup_s.pb; | |
2445 | |
2446 if(s->data_partitioning){ | |
2447 pb2_bits_count= put_bits_count(&s->pb2); | |
2448 flush_put_bits(&s->pb2); | |
2449 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count); | |
2450 s->pb2= backup_s.pb2; | |
2451 | |
2452 tex_pb_bits_count= put_bits_count(&s->tex_pb); | |
2453 flush_put_bits(&s->tex_pb); | |
2454 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count); | |
2455 s->tex_pb= backup_s.tex_pb; | |
2456 } | |
2457 s->last_bits= put_bits_count(&s->pb); | |
2458 | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2459 if (ENABLE_ANY_H263_ENCODER && |
6481 | 2460 s->out_format == FMT_H263 && s->pict_type!=FF_B_TYPE) |
5204 | 2461 ff_h263_update_motion_val(s); |
2462 | |
2463 if(next_block==0){ //FIXME 16 vs linesize16 | |
2464 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16); | |
2465 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8); | |
2466 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8); | |
2467 } | |
2468 | |
2469 if(s->avctx->mb_decision == FF_MB_DECISION_BITS) | |
2470 MPV_decode_mb(s, s->block); | |
2471 } else { | |
2472 int motion_x = 0, motion_y = 0; | |
2473 s->mv_type=MV_TYPE_16X16; | |
2474 // only one MB-Type possible | |
2475 | |
2476 switch(mb_type){ | |
2477 case CANDIDATE_MB_TYPE_INTRA: | |
2478 s->mv_dir = 0; | |
2479 s->mb_intra= 1; | |
2480 motion_x= s->mv[0][0][0] = 0; | |
2481 motion_y= s->mv[0][0][1] = 0; | |
2482 break; | |
2483 case CANDIDATE_MB_TYPE_INTER: | |
2484 s->mv_dir = MV_DIR_FORWARD; | |
2485 s->mb_intra= 0; | |
2486 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0]; | |
2487 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1]; | |
2488 break; | |
2489 case CANDIDATE_MB_TYPE_INTER_I: | |
2490 s->mv_dir = MV_DIR_FORWARD; | |
2491 s->mv_type = MV_TYPE_FIELD; | |
2492 s->mb_intra= 0; | |
2493 for(i=0; i<2; i++){ | |
2494 j= s->field_select[0][i] = s->p_field_select_table[i][xy]; | |
2495 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0]; | |
2496 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1]; | |
2497 } | |
2498 break; | |
2499 case CANDIDATE_MB_TYPE_INTER4V: | |
2500 s->mv_dir = MV_DIR_FORWARD; | |
2501 s->mv_type = MV_TYPE_8X8; | |
2502 s->mb_intra= 0; | |
2503 for(i=0; i<4; i++){ | |
2504 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0]; | |
2505 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1]; | |
2506 } | |
2507 break; | |
2508 case CANDIDATE_MB_TYPE_DIRECT: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2509 if (ENABLE_MPEG4_ENCODER) { |
5278 | 2510 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT; |
2511 s->mb_intra= 0; | |
2512 motion_x=s->b_direct_mv_table[xy][0]; | |
2513 motion_y=s->b_direct_mv_table[xy][1]; | |
2514 ff_mpeg4_set_direct_mv(s, motion_x, motion_y); | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2515 } |
5204 | 2516 break; |
2517 case CANDIDATE_MB_TYPE_DIRECT0: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2518 if (ENABLE_MPEG4_ENCODER) { |
5278 | 2519 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT; |
2520 s->mb_intra= 0; | |
2521 ff_mpeg4_set_direct_mv(s, 0, 0); | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2522 } |
5204 | 2523 break; |
2524 case CANDIDATE_MB_TYPE_BIDIR: | |
2525 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; | |
2526 s->mb_intra= 0; | |
2527 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0]; | |
2528 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1]; | |
2529 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0]; | |
2530 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1]; | |
2531 break; | |
2532 case CANDIDATE_MB_TYPE_BACKWARD: | |
2533 s->mv_dir = MV_DIR_BACKWARD; | |
2534 s->mb_intra= 0; | |
2535 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0]; | |
2536 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1]; | |
2537 break; | |
2538 case CANDIDATE_MB_TYPE_FORWARD: | |
2539 s->mv_dir = MV_DIR_FORWARD; | |
2540 s->mb_intra= 0; | |
2541 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0]; | |
2542 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1]; | |
2543 // printf(" %d %d ", motion_x, motion_y); | |
2544 break; | |
2545 case CANDIDATE_MB_TYPE_FORWARD_I: | |
2546 s->mv_dir = MV_DIR_FORWARD; | |
2547 s->mv_type = MV_TYPE_FIELD; | |
2548 s->mb_intra= 0; | |
2549 for(i=0; i<2; i++){ | |
2550 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy]; | |
2551 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0]; | |
2552 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1]; | |
2553 } | |
2554 break; | |
2555 case CANDIDATE_MB_TYPE_BACKWARD_I: | |
2556 s->mv_dir = MV_DIR_BACKWARD; | |
2557 s->mv_type = MV_TYPE_FIELD; | |
2558 s->mb_intra= 0; | |
2559 for(i=0; i<2; i++){ | |
2560 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy]; | |
2561 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0]; | |
2562 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1]; | |
2563 } | |
2564 break; | |
2565 case CANDIDATE_MB_TYPE_BIDIR_I: | |
2566 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; | |
2567 s->mv_type = MV_TYPE_FIELD; | |
2568 s->mb_intra= 0; | |
2569 for(dir=0; dir<2; dir++){ | |
2570 for(i=0; i<2; i++){ | |
2571 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy]; | |
2572 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0]; | |
2573 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1]; | |
2574 } | |
2575 } | |
2576 break; | |
2577 default: | |
2578 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n"); | |
2579 } | |
2580 | |
2581 encode_mb(s, motion_x, motion_y); | |
2582 | |
2583 // RAL: Update last macroblock type | |
2584 s->last_mv_dir = s->mv_dir; | |
2585 | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2586 if (ENABLE_ANY_H263_ENCODER && |
6481 | 2587 s->out_format == FMT_H263 && s->pict_type!=FF_B_TYPE) |
5204 | 2588 ff_h263_update_motion_val(s); |
2589 | |
2590 MPV_decode_mb(s, s->block); | |
2591 } | |
2592 | |
2593 /* clean the MV table in IPS frames for direct mode in B frames */ | |
2594 if(s->mb_intra /* && I,P,S_TYPE */){ | |
2595 s->p_mv_table[xy][0]=0; | |
2596 s->p_mv_table[xy][1]=0; | |
2597 } | |
2598 | |
2599 if(s->flags&CODEC_FLAG_PSNR){ | |
2600 int w= 16; | |
2601 int h= 16; | |
2602 | |
2603 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16; | |
2604 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16; | |
2605 | |
2606 s->current_picture.error[0] += sse( | |
2607 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, | |
2608 s->dest[0], w, h, s->linesize); | |
2609 s->current_picture.error[1] += sse( | |
7520 | 2610 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h, |
2611 s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize); | |
5204 | 2612 s->current_picture.error[2] += sse( |
7520 | 2613 s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h, |
2614 s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize); | |
5204 | 2615 } |
2616 if(s->loop_filter){ | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2617 if(ENABLE_ANY_H263_ENCODER && s->out_format == FMT_H263) |
5204 | 2618 ff_h263_loop_filter(s); |
2619 } | |
2620 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb)); | |
2621 } | |
2622 } | |
2623 | |
2624 //not beautiful here but we must write it before flushing so it has to be here | |
6481 | 2625 if (ENABLE_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == FF_I_TYPE) |
5204 | 2626 msmpeg4_encode_ext_header(s); |
2627 | |
2628 write_slice_end(s); | |
2629 | |
2630 /* Send the last GOB if RTP */ | |
2631 if (s->avctx->rtp_callback) { | |
2632 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x; | |
2633 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob; | |
2634 /* Call the RTP callback to send the last GOB */ | |
2635 emms_c(); | |
2636 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb); | |
2637 } | |
2638 | |
2639 return 0; | |
2640 } | |
2641 | |
2642 #define MERGE(field) dst->field += src->field; src->field=0 | |
2643 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){ | |
2644 MERGE(me.scene_change_score); | |
2645 MERGE(me.mc_mb_var_sum_temp); | |
2646 MERGE(me.mb_var_sum_temp); | |
2647 } | |
2648 | |
2649 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){ | |
2650 int i; | |
2651 | |
2652 MERGE(dct_count[0]); //note, the other dct vars are not part of the context | |
2653 MERGE(dct_count[1]); | |
2654 MERGE(mv_bits); | |
2655 MERGE(i_tex_bits); | |
2656 MERGE(p_tex_bits); | |
2657 MERGE(i_count); | |
2658 MERGE(f_count); | |
2659 MERGE(b_count); | |
2660 MERGE(skip_count); | |
2661 MERGE(misc_bits); | |
2662 MERGE(error_count); | |
2663 MERGE(padding_bug_score); | |
2664 MERGE(current_picture.error[0]); | |
2665 MERGE(current_picture.error[1]); | |
2666 MERGE(current_picture.error[2]); | |
2667 | |
2668 if(dst->avctx->noise_reduction){ | |
2669 for(i=0; i<64; i++){ | |
2670 MERGE(dct_error_sum[0][i]); | |
2671 MERGE(dct_error_sum[1][i]); | |
2672 } | |
2673 } | |
2674 | |
2675 assert(put_bits_count(&src->pb) % 8 ==0); | |
2676 assert(put_bits_count(&dst->pb) % 8 ==0); | |
2677 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb)); | |
2678 flush_put_bits(&dst->pb); | |
2679 } | |
2680 | |
2681 static int estimate_qp(MpegEncContext *s, int dry_run){ | |
2682 if (s->next_lambda){ | |
2683 s->current_picture_ptr->quality= | |
2684 s->current_picture.quality = s->next_lambda; | |
2685 if(!dry_run) s->next_lambda= 0; | |
2686 } else if (!s->fixed_qscale) { | |
2687 s->current_picture_ptr->quality= | |
2688 s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run); | |
2689 if (s->current_picture.quality < 0) | |
2690 return -1; | |
2691 } | |
2692 | |
2693 if(s->adaptive_quant){ | |
2694 switch(s->codec_id){ | |
2695 case CODEC_ID_MPEG4: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2696 if (ENABLE_MPEG4_ENCODER) |
5278 | 2697 ff_clean_mpeg4_qscales(s); |
5204 | 2698 break; |
2699 case CODEC_ID_H263: | |
2700 case CODEC_ID_H263P: | |
2701 case CODEC_ID_FLV1: | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2702 if (ENABLE_H263_ENCODER||ENABLE_H263P_ENCODER||ENABLE_FLV_ENCODER) |
5278 | 2703 ff_clean_h263_qscales(s); |
5204 | 2704 break; |
2705 } | |
2706 | |
2707 s->lambda= s->lambda_table[0]; | |
2708 //FIXME broken | |
2709 }else | |
2710 s->lambda= s->current_picture.quality; | |
2711 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality); | |
2712 update_qscale(s); | |
2713 return 0; | |
2714 } | |
2715 | |
5273
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2716 /* must be called before writing the header */ |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2717 static void set_frame_distances(MpegEncContext * s){ |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2718 assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE); |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2719 s->time= s->current_picture_ptr->pts*s->avctx->time_base.num; |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2720 |
6481 | 2721 if(s->pict_type==FF_B_TYPE){ |
5273
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2722 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2723 assert(s->pb_time > 0 && s->pb_time < s->pp_time); |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2724 }else{ |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2725 s->pp_time= s->time - s->last_non_b_time; |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2726 s->last_non_b_time= s->time; |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2727 assert(s->picture_number==0 || s->pp_time > 0); |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2728 } |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2729 } |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2730 |
5204 | 2731 static int encode_picture(MpegEncContext *s, int picture_number) |
2732 { | |
2733 int i; | |
2734 int bits; | |
2735 | |
2736 s->picture_number = picture_number; | |
2737 | |
2738 /* Reset the average MB variance */ | |
2739 s->me.mb_var_sum_temp = | |
2740 s->me.mc_mb_var_sum_temp = 0; | |
2741 | |
2742 /* we need to initialize some time vars before we can encode b-frames */ | |
2743 // RAL: Condition added for MPEG1VIDEO | |
2744 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4)) | |
5273
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2745 set_frame_distances(s); |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2746 if(ENABLE_MPEG4_ENCODER && s->codec_id == CODEC_ID_MPEG4) |
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5229
diff
changeset
|
2747 ff_set_mpeg4_time(s); |
5204 | 2748 |
2749 s->me.scene_change_score=0; | |
2750 | |
6719 | 2751 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME rate distortion |
5204 | 2752 |
6481 | 2753 if(s->pict_type==FF_I_TYPE){ |
5204 | 2754 if(s->msmpeg4_version >= 3) s->no_rounding=1; |
2755 else s->no_rounding=0; | |
6481 | 2756 }else if(s->pict_type!=FF_B_TYPE){ |
5204 | 2757 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4) |
2758 s->no_rounding ^= 1; | |
2759 } | |
2760 | |
2761 if(s->flags & CODEC_FLAG_PASS2){ | |
2762 if (estimate_qp(s,1) < 0) | |
2763 return -1; | |
2764 ff_get_2pass_fcode(s); | |
2765 }else if(!(s->flags & CODEC_FLAG_QSCALE)){ | |
6481 | 2766 if(s->pict_type==FF_B_TYPE) |
5204 | 2767 s->lambda= s->last_lambda_for[s->pict_type]; |
2768 else | |
2769 s->lambda= s->last_lambda_for[s->last_non_b_pict_type]; | |
2770 update_qscale(s); | |
2771 } | |
2772 | |
2773 s->mb_intra=0; //for the rate distortion & bit compare functions | |
2774 for(i=1; i<s->avctx->thread_count; i++){ | |
2775 ff_update_duplicate_context(s->thread_context[i], s); | |
2776 } | |
2777 | |
2778 ff_init_me(s); | |
2779 | |
2780 /* Estimate motion for every MB */ | |
6481 | 2781 if(s->pict_type != FF_I_TYPE){ |
5204 | 2782 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8; |
2783 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8; | |
6481 | 2784 if(s->pict_type != FF_B_TYPE && s->avctx->me_threshold==0){ |
2785 if((s->avctx->pre_me && s->last_non_b_pict_type==FF_I_TYPE) || s->avctx->pre_me==2){ | |
5204 | 2786 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count); |
2787 } | |
2788 } | |
2789 | |
2790 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count); | |
6481 | 2791 }else /* if(s->pict_type == FF_I_TYPE) */{ |
5204 | 2792 /* I-Frame */ |
2793 for(i=0; i<s->mb_stride*s->mb_height; i++) | |
2794 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA; | |
2795 | |
2796 if(!s->fixed_qscale){ | |
2797 /* finding spatial complexity for I-frame rate control */ | |
2798 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count); | |
2799 } | |
2800 } | |
2801 for(i=1; i<s->avctx->thread_count; i++){ | |
2802 merge_context_after_me(s, s->thread_context[i]); | |
2803 } | |
2804 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp; | |
2805 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp; | |
2806 emms_c(); | |
2807 | |
6481 | 2808 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == FF_P_TYPE){ |
2809 s->pict_type= FF_I_TYPE; | |
5204 | 2810 for(i=0; i<s->mb_stride*s->mb_height; i++) |
2811 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA; | |
2812 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum); | |
2813 } | |
2814 | |
2815 if(!s->umvplus){ | |
6481 | 2816 if(s->pict_type==FF_P_TYPE || s->pict_type==FF_S_TYPE) { |
5204 | 2817 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER); |
2818 | |
2819 if(s->flags & CODEC_FLAG_INTERLACED_ME){ | |
2820 int a,b; | |
2821 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select | |
2822 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I); | |
6655
22cca5d3173a
Implement FFMAX3(a,b,c) - maximum over three arguments.
voroshil
parents:
6517
diff
changeset
|
2823 s->f_code= FFMAX3(s->f_code, a, b); |
5204 | 2824 } |
2825 | |
2826 ff_fix_long_p_mvs(s); | |
2827 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0); | |
2828 if(s->flags & CODEC_FLAG_INTERLACED_ME){ | |
2829 int j; | |
2830 for(i=0; i<2; i++){ | |
2831 for(j=0; j<2; j++) | |
2832 ff_fix_long_mvs(s, s->p_field_select_table[i], j, | |
2833 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0); | |
2834 } | |
2835 } | |
2836 } | |
2837 | |
6481 | 2838 if(s->pict_type==FF_B_TYPE){ |
5204 | 2839 int a, b; |
2840 | |
2841 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD); | |
2842 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR); | |
2843 s->f_code = FFMAX(a, b); | |
2844 | |
2845 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD); | |
2846 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR); | |
2847 s->b_code = FFMAX(a, b); | |
2848 | |
2849 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1); | |
2850 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1); | |
2851 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1); | |
2852 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1); | |
2853 if(s->flags & CODEC_FLAG_INTERLACED_ME){ | |
2854 int dir, j; | |
2855 for(dir=0; dir<2; dir++){ | |
2856 for(i=0; i<2; i++){ | |
2857 for(j=0; j<2; j++){ | |
2858 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I) | |
2859 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I); | |
2860 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j, | |
2861 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1); | |
2862 } | |
2863 } | |
2864 } | |
2865 } | |
2866 } | |
2867 } | |
2868 | |
2869 if (estimate_qp(s, 0) < 0) | |
2870 return -1; | |
2871 | |
6481 | 2872 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==FF_I_TYPE && !(s->flags & CODEC_FLAG_QSCALE)) |
5204 | 2873 s->qscale= 3; //reduce clipping problems |
2874 | |
2875 if (s->out_format == FMT_MJPEG) { | |
2876 /* for mjpeg, we do include qscale in the matrix */ | |
2877 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0]; | |
2878 for(i=1;i<64;i++){ | |
2879 int j= s->dsp.idct_permutation[i]; | |
2880 | |
2881 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3); | |
2882 } | |
5789 | 2883 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16, |
5204 | 2884 s->intra_matrix, s->intra_quant_bias, 8, 8, 1); |
2885 s->qscale= 8; | |
2886 } | |
2887 | |
2888 //FIXME var duplication | |
2889 s->current_picture_ptr->key_frame= | |
6481 | 2890 s->current_picture.key_frame= s->pict_type == FF_I_TYPE; //FIXME pic_ptr |
5204 | 2891 s->current_picture_ptr->pict_type= |
2892 s->current_picture.pict_type= s->pict_type; | |
2893 | |
2894 if(s->current_picture.key_frame) | |
2895 s->picture_in_gop_number=0; | |
2896 | |
2897 s->last_bits= put_bits_count(&s->pb); | |
2898 switch(s->out_format) { | |
2899 case FMT_MJPEG: | |
2900 if (ENABLE_MJPEG_ENCODER) | |
2901 ff_mjpeg_encode_picture_header(s); | |
2902 break; | |
2903 case FMT_H261: | |
2904 if (ENABLE_H261_ENCODER) | |
2905 ff_h261_encode_picture_header(s, picture_number); | |
2906 break; | |
2907 case FMT_H263: | |
2908 if (ENABLE_WMV2_ENCODER && s->codec_id == CODEC_ID_WMV2) | |
2909 ff_wmv2_encode_picture_header(s, picture_number); | |
2910 else if (ENABLE_MSMPEG4_ENCODER && s->h263_msmpeg4) | |
2911 msmpeg4_encode_picture_header(s, picture_number); | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2912 else if (ENABLE_MPEG4_ENCODER && s->h263_pred) |
5204 | 2913 mpeg4_encode_picture_header(s, picture_number); |
2914 else if (ENABLE_RV10_ENCODER && s->codec_id == CODEC_ID_RV10) | |
2915 rv10_encode_picture_header(s, picture_number); | |
2916 else if (ENABLE_RV20_ENCODER && s->codec_id == CODEC_ID_RV20) | |
2917 rv20_encode_picture_header(s, picture_number); | |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2918 else if (ENABLE_FLV_ENCODER && s->codec_id == CODEC_ID_FLV1) |
5204 | 2919 ff_flv_encode_picture_header(s, picture_number); |
5277
7b3fcb7c61ce
Avoid linking with h263.c functions when the relevant codecs
aurel
parents:
5273
diff
changeset
|
2920 else if (ENABLE_ANY_H263_ENCODER) |
5204 | 2921 h263_encode_picture_header(s, picture_number); |
2922 break; | |
2923 case FMT_MPEG1: | |
5208 | 2924 if (ENABLE_MPEG1VIDEO_ENCODER || ENABLE_MPEG2VIDEO_ENCODER) |
5209 | 2925 mpeg1_encode_picture_header(s, picture_number); |
5204 | 2926 break; |
2927 case FMT_H264: | |
2928 break; | |
2929 default: | |
2930 assert(0); | |
2931 } | |
2932 bits= put_bits_count(&s->pb); | |
2933 s->header_bits= bits - s->last_bits; | |
2934 | |
2935 for(i=1; i<s->avctx->thread_count; i++){ | |
2936 update_duplicate_context_after_me(s->thread_context[i], s); | |
2937 } | |
2938 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count); | |
2939 for(i=1; i<s->avctx->thread_count; i++){ | |
2940 merge_context_after_encode(s, s->thread_context[i]); | |
2941 } | |
2942 emms_c(); | |
2943 return 0; | |
2944 } | |
2945 | |
2946 void denoise_dct_c(MpegEncContext *s, DCTELEM *block){ | |
2947 const int intra= s->mb_intra; | |
2948 int i; | |
2949 | |
2950 s->dct_count[intra]++; | |
2951 | |
2952 for(i=0; i<64; i++){ | |
2953 int level= block[i]; | |
2954 | |
2955 if(level){ | |
2956 if(level>0){ | |
2957 s->dct_error_sum[intra][i] += level; | |
2958 level -= s->dct_offset[intra][i]; | |
2959 if(level<0) level=0; | |
2960 }else{ | |
2961 s->dct_error_sum[intra][i] -= level; | |
2962 level += s->dct_offset[intra][i]; | |
2963 if(level>0) level=0; | |
2964 } | |
2965 block[i]= level; | |
2966 } | |
2967 } | |
2968 } | |
2969 | |
2970 int dct_quantize_trellis_c(MpegEncContext *s, | |
2971 DCTELEM *block, int n, | |
2972 int qscale, int *overflow){ | |
2973 const int *qmat; | |
2974 const uint8_t *scantable= s->intra_scantable.scantable; | |
2975 const uint8_t *perm_scantable= s->intra_scantable.permutated; | |
2976 int max=0; | |
2977 unsigned int threshold1, threshold2; | |
2978 int bias=0; | |
2979 int run_tab[65]; | |
2980 int level_tab[65]; | |
2981 int score_tab[65]; | |
2982 int survivor[65]; | |
2983 int survivor_count; | |
2984 int last_run=0; | |
2985 int last_level=0; | |
2986 int last_score= 0; | |
2987 int last_i; | |
2988 int coeff[2][64]; | |
2989 int coeff_count[64]; | |
2990 int qmul, qadd, start_i, last_non_zero, i, dc; | |
2991 const int esc_length= s->ac_esc_length; | |
2992 uint8_t * length; | |
2993 uint8_t * last_length; | |
2994 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); | |
2995 | |
2996 s->dsp.fdct (block); | |
2997 | |
2998 if(s->dct_error_sum) | |
2999 s->denoise_dct(s, block); | |
3000 qmul= qscale*16; | |
3001 qadd= ((qscale-1)|1)*8; | |
3002 | |
3003 if (s->mb_intra) { | |
3004 int q; | |
3005 if (!s->h263_aic) { | |
3006 if (n < 4) | |
3007 q = s->y_dc_scale; | |
3008 else | |
3009 q = s->c_dc_scale; | |
3010 q = q << 3; | |
3011 } else{ | |
3012 /* For AIC we skip quant/dequant of INTRADC */ | |
3013 q = 1 << 3; | |
3014 qadd=0; | |
3015 } | |
3016 | |
3017 /* note: block[0] is assumed to be positive */ | |
3018 block[0] = (block[0] + (q >> 1)) / q; | |
3019 start_i = 1; | |
3020 last_non_zero = 0; | |
3021 qmat = s->q_intra_matrix[qscale]; | |
3022 if(s->mpeg_quant || s->out_format == FMT_MPEG1) | |
3023 bias= 1<<(QMAT_SHIFT-1); | |
3024 length = s->intra_ac_vlc_length; | |
3025 last_length= s->intra_ac_vlc_last_length; | |
3026 } else { | |
3027 start_i = 0; | |
3028 last_non_zero = -1; | |
3029 qmat = s->q_inter_matrix[qscale]; | |
3030 length = s->inter_ac_vlc_length; | |
3031 last_length= s->inter_ac_vlc_last_length; | |
3032 } | |
3033 last_i= start_i; | |
3034 | |
3035 threshold1= (1<<QMAT_SHIFT) - bias - 1; | |
3036 threshold2= (threshold1<<1); | |
3037 | |
3038 for(i=63; i>=start_i; i--) { | |
3039 const int j = scantable[i]; | |
3040 int level = block[j] * qmat[j]; | |
3041 | |
3042 if(((unsigned)(level+threshold1))>threshold2){ | |
3043 last_non_zero = i; | |
3044 break; | |
3045 } | |
3046 } | |
3047 | |
3048 for(i=start_i; i<=last_non_zero; i++) { | |
3049 const int j = scantable[i]; | |
3050 int level = block[j] * qmat[j]; | |
3051 | |
3052 // if( bias+level >= (1<<(QMAT_SHIFT - 3)) | |
3053 // || bias-level >= (1<<(QMAT_SHIFT - 3))){ | |
3054 if(((unsigned)(level+threshold1))>threshold2){ | |
3055 if(level>0){ | |
3056 level= (bias + level)>>QMAT_SHIFT; | |
3057 coeff[0][i]= level; | |
3058 coeff[1][i]= level-1; | |
3059 // coeff[2][k]= level-2; | |
3060 }else{ | |
3061 level= (bias - level)>>QMAT_SHIFT; | |
3062 coeff[0][i]= -level; | |
3063 coeff[1][i]= -level+1; | |
3064 // coeff[2][k]= -level+2; | |
3065 } | |
3066 coeff_count[i]= FFMIN(level, 2); | |
3067 assert(coeff_count[i]); | |
3068 max |=level; | |
3069 }else{ | |
3070 coeff[0][i]= (level>>31)|1; | |
3071 coeff_count[i]= 1; | |
3072 } | |
3073 } | |
3074 | |
3075 *overflow= s->max_qcoeff < max; //overflow might have happened | |
3076 | |
3077 if(last_non_zero < start_i){ | |
3078 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM)); | |
3079 return last_non_zero; | |
3080 } | |
3081 | |
3082 score_tab[start_i]= 0; | |
3083 survivor[0]= start_i; | |
3084 survivor_count= 1; | |
3085 | |
3086 for(i=start_i; i<=last_non_zero; i++){ | |
6719 | 3087 int level_index, j, zero_distortion; |
6401 | 3088 int dct_coeff= FFABS(block[ scantable[i] ]); |
5204 | 3089 int best_score=256*256*256*120; |
6401 | 3090 |
3091 if ( s->dsp.fdct == fdct_ifast | |
3092 #ifndef FAAN_POSTSCALE | |
3093 || s->dsp.fdct == ff_faandct | |
3094 #endif | |
3095 ) | |
3096 dct_coeff= (dct_coeff*inv_aanscales[ scantable[i] ]) >> 12; | |
6719 | 3097 zero_distortion= dct_coeff*dct_coeff; |
6401 | 3098 |
5204 | 3099 for(level_index=0; level_index < coeff_count[i]; level_index++){ |
6719 | 3100 int distortion; |
5204 | 3101 int level= coeff[level_index][i]; |
3102 const int alevel= FFABS(level); | |
3103 int unquant_coeff; | |
3104 | |
3105 assert(level); | |
3106 | |
3107 if(s->out_format == FMT_H263){ | |
3108 unquant_coeff= alevel*qmul + qadd; | |
3109 }else{ //MPEG1 | |
3110 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize | |
3111 if(s->mb_intra){ | |
3112 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3; | |
3113 unquant_coeff = (unquant_coeff - 1) | 1; | |
3114 }else{ | |
3115 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4; | |
3116 unquant_coeff = (unquant_coeff - 1) | 1; | |
3117 } | |
3118 unquant_coeff<<= 3; | |
3119 } | |
3120 | |
6719 | 3121 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion; |
5204 | 3122 level+=64; |
3123 if((level&(~127)) == 0){ | |
3124 for(j=survivor_count-1; j>=0; j--){ | |
3125 int run= i - survivor[j]; | |
6719 | 3126 int score= distortion + length[UNI_AC_ENC_INDEX(run, level)]*lambda; |
5204 | 3127 score += score_tab[i-run]; |
3128 | |
3129 if(score < best_score){ | |
3130 best_score= score; | |
3131 run_tab[i+1]= run; | |
3132 level_tab[i+1]= level-64; | |
3133 } | |
3134 } | |
3135 | |
3136 if(s->out_format == FMT_H263){ | |
3137 for(j=survivor_count-1; j>=0; j--){ | |
3138 int run= i - survivor[j]; | |
6719 | 3139 int score= distortion + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda; |
5204 | 3140 score += score_tab[i-run]; |
3141 if(score < last_score){ | |
3142 last_score= score; | |
3143 last_run= run; | |
3144 last_level= level-64; | |
3145 last_i= i+1; | |
3146 } | |
3147 } | |
3148 } | |
3149 }else{ | |
6719 | 3150 distortion += esc_length*lambda; |
5204 | 3151 for(j=survivor_count-1; j>=0; j--){ |
3152 int run= i - survivor[j]; | |
6719 | 3153 int score= distortion + score_tab[i-run]; |
5204 | 3154 |
3155 if(score < best_score){ | |
3156 best_score= score; | |
3157 run_tab[i+1]= run; | |
3158 level_tab[i+1]= level-64; | |
3159 } | |
3160 } | |
3161 | |
3162 if(s->out_format == FMT_H263){ | |
3163 for(j=survivor_count-1; j>=0; j--){ | |
3164 int run= i - survivor[j]; | |
6719 | 3165 int score= distortion + score_tab[i-run]; |
5204 | 3166 if(score < last_score){ |
3167 last_score= score; | |
3168 last_run= run; | |
3169 last_level= level-64; | |
3170 last_i= i+1; | |
3171 } | |
3172 } | |
3173 } | |
3174 } | |
3175 } | |
3176 | |
3177 score_tab[i+1]= best_score; | |
3178 | |
3179 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level | |
3180 if(last_non_zero <= 27){ | |
3181 for(; survivor_count; survivor_count--){ | |
3182 if(score_tab[ survivor[survivor_count-1] ] <= best_score) | |
3183 break; | |
3184 } | |
3185 }else{ | |
3186 for(; survivor_count; survivor_count--){ | |
3187 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda) | |
3188 break; | |
3189 } | |
3190 } | |
3191 | |
3192 survivor[ survivor_count++ ]= i+1; | |
3193 } | |
3194 | |
3195 if(s->out_format != FMT_H263){ | |
3196 last_score= 256*256*256*120; | |
3197 for(i= survivor[0]; i<=last_non_zero + 1; i++){ | |
3198 int score= score_tab[i]; | |
3199 if(i) score += lambda*2; //FIXME exacter? | |
3200 | |
3201 if(score < last_score){ | |
3202 last_score= score; | |
3203 last_i= i; | |
3204 last_level= level_tab[i]; | |
3205 last_run= run_tab[i]; | |
3206 } | |
3207 } | |
3208 } | |
3209 | |
3210 s->coded_score[n] = last_score; | |
3211 | |
3212 dc= FFABS(block[0]); | |
3213 last_non_zero= last_i - 1; | |
3214 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM)); | |
3215 | |
3216 if(last_non_zero < start_i) | |
3217 return last_non_zero; | |
3218 | |
3219 if(last_non_zero == 0 && start_i == 0){ | |
3220 int best_level= 0; | |
3221 int best_score= dc * dc; | |
3222 | |
3223 for(i=0; i<coeff_count[0]; i++){ | |
3224 int level= coeff[i][0]; | |
3225 int alevel= FFABS(level); | |
3226 int unquant_coeff, score, distortion; | |
3227 | |
3228 if(s->out_format == FMT_H263){ | |
3229 unquant_coeff= (alevel*qmul + qadd)>>3; | |
3230 }else{ //MPEG1 | |
3231 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4; | |
3232 unquant_coeff = (unquant_coeff - 1) | 1; | |
3233 } | |
3234 unquant_coeff = (unquant_coeff + 4) >> 3; | |
3235 unquant_coeff<<= 3 + 3; | |
3236 | |
3237 distortion= (unquant_coeff - dc) * (unquant_coeff - dc); | |
3238 level+=64; | |
3239 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda; | |
3240 else score= distortion + esc_length*lambda; | |
3241 | |
3242 if(score < best_score){ | |
3243 best_score= score; | |
3244 best_level= level - 64; | |
3245 } | |
3246 } | |
3247 block[0]= best_level; | |
3248 s->coded_score[n] = best_score - dc*dc; | |
3249 if(best_level == 0) return -1; | |
3250 else return last_non_zero; | |
3251 } | |
3252 | |
3253 i= last_i; | |
3254 assert(last_level); | |
3255 | |
3256 block[ perm_scantable[last_non_zero] ]= last_level; | |
3257 i -= last_run + 1; | |
3258 | |
3259 for(; i>start_i; i -= run_tab[i] + 1){ | |
3260 block[ perm_scantable[i-1] ]= level_tab[i]; | |
3261 } | |
3262 | |
3263 return last_non_zero; | |
3264 } | |
3265 | |
3266 //#define REFINE_STATS 1 | |
3267 static int16_t basis[64][64]; | |
3268 | |
3269 static void build_basis(uint8_t *perm){ | |
3270 int i, j, x, y; | |
3271 emms_c(); | |
3272 for(i=0; i<8; i++){ | |
3273 for(j=0; j<8; j++){ | |
3274 for(y=0; y<8; y++){ | |
3275 for(x=0; x<8; x++){ | |
3276 double s= 0.25*(1<<BASIS_SHIFT); | |
3277 int index= 8*i + j; | |
3278 int perm_index= perm[index]; | |
3279 if(i==0) s*= sqrt(0.5); | |
3280 if(j==0) s*= sqrt(0.5); | |
3281 basis[perm_index][8*x + y]= lrintf(s * cos((M_PI/8.0)*i*(x+0.5)) * cos((M_PI/8.0)*j*(y+0.5))); | |
3282 } | |
3283 } | |
3284 } | |
3285 } | |
3286 } | |
3287 | |
3288 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise? | |
3289 DCTELEM *block, int16_t *weight, DCTELEM *orig, | |
3290 int n, int qscale){ | |
3291 int16_t rem[64]; | |
3292 DECLARE_ALIGNED_16(DCTELEM, d1[64]); | |
3293 const int *qmat; | |
3294 const uint8_t *scantable= s->intra_scantable.scantable; | |
3295 const uint8_t *perm_scantable= s->intra_scantable.permutated; | |
3296 // unsigned int threshold1, threshold2; | |
3297 // int bias=0; | |
3298 int run_tab[65]; | |
3299 int prev_run=0; | |
3300 int prev_level=0; | |
3301 int qmul, qadd, start_i, last_non_zero, i, dc; | |
3302 uint8_t * length; | |
3303 uint8_t * last_length; | |
3304 int lambda; | |
3305 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true | |
3306 #ifdef REFINE_STATS | |
3307 static int count=0; | |
3308 static int after_last=0; | |
3309 static int to_zero=0; | |
3310 static int from_zero=0; | |
3311 static int raise=0; | |
3312 static int lower=0; | |
3313 static int messed_sign=0; | |
3314 #endif | |
3315 | |
3316 if(basis[0][0] == 0) | |
3317 build_basis(s->dsp.idct_permutation); | |
3318 | |
3319 qmul= qscale*2; | |
3320 qadd= (qscale-1)|1; | |
3321 if (s->mb_intra) { | |
3322 if (!s->h263_aic) { | |
3323 if (n < 4) | |
3324 q = s->y_dc_scale; | |
3325 else | |
3326 q = s->c_dc_scale; | |
3327 } else{ | |
3328 /* For AIC we skip quant/dequant of INTRADC */ | |
3329 q = 1; | |
3330 qadd=0; | |
3331 } | |
3332 q <<= RECON_SHIFT-3; | |
3333 /* note: block[0] is assumed to be positive */ | |
3334 dc= block[0]*q; | |
3335 // block[0] = (block[0] + (q >> 1)) / q; | |
3336 start_i = 1; | |
3337 qmat = s->q_intra_matrix[qscale]; | |
3338 // if(s->mpeg_quant || s->out_format == FMT_MPEG1) | |
3339 // bias= 1<<(QMAT_SHIFT-1); | |
3340 length = s->intra_ac_vlc_length; | |
3341 last_length= s->intra_ac_vlc_last_length; | |
3342 } else { | |
3343 dc= 0; | |
3344 start_i = 0; | |
3345 qmat = s->q_inter_matrix[qscale]; | |
3346 length = s->inter_ac_vlc_length; | |
3347 last_length= s->inter_ac_vlc_last_length; | |
3348 } | |
3349 last_non_zero = s->block_last_index[n]; | |
3350 | |
3351 #ifdef REFINE_STATS | |
3352 {START_TIMER | |
3353 #endif | |
3354 dc += (1<<(RECON_SHIFT-1)); | |
3355 for(i=0; i<64; i++){ | |
3356 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[] | |
3357 } | |
3358 #ifdef REFINE_STATS | |
3359 STOP_TIMER("memset rem[]")} | |
3360 #endif | |
3361 sum=0; | |
3362 for(i=0; i<64; i++){ | |
3363 int one= 36; | |
3364 int qns=4; | |
3365 int w; | |
3366 | |
3367 w= FFABS(weight[i]) + qns*one; | |
3368 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63 | |
3369 | |
3370 weight[i] = w; | |
3371 // w=weight[i] = (63*qns + (w/2)) / w; | |
3372 | |
3373 assert(w>0); | |
3374 assert(w<(1<<6)); | |
3375 sum += w*w; | |
3376 } | |
3377 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6); | |
3378 #ifdef REFINE_STATS | |
3379 {START_TIMER | |
3380 #endif | |
3381 run=0; | |
3382 rle_index=0; | |
3383 for(i=start_i; i<=last_non_zero; i++){ | |
3384 int j= perm_scantable[i]; | |
3385 const int level= block[j]; | |
3386 int coeff; | |
3387 | |
3388 if(level){ | |
3389 if(level<0) coeff= qmul*level - qadd; | |
3390 else coeff= qmul*level + qadd; | |
3391 run_tab[rle_index++]=run; | |
3392 run=0; | |
3393 | |
3394 s->dsp.add_8x8basis(rem, basis[j], coeff); | |
3395 }else{ | |
3396 run++; | |
3397 } | |
3398 } | |
3399 #ifdef REFINE_STATS | |
3400 if(last_non_zero>0){ | |
3401 STOP_TIMER("init rem[]") | |
3402 } | |
3403 } | |
3404 | |
3405 {START_TIMER | |
3406 #endif | |
3407 for(;;){ | |
3408 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0); | |
3409 int best_coeff=0; | |
3410 int best_change=0; | |
3411 int run2, best_unquant_change=0, analyze_gradient; | |
3412 #ifdef REFINE_STATS | |
3413 {START_TIMER | |
3414 #endif | |
3415 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3; | |
3416 | |
3417 if(analyze_gradient){ | |
3418 #ifdef REFINE_STATS | |
3419 {START_TIMER | |
3420 #endif | |
3421 for(i=0; i<64; i++){ | |
3422 int w= weight[i]; | |
3423 | |
3424 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12); | |
3425 } | |
3426 #ifdef REFINE_STATS | |
3427 STOP_TIMER("rem*w*w")} | |
3428 {START_TIMER | |
3429 #endif | |
3430 s->dsp.fdct(d1); | |
3431 #ifdef REFINE_STATS | |
3432 STOP_TIMER("dct")} | |
3433 #endif | |
3434 } | |
3435 | |
3436 if(start_i){ | |
3437 const int level= block[0]; | |
3438 int change, old_coeff; | |
3439 | |
3440 assert(s->mb_intra); | |
3441 | |
3442 old_coeff= q*level; | |
3443 | |
3444 for(change=-1; change<=1; change+=2){ | |
3445 int new_level= level + change; | |
3446 int score, new_coeff; | |
3447 | |
3448 new_coeff= q*new_level; | |
3449 if(new_coeff >= 2048 || new_coeff < 0) | |
3450 continue; | |
3451 | |
3452 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff); | |
3453 if(score<best_score){ | |
3454 best_score= score; | |
3455 best_coeff= 0; | |
3456 best_change= change; | |
3457 best_unquant_change= new_coeff - old_coeff; | |
3458 } | |
3459 } | |
3460 } | |
3461 | |
3462 run=0; | |
3463 rle_index=0; | |
3464 run2= run_tab[rle_index++]; | |
3465 prev_level=0; | |
3466 prev_run=0; | |
3467 | |
3468 for(i=start_i; i<64; i++){ | |
3469 int j= perm_scantable[i]; | |
3470 const int level= block[j]; | |
3471 int change, old_coeff; | |
3472 | |
3473 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1) | |
3474 break; | |
3475 | |
3476 if(level){ | |
3477 if(level<0) old_coeff= qmul*level - qadd; | |
3478 else old_coeff= qmul*level + qadd; | |
3479 run2= run_tab[rle_index++]; //FIXME ! maybe after last | |
3480 }else{ | |
3481 old_coeff=0; | |
3482 run2--; | |
3483 assert(run2>=0 || i >= last_non_zero ); | |
3484 } | |
3485 | |
3486 for(change=-1; change<=1; change+=2){ | |
3487 int new_level= level + change; | |
3488 int score, new_coeff, unquant_change; | |
3489 | |
3490 score=0; | |
3491 if(s->avctx->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level)) | |
3492 continue; | |
3493 | |
3494 if(new_level){ | |
3495 if(new_level<0) new_coeff= qmul*new_level - qadd; | |
3496 else new_coeff= qmul*new_level + qadd; | |
3497 if(new_coeff >= 2048 || new_coeff <= -2048) | |
3498 continue; | |
3499 //FIXME check for overflow | |
3500 | |
3501 if(level){ | |
3502 if(level < 63 && level > -63){ | |
3503 if(i < last_non_zero) | |
3504 score += length[UNI_AC_ENC_INDEX(run, new_level+64)] | |
3505 - length[UNI_AC_ENC_INDEX(run, level+64)]; | |
3506 else | |
3507 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)] | |
3508 - last_length[UNI_AC_ENC_INDEX(run, level+64)]; | |
3509 } | |
3510 }else{ | |
3511 assert(FFABS(new_level)==1); | |
3512 | |
3513 if(analyze_gradient){ | |
3514 int g= d1[ scantable[i] ]; | |
3515 if(g && (g^new_level) >= 0) | |
3516 continue; | |
3517 } | |
3518 | |
3519 if(i < last_non_zero){ | |
3520 int next_i= i + run2 + 1; | |
3521 int next_level= block[ perm_scantable[next_i] ] + 64; | |
3522 | |
3523 if(next_level&(~127)) | |
3524 next_level= 0; | |
3525 | |
3526 if(next_i < last_non_zero) | |
3527 score += length[UNI_AC_ENC_INDEX(run, 65)] | |
3528 + length[UNI_AC_ENC_INDEX(run2, next_level)] | |
3529 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]; | |
3530 else | |
3531 score += length[UNI_AC_ENC_INDEX(run, 65)] | |
3532 + last_length[UNI_AC_ENC_INDEX(run2, next_level)] | |
3533 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]; | |
3534 }else{ | |
3535 score += last_length[UNI_AC_ENC_INDEX(run, 65)]; | |
3536 if(prev_level){ | |
3537 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)] | |
3538 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]; | |
3539 } | |
3540 } | |
3541 } | |
3542 }else{ | |
3543 new_coeff=0; | |
3544 assert(FFABS(level)==1); | |
3545 | |
3546 if(i < last_non_zero){ | |
3547 int next_i= i + run2 + 1; | |
3548 int next_level= block[ perm_scantable[next_i] ] + 64; | |
3549 | |
3550 if(next_level&(~127)) | |
3551 next_level= 0; | |
3552 | |
3553 if(next_i < last_non_zero) | |
3554 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)] | |
3555 - length[UNI_AC_ENC_INDEX(run2, next_level)] | |
3556 - length[UNI_AC_ENC_INDEX(run, 65)]; | |
3557 else | |
3558 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)] | |
3559 - last_length[UNI_AC_ENC_INDEX(run2, next_level)] | |
3560 - length[UNI_AC_ENC_INDEX(run, 65)]; | |
3561 }else{ | |
3562 score += -last_length[UNI_AC_ENC_INDEX(run, 65)]; | |
3563 if(prev_level){ | |
3564 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)] | |
3565 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)]; | |
3566 } | |
3567 } | |
3568 } | |
3569 | |
3570 score *= lambda; | |
3571 | |
3572 unquant_change= new_coeff - old_coeff; | |
3573 assert((score < 100*lambda && score > -100*lambda) || lambda==0); | |
3574 | |
3575 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change); | |
3576 if(score<best_score){ | |
3577 best_score= score; | |
3578 best_coeff= i; | |
3579 best_change= change; | |
3580 best_unquant_change= unquant_change; | |
3581 } | |
3582 } | |
3583 if(level){ | |
3584 prev_level= level + 64; | |
3585 if(prev_level&(~127)) | |
3586 prev_level= 0; | |
3587 prev_run= run; | |
3588 run=0; | |
3589 }else{ | |
3590 run++; | |
3591 } | |
3592 } | |
3593 #ifdef REFINE_STATS | |
3594 STOP_TIMER("iterative step")} | |
3595 #endif | |
3596 | |
3597 if(best_change){ | |
3598 int j= perm_scantable[ best_coeff ]; | |
3599 | |
3600 block[j] += best_change; | |
3601 | |
3602 if(best_coeff > last_non_zero){ | |
3603 last_non_zero= best_coeff; | |
3604 assert(block[j]); | |
3605 #ifdef REFINE_STATS | |
3606 after_last++; | |
3607 #endif | |
3608 }else{ | |
3609 #ifdef REFINE_STATS | |
3610 if(block[j]){ | |
3611 if(block[j] - best_change){ | |
3612 if(FFABS(block[j]) > FFABS(block[j] - best_change)){ | |
3613 raise++; | |
3614 }else{ | |
3615 lower++; | |
3616 } | |
3617 }else{ | |
3618 from_zero++; | |
3619 } | |
3620 }else{ | |
3621 to_zero++; | |
3622 } | |
3623 #endif | |
3624 for(; last_non_zero>=start_i; last_non_zero--){ | |
3625 if(block[perm_scantable[last_non_zero]]) | |
3626 break; | |
3627 } | |
3628 } | |
3629 #ifdef REFINE_STATS | |
3630 count++; | |
3631 if(256*256*256*64 % count == 0){ | |
3632 printf("after_last:%d to_zero:%d from_zero:%d raise:%d lower:%d sign:%d xyp:%d/%d/%d\n", after_last, to_zero, from_zero, raise, lower, messed_sign, s->mb_x, s->mb_y, s->picture_number); | |
3633 } | |
3634 #endif | |
3635 run=0; | |
3636 rle_index=0; | |
3637 for(i=start_i; i<=last_non_zero; i++){ | |
3638 int j= perm_scantable[i]; | |
3639 const int level= block[j]; | |
3640 | |
3641 if(level){ | |
3642 run_tab[rle_index++]=run; | |
3643 run=0; | |
3644 }else{ | |
3645 run++; | |
3646 } | |
3647 } | |
3648 | |
3649 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change); | |
3650 }else{ | |
3651 break; | |
3652 } | |
3653 } | |
3654 #ifdef REFINE_STATS | |
3655 if(last_non_zero>0){ | |
3656 STOP_TIMER("iterative search") | |
3657 } | |
3658 } | |
3659 #endif | |
3660 | |
3661 return last_non_zero; | |
3662 } | |
3663 | |
3664 int dct_quantize_c(MpegEncContext *s, | |
3665 DCTELEM *block, int n, | |
3666 int qscale, int *overflow) | |
3667 { | |
3668 int i, j, level, last_non_zero, q, start_i; | |
3669 const int *qmat; | |
3670 const uint8_t *scantable= s->intra_scantable.scantable; | |
3671 int bias; | |
3672 int max=0; | |
3673 unsigned int threshold1, threshold2; | |
3674 | |
3675 s->dsp.fdct (block); | |
3676 | |
3677 if(s->dct_error_sum) | |
3678 s->denoise_dct(s, block); | |
3679 | |
3680 if (s->mb_intra) { | |
3681 if (!s->h263_aic) { | |
3682 if (n < 4) | |
3683 q = s->y_dc_scale; | |
3684 else | |
3685 q = s->c_dc_scale; | |
3686 q = q << 3; | |
3687 } else | |
3688 /* For AIC we skip quant/dequant of INTRADC */ | |
3689 q = 1 << 3; | |
3690 | |
3691 /* note: block[0] is assumed to be positive */ | |
3692 block[0] = (block[0] + (q >> 1)) / q; | |
3693 start_i = 1; | |
3694 last_non_zero = 0; | |
3695 qmat = s->q_intra_matrix[qscale]; | |
3696 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT); | |
3697 } else { | |
3698 start_i = 0; | |
3699 last_non_zero = -1; | |
3700 qmat = s->q_inter_matrix[qscale]; | |
3701 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT); | |
3702 } | |
3703 threshold1= (1<<QMAT_SHIFT) - bias - 1; | |
3704 threshold2= (threshold1<<1); | |
3705 for(i=63;i>=start_i;i--) { | |
3706 j = scantable[i]; | |
3707 level = block[j] * qmat[j]; | |
3708 | |
3709 if(((unsigned)(level+threshold1))>threshold2){ | |
3710 last_non_zero = i; | |
3711 break; | |
3712 }else{ | |
3713 block[j]=0; | |
3714 } | |
3715 } | |
3716 for(i=start_i; i<=last_non_zero; i++) { | |
3717 j = scantable[i]; | |
3718 level = block[j] * qmat[j]; | |
3719 | |
3720 // if( bias+level >= (1<<QMAT_SHIFT) | |
3721 // || bias-level >= (1<<QMAT_SHIFT)){ | |
3722 if(((unsigned)(level+threshold1))>threshold2){ | |
3723 if(level>0){ | |
3724 level= (bias + level)>>QMAT_SHIFT; | |
3725 block[j]= level; | |
3726 }else{ | |
3727 level= (bias - level)>>QMAT_SHIFT; | |
3728 block[j]= -level; | |
3729 } | |
3730 max |=level; | |
3731 }else{ | |
3732 block[j]=0; | |
3733 } | |
3734 } | |
3735 *overflow= s->max_qcoeff < max; //overflow might have happened | |
3736 | |
3737 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */ | |
3738 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM) | |
3739 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero); | |
3740 | |
3741 return last_non_zero; | |
3742 } | |
3743 | |
3744 AVCodec h263_encoder = { | |
3745 "h263", | |
3746 CODEC_TYPE_VIDEO, | |
3747 CODEC_ID_H263, | |
3748 sizeof(MpegEncContext), | |
3749 MPV_encode_init, | |
3750 MPV_encode_picture, | |
3751 MPV_encode_end, | |
6788 | 3752 .pix_fmts= (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
|
3753 .long_name= NULL_IF_CONFIG_SMALL("H.263"), |
5204 | 3754 }; |
3755 | |
3756 AVCodec h263p_encoder = { | |
3757 "h263p", | |
3758 CODEC_TYPE_VIDEO, | |
3759 CODEC_ID_H263P, | |
3760 sizeof(MpegEncContext), | |
3761 MPV_encode_init, | |
3762 MPV_encode_picture, | |
3763 MPV_encode_end, | |
6788 | 3764 .pix_fmts= (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
|
3765 .long_name= NULL_IF_CONFIG_SMALL("H.263+ / H.263 version 2"), |
5204 | 3766 }; |
3767 | |
3768 AVCodec flv_encoder = { | |
3769 "flv", | |
3770 CODEC_TYPE_VIDEO, | |
3771 CODEC_ID_FLV1, | |
3772 sizeof(MpegEncContext), | |
3773 MPV_encode_init, | |
3774 MPV_encode_picture, | |
3775 MPV_encode_end, | |
6788 | 3776 .pix_fmts= (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
|
3777 .long_name= NULL_IF_CONFIG_SMALL("Flash Video"), |
5204 | 3778 }; |
3779 | |
3780 AVCodec rv10_encoder = { | |
3781 "rv10", | |
3782 CODEC_TYPE_VIDEO, | |
3783 CODEC_ID_RV10, | |
3784 sizeof(MpegEncContext), | |
3785 MPV_encode_init, | |
3786 MPV_encode_picture, | |
3787 MPV_encode_end, | |
6788 | 3788 .pix_fmts= (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
|
3789 .long_name= NULL_IF_CONFIG_SMALL("RealVideo 1.0"), |
5204 | 3790 }; |
3791 | |
3792 AVCodec rv20_encoder = { | |
3793 "rv20", | |
3794 CODEC_TYPE_VIDEO, | |
3795 CODEC_ID_RV20, | |
3796 sizeof(MpegEncContext), | |
3797 MPV_encode_init, | |
3798 MPV_encode_picture, | |
3799 MPV_encode_end, | |
6788 | 3800 .pix_fmts= (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
|
3801 .long_name= NULL_IF_CONFIG_SMALL("RealVideo 2.0"), |
5204 | 3802 }; |
3803 | |
3804 AVCodec mpeg4_encoder = { | |
3805 "mpeg4", | |
3806 CODEC_TYPE_VIDEO, | |
3807 CODEC_ID_MPEG4, | |
3808 sizeof(MpegEncContext), | |
3809 MPV_encode_init, | |
3810 MPV_encode_picture, | |
3811 MPV_encode_end, | |
6788 | 3812 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, |
5204 | 3813 .capabilities= CODEC_CAP_DELAY, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
7034
diff
changeset
|
3814 .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"), |
5204 | 3815 }; |
3816 | |
3817 AVCodec msmpeg4v1_encoder = { | |
3818 "msmpeg4v1", | |
3819 CODEC_TYPE_VIDEO, | |
3820 CODEC_ID_MSMPEG4V1, | |
3821 sizeof(MpegEncContext), | |
3822 MPV_encode_init, | |
3823 MPV_encode_picture, | |
3824 MPV_encode_end, | |
6788 | 3825 .pix_fmts= (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
|
3826 .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 1"), |
5204 | 3827 }; |
3828 | |
3829 AVCodec msmpeg4v2_encoder = { | |
3830 "msmpeg4v2", | |
3831 CODEC_TYPE_VIDEO, | |
3832 CODEC_ID_MSMPEG4V2, | |
3833 sizeof(MpegEncContext), | |
3834 MPV_encode_init, | |
3835 MPV_encode_picture, | |
3836 MPV_encode_end, | |
6788 | 3837 .pix_fmts= (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
|
3838 .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"), |
5204 | 3839 }; |
3840 | |
3841 AVCodec msmpeg4v3_encoder = { | |
3842 "msmpeg4", | |
3843 CODEC_TYPE_VIDEO, | |
3844 CODEC_ID_MSMPEG4V3, | |
3845 sizeof(MpegEncContext), | |
3846 MPV_encode_init, | |
3847 MPV_encode_picture, | |
3848 MPV_encode_end, | |
6788 | 3849 .pix_fmts= (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
|
3850 .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"), |
5204 | 3851 }; |
3852 | |
3853 AVCodec wmv1_encoder = { | |
3854 "wmv1", | |
3855 CODEC_TYPE_VIDEO, | |
3856 CODEC_ID_WMV1, | |
3857 sizeof(MpegEncContext), | |
3858 MPV_encode_init, | |
3859 MPV_encode_picture, | |
3860 MPV_encode_end, | |
6788 | 3861 .pix_fmts= (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
|
3862 .long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 7"), |
5204 | 3863 }; |