@@ -971,7 +971,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20;
c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score);
- if (vard*2 + 200*256 > varc)
+ if (vard*2 + 200*256 > varc && !s->intra_penalty)
mb_type|= CANDIDATE_MB_TYPE_INTRA;
if (varc*2 + 200*256 > vard || s->qscale > 24){
// if (varc*2 + 200*256 + 50*(s->lambda2>>FF_LAMBDA_SHIFT) > vard){
@@ -1040,7 +1040,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
intra_score= s->mecc.mb_cmp[0](s, c->scratchpad, pix, s->linesize, 16);
}
- intra_score += c->mb_penalty_factor*16;
+ intra_score += c->mb_penalty_factor*16 + s->intra_penalty;
if(intra_score < dmin){
mb_type= CANDIDATE_MB_TYPE_INTRA;
@@ -1648,7 +1648,7 @@ int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type)
}
}
-void ff_fix_long_p_mvs(MpegEncContext * s)
+void ff_fix_long_p_mvs(MpegEncContext * s, int type)
{
MotionEstContext * const c= &s->me;
const int f_code= s->f_code;
@@ -1682,8 +1682,8 @@ void ff_fix_long_p_mvs(MpegEncContext * s)
if( mx >=range || mx <-range
|| my >=range || my <-range){
s->mb_type[i] &= ~CANDIDATE_MB_TYPE_INTER4V;
- s->mb_type[i] |= CANDIDATE_MB_TYPE_INTRA;
- s->current_picture.mb_type[i] = CANDIDATE_MB_TYPE_INTRA;
+ s->mb_type[i] |= type;
+ s->current_picture.mb_type[i] = type;
}
}
}
@@ -127,7 +127,7 @@ int ff_get_mb_score(struct MpegEncContext *s, int mx, int my, int src_index,
int ff_get_best_fcode(struct MpegEncContext *s,
int16_t (*mv_table)[2], int type);
-void ff_fix_long_p_mvs(struct MpegEncContext *s);
+void ff_fix_long_p_mvs(struct MpegEncContext *s, int type);
void ff_fix_long_mvs(struct MpegEncContext *s, uint8_t *field_select_table,
int field_select, int16_t (*mv_table)[2], int f_code,
int type, int truncate);
@@ -577,6 +577,8 @@ typedef struct MpegEncContext {
int scenechange_threshold;
int noise_reduction;
+
+ int intra_penalty;
} MpegEncContext;
/* mpegvideo_enc common options */
@@ -661,6 +663,7 @@ FF_MPV_OPT_CMP_FUNC, \
{"ps", "RTP payload size in bytes", FF_MPV_OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
{"mepc", "Motion estimation bitrate penalty compensation (1.0 = 256)", FF_MPV_OFFSET(me_penalty_compensation), AV_OPT_TYPE_INT, {.i64 = 256 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
{"mepre", "pre motion estimation", FF_MPV_OFFSET(me_pre), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
+{"intra_penalty", "Penalty for intra blocks in block decision", FF_MPV_OFFSET(intra_penalty), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX/2, FF_MPV_OPT_FLAGS }, \
extern const AVOption ff_mpv_generic_options[];
@@ -3761,14 +3761,14 @@ static int encode_picture(MpegEncContext *s, int picture_number)
s->f_code= FFMAX3(s->f_code, a, b);
}
- ff_fix_long_p_mvs(s);
- ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
+ ff_fix_long_p_mvs(s, s->intra_penalty ? CANDIDATE_MB_TYPE_INTER : CANDIDATE_MB_TYPE_INTRA);
+ ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, !!s->intra_penalty);
if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
int j;
for(i=0; i<2; i++){
for(j=0; j<2; j++)
ff_fix_long_mvs(s, s->p_field_select_table[i], j,
- s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
+ s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, !!s->intra_penalty);
}
}
}
@@ -345,7 +345,7 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
s->m.first_slice_line = 0;
}
- ff_fix_long_p_mvs(&s->m);
+ ff_fix_long_p_mvs(&s->m, CANDIDATE_MB_TYPE_INTRA);
ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code,
CANDIDATE_MB_TYPE_INTER, 0);
}
@@ -120,6 +120,14 @@ probegaplessinfo(){
tail -n 9 "$framefile1"
}
+probenopimb(){
+ mb_types_file="${outdir}/${test}.mb_types"
+ run ffprobe${PROGSUF} -bitexact -flags2 +export_mb_types -show_frames -v 0 "$@" \
+ | awk '/mb_types/ { if (!skip) { skip=1 } else { gsub(".*mb_types",""); print } }' \
+ > "$mb_types_file"
+ grep "[iI]" "$mb_types_file" || echo "No intra macroblocks found in P frames"
+}
+
ffmpeg(){
dec_opts="-hwaccel $hwaccel -threads $threads -thread_type $thread_type"
ffmpeg_args="-nostdin -nostats -cpuflags $cpuflags"
@@ -15,5 +15,10 @@ FATE_MPEG4-$(call DEMDEC, M4V, MPEG4) += fate-m4v fate-m4v-cfr
fate-m4v: CMD = framecrc -flags +bitexact -idct simple -i $(TARGET_SAMPLES)/mpeg4/demo.m4v
fate-m4v-cfr: CMD = framecrc -flags +bitexact -idct simple -i $(TARGET_SAMPLES)/mpeg4/demo.m4v -vf fps=5
+FATE_MPEG4-$(call ENCDEC, MPEG4, AVI) += fate-mpeg4-nopimb
+fate-mpeg4-nopimb: ffprobe$(PROGSSUF)$(EXESUF)
+fate-mpeg4-nopimb: $(TARGET_PATH)/tests/data/fate/vsynth_lena-mpeg4-nopimb.avi
+fate-mpeg4-nopimb: CMD = probenopimb $(TARGET_PATH)/tests/data/fate/vsynth_lena-mpeg4-nopimb.avi
+
FATE_SAMPLES_AVCONV += $(FATE_MPEG4-yes)
fate-mpeg4: $(FATE_MPEG4-yes)
@@ -144,6 +144,7 @@ fate-seek-vsynth_lena-mpeg4-qpel: SRC = fate/vsynth_lena-mpeg4-qpel.avi
fate-seek-vsynth_lena-mpeg4-qprd: SRC = fate/vsynth_lena-mpeg4-qprd.avi
fate-seek-vsynth_lena-mpeg4-rc: SRC = fate/vsynth_lena-mpeg4-rc.avi
fate-seek-vsynth_lena-mpeg4-thread: SRC = fate/vsynth_lena-mpeg4-thread.avi
+fate-seek-vsynth_lena-mpeg4-nopimb: SRC = fate/vsynth_lena-mpeg4-nopimb.avi
fate-seek-vsynth_lena-msmpeg4: SRC = fate/vsynth_lena-msmpeg4.avi
fate-seek-vsynth_lena-msmpeg4v2: SRC = fate/vsynth_lena-msmpeg4v2.avi
fate-seek-vsynth_lena-rgb: SRC = fate/vsynth_lena-rgb.avi
@@ -274,6 +274,7 @@ FATE_MPEG4_AVI = mpeg4-rc \
mpeg4-qpel \
mpeg4-thread \
mpeg4-error \
+ mpeg4-nopimb \
mpeg4-nr \
mpeg4-nsse
@@ -317,6 +318,9 @@ fate-vsynth%-mpeg4-thread: ENCOPTS = -b 500k -flags +mv4+aic \
-mbd bits -ps 200 -bf 2 \
-threads 2 -slices 2
+fate-vsynth%-mpeg4-nopimb: ENCOPTS = -q 0 -g 600 -flags +mv4 \
+ -intra_penalty max
+
FATE_VCODEC-$(call ENCDEC, MSMPEG4V3, AVI) += msmpeg4
fate-vsynth%-msmpeg4: ENCOPTS = -qscale 10
new file mode 100644
@@ -0,0 +1 @@
+No intra macroblocks found in P frames
new file mode 100644
@@ -0,0 +1,40 @@
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret: 0 st:-1 flags:0 ts:-1.000000
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret: 0 st:-1 flags:1 ts: 1.894167
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret:-1 st: 0 flags:0 ts: 0.800000
+ret:-1 st: 0 flags:1 ts:-0.320000
+ret:-1 st:-1 flags:0 ts: 2.576668
+ret: 0 st:-1 flags:1 ts: 1.470835
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret:-1 st: 0 flags:0 ts: 0.360000
+ret:-1 st: 0 flags:1 ts:-0.760000
+ret:-1 st:-1 flags:0 ts: 2.153336
+ret: 0 st:-1 flags:1 ts: 1.047503
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret: 0 st: 0 flags:0 ts:-0.040000
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret: 0 st: 0 flags:1 ts: 2.840000
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret:-1 st:-1 flags:0 ts: 1.730004
+ret: 0 st:-1 flags:1 ts: 0.624171
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret: 0 st: 0 flags:0 ts:-0.480000
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret: 0 st: 0 flags:1 ts: 2.400000
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret:-1 st:-1 flags:0 ts: 1.306672
+ret: 0 st:-1 flags:1 ts: 0.200839
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret: 0 st: 0 flags:0 ts:-0.920000
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret: 0 st: 0 flags:1 ts: 2.000000
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret:-1 st:-1 flags:0 ts: 0.883340
+ret:-1 st:-1 flags:1 ts:-0.222493
+ret:-1 st: 0 flags:0 ts: 2.680000
+ret: 0 st: 0 flags:1 ts: 1.560000
+ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5652 size: 32508
+ret:-1 st:-1 flags:0 ts: 0.460008
+ret:-1 st:-1 flags:1 ts:-0.645825
new file mode 100644
@@ -0,0 +1,4 @@
+680d1f6781b56b84511f44a2a6cdc8ee *tests/data/fate/vsynth1-mpeg4-nopimb.avi
+2269928 tests/data/fate/vsynth1-mpeg4-nopimb.avi
+edc9040556f8b6dde2d56bda1fce6fbd *tests/data/fate/vsynth1-mpeg4-nopimb.out.rawvideo
+stddev: 2.05 PSNR: 41.88 MAXDIFF: 21 bytes: 7603200/ 7603200
new file mode 100644
@@ -0,0 +1,4 @@
+6cecfca24ed27930d41ebb246ec876d9 *tests/data/fate/vsynth2-mpeg4-nopimb.avi
+989664 tests/data/fate/vsynth2-mpeg4-nopimb.avi
+10e4986c94cacfdcc210af1a76f1f798 *tests/data/fate/vsynth2-mpeg4-nopimb.out.rawvideo
+stddev: 2.01 PSNR: 42.04 MAXDIFF: 20 bytes: 7603200/ 7603200
new file mode 100644
@@ -0,0 +1,4 @@
+0f568ae3bb45f86e9aa759440361b1c5 *tests/data/fate/vsynth3-mpeg4-nopimb.avi
+101148 tests/data/fate/vsynth3-mpeg4-nopimb.avi
+020d49b3b551ce6eef32b2e077a07e74 *tests/data/fate/vsynth3-mpeg4-nopimb.out.rawvideo
+stddev: 2.40 PSNR: 40.51 MAXDIFF: 17 bytes: 86700/ 86700
new file mode 100644
@@ -0,0 +1,4 @@
+2808db89fee897cba848e20bf11a1712 *tests/data/fate/vsynth_lena-mpeg4-nopimb.avi
+738170 tests/data/fate/vsynth_lena-mpeg4-nopimb.avi
+c5bf55f93024605d507209ef1c69783d *tests/data/fate/vsynth_lena-mpeg4-nopimb.out.rawvideo
+stddev: 1.91 PSNR: 42.50 MAXDIFF: 19 bytes: 7603200/ 7603200