Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.3
| @@ -66,6 +66,26 @@ void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, uint8_ | |||||
| } | } | ||||
| } | } | ||||
| int ff_snow_get_buffer(SnowContext *s, AVFrame *frame) | |||||
| { | |||||
| int ret, i; | |||||
| frame->width = s->avctx->width + 2 * EDGE_WIDTH; | |||||
| frame->height = s->avctx->height + 2 * EDGE_WIDTH; | |||||
| if ((ret = ff_get_buffer(s->avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0) | |||||
| return ret; | |||||
| for (i = 0; frame->data[i]; i++) { | |||||
| int offset = (EDGE_WIDTH >> (i ? s->chroma_v_shift : 0)) * | |||||
| frame->linesize[i] + | |||||
| (EDGE_WIDTH >> (i ? s->chroma_h_shift : 0)); | |||||
| frame->data[i] += offset; | |||||
| } | |||||
| frame->width = s->avctx->width; | |||||
| frame->height = s->avctx->height; | |||||
| return 0; | |||||
| } | |||||
| void ff_snow_reset_contexts(SnowContext *s){ //FIXME better initial contexts | void ff_snow_reset_contexts(SnowContext *s){ //FIXME better initial contexts | ||||
| int plane_index, level, orientation; | int plane_index, level, orientation; | ||||
| @@ -661,18 +681,8 @@ int ff_snow_frame_start(SnowContext *s){ | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| } | } | ||||
| s->current_picture->width = s->avctx->width + 2 * EDGE_WIDTH; | |||||
| s->current_picture->height = s->avctx->height + 2 * EDGE_WIDTH; | |||||
| if ((ret = ff_get_buffer(s->avctx, s->current_picture, AV_GET_BUFFER_FLAG_REF)) < 0) | |||||
| if ((ret = ff_snow_get_buffer(s, s->current_picture)) < 0) | |||||
| return ret; | return ret; | ||||
| for (i = 0; s->current_picture->data[i]; i++) { | |||||
| int offset = (EDGE_WIDTH >> (i ? s->chroma_v_shift : 0)) * | |||||
| s->current_picture->linesize[i] + | |||||
| (EDGE_WIDTH >> (i ? s->chroma_h_shift : 0)); | |||||
| s->current_picture->data[i] += offset; | |||||
| } | |||||
| s->current_picture->width = s->avctx->width; | |||||
| s->current_picture->height = s->avctx->height; | |||||
| s->current_picture->key_frame= s->keyframe; | s->current_picture->key_frame= s->keyframe; | ||||
| @@ -232,6 +232,7 @@ int ff_snow_frame_start(SnowContext *s); | |||||
| void ff_snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, ptrdiff_t stride, | void ff_snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, ptrdiff_t stride, | ||||
| int sx, int sy, int b_w, int b_h, BlockNode *block, | int sx, int sy, int b_w, int b_h, BlockNode *block, | ||||
| int plane_index, int w, int h); | int plane_index, int w, int h); | ||||
| int ff_snow_get_buffer(SnowContext *s, AVFrame *frame); | |||||
| /* common inline functions */ | /* common inline functions */ | ||||
| //XXX doublecheck all of them should stay inlined | //XXX doublecheck all of them should stay inlined | ||||
| @@ -125,18 +125,9 @@ static av_cold int encode_init(AVCodecContext *avctx) | |||||
| s->input_picture = av_frame_alloc(); | s->input_picture = av_frame_alloc(); | ||||
| if (!s->input_picture) | if (!s->input_picture) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| s->input_picture->width = s->avctx->width + 2 * EDGE_WIDTH; | |||||
| s->input_picture->height = s->avctx->height + 2 * EDGE_WIDTH; | |||||
| if ((ret = ff_get_buffer(s->avctx, s->input_picture, AV_GET_BUFFER_FLAG_REF)) < 0) | |||||
| if ((ret = ff_snow_get_buffer(s, s->input_picture)) < 0) | |||||
| return ret; | return ret; | ||||
| for (i = 0; s->input_picture->data[i]; i++) { | |||||
| int offset = (EDGE_WIDTH >> (i ? s->chroma_v_shift : 0)) * | |||||
| s->input_picture->linesize[i] + | |||||
| (EDGE_WIDTH >> (i ? s->chroma_h_shift : 0)); | |||||
| s->input_picture->data[i] += offset; | |||||
| } | |||||
| s->input_picture->width = s->avctx->width; | |||||
| s->input_picture->height = s->avctx->height; | |||||
| if(s->avctx->me_method == ME_ITER){ | if(s->avctx->me_method == ME_ITER){ | ||||
| int size= s->b_width * s->b_height << 2*s->block_max_depth; | int size= s->b_width * s->b_height << 2*s->block_max_depth; | ||||