Revision: 15384 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15384 Author: schlaile Date: 2008-06-29 17:11:35 +0200 (Sun, 29 Jun 2008)
Log Message: ----------- == FFMPEG / ImBuf == Fixed deinterlacing (inplace deinterlacing didn't work out properly...). [#14672] Sequencer: deinterlace filter artifacts Modified Paths: -------------- trunk/blender/source/blender/imbuf/intern/IMB_anim.h trunk/blender/source/blender/imbuf/intern/anim.c Modified: trunk/blender/source/blender/imbuf/intern/IMB_anim.h =================================================================== --- trunk/blender/source/blender/imbuf/intern/IMB_anim.h 2008-06-29 12:53:42 UTC (rev 15383) +++ trunk/blender/source/blender/imbuf/intern/IMB_anim.h 2008-06-29 15:11:35 UTC (rev 15384) @@ -183,8 +183,9 @@ AVFormatContext *pFormatCtx; AVCodecContext *pCodecCtx; AVCodec *pCodec; + AVFrame *pFrame; AVFrame *pFrameRGB; - AVFrame *pFrame; + AVFrame *pFrameDeinterlaced; struct SwsContext *img_convert_ctx; int videoStream; #endif Modified: trunk/blender/source/blender/imbuf/intern/anim.c =================================================================== --- trunk/blender/source/blender/imbuf/intern/anim.c 2008-06-29 12:53:42 UTC (rev 15383) +++ trunk/blender/source/blender/imbuf/intern/anim.c 2008-06-29 15:11:35 UTC (rev 15384) @@ -600,6 +600,7 @@ anim->videoStream = videoStream; anim->pFrame = avcodec_alloc_frame(); + anim->pFrameDeinterlaced = avcodec_alloc_frame(); anim->pFrameRGB = avcodec_alloc_frame(); if (avpicture_get_size(PIX_FMT_BGR32, anim->x, anim->y) @@ -609,10 +610,20 @@ avcodec_close(anim->pCodecCtx); av_close_input_file(anim->pFormatCtx); av_free(anim->pFrameRGB); + av_free(anim->pFrameDeinterlaced); av_free(anim->pFrame); return -1; } + if (anim->ib_flags & IB_animdeinterlace) { + avpicture_fill((AVPicture*) anim->pFrameDeinterlaced, + MEM_callocN(avpicture_get_size( + anim->pCodecCtx->pix_fmt, + anim->x, anim->y), + "ffmpeg deinterlace"), + anim->pCodecCtx->pix_fmt, anim->x, anim->y); + } + if (pCodecCtx->has_b_frames) { anim->preseek = 25; /* FIXME: detect gopsize ... */ } else { @@ -644,7 +655,7 @@ ibuf = IMB_allocImBuf(anim->x, anim->y, 24, IB_rect, 0); - avpicture_fill((AVPicture *)anim->pFrameRGB, + avpicture_fill((AVPicture*) anim->pFrameRGB, (unsigned char*) ibuf->rect, PIX_FMT_BGR32, anim->x, anim->y); @@ -723,15 +734,29 @@ } if(frameFinished && pos_found == 1) { + AVFrame * input = anim->pFrame; + + /* This means the data wasnt read properly, + this check stops crashing */ + if (input->data[0]==0 && input->data[1]==0 + && input->data[2]==0 && input->data[3]==0){ + av_free_packet(&packet); + break; + } + if (anim->ib_flags & IB_animdeinterlace) { if (avpicture_deinterlace( + (AVPicture*) + anim->pFrameDeinterlaced, + (const AVPicture*) anim->pFrame, - anim->pFrame, anim->pCodecCtx->pix_fmt, anim->pCodecCtx->width, anim->pCodecCtx->height) < 0) { filter_y = 1; + } else { + input = anim->pFrameDeinterlaced; } } @@ -748,8 +773,8 @@ unsigned char* top; sws_scale(anim->img_convert_ctx, - anim->pFrame->data, - anim->pFrame->linesize, + input->data, + input->linesize, 0, anim->pCodecCtx->height, dst2, @@ -806,27 +831,25 @@ int i; unsigned char* r; - /* This means the data wasnt read properly, this check stops crashing */ - if (anim->pFrame->data[0]!=0 || anim->pFrame->data[1]!=0 || anim->pFrame->data[2]!=0 || anim->pFrame->data[3]!=0) { - sws_scale(anim->img_convert_ctx, - anim->pFrame->data, - anim->pFrame->linesize, - 0, - anim->pCodecCtx->height, - dst2, - dstStride2); + sws_scale(anim->img_convert_ctx, + input->data, + input->linesize, + 0, + anim->pCodecCtx->height, + dst2, + dstStride2); - /* workaround: sws_scale - sets alpha = 0... */ + /* workaround: sws_scale + sets alpha = 0... */ - r = (unsigned char*) ibuf->rect; - - for (i = 0; i < ibuf->x * ibuf->y;i++){ - r[3] = 0xff; - r+=4; - } + r = (unsigned char*) ibuf->rect; + + for (i = 0; i < ibuf->x * ibuf->y;i++){ + r[3] = 0xff; + r+=4; } + av_free_packet(&packet); break; } @@ -851,6 +874,11 @@ av_close_input_file(anim->pFormatCtx); av_free(anim->pFrameRGB); av_free(anim->pFrame); + + if (anim->ib_flags & IB_animdeinterlace) { + MEM_freeN(anim->pFrameDeinterlaced->data[0]); + } + av_free(anim->pFrameDeinterlaced); sws_freeContext(anim->img_convert_ctx); } anim->duration = 0; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs