mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
Add guards against cleanup errors.
This commit is contained in:
parent
12da237cc3
commit
8853c06375
4
Todo
4
Todo
@ -6,6 +6,8 @@ libva-intel-driver:
|
|||||||
libva-vdpau-driver:
|
libva-vdpau-driver:
|
||||||
G210 osd update too slow (needs hardware problem workaround)
|
G210 osd update too slow (needs hardware problem workaround)
|
||||||
OSD update is too slow
|
OSD update is too slow
|
||||||
|
hangup on exit (VaapiDelDecoder -> VaapiCleanup
|
||||||
|
-> vaDestroyContext -> pthread_rwlock_wrlock)
|
||||||
|
|
||||||
x11:
|
x11:
|
||||||
support resize of x11 window
|
support resize of x11 window
|
||||||
@ -15,3 +17,5 @@ x11:
|
|||||||
video/audio asyncron
|
video/audio asyncron
|
||||||
|
|
||||||
playback of >2 channels on 2 channel hardware
|
playback of >2 channels on 2 channel hardware
|
||||||
|
|
||||||
|
playback of recording
|
||||||
|
30
video.c
30
video.c
@ -849,20 +849,21 @@ static void VaapiDestroySurfaces(VaapiDecoder * decoder)
|
|||||||
// update OSD associate
|
// update OSD associate
|
||||||
//
|
//
|
||||||
if (VaOsdSubpicture != VA_INVALID_ID) {
|
if (VaOsdSubpicture != VA_INVALID_ID) {
|
||||||
if (vaDeassociateSubpicture(VaDisplay, VaOsdSubpicture,
|
if (decoder->SurfaceFreeN
|
||||||
|
&& vaDeassociateSubpicture(VaDisplay, VaOsdSubpicture,
|
||||||
decoder->SurfacesFree, decoder->SurfaceFreeN)
|
decoder->SurfacesFree, decoder->SurfaceFreeN)
|
||||||
!= VA_STATUS_SUCCESS) {
|
!= VA_STATUS_SUCCESS) {
|
||||||
Error(_("video/vaapi: can't deassociate %d surfaces\n"),
|
Error(_("video/vaapi: can't deassociate %d surfaces\n"),
|
||||||
decoder->SurfaceFreeN);
|
decoder->SurfaceFreeN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vaDeassociateSubpicture(VaDisplay, VaOsdSubpicture,
|
if (decoder->SurfaceUsedN
|
||||||
|
&& vaDeassociateSubpicture(VaDisplay, VaOsdSubpicture,
|
||||||
decoder->SurfacesUsed, decoder->SurfaceUsedN)
|
decoder->SurfacesUsed, decoder->SurfaceUsedN)
|
||||||
!= VA_STATUS_SUCCESS) {
|
!= VA_STATUS_SUCCESS) {
|
||||||
Error(_("video/vaapi: can't deassociate %d surfaces\n"),
|
Error(_("video/vaapi: can't deassociate %d surfaces\n"),
|
||||||
decoder->SurfaceUsedN);
|
decoder->SurfaceUsedN);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vaDestroySurfaces(decoder->VaDisplay, decoder->SurfacesFree,
|
if (vaDestroySurfaces(decoder->VaDisplay, decoder->SurfacesFree,
|
||||||
@ -1135,6 +1136,15 @@ static void VaapiDelDecoder(VaapiDecoder * decoder)
|
|||||||
VaapiCleanup(decoder);
|
VaapiCleanup(decoder);
|
||||||
|
|
||||||
if (decoder->BlackSurface != VA_INVALID_ID) {
|
if (decoder->BlackSurface != VA_INVALID_ID) {
|
||||||
|
//
|
||||||
|
// update OSD associate
|
||||||
|
//
|
||||||
|
if (VaOsdSubpicture != VA_INVALID_ID) {
|
||||||
|
if (vaDeassociateSubpicture(VaDisplay, VaOsdSubpicture,
|
||||||
|
&decoder->BlackSurface, 1) != VA_STATUS_SUCCESS) {
|
||||||
|
Error(_("video/vaapi: can't deassociate black surfaces\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
if (vaDestroySurfaces(decoder->VaDisplay, &decoder->BlackSurface, 1)
|
if (vaDestroySurfaces(decoder->VaDisplay, &decoder->BlackSurface, 1)
|
||||||
!= VA_STATUS_SUCCESS) {
|
!= VA_STATUS_SUCCESS) {
|
||||||
Error(_("video/vaapi: can't destroy a surface\n"));
|
Error(_("video/vaapi: can't destroy a surface\n"));
|
||||||
@ -2410,7 +2420,7 @@ static void VaapiRenderFrame(VaapiDecoder * decoder,
|
|||||||
** FIXME: frame delay for 50hz hardcoded
|
** FIXME: frame delay for 50hz hardcoded
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
void VaapiDisplayFrame(void)
|
static void VaapiDisplayFrame(void)
|
||||||
{
|
{
|
||||||
uint32_t start;
|
uint32_t start;
|
||||||
uint32_t sync;
|
uint32_t sync;
|
||||||
@ -3050,7 +3060,7 @@ static void *VideoDisplayHandlerThread(void *dummy)
|
|||||||
video_clock = decoder->PTS - (decoder->Interlaced ? 40 : 20) * 90;
|
video_clock = decoder->PTS - (decoder->Interlaced ? 40 : 20) * 90;
|
||||||
}
|
}
|
||||||
|
|
||||||
delay = 4 * 500L * 1000 * 1000;
|
delay = 1 * 500L * 1000 * 1000;
|
||||||
clock_gettime(CLOCK_REALTIME, &nowtime);
|
clock_gettime(CLOCK_REALTIME, &nowtime);
|
||||||
|
|
||||||
// wait until we got any surface
|
// wait until we got any surface
|
||||||
@ -3395,6 +3405,16 @@ void VideoRenderFrame(VideoHwDecoder * decoder, AVCodecContext * video_ctx,
|
|||||||
|
|
||||||
VideoPollEvent();
|
VideoPollEvent();
|
||||||
|
|
||||||
|
if (!(decoder->Vaapi.FrameCounter % (50 * 10))) {
|
||||||
|
int64_t audio_clock;
|
||||||
|
|
||||||
|
audio_clock = AudioGetClock();
|
||||||
|
Debug(3,
|
||||||
|
"video: %09" PRIx64 "-%09" PRIx64 " pts %+dms %" PRId64 "\n",
|
||||||
|
audio_clock, decoder->Vaapi.PTS,
|
||||||
|
(int)(audio_clock - decoder->Vaapi.PTS) / 90,
|
||||||
|
AudioGetDelay() / 90);
|
||||||
|
}
|
||||||
// give osd some time slot
|
// give osd some time slot
|
||||||
while (pthread_cond_timedwait(&VideoWakeupCond, &VideoLockMutex,
|
while (pthread_cond_timedwait(&VideoWakeupCond, &VideoLockMutex,
|
||||||
&abstime) != ETIMEDOUT) {
|
&abstime) != ETIMEDOUT) {
|
||||||
|
Loading…
Reference in New Issue
Block a user