00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00030 #include "avcodec.h"
00031 #include "dsputil.h"
00032 #include "mpegvideo.h"
00033 #include "mpegvideo_common.h"
00034 #include "mjpegenc.h"
00035 #include "msmpeg4.h"
00036 #include "h263.h"
00037 #include "faandct.h"
00038 #include <limits.h>
00039
00040
00041
00042
00043 static int encode_picture(MpegEncContext *s, int picture_number);
00044 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
00045 static int sse_mb(MpegEncContext *s);
00046
00047
00048
00049
00050
00051
00052 static const uint16_t aanscales[64] = {
00053
00054 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
00055 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
00056 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
00057 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
00058 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
00059 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
00060 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
00061 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
00062 };
00063
00064 static uint8_t default_mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
00065 static uint8_t default_fcode_tab[MAX_MV*2+1];
00066
00067 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
00068
00069 void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
00070 const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
00071 {
00072 int qscale;
00073 int shift=0;
00074
00075 for(qscale=qmin; qscale<=qmax; qscale++){
00076 int i;
00077 if (dsp->fdct == ff_jpeg_fdct_islow
00078 #ifdef FAAN_POSTSCALE
00079 || dsp->fdct == ff_faandct
00080 #endif
00081 ) {
00082 for(i=0;i<64;i++) {
00083 const int j= dsp->idct_permutation[i];
00084
00085
00086
00087
00088
00089 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
00090 (qscale * quant_matrix[j]));
00091 }
00092 } else if (dsp->fdct == fdct_ifast
00093 #ifndef FAAN_POSTSCALE
00094 || dsp->fdct == ff_faandct
00095 #endif
00096 ) {
00097 for(i=0;i<64;i++) {
00098 const int j= dsp->idct_permutation[i];
00099
00100
00101
00102
00103
00104 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
00105 (aanscales[i] * qscale * quant_matrix[j]));
00106 }
00107 } else {
00108 for(i=0;i<64;i++) {
00109 const int j= dsp->idct_permutation[i];
00110
00111
00112
00113
00114
00115 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
00116
00117 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
00118
00119 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1;
00120 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
00121 }
00122 }
00123
00124 for(i=intra; i<64; i++){
00125 int64_t max= 8191;
00126 if (dsp->fdct == fdct_ifast
00127 #ifndef FAAN_POSTSCALE
00128 || dsp->fdct == ff_faandct
00129 #endif
00130 ) {
00131 max= (8191LL*aanscales[i]) >> 14;
00132 }
00133 while(((max * qmat[qscale][i]) >> shift) > INT_MAX){
00134 shift++;
00135 }
00136 }
00137 }
00138 if(shift){
00139 av_log(NULL, AV_LOG_INFO, "Warning, QMAT_SHIFT is larger than %d, overflows possible\n", QMAT_SHIFT - shift);
00140 }
00141 }
00142
00143 static inline void update_qscale(MpegEncContext *s){
00144 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
00145 s->qscale= av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
00146
00147 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
00148 }
00149
00150 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix){
00151 int i;
00152
00153 if(matrix){
00154 put_bits(pb, 1, 1);
00155 for(i=0;i<64;i++) {
00156 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
00157 }
00158 }else
00159 put_bits(pb, 1, 0);
00160 }
00161
00162 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){
00163 int i;
00164
00165 dst->pict_type = src->pict_type;
00166 dst->quality = src->quality;
00167 dst->coded_picture_number = src->coded_picture_number;
00168 dst->display_picture_number = src->display_picture_number;
00169
00170 dst->pts = src->pts;
00171 dst->interlaced_frame = src->interlaced_frame;
00172 dst->top_field_first = src->top_field_first;
00173
00174 if(s->avctx->me_threshold){
00175 if(!src->motion_val[0])
00176 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
00177 if(!src->mb_type)
00178 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
00179 if(!src->ref_index[0])
00180 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
00181 if(src->motion_subsample_log2 != dst->motion_subsample_log2)
00182 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesn't match! (%d!=%d)\n",
00183 src->motion_subsample_log2, dst->motion_subsample_log2);
00184
00185 memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
00186
00187 for(i=0; i<2; i++){
00188 int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1;
00189 int height= ((16*s->mb_height)>>src->motion_subsample_log2);
00190
00191 if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){
00192 memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t));
00193 }
00194 if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){
00195 memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t));
00196 }
00197 }
00198 }
00199 }
00200
00201 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
00202 #define COPY(a) dst->a= src->a
00203 COPY(pict_type);
00204 COPY(current_picture);
00205 COPY(f_code);
00206 COPY(b_code);
00207 COPY(qscale);
00208 COPY(lambda);
00209 COPY(lambda2);
00210 COPY(picture_in_gop_number);
00211 COPY(gop_picture_number);
00212 COPY(frame_pred_frame_dct);
00213 COPY(progressive_frame);
00214 COPY(partitioned_frame);
00215 #undef COPY
00216 }
00217
00222 static void MPV_encode_defaults(MpegEncContext *s){
00223 int i;
00224 MPV_common_defaults(s);
00225
00226 for(i=-16; i<16; i++){
00227 default_fcode_tab[i + MAX_MV]= 1;
00228 }
00229 s->me.mv_penalty= default_mv_penalty;
00230 s->fcode_tab= default_fcode_tab;
00231 }
00232
00233
00234 int MPV_encode_init(AVCodecContext *avctx)
00235 {
00236 MpegEncContext *s = avctx->priv_data;
00237 int i;
00238 int chroma_h_shift, chroma_v_shift;
00239
00240 MPV_encode_defaults(s);
00241
00242 switch (avctx->codec_id) {
00243 case CODEC_ID_MPEG2VIDEO:
00244 if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P){
00245 av_log(avctx, AV_LOG_ERROR, "only YUV420 and YUV422 are supported\n");
00246 return -1;
00247 }
00248 break;
00249 case CODEC_ID_LJPEG:
00250 case CODEC_ID_MJPEG:
00251 if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUVJ422P &&
00252 ((avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P) || avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL)){
00253 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
00254 return -1;
00255 }
00256 break;
00257 default:
00258 if(avctx->pix_fmt != PIX_FMT_YUV420P){
00259 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
00260 return -1;
00261 }
00262 }
00263
00264 switch (avctx->pix_fmt) {
00265 case PIX_FMT_YUVJ422P:
00266 case PIX_FMT_YUV422P:
00267 s->chroma_format = CHROMA_422;
00268 break;
00269 case PIX_FMT_YUVJ420P:
00270 case PIX_FMT_YUV420P:
00271 default:
00272 s->chroma_format = CHROMA_420;
00273 break;
00274 }
00275
00276 s->bit_rate = avctx->bit_rate;
00277 s->width = avctx->width;
00278 s->height = avctx->height;
00279 if(avctx->gop_size > 600 && avctx->strict_std_compliance>FF_COMPLIANCE_EXPERIMENTAL){
00280 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
00281 avctx->gop_size=600;
00282 }
00283 s->gop_size = avctx->gop_size;
00284 s->avctx = avctx;
00285 s->flags= avctx->flags;
00286 s->flags2= avctx->flags2;
00287 s->max_b_frames= avctx->max_b_frames;
00288 s->codec_id= avctx->codec->id;
00289 s->luma_elim_threshold = avctx->luma_elim_threshold;
00290 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
00291 s->strict_std_compliance= avctx->strict_std_compliance;
00292 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
00293 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
00294 s->mpeg_quant= avctx->mpeg_quant;
00295 s->rtp_mode= !!avctx->rtp_payload_size;
00296 s->intra_dc_precision= avctx->intra_dc_precision;
00297 s->user_specified_pts = AV_NOPTS_VALUE;
00298
00299 if (s->gop_size <= 1) {
00300 s->intra_only = 1;
00301 s->gop_size = 12;
00302 } else {
00303 s->intra_only = 0;
00304 }
00305
00306 s->me_method = avctx->me_method;
00307
00308
00309 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
00310
00311 s->adaptive_quant= ( s->avctx->lumi_masking
00312 || s->avctx->dark_masking
00313 || s->avctx->temporal_cplx_masking
00314 || s->avctx->spatial_cplx_masking
00315 || s->avctx->p_masking
00316 || s->avctx->border_masking
00317 || (s->flags&CODEC_FLAG_QP_RD))
00318 && !s->fixed_qscale;
00319
00320 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
00321 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
00322 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
00323 s->intra_vlc_format= !!(s->flags2 & CODEC_FLAG2_INTRA_VLC);
00324 s->q_scale_type= !!(s->flags2 & CODEC_FLAG2_NON_LINEAR_QUANT);
00325
00326 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
00327 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
00328 return -1;
00329 }
00330
00331 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
00332 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
00333 }
00334
00335 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
00336 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
00337 return -1;
00338 }
00339
00340 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
00341 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
00342 return -1;
00343 }
00344
00345 if(avctx->rc_max_rate && avctx->rc_max_rate == avctx->bit_rate && avctx->rc_max_rate != avctx->rc_min_rate){
00346 av_log(avctx, AV_LOG_INFO, "impossible bitrate constraints, this will fail\n");
00347 }
00348
00349 if(avctx->rc_buffer_size && avctx->bit_rate*av_q2d(avctx->time_base) > avctx->rc_buffer_size){
00350 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
00351 return -1;
00352 }
00353
00354 if(avctx->bit_rate*av_q2d(avctx->time_base) > avctx->bit_rate_tolerance){
00355 av_log(avctx, AV_LOG_ERROR, "bitrate tolerance too small for bitrate\n");
00356 return -1;
00357 }
00358
00359 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
00360 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
00361 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
00362
00363 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");
00364 }
00365
00366 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
00367 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
00368 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
00369 return -1;
00370 }
00371
00372 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
00373 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decision\n");
00374 return -1;
00375 }
00376
00377 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
00378 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
00379 return -1;
00380 }
00381
00382 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
00383 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
00384 return -1;
00385 }
00386
00387 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
00388 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
00389 return -1;
00390 }
00391
00392 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
00393 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
00394 return -1;
00395 }
00396
00397 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
00398 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
00399 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
00400 return -1;
00401 }
00402
00403 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){
00404 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supported by codec\n");
00405 return -1;
00406 }
00407
00408 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
00409 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
00410 return -1;
00411 }
00412
00413 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
00414 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
00415 return -1;
00416 }
00417
00418 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
00419 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet, set threshold to 1000000000\n");
00420 return -1;
00421 }
00422
00423 if((s->flags2 & CODEC_FLAG2_INTRA_VLC) && s->codec_id != CODEC_ID_MPEG2VIDEO){
00424 av_log(avctx, AV_LOG_ERROR, "intra vlc table not supported by codec\n");
00425 return -1;
00426 }
00427
00428 if(s->flags & CODEC_FLAG_LOW_DELAY){
00429 if (s->codec_id != CODEC_ID_MPEG2VIDEO && s->codec_id != CODEC_ID_MPEG1VIDEO){
00430 av_log(avctx, AV_LOG_ERROR, "low delay forcing is only available for mpeg1/2\n");
00431 return -1;
00432 }
00433 if (s->max_b_frames != 0){
00434 av_log(avctx, AV_LOG_ERROR, "b frames cannot be used with low delay\n");
00435 return -1;
00436 }
00437 }
00438
00439 if(s->q_scale_type == 1){
00440 if(s->codec_id != CODEC_ID_MPEG2VIDEO){
00441 av_log(avctx, AV_LOG_ERROR, "non linear quant is only available for mpeg2\n");
00442 return -1;
00443 }
00444 if(avctx->qmax > 12){
00445 av_log(avctx, AV_LOG_ERROR, "non linear quant only supports qmax <= 12 currently\n");
00446 return -1;
00447 }
00448 }
00449
00450 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
00451 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
00452 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
00453 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
00454 return -1;
00455 }
00456
00457 if(s->avctx->thread_count > 1)
00458 s->rtp_mode= 1;
00459
00460 if(!avctx->time_base.den || !avctx->time_base.num){
00461 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
00462 return -1;
00463 }
00464
00465 i= (INT_MAX/2+128)>>8;
00466 if(avctx->me_threshold >= i){
00467 av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1);
00468 return -1;
00469 }
00470 if(avctx->mb_threshold >= i){
00471 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1);
00472 return -1;
00473 }
00474
00475 if(avctx->b_frame_strategy && (avctx->flags&CODEC_FLAG_PASS2)){
00476 av_log(avctx, AV_LOG_INFO, "notice: b_frame_strategy only affects the first pass\n");
00477 avctx->b_frame_strategy = 0;
00478 }
00479
00480 i= ff_gcd(avctx->time_base.den, avctx->time_base.num);
00481 if(i > 1){
00482 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
00483 avctx->time_base.den /= i;
00484 avctx->time_base.num /= i;
00485
00486 }
00487
00488 if(s->codec_id==CODEC_ID_MJPEG){
00489 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1);
00490 s->inter_quant_bias= 0;
00491 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
00492 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3);
00493 s->inter_quant_bias= 0;
00494 }else{
00495 s->intra_quant_bias=0;
00496 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2));
00497 }
00498
00499 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
00500 s->intra_quant_bias= avctx->intra_quant_bias;
00501 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
00502 s->inter_quant_bias= avctx->inter_quant_bias;
00503
00504 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
00505
00506 if(avctx->codec_id == CODEC_ID_MPEG4 && s->avctx->time_base.den > (1<<16)-1){
00507 av_log(avctx, AV_LOG_ERROR, "timebase not supported by mpeg 4 standard\n");
00508 return -1;
00509 }
00510 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
00511
00512 switch(avctx->codec->id) {
00513 case CODEC_ID_MPEG1VIDEO:
00514 s->out_format = FMT_MPEG1;
00515 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY);
00516 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
00517 break;
00518 case CODEC_ID_MPEG2VIDEO:
00519 s->out_format = FMT_MPEG1;
00520 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY);
00521 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
00522 s->rtp_mode= 1;
00523 break;
00524 case CODEC_ID_LJPEG:
00525 case CODEC_ID_MJPEG:
00526 s->out_format = FMT_MJPEG;
00527 s->intra_only = 1;
00528 s->mjpeg_vsample[0] = 2;
00529 s->mjpeg_vsample[1] = 2>>chroma_v_shift;
00530 s->mjpeg_vsample[2] = 2>>chroma_v_shift;
00531 s->mjpeg_hsample[0] = 2;
00532 s->mjpeg_hsample[1] = 2>>chroma_h_shift;
00533 s->mjpeg_hsample[2] = 2>>chroma_h_shift;
00534 if (!(ENABLE_MJPEG_ENCODER || ENABLE_LJPEG_ENCODER)
00535 || ff_mjpeg_encode_init(s) < 0)
00536 return -1;
00537 avctx->delay=0;
00538 s->low_delay=1;
00539 break;
00540 case CODEC_ID_H261:
00541 if (!ENABLE_H261_ENCODER) return -1;
00542 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
00543 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);
00544 return -1;
00545 }
00546 s->out_format = FMT_H261;
00547 avctx->delay=0;
00548 s->low_delay=1;
00549 break;
00550 case CODEC_ID_H263:
00551 if (!ENABLE_H263_ENCODER) return -1;
00552 if (h263_get_picture_format(s->width, s->height) == 7) {
00553 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);
00554 return -1;
00555 }
00556 s->out_format = FMT_H263;
00557 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
00558 avctx->delay=0;
00559 s->low_delay=1;
00560 break;
00561 case CODEC_ID_H263P:
00562 s->out_format = FMT_H263;
00563 s->h263_plus = 1;
00564
00565 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
00566 s->h263_aic= (avctx->flags & CODEC_FLAG_AC_PRED) ? 1:0;
00567 s->modified_quant= s->h263_aic;
00568 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
00569 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
00570 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
00571 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
00572 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
00573
00574
00575
00576 avctx->delay=0;
00577 s->low_delay=1;
00578 break;
00579 case CODEC_ID_FLV1:
00580 s->out_format = FMT_H263;
00581 s->h263_flv = 2;
00582 s->unrestricted_mv = 1;
00583 s->rtp_mode=0;
00584 avctx->delay=0;
00585 s->low_delay=1;
00586 break;
00587 case CODEC_ID_RV10:
00588 s->out_format = FMT_H263;
00589 avctx->delay=0;
00590 s->low_delay=1;
00591 break;
00592 case CODEC_ID_RV20:
00593 s->out_format = FMT_H263;
00594 avctx->delay=0;
00595 s->low_delay=1;
00596 s->modified_quant=1;
00597 s->h263_aic=1;
00598 s->h263_plus=1;
00599 s->loop_filter=1;
00600 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
00601 break;
00602 case CODEC_ID_MPEG4:
00603 s->out_format = FMT_H263;
00604 s->h263_pred = 1;
00605 s->unrestricted_mv = 1;
00606 s->low_delay= s->max_b_frames ? 0 : 1;
00607 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
00608 break;
00609 case CODEC_ID_MSMPEG4V1:
00610 s->out_format = FMT_H263;
00611 s->h263_msmpeg4 = 1;
00612 s->h263_pred = 1;
00613 s->unrestricted_mv = 1;
00614 s->msmpeg4_version= 1;
00615 avctx->delay=0;
00616 s->low_delay=1;
00617 break;
00618 case CODEC_ID_MSMPEG4V2:
00619 s->out_format = FMT_H263;
00620 s->h263_msmpeg4 = 1;
00621 s->h263_pred = 1;
00622 s->unrestricted_mv = 1;
00623 s->msmpeg4_version= 2;
00624 avctx->delay=0;
00625 s->low_delay=1;
00626 break;
00627 case CODEC_ID_MSMPEG4V3:
00628 s->out_format = FMT_H263;
00629 s->h263_msmpeg4 = 1;
00630 s->h263_pred = 1;
00631 s->unrestricted_mv = 1;
00632 s->msmpeg4_version= 3;
00633 s->flipflop_rounding=1;
00634 avctx->delay=0;
00635 s->low_delay=1;
00636 break;
00637 case CODEC_ID_WMV1:
00638 s->out_format = FMT_H263;
00639 s->h263_msmpeg4 = 1;
00640 s->h263_pred = 1;
00641 s->unrestricted_mv = 1;
00642 s->msmpeg4_version= 4;
00643 s->flipflop_rounding=1;
00644 avctx->delay=0;
00645 s->low_delay=1;
00646 break;
00647 case CODEC_ID_WMV2:
00648 s->out_format = FMT_H263;
00649 s->h263_msmpeg4 = 1;
00650 s->h263_pred = 1;
00651 s->unrestricted_mv = 1;
00652 s->msmpeg4_version= 5;
00653 s->flipflop_rounding=1;
00654 avctx->delay=0;
00655 s->low_delay=1;
00656 break;
00657 default:
00658 return -1;
00659 }
00660
00661 avctx->has_b_frames= !s->low_delay;
00662
00663 s->encoding = 1;
00664
00665
00666 if (MPV_common_init(s) < 0)
00667 return -1;
00668
00669 if(!s->dct_quantize)
00670 s->dct_quantize = dct_quantize_c;
00671 if(!s->denoise_dct)
00672 s->denoise_dct = denoise_dct_c;
00673 s->fast_dct_quantize = s->dct_quantize;
00674 if(s->flags & CODEC_FLAG_TRELLIS_QUANT)
00675 s->dct_quantize = dct_quantize_trellis_c;
00676
00677 if((ENABLE_H263P_ENCODER || ENABLE_RV20_ENCODER) && s->modified_quant)
00678 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
00679 s->progressive_frame=
00680 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN));
00681 s->quant_precision=5;
00682
00683 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
00684 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
00685
00686 if (ENABLE_H261_ENCODER && s->out_format == FMT_H261)
00687 ff_h261_encode_init(s);
00688 if (ENABLE_ANY_H263_ENCODER && s->out_format == FMT_H263)
00689 h263_encode_init(s);
00690 if (ENABLE_MSMPEG4_ENCODER && s->msmpeg4_version)
00691 ff_msmpeg4_encode_init(s);
00692 if ((ENABLE_MPEG1VIDEO_ENCODER || ENABLE_MPEG2VIDEO_ENCODER)
00693 && s->out_format == FMT_MPEG1)
00694 ff_mpeg1_encode_init(s);
00695
00696
00697 for(i=0;i<64;i++) {
00698 int j= s->dsp.idct_permutation[i];
00699 if(ENABLE_MPEG4_ENCODER && s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
00700 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
00701 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
00702 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
00703 s->intra_matrix[j] =
00704 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
00705 }else
00706 {
00707 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
00708 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
00709 }
00710 if(s->avctx->intra_matrix)
00711 s->intra_matrix[j] = s->avctx->intra_matrix[i];
00712 if(s->avctx->inter_matrix)
00713 s->inter_matrix[j] = s->avctx->inter_matrix[i];
00714 }
00715
00716
00717
00718 if (s->out_format != FMT_MJPEG) {
00719 ff_convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
00720 s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
00721 ff_convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
00722 s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
00723 }
00724
00725 if(ff_rate_control_init(s) < 0)
00726 return -1;
00727
00728 return 0;
00729 }
00730
00731 int MPV_encode_end(AVCodecContext *avctx)
00732 {
00733 MpegEncContext *s = avctx->priv_data;
00734
00735 ff_rate_control_uninit(s);
00736
00737 MPV_common_end(s);
00738 if ((ENABLE_MJPEG_ENCODER || ENABLE_LJPEG_ENCODER) && s->out_format == FMT_MJPEG)
00739 ff_mjpeg_encode_close(s);
00740
00741 av_freep(&avctx->extradata);
00742
00743 return 0;
00744 }
00745
00746 static int get_sae(uint8_t *src, int ref, int stride){
00747 int x,y;
00748 int acc=0;
00749
00750 for(y=0; y<16; y++){
00751 for(x=0; x<16; x++){
00752 acc+= FFABS(src[x+y*stride] - ref);
00753 }
00754 }
00755
00756 return acc;
00757 }
00758
00759 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
00760 int x, y, w, h;
00761 int acc=0;
00762
00763 w= s->width &~15;
00764 h= s->height&~15;
00765
00766 for(y=0; y<h; y+=16){
00767 for(x=0; x<w; x+=16){
00768 int offset= x + y*stride;
00769 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
00770 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
00771 int sae = get_sae(src + offset, mean, stride);
00772
00773 acc+= sae + 500 < sad;
00774 }
00775 }
00776 return acc;
00777 }
00778
00779
00780 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
00781 AVFrame *pic=NULL;
00782 int64_t pts;
00783 int i;
00784 const int encoding_delay= s->max_b_frames;
00785 int direct=1;
00786
00787 if(pic_arg){
00788 pts= pic_arg->pts;
00789 pic_arg->display_picture_number= s->input_picture_number++;
00790
00791 if(pts != AV_NOPTS_VALUE){
00792 if(s->user_specified_pts != AV_NOPTS_VALUE){
00793 int64_t time= pts;
00794 int64_t last= s->user_specified_pts;
00795
00796 if(time <= last){
00797 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%"PRId64", last=%"PRId64"\n", pts, s->user_specified_pts);
00798 return -1;
00799 }
00800 }
00801 s->user_specified_pts= pts;
00802 }else{
00803 if(s->user_specified_pts != AV_NOPTS_VALUE){
00804 s->user_specified_pts=
00805 pts= s->user_specified_pts + 1;
00806 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n", pts);
00807 }else{
00808 pts= pic_arg->display_picture_number;
00809 }
00810 }
00811 }
00812
00813 if(pic_arg){
00814 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
00815 if(pic_arg->linesize[0] != s->linesize) direct=0;
00816 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
00817 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
00818
00819
00820
00821 if(direct){
00822 i= ff_find_unused_picture(s, 1);
00823
00824 pic= (AVFrame*)&s->picture[i];
00825 pic->reference= 3;
00826
00827 for(i=0; i<4; i++){
00828 pic->data[i]= pic_arg->data[i];
00829 pic->linesize[i]= pic_arg->linesize[i];
00830 }
00831 alloc_picture(s, (Picture*)pic, 1);
00832 }else{
00833 i= ff_find_unused_picture(s, 0);
00834
00835 pic= (AVFrame*)&s->picture[i];
00836 pic->reference= 3;
00837
00838 alloc_picture(s, (Picture*)pic, 0);
00839
00840 if( pic->data[0] + INPLACE_OFFSET == pic_arg->data[0]
00841 && pic->data[1] + INPLACE_OFFSET == pic_arg->data[1]
00842 && pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]){
00843
00844 }else{
00845 int h_chroma_shift, v_chroma_shift;
00846 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
00847
00848 for(i=0; i<3; i++){
00849 int src_stride= pic_arg->linesize[i];
00850 int dst_stride= i ? s->uvlinesize : s->linesize;
00851 int h_shift= i ? h_chroma_shift : 0;
00852 int v_shift= i ? v_chroma_shift : 0;
00853 int w= s->width >>h_shift;
00854 int h= s->height>>v_shift;
00855 uint8_t *src= pic_arg->data[i];
00856 uint8_t *dst= pic->data[i];
00857
00858 if(!s->avctx->rc_buffer_size)
00859 dst +=INPLACE_OFFSET;
00860
00861 if(src_stride==dst_stride)
00862 memcpy(dst, src, src_stride*h);
00863 else{
00864 while(h--){
00865 memcpy(dst, src, w);
00866 dst += dst_stride;
00867 src += src_stride;
00868 }
00869 }
00870 }
00871 }
00872 }
00873 copy_picture_attributes(s, pic, pic_arg);
00874 pic->pts= pts;
00875 }
00876
00877
00878 for(i=1; i<MAX_PICTURE_COUNT ; i++)
00879 s->input_picture[i-1]= s->input_picture[i];
00880
00881 s->input_picture[encoding_delay]= (Picture*)pic;
00882
00883 return 0;
00884 }
00885
00886 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){
00887 int x, y, plane;
00888 int score=0;
00889 int64_t score64=0;
00890
00891 for(plane=0; plane<3; plane++){
00892 const int stride= p->linesize[plane];
00893 const int bw= plane ? 1 : 2;
00894 for(y=0; y<s->mb_height*bw; y++){
00895 for(x=0; x<s->mb_width*bw; x++){
00896 int off= p->type == FF_BUFFER_TYPE_SHARED ? 0: 16;
00897 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);
00898
00899 switch(s->avctx->frame_skip_exp){
00900 case 0: score= FFMAX(score, v); break;
00901 case 1: score+= FFABS(v);break;
00902 case 2: score+= v*v;break;
00903 case 3: score64+= FFABS(v*v*(int64_t)v);break;
00904 case 4: score64+= v*v*(int64_t)(v*v);break;
00905 }
00906 }
00907 }
00908 }
00909
00910 if(score) score64= score;
00911
00912 if(score64 < s->avctx->frame_skip_threshold)
00913 return 1;
00914 if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8))
00915 return 1;
00916 return 0;
00917 }
00918
00919 static int estimate_best_b_count(MpegEncContext *s){
00920 AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id);
00921 AVCodecContext *c= avcodec_alloc_context();
00922 AVFrame input[FF_MAX_B_FRAMES+2];
00923 const int scale= s->avctx->brd_scale;
00924 int i, j, out_size, p_lambda, b_lambda, lambda2;
00925 int outbuf_size= s->width * s->height;
00926 uint8_t *outbuf= av_malloc(outbuf_size);
00927 int64_t best_rd= INT64_MAX;
00928 int best_b_count= -1;
00929
00930 assert(scale>=0 && scale <=3);
00931
00932
00933 p_lambda= s->last_lambda_for[P_TYPE];
00934 b_lambda= s->last_lambda_for[B_TYPE];
00935 if(!b_lambda) b_lambda= p_lambda;
00936 lambda2= (b_lambda*b_lambda + (1<<FF_LAMBDA_SHIFT)/2 ) >> FF_LAMBDA_SHIFT;
00937
00938 c->width = s->width >> scale;
00939 c->height= s->height>> scale;
00940 c->flags= CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR | CODEC_FLAG_INPUT_PRESERVED ;
00941 c->flags|= s->avctx->flags & CODEC_FLAG_QPEL;
00942 c->mb_decision= s->avctx->mb_decision;
00943 c->me_cmp= s->avctx->me_cmp;
00944 c->mb_cmp= s->avctx->mb_cmp;
00945 c->me_sub_cmp= s->avctx->me_sub_cmp;
00946 c->pix_fmt = PIX_FMT_YUV420P;
00947 c->time_base= s->avctx->time_base;
00948 c->max_b_frames= s->max_b_frames;
00949
00950 if (avcodec_open(c, codec) < 0)
00951 return -1;
00952
00953 for(i=0; i<s->max_b_frames+2; i++){
00954 int ysize= c->width*c->height;
00955 int csize= (c->width/2)*(c->height/2);
00956 Picture pre_input, *pre_input_ptr= i ? s->input_picture[i-1] : s->next_picture_ptr;
00957
00958 avcodec_get_frame_defaults(&input[i]);
00959 input[i].data[0]= av_malloc(ysize + 2*csize);
00960 input[i].data[1]= input[i].data[0] + ysize;
00961 input[i].data[2]= input[i].data[1] + csize;
00962 input[i].linesize[0]= c->width;
00963 input[i].linesize[1]=
00964 input[i].linesize[2]= c->width/2;
00965
00966 if(pre_input_ptr && (!i || s->input_picture[i-1])) {
00967 pre_input= *pre_input_ptr;
00968
00969 if(pre_input.type != FF_BUFFER_TYPE_SHARED && i) {
00970 pre_input.data[0]+=INPLACE_OFFSET;
00971 pre_input.data[1]+=INPLACE_OFFSET;
00972 pre_input.data[2]+=INPLACE_OFFSET;
00973 }
00974
00975 s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0], pre_input.data[0], pre_input.linesize[0], c->width, c->height);
00976 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);
00977 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);
00978 }
00979 }
00980
00981 for(j=0; j<s->max_b_frames+1; j++){
00982 int64_t rd=0;
00983
00984 if(!s->input_picture[j])
00985 break;
00986
00987 c->error[0]= c->error[1]= c->error[2]= 0;
00988
00989 input[0].pict_type= I_TYPE;
00990 input[0].quality= 1 * FF_QP2LAMBDA;
00991 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[0]);
00992
00993
00994 for(i=0; i<s->max_b_frames+1; i++){
00995 int is_p= i % (j+1) == j || i==s->max_b_frames;
00996
00997 input[i+1].pict_type= is_p ? P_TYPE : B_TYPE;
00998 input[i+1].quality= is_p ? p_lambda : b_lambda;
00999 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[i+1]);
01000 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
01001 }
01002
01003
01004 while(out_size){
01005 out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
01006 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
01007 }
01008
01009 rd += c->error[0] + c->error[1] + c->error[2];
01010
01011 if(rd < best_rd){
01012 best_rd= rd;
01013 best_b_count= j;
01014 }
01015 }
01016
01017 av_freep(&outbuf);
01018 avcodec_close(c);
01019 av_freep(&c);
01020
01021 for(i=0; i<s->max_b_frames+2; i++){
01022 av_freep(&input[i].data[0]);
01023 }
01024
01025 return best_b_count;
01026 }
01027
01028 static void select_input_picture(MpegEncContext *s){
01029 int i;
01030
01031 for(i=1; i<MAX_PICTURE_COUNT; i++)
01032 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
01033 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
01034
01035
01036 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
01037 if( s->next_picture_ptr==NULL || s->intra_only){
01038 s->reordered_input_picture[0]= s->input_picture[0];
01039 s->reordered_input_picture[0]->pict_type= I_TYPE;
01040 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
01041 }else{
01042 int b_frames;
01043
01044 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
01045 if(s->picture_in_gop_number < s->gop_size && skip_check(s, s->input_picture[0], s->next_picture_ptr)){
01046
01047
01048
01049 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
01050 for(i=0; i<4; i++)
01051 s->input_picture[0]->data[i]= NULL;
01052 s->input_picture[0]->type= 0;
01053 }else{
01054 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER
01055 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
01056
01057 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
01058 }
01059
01060 emms_c();
01061 ff_vbv_update(s, 0);
01062
01063 goto no_output_pic;
01064 }
01065 }
01066
01067 if(s->flags&CODEC_FLAG_PASS2){
01068 for(i=0; i<s->max_b_frames+1; i++){
01069 int pict_num= s->input_picture[0]->display_picture_number + i;
01070
01071 if(pict_num >= s->rc_context.num_entries)
01072 break;
01073 if(!s->input_picture[i]){
01074 s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
01075 break;
01076 }
01077
01078 s->input_picture[i]->pict_type=
01079 s->rc_context.entry[pict_num].new_pict_type;
01080 }
01081 }
01082
01083 if(s->avctx->b_frame_strategy==0){
01084 b_frames= s->max_b_frames;
01085 while(b_frames && !s->input_picture[b_frames]) b_frames--;
01086 }else if(s->avctx->b_frame_strategy==1){
01087 for(i=1; i<s->max_b_frames+1; i++){
01088 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
01089 s->input_picture[i]->b_frame_score=
01090 get_intra_count(s, s->input_picture[i ]->data[0],
01091 s->input_picture[i-1]->data[0], s->linesize) + 1;
01092 }
01093 }
01094 for(i=0; i<s->max_b_frames+1; i++){
01095 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/s->avctx->b_sensitivity) break;
01096 }
01097
01098 b_frames= FFMAX(0, i-1);
01099
01100
01101 for(i=0; i<b_frames+1; i++){
01102 s->input_picture[i]->b_frame_score=0;
01103 }
01104 }else if(s->avctx->b_frame_strategy==2){
01105 b_frames= estimate_best_b_count(s);
01106 }else{
01107 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
01108 b_frames=0;
01109 }
01110
01111 emms_c();
01112
01113
01114
01115
01116 for(i= b_frames - 1; i>=0; i--){
01117 int type= s->input_picture[i]->pict_type;
01118 if(type && type != B_TYPE)
01119 b_frames= i;
01120 }
01121 if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
01122 av_log(s->avctx, AV_LOG_ERROR, "warning, too many b frames in a row\n");
01123 }
01124
01125 if(s->picture_in_gop_number + b_frames >= s->gop_size){
01126 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
01127 b_frames= s->gop_size - s->picture_in_gop_number - 1;
01128 }else{
01129 if(s->flags & CODEC_FLAG_CLOSED_GOP)
01130 b_frames=0;
01131 s->input_picture[b_frames]->pict_type= I_TYPE;
01132 }
01133 }
01134
01135 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
01136 && b_frames
01137 && s->input_picture[b_frames]->pict_type== I_TYPE)
01138 b_frames--;
01139
01140 s->reordered_input_picture[0]= s->input_picture[b_frames];
01141 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
01142 s->reordered_input_picture[0]->pict_type= P_TYPE;
01143 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
01144 for(i=0; i<b_frames; i++){
01145 s->reordered_input_picture[i+1]= s->input_picture[i];
01146 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
01147 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
01148 }
01149 }
01150 }
01151 no_output_pic:
01152 if(s->reordered_input_picture[0]){
01153 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
01154
01155 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
01156
01157 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED || s->avctx->rc_buffer_size){
01158
01159
01160 int i= ff_find_unused_picture(s, 0);
01161 Picture *pic= &s->picture[i];
01162
01163 pic->reference = s->reordered_input_picture[0]->reference;
01164 alloc_picture(s, pic, 0);
01165
01166
01167 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_INTERNAL)
01168 s->avctx->release_buffer(s->avctx, (AVFrame*)s->reordered_input_picture[0]);
01169 for(i=0; i<4; i++)
01170 s->reordered_input_picture[0]->data[i]= NULL;
01171 s->reordered_input_picture[0]->type= 0;
01172
01173 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
01174
01175 s->current_picture_ptr= pic;
01176 }else{
01177
01178
01179 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
01180 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
01181
01182 s->current_picture_ptr= s->reordered_input_picture[0];
01183 for(i=0; i<4; i++){
01184 s->new_picture.data[i]+= INPLACE_OFFSET;
01185 }
01186 }
01187 copy_picture(&s->current_picture, s->current_picture_ptr);
01188
01189 s->picture_number= s->new_picture.display_picture_number;
01190
01191 }else{
01192 memset(&s->new_picture, 0, sizeof(Picture));
01193 }
01194 }
01195
01196 int MPV_encode_picture(AVCodecContext *avctx,
01197 unsigned char *buf, int buf_size, void *data)
01198 {
01199 MpegEncContext *s = avctx->priv_data;
01200 AVFrame *pic_arg = data;
01201 int i, stuffing_count;
01202
01203 for(i=0; i<avctx->thread_count; i++){
01204 int start_y= s->thread_context[i]->start_mb_y;
01205 int end_y= s->thread_context[i]-> end_mb_y;
01206 int h= s->mb_height;
01207 uint8_t *start= buf + (size_t)(((int64_t) buf_size)*start_y/h);
01208 uint8_t *end = buf + (size_t)(((int64_t) buf_size)* end_y/h);
01209
01210 init_put_bits(&s->thread_context[i]->pb, start, end - start);
01211 }
01212
01213 s->picture_in_gop_number++;
01214
01215 if(load_input_picture(s, pic_arg) < 0)
01216 return -1;
01217
01218 select_input_picture(s);
01219
01220
01221 if(s->new_picture.data[0]){
01222 s->pict_type= s->new_picture.pict_type;
01223
01224
01225 MPV_frame_start(s, avctx);
01226 vbv_retry:
01227 if (encode_picture(s, s->picture_number) < 0)
01228 return -1;
01229
01230 avctx->real_pict_num = s->picture_number;
01231 avctx->header_bits = s->header_bits;
01232 avctx->mv_bits = s->mv_bits;
01233 avctx->misc_bits = s->misc_bits;
01234 avctx->i_tex_bits = s->i_tex_bits;
01235 avctx->p_tex_bits = s->p_tex_bits;
01236 avctx->i_count = s->i_count;
01237 avctx->p_count = s->mb_num - s->i_count - s->skip_count;
01238 avctx->skip_count = s->skip_count;
01239
01240 MPV_frame_end(s);
01241
01242 if (ENABLE_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
01243 ff_mjpeg_encode_picture_trailer(s);
01244
01245 if(avctx->rc_buffer_size){
01246 RateControlContext *rcc= &s->rc_context;
01247 int max_size= rcc->buffer_index/3;
01248
01249 if(put_bits_count(&s->pb) > max_size && s->lambda < s->avctx->lmax){
01250 s->next_lambda= FFMAX(s->lambda+1, s->lambda*(s->qscale+1) / s->qscale);
01251 if(s->adaptive_quant){
01252 int i;
01253 for(i=0; i<s->mb_height*s->mb_stride; i++)
01254 s->lambda_table[i]= FFMAX(s->lambda_table[i]+1, s->lambda_table[i]*(s->qscale+1) / s->qscale);
01255 }
01256 s->mb_skipped = 0;
01257 if(s->pict_type==P_TYPE){
01258 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
01259 s->no_rounding ^= 1;
01260 }
01261 if(s->pict_type!=B_TYPE){
01262 s->time_base= s->last_time_base;
01263 s->last_non_b_time= s->time - s->pp_time;
01264 }
01265
01266 for(i=0; i<avctx->thread_count; i++){
01267 PutBitContext *pb= &s->thread_context[i]->pb;
01268 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
01269 }
01270 goto vbv_retry;
01271 }
01272
01273 assert(s->avctx->rc_max_rate);
01274 }
01275
01276 if(s->flags&CODEC_FLAG_PASS1)
01277 ff_write_pass1_stats(s);
01278
01279 for(i=0; i<4; i++){
01280 s->current_picture_ptr->error[i]= s->current_picture.error[i];
01281 avctx->error[i] += s->current_picture_ptr->error[i];
01282 }
01283
01284 if(s->flags&CODEC_FLAG_PASS1)
01285 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb));
01286 flush_put_bits(&s->pb);
01287 s->frame_bits = put_bits_count(&s->pb);
01288
01289 stuffing_count= ff_vbv_update(s, s->frame_bits);
01290 if(stuffing_count){
01291 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
01292 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
01293 return -1;
01294 }
01295
01296 switch(s->codec_id){
01297 case CODEC_ID_MPEG1VIDEO:
01298 case CODEC_ID_MPEG2VIDEO:
01299 while(stuffing_count--){
01300 put_bits(&s->pb, 8, 0);
01301 }
01302 break;
01303 case CODEC_ID_MPEG4:
01304 put_bits(&s->pb, 16, 0);
01305 put_bits(&s->pb, 16, 0x1C3);
01306 stuffing_count -= 4;
01307 while(stuffing_count--){
01308 put_bits(&s->pb, 8, 0xFF);
01309 }
01310 break;
01311 default:
01312 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
01313 }
01314 flush_put_bits(&s->pb);
01315 s->frame_bits = put_bits_count(&s->pb);
01316 }
01317
01318
01319 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
01320 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
01321 int vbv_delay;
01322
01323 assert(s->repeat_first_field==0);
01324
01325 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
01326 assert(vbv_delay < 0xFFFF);
01327
01328 s->vbv_delay_ptr[0] &= 0xF8;
01329 s->vbv_delay_ptr[0] |= vbv_delay>>13;
01330 s->vbv_delay_ptr[1] = vbv_delay>>5;
01331 s->vbv_delay_ptr[2] &= 0x07;
01332 s->vbv_delay_ptr[2] |= vbv_delay<<3;
01333 }
01334 s->total_bits += s->frame_bits;
01335 avctx->frame_bits = s->frame_bits;
01336 }else{
01337 assert((pbBufPtr(&s->pb) == s->pb.buf));
01338 s->frame_bits=0;
01339 }
01340 assert((s->frame_bits&7)==0);
01341
01342 return s->frame_bits/8;
01343 }
01344
01345 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
01346 {
01347 static const char tab[64]=
01348 {3,2,2,1,1,1,1,1,
01349 1,1,1,1,1,1,1,1,
01350 1,1,1,1,1,1,1,1,
01351 0,0,0,0,0,0,0,0,
01352 0,0,0,0,0,0,0,0,
01353 0,0,0,0,0,0,0,0,
01354 0,0,0,0,0,0,0,0,
01355 0,0,0,0,0,0,0,0};
01356 int score=0;
01357 int run=0;
01358 int i;
01359 DCTELEM *block= s->block[n];
01360 const int last_index= s->block_last_index[n];
01361 int skip_dc;
01362
01363 if(threshold<0){
01364 skip_dc=0;
01365 threshold= -threshold;
01366 }else
01367 skip_dc=1;
01368
01369
01370 if(last_index<=skip_dc - 1) return;
01371
01372 for(i=0; i<=last_index; i++){
01373 const int j = s->intra_scantable.permutated[i];
01374 const int level = FFABS(block[j]);
01375 if(level==1){
01376 if(skip_dc && i==0) continue;
01377 score+= tab[run];
01378 run=0;
01379 }else if(level>1){
01380 return;
01381 }else{
01382 run++;
01383 }
01384 }
01385 if(score >= threshold) return;
01386 for(i=skip_dc; i<=last_index; i++){
01387 const int j = s->intra_scantable.permutated[i];
01388 block[j]=0;
01389 }
01390 if(block[0]) s->block_last_index[n]= 0;
01391 else s->block_last_index[n]= -1;
01392 }
01393
01394 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
01395 {
01396 int i;
01397 const int maxlevel= s->max_qcoeff;
01398 const int minlevel= s->min_qcoeff;
01399 int overflow=0;
01400
01401 if(s->mb_intra){
01402 i=1;
01403 }else
01404 i=0;
01405
01406 for(;i<=last_index; i++){
01407 const int j= s->intra_scantable.permutated[i];
01408 int level = block[j];
01409
01410 if (level>maxlevel){
01411 level=maxlevel;
01412 overflow++;
01413 }else if(level<minlevel){
01414 level=minlevel;
01415 overflow++;
01416 }
01417
01418 block[j]= level;
01419 }
01420
01421 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
01422 av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);
01423 }
01424
01425 static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride){
01426 int x, y;
01427
01428 for(y=0; y<8; y++){
01429 for(x=0; x<8; x++){
01430 int x2, y2;
01431 int sum=0;
01432 int sqr=0;
01433 int count=0;
01434
01435 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
01436 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
01437 int v= ptr[x2 + y2*stride];
01438 sum += v;
01439 sqr += v*v;
01440 count++;
01441 }
01442 }
01443 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
01444 }
01445 }
01446 }
01447
01448 static av_always_inline void encode_mb_internal(MpegEncContext *s, int motion_x, int motion_y, int mb_block_height, int mb_block_count)
01449 {
01450 int16_t weight[8][64];
01451 DCTELEM orig[8][64];
01452 const int mb_x= s->mb_x;
01453 const int mb_y= s->mb_y;
01454 int i;
01455 int skip_dct[8];
01456 int dct_offset = s->linesize*8;
01457 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
01458 int wrap_y, wrap_c;
01459
01460 for(i=0; i<mb_block_count; i++) skip_dct[i]=s->skipdct;
01461
01462 if(s->adaptive_quant){
01463 const int last_qp= s->qscale;
01464 const int mb_xy= mb_x + mb_y*s->mb_stride;
01465
01466 s->lambda= s->lambda_table[mb_xy];
01467 update_qscale(s);
01468
01469 if(!(s->flags&CODEC_FLAG_QP_RD)){
01470 s->qscale= s->current_picture_ptr->qscale_table[mb_xy];
01471 s->dquant= s->qscale - last_qp;
01472
01473 if(s->out_format==FMT_H263){
01474 s->dquant= av_clip(s->dquant, -2, 2);
01475
01476 if(s->codec_id==CODEC_ID_MPEG4){
01477 if(!s->mb_intra){
01478 if(s->pict_type == B_TYPE){
01479 if(s->dquant&1 || s->mv_dir&MV_DIRECT)
01480 s->dquant= 0;
01481 }
01482 if(s->mv_type==MV_TYPE_8X8)
01483 s->dquant=0;
01484 }
01485 }
01486 }
01487 }
01488 ff_set_qscale(s, last_qp + s->dquant);
01489 }else if(s->flags&CODEC_FLAG_QP_RD)
01490 ff_set_qscale(s, s->qscale + s->dquant);
01491
01492 wrap_y = s->linesize;
01493 wrap_c = s->uvlinesize;
01494 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
01495 ptr_cb = s->new_picture.data[1] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
01496 ptr_cr = s->new_picture.data[2] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
01497
01498 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
01499 uint8_t *ebuf= s->edge_emu_buffer + 32;
01500 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
01501 ptr_y= ebuf;
01502 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);
01503 ptr_cb= ebuf+18*wrap_y;
01504 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);
01505 ptr_cr= ebuf+18*wrap_y+8;
01506 }
01507
01508 if (s->mb_intra) {
01509 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
01510 int progressive_score, interlaced_score;
01511
01512 s->interlaced_dct=0;
01513 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
01514 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
01515
01516 if(progressive_score > 0){
01517 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
01518 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
01519 if(progressive_score > interlaced_score){
01520 s->interlaced_dct=1;
01521
01522 dct_offset= wrap_y;
01523 wrap_y<<=1;
01524 if (s->chroma_format == CHROMA_422)
01525 wrap_c<<=1;
01526 }
01527 }
01528 }
01529
01530 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
01531 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
01532 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
01533 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
01534
01535 if(s->flags&CODEC_FLAG_GRAY){
01536 skip_dct[4]= 1;
01537 skip_dct[5]= 1;
01538 }else{
01539 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
01540 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
01541 if(!s->chroma_y_shift){
01542 s->dsp.get_pixels(s->block[6], ptr_cb + (dct_offset>>1), wrap_c);
01543 s->dsp.get_pixels(s->block[7], ptr_cr + (dct_offset>>1), wrap_c);
01544 }
01545 }
01546 }else{
01547 op_pixels_func (*op_pix)[4];
01548 qpel_mc_func (*op_qpix)[16];
01549 uint8_t *dest_y, *dest_cb, *dest_cr;
01550
01551 dest_y = s->dest[0];
01552 dest_cb = s->dest[1];
01553 dest_cr = s->dest[2];
01554
01555 if ((!s->no_rounding) || s->pict_type==B_TYPE){
01556 op_pix = s->dsp.put_pixels_tab;
01557 op_qpix= s->dsp.put_qpel_pixels_tab;
01558 }else{
01559 op_pix = s->dsp.put_no_rnd_pixels_tab;
01560 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
01561 }
01562
01563 if (s->mv_dir & MV_DIR_FORWARD) {
01564 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
01565 op_pix = s->dsp.avg_pixels_tab;
01566 op_qpix= s->dsp.avg_qpel_pixels_tab;
01567 }
01568 if (s->mv_dir & MV_DIR_BACKWARD) {
01569 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
01570 }
01571
01572 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
01573 int progressive_score, interlaced_score;
01574
01575 s->interlaced_dct=0;
01576 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
01577 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
01578
01579 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
01580
01581 if(progressive_score>0){
01582 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
01583 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
01584
01585 if(progressive_score > interlaced_score){
01586 s->interlaced_dct=1;
01587
01588 dct_offset= wrap_y;
01589 wrap_y<<=1;
01590 if (s->chroma_format == CHROMA_422)
01591 wrap_c<<=1;
01592 }
01593 }
01594 }
01595
01596 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
01597 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
01598 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
01599 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
01600
01601 if(s->flags&CODEC_FLAG_GRAY){
01602 skip_dct[4]= 1;
01603 skip_dct[5]= 1;
01604 }else{
01605 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
01606 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
01607 if(!s->chroma_y_shift){
01608 s->dsp.diff_pixels(s->block[6], ptr_cb + (dct_offset>>1), dest_cb + (dct_offset>>1), wrap_c);
01609 s->dsp.diff_pixels(s->block[7], ptr_cr + (dct_offset>>1), dest_cr + (dct_offset>>1), wrap_c);
01610 }
01611 }
01612
01613 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
01614
01615 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
01616 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
01617 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
01618 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;
01619 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
01620 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
01621 if(!s->chroma_y_shift){
01622 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;
01623 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;
01624 }
01625 }
01626 }
01627
01628 if(s->avctx->quantizer_noise_shaping){
01629 if(!skip_dct[0]) get_visual_weight(weight[0], ptr_y , wrap_y);
01630 if(!skip_dct[1]) get_visual_weight(weight[1], ptr_y + 8, wrap_y);
01631 if(!skip_dct[2]) get_visual_weight(weight[2], ptr_y + dct_offset , wrap_y);
01632 if(!skip_dct[3]) get_visual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
01633 if(!skip_dct[4]) get_visual_weight(weight[4], ptr_cb , wrap_c);
01634 if(!skip_dct[5]) get_visual_weight(weight[5], ptr_cr , wrap_c);
01635 if(!s->chroma_y_shift){
01636 if(!skip_dct[6]) get_visual_weight(weight[6], ptr_cb + (dct_offset>>1), wrap_c);
01637 if(!skip_dct[7]) get_visual_weight(weight[7], ptr_cr + (dct_offset>>1), wrap_c);
01638 }
01639 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*mb_block_count);
01640 }
01641
01642
01643 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
01644 {
01645 for(i=0;i<mb_block_count;i++) {
01646 if(!skip_dct[i]){
01647 int overflow;
01648 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
01649
01650
01651
01652 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
01653 }else
01654 s->block_last_index[i]= -1;
01655 }
01656 if(s->avctx->quantizer_noise_shaping){
01657 for(i=0;i<mb_block_count;i++) {
01658 if(!skip_dct[i]){
01659 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
01660 }
01661 }
01662 }
01663
01664 if(s->luma_elim_threshold && !s->mb_intra)
01665 for(i=0; i<4; i++)
01666 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
01667 if(s->chroma_elim_threshold && !s->mb_intra)
01668 for(i=4; i<mb_block_count; i++)
01669 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
01670
01671 if(s->flags & CODEC_FLAG_CBP_RD){
01672 for(i=0;i<mb_block_count;i++) {
01673 if(s->block_last_index[i] == -1)
01674 s->coded_score[i]= INT_MAX/256;
01675 }
01676 }
01677 }
01678
01679 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
01680 s->block_last_index[4]=
01681 s->block_last_index[5]= 0;
01682 s->block[4][0]=
01683 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
01684 }
01685
01686
01687 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
01688 for(i=0; i<mb_block_count; i++){
01689 int j;
01690 if(s->block_last_index[i]>0){
01691 for(j=63; j>0; j--){
01692 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
01693 }
01694 s->block_last_index[i]= j;
01695 }
01696 }
01697 }
01698
01699
01700 switch(s->codec_id){
01701 case CODEC_ID_MPEG1VIDEO:
01702 case CODEC_ID_MPEG2VIDEO:
01703 if (ENABLE_MPEG1VIDEO_ENCODER || ENABLE_MPEG2VIDEO_ENCODER)
01704 mpeg1_encode_mb(s, s->block, motion_x, motion_y);
01705 break;
01706 case CODEC_ID_MPEG4:
01707 if (ENABLE_MPEG4_ENCODER)
01708 mpeg4_encode_mb(s, s->block, motion_x, motion_y);
01709 break;
01710 case CODEC_ID_MSMPEG4V2:
01711 case CODEC_ID_MSMPEG4V3:
01712 case CODEC_ID_WMV1:
01713 if (ENABLE_MSMPEG4_ENCODER)
01714 msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
01715 break;
01716 case CODEC_ID_WMV2:
01717 if (ENABLE_WMV2_ENCODER)
01718 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
01719 break;
01720 case CODEC_ID_H261:
01721 if (ENABLE_H261_ENCODER)
01722 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
01723 break;
01724 case CODEC_ID_H263:
01725 case CODEC_ID_H263P:
01726 case CODEC_ID_FLV1:
01727 case CODEC_ID_RV10:
01728 case CODEC_ID_RV20:
01729 if (ENABLE_H263_ENCODER || ENABLE_H263P_ENCODER ||
01730 ENABLE_FLV_ENCODER || ENABLE_RV10_ENCODER || ENABLE_RV20_ENCODER)
01731 h263_encode_mb(s, s->block, motion_x, motion_y);
01732 break;
01733 case CODEC_ID_MJPEG:
01734 if (ENABLE_MJPEG_ENCODER)
01735 ff_mjpeg_encode_mb(s, s->block);
01736 break;
01737 default:
01738 assert(0);
01739 }
01740 }
01741
01742 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
01743 {
01744 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
01745 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
01746 }
01747
01748 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
01749 int i;
01750
01751 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int));
01752
01753
01754 d->mb_skip_run= s->mb_skip_run;
01755 for(i=0; i<3; i++)
01756 d->last_dc[i]= s->last_dc[i];
01757
01758
01759 d->mv_bits= s->mv_bits;
01760 d->i_tex_bits= s->i_tex_bits;
01761 d->p_tex_bits= s->p_tex_bits;
01762 d->i_count= s->i_count;
01763 d->f_count= s->f_count;
01764 d->b_count= s->b_count;
01765 d->skip_count= s->skip_count;
01766 d->misc_bits= s->misc_bits;
01767 d->last_bits= 0;
01768
01769 d->mb_skipped= 0;
01770 d->qscale= s->qscale;
01771 d->dquant= s->dquant;
01772 }
01773
01774 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
01775 int i;
01776
01777 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
01778 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int));
01779
01780
01781 d->mb_skip_run= s->mb_skip_run;
01782 for(i=0; i<3; i++)
01783 d->last_dc[i]= s->last_dc[i];
01784
01785
01786 d->mv_bits= s->mv_bits;
01787 d->i_tex_bits= s->i_tex_bits;
01788 d->p_tex_bits= s->p_tex_bits;
01789 d->i_count= s->i_count;
01790 d->f_count= s->f_count;
01791 d->b_count= s->b_count;
01792 d->skip_count= s->skip_count;
01793 d->misc_bits= s->misc_bits;
01794
01795 d->mb_intra= s->mb_intra;
01796 d->mb_skipped= s->mb_skipped;
01797 d->mv_type= s->mv_type;
01798 d->mv_dir= s->mv_dir;
01799 d->pb= s->pb;
01800 if(s->data_partitioning){
01801 d->pb2= s->pb2;
01802 d->tex_pb= s->tex_pb;
01803 }
01804 d->block= s->block;
01805 for(i=0; i<8; i++)
01806 d->block_last_index[i]= s->block_last_index[i];
01807 d->interlaced_dct= s->interlaced_dct;
01808 d->qscale= s->qscale;
01809 }
01810
01811 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
01812 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
01813 int *dmin, int *next_block, int motion_x, int motion_y)
01814 {
01815 int score;
01816 uint8_t *dest_backup[3];
01817
01818 copy_context_before_encode(s, backup, type);
01819
01820 s->block= s->blocks[*next_block];
01821 s->pb= pb[*next_block];
01822 if(s->data_partitioning){
01823 s->pb2 = pb2 [*next_block];
01824 s->tex_pb= tex_pb[*next_block];
01825 }
01826
01827 if(*next_block){
01828 memcpy(dest_backup, s->dest, sizeof(s->dest));
01829 s->dest[0] = s->rd_scratchpad;
01830 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
01831 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
01832 assert(s->linesize >= 32);
01833 }
01834
01835 encode_mb(s, motion_x, motion_y);
01836
01837 score= put_bits_count(&s->pb);
01838 if(s->data_partitioning){
01839 score+= put_bits_count(&s->pb2);
01840 score+= put_bits_count(&s->tex_pb);
01841 }
01842
01843 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
01844 MPV_decode_mb(s, s->block);
01845
01846 score *= s->lambda2;
01847 score += sse_mb(s) << FF_LAMBDA_SHIFT;
01848 }
01849
01850 if(*next_block){
01851 memcpy(s->dest, dest_backup, sizeof(s->dest));
01852 }
01853
01854 if(score<*dmin){
01855 *dmin= score;
01856 *next_block^=1;
01857
01858 copy_context_after_encode(best, s, type);
01859 }
01860 }
01861
01862 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
01863 uint32_t *sq = ff_squareTbl + 256;
01864 int acc=0;
01865 int x,y;
01866
01867 if(w==16 && h==16)
01868 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
01869 else if(w==8 && h==8)
01870 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
01871
01872 for(y=0; y<h; y++){
01873 for(x=0; x<w; x++){
01874 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
01875 }
01876 }
01877
01878 assert(acc>=0);
01879
01880 return acc;
01881 }
01882
01883 static int sse_mb(MpegEncContext *s){
01884 int w= 16;
01885 int h= 16;
01886
01887 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
01888 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
01889
01890 if(w==16 && h==16)
01891 if(s->avctx->mb_cmp == FF_CMP_NSSE){
01892 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)
01893 +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)
01894 +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);
01895 }else{
01896 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)
01897 +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)
01898 +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);
01899 }
01900 else
01901 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)
01902 +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)
01903 +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);
01904 }
01905
01906 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
01907 MpegEncContext *s= arg;
01908
01909
01910 s->me.pre_pass=1;
01911 s->me.dia_size= s->avctx->pre_dia_size;
01912 s->first_slice_line=1;
01913 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
01914 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
01915 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
01916 }
01917 s->first_slice_line=0;
01918 }
01919
01920 s->me.pre_pass=0;
01921
01922 return 0;
01923 }
01924
01925 static int estimate_motion_thread(AVCodecContext *c, void *arg){
01926 MpegEncContext *s= arg;
01927
01928 ff_check_alignment();
01929
01930 s->me.dia_size= s->avctx->dia_size;
01931 s->first_slice_line=1;
01932 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
01933 s->mb_x=0;
01934 ff_init_block_index(s);
01935 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
01936 s->block_index[0]+=2;
01937 s->block_index[1]+=2;
01938 s->block_index[2]+=2;
01939 s->block_index[3]+=2;
01940
01941
01942 if(s->pict_type==B_TYPE)
01943 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
01944 else
01945 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
01946 }
01947 s->first_slice_line=0;
01948 }
01949 return 0;
01950 }
01951
01952 static int mb_var_thread(AVCodecContext *c, void *arg){
01953 MpegEncContext *s= arg;
01954 int mb_x, mb_y;
01955
01956 ff_check_alignment();
01957
01958 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
01959 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
01960 int xx = mb_x * 16;
01961 int yy = mb_y * 16;
01962 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
01963 int varc;
01964 int sum = s->dsp.pix_sum(pix, s->linesize);
01965
01966 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
01967
01968 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
01969 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
01970 s->me.mb_var_sum_temp += varc;
01971 }
01972 }
01973 return 0;
01974 }
01975
01976 static void write_slice_end(MpegEncContext *s){
01977 if(ENABLE_MPEG4_ENCODER && s->codec_id==CODEC_ID_MPEG4){
01978 if(s->partitioned_frame){
01979 ff_mpeg4_merge_partitions(s);
01980 }
01981
01982 ff_mpeg4_stuffing(&s->pb);
01983 }else if(ENABLE_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
01984 ff_mjpeg_encode_stuffing(&s->pb);
01985 }
01986
01987 align_put_bits(&s->pb);
01988 flush_put_bits(&s->pb);
01989
01990 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
01991 s->misc_bits+= get_bits_diff(s);
01992 }
01993
01994 static int encode_thread(AVCodecContext *c, void *arg){
01995 MpegEncContext *s= arg;
01996 int mb_x, mb_y, pdif = 0;
01997 int i, j;
01998 MpegEncContext best_s, backup_s;
01999 uint8_t bit_buf[2][MAX_MB_BYTES];
02000 uint8_t bit_buf2[2][MAX_MB_BYTES];
02001 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
02002 PutBitContext pb[2], pb2[2], tex_pb[2];
02003
02004
02005 ff_check_alignment();
02006
02007 for(i=0; i<2; i++){
02008 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
02009 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
02010 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
02011 }
02012
02013 s->last_bits= put_bits_count(&s->pb);
02014 s->mv_bits=0;
02015 s->misc_bits=0;
02016 s->i_tex_bits=0;
02017 s->p_tex_bits=0;
02018 s->i_count=0;
02019 s->f_count=0;
02020 s->b_count=0;
02021 s->skip_count=0;
02022
02023 for(i=0; i<3; i++){
02024
02025
02026 s->last_dc[i] = 128 << s->intra_dc_precision;
02027
02028 s->current_picture.error[i] = 0;
02029 }
02030 s->mb_skip_run = 0;
02031 memset(s->last_mv, 0, sizeof(s->last_mv));
02032
02033 s->last_mv_dir = 0;
02034
02035 switch(s->codec_id){
02036 case CODEC_ID_H263:
02037 case CODEC_ID_H263P:
02038 case CODEC_ID_FLV1:
02039 if (ENABLE_H263_ENCODER || ENABLE_H263P_ENCODER || ENABLE_FLV_ENCODER)
02040 s->gob_index = ff_h263_get_gob_height(s);
02041 break;
02042 case CODEC_ID_MPEG4:
02043 if(ENABLE_MPEG4_ENCODER && s->partitioned_frame)
02044 ff_mpeg4_init_partitions(s);
02045 break;
02046 }
02047
02048 s->resync_mb_x=0;
02049 s->resync_mb_y=0;
02050 s->first_slice_line = 1;
02051 s->ptr_lastgob = s->pb.buf;
02052 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
02053
02054 s->mb_x=0;
02055 s->mb_y= mb_y;
02056
02057 ff_set_qscale(s, s->qscale);
02058 ff_init_block_index(s);
02059
02060 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
02061 int xy= mb_y*s->mb_stride + mb_x;
02062 int mb_type= s->mb_type[xy];
02063
02064 int dmin= INT_MAX;
02065 int dir;
02066
02067 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
02068 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
02069 return -1;
02070 }
02071 if(s->data_partitioning){
02072 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
02073 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
02074 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
02075 return -1;
02076 }
02077 }
02078
02079 s->mb_x = mb_x;
02080 s->mb_y = mb_y;
02081 ff_update_block_index(s);
02082
02083 if(ENABLE_H261_ENCODER && s->codec_id == CODEC_ID_H261){
02084 ff_h261_reorder_mb_index(s);
02085 xy= s->mb_y*s->mb_stride + s->mb_x;
02086 mb_type= s->mb_type[xy];
02087 }
02088
02089
02090 if(s->rtp_mode){
02091 int current_packet_size, is_gob_start;
02092
02093 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
02094
02095 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
02096
02097 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
02098
02099 switch(s->codec_id){
02100 case CODEC_ID_H263:
02101 case CODEC_ID_H263P:
02102 if(!s->h263_slice_structured)
02103 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
02104 break;
02105 case CODEC_ID_MPEG2VIDEO:
02106 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
02107 case CODEC_ID_MPEG1VIDEO:
02108 if(s->mb_skip_run) is_gob_start=0;
02109 break;
02110 }
02111
02112 if(is_gob_start){
02113 if(s->start_mb_y != mb_y || mb_x!=0){
02114 write_slice_end(s);
02115
02116 if(ENABLE_MPEG4_ENCODER && s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
02117 ff_mpeg4_init_partitions(s);
02118 }
02119 }
02120
02121 assert((put_bits_count(&s->pb)&7) == 0);
02122 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
02123
02124 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
02125 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
02126 int d= 100 / s->avctx->error_rate;
02127 if(r % d == 0){
02128 current_packet_size=0;
02129 #ifndef ALT_BITSTREAM_WRITER
02130 s->pb.buf_ptr= s->ptr_lastgob;
02131 #endif
02132 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
02133 }
02134 }
02135
02136 if (s->avctx->rtp_callback){
02137 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
02138 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
02139 }
02140
02141 switch(s->codec_id){
02142 case CODEC_ID_MPEG4:
02143 if (ENABLE_MPEG4_ENCODER) {
02144 ff_mpeg4_encode_video_packet_header(s);
02145 ff_mpeg4_clean_buffers(s);
02146 }
02147 break;
02148 case CODEC_ID_MPEG1VIDEO:
02149 case CODEC_ID_MPEG2VIDEO:
02150 if (ENABLE_MPEG1VIDEO_ENCODER || ENABLE_MPEG2VIDEO_ENCODER) {
02151 ff_mpeg1_encode_slice_header(s);
02152 ff_mpeg1_clean_buffers(s);
02153 }
02154 break;
02155 case CODEC_ID_H263:
02156 case CODEC_ID_H263P:
02157 if (ENABLE_H263_ENCODER || ENABLE_H263P_ENCODER)
02158 h263_encode_gob_header(s, mb_y);
02159 break;
02160 }
02161
02162 if(s->flags&CODEC_FLAG_PASS1){
02163 int bits= put_bits_count(&s->pb);
02164 s->misc_bits+= bits - s->last_bits;
02165 s->last_bits= bits;
02166 }
02167
02168 s->ptr_lastgob += current_packet_size;
02169 s->first_slice_line=1;
02170 s->resync_mb_x=mb_x;
02171 s->resync_mb_y=mb_y;
02172 }
02173 }
02174
02175 if( (s->resync_mb_x == s->mb_x)
02176 && s->resync_mb_y+1 == s->mb_y){
02177 s->first_slice_line=0;
02178 }
02179
02180 s->mb_skipped=0;
02181 s->dquant=0;
02182
02183 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){
02184 int next_block=0;
02185 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
02186
02187 copy_context_before_encode(&backup_s, s, -1);
02188 backup_s.pb= s->pb;
02189 best_s.data_partitioning= s->data_partitioning;
02190 best_s.partitioned_frame= s->partitioned_frame;
02191 if(s->data_partitioning){
02192 backup_s.pb2= s->pb2;
02193 backup_s.tex_pb= s->tex_pb;
02194 }
02195
02196 if(mb_type&CANDIDATE_MB_TYPE_INTER){
02197 s->mv_dir = MV_DIR_FORWARD;
02198 s->mv_type = MV_TYPE_16X16;
02199 s->mb_intra= 0;
02200 s->mv[0][0][0] = s->p_mv_table[xy][0];
02201 s->mv[0][0][1] = s->p_mv_table[xy][1];
02202 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
02203 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
02204 }
02205 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
02206 s->mv_dir = MV_DIR_FORWARD;
02207 s->mv_type = MV_TYPE_FIELD;
02208 s->mb_intra= 0;
02209 for(i=0; i<2; i++){
02210 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
02211 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
02212 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
02213 }
02214 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
02215 &dmin, &next_block, 0, 0);
02216 }
02217 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
02218 s->mv_dir = MV_DIR_FORWARD;
02219 s->mv_type = MV_TYPE_16X16;
02220 s->mb_intra= 0;
02221 s->mv[0][0][0] = 0;
02222 s->mv[0][0][1] = 0;
02223 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
02224 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
02225 }
02226 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
02227 s->mv_dir = MV_DIR_FORWARD;
02228 s->mv_type = MV_TYPE_8X8;
02229 s->mb_intra= 0;
02230 for(i=0; i<4; i++){
02231 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
02232 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
02233 }
02234 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
02235 &dmin, &next_block, 0, 0);
02236 }
02237 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
02238 s->mv_dir = MV_DIR_FORWARD;
02239 s->mv_type = MV_TYPE_16X16;
02240 s->mb_intra= 0;
02241 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
02242 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
02243 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
02244 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
02245 }
02246 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
02247 s->mv_dir = MV_DIR_BACKWARD;
02248 s->mv_type = MV_TYPE_16X16;
02249 s->mb_intra= 0;
02250 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
02251 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
02252 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
02253 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
02254 }
02255 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
02256 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
02257 s->mv_type = MV_TYPE_16X16;
02258 s->mb_intra= 0;
02259 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
02260 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
02261 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
02262 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
02263 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
02264 &dmin, &next_block, 0, 0);
02265 }
02266 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
02267 s->mv_dir = MV_DIR_FORWARD;
02268 s->mv_type = MV_TYPE_FIELD;
02269 s->mb_intra= 0;
02270 for(i=0; i<2; i++){
02271 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
02272 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
02273 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
02274 }
02275 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
02276 &dmin, &next_block, 0, 0);
02277 }
02278 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
02279 s->mv_dir = MV_DIR_BACKWARD;
02280 s->mv_type = MV_TYPE_FIELD;
02281 s->mb_intra= 0;
02282 for(i=0; i<2; i++){
02283 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
02284 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
02285 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
02286 }
02287 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
02288 &dmin, &next_block, 0, 0);
02289 }
02290 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
02291 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
02292 s->mv_type = MV_TYPE_FIELD;
02293 s->mb_intra= 0;
02294 for(dir=0; dir<2; dir++){
02295 for(i=0; i<2; i++){
02296 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
02297 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
02298 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
02299 }
02300 }
02301 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
02302 &dmin, &next_block, 0, 0);
02303 }
02304 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
02305 s->mv_dir = 0;
02306 s->mv_type = MV_TYPE_16X16;
02307 s->mb_intra= 1;
02308 s->mv[0][0][0] = 0;
02309 s->mv[0][0][1] = 0;
02310 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
02311 &dmin, &next_block, 0, 0);
02312 if(s->h263_pred || s->h263_aic){
02313 if(best_s.mb_intra)
02314 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
02315 else
02316 ff_clean_intra_table_entries(s);
02317 }
02318 }
02319
02320 if((s->flags & CODEC_FLAG_QP_RD) && dmin < INT_MAX){
02321 if(best_s.mv_type==MV_TYPE_16X16){
02322 const int last_qp= backup_s.qscale;
02323 int qpi, qp, dc[6];
02324 DCTELEM ac[6][16];
02325 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
02326 static const int dquant_tab[4]={-1,1,-2,2};
02327
02328 assert(backup_s.dquant == 0);
02329
02330
02331 s->mv_dir= best_s.mv_dir;
02332 s->mv_type = MV_TYPE_16X16;
02333 s->mb_intra= best_s.mb_intra;
02334 s->mv[0][0][0] = best_s.mv[0][0][0];
02335 s->mv[0][0][1] = best_s.mv[0][0][1];
02336 s->mv[1][0][0] = best_s.mv[1][0][0];
02337 s->mv[1][0][1] = best_s.mv[1][0][1];
02338
02339 qpi = s->pict_type == B_TYPE ? 2 : 0;
02340 for(; qpi<4; qpi++){
02341 int dquant= dquant_tab[qpi];
02342 qp= last_qp + dquant;
02343 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
02344 continue;
02345 backup_s.dquant= dquant;
02346 if(s->mb_intra && s->dc_val[0]){
02347 for(i=0; i<6; i++){
02348 dc[i]= s->dc_val[0][ s->block_index[i] ];
02349 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
02350 }
02351 }
02352
02353 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER , pb, pb2, tex_pb,
02354 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
02355 if(best_s.qscale != qp){
02356 if(s->mb_intra && s->dc_val[0]){
02357 for(i=0; i<6; i++){
02358 s->dc_val[0][ s->block_index[i] ]= dc[i];
02359 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
02360 }
02361 }
02362 }
02363 }
02364 }
02365 }
02366 if(ENABLE_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT){
02367 int mx= s->b_direct_mv_table[xy][0];
02368 int my= s->b_direct_mv_table[xy][1];
02369
02370 backup_s.dquant = 0;
02371 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
02372 s->mb_intra= 0;
02373 ff_mpeg4_set_direct_mv(s, mx, my);
02374 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
02375 &dmin, &next_block, mx, my);
02376 }
02377 if(ENABLE_MPEG4_ENCODER && mb_type&CANDIDATE_MB_TYPE_DIRECT0){
02378 backup_s.dquant = 0;
02379 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
02380 s->mb_intra= 0;
02381 ff_mpeg4_set_direct_mv(s, 0, 0);
02382 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
02383 &dmin, &next_block, 0, 0);
02384 }
02385 if(!best_s.mb_intra && s->flags2&CODEC_FLAG2_SKIP_RD){
02386 int coded=0;
02387 for(i=0; i<6; i++)
02388 coded |= s->block_last_index[i];
02389 if(coded){
02390 int mx,my;
02391 memcpy(s->mv, best_s.mv, sizeof(s->mv));
02392 if(ENABLE_MPEG4_ENCODER && best_s.mv_dir & MV_DIRECT){
02393 mx=my=0;
02394 ff_mpeg4_set_direct_mv(s, mx, my);
02395 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
02396 mx= s->mv[1][0][0];
02397 my= s->mv[1][0][1];
02398 }else{
02399 mx= s->mv[0][0][0];
02400 my= s->mv[0][0][1];
02401 }
02402
02403 s->mv_dir= best_s.mv_dir;
02404 s->mv_type = best_s.mv_type;
02405 s->mb_intra= 0;
02406
02407
02408
02409
02410 backup_s.dquant= 0;
02411 s->skipdct=1;
02412 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER , pb, pb2, tex_pb,
02413 &dmin, &next_block, mx, my);
02414 s->skipdct=0;
02415 }
02416 }
02417
02418 s->current_picture.qscale_table[xy]= best_s.qscale;
02419
02420 copy_context_after_encode(s, &best_s, -1);
02421
02422 pb_bits_count= put_bits_count(&s->pb);
02423 flush_put_bits(&s->pb);
02424 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
02425 s->pb= backup_s.pb;
02426
02427 if(s->data_partitioning){
02428 pb2_bits_count= put_bits_count(&s->pb2);
02429 flush_put_bits(&s->pb2);
02430 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
02431 s->pb2= backup_s.pb2;
02432
02433 tex_pb_bits_count= put_bits_count(&s->tex_pb);
02434 flush_put_bits(&s->tex_pb);
02435 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
02436 s->tex_pb= backup_s.tex_pb;
02437 }
02438 s->last_bits= put_bits_count(&s->pb);
02439
02440 if (ENABLE_ANY_H263_ENCODER &&
02441 s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
02442 ff_h263_update_motion_val(s);
02443
02444 if(next_block==0){
02445 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
02446 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
02447 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
02448 }
02449
02450 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
02451 MPV_decode_mb(s, s->block);
02452 } else {
02453 int motion_x = 0, motion_y = 0;
02454 s->mv_type=MV_TYPE_16X16;
02455
02456
02457 switch(mb_type){
02458 case CANDIDATE_MB_TYPE_INTRA:
02459 s->mv_dir = 0;
02460 s->mb_intra= 1;
02461 motion_x= s->mv[0][0][0] = 0;
02462 motion_y= s->mv[0][0][1] = 0;
02463 break;
02464 case CANDIDATE_MB_TYPE_INTER:
02465 s->mv_dir = MV_DIR_FORWARD;
02466 s->mb_intra= 0;
02467 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
02468 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
02469 break;
02470 case CANDIDATE_MB_TYPE_INTER_I:
02471 s->mv_dir = MV_DIR_FORWARD;
02472 s->mv_type = MV_TYPE_FIELD;
02473 s->mb_intra= 0;
02474 for(i=0; i<2; i++){
02475 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
02476 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
02477 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
02478 }
02479 break;
02480 case CANDIDATE_MB_TYPE_INTER4V:
02481 s->mv_dir = MV_DIR_FORWARD;
02482 s->mv_type = MV_TYPE_8X8;
02483 s->mb_intra= 0;
02484 for(i=0; i<4; i++){
02485 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
02486 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
02487 }
02488 break;
02489 case CANDIDATE_MB_TYPE_DIRECT:
02490 if (ENABLE_MPEG4_ENCODER) {
02491 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
02492 s->mb_intra= 0;
02493 motion_x=s->b_direct_mv_table[xy][0];
02494 motion_y=s->b_direct_mv_table[xy][1];
02495 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
02496 }
02497 break;
02498 case CANDIDATE_MB_TYPE_DIRECT0:
02499 if (ENABLE_MPEG4_ENCODER) {
02500 s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD|MV_DIRECT;
02501 s->mb_intra= 0;
02502 ff_mpeg4_set_direct_mv(s, 0, 0);
02503 }
02504 break;
02505 case CANDIDATE_MB_TYPE_BIDIR:
02506 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
02507 s->mb_intra= 0;
02508 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
02509 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
02510 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
02511 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
02512 break;
02513 case CANDIDATE_MB_TYPE_BACKWARD:
02514 s->mv_dir = MV_DIR_BACKWARD;
02515 s->mb_intra= 0;
02516 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
02517 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
02518 break;
02519 case CANDIDATE_MB_TYPE_FORWARD:
02520 s->mv_dir = MV_DIR_FORWARD;
02521 s->mb_intra= 0;
02522 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
02523 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
02524
02525 break;
02526 case CANDIDATE_MB_TYPE_FORWARD_I:
02527 s->mv_dir = MV_DIR_FORWARD;
02528 s->mv_type = MV_TYPE_FIELD;
02529 s->mb_intra= 0;
02530 for(i=0; i<2; i++){
02531 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
02532 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
02533 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
02534 }
02535 break;
02536 case CANDIDATE_MB_TYPE_BACKWARD_I:
02537 s->mv_dir = MV_DIR_BACKWARD;
02538 s->mv_type = MV_TYPE_FIELD;
02539 s->mb_intra= 0;
02540 for(i=0; i<2; i++){
02541 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
02542 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
02543 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
02544 }
02545 break;
02546 case CANDIDATE_MB_TYPE_BIDIR_I:
02547 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
02548 s->mv_type = MV_TYPE_FIELD;
02549 s->mb_intra= 0;
02550 for(dir=0; dir<2; dir++){
02551 for(i=0; i<2; i++){
02552 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
02553 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
02554 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
02555 }
02556 }
02557 break;
02558 default:
02559 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
02560 }
02561
02562 encode_mb(s, motion_x, motion_y);
02563
02564
02565 s->last_mv_dir = s->mv_dir;
02566
02567 if (ENABLE_ANY_H263_ENCODER &&
02568 s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
02569 ff_h263_update_motion_val(s);
02570
02571 MPV_decode_mb(s, s->block);
02572 }
02573
02574
02575 if(s->mb_intra ){
02576 s->p_mv_table[xy][0]=0;
02577 s->p_mv_table[xy][1]=0;
02578 }
02579
02580 if(s->flags&CODEC_FLAG_PSNR){
02581 int w= 16;
02582 int h= 16;
02583
02584 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
02585 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
02586
02587 s->current_picture.error[0] += sse(
02588 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
02589 s->dest[0], w, h, s->linesize);
02590 s->current_picture.error[1] += sse(
02591 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
02592 s->dest[1], w>>1, h>>1, s->uvlinesize);
02593 s->current_picture.error[2] += sse(
02594 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
02595 s->dest[2], w>>1, h>>1, s->uvlinesize);
02596 }
02597 if(s->loop_filter){
02598 if(ENABLE_ANY_H263_ENCODER && s->out_format == FMT_H263)
02599 ff_h263_loop_filter(s);
02600 }
02601
02602 }
02603 }
02604
02605
02606 if (ENABLE_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
02607 msmpeg4_encode_ext_header(s);
02608
02609 write_slice_end(s);
02610
02611
02612 if (s->avctx->rtp_callback) {
02613 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
02614 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
02615
02616 emms_c();
02617 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
02618 }
02619
02620 return 0;
02621 }
02622
02623 #define MERGE(field) dst->field += src->field; src->field=0
02624 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
02625 MERGE(me.scene_change_score);
02626 MERGE(me.mc_mb_var_sum_temp);
02627 MERGE(me.mb_var_sum_temp);
02628 }
02629
02630 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
02631 int i;
02632
02633 MERGE(dct_count[0]);
02634 MERGE(dct_count[1]);
02635 MERGE(mv_bits);
02636 MERGE(i_tex_bits);
02637 MERGE(p_tex_bits);
02638 MERGE(i_count);
02639 MERGE(f_count);
02640 MERGE(b_count);
02641 MERGE(skip_count);
02642 MERGE(misc_bits);
02643 MERGE(error_count);
02644 MERGE(padding_bug_score);
02645 MERGE(current_picture.error[0]);
02646 MERGE(current_picture.error[1]);
02647 MERGE(current_picture.error[2]);
02648
02649 if(dst->avctx->noise_reduction){
02650 for(i=0; i<64; i++){
02651 MERGE(dct_error_sum[0][i]);
02652 MERGE(dct_error_sum[1][i]);
02653 }
02654 }
02655
02656 assert(put_bits_count(&src->pb) % 8 ==0);
02657 assert(put_bits_count(&dst->pb) % 8 ==0);
02658 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
02659 flush_put_bits(&dst->pb);
02660 }
02661
02662 static int estimate_qp(MpegEncContext *s, int dry_run){
02663 if (s->next_lambda){
02664 s->current_picture_ptr->quality=
02665 s->current_picture.quality = s->next_lambda;
02666 if(!dry_run) s->next_lambda= 0;
02667 } else if (!s->fixed_qscale) {
02668 s->current_picture_ptr->quality=
02669 s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run);
02670 if (s->current_picture.quality < 0)
02671 return -1;
02672 }
02673
02674 if(s->adaptive_quant){
02675 switch(s->codec_id){
02676 case CODEC_ID_MPEG4:
02677 if (ENABLE_MPEG4_ENCODER)
02678 ff_clean_mpeg4_qscales(s);
02679 break;
02680 case CODEC_ID_H263:
02681 case CODEC_ID_H263P:
02682 case CODEC_ID_FLV1:
02683 if (ENABLE_H263_ENCODER||ENABLE_H263P_ENCODER||ENABLE_FLV_ENCODER)
02684 ff_clean_h263_qscales(s);
02685 break;
02686 }
02687
02688 s->lambda= s->lambda_table[0];
02689
02690 }else
02691 s->lambda= s->current_picture.quality;
02692
02693 update_qscale(s);
02694 return 0;
02695 }
02696
02697
02698 static void set_frame_distances(MpegEncContext * s){
02699 assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE);
02700 s->time= s->current_picture_ptr->pts*s->avctx->time_base.num;
02701
02702 if(s->pict_type==B_TYPE){
02703 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
02704 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
02705 }else{
02706 s->pp_time= s->time - s->last_non_b_time;
02707 s->last_non_b_time= s->time;
02708 assert(s->picture_number==0 || s->pp_time > 0);
02709 }
02710 }
02711
02712 static int encode_picture(MpegEncContext *s, int picture_number)
02713 {
02714 int i;
02715 int bits;
02716
02717 s->picture_number = picture_number;
02718
02719
02720 s->me.mb_var_sum_temp =
02721 s->me.mc_mb_var_sum_temp = 0;
02722
02723
02724
02725 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
02726 set_frame_distances(s);
02727 if(ENABLE_MPEG4_ENCODER && s->codec_id == CODEC_ID_MPEG4)
02728 ff_set_mpeg4_time(s);
02729
02730 s->me.scene_change_score=0;
02731
02732
02733
02734 if(s->pict_type==I_TYPE){
02735 if(s->msmpeg4_version >= 3) s->no_rounding=1;
02736 else s->no_rounding=0;
02737 }else if(s->pict_type!=B_TYPE){
02738 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
02739 s->no_rounding ^= 1;
02740 }
02741
02742 if(s->flags & CODEC_FLAG_PASS2){
02743 if (estimate_qp(s,1) < 0)
02744 return -1;
02745 ff_get_2pass_fcode(s);
02746 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
02747 if(s->pict_type==B_TYPE)
02748 s->lambda= s->last_lambda_for[s->pict_type];
02749 else
02750 s->lambda= s->