From 02824e4718b8cf04b02c33687509df691d786c1e Mon Sep 17 00:00:00 2001 From: oreo639 <31916379+Oreo639@users.noreply.github.com> Date: Thu, 19 Nov 2020 16:56:45 -0800 Subject: [PATCH] Fix theora playback on certian videos. This fixes a bug that would cause Y2R to render certian videos incorrectly. --- .gitignore | 1 + source/frame.c | 21 ++++++++++----------- source/video.c | 6 ++++-- source/video.h | 2 ++ 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 19fb44f..dd49f16 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ libsbuild tmplibs build out +debug.txt *.3dsx *.cia *.smdh diff --git a/source/frame.c b/source/frame.c index a0ff02b..6d240a9 100644 --- a/source/frame.c +++ b/source/frame.c @@ -5,8 +5,6 @@ #include "frame.h" -Y2RU_ConversionParams convSettings; - static inline u32 Pow2(u32 x) { if (x <= 2) @@ -102,10 +100,10 @@ void frameWrite(C2D_Image* frame, THEORA_videoinfo* info, th_ycbcr_buffer ybr) { return; bool is_busy = true; - while (is_busy) { - Y2RU_StopConversion(); - Y2RU_IsBusyConversion(&is_busy); + Y2RU_StopConversion(); + while (is_busy) { + Y2RU_IsBusyConversion(&is_busy); } switch(info->fmt) @@ -128,12 +126,13 @@ void frameWrite(C2D_Image* frame, THEORA_videoinfo* info, th_ycbcr_buffer ybr) { Y2RU_SetStandardCoefficient(COEFFICIENT_ITU_R_BT_601_SCALING); Y2RU_SetAlpha(0xFF); - //svcWaitSynchronization(y2rEvent, 1000 * 1000); - { - Y2RU_SetSendingY(ybr[0].data, ybr[0].stride * ybr[0].height, ybr[0].width, ybr[0].stride - ybr[0].width); - Y2RU_SetSendingU(ybr[1].data, ybr[1].stride * ybr[1].height, ybr[1].width, ybr[1].stride - ybr[1].width); - Y2RU_SetSendingV(ybr[2].data, ybr[2].stride * ybr[2].height, ybr[2].width, ybr[2].stride - ybr[2].width); - } + //Y2RU_SetSendingY(ybr[0].data, ybr[0].stride * ybr[0].height, ybr[0].width, ybr[0].stride - ybr[0].width); + //Y2RU_SetSendingU(ybr[1].data, ybr[1].stride * ybr[1].height, ybr[1].width, ybr[1].stride - ybr[1].width); + //Y2RU_SetSendingV(ybr[2].data, ybr[2].stride * ybr[2].height, ybr[2].width, ybr[2].stride - ybr[2].width); + + Y2RU_SetSendingY(ybr[0].data, info->width * info->height, info->width, ybr[0].stride - info->width); + Y2RU_SetSendingU(ybr[1].data, (info->width/2) * (info->height/2), info->width/2, ybr[1].stride - (info->width >> 1)); + Y2RU_SetSendingV(ybr[2].data, (info->width/2) * (info->height/2), info->width/2, ybr[2].stride - (info->width >> 1)); Y2RU_SetReceiving(frame->tex->data, info->width * info->height * fmtGetBPP(frame->tex->fmt), info->width * 8 * fmtGetBPP(frame->tex->fmt), (Pow2(info->width) - info->width) * 8 * fmtGetBPP(frame->tex->fmt)); Y2RU_StartConversion(); diff --git a/source/video.c b/source/video.c index 8decd02..0928dda 100644 --- a/source/video.c +++ b/source/video.c @@ -220,8 +220,10 @@ int THEORA_CallbackCreate(THEORA_Context* ctx, void* datasource, THEORA_callback if (ctx->tinfo.fps_denominator) fps = ((double) ctx->tinfo.fps_numerator) / ((double) ctx->tinfo.fps_denominator); - ctx->videoinfo.width = ctx->tinfo.pic_width; - ctx->videoinfo.height = ctx->tinfo.pic_height; + ctx->videoinfo.width = ((ctx->tinfo.pic_x + ctx->tinfo.frame_width + 1) & ~1) - (ctx->tinfo.pic_x & ~1); // ctx->tinfo.pic_width; + ctx->videoinfo.height = ((ctx->tinfo.pic_y + ctx->tinfo.frame_height + 1) & ~1) - (ctx->tinfo.pic_y & ~1); // ctx->tinfo.pic_height; + ctx->videoinfo.x_offs = ctx->tinfo.pic_x; + ctx->videoinfo.y_offs = ctx->tinfo.pic_y; ctx->videoinfo.fps = fps; ctx->videoinfo.fmt = ctx->tinfo.pixel_fmt; ctx->videoinfo.colorspace = ctx->tinfo.colorspace; diff --git a/source/video.h b/source/video.h index 8db8558..56c789e 100644 --- a/source/video.h +++ b/source/video.h @@ -15,6 +15,8 @@ typedef struct tf_callbacks { typedef struct { int width; int height; + int x_offs; + int y_offs; double fps; th_pixel_fmt fmt; th_colorspace colorspace;