mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
skiprd
Originally committed as revision 7365 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
919cb8731e
commit
c52f5d66a2
@ -374,6 +374,7 @@ typedef struct RcOverride{
|
|||||||
#define CODEC_FLAG2_INTRA_VLC 0x00000800 ///< use MPEG-2 intra VLC table
|
#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_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_DROP_FRAME_TIMECODE 0x00002000 ///< timecode is in drop frame format
|
||||||
|
#define CODEC_FLAG2_SKIP_RD 0x00004000 ///< RD optimal MB level residual skiping
|
||||||
|
|
||||||
/* Unsupported options :
|
/* Unsupported options :
|
||||||
* Syntax Arithmetic coding (SAC)
|
* Syntax Arithmetic coding (SAC)
|
||||||
|
@ -4330,7 +4330,7 @@ static av_always_inline void encode_mb_internal(MpegEncContext *s, int motion_x,
|
|||||||
uint8_t *ptr_y, *ptr_cb, *ptr_cr;
|
uint8_t *ptr_y, *ptr_cb, *ptr_cr;
|
||||||
int wrap_y, wrap_c;
|
int wrap_y, wrap_c;
|
||||||
|
|
||||||
for(i=0; i<mb_block_count; i++) skip_dct[i]=0;
|
for(i=0; i<mb_block_count; i++) skip_dct[i]=s->skipdct;
|
||||||
|
|
||||||
if(s->adaptive_quant){
|
if(s->adaptive_quant){
|
||||||
const int last_qp= s->qscale;
|
const int last_qp= s->qscale;
|
||||||
@ -5290,6 +5290,39 @@ static int encode_thread(AVCodecContext *c, void *arg){
|
|||||||
encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
|
encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
|
||||||
&dmin, &next_block, 0, 0);
|
&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;
|
s->current_picture.qscale_table[xy]= best_s.qscale;
|
||||||
|
|
||||||
copy_context_after_encode(s, &best_s, -1);
|
copy_context_after_encode(s, &best_s, -1);
|
||||||
|
@ -324,6 +324,7 @@ typedef struct MpegEncContext {
|
|||||||
int dropable;
|
int dropable;
|
||||||
int frame_rate_index;
|
int frame_rate_index;
|
||||||
int last_lambda_for[5]; ///< last lambda for a specific pict type
|
int last_lambda_for[5]; ///< last lambda for a specific pict type
|
||||||
|
int skipdct; ///< skip dct and code zero residual
|
||||||
|
|
||||||
/* motion compensation */
|
/* motion compensation */
|
||||||
int unrestricted_mv; ///< mv can point outside of the coded picture
|
int unrestricted_mv; ///< mv can point outside of the coded picture
|
||||||
|
@ -701,6 +701,7 @@ static const AVOption options[]={
|
|||||||
{"fastpskip", "fast pskip (H.264)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_FASTPSKIP, INT_MIN, INT_MAX, V|E, "flags2"},
|
{"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"},
|
{"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"},
|
{"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},
|
{"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},
|
{"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},
|
{"deblockbeta", "in-loop deblocking filter beta parameter", OFFSET(deblockbeta), FF_OPT_TYPE_INT, DEFAULT, -6, 6, V|E},
|
||||||
|
Loading…
Reference in New Issue
Block a user