Я пытаюсь воспроизвести в своем собственном коде, не используя библиотеки ffmpeg, операции, которые ffmpeg выполняет для преобразования yuv420p в rgb. Сначала я думал, что это будет внутри функции: xyz12Torgb48 в swscale.c, но, проведя некоторую трассировку, оказалось, что он находится в yuv2rgb.c ff_yuv2rgb_c_init_tables, чего я не совсем вижу.
самый простой способ, вероятно, состоял бы в том, чтобы просто изучить рассматриваемые форматы и выяснить, какие математические операции требуются для преобразования. только после этого, если вы посмотрите на код ffmpeg
- копирование чего-то, чего вы не понимаете, - это рецепт страданий и ошибок.
Я знаю, что означает yuv420, и у меня есть код для чтения файла yuv и разделения каналов. Я уже сделал некоторые преобразования, используя уравнения в литературе, но мне нужно, чтобы вывод был таким же, как у ffmpeg.
ну, так как никто не придумал решение, я просто опубликую то, что нашел, используя valgrind tool=callgrind ffmpeg_g который представляет собой версию ffmpeg с объектами отладки, которая показала мне вызываемые функции, а внутри \libswscale\x86 есть yuv2rgb_template.c, в котором, похоже, есть операции, которые вы выполняете yuv2rgb , в сборке
* Conversion is performed in usual way:
* R = Y' * Ycoef + Vred * V'
* G = Y' * Ycoef + Vgreen * V' + Ugreen * U'
* B = Y' * Ycoef + Ublue * U'
*
* where X' = X * 8 - Xoffset (multiplication is performed to increase
* precision a bit).
* Since it operates in YUV420 colorspace, Y component is additionally
* split into Y1 and Y2 for even and odd pixels.
*
* Input:
* mm0 - U (4 elems), mm1 - V (4 elems), mm6 - Y (8 elems), mm4 - zero register
* Output:
* mm1 - R, mm2 - G, mm0 - B
*/ ```
Для начала вам нужно знать что означает 420.