Originally committed as revision 23813 to svn://svn.ffmpeg.org/ffmpeg/trunktags/n0.8
| @@ -45,6 +45,7 @@ typedef struct { | |||
| DSPContext dsp; | |||
| VP8DSPContext vp8dsp; | |||
| H264PredContext hpc; | |||
| vp8_mc_func put_pixels_tab[3][3][3]; | |||
| AVFrame frames[4]; | |||
| AVFrame *framep[4]; | |||
| uint8_t *edge_emu_buffer; | |||
| @@ -379,8 +380,13 @@ static int decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_size) | |||
| buf += 3; | |||
| buf_size -= 3; | |||
| if (s->profile) | |||
| av_log(s->avctx, AV_LOG_WARNING, "Profile %d not fully handled\n", s->profile); | |||
| if (s->profile > 3) | |||
| av_log(s->avctx, AV_LOG_WARNING, "Unknown profile %d\n", s->profile); | |||
| if (!s->profile) | |||
| memcpy(s->put_pixels_tab, s->vp8dsp.put_vp8_epel_pixels_tab, sizeof(s->put_pixels_tab)); | |||
| else // profile 1-3 use bilinear, 4+ aren't defined so whatever | |||
| memcpy(s->put_pixels_tab, s->vp8dsp.put_vp8_bilinear_pixels_tab, sizeof(s->put_pixels_tab)); | |||
| if (header_size > buf_size - 7*s->keyframe) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "Header size larger than data provided\n"); | |||
| @@ -951,7 +957,7 @@ static void inter_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, | |||
| /* Y */ | |||
| vp8_mc(s, 1, dst[0], s->framep[mb->ref_frame]->data[0], &mb->mv, | |||
| x_off, y_off, 16, 16, width, height, s->linesize, | |||
| s->vp8dsp.put_vp8_epel_pixels_tab[0]); | |||
| s->put_pixels_tab[0]); | |||
| /* U/V */ | |||
| uvmv = mb->mv; | |||
| @@ -962,10 +968,10 @@ static void inter_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, | |||
| x_off >>= 1; y_off >>= 1; width >>= 1; height >>= 1; | |||
| vp8_mc(s, 0, dst[1], s->framep[mb->ref_frame]->data[1], &uvmv, | |||
| x_off, y_off, 8, 8, width, height, s->uvlinesize, | |||
| s->vp8dsp.put_vp8_epel_pixels_tab[1]); | |||
| s->put_pixels_tab[1]); | |||
| vp8_mc(s, 0, dst[2], s->framep[mb->ref_frame]->data[2], &uvmv, | |||
| x_off, y_off, 8, 8, width, height, s->uvlinesize, | |||
| s->vp8dsp.put_vp8_epel_pixels_tab[1]); | |||
| s->put_pixels_tab[1]); | |||
| } else { | |||
| int x, y; | |||
| @@ -976,7 +982,7 @@ static void inter_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, | |||
| s->framep[mb->ref_frame]->data[0], &mb->bmv[4*y + x], | |||
| 4*x + x_off, 4*y + y_off, 4, 4, | |||
| width, height, s->linesize, | |||
| s->vp8dsp.put_vp8_epel_pixels_tab[2]); | |||
| s->put_pixels_tab[2]); | |||
| } | |||
| } | |||
| @@ -1002,12 +1008,12 @@ static void inter_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, | |||
| s->framep[mb->ref_frame]->data[1], &uvmv, | |||
| 4*x + x_off, 4*y + y_off, 4, 4, | |||
| width, height, s->uvlinesize, | |||
| s->vp8dsp.put_vp8_epel_pixels_tab[2]); | |||
| s->put_pixels_tab[2]); | |||
| vp8_mc(s, 0, dst[2] + 4*y*s->uvlinesize + x*4, | |||
| s->framep[mb->ref_frame]->data[2], &uvmv, | |||
| 4*x + x_off, 4*y + y_off, 4, 4, | |||
| width, height, s->uvlinesize, | |||
| s->vp8dsp.put_vp8_epel_pixels_tab[2]); | |||
| s->put_pixels_tab[2]); | |||
| } | |||
| } | |||
| } | |||
| @@ -348,6 +348,61 @@ VP8_EPEL_HV(16, FILTER_6TAP, FILTER_6TAP, h6v6) | |||
| VP8_EPEL_HV(8, FILTER_6TAP, FILTER_6TAP, h6v6) | |||
| VP8_EPEL_HV(4, FILTER_6TAP, FILTER_6TAP, h6v6) | |||
| #define VP8_BILINEAR(SIZE) \ | |||
| static void put_vp8_bilinear ## SIZE ## _h_c(uint8_t *dst, int stride, uint8_t *src, int s2, int h, int mx, int my) \ | |||
| { \ | |||
| int a = 8-mx, b = mx; \ | |||
| int x, y; \ | |||
| \ | |||
| for (y = 0; y < h; y++) { \ | |||
| for (x = 0; x < SIZE; x++) \ | |||
| dst[x] = (a*src[x] + b*src[x+1] + 4) >> 3; \ | |||
| dst += stride; \ | |||
| src += stride; \ | |||
| } \ | |||
| } \ | |||
| static void put_vp8_bilinear ## SIZE ## _v_c(uint8_t *dst, int stride, uint8_t *src, int s2, int h, int mx, int my) \ | |||
| { \ | |||
| int c = 8-my, d = my; \ | |||
| int x, y; \ | |||
| \ | |||
| for (y = 0; y < h; y++) { \ | |||
| for (x = 0; x < SIZE; x++) \ | |||
| dst[x] = (c*src[x] + d*src[x+stride] + 4) >> 3; \ | |||
| dst += stride; \ | |||
| src += stride; \ | |||
| } \ | |||
| } \ | |||
| \ | |||
| static void put_vp8_bilinear ## SIZE ## _hv_c(uint8_t *dst, int stride, uint8_t *src, int s2, int h, int mx, int my) \ | |||
| { \ | |||
| int a = 8-mx, b = mx; \ | |||
| int c = 8-my, d = my; \ | |||
| int x, y; \ | |||
| uint8_t tmp_array[(2*SIZE+1)*SIZE]; \ | |||
| uint8_t *tmp = tmp_array; \ | |||
| \ | |||
| for (y = 0; y < h+1; y++) { \ | |||
| for (x = 0; x < SIZE; x++) \ | |||
| tmp[x] = (a*src[x] + b*src[x+1] + 4) >> 3; \ | |||
| tmp += SIZE; \ | |||
| src += stride; \ | |||
| } \ | |||
| \ | |||
| tmp = tmp_array; \ | |||
| \ | |||
| for (y = 0; y < h; y++) { \ | |||
| for (x = 0; x < SIZE; x++) \ | |||
| dst[x] = (c*tmp[x] + d*tmp[x+SIZE] + 4) >> 3; \ | |||
| dst += stride; \ | |||
| tmp += SIZE; \ | |||
| } \ | |||
| } | |||
| VP8_BILINEAR(16) | |||
| VP8_BILINEAR(8) | |||
| VP8_BILINEAR(4) | |||
| #define VP8_MC_FUNC(IDX, SIZE) \ | |||
| dsp->put_vp8_epel_pixels_tab[IDX][0][0] = put_vp8_pixels ## SIZE ## _c; \ | |||
| dsp->put_vp8_epel_pixels_tab[IDX][0][1] = put_vp8_epel ## SIZE ## _h4_c; \ | |||
| @@ -359,6 +414,17 @@ VP8_EPEL_HV(4, FILTER_6TAP, FILTER_6TAP, h6v6) | |||
| dsp->put_vp8_epel_pixels_tab[IDX][2][1] = put_vp8_epel ## SIZE ## _h4v6_c; \ | |||
| dsp->put_vp8_epel_pixels_tab[IDX][2][2] = put_vp8_epel ## SIZE ## _h6v6_c | |||
| #define VP8_BILINEAR_MC_FUNC(IDX, SIZE) \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][0][0] = put_vp8_pixels ## SIZE ## _c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][0][1] = put_vp8_bilinear ## SIZE ## _h_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][0][2] = put_vp8_bilinear ## SIZE ## _h_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][1][0] = put_vp8_bilinear ## SIZE ## _v_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][1][1] = put_vp8_bilinear ## SIZE ## _hv_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][1][2] = put_vp8_bilinear ## SIZE ## _hv_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][2][0] = put_vp8_bilinear ## SIZE ## _v_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][2][1] = put_vp8_bilinear ## SIZE ## _hv_c; \ | |||
| dsp->put_vp8_bilinear_pixels_tab[IDX][2][2] = put_vp8_bilinear ## SIZE ## _hv_c | |||
| av_cold void ff_vp8dsp_init(VP8DSPContext *dsp) | |||
| { | |||
| dsp->vp8_luma_dc_wht = vp8_luma_dc_wht_c; | |||
| @@ -381,4 +447,8 @@ av_cold void ff_vp8dsp_init(VP8DSPContext *dsp) | |||
| VP8_MC_FUNC(0, 16); | |||
| VP8_MC_FUNC(1, 8); | |||
| VP8_MC_FUNC(2, 4); | |||
| VP8_BILINEAR_MC_FUNC(0, 16); | |||
| VP8_BILINEAR_MC_FUNC(1, 8); | |||
| VP8_BILINEAR_MC_FUNC(2, 4); | |||
| } | |||
| @@ -58,6 +58,7 @@ typedef struct VP8DSPContext { | |||
| * so something like put_vp8_epel_pixels_tab[width>>3][2*!!my-(my&1)][2*!!mx-(mx&1)](..., mx, my) | |||
| */ | |||
| vp8_mc_func put_vp8_epel_pixels_tab[3][3][3]; | |||
| vp8_mc_func put_vp8_bilinear_pixels_tab[3][3][3]; | |||
| } VP8DSPContext; | |||
| void ff_put_vp8_pixels16_c(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y); | |||