diff options
-rw-r--r-- | vp8/common/onyxc_int.h | 1 | ||||
-rw-r--r-- | vp8/decoder/decodemv.c | 3 | ||||
-rw-r--r-- | vp8/decoder/decodframe.c | 4 | ||||
-rw-r--r-- | vp8/encoder/encodeframe.c | 30 | ||||
-rw-r--r-- | vp8/encoder/ratectrl.c | 3 | ||||
-rw-r--r-- | vp8_scalable_patterns.c | 202 |
6 files changed, 169 insertions, 74 deletions
diff --git a/vp8/common/onyxc_int.h b/vp8/common/onyxc_int.h index c44ba8d23..36d75093a 100644 --- a/vp8/common/onyxc_int.h +++ b/vp8/common/onyxc_int.h @@ -42,7 +42,6 @@ typedef struct frame_contexts vp8_prob sub_mv_ref_prob [VP8_SUBMVREFS-1]; vp8_prob coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; MV_CONTEXT mvc[2]; - MV_CONTEXT pre_mvc[2]; /* not to caculate the mvcost for the frame if mvc doesn't change. */ } FRAME_CONTEXT; typedef enum diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c index f0daf55c1..838a31b85 100644 --- a/vp8/decoder/decodemv.c +++ b/vp8/decoder/decodemv.c @@ -159,6 +159,9 @@ static void mb_mode_mv_init(VP8D_COMP *pbi) * outside the frame. */ pbi->mvs_corrupt_from_mb = UINT_MAX; #endif + /* Read the mb_no_coeff_skip flag */ + pbi->common.mb_no_coeff_skip = (int)vp8_read_bit(bc); + pbi->prob_skip_false = 0; if (pbi->common.mb_no_coeff_skip) pbi->prob_skip_false = (vp8_prob)vp8_read_literal(bc, 8); diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c index 03a6759ac..877eb7738 100644 --- a/vp8/decoder/decodframe.c +++ b/vp8/decoder/decodframe.c @@ -1392,10 +1392,6 @@ int vp8_decode_frame(VP8D_COMP *pbi) /* clear out the coeff buffer */ vpx_memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); - /* Read the mb_no_coeff_skip flag */ - pc->mb_no_coeff_skip = (int)vp8_read_bit(bc); - - vp8_decode_mode_mvs(pbi); #if CONFIG_ERROR_CONCEALMENT diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c index 600e815dd..2a86b88fd 100644 --- a/vp8/encoder/encodeframe.c +++ b/vp8/encoder/encodeframe.c @@ -939,36 +939,6 @@ void vp8_encode_frame(VP8_COMP *cpi) } -#if 0 - { - int cnt = 0; - int flag[2] = {0, 0}; - - for (cnt = 0; cnt < MVPcount; cnt++) - { - if (cm->fc.pre_mvc[0][cnt] != cm->fc.mvc[0][cnt]) - { - flag[0] = 1; - vpx_memcpy(cm->fc.pre_mvc[0], cm->fc.mvc[0], MVPcount); - break; - } - } - - for (cnt = 0; cnt < MVPcount; cnt++) - { - if (cm->fc.pre_mvc[1][cnt] != cm->fc.mvc[1][cnt]) - { - flag[1] = 1; - vpx_memcpy(cm->fc.pre_mvc[1], cm->fc.mvc[1], MVPcount); - break; - } - } - - if (flag[0] || flag[1]) - vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cm->fc.mvc, flag); - } -#endif - #if ! CONFIG_REALTIME_ONLY /* Adjust the projected reference frame usage probability numbers to * reflect what we have just seen. This may be useful when we make diff --git a/vp8/encoder/ratectrl.c b/vp8/encoder/ratectrl.c index 4dc078a1d..1432c143b 100644 --- a/vp8/encoder/ratectrl.c +++ b/vp8/encoder/ratectrl.c @@ -310,9 +310,6 @@ void vp8_setup_key_frame(VP8_COMP *cpi) vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flag); } - /* initialize pre_mvc to all zero. */ - vpx_memset(cpi->common.fc.pre_mvc, 0, sizeof(cpi->common.fc.pre_mvc)); - /* Make sure we initialize separate contexts for altref,gold, and normal. * TODO shouldn't need 3 different copies of structure to do this! */ diff --git a/vp8_scalable_patterns.c b/vp8_scalable_patterns.c index 4256a9098..06270fecb 100644 --- a/vp8_scalable_patterns.c +++ b/vp8_scalable_patterns.c @@ -114,7 +114,7 @@ static void write_ivf_frame_header(FILE *outfile, (void) fwrite(header, 1, 12, outfile); } -static int mode_to_num_layers[9] = {2, 2, 3, 3, 3, 3, 5, 2, 3}; +static int mode_to_num_layers[12] = {1, 2, 2, 3, 3, 3, 3, 5, 2, 3, 3, 3}; int main(int argc, char **argv) { FILE *infile, *outfile[VPX_TS_MAX_LAYERS]; @@ -150,8 +150,8 @@ int main(int argc, char **argv) { if (!sscanf(argv[7], "%d", &layering_mode)) die ("Invalid mode %s", argv[7]); - if (layering_mode<0 || layering_mode>8) - die ("Invalid mode (0..8) %s", argv[7]); + if (layering_mode<0 || layering_mode>11) + die ("Invalid mode (0..11) %s", argv[7]); if (argc != 8+mode_to_num_layers[layering_mode]) die ("Invalid number of arguments"); @@ -186,7 +186,7 @@ int main(int argc, char **argv) { cfg.rc_dropframe_thresh = 0; cfg.rc_end_usage = VPX_CBR; cfg.rc_resize_allowed = 0; - cfg.rc_min_quantizer = 8; + cfg.rc_min_quantizer = 2; cfg.rc_max_quantizer = 56; cfg.rc_undershoot_pct = 100; cfg.rc_overshoot_pct = 15; @@ -200,7 +200,10 @@ int main(int argc, char **argv) { cfg.kf_mode = VPX_KF_DISABLED; /* Disable automatic keyframe placement */ - cfg.kf_min_dist = cfg.kf_max_dist = 1000; + cfg.kf_min_dist = cfg.kf_max_dist = 3000; + + /* Default setting for bitrate: used in special case of 1 layer (case 0). */ + cfg.rc_target_bitrate = cfg.ts_target_bitrate[0]; /* Temporal scaling parameters: */ /* NOTE: The 3 prediction frames cannot be used interchangeably due to @@ -210,9 +213,24 @@ int main(int argc, char **argv) { */ switch (layering_mode) { - case 0: { + /* 1-layer */ + int ids[1] = {0}; + cfg.ts_number_layers = 1; + cfg.ts_periodicity = 1; + cfg.ts_rate_decimator[0] = 1; + memcpy(cfg.ts_layer_id, ids, sizeof(ids)); + + flag_periodicity = cfg.ts_periodicity; + + // Update L only. + layer_flags[0] = VPX_EFLAG_FORCE_KF | + VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; + break; + } + case 1: + { /* 2-layers, 2-frame period */ int ids[2] = {0,1}; cfg.ts_number_layers = 2; @@ -240,7 +258,7 @@ int main(int argc, char **argv) { break; } - case 1: + case 2: { /* 2-layers, 3-frame period */ int ids[3] = {0,1,1}; @@ -263,7 +281,7 @@ int main(int argc, char **argv) { break; } - case 2: + case 3: { /* 3-layers, 6-frame period */ int ids[6] = {0,2,2,1,2,2}; @@ -289,7 +307,7 @@ int main(int argc, char **argv) { break; } - case 3: + case 4: { /* 3-layers, 4-frame period */ int ids[4] = {0,2,1,2}; @@ -316,7 +334,7 @@ int main(int argc, char **argv) { break; } - case 4: + case 5: { /* 3-layers, 4-frame period */ int ids[4] = {0,2,1,2}; @@ -344,7 +362,7 @@ int main(int argc, char **argv) { break; } - case 5: + case 6: { /* 3-layers, 4-frame period */ int ids[4] = {0,2,1,2}; @@ -368,7 +386,7 @@ int main(int argc, char **argv) { break; } - case 6: + case 7: { /* NOTE: Probably of academic interest only */ @@ -407,9 +425,9 @@ int main(int argc, char **argv) { break; } - case 7: + case 8: { - /* 2-layers */ + /* 2-layers, with sync point at first frame of layer 1. */ int ids[2] = {0,1}; cfg.ts_number_layers = 2; cfg.ts_periodicity = 2; @@ -420,29 +438,48 @@ int main(int argc, char **argv) { flag_periodicity = 8; /* 0=L, 1=GF */ + // ARF is used as predictor for all frames, and is only updated on + // key frame. Sync point every 8 frames. + + // Layer 0: predict from L and ARF, update L and G. layer_flags[0] = VPX_EFLAG_FORCE_KF | - VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; - layer_flags[1] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF; - layer_flags[2] = - layer_flags[4] = - layer_flags[6] = VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF; - layer_flags[3] = - layer_flags[5] = VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST; - layer_flags[7] = VP8_EFLAG_NO_REF_ARF | - VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | - VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_UPD_ARF; + + // Layer 1: sync point: predict from L and ARF, and update G. + layer_flags[1] = VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_UPD_LAST | + VP8_EFLAG_NO_UPD_ARF; + + // Layer 0, predict from L and ARF, update L. + layer_flags[2] = VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF; + + // Layer 1: predict from L, G and ARF, and update G. + layer_flags[3] = VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY; + + // Layer 0 + layer_flags[4] = layer_flags[2]; + + // Layer 1 + layer_flags[5] = layer_flags[3]; + + // Layer 0 + layer_flags[6] = layer_flags[4]; + + // Layer 1 + layer_flags[7] = layer_flags[5]; break; } - case 8: - default: + case 9: { /* 3-layers */ + // Sync points for layer 1 and 2 every 8 frames. + int ids[4] = {0,2,1,2}; cfg.ts_number_layers = 3; cfg.ts_periodicity = 4; @@ -472,6 +509,102 @@ int main(int argc, char **argv) { VP8_EFLAG_NO_UPD_ENTROPY; break; } + case 10: + { + // 3-layers structure where ARF is used as predictor for all frames, + // and is only updated on key frame. + // Sync points for layer 1 and 2 every 8 frames. + + int ids[4] = {0,2,1,2}; + cfg.ts_number_layers = 3; + cfg.ts_periodicity = 4; + cfg.ts_rate_decimator[0] = 4; + cfg.ts_rate_decimator[1] = 2; + cfg.ts_rate_decimator[2] = 1; + memcpy(cfg.ts_layer_id, ids, sizeof(ids)); + + flag_periodicity = 8; + + /* 0=L, 1=GF, 2=ARF */ + + // Layer 0: predict from L and ARF; update L and G. + layer_flags[0] = VPX_EFLAG_FORCE_KF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_REF_GF; + + // Layer 2: sync point: predict from L and ARF; update none. + layer_flags[1] = VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST | + VP8_EFLAG_NO_UPD_ENTROPY; + + // Layer 1: sync point: predict from L and ARF; update G. + layer_flags[2] = VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST; + + // Layer 2: predict from L, G, ARF; update none. + layer_flags[3] = VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST | + VP8_EFLAG_NO_UPD_ENTROPY; + + // Layer 0: predict from L and ARF; update L. + layer_flags[4] = VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_REF_GF; + + // Layer 2: predict from L, G, ARF; update none. + layer_flags[5] = layer_flags[3]; + + // Layer 1: predict from L, G, ARF; update G. + layer_flags[6] = VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST; + + // Layer 2: predict from L, G, ARF; update none. + layer_flags[7] = layer_flags[3]; + break; + } + case 11: + default: + { + // 3-layers structure as in case 10, but no sync/refresh points for + // layer 1 and 2. + + int ids[4] = {0,2,1,2}; + cfg.ts_number_layers = 3; + cfg.ts_periodicity = 4; + cfg.ts_rate_decimator[0] = 4; + cfg.ts_rate_decimator[1] = 2; + cfg.ts_rate_decimator[2] = 1; + memcpy(cfg.ts_layer_id, ids, sizeof(ids)); + + flag_periodicity = 8; + + /* 0=L, 1=GF, 2=ARF */ + + // Layer 0: predict from L and ARF; update L. + layer_flags[0] = VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_REF_GF; + layer_flags[4] = layer_flags[0]; + + // Layer 1: predict from L, G, ARF; update G. + layer_flags[2] = VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST; + layer_flags[6] = layer_flags[2]; + + // Layer 2: predict from L, G, ARF; update none. + layer_flags[1] = VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST | + VP8_EFLAG_NO_UPD_ENTROPY; + layer_flags[3] = layer_flags[1]; + layer_flags[5] = layer_flags[1]; + layer_flags[7] = layer_flags[1]; + break; + } } /* Open input file */ @@ -494,8 +627,9 @@ int main(int argc, char **argv) { /* Cap CPU & first I-frame size */ vpx_codec_control (&codec, VP8E_SET_CPUUSED, -6); - vpx_codec_control (&codec, VP8E_SET_STATIC_THRESHOLD, 800); + vpx_codec_control (&codec, VP8E_SET_STATIC_THRESHOLD, 1); vpx_codec_control (&codec, VP8E_SET_NOISE_SENSITIVITY, 1); + vpx_codec_control(&codec, VP8E_SET_TOKEN_PARTITIONS, 1); max_intra_size_pct = (int) (((double)cfg.rc_buf_optimal_sz * 0.5) * ((double) cfg.g_timebase.den / cfg.g_timebase.num) @@ -518,7 +652,7 @@ int main(int argc, char **argv) { die_codec(&codec, "Failed to encode frame"); /* Reset KF flag */ - if (layering_mode != 6) + if (layering_mode != 7) layer_flags[0] &= ~VPX_EFLAG_FORCE_KF; got_data = 0; @@ -538,14 +672,10 @@ int main(int argc, char **argv) { default: break; } - printf (pkt->kind == VPX_CODEC_CX_FRAME_PKT - && (pkt->data.frame.flags & VPX_FRAME_IS_KEY)? "K":"."); - fflush (stdout); } frame_cnt++; pts += frame_duration; } - printf ("\n"); fclose (infile); printf ("Processed %d frames.\n",frame_cnt-1); |