mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 03:59:43 +00:00
skip motion estimation and encoding of non direct-0,0 MBs if the next MB is skiped (mpeg4 doesnt allow such MBs and in the past we did ME and encoding until at the end we droped them, so this should be faster though i didnt benchmark it, benchmark welcome)
Originally committed as revision 7343 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
59743d16c7
commit
2f16af0667
@ -1843,6 +1843,18 @@ void ff_estimate_b_frame_motion(MpegEncContext * s,
|
||||
get_limits(s, 16*mb_x, 16*mb_y);
|
||||
|
||||
c->skip=0;
|
||||
|
||||
if(s->codec_id == CODEC_ID_MPEG4 && s->next_picture.mbskip_table[xy]){
|
||||
int score= direct_search(s, mb_x, mb_y); //FIXME just check 0,0
|
||||
|
||||
score= ((unsigned)(score*score + 128*256))>>16;
|
||||
c->mc_mb_var_sum_temp += score;
|
||||
s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE
|
||||
s->mb_type[mb_y*s->mb_stride + mb_x]= CANDIDATE_MB_TYPE_DIRECT0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if(c->avctx->me_threshold){
|
||||
int vard= check_input_motion(s, mb_x, mb_y, 0);
|
||||
|
||||
|
@ -5226,8 +5226,8 @@ static int encode_thread(AVCodecContext *c, void *arg){
|
||||
}
|
||||
}
|
||||
|
||||
if(s->flags & CODEC_FLAG_QP_RD){
|
||||
if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
|
||||
if((s->flags & CODEC_FLAG_QP_RD) && dmin < INT_MAX){
|
||||
if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
|
||||
const int last_qp= backup_s.qscale;
|
||||
int qpi, qp, dc[6];
|
||||
DCTELEM ac[6][16];
|
||||
@ -5283,6 +5283,14 @@ static int encode_thread(AVCodecContext *c, void *arg){
|
||||
encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
|
||||
&dmin, &next_block, mx, my);
|
||||
}
|
||||
if(mb_type&CANDIDATE_MB_TYPE_DIRECT0){
|
||||
backup_s.dquant = 0;
|
||||
s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
|
||||
s->mb_intra= 0;
|
||||
ff_mpeg4_set_direct_mv(s, 0, 0);
|
||||
encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
|
||||
&dmin, &next_block, 0, 0);
|
||||
}
|
||||
s->current_picture.qscale_table[xy]= best_s.qscale;
|
||||
|
||||
copy_context_after_encode(s, &best_s, -1);
|
||||
|
@ -402,6 +402,8 @@ typedef struct MpegEncContext {
|
||||
#define CANDIDATE_MB_TYPE_BACKWARD_I 0x400
|
||||
#define CANDIDATE_MB_TYPE_BIDIR_I 0x800
|
||||
|
||||
#define CANDIDATE_MB_TYPE_DIRECT0 0x1000
|
||||
|
||||
int block_index[6]; ///< index to current MB in block based arrays with edges
|
||||
int block_wrap[6];
|
||||
uint8_t *dest[3];
|
||||
|
@ -67,18 +67,18 @@ a1323da0c8b437cd6961f8c90451880b *./data/a-huffyuv.avi
|
||||
6455232 ./data/a-huffyuv.avi
|
||||
dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
|
||||
stddev: 0.00 PSNR:99.99 bytes:7602176
|
||||
1fd3bddc95fa01ee4c4b383373803c67 *./data/a-mpeg4-rc.avi
|
||||
227936 ./data/a-mpeg4-rc.avi
|
||||
fa9079e35ff819c39656de95319846fb *./data/out.yuv
|
||||
968ca132d8cf46f84e657abcf8473b7c *./data/a-mpeg4-rc.avi
|
||||
227934 ./data/a-mpeg4-rc.avi
|
||||
895773fe8250c806a0d1592a6dd12401 *./data/out.yuv
|
||||
stddev: 4.24 PSNR:35.56 bytes:7602176
|
||||
9001cf571eb7f26fa5592bdec6538583 *./data/a-mpeg4-adv.avi
|
||||
173590 ./data/a-mpeg4-adv.avi
|
||||
699edf05648fdc42196b7bebef9be269 *./data/out.yuv
|
||||
stddev: 4.84 PSNR:34.41 bytes:7602176
|
||||
7006aa0ad8643348ec0d6d87bf03202c *./data/a-mpeg4-qprd.avi
|
||||
235016 ./data/a-mpeg4-qprd.avi
|
||||
224969c07440a23b376521c484936e75 *./data/out.yuv
|
||||
stddev: 4.24 PSNR:35.56 bytes:7602176
|
||||
edd969be2816c13ae078b7a0416a5715 *./data/a-mpeg4-qprd.avi
|
||||
234852 ./data/a-mpeg4-qprd.avi
|
||||
51fa46add28e145c1a5ce6b27a4c57b8 *./data/out.yuv
|
||||
stddev: 4.24 PSNR:35.57 bytes:7602176
|
||||
7ecfbb848740d316e2fcf573b32cb848 *./data/a-mpeg4-adap.avi
|
||||
205454 ./data/a-mpeg4-adap.avi
|
||||
c9225addf2e620e0094d26e805693af1 *./data/out.yuv
|
||||
|
Loading…
Reference in New Issue
Block a user