Hi, 2018-08-14 18:53 GMT+02:00 Vasile Toncu <vasile.to...@tremend.com>:
> Hi Thomas, > > I added the log messages. > > Thanks for the review. > I found some more time for testing this evening. Unfortunately there are still issues. I get half green pictures with some modes at high bit depth. But the fix is easy. The bytewidth in all av_image_copy_plane functions need to be adapted for high bit depths. {....} > const AVPixFmtDescriptor *fmt_desc = av_pix_fmt_desc_get(out->format); > int mult = (fmt_desc->comp[0].depth > 8 ? 2 : 1); > You used the calculated "mult" in the av_image_copy_plane functions of MODE_MERGE and MODE_PAD only. And forgot the others: > {....} > + case MODE_INTERLEAVE_BOTTOM: > + case MODE_INTERLEAVE_TOP: > + y = y * 2; > + > + if (tinterlace->flags & FLAG_VLPF || tinterlace->flags & > FLAG_CVLPF) { > + int clip_max = (1 << fmt_desc->comp[plane].depth) - 1; > + > + interleave_filter_frame(tinterlace, first, out, plane, > !!(tinterlace->flags & FLAG_CVLPF), tinterlace_mode == MODE_INTERLEAVE_TOP, > x, y, clip_max); > + interleave_filter_frame(tinterlace, second, out, plane, > !!(tinterlace->flags & FLAG_CVLPF), tinterlace_mode == > MODE_INTERLEAVE_BOTTOM, x, y, clip_max); > } else { > - if (tinterlace->csp->comp[plane].depth > 8) > - cols *= 2; > - av_image_copy_plane(dstp, dstp_linesize, srcp, srcp_linesize, > cols, lines); > + offset1 = (tinterlace_mode == MODE_INTERLEAVE_TOP) ? 0 : > out->linesize[plane]; > + offset2 = (tinterlace_mode == MODE_INTERLEAVE_TOP) ? 0 : > first->linesize[plane]; > + offset3 = (tinterlace_mode == MODE_INTERLEAVE_TOP) ? > out->linesize[plane] : 0; > + offset4 = (tinterlace_mode == MODE_INTERLEAVE_TOP) ? > second->linesize[plane] : 0; > + > + av_image_copy_plane(out->data[plane] + offset1, 2 * > out->linesize[plane], > + first->data[plane] + offset2, 2 * first->linesize[plane], > + first->width / x, first->height / y); > + av_image_copy_plane(out->data[plane] + offset3, 2 * > out->linesize[plane], > + second->data[plane] + offset4, 2 * > second->linesize[plane], > + second->width / x, second->height / y); > Here } > + break; > + > + case MODE_INTERLACE_X2: > + y = y * 2; > + > + offset1 = 0; offset2 = 0; > + offset3 = out->linesize[plane]; > + offset4 = second->linesize[plane]; > + > + if (second->interlaced_frame && second->top_field_first) { > + offset1 = out->linesize[plane]; > + offset2 = first->linesize[plane]; > + offset3 = 0; offset4 = 0; > + } > + > + av_image_copy_plane(out->data[plane] + offset1, 2 * > out->linesize[plane], > + first->data[plane] + offset2, 2 * first->linesize[plane], > + first->width / x, first->height / y); > + av_image_copy_plane(out->data[plane] + offset3, 2 * > out->linesize[plane], > + second->data[plane] + offset4, 2 * second->linesize[plane], > + second->width / x, second->height / y); > Here + break; > + > + case MODE_MERGE_X2: > + if (IS_ODD(tinterlace->current_frame_index - 1)) { > + av_image_copy_plane(out->data[plane], 2 * > out->linesize[plane], > + second->data[plane], second->linesize[plane], > second->width / x, second->height / y); > + av_image_copy_plane(out->data[plane] + out->linesize[plane], > 2 * out->linesize[plane], > + first->data[plane], first->linesize[plane], first->width > / x, first->height / y); > + } else { > + av_image_copy_plane(out->data[plane], 2 * > out->linesize[plane], > + first->data[plane], first->linesize[plane], first->width > / x, first->height / y); > + av_image_copy_plane(out->data[plane] + out->linesize[plane], > 2 * out->linesize[plane], > + second->data[plane], second->linesize[plane], > second->width / x, second->height / y); > Here. Sorry for the piecemeal. Regards, Thomas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel