Mercurial > libavcodec.hg
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 */ |