<div dir="auto"><a href="https://www.cinelerra-gg.org/bugtracker/view.php?id=665" rel="noreferrer noreferrer noreferrer noreferrer" target="_blank">https://www.cinelerra-gg.org/bugtracker/view.php?id=665</a><div dir="auto"><br></div><div dir="auto">we run  into strange problem: </div><div dir="auto"><br></div><div dir="auto">if cinelerra-gg  uses RGBA-8 format internally  we can process yuv444p (full chroma) test sample made with </div><div dir="auto"><br></div><div dir="auto">ffmpeg -f lavfi -i yuvtestsrc -frames 1 -color_range 2 /dev/shm/yuv-test.y4m <br></div><div dir="auto"><br></div><div dir="auto">by rendering it to y4m (yuv444p pixel format) and then comparing two files does not show big difference.</div><div dir="auto"><br></div><div dir="auto">Yet if we switch our pipeline to yuv (8 bit, 4:4:4) result is totally off (in YUVviewer) for same y4m render.</div><div dir="auto"><br></div><div dir="auto">I looked in libswscale and can't see much handling for specifically  </div><div dir="auto"><br></div><div dir="auto"><div dir="auto">guest@slax:~/botva/src/mplayer/ffmpeg/libswscale$ grep "AV_PIX_FMT_YUV444P" *.c</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P9LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P10LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P12LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P14LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P16LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P9BE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P10BE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P12BE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P14BE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P16BE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P9LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P10LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P12LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P14LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P16LE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P9BE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P10BE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P12BE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P14BE:</div><div dir="auto">input.c:    case AV_PIX_FMT_YUV444P16BE:</div><div dir="auto">swscale_unscaled.c:    if ((srcFormat == AV_PIX_FMT_YUV444P || srcFormat == AV_PIX_FMT_YUVA444P) &&</div><div dir="auto">swscale_unscaled.c:    if (dstFormat == AV_PIX_FMT_YUV444P &&</div><div dir="auto">swscale_unscaled.c:        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P9)  ||</div><div dir="auto">swscale_unscaled.c:        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P10) ||</div><div dir="auto">swscale_unscaled.c:        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P12) ||</div><div dir="auto">swscale_unscaled.c:        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P14) ||</div><div dir="auto">swscale_unscaled.c:        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P16))</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P]     = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P16LE] = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P16BE] = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P9BE]  = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P9LE]  = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P10BE] = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P10LE] = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P12BE] = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P12LE] = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P14BE] = { 1, 1 },</div><div dir="auto">utils.c:    [AV_PIX_FMT_YUV444P14LE] = { 1, 1 },</div><div dir="auto">utils.c:        *format = AV_PIX_FMT_YUV444P;</div><div dir="auto">utils.c:    case AV_PIX_FMT_YUVA444P:           return AV_PIX_FMT_YUV444P;</div><div dir="auto">utils.c:    case AV_PIX_FMT_YUVA444P9BE:        return AV_PIX_FMT_YUV444P9;</div><div dir="auto">utils.c:    case AV_PIX_FMT_YUVA444P9LE:        return AV_PIX_FMT_YUV444P9;</div><div dir="auto">utils.c:    case AV_PIX_FMT_YUVA444P10BE:       return AV_PIX_FMT_YUV444P10;</div><div dir="auto">utils.c:    case AV_PIX_FMT_YUVA444P10LE:       return AV_PIX_FMT_YUV444P10;</div><div dir="auto">utils.c:    case AV_PIX_FMT_YUVA444P16BE:       return AV_PIX_FMT_YUV444P16;</div><div dir="auto">utils.c:    case AV_PIX_FMT_YUVA444P16LE:       return AV_PIX_FMT_YUV444P16;</div><div dir="auto"><br></div><div dir="auto">it seems input.c does not deal well with specifically this format? There is no default case in switches ...</div><div dir="auto"><br></div><div dir="auto">in swscale_unscaled I also mostly see specific yuv-nv12 wrappers, not yuv444 standalone.</div><div dir="auto"><br></div><div dir="auto">util.c is again declares what to do with >8 bpc yuv, mostly.</div><div dir="auto"><br></div><div dir="auto">did I miss something important?</div><div dir="auto"><br></div><div dir="auto">our ffmpeg mappings live at</div><div dir="auto"><br></div><div dir="auto"> <a href="https://git.cinelerra-gg.org/git/?p=goodguy/cinelerra.git;a=blob;f=cinelerra-5.1/cinelerra/ffmpeg.C;h=9b8832dd718c94dd8b815edc7eb5c9d732953dd6;hb=HEAD">https://git.cinelerra-gg.org/git/?p=goodguy/cinelerra.git;a=blob;f=cinelerra-5.1/cinelerra/ffmpeg.C;h=9b8832dd718c94dd8b815edc7eb5c9d732953dd6;hb=HEAD</a></div><div dir="auto"><br></div><div dir="auto">ps: non-ffmpeg png writer seems to output nearly exactly same png if I set cingg to yuv8 or rgba8 internal processing. So, for same input test file as long as libswscale did its job once on input -  pipeline itself does not ruin video, as long as there was no second swscale ? unfortunately we do not have direct yuv writer, so at the end our yuv444 transformed into rgba for saving into tga or png or ppm by our routines.</div></div><div dir="auto"><br></div></div>