mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
Auto-crop improvement and nicer a-v sync display.
This commit is contained in:
parent
3585f1df19
commit
ab4e89132e
@ -1,6 +1,11 @@
|
||||
User johns
|
||||
Date:
|
||||
|
||||
Release Version 0.4.6
|
||||
Increase audio buffer, if bigger audio delay is used.
|
||||
Makes SkipLines configure in setup menu.
|
||||
Auto-crop only enabled with normal 4:3 display mode.
|
||||
Vaapi updates OSD when cropping changes.
|
||||
Add A-V info output and compile time option.
|
||||
Fix bug: VA-API intel software decoder broken by aspect commit.
|
||||
Add support for 4:3 output modes.
|
||||
|
8
Todo
8
Todo
@ -21,12 +21,10 @@ $Id: $
|
||||
missing:
|
||||
software deinterlace (yadif, ...)
|
||||
software decoder with software deinterlace
|
||||
zoom/fit-zoom 4:3 (SetVideoDisplayFormat, SetVideoFormat?)
|
||||
ITU BT601, ITU BT709 (HD), RGB studio levels (16-235)?
|
||||
suspend output / energie saver: stop and restart X11
|
||||
suspend plugin didn't restore full-screen (is this wanted?)
|
||||
Option deinterlace off / deinterlace force!
|
||||
Make output drivers better modular (under construction).
|
||||
|
||||
crash:
|
||||
AudioPlayHandlerThread -> pthread_cond_wait
|
||||
@ -40,8 +38,6 @@ video:
|
||||
(must detect video format to show image)
|
||||
hard channel switch
|
||||
skip lines not configurable from setup menu.
|
||||
software decoder path didn't support auto-crop
|
||||
software decoder path didn't support correct 4:3 16:9
|
||||
OSD can only be shown after some stream could be shown
|
||||
|
||||
vdpau:
|
||||
@ -60,6 +56,7 @@ libva: branch vaapi-ext
|
||||
add support for vaapi-ext
|
||||
|
||||
libva-intel-driver:
|
||||
deinterlace only supported with vaapi-ext
|
||||
1080i does no v-sync (sometimes correct working with vaapi-ext)
|
||||
OSD has sometimes wrong size (workaround written)
|
||||
sometimes software decoder deinterlace isn't working and 1080i channels
|
||||
@ -69,10 +66,9 @@ libva-vdpau-driver:
|
||||
G210/GT520 OSD update too slow (needs hardware problem workaround)
|
||||
hangup on exit (VaapiDelDecoder -> VaapiCleanup
|
||||
-> vaDestroyContext -> pthread_rwlock_wrlock)
|
||||
with auto-crop OSD has wrong position
|
||||
OSD still has some problems with auto-crop and 4:3 zoom.
|
||||
|
||||
libva-xvba-driver:
|
||||
with auto-crop OSD has wrong position
|
||||
|
||||
x11:
|
||||
disable screensaver
|
||||
|
69
video.c
69
video.c
@ -296,7 +296,7 @@ static int VideoSharpen[VideoResolutionMax];
|
||||
static VideoScalingModes VideoScaling[VideoResolutionMax];
|
||||
|
||||
/// Default audio/video delay
|
||||
static int VideoAudioDelay;
|
||||
int VideoAudioDelay;
|
||||
|
||||
/// Default zoom mode
|
||||
static VideoZoomModes Video4to3ZoomMode;
|
||||
@ -344,20 +344,22 @@ static void VideoThreadUnlock(void); ///< unlock video thread
|
||||
///
|
||||
static const char *VideoTimeStampString(int64_t ts)
|
||||
{
|
||||
static char buf[64];
|
||||
static char buf[2][32];
|
||||
static int idx;
|
||||
int hh;
|
||||
int mm;
|
||||
int ss;
|
||||
int uu;
|
||||
|
||||
idx ^= 1; // support two static buffers
|
||||
ts = ts / 90;
|
||||
uu = ts % 1000;
|
||||
ss = (ts / 1000) % 60;
|
||||
mm = (ts / 60000) % 60;
|
||||
hh = ts / 3600000;
|
||||
snprintf(buf, sizeof(buf), "%2d:%02d:%02d.%03d", hh, mm, ss, uu);
|
||||
snprintf(buf[idx], sizeof(buf[idx]), "%2d:%02d:%02d.%03d", hh, mm, ss, uu);
|
||||
|
||||
return buf;
|
||||
return buf[idx];
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1335,10 +1337,8 @@ static void VaapiDestroyDeinterlaceImages(VaapiDecoder *);
|
||||
/// Associate OSD with surface.
|
||||
///
|
||||
/// @param decoder VA-API decoder
|
||||
/// @param width surface source/video width
|
||||
/// @param height surface source/video height
|
||||
///
|
||||
static void VaapiAssociate(VaapiDecoder * decoder, int width, int height)
|
||||
static void VaapiAssociate(VaapiDecoder * decoder)
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
@ -1374,18 +1374,19 @@ static void VaapiAssociate(VaapiDecoder * decoder, int width, int height)
|
||||
Error(_("video/vaapi: can't associate subpicture\n"));
|
||||
}
|
||||
} else {
|
||||
// FIXME: auto-crop wrong position
|
||||
if (decoder->SurfaceFreeN
|
||||
&& vaAssociateSubpicture(VaDisplay, VaOsdSubpicture,
|
||||
decoder->SurfacesFree, decoder->SurfaceFreeN, x, y, w, h, 0, 0,
|
||||
width, height, 0)
|
||||
decoder->SurfacesFree, decoder->SurfaceFreeN, x, y, w, h,
|
||||
decoder->CropX, decoder->CropY / 2, decoder->CropWidth,
|
||||
decoder->CropHeight, 0)
|
||||
!= VA_STATUS_SUCCESS) {
|
||||
Error(_("video/vaapi: can't associate subpicture\n"));
|
||||
}
|
||||
if (decoder->SurfaceUsedN
|
||||
&& vaAssociateSubpicture(VaDisplay, VaOsdSubpicture,
|
||||
decoder->SurfacesUsed, decoder->SurfaceUsedN, x, y, w, h, 0, 0,
|
||||
width, height, 0)
|
||||
decoder->SurfacesUsed, decoder->SurfaceUsedN, x, y, w, h,
|
||||
decoder->CropX, decoder->CropY / 2, decoder->CropWidth,
|
||||
decoder->CropHeight, 0)
|
||||
!= VA_STATUS_SUCCESS) {
|
||||
Error(_("video/vaapi: can't associate subpicture\n"));
|
||||
}
|
||||
@ -1445,10 +1446,6 @@ static void VaapiCreateSurfaces(VaapiDecoder * decoder, int width, int height)
|
||||
decoder->SurfaceFreeN);
|
||||
// FIXME: write error handler / fallback
|
||||
}
|
||||
//
|
||||
// update OSD associate
|
||||
//
|
||||
VaapiAssociate(decoder, width, height);
|
||||
}
|
||||
|
||||
///
|
||||
@ -2185,6 +2182,10 @@ static enum PixelFormat Vaapi_get_format(VaapiDecoder * decoder,
|
||||
decoder->InputAspect = video_ctx->sample_aspect_ratio;
|
||||
VaapiUpdateOutput(decoder);
|
||||
|
||||
//
|
||||
// update OSD associate
|
||||
//
|
||||
VaapiAssociate(decoder);
|
||||
#ifdef USE_GLX
|
||||
if (GlxEnabled) {
|
||||
GlxSetupDecoder(decoder);
|
||||
@ -2486,6 +2487,7 @@ static int VaapiFindImageFormat(VaapiDecoder * decoder,
|
||||
/// @param decoder VA-API decoder
|
||||
///
|
||||
/// @note called only for software decoder.
|
||||
/// @note FIXME: combine with hardware decoder setup.
|
||||
///
|
||||
static void VaapiSetup(VaapiDecoder * decoder,
|
||||
const AVCodecContext * video_ctx)
|
||||
@ -2542,6 +2544,12 @@ static void VaapiSetup(VaapiDecoder * decoder,
|
||||
*/
|
||||
}
|
||||
#endif
|
||||
VaapiUpdateOutput(decoder);
|
||||
|
||||
//
|
||||
// update OSD associate
|
||||
//
|
||||
VaapiAssociate(decoder);
|
||||
}
|
||||
|
||||
#ifdef USE_AUTOCROP
|
||||
@ -2711,6 +2719,12 @@ static void VaapiAutoCrop(VaapiDecoder * decoder)
|
||||
VaapiUpdateOutput(decoder);
|
||||
}
|
||||
decoder->AutoCrop->Count = 0;
|
||||
|
||||
//
|
||||
// update OSD associate
|
||||
//
|
||||
VaapiDeassociate(decoder);
|
||||
VaapiAssociate(decoder);
|
||||
}
|
||||
|
||||
///
|
||||
@ -2719,11 +2733,13 @@ static void VaapiAutoCrop(VaapiDecoder * decoder)
|
||||
/// @param decoder VA-API hw decoder
|
||||
///
|
||||
/// @note a copy of VdpauCheckAutoCrop
|
||||
/// @note auto-crop only supported with normal 4:3 display mode
|
||||
///
|
||||
static void VaapiCheckAutoCrop(VaapiDecoder * decoder)
|
||||
{
|
||||
// reduce load, check only n frames
|
||||
if (AutoCropInterval && !(decoder->FrameCounter % AutoCropInterval)) {
|
||||
if (Video4to3ZoomMode == VideoNormal && AutoCropInterval
|
||||
&& !(decoder->FrameCounter % AutoCropInterval)) {
|
||||
AVRational display_aspect_ratio;
|
||||
|
||||
av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
|
||||
@ -3548,7 +3564,6 @@ static void VaapiRenderFrame(VaapiDecoder * decoder,
|
||||
decoder->InputHeight = height;
|
||||
|
||||
VaapiSetup(decoder, video_ctx);
|
||||
VaapiUpdateOutput(decoder);
|
||||
}
|
||||
// FIXME: Need to insert software deinterlace here
|
||||
// FIXME: can/must insert auto-crop here (is done after upload)
|
||||
@ -3842,6 +3857,7 @@ static void VaapiSyncDisplayFrame(VaapiDecoder * decoder)
|
||||
// FIXME: audio not known assume 333ms delay
|
||||
|
||||
if (decoder->DupNextFrame) {
|
||||
++decoder->FramesDuped;
|
||||
decoder->DupNextFrame--;
|
||||
} else if ((uint64_t) audio_clock != AV_NOPTS_VALUE
|
||||
&& (uint64_t) video_clock != AV_NOPTS_VALUE) {
|
||||
@ -3852,7 +3868,7 @@ static void VaapiSyncDisplayFrame(VaapiDecoder * decoder)
|
||||
} else if (video_clock > audio_clock + VideoAudioDelay + 80 * 90) {
|
||||
Debug(3, "video: slow down video\n");
|
||||
decoder->DupNextFrame += 2;
|
||||
} else if (video_clock > audio_clock + VideoAudioDelay + 40 * 90) {
|
||||
} else if (video_clock > audio_clock + VideoAudioDelay + 30 * 90) {
|
||||
Debug(3, "video: slow down video\n");
|
||||
decoder->DupNextFrame++;
|
||||
} else if (audio_clock + VideoAudioDelay > video_clock + 40 * 90
|
||||
@ -4048,10 +4064,9 @@ static void VaapiOsdClear(void)
|
||||
if (OsdDirtyWidth && OsdDirtyHeight) {
|
||||
int o;
|
||||
|
||||
Debug(3, "video/vaapi: handle osd dirty area\n");
|
||||
for (o = 0; o < OsdDirtyHeight; ++o) {
|
||||
memset(image_buffer + (OsdDirtyX + (o +
|
||||
OsdDirtyY) * VaOsdImage.width) * 4, 0,
|
||||
OsdDirtyY) * VaOsdImage.width) * 4, 0x00,
|
||||
OsdDirtyWidth * 4);
|
||||
}
|
||||
} else {
|
||||
@ -4204,9 +4219,9 @@ static void VaapiOsdInit(int width, int height)
|
||||
|
||||
// restore osd association
|
||||
for (i = 0; i < VaapiDecoderN; ++i) {
|
||||
// only if input already setup
|
||||
if (VaapiDecoders[i]->InputWidth && VaapiDecoders[i]->InputHeight) {
|
||||
VaapiAssociate(VaapiDecoders[i], VaapiDecoders[i]->InputWidth,
|
||||
VaapiDecoders[i]->InputHeight);
|
||||
VaapiAssociate(VaapiDecoders[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -6091,11 +6106,13 @@ static void VdpauAutoCrop(VdpauDecoder * decoder)
|
||||
/// @param decoder VDPAU hw decoder
|
||||
///
|
||||
/// @note a copy of VaapiCheckAutoCrop
|
||||
/// @note auto-crop only supported with normal 4:3 display mode
|
||||
///
|
||||
static void VdpauCheckAutoCrop(VdpauDecoder * decoder)
|
||||
{
|
||||
// reduce load, check only n frames
|
||||
if (AutoCropInterval && !(decoder->FrameCounter % AutoCropInterval)) {
|
||||
if (Video4to3ZoomMode == VideoNormal && AutoCropInterval
|
||||
&& !(decoder->FrameCounter % AutoCropInterval)) {
|
||||
AVRational display_aspect_ratio;
|
||||
|
||||
av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
|
||||
@ -6785,7 +6802,7 @@ static void VdpauSyncDisplayFrame(VdpauDecoder * decoder)
|
||||
} else if (video_clock > audio_clock + VideoAudioDelay + 80 * 90) {
|
||||
Debug(3, "video: slow down video\n");
|
||||
decoder->DupNextFrame += 2;
|
||||
} else if (video_clock > audio_clock + VideoAudioDelay + 40 * 90) {
|
||||
} else if (video_clock > audio_clock + VideoAudioDelay + 30 * 90) {
|
||||
Debug(3, "video: slow down video\n");
|
||||
decoder->DupNextFrame++;
|
||||
} else if (audio_clock + VideoAudioDelay > video_clock + 40 * 90
|
||||
@ -7481,6 +7498,8 @@ void VideoOsdExit(void)
|
||||
if (VideoThread) {
|
||||
VideoThreadUnlock();
|
||||
}
|
||||
OsdDirtyWidth = 0;
|
||||
OsdDirtyHeight = 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
Loading…
Reference in New Issue
Block a user