diff --git a/shaders.h b/shaders.h index 5ea3933..2cd827a 100644 --- a/shaders.h +++ b/shaders.h @@ -169,7 +169,13 @@ struct vertex_pt { float x, y; }; +struct vertex_pi { + GLint x, y; +}; + #define TEXUNIT_VIDEO_NUM 6 + + struct vertex { struct vertex_pt position; struct vertex_pt texcoord[TEXUNIT_VIDEO_NUM]; @@ -187,7 +193,6 @@ static const struct gl_vao_entry vertex_vao[] = { }; - static void compile_attach_shader(GLuint program, GLenum type, const char *source) { @@ -292,7 +297,7 @@ static GLuint sc_generate(GLuint gl_prog, enum AVColorSpace colorspace) { return gl_prog; } -static void render_pass_quad(int flip) +static void render_pass_quad(int flip, float xcrop, float ycrop) { struct vertex va[4]; int n; @@ -317,24 +322,26 @@ static void render_pass_quad(int flip) va[3].position.x = (float) 1.0; va[3].position.y = (float) 1.0; } - va[0].texcoord[0].x = (float) 0.0; - va[0].texcoord[0].y = (float) 0.0; - va[0].texcoord[1].x = (float) 0.0; - va[0].texcoord[1].y = (float) 0.0; - va[1].texcoord[0].x = (float) 0.0; - va[1].texcoord[0].y = (float) 1.0; - va[1].texcoord[1].x = (float) 0.0; - va[1].texcoord[1].y = (float) 1.0; - va[2].texcoord[0].x = (float) 1.0; - va[2].texcoord[0].y = (float) 0.0; - va[2].texcoord[1].x = (float) 1.0; - va[2].texcoord[1].y = (float) 0.0; - va[3].texcoord[0].x = (float) 1.0; - va[3].texcoord[0].y = (float) 1.0; - va[3].texcoord[1].x = (float) 1.0; - va[3].texcoord[1].y = (float) 1.0; + va[0].texcoord[0].x = (float) 0.0 + xcrop; + va[0].texcoord[0].y = (float) 0.0 + ycrop; // abgeschnitten von links oben + va[0].texcoord[1].x = (float) 0.0 + xcrop; + va[0].texcoord[1].y = (float) 0.0 + ycrop; // abgeschnitten von links oben + va[1].texcoord[0].x = (float) 0.0 + xcrop; + va[1].texcoord[0].y = (float) 1.0 - ycrop; // abgeschnitten links unten 1.0 - Wert + va[1].texcoord[1].x = (float) 0.0 + xcrop; + va[1].texcoord[1].y = (float) 1.0 - ycrop; // abgeschnitten links unten 1.0 - Wert + va[2].texcoord[0].x = (float) 1.0 - xcrop; + va[2].texcoord[0].y = (float) 0.0 + ycrop; // abgeschnitten von rechts oben + va[2].texcoord[1].x = (float) 1.0 - xcrop; + va[2].texcoord[1].y = (float) 0.0 + ycrop; // abgeschnitten von rechts oben + va[3].texcoord[0].x = (float) 1.0 - xcrop; + va[3].texcoord[0].y = (float) 1.0 - ycrop; // abgeschnitten von rechts unten 1.0 - wert + va[3].texcoord[1].x = (float) 1.0 - xcrop; + va[3].texcoord[1].y = (float) 1.0 - ycrop; // abgeschnitten von rechts unten 1.0 - wert + + glBindBuffer(GL_ARRAY_BUFFER, vao_buffer); glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(struct vertex), va, GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); diff --git a/softhdcuvid.cpp b/softhdcuvid.cpp index c60faf8..7b5eca9 100644 --- a/softhdcuvid.cpp +++ b/softhdcuvid.cpp @@ -995,7 +995,7 @@ void cMenuSetupSoft::Create(void) "None", "PCM", "AC-3", "PCM + AC-3" }; static const char *const resolution[RESOLUTIONS] = { - "576i", "720p", "fake 1080i", "1080i" ,"UHD" + "576", "720", "fake 1080", "1080" ,"UHD" }; int current; int i; @@ -1045,6 +1045,7 @@ void cMenuSetupSoft::Create(void) Add(new cMenuEditStraItem(trVDR("16:9+other video display format"), &VideoOtherDisplayFormat, 3, video_display_formats_16_9)); +#if 0 // FIXME: switch config gray/color configuration Add(new cMenuEditIntItem(tr("Video background color (RGB)"), (int *)&Background, 0, 0x00FFFFFF)); @@ -1052,6 +1053,7 @@ void cMenuSetupSoft::Create(void) (int *)&BackgroundAlpha, 0, 0xFF)); Add(new cMenuEditBoolItem(tr("Use studio levels (vdpau only)"), &StudioLevels, trVDR("no"), trVDR("yes"))); +#endif Add(new cMenuEditBoolItem(tr("60hz display mode"), &_60HzMode, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem(tr("Soft start a/v sync"), &SoftStartSync, @@ -1060,7 +1062,7 @@ void cMenuSetupSoft::Create(void) &BlackPicture, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem(tr("Clear decoder on channel switch"), &ClearOnSwitch, trVDR("no"), trVDR("yes"))); - +#if 0 Add(new cMenuEditIntItem(tr("Brightness (-1000..1000) (vdpau)"), &Brightness, -1000, 1000, tr("min"), tr("max"))); Add(new cMenuEditIntItem(tr("Contrast (0..10000) (vdpau)"), &Contrast, @@ -1069,39 +1071,37 @@ void cMenuSetupSoft::Create(void) &Saturation, 0, 10000, tr("min"), tr("max"))); Add(new cMenuEditIntItem(tr("Hue (-3141..3141) (vdpau)"), &Hue, -3141, 3141, tr("min"), tr("max"))); - +#endif for (i = 0; i < RESOLUTIONS; ++i) { cString msg; // short hidden informations - msg = - cString::sprintf("%s,%s%s%s%s,...", scaling_short[Scaling[i]], - deinterlace_short[Deinterlace[i]], - SkipChromaDeinterlace[i] ? ",skip" : "", - InverseTelecine[i] ? ",ITC" : "", Denoise[i] ? ",DN" : ""); + msg = cString::sprintf("show"); Add(CollapsedItem(resolution[i], ResolutionShown[i], msg)); if (ResolutionShown[i]) { - Add(new cMenuEditStraItem(tr("Scaling"), &Scaling[i], 4, - scaling)); - Add(new cMenuEditStraItem(tr("Deinterlace"), &Deinterlace[i], - 6, deinterlace)); - Add(new cMenuEditBoolItem(tr("SkipChromaDeinterlace (vdpau)"), - &SkipChromaDeinterlace[i], trVDR("no"), trVDR("yes"))); - Add(new cMenuEditBoolItem(tr("Inverse Telecine (vdpau)"), - &InverseTelecine[i], trVDR("no"), trVDR("yes"))); - Add(new cMenuEditIntItem(tr("Denoise (0..1000) (vdpau)"), - &Denoise[i], 0, 1000, tr("off"), tr("max"))); - Add(new cMenuEditIntItem(tr("Sharpen (-1000..1000) (vdpau)"), - &Sharpen[i], -1000, 1000, tr("blur max"), - tr("sharpen max"))); - - Add(new cMenuEditIntItem(tr("Cut top and bottom (pixel)"), - &CutTopBottom[i], 0, 250)); - Add(new cMenuEditIntItem(tr("Cut left and right (pixel)"), - &CutLeftRight[i], 0, 250)); +#if 0 + Add(new cMenuEditStraItem(tr("Scaling"), &Scaling[i], 4, + scaling)); + Add(new cMenuEditStraItem(tr("Deinterlace"), &Deinterlace[i], + 6, deinterlace)); + Add(new cMenuEditBoolItem(tr("SkipChromaDeinterlace (vdpau)"), + &SkipChromaDeinterlace[i], trVDR("no"), trVDR("yes"))); + Add(new cMenuEditBoolItem(tr("Inverse Telecine (vdpau)"), + &InverseTelecine[i], trVDR("no"), trVDR("yes"))); + Add(new cMenuEditIntItem(tr("Denoise (0..1000) (vdpau)"), + &Denoise[i], 0, 1000, tr("off"), tr("max"))); + Add(new cMenuEditIntItem(tr("Sharpen (-1000..1000) (vdpau)"), + &Sharpen[i], -1000, 1000, tr("blur max"), + tr("sharpen max"))); +#endif + Add(new cMenuEditIntItem(tr("Cut top and bottom (pixel)"), + &CutTopBottom[i], 0, 250)); + Add(new cMenuEditIntItem(tr("Cut left and right (pixel)"), + &CutLeftRight[i], 0, 250)); } } +#ifdef USE_AUTOCROP // // auto-crop // @@ -1109,6 +1109,7 @@ void cMenuSetupSoft::Create(void) Add(new cMenuEditIntItem(tr("Autocrop interval (frames)"), &AutoCropInterval, 0, 200, tr("off"))); Add(new cMenuEditIntItem(tr("Autocrop delay (n * interval)"), &AutoCropDelay, 0, 200)); Add(new cMenuEditIntItem(tr("Autocrop tolerance (pixel)"), &AutoCropTolerance, 0, 32)); +#endif } // // audio diff --git a/video.c b/video.c index 3d78553..0dddaa6 100644 --- a/video.c +++ b/video.c @@ -590,8 +590,7 @@ static void VideoUpdateOutput(AVRational input_aspect_ratio, int input_width, VideoScreen->height_in_pixels * VideoScreen->width_in_millimeters; display_aspect_ratio = av_mul_q(input_aspect_ratio, display_aspect_ratio); - Debug(3, "video: aspect %d:%d\n", display_aspect_ratio.num, - display_aspect_ratio.den); + Debug(3, "video: aspect %d:%d Resolution %d\n", display_aspect_ratio.num, display_aspect_ratio.den, resolution); *crop_x = VideoCutLeftRight[resolution]; *crop_y = VideoCutTopBottom[resolution]; @@ -1354,7 +1353,7 @@ static VideoResolutions VideoResolutionGroup(int width, int height, if (height <= 720) { return VideoResolution720p; } - if (height <= 1080) { + if (height < 1080) { return VideoResolutionFake1080i; } if (width < 1920) { @@ -2361,7 +2360,7 @@ int get_RGB(CuvidDecoder *decoder) { glBindFramebuffer(GL_FRAMEBUFFER, fb); - render_pass_quad(1); + render_pass_quad(1,0.0,0.0); glUseProgram(0); glActiveTexture(GL_TEXTURE0); @@ -2614,8 +2613,7 @@ static void CuvidAutoCrop(CuvidDecoder * decoder) decoder->InputAspect.num, decoder->InputAspect.den, crop14, crop16, decoder->AutoCrop->Y1, decoder->InputHeight - decoder->AutoCrop->Y2); - Debug(3, "video: crop aspect %d -> %d\n", decoder->AutoCrop->State, - next_state); + Debug(3, "video: crop aspect %d -> %d\n", decoder->AutoCrop->State, next_state); switch (decoder->AutoCrop->State) { case 16: @@ -2894,6 +2892,7 @@ static void CuvidMixVideo(CuvidDecoder * decoder, int level) int w = decoder->InputWidth; int h = decoder->InputHeight; int y; + float xcropf, ycropf; GLint texLoc; size_t nSize = 0; @@ -2921,6 +2920,9 @@ static void CuvidMixVideo(CuvidDecoder * decoder, int level) video_src_rect.x1 = decoder->CropX + decoder->CropWidth; video_src_rect.y1 = decoder->CropY + decoder->CropHeight; + xcropf = (float) decoder->CropX / (float) decoder->InputWidth; + ycropf = (float) decoder->CropY / (float) decoder->InputHeight; + dst_video_rect.x0 = decoder->OutputX; // video output (scale) dst_video_rect.y0 = decoder->OutputY; dst_video_rect.x1 = decoder->OutputX + decoder->OutputWidth; @@ -2949,7 +2951,7 @@ static void CuvidMixVideo(CuvidDecoder * decoder, int level) glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D,decoder->gl_textures[current*2+1]); - render_pass_quad(0); + render_pass_quad(0, xcropf, ycropf); glUseProgram(0); glActiveTexture(GL_TEXTURE0);