summaryrefslogtreecommitdiff
path: root/vp9/decoder
diff options
context:
space:
mode:
authorAdrian Grange <agrange@google.com>2013-06-09 10:10:33 -0700
committerAdrian Grange <agrange@google.com>2013-06-10 11:43:16 -0700
commiteac344ef100e774fa14833df4dbce4700e110d8b (patch)
treeb9bb91e274ec4ed6ceb297b2cbe23951fc6051ce /vp9/decoder
parenteedd98ac0a7aded03218acbc2391b8bc6c3e2b67 (diff)
downloadlibvpx-eac344ef100e774fa14833df4dbce4700e110d8b.tar
libvpx-eac344ef100e774fa14833df4dbce4700e110d8b.tar.gz
libvpx-eac344ef100e774fa14833df4dbce4700e110d8b.tar.bz2
libvpx-eac344ef100e774fa14833df4dbce4700e110d8b.zip
Implement intra-coded frames
Implements ability to signal and decode frames that are encoded using only intra coding modes. Only the decode side has been implemented here. Change-Id: I53ac6a8d90422cd08ba389e5236e15b45f9e93de
Diffstat (limited to 'vp9/decoder')
-rw-r--r--vp9/decoder/vp9_decodemv.c4
-rw-r--r--vp9/decoder/vp9_decodframe.c17
2 files changed, 11 insertions, 10 deletions
diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c
index 99902d92a..477296b31 100644
--- a/vp9/decoder/vp9_decodemv.c
+++ b/vp9/decoder/vp9_decodemv.c
@@ -337,7 +337,7 @@ static INLINE COMPPREDMODE_TYPE read_comp_pred_mode(vp9_reader *r) {
static void mb_mode_mv_init(VP9D_COMP *pbi, vp9_reader *r) {
VP9_COMMON *const cm = &pbi->common;
- if (cm->frame_type != KEY_FRAME) {
+ if ((cm->frame_type != KEY_FRAME) && (!cm->intra_only)) {
nmv_context *const nmvc = &pbi->common.fc.nmvc;
MACROBLOCKD *const xd = &pbi->mb;
int i, j;
@@ -816,7 +816,7 @@ void vp9_decode_mb_mode_mv(VP9D_COMP* const pbi,
MODE_INFO *mi = xd->mode_info_context;
MB_MODE_INFO *const mbmi = &mi->mbmi;
- if (cm->frame_type == KEY_FRAME) {
+ if ((cm->frame_type == KEY_FRAME) || cm->intra_only) {
kfread_modes(pbi, mi, mi_row, mi_col, r);
} else {
read_mb_modes_mv(pbi, mi, &mi->mbmi, mi_row, mi_col, r);
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index 1bc7696fb..21ac3987f 100644
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -308,7 +308,7 @@ static void decode_atom(VP9D_COMP *pbi, MACROBLOCKD *xd,
assert(mbmi->ref_frame[0] != INTRA_FRAME);
- if (pbi->common.frame_type != KEY_FRAME)
+ if ((pbi->common.frame_type != KEY_FRAME) && (!pbi->common.intra_only))
vp9_setup_interp_filters(xd, mbmi->interp_filter, &pbi->common);
// prediction
@@ -1062,8 +1062,6 @@ static size_t read_uncompressed_header(VP9D_COMP *pbi,
}
}
- vp9_setup_past_independence(cm, xd);
-
pbi->refresh_frame_flags = (1 << NUM_REF_FRAMES) - 1;
for (i = 0; i < ALLOWED_REFS_PER_FRAME; ++i)
@@ -1073,11 +1071,12 @@ static size_t read_uncompressed_header(VP9D_COMP *pbi,
} else {
cm->intra_only = cm->show_frame ? 0 : vp9_rb_read_bit(rb);
- if (cm->error_resilient_mode)
- vp9_setup_past_independence(cm, xd);
+ cm->reset_frame_context = cm->error_resilient_mode ?
+ 0 : vp9_rb_read_literal(rb, 2);
if (cm->intra_only) {
check_sync_code(cm, rb);
+
pbi->refresh_frame_flags = vp9_rb_read_literal(rb, NUM_REF_FRAMES);
setup_frame_size(pbi, rb);
} else {
@@ -1102,17 +1101,19 @@ static size_t read_uncompressed_header(VP9D_COMP *pbi,
}
if (!cm->error_resilient_mode) {
- cm->reset_frame_context = vp9_rb_read_literal(rb, 2);
cm->refresh_frame_context = vp9_rb_read_bit(rb);
cm->frame_parallel_decoding_mode = vp9_rb_read_bit(rb);
} else {
- cm->reset_frame_context = 0;
cm->refresh_frame_context = 0;
cm->frame_parallel_decoding_mode = 1;
}
cm->frame_context_idx = vp9_rb_read_literal(rb, NUM_FRAME_CONTEXTS_LG2);
+ if ((cm->frame_type == KEY_FRAME) ||
+ cm->error_resilient_mode || cm->intra_only)
+ vp9_setup_past_independence(cm, xd);
+
setup_loopfilter(pbi, rb);
setup_quantization(pbi, rb);
setup_segmentation(pbi, rb);
@@ -1215,7 +1216,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
if (!pc->error_resilient_mode && !pc->frame_parallel_decoding_mode) {
vp9_adapt_coef_probs(pc);
- if (!keyframe) {
+ if ((!keyframe) && (!pc->intra_only)) {
vp9_adapt_mode_probs(pc);
vp9_adapt_mode_context(pc);
vp9_adapt_nmv_probs(pc, xd->allow_high_precision_mv);