1
0
mirror of https://github.com/jojo61/vdr-plugin-softhdcuvid.git synced 2023-10-10 13:37:41 +02:00

Fixes for drm Aspectratio and UHD HDR

This commit is contained in:
jojo61 2020-01-15 18:01:27 +01:00
parent 269c396a2c
commit 1674600882
3 changed files with 78 additions and 65 deletions

113
codec.c
View File

@ -258,19 +258,19 @@ void CodecVideoOpen(VideoDecoder * decoder, int codec_id)
} }
#endif #endif
#ifdef RASPI #ifdef RASPI
switch (codec_id) { switch (codec_id) {
case AV_CODEC_ID_MPEG2VIDEO: case AV_CODEC_ID_MPEG2VIDEO:
name = "mpeg2_v4l2m2m"; name = "mpeg2_v4l2m2m";
break; break;
case AV_CODEC_ID_H264: case AV_CODEC_ID_H264:
name = "h264_v4l2m2m"; name = "h264_v4l2m2m";
// name = "h264_mmal"; // name = "h264_mmal";
break; break;
case AV_CODEC_ID_HEVC: case AV_CODEC_ID_HEVC:
name = "hevc_v4l2m2m"; name = "hevc_v4l2m2m";
break; break;
} }
#endif #endif
if (name && (video_codec = avcodec_find_decoder_by_name(name))) { if (name && (video_codec = avcodec_find_decoder_by_name(name))) {
Debug(3, "codec: decoder found\n"); Debug(3, "codec: decoder found\n");
} else if ((video_codec = avcodec_find_decoder(codec_id)) == NULL) { } else if ((video_codec = avcodec_find_decoder(codec_id)) == NULL) {
@ -285,15 +285,15 @@ void CodecVideoOpen(VideoDecoder * decoder, int codec_id)
if (!(decoder->VideoCtx = avcodec_alloc_context3(video_codec))) { if (!(decoder->VideoCtx = avcodec_alloc_context3(video_codec))) {
Fatal(_("codec: can't allocate video codec context\n")); Fatal(_("codec: can't allocate video codec context\n"));
} }
#ifndef RASPI #ifndef RASPI
if (!HwDeviceContext) { if (!HwDeviceContext) {
Fatal("codec: no hw device context to be used"); Fatal("codec: no hw device context to be used");
} }
decoder->VideoCtx->hw_device_ctx = av_buffer_ref(HwDeviceContext); decoder->VideoCtx->hw_device_ctx = av_buffer_ref(HwDeviceContext);
#else #else
decoder->VideoCtx->pix_fmt = AV_PIX_FMT_DRM_PRIME; /* request a DRM frame decoder->VideoCtx->pix_fmt = AV_PIX_FMT_DRM_PRIME; /* request a DRM frame
// decoder->VideoCtx->pix_fmt = AV_PIX_FMT_MMAL; /* request a DRM frame */ // decoder->VideoCtx->pix_fmt = AV_PIX_FMT_MMAL; /* request a DRM frame */
#endif #endif
// FIXME: for software decoder use all cpus, otherwise 1 // FIXME: for software decoder use all cpus, otherwise 1
@ -337,12 +337,12 @@ void CodecVideoOpen(VideoDecoder * decoder, int codec_id)
if (av_opt_set_int(decoder->VideoCtx, "refcounted_frames", 1, 0) < 0) if (av_opt_set_int(decoder->VideoCtx, "refcounted_frames", 1, 0) < 0)
Fatal(_("VAAPI Refcounts invalid\n")); Fatal(_("VAAPI Refcounts invalid\n"));
decoder->VideoCtx->thread_safe_callbacks = 0; decoder->VideoCtx->thread_safe_callbacks = 0;
#endif #endif
#ifdef RASPI #ifdef RASPI
decoder->VideoCtx->codec_id = codec_id; decoder->VideoCtx->codec_id = codec_id;
decoder->VideoCtx->flags |= AV_CODEC_FLAG_BITEXACT; decoder->VideoCtx->flags |= AV_CODEC_FLAG_BITEXACT;
if (video_codec->capabilities & AV_CODEC_CAP_FRAME_THREADS || AV_CODEC_CAP_SLICE_THREADS) { if (video_codec->capabilities & AV_CODEC_CAP_FRAME_THREADS || AV_CODEC_CAP_SLICE_THREADS) {
Debug(3, "codec: supports frame threads"); Debug(3, "codec: supports frame threads");
decoder->VideoCtx->thread_count = 4; decoder->VideoCtx->thread_count = 4;
@ -502,6 +502,7 @@ extern int CuvidTestSurfaces();
extern int init_filters(AVCodecContext * dec_ctx, void *decoder, AVFrame * frame); extern int init_filters(AVCodecContext * dec_ctx, void *decoder, AVFrame * frame);
extern int push_filters(AVCodecContext * dec_ctx, void *decoder, AVFrame * frame); extern int push_filters(AVCodecContext * dec_ctx, void *decoder, AVFrame * frame);
#endif #endif
#ifdef VAAPI #ifdef VAAPI
void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt) void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt)
{ {
@ -511,47 +512,53 @@ void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt)
int ret; int ret;
AVPacket pkt[1]; AVPacket pkt[1];
AVFrame *frame; AVFrame *frame;
*pkt = *avpkt; // use copy *pkt = *avpkt; // use copy
ret = avcodec_send_packet(video_ctx, pkt); ret = avcodec_send_packet(video_ctx, pkt);
if (ret < 0) { if (ret < 0) {
Debug(4, "codec: sending video packet failed"); Debug(4, "codec: sending video packet failed");
return; return;
} }
if (!CuvidTestSurfaces()) if (!CuvidTestSurfaces())
usleep(1000); usleep(1000);
frame = av_frame_alloc(); ret = 0;
ret = avcodec_receive_frame(video_ctx, frame); while (ret >= 0) {
if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) { frame = av_frame_alloc();
Debug(4, "codec: receiving video frame failed"); ret = avcodec_receive_frame(video_ctx, frame);
av_frame_free(&frame);
return; if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
} Debug(4, "codec: receiving video frame failed");
if (ret >= 0) { av_frame_free(&frame);
if (decoder->filter) { return;
if (decoder->filter == 1) { }
if (init_filters(video_ctx, decoder->HwDecoder, frame) < 0) { if (ret >= 0) {
Debug(3, "video: Init of VAAPI deint Filter failed\n"); if (decoder->filter) {
decoder->filter = 0; if (decoder->filter == 1) {
} else { if (init_filters(video_ctx, decoder->HwDecoder, frame) < 0) {
Debug(3, "Init VAAPI deint ok\n"); Debug(3, "video: Init of VAAPI deint Filter failed\n");
decoder->filter = 2; decoder->filter = 0;
} else {
Debug(3, "Init VAAPI deint ok\n");
decoder->filter = 2;
}
}
if (frame->interlaced_frame && decoder->filter == 2 && (frame->height != 720)) { // broken ZDF sends Interlaced flag
push_filters(video_ctx, decoder->HwDecoder, frame);
continue;
} }
} }
if (frame->interlaced_frame && decoder->filter == 2 && (frame->height != 720)) { // broken ZDF sends Interlaced flag VideoRenderFrame(decoder->HwDecoder, video_ctx, frame);
ret = push_filters(video_ctx, decoder->HwDecoder, frame); } else {
return; av_frame_free(&frame);
} return;
} }
VideoRenderFrame(decoder->HwDecoder, video_ctx, frame); }
} else {
av_frame_free(&frame);
}
} }
} }
#endif #endif
#ifdef CUVID #ifdef CUVID
void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt) void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt)
@ -582,7 +589,7 @@ void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt)
if (!CuvidTestSurfaces()) if (!CuvidTestSurfaces())
usleep(1000); usleep(1000);
// printf("send packet to decode %s\n",consumed?"ok":"Full"); // printf("send packet to decode %s %04x\n",consumed?"ok":"Full",ret1);
if ((ret1 == AVERROR(EAGAIN) || ret1 == AVERROR_EOF || ret1 >= 0) && CuvidTestSurfaces()) { if ((ret1 == AVERROR(EAGAIN) || ret1 == AVERROR_EOF || ret1 >= 0) && CuvidTestSurfaces()) {
ret = 0; ret = 0;
@ -594,7 +601,7 @@ void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt)
} else { } else {
got_frame = 0; got_frame = 0;
} }
// printf("got %s packet from decoder\n",got_frame?"1":"no"); // printf("got %s packet from decoder\n",got_frame?"1":"no");
if (got_frame) { // frame completed if (got_frame) { // frame completed
#ifdef YADIF #ifdef YADIF
if (decoder->filter) { if (decoder->filter) {

15
drm.c
View File

@ -257,10 +257,15 @@ static int FindDevice(VideoRender * render)
continue; continue;
if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) { if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) {
render->connector_id = connector->connector_id; float aspect = (float)connector->mmWidth / (float)connector->mmHeight;
render->mmHeight = connector->mmHeight; if ((aspect > 1.70) && (aspect < 1.85)) {
render->mmWidth = connector->mmWidth; render->mmHeight = 90;
render->mmWidth = 160;
} else {
render->mmHeight = connector->mmHeight;
render->mmWidth = connector->mmWidth;
}
render->connector_id = connector->connector_id;
// FIXME: use default encoder/crtc pair // FIXME: use default encoder/crtc pair
if ((encoder = drmModeGetEncoder(render->fd_drm, connector->encoder_id)) == NULL){ if ((encoder = drmModeGetEncoder(render->fd_drm, connector->encoder_id)) == NULL){
fprintf(stderr, "FindDevice: cannot retrieve encoder (%d): %m\n", errno); fprintf(stderr, "FindDevice: cannot retrieve encoder (%d): %m\n", errno);
@ -467,7 +472,7 @@ static void drm_swap_buffers () {
uint32_t fb; uint32_t fb;
eglSwapBuffers (eglDisplay, eglSurface); eglSwapBuffers (eglDisplay, eglSurface);
struct gbm_bo *bo = gbm_surface_lock_front_buffer (gbm.surface); struct gbm_bo *bo = gbm_surface_lock_front_buffer (gbm.surface);
#if 1 #if 1
if (bo == NULL) if (bo == NULL)

15
video.c
View File

@ -1168,6 +1168,7 @@ static void EglInit(void)
// create egl context // create egl context
setenv("MESA_GL_VERSION_OVERRIDE","3.3",0); setenv("MESA_GL_VERSION_OVERRIDE","3.3",0);
setenv("V3D_DOUBLE_BUFFER","1",0);
make_egl(); make_egl();
if (!glewdone) { if (!glewdone) {
@ -1700,7 +1701,7 @@ static void CuvidReleaseSurface(CuvidDecoder * decoder, int surface)
#endif #endif
if (decoder->fds[surface*Planes]) { if (decoder->fds[surface*Planes]) {
close(decoder->fds[surface*Planes]); close(decoder->fds[surface*Planes]);
close(decoder->fds[surface*Planes+1]); // close(decoder->fds[surface*Planes+1]);
#ifdef RASPI #ifdef RASPI
close(decoder->fds[surface*Planes+2]); close(decoder->fds[surface*Planes+2]);
#endif #endif
@ -2550,10 +2551,9 @@ void generateVAAPIImage(CuvidDecoder * decoder, int index, const AVFrame * frame
EGLImageTargetTexture2DOES(GL_TEXTURE_2D, decoder->images[index * Planes + n]); EGLImageTargetTexture2DOES(GL_TEXTURE_2D, decoder->images[index * Planes + n]);
#ifdef RASPI #ifdef RASPI
decoder->fds[index*Planes+n] = fd; decoder->fds[index*Planes+n] = fd;
#else
decoder->fds[index*Planes+n] = desc.objects[desc.layers[n].object_index[0]].fd;
#endif #endif
} }
decoder->fds[index*Planes+n] = desc.objects[0].fd;
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
EglCheck(); EglCheck();
@ -3547,8 +3547,8 @@ static void CuvidMixVideo(CuvidDecoder * decoder, __attribute__((unused))
set_hdr_metadata(frame->color_primaries,frame->color_trc,sd1,sd2); set_hdr_metadata(frame->color_primaries,frame->color_trc,sd1,sd2);
#endif #endif
} }
// Render Progressive frame // Render Progressive frame
#ifndef PLACEBO #ifndef PLACEBO
y = VideoWindowHeight - decoder->OutputY - decoder->OutputHeight; y = VideoWindowHeight - decoder->OutputY - decoder->OutputHeight;
if (y < 0) if (y < 0)
@ -4077,8 +4077,8 @@ static void CuvidDisplayFrame(void)
glXSwapBuffers(XlibDisplay, VideoWindow); glXSwapBuffers(XlibDisplay, VideoWindow);
glXMakeCurrent(XlibDisplay, None, NULL); glXMakeCurrent(XlibDisplay, None, NULL);
#else #else
#ifndef USE_DRM #ifndef USE_DRM
eglSwapBuffers(eglDisplay, eglSurface); eglSwapBuffers(eglDisplay, eglSurface);
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
#else #else
drm_swap_buffers(); drm_swap_buffers();
@ -5255,6 +5255,7 @@ void exit_display()
} }
#endif #endif
Debug(3,"display thread exit\n"); Debug(3,"display thread exit\n");
} }
static void *VideoHandlerThread(void *dummy) static void *VideoHandlerThread(void *dummy)