From bf8a99aa68b9a721eebbd710a7a8e028d1047e43 Mon Sep 17 00:00:00 2001 From: BPanther Date: Sun, 9 May 2021 21:25:43 +0200 Subject: [PATCH] vuduo4k/vuduo4kse/vuultimo4k/vuuno4kse: HDMI input as mode and PiP added Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/d3d0b40f8969f5db3e83dbd941394c334f359e8a Author: BPanther Date: 2021-05-09 (Sun, 09 May 2021) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- include/hardware_caps.h | 1 + libarmbox/audio.cpp | 60 ++++++++++++++++++++++++++++++++++++++ libarmbox/audio_lib.h | 8 ++++- libarmbox/hardware_caps.c | 4 +++ libarmbox/video.cpp | 61 +++++++++++++++++++++++++++++++++++++-- libarmbox/video_lib.h | 7 ++++- libspark/audio.cpp | 10 +++++++ libspark/audio_lib.h | 5 ++++ libspark/video.cpp | 18 ++++++++++++ libspark/video_lib.h | 7 ++++- 10 files changed, 175 insertions(+), 6 deletions(-) diff --git a/include/hardware_caps.h b/include/hardware_caps.h index b8a6948..6fda622 100644 --- a/include/hardware_caps.h +++ b/include/hardware_caps.h @@ -26,6 +26,7 @@ typedef struct hw_caps { int has_fan; int has_HDMI; + int has_HDMI_input; int has_SCART; int has_SCART_input; int has_YUV_cinch; diff --git a/libarmbox/audio.cpp b/libarmbox/audio.cpp index b63c150..d289825 100644 --- a/libarmbox/audio.cpp +++ b/libarmbox/audio.cpp @@ -18,13 +18,31 @@ #define hal_debug(args...) _hal_debug(HAL_DEBUG_AUDIO, this, args) #define hal_info(args...) _hal_info(HAL_DEBUG_AUDIO, this, args) +#define fop(cmd, args...) ({ \ + int _r; \ + if (fd >= 0) { \ + if ((_r = ::cmd(fd, args)) < 0) \ + hal_info(#cmd"(fd, "#args")\n");\ + else \ + hal_debug(#cmd"(fd, "#args")\n");\ + } \ + else { _r = fd; } \ + _r; \ +}) + #include +enum +{ ENCODER, + AUX +}; + cAudio * audioDecoder = NULL; cAudio::cAudio(void *, void *, void *) { fd = -1; + fdd = false; clipfd = -1; mixer_fd = -1; openDevice(); @@ -65,6 +83,48 @@ void cAudio::closeDevice(void) } } +#ifndef AUDIO_SOURCE_HDMI +#define AUDIO_SOURCE_HDMI 2 +#endif + +void cAudio::open_AVInput_Device(void) +{ + hal_debug("%s\n", __func__); + + if (fdd) /* already open */ + return; + + fop(ioctl, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_HDMI); + fop(ioctl, AUDIO_PLAY); + fdd = true; +} + +void cAudio::close_AVInput_Device(void) +{ + hal_debug("%s\n", __func__); + + if (fdd) { + fop(ioctl, AUDIO_STOP); + } + fdd = false; +} + +void cAudio::setAVInput(int val) +{ + hal_info("%s - switching to: %s\n", __func__, val == AUX ? "AUX" : "ENCODER"); + + if (val == AUX) { + Stop(); + open_AVInput_Device(); + } else { + if (fdd) { + close_AVInput_Device(); + fop(ioctl, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX); + Start(); + } + } +} + int cAudio::do_mute(bool enable, bool remember) { hal_debug("%s(%d, %d)\n", __FUNCTION__, enable, remember); diff --git a/libarmbox/audio_lib.h b/libarmbox/audio_lib.h index 2eee1fa..18f0820 100644 --- a/libarmbox/audio_lib.h +++ b/libarmbox/audio_lib.h @@ -25,6 +25,7 @@ class cAudio friend class cPlayback; private: int fd; + bool fdd; bool Muted; int clipfd; /* for pcm playback */ @@ -39,15 +40,20 @@ class cAudio int do_mute(bool enable, bool remember); void setBypassMode(bool disable); - public: /* construct & destruct */ cAudio(void *, void *, void *); ~cAudio(void); + /* used internally by playback */ void openDevice(void); void closeDevice(void); + void open_AVInput_Device(void); + void close_AVInput_Device(void); + + void setAVInput(int val); + void *GetHandle() { return NULL; }; /* shut up */ int mute(bool remember = true) { return do_mute(true, remember); }; diff --git a/libarmbox/hardware_caps.c b/libarmbox/hardware_caps.c index 7d00118..a741697 100644 --- a/libarmbox/hardware_caps.c +++ b/libarmbox/hardware_caps.c @@ -68,6 +68,7 @@ hw_caps_t *get_hwcaps(void) caps.has_button_timer = 1; caps.has_button_vformat = 0; caps.has_HDMI = 2; + caps.has_HDMI_input = 1; strcpy(caps.startup_file, "STARTUP"); strcpy(caps.boxvendor, "VU+"); strcpy(caps.boxname, "DUO4K"); @@ -88,6 +89,7 @@ hw_caps_t *get_hwcaps(void) caps.display_has_colon = 0; caps.has_button_timer = 1; caps.has_HDMI = 2; + caps.has_HDMI_input = 1; strcpy(caps.startup_file, "STARTUP"); strcpy(caps.boxvendor, "VU+"); strcpy(caps.boxname, "DUO4KSE"); @@ -110,6 +112,7 @@ hw_caps_t *get_hwcaps(void) caps.has_button_timer = 1; caps.has_button_vformat = 0; caps.has_HDMI = 2; + caps.has_HDMI_input = 1; strcpy(caps.startup_file, "STARTUP"); strcpy(caps.boxvendor, "VU+"); strcpy(caps.boxname, "ULTIMO4K"); @@ -152,6 +155,7 @@ hw_caps_t *get_hwcaps(void) caps.has_button_timer = 1; caps.has_button_vformat = 0; caps.has_HDMI = 2; + caps.has_HDMI_input = 1; strcpy(caps.startup_file, "STARTUP"); strcpy(caps.boxvendor, "VU+"); strcpy(caps.boxname, "UNO4KSE"); diff --git a/libarmbox/video.cpp b/libarmbox/video.cpp index b60107c..33f408b 100644 --- a/libarmbox/video.cpp +++ b/libarmbox/video.cpp @@ -57,7 +57,7 @@ extern "C" int _r; \ if (fd >= 0) { \ if ((_r = ::cmd(fd, args)) < 0) \ - hal_info(#cmd"(fd, "#args")\n"); \ + hal_info(#cmd"(fd, "#args")\n");\ else \ hal_debug(#cmd"(fd, "#args")\n");\ } \ @@ -72,6 +72,11 @@ extern "C" #define VIDEO_GET_FRAME_RATE _IOR('o', 56, unsigned int) #endif +enum +{ ENCODER, + AUX +}; + cVideo * videoDecoder = NULL; cVideo * pipDecoder = NULL; @@ -385,15 +390,56 @@ int image_to_mpeg2(const char *image_name, int fd) av_free(formatContext); return ret; } -enum{ENCODER,AUX}; -void setAVInput(int val) + +#ifndef VIDEO_SOURCE_HDMI +#define VIDEO_SOURCE_HDMI 2 +#endif + +void cVideo::open_AVInput_Device(void) { + hal_debug("%s\n", __func__); + + if (fdd) /* already open */ + return; + + fop(ioctl, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_HDMI); + fop(ioctl, VIDEO_PLAY); + fdd = true; +} + +void cVideo::close_AVInput_Device(void) +{ + hal_debug("%s\n", __func__); + + if (fdd) { + fop(ioctl, VIDEO_STOP); + fop(ioctl, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX); + } + fdd = false; +} + +void cVideo::setAVInput(int val) +{ + hal_info("%s - switching to: %s\n", __func__, val == AUX ? "AUX" : "ENCODER"); + + if (val == AUX) { + setBlank(1); + open_AVInput_Device(); + } else { + if (fdd) { + close_AVInput_Device(); + setBlank(0); + } + } + +#if 0 // not working int input_fd = open("/proc/stb/avs/0/input", O_WRONLY); if(input_fd){ const char *input[] = {"encoder", "aux"}; write(input_fd, input[val], strlen(input[val])); close(input_fd); } +#endif } cVideo::cVideo(int, void *, void *, unsigned int unit) @@ -412,14 +458,19 @@ cVideo::cVideo(int, void *, void *, unsigned int unit) } else devnum = unit; fd = -1; + fdd = false; openDevice(); +#if 0 setAVInput(ENCODER); +#endif } cVideo::~cVideo(void) { +#if 0 if(fd >= 0) setAVInput(AUX); +#endif if (hdmi_cec::getInstance()->standby_cec_activ && fd >= 0) hdmi_cec::getInstance()->SetCECState(true); @@ -743,12 +794,16 @@ void cVideo::Standby(unsigned int bOn) if (bOn) { closeDevice(); +#if 0 setAVInput(AUX); +#endif } else { openDevice(); +#if 0 setAVInput(ENCODER); +#endif } video_standby = bOn; hdmi_cec::getInstance()->SetCECState(video_standby); diff --git a/libarmbox/video_lib.h b/libarmbox/video_lib.h index f812204..962dfc8 100644 --- a/libarmbox/video_lib.h +++ b/libarmbox/video_lib.h @@ -161,6 +161,7 @@ class cVideo private: /* video device */ int fd; + bool fdd; unsigned int devnum; /* apparently we cannot query the driver's state => remember it */ @@ -195,7 +196,6 @@ class cVideo /* used internally by dmx */ int64_t GetPTS(void); - public: /* constructor & destructor */ cVideo(int mode, void *, void *, unsigned int unit = 0); @@ -205,6 +205,11 @@ class cVideo void openDevice(void); void closeDevice(void); + void open_AVInput_Device(void); + void close_AVInput_Device(void); + + void setAVInput(int val); + void * GetTVEnc() { return NULL; }; void * GetTVEncSD() { return NULL; }; diff --git a/libspark/audio.cpp b/libspark/audio.cpp index cb1951d..3c8f6b5 100644 --- a/libspark/audio.cpp +++ b/libspark/audio.cpp @@ -20,6 +20,11 @@ #include +enum +{ ENCODER, + AUX +}; + cAudio * audioDecoder = NULL; cAudio::cAudio(void *, void *, void *) @@ -75,6 +80,11 @@ void cAudio::closeDevice(void) } } +void cAudio::setAVInput(int val) +{ + hal_info("%s not implemented yet - switching to: %s\n", __func__, val == AUX ? "AUX" : "ENCODER"); +} + int cAudio::do_mute(bool enable, bool remember) { hal_debug("%s(%d, %d)\n", __FUNCTION__, enable, remember); diff --git a/libspark/audio_lib.h b/libspark/audio_lib.h index 10a1412..57787f6 100644 --- a/libspark/audio_lib.h +++ b/libspark/audio_lib.h @@ -52,6 +52,11 @@ class cAudio cAudio(void *, void *, void *); ~cAudio(void); + void open_AVInput_Device(void) { return; }; + void close_AVInput_Device(void) { return; }; + + void setAVInput(int val); + void *GetHandle() { return NULL; }; /* shut up */ int mute(bool remember = true) { return do_mute(true, remember); }; diff --git a/libspark/video.cpp b/libspark/video.cpp index 9f01bd5..6a2311a 100644 --- a/libspark/video.cpp +++ b/libspark/video.cpp @@ -65,6 +65,11 @@ extern "C" _r; \ }) +enum +{ ENCODER, + AUX +}; + cVideo * videoDecoder = NULL; cVideo * pipDecoder = NULL; @@ -365,6 +370,19 @@ int image_to_mpeg2(const char *image_name, const char *encode_name) return 0; } +void cVideo::setAVInput(int val) +{ + hal_info("%s not implemented yet - switching to: %s\n", __func__, val == AUX ? "SCART" : "ENCODER"); +#if 0 // not working + int input_fd = open("/proc/stb/avs/0/input", O_WRONLY); + if(input_fd){ + const char *input[] = {"encoder", "scart"}; + write(input_fd, input[val], strlen(input[val])); + close(input_fd); + } +#endif +} + cVideo::cVideo(int, void *, void *, unsigned int unit) { hal_debug("%s unit %u\n", __func__, unit); diff --git a/libspark/video_lib.h b/libspark/video_lib.h index 71fdacb..38267ff 100644 --- a/libspark/video_lib.h +++ b/libspark/video_lib.h @@ -128,7 +128,6 @@ typedef enum VIDEO_CONTROL_MAX = VIDEO_CONTROL_SHARPNESS } VIDEO_CONTROL; - class cVideo { friend class cPlayback; @@ -157,6 +156,7 @@ class cVideo int brightness, contrast, saturation, hue; + /* used internally by playback */ void openDevice(void); void closeDevice(void); public: @@ -164,6 +164,11 @@ class cVideo cVideo(int mode, void *, void *, unsigned int unit = 0); ~cVideo(void); + void open_AVInput_Device(void) { return; }; // Dummy + void close_AVInput_Device(void) { return; }; // Dummy + + void setAVInput(int val); + void * GetTVEnc() { return NULL; }; void * GetTVEncSD() { return NULL; };