You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-11 13:10:58 +00:00
webm/theora/yuv2rgb: Fix YUV conversion issues and add BGRP WEBM handling. (Now clang-format friendly.)
This should fix the various issues with colours in Ogg Theora and WEBM playback. (A reference project is attached to PR #26051, which this commit should be part of.) This version of the commit, rather than moving x->RGBA handling into libsimplewebm, uses a colourspace field added to libsimplewebm by a PR there. Thus, the commit that precedes this should be the synchronization & cleanup commit for that. Also, this version is now clang-format friendly. I hope.
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
|
||||
#include "OpusVorbisDecoder.hpp"
|
||||
#include "VPXDecoder.hpp"
|
||||
#include <vpx/vpx_image.h>
|
||||
|
||||
#include "mkvparser/mkvparser.h"
|
||||
|
||||
@@ -314,19 +315,37 @@ void VideoStreamPlaybackWebm::update(float p_delta) {
|
||||
PoolVector<uint8_t>::Write w = frame_data.write();
|
||||
bool converted = false;
|
||||
|
||||
if (image.chromaShiftW == 1 && image.chromaShiftH == 1) {
|
||||
if (image.chromaShiftW == 0 && image.chromaShiftH == 0 && image.cs == VPX_CS_SRGB) {
|
||||
|
||||
yuv420_2_rgb8888(w.ptr(), image.planes[0], image.planes[2], image.planes[1], image.w, image.h, image.linesize[0], image.linesize[1], image.w << 2, 0);
|
||||
uint8_t *wp = w.ptr();
|
||||
unsigned char *rRow = image.planes[2];
|
||||
unsigned char *gRow = image.planes[0];
|
||||
unsigned char *bRow = image.planes[1];
|
||||
for (size_t i = 0; i < image.h; i++) {
|
||||
for (size_t j = 0; j < image.w; j++) {
|
||||
*wp++ = rRow[j];
|
||||
*wp++ = gRow[j];
|
||||
*wp++ = bRow[j];
|
||||
*wp++ = 255;
|
||||
}
|
||||
rRow += image.linesize[2];
|
||||
gRow += image.linesize[0];
|
||||
bRow += image.linesize[1];
|
||||
}
|
||||
converted = true;
|
||||
} else if (image.chromaShiftW == 1 && image.chromaShiftH == 1) {
|
||||
|
||||
yuv420_2_rgb8888(w.ptr(), image.planes[0], image.planes[1], image.planes[2], image.w, image.h, image.linesize[0], image.linesize[1], image.w << 2);
|
||||
// libyuv::I420ToARGB(image.planes[0], image.linesize[0], image.planes[2], image.linesize[2], image.planes[1], image.linesize[1], w.ptr(), image.w << 2, image.w, image.h);
|
||||
converted = true;
|
||||
} else if (image.chromaShiftW == 1 && image.chromaShiftH == 0) {
|
||||
|
||||
yuv422_2_rgb8888(w.ptr(), image.planes[0], image.planes[2], image.planes[1], image.w, image.h, image.linesize[0], image.linesize[1], image.w << 2, 0);
|
||||
yuv422_2_rgb8888(w.ptr(), image.planes[0], image.planes[1], image.planes[2], image.w, image.h, image.linesize[0], image.linesize[1], image.w << 2);
|
||||
// libyuv::I422ToARGB(image.planes[0], image.linesize[0], image.planes[2], image.linesize[2], image.planes[1], image.linesize[1], w.ptr(), image.w << 2, image.w, image.h);
|
||||
converted = true;
|
||||
} else if (image.chromaShiftW == 0 && image.chromaShiftH == 0) {
|
||||
|
||||
yuv444_2_rgb8888(w.ptr(), image.planes[0], image.planes[2], image.planes[1], image.w, image.h, image.linesize[0], image.linesize[1], image.w << 2, 0);
|
||||
yuv444_2_rgb8888(w.ptr(), image.planes[0], image.planes[1], image.planes[2], image.w, image.h, image.linesize[0], image.linesize[1], image.w << 2);
|
||||
// libyuv::I444ToARGB(image.planes[0], image.linesize[0], image.planes[2], image.linesize[2], image.planes[1], image.linesize[1], w.ptr(), image.w << 2, image.w, image.h);
|
||||
converted = true;
|
||||
} else if (image.chromaShiftW == 2 && image.chromaShiftH == 0) {
|
||||
|
||||
Reference in New Issue
Block a user