comparison mpegvideo.c @ 1373:b47a402bbe7f libavcodec

last frames & b frames encoding fix
author michaelni
date Wed, 23 Jul 2003 10:41:07 +0000
parents 45d761c387cd
children f07e17427140
comparison
equal deleted inserted replaced
1372:b52e62d17bbb 1373:b47a402bbe7f
1298 return acc; 1298 return acc;
1299 } 1299 }
1300 1300
1301 1301
1302 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){ 1302 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
1303 AVFrame *pic; 1303 AVFrame *pic=NULL;
1304 int i; 1304 int i;
1305 const int encoding_delay= s->max_b_frames; 1305 const int encoding_delay= s->max_b_frames;
1306 int direct=1; 1306 int direct=1;
1307 1307
1308 if(pic_arg){
1308 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0; 1309 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
1309 if(pic_arg->linesize[0] != s->linesize) direct=0; 1310 if(pic_arg->linesize[0] != s->linesize) direct=0;
1310 if(pic_arg->linesize[1] != s->uvlinesize) direct=0; 1311 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
1311 if(pic_arg->linesize[2] != s->uvlinesize) direct=0; 1312 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
1312 1313
1372 pic->pict_type= pic_arg->pict_type; 1373 pic->pict_type= pic_arg->pict_type;
1373 pic->pts = pic_arg->pts; 1374 pic->pts = pic_arg->pts;
1374 1375
1375 if(s->input_picture[encoding_delay]) 1376 if(s->input_picture[encoding_delay])
1376 pic->display_picture_number= s->input_picture[encoding_delay]->display_picture_number + 1; 1377 pic->display_picture_number= s->input_picture[encoding_delay]->display_picture_number + 1;
1378
1379 }
1377 1380
1378 /* shift buffer entries */ 1381 /* shift buffer entries */
1379 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++) 1382 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
1380 s->input_picture[i-1]= s->input_picture[i]; 1383 s->input_picture[i-1]= s->input_picture[i];
1381 1384
1425 fprintf(stderr, "warning, too many bframes in a row\n"); 1428 fprintf(stderr, "warning, too many bframes in a row\n");
1426 b_frames = s->max_b_frames; 1429 b_frames = s->max_b_frames;
1427 } 1430 }
1428 }else if(s->b_frame_strategy==0){ 1431 }else if(s->b_frame_strategy==0){
1429 b_frames= s->max_b_frames; 1432 b_frames= s->max_b_frames;
1433 while(b_frames && !s->input_picture[b_frames]) b_frames--;
1430 }else if(s->b_frame_strategy==1){ 1434 }else if(s->b_frame_strategy==1){
1431 for(i=1; i<s->max_b_frames+1; i++){ 1435 for(i=1; i<s->max_b_frames+1; i++){
1432 if(s->input_picture[i]->b_frame_score==0){ 1436 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
1433 s->input_picture[i]->b_frame_score= 1437 s->input_picture[i]->b_frame_score=
1434 get_intra_count(s, s->input_picture[i ]->data[0], 1438 get_intra_count(s, s->input_picture[i ]->data[0],
1435 s->input_picture[i-1]->data[0], s->linesize) + 1; 1439 s->input_picture[i-1]->data[0], s->linesize) + 1;
1436 } 1440 }
1437 } 1441 }
1438 for(i=0; i<s->max_b_frames; i++){ 1442 for(i=0; i<s->max_b_frames; i++){
1439 if(s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break; 1443 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
1440 } 1444 }
1441 1445
1442 b_frames= FFMAX(0, i-1); 1446 b_frames= FFMAX(0, i-1);
1443 1447
1444 /* reset scores */ 1448 /* reset scores */