Merge pull request #45 from dnehring7/master

Reindent all sources to common coding. Reworked aspect function.
This commit is contained in:
jojo61 2020-04-14 08:18:20 +00:00 committed by GitHub
commit 309ad1c90e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 1314 additions and 1214 deletions

View File

@ -1,6 +1,6 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: 2a41981a57e5e83036463c6a08c84b86ed9d2be3 $ # $Id: 2a41981a57e5e83036463c6a08c84b86ed9d2be3 $
# The official name of this plugin. # The official name of this plugin.
@ -11,7 +11,7 @@
### Configuration (edit this for your needs) ### Configuration (edit this for your needs)
# config as needed # config as needed
# what kind of decoder do we make - # what kind of decoder do we make -
# if VAAPI is enabled the pluginname is softhdvaapi # if VAAPI is enabled the pluginname is softhdvaapi
# if CUVID is enabled the pluginname is softhdcuvid # if CUVID is enabled the pluginname is softhdcuvid
# if DRM is enabled the pluginname is softhddrm # if DRM is enabled the pluginname is softhddrm
@ -19,12 +19,12 @@ VAAPI ?= 0
CUVID ?= 0 CUVID ?= 0
# if you enable DRM then the plugin will only run without X server # if you enable DRM then the plugin will only run without X server
# only valid for VAAPI # only valid for VAAPI
# does not work with libplacebo # does not work with libplacebo
DRM ?= 0 DRM ?= 0
# use libplacebo - available for both decoders but not for DRM # use libplacebo - available for both decoders but not for DRM
LIBPLACEBO ?= 1 LIBPLACEBO ?= 1
# use YADIF deint - only available with cuvid # use YADIF deint - only available with cuvid
@ -124,7 +124,7 @@ TMPDIR ?= /tmp
### The compiler options: ### The compiler options:
export CFLAGS = $(call PKGCFG,cflags) export CFLAGS = $(call PKGCFG,cflags)
export CXXFLAGS = $(call PKGCFG,cxxflags) export CXXFLAGS = $(call PKGCFG,cxxflags)
ifeq ($(CFLAGS),) ifeq ($(CFLAGS),)
@ -146,10 +146,10 @@ APIVERSION = $(call PKGCFG,apiversion)
### Parse config ### Parse config
ifeq ($(VAAPI),1) ifeq ($(VAAPI),1)
CONFIG += -DVAAPI CONFIG += -DVAAPI
#LIBPLACEBO=1 #LIBPLACEBO=1
PLUGIN = softhdvaapi PLUGIN = softhdvaapi
LIBS += -lEGL LIBS += -lEGL
endif endif
@ -159,13 +159,13 @@ CONFIG += -DUSE_DRM -DVAAPI
LIBPLACEBO=0 LIBPLACEBO=0
_CFLAGS += $(shell pkg-config --cflags libdrm) _CFLAGS += $(shell pkg-config --cflags libdrm)
LIBS += -lgbm -ldrm LIBS += -lgbm -ldrm
LIBS += -lEGL LIBS += -lEGL
endif endif
ifeq ($(CUVID),1) ifeq ($(CUVID),1)
CONFIG += -DUSE_PIP # PIP support CONFIG += -DUSE_PIP # PIP support
CONFIG += -DCUVID # enable CUVID decoder CONFIG += -DCUVID # enable CUVID decoder
LIBS += -lEGL -lGL LIBS += -lEGL -lGL
ifeq ($(YADIF),1) ifeq ($(YADIF),1)
CONFIG += -DYADIF # Yadif only with CUVID CONFIG += -DYADIF # Yadif only with CUVID
endif endif
@ -213,7 +213,7 @@ SOFILE = libvdr-$(PLUGIN).so
# #
# Test that libswresample is available # Test that libswresample is available
# #
#ifneq (exists, $(shell pkg-config libswresample && echo exists)) #ifneq (exists, $(shell pkg-config libswresample && echo exists))
# $(warning ******************************************************************) # $(warning ******************************************************************)
@ -222,7 +222,7 @@ SOFILE = libvdr-$(PLUGIN).so
#endif #endif
# #
# Test and set config for libavutil # Test and set config for libavutil
# #
ifneq (exists, $(shell pkg-config libavutil && echo exists)) ifneq (exists, $(shell pkg-config libavutil && echo exists))
$(warning ******************************************************************) $(warning ******************************************************************)
@ -233,7 +233,7 @@ _CFLAGS += $(shell pkg-config --cflags libavutil)
LIBS += $(shell pkg-config --libs libavutil) LIBS += $(shell pkg-config --libs libavutil)
# #
# Test and set config for libswscale # Test and set config for libswscale
# #
ifneq (exists, $(shell pkg-config libswscale && echo exists)) ifneq (exists, $(shell pkg-config libswscale && echo exists))
$(warning ******************************************************************) $(warning ******************************************************************)
@ -281,14 +281,14 @@ _CFLAGS += -I./opengl -I./
LIBS += -L/usr/lib64 LIBS += -L/usr/lib64
ifeq ($(LIBPLACEBO),1) ifeq ($(LIBPLACEBO),1)
LIBS += -lplacebo LIBS += -lplacebo
endif endif
ifeq ($(CUVID),1) ifeq ($(CUVID),1)
LIBS += -lcuda -lnvcuvid LIBS += -lcuda -lnvcuvid
endif endif
LIBS += -lGLEW -lGLU -ldl -lglut LIBS += -lGLEW -lGLU -ldl -lglut
### Includes and Defines (add further entries here): ### Includes and Defines (add further entries here):
INCLUDES += INCLUDES +=
@ -299,16 +299,16 @@ DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' -D_GNU_SOURCE $(CONFIG) \
### Make it standard ### Make it standard
override CXXFLAGS += $(_CFLAGS) $(DEFINES) $(INCLUDES) \ override CXXFLAGS += $(_CFLAGS) $(DEFINES) $(INCLUDES) \
-g -W -Wextra -Winit-self -Werror=overloaded-virtual -Wno-unused-parameter -g -W -Wextra -Winit-self -Werror=overloaded-virtual -Wno-unused-parameter
override CFLAGS += $(_CFLAGS) $(DEFINES) $(INCLUDES) \ override CFLAGS += $(_CFLAGS) $(DEFINES) $(INCLUDES) \
-g -W -Wextra -Winit-self -Wdeclaration-after-statement -g -W -Wextra -Winit-self -Wdeclaration-after-statement
### The object files (add further files here): ### The object files (add further files here):
OBJS = softhdcuvid.o softhddev.o video.o audio.o codec.o ringbuffer.o OBJS = softhdcuvid.o softhddev.o video.o audio.o codec.o ringbuffer.o
ifeq ($(OPENGLOSD),1) ifeq ($(OPENGLOSD),1)
OBJS += openglosd.o OBJS += openglosd.o
endif endif
SRCS = $(wildcard $(OBJS:.o=.c)) *.cpp SRCS = $(wildcard $(OBJS:.o=.c)) *.cpp
@ -385,9 +385,7 @@ HDRS= $(wildcard *.h)
indent: indent:
for i in $(SRCS) $(HDRS); do \ for i in $(SRCS) $(HDRS); do \
indent $$i; \ VERSION_CONTROL=none indent $$i; \
unexpand -a $$i | sed -e s/constconst/const/ > $$i.up; \
mv $$i.up $$i; \
done done
video_test: video.c Makefile video_test: video.c Makefile

View File

@ -50,7 +50,7 @@ Only via DisplayPort you can get 10 Bit output to a compatible screen. This is a
Current Status with VAAPI: Current Status with VAAPI:
I tested it with Intel VAAPI. If you have problmes with the shaders then copy the drirc file in your home directory as .drirc I tested it with Intel VAAPI. If you have problmes with the shaders then copy the drirc file in your home directory as .drirc
AMD VAAPI is broken by AMD and will not work currently. AMD VAAPI is broken by AMD and will not work currently.
You have to adapt the Makefile to your needs. I use FFMPEG 4.0 You have to adapt the Makefile to your needs. I use FFMPEG 4.0
The Makefile expects the CUDA SDK in /usr/local/cuda. Currently it is tested with CUDA 10 The Makefile expects the CUDA SDK in /usr/local/cuda. Currently it is tested with CUDA 10
@ -73,13 +73,13 @@ Quickstart:
You have to adapt the Makefile. There are 3 possible Version that you can build: You have to adapt the Makefile. There are 3 possible Version that you can build:
softhdcuvid softhdcuvid
This is for NVIDA cards and uses cuvid as decoder. It uses xcb for output and needs a X Server to run. This is for NVIDA cards and uses cuvid as decoder. It uses xcb for output and needs a X Server to run.
softhdvaapi softhdvaapi
This is for INTEL cards and uses Vaapi as decoder. It uses xcb for output and needs a X Server to run. This is for INTEL cards and uses Vaapi as decoder. It uses xcb for output and needs a X Server to run.
softhddrm softhddrm
This is for INTEL cards and also uses Vaapi as decoder. It uses the DRM API for output and This is for INTEL cards and also uses Vaapi as decoder. It uses the DRM API for output and
runs without X Server. There are several commandline options to select the resolution and refresh rate. runs without X Server. There are several commandline options to select the resolution and refresh rate.
Install: Install:
@ -98,27 +98,27 @@ Install:
Beginners Guide for libplacebo: Beginners Guide for libplacebo:
------------------------------- -------------------------------
When using libplacebo you will find several config options. When using libplacebo you will find several config options.
First of all you need to set the right scaler for each resolution: First of all you need to set the right scaler for each resolution:
Best you beginn with setting all to "bilinear". If that works ok for you, you can try to change them Best you beginn with setting all to "bilinear". If that works ok for you, you can try to change them
for more advanced scaler. I use ewa_robidouxsharp on my GTX1050, but your mileage may vary. for more advanced scaler. I use ewa_robidouxsharp on my GTX1050, but your mileage may vary.
Unfortunatly on INTEL not all scalers may work or crash. Unfortunatly on INTEL not all scalers may work or crash.
You can enable a Scaler Test feature. When enabled then the screen is split.On the left half you will You can enable a Scaler Test feature. When enabled then the screen is split.On the left half you will
see the scaler defined by Scaler Test and on the right side you will see the scaler defined at the see the scaler defined by Scaler Test and on the right side you will see the scaler defined at the
Resolution setting. There is as small black line between the halfs to remaind you that Scaler Test Resolution setting. There is as small black line between the halfs to remaind you that Scaler Test
is activ. is activ.
Then you should set the Monitor Colorspace to "sRGB". This guarantees you the best colors on your screen. Then you should set the Monitor Colorspace to "sRGB". This guarantees you the best colors on your screen.
At the moment all calculations internaly are done in RGB space and all cards output also RGB. At the moment all calculations internaly are done in RGB space and all cards output also RGB.
If you are colorblind you could try to remedy this with the Colorblind Settings. Realy only needed If you are colorblind you could try to remedy this with the Colorblind Settings. Realy only needed
in rare cases. in rare cases.
All other settings can be in their default state. All other settings can be in their default state.
Setup: environment Setup: environment
------ ------
@ -283,11 +283,13 @@ Setup: /etc/vdr/setup.conf
0 pan and scan 0 pan and scan
1 letter box 1 letter box
2 center cut-out 2 center cut-out
3 original
softhddevice.VideoOtherDisplayFormat = 1 softhddevice.VideoOtherDisplayFormat = 1
0 pan and scan 0 pan and scan
1 pillar box 1 pillar box
2 center cut-out 2 center cut-out
3 original
softhddevice.pip.X = 79 softhddevice.pip.X = 79
softhddevice.pip.Y = 78 softhddevice.pip.Y = 78
@ -378,6 +380,3 @@ Running:
Known Bugs: Known Bugs:
----------- -----------
SD Streams not working very well on vaapi SD Streams not working very well on vaapi

19
audio.c
View File

@ -146,7 +146,6 @@ static volatile char AudioRunning; ///< thread running / stopped
static volatile char AudioPaused; ///< audio paused static volatile char AudioPaused; ///< audio paused
static volatile char AudioVideoIsReady; ///< video ready start early static volatile char AudioVideoIsReady; ///< video ready start early
static int AudioSkip; ///< skip audio to sync to video static int AudioSkip; ///< skip audio to sync to video
int AudioDelay; /// delay audio to sync to video
static const int AudioBytesProSample = 2; ///< number of bytes per sample static const int AudioBytesProSample = 2; ///< number of bytes per sample
@ -2005,7 +2004,7 @@ static void *AudioPlayHandlerThread(void *dummy)
{ {
Debug(3, "audio: play thread started\n"); Debug(3, "audio: play thread started\n");
prctl(PR_SET_NAME, "cuvid audio", 0, 0, 0); prctl(PR_SET_NAME, "cuvid audio", 0, 0, 0);
for (;;) { for (;;) {
// check if we should stop the thread // check if we should stop the thread
if (AudioThreadStop) { if (AudioThreadStop) {
@ -2024,7 +2023,8 @@ static void *AudioPlayHandlerThread(void *dummy)
Debug(3, "audio: ----> %dms %d start\n", (AudioUsedBytes() * 1000) Debug(3, "audio: ----> %dms %d start\n", (AudioUsedBytes() * 1000)
/ (!AudioRing[AudioRingWrite].HwSampleRate + !AudioRing[AudioRingWrite].HwChannels + / (!AudioRing[AudioRingWrite].HwSampleRate + !AudioRing[AudioRingWrite].HwChannels +
AudioRing[AudioRingWrite].HwSampleRate * AudioRing[AudioRingWrite].HwChannels * AudioBytesProSample),AudioUsedBytes()); AudioRing[AudioRingWrite].HwSampleRate * AudioRing[AudioRingWrite].HwChannels * AudioBytesProSample),
AudioUsedBytes());
do { do {
int filled; int filled;
@ -2252,7 +2252,7 @@ void AudioEnqueue(const void *samples, int count)
AudioNormalizer(buffer, count); AudioNormalizer(buffer, count);
} }
} }
n = RingBufferWrite(AudioRing[AudioRingWrite].RingBuffer, buffer, count); n = RingBufferWrite(AudioRing[AudioRingWrite].RingBuffer, buffer, count);
if (n != (size_t)count) { if (n != (size_t)count) {
Error(_("audio: can't place %d samples in ring buffer\n"), count); Error(_("audio: can't place %d samples in ring buffer\n"), count);
@ -2291,7 +2291,7 @@ void AudioEnqueue(const void *samples, int count)
// no lock needed, can wakeup next time // no lock needed, can wakeup next time
AudioRunning = 1; AudioRunning = 1;
pthread_cond_signal(&AudioStartCond); pthread_cond_signal(&AudioStartCond);
Debug(3, "Start on AudioEnque Threshold %d n %d\n",AudioStartThreshold,n); Debug(3, "Start on AudioEnque Threshold %d n %d\n", AudioStartThreshold, n);
} }
} }
// Update audio clock (stupid gcc developers thinks INT64_C is unsigned) // Update audio clock (stupid gcc developers thinks INT64_C is unsigned)
@ -2325,7 +2325,7 @@ void AudioVideoReady(int64_t pts)
// Audio.PTS = next written sample time stamp // Audio.PTS = next written sample time stamp
used = RingBufferUsedBytes(AudioRing[AudioRingWrite].RingBuffer); used = RingBufferUsedBytes(AudioRing[AudioRingWrite].RingBuffer);
audio_pts = audio_pts =
AudioRing[AudioRingWrite].PTS - AudioRing[AudioRingWrite].PTS -
(used * 90 * 1000) / (AudioRing[AudioRingWrite].HwSampleRate * AudioRing[AudioRingWrite].HwChannels * (used * 90 * 1000) / (AudioRing[AudioRingWrite].HwSampleRate * AudioRing[AudioRingWrite].HwChannels *
AudioBytesProSample); AudioBytesProSample);
@ -2337,11 +2337,12 @@ void AudioVideoReady(int64_t pts)
if (!AudioRunning) { if (!AudioRunning) {
int skip; int skip;
// buffer ~15 video frames // buffer ~15 video frames
// FIXME: HDTV can use smaller video buffer // FIXME: HDTV can use smaller video buffer
skip = pts - 0 * 20 * 90 - AudioBufferTime * 90 - audio_pts + VideoAudioDelay; skip = pts - 0 * 20 * 90 - AudioBufferTime * 90 - audio_pts + VideoAudioDelay;
#ifdef DEBUG #ifdef DEBUG
// fprintf(stderr, "a/v-diff %dms a/v-delay %dms skip %dms Audiobuffer %d\n", (int)(pts - audio_pts) / 90, VideoAudioDelay / 90, skip / 90,AudioBufferTime); // fprintf(stderr, "a/v-diff %dms a/v-delay %dms skip %dms Audiobuffer %d\n", (int)(pts - audio_pts) / 90, VideoAudioDelay / 90, skip / 90,AudioBufferTime);
#endif #endif
// guard against old PTS // guard against old PTS
if (skip > 0 && skip < 4000 * 90) { if (skip > 0 && skip < 4000 * 90) {
@ -2479,7 +2480,7 @@ int64_t AudioGetDelay(void)
pts += ((int64_t) RingBufferUsedBytes(AudioRing[AudioRingRead].RingBuffer) pts += ((int64_t) RingBufferUsedBytes(AudioRing[AudioRingRead].RingBuffer)
* 90 * 1000) / (AudioRing[AudioRingRead].HwSampleRate * AudioRing[AudioRingRead].HwChannels * * 90 * 1000) / (AudioRing[AudioRingRead].HwSampleRate * AudioRing[AudioRingRead].HwChannels *
AudioBytesProSample); AudioBytesProSample);
Debug(4,"audio: hw+sw delay %zd %" PRId64 "ms\n", RingBufferUsedBytes(AudioRing[AudioRingRead].RingBuffer), Debug(4, "audio: hw+sw delay %zd %" PRId64 "ms\n", RingBufferUsedBytes(AudioRing[AudioRingRead].RingBuffer),
pts / 90); pts / 90);
return pts; return pts;
@ -2496,7 +2497,7 @@ void AudioSetClock(int64_t pts)
Debug(4, "audio: set clock %s -> %s pts\n", Timestamp2String(AudioRing[AudioRingWrite].PTS), Debug(4, "audio: set clock %s -> %s pts\n", Timestamp2String(AudioRing[AudioRingWrite].PTS),
Timestamp2String(pts)); Timestamp2String(pts));
} }
// printf("Audiosetclock pts %#012" PRIx64 " %d\n",pts,RingBufferUsedBytes(AudioRing[AudioRingWrite].RingBuffer)); // printf("Audiosetclock pts %#012" PRIx64 " %d\n",pts,RingBufferUsedBytes(AudioRing[AudioRingWrite].RingBuffer));
AudioRing[AudioRingWrite].PTS = pts; AudioRing[AudioRingWrite].PTS = pts;
} }

56
codec.c
View File

@ -96,6 +96,7 @@ static pthread_mutex_t CodecLockMutex;
/// Flag prefer fast channel switch /// Flag prefer fast channel switch
char CodecUsePossibleDefectFrames; char CodecUsePossibleDefectFrames;
AVBufferRef *hw_device_ctx; AVBufferRef *hw_device_ctx;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Video // Video
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -255,18 +256,18 @@ 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) {
@ -281,15 +282,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
@ -310,7 +311,7 @@ void CodecVideoOpen(VideoDecoder * decoder, int codec_id)
if (video_codec->capabilities & (AV_CODEC_CAP_AUTO_THREADS)) { if (video_codec->capabilities & (AV_CODEC_CAP_AUTO_THREADS)) {
Debug(3, "codec: auto threads enabled"); Debug(3, "codec: auto threads enabled");
// decoder->VideoCtx->thread_count = 0; // decoder->VideoCtx->thread_count = 0;
} }
if (video_codec->capabilities & AV_CODEC_CAP_TRUNCATED) { if (video_codec->capabilities & AV_CODEC_CAP_TRUNCATED) {
Debug(3, "codec: supports truncated packets"); Debug(3, "codec: supports truncated packets");
@ -333,9 +334,9 @@ 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;
@ -508,18 +509,18 @@ 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) {
return; return;
} }
if (!CuvidTestSurfaces()) if (!CuvidTestSurfaces())
usleep(1000); usleep(1000);
ret = 0; ret = 0;
while (ret >= 0 && CuvidTestSurfaces()) { while (ret >= 0 && CuvidTestSurfaces()) {
frame = av_frame_alloc(); frame = av_frame_alloc();
ret = avcodec_receive_frame(video_ctx, frame); ret = avcodec_receive_frame(video_ctx, frame);
@ -549,7 +550,7 @@ void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt)
av_frame_free(&frame); av_frame_free(&frame);
return; return;
} }
} }
} }
} }
#endif #endif
@ -596,9 +597,9 @@ 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
// printf("video frame pts %#012" PRIx64 " %dms\n",frame->pts,(int)(apts - frame->pts) / 90); // printf("video frame pts %#012" PRIx64 " %dms\n",frame->pts,(int)(apts - frame->pts) / 90);
#ifdef YADIF #ifdef YADIF
if (decoder->filter) { if (decoder->filter) {
if (decoder->filter == 1) { if (decoder->filter == 1) {
@ -647,7 +648,7 @@ void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt)
void CodecVideoFlushBuffers(VideoDecoder * decoder) void CodecVideoFlushBuffers(VideoDecoder * decoder)
{ {
if (decoder->VideoCtx) { if (decoder->VideoCtx) {
avcodec_flush_buffers(decoder->VideoCtx); avcodec_flush_buffers(decoder->VideoCtx);
} }
} }
@ -819,7 +820,7 @@ void CodecAudioOpen(AudioDecoder * audio_decoder, int codec_id)
void CodecAudioClose(AudioDecoder * audio_decoder) void CodecAudioClose(AudioDecoder * audio_decoder)
{ {
// FIXME: output any buffered data // FIXME: output any buffered data
#ifdef USE_SWRESAMPLE #ifdef USE_SWRESAMPLE
if (audio_decoder->Resample) { if (audio_decoder->Resample) {
swr_free(&audio_decoder->Resample); swr_free(&audio_decoder->Resample);
@ -1111,8 +1112,6 @@ static int CodecAudioPassthroughHelper(AudioDecoder * audio_decoder, const AVPac
return 0; return 0;
} }
#if defined(USE_SWRESAMPLE) || defined(USE_AVRESAMPLE) #if defined(USE_SWRESAMPLE) || defined(USE_AVRESAMPLE)
/** /**
@ -1346,6 +1345,7 @@ void CodecAudioDecode(AudioDecoder * audio_decoder, const AVPacket * avpkt)
if (audio_decoder->Resample) { if (audio_decoder->Resample) {
uint8_t outbuf[8192 * 2 * 8]; uint8_t outbuf[8192 * 2 * 8];
uint8_t *out[1]; uint8_t *out[1];
out[0] = outbuf; out[0] = outbuf;
ret = ret =
swr_convert(audio_decoder->Resample, out, sizeof(outbuf) / (2 * audio_decoder->HwChannels), swr_convert(audio_decoder->Resample, out, sizeof(outbuf) / (2 * audio_decoder->HwChannels),

109
drm.c
View File

@ -18,13 +18,13 @@ struct _Drm_Render_
int fd_drm; int fd_drm;
drmModeModeInfo mode; drmModeModeInfo mode;
drmModeCrtc *saved_crtc; drmModeCrtc *saved_crtc;
// drmEventContext ev; // drmEventContext ev;
int bpp; int bpp;
uint32_t connector_id, crtc_id, video_plane; uint32_t connector_id, crtc_id, video_plane;
uint32_t hdr_metadata; uint32_t hdr_metadata;
uint32_t mmWidth,mmHeight; // Size in mm uint32_t mmWidth,mmHeight; // Size in mm
uint32_t hdr_blob_id; uint32_t hdr_blob_id;
}; };
typedef struct _Drm_Render_ VideoRender; typedef struct _Drm_Render_ VideoRender;
@ -193,12 +193,12 @@ void set_video_mode(int width, int height)
return; return;
connector = drmModeGetConnector(render->fd_drm, render->connector_id); connector = drmModeGetConnector(render->fd_drm, render->connector_id);
for (ii = 0; ii < connector->count_modes; ii++) { for (ii = 0; ii < connector->count_modes; ii++) {
mode = &connector->modes[ii]; mode = &connector->modes[ii];
printf("Mode %d %dx%d Rate %d\n",ii,mode->hdisplay,mode->vdisplay,mode->vrefresh); printf("Mode %d %dx%d Rate %d\n",ii,mode->hdisplay,mode->vdisplay,mode->vrefresh);
if (width == mode->hdisplay && if (width == mode->hdisplay &&
height == mode->vdisplay && height == mode->vdisplay &&
mode->vrefresh == DRMRefresh && mode->vrefresh == DRMRefresh &&
render->mode.hdisplay != width && render->mode.hdisplay != width &&
render->mode.vdisplay != height && render->mode.vdisplay != height &&
!(mode->flags & DRM_MODE_FLAG_INTERLACE)) { !(mode->flags & DRM_MODE_FLAG_INTERLACE)) {
memcpy(&render->mode, mode, sizeof(drmModeModeInfo)); memcpy(&render->mode, mode, sizeof(drmModeModeInfo));
@ -211,7 +211,7 @@ void set_video_mode(int width, int height)
CuvidSetVideoMode(); CuvidSetVideoMode();
Debug(3,"Set new mode %d:%d\n",mode->hdisplay,mode->vdisplay); Debug(3,"Set new mode %d:%d\n",mode->hdisplay,mode->vdisplay);
break; break;
} }
} }
} }
@ -241,10 +241,10 @@ static int FindDevice(VideoRender * render)
return -errno; return -errno;
} }
drmSetMaster(render->fd_drm); drmSetMaster(render->fd_drm);
version = drmGetVersion(render->fd_drm); version = drmGetVersion(render->fd_drm);
fprintf(stderr, "FindDevice: open /dev/dri/card0: %s\n", version->name); fprintf(stderr, "FindDevice: open /dev/dri/card0: %s\n", version->name);
// check capability // check capability
if (drmGetCap(render->fd_drm, DRM_CAP_DUMB_BUFFER, &has_dumb) < 0 || has_dumb == 0) if (drmGetCap(render->fd_drm, DRM_CAP_DUMB_BUFFER, &has_dumb) < 0 || has_dumb == 0)
fprintf(stderr, "FindDevice: drmGetCap DRM_CAP_DUMB_BUFFER failed or doesn't have dumb buffer\n"); fprintf(stderr, "FindDevice: drmGetCap DRM_CAP_DUMB_BUFFER failed or doesn't have dumb buffer\n");
@ -263,7 +263,7 @@ static int FindDevice(VideoRender * render)
if (drmGetCap(render->fd_drm, DRM_PRIME_CAP_IMPORT, &has_prime) < 0) if (drmGetCap(render->fd_drm, DRM_PRIME_CAP_IMPORT, &has_prime) < 0)
fprintf(stderr, "FindDevice: DRM_PRIME_CAP_IMPORT not available.\n"); fprintf(stderr, "FindDevice: DRM_PRIME_CAP_IMPORT not available.\n");
if ((resources = drmModeGetResources(render->fd_drm)) == NULL){ if ((resources = drmModeGetResources(render->fd_drm)) == NULL){
fprintf(stderr, "FindDevice: cannot retrieve DRM resources (%d): %m\n", errno); fprintf(stderr, "FindDevice: cannot retrieve DRM resources (%d): %m\n", errno);
return -errno; return -errno;
@ -282,18 +282,18 @@ static int FindDevice(VideoRender * render)
fprintf(stderr, "FindDevice: cannot retrieve DRM connector (%d): %m\n", errno); fprintf(stderr, "FindDevice: cannot retrieve DRM connector (%d): %m\n", errno);
return -errno; return -errno;
} }
sprintf(connectorstr,"%s-%u",util_lookup_connector_type_name(connector->connector_type),connector->connector_type_id); sprintf(connectorstr,"%s-%u",util_lookup_connector_type_name(connector->connector_type),connector->connector_type_id);
printf("Connector >%s< is %sconnected\n",connectorstr,connector->connection == DRM_MODE_CONNECTED?"":"not "); printf("Connector >%s< is %sconnected\n",connectorstr,connector->connection == DRM_MODE_CONNECTED?"":"not ");
if (DRMConnector && strcmp(DRMConnector,connectorstr)) if (DRMConnector && strcmp(DRMConnector,connectorstr))
continue; continue;
if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) { if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) {
float aspect = (float)connector->mmWidth / (float)connector->mmHeight; float aspect = (float)connector->mmWidth / (float)connector->mmHeight;
if ((aspect > 1.70) && (aspect < 1.85)) { if ((aspect > 1.70) && (aspect < 1.85)) {
render->mmHeight = 90; render->mmHeight = 90;
render->mmWidth = 160; render->mmWidth = 160;
} else { } else {
render->mmHeight = connector->mmHeight; render->mmHeight = connector->mmHeight;
render->mmWidth = connector->mmWidth; render->mmWidth = connector->mmWidth;
} }
@ -304,27 +304,27 @@ static int FindDevice(VideoRender * render)
return -errno; return -errno;
} }
render->crtc_id = encoder->crtc_id; render->crtc_id = encoder->crtc_id;
render->hdr_metadata = GetPropertyID(render->fd_drm, connector->connector_id, render->hdr_metadata = GetPropertyID(render->fd_drm, connector->connector_id,
DRM_MODE_OBJECT_CONNECTOR, "HDR_OUTPUT_METADATA"); DRM_MODE_OBJECT_CONNECTOR, "HDR_OUTPUT_METADATA");
printf("ID %d of METADATA in Connector %d connected %d\n",render->hdr_metadata,connector->connector_id,connector->connection); printf("ID %d of METADATA in Connector %d connected %d\n",render->hdr_metadata,connector->connector_id,connector->connection);
memcpy(&render->mode, &connector->modes[0], sizeof(drmModeModeInfo)); // set fallback memcpy(&render->mode, &connector->modes[0], sizeof(drmModeModeInfo)); // set fallback
// search Modes for Connector // search Modes for Connector
for (ii = 0; ii < connector->count_modes; ii++) { for (ii = 0; ii < connector->count_modes; ii++) {
mode = &connector->modes[ii]; mode = &connector->modes[ii];
printf("Mode %d %dx%d Rate %d\n",ii,mode->hdisplay,mode->vdisplay,mode->vrefresh); printf("Mode %d %dx%d Rate %d\n",ii,mode->hdisplay,mode->vdisplay,mode->vrefresh);
if (VideoWindowWidth && VideoWindowHeight) { // preset by command line if (VideoWindowWidth && VideoWindowHeight) { // preset by command line
if (VideoWindowWidth == mode->hdisplay && if (VideoWindowWidth == mode->hdisplay &&
VideoWindowHeight == mode->vdisplay && VideoWindowHeight == mode->vdisplay &&
mode->vrefresh == DRMRefresh && mode->vrefresh == DRMRefresh &&
!(mode->flags & DRM_MODE_FLAG_INTERLACE)) { !(mode->flags & DRM_MODE_FLAG_INTERLACE)) {
memcpy(&render->mode, mode, sizeof(drmModeModeInfo)); memcpy(&render->mode, mode, sizeof(drmModeModeInfo));
break; break;
} }
} }
else { else {
if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) { if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) {
memcpy(&render->mode, mode, sizeof(drmModeModeInfo)); memcpy(&render->mode, mode, sizeof(drmModeModeInfo));
@ -335,7 +335,7 @@ static int FindDevice(VideoRender * render)
} }
} }
found = 1; found = 1;
i = resources->count_connectors; // uuuuhh i = resources->count_connectors; // uuuuhh
} }
VideoWindowWidth = render->mode.hdisplay; VideoWindowWidth = render->mode.hdisplay;
VideoWindowHeight = render->mode.vdisplay; VideoWindowHeight = render->mode.vdisplay;
@ -348,7 +348,7 @@ static int FindDevice(VideoRender * render)
printf("Requested Connector not found or not connected\n"); printf("Requested Connector not found or not connected\n");
return -1; return -1;
} }
// find first plane // find first plane
if ((plane_res = drmModeGetPlaneResources(render->fd_drm)) == NULL) if ((plane_res = drmModeGetPlaneResources(render->fd_drm)) == NULL)
fprintf(stderr, "FindDevice: cannot retrieve PlaneResources (%d): %m\n", errno); fprintf(stderr, "FindDevice: cannot retrieve PlaneResources (%d): %m\n", errno);
@ -366,7 +366,7 @@ static int FindDevice(VideoRender * render)
uint64_t type = GetPropertyValue(render->fd_drm, plane_res->planes[j], uint64_t type = GetPropertyValue(render->fd_drm, plane_res->planes[j],
DRM_MODE_OBJECT_PLANE, "type"); DRM_MODE_OBJECT_PLANE, "type");
uint64_t zpos = 0; uint64_t zpos = 0;
#ifdef DRM_DEBUG // If more then 2 crtcs this must rewriten!!! #ifdef DRM_DEBUG // If more then 2 crtcs this must rewriten!!!
printf("[FindDevice] Plane id %i crtc_id %i possible_crtcs %i possible CRTC %i type %s\n", printf("[FindDevice] Plane id %i crtc_id %i possible_crtcs %i possible CRTC %i type %s\n",
@ -384,7 +384,7 @@ static int FindDevice(VideoRender * render)
case DRM_FORMAT_ARGB8888: case DRM_FORMAT_ARGB8888:
#else #else
case DRM_FORMAT_XRGB2101010: case DRM_FORMAT_XRGB2101010:
#endif #endif
if (!render->video_plane) { if (!render->video_plane) {
render->video_plane = plane->plane_id; render->video_plane = plane->plane_id;
} }
@ -419,25 +419,25 @@ static int FindDevice(VideoRender * render)
void VideoInitDrm() void VideoInitDrm()
{ {
int i; int i;
if (!(render = calloc(1, sizeof(*render)))) { if (!(render = calloc(1, sizeof(*render)))) {
Fatal(_("video/DRM: out of memory\n")); Fatal(_("video/DRM: out of memory\n"));
return; return;
} }
if (FindDevice(render)){ if (FindDevice(render)){
Fatal(_( "VideoInit: FindDevice() failed\n")); Fatal(_( "VideoInit: FindDevice() failed\n"));
} }
gbm.dev = gbm_create_device (render->fd_drm); gbm.dev = gbm_create_device (render->fd_drm);
assert (gbm.dev != NULL); assert (gbm.dev != NULL);
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL; PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
get_platform_display = get_platform_display =
(void *) eglGetProcAddress("eglGetPlatformDisplay"); (void *) eglGetProcAddress("eglGetPlatformDisplay");
assert(get_platform_display != NULL); assert(get_platform_display != NULL);
eglDisplay = get_platform_display(EGL_PLATFORM_GBM_KHR, gbm.dev, NULL); eglDisplay = get_platform_display(EGL_PLATFORM_GBM_KHR, gbm.dev, NULL);
assert (eglDisplay != NULL); assert (eglDisplay != NULL);
@ -462,22 +462,21 @@ void VideoInitDrm()
DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", render->crtc_id); DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", render->crtc_id);
SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id, SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
DRM_MODE_OBJECT_CRTC, "ACTIVE", 1); DRM_MODE_OBJECT_CRTC, "ACTIVE", 1);
if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0) if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0)
fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno); fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno);
if (drmModeDestroyPropertyBlob(render->fd_drm, modeID) != 0) if (drmModeDestroyPropertyBlob(render->fd_drm, modeID) != 0)
fprintf(stderr, "cannot destroy property blob (%d): %m\n", errno); fprintf(stderr, "cannot destroy property blob (%d): %m\n", errno);
drmModeAtomicFree(ModeReq); drmModeAtomicFree(ModeReq);
} }
void get_drm_aspect(int *num,int *den) void get_drm_aspect(int *num,int *den)
{ {
Debug(3,"mmHeight %d mmWidth %d VideoHeight %d VideoWidth %d\n",render->mmHeight,render->mmWidth,VideoWindowHeight,VideoWindowWidth); *num = VideoWindowWidth;
*num = VideoWindowWidth * render->mmHeight; *den = VideoWindowHeight;
*den = VideoWindowHeight * render->mmWidth;
} }
struct gbm_bo *bo = NULL, *next_bo=NULL; struct gbm_bo *bo = NULL, *next_bo=NULL;
@ -488,8 +487,8 @@ static int old_color=-1,old_trc=-1;
void InitBo(int bpp) { void InitBo(int bpp) {
// create the GBM and EGL surface // create the GBM and EGL surface
render->bpp = bpp; render->bpp = bpp;
gbm.surface = gbm_surface_create (gbm.dev, VideoWindowWidth,VideoWindowHeight, gbm.surface = gbm_surface_create (gbm.dev, VideoWindowWidth,VideoWindowHeight,
bpp==10?GBM_FORMAT_XRGB2101010:GBM_FORMAT_ARGB8888, bpp==10?GBM_FORMAT_XRGB2101010:GBM_FORMAT_ARGB8888,
GBM_BO_USE_SCANOUT|GBM_BO_USE_RENDERING); GBM_BO_USE_SCANOUT|GBM_BO_USE_RENDERING);
assert(gbm.surface != NULL); assert(gbm.surface != NULL);
eglSurface = eglCreateWindowSurface (eglDisplay, eglConfig, gbm.surface, NULL); eglSurface = eglCreateWindowSurface (eglDisplay, eglConfig, gbm.surface, NULL);
@ -501,10 +500,10 @@ static struct gbm_bo *previous_bo = NULL;
static uint32_t previous_fb; static uint32_t previous_fb;
static void drm_swap_buffers () { 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)
@ -517,7 +516,7 @@ static void drm_swap_buffers () {
drmModeAddFB (render->fd_drm, VideoWindowWidth,VideoWindowHeight,render->bpp==10? 30:24, 32, pitch, handle, &fb); drmModeAddFB (render->fd_drm, VideoWindowWidth,VideoWindowHeight,render->bpp==10? 30:24, 32, pitch, handle, &fb);
// drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode); // drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode);
if (m_need_modeset) { if (m_need_modeset) {
drmModeAtomicReqPtr ModeReq; drmModeAtomicReqPtr ModeReq;
const uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET; const uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
@ -531,14 +530,14 @@ static void drm_swap_buffers () {
fprintf(stderr, "cannot allocate atomic request (%d): %m\n", errno); fprintf(stderr, "cannot allocate atomic request (%d): %m\n", errno);
return; return;
} }
// Need to disable the CRTC in order to submit the HDR data.... // Need to disable the CRTC in order to submit the HDR data....
SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id, SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
DRM_MODE_OBJECT_CRTC, "ACTIVE", 0); DRM_MODE_OBJECT_CRTC, "ACTIVE", 0);
if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0) if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0)
fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno); fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno);
sleep(2); sleep(2);
SetPropertyRequest(ModeReq, render->fd_drm, render->connector_id, SetPropertyRequest(ModeReq, render->fd_drm, render->connector_id,
DRM_MODE_OBJECT_CONNECTOR, "Colorspace",old_color==AVCOL_PRI_BT2020?9:2 ); DRM_MODE_OBJECT_CONNECTOR, "Colorspace",old_color==AVCOL_PRI_BT2020?9:2 );
SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id, SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
@ -547,7 +546,7 @@ static void drm_swap_buffers () {
DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", render->crtc_id); DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", render->crtc_id);
SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id, SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
DRM_MODE_OBJECT_CRTC, "ACTIVE", 1); DRM_MODE_OBJECT_CRTC, "ACTIVE", 1);
if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0) if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0)
fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno); fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno);
@ -558,7 +557,7 @@ static void drm_swap_buffers () {
m_need_modeset = 0; m_need_modeset = 0;
} }
drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode); drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode);
if (previous_bo) { if (previous_bo) {
drmModeRmFB (render->fd_drm, previous_fb); drmModeRmFB (render->fd_drm, previous_fb);
gbm_surface_release_buffer (gbm.surface, previous_bo); gbm_surface_release_buffer (gbm.surface, previous_bo);
@ -579,15 +578,15 @@ static void drm_clean_up () {
drmModeRmFB (render->fd_drm, previous_fb); drmModeRmFB (render->fd_drm, previous_fb);
gbm_surface_release_buffer (gbm.surface, previous_bo); gbm_surface_release_buffer (gbm.surface, previous_bo);
} }
drmModeSetCrtc (render->fd_drm, render->saved_crtc->crtc_id, render->saved_crtc->buffer_id, drmModeSetCrtc (render->fd_drm, render->saved_crtc->crtc_id, render->saved_crtc->buffer_id,
render->saved_crtc->x, render->saved_crtc->y, &render->connector_id, 1, &render->saved_crtc->mode); render->saved_crtc->x, render->saved_crtc->y, &render->connector_id, 1, &render->saved_crtc->mode);
drmModeFreeCrtc (render->saved_crtc); drmModeFreeCrtc (render->saved_crtc);
if (render->hdr_blob_id) if (render->hdr_blob_id)
drmModeDestroyPropertyBlob(render->fd_drm, render->hdr_blob_id); drmModeDestroyPropertyBlob(render->fd_drm, render->hdr_blob_id);
render->hdr_blob_id = 0; render->hdr_blob_id = 0;
eglDestroySurface (eglDisplay, eglSurface); eglDestroySurface (eglDisplay, eglSurface);
EglCheck(); EglCheck();
gbm_surface_destroy (gbm.surface); gbm_surface_destroy (gbm.surface);
@ -597,9 +596,9 @@ static void drm_clean_up () {
EglCheck(); EglCheck();
eglSharedContext = NULL; eglSharedContext = NULL;
eglTerminate (eglDisplay); eglTerminate (eglDisplay);
EglCheck(); EglCheck();
gbm_device_destroy (gbm.dev); gbm_device_destroy (gbm.dev);
drmDropMaster(render->fd_drm); drmDropMaster(render->fd_drm);
close (render->fd_drm); close (render->fd_drm);

41
hdr.c
View File

@ -334,11 +334,11 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid
int max_lum=4000,min_lum=0050; int max_lum=4000,min_lum=0050;
struct AVMasteringDisplayMetadata *md = NULL; struct AVMasteringDisplayMetadata *md = NULL;
struct AVContentLightMetadata *ld = NULL; struct AVContentLightMetadata *ld = NULL;
if (render->hdr_metadata == -1) { // Metadata not supported if (render->hdr_metadata == -1) { // Metadata not supported
return; return;
} }
// clean up FFMEPG stuff // clean up FFMEPG stuff
if (trc == AVCOL_TRC_BT2020_10) if (trc == AVCOL_TRC_BT2020_10)
trc = AVCOL_TRC_ARIB_STD_B67; trc = AVCOL_TRC_ARIB_STD_B67;
@ -346,16 +346,16 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid
trc = AVCOL_TRC_BT709; trc = AVCOL_TRC_BT709;
if (color == AVCOL_PRI_UNSPECIFIED) if (color == AVCOL_PRI_UNSPECIFIED)
color = AVCOL_PRI_BT709; color = AVCOL_PRI_BT709;
if ((old_color == color && old_trc == trc && !sd1 && !sd2) || !render->hdr_metadata) if ((old_color == color && old_trc == trc && !sd1 && !sd2) || !render->hdr_metadata)
return; // nothing to do return; // nothing to do
if (sd1) if (sd1)
md = sd1->data; md = sd1->data;
if (sd2) if (sd2)
ld = sd2->data; ld = sd2->data;
if (md && !memcmp(md,&md_save,sizeof(md_save))) if (md && !memcmp(md,&md_save,sizeof(md_save)))
if (ld && !memcmp(ld,&ld_save,sizeof(ld_save))) { if (ld && !memcmp(ld,&ld_save,sizeof(ld_save))) {
return; return;
@ -363,23 +363,23 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid
else if (ld && !memcmp(ld,&ld_save,sizeof(ld_save))) { else if (ld && !memcmp(ld,&ld_save,sizeof(ld_save))) {
return; return;
} }
if (ld) if (ld)
memcpy(&ld_save,ld,sizeof(ld_save)); memcpy(&ld_save,ld,sizeof(ld_save));
if (md) if (md)
memcpy(&md_save,md,sizeof(md_save)); memcpy(&md_save,md,sizeof(md_save));
Debug(3,"Update HDR to TRC %d color %d\n",trc,color); Debug(3,"Update HDR to TRC %d color %d\n",trc,color);
if (trc == AVCOL_TRC_BT2020_10) if (trc == AVCOL_TRC_BT2020_10)
trc = AVCOL_TRC_ARIB_STD_B67; trc = AVCOL_TRC_ARIB_STD_B67;
old_color = color; old_color = color;
old_trc = trc; old_trc = trc;
if (render->hdr_blob_id) if (render->hdr_blob_id)
drmModeDestroyPropertyBlob(render->fd_drm, render->hdr_blob_id); drmModeDestroyPropertyBlob(render->fd_drm, render->hdr_blob_id);
switch(trc) { switch(trc) {
case AVCOL_TRC_BT709: // 1 case AVCOL_TRC_BT709: // 1
case AVCOL_TRC_UNSPECIFIED: // 2 case AVCOL_TRC_UNSPECIFIED: // 2
@ -387,7 +387,7 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid
break; break;
case AVCOL_TRC_BT2020_10: // 14 case AVCOL_TRC_BT2020_10: // 14
case AVCOL_TRC_BT2020_12: case AVCOL_TRC_BT2020_12:
case AVCOL_TRC_ARIB_STD_B67: // 18 HLG case AVCOL_TRC_ARIB_STD_B67: // 18 HLG
eotf = EOTF_HLG; eotf = EOTF_HLG;
break; break;
case AVCOL_TRC_SMPTE2084: // 16 case AVCOL_TRC_SMPTE2084: // 16
@ -397,7 +397,7 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid
eotf = EOTF_TRADITIONAL_GAMMA_SDR; eotf = EOTF_TRADITIONAL_GAMMA_SDR;
break; break;
} }
switch (color) { switch (color) {
case AVCOL_PRI_BT709: // 1 case AVCOL_PRI_BT709: // 1
case AVCOL_PRI_UNSPECIFIED: // 2 case AVCOL_PRI_UNSPECIFIED: // 2
@ -413,7 +413,7 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid
cs = weston_colorspace_lookup("BT.709"); cs = weston_colorspace_lookup("BT.709");
break; break;
} }
if (md) { // we got Metadata if (md) { // we got Metadata
if (md->has_primaries) { if (md->has_primaries) {
Debug(3,"Mastering Display Metadata,\n has_primaries:%d has_luminance:%d \n" Debug(3,"Mastering Display Metadata,\n has_primaries:%d has_luminance:%d \n"
@ -465,9 +465,9 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid
MaxCLL, // Maximum Content Light Level (MaxCLL) MaxCLL, // Maximum Content Light Level (MaxCLL)
MaxFALL, // Maximum Frame-Average Light Level (MaxFALL) MaxFALL, // Maximum Frame-Average Light Level (MaxFALL)
eotf); eotf);
ret = drmModeCreatePropertyBlob(render->fd_drm, &data, sizeof(data), &render->hdr_blob_id); ret = drmModeCreatePropertyBlob(render->fd_drm, &data, sizeof(data), &render->hdr_blob_id);
if (ret) { if (ret) {
printf("DRM: HDR metadata: failed blob create \n"); printf("DRM: HDR metadata: failed blob create \n");
@ -479,15 +479,14 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid
render->hdr_metadata, render->hdr_blob_id); render->hdr_metadata, render->hdr_blob_id);
if (ret) { if (ret) {
printf("DRM: HDR metadata: failed property set %d\n",ret); printf("DRM: HDR metadata: failed property set %d\n",ret);
if (render->hdr_blob_id) if (render->hdr_blob_id)
drmModeDestroyPropertyBlob(render->fd_drm, render->hdr_blob_id); drmModeDestroyPropertyBlob(render->fd_drm, render->hdr_blob_id);
render->hdr_blob_id = 0; render->hdr_blob_id = 0;
return; return;
} }
m_need_modeset = 1; m_need_modeset = 1;
Debug(3,"DRM: HDR metadata: prop set\n");
}
Debug(3,"DRM: HDR metadata: prop set\n");
}

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: VDR \n" "Project-Id-Version: VDR \n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2019-10-26 18:41+0200\n" "POT-Creation-Date: 2020-04-13 16:26+0200\n"
"PO-Revision-Date: blabla\n" "PO-Revision-Date: blabla\n"
"Last-Translator: blabla\n" "Last-Translator: blabla\n"
"Language-Team: blabla\n" "Language-Team: blabla\n"
@ -263,9 +263,6 @@ msgstr ""
msgid "codec: can't allocate video codec context\n" msgid "codec: can't allocate video codec context\n"
msgstr "" msgstr ""
msgid "VAAPI Refcounts invalid\n"
msgstr ""
msgid "codec: can't set option deint to video codec!\n" msgid "codec: can't set option deint to video codec!\n"
msgstr "" msgstr ""
@ -306,24 +303,6 @@ msgstr ""
msgid "codec/audio: decoded data smaller than encoded\n" msgid "codec/audio: decoded data smaller than encoded\n"
msgstr "" msgstr ""
msgid "codec/audio: resample setup error\n"
msgstr ""
msgid "codec/audio: overwrite resample\n"
msgstr ""
msgid "codec/audio: AvResample setup error\n"
msgstr ""
msgid "codec: latm\n"
msgstr ""
msgid "codec: error audio data\n"
msgstr ""
msgid "codec: error more than one frame data\n"
msgstr ""
msgid "codec/audio: can't setup resample\n" msgid "codec/audio: can't setup resample\n"
msgstr "" msgstr ""
@ -642,7 +621,7 @@ msgid " Frames missed(%d) duped(%d) dropped(%d) total(%d)"
msgstr " Frames verloren(%d) verdoppelt(%d) übersprungen(%d) Gesamt(%d)" msgstr " Frames verloren(%d) verdoppelt(%d) übersprungen(%d) Gesamt(%d)"
#, c-format #, c-format
msgid " Frame Process time %2.2fms" msgid " Video %dx%d Color: %s Gamma: %s"
msgstr "" msgstr ""
msgid "pass-through disabled" msgid "pass-through disabled"
@ -807,10 +786,6 @@ msgstr ""
msgid "video/glx: no GLX support\n" msgid "video/glx: no GLX support\n"
msgstr "" msgstr ""
#, c-format
msgid "video/glx: glx version %d.%d\n"
msgstr ""
msgid "did not get FBconfig" msgid "did not get FBconfig"
msgstr "" msgstr ""
@ -898,11 +873,10 @@ msgid "Failed rendering frame!\n"
msgstr "" msgstr ""
#, c-format #, c-format
msgid "video/vdpau: output buffer full, dropping frame (%d/%d)\n" msgid "video/cuvid: output buffer full, dropping frame (%d/%d)\n"
msgstr "" msgstr ""
#, c-format msgid "Could not dynamically load CUDA\n"
msgid "video/vdpau: pixel format %d not supported\n"
msgstr "" msgstr ""
msgid "Kein Cuda device gefunden" msgid "Kein Cuda device gefunden"
@ -943,12 +917,6 @@ msgstr ""
msgid "video/egl: can't create thread egl context\n" msgid "video/egl: can't create thread egl context\n"
msgstr "" msgstr ""
msgid "video: can't queue cancel video display thread\n"
msgstr ""
msgid "video: can't cancel video display thread\n"
msgstr ""
#, c-format #, c-format
msgid "video: repeated pict %d found, but not handled\n" msgid "video: repeated pict %d found, but not handled\n"
msgstr "" msgstr ""

315
shaders.h
View File

@ -11,7 +11,6 @@ const char *gl_version = "#version 300 es ";
#endif #endif
#endif #endif
/* Color conversion matrix: RGB = m * YUV + c /* Color conversion matrix: RGB = m * YUV + c
* m is in row-major matrix, with m[row][col], e.g.: * m is in row-major matrix, with m[row][col], e.g.:
* [ a11 a12 a13 ] float m[3][3] = { { a11, a12, a13 }, * [ a11 a12 a13 ] float m[3][3] = { { a11, a12, a13 },
@ -71,16 +70,11 @@ float cms_matrix[3][3] = { {1.660497, -0.124547, -0.018154},
}; };
// Common constants for SMPTE ST.2084 (PQ) // Common constants for SMPTE ST.2084 (PQ)
static const float PQ_M1 = 2610./4096 * 1./4, static const float PQ_M1 = 2610. / 4096 * 1. / 4, PQ_M2 = 2523. / 4096 * 128, PQ_C1 = 3424. / 4096, PQ_C2 =
PQ_M2 = 2523./4096 * 128, 2413. / 4096 * 32, PQ_C3 = 2392. / 4096 * 32;
PQ_C1 = 3424./4096,
PQ_C2 = 2413./4096 * 32,
PQ_C3 = 2392./4096 * 32;
// Common constants for ARIB STD-B67 (HLG) // Common constants for ARIB STD-B67 (HLG)
static const float HLG_A = 0.17883277, static const float HLG_A = 0.17883277, HLG_B = 0.28466892, HLG_C = 0.55991073;
HLG_B = 0.28466892,
HLG_C = 0.55991073;
struct gl_vao_entry struct gl_vao_entry
{ {
@ -124,48 +118,55 @@ static const struct gl_vao_entry vertex_vao[] = {
char sh[SHADER_LENGTH]; char sh[SHADER_LENGTH];
char shv[SHADER_LENGTH]; char shv[SHADER_LENGTH];
GL_init() { GL_init()
sh[0] = 0; {
sh[0] = 0;
} }
GLV_init() {
shv[0] = 0; GLV_init()
{
shv[0] = 0;
} }
pl_shader_append(const char *fmt, ...) {
char temp[1000]; pl_shader_append(const char *fmt, ...)
va_list ap; {
char temp[1000];
va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
vsprintf(temp,fmt,ap); vsprintf(temp, fmt, ap);
va_end(ap); va_end(ap);
if (strlen(sh) + strlen(temp) > SHADER_LENGTH) if (strlen(sh) + strlen(temp) > SHADER_LENGTH)
Fatal(_("Shaderlenght fault\n")); Fatal(_("Shaderlenght fault\n"));
strcat(sh,temp); strcat(sh, temp);
} }
pl_shader_append_v(const char *fmt, ...) { pl_shader_append_v(const char *fmt, ...)
char temp[1000]; {
va_list ap; char temp[1000];
va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
vsprintf(temp,fmt,ap); vsprintf(temp, fmt, ap);
va_end(ap); va_end(ap);
if (strlen(shv) + strlen(temp) > SHADER_LENGTH) if (strlen(shv) + strlen(temp) > SHADER_LENGTH)
Fatal(_("Shaderlenght fault\n")); Fatal(_("Shaderlenght fault\n"));
strcat(shv,temp); strcat(shv, temp);
} }
static void compile_attach_shader(GLuint program, GLenum type, const char *source) static void compile_attach_shader(GLuint program, GLenum type, const char *source)
{ {
GLuint shader; GLuint shader;
GLint status=1234, log_length; GLint status = 1234, log_length;
char log[4000]; char log[4000];
GLsizei len; GLsizei len;
shader = glCreateShader(type); shader = glCreateShader(type);
glShaderSource(shader, 1, (const GLchar **)&source, NULL); // &buffer, NULL); glShaderSource(shader, 1, (const GLchar **)&source, NULL); // &buffer, NULL);
glCompileShader(shader); glCompileShader(shader);
status = 0; status = 0;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status); glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
@ -198,42 +199,42 @@ static GLuint sc_generate_osd(GLuint gl_prog)
Debug(3, "vor create osd\n"); Debug(3, "vor create osd\n");
gl_prog = glCreateProgram(); gl_prog = glCreateProgram();
GL_init(); GL_init();
GLSL("%s\n",gl_version); GLSL("%s\n", gl_version);
GLSL("in vec2 vertex_position;\n"); GLSL("in vec2 vertex_position;\n");
GLSL("in vec2 vertex_texcoord0;\n"); GLSL("in vec2 vertex_texcoord0;\n");
GLSL("out vec2 texcoord0;\n"); GLSL("out vec2 texcoord0;\n");
GLSL("void main() {\n"); GLSL("void main() {\n");
GLSL("gl_Position = vec4(vertex_position, 1.0, 1.0);\n"); GLSL("gl_Position = vec4(vertex_position, 1.0, 1.0);\n");
GLSL("texcoord0 = vertex_texcoord0;\n"); GLSL("texcoord0 = vertex_texcoord0;\n");
GLSL("}\n"); GLSL("}\n");
Debug(3, "vor compile vertex osd\n"); Debug(3, "vor compile vertex osd\n");
compile_attach_shader(gl_prog, GL_VERTEX_SHADER, sh); // vertex_osd); compile_attach_shader(gl_prog, GL_VERTEX_SHADER, sh); // vertex_osd);
GL_init(); GL_init();
GLSL("%s\n",gl_version); GLSL("%s\n", gl_version);
GLSL("#define texture1D texture\n"); GLSL("#define texture1D texture\n");
GLSL("precision mediump float; \n"); GLSL("precision mediump float; \n");
GLSL("layout(location = 0) out vec4 out_color;\n"); GLSL("layout(location = 0) out vec4 out_color;\n");
GLSL("in vec2 texcoord0;\n"); GLSL("in vec2 texcoord0;\n");
GLSL("uniform sampler2D texture0;\n"); GLSL("uniform sampler2D texture0;\n");
GLSL("void main() {\n"); GLSL("void main() {\n");
GLSL("vec4 color; \n"); GLSL("vec4 color; \n");
GLSL("color = vec4(texture(texture0, texcoord0));\n"); GLSL("color = vec4(texture(texture0, texcoord0));\n");
#ifdef GAMMA #ifdef GAMMA
GLSL("// delinearize gamma \n"); GLSL("// delinearize gamma \n");
GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0); \n"); // delinearize gamma GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0); \n"); // delinearize gamma
GLSL("color.rgb = pow(color.rgb, vec3(2.4)); \n"); GLSL("color.rgb = pow(color.rgb, vec3(2.4)); \n");
#endif #endif
GLSL("out_color = color;\n"); GLSL("out_color = color;\n");
GLSL("}\n"); GLSL("}\n");
Debug(3, "vor compile fragment osd \n"); Debug(3, "vor compile fragment osd \n");
compile_attach_shader(gl_prog, GL_FRAGMENT_SHADER, sh); //fragment_osd); compile_attach_shader(gl_prog, GL_FRAGMENT_SHADER, sh); //fragment_osd);
glBindAttribLocation(gl_prog, 0, "vertex_position"); glBindAttribLocation(gl_prog, 0, "vertex_position");
glBindAttribLocation(gl_prog, 1, "vertex_texcoord0"); glBindAttribLocation(gl_prog, 1, "vertex_texcoord0");
link_shader(gl_prog); link_shader(gl_prog);
return gl_prog; return gl_prog;
} }
@ -245,34 +246,33 @@ static GLuint sc_generate(GLuint gl_prog, enum AVColorSpace colorspace)
GLint cmsLoc; GLint cmsLoc;
float *m, *c, *cms; float *m, *c, *cms;
char *frag; char *frag;
GL_init(); GL_init();
GLSL("%s\n",gl_version); GLSL("%s\n", gl_version);
GLSL("in vec2 vertex_position; \n"); GLSL("in vec2 vertex_position; \n");
GLSL("in vec2 vertex_texcoord0; \n"); GLSL("in vec2 vertex_texcoord0; \n");
GLSL("out vec2 texcoord0; \n"); GLSL("out vec2 texcoord0; \n");
GLSL("in vec2 vertex_texcoord1; \n"); GLSL("in vec2 vertex_texcoord1; \n");
GLSL("out vec2 texcoord1; \n"); GLSL("out vec2 texcoord1; \n");
if (Planes == 3) { if (Planes == 3) {
GLSL("in vec2 vertex_texcoord2; \n"); GLSL("in vec2 vertex_texcoord2; \n");
GLSL("out vec2 texcoord2; \n"); GLSL("out vec2 texcoord2; \n");
} }
GLSL("void main() { \n"); GLSL("void main() { \n");
GLSL("gl_Position = vec4(vertex_position, 1.0, 1.0);\n"); GLSL("gl_Position = vec4(vertex_position, 1.0, 1.0);\n");
GLSL("texcoord0 = vertex_texcoord0; \n"); GLSL("texcoord0 = vertex_texcoord0; \n");
GLSL("texcoord1 = vertex_texcoord1; \n"); GLSL("texcoord1 = vertex_texcoord1; \n");
if (Planes == 3) { if (Planes == 3) {
GLSL("texcoord2 = vertex_texcoord1; \n"); // texcoord1 ist hier richtig GLSL("texcoord2 = vertex_texcoord1; \n"); // texcoord1 ist hier richtig
} }
GLSL("} \n"); GLSL("} \n");
Debug(3, "vor create\n"); Debug(3, "vor create\n");
gl_prog = glCreateProgram(); gl_prog = glCreateProgram();
Debug(3, "vor compile vertex\n"); Debug(3, "vor compile vertex\n");
// printf("%s",sh); // printf("%s",sh);
compile_attach_shader(gl_prog, GL_VERTEX_SHADER, sh ); compile_attach_shader(gl_prog, GL_VERTEX_SHADER, sh);
switch (colorspace) { switch (colorspace) {
case AVCOL_SPC_RGB: case AVCOL_SPC_RGB:
m = &yuv_bt601.m[0][0]; m = &yuv_bt601.m[0][0];
@ -297,86 +297,85 @@ static GLuint sc_generate(GLuint gl_prog, enum AVColorSpace colorspace)
Debug(3, "default BT709 Colorspace used %d\n", colorspace); Debug(3, "default BT709 Colorspace used %d\n", colorspace);
break; break;
} }
GL_init();
GLSL("%s\n",gl_version);
GLSL("precision mediump float; \n");
GLSL("layout(location = 0) out vec4 out_color;\n");
GLSL("in vec2 texcoord0; \n");
GLSL("in vec2 texcoord1; \n");
if (Planes == 3)
GLSL("in vec2 texcoord2; \n");
GLSL("uniform mat3 colormatrix; \n");
GLSL("uniform vec3 colormatrix_c; \n");
if (colorspace == AVCOL_SPC_BT2020_NCL)
GLSL("uniform mat3 cms_matrix;\n");
GLSL("uniform sampler2D texture0; \n");
GLSL("uniform sampler2D texture1; \n");
if (Planes == 3)
GLSL("uniform sampler2D texture2; \n");
GLSL("void main() { \n");
GLSL("vec4 color; \n");
if (colorspace == AVCOL_SPC_BT2020_NCL) {
GLSL("color.r = 1.003906 * vec4(texture(texture0, texcoord0)).r; \n");
if (Planes == 3) {
GLSL("color.g = 1.003906 * vec4(texture(texture1, texcoord1)).r; \n");
GLSL("color.b = 1.003906 * vec4(texture(texture2, texcoord2)).r; \n");
} else {
GLSL("color.gb = 1.003906 * vec4(texture(texture1, texcoord1)).rg;\n");
}
GLSL("// color conversion\n");
GLSL("color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c; \n");
GLSL("color.a = 1.0; \n");
GLSL("// pl_shader_linearize \n"); GL_init();
GLSL("%s\n", gl_version);
GLSL("precision mediump float; \n");
GLSL("layout(location = 0) out vec4 out_color;\n");
GLSL("in vec2 texcoord0; \n");
GLSL("in vec2 texcoord1; \n");
if (Planes == 3)
GLSL("in vec2 texcoord2; \n");
GLSL("uniform mat3 colormatrix; \n");
GLSL("uniform vec3 colormatrix_c; \n");
if (colorspace == AVCOL_SPC_BT2020_NCL)
GLSL("uniform mat3 cms_matrix;\n");
GLSL("uniform sampler2D texture0; \n");
GLSL("uniform sampler2D texture1; \n");
if (Planes == 3)
GLSL("uniform sampler2D texture2; \n");
GLSL("void main() { \n");
GLSL("vec4 color; \n");
if (colorspace == AVCOL_SPC_BT2020_NCL) {
GLSL("color.r = 1.003906 * vec4(texture(texture0, texcoord0)).r; \n");
if (Planes == 3) {
GLSL("color.g = 1.003906 * vec4(texture(texture1, texcoord1)).r; \n");
GLSL("color.b = 1.003906 * vec4(texture(texture2, texcoord2)).r; \n");
} else {
GLSL("color.gb = 1.003906 * vec4(texture(texture1, texcoord1)).rg;\n");
}
GLSL("// color conversion\n");
GLSL("color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c; \n");
GLSL("color.a = 1.0; \n");
GLSL("// pl_shader_linearize \n");
GLSL("color.rgb = max(color.rgb, 0.0); \n"); GLSL("color.rgb = max(color.rgb, 0.0); \n");
// GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0); \n"); // GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0); \n");
// GLSL("color.rgb = pow(color.rgb, vec3(2.4)); \n"); // GLSL("color.rgb = pow(color.rgb, vec3(2.4)); \n");
// GLSL("color.rgb = mix(vec3(4.0) * color.rgb * color.rgb,exp((color.rgb - vec3(%f)) * vec3(1.0/%f)) + vec3(%f),bvec3(lessThan(vec3(0.5), color.rgb)));\n",HLG_C, HLG_A, HLG_B); // GLSL("color.rgb = mix(vec3(4.0) * color.rgb * color.rgb,exp((color.rgb - vec3(%f)) * vec3(1.0/%f)) + vec3(%f),bvec3(lessThan(vec3(0.5), color.rgb)));\n",HLG_C, HLG_A, HLG_B);
GLSL("color.rgb = mix(vec3(4.0) * color.rgb * color.rgb,exp((color.rgb - vec3(0.55991073)) * vec3(1.0/0.17883277)) + vec3(0.28466892), bvec3(lessThan(vec3(0.5), color.rgb)));\n"); GLSL("color.rgb = mix(vec3(4.0) * color.rgb * color.rgb,exp((color.rgb - vec3(0.55991073)) * vec3(1.0/0.17883277)) + vec3(0.28466892), bvec3(lessThan(vec3(0.5), color.rgb)));\n");
GLSL("// color mapping \n"); GLSL("// color mapping \n");
GLSL("color.rgb = cms_matrix * color.rgb; \n"); GLSL("color.rgb = cms_matrix * color.rgb; \n");
#ifndef GAMMA #ifndef GAMMA
GLSL("// pl_shader_delinearize \n"); GLSL("// pl_shader_delinearize \n");
GLSL("color.rgb = max(color.rgb, 0.0); \n"); GLSL("color.rgb = max(color.rgb, 0.0); \n");
// GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0); \n"); // GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0); \n");
// GLSL("color.rgb = pow(color.rgb, vec3(1.0/2.4)); \n"); // GLSL("color.rgb = pow(color.rgb, vec3(1.0/2.4)); \n");
GLSL("color.rgb = mix(vec3(0.5) * sqrt(color.rgb), vec3(0.17883277) * log(color.rgb - vec3(0.28466892)) + vec3(0.55991073), bvec3(lessThan(vec3(1.0), color.rgb))); \n"); GLSL("color.rgb = mix(vec3(0.5) * sqrt(color.rgb), vec3(0.17883277) * log(color.rgb - vec3(0.28466892)) + vec3(0.55991073), bvec3(lessThan(vec3(1.0), color.rgb))); \n");
#endif #endif
GLSL("out_color = color; \n"); GLSL("out_color = color; \n");
GLSL("} \n"); GLSL("} \n");
} } else {
else {
GLSL("color.r = 1.000000 * vec4(texture(texture0, texcoord0)).r; \n"); GLSL("color.r = 1.000000 * vec4(texture(texture0, texcoord0)).r; \n");
if (Planes == 3) { if (Planes == 3) {
GLSL("color.g = 1.000000 * vec4(texture(texture1, texcoord1)).r;\n"); GLSL("color.g = 1.000000 * vec4(texture(texture1, texcoord1)).r;\n");
GLSL("color.b = 1.000000 * vec4(texture(texture2, texcoord2)).r;\n"); GLSL("color.b = 1.000000 * vec4(texture(texture2, texcoord2)).r;\n");
} else { } else {
GLSL("color.gb = 1.000000 * vec4(texture(texture1, texcoord1)).rg; \n"); GLSL("color.gb = 1.000000 * vec4(texture(texture1, texcoord1)).rg; \n");
} }
GLSL("// color conversion \n"); GLSL("// color conversion \n");
GLSL("color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c; \n"); GLSL("color.rgb = mat3(colormatrix) * color.rgb + colormatrix_c; \n");
GLSL("color.a = 1.0; \n"); GLSL("color.a = 1.0; \n");
GLSL("// linearize gamma \n"); GLSL("// linearize gamma \n");
GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0); \n"); // linearize gamma GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0); \n"); // linearize gamma
GLSL("color.rgb = pow(color.rgb, vec3(2.4)); \n"); GLSL("color.rgb = pow(color.rgb, vec3(2.4)); \n");
#ifndef GAMMA #ifndef GAMMA
GLSL("// delinearize gamma to sRGB \n"); GLSL("// delinearize gamma to sRGB \n");
GLSL("color.rgb = max(color.rgb, 0.0); \n"); GLSL("color.rgb = max(color.rgb, 0.0); \n");
GLSL("color.rgb = mix(color.rgb * vec3(12.92), vec3(1.055) * pow(color.rgb, vec3(1.0/2.4)) - vec3(0.055), bvec3(lessThanEqual(vec3(0.0031308), color.rgb))); \n"); GLSL("color.rgb = mix(color.rgb * vec3(12.92), vec3(1.055) * pow(color.rgb, vec3(1.0/2.4)) - vec3(0.055), bvec3(lessThanEqual(vec3(0.0031308), color.rgb))); \n");
#endif #endif
GLSL("// color mapping \n"); GLSL("// color mapping \n");
GLSL("out_color = color; \n"); GLSL("out_color = color; \n");
GLSL("} \n"); GLSL("} \n");
} }
//printf(">%s<",sh); //printf(">%s<",sh);
Debug(3, "vor compile fragment\n"); Debug(3, "vor compile fragment\n");
compile_attach_shader(gl_prog, GL_FRAGMENT_SHADER, sh); compile_attach_shader(gl_prog, GL_FRAGMENT_SHADER, sh);
glBindAttribLocation(gl_prog, 0, "vertex_position"); glBindAttribLocation(gl_prog, 0, "vertex_position");
for (n = 0; n < 6; n++) { for (n = 0; n < 6; n++) {

View File

@ -1096,10 +1096,10 @@ void cMenuSetupSoft::Create(void)
"auto", "1920x1080", "1280x720", "custom", "auto", "1920x1080", "1280x720", "custom",
}; };
static const char *const video_display_formats_4_3[] = { static const char *const video_display_formats_4_3[] = {
"pan&scan", "letterbox", "center cut-out", "pan&scan", "letterbox", "center cut-out", "original"
}; };
static const char *const video_display_formats_16_9[] = { static const char *const video_display_formats_16_9[] = {
"pan&scan", "pillarbox", "center cut-out", "pan&scan", "pillarbox", "center cut-out", "original"
}; };
#ifdef YADIF #ifdef YADIF
static const char *const deinterlace[] = { static const char *const deinterlace[] = {
@ -1133,7 +1133,7 @@ void cMenuSetupSoft::Create(void)
static char *scalingtest[100]; static char *scalingtest[100];
if (scalers == 0) { if (scalers == 0) {
scalingtest[0] = (char *) "Off"; scalingtest[0] = (char *)"Off";
for (scalers = 0; pl_named_filters[scalers].filter != NULL; scalers++) { for (scalers = 0; pl_named_filters[scalers].filter != NULL; scalers++) {
scaling[scalers] = (char *)pl_named_filters[scalers].name; scaling[scalers] = (char *)pl_named_filters[scalers].name;
scalingtest[scalers + 1] = (char *)pl_named_filters[scalers].name; scalingtest[scalers + 1] = (char *)pl_named_filters[scalers].name;
@ -1182,9 +1182,9 @@ void cMenuSetupSoft::Create(void)
Add(new cMenuEditBoolItem(tr("Enable Screensaver(DPMS) at black screen"), &EnableDPMSatBlackScreen, Add(new cMenuEditBoolItem(tr("Enable Screensaver(DPMS) at black screen"), &EnableDPMSatBlackScreen,
trVDR("no"), trVDR("yes"))); trVDR("no"), trVDR("yes")));
#endif #endif
Add(new cMenuEditStraItem(trVDR("4:3 video display format"), &Video4to3DisplayFormat, 3, Add(new cMenuEditStraItem(trVDR("4:3 video display format"), &Video4to3DisplayFormat, 4,
video_display_formats_4_3)); video_display_formats_4_3));
Add(new cMenuEditStraItem(trVDR("16:9+other video display format"), &VideoOtherDisplayFormat, 3, Add(new cMenuEditStraItem(trVDR("16:9+other video display format"), &VideoOtherDisplayFormat, 4,
video_display_formats_16_9)); video_display_formats_16_9));
#if 0 #if 0
@ -2153,10 +2153,10 @@ void cSoftHdMenu::Create(void)
int dropped; int dropped;
int counter; int counter;
float frametime; float frametime;
int width,height; int width, height;
int color; int color;
int eotf; int eotf;
char *colorstr, *eotfstr; char *colorstr, *eotfstr;
current = Current(); // get current menu item index current = Current(); // get current menu item index
Clear(); // clear the menu Clear(); // clear the menu
@ -2191,8 +2191,8 @@ void cSoftHdMenu::Create(void)
#endif #endif
Add(new cOsdItem(NULL, osUnknown, false)); Add(new cOsdItem(NULL, osUnknown, false));
Add(new cOsdItem(NULL, osUnknown, false)); Add(new cOsdItem(NULL, osUnknown, false));
GetStats(&missed, &duped, &dropped, &counter, &frametime, &width, &height, &color,&eotf); GetStats(&missed, &duped, &dropped, &counter, &frametime, &width, &height, &color, &eotf);
switch (color) { switch (color) {
case AVCOL_SPC_RGB: case AVCOL_SPC_RGB:
colorstr = strdup("BT 601"); colorstr = strdup("BT 601");
eotfstr = strdup("BT 1886"); eotfstr = strdup("BT 1886");
@ -2213,8 +2213,9 @@ void cSoftHdMenu::Create(void)
} }
Add(new cOsdItem(cString::sprintf(tr(" Frames missed(%d) duped(%d) dropped(%d) total(%d)"), missed, duped, dropped, Add(new cOsdItem(cString::sprintf(tr(" Frames missed(%d) duped(%d) dropped(%d) total(%d)"), missed, duped, dropped,
counter), osUnknown, false)); counter), osUnknown, false));
Add(new cOsdItem(cString::sprintf(tr(" Video %dx%d Color: %s Gamma: %s"), width, height, colorstr, eotfstr), osUnknown, false)); Add(new cOsdItem(cString::sprintf(tr(" Video %dx%d Color: %s Gamma: %s"), width, height, colorstr, eotfstr),
// Add(new cOsdItem(cString::sprintf(tr(" Frame Process time %2.2fms"), frametime), osUnknown, false)); osUnknown, false));
// Add(new cOsdItem(cString::sprintf(tr(" Frame Process time %2.2fms"), frametime), osUnknown, false));
SetCurrent(Get(current)); // restore selected menu entry SetCurrent(Get(current)); // restore selected menu entry
Display(); // display build menu Display(); // display build menu
} }

View File

@ -645,7 +645,7 @@ static void PesParse(PesDemux * pesdx, const uint8_t * data, int size, int is_st
q = pesdx->Buffer + pesdx->Skip; q = pesdx->Buffer + pesdx->Skip;
n = pesdx->Index - pesdx->Skip; n = pesdx->Index - pesdx->Skip;
while (n >= 5) { while (n >= 5) {
int r=0; int r = 0;
unsigned codec_id = AV_CODEC_ID_NONE; unsigned codec_id = AV_CODEC_ID_NONE;
// 4 bytes 0xFFExxxxx Mpeg audio // 4 bytes 0xFFExxxxx Mpeg audio
@ -2871,11 +2871,10 @@ const char *CommandLineHelp(void)
" -p device\taudio device for pass-through (hw:0,1 or /dev/dsp1)\n" " -p device\taudio device for pass-through (hw:0,1 or /dev/dsp1)\n"
" -c channel\taudio mixer channel name (fe. PCM)\n" " -d display\tdisplay of x11 server (fe. :0.0)\n" " -c channel\taudio mixer channel name (fe. PCM)\n" " -d display\tdisplay of x11 server (fe. :0.0)\n"
" -f\t\tstart with fullscreen window (only with window manager)\n" " -f\t\tstart with fullscreen window (only with window manager)\n"
" -g geometry\tx11 window geometry wxh+x+y\n" " -g geometry\tx11 window geometry wxh+x+y\n" " -r Refresh\tRefreshrate for DRM (default is 50 Hz)\n"
" -r Refresh\tRefreshrate for DRM (default is 50 Hz)\n" " -C Connector\tConnector for DRM (default is current Connector)\n"
" -C Connector\tConnector for DRM (default is current Connector)\n" " -v device\tvideo driver device (cuvid)\n" " -s\t\tstart in suspended mode\n"
" -v device\tvideo driver device (cuvid)\n" " -x\t\tstart x11 server, with -xx try to connect, if this fails\n"
" -s\t\tstart in suspended mode\n" " -x\t\tstart x11 server, with -xx try to connect, if this fails\n"
" -X args\tX11 server arguments (f.e. -nocursor)\n" " -w workaround\tenable/disable workarounds\n" " -X args\tX11 server arguments (f.e. -nocursor)\n" " -w workaround\tenable/disable workarounds\n"
"\tno-hw-decoder\t\tdisable hw decoder, use software decoder only\n" "\tno-hw-decoder\t\tdisable hw decoder, use software decoder only\n"
"\tno-mpeg-hw-decoder\tdisable hw decoder for mpeg only\n" "\tno-mpeg-hw-decoder\tdisable hw decoder for mpeg only\n"
@ -2916,10 +2915,10 @@ int ProcessArgs(int argc, char *const argv[])
continue; continue;
case 'C': // Connector for DRM case 'C': // Connector for DRM
VideoSetConnector(optarg); VideoSetConnector(optarg);
continue; continue;
case 'r': // Connector for DRM case 'r': // Connector for DRM
VideoSetRefresh(optarg); VideoSetRefresh(optarg);
continue; continue;
case 'p': // pass-through audio device case 'p': // pass-through audio device
AudioSetPassthroughDevice(optarg); AudioSetPassthroughDevice(optarg);
continue; continue;
@ -3369,19 +3368,21 @@ void Resume(void)
** @param[out] dropped dropped frames ** @param[out] dropped dropped frames
** @param[out] count number of decoded frames ** @param[out] count number of decoded frames
*/ */
void GetStats(int *missed, int *duped, int *dropped, int *counter, float *frametime, int *width, int *height, int *color, int *eotf) void GetStats(int *missed, int *duped, int *dropped, int *counter, float *frametime, int *width, int *height,
int *color, int *eotf)
{ {
*missed = 0; *missed = 0;
*duped = 0; *duped = 0;
*dropped = 0; *dropped = 0;
*counter = 0; *counter = 0;
*frametime = 0.0f; *frametime = 0.0f;
*width = 0; *width = 0;
*height = 0; *height = 0;
*color = NULL; *color = NULL;
*eotf = NULL; *eotf = NULL;
if (MyVideoStream->HwDecoder) { if (MyVideoStream->HwDecoder) {
VideoGetStats(MyVideoStream->HwDecoder, missed, duped, dropped, counter, frametime, width, height, color, eotf); VideoGetStats(MyVideoStream->HwDecoder, missed, duped, dropped, counter, frametime, width, height, color,
eotf);
} }
} }

796
video.c

File diff suppressed because it is too large Load Diff