# HG changeset patch # User michael # Date 1166843136 0 # Node ID a9f4d5c92218b73c01f944e6ccee01b0eb9b7fab # Parent 9af83350d4fd7bd542dbb4fb5b7a86954142d32b skiprd diff -r 9af83350d4fd -r a9f4d5c92218 avcodec.h --- a/avcodec.h Fri Dec 22 23:30:57 2006 +0000 +++ b/avcodec.h Sat Dec 23 03:05:36 2006 +0000 @@ -374,6 +374,7 @@ #define CODEC_FLAG2_INTRA_VLC 0x00000800 ///< use MPEG-2 intra VLC table #define CODEC_FLAG2_MEMC_ONLY 0x00001000 ///< only do ME/MC (I frames -> ref, P frame -> ME+MC) #define CODEC_FLAG2_DROP_FRAME_TIMECODE 0x00002000 ///< timecode is in drop frame format +#define CODEC_FLAG2_SKIP_RD 0x00004000 ///< RD optimal MB level residual skiping /* Unsupported options : * Syntax Arithmetic coding (SAC) diff -r 9af83350d4fd -r a9f4d5c92218 mpegvideo.c --- a/mpegvideo.c Fri Dec 22 23:30:57 2006 +0000 +++ b/mpegvideo.c Sat Dec 23 03:05:36 2006 +0000 @@ -4330,7 +4330,7 @@ uint8_t *ptr_y, *ptr_cb, *ptr_cr; int wrap_y, wrap_c; - for(i=0; iskipdct; if(s->adaptive_quant){ const int last_qp= s->qscale; @@ -5290,6 +5290,39 @@ encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb, &dmin, &next_block, 0, 0); } + if(!best_s.mb_intra && s->flags2&CODEC_FLAG2_SKIP_RD){ + int coded=0; + for(i=0; i<6; i++) + coded |= s->block_last_index[i]; + if(coded){ + int mx,my; + memcpy(s->mv, best_s.mv, sizeof(s->mv)); + if(best_s.mv_dir & MV_DIRECT){ + mx=my=0; //FIXME find the one we actually used + ff_mpeg4_set_direct_mv(s, mx, my); + }else if(best_s.mv_dir&MV_DIR_BACKWARD){ + mx= s->mv[1][0][0]; + my= s->mv[1][0][1]; + }else{ + mx= s->mv[0][0][0]; + my= s->mv[0][0][1]; + } + + s->mv_dir= best_s.mv_dir; + s->mv_type = best_s.mv_type; + s->mb_intra= 0; +/* s->mv[0][0][0] = best_s.mv[0][0][0]; + s->mv[0][0][1] = best_s.mv[0][0][1]; + s->mv[1][0][0] = best_s.mv[1][0][0]; + s->mv[1][0][1] = best_s.mv[1][0][1];*/ + backup_s.dquant= 0; + s->skipdct=1; + encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb, + &dmin, &next_block, mx, my); + s->skipdct=0; + } + } + s->current_picture.qscale_table[xy]= best_s.qscale; copy_context_after_encode(s, &best_s, -1); diff -r 9af83350d4fd -r a9f4d5c92218 mpegvideo.h --- a/mpegvideo.h Fri Dec 22 23:30:57 2006 +0000 +++ b/mpegvideo.h Sat Dec 23 03:05:36 2006 +0000 @@ -324,6 +324,7 @@ int dropable; int frame_rate_index; int last_lambda_for[5]; ///< last lambda for a specific pict type + int skipdct; ///< skip dct and code zero residual /* motion compensation */ int unrestricted_mv; ///< mv can point outside of the coded picture diff -r 9af83350d4fd -r a9f4d5c92218 utils.c --- a/utils.c Fri Dec 22 23:30:57 2006 +0000 +++ b/utils.c Sat Dec 23 03:05:36 2006 +0000 @@ -701,6 +701,7 @@ {"fastpskip", "fast pskip (H.264)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_FASTPSKIP, INT_MIN, INT_MAX, V|E, "flags2"}, {"aud", "access unit delimiters (H.264)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_AUD, INT_MIN, INT_MAX, V|E, "flags2"}, {"brdo", "b-frame rate-distortion optimization", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_BRDO, INT_MIN, INT_MAX, V|E, "flags2"}, +{"skiprd", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_SKIP_RD, INT_MIN, INT_MAX, V|E, "flags2"}, {"complexityblur", "reduce fluctuations in qp (before curve compression)", OFFSET(complexityblur), FF_OPT_TYPE_FLOAT, 20.0, FLT_MIN, FLT_MAX, V|E}, {"deblockalpha", "in-loop deblocking filter alphac0 parameter", OFFSET(deblockalpha), FF_OPT_TYPE_INT, DEFAULT, -6, 6, V|E}, {"deblockbeta", "in-loop deblocking filter beta parameter", OFFSET(deblockbeta), FF_OPT_TYPE_INT, DEFAULT, -6, 6, V|E},