OSDN Git Service

Merge commit '93f305473f880729d18b5e42067f19d2106cb2e5'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 16 Oct 2013 11:08:37 +0000 (13:08 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 16 Oct 2013 11:08:37 +0000 (13:08 +0200)
* commit '93f305473f880729d18b5e42067f19d2106cb2e5':
  lavc: Convert some remaining strides to ptrdiff_t

Conflicts:
libavcodec/h264.h
libavcodec/mpegvideo_enc.c
libavcodec/mpegvideo_motion.c
libavcodec/vp56.c
libavcodec/wmv2.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/h264.h
libavcodec/mpegvideo_enc.c
libavcodec/mpegvideo_motion.c
libavcodec/vp3.c
libavcodec/vp56.c

Simple merge
Simple merge
Simple merge
Simple merge
@@@ -515,160 -507,135 +515,161 @@@ int ff_vp56_decode_frame(AVCodecContex
              return -1;
      }
  
 -    for (is_alpha=0; is_alpha < 1+s->has_alpha; is_alpha++) {
 -        int mb_row, mb_col, mb_row_flip, mb_offset = 0;
 -        int block, y, uv;
 -        ptrdiff_t stride_y, stride_uv;
 -        int golden_frame = 0;
 +    res = s->parse_header(s, buf, remaining_buf_size);
 +    if (res < 0)
 +        return res;
  
 -        s->modelp = &s->models[is_alpha];
 +    if (res == VP56_SIZE_CHANGE) {
 +        for (i = 0; i < 4; i++) {
 +            av_frame_unref(s->frames[i]);
 +            if (s->alpha_context)
 +                av_frame_unref(s->alpha_context->frames[i]);
 +        }
 +    }
  
 -        res = s->parse_header(s, buf, remaining_buf_size, &golden_frame);
 -        if (res < 0) {
 -            int i;
 -            for (i = 0; i < 4; i++)
 -                av_frame_unref(s->frames[i]);
 -            return res;
 +    if (ff_get_buffer(avctx, p, AV_GET_BUFFER_FLAG_REF) < 0)
 +        return -1;
 +
 +    if (avctx->pix_fmt == AV_PIX_FMT_YUVA420P) {
 +        av_frame_unref(s->alpha_context->frames[VP56_FRAME_CURRENT]);
 +        if ((ret = av_frame_ref(s->alpha_context->frames[VP56_FRAME_CURRENT], p)) < 0) {
 +            av_frame_unref(p);
 +            return ret;
          }
 +    }
  
 -        if (res == VP56_SIZE_CHANGE) {
 -            int i;
 -            for (i = 0; i < 4; i++)
 -                av_frame_unref(s->frames[i]);
 -            if (is_alpha) {
 -                avcodec_set_dimensions(avctx, 0, 0);
 -                return -1;
 -            }
 +    if (res == VP56_SIZE_CHANGE) {
 +        if (vp56_size_changed(s)) {
 +            av_frame_unref(p);
 +            return -1;
          }
 +    }
  
 -        if (!is_alpha) {
 -            if (ff_get_buffer(avctx, p, AV_GET_BUFFER_FLAG_REF) < 0) {
 -                av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 -                return -1;
 +    if (avctx->pix_fmt == AV_PIX_FMT_YUVA420P) {
 +        int bak_w = avctx->width;
 +        int bak_h = avctx->height;
 +        int bak_cw = avctx->coded_width;
 +        int bak_ch = avctx->coded_height;
 +        buf += alpha_offset;
 +        remaining_buf_size -= alpha_offset;
 +
 +        res = s->alpha_context->parse_header(s->alpha_context, buf, remaining_buf_size);
 +        if (res != 0) {
 +            if(res==VP56_SIZE_CHANGE) {
 +                av_log(avctx, AV_LOG_ERROR, "Alpha reconfiguration\n");
 +                avctx->width  = bak_w;
 +                avctx->height = bak_h;
 +                avctx->coded_width  = bak_cw;
 +                avctx->coded_height = bak_ch;
              }
 -
 -            if (res == VP56_SIZE_CHANGE)
 -                if (vp56_size_changed(avctx)) {
 -                    av_frame_unref(p);
 -                    return -1;
 -                }
 +            av_frame_unref(p);
 +            return -1;
          }
 +    }
  
 -        if (p->key_frame) {
 -            p->pict_type = AV_PICTURE_TYPE_I;
 -            s->default_models_init(s);
 -            for (block=0; block<s->mb_height*s->mb_width; block++)
 -                s->macroblocks[block].type = VP56_MB_INTRA;
 -        } else {
 -            p->pict_type = AV_PICTURE_TYPE_P;
 -            vp56_parse_mb_type_models(s);
 -            s->parse_vector_models(s);
 -            s->mb_type = VP56_MB_INTER_NOVEC_PF;
 -        }
 +    avctx->execute2(avctx, ff_vp56_decode_mbs, 0, 0, (avctx->pix_fmt == AV_PIX_FMT_YUVA420P) + 1);
  
 -        if (s->parse_coeff_models(s))
 -            goto next;
 +    if ((res = av_frame_ref(data, p)) < 0)
 +        return res;
 +    *got_frame = 1;
  
 -        memset(s->prev_dc, 0, sizeof(s->prev_dc));
 -        s->prev_dc[1][VP56_FRAME_CURRENT] = 128;
 -        s->prev_dc[2][VP56_FRAME_CURRENT] = 128;
 +    return avpkt->size;
 +}
  
 -        for (block=0; block < 4*s->mb_width+6; block++) {
 -            s->above_blocks[block].ref_frame = VP56_FRAME_NONE;
 -            s->above_blocks[block].dc_coeff = 0;
 -            s->above_blocks[block].not_null_dc = 0;
 -        }
 -        s->above_blocks[2*s->mb_width + 2].ref_frame = VP56_FRAME_CURRENT;
 -        s->above_blocks[3*s->mb_width + 4].ref_frame = VP56_FRAME_CURRENT;
 +static int ff_vp56_decode_mbs(AVCodecContext *avctx, void *data,
 +                              int jobnr, int threadnr)
 +{
 +    VP56Context *s0 = avctx->priv_data;
 +    int is_alpha = (jobnr == 1);
 +    VP56Context *s = is_alpha ? s0->alpha_context : s0;
 +    AVFrame *const p = s->frames[VP56_FRAME_CURRENT];
 +    int mb_row, mb_col, mb_row_flip, mb_offset = 0;
-     int block, y, uv, stride_y, stride_uv;
++    int block, y, uv;
++    ptrdiff_t stride_y, stride_uv;
 +    int res;
 +
 +    if (p->key_frame) {
 +        p->pict_type = AV_PICTURE_TYPE_I;
 +        s->default_models_init(s);
 +        for (block=0; block<s->mb_height*s->mb_width; block++)
 +            s->macroblocks[block].type = VP56_MB_INTRA;
 +    } else {
 +        p->pict_type = AV_PICTURE_TYPE_P;
 +        vp56_parse_mb_type_models(s);
 +        s->parse_vector_models(s);
 +        s->mb_type = VP56_MB_INTER_NOVEC_PF;
 +    }
  
 -        stride_y  = p->linesize[0];
 -        stride_uv = p->linesize[1];
 +    if (s->parse_coeff_models(s))
 +        goto next;
  
 +    memset(s->prev_dc, 0, sizeof(s->prev_dc));
 +    s->prev_dc[1][VP56_FRAME_CURRENT] = 128;
 +    s->prev_dc[2][VP56_FRAME_CURRENT] = 128;
 +
 +    for (block=0; block < 4*s->mb_width+6; block++) {
 +        s->above_blocks[block].ref_frame = VP56_FRAME_NONE;
 +        s->above_blocks[block].dc_coeff = 0;
 +        s->above_blocks[block].not_null_dc = 0;
 +    }
 +    s->above_blocks[2*s->mb_width + 2].ref_frame = VP56_FRAME_CURRENT;
 +    s->above_blocks[3*s->mb_width + 4].ref_frame = VP56_FRAME_CURRENT;
 +
 +    stride_y  = p->linesize[0];
 +    stride_uv = p->linesize[1];
 +
 +    if (s->flip < 0)
 +        mb_offset = 7;
 +
 +    /* main macroblocks loop */
 +    for (mb_row=0; mb_row<s->mb_height; mb_row++) {
          if (s->flip < 0)
 -            mb_offset = 7;
 -
 -        /* main macroblocks loop */
 -        for (mb_row=0; mb_row<s->mb_height; mb_row++) {
 -            if (s->flip < 0)
 -                mb_row_flip = s->mb_height - mb_row - 1;
 -            else
 -                mb_row_flip = mb_row;
 -
 -            for (block=0; block<4; block++) {
 -                s->left_block[block].ref_frame = VP56_FRAME_NONE;
 -                s->left_block[block].dc_coeff = 0;
 -                s->left_block[block].not_null_dc = 0;
 -            }
 -            memset(s->coeff_ctx, 0, sizeof(s->coeff_ctx));
 -            memset(s->coeff_ctx_last, 24, sizeof(s->coeff_ctx_last));
 -
 -            s->above_block_idx[0] = 1;
 -            s->above_block_idx[1] = 2;
 -            s->above_block_idx[2] = 1;
 -            s->above_block_idx[3] = 2;
 -            s->above_block_idx[4] = 2*s->mb_width + 2 + 1;
 -            s->above_block_idx[5] = 3*s->mb_width + 4 + 1;
 -
 -            s->block_offset[s->frbi] = (mb_row_flip*16 + mb_offset) * stride_y;
 -            s->block_offset[s->srbi] = s->block_offset[s->frbi] + 8*stride_y;
 -            s->block_offset[1] = s->block_offset[0] + 8;
 -            s->block_offset[3] = s->block_offset[2] + 8;
 -            s->block_offset[4] = (mb_row_flip*8 + mb_offset) * stride_uv;
 -            s->block_offset[5] = s->block_offset[4];
 -
 -            for (mb_col=0; mb_col<s->mb_width; mb_col++) {
 -                vp56_decode_mb(s, mb_row, mb_col, is_alpha);
 -
 -                for (y=0; y<4; y++) {
 -                    s->above_block_idx[y] += 2;
 -                    s->block_offset[y] += 16;
 -                }
 +            mb_row_flip = s->mb_height - mb_row - 1;
 +        else
 +            mb_row_flip = mb_row;
  
 -                for (uv=4; uv<6; uv++) {
 -                    s->above_block_idx[uv] += 1;
 -                    s->block_offset[uv] += 8;
 -                }
 -            }
 +        for (block=0; block<4; block++) {
 +            s->left_block[block].ref_frame = VP56_FRAME_NONE;
 +            s->left_block[block].dc_coeff = 0;
 +            s->left_block[block].not_null_dc = 0;
          }
 +        memset(s->coeff_ctx, 0, sizeof(s->coeff_ctx));
 +        memset(s->coeff_ctx_last, 24, sizeof(s->coeff_ctx_last));
 +
 +        s->above_block_idx[0] = 1;
 +        s->above_block_idx[1] = 2;
 +        s->above_block_idx[2] = 1;
 +        s->above_block_idx[3] = 2;
 +        s->above_block_idx[4] = 2*s->mb_width + 2 + 1;
 +        s->above_block_idx[5] = 3*s->mb_width + 4 + 1;
 +
 +        s->block_offset[s->frbi] = (mb_row_flip*16 + mb_offset) * stride_y;
 +        s->block_offset[s->srbi] = s->block_offset[s->frbi] + 8*stride_y;
 +        s->block_offset[1] = s->block_offset[0] + 8;
 +        s->block_offset[3] = s->block_offset[2] + 8;
 +        s->block_offset[4] = (mb_row_flip*8 + mb_offset) * stride_uv;
 +        s->block_offset[5] = s->block_offset[4];
 +
 +        for (mb_col=0; mb_col<s->mb_width; mb_col++) {
 +            vp56_decode_mb(s, mb_row, mb_col, is_alpha);
 +
 +            for (y=0; y<4; y++) {
 +                s->above_block_idx[y] += 2;
 +                s->block_offset[y] += 16;
 +            }
  
 -    next:
 -        if (p->key_frame || golden_frame) {
 -            av_frame_unref(s->frames[VP56_FRAME_GOLDEN]);
 -            if ((res = av_frame_ref(s->frames[VP56_FRAME_GOLDEN], p)) < 0)
 -                return res;
 +            for (uv=4; uv<6; uv++) {
 +                s->above_block_idx[uv] += 1;
 +                s->block_offset[uv] += 8;
 +            }
          }
 +    }
  
 -        if (s->has_alpha) {
 -            FFSWAP(AVFrame *, s->frames[VP56_FRAME_GOLDEN],
 -                              s->frames[VP56_FRAME_GOLDEN2]);
 -            buf += alpha_offset;
 -            remaining_buf_size -= alpha_offset;
 -        }
 +next:
 +    if (p->key_frame || s->golden_frame) {
 +        av_frame_unref(s->frames[VP56_FRAME_GOLDEN]);
 +        if ((res = av_frame_ref(s->frames[VP56_FRAME_GOLDEN], p)) < 0)
 +            return res;
      }
  
      av_frame_unref(s->frames[VP56_FRAME_PREVIOUS]);