X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fthird_party%2Fffmpeg%2Flibavcodec%2Fcavs.c;h=a41a8aa89d4b821cce4cc1bf94f2bfff6b855f66;hb=4a1a0bdd01eef90b0826a0e761d3379d3715c10f;hp=c5313eb19c1087ff6e6d4101b88983db567e0790;hpb=b1be5ca53587d23e7aeb77b26861fdc0a181ffd8;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/third_party/ffmpeg/libavcodec/cavs.c b/src/third_party/ffmpeg/libavcodec/cavs.c index c5313eb..a41a8aa 100644 --- a/src/third_party/ffmpeg/libavcodec/cavs.c +++ b/src/third_party/ffmpeg/libavcodec/cavs.c @@ -29,7 +29,9 @@ #include "get_bits.h" #include "golomb.h" #include "h264chroma.h" +#include "idctdsp.h" #include "mathops.h" +#include "qpeldsp.h" #include "cavs.h" static const uint8_t alpha_tab[64] = { @@ -72,15 +74,16 @@ static inline int get_bs(cavs_vector *mvP, cavs_vector *mvQ, int b) { if ((mvP->ref == REF_INTRA) || (mvQ->ref == REF_INTRA)) return 2; - if ((abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4)) + if((abs(mvP->x - mvQ->x) >= 4) || + (abs(mvP->y - mvQ->y) >= 4) || + (mvP->ref != mvQ->ref)) return 1; if (b) { mvP += MV_BWD_OFFS; mvQ += MV_BWD_OFFS; - if ((abs(mvP->x - mvQ->x) >= 4) || (abs(mvP->y - mvQ->y) >= 4)) - return 1; - } else { - if (mvP->ref != mvQ->ref) + if((abs(mvP->x - mvQ->x) >= 4) || + (abs(mvP->y - mvQ->y) >= 4) || + (mvP->ref != mvQ->ref)) return 1; } return 0; @@ -146,6 +149,8 @@ void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type) qp_avg = (h->qp + h->left_qp + 1) >> 1; SET_PARAMS; h->cdsp.cavs_filter_lv(h->cy, h->l_stride, alpha, beta, tc, bs[0], bs[1]); + qp_avg = (ff_cavs_chroma_qp[h->qp] + ff_cavs_chroma_qp[h->left_qp] + 1) >> 1; + SET_PARAMS; h->cdsp.cavs_filter_cv(h->cu, h->c_stride, alpha, beta, tc, bs[0], bs[1]); h->cdsp.cavs_filter_cv(h->cv, h->c_stride, alpha, beta, tc, bs[0], bs[1]); } @@ -158,6 +163,8 @@ void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type) qp_avg = (h->qp + h->top_qp[h->mbx] + 1) >> 1; SET_PARAMS; h->cdsp.cavs_filter_lh(h->cy, h->l_stride, alpha, beta, tc, bs[4], bs[5]); + qp_avg = (ff_cavs_chroma_qp[h->qp] + ff_cavs_chroma_qp[h->top_qp[h->mbx]] + 1) >> 1; + SET_PARAMS; h->cdsp.cavs_filter_ch(h->cu, h->c_stride, alpha, beta, tc, bs[4], bs[5]); h->cdsp.cavs_filter_ch(h->cv, h->c_stride, alpha, beta, tc, bs[4], bs[5]); } @@ -231,9 +238,14 @@ void ff_cavs_load_intra_pred_chroma(AVSContext *h) /* extend borders by one pixel */ h->left_border_u[9] = h->left_border_u[8]; h->left_border_v[9] = h->left_border_v[8]; - h->top_border_u[h->mbx * 10 + 9] = h->top_border_u[h->mbx * 10 + 8]; - h->top_border_v[h->mbx * 10 + 9] = h->top_border_v[h->mbx * 10 + 8]; - if (h->mbx && h->mby) { + if(h->flags & C_AVAIL) { + h->top_border_u[h->mbx*10 + 9] = h->top_border_u[h->mbx*10 + 11]; + h->top_border_v[h->mbx*10 + 9] = h->top_border_v[h->mbx*10 + 11]; + } else { + h->top_border_u[h->mbx * 10 + 9] = h->top_border_u[h->mbx * 10 + 8]; + h->top_border_v[h->mbx * 10 + 9] = h->top_border_v[h->mbx * 10 + 8]; + } + if((h->flags & A_AVAIL) && (h->flags & B_AVAIL)) { h->top_border_u[h->mbx * 10] = h->left_border_u[0] = h->topleft_border_u; h->top_border_v[h->mbx * 10] = h->left_border_v[0] = h->topleft_border_v; } else { @@ -525,7 +537,7 @@ void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type) static inline void scale_mv(AVSContext *h, int *d_x, int *d_y, cavs_vector *src, int distp) { - int den = h->scale_den[src->ref]; + int den = h->scale_den[FFMAX(src->ref, 0)]; *d_x = (src->x * distp * den + 256 + (src->x >> 31)) >> 9; *d_y = (src->y * distp * den + 256 + (src->y >> 31)) >> 9; @@ -572,7 +584,7 @@ void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC, mvP->ref = ref; mvP->dist = h->dist[mvP->ref]; - if (mvC->ref == NOT_AVAIL) + if (mvC->ref == NOT_AVAIL || (nP == MV_FWD_X3) || (nP == MV_BWD_X3 )) mvC = &h->mv[nP - 5]; // set to top-left (mvD) if (mode == MV_PRED_PSKIP && (mvA->ref == NOT_AVAIL || @@ -742,16 +754,16 @@ void ff_cavs_init_top_lines(AVSContext *h) { /* alloc top line of predictors */ h->top_qp = av_mallocz(h->mb_width); - h->top_mv[0] = av_mallocz((h->mb_width * 2 + 1) * sizeof(cavs_vector)); - h->top_mv[1] = av_mallocz((h->mb_width * 2 + 1) * sizeof(cavs_vector)); - h->top_pred_Y = av_mallocz(h->mb_width * 2 * sizeof(*h->top_pred_Y)); - h->top_border_y = av_mallocz((h->mb_width + 1) * 16); - h->top_border_u = av_mallocz(h->mb_width * 10); - h->top_border_v = av_mallocz(h->mb_width * 10); + h->top_mv[0] = av_mallocz_array(h->mb_width * 2 + 1, sizeof(cavs_vector)); + h->top_mv[1] = av_mallocz_array(h->mb_width * 2 + 1, sizeof(cavs_vector)); + h->top_pred_Y = av_mallocz_array(h->mb_width * 2, sizeof(*h->top_pred_Y)); + h->top_border_y = av_mallocz_array(h->mb_width + 1, 16); + h->top_border_u = av_mallocz_array(h->mb_width, 10); + h->top_border_v = av_mallocz_array(h->mb_width, 10); /* alloc space for co-located MVs and types */ - h->col_mv = av_mallocz(h->mb_width * h->mb_height * 4 * - sizeof(cavs_vector)); + h->col_mv = av_mallocz_array(h->mb_width * h->mb_height, + 4 * sizeof(cavs_vector)); h->col_type_base = av_mallocz(h->mb_width * h->mb_height); h->block = av_mallocz(64 * sizeof(int16_t)); } @@ -760,13 +772,14 @@ av_cold int ff_cavs_init(AVCodecContext *avctx) { AVSContext *h = avctx->priv_data; - ff_dsputil_init(&h->dsp, avctx); + ff_blockdsp_init(&h->bdsp, avctx); ff_h264chroma_init(&h->h264chroma, 8); + ff_idctdsp_init(&h->idsp, avctx); ff_videodsp_init(&h->vdsp, 8); ff_cavsdsp_init(&h->cdsp, avctx); - ff_init_scantable_permutation(h->dsp.idct_permutation, + ff_init_scantable_permutation(h->idsp.idct_permutation, h->cdsp.idct_perm); - ff_init_scantable(h->dsp.idct_permutation, &h->scantable, ff_zigzag_direct); + ff_init_scantable(h->idsp.idct_permutation, &h->scantable, ff_zigzag_direct); h->avctx = avctx; avctx->pix_fmt = AV_PIX_FMT_YUV420P;