mirror of
				https://github.com/jojo61/vdr-plugin-softhdcuvid.git
				synced 2025-03-01 10:39:28 +00:00 
			
		
		
		
	Merge pull request #45 from dnehring7/master
Reindent all sources to common coding. Reworked aspect function.
This commit is contained in:
		
							
								
								
									
										40
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| # | ||||
| # Makefile for a Video Disk Recorder plugin | ||||
| #  | ||||
| # | ||||
| # $Id: 2a41981a57e5e83036463c6a08c84b86ed9d2be3 $ | ||||
|  | ||||
| # The official name of this plugin. | ||||
| @@ -11,7 +11,7 @@ | ||||
| ### Configuration (edit this for your needs) | ||||
| #  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 CUVID is enabled the pluginname is softhdcuvid | ||||
| # if DRM   is enabled the pluginname is softhddrm | ||||
| @@ -19,12 +19,12 @@ VAAPI ?= 0 | ||||
| CUVID ?= 0 | ||||
|  | ||||
| # 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 | ||||
| DRM ?= 0 | ||||
|  | ||||
|  | ||||
| # use libplacebo - available for both decoders but not for DRM   | ||||
| # use libplacebo - available for both decoders but not for DRM | ||||
| LIBPLACEBO ?= 1 | ||||
|  | ||||
| # use YADIF deint - only available with cuvid | ||||
| @@ -124,7 +124,7 @@ TMPDIR ?= /tmp | ||||
|  | ||||
| ### The compiler options: | ||||
|  | ||||
| export CFLAGS	= $(call PKGCFG,cflags)  | ||||
| export CFLAGS	= $(call PKGCFG,cflags) | ||||
| export CXXFLAGS = $(call PKGCFG,cxxflags) | ||||
|  | ||||
| ifeq ($(CFLAGS),) | ||||
| @@ -146,10 +146,10 @@ APIVERSION = $(call PKGCFG,apiversion) | ||||
|  | ||||
| ### Parse config | ||||
| ifeq ($(VAAPI),1) | ||||
| CONFIG += -DVAAPI  | ||||
| CONFIG += -DVAAPI | ||||
| #LIBPLACEBO=1 | ||||
| PLUGIN = softhdvaapi | ||||
| LIBS += -lEGL   | ||||
| LIBS += -lEGL | ||||
| endif | ||||
|  | ||||
|  | ||||
| @@ -159,13 +159,13 @@ CONFIG += -DUSE_DRM -DVAAPI | ||||
| LIBPLACEBO=0 | ||||
| _CFLAGS += $(shell pkg-config --cflags libdrm) | ||||
| LIBS += -lgbm -ldrm | ||||
| LIBS += -lEGL   | ||||
| LIBS += -lEGL | ||||
| endif | ||||
|  | ||||
| ifeq ($(CUVID),1) | ||||
| CONFIG += -DUSE_PIP			# PIP support | ||||
| CONFIG += -DCUVID			# enable CUVID decoder | ||||
| LIBS += -lEGL -lGL  | ||||
| LIBS += -lEGL -lGL | ||||
| ifeq ($(YADIF),1) | ||||
| CONFIG += -DYADIF			# Yadif only with CUVID | ||||
| 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)) | ||||
| #  $(warning ******************************************************************) | ||||
| @@ -222,7 +222,7 @@ SOFILE = libvdr-$(PLUGIN).so | ||||
| #endif | ||||
|  | ||||
| # | ||||
| # Test and set config for libavutil  | ||||
| # Test and set config for libavutil | ||||
| # | ||||
| ifneq (exists, $(shell pkg-config libavutil && echo exists)) | ||||
|   $(warning ******************************************************************) | ||||
| @@ -233,7 +233,7 @@ _CFLAGS += $(shell pkg-config --cflags 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)) | ||||
|   $(warning ******************************************************************) | ||||
| @@ -281,14 +281,14 @@ _CFLAGS += -I./opengl -I./ | ||||
| LIBS += -L/usr/lib64 | ||||
|  | ||||
| ifeq ($(LIBPLACEBO),1) | ||||
| LIBS += -lplacebo  | ||||
| LIBS += -lplacebo | ||||
| endif | ||||
|  | ||||
| ifeq ($(CUVID),1) | ||||
| LIBS +=  -lcuda  -lnvcuvid   | ||||
| LIBS +=  -lcuda  -lnvcuvid | ||||
| endif | ||||
|  | ||||
| LIBS += -lGLEW -lGLU  -ldl -lglut  | ||||
| LIBS += -lGLEW -lGLU  -ldl -lglut | ||||
| ### Includes and Defines (add further entries here): | ||||
|  | ||||
| INCLUDES += | ||||
| @@ -299,16 +299,16 @@ DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' -D_GNU_SOURCE $(CONFIG) \ | ||||
| ### Make it standard | ||||
|  | ||||
| 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) \ | ||||
|     -g -W  -Wextra -Winit-self -Wdeclaration-after-statement | ||||
|  | ||||
|  | ||||
| ### 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) | ||||
| OBJS += openglosd.o  | ||||
| OBJS += openglosd.o | ||||
| endif | ||||
|  | ||||
| SRCS = $(wildcard $(OBJS:.o=.c)) *.cpp | ||||
| @@ -385,9 +385,7 @@ HDRS=	$(wildcard *.h) | ||||
|  | ||||
| indent: | ||||
| 	for i in $(SRCS) $(HDRS); do \ | ||||
| 		indent $$i; \ | ||||
| 		unexpand -a $$i | sed -e s/constconst/const/ > $$i.up; \ | ||||
| 		mv $$i.up $$i; \ | ||||
| 		VERSION_CONTROL=none indent $$i; \ | ||||
| 	done | ||||
|  | ||||
| video_test: video.c Makefile | ||||
|   | ||||
							
								
								
									
										45
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								README.md
									
									
									
									
									
								
							| @@ -50,7 +50,7 @@ Only via DisplayPort you can get 10 Bit output to a compatible screen. This is a | ||||
|  | ||||
| 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 | ||||
| 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 | ||||
| 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: | ||||
|  | ||||
|     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 | ||||
|     This is for INTEL cards and uses Vaapi as decoder. It uses xcb for output and needs a X Server to run. | ||||
|      | ||||
|  | ||||
|     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. | ||||
|  | ||||
| Install: | ||||
| @@ -98,27 +98,27 @@ Install: | ||||
|  | ||||
| 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: | ||||
|     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.  | ||||
|     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. | ||||
|     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  | ||||
|     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  | ||||
|  | ||||
|     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 | ||||
|     Resolution setting. There is as small black line between the halfs to remaind you that Scaler Test | ||||
|     is activ. | ||||
|      | ||||
|  | ||||
|     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.  | ||||
|      | ||||
|     If you are colorblind you could try to remedy this with the Colorblind Settings. Realy only needed  | ||||
|     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 | ||||
|     in rare cases. | ||||
|      | ||||
|  | ||||
|     All other settings can be in their default state. | ||||
|      | ||||
|      | ||||
|  | ||||
|  | ||||
|  | ||||
| Setup:	environment | ||||
| ------ | ||||
| @@ -283,11 +283,13 @@ Setup: /etc/vdr/setup.conf | ||||
| 	0 pan and scan | ||||
| 	1 letter box | ||||
| 	2 center cut-out | ||||
| 	3 original | ||||
|  | ||||
| 	softhddevice.VideoOtherDisplayFormat = 1 | ||||
| 	0 pan and scan | ||||
| 	1 pillar box | ||||
| 	2 center cut-out | ||||
| 	3 original | ||||
|  | ||||
| 	softhddevice.pip.X = 79 | ||||
| 	softhddevice.pip.Y = 78 | ||||
| @@ -378,6 +380,3 @@ Running: | ||||
| Known Bugs: | ||||
| ----------- | ||||
| 	SD Streams not working very well on vaapi | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										19
									
								
								audio.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								audio.c
									
									
									
									
									
								
							| @@ -146,7 +146,6 @@ static volatile char AudioRunning;      ///< thread running / stopped | ||||
| static volatile char AudioPaused;       ///< audio paused | ||||
| static volatile char AudioVideoIsReady; ///< video ready start early | ||||
| 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 | ||||
|  | ||||
| @@ -2005,7 +2004,7 @@ static void *AudioPlayHandlerThread(void *dummy) | ||||
| { | ||||
|     Debug(3, "audio: play thread started\n"); | ||||
|     prctl(PR_SET_NAME, "cuvid audio", 0, 0, 0); | ||||
| 	 | ||||
|  | ||||
|     for (;;) { | ||||
|         // check if we should stop the thread | ||||
|         if (AudioThreadStop) { | ||||
| @@ -2024,7 +2023,8 @@ static void *AudioPlayHandlerThread(void *dummy) | ||||
|  | ||||
|         Debug(3, "audio: ----> %dms %d start\n", (AudioUsedBytes() * 1000) | ||||
|             / (!AudioRing[AudioRingWrite].HwSampleRate + !AudioRing[AudioRingWrite].HwChannels + | ||||
|                 AudioRing[AudioRingWrite].HwSampleRate * AudioRing[AudioRingWrite].HwChannels * AudioBytesProSample),AudioUsedBytes()); | ||||
|                 AudioRing[AudioRingWrite].HwSampleRate * AudioRing[AudioRingWrite].HwChannels * AudioBytesProSample), | ||||
|             AudioUsedBytes()); | ||||
|  | ||||
|         do { | ||||
|             int filled; | ||||
| @@ -2252,7 +2252,7 @@ void AudioEnqueue(const void *samples, int count) | ||||
|             AudioNormalizer(buffer, count); | ||||
|         } | ||||
|     } | ||||
| 	 | ||||
|  | ||||
|     n = RingBufferWrite(AudioRing[AudioRingWrite].RingBuffer, buffer, count); | ||||
|     if (n != (size_t)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 | ||||
|             AudioRunning = 1; | ||||
|             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) | ||||
| @@ -2325,7 +2325,7 @@ void AudioVideoReady(int64_t pts) | ||||
|     // Audio.PTS = next written sample time stamp | ||||
|  | ||||
|     used = RingBufferUsedBytes(AudioRing[AudioRingWrite].RingBuffer); | ||||
|     audio_pts =  | ||||
|     audio_pts = | ||||
|         AudioRing[AudioRingWrite].PTS - | ||||
|         (used * 90 * 1000) / (AudioRing[AudioRingWrite].HwSampleRate * AudioRing[AudioRingWrite].HwChannels * | ||||
|         AudioBytesProSample); | ||||
| @@ -2337,11 +2337,12 @@ void AudioVideoReady(int64_t pts) | ||||
|  | ||||
|     if (!AudioRunning) { | ||||
|         int skip; | ||||
|  | ||||
|         // buffer ~15 video frames | ||||
|         // FIXME: HDTV can use smaller video buffer | ||||
|         skip = pts - 0 * 20 * 90 - AudioBufferTime * 90 - audio_pts + VideoAudioDelay; | ||||
| #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 | ||||
|         // guard against old PTS | ||||
|         if (skip > 0 && skip < 4000 * 90) { | ||||
| @@ -2479,7 +2480,7 @@ int64_t AudioGetDelay(void) | ||||
|     pts += ((int64_t) RingBufferUsedBytes(AudioRing[AudioRingRead].RingBuffer) | ||||
|         * 90 * 1000) / (AudioRing[AudioRingRead].HwSampleRate * AudioRing[AudioRingRead].HwChannels * | ||||
|         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); | ||||
|  | ||||
|     return pts; | ||||
| @@ -2496,7 +2497,7 @@ void AudioSetClock(int64_t pts) | ||||
|         Debug(4, "audio: set clock %s -> %s pts\n", Timestamp2String(AudioRing[AudioRingWrite].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; | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										56
									
								
								codec.c
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								codec.c
									
									
									
									
									
								
							| @@ -96,6 +96,7 @@ static pthread_mutex_t CodecLockMutex; | ||||
| /// Flag prefer fast channel switch | ||||
| char CodecUsePossibleDefectFrames; | ||||
| AVBufferRef *hw_device_ctx; | ||||
|  | ||||
| //---------------------------------------------------------------------------- | ||||
| //  Video | ||||
| //---------------------------------------------------------------------------- | ||||
| @@ -255,18 +256,18 @@ void CodecVideoOpen(VideoDecoder * decoder, int codec_id) | ||||
| #endif | ||||
| #ifdef RASPI | ||||
|     switch (codec_id) { | ||||
|     case AV_CODEC_ID_MPEG2VIDEO: | ||||
|         name = "mpeg2_v4l2m2m"; | ||||
|         break; | ||||
|     case AV_CODEC_ID_H264: | ||||
|         name = "h264_v4l2m2m"; | ||||
|         case AV_CODEC_ID_MPEG2VIDEO: | ||||
|             name = "mpeg2_v4l2m2m"; | ||||
|             break; | ||||
|         case AV_CODEC_ID_H264: | ||||
|             name = "h264_v4l2m2m"; | ||||
| //      name = "h264_mmal"; | ||||
|         break;   | ||||
|     case AV_CODEC_ID_HEVC: | ||||
|         name = "hevc_v4l2m2m"; | ||||
|         break;   | ||||
|             break; | ||||
|         case AV_CODEC_ID_HEVC: | ||||
|             name = "hevc_v4l2m2m"; | ||||
|             break; | ||||
|     } | ||||
| #endif   | ||||
| #endif | ||||
|     if (name && (video_codec = avcodec_find_decoder_by_name(name))) { | ||||
|         Debug(3, "codec: decoder found\n"); | ||||
|     } 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))) { | ||||
|         Fatal(_("codec: can't allocate video codec context\n")); | ||||
|     } | ||||
|      | ||||
|  | ||||
| #ifndef RASPI | ||||
|     if (!HwDeviceContext) { | ||||
|         Fatal("codec: no hw device context to be used"); | ||||
|     } | ||||
|     decoder->VideoCtx->hw_device_ctx = av_buffer_ref(HwDeviceContext); | ||||
| #else | ||||
|     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_DRM_PRIME;  /* request a DRM frame */ | ||||
|     //  decoder->VideoCtx->pix_fmt = AV_PIX_FMT_MMAL;   /* request a DRM frame */ | ||||
| #endif | ||||
|  | ||||
|     // 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)) { | ||||
|         Debug(3, "codec: auto threads enabled"); | ||||
| //        decoder->VideoCtx->thread_count = 0; | ||||
|    } | ||||
|     } | ||||
|  | ||||
|     if (video_codec->capabilities & AV_CODEC_CAP_TRUNCATED) { | ||||
|         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) | ||||
| //        Fatal(_("VAAPI Refcounts invalid\n")); | ||||
|     decoder->VideoCtx->thread_safe_callbacks = 0; | ||||
|              | ||||
|  | ||||
| #endif | ||||
|      | ||||
|  | ||||
| #ifdef RASPI | ||||
|     decoder->VideoCtx->codec_id = codec_id; | ||||
|     decoder->VideoCtx->flags |= AV_CODEC_FLAG_BITEXACT; | ||||
| @@ -508,18 +509,18 @@ void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt) | ||||
|         int ret; | ||||
|         AVPacket pkt[1]; | ||||
|         AVFrame *frame; | ||||
|      | ||||
|  | ||||
|         *pkt = *avpkt;                  // use copy | ||||
|         ret = avcodec_send_packet(video_ctx, pkt); | ||||
|         if (ret < 0) { | ||||
|             return; | ||||
|         }  | ||||
|          | ||||
|         } | ||||
|  | ||||
|         if (!CuvidTestSurfaces()) | ||||
|             usleep(1000); | ||||
|          | ||||
|  | ||||
|         ret = 0; | ||||
|         while (ret >= 0 && CuvidTestSurfaces()) {   | ||||
|         while (ret >= 0 && CuvidTestSurfaces()) { | ||||
|             frame = av_frame_alloc(); | ||||
|             ret = avcodec_receive_frame(video_ctx, frame); | ||||
|  | ||||
| @@ -549,7 +550,7 @@ void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt) | ||||
|                 av_frame_free(&frame); | ||||
|                 return; | ||||
|             } | ||||
|         }    | ||||
|         } | ||||
|     } | ||||
| } | ||||
| #endif | ||||
| @@ -596,9 +597,9 @@ void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt) | ||||
|             } else { | ||||
|                 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 | ||||
| //				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 | ||||
|                 if (decoder->filter) { | ||||
|                     if (decoder->filter == 1) { | ||||
| @@ -647,7 +648,7 @@ void CodecVideoDecode(VideoDecoder * decoder, const AVPacket * avpkt) | ||||
| void CodecVideoFlushBuffers(VideoDecoder * decoder) | ||||
| { | ||||
|     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) | ||||
| { | ||||
|     // FIXME: output any buffered data | ||||
| 	 | ||||
|  | ||||
| #ifdef USE_SWRESAMPLE | ||||
|     if (audio_decoder->Resample) { | ||||
|         swr_free(&audio_decoder->Resample); | ||||
| @@ -1111,8 +1112,6 @@ static int CodecAudioPassthroughHelper(AudioDecoder * audio_decoder, const AVPac | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| #if defined(USE_SWRESAMPLE) || defined(USE_AVRESAMPLE) | ||||
|  | ||||
| /** | ||||
| @@ -1346,6 +1345,7 @@ void CodecAudioDecode(AudioDecoder * audio_decoder, const AVPacket * avpkt) | ||||
|             if (audio_decoder->Resample) { | ||||
|                 uint8_t outbuf[8192 * 2 * 8]; | ||||
|                 uint8_t *out[1]; | ||||
|  | ||||
|                 out[0] = outbuf; | ||||
|                 ret = | ||||
|                     swr_convert(audio_decoder->Resample, out, sizeof(outbuf) / (2 * audio_decoder->HwChannels), | ||||
|   | ||||
							
								
								
									
										109
									
								
								drm.c
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								drm.c
									
									
									
									
									
								
							| @@ -18,13 +18,13 @@ struct _Drm_Render_ | ||||
|     int fd_drm; | ||||
|     drmModeModeInfo mode; | ||||
|     drmModeCrtc *saved_crtc; | ||||
| //    drmEventContext ev;    | ||||
| //    drmEventContext ev; | ||||
|     int bpp; | ||||
|     uint32_t connector_id, crtc_id, video_plane; | ||||
|     uint32_t hdr_metadata; | ||||
|     uint32_t mmWidth,mmHeight;   // Size in mm | ||||
| 	uint32_t hdr_blob_id; | ||||
|   | ||||
|  | ||||
| }; | ||||
| typedef struct _Drm_Render_ VideoRender; | ||||
|  | ||||
| @@ -193,12 +193,12 @@ void set_video_mode(int width, int height) | ||||
| 		return; | ||||
| 	connector = drmModeGetConnector(render->fd_drm, render->connector_id); | ||||
| 	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); | ||||
| 		if (width == mode->hdisplay &&  | ||||
| 				height == mode->vdisplay &&  | ||||
| 		if (width == mode->hdisplay && | ||||
| 				height == mode->vdisplay && | ||||
| 				mode->vrefresh == DRMRefresh && | ||||
| 				render->mode.hdisplay != width &&  | ||||
| 				render->mode.hdisplay != width && | ||||
| 		        render->mode.vdisplay != height && | ||||
| 				!(mode->flags & DRM_MODE_FLAG_INTERLACE)) { | ||||
| 			memcpy(&render->mode, mode, sizeof(drmModeModeInfo)); | ||||
| @@ -211,7 +211,7 @@ void set_video_mode(int width, int height) | ||||
| 			CuvidSetVideoMode(); | ||||
| 			Debug(3,"Set new mode %d:%d\n",mode->hdisplay,mode->vdisplay); | ||||
| 			break; | ||||
| 		}             | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -241,10 +241,10 @@ static int FindDevice(VideoRender * render) | ||||
|         return -errno; | ||||
|     } | ||||
| 	drmSetMaster(render->fd_drm); | ||||
|      | ||||
|  | ||||
|     version = drmGetVersion(render->fd_drm); | ||||
|     fprintf(stderr, "FindDevice: open /dev/dri/card0:  %s\n",  version->name); | ||||
|      | ||||
|  | ||||
|     // check capability | ||||
|     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"); | ||||
| @@ -263,7 +263,7 @@ static int FindDevice(VideoRender * render) | ||||
|  | ||||
|     if (drmGetCap(render->fd_drm, DRM_PRIME_CAP_IMPORT, &has_prime) < 0) | ||||
|         fprintf(stderr, "FindDevice: DRM_PRIME_CAP_IMPORT not available.\n"); | ||||
|      | ||||
|  | ||||
|     if ((resources = drmModeGetResources(render->fd_drm)) == NULL){ | ||||
|         fprintf(stderr, "FindDevice: cannot retrieve DRM resources (%d): %m\n", errno); | ||||
|         return -errno; | ||||
| @@ -282,18 +282,18 @@ static int FindDevice(VideoRender * render) | ||||
|             fprintf(stderr, "FindDevice: cannot retrieve DRM connector (%d): %m\n", errno); | ||||
|             return -errno; | ||||
|         } | ||||
|          | ||||
|  | ||||
|         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 "); | ||||
|         if (DRMConnector && strcmp(DRMConnector,connectorstr)) | ||||
|             continue; | ||||
|          | ||||
|  | ||||
|         if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) { | ||||
| 			float aspect = (float)connector->mmWidth / (float)connector->mmHeight; | ||||
| 			if ((aspect > 1.70) && (aspect < 1.85)) { | ||||
| 				render->mmHeight     = 90; | ||||
|             	render->mmWidth      = 160; | ||||
| 			} else {             | ||||
| 			} else { | ||||
|             	render->mmHeight     = connector->mmHeight; | ||||
|             	render->mmWidth      = connector->mmWidth; | ||||
| 			} | ||||
| @@ -304,27 +304,27 @@ static int FindDevice(VideoRender * render) | ||||
|                 return -errno; | ||||
|             } | ||||
|             render->crtc_id = encoder->crtc_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); | ||||
|                  | ||||
|  | ||||
|             memcpy(&render->mode, &connector->modes[0], sizeof(drmModeModeInfo));  // set fallback | ||||
|             // search Modes for Connector | ||||
|             for (ii = 0; ii < connector->count_modes; ii++) { | ||||
|                 mode = &connector->modes[ii]; | ||||
|                  | ||||
|  | ||||
|                 printf("Mode %d %dx%d Rate %d\n",ii,mode->hdisplay,mode->vdisplay,mode->vrefresh); | ||||
|                  | ||||
|                 if (VideoWindowWidth && VideoWindowHeight) { // preset by command line  | ||||
|                     if (VideoWindowWidth == mode->hdisplay &&  | ||||
|                             VideoWindowHeight == mode->vdisplay &&  | ||||
|  | ||||
|                 if (VideoWindowWidth && VideoWindowHeight) { // preset by command line | ||||
|                     if (VideoWindowWidth == mode->hdisplay && | ||||
|                             VideoWindowHeight == mode->vdisplay && | ||||
|                             mode->vrefresh == DRMRefresh && | ||||
|                             !(mode->flags & DRM_MODE_FLAG_INTERLACE)) { | ||||
|                         memcpy(&render->mode, mode, sizeof(drmModeModeInfo)); | ||||
|                         break; | ||||
|                     } | ||||
|                 }  | ||||
|                 } | ||||
|                 else { | ||||
|                     if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) { | ||||
|                         memcpy(&render->mode, mode, sizeof(drmModeModeInfo)); | ||||
| @@ -335,7 +335,7 @@ static int FindDevice(VideoRender * render) | ||||
|                 } | ||||
|             } | ||||
|             found = 1; | ||||
|             i = resources->count_connectors;   // uuuuhh  | ||||
|             i = resources->count_connectors;   // uuuuhh | ||||
|         } | ||||
|         VideoWindowWidth = render->mode.hdisplay; | ||||
|         VideoWindowHeight = render->mode.vdisplay; | ||||
| @@ -348,7 +348,7 @@ static int FindDevice(VideoRender * render) | ||||
|         printf("Requested Connector not found or not connected\n"); | ||||
|         return -1; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     // find first plane | ||||
|     if ((plane_res = drmModeGetPlaneResources(render->fd_drm)) == NULL) | ||||
|         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], | ||||
|                             DRM_MODE_OBJECT_PLANE, "type"); | ||||
|         uint64_t zpos = 0;   | ||||
|         uint64_t zpos = 0; | ||||
|  | ||||
| #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", | ||||
| @@ -384,7 +384,7 @@ static int FindDevice(VideoRender * render) | ||||
|                     case DRM_FORMAT_ARGB8888: | ||||
| #else | ||||
| 					case DRM_FORMAT_XRGB2101010: | ||||
| #endif	 | ||||
| #endif | ||||
|                         if (!render->video_plane) { | ||||
|                             render->video_plane = plane->plane_id; | ||||
|                         } | ||||
| @@ -419,25 +419,25 @@ static int FindDevice(VideoRender * render) | ||||
| void VideoInitDrm() | ||||
| { | ||||
|     int i; | ||||
|      | ||||
| 	 | ||||
|  | ||||
|  | ||||
|     if (!(render = calloc(1, sizeof(*render)))) { | ||||
|         Fatal(_("video/DRM: out of memory\n")); | ||||
|         return; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     if (FindDevice(render)){ | ||||
|         Fatal(_( "VideoInit: FindDevice() failed\n")); | ||||
|     } | ||||
| 	 | ||||
|  | ||||
|     gbm.dev = gbm_create_device (render->fd_drm); | ||||
|     assert (gbm.dev != NULL); | ||||
|      | ||||
|  | ||||
|     PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL; | ||||
|     get_platform_display = | ||||
|         (void *) eglGetProcAddress("eglGetPlatformDisplay"); | ||||
|     assert(get_platform_display != NULL); | ||||
|      | ||||
|  | ||||
|     eglDisplay = get_platform_display(EGL_PLATFORM_GBM_KHR, gbm.dev, NULL); | ||||
|  | ||||
|     assert (eglDisplay != NULL); | ||||
| @@ -462,22 +462,21 @@ void VideoInitDrm() | ||||
|                         DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", render->crtc_id); | ||||
|     SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id, | ||||
|                         DRM_MODE_OBJECT_CRTC, "ACTIVE", 1); | ||||
|     | ||||
|  | ||||
|     if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0) | ||||
|         fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno); | ||||
|      | ||||
|  | ||||
|     if (drmModeDestroyPropertyBlob(render->fd_drm, modeID) != 0) | ||||
|         fprintf(stderr, "cannot destroy property blob (%d): %m\n", errno); | ||||
|      | ||||
|  | ||||
|     drmModeAtomicFree(ModeReq); | ||||
|  | ||||
| } | ||||
|  | ||||
| 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 * render->mmHeight; | ||||
|     *den = VideoWindowHeight * render->mmWidth; | ||||
|     *num = VideoWindowWidth; | ||||
|     *den = VideoWindowHeight; | ||||
| } | ||||
|  | ||||
| struct gbm_bo *bo = NULL, *next_bo=NULL; | ||||
| @@ -488,8 +487,8 @@ static int old_color=-1,old_trc=-1; | ||||
| void InitBo(int bpp) { | ||||
|     // create the GBM and EGL surface | ||||
|     render->bpp = bpp; | ||||
|     gbm.surface = gbm_surface_create (gbm.dev, VideoWindowWidth,VideoWindowHeight,  | ||||
|                                       bpp==10?GBM_FORMAT_XRGB2101010:GBM_FORMAT_ARGB8888,  | ||||
|     gbm.surface = gbm_surface_create (gbm.dev, VideoWindowWidth,VideoWindowHeight, | ||||
|                                       bpp==10?GBM_FORMAT_XRGB2101010:GBM_FORMAT_ARGB8888, | ||||
|                                       GBM_BO_USE_SCANOUT|GBM_BO_USE_RENDERING); | ||||
|     assert(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 void drm_swap_buffers () { | ||||
|      | ||||
|  | ||||
|     uint32_t fb; | ||||
|      | ||||
|     eglSwapBuffers (eglDisplay, eglSurface);	 | ||||
|  | ||||
|     eglSwapBuffers (eglDisplay, eglSurface); | ||||
|     struct gbm_bo *bo = gbm_surface_lock_front_buffer (gbm.surface); | ||||
| #if 1 | ||||
|     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); | ||||
| //  drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode); | ||||
|     | ||||
|  | ||||
|     if (m_need_modeset) { | ||||
|         drmModeAtomicReqPtr ModeReq; | ||||
|         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); | ||||
|             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, | ||||
|                             DRM_MODE_OBJECT_CRTC, "ACTIVE", 0);      | ||||
|                             DRM_MODE_OBJECT_CRTC, "ACTIVE", 0); | ||||
|         if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0) | ||||
|             fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno); | ||||
|         sleep(2); | ||||
|          | ||||
|  | ||||
|         SetPropertyRequest(ModeReq, render->fd_drm, render->connector_id, | ||||
|                             DRM_MODE_OBJECT_CONNECTOR, "Colorspace",old_color==AVCOL_PRI_BT2020?9:2 ); | ||||
|         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); | ||||
|         SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id, | ||||
|                             DRM_MODE_OBJECT_CRTC, "ACTIVE", 1); | ||||
|          | ||||
|  | ||||
|         if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0) | ||||
|             fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno); | ||||
|  | ||||
| @@ -558,7 +557,7 @@ static void drm_swap_buffers () { | ||||
|         m_need_modeset = 0; | ||||
|     } | ||||
|     drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode); | ||||
|      | ||||
|  | ||||
|     if (previous_bo) { | ||||
|         drmModeRmFB (render->fd_drm, previous_fb); | ||||
|         gbm_surface_release_buffer (gbm.surface, previous_bo); | ||||
| @@ -579,15 +578,15 @@ static void drm_clean_up () { | ||||
|         drmModeRmFB (render->fd_drm, previous_fb); | ||||
|         gbm_surface_release_buffer (gbm.surface, previous_bo); | ||||
|     } | ||||
| 	 | ||||
|  | ||||
|     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); | ||||
|     drmModeFreeCrtc (render->saved_crtc); | ||||
| 	 | ||||
|  | ||||
|     if (render->hdr_blob_id) | ||||
|         drmModeDestroyPropertyBlob(render->fd_drm, render->hdr_blob_id); | ||||
| 	render->hdr_blob_id = 0; | ||||
| 	 | ||||
|  | ||||
|     eglDestroySurface (eglDisplay, eglSurface); | ||||
| 	EglCheck(); | ||||
|     gbm_surface_destroy (gbm.surface); | ||||
| @@ -597,9 +596,9 @@ static void drm_clean_up () { | ||||
| 	EglCheck(); | ||||
| 	eglSharedContext = NULL; | ||||
|  | ||||
|     eglTerminate (eglDisplay);	 | ||||
|     eglTerminate (eglDisplay); | ||||
| 	EglCheck(); | ||||
| 	 | ||||
|  | ||||
|     gbm_device_destroy (gbm.dev); | ||||
| 	drmDropMaster(render->fd_drm); | ||||
|     close (render->fd_drm); | ||||
|   | ||||
							
								
								
									
										41
									
								
								hdr.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								hdr.c
									
									
									
									
									
								
							| @@ -334,11 +334,11 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid | ||||
|     int max_lum=4000,min_lum=0050; | ||||
|     struct AVMasteringDisplayMetadata *md = NULL; | ||||
|     struct AVContentLightMetadata *ld = NULL; | ||||
| 	 | ||||
|  | ||||
|     if (render->hdr_metadata == -1) { // Metadata not supported | ||||
| 		return; | ||||
| 	} | ||||
|      | ||||
|  | ||||
|     // clean up FFMEPG stuff | ||||
|     if (trc == AVCOL_TRC_BT2020_10) | ||||
|         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; | ||||
|     if (color == AVCOL_PRI_UNSPECIFIED) | ||||
|         color = AVCOL_PRI_BT709; | ||||
|      | ||||
|  | ||||
|     if ((old_color == color && old_trc == trc && !sd1 && !sd2) || !render->hdr_metadata) | ||||
|         return;  // nothing to do | ||||
|      | ||||
|  | ||||
|     if (sd1) | ||||
|         md = sd1->data; | ||||
|          | ||||
|  | ||||
|     if (sd2) | ||||
|         ld = sd2->data; | ||||
|      | ||||
|  | ||||
|     if (md && !memcmp(md,&md_save,sizeof(md_save))) | ||||
|         if (ld && !memcmp(ld,&ld_save,sizeof(ld_save))) { | ||||
|             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))) { | ||||
|         return; | ||||
|     } | ||||
|          | ||||
|  | ||||
|     if (ld) | ||||
|         memcpy(&ld_save,ld,sizeof(ld_save)); | ||||
|     if (md) | ||||
|         memcpy(&md_save,md,sizeof(md_save)); | ||||
|          | ||||
|  | ||||
|     Debug(3,"Update HDR to TRC %d color %d\n",trc,color); | ||||
|  | ||||
|     if (trc == AVCOL_TRC_BT2020_10) | ||||
|         trc = AVCOL_TRC_ARIB_STD_B67; | ||||
|      | ||||
|  | ||||
|     old_color = color; | ||||
|     old_trc = trc; | ||||
|      | ||||
|  | ||||
|     if (render->hdr_blob_id) | ||||
|         drmModeDestroyPropertyBlob(render->fd_drm, render->hdr_blob_id); | ||||
|      | ||||
|  | ||||
|     switch(trc) { | ||||
|         case AVCOL_TRC_BT709:                                   // 1 | ||||
|         case AVCOL_TRC_UNSPECIFIED:                             // 2 | ||||
| @@ -387,7 +387,7 @@ static void set_hdr_metadata(int color,int trc, AVFrameSideData *sd1, AVFrameSid | ||||
|             break; | ||||
|         case AVCOL_TRC_BT2020_10:                               // 14 | ||||
|         case AVCOL_TRC_BT2020_12: | ||||
|         case AVCOL_TRC_ARIB_STD_B67:                            // 18 HLG            | ||||
|         case AVCOL_TRC_ARIB_STD_B67:                            // 18 HLG | ||||
|             eotf = EOTF_HLG; | ||||
|             break; | ||||
|         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; | ||||
|             break; | ||||
|     } | ||||
|              | ||||
|  | ||||
|     switch (color) { | ||||
|         case AVCOL_PRI_BT709:                                   // 1 | ||||
|         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"); | ||||
|             break; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     if (md) {       // we got Metadata | ||||
|         if (md->has_primaries) { | ||||
|             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) | ||||
|                 MaxFALL,        // Maximum Frame-Average Light Level (MaxFALL) | ||||
|                 eotf); | ||||
|      | ||||
|  | ||||
|      | ||||
|  | ||||
|  | ||||
|     ret = drmModeCreatePropertyBlob(render->fd_drm, &data, sizeof(data), &render->hdr_blob_id); | ||||
|     if (ret) { | ||||
|         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); | ||||
|     if (ret) { | ||||
|         printf("DRM: HDR metadata: failed property set %d\n",ret); | ||||
|               | ||||
|  | ||||
|         if (render->hdr_blob_id) | ||||
|             drmModeDestroyPropertyBlob(render->fd_drm, render->hdr_blob_id); | ||||
| 		render->hdr_blob_id = 0; | ||||
|         return; | ||||
|     } | ||||
|     m_need_modeset = 1; | ||||
|          | ||||
|     Debug(3,"DRM: HDR metadata: prop set\n"); | ||||
|             | ||||
| } | ||||
|  | ||||
|     Debug(3,"DRM: HDR metadata: prop set\n"); | ||||
|  | ||||
| } | ||||
|   | ||||
							
								
								
									
										1009
									
								
								openglosd.cpp
									
									
									
									
									
								
							
							
						
						
									
										1009
									
								
								openglosd.cpp
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										40
									
								
								po/de_DE.po
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								po/de_DE.po
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: VDR \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" | ||||
| "Last-Translator: blabla\n" | ||||
| "Language-Team: blabla\n" | ||||
| @@ -263,9 +263,6 @@ msgstr "" | ||||
| msgid "codec: can't allocate video codec context\n" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "VAAPI Refcounts invalid\n" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "codec: can't set option deint to video codec!\n" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -306,24 +303,6 @@ msgstr "" | ||||
| msgid "codec/audio: decoded data smaller than encoded\n" | ||||
| 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" | ||||
| 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)" | ||||
|  | ||||
| #, c-format | ||||
| msgid " Frame Process time %2.2fms" | ||||
| msgid " Video %dx%d Color: %s Gamma: %s" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "pass-through disabled" | ||||
| @@ -807,10 +786,6 @@ msgstr "" | ||||
| msgid "video/glx: no GLX support\n" | ||||
| msgstr "" | ||||
|  | ||||
| #, c-format | ||||
| msgid "video/glx: glx version %d.%d\n" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "did not get FBconfig" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -898,11 +873,10 @@ msgid "Failed rendering frame!\n" | ||||
| msgstr "" | ||||
|  | ||||
| #, 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 "" | ||||
|  | ||||
| #, c-format | ||||
| msgid "video/vdpau: pixel format %d not supported\n" | ||||
| msgid "Could not dynamically load CUDA\n" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Kein Cuda device gefunden" | ||||
| @@ -943,12 +917,6 @@ msgstr "" | ||||
| msgid "video/egl: can't create thread egl context\n" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "video: can't queue cancel video display thread\n" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "video: can't cancel video display thread\n" | ||||
| msgstr "" | ||||
|  | ||||
| #, c-format | ||||
| msgid "video: repeated pict %d found, but not handled\n" | ||||
| msgstr "" | ||||
|   | ||||
							
								
								
									
										315
									
								
								shaders.h
									
									
									
									
									
								
							
							
						
						
									
										315
									
								
								shaders.h
									
									
									
									
									
								
							| @@ -11,7 +11,6 @@ const char *gl_version = "#version 300 es "; | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* Color conversion matrix: RGB = m * YUV + c | ||||
|  * m is in row-major matrix, with m[row][col], e.g.: | ||||
|  *     [ 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) | ||||
| static const float PQ_M1 = 2610./4096 * 1./4, | ||||
|                    PQ_M2 = 2523./4096 * 128, | ||||
|                    PQ_C1 = 3424./4096, | ||||
|                    PQ_C2 = 2413./4096 * 32, | ||||
|                    PQ_C3 = 2392./4096 * 32; | ||||
| static const float PQ_M1 = 2610. / 4096 * 1. / 4, PQ_M2 = 2523. / 4096 * 128, PQ_C1 = 3424. / 4096, PQ_C2 = | ||||
|     2413. / 4096 * 32, PQ_C3 = 2392. / 4096 * 32; | ||||
|  | ||||
| // Common constants for ARIB STD-B67 (HLG) | ||||
| static const float HLG_A = 0.17883277, | ||||
|                    HLG_B = 0.28466892, | ||||
|                    HLG_C = 0.55991073; | ||||
| static const float HLG_A = 0.17883277, HLG_B = 0.28466892, HLG_C = 0.55991073; | ||||
|  | ||||
| struct gl_vao_entry | ||||
| { | ||||
| @@ -124,48 +118,55 @@ static const struct gl_vao_entry vertex_vao[] = { | ||||
| char sh[SHADER_LENGTH]; | ||||
| char shv[SHADER_LENGTH]; | ||||
|  | ||||
| GL_init() { | ||||
| 	sh[0] = 0; | ||||
| GL_init() | ||||
| { | ||||
|     sh[0] = 0; | ||||
| } | ||||
| GLV_init() { | ||||
| 	shv[0] = 0; | ||||
|  | ||||
| GLV_init() | ||||
| { | ||||
|     shv[0] = 0; | ||||
| } | ||||
| pl_shader_append(const char *fmt, ...) { | ||||
| 	char temp[1000]; | ||||
| 	va_list ap; | ||||
| 	 | ||||
|  | ||||
| pl_shader_append(const char *fmt, ...) | ||||
| { | ||||
|     char temp[1000]; | ||||
|     va_list ap; | ||||
|  | ||||
|     va_start(ap, fmt); | ||||
| 	vsprintf(temp,fmt,ap); | ||||
| 	va_end(ap); | ||||
| 	 | ||||
| 	if (strlen(sh) + strlen(temp) > SHADER_LENGTH) | ||||
| 		Fatal(_("Shaderlenght fault\n")); | ||||
| 	strcat(sh,temp); | ||||
|     vsprintf(temp, fmt, ap); | ||||
|     va_end(ap); | ||||
|  | ||||
|     if (strlen(sh) + strlen(temp) > SHADER_LENGTH) | ||||
|         Fatal(_("Shaderlenght fault\n")); | ||||
|     strcat(sh, temp); | ||||
|  | ||||
| } | ||||
|  | ||||
| pl_shader_append_v(const char *fmt, ...) { | ||||
| 	char temp[1000]; | ||||
| 	va_list ap; | ||||
| 	 | ||||
| pl_shader_append_v(const char *fmt, ...) | ||||
| { | ||||
|     char temp[1000]; | ||||
|     va_list ap; | ||||
|  | ||||
|     va_start(ap, fmt); | ||||
| 	vsprintf(temp,fmt,ap); | ||||
| 	va_end(ap); | ||||
| 	 | ||||
| 	if (strlen(shv) + strlen(temp) > SHADER_LENGTH) | ||||
| 		Fatal(_("Shaderlenght fault\n")); | ||||
| 	strcat(shv,temp); | ||||
|     vsprintf(temp, fmt, ap); | ||||
|     va_end(ap); | ||||
|  | ||||
|     if (strlen(shv) + strlen(temp) > SHADER_LENGTH) | ||||
|         Fatal(_("Shaderlenght fault\n")); | ||||
|     strcat(shv, temp); | ||||
|  | ||||
| } | ||||
|  | ||||
| static void compile_attach_shader(GLuint program, GLenum type, const char *source) | ||||
| { | ||||
|     GLuint shader; | ||||
|     GLint status=1234, log_length; | ||||
|     GLint status = 1234, log_length; | ||||
|     char log[4000]; | ||||
|     GLsizei len; | ||||
|  | ||||
|     shader = glCreateShader(type); | ||||
|     glShaderSource(shader, 1, (const GLchar **)&source, NULL); // &buffer, NULL); | ||||
|     glShaderSource(shader, 1, (const GLchar **)&source, NULL);  // &buffer, NULL); | ||||
|     glCompileShader(shader); | ||||
|     status = 0; | ||||
|     glGetShaderiv(shader, GL_COMPILE_STATUS, &status); | ||||
| @@ -198,42 +199,42 @@ static GLuint sc_generate_osd(GLuint gl_prog) | ||||
|     Debug(3, "vor create osd\n"); | ||||
|     gl_prog = glCreateProgram(); | ||||
|  | ||||
| 	GL_init(); | ||||
| 	GLSL("%s\n",gl_version); | ||||
| 	GLSL("in vec2 vertex_position;\n"); | ||||
| 	GLSL("in vec2 vertex_texcoord0;\n"); | ||||
| 	GLSL("out vec2 texcoord0;\n"); | ||||
| 	GLSL("void main() {\n"); | ||||
| 	GLSL("gl_Position = vec4(vertex_position, 1.0, 1.0);\n"); | ||||
| 	GLSL("texcoord0 = vertex_texcoord0;\n"); | ||||
| 	GLSL("}\n"); | ||||
| 		 | ||||
|     GL_init(); | ||||
|     GLSL("%s\n", gl_version); | ||||
|     GLSL("in vec2 vertex_position;\n"); | ||||
|     GLSL("in vec2 vertex_texcoord0;\n"); | ||||
|     GLSL("out vec2 texcoord0;\n"); | ||||
|     GLSL("void main() {\n"); | ||||
|     GLSL("gl_Position = vec4(vertex_position, 1.0, 1.0);\n"); | ||||
|     GLSL("texcoord0 = vertex_texcoord0;\n"); | ||||
|     GLSL("}\n"); | ||||
|  | ||||
|     Debug(3, "vor compile vertex osd\n"); | ||||
|     compile_attach_shader(gl_prog, GL_VERTEX_SHADER, sh); // vertex_osd); | ||||
| 	GL_init();	 | ||||
| 	GLSL("%s\n",gl_version); | ||||
| 	GLSL("#define texture1D texture\n"); | ||||
| 	GLSL("precision mediump float; \n"); | ||||
| 	GLSL("layout(location = 0) out vec4 out_color;\n"); | ||||
| 	GLSL("in vec2 texcoord0;\n"); | ||||
| 	GLSL("uniform sampler2D texture0;\n"); | ||||
| 	GLSL("void main() {\n"); | ||||
| 	GLSL("vec4 color; \n"); | ||||
| 	GLSL("color = vec4(texture(texture0, texcoord0));\n"); | ||||
|     compile_attach_shader(gl_prog, GL_VERTEX_SHADER, sh);   // vertex_osd); | ||||
|     GL_init(); | ||||
|     GLSL("%s\n", gl_version); | ||||
|     GLSL("#define texture1D texture\n"); | ||||
|     GLSL("precision mediump float; \n"); | ||||
|     GLSL("layout(location = 0) out vec4 out_color;\n"); | ||||
|     GLSL("in vec2 texcoord0;\n"); | ||||
|     GLSL("uniform sampler2D texture0;\n"); | ||||
|     GLSL("void main() {\n"); | ||||
|     GLSL("vec4 color; \n"); | ||||
|     GLSL("color = vec4(texture(texture0, texcoord0));\n"); | ||||
| #ifdef GAMMA | ||||
| 		GLSL("// delinearize gamma                     \n"); | ||||
| 		GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0);  \n");    // delinearize gamma | ||||
| 		GLSL("color.rgb = pow(color.rgb, vec3(2.4));   \n"); | ||||
|     GLSL("// delinearize gamma                     \n"); | ||||
|     GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0);  \n");    // delinearize gamma | ||||
|     GLSL("color.rgb = pow(color.rgb, vec3(2.4));   \n"); | ||||
| #endif | ||||
| 	GLSL("out_color = color;\n"); | ||||
| 	GLSL("}\n"); | ||||
|     GLSL("out_color = color;\n"); | ||||
|     GLSL("}\n"); | ||||
|     Debug(3, "vor compile fragment osd \n"); | ||||
|     compile_attach_shader(gl_prog, GL_FRAGMENT_SHADER, sh); //fragment_osd); | ||||
|     glBindAttribLocation(gl_prog, 0, "vertex_position"); | ||||
|     glBindAttribLocation(gl_prog, 1, "vertex_texcoord0"); | ||||
|  | ||||
|     link_shader(gl_prog); | ||||
| 	 | ||||
|  | ||||
|     return gl_prog; | ||||
| } | ||||
|  | ||||
| @@ -245,34 +246,33 @@ static GLuint sc_generate(GLuint gl_prog, enum AVColorSpace colorspace) | ||||
|     GLint cmsLoc; | ||||
|     float *m, *c, *cms; | ||||
|     char *frag; | ||||
| 	 | ||||
| 	GL_init(); | ||||
| 	GLSL("%s\n",gl_version); | ||||
| 	GLSL("in vec2 vertex_position;      \n"); | ||||
| 	GLSL("in vec2 vertex_texcoord0;     \n"); | ||||
| 	GLSL("out vec2 texcoord0;           \n"); | ||||
| 	GLSL("in vec2 vertex_texcoord1;     \n"); | ||||
| 	GLSL("out vec2 texcoord1;           \n"); | ||||
| 	if (Planes == 3) { | ||||
| 		GLSL("in vec2 vertex_texcoord2; \n"); | ||||
| 		GLSL("out vec2 texcoord2;       \n");	 | ||||
| 	} | ||||
| 	GLSL("void main() {                 \n"); | ||||
| 	GLSL("gl_Position = vec4(vertex_position, 1.0, 1.0);\n"); | ||||
| 	GLSL("texcoord0 = vertex_texcoord0; \n"); | ||||
| 	GLSL("texcoord1 = vertex_texcoord1; \n"); | ||||
| 	if (Planes == 3) { | ||||
| 		GLSL("texcoord2 = vertex_texcoord1; \n");  // texcoord1 ist hier richtig | ||||
| 	} | ||||
| 	GLSL("}                             \n"); | ||||
| 	 | ||||
|  | ||||
|     GL_init(); | ||||
|     GLSL("%s\n", gl_version); | ||||
|     GLSL("in vec2 vertex_position;      \n"); | ||||
|     GLSL("in vec2 vertex_texcoord0;     \n"); | ||||
|     GLSL("out vec2 texcoord0;           \n"); | ||||
|     GLSL("in vec2 vertex_texcoord1;     \n"); | ||||
|     GLSL("out vec2 texcoord1;           \n"); | ||||
|     if (Planes == 3) { | ||||
|         GLSL("in vec2 vertex_texcoord2; \n"); | ||||
|         GLSL("out vec2 texcoord2;       \n"); | ||||
|     } | ||||
|     GLSL("void main() {                 \n"); | ||||
|     GLSL("gl_Position = vec4(vertex_position, 1.0, 1.0);\n"); | ||||
|     GLSL("texcoord0 = vertex_texcoord0; \n"); | ||||
|     GLSL("texcoord1 = vertex_texcoord1; \n"); | ||||
|     if (Planes == 3) { | ||||
|         GLSL("texcoord2 = vertex_texcoord1; \n");   // texcoord1 ist hier richtig | ||||
|     } | ||||
|     GLSL("}                             \n"); | ||||
|  | ||||
|     Debug(3, "vor create\n"); | ||||
|     gl_prog = glCreateProgram(); | ||||
|     Debug(3, "vor compile vertex\n"); | ||||
| //	printf("%s",sh); | ||||
|     compile_attach_shader(gl_prog, GL_VERTEX_SHADER, sh );  | ||||
| 	 | ||||
| 	 | ||||
| //  printf("%s",sh); | ||||
|     compile_attach_shader(gl_prog, GL_VERTEX_SHADER, sh); | ||||
|  | ||||
|     switch (colorspace) { | ||||
|         case AVCOL_SPC_RGB: | ||||
|             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); | ||||
|             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 = clamp(color.rgb, 0.0, 1.0);    \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(0.55991073)) * vec3(1.0/0.17883277)) + vec3(0.28466892), bvec3(lessThan(vec3(0.5), color.rgb)));\n"); | ||||
| 		GLSL("// color mapping                           \n"); | ||||
| 		GLSL("color.rgb = cms_matrix * color.rgb;        \n"); | ||||
| #ifndef GAMMA	 | ||||
| 		GLSL("// pl_shader_delinearize                   \n"); | ||||
| 		GLSL("color.rgb = max(color.rgb, 0.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 = 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 = clamp(color.rgb, 0.0, 1.0);    \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(0.55991073)) * vec3(1.0/0.17883277)) + vec3(0.28466892), bvec3(lessThan(vec3(0.5), color.rgb)));\n"); | ||||
|         GLSL("// color mapping                           \n"); | ||||
|         GLSL("color.rgb = cms_matrix * color.rgb;        \n"); | ||||
| #ifndef GAMMA | ||||
|         GLSL("// pl_shader_delinearize                   \n"); | ||||
|         GLSL("color.rgb = max(color.rgb, 0.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 = 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 | ||||
| 		GLSL("out_color = color;                         \n"); | ||||
| 		GLSL("} \n");		 | ||||
| 	} | ||||
| 	else {		 | ||||
|         GLSL("out_color = color;                         \n"); | ||||
|         GLSL("} \n"); | ||||
|     } else { | ||||
|  | ||||
| 		GLSL("color.r =  1.000000 * vec4(texture(texture0, texcoord0)).r;  \n"); | ||||
| 		if (Planes == 3) { | ||||
| 			GLSL("color.g = 1.000000 * vec4(texture(texture1, texcoord1)).r;\n"); | ||||
| 			GLSL("color.b = 1.000000 * vec4(texture(texture2, texcoord2)).r;\n"); | ||||
| 		} else { | ||||
| 			GLSL("color.gb = 1.000000 * 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("color.r =  1.000000 * vec4(texture(texture0, texcoord0)).r;  \n"); | ||||
|         if (Planes == 3) { | ||||
|             GLSL("color.g = 1.000000 * vec4(texture(texture1, texcoord1)).r;\n"); | ||||
|             GLSL("color.b = 1.000000 * vec4(texture(texture2, texcoord2)).r;\n"); | ||||
|         } else { | ||||
|             GLSL("color.gb = 1.000000 * 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("// linearize gamma                     \n"); | ||||
| 		GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0);  \n");    // linearize gamma | ||||
| 		GLSL("color.rgb = pow(color.rgb, vec3(2.4));   \n"); | ||||
| #ifndef GAMMA	 | ||||
| 		GLSL("// delinearize gamma to sRGB               \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("// linearize gamma                     \n"); | ||||
|         GLSL("color.rgb = clamp(color.rgb, 0.0, 1.0);  \n");    // linearize gamma | ||||
|         GLSL("color.rgb = pow(color.rgb, vec3(2.4));   \n"); | ||||
| #ifndef GAMMA | ||||
|         GLSL("// delinearize gamma to sRGB               \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"); | ||||
| #endif | ||||
| 		GLSL("// color mapping            \n"); | ||||
| 		GLSL("out_color = color;          \n"); | ||||
| 		GLSL("} \n"); | ||||
| 	} | ||||
|         GLSL("// color mapping            \n"); | ||||
|         GLSL("out_color = color;          \n"); | ||||
|         GLSL("} \n"); | ||||
|     } | ||||
| //printf(">%s<",sh); | ||||
|     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"); | ||||
|  | ||||
|     for (n = 0; n < 6; n++) { | ||||
|   | ||||
| @@ -1096,10 +1096,10 @@ void cMenuSetupSoft::Create(void) | ||||
|         "auto", "1920x1080", "1280x720", "custom", | ||||
|     }; | ||||
|     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[] = { | ||||
|         "pan&scan", "pillarbox", "center cut-out", | ||||
|         "pan&scan", "pillarbox", "center cut-out", "original" | ||||
|     }; | ||||
| #ifdef YADIF | ||||
|     static const char *const deinterlace[] = { | ||||
| @@ -1133,7 +1133,7 @@ void cMenuSetupSoft::Create(void) | ||||
|     static char *scalingtest[100]; | ||||
|  | ||||
|     if (scalers == 0) { | ||||
|         scalingtest[0] = (char *) "Off"; | ||||
|         scalingtest[0] = (char *)"Off"; | ||||
|         for (scalers = 0; pl_named_filters[scalers].filter != NULL; scalers++) { | ||||
|             scaling[scalers] = (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, | ||||
|                 trVDR("no"), trVDR("yes"))); | ||||
| #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)); | ||||
|         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)); | ||||
|  | ||||
| #if 0 | ||||
| @@ -2153,10 +2153,10 @@ void cSoftHdMenu::Create(void) | ||||
|     int dropped; | ||||
|     int counter; | ||||
|     float frametime; | ||||
| 	int width,height; | ||||
| 	int color; | ||||
| 	int eotf; | ||||
| 	char *colorstr, *eotfstr; | ||||
|     int width, height; | ||||
|     int color; | ||||
|     int eotf; | ||||
|     char *colorstr, *eotfstr; | ||||
|  | ||||
|     current = Current();                // get current menu item index | ||||
|     Clear();                            // clear the menu | ||||
| @@ -2191,8 +2191,8 @@ void cSoftHdMenu::Create(void) | ||||
| #endif | ||||
|     Add(new cOsdItem(NULL, osUnknown, false)); | ||||
|     Add(new cOsdItem(NULL, osUnknown, false)); | ||||
|     GetStats(&missed, &duped, &dropped, &counter, &frametime, &width, &height, &color,&eotf); | ||||
| 	switch (color) { | ||||
|     GetStats(&missed, &duped, &dropped, &counter, &frametime, &width, &height, &color, &eotf); | ||||
|     switch (color) { | ||||
|         case AVCOL_SPC_RGB: | ||||
|             colorstr = strdup("BT 601"); | ||||
|             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, | ||||
|                 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(" Frame Process time %2.2fms"), frametime), 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(" Frame Process time %2.2fms"), frametime), osUnknown, false)); | ||||
|     SetCurrent(Get(current));           // restore selected menu entry | ||||
|     Display();                          // display build menu | ||||
| } | ||||
|   | ||||
							
								
								
									
										31
									
								
								softhddev.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								softhddev.c
									
									
									
									
									
								
							| @@ -645,7 +645,7 @@ static void PesParse(PesDemux * pesdx, const uint8_t * data, int size, int is_st | ||||
|                 q = pesdx->Buffer + pesdx->Skip; | ||||
|                 n = pesdx->Index - pesdx->Skip; | ||||
|                 while (n >= 5) { | ||||
|                     int r=0; | ||||
|                     int r = 0; | ||||
|                     unsigned codec_id = AV_CODEC_ID_NONE; | ||||
|  | ||||
|                     // 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" | ||||
|         "  -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" | ||||
|         "  -g geometry\tx11 window geometry wxh+x+y\n"  | ||||
| 		"  -r Refresh\tRefreshrate for DRM (default is 50 Hz)\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" "  -x\t\tstart x11 server, with -xx try to connect, if this fails\n" | ||||
|         "  -g geometry\tx11 window geometry wxh+x+y\n" "  -r Refresh\tRefreshrate for DRM (default is 50 Hz)\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" | ||||
|         "  -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" | ||||
|         "\tno-hw-decoder\t\tdisable hw decoder, use software decoder 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; | ||||
|             case 'C':                  // Connector for DRM | ||||
|                 VideoSetConnector(optarg); | ||||
|                 continue;	 | ||||
| 			case 'r':                  // Connector for DRM | ||||
|                 continue; | ||||
|             case 'r':                  // Connector for DRM | ||||
|                 VideoSetRefresh(optarg); | ||||
|                 continue;	 | ||||
|                 continue; | ||||
|             case 'p':                  // pass-through audio device | ||||
|                 AudioSetPassthroughDevice(optarg); | ||||
|                 continue; | ||||
| @@ -3369,19 +3368,21 @@ void Resume(void) | ||||
| **  @param[out] dropped dropped 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; | ||||
|     *duped = 0; | ||||
|     *dropped = 0; | ||||
|     *counter = 0; | ||||
|     *frametime = 0.0f; | ||||
| 	*width = 0; | ||||
| 	*height = 0; | ||||
| 	*color = NULL; | ||||
| 	*eotf = NULL; | ||||
|     *width = 0; | ||||
|     *height = 0; | ||||
|     *color = NULL; | ||||
|     *eotf = NULL; | ||||
|     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); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user