Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts: configure Change-Id: I2ce6b0a0507f9aa4e3fed8ea1cb69779db5f4566
This commit is contained in:
commit
46d9ff1b97
1
configure
vendored
1
configure
vendored
@ -214,6 +214,7 @@ HAVE_LIST="
|
||||
sys_mman_h
|
||||
"
|
||||
EXPERIMENT_LIST="
|
||||
extend_qrange
|
||||
segmentation
|
||||
csm
|
||||
"
|
||||
|
@ -287,6 +287,8 @@ typedef struct
|
||||
|
||||
void *current_bc;
|
||||
|
||||
int corrupted;
|
||||
|
||||
#if CONFIG_RUNTIME_CPU_DETECT
|
||||
struct VP8_COMMON_RTCD *rtcd;
|
||||
#endif
|
||||
|
@ -83,8 +83,18 @@ void vp8_machine_specific_config(VP8_COMMON *ctx)
|
||||
vp8_arch_x86_common_init(ctx);
|
||||
#endif
|
||||
|
||||
|
||||
#if ARCH_ARM
|
||||
vp8_arch_arm_common_init(ctx);
|
||||
#endif
|
||||
#if CONFIG_EXTEND_QRANGE
|
||||
rtcd->idct.idct1 = vp8_short_idct4x4llm_1_c;
|
||||
rtcd->idct.idct16 = vp8_short_idct4x4llm_c;
|
||||
rtcd->idct.idct1_scalar_add = vp8_dc_only_idct_add_c;
|
||||
rtcd->idct.iwalsh1 = vp8_short_inv_walsh4x4_1_c;
|
||||
rtcd->idct.iwalsh16 = vp8_short_inv_walsh4x4_c;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
}
|
||||
|
@ -22,6 +22,8 @@
|
||||
* so
|
||||
* x * sqrt(2) * cos (pi/8) = x + x * (sqrt(2) *cos(pi/8)-1).
|
||||
**************************************************************************/
|
||||
#include "vpx_ports/config.h"
|
||||
|
||||
static const int cospi8sqrt2minus1 = 20091;
|
||||
static const int sinpi8sqrt2 = 35468;
|
||||
static const int rounding = 0;
|
||||
@ -75,11 +77,19 @@ void vp8_short_idct4x4llm_c(short *input, short *output, int pitch)
|
||||
d1 = temp1 + temp2;
|
||||
|
||||
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
op[0] = (a1 + d1 + 4) >> 3;
|
||||
op[3] = (a1 - d1 + 4) >> 3;
|
||||
|
||||
op[1] = (b1 + c1 + 4) >> 3;
|
||||
op[2] = (b1 - c1 + 4) >> 3;
|
||||
#else
|
||||
op[0] = (a1 + d1 + 16) >> 5;
|
||||
op[3] = (a1 - d1 + 16) >> 5;
|
||||
|
||||
op[1] = (b1 + c1 + 16) >> 5;
|
||||
op[2] = (b1 - c1 + 16) >> 5;
|
||||
#endif
|
||||
|
||||
ip += shortpitch;
|
||||
op += shortpitch;
|
||||
@ -92,8 +102,11 @@ void vp8_short_idct4x4llm_1_c(short *input, short *output, int pitch)
|
||||
int a1;
|
||||
short *op = output;
|
||||
int shortpitch = pitch >> 1;
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
a1 = ((input[0] + 4) >> 3);
|
||||
|
||||
#else
|
||||
a1 = ((input[0] + 16) >> 5);
|
||||
#endif
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
op[0] = a1;
|
||||
@ -106,7 +119,11 @@ void vp8_short_idct4x4llm_1_c(short *input, short *output, int pitch)
|
||||
|
||||
void vp8_dc_only_idct_add_c(short input_dc, unsigned char *pred_ptr, unsigned char *dst_ptr, int pitch, int stride)
|
||||
{
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
int a1 = ((input_dc + 4) >> 3);
|
||||
#else
|
||||
int a1 = ((input_dc + 16) >> 5);
|
||||
#endif
|
||||
int r, c;
|
||||
|
||||
for (r = 0; r < 4; r++)
|
||||
@ -168,11 +185,17 @@ void vp8_short_inv_walsh4x4_c(short *input, short *output)
|
||||
c2 = a1 - b1;
|
||||
d2 = d1 - c1;
|
||||
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
op[0] = (a2 + 3) >> 3;
|
||||
op[1] = (b2 + 3) >> 3;
|
||||
op[2] = (c2 + 3) >> 3;
|
||||
op[3] = (d2 + 3) >> 3;
|
||||
|
||||
#else
|
||||
op[0] = (a2 + 1) >> 2;
|
||||
op[1] = (b2 + 1) >> 2;
|
||||
op[2] = (c2 + 1) >> 2;
|
||||
op[3] = (d2 + 1) >> 2;
|
||||
#endif
|
||||
ip += 4;
|
||||
op += 4;
|
||||
}
|
||||
@ -184,7 +207,11 @@ void vp8_short_inv_walsh4x4_1_c(short *input, short *output)
|
||||
int a1;
|
||||
short *op = output;
|
||||
|
||||
a1 = ((input[0] + 3) >> 3);
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
a1 = (input[0] + 3 )>> 3;
|
||||
#else
|
||||
a1 = (input[0] + 1 )>> 2;
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
|
@ -11,6 +11,8 @@
|
||||
|
||||
#include "quant_common.h"
|
||||
|
||||
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
static const int dc_qlookup[QINDEX_RANGE] =
|
||||
{
|
||||
4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17,
|
||||
@ -34,7 +36,32 @@ static const int ac_qlookup[QINDEX_RANGE] =
|
||||
155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209,
|
||||
213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,
|
||||
};
|
||||
#else
|
||||
|
||||
static const int dc_qlookup[QINDEX_RANGE] =
|
||||
{
|
||||
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 32, 34, 36, 38, 40, 42,
|
||||
44, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88,
|
||||
92, 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152,
|
||||
156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200, 205, 210, 215, 220,
|
||||
225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300,
|
||||
310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460,
|
||||
472, 484, 496, 508, 520, 532, 544, 556, 572, 588, 608, 628, 648, 668, 692, 720,
|
||||
};
|
||||
|
||||
static const int ac_qlookup[QINDEX_RANGE] =
|
||||
{
|
||||
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 51,
|
||||
54, 57, 60, 63, 66, 69, 72, 76, 80, 84, 88, 92, 96, 100, 105, 110,
|
||||
115, 120, 125, 130, 135, 140, 146, 152, 158, 164, 170, 176, 182, 188, 194, 200,
|
||||
206, 212, 218, 224, 232, 240, 248, 256, 264, 272, 280, 288, 296, 304, 312, 320,
|
||||
330, 340, 350, 360, 370, 380, 392, 404, 416, 428, 440, 454, 468, 482, 496, 510,
|
||||
524, 540, 556, 572, 588, 604, 622, 640, 658, 676, 696, 716, 736, 756, 776, 796,
|
||||
820, 844, 868, 892, 916, 944, 972, 1000, 1032, 1064, 1096, 1128, 1168, 1208, 1252, 1300
|
||||
};
|
||||
#endif
|
||||
|
||||
int vp8_dc_quant(int QIndex, int Delta)
|
||||
{
|
||||
@ -62,7 +89,11 @@ int vp8_dc2quant(int QIndex, int Delta)
|
||||
else if (QIndex < 0)
|
||||
QIndex = 0;
|
||||
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
retval = dc_qlookup[ QIndex ] * 2;
|
||||
#else
|
||||
retval = dc_qlookup[ QIndex ];
|
||||
#endif
|
||||
return retval;
|
||||
|
||||
}
|
||||
@ -72,16 +103,13 @@ int vp8_dc_uv_quant(int QIndex, int Delta)
|
||||
|
||||
QIndex = QIndex + Delta;
|
||||
|
||||
if (QIndex > 127)
|
||||
QIndex = 127;
|
||||
if (QIndex > 117)
|
||||
QIndex = 117;
|
||||
else if (QIndex < 0)
|
||||
QIndex = 0;
|
||||
|
||||
retval = dc_qlookup[ QIndex ];
|
||||
|
||||
if (retval > 132)
|
||||
retval = 132;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -108,12 +136,13 @@ int vp8_ac2quant(int QIndex, int Delta)
|
||||
QIndex = 127;
|
||||
else if (QIndex < 0)
|
||||
QIndex = 0;
|
||||
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
retval = (ac_qlookup[ QIndex ] * 155) / 100;
|
||||
|
||||
if (retval < 8)
|
||||
retval = 8;
|
||||
|
||||
#else
|
||||
retval = ac_qlookup[ QIndex ];
|
||||
#endif
|
||||
return retval;
|
||||
}
|
||||
int vp8_ac_uv_quant(int QIndex, int Delta)
|
||||
|
@ -206,4 +206,29 @@ static int vp8_decode_value(BOOL_DECODER *br, int bits)
|
||||
|
||||
return z;
|
||||
}
|
||||
|
||||
static int vp8dx_bool_error(BOOL_DECODER *br)
|
||||
{
|
||||
/* Check if we have reached the end of the buffer.
|
||||
*
|
||||
* Variable 'count' stores the number of bits in the 'value' buffer,
|
||||
* minus 8. So if count == 8, there are 16 bits available to be read.
|
||||
* Normally, count is filled with 8 and one byte is filled into the
|
||||
* value buffer. When we reach the end of the buffer, count is instead
|
||||
* filled with VP8_LOTS_OF_BITS, 8 of which represent the last 8 real
|
||||
* bits from the bitstream. So the last bit in the bitstream will be
|
||||
* represented by count == VP8_LOTS_OF_BITS - 16.
|
||||
*/
|
||||
if ((br->count > VP8_BD_VALUE_SIZE)
|
||||
&& (br->count <= VP8_LOTS_OF_BITS - 16))
|
||||
{
|
||||
/* We have tried to decode bits after the end of
|
||||
* stream was encountered.
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* No error. */
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -381,6 +381,12 @@ void vp8_decode_mb_row(VP8D_COMP *pbi,
|
||||
xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset;
|
||||
xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset;
|
||||
|
||||
if (xd->mode_info_context->mbmi.ref_frame != INTRA_FRAME)
|
||||
{
|
||||
/* propagate errors from reference frames */
|
||||
xd->corrupted |= pc->yv12_fb[ref_fb_idx].corrupted;
|
||||
}
|
||||
|
||||
vp8_build_uvmvs(xd, pc->full_pixel);
|
||||
|
||||
/*
|
||||
@ -391,6 +397,8 @@ void vp8_decode_mb_row(VP8D_COMP *pbi,
|
||||
*/
|
||||
vp8_decode_macroblock(pbi, xd);
|
||||
|
||||
/* check if the boolean decoder has suffered an error */
|
||||
xd->corrupted |= vp8dx_bool_error(xd->current_bc);
|
||||
|
||||
recon_yoffset += 16;
|
||||
recon_uvoffset += 8;
|
||||
@ -555,6 +563,7 @@ static void init_frame(VP8D_COMP *pbi)
|
||||
xd->frame_type = pc->frame_type;
|
||||
xd->mode_info_context->mbmi.mode = DC_PRED;
|
||||
xd->mode_info_stride = pc->mode_info_stride;
|
||||
xd->corrupted = 0; /* init without corruption */
|
||||
}
|
||||
|
||||
int vp8_decode_frame(VP8D_COMP *pbi)
|
||||
@ -569,6 +578,10 @@ int vp8_decode_frame(VP8D_COMP *pbi)
|
||||
int i, j, k, l;
|
||||
const int *const mb_feature_data_bits = vp8_mb_feature_data_bits;
|
||||
|
||||
/* start with no corruption of current frame */
|
||||
xd->corrupted = 0;
|
||||
pc->yv12_fb[pc->new_fb_idx].corrupted = 0;
|
||||
|
||||
if (data_end - data < 3)
|
||||
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
||||
"Truncated packet");
|
||||
@ -896,6 +909,14 @@ int vp8_decode_frame(VP8D_COMP *pbi)
|
||||
|
||||
stop_token_decoder(pbi);
|
||||
|
||||
/* Collect information about decoder corruption. */
|
||||
/* 1. Check first boolean decoder for errors. */
|
||||
pc->yv12_fb[pc->new_fb_idx].corrupted =
|
||||
vp8dx_bool_error(bc);
|
||||
/* 2. Check the macroblock information */
|
||||
pc->yv12_fb[pc->new_fb_idx].corrupted |=
|
||||
xd->corrupted;
|
||||
|
||||
/* vpx_log("Decoder: Frame Decoded, Size Roughly:%d bytes \n",bc->pos+pbi->bc2.pos); */
|
||||
|
||||
/* If this was a kf or Gf note the Q used */
|
||||
|
@ -39,7 +39,16 @@ void vp8_dmachine_specific_config(VP8D_COMP *pbi)
|
||||
vp8_arch_x86_decode_init(pbi);
|
||||
#endif
|
||||
|
||||
|
||||
#if ARCH_ARM
|
||||
vp8_arch_arm_decode_init(pbi);
|
||||
#endif
|
||||
|
||||
#if CONFIG_EXTEND_QRANGE
|
||||
pbi->dequant.idct_add = vp8_dequant_idct_add_c;
|
||||
pbi->dequant.dc_idct_add = vp8_dequant_dc_idct_add_c;
|
||||
pbi->dequant.dc_idct_add_y_block = vp8_dequant_dc_idct_add_y_block_c;
|
||||
pbi->dequant.idct_add_y_block = vp8_dequant_idct_add_y_block_c;
|
||||
pbi->dequant.idct_add_uv_block = vp8_dequant_idct_add_uv_block_c;
|
||||
#endif
|
||||
}
|
||||
|
@ -332,6 +332,23 @@ int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsign
|
||||
|
||||
pbi->common.error.error_code = VPX_CODEC_OK;
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
/* This is used to signal that we are missing frames.
|
||||
* We do not know if the missing frame(s) was supposed to update
|
||||
* any of the reference buffers, but we act conservative and
|
||||
* mark only the last buffer as corrupted.
|
||||
*/
|
||||
cm->yv12_fb[cm->lst_fb_idx].corrupted = 1;
|
||||
|
||||
/* Signal that we have no frame to show. */
|
||||
cm->show_frame = 0;
|
||||
|
||||
/* Nothing more to do. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#if HAVE_ARMV7
|
||||
#if CONFIG_RUNTIME_CPU_DETECT
|
||||
if (cm->rtcd.flags & HAS_NEON)
|
||||
@ -354,6 +371,13 @@ int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsign
|
||||
}
|
||||
#endif
|
||||
pbi->common.error.setjmp = 0;
|
||||
|
||||
/* We do not know if the missing frame(s) was supposed to update
|
||||
* any of the reference buffers, but we act conservative and
|
||||
* mark only the last buffer as corrupted.
|
||||
*/
|
||||
cm->yv12_fb[cm->lst_fb_idx].corrupted = 1;
|
||||
|
||||
if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0)
|
||||
cm->fb_idx_ref_cnt[cm->new_fb_idx]--;
|
||||
return -1;
|
||||
|
@ -890,9 +890,18 @@ void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd)
|
||||
xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset;
|
||||
xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset;
|
||||
|
||||
if (xd->mode_info_context->mbmi.ref_frame != INTRA_FRAME)
|
||||
{
|
||||
/* propagate errors from reference frames */
|
||||
xd->corrupted |= pc->yv12_fb[ref_fb_idx].corrupted;
|
||||
}
|
||||
|
||||
vp8_build_uvmvs(xd, pc->full_pixel);
|
||||
vp8mt_decode_macroblock(pbi, xd, mb_row, mb_col);
|
||||
|
||||
/* check if the boolean decoder has suffered an error */
|
||||
xd->corrupted |= vp8dx_bool_error(xd->current_bc);
|
||||
|
||||
if (pbi->common.filter_level)
|
||||
{
|
||||
/* Save decoded MB last row data for next-row decoding */
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "vpx_ports/config.h"
|
||||
void vp8_short_fdct4x4_c(short *input, short *output, int pitch)
|
||||
{
|
||||
int i;
|
||||
@ -20,11 +20,17 @@ void vp8_short_fdct4x4_c(short *input, short *output, int pitch)
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
#if CONFIG_EXTEND_QRANGE
|
||||
a1 = ((ip[0] + ip[3])<<5);
|
||||
b1 = ((ip[1] + ip[2])<<5);
|
||||
c1 = ((ip[1] - ip[2])<<5);
|
||||
d1 = ((ip[0] - ip[3])<<5);
|
||||
#else
|
||||
a1 = ((ip[0] + ip[3])<<3);
|
||||
b1 = ((ip[1] + ip[2])<<3);
|
||||
c1 = ((ip[1] - ip[2])<<3);
|
||||
d1 = ((ip[0] - ip[3])<<3);
|
||||
|
||||
#endif
|
||||
op[0] = a1 + b1;
|
||||
op[2] = a1 - b1;
|
||||
|
||||
@ -72,12 +78,22 @@ void vp8_short_walsh4x4_c(short *input, short *output, int pitch)
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
a1 = ((ip[0] + ip[2])<<2);
|
||||
d1 = ((ip[1] + ip[3])<<2);
|
||||
c1 = ((ip[1] - ip[3])<<2);
|
||||
b1 = ((ip[0] - ip[2])<<2);
|
||||
|
||||
op[0] = a1 + d1 + (a1!=0);
|
||||
#else
|
||||
a1 = ((ip[0] + ip[2]));
|
||||
d1 = ((ip[1] + ip[3]));
|
||||
c1 = ((ip[1] - ip[3]));
|
||||
b1 = ((ip[0] - ip[2]));
|
||||
|
||||
|
||||
op[0] = a1 + d1;
|
||||
#endif
|
||||
op[1] = b1 + c1;
|
||||
op[2] = b1 - c1;
|
||||
op[3] = a1 - d1;
|
||||
@ -105,11 +121,17 @@ void vp8_short_walsh4x4_c(short *input, short *output, int pitch)
|
||||
c2 += c2<0;
|
||||
d2 += d2<0;
|
||||
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
op[0] = (a2+3) >> 3;
|
||||
op[4] = (b2+3) >> 3;
|
||||
op[8] = (c2+3) >> 3;
|
||||
op[12]= (d2+3) >> 3;
|
||||
|
||||
#else
|
||||
op[0] = (a2+1) >> 2;
|
||||
op[4] = (b2+1) >> 2;
|
||||
op[8] = (c2+1) >> 2;
|
||||
op[12]= (d2+1) >> 2;
|
||||
#endif
|
||||
ip++;
|
||||
op++;
|
||||
}
|
||||
|
@ -760,7 +760,7 @@ void vp8_encode_frame(VP8_COMP *cpi)
|
||||
vp8_auto_select_speed(cpi);
|
||||
}
|
||||
|
||||
vp8_initialize_rd_consts(cpi, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
|
||||
vp8_initialize_rd_consts(cpi, cm->base_qindex + cm->y1dc_delta_q);
|
||||
vp8cx_initialize_me_consts(cpi, cm->base_qindex);
|
||||
|
||||
// Copy data over into macro block data sturctures.
|
||||
|
@ -245,7 +245,11 @@ struct vp8_token_state{
|
||||
// TODO: experiments to find optimal multiple numbers
|
||||
#define Y1_RD_MULT 4
|
||||
#define UV_RD_MULT 2
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
#define Y2_RD_MULT 16
|
||||
#else
|
||||
#define Y2_RD_MULT 4
|
||||
#endif
|
||||
|
||||
static const int plane_rd_mult[4]=
|
||||
{
|
||||
|
@ -578,7 +578,7 @@ void vp8_first_pass(VP8_COMP *cpi)
|
||||
//if ( 0 )
|
||||
{
|
||||
int flag[2] = {1, 1};
|
||||
vp8_initialize_rd_consts(cpi, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
|
||||
vp8_initialize_rd_consts(cpi, cm->base_qindex+cm->y1dc_delta_q);
|
||||
vpx_memcpy(cm->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
|
||||
vp8_build_component_cost_table(cpi->mb.mvcost, cpi->mb.mvsadcost, (const MV_CONTEXT *) cm->fc.mvc, flag);
|
||||
}
|
||||
@ -1487,7 +1487,7 @@ static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
|
||||
// Break out conditions.
|
||||
if ( /* i>4 || */
|
||||
// Break at cpi->max_gf_interval unless almost totally static
|
||||
(i >= cpi->max_gf_interval && (loop_decay_rate < 0.99)) ||
|
||||
(i >= cpi->max_gf_interval && (decay_accumulator < 0.99)) ||
|
||||
(
|
||||
// Dont break out with a very short interval
|
||||
(i > MIN_GF_INTERVAL) &&
|
||||
|
@ -111,4 +111,12 @@ void vp8_cmachine_specific_config(VP8_COMP *cpi)
|
||||
vp8_arch_arm_encoder_init(cpi);
|
||||
#endif
|
||||
|
||||
#if CONFIG_EXTEND_QRANGE
|
||||
cpi->rtcd.fdct.short4x4 = vp8_short_fdct4x4_c;
|
||||
cpi->rtcd.fdct.short8x4 = vp8_short_fdct8x4_c;
|
||||
cpi->rtcd.fdct.fast4x4 = vp8_short_fdct4x4_c;
|
||||
cpi->rtcd.fdct.fast8x4 = vp8_short_fdct8x4_c;
|
||||
cpi->rtcd.fdct.walsh_short4x4 = vp8_short_walsh4x4_c;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
@ -151,7 +151,7 @@ extern const int qrounding_factors[129];
|
||||
extern const int qzbin_factors[129];
|
||||
extern void vp8cx_init_quantizer(VP8_COMP *cpi);
|
||||
extern const int vp8cx_base_skip_false_prob[128];
|
||||
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
// Tables relating active max Q to active min Q
|
||||
static const int kf_low_motion_minq[QINDEX_RANGE] =
|
||||
{
|
||||
@ -219,7 +219,76 @@ static const int inter_minq[QINDEX_RANGE] =
|
||||
71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
|
||||
86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
|
||||
};
|
||||
#else
|
||||
static const int kf_low_motion_minq[QINDEX_RANGE] =
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
|
||||
4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8,
|
||||
9, 9, 9, 10,10,11,11,12,12,13,13,14,14,15,15,16,
|
||||
16,17,17,18,18,19,19,20,20,21,21,22,23,23,24,24,
|
||||
25,25,26,27,28,29,30,30,31,32,33,34,35,35,36,36,
|
||||
38,38,39,40,40,41,42,42,43,44,44,45,46,46,47,48,
|
||||
49,49,50,50,51,52,52,53,54,55,56,57,58,59,60,61,
|
||||
};
|
||||
static const int kf_high_motion_minq[QINDEX_RANGE] =
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2,
|
||||
2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6,
|
||||
6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9,10,10,
|
||||
11,11,12,13,14,15,16,17,18,19,20,21,22,23,24,24,
|
||||
25,26,27,28,28,29,29,30,30,31,31,32,33,33,34,34,
|
||||
35,36,37,38,39,39,40,41,41,42,43,44,45,45,46,46,
|
||||
47,47,48,48,49,49,50,50,51,51,52,52,53,53,54,54,
|
||||
55,55,56,56,57,58,59,60,61,62,63,64,65,67,69,70,
|
||||
};
|
||||
|
||||
static const int gf_low_motion_minq[QINDEX_RANGE] =
|
||||
{
|
||||
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4,
|
||||
4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9,
|
||||
10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,
|
||||
17,18,18,19,19,20,21,22,23,24,25,26,27,29,29,30,
|
||||
31,32,33,34,35,36,37,38,39,40,41,41,42,42,43,43,
|
||||
44,44,45,45,46,46,47,47,48,48,49,49,50,50,51,51,
|
||||
52,52,53,53,54,54,55,55,56,56,57,57,58,59,60,61,
|
||||
62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,
|
||||
};
|
||||
static const int gf_mid_motion_minq[QINDEX_RANGE] =
|
||||
{
|
||||
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4,
|
||||
4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9,10,
|
||||
10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,
|
||||
18,19,19,20,20,21,22,23,24,25,26,27,28,29,30,31,
|
||||
32,33,34,35,35,36,36,37,37,38,38,39,39,40,40,41,
|
||||
41,42,42,43,43,44,44,45,45,46,46,47,48,49,50,51,
|
||||
52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,
|
||||
68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,
|
||||
};
|
||||
static const int gf_high_motion_minq[QINDEX_RANGE] =
|
||||
{
|
||||
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4,
|
||||
4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9,10,10,
|
||||
11,11,12,12,13,14,15,16,17,18,18,19,19,20,20,21,
|
||||
22,23,24,25,26,26,27,28,29,30,31,32,33,34,35,36,
|
||||
37,38,39,39,40,40,40,41,41,41,42,42,43,43,44,44,
|
||||
44,45,45,45,46,46,47,47,47,48,48,48,49,49,49,50,
|
||||
50,50,51,51,52,53,54,54,55,56,57,57,58,59,60,61,
|
||||
62,63,64,66,68,69,72,74,77,80,82,85,87,89,91,93,
|
||||
};
|
||||
|
||||
static const int inter_minq[QINDEX_RANGE] =
|
||||
{
|
||||
0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
|
||||
8, 9,10,11,12,13,14,15,16,17,18,18,19,19,20,21,
|
||||
21,22,23,23,24,25,26,26,27,28,29,30,31,32,32,33,
|
||||
34,35,36,36,37,38,39,40,40,41,41,42,43,44,44,45,
|
||||
46,46,47,47,48,49,49,50,50,51,52,52,53,54,54,55,
|
||||
55,56,57,57,58,59,60,60,61,62,63,63,64,65,66,67,
|
||||
68,68,69,70,71,72,72,73,74,75,76,77,78,79,80,81,
|
||||
81,82,83,84,85,86,87,88,89,90,90,91,92,93,94,95,
|
||||
};
|
||||
#endif
|
||||
void vp8_initialize()
|
||||
{
|
||||
static int init_done = 0;
|
||||
@ -3462,6 +3531,12 @@ static int decide_key_frame(VP8_COMP *cpi)
|
||||
return code_key_frame;
|
||||
|
||||
}
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
#define FIRSTPASS_QINDEX 26
|
||||
#else
|
||||
#define FIRSTPASS_QINDEX 49
|
||||
#endif
|
||||
|
||||
|
||||
#if !(CONFIG_REALTIME_ONLY)
|
||||
static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
|
||||
@ -4106,6 +4181,17 @@ static void encode_frame_to_data_rate
|
||||
|
||||
vp8_clear_system_state(); //__asm emms;
|
||||
|
||||
#if 0
|
||||
if (cpi->pass != 1)
|
||||
{
|
||||
FILE *f = fopen("q_used.stt", "a");
|
||||
fprintf(f, "%4d, %4d, %8d\n", cpi->common.current_video_frame,
|
||||
cpi->common.base_qindex, cpi->projected_frame_size);
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// Test to see if the stats generated for this frame indicate that we should have coded a key frame
|
||||
// (assuming that we didn't)!
|
||||
if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
|
||||
@ -4842,10 +4928,15 @@ static void encode_frame_to_data_rate
|
||||
fclose(recon_file);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
// DEBUG
|
||||
//vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show);
|
||||
|
||||
if(cm->current_video_frame>173 && cm->current_video_frame<178)
|
||||
{
|
||||
char filename[512];
|
||||
sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
|
||||
vp8_write_yuv_frame(filename, cm->frame_to_show);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
@ -5415,7 +5506,15 @@ int vp8_get_compressed_data(VP8_PTR ptr, unsigned int *frame_flags, unsigned lon
|
||||
cpi->totalp_v += v2;
|
||||
cpi->totalp += frame_psnr2;
|
||||
cpi->total_sq_error2 += sq_error;
|
||||
|
||||
#if 0
|
||||
{
|
||||
FILE *f = fopen("q_used.stt", "a");
|
||||
fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n",
|
||||
cpi->common.current_video_frame,y2, u2, v2,
|
||||
frame_psnr2, frame_ssim2);
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -48,6 +48,7 @@ extern int inter_b_modes[10];
|
||||
// Work in progress recalibration of baseline rate tables based on
|
||||
// the assumption that bits per mb is inversely proportional to the
|
||||
// quantizer value.
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
const int vp8_bits_per_mb[2][QINDEX_RANGE] =
|
||||
{
|
||||
// Intra case 450000/Qintra
|
||||
@ -89,10 +90,54 @@ const int vp8_bits_per_mb[2][QINDEX_RANGE] =
|
||||
11445, 11220, 11003, 10795, 10594, 10401, 10215, 10035,
|
||||
}
|
||||
};
|
||||
#else
|
||||
const int vp8_bits_per_mb[2][QINDEX_RANGE] =
|
||||
{
|
||||
// (Updated DEC 2010) Baseline estimate of Bits Per MB at each Q:
|
||||
// 4500000/Qintra
|
||||
{
|
||||
4500000,3600000,3000000,2571428,2250000,2000000,1800000,1636363,
|
||||
1500000,1384615,1285714,1200000,1125000,1058823,1000000, 947368,
|
||||
900000, 818181, 750000, 692307, 642857, 600000, 562500, 529411,
|
||||
500000, 473684, 450000, 428571, 409090, 391304, 375000, 352941,
|
||||
333333, 315789, 300000, 285714, 272727, 260869, 250000, 236842,
|
||||
225000, 214285, 204545, 195652, 187500, 180000, 171428, 163636,
|
||||
156521, 150000, 144000, 138461, 133333, 128571, 123287, 118421,
|
||||
113924, 109756, 105882, 102272, 98901, 95744, 92783, 90000,
|
||||
87378, 84905, 82568, 80357, 77586, 75000, 72580, 70312,
|
||||
68181, 66176, 64285, 62500, 60810, 59210, 57692, 56250,
|
||||
54545, 52941, 51428, 50000, 48648, 47368, 45918, 44554,
|
||||
43269, 42056, 40909, 39647, 38461, 37344, 36290, 35294,
|
||||
34351, 33333, 32374, 31468, 30612, 29801, 28938, 28125,
|
||||
27355, 26627, 25862, 25139, 24456, 23809, 23195, 22613,
|
||||
21951, 21327, 20737, 20179, 19650, 19067, 18518, 18000,
|
||||
17441, 16917, 16423, 15957, 15410, 14900, 14376, 13846,
|
||||
},
|
||||
//2850000/Qinter
|
||||
{
|
||||
2850000,2280000,1900000,1628571,1425000,1266666,1140000,1036363,
|
||||
950000, 876923, 814285, 760000, 712500, 670588, 633333, 600000,
|
||||
570000, 518181, 475000, 438461, 407142, 380000, 356250, 335294,
|
||||
316666, 300000, 285000, 271428, 259090, 247826, 237500, 223529,
|
||||
211111, 200000, 190000, 180952, 172727, 165217, 158333, 150000,
|
||||
142500, 135714, 129545, 123913, 118750, 114000, 108571, 103636,
|
||||
99130, 95000, 91200, 87692, 84444, 81428, 78082, 75000,
|
||||
72151, 69512, 67058, 64772, 62637, 60638, 58762, 57000,
|
||||
55339, 53773, 52293, 50892, 49137, 47500, 45967, 44531,
|
||||
43181, 41911, 40714, 39583, 38513, 37500, 36538, 35625,
|
||||
34545, 33529, 32571, 31666, 30810, 30000, 29081, 28217,
|
||||
27403, 26635, 25909, 25110, 24358, 23651, 22983, 22352,
|
||||
21755, 21111, 20503, 19930, 19387, 18874, 18327, 17812,
|
||||
17325, 16863, 16379, 15921, 15489, 15079, 14690, 14321,
|
||||
13902, 13507, 13133, 12780, 12445, 12076, 11728, 11400,
|
||||
11046, 10714, 10401, 10106, 9760, 9437, 9105, 8769,
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
const int vp8_kf_boost_qadjustment[QINDEX_RANGE] =
|
||||
{
|
||||
128, 129, 130, 131, 132, 133, 134, 135,
|
||||
{
|
||||
128, 129, 130, 131, 132, 133, 134, 135,
|
||||
136, 137, 138, 139, 140, 141, 142, 143,
|
||||
144, 145, 146, 147, 148, 149, 150, 151,
|
||||
152, 153, 154, 155, 156, 157, 158, 159,
|
||||
|
@ -158,6 +158,48 @@ static int rd_iifactor [ 32 ] = { 4, 4, 3, 2, 1, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
};
|
||||
|
||||
// 3* dc_qlookup[Q]*dc_qlookup[Q];
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
static int rdmult_lut[QINDEX_RANGE]=
|
||||
{
|
||||
48,75,108,147,192,243,300,300,
|
||||
363,432,507,588,675,768,867,867,
|
||||
972,1083,1200,1200,1323,1323,1452,1452,
|
||||
1587,1587,1728,1875,1875,2028,2187,2352,
|
||||
2523,2700,2883,3072,3267,3468,3675,3888,
|
||||
4107,4107,4332,4563,4800,5043,5292,5547,
|
||||
5808,6075,6348,6348,6627,6912,7203,7500,
|
||||
7803,8112,8427,8748,9075,9408,9747,10092,
|
||||
10443,10800,11163,11532,11907,12288,12675,13068,
|
||||
13467,13872,14283,14700,15123,15552,15987,16428,
|
||||
16875,17328,17328,17787,18252,18723,19200,19683,
|
||||
20172,20667,21168,21675,22188,22707,23232,23763,
|
||||
24843,25947,27075,27648,28812,30000,30603,31212,
|
||||
32448,33708,34992,36300,37632,38988,40368,41772,
|
||||
44652,46128,47628,49152,50700,52272,53868,55488,
|
||||
57132,58800,61347,63075,65712,68403,71148,73947,
|
||||
};
|
||||
#else
|
||||
static int rdmult_lut[QINDEX_RANGE]=
|
||||
{
|
||||
3,5,7,9,12,15,19,23,
|
||||
27,32,37,42,48,54,61,68,
|
||||
75,83,91,99,108,117,127,137,
|
||||
147,169,192,217,243,271,300,331,
|
||||
363,397,450,507,567,631,698,768,
|
||||
842,919,999,1083,1170,1261,1355,1452,
|
||||
1587,1728,1875,2028,2187,2352,2523,2700,
|
||||
2883,3072,3267,3468,3675,3888,4107,4332,
|
||||
4563,4800,5043,5292,5547,5808,6075,6348,
|
||||
6627,6912,7203,7500,7880,8269,8667,9075,
|
||||
9492,9919,10355,10800,11255,11719,12192,12675,
|
||||
13167,13669,14180,14700,15230,15769,16317,16875,
|
||||
18019,19200,20419,21675,22969,24300,25669,27075,
|
||||
28519,30000,31519,33075,34669,36300,37969,39675,
|
||||
41772,43923,46128,48387,50700,53067,55488,57963,
|
||||
61347,64827,69312,73947,78732,83667,89787,97200,
|
||||
};
|
||||
#endif
|
||||
|
||||
/* values are now correlated to quantizer */
|
||||
static int sad_per_bit16lut[QINDEX_RANGE] =
|
||||
@ -205,12 +247,16 @@ void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex)
|
||||
cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex];
|
||||
}
|
||||
|
||||
void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
|
||||
|
||||
|
||||
|
||||
|
||||
void vp8_initialize_rd_consts(VP8_COMP *cpi, int QIndex)
|
||||
{
|
||||
int q;
|
||||
int i;
|
||||
double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0;
|
||||
double rdconst = 3.00;
|
||||
int *thresh;
|
||||
int threshmult;
|
||||
|
||||
vp8_clear_system_state(); //__asm emms;
|
||||
|
||||
@ -218,7 +264,8 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
|
||||
// for key frames, golden frames and arf frames.
|
||||
// if (cpi->common.refresh_golden_frame ||
|
||||
// cpi->common.refresh_alt_ref_frame)
|
||||
cpi->RDMULT = (int)(rdconst * (capped_q * capped_q));
|
||||
QIndex=(QIndex<0)? 0 : ((QIndex>127)?127 : QIndex);
|
||||
cpi->RDMULT = rdmult_lut[QIndex];
|
||||
|
||||
// Extend rate multiplier along side quantizer zbin increases
|
||||
if (cpi->zbin_over_quant > 0)
|
||||
@ -229,8 +276,7 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
|
||||
// Experimental code using the same basic equation as used for Q above
|
||||
// The units of cpi->zbin_over_quant are 1/128 of Q bin size
|
||||
oq_factor = 1.0 + ((double)0.0015625 * cpi->zbin_over_quant);
|
||||
modq = (int)((double)capped_q * oq_factor);
|
||||
cpi->RDMULT = (int)(rdconst * (modq * modq));
|
||||
cpi->RDMULT = (int)((double)cpi->RDMULT * oq_factor * oq_factor);
|
||||
}
|
||||
|
||||
if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME))
|
||||
@ -241,20 +287,35 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
|
||||
cpi->RDMULT += (cpi->RDMULT * rd_iifactor[cpi->next_iiratio]) >> 4;
|
||||
}
|
||||
|
||||
#if !CONFIG_EXTEND_QRANGE
|
||||
if (cpi->RDMULT < 125)
|
||||
cpi->RDMULT = 125;
|
||||
#else
|
||||
if (cpi->RDMULT < 7)
|
||||
cpi->RDMULT = 7;
|
||||
#endif
|
||||
|
||||
cpi->mb.errorperbit = (cpi->RDMULT / 100);
|
||||
#if CONFIG_EXTEND_QRANGE
|
||||
if(cpi->mb.errorperbit<1)
|
||||
cpi->mb.errorperbit=1;
|
||||
#endif
|
||||
vp8_set_speed_features(cpi);
|
||||
|
||||
if (cpi->common.simpler_lpf)
|
||||
cpi->common.filter_type = SIMPLE_LOOPFILTER;
|
||||
|
||||
q = (int)pow(Qvalue, 1.25);
|
||||
q = (int)pow(vp8_dc_quant(QIndex,0), 1.25);
|
||||
|
||||
if (q < 8)
|
||||
q = 8;
|
||||
|
||||
|
||||
|
||||
#if CONFIG_EXTEND_QRANGE
|
||||
cpi->RDMULT *= 16;
|
||||
#endif
|
||||
|
||||
if (cpi->RDMULT > 1000)
|
||||
{
|
||||
cpi->RDDIV = 1;
|
||||
@ -972,7 +1033,11 @@ static void macro_block_yrd(MACROBLOCK *mb, int *Rate, int *Distortion, const vp
|
||||
|
||||
// Distortion
|
||||
d = ENCODEMB_INVOKE(rtcd, mberr)(mb, 1) << 2;
|
||||
#if CONFIG_EXTEND_QRANGE
|
||||
d += ENCODEMB_INVOKE(rtcd, berr)(mb_y2->coeff, x_y2->dqcoeff)<<2;
|
||||
#else
|
||||
d += ENCODEMB_INVOKE(rtcd, berr)(mb_y2->coeff, x_y2->dqcoeff);
|
||||
#endif
|
||||
|
||||
*Distortion = (d >> 4);
|
||||
|
||||
|
@ -709,6 +709,25 @@ static vpx_codec_err_t vp8_get_last_ref_updates(vpx_codec_alg_priv_t *ctx,
|
||||
}
|
||||
|
||||
|
||||
static vpx_codec_err_t vp8_get_frame_corrupted(vpx_codec_alg_priv_t *ctx,
|
||||
int ctrl_id,
|
||||
va_list args)
|
||||
{
|
||||
|
||||
int *corrupted = va_arg(args, int *);
|
||||
|
||||
if (corrupted)
|
||||
{
|
||||
VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi;
|
||||
*corrupted = pbi->common.frame_to_show->corrupted;
|
||||
|
||||
return VPX_CODEC_OK;
|
||||
}
|
||||
else
|
||||
return VPX_CODEC_INVALID_PARAM;
|
||||
|
||||
}
|
||||
|
||||
vpx_codec_ctrl_fn_map_t vp8_ctf_maps[] =
|
||||
{
|
||||
{VP8_SET_REFERENCE, vp8_set_reference},
|
||||
@ -719,6 +738,7 @@ vpx_codec_ctrl_fn_map_t vp8_ctf_maps[] =
|
||||
{VP8_SET_DBG_COLOR_B_MODES, vp8_set_dbg_options},
|
||||
{VP8_SET_DBG_DISPLAY_MV, vp8_set_dbg_options},
|
||||
{VP8D_GET_LAST_REF_UPDATES, vp8_get_last_ref_updates},
|
||||
{VP8D_GET_FRAME_CORRUPTED, vp8_get_frame_corrupted},
|
||||
{ -1, NULL},
|
||||
};
|
||||
|
||||
|
@ -118,7 +118,9 @@ vpx_codec_err_t vpx_codec_decode(vpx_codec_ctx_t *ctx,
|
||||
{
|
||||
vpx_codec_err_t res;
|
||||
|
||||
if (!ctx || !data || !data_sz)
|
||||
/* Sanity checks */
|
||||
/* NULL data ptr allowed if data_sz is 0 too */
|
||||
if (!ctx || (!data && data_sz))
|
||||
res = VPX_CODEC_INVALID_PARAM;
|
||||
else if (!ctx->iface || !ctx->priv)
|
||||
res = VPX_CODEC_ERROR;
|
||||
|
@ -45,6 +45,7 @@ enum vp8d_dec_control_id
|
||||
VP8_DECODER_CTRL_ID_START = 256,
|
||||
VP8D_GET_LAST_REF_UPDATES, /**< control function to get info on which reference frames were updated
|
||||
by the last decode */
|
||||
VP8D_GET_FRAME_CORRUPTED, /**< check if the indicated frame is corrupted */
|
||||
VP8_DECODER_CTRL_ID_MAX
|
||||
} ;
|
||||
|
||||
@ -58,6 +59,7 @@ enum vp8d_dec_control_id
|
||||
|
||||
|
||||
VPX_CTRL_USE_TYPE(VP8D_GET_LAST_REF_UPDATES, int *)
|
||||
VPX_CTRL_USE_TYPE(VP8D_GET_FRAME_CORRUPTED, int *)
|
||||
|
||||
|
||||
/*! @} - end defgroup vp8_decoder */
|
||||
|
@ -81,6 +81,8 @@ vp8_yv12_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, int
|
||||
|
||||
ybf->u_buffer = ybf->buffer_alloc + yplane_size + (border / 2 * ybf->uv_stride) + border / 2;
|
||||
ybf->v_buffer = ybf->buffer_alloc + yplane_size + uvplane_size + (border / 2 * ybf->uv_stride) + border / 2;
|
||||
|
||||
ybf->corrupted = 0; /* assume not currupted by errors */
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -57,6 +57,8 @@ extern "C"
|
||||
int border;
|
||||
int frame_size;
|
||||
YUV_TYPE clrtype;
|
||||
|
||||
int corrupted;
|
||||
} YV12_BUFFER_CONFIG;
|
||||
|
||||
int vp8_yv12_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, int border);
|
||||
|
Loading…
x
Reference in New Issue
Block a user