summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vp8/common/onyxc_int.h1
-rw-r--r--vp8/decoder/decodemv.c3
-rw-r--r--vp8/decoder/decodframe.c4
-rw-r--r--vp8/encoder/encodeframe.c30
-rw-r--r--vp8/encoder/ratectrl.c3
-rw-r--r--vp8_scalable_patterns.c202
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);