From 621f6afec8f3c99366d66d4ef5cb489703df5653 Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Thu, 31 May 2018 13:55:54 +0200 Subject: [PATCH 01/29] fix framerate 29970 signalisatiom (by bazi98) Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/e618c66606b0a5241bb81c2596e30cdbaaffc00c Author: Jacek Jendrzej Date: 2018-05-31 (Thu, 31 May 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libarmbox/video.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libarmbox/video.cpp b/libarmbox/video.cpp index 0f8381d..1255b0c 100644 --- a/libarmbox/video.cpp +++ b/libarmbox/video.cpp @@ -708,7 +708,7 @@ static inline int rate2csapi(int rate) return 1; case 25000: return 2; - case 29976: + case 29970: return 3; case 30000: return 4; From e78be631ba63d69080ae6ba46ad1861cbc257ba2 Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Sat, 28 Jul 2018 14:24:12 +0200 Subject: [PATCH 02/29] fix possible segfault Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/5e04171a83982878b338bd7ea83bb503ebea9ac7 Author: Jacek Jendrzej Date: 2018-07-28 (Sat, 28 Jul 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/playback/playback.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libeplayer3-arm/playback/playback.c b/libeplayer3-arm/playback/playback.c index 97e0c9a..098cc4d 100644 --- a/libeplayer3-arm/playback/playback.c +++ b/libeplayer3-arm/playback/playback.c @@ -300,7 +300,8 @@ static int PlaybackPlay(Context_t *context) context->playback->BackWard = 0; context->playback->SlowMotion = 0; context->playback->Speed = 0; - context->container->selectedContainer->Command(context, CONTAINER_STOP, NULL); + if (context->container && context->container->selectedContainer) + context->container->selectedContainer->Command(context, CONTAINER_STOP, NULL); } else { @@ -330,8 +331,8 @@ static int PlaybackPlay(Context_t *context) playback_printf(10, "clearing isCreationPhase!\n"); context->playback->isCreationPhase = 0; // allow thread to go into next state - - ret = context->container->selectedContainer->Command(context, CONTAINER_PLAY, NULL); + if (context->container && context->container->selectedContainer) + ret = context->container->selectedContainer->Command(context, CONTAINER_PLAY, NULL); if (ret != 0) { playback_err("CONTAINER_PLAY failed!\n"); From 5bca6b6844ee863c85a87b0c02ab9927c916897b Mon Sep 17 00:00:00 2001 From: max_10 Date: Wed, 29 Aug 2018 12:13:43 +0200 Subject: [PATCH 03/29] [libarmbox] playback_libeplayer3.cpp code format Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/da6ffe04dcd85b94c499453ac17742929ccf9457 Author: max_10 Date: 2018-08-29 (Wed, 29 Aug 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libarmbox/playback_libeplayer3.cpp | 104 ++++++++++++++++++++++------- 1 file changed, 81 insertions(+), 23 deletions(-) diff --git a/libarmbox/playback_libeplayer3.cpp b/libarmbox/playback_libeplayer3.cpp index 83a75ae..0a2f1ed 100644 --- a/libarmbox/playback_libeplayer3.cpp +++ b/libarmbox/playback_libeplayer3.cpp @@ -47,33 +47,41 @@ bool cPlayback::Open(playmode_t PlayMode) last_size = 0; nPlaybackSpeed = 0; init_jump = -1; + if (player) free(player); player = NULL; + player = (Context_t *) malloc(sizeof(Context_t)); + if (player) { player->playback = &PlaybackHandler; player->output = &OutputHandler; player->container = &ContainerHandler; player->manager = &ManagerHandler; + lt_info("%s - player output name: %s PlayMode: %s\n", __func__, player->output->Name, aPLAYMODE[PlayMode]); } + //Registration of output devices if (player && player->output) { player->output->Command(player, OUTPUT_ADD, (void *)"audio"); player->output->Command(player, OUTPUT_ADD, (void *)"video"); } + return 0; } void cPlayback::Close(void) { lt_info("%s\n", __func__); + //Dagobert: movieplayer does not call stop, it calls close ;) if(playing) Stop(); + if (decoders_closed) { audioDecoder->openDevice(); @@ -92,7 +100,9 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in bool ret = false; bool isHTTP = false; no_probe = false; + lt_info("%s - filename=%s vpid=%u vtype=%d apid=%u ac3=%d\n", __func__, filename, vpid, vtype, apid, ac3); + init_jump = -1; //create playback path mAudioStream = 0; @@ -100,11 +110,14 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in mTeletextStream = -1; unlink("/tmp/.id3coverart"); std::string file; + if (*filename == '/') file = "file://"; file += filename; + if ((file.find(":31339/id=") != std::string::npos) || (file.find(":10000") != std::string::npos) || (file.find(":8001/") != std::string::npos)) // for LocalTV and Entertain-TV streaming no_probe = true; + if (file.substr(0, 7) == "file://") { if (file.substr(file.length() - 3) == ".ts") @@ -117,6 +130,7 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in } else isHTTP = true; + PlayFiles_t playbackFiles = { (char *) file.c_str(), NULL, NULL, NULL, 0, 0, 0, 0}; if (player->playback->Command(player, PLAYBACK_OPEN, &playbackFiles) == 0) { @@ -140,15 +154,16 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in { printf("AudioTrack List\n"); int i = 0; - for (i = 0; TrackList[i] != NULL; i+=2) + for (i = 0; TrackList[i] != NULL; i += 2) { - printf("\t%s - %s\n", TrackList[i], TrackList[i+1]); + printf("\t%s - %s\n", TrackList[i], TrackList[i + 1]); free(TrackList[i]); - free(TrackList[i+1]); + free(TrackList[i + 1]); } free(TrackList); } } + //SUB if (player && player->manager && player->manager->subtitle) { @@ -160,13 +175,14 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in int i = 0; for (i = 0; TrackList[i] != NULL; i+=2) { - printf("\t%s - %s\n", TrackList[i], TrackList[i+1]); + printf("\t%s - %s\n", TrackList[i], TrackList[i + 1]); free(TrackList[i]); - free(TrackList[i+1]); + free(TrackList[i + 1]); } free(TrackList); } } + /* //Teletext if (player && player->manager && player->manager->teletext) @@ -177,15 +193,16 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in { printf("TeletextTrack List\n"); int i = 0; - for (i = 0; TrackList[i] != NULL; i+=2) + for (i = 0; TrackList[i] != NULL; i += 2) { - printf("\t%s - %s\n", TrackList[i], TrackList[i+1]); + printf("\t%s - %s\n", TrackList[i], TrackList[i + 1]); free(TrackList[i]); - free(TrackList[i+1]); + free(TrackList[i + 1]); } free(TrackList); } } + */ //Chapters if (player && player->manager && player->manager->chapter) @@ -196,19 +213,21 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in { printf("Chapter List\n"); int i = 0; - for (i = 0; TrackList[i] != NULL; i+=2) + for (i = 0; TrackList[i] != NULL; i += 2) { - printf("\t%s - %s\n", TrackList[i], TrackList[i+1]); + printf("\t%s - %s\n", TrackList[i], TrackList[i + 1]); free(TrackList[i]); - free(TrackList[i+1]); + free(TrackList[i + 1]); } free(TrackList); } } + playing = true; first = true; player->output->Command(player, OUTPUT_OPEN, NULL); ret = (player->playback->Command(player, PLAYBACK_PLAY, NULL) == 0); + if (ret && !isHTTP) playing = ret = (player->playback->Command(player, PLAYBACK_PAUSE, NULL) == 0); } @@ -219,17 +238,22 @@ bool cPlayback::Start(char *filename, int vpid, int vtype, int apid, int ac3, in bool cPlayback::Stop(void) { lt_info("%s playing %d\n", __func__, playing); + if (player && player->playback) player->playback->Command(player, PLAYBACK_STOP, NULL); + if (player && player->output) player->output->Command(player, OUTPUT_CLOSE, NULL); + if (player && player->output) { player->output->Command(player, OUTPUT_DEL, (void *)"audio"); player->output->Command(player, OUTPUT_DEL, (void *)"video"); } + if (player && player->playback) player->playback->Command(player, PLAYBACK_CLOSE, NULL); + playing = false; return true; } @@ -238,6 +262,7 @@ bool cPlayback::SetAPid(int pid, bool /* ac3 */) { lt_info("%s\n", __func__); int i = pid; + if (pid != mAudioStream) { if (player && player->playback) @@ -257,6 +282,7 @@ bool cPlayback::SetSubtitlePid(int pid) { lt_info("%s\n", __func__); int i = pid; + if (pid != mSubtitleStream) { if (player && player->playback) @@ -269,11 +295,13 @@ bool cPlayback::SetSubtitlePid(int pid) bool cPlayback::SetTeletextPid(int pid) { lt_info("%s\n", __func__); + //int i = pid; + if (pid != mTeletextStream) { - //if(player && player->playback) - //player->playback->Command(player, PLAYBACK_SWITCH_TELETEXT, (void*)&i); + //if (player && player->playback) + // player->playback->Command(player, PLAYBACK_SWITCH_TELETEXT, (void*)&i); mTeletextStream = pid; } return true; @@ -282,6 +310,7 @@ bool cPlayback::SetTeletextPid(int pid) bool cPlayback::SetSpeed(int speed) { lt_info("%s playing %d speed %d\n", __func__, playing, speed); + if (!decoders_closed) { audioDecoder->closeDevice(); @@ -295,12 +324,15 @@ bool cPlayback::SetSpeed(int speed) playing = true; } } + if (!playing) return false; + if (player && player->playback) { int result = 0; nPlaybackSpeed = speed; + if (speed > 1) { /* direction switch ? */ @@ -337,11 +369,13 @@ bool cPlayback::SetSpeed(int speed) { result = player->playback->Command(player, PLAYBACK_CONTINUE, NULL); } + if (init_jump > -1) { SetPosition(init_jump); init_jump = -1; } + if (result != 0) { printf("returning false\n"); @@ -369,6 +403,7 @@ bool cPlayback::GetPosition(int &position, int &duration) { bool got_duration = false; lt_debug("%s %d %d\n", __func__, position, duration); + /* hack: if the file is growing (timeshift), then determine its length * by comparing the mtime with the mtime of the xml file */ if (pm == PLAYMODE_TS) @@ -390,17 +425,21 @@ bool cPlayback::GetPosition(int &position, int &duration) } } } + if (!playing) return false; + if (player && player->playback && !player->playback->isPlaying) { lt_info("%s !!!!EOF!!!! < -1\n", __func__); position = duration + 1000; return false; } + int64_t vpts = 0; if (player && player->playback) player->playback->Command(player, PLAYBACK_PTS, &vpts); + if (vpts <= 0) { //printf("ERROR: vpts==0"); @@ -410,21 +449,31 @@ bool cPlayback::GetPosition(int &position, int &duration) /* len is in nanoseconds. we have 90 000 pts per second. */ position = vpts / 90; } + if (got_duration) return true; + int64_t length = 0; + if (player && player->playback) player->playback->Command(player, PLAYBACK_LENGTH, &length); + if (length <= 0) + { duration = duration + 1000; + } else + { duration = length * 1000; + } + return true; } bool cPlayback::SetPosition(int position, bool absolute) { lt_info("%s %d\n", __func__, position); + if (playing && first) { /* the calling sequence is: @@ -437,9 +486,12 @@ bool cPlayback::SetPosition(int position, bool absolute) first = false; return false; } + int64_t pos = (position / 1000.0); + if (player && player->playback) player->playback->Command(player, absolute ? PLAYBACK_SEEK_ABS : PLAYBACK_SEEK, (void *)&pos); + return true; } @@ -448,6 +500,7 @@ void cPlayback::FindAllPids(int *apids, unsigned int *ac3flags, unsigned int *nu lt_info("%s\n", __func__); int max_numpida = *numpida; *numpida = 0; + if (player && player->manager && player->manager->audio) { char **TrackList = NULL; @@ -467,9 +520,9 @@ void cPlayback::FindAllPids(int *apids, unsigned int *ac3flags, unsigned int *nu { apids[j] = _pid; // atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFLAC - if (!strncmp("A_MPEG/L3", TrackList[i + 1], 9)) + if (!strncmp("A_MPEG/L3", TrackList[i + 1], 9)) ac3flags[j] = 3; - if (!strncmp("A_MP3", TrackList[i + 1], 5)) + if (!strncmp("A_MP3", TrackList[i + 1], 5)) ac3flags[j] = 4; else if (!strncmp("A_AC3", TrackList[i + 1], 5)) ac3flags[j] = 1; @@ -502,8 +555,10 @@ void cPlayback::FindAllPids(int *apids, unsigned int *ac3flags, unsigned int *nu void cPlayback::FindAllSubtitlePids(int *pids, unsigned int *numpids, std::string *language) { lt_info("%s\n", __func__); + int max_numpids = *numpids; *numpids = 0; + if (player && player->manager && player->manager->subtitle) { char **TrackList = NULL; @@ -539,8 +594,8 @@ void cPlayback::FindAllTeletextsubtitlePids(int */*pids*/, unsigned int *numpids lt_info("%s\n", __func__); //int max_numpids = *numpids; *numpids = 0; - /* - if (player && player->manager && player->manager->teletext) + +/* if (player && player->manager && player->manager->teletext) { char **TrackList = NULL; player->manager->teletext->Command(player, MANAGER_LIST, &TrackList); @@ -569,16 +624,15 @@ void cPlayback::FindAllTeletextsubtitlePids(int */*pids*/, unsigned int *numpids free(TrackList); *numpids = j; } - } - */ + } */ } int cPlayback::GetTeletextPid(void) { lt_info("%s\n", __func__); int pid = -1; - /* - if (player && player->manager && player->manager->teletext) + +/* if (player && player->manager && player->manager->teletext) { char **TrackList = NULL; player->manager->teletext->Command(player, MANAGER_LIST, &TrackList); @@ -602,8 +656,8 @@ int cPlayback::GetTeletextPid(void) } free(TrackList); } - } - */ + } */ + printf("teletext pid id %d (0x%x)\n", pid, pid); return pid; } @@ -625,6 +679,7 @@ void cPlayback::GetChapters(std::vector &positions, std::vectormanager && player->manager->chapter) { char **TrackList = NULL; @@ -681,6 +736,7 @@ cPlayback::cPlayback(int num __attribute__((unused))) cPlayback::~cPlayback() { lt_info("%s\n", __func__); + if (player) free(player); player = NULL; @@ -727,6 +783,7 @@ void cPlayback::ReleaseAVFormatContext() bool cPlayback::IsPlaying(void) const { lt_info("%s\n", __func__); + /* konfetti: there is no event/callback mechanism in libeplayer2 * so in case of ending playback we have no information on a * terminated stream currently (or did I oversee it?). @@ -736,6 +793,7 @@ bool cPlayback::IsPlaying(void) const { return player->playback->isPlaying; } + return playing; } #endif From f57a31176999f902ed80f10529ecc61fdb36ce40 Mon Sep 17 00:00:00 2001 From: max_10 Date: Wed, 29 Aug 2018 13:09:21 +0200 Subject: [PATCH 04/29] [libarmbox] Change Makefile.am Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/ecfa47621fd3e10eed85aed843637f10bee86255 Author: max_10 Date: 2018-08-29 (Wed, 29 Aug 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/Makefile.am | 61 ++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/libeplayer3-arm/Makefile.am b/libeplayer3-arm/Makefile.am index 7ba03f2..0db258d 100644 --- a/libeplayer3-arm/Makefile.am +++ b/libeplayer3-arm/Makefile.am @@ -1,30 +1,43 @@ AUTOMAKE_OPTIONS = subdir-objects +AM_CFLAGS = -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE + +CXXFLAGS = -Wall noinst_LTLIBRARIES = libeplayer3_arm.la -AM_CFLAGS = -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE +AM_CPPFLAGS = -I$(srcdir)/include +AM_CPPFLAGS += -I$(top_srcdir)/include +AM_CPPFLAGS += -I$(srcdir)/external -AM_CPPFLAGS = -I$(srcdir)/include -AM_CPPFLAGS += -I$(top_srcdir)/include -AM_CPPFLAGS += -I$(srcdir)/external +AM_CXXFLAGS = -fno-rtti -fno-exceptions -fno-strict-aliasing -AM_CXXFLAGS = -fno-rtti -fno-exceptions -fno-strict-aliasing +SOURCE_FILES = container/container.c +SOURCE_FILES += container/container_ffmpeg.c +SOURCE_FILES += manager/manager.c +SOURCE_FILES += manager/audio.c +SOURCE_FILES += manager/video.c +SOURCE_FILES += manager/chapter.c +SOURCE_FILES += manager/subtitle.c +SOURCE_FILES += output/output_subtitle.c +SOURCE_FILES += output/output.c +SOURCE_FILES += output/writer/common/pes.c +SOURCE_FILES += output/writer/common/misc.c +SOURCE_FILES += output/writer/common/writer.c +SOURCE_FILES += output/linuxdvb_buffering.c +SOURCE_FILES += playback/playback.c +SOURCE_FILES += external/ffmpeg/src/bitstream.c +SOURCE_FILES += external/ffmpeg/src/latmenc.c +SOURCE_FILES += external/ffmpeg/src/mpeg4audio.c -libeplayer3_arm_la_SOURCES = \ - container/container.c \ - container/container_ffmpeg.c \ - manager/manager.c \ - manager/audio.c \ - manager/video.c \ - manager/subtitle.c \ - manager/chapter.c \ +#AM_CFLAGS += -DHAVE_FLV2MPEG4_CONVERTER +#AM_CPPFLAGS += -I$(srcdir)/external/flv2mpeg4 +#SOURCE_FILES += external/flv2mpeg4/src/m4vencode.c +#SOURCE_FILES += external/flv2mpeg4/src/flvdecoder.c +#SOURCE_FILES += external/flv2mpeg4/src/dcprediction.c +#SOURCE_FILES += external/flv2mpeg4/src/flv2mpeg4.c + +SOURCE_FILES += \ output/linuxdvb_mipsel.c \ - output/linuxdvb_buffering.c \ - output/output_subtitle.c \ - output/output.c \ - output/writer/common/pes.c \ - output/writer/common/misc.c \ - output/writer/common/writer.c \ output/writer/mipsel/writer.c \ output/writer/mipsel/aac.c \ output/writer/mipsel/ac3.c \ @@ -42,15 +55,13 @@ libeplayer3_arm_la_SOURCES = \ output/writer/mipsel/divx3.c \ output/writer/mipsel/vp.c \ output/writer/mipsel/wmv.c \ - output/writer/mipsel/vc1.c \ - playback/playback.c \ - external/ffmpeg/src/bitstream.c \ - external/ffmpeg/src/latmenc.c \ - external/ffmpeg/src/mpeg4audio.c + output/writer/mipsel/vc1.c +libeplayer3_arm_la_SOURCES = $(SOURCE_FILES) -LIBEPLAYER3_LIBS = libeplayer3_arm.la -lpthread -lavformat -lavcodec -lavutil -lswresample -lz -lm +LIBEPLAYER3_LIBS = libeplayer3_arm.la -lpthread -lavformat -lavcodec -lavutil -lswresample bin_PROGRAMS = eplayer3 eplayer3_SOURCES = main/exteplayer.c eplayer3_LDADD = $(LIBEPLAYER3_LIBS) +eplayer3_DEPENDENCIES = libeplayer3_arm.la From 32c26c582a46d17290b70c41038a0233b6e705c6 Mon Sep 17 00:00:00 2001 From: max_10 Date: Wed, 29 Aug 2018 14:29:29 +0200 Subject: [PATCH 05/29] [libarmbox] add libeplayer3-arm --enable-flv2mpeg4 Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/3464282278dc92ac8b1bf8edde682957e84c57c7 Author: max_10 Date: 2018-08-29 (Wed, 29 Aug 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- acinclude.m4 | 6 +++--- configure.ac | 9 +++++++++ libeplayer3-arm/Makefile.am | 14 ++++++++------ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index b9d9be1..6b9232b 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -152,11 +152,11 @@ AC_SUBST(PLUGINDIR) AC_SUBST(THEMESDIR) dnl end workaround -AC_DEFUN([TUXBOX_BOXTYPE],[ +AC_DEFUN([TUXBOX_BOXTYPE], [ AC_ARG_WITH(boxtype, - [ --with-boxtype valid values: tripledragon,spark,azbox,generic,duckbox,spark7162,armbox], + AS_HELP_STRING([--with-boxtype], [valid values: tripledragon, spark, azbox, generic, armbox, duckbox, spark7162]), [case "${withval}" in - tripledragon|azbox|generic) + tripledragon|azbox|generic|armbox) BOXTYPE="$withval" ;; spark|spark7162) diff --git a/configure.ac b/configure.ac index e386150..0e56456 100644 --- a/configure.ac +++ b/configure.ac @@ -62,6 +62,15 @@ if test x$BOXTYPE = xgeneric -a x$BOXMODEL != xraspi; then PKG_CHECK_MODULES([SWRESAMPLE], [libswresample]) fi +AC_ARG_ENABLE(flv2mpeg4, + AS_HELP_STRING(--enable-flv2mpeg4, use flv2mpeg4 libeplayer3-arm), + ,[enable_flv2mpeg4=no]) + +AM_CONDITIONAL(FLV2MPEG4, test "$enable_flv2mpeg4" = "yes") +if test "$enable_flv2mpeg4" = "yes"; then + AC_DEFINE(ENABLE_FLV2MPEG4, 1, [use flv2mpeg4 libeplayer3-arm]) +fi + AC_OUTPUT([ Makefile common/Makefile diff --git a/libeplayer3-arm/Makefile.am b/libeplayer3-arm/Makefile.am index 0db258d..193f427 100644 --- a/libeplayer3-arm/Makefile.am +++ b/libeplayer3-arm/Makefile.am @@ -29,12 +29,14 @@ SOURCE_FILES += external/ffmpeg/src/bitstream.c SOURCE_FILES += external/ffmpeg/src/latmenc.c SOURCE_FILES += external/ffmpeg/src/mpeg4audio.c -#AM_CFLAGS += -DHAVE_FLV2MPEG4_CONVERTER -#AM_CPPFLAGS += -I$(srcdir)/external/flv2mpeg4 -#SOURCE_FILES += external/flv2mpeg4/src/m4vencode.c -#SOURCE_FILES += external/flv2mpeg4/src/flvdecoder.c -#SOURCE_FILES += external/flv2mpeg4/src/dcprediction.c -#SOURCE_FILES += external/flv2mpeg4/src/flv2mpeg4.c +if ENABLE_FLV2MPEG4 +AM_CFLAGS += -DHAVE_FLV2MPEG4_CONVERTER +AM_CPPFLAGS += -I$(srcdir)/external/flv2mpeg4 +SOURCE_FILES += external/flv2mpeg4/src/m4vencode.c +SOURCE_FILES += external/flv2mpeg4/src/flvdecoder.c +SOURCE_FILES += external/flv2mpeg4/src/dcprediction.c +SOURCE_FILES += external/flv2mpeg4/src/flv2mpeg4.c +endif SOURCE_FILES += \ output/linuxdvb_mipsel.c \ From 934dadbfd4d917ad5fd7298ebdae86741b0963f6 Mon Sep 17 00:00:00 2001 From: max_10 Date: Wed, 29 Aug 2018 14:33:31 +0200 Subject: [PATCH 06/29] [libarmbox] fix last commit Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/2f4df23958b6442a16f604f50f28e851f89e9aa4 Author: max_10 Date: 2018-08-29 (Wed, 29 Aug 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 0e56456..56eb4ba 100644 --- a/configure.ac +++ b/configure.ac @@ -66,7 +66,7 @@ AC_ARG_ENABLE(flv2mpeg4, AS_HELP_STRING(--enable-flv2mpeg4, use flv2mpeg4 libeplayer3-arm), ,[enable_flv2mpeg4=no]) -AM_CONDITIONAL(FLV2MPEG4, test "$enable_flv2mpeg4" = "yes") +AM_CONDITIONAL(ENABLE_FLV2MPEG4, test "$enable_flv2mpeg4" = "yes") if test "$enable_flv2mpeg4" = "yes"; then AC_DEFINE(ENABLE_FLV2MPEG4, 1, [use flv2mpeg4 libeplayer3-arm]) fi From 7553673d40cdcebe6dbbafc52bcdb8b7c2ed2ce1 Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 30 Aug 2018 14:05:36 +0200 Subject: [PATCH 07/29] [libarmbox] libeplayer3-arm code format Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/c49f9bebbafd404897a6766462c97ce3a7bbbe82 Author: max_10 Date: 2018-08-30 (Thu, 30 Aug 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/container/container_ffmpeg.c | 86 ++++++++++++------- libeplayer3-arm/include/container.h | 1 - libeplayer3-arm/include/manager.h | 2 +- libeplayer3-arm/include/playback.h | 2 +- libeplayer3-arm/main/exteplayer.c | 32 ++++--- libeplayer3-arm/manager/audio.c | 14 +-- libeplayer3-arm/manager/subtitle.c | 17 ++-- libeplayer3-arm/manager/video.c | 14 +-- libeplayer3-arm/output/linuxdvb_mipsel.c | 6 +- libeplayer3-arm/output/output.c | 1 + libeplayer3-arm/output/output_subtitle.c | 3 +- libeplayer3-arm/output/writer/common/writer.c | 2 +- libeplayer3-arm/output/writer/mipsel/dts.c | 1 + libeplayer3-arm/output/writer/mipsel/wma.c | 1 + libeplayer3-arm/playback/playback.c | 46 ++++++---- 15 files changed, 138 insertions(+), 90 deletions(-) diff --git a/libeplayer3-arm/container/container_ffmpeg.c b/libeplayer3-arm/container/container_ffmpeg.c index 5f84216..334d326 100644 --- a/libeplayer3-arm/container/container_ffmpeg.c +++ b/libeplayer3-arm/container/container_ffmpeg.c @@ -105,6 +105,7 @@ if (debug_level >= level) printf("[%s:%s] " fmt, __FILE__, __FUNCTION__, ## x); #define cERR_CONTAINER_FFMPEG_END_OF_FILE -10 #define IPTV_AV_CONTEXT_MAX_NUM 2 + /* ***************************** */ /* Types */ /* ***************************** */ @@ -548,8 +549,7 @@ static void FFMPEGThread(Context_t *context) threadname[16] = 0; prctl(PR_SET_NAME, (unsigned long)&threadname); AVPacket packet; - //off_t lastSeek = -1; - //int64_t lastPts = -1; + int64_t currentVideoPts = -1; int64_t currentAudioPts = -1; @@ -561,7 +561,6 @@ static void FFMPEGThread(Context_t *context) int64_t showtime = 0; int64_t bofcount = 0; - //int32_t err = 0; AudioVideoOut_t avOut; g_context = context; @@ -583,13 +582,14 @@ static void FFMPEGThread(Context_t *context) memset(&flv2mpeg4_context, 0, sizeof(Flv2Mpeg4Context)); #endif ffmpeg_printf(10, "\n"); + while (context->playback->isCreationPhase) { ffmpeg_printf(10, "Thread waiting for end of init phase...\n"); usleep(1000); } ffmpeg_printf(10, "Running!\n"); - + #ifdef __sh__ uint32_t bufferSize = 0; context->output->Command(context, OUTPUT_GET_BUFFER_SIZE, &bufferSize); @@ -597,6 +597,7 @@ static void FFMPEGThread(Context_t *context) #endif int8_t isWaitingForFinish = 0; + while (context && context->playback && context->playback->isPlaying) { /* When user press PAUSE we call pause on AUDIO and VIDEO decoders, @@ -636,19 +637,24 @@ static void FFMPEGThread(Context_t *context) } continue; } - if (context->playback->BackWard && av_gettime() >= showtime) { + + if (context->playback->BackWard && av_gettime() >= showtime) + { context->output->Command(context, OUTPUT_CLEAR, "video"); - if (bofcount == 1) { - showtime = av_gettime(); - usleep(100000); - continue; + if (bofcount == 1) + { + showtime = av_gettime(); + usleep(100000); + continue; } - if (avContextTab[0]->iformat->flags & AVFMT_TS_DISCONT) { + if (avContextTab[0]->iformat->flags & AVFMT_TS_DISCONT) + { off_t pos = avio_tell(avContextTab[0]->pb); - if (pos > 0) { + if (pos > 0) + { float br; if (avContextTab[0]->bit_rate) br = avContextTab[0]->bit_rate / 8.0; @@ -669,7 +675,7 @@ static void FFMPEGThread(Context_t *context) seek_target_seconds = AV_TIME_BASE; do_seek_target_seconds = 1; } - showtime = av_gettime() + 300000; //jump back every 300ms + showtime = av_gettime() + 300000; //jump back every 300ms } else { @@ -770,15 +776,16 @@ static void FFMPEGThread(Context_t *context) if (!isWaitingForFinish && (ffmpegStatus = av_read_frame(avContextTab[cAVIdx], &packet)) == 0) { - int64_t pts = 0; - int64_t dts = 0; - Track_t *videoTrack = NULL; - Track_t *audioTrack = NULL; + int64_t pts = 0; + int64_t dts = 0; + Track_t *videoTrack = NULL; + Track_t *audioTrack = NULL; Track_t *subtitleTrack = NULL; int32_t pid = avContextTab[cAVIdx]->streams[packet.stream_index]->id; reset_finish_timeout(); + if (avContextTab[cAVIdx]->streams[packet.stream_index]->discard != AVDISCARD_ALL) { if (context->manager->video->Command(context, MANAGER_GET_TRACK, &videoTrack) < 0) @@ -992,6 +999,7 @@ static void FFMPEGThread(Context_t *context) decoded_frame = NULL; } } + #if (LIBAVFORMAT_VERSION_MAJOR > 57) || ((LIBAVFORMAT_VERSION_MAJOR == 57) && (LIBAVFORMAT_VERSION_MINOR > 32)) while (packet.size > 0 || (!packet.size && !packet.data)) #else @@ -1059,6 +1067,7 @@ static void FFMPEGThread(Context_t *context) continue; } #endif + int32_t e = 0; if (!swr) { @@ -1085,6 +1094,7 @@ static void FFMPEGThread(Context_t *context) { c->channel_layout = av_get_default_channel_layout(c->channels); } + out_channel_layout = c->channel_layout; uint8_t downmix = stereo_software_decoder && out_channels > 2 ? 1 : 0; @@ -1108,7 +1118,6 @@ static void FFMPEGThread(Context_t *context) av_opt_set_int(swr, "in_sample_fmt", c->sample_fmt, 0); av_opt_set_int(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); - e = swr_init(swr); if (e < 0) { @@ -1344,6 +1353,7 @@ static void FFMPEGThread(Context_t *context) hasPlayThreadStarted = 0; context->playback->isPlaying = 0; PlaybackDieNow(1); + ffmpeg_printf(10, "terminating\n"); } @@ -1886,13 +1896,16 @@ int32_t container_ffmpeg_init(Context_t *context, PlayFiles_t *playFilesNames) } ffmpeg_printf(10, "filename %s\n", playFilesNames->szFirstFile); + if (playFilesNames->szSecondFile) { ffmpeg_printf(10, "second filename %s\n", playFilesNames->szSecondFile); } + /* initialize ffmpeg */ avcodec_register_all(); av_register_all(); + avformat_network_init(); // SULGE DEBUG ENABLED @@ -1902,7 +1915,8 @@ int32_t container_ffmpeg_init(Context_t *context, PlayFiles_t *playFilesNames) context->playback->abortRequested = 0; int32_t res = container_ffmpeg_init_av_context(context, playFilesNames->szFirstFile, playFilesNames->iFirstFileSize, \ - playFilesNames->szFirstMoovAtomFile, playFilesNames->iFirstMoovAtomOffset, 0); + playFilesNames->szFirstMoovAtomFile, playFilesNames->iFirstMoovAtomOffset, 0); + if (0 != res) { return res; @@ -1911,7 +1925,7 @@ int32_t container_ffmpeg_init(Context_t *context, PlayFiles_t *playFilesNames) if (playFilesNames->szSecondFile && playFilesNames->szSecondFile[0] != '\0') { res = container_ffmpeg_init_av_context(context, playFilesNames->szSecondFile, playFilesNames->iSecondFileSize, \ - playFilesNames->szSecondMoovAtomFile, playFilesNames->iSecondMoovAtomOffset, 1); + playFilesNames->szSecondMoovAtomFile, playFilesNames->iSecondMoovAtomOffset, 1); } if (0 != res) @@ -1970,6 +1984,7 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 uint32_t cAVIdx = 0; + for (cAVIdx = 0; cAVIdx < IPTV_AV_CONTEXT_MAX_NUM; cAVIdx += 1) { if (NULL == avContextTab[cAVIdx]) @@ -2080,6 +2095,7 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 case AVMEDIA_TYPE_VIDEO: ffmpeg_printf(10, "CODEC_TYPE_VIDEO %d\n", get_codecpar(stream)->codec_type); stream->discard = AVDISCARD_ALL; /* by default we discard all video streams */ + if (encoding != NULL) { track.type = eTypeES; @@ -2096,6 +2112,7 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 */ track.aspect_ratio_num = stream->sample_aspect_ratio.num; track.aspect_ratio_den = stream->sample_aspect_ratio.den; + if (0 == track.aspect_ratio_num || 0 == track.aspect_ratio_den) { track.aspect_ratio_num = get_codecpar(stream)->sample_aspect_ratio.num; @@ -2115,6 +2132,7 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 } /* fixme: revise this */ + if (track.frame_rate < 23970) { track.TimeScale = 1001; @@ -2179,6 +2197,7 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 case AVMEDIA_TYPE_AUDIO: ffmpeg_printf(10, "CODEC_TYPE_AUDIO %d\n", get_codecpar(stream)->codec_type); stream->discard = AVDISCARD_ALL; + if (encoding != NULL) { AVDictionaryEntry *lang; @@ -2197,6 +2216,7 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 track.have_aacheader = -1; track.duration = (int64_t)av_rescale(stream->duration, (int64_t)stream->time_base.num * 1000, stream->time_base.den); + if (stream->duration == AV_NOPTS_VALUE) { ffmpeg_printf(10, "Stream has no duration so we take the duration from context\n"); @@ -2514,7 +2534,9 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 ffmpeg_printf(10, "CODEC_TYPE_SUBTITLE %d\n", get_codecpar(stream)->codec_type); lang = av_dict_get(stream->metadata, "language", NULL, 0); + track.Name = lang ? lang->value : "und"; + ffmpeg_printf(10, "Language %s\n", track.Name); track.Encoding = encoding; @@ -2595,6 +2617,7 @@ int32_t container_ffmpeg_update_tracks(Context_t *context, char *filename, int32 } releaseMutex(__FILE__, __FUNCTION__, __LINE__); + return cERR_CONTAINER_FFMPEG_NO_ERROR; } @@ -2623,14 +2646,12 @@ static int32_t container_ffmpeg_play(Context_t *context) if ((error = pthread_create(&PlayThread, &attr, (void *)&FFMPEGThread, context)) != 0) { ffmpeg_printf(10, "Error creating thread, error:%d:%s\n", error, strerror(error)); - hasPlayThreadStarted = 0; ret = cERR_CONTAINER_FFMPEG_ERR; } else { ffmpeg_printf(10, "Created thread\n"); - hasPlayThreadStarted = 1; } } @@ -2641,6 +2662,7 @@ static int32_t container_ffmpeg_play(Context_t *context) } ffmpeg_printf(10, "exiting with value %d\n", ret); + return ret; } @@ -2670,6 +2692,7 @@ static int32_t container_ffmpeg_stop(Context_t *context) { /* force close */ ffmpeg_err("Timeout waiting for thread!\n"); + ret = cERR_CONTAINER_FFMPEG_ERR; /* to speed up close - we are in separate process for the moment this process will * be closed and whole resources will be free by the system @@ -2921,15 +2944,16 @@ static int32_t container_ffmpeg_seek(Context_t *context, int64_t sec, uint8_t ab } ffmpeg_printf(10, "iformat->flags 0x%08x\n", avContextTab[0]->iformat->flags); + #if defined(TS_BYTES_SEEKING) && TS_BYTES_SEEKING if (avContextTab[0]->iformat->flags & AVFMT_TS_DISCONT) { /* konfetti: for ts streams seeking frame per seconds does not work (why?). - * I take this algo partly from ffplay.c. - * - * seeking per HTTP does still not work very good. forward seeks everytime - * about 10 seconds, backward does not work. - */ + * I take this algo partly from ffplay.c. + * + * seeking per HTTP does still not work very good. forward seeks everytime + * about 10 seconds, backward does not work. + */ getMutex(__FILE__, __FUNCTION__, __LINE__); off_t pos = avio_tell(avContextTab[0]->pb); @@ -3027,6 +3051,7 @@ static int32_t container_ffmpeg_switch_audio(Context_t *context, int32_t *arg __ { ffmpeg_printf(10, "track %d\n", *arg); getMutex(__FILE__, __FUNCTION__, __LINE__); + if (context->manager->audio) { Track_t *Tracks = NULL; @@ -3127,7 +3152,7 @@ static int32_t container_ffmpeg_get_info(Context_t *context, char **infoString) return cERR_CONTAINER_FFMPEG_NO_ERROR; } -static int container_ffmpeg_get_metadata(Context_t * context, char ***p) +static int container_ffmpeg_get_metadata(Context_t *context, char ***p) { Track_t *videoTrack = NULL; Track_t *audioTrack = NULL; @@ -3249,12 +3274,12 @@ static int32_t Command(Context_t *context, ContainerCmd_t command, void *argumen } case CONTAINER_SWITCH_AUDIO: { - ret = container_ffmpeg_switch_audio(context, (int32_t *) argument); + ret = container_ffmpeg_switch_audio(context, (int32_t *)argument); break; } case CONTAINER_SWITCH_SUBTITLE: { - ret = container_ffmpeg_switch_subtitle(context, (int32_t *) argument); + ret = container_ffmpeg_switch_subtitle(context, (int32_t *)argument); break; } case CONTAINER_INFO: @@ -3286,7 +3311,7 @@ static int32_t Command(Context_t *context, ContainerCmd_t command, void *argumen } case CONTAINER_GET_METADATA: { - ret = container_ffmpeg_get_metadata(context, (char ***) argument); + ret = container_ffmpeg_get_metadata(context, (char ***)argument); break; } default: @@ -3296,6 +3321,7 @@ static int32_t Command(Context_t *context, ContainerCmd_t command, void *argumen } ffmpeg_printf(50, "exiting with value %d\n", ret); + return ret; } diff --git a/libeplayer3-arm/include/container.h b/libeplayer3-arm/include/container.h index a8a87e0..dc1a585 100644 --- a/libeplayer3-arm/include/container.h +++ b/libeplayer3-arm/include/container.h @@ -45,7 +45,6 @@ typedef struct ContainerHandler_s { char *Name; Container_t *selectedContainer; - int (* Command)(Context_t *, ContainerCmd_t, void *); } ContainerHandler_t; diff --git a/libeplayer3-arm/include/manager.h b/libeplayer3-arm/include/manager.h index baed788..1363271 100644 --- a/libeplayer3-arm/include/manager.h +++ b/libeplayer3-arm/include/manager.h @@ -44,7 +44,7 @@ typedef struct Track_s /* new field for ffmpeg - add at the end so no problem * can occur with not changed srt saa container */ - char *language; + char *language; /* length of track */ int64_t duration; diff --git a/libeplayer3-arm/include/playback.h b/libeplayer3-arm/include/playback.h index 68a7fc8..b6d9b63 100644 --- a/libeplayer3-arm/include/playback.h +++ b/libeplayer3-arm/include/playback.h @@ -4,7 +4,7 @@ #include #include -typedef void( * PlaybackDieNowCallback )(); +typedef void(* PlaybackDieNowCallback)(); bool PlaybackDieNowRegisterCallback(PlaybackDieNowCallback callback); typedef enum { diff --git a/libeplayer3-arm/main/exteplayer.c b/libeplayer3-arm/main/exteplayer.c index 7538799..2adfb22 100644 --- a/libeplayer3-arm/main/exteplayer.c +++ b/libeplayer3-arm/main/exteplayer.c @@ -252,11 +252,12 @@ static int HandleTracks(const Manager_t *ptrManager, const PlaybackCmd_t playbac ptrManager->Command(g_player, MANAGER_LIST, &TrackList); if (NULL != TrackList) { - int i = 0, Id = -1; + int i = 0; + int Id = -1; char * pch; char Name[] = " "; fprintf(stderr, "{\"%c_%c\": [", argvBuff[0], argvBuff[1]); - for (i = 0; TrackList[i] != NULL; i+=2) + for (i = 0; TrackList[i] != NULL; i += 2) { pch = strtok(TrackList[i], " "); if (pch != NULL) { @@ -272,7 +273,7 @@ static int HandleTracks(const Manager_t *ptrManager, const PlaybackCmd_t playbac } fprintf(stderr, "{\"id\":%d,\"e\":\"%s\",\"n\":\"%s\"}", Id, TrackList[i+1], Name); free(TrackList[i]); - free(TrackList[i+1]); + free(TrackList[i + 1]); } fprintf(stderr, "]}\n"); free(TrackList); @@ -297,7 +298,7 @@ static int HandleTracks(const Manager_t *ptrManager, const PlaybackCmd_t playbac else // video { fprintf(stderr, "{\"%c_%c\":{\"id\":%d,\"e\":\"%s\",\"n\":\"%s\",\"w\":%d,\"h\":%d,\"f\":%u,\"p\":%d,\"an\":%d,\"ad\":%d}}\n", \ - argvBuff[0], argvBuff[1], track->Id, track->Encoding, track->Name, track->width, track->height, track->frame_rate, track->progressive, track->aspect_ratio_num, track->aspect_ratio_den); + argvBuff[0], argvBuff[1], track->Id, track->Encoding, track->Name, track->width, track->height, track->frame_rate, track->progressive, track->aspect_ratio_num, track->aspect_ratio_den); } free(track->Encoding); free(track->Name); @@ -336,7 +337,7 @@ static int HandleTracks(const Manager_t *ptrManager, const PlaybackCmd_t playbac { int i = 0; char * pch; - for (i = 0; TrackList[i] != NULL; i+=2) + for (i = 0; TrackList[i] != NULL; i += 2) { if (idx == i) { @@ -345,7 +346,7 @@ static int HandleTracks(const Manager_t *ptrManager, const PlaybackCmd_t playbac id = atoi(pch); } free(TrackList[i]); - free(TrackList[i+1]); + free(TrackList[i + 1]); } free(TrackList); } @@ -501,7 +502,7 @@ static int HandleTracks(const Manager_t *ptrManager, const PlaybackCmd_t playbac static void UpdateVideoTrack() { - HandleTracks(g_player->manager->video, (PlaybackCmd_t) - 1, "vc"); + HandleTracks(g_player->manager->video, (PlaybackCmd_t) -1, "vc"); } static int ParseParams(int argc, char *argv[], PlayFiles_t *playbackFiles, int *pAudioTrackIdx, int *subtitleTrackIdx, uint32_t *linuxDvbBufferSizeMB) @@ -657,6 +658,7 @@ static int ParseParams(int argc, char *argv[], PlayFiles_t *playbackFiles, int * ret = 0; playbackFiles->szFirstFile = malloc(IPTV_MAX_FILE_PATH); playbackFiles->szFirstFile[0] = '\0'; + if (NULL == strstr(argv[optind], "://")) { strcpy(playbackFiles->szFirstFile, "file://"); @@ -692,6 +694,7 @@ int main(int argc, char *argv[]) PlayFiles_t playbackFiles; memset(&playbackFiles, 0x00, sizeof(playbackFiles)); + if (0 != ParseParams(argc, argv, &playbackFiles, &audioTrackIdx, &subtitleTrackIdx, &linuxDvbBufferSizeMB)) { printf("Usage: exteplayer3 filePath [-u user-agent] [-c cookies] [-h headers] [-p prio] [-a] [-d] [-w] [-l] [-s] [-i] [-t audioTrackId] [-9 subtitleTrackId] [-x separateAudioUri] plabackUri\n"); @@ -815,24 +818,24 @@ int main(int argc, char *argv[]) { PlaybackDieNowRegisterCallback(TerminateWakeUp); - HandleTracks(g_player->manager->video, (PlaybackCmd_t) - 1, "vc"); - HandleTracks(g_player->manager->audio, (PlaybackCmd_t) - 1, "al"); + HandleTracks(g_player->manager->video, (PlaybackCmd_t) -1, "vc"); + HandleTracks(g_player->manager->audio, (PlaybackCmd_t) -1, "al"); if (audioTrackIdx >= 0) { static char cmd[128] = ""; // static to not allocate on stack sprintf(cmd, "ai%d\n", audioTrackIdx); commandRetVal = HandleTracks(g_player->manager->audio, PLAYBACK_SWITCH_AUDIO, cmd); } - HandleTracks(g_player->manager->audio, (PlaybackCmd_t) - 1, "ac"); + HandleTracks(g_player->manager->audio, (PlaybackCmd_t) -1, "ac"); - HandleTracks(g_player->manager->subtitle, (PlaybackCmd_t) - 1, "sl"); + HandleTracks(g_player->manager->subtitle, (PlaybackCmd_t) -1, "sl"); if (subtitleTrackIdx >= 0) { static char cmd[128] = ""; // static to not allocate on stack sprintf(cmd, "si%d\n", subtitleTrackIdx); commandRetVal = HandleTracks(g_player->manager->subtitle, PLAYBACK_SWITCH_SUBTITLE, cmd); } - HandleTracks(g_player->manager->subtitle, (PlaybackCmd_t) - 1, "sc"); + HandleTracks(g_player->manager->subtitle, (PlaybackCmd_t) -1, "sc"); } while (g_player->playback->isPlaying && 0 == PlaybackDieNow(0)) @@ -854,7 +857,7 @@ int main(int argc, char *argv[]) { case 'v': { - HandleTracks(g_player->manager->video, (PlaybackCmd_t) - 1, argvBuff); + HandleTracks(g_player->manager->video, (PlaybackCmd_t) -1, argvBuff); break; } case 'a': @@ -965,10 +968,12 @@ int main(int argc, char *argv[]) commandRetVal = g_player->playback->Command(g_player, PLAYBACK_PTS, &pts); CurrentSec = (int32_t)(pts / 90000); + if (0 == commandRetVal) { fprintf(stderr, "{\"J\":{\"ms\":%lld}}\n", pts / 90); } + if (0 == commandRetVal || force) { commandRetVal = g_player->playback->Command(g_player, PLAYBACK_LENGTH, (void *)&length); @@ -1015,6 +1020,7 @@ int main(int argc, char *argv[]) { int64_t lastPts = 0; commandRetVal = 1; + if (g_player->container && g_player->container->selectedContainer) { commandRetVal = g_player->container->selectedContainer->Command((Context_t*)g_player->container, CONTAINER_LAST_PTS, &lastPts); diff --git a/libeplayer3-arm/manager/audio.c b/libeplayer3-arm/manager/audio.c index 6543f51..d4eef50 100644 --- a/libeplayer3-arm/manager/audio.c +++ b/libeplayer3-arm/manager/audio.c @@ -128,6 +128,7 @@ static int ManagerAdd(Context_t *context, Track_t track) } audio_mgr_printf(10, "%s::%s\n", __FILE__, __FUNCTION__); + return cERR_AUDIO_MGR_NO_ERROR; } @@ -137,6 +138,7 @@ static char **ManagerList(Context_t *context __attribute__((unused))) char **tracklist = NULL; audio_mgr_printf(10, "%s::%s\n", __FILE__, __FUNCTION__); + if (Tracks != NULL) { tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1)); @@ -160,9 +162,9 @@ static char **ManagerList(Context_t *context __attribute__((unused))) tracklist[j] = strdup(tmp); tracklist[j + 1] = strdup(Tracks[i].Encoding); } - tracklist[j] = NULL; } + audio_mgr_printf(10, "%s::%s return %p (%d - %d)\n", __FILE__, __FUNCTION__, tracklist, j, TrackCount); return tracklist; @@ -256,7 +258,7 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) { container_ffmpeg_update_tracks(context, context->playback->uri, 0); // *((TrackDescription_t **)argument) = ManagerList(context); - *((char ** *) argument) = (char **) ManagerList(context); + *((char ***)argument) = (char **)ManagerList(context); break; } case MANAGER_REF_LIST: @@ -279,7 +281,7 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) } else { - *((int *)argument) = (int) - 1; + *((int *)argument) = (int) -1; } break; } @@ -292,9 +294,9 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) if (track) { memset(track, 0, sizeof(TrackDescription_t)); - track->Id = Tracks[CurrentTrack].Id; - track->Name = strdup(Tracks[CurrentTrack].Name); - track->Encoding = strdup(Tracks[CurrentTrack].Encoding); + track->Id = Tracks[CurrentTrack].Id; + track->Name = strdup(Tracks[CurrentTrack].Name); + track->Encoding = strdup(Tracks[CurrentTrack].Encoding); } } else diff --git a/libeplayer3-arm/manager/subtitle.c b/libeplayer3-arm/manager/subtitle.c index 144cb5c..db1761a 100644 --- a/libeplayer3-arm/manager/subtitle.c +++ b/libeplayer3-arm/manager/subtitle.c @@ -134,8 +134,8 @@ static int ManagerAdd(Context_t *context __attribute__((unused)), Track_t track) static char **ManagerList(Context_t *context __attribute__((unused))) { - char **tracklist = NULL; int i = 0, j = 0; + char **tracklist = NULL; subtitle_mgr_printf(10, "%s::%s\n", __FILE__, __FUNCTION__); @@ -162,7 +162,6 @@ static char **ManagerList(Context_t *context __attribute__((unused))) tracklist[j] = strdup(tmp); tracklist[j + 1] = strdup(Tracks[i].Encoding); } - tracklist[j] = NULL; } @@ -219,7 +218,7 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) case MANAGER_LIST: { container_ffmpeg_update_tracks(context, context->playback->uri, 0); - *((char ** *)argument) = (char **)ManagerList(context); + *((char ***)argument) = (char **)ManagerList(context); break; } case MANAGER_GET: @@ -230,7 +229,7 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) } else { - *((int *)argument) = (int) - 1; + *((int *)argument) = (int) -1; } break; } @@ -243,9 +242,9 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) if (track) { memset(track, 0, sizeof(TrackDescription_t)); - track->Id = Tracks[CurrentTrack].Id; - track->Name = strdup(Tracks[CurrentTrack].Name); - track->Encoding = strdup(Tracks[CurrentTrack].Encoding); + track->Id = Tracks[CurrentTrack].Id; + track->Name = strdup(Tracks[CurrentTrack].Name); + track->Encoding = strdup(Tracks[CurrentTrack].Encoding); } } else @@ -332,12 +331,12 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) break; } default: - subtitle_mgr_err("%s:%s: ContainerCmd not supported!", __FILE__, __FUNCTION__); + subtitle_mgr_err("%s::%s ContainerCmd not supported!", __FILE__, __FUNCTION__); ret = cERR_SUBTITLE_MGR_ERROR; break; } - subtitle_mgr_printf(50, "%s:%s: returning %d\n", __FILE__, __FUNCTION__, ret); + subtitle_mgr_printf(50, "%s::%s returning %d\n", __FILE__, __FUNCTION__, ret); return ret; } diff --git a/libeplayer3-arm/manager/video.c b/libeplayer3-arm/manager/video.c index 8a94d4a..93b7073 100644 --- a/libeplayer3-arm/manager/video.c +++ b/libeplayer3-arm/manager/video.c @@ -97,7 +97,7 @@ static int ManagerAdd(Context_t *context, Track_t track) if (Tracks == NULL) { - video_mgr_err("%s:%s malloc failed\n", __FILE__, __FUNCTION__); + video_mgr_err("%s::%s malloc failed\n", __FILE__, __FUNCTION__); return cERR_VIDEO_MGR_ERROR; } @@ -118,7 +118,7 @@ static int ManagerAdd(Context_t *context, Track_t track) } else { - video_mgr_err("%s:%s TrackCount out if range %d - %d\n", __FILE__, __FUNCTION__, TrackCount, TRACKWRAP); + video_mgr_err("%s::%s TrackCount out if range %d - %d\n", __FILE__, __FUNCTION__, TrackCount, TRACKWRAP); return cERR_VIDEO_MGR_ERROR; } @@ -128,6 +128,7 @@ static int ManagerAdd(Context_t *context, Track_t track) } video_mgr_printf(10, "%s::%s\n", __FILE__, __FUNCTION__); + return cERR_VIDEO_MGR_NO_ERROR; } @@ -144,7 +145,7 @@ static char **ManagerList(Context_t *context __attribute__((unused))) if (tracklist == NULL) { - video_mgr_err("%s:%s malloc failed\n", __FILE__, __FUNCTION__); + video_mgr_err("%s::%s malloc failed\n", __FILE__, __FUNCTION__); return NULL; } @@ -164,6 +165,7 @@ static char **ManagerList(Context_t *context __attribute__((unused))) } video_mgr_printf(10, "%s::%s return %p (%d - %d)\n", __FILE__, __FUNCTION__, tracklist, j, TrackCount); + return tracklist; } @@ -213,7 +215,7 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) case MANAGER_LIST: { container_ffmpeg_update_tracks(context, context->playback->uri, 0); - *((char ** *)argument) = (char **)ManagerList(context); + *((char ***)argument) = (char **)ManagerList(context); break; } case MANAGER_GET: @@ -224,7 +226,7 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) } else { - *((int *)argument) = (int) - 1; + *((int *)argument) = (int) -1; } break; } @@ -342,7 +344,7 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) break; } - video_mgr_printf(10, "%s:%s: returning %d\n", __FILE__, __FUNCTION__, ret); + video_mgr_printf(10, "%s::%s returning %d\n", __FILE__, __FUNCTION__, ret); return ret; } diff --git a/libeplayer3-arm/output/linuxdvb_mipsel.c b/libeplayer3-arm/output/linuxdvb_mipsel.c index 58afc9b..455fc8e 100644 --- a/libeplayer3-arm/output/linuxdvb_mipsel.c +++ b/libeplayer3-arm/output/linuxdvb_mipsel.c @@ -252,6 +252,7 @@ int LinuxDvbPlay(Context_t *context, char *type) linuxdvb_printf(10, "V %s\n", Encoding); writer = getWriter(Encoding); + if (writer == NULL) { linuxdvb_err("cannot found writer for encoding %s using default\n", Encoding); @@ -324,7 +325,6 @@ int LinuxDvbPlay(Context_t *context, char *type) ret = cERR_LINUXDVB_NO_ERROR; return ret; - //return 0; } int LinuxDvbStop(Context_t *context __attribute__((unused)), char *type) @@ -354,6 +354,7 @@ int LinuxDvbStop(Context_t *context __attribute__((unused)), char *type) ioctl(videofd, VIDEO_FAST_FORWARD, 0); ioctl(videofd, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX); } + if (audio && audiofd != -1) { if (ioctl(audiofd, AUDIO_CLEAR_BUFFER) == -1) @@ -634,6 +635,7 @@ int LinuxDvbPts(Context_t *context __attribute__((unused)), unsigned long long i } *((unsigned long long int *)pts) = (unsigned long long int)sCURRENT_PTS; + return ret; } @@ -1095,7 +1097,7 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) case OUTPUT_GET_BUFFER_SIZE: { ret = cERR_LINUXDVB_NO_ERROR; - *((uint32_t*)argument) = LinuxDvbBuffGetSize(); + *((uint32_t *)argument) = LinuxDvbBuffGetSize(); break; } default: diff --git a/libeplayer3-arm/output/output.c b/libeplayer3-arm/output/output.c index 60760e8..0544137 100644 --- a/libeplayer3-arm/output/output.c +++ b/libeplayer3-arm/output/output.c @@ -90,6 +90,7 @@ static void printOutputCapabilities() for (i = 0; AvailableOutput[i] != NULL; i++) { output_printf(10, "\t%s : ", AvailableOutput[i]->Name); + for (j = 0; AvailableOutput[i]->Capabilities[j] != NULL; j++) { output_printf(10, "%s ", AvailableOutput[i]->Capabilities[j]); diff --git a/libeplayer3-arm/output/output_subtitle.c b/libeplayer3-arm/output/output_subtitle.c index 16fc2bb..5810440 100644 --- a/libeplayer3-arm/output/output_subtitle.c +++ b/libeplayer3-arm/output/output_subtitle.c @@ -266,8 +266,6 @@ static int32_t subtitle_Open(Context_t *context __attribute__((unused))) static int32_t subtitle_Close(Context_t *context __attribute__((unused))) { - //uint32_t i = 0 ; - subtitle_printf(10, "\n"); getMutex(__LINE__); @@ -341,6 +339,7 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument __att } subtitle_printf(50, "exiting with value %d\n", ret); + return ret; } diff --git a/libeplayer3-arm/output/writer/common/writer.c b/libeplayer3-arm/output/writer/common/writer.c index b866e2a..0ad4b3e 100644 --- a/libeplayer3-arm/output/writer/common/writer.c +++ b/libeplayer3-arm/output/writer/common/writer.c @@ -70,5 +70,5 @@ if (debug_level >= level) printf(x); } while (0) void FlushPipe(int pipefd) { char tmp; - while(1 == read(pipefd, &tmp, 1)); + while (1 == read(pipefd, &tmp, 1)); } diff --git a/libeplayer3-arm/output/writer/mipsel/dts.c b/libeplayer3-arm/output/writer/mipsel/dts.c index 34548ba..7e1ea7a 100644 --- a/libeplayer3-arm/output/writer/mipsel/dts.c +++ b/libeplayer3-arm/output/writer/mipsel/dts.c @@ -52,6 +52,7 @@ /* ***************************** */ /* Makros/Constants */ /* ***************************** */ + #define PES_AUDIO_PRIVATE_HEADER_SIZE 16 // consider maximum private header size. #define PES_AUDIO_HEADER_SIZE (32 + PES_AUDIO_PRIVATE_HEADER_SIZE) #define PES_AUDIO_PACKET_SIZE 2028 diff --git a/libeplayer3-arm/output/writer/mipsel/wma.c b/libeplayer3-arm/output/writer/mipsel/wma.c index 15d6b2d..e953ed8 100644 --- a/libeplayer3-arm/output/writer/mipsel/wma.c +++ b/libeplayer3-arm/output/writer/mipsel/wma.c @@ -169,6 +169,7 @@ static int writeData(WriterAVCallData_t *call) iov[0].iov_len = headerSize; iov[1].iov_base = call->data; iov[1].iov_len = call->len; + return call->WriteV(call->fd, iov, 2); } diff --git a/libeplayer3-arm/playback/playback.c b/libeplayer3-arm/playback/playback.c index 098cc4d..e2bfd7e 100644 --- a/libeplayer3-arm/playback/playback.c +++ b/libeplayer3-arm/playback/playback.c @@ -54,7 +54,7 @@ if (debug_level >= level) printf("[%s:%s] " fmt, __FILE__, __FUNCTION__, ## x); #define cERR_PLAYBACK_NO_ERROR 0 #define cERR_PLAYBACK_ERROR -1 -#define cMaxSpeed_ff 128 /* fixme: revise */ +#define cMaxSpeed_ff 128 /* fixme: revise */ #define cMaxSpeed_fr -320 /* fixme: revise */ #define MAX_PLAYBACK_DIE_NOW_CALLBACKS 10 @@ -140,6 +140,7 @@ static void SupervisorThread(Context_t *context) { usleep(100000); } + playback_printf(10, "<\n"); hasThreadStarted = 2; PlaybackTerminate(context); @@ -293,6 +294,7 @@ static int PlaybackPlay(Context_t *context) { playback_err("OUTPUT_PLAY failed!\n"); playback_err("clearing isCreationPhase!\n"); + context->playback->isCreationPhase = 0; // allow thread to go into next state context->playback->isPlaying = 0; context->playback->isPaused = 0; @@ -300,6 +302,7 @@ static int PlaybackPlay(Context_t *context) context->playback->BackWard = 0; context->playback->SlowMotion = 0; context->playback->Speed = 0; + if (context->container && context->container->selectedContainer) context->container->selectedContainer->Command(context, CONTAINER_STOP, NULL); } @@ -317,7 +320,8 @@ static int PlaybackPlay(Context_t *context) int error; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - if ((error = pthread_create(&supervisorThread, &attr, (void *) &SupervisorThread, context)) != 0) + + if ((error = pthread_create(&supervisorThread, &attr, (void *)&SupervisorThread, context)) != 0) { playback_printf(10, "Error creating thread, error:%d:%s\n", error, strerror(error)); ret = cERR_PLAYBACK_ERROR; @@ -331,13 +335,14 @@ static int PlaybackPlay(Context_t *context) playback_printf(10, "clearing isCreationPhase!\n"); context->playback->isCreationPhase = 0; // allow thread to go into next state + if (context->container && context->container->selectedContainer) ret = context->container->selectedContainer->Command(context, CONTAINER_PLAY, NULL); + if (ret != 0) { playback_err("CONTAINER_PLAY failed!\n"); } - } } else @@ -362,10 +367,9 @@ static int PlaybackPause(Context_t *context) if (context->playback->SlowMotion) context->output->Command(context, OUTPUT_CLEAR, NULL); - context->playback->isPaused = 1; - context->output->Command(context, OUTPUT_PAUSE, NULL); + context->playback->isPaused = 1; //context->playback->isPlaying = 1; context->playback->isForwarding = 0; context->playback->BackWard = 0; @@ -395,6 +399,8 @@ static int32_t PlaybackContinue(Context_t *context) if (context->playback->SlowMotion || context->playback->isForwarding || context->playback->BackWard) context->output->Command(context, OUTPUT_CLEAR, NULL); + context->output->Command(context, OUTPUT_CONTINUE, NULL); + if (context->playback->BackWard) context->output->Command(context, OUTPUT_AUDIOMUTE, "0"); @@ -404,7 +410,6 @@ static int32_t PlaybackContinue(Context_t *context) context->playback->BackWard = 0; context->playback->SlowMotion = 0; context->playback->Speed = 1; - context->output->Command(context, OUTPUT_CONTINUE, NULL); } else { @@ -413,6 +418,7 @@ static int32_t PlaybackContinue(Context_t *context) } playback_printf(10, "exiting with value %d\n", ret); + return ret; } @@ -427,7 +433,6 @@ static int32_t PlaybackStop(Context_t *context) if (context && context->playback && context->playback->isPlaying) { - context->playback->isPaused = 0; context->playback->isPlaying = 0; context->playback->isForwarding = 0; @@ -437,7 +442,6 @@ static int32_t PlaybackStop(Context_t *context) context->output->Command(context, OUTPUT_STOP, NULL); context->container->selectedContainer->Command(context, CONTAINER_STOP, NULL); - } else { @@ -458,13 +462,13 @@ static int32_t PlaybackStop(Context_t *context) } playback_printf(10, "exiting with value %d\n", ret); + return ret; } static int32_t PlaybackTerminate(Context_t *context) { int32_t ret = cERR_PLAYBACK_NO_ERROR; - int wait_time = 20; playback_printf(20, "\n"); @@ -474,12 +478,13 @@ static int32_t PlaybackTerminate(Context_t *context) if (context && context->playback && context->playback->isPlaying) { //First Flush and than delete container, else e2 cant read length of file anymore - if (context->output->Command(context, OUTPUT_FLUSH, NULL) < 0) { playback_err("failed to flush output.\n"); } + ret = context->container->selectedContainer->Command(context, CONTAINER_STOP, NULL); + context->playback->isPaused = 0; context->playback->isPlaying = 0; context->playback->isForwarding = 0; @@ -487,7 +492,6 @@ static int32_t PlaybackTerminate(Context_t *context) context->playback->SlowMotion = 0; context->playback->Speed = 0; context->output->Command(context, OUTPUT_STOP, NULL); - ret = context->container->selectedContainer->Command(context, CONTAINER_STOP, NULL); } else { @@ -512,6 +516,7 @@ static int32_t PlaybackTerminate(Context_t *context) } playback_printf(20, "exiting with value %d\n", ret); + return ret; } @@ -529,6 +534,7 @@ static int PlaybackFastForward(Context_t *context, int *speed) playback_err("speed %d out of range (1 - %d) \n", *speed, cMaxSpeed_ff); return cERR_PLAYBACK_ERROR; } + context->playback->isForwarding = 1; context->playback->Speed = *speed; playback_printf(20, "Speed: %d x {%d}\n", *speed, context->playback->Speed); @@ -561,6 +567,7 @@ static int PlaybackFastBackward(Context_t *context, int *speed) playback_err("speed %d out of range (0 - %d) \n", *speed, cMaxSpeed_fr); return cERR_PLAYBACK_ERROR; } + if (*speed == 0) { context->playback->BackWard = 0; @@ -601,6 +608,7 @@ static int32_t PlaybackSlowMotion(Context_t *context, int *speed) { if (context->playback->isPaused) PlaybackContinue(context); + switch (*speed) { case 2: @@ -613,7 +621,9 @@ static int32_t PlaybackSlowMotion(Context_t *context, int *speed) context->playback->SlowMotion = 8; break; } + playback_printf(20, "SlowMotion: %d x {%d}\n", *speed, context->playback->SlowMotion); + context->output->Command(context, OUTPUT_SLOWMOTION, NULL); } else @@ -726,6 +736,7 @@ static int32_t PlaybackLength(Context_t *context, int64_t *length) } playback_printf(20, "exiting with value %d\n", ret); + return ret; } @@ -753,7 +764,6 @@ static int32_t PlaybackSwitchAudio(Context_t *context, int32_t *track) if (nextrackid != curtrackid) { - //PlaybackPause(context); if (context->output && context->output->audio) { @@ -774,6 +784,7 @@ static int32_t PlaybackSwitchAudio(Context_t *context, int32_t *track) } playback_printf(10, "exiting with value %d\n", ret); + return ret; } @@ -860,7 +871,6 @@ static int32_t Command(Context_t *context, PlaybackCmd_t command, void *argument playback_printf(20, "Command %d\n", command); - switch (command) { case PLAYBACK_OPEN: @@ -898,6 +908,11 @@ static int32_t Command(Context_t *context, PlaybackCmd_t command, void *argument ret = PlaybackTerminate(context); break; } + case PLAYBACK_FASTFORWARD: + { + ret = PlaybackFastForward(context, (int *)argument); + break; + } case PLAYBACK_SEEK: { ret = PlaybackSeek(context, (int64_t *)argument, 0); @@ -943,11 +958,6 @@ static int32_t Command(Context_t *context, PlaybackCmd_t command, void *argument ret = PlaybackFastBackward(context, (int *)argument); break; } - case PLAYBACK_FASTFORWARD: - { - ret = PlaybackFastForward(context, (int *)argument); - break; - } case PLAYBACK_GET_FRAME_COUNT: { ret = PlaybackGetFrameCount(context, (uint64_t *)argument); From 207e36bbb368d6c139353cf8d2593549c0aa1cc7 Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 30 Aug 2018 21:19:18 +0200 Subject: [PATCH 08/29] [libarmbox] libeplayer3-arm code format Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/f66e4edd3f6c25364ad49ed98749dbc958116fc6 Author: max_10 Date: 2018-08-30 (Thu, 30 Aug 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/container/container_ffmpeg.c | 4 ++-- libeplayer3-arm/manager/audio.c | 12 ++++++------ libeplayer3-arm/manager/subtitle.c | 9 +++++++-- libeplayer3-arm/output/output.c | 20 ++++++++++++++++++++ 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/libeplayer3-arm/container/container_ffmpeg.c b/libeplayer3-arm/container/container_ffmpeg.c index 334d326..6729a04 100644 --- a/libeplayer3-arm/container/container_ffmpeg.c +++ b/libeplayer3-arm/container/container_ffmpeg.c @@ -80,13 +80,13 @@ static short debug_level = 1; #define ffmpeg_printf(level, fmt, x...) do { \ -if (debug_level >= level) printf("[%s:%s] " fmt, __FILE__, __FUNCTION__, ## x); } while (0) +if (debug_level >= level) printf("[%s::%s] " fmt, __FILE__, __FUNCTION__, ## x); } while (0) #else #define ffmpeg_printf(level, fmt, x...) #endif #ifndef FFMPEG_SILENT -#define ffmpeg_err(fmt, x...) do { printf("[%s:%s] " fmt, __FILE__, __FUNCTION__, ## x); } while (0) +#define ffmpeg_err(fmt, x...) do { printf("[%s::%s] " fmt, __FILE__, __FUNCTION__, ## x); } while (0) #else #define ffmpeg_err(fmt, x...) #endif diff --git a/libeplayer3-arm/manager/audio.c b/libeplayer3-arm/manager/audio.c index d4eef50..9e029e8 100644 --- a/libeplayer3-arm/manager/audio.c +++ b/libeplayer3-arm/manager/audio.c @@ -46,7 +46,7 @@ static short debug_level = 40; #define audio_mgr_printf(level, fmt, x...) do { \ -if (debug_level >= level) printf("[%s:%s] \n" fmt, __FILE__, __FUNCTION__, ## x); } while (0) +if (debug_level >= level) printf("[%s::%s] \n" fmt, __FILE__, __FUNCTION__, ## x); } while (0) #else #define audio_mgr_printf(level, x...) #endif @@ -97,7 +97,7 @@ static int ManagerAdd(Context_t *context, Track_t track) if (Tracks == NULL) { - audio_mgr_err("%s:%s malloc failed\n", __FILE__, __FUNCTION__); + audio_mgr_err("%s::%s malloc failed\n", __FILE__, __FUNCTION__); return cERR_AUDIO_MGR_ERROR; } @@ -118,7 +118,7 @@ static int ManagerAdd(Context_t *context, Track_t track) } else { - audio_mgr_err("%s:%s TrackCount out if range %d - %d\n", __FILE__, __FUNCTION__, TrackCount, TRACKWRAP); + audio_mgr_err("%s::%s TrackCount out if range %d - %d\n", __FILE__, __FUNCTION__, TrackCount, TRACKWRAP); return cERR_AUDIO_MGR_ERROR; } @@ -145,7 +145,7 @@ static char **ManagerList(Context_t *context __attribute__((unused))) if (tracklist == NULL) { - audio_mgr_err("%s:%s malloc failed\n", __FILE__, __FUNCTION__); + audio_mgr_err("%s::%s malloc failed\n", __FILE__, __FUNCTION__); return NULL; } @@ -183,7 +183,7 @@ static TrackDescription_t *ManagerList(Context_t *context __attribute__((unused if (tracklist == NULL) { - audio_mgr_err("%s:%s malloc failed\n", __FILE__, __FUNCTION__); + audio_mgr_err("%s::%s malloc failed\n", __FILE__, __FUNCTION__); return NULL; } @@ -384,7 +384,7 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) break; } - audio_mgr_printf(10, "%s:%s: returning %d\n", __FILE__, __FUNCTION__, ret); + audio_mgr_printf(10, "%s::%s returning %d\n", __FILE__, __FUNCTION__, ret); return ret; } diff --git a/libeplayer3-arm/manager/subtitle.c b/libeplayer3-arm/manager/subtitle.c index db1761a..5386bde 100644 --- a/libeplayer3-arm/manager/subtitle.c +++ b/libeplayer3-arm/manager/subtitle.c @@ -118,7 +118,7 @@ static int ManagerAdd(Context_t *context __attribute__((unused)), Track_t track) } else { - subtitle_mgr_err("%s:%s TrackCount out if range %d - %d\n", __FILE__, __FUNCTION__, TrackCount, TRACKWRAP); + subtitle_mgr_err("%s::%s TrackCount out if range %d - %d\n", __FILE__, __FUNCTION__, TrackCount, TRACKWRAP); return cERR_SUBTITLE_MGR_ERROR; } @@ -145,7 +145,7 @@ static char **ManagerList(Context_t *context __attribute__((unused))) if (tracklist == NULL) { - subtitle_mgr_err("%s:%s malloc failed\n", __FILE__, __FUNCTION__); + subtitle_mgr_err("%s::%s malloc failed\n", __FILE__, __FUNCTION__); return NULL; } @@ -223,6 +223,8 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) } case MANAGER_GET: { + subtitle_mgr_printf(20, "%s::%s MANAGER_GET\n", FILENAME, __FUNCTION__); + if (TrackCount > 0 && CurrentTrack >= 0) { *((int *)argument) = (int)Tracks[CurrentTrack].Id; @@ -255,6 +257,8 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) } case MANAGER_GET_TRACK: { + subtitle_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME, __FUNCTION__); + if ((TrackCount > 0) && (CurrentTrack >= 0)) { *((Track_t **)argument) = (Track_t *) &Tracks[CurrentTrack]; @@ -292,6 +296,7 @@ static int Command(Context_t *context, ManagerCmd_t command, void *argument) case MANAGER_SET: { int i; + subtitle_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", __FILE__, __FUNCTION__, *((int *)argument)); if (*((int *)argument) < 0) diff --git a/libeplayer3-arm/output/output.c b/libeplayer3-arm/output/output.c index 0544137..c1b3ce4 100644 --- a/libeplayer3-arm/output/output.c +++ b/libeplayer3-arm/output/output.c @@ -192,10 +192,12 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret |= context->output->video->Command(context, OUTPUT_CLOSE, "video"); } + if (context->playback->isAudio) { ret |= context->output->audio->Command(context, OUTPUT_CLOSE, "audio"); } + if (context->playback->isSubtitle) { ret |= context->output->subtitle->Command(context, OUTPUT_CLOSE, "subtitle"); @@ -239,6 +241,7 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret = context->output->audio->Command(context, OUTPUT_PLAY, "audio"); } + if (!ret) { if (context->playback->isSubtitle) @@ -261,10 +264,12 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret |= context->output->video->Command(context, OUTPUT_STOP, "video"); } + if (context->playback->isAudio) { ret |= context->output->audio->Command(context, OUTPUT_STOP, "audio"); } + if (context->playback->isSubtitle) { ret |= context->output->subtitle->Command(context, OUTPUT_STOP, "subtitle"); @@ -284,10 +289,12 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret |= context->output->video->Command(context, OUTPUT_FLUSH, "video"); } + if (context->playback->isAudio) { ret |= context->output->audio->Command(context, OUTPUT_FLUSH, "audio"); } + if (context->playback->isSubtitle) { ret |= context->output->subtitle->Command(context, OUTPUT_FLUSH, "subtitle"); @@ -307,10 +314,12 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret |= context->output->video->Command(context, OUTPUT_PAUSE, "video"); } + if (context->playback->isAudio) { ret |= context->output->audio->Command(context, OUTPUT_PAUSE, "audio"); } + if (context->playback->isSubtitle) { ret |= context->output->subtitle->Command(context, OUTPUT_PAUSE, "subtitle"); @@ -330,6 +339,7 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret |= context->output->video->Command(context, OUTPUT_FASTFORWARD, "video"); } + if (context->playback->isAudio) { ret |= context->output->audio->Command(context, OUTPUT_FASTFORWARD, "audio"); @@ -349,6 +359,7 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret |= context->output->video->Command(context, OUTPUT_REVERSE, "video"); } + if (context->playback->isAudio) { ret |= context->output->audio->Command(context, OUTPUT_REVERSE, "audio"); @@ -368,10 +379,12 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret |= context->output->video->Command(context, OUTPUT_CONTINUE, "video"); } + if (context->playback->isAudio) { ret |= context->output->audio->Command(context, OUTPUT_CONTINUE, "audio"); } + if (context->playback->isSubtitle) { ret |= context->output->subtitle->Command(context, OUTPUT_CONTINUE, "subtitle"); @@ -406,10 +419,12 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret |= context->output->video->Command(context, OUTPUT_CLEAR, "video"); } + if (context->playback->isAudio && (argument == NULL || *(char *) argument == 'a')) { ret |= context->output->audio->Command(context, OUTPUT_CLEAR, "audio"); } + if (context->playback->isSubtitle && (argument == NULL || *(char *) argument == 's')) { ret |= context->output->subtitle->Command(context, OUTPUT_CLEAR, "subtitle"); @@ -429,6 +444,7 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { return context->output->video->Command(context, OUTPUT_PTS, argument); } + if (context->playback->isAudio) { return context->output->audio->Command(context, OUTPUT_PTS, argument); @@ -448,10 +464,12 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { return context->output->audio->Command(context, OUTPUT_SWITCH, "audio"); } + if (context->playback->isVideo) { return context->output->video->Command(context, OUTPUT_SWITCH, "video"); } + if (context->playback->isSubtitle) { return context->output->subtitle->Command(context, OUTPUT_SWITCH, "subtitle"); @@ -471,6 +489,7 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { ret |= context->output->video->Command(context, OUTPUT_SLOWMOTION, "video"); } + if (context->playback->isAudio) { ret |= context->output->audio->Command(context, OUTPUT_SLOWMOTION, "audio"); @@ -520,6 +539,7 @@ static int Command(Context_t *context, OutputCmd_t command, void *argument) { return context->output->video->Command(context, OUTPUT_GET_FRAME_COUNT, argument); } + if (context->playback->isAudio) { return context->output->audio->Command(context, OUTPUT_GET_FRAME_COUNT, argument); From da04353262e1ee5616510008bc03b0df245a087d Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 30 Aug 2018 21:24:46 +0200 Subject: [PATCH 09/29] [libarmbox] libeplayer3-arm reactivate hdmi output which is stopped when neutrino shutdown Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/fcdb2a72d5d97a55122c261b39f82054da8147cd Author: max_10 Date: 2018-08-30 (Thu, 30 Aug 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/main/exteplayer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libeplayer3-arm/main/exteplayer.c b/libeplayer3-arm/main/exteplayer.c index 2adfb22..019a91d 100644 --- a/libeplayer3-arm/main/exteplayer.c +++ b/libeplayer3-arm/main/exteplayer.c @@ -678,6 +678,8 @@ static int ParseParams(int argc, char *argv[], PlayFiles_t *playbackFiles, int * int main(int argc, char *argv[]) { + system("echo 'encoder' > /proc/stb/avs/0/input"); + pthread_t termThread; int isTermThreadStarted = 0; From e1460f18072be3bade3ef8f89505e348a2e6c37f Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Sat, 1 Sep 2018 12:59:15 +0200 Subject: [PATCH 10/29] reset seek position at the end of playback Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/3e66284a1df692f45e2e92e860d4de3c4a9edad7 Author: Jacek Jendrzej Date: 2018-09-01 (Sat, 01 Sep 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/container/container_ffmpeg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libeplayer3-arm/container/container_ffmpeg.c b/libeplayer3-arm/container/container_ffmpeg.c index 6729a04..59fa887 100644 --- a/libeplayer3-arm/container/container_ffmpeg.c +++ b/libeplayer3-arm/container/container_ffmpeg.c @@ -1352,6 +1352,8 @@ static void FFMPEGThread(Context_t *context) hasPlayThreadStarted = 0; context->playback->isPlaying = 0; + seek_target_seconds = 0; + do_seek_target_seconds = 0; PlaybackDieNow(1); ffmpeg_printf(10, "terminating\n"); From 6bbf1dab8ba56441aa6a44e5200effc75cb66ebf Mon Sep 17 00:00:00 2001 From: BPanther Date: Wed, 5 Sep 2018 18:08:50 +0200 Subject: [PATCH 11/29] small fix Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/b4fa159c5c42ca0b594a99b29fd8da2a67ea6305 Author: BPanther Date: 2018-09-05 (Wed, 05 Sep 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- common/ca_ci.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/common/ca_ci.cpp b/common/ca_ci.cpp index aa1fbc6..0f6c05d 100644 --- a/common/ca_ci.cpp +++ b/common/ca_ci.cpp @@ -1652,6 +1652,13 @@ FROM_FIRST: bool cCA::SendCaPMT(eDVBCISlot* slot) { printf("%s -> %s\n", FILENAME, __func__); + if (slot->fd > 0) + { +#if HAVE_ARM_HARDWARE + setInputSource(slot, true); +#endif + setSource(slot); + } if ((slot->fd > 0) && (slot->camIsReady)) { if (slot->hasCAManager) @@ -1667,14 +1674,6 @@ bool cCA::SendCaPMT(eDVBCISlot* slot) slot->camgrSession->sendSPDU(0x90, 0, 0, slot->pmtdata, slot->pmtlen); } } - - if (slot->fd > 0) - { -#if HAVE_ARM_HARDWARE - setInputSource(slot, true); -#endif - setSource(slot); - } return true; } From 8f8679f11391c50ac593c687fae2517c84c18835 Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 20 Sep 2018 16:57:11 +0200 Subject: [PATCH 12/29] Revert "fix missing compiler include" This reverts commit f4bbd252ceac62f593ec586b3febec6565a4eeb0. Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/c18e94c2c95b1208abecb67b5560a3737a828758 Author: max_10 Date: 2018-09-20 (Thu, 20 Sep 2018) ------------------ This commit was generated by Migit --- libeplayer3/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libeplayer3/Makefile.am b/libeplayer3/Makefile.am index 602c42c..814d106 100644 --- a/libeplayer3/Makefile.am +++ b/libeplayer3/Makefile.am @@ -4,7 +4,7 @@ noinst_LTLIBRARIES = libeplayer3.la AM_CPPFLAGS = -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS AM_CPPFLAGS += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -AM_CPPFLAGS += -I$(srcdir)/include -I$(top_srcdir)/include +AM_CPPFLAGS += -I$(srcdir)/include AM_CXXFLAGS = -fno-rtti -fno-exceptions -fno-strict-aliasing libeplayer3_la_SOURCES = \ From 09b8c49c8b12f77d6be164ab708da0c82bc31ac0 Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 20 Sep 2018 16:58:06 +0200 Subject: [PATCH 13/29] Revert "changed raspi to own thread class" This reverts commit a93605761900887923e05d323525ec608bca003c. Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/9138f023f2c29780824c9b4401444c73cfc0b8af Author: max_10 Date: 2018-09-20 (Thu, 20 Sep 2018) ------------------ This commit was generated by Migit --- raspi/Makefile.am | 3 ++- raspi/glfb.cpp | 10 +++++----- raspi/glfb.h | 6 +++--- raspi/init.cpp | 8 ++++---- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/raspi/Makefile.am b/raspi/Makefile.am index 3bc2d31..32cd87a 100644 --- a/raspi/Makefile.am +++ b/raspi/Makefile.am @@ -10,7 +10,8 @@ AM_CPPFLAGS += \ AM_CXXFLAGS = -fno-rtti -fno-exceptions -fno-strict-aliasing AM_LDFLAGS = \ - -L/opt/vc/lib/ -lopenmaxil -lbcm_host -lvcos -lvchiq_arm -lpthread -lrt + -L/opt/vc/lib/ -lopenmaxil -lbcm_host -lvcos -lvchiq_arm -lpthread -lrt \ + -lOpenThreads libraspi_la_SOURCES = \ hardware_caps.c \ diff --git a/raspi/glfb.cpp b/raspi/glfb.cpp index 764afa9..45d6473 100644 --- a/raspi/glfb.cpp +++ b/raspi/glfb.cpp @@ -19,7 +19,7 @@ */ #include -#include +#include #include "glfb.h" #include "bcm_host.h" @@ -47,8 +47,8 @@ static int curr_res; static int pitch; static VC_IMAGE_TYPE_T type = VC_IMAGE_ARGB8888; -static Mutex blit_mutex; -static Condition blit_cond; +static OpenThreads::Mutex blit_mutex; +static OpenThreads::Condition blit_cond; static bool goodbye = false; /* if set main loop is left */ static bool ready = false; /* condition predicate */ @@ -71,7 +71,7 @@ GLFramebuffer::GLFramebuffer(int x, int y) si.red.offset = 16; si.transp.offset = 24; - Thread::start(); + OpenThreads::Thread::start(); while (!ready) usleep(1); } @@ -80,7 +80,7 @@ GLFramebuffer::~GLFramebuffer() { goodbye = true; blit(); /* wake up thread */ - Thread::join(); + OpenThreads::Thread::join(); } void GLFramebuffer::run() diff --git a/raspi/glfb.h b/raspi/glfb.h index 68e2055..c5fcce6 100644 --- a/raspi/glfb.h +++ b/raspi/glfb.h @@ -17,11 +17,11 @@ #ifndef __glthread__ #define __glthread__ -#include +#include #include #include /* for screeninfo etc. */ -class GLFramebuffer : public Thread +class GLFramebuffer : public OpenThreads::Thread { public: GLFramebuffer(int x, int y); @@ -34,7 +34,7 @@ private: void *pdata; /* not yet used */ fb_var_screeninfo si; std::vector osd_buf; /* silly bounce buffer */ - void run(); /* for Thread */ + void run(); /* for OpenThreads::Thread */ void setup(); void blit_osd(); diff --git a/raspi/init.cpp b/raspi/init.cpp index 6e6adfc..47f6d9e 100644 --- a/raspi/init.cpp +++ b/raspi/init.cpp @@ -32,7 +32,7 @@ #include #include -#include +#include #include "init_td.h" #include "lt_debug.h" @@ -69,7 +69,7 @@ static void init_keymap(void) kmap[KEY_F8] = KEY_SLEEP; } -class Input: public Thread +class Input: public OpenThreads::Thread { public: Input(); @@ -82,13 +82,13 @@ class Input: public Thread Input::Input() { Init(); - Thread::start(); + start(); } Input::~Input() { running = false; - Thread::join(); + join(); } static int dirfilter(const struct dirent *d) From 9a0a03c7338e1b62f293c8fd3902c045b09e15c5 Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 20 Sep 2018 17:18:35 +0200 Subject: [PATCH 14/29] Revert "change libeplayer3 to own thread class" This reverts commit 3f238feb60426c4e4720e6a42c8697174549d0b2. Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/b313db12a14a5b167285065015e389076ce6c8de Author: max_10 Date: 2018-09-20 (Thu, 20 Sep 2018) ------------------ This commit was generated by Migit --- libeplayer3/include/input.h | 6 +++-- libeplayer3/include/manager.h | 6 +++-- libeplayer3/include/output.h | 6 +++-- libeplayer3/include/player.h | 6 +++-- libeplayer3/input.cpp | 10 +++---- libeplayer3/manager.cpp | 14 +++++----- libeplayer3/output.cpp | 50 +++++++++++++++++------------------ libeplayer3/player.cpp | 4 +-- 8 files changed, 55 insertions(+), 47 deletions(-) diff --git a/libeplayer3/include/input.h b/libeplayer3/include/input.h index 2488cf9..d27e0fa 100644 --- a/libeplayer3/include/input.h +++ b/libeplayer3/include/input.h @@ -26,7 +26,9 @@ #include #include -#include +#include +#include +#include extern "C" { #include @@ -46,7 +48,7 @@ class Input friend int interrupt_cb(void *arg); private: - Mutex mutex; + OpenThreads::Mutex mutex; Track *videoTrack; Track *audioTrack; diff --git a/libeplayer3/include/manager.h b/libeplayer3/include/manager.h index 41ef416..364595b 100644 --- a/libeplayer3/include/manager.h +++ b/libeplayer3/include/manager.h @@ -26,7 +26,9 @@ #include #include -#include +#include +#include +#include extern "C" { #include @@ -64,7 +66,7 @@ class Manager private: Player *player; - Mutex mutex; + OpenThreads::Mutex mutex; std::map videoTracks, audioTracks, subtitleTracks, teletextTracks; std::map Programs; void addTrack(std::map &tracks, Track &track); diff --git a/libeplayer3/include/output.h b/libeplayer3/include/output.h index 2fec93e..b154427 100644 --- a/libeplayer3/include/output.h +++ b/libeplayer3/include/output.h @@ -26,7 +26,9 @@ #include #include -#include +#include +#include +#include extern "C" { #include @@ -48,7 +50,7 @@ class Output int videofd; int audiofd; Writer *videoWriter, *audioWriter; - Mutex audioMutex, videoMutex; + OpenThreads::Mutex audioMutex, videoMutex; Track *audioTrack, *videoTrack; Player *player; public: diff --git a/libeplayer3/include/player.h b/libeplayer3/include/player.h index 93629a6..b675adc 100644 --- a/libeplayer3/include/player.h +++ b/libeplayer3/include/player.h @@ -21,7 +21,9 @@ #ifndef __PLAYER_H__ #define __PLAYER_H__ -#include +#include +#include +#include extern "C" { #include @@ -61,7 +63,7 @@ class Player { Input input; Output output; Manager manager; - Mutex chapterMutex; + OpenThreads::Mutex chapterMutex; std::vector chapters; pthread_t playThread; diff --git a/libeplayer3/input.cpp b/libeplayer3/input.cpp index 9af9aae..30f4d68 100644 --- a/libeplayer3/input.cpp +++ b/libeplayer3/input.cpp @@ -291,17 +291,17 @@ static int lock_callback(void **mutex, enum AVLockOp op) { switch (op) { case AV_LOCK_CREATE: - *mutex = (void *) new Mutex; + *mutex = (void *) new OpenThreads::Mutex; return !*mutex; case AV_LOCK_DESTROY: - delete static_cast(*mutex); + delete static_cast(*mutex); *mutex = NULL; return 0; case AV_LOCK_OBTAIN: - static_cast(*mutex)->lock(); + static_cast(*mutex)->lock(); return 0; case AV_LOCK_RELEASE: - static_cast(*mutex)->unlock(); + static_cast(*mutex)->unlock(); return 0; default: return -1; @@ -657,7 +657,7 @@ bool Input::Stop() av_log(NULL, AV_LOG_QUIET, "%s", ""); if (avfc) { - ScopedLock lock(mutex); + OpenThreads::ScopedLock lock(mutex); for (unsigned int i = 0; i < avfc->nb_streams; i++) avcodec_close(avfc->streams[i]->codec); avformat_close_input(&avfc); diff --git a/libeplayer3/manager.cpp b/libeplayer3/manager.cpp index 275205c..da39024 100644 --- a/libeplayer3/manager.cpp +++ b/libeplayer3/manager.cpp @@ -25,7 +25,7 @@ void Manager::addTrack(std::map &tracks, Track &track) { - ScopedLock m_lock(mutex); + OpenThreads::ScopedLock m_lock(mutex); std::map::iterator it = tracks.find(track.pid); if (it == tracks.end()) { Track *t = new Track; @@ -59,7 +59,7 @@ std::vector Manager::getTracks(std::map &tracks) { player->input.UpdateTracks(); std::vector res; - ScopedLock m_lock(mutex); + OpenThreads::ScopedLock m_lock(mutex); for(std::map::iterator it = tracks.begin(); it != tracks.end(); ++it) if (!it->second->inactive && !it->second->hidden) res.push_back(*it->second); @@ -88,7 +88,7 @@ std::vector Manager::getTeletextTracks() Track *Manager::getTrack(std::map &tracks, int pid) { - ScopedLock m_lock(mutex); + OpenThreads::ScopedLock m_lock(mutex); std::map::iterator it = tracks.find(pid); if (it != tracks.end() && !it->second->inactive) return it->second; @@ -116,7 +116,7 @@ Track *Manager::getTeletextTrack(int pid) bool Manager::initTrackUpdate() { - ScopedLock m_lock(mutex); + OpenThreads::ScopedLock m_lock(mutex); for (std::map::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it) it->second->inactive = !it->second->is_static; @@ -140,7 +140,7 @@ void Manager::addProgram(Program &program) std::vector Manager::getPrograms(void) { - ScopedLock m_lock(mutex); + OpenThreads::ScopedLock m_lock(mutex); std::vector res; for (std::map::iterator it = Programs.begin(); it != Programs.end(); ++it) res.push_back(it->second); @@ -149,7 +149,7 @@ std::vector Manager::getPrograms(void) bool Manager::selectProgram(const int id) { - ScopedLock m_lock(mutex); + OpenThreads::ScopedLock m_lock(mutex); std::map::iterator i = Programs.find(id); if (i != Programs.end()) { @@ -236,7 +236,7 @@ bool Manager::selectProgram(const int id) void Manager::clearTracks() { - ScopedLock m_lock(mutex); + OpenThreads::ScopedLock m_lock(mutex); for (std::map::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it) delete it->second; diff --git a/libeplayer3/output.cpp b/libeplayer3/output.cpp index 431dcb5..11e4eb7 100644 --- a/libeplayer3/output.cpp +++ b/libeplayer3/output.cpp @@ -68,9 +68,9 @@ Output::~Output() bool Output::Open() { - ScopedLock v_lock(videoMutex); - ScopedLock a_lock(audioMutex); - + OpenThreads::ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock a_lock(audioMutex); + if (videofd < 0) videofd = open(VIDEODEV, O_RDWR); @@ -102,8 +102,8 @@ bool Output::Close() { Stop(); - ScopedLock v_lock(videoMutex); - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock a_lock(audioMutex); if (videofd > -1) { close(videofd); @@ -124,8 +124,8 @@ bool Output::Play() { bool ret = true; - ScopedLock v_lock(videoMutex); - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock a_lock(audioMutex); AVCodecContext *avcc; @@ -154,8 +154,8 @@ bool Output::Stop() { bool ret = true; - ScopedLock v_lock(videoMutex); - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock a_lock(audioMutex); if (videofd > -1) { ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL); @@ -180,8 +180,8 @@ bool Output::Pause() { bool ret = true; - ScopedLock v_lock(videoMutex); - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock a_lock(audioMutex); if (videofd > -1) { if (dioctl(videofd, VIDEO_FREEZE, NULL)) @@ -200,8 +200,8 @@ bool Output::Continue() { bool ret = true; - ScopedLock v_lock(videoMutex); - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock a_lock(audioMutex); if (videofd > -1 && dioctl(videofd, VIDEO_CONTINUE, NULL)) ret = false; @@ -214,7 +214,7 @@ bool Output::Continue() bool Output::Mute(bool b) { - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock a_lock(audioMutex); //AUDIO_SET_MUTE has no effect with new player return audiofd > -1 && !dioctl(audiofd, b ? AUDIO_STOP : AUDIO_PLAY, NULL); } @@ -224,8 +224,8 @@ bool Output::Flush() { bool ret = true; - ScopedLock v_lock(videoMutex); - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock a_lock(audioMutex); if (videofd > -1 && ioctl(videofd, VIDEO_FLUSH, NULL)) ret = false; @@ -246,31 +246,31 @@ bool Output::Flush() bool Output::FastForward(int speed) { - ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock v_lock(videoMutex); return videofd > -1 && !dioctl(videofd, VIDEO_FAST_FORWARD, speed); } bool Output::SlowMotion(int speed) { - ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock v_lock(videoMutex); return videofd > -1 && !dioctl(videofd, VIDEO_SLOWMOTION, speed); } bool Output::AVSync(bool b) { - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock a_lock(audioMutex); return audiofd > -1 && !dioctl(audiofd, AUDIO_SET_AV_SYNC, b); } bool Output::ClearAudio() { - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock a_lock(audioMutex); return audiofd > -1 && !ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL); } bool Output::ClearVideo() { - ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock v_lock(videoMutex); return videofd > -1 && !ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL); } @@ -302,7 +302,7 @@ bool Output::GetFrameCount(int64_t &framecount) bool Output::SwitchAudio(Track *track) { - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock a_lock(audioMutex); if (audioTrack && track->stream == audioTrack->stream) return true; if (audiofd > -1) { @@ -329,7 +329,7 @@ bool Output::SwitchAudio(Track *track) bool Output::SwitchVideo(Track *track) { - ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock v_lock(videoMutex); if (videoTrack && track->stream == videoTrack->stream) return true; if (videofd > -1) { @@ -355,11 +355,11 @@ bool Output::Write(AVStream *stream, AVPacket *packet, int64_t pts) { switch (stream->codec->codec_type) { case AVMEDIA_TYPE_VIDEO: { - ScopedLock v_lock(videoMutex); + OpenThreads::ScopedLock v_lock(videoMutex); return videofd > -1 && videoWriter && videoWriter->Write(packet, pts); } case AVMEDIA_TYPE_AUDIO: { - ScopedLock a_lock(audioMutex); + OpenThreads::ScopedLock a_lock(audioMutex); return audiofd > -1 && audioWriter && audioWriter->Write(packet, pts); } default: diff --git a/libeplayer3/player.cpp b/libeplayer3/player.cpp index 2c0bfe5..37ad7c1 100644 --- a/libeplayer3/player.cpp +++ b/libeplayer3/player.cpp @@ -372,7 +372,7 @@ bool Player::GetChapters(std::vector &positions, std::vector & positions.clear(); titles.clear(); input.UpdateTracks(); - ScopedLock m_lock(chapterMutex); + OpenThreads::ScopedLock m_lock(chapterMutex); for (std::vector::iterator it = chapters.begin(); it != chapters.end(); ++it) { positions.push_back(it->start/1000); titles.push_back(it->title); @@ -382,7 +382,7 @@ bool Player::GetChapters(std::vector &positions, std::vector & void Player::SetChapters(std::vector &Chapters) { - ScopedLock m_lock(chapterMutex); + OpenThreads::ScopedLock m_lock(chapterMutex); chapters = Chapters; } From 4cabdf7d12cf7325eb6db5c3631e74dda4f5218d Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 20 Sep 2018 17:42:13 +0200 Subject: [PATCH 15/29] Revert "move libthread to libstb-hal" This reverts commit d5cea508e05a6b38b1edf38d7725cd41217d7c6a. Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/6b8b8cd55145e171b75123cf3a4ba9624c62e040 Author: max_10 Date: 2018-09-20 (Thu, 20 Sep 2018) ------------------ This commit was generated by Migit --- Makefile.am | 5 +- common/Makefile.am | 2 + {libthread => common}/mutex_abstraction.cpp | 12 +---- {include => common}/mutex_abstraction.h | 9 +--- common/thread_abstraction.cpp | 34 ++++++++++++ common/thread_abstraction.h | 25 +++++++++ configure.ac | 1 - generic-pc/audio.cpp | 4 +- generic-pc/audio_lib.h | 3 +- generic-pc/dmx.cpp | 31 +++-------- generic-pc/glfb.cpp | 4 +- generic-pc/glfb.h | 6 +-- generic-pc/video.cpp | 4 +- generic-pc/video_lib.h | 6 +-- include/condition_abstraction.h | 23 -------- include/reentrant_mutex.h | 16 ------ include/scoped_lock.h | 18 ------- include/thread_abstraction.h | 30 ----------- libthread/Makefile.am | 16 ------ libthread/condition_abstraction.cpp | 27 ---------- libthread/reentrant_mutex.cpp | 11 ---- libthread/scoped_lock.cpp | 12 ----- libthread/thread_abstraction.cpp | 58 --------------------- 23 files changed, 85 insertions(+), 272 deletions(-) rename {libthread => common}/mutex_abstraction.cpp (52%) rename {include => common}/mutex_abstraction.h (68%) create mode 100644 common/thread_abstraction.cpp create mode 100644 common/thread_abstraction.h delete mode 100644 include/condition_abstraction.h delete mode 100644 include/reentrant_mutex.h delete mode 100644 include/scoped_lock.h delete mode 100644 include/thread_abstraction.h delete mode 100644 libthread/Makefile.am delete mode 100644 libthread/condition_abstraction.cpp delete mode 100644 libthread/reentrant_mutex.cpp delete mode 100644 libthread/scoped_lock.cpp delete mode 100644 libthread/thread_abstraction.cpp diff --git a/Makefile.am b/Makefile.am index 5466534..c26789f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,12 +2,11 @@ ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libstb-hal.la libstb_hal_la_SOURCES = -SUBDIRS = common tools libthread +SUBDIRS = common tools #bin_PROGRAMS = libstb-hal-test libstb_hal_la_LIBADD = \ - common/libcommon.la \ - libthread/libthread.la + common/libcommon.la #libstb_hal_test_SOURCES = libtest.cpp diff --git a/common/Makefile.am b/common/Makefile.am index 17395fc..86f3517 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -31,6 +31,8 @@ endif endif libcommon_la_SOURCES += \ + thread_abstraction.cpp \ + mutex_abstraction.cpp \ lt_debug.cpp \ proc_tools.c \ pwrmngr.cpp diff --git a/libthread/mutex_abstraction.cpp b/common/mutex_abstraction.cpp similarity index 52% rename from libthread/mutex_abstraction.cpp rename to common/mutex_abstraction.cpp index 906407a..a5a886f 100644 --- a/libthread/mutex_abstraction.cpp +++ b/common/mutex_abstraction.cpp @@ -1,4 +1,4 @@ -#include +#include "mutex_abstraction.h" Mutex::Mutex() : mMutex() @@ -6,16 +6,6 @@ Mutex::Mutex() : pthread_mutex_init(&mMutex, 0); } -Mutex::Mutex(int attr) : - mMutex() -{ - pthread_mutexattr_t Attr; - - pthread_mutexattr_init(&Attr); - pthread_mutexattr_settype(&Attr, attr); - pthread_mutex_init(&mMutex, &Attr); -} - Mutex::~Mutex() { pthread_mutex_destroy(&mMutex); diff --git a/include/mutex_abstraction.h b/common/mutex_abstraction.h similarity index 68% rename from include/mutex_abstraction.h rename to common/mutex_abstraction.h index 3ea5357..c2b78d8 100644 --- a/include/mutex_abstraction.h +++ b/common/mutex_abstraction.h @@ -5,21 +5,16 @@ class Mutex { - friend class Condition; - pthread_mutex_t mMutex; Mutex(const Mutex&); const Mutex& operator=(const Mutex&); - protected: - explicit Mutex(int); - public: Mutex(); virtual ~Mutex(); - virtual void lock(); - virtual void unlock(); + void lock(); + void unlock(); }; #endif diff --git a/common/thread_abstraction.cpp b/common/thread_abstraction.cpp new file mode 100644 index 0000000..0494fc4 --- /dev/null +++ b/common/thread_abstraction.cpp @@ -0,0 +1,34 @@ +#include "thread_abstraction.h" + +SimpleThread::SimpleThread() : + mIsRunning(false), + mThread() +{ +} + +SimpleThread::~SimpleThread() +{ + // if thread is still running on object destruction, cancel thread the hard way: + if (mIsRunning) + { + pthread_cancel(mThread); + } +} + +void SimpleThread::startThread() +{ + mIsRunning = true; + pthread_create(&mThread, 0, &SimpleThread::runThread, this); +} + +void SimpleThread::joinThread() +{ + pthread_join(mThread, 0); + mIsRunning = false; +} + +void* SimpleThread::runThread(void* ptr) +{ + static_cast(ptr)->run(); + return 0; +} diff --git a/common/thread_abstraction.h b/common/thread_abstraction.h new file mode 100644 index 0000000..45a20b6 --- /dev/null +++ b/common/thread_abstraction.h @@ -0,0 +1,25 @@ +#ifndef _SIMPLETHREAD_ABSTRACTION_H +#define _SIMPLETHREAD_ABSTRACTION_H + +#include + +class SimpleThread +{ + bool mIsRunning; + pthread_t mThread; + + static void* runThread(void*); + SimpleThread(const SimpleThread&); + const SimpleThread& operator=(const SimpleThread&); + + public: + SimpleThread(); + ~SimpleThread(); + void startThread(); + void joinThread(); + + protected: + virtual void run() = 0; +}; + +#endif diff --git a/configure.ac b/configure.ac index 56eb4ba..767eee6 100644 --- a/configure.ac +++ b/configure.ac @@ -76,7 +76,6 @@ Makefile common/Makefile libeplayer3/Makefile libeplayer3-arm/Makefile -libthread/Makefile azbox/Makefile generic-pc/Makefile libduckbox/Makefile diff --git a/generic-pc/audio.cpp b/generic-pc/audio.cpp index 1bba357..0ee8b3b 100644 --- a/generic-pc/audio.cpp +++ b/generic-pc/audio.cpp @@ -104,7 +104,7 @@ int cAudio::Start(void) { lt_debug("%s >\n", __func__); if (! HAL_nodec) - Thread::startThread(); + SimpleThread::startThread(); lt_debug("%s <\n", __func__); return 0; } @@ -115,7 +115,7 @@ int cAudio::Stop(void) if (thread_started) { thread_started = false; - Thread::joinThread(); + SimpleThread::joinThread(); } lt_debug("%s <\n", __func__); return 0; diff --git a/generic-pc/audio_lib.h b/generic-pc/audio_lib.h index dc09c8d..6bcd80a 100644 --- a/generic-pc/audio_lib.h +++ b/generic-pc/audio_lib.h @@ -4,7 +4,6 @@ #define _AUDIO_LIB_H_ #include -#include #include "cs_types.h" typedef enum @@ -38,7 +37,7 @@ typedef enum AUDIO_FMT_ADVANCED = AUDIO_FMT_MLP } AUDIO_FORMAT; -class cAudio : public Thread +class cAudio : public SimpleThread { friend class cPlayback; private: diff --git a/generic-pc/dmx.cpp b/generic-pc/dmx.cpp index 6609693..769a971 100644 --- a/generic-pc/dmx.cpp +++ b/generic-pc/dmx.cpp @@ -64,15 +64,12 @@ static const char *DMX_T[] = { }; /* map the device numbers. for now only demux0 is used */ -#define NUM_DEMUXDEV 1 -static const char *devname[NUM_DEMUXDEV] = { +static const char *devname[] = { "/dev/dvb/adapter0/demux0", + "/dev/dvb/adapter0/demux0", + "/dev/dvb/adapter0/demux0" }; -#define NUM_DEMUX 1 -static int dmx_source[NUM_DEMUX] = { 0 }; -static bool init[NUM_DEMUXDEV] = { false }; - /* uuuugly */ static int dmx_tp_count = 0; #define MAX_TS_COUNT 8 @@ -492,28 +489,12 @@ int cDemux::getUnit(void) bool cDemux::SetSource(int unit, int source) { - //lt_info_c("%s(%d, %d): not implemented yet\n", __func__, unit, source); - //return true; - if (unit >= NUM_DEMUX || unit < 0) { - lt_info_c("%s: unit (%d) out of range, NUM_DEMUX %d\n", __func__, unit, NUM_DEMUX); - return false; - } - lt_info_c("%s(%d, %d) => %d to %d\n", __func__, unit, source, dmx_source[unit], source); - if (source < 0 || source >= NUM_DEMUXDEV) - lt_info_c("%s(%d, %d) ERROR: source %d out of range!\n", __func__, unit, source, source); - else - dmx_source[unit] = source; + lt_info_c("%s(%d, %d): not implemented yet\n", __func__, unit, source); return true; } int cDemux::GetSource(int unit) { - //lt_info_c("%s(%d): not implemented yet\n", __func__, unit); - //return 0; - if (unit >= NUM_DEMUX || unit < 0) { - lt_info_c("%s: unit (%d) out of range, NUM_DEMUX %d\n", __func__, unit, NUM_DEMUX); - return -1; - } - lt_info_c("%s(%d) => %d\n", __func__, unit, dmx_source[unit]); - return dmx_source[unit]; + lt_info_c("%s(%d): not implemented yet\n", __func__, unit); + return 0; } diff --git a/generic-pc/glfb.cpp b/generic-pc/glfb.cpp index a838997..3cffd0e 100644 --- a/generic-pc/glfb.cpp +++ b/generic-pc/glfb.cpp @@ -97,7 +97,7 @@ GLFramebuffer::GLFramebuffer(int x, int y): mReInit(true), mShutDown(false), mIn if (input_fd < 0) lt_info("%s: could not open /tmp/neutrino.input FIFO: %m\n", __func__); initKeys(); - Thread::startThread(); + SimpleThread::startThread(); while (!mInitDone) usleep(1); } @@ -105,7 +105,7 @@ GLFramebuffer::GLFramebuffer(int x, int y): mReInit(true), mShutDown(false), mIn GLFramebuffer::~GLFramebuffer() { mShutDown = true; - Thread::joinThread(); + SimpleThread::joinThread(); if (input_fd >= 0) close(input_fd); } diff --git a/generic-pc/glfb.h b/generic-pc/glfb.h index 6cb803d..755a01f 100644 --- a/generic-pc/glfb.h +++ b/generic-pc/glfb.h @@ -18,8 +18,8 @@ #ifndef __glthread__ #define __glthread__ -#include -#include +#include "../common/thread_abstraction.h" +#include "../common/mutex_abstraction.h" #include #include @@ -31,7 +31,7 @@ extern "C" { #include } -class GLFramebuffer : public Thread +class GLFramebuffer : public SimpleThread { public: GLFramebuffer(int x, int y); diff --git a/generic-pc/video.cpp b/generic-pc/video.cpp index abcfd75..06ea690 100644 --- a/generic-pc/video.cpp +++ b/generic-pc/video.cpp @@ -145,7 +145,7 @@ int cVideo::Start(void *, unsigned short, unsigned short, void *) { lt_debug("%s running %d >\n", __func__, thread_running); if (!thread_running && !HAL_nodec) - Thread::startThread(); + SimpleThread::startThread(); lt_debug("%s running %d <\n", __func__, thread_running); return 0; } @@ -155,7 +155,7 @@ int cVideo::Stop(bool) lt_debug("%s running %d >\n", __func__, thread_running); if (thread_running) { thread_running = false; - Thread::joinThread(); + SimpleThread::joinThread(); } lt_debug("%s running %d <\n", __func__, thread_running); return 0; diff --git a/generic-pc/video_lib.h b/generic-pc/video_lib.h index a8274e8..144b53f 100644 --- a/generic-pc/video_lib.h +++ b/generic-pc/video_lib.h @@ -1,8 +1,8 @@ #ifndef _VIDEO_LIB_H #define _VIDEO_LIB_H -#include -#include +#include "../common/thread_abstraction.h" +#include "../common/mutex_abstraction.h" #include #include #include "cs_types.h" @@ -121,7 +121,7 @@ typedef enum #define VDEC_MAXBUFS 0x30 -class cVideo : public Thread +class cVideo : public SimpleThread { friend class GLFramebuffer; friend class cDemux; diff --git a/include/condition_abstraction.h b/include/condition_abstraction.h deleted file mode 100644 index 8374efa..0000000 --- a/include/condition_abstraction.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _CONDITION_ABSTRACTION_H -#define _CONDITION_ABSTRACTION_H - -#include - -#include "mutex_abstraction.h" - -class Condition -{ - pthread_cond_t mCondition; - - Condition(const Condition&); - const Condition& operator=(const Condition&); - - public: - Condition(); - virtual ~Condition(); - virtual int wait(Mutex* const aMutex); - virtual int broadcast(); - virtual int signal(); -}; - -#endif diff --git a/include/reentrant_mutex.h b/include/reentrant_mutex.h deleted file mode 100644 index bf9f740..0000000 --- a/include/reentrant_mutex.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _REENTRANT_MUTEX_H -#define _REENTRANT_MUTEX_H - -#include "mutex_abstraction.h" - -class ReentrantMutex : public Mutex -{ - ReentrantMutex(const ReentrantMutex&); - const ReentrantMutex& operator=(const ReentrantMutex&); - - public: - ReentrantMutex(); - virtual ~ReentrantMutex(); -}; - -#endif diff --git a/include/scoped_lock.h b/include/scoped_lock.h deleted file mode 100644 index 0c1fdb2..0000000 --- a/include/scoped_lock.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _SCOPED_LOCK_H -#define _SCOPED_LOCK_H - -#include "mutex_abstraction.h" - -class ScopedLock -{ - Mutex& mMutex; - - ScopedLock(const ScopedLock&); - const ScopedLock& operator=(const ScopedLock&); - - public: - ScopedLock(Mutex&); - ~ScopedLock(); -}; - -#endif diff --git a/include/thread_abstraction.h b/include/thread_abstraction.h deleted file mode 100644 index 12f9f76..0000000 --- a/include/thread_abstraction.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _THREAD_ABSTRACTION_H -#define _THREAD_ABSTRACTION_H - -#include - -class Thread -{ - bool mIsRunning; - pthread_t mThread; - - static void* runThread(void*); - Thread(const Thread&); - const Thread& operator=(const Thread&); - - public: - Thread(); - virtual ~Thread(); - int startThread(); - int cancelThread(); - int detachThread(); - int joinThread(); - - int setCancelModeDisable(); - int setSchedulePriority(int); - - protected: - virtual void run() = 0; -}; - -#endif diff --git a/libthread/Makefile.am b/libthread/Makefile.am deleted file mode 100644 index 9369b1f..0000000 --- a/libthread/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -noinst_LTLIBRARIES = libthread.la - -AM_CPPFLAGS = -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -AM_CPPFLAGS += \ - -I$(top_srcdir)/include - -AM_CXXFLAGS = -fno-rtti -fno-exceptions -fno-strict-aliasing - -AM_LDFLAGS = -lpthread -lrt - -libthread_la_SOURCES = \ - condition_abstraction.cpp \ - reentrant_mutex.cpp \ - scoped_lock.cpp \ - thread_abstraction.cpp \ - mutex_abstraction.cpp diff --git a/libthread/condition_abstraction.cpp b/libthread/condition_abstraction.cpp deleted file mode 100644 index 68d246a..0000000 --- a/libthread/condition_abstraction.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include - -Condition::Condition() : - mCondition() -{ - pthread_cond_init(&mCondition, 0); -} - -Condition::~Condition() -{ - pthread_cond_destroy(&mCondition); -} - -int Condition::wait(Mutex* const aMutex) -{ - return pthread_cond_wait(&mCondition, &(aMutex->mMutex)); -} - -int Condition::broadcast() -{ - return pthread_cond_broadcast(&mCondition); -} - -int Condition::signal() -{ - return pthread_cond_signal(&mCondition); -} diff --git a/libthread/reentrant_mutex.cpp b/libthread/reentrant_mutex.cpp deleted file mode 100644 index 82c3069..0000000 --- a/libthread/reentrant_mutex.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -ReentrantMutex::ReentrantMutex() : - Mutex(PTHREAD_MUTEX_RECURSIVE) -{ -} - -ReentrantMutex::~ReentrantMutex() -{ - //safely destroyed in ~Mutex(); -} diff --git a/libthread/scoped_lock.cpp b/libthread/scoped_lock.cpp deleted file mode 100644 index 7ff573d..0000000 --- a/libthread/scoped_lock.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include - -ScopedLock::ScopedLock(Mutex& aMutex) : - mMutex(aMutex) -{ - mMutex.lock(); -} - -ScopedLock::~ScopedLock() -{ - mMutex.unlock(); -} diff --git a/libthread/thread_abstraction.cpp b/libthread/thread_abstraction.cpp deleted file mode 100644 index afaff86..0000000 --- a/libthread/thread_abstraction.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include - -Thread::Thread() : - mIsRunning(false), - mThread() -{ -} - -Thread::~Thread() -{ - // if thread is still running on object destruction, cancel thread the hard way: - if (mIsRunning) - { - pthread_cancel(mThread); - } -} - -int Thread::startThread() -{ - mIsRunning = true; - return pthread_create(&mThread, 0, &Thread::runThread, this); -} - -int Thread::cancelThread() -{ - return pthread_cancel(mThread); - mIsRunning = false; -} - -int Thread::detachThread() -{ - mIsRunning = false; // thread shall not cancel on object destruction! - return pthread_detach(mThread); -} - -int Thread::joinThread() -{ - int ret = pthread_join(mThread, 0); - mIsRunning = false; - return ret; -} - -int Thread::setCancelModeDisable() -{ - return pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 0); -} - -int Thread::setSchedulePriority(int prio) -{ - return pthread_setschedprio(mThread, prio); -} - -void* Thread::runThread(void* ptr) -{ - Thread* t = static_cast(ptr); - t->run(); - return 0; -} From c36afa86ec77a337081d01b03d0ed27023e382ef Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 20 Sep 2018 17:42:46 +0200 Subject: [PATCH 16/29] Revert "fix thread namespace" This reverts commit 03a7525218ce205ec0a508109ff9ca4179bc7408. Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/1790425e86565fd2f2c77067c0b36cc9d10d50ac Author: max_10 Date: 2018-09-20 (Thu, 20 Sep 2018) ------------------ This commit was generated by Migit --- common/thread_abstraction.cpp | 14 +++++++------- common/thread_abstraction.h | 14 +++++++------- generic-pc/audio.cpp | 4 ++-- generic-pc/audio_lib.h | 2 +- generic-pc/glfb.cpp | 4 ++-- generic-pc/glfb.h | 2 +- generic-pc/video.cpp | 4 ++-- generic-pc/video_lib.h | 2 +- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/common/thread_abstraction.cpp b/common/thread_abstraction.cpp index 0494fc4..271755c 100644 --- a/common/thread_abstraction.cpp +++ b/common/thread_abstraction.cpp @@ -1,12 +1,12 @@ #include "thread_abstraction.h" -SimpleThread::SimpleThread() : +Thread::Thread() : mIsRunning(false), mThread() { } -SimpleThread::~SimpleThread() +Thread::~Thread() { // if thread is still running on object destruction, cancel thread the hard way: if (mIsRunning) @@ -15,20 +15,20 @@ SimpleThread::~SimpleThread() } } -void SimpleThread::startThread() +void Thread::startThread() { mIsRunning = true; - pthread_create(&mThread, 0, &SimpleThread::runThread, this); + pthread_create(&mThread, 0, &Thread::runThread, this); } -void SimpleThread::joinThread() +void Thread::joinThread() { pthread_join(mThread, 0); mIsRunning = false; } -void* SimpleThread::runThread(void* ptr) +void* Thread::runThread(void* ptr) { - static_cast(ptr)->run(); + ((Thread*)ptr)->run(); return 0; } diff --git a/common/thread_abstraction.h b/common/thread_abstraction.h index 45a20b6..3c3e35f 100644 --- a/common/thread_abstraction.h +++ b/common/thread_abstraction.h @@ -1,20 +1,20 @@ -#ifndef _SIMPLETHREAD_ABSTRACTION_H -#define _SIMPLETHREAD_ABSTRACTION_H +#ifndef _THREAD_ABSTRACTION_H +#define _THREAD_ABSTRACTION_H #include -class SimpleThread +class Thread { bool mIsRunning; pthread_t mThread; static void* runThread(void*); - SimpleThread(const SimpleThread&); - const SimpleThread& operator=(const SimpleThread&); + Thread(const Thread&); + const Thread& operator=(const Thread&); public: - SimpleThread(); - ~SimpleThread(); + Thread(); + ~Thread(); void startThread(); void joinThread(); diff --git a/generic-pc/audio.cpp b/generic-pc/audio.cpp index 0ee8b3b..d5605f0 100644 --- a/generic-pc/audio.cpp +++ b/generic-pc/audio.cpp @@ -104,7 +104,7 @@ int cAudio::Start(void) { lt_debug("%s >\n", __func__); if (! HAL_nodec) - SimpleThread::startThread(); + startThread(); lt_debug("%s <\n", __func__); return 0; } @@ -115,7 +115,7 @@ int cAudio::Stop(void) if (thread_started) { thread_started = false; - SimpleThread::joinThread(); + joinThread(); } lt_debug("%s <\n", __func__); return 0; diff --git a/generic-pc/audio_lib.h b/generic-pc/audio_lib.h index 6bcd80a..0670cd9 100644 --- a/generic-pc/audio_lib.h +++ b/generic-pc/audio_lib.h @@ -37,7 +37,7 @@ typedef enum AUDIO_FMT_ADVANCED = AUDIO_FMT_MLP } AUDIO_FORMAT; -class cAudio : public SimpleThread +class cAudio : public Thread { friend class cPlayback; private: diff --git a/generic-pc/glfb.cpp b/generic-pc/glfb.cpp index 3cffd0e..fa35e88 100644 --- a/generic-pc/glfb.cpp +++ b/generic-pc/glfb.cpp @@ -97,7 +97,7 @@ GLFramebuffer::GLFramebuffer(int x, int y): mReInit(true), mShutDown(false), mIn if (input_fd < 0) lt_info("%s: could not open /tmp/neutrino.input FIFO: %m\n", __func__); initKeys(); - SimpleThread::startThread(); + startThread(); while (!mInitDone) usleep(1); } @@ -105,7 +105,7 @@ GLFramebuffer::GLFramebuffer(int x, int y): mReInit(true), mShutDown(false), mIn GLFramebuffer::~GLFramebuffer() { mShutDown = true; - SimpleThread::joinThread(); + joinThread(); if (input_fd >= 0) close(input_fd); } diff --git a/generic-pc/glfb.h b/generic-pc/glfb.h index 755a01f..aa4017d 100644 --- a/generic-pc/glfb.h +++ b/generic-pc/glfb.h @@ -31,7 +31,7 @@ extern "C" { #include } -class GLFramebuffer : public SimpleThread +class GLFramebuffer : public Thread { public: GLFramebuffer(int x, int y); diff --git a/generic-pc/video.cpp b/generic-pc/video.cpp index 06ea690..8544e8b 100644 --- a/generic-pc/video.cpp +++ b/generic-pc/video.cpp @@ -145,7 +145,7 @@ int cVideo::Start(void *, unsigned short, unsigned short, void *) { lt_debug("%s running %d >\n", __func__, thread_running); if (!thread_running && !HAL_nodec) - SimpleThread::startThread(); + startThread(); lt_debug("%s running %d <\n", __func__, thread_running); return 0; } @@ -155,7 +155,7 @@ int cVideo::Stop(bool) lt_debug("%s running %d >\n", __func__, thread_running); if (thread_running) { thread_running = false; - SimpleThread::joinThread(); + joinThread(); } lt_debug("%s running %d <\n", __func__, thread_running); return 0; diff --git a/generic-pc/video_lib.h b/generic-pc/video_lib.h index 144b53f..2b8e14e 100644 --- a/generic-pc/video_lib.h +++ b/generic-pc/video_lib.h @@ -121,7 +121,7 @@ typedef enum #define VDEC_MAXBUFS 0x30 -class cVideo : public SimpleThread +class cVideo : public Thread { friend class GLFramebuffer; friend class cDemux; From d45c3835a83287b94d7fafb7baf2808cbb0aeda8 Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 20 Sep 2018 17:45:07 +0200 Subject: [PATCH 17/29] Revert "add changed files" This reverts commit 7f2f83b16e94b73b309a086fbee049b8fc7f76e3. Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/b6aeafc446e2a3cc09a54ba1f675c29f6fbe3f11 Author: max_10 Date: 2018-09-20 (Thu, 20 Sep 2018) ------------------ This commit was generated by Migit --- common/Makefile.am | 2 -- common/thread_abstraction.cpp | 1 - generic-pc/Makefile.am | 1 + generic-pc/audio.cpp | 5 +++-- generic-pc/audio_lib.h | 3 ++- generic-pc/glfb.cpp | 4 ++-- generic-pc/glfb.h | 9 ++++----- generic-pc/video.cpp | 4 ++-- generic-pc/video_lib.h | 9 ++++----- 9 files changed, 18 insertions(+), 20 deletions(-) diff --git a/common/Makefile.am b/common/Makefile.am index 86f3517..17395fc 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -31,8 +31,6 @@ endif endif libcommon_la_SOURCES += \ - thread_abstraction.cpp \ - mutex_abstraction.cpp \ lt_debug.cpp \ proc_tools.c \ pwrmngr.cpp diff --git a/common/thread_abstraction.cpp b/common/thread_abstraction.cpp index 271755c..57b7759 100644 --- a/common/thread_abstraction.cpp +++ b/common/thread_abstraction.cpp @@ -30,5 +30,4 @@ void Thread::joinThread() void* Thread::runThread(void* ptr) { ((Thread*)ptr)->run(); - return 0; } diff --git a/generic-pc/Makefile.am b/generic-pc/Makefile.am index baf15da..fd230bd 100644 --- a/generic-pc/Makefile.am +++ b/generic-pc/Makefile.am @@ -9,6 +9,7 @@ AM_CXXFLAGS = -fno-rtti -fno-exceptions -fno-strict-aliasing AM_LDFLAGS = \ -lglut -lGL -lGLU -lGLEW -lao \ + -lOpenThreads \ @AVFORMAT_LIBS@ \ @AVUTIL_LIBS@ \ @AVCODEC_LIBS@ \ diff --git a/generic-pc/audio.cpp b/generic-pc/audio.cpp index d5605f0..03558f8 100644 --- a/generic-pc/audio.cpp +++ b/generic-pc/audio.cpp @@ -29,6 +29,7 @@ #define lt_debug(args...) _lt_debug(HAL_DEBUG_AUDIO, this, args) #define lt_info(args...) _lt_info(HAL_DEBUG_AUDIO, this, args) +#include extern "C" { #include @@ -104,7 +105,7 @@ int cAudio::Start(void) { lt_debug("%s >\n", __func__); if (! HAL_nodec) - startThread(); + OpenThreads::Thread::start(); lt_debug("%s <\n", __func__); return 0; } @@ -115,7 +116,7 @@ int cAudio::Stop(void) if (thread_started) { thread_started = false; - joinThread(); + OpenThreads::Thread::join(); } lt_debug("%s <\n", __func__); return 0; diff --git a/generic-pc/audio_lib.h b/generic-pc/audio_lib.h index 0670cd9..fc96d27 100644 --- a/generic-pc/audio_lib.h +++ b/generic-pc/audio_lib.h @@ -4,6 +4,7 @@ #define _AUDIO_LIB_H_ #include +#include #include "cs_types.h" typedef enum @@ -37,7 +38,7 @@ typedef enum AUDIO_FMT_ADVANCED = AUDIO_FMT_MLP } AUDIO_FORMAT; -class cAudio : public Thread +class cAudio : public OpenThreads::Thread { friend class cPlayback; private: diff --git a/generic-pc/glfb.cpp b/generic-pc/glfb.cpp index fa35e88..099f213 100644 --- a/generic-pc/glfb.cpp +++ b/generic-pc/glfb.cpp @@ -97,7 +97,7 @@ GLFramebuffer::GLFramebuffer(int x, int y): mReInit(true), mShutDown(false), mIn if (input_fd < 0) lt_info("%s: could not open /tmp/neutrino.input FIFO: %m\n", __func__); initKeys(); - startThread(); + OpenThreads::Thread::start(); while (!mInitDone) usleep(1); } @@ -105,7 +105,7 @@ GLFramebuffer::GLFramebuffer(int x, int y): mReInit(true), mShutDown(false), mIn GLFramebuffer::~GLFramebuffer() { mShutDown = true; - joinThread(); + OpenThreads::Thread::join(); if (input_fd >= 0) close(input_fd); } diff --git a/generic-pc/glfb.h b/generic-pc/glfb.h index aa4017d..78376ba 100644 --- a/generic-pc/glfb.h +++ b/generic-pc/glfb.h @@ -18,9 +18,8 @@ #ifndef __glthread__ #define __glthread__ -#include "../common/thread_abstraction.h" -#include "../common/mutex_abstraction.h" - +#include +#include #include #include #include @@ -31,7 +30,7 @@ extern "C" { #include } -class GLFramebuffer : public Thread +class GLFramebuffer : public OpenThreads::Thread { public: GLFramebuffer(int x, int y); @@ -67,7 +66,7 @@ private: bool mFullscreen; /* fullscreen? */ bool mReInit; /* setup things for GL */ - Mutex mReInitLock; + OpenThreads::Mutex mReInitLock; bool mShutDown; /* if set main loop is left */ bool mInitDone; /* condition predicate */ // OpenThreads::Condition mInitCond; /* condition variable for init */ diff --git a/generic-pc/video.cpp b/generic-pc/video.cpp index 8544e8b..dcfb341 100644 --- a/generic-pc/video.cpp +++ b/generic-pc/video.cpp @@ -145,7 +145,7 @@ int cVideo::Start(void *, unsigned short, unsigned short, void *) { lt_debug("%s running %d >\n", __func__, thread_running); if (!thread_running && !HAL_nodec) - startThread(); + OpenThreads::Thread::start(); lt_debug("%s running %d <\n", __func__, thread_running); return 0; } @@ -155,7 +155,7 @@ int cVideo::Stop(bool) lt_debug("%s running %d >\n", __func__, thread_running); if (thread_running) { thread_running = false; - joinThread(); + OpenThreads::Thread::join(); } lt_debug("%s running %d <\n", __func__, thread_running); return 0; diff --git a/generic-pc/video_lib.h b/generic-pc/video_lib.h index 2b8e14e..ca130f5 100644 --- a/generic-pc/video_lib.h +++ b/generic-pc/video_lib.h @@ -1,8 +1,8 @@ #ifndef _VIDEO_LIB_H #define _VIDEO_LIB_H -#include "../common/thread_abstraction.h" -#include "../common/mutex_abstraction.h" +#include +#include #include #include #include "cs_types.h" @@ -121,7 +121,7 @@ typedef enum #define VDEC_MAXBUFS 0x30 -class cVideo : public Thread +class cVideo : public OpenThreads::Thread { friend class GLFramebuffer; friend class cDemux; @@ -211,8 +211,7 @@ class cVideo : public Thread bool thread_running; VIDEO_FORMAT v_format; VIDEO_STD v_std; - //OpenThreads::Mutex buf_m; - Mutex buf_m; + OpenThreads::Mutex buf_m; DISPLAY_AR display_aspect; DISPLAY_AR_MODE display_crop; int output_h; From e9b7d18af8fc4162f7d816ac06e4c6e44dab6adf Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 20 Sep 2018 17:45:31 +0200 Subject: [PATCH 18/29] Revert "add mutex and thread abstraction to common files" This reverts commit 65ee259b43a521e42464d728d5d9953067446184. Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/6c46000264e7c4e0039db916c07a60d893836311 Author: max_10 Date: 2018-09-20 (Thu, 20 Sep 2018) ------------------ This commit was generated by Migit --- {common => generic-pc}/mutex_abstraction.cpp | 0 {common => generic-pc}/mutex_abstraction.h | 0 {common => generic-pc}/thread_abstraction.cpp | 0 {common => generic-pc}/thread_abstraction.h | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {common => generic-pc}/mutex_abstraction.cpp (100%) rename {common => generic-pc}/mutex_abstraction.h (100%) rename {common => generic-pc}/thread_abstraction.cpp (100%) rename {common => generic-pc}/thread_abstraction.h (100%) diff --git a/common/mutex_abstraction.cpp b/generic-pc/mutex_abstraction.cpp similarity index 100% rename from common/mutex_abstraction.cpp rename to generic-pc/mutex_abstraction.cpp diff --git a/common/mutex_abstraction.h b/generic-pc/mutex_abstraction.h similarity index 100% rename from common/mutex_abstraction.h rename to generic-pc/mutex_abstraction.h diff --git a/common/thread_abstraction.cpp b/generic-pc/thread_abstraction.cpp similarity index 100% rename from common/thread_abstraction.cpp rename to generic-pc/thread_abstraction.cpp diff --git a/common/thread_abstraction.h b/generic-pc/thread_abstraction.h similarity index 100% rename from common/thread_abstraction.h rename to generic-pc/thread_abstraction.h From bdb92dbb745bbd67e407fc0c1c5635108f8c5313 Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 20 Sep 2018 17:45:51 +0200 Subject: [PATCH 19/29] Revert "add mutex and thread abstraction" This reverts commit e36707596a774f4bb8511a78e3e2abf13c2cd823. Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/20ea3c14b79249d6c4959e3a28ff4cbcdf78448a Author: max_10 Date: 2018-09-20 (Thu, 20 Sep 2018) ------------------ This commit was generated by Migit --- generic-pc/mutex_abstraction.cpp | 22 --------------------- generic-pc/mutex_abstraction.h | 20 ------------------- generic-pc/thread_abstraction.cpp | 33 ------------------------------- generic-pc/thread_abstraction.h | 25 ----------------------- 4 files changed, 100 deletions(-) delete mode 100644 generic-pc/mutex_abstraction.cpp delete mode 100644 generic-pc/mutex_abstraction.h delete mode 100644 generic-pc/thread_abstraction.cpp delete mode 100644 generic-pc/thread_abstraction.h diff --git a/generic-pc/mutex_abstraction.cpp b/generic-pc/mutex_abstraction.cpp deleted file mode 100644 index a5a886f..0000000 --- a/generic-pc/mutex_abstraction.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "mutex_abstraction.h" - -Mutex::Mutex() : - mMutex() -{ - pthread_mutex_init(&mMutex, 0); -} - -Mutex::~Mutex() -{ - pthread_mutex_destroy(&mMutex); -} - -void Mutex::lock() -{ - pthread_mutex_lock(&mMutex); -} - -void Mutex::unlock() -{ - pthread_mutex_unlock(&mMutex); -} diff --git a/generic-pc/mutex_abstraction.h b/generic-pc/mutex_abstraction.h deleted file mode 100644 index c2b78d8..0000000 --- a/generic-pc/mutex_abstraction.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _MUTEX_ABSTRACTION_H -#define _MUTEX_ABSTRACTION_H - -#include - -class Mutex -{ - pthread_mutex_t mMutex; - - Mutex(const Mutex&); - const Mutex& operator=(const Mutex&); - - public: - Mutex(); - virtual ~Mutex(); - void lock(); - void unlock(); -}; - -#endif diff --git a/generic-pc/thread_abstraction.cpp b/generic-pc/thread_abstraction.cpp deleted file mode 100644 index 57b7759..0000000 --- a/generic-pc/thread_abstraction.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "thread_abstraction.h" - -Thread::Thread() : - mIsRunning(false), - mThread() -{ -} - -Thread::~Thread() -{ - // if thread is still running on object destruction, cancel thread the hard way: - if (mIsRunning) - { - pthread_cancel(mThread); - } -} - -void Thread::startThread() -{ - mIsRunning = true; - pthread_create(&mThread, 0, &Thread::runThread, this); -} - -void Thread::joinThread() -{ - pthread_join(mThread, 0); - mIsRunning = false; -} - -void* Thread::runThread(void* ptr) -{ - ((Thread*)ptr)->run(); -} diff --git a/generic-pc/thread_abstraction.h b/generic-pc/thread_abstraction.h deleted file mode 100644 index 3c3e35f..0000000 --- a/generic-pc/thread_abstraction.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _THREAD_ABSTRACTION_H -#define _THREAD_ABSTRACTION_H - -#include - -class Thread -{ - bool mIsRunning; - pthread_t mThread; - - static void* runThread(void*); - Thread(const Thread&); - const Thread& operator=(const Thread&); - - public: - Thread(); - ~Thread(); - void startThread(); - void joinThread(); - - protected: - virtual void run() = 0; -}; - -#endif From 4a95992d39d5ca9b27847d8b86251a2ce6e3f1b3 Mon Sep 17 00:00:00 2001 From: max_10 Date: Thu, 20 Sep 2018 18:18:46 +0200 Subject: [PATCH 20/29] fix mutex revert Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/62be12fc8860a5f4c2ae71a027ce64d58d7aa7e4 Author: max_10 Date: 2018-09-20 (Thu, 20 Sep 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- generic-pc/audio_lib.h | 2 +- generic-pc/video_lib.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/generic-pc/audio_lib.h b/generic-pc/audio_lib.h index fc96d27..375208c 100644 --- a/generic-pc/audio_lib.h +++ b/generic-pc/audio_lib.h @@ -4,7 +4,7 @@ #define _AUDIO_LIB_H_ #include -#include +#include #include "cs_types.h" typedef enum diff --git a/generic-pc/video_lib.h b/generic-pc/video_lib.h index ca130f5..694965c 100644 --- a/generic-pc/video_lib.h +++ b/generic-pc/video_lib.h @@ -220,7 +220,7 @@ class cVideo : public OpenThreads::Thread int pig_w; int pig_h; bool pig_changed; - Mutex still_m; + OpenThreads::Mutex still_m; bool stillpicture; }; From 2335688d58a6125e74ab86bda67e543c791b9070 Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Tue, 14 Mar 2017 21:31:02 +0100 Subject: [PATCH 21/29] fix audio video rate info Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/ffef2649e45a9a8bd91d8ff99d1f389567ae9a1c Author: Jacek Jendrzej Date: 2017-03-14 (Tue, 14 Mar 2017) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- generic-pc/audio.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/generic-pc/audio.cpp b/generic-pc/audio.cpp index 03558f8..54d5457 100644 --- a/generic-pc/audio.cpp +++ b/generic-pc/audio.cpp @@ -203,7 +203,30 @@ void cAudio::getAudioInfo(int &type, int &layer, int &freq, int &bitrate, int &m bitrate = 0; /* not used, but easy to get :-) */ mode = 0; /* default: stereo */ if (c) { - type = (c->codec_id != AV_CODEC_ID_MP2); /* only mpeg / not mpeg is indicated */ + switch (c->codec_id) { + case AV_CODEC_ID_MP2: + type = AUDIO_FMT_MPEG; + break; + case AV_CODEC_ID_MP3: + type = AUDIO_FMT_MP3; + break; + case AV_CODEC_ID_AC3: + case AV_CODEC_ID_TRUEHD: + type = AUDIO_FMT_DOLBY_DIGITAL; + break; + case AV_CODEC_ID_EAC3: + type = AUDIO_FMT_DD_PLUS; + break; + case AV_CODEC_ID_AAC: + type = AUDIO_FMT_AAC; + break; + case AV_CODEC_ID_DTS: + type = AUDIO_FMT_DTS; + break; + case AV_CODEC_ID_MLP: + type = AUDIO_FMT_MLP; + break; + } freq = c->sample_rate; bitrate = c->bit_rate; if (c->channels == 1) From 49de6bdc5f9601daea75bad88506d62207ff6ba6 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Fri, 17 Mar 2017 11:19:27 +0100 Subject: [PATCH 22/29] generic-pc/audio.cpp: add default-section to c->codec_id switch ... to avoid compiler warnings Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/01d57e6199082842823d24bbc377f629c3121b6f Author: vanhofen Date: 2017-03-17 (Fri, 17 Mar 2017) Origin message was: ------------------ - generic-pc/audio.cpp: add default-section to c->codec_id switch ... to avoid compiler warnings ------------------ This commit was generated by Migit --- generic-pc/audio.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/generic-pc/audio.cpp b/generic-pc/audio.cpp index 54d5457..862bf2b 100644 --- a/generic-pc/audio.cpp +++ b/generic-pc/audio.cpp @@ -225,7 +225,9 @@ void cAudio::getAudioInfo(int &type, int &layer, int &freq, int &bitrate, int &m break; case AV_CODEC_ID_MLP: type = AUDIO_FMT_MLP; - break; + break; + default: + break; } freq = c->sample_rate; bitrate = c->bit_rate; From cdee46683174de116df16c712ca8ecf9f61170a2 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Mon, 21 Oct 2013 17:44:31 +0200 Subject: [PATCH 23/29] generic-pc: don't crash in getAudioInfo if no codec is set Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/08063acf06dd334d2e78347d56bd1117b79f3e6e Author: Stefan Seyfried Date: 2013-10-21 (Mon, 21 Oct 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- generic-pc/audio.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/generic-pc/audio.cpp b/generic-pc/audio.cpp index 862bf2b..e3ea30a 100644 --- a/generic-pc/audio.cpp +++ b/generic-pc/audio.cpp @@ -202,6 +202,7 @@ void cAudio::getAudioInfo(int &type, int &layer, int &freq, int &bitrate, int &m freq = 0; bitrate = 0; /* not used, but easy to get :-) */ mode = 0; /* default: stereo */ + printf("cAudio::getAudioInfo c %p\n", c); if (c) { switch (c->codec_id) { case AV_CODEC_ID_MP2: @@ -266,7 +267,7 @@ void cAudio::getAudioInfo(int &type, int &layer, int &freq, int &bitrate, int &m } } lt_debug("%s t: %d l: %d f: %d b: %d m: %d codec_id: %x\n", - __func__, type, layer, freq, bitrate, mode, c ? c->codec_id : 0); + __func__, type, layer, freq, bitrate, mode, c?c->codec_id:-1); }; void cAudio::SetSRS(int /*iq_enable*/, int /*nmgr_enable*/, int /*iq_mode*/, int /*iq_level*/) From 7a9b660388020cd72b1d7fd765d206817597bc88 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 30 Oct 2016 13:08:34 +0100 Subject: [PATCH 24/29] generic-pc: add alternative clutter based framebuffer Add a framebuffer implementation based on clutter instead of "raw" OpenGL. The performance is slightly worse, but it might bring some platform abstraction and other benefits for the future. Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/dd6921140d7d79b01ffafa649b8f01b46a99f762 Author: Stefan Seyfried Date: 2016-10-30 (Sun, 30 Oct 2016) ------------------ This commit was generated by Migit --- configure.ac | 15 ++ generic-pc/Makefile.am | 22 +- generic-pc/clutterfb.cpp | 481 +++++++++++++++++++++++++++++++++++++++ generic-pc/glfb.cpp | 1 + generic-pc/glfb.h | 33 ++- generic-pc/video.cpp | 20 +- 6 files changed, 553 insertions(+), 19 deletions(-) create mode 100644 generic-pc/clutterfb.cpp diff --git a/configure.ac b/configure.ac index 767eee6..e149c33 100644 --- a/configure.ac +++ b/configure.ac @@ -20,6 +20,18 @@ AC_DISABLE_STATIC AC_SYS_LARGEFILE AC_PROG_LIBTOOL +AC_ARG_ENABLE(clutter, + AS_HELP_STRING(--enable-clutter, use clutter instead of OpenGL), + ,[enable_clutter=no]) + +AM_CONDITIONAL(USE_CLUTTER,test "$enable_clutter" = "yes") +AM_CONDITIONAL(USE_OPENGL,test "$enable_clutter" = "no") +if test "$enable_clutter" = "yes"; then + AC_DEFINE(USE_CLUTTER,1,[use clutter instead of opengl]) +else + AC_DEFINE(USE_OPENGL,1,[use opengl instead of clutter]) +fi + if test x"$BOXTYPE" = x"tripledragon"; then PKG_CHECK_MODULES([DIRECTFB], [directfb]) fi @@ -54,6 +66,9 @@ if test x$BOXTYPE = xarmbox -a "$enable_gstreamer_10" = "yes"; then fi if test x$BOXTYPE = xgeneric -a x$BOXMODEL != xraspi; then + if test x"$enable_clutter" = xyes; then + PKG_CHECK_MODULES([CLUTTER], [clutter-1.0]) + fi PKG_CHECK_MODULES([AVFORMAT], [libavformat >= 53.21.1]) PKG_CHECK_MODULES([AVCODEC], [libavcodec >= 54.28.0]) # don't know which version is exactly needed here... diff --git a/generic-pc/Makefile.am b/generic-pc/Makefile.am index fd230bd..e2b6a5e 100644 --- a/generic-pc/Makefile.am +++ b/generic-pc/Makefile.am @@ -1,30 +1,44 @@ noinst_LTLIBRARIES = libgeneric.la AM_CPPFLAGS = -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS +AM_CPPFLAGS += -Wfatal-errors AM_CPPFLAGS += \ -I$(top_srcdir)/common \ - -I$(top_srcdir)/include + -I$(top_srcdir)/include \ + @AVUTIL_CFLAGS@ \ + @CLUTTER_CFLAGS@ AM_CXXFLAGS = -fno-rtti -fno-exceptions -fno-strict-aliasing AM_LDFLAGS = \ - -lglut -lGL -lGLU -lGLEW -lao \ + -lao \ -lOpenThreads \ @AVFORMAT_LIBS@ \ @AVUTIL_LIBS@ \ @AVCODEC_LIBS@ \ @SWRESAMPLE_LIBS@ \ - @SWSCALE_LIBS@ + @SWSCALE_LIBS@ \ + @CLUTTER_LIBS@ + +if USE_OPENGL +AM_LDFLAGS += -lglut -lGL -lGLU -lGLEW -lao +endif libgeneric_la_SOURCES = \ hardware_caps.c \ dmx.cpp \ video.cpp \ audio.cpp \ - glfb.cpp \ init.cpp \ record.cpp +if USE_CLUTTER +libgeneric_la_SOURCES += clutterfb.cpp +endif +if USE_OPENGL +libgeneric_la_SOURCES += glfb.cpp +endif + if ENABLE_GSTREAMER_01 libgeneric_la_SOURCES += \ playback_gst_01.cpp diff --git a/generic-pc/clutterfb.cpp b/generic-pc/clutterfb.cpp new file mode 100644 index 0000000..2c61def --- /dev/null +++ b/generic-pc/clutterfb.cpp @@ -0,0 +1,481 @@ +/* + Framebuffer implementation using clutter https://developer.gnome.org/clutter/ + Copyright (C) 2016 Stefan Seyfried + + based on the openGL framebuffer implementation + Copyright 2010 Carsten Juttner + Copyright 2012,2013 Stefan Seyfried + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + TODO: AV-Sync code is "experimental" at best +*/ + +#include "config.h" +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "glfb_priv.h" +#include "video_priv.h" +#include "audio_priv.h" + +#include + +#include "lt_debug.h" + +#define lt_debug_c(args...) _lt_debug(HAL_DEBUG_INIT, NULL, args) +#define lt_info_c(args...) _lt_info(HAL_DEBUG_INIT, NULL, args) +#define lt_debug(args...) _lt_debug(HAL_DEBUG_INIT, this, args) +#define lt_info(args...) _lt_info(HAL_DEBUG_INIT, this, args) + + +extern VDec *vdec; +extern ADec *adec; + +/* the private class that does stuff only needed inside libstb-hal. + * is used e.g. by cVideo... */ +GLFbPC *glfb_priv = NULL; + +GLFramebuffer::GLFramebuffer(int x, int y) +{ + Init(); + glfb_priv = new GLFbPC(x, y, osd_buf); + si = glfb_priv->getScreenInfo(); + start(); + while (!glfb_priv->mInitDone) + usleep(1); +} + +GLFramebuffer::~GLFramebuffer() +{ + glfb_priv->mShutDown = true; + join(); + delete glfb_priv; + glfb_priv = NULL; +} + +void GLFramebuffer::blit() +{ + glfb_priv->blit(); +} + +GLFbPC::GLFbPC(int x, int y, std::vector &buf): mReInit(true), mShutDown(false), mInitDone(false) +{ + osd_buf = &buf; + mState.width = x; + mState.height = y; + mX = &_mX[0]; + mY = &_mY[0]; + *mX = x; + *mY = y; + av_reduce(&mOA.num, &mOA.den, x, y, INT_MAX); + mVA = mOA; /* initial aspect ratios are from the FB resolution, those */ + _mVA = mVA; /* will be updated by the videoDecoder functions anyway */ + mVAchanged = true; + mCrop = DISPLAY_AR_MODE_PANSCAN; + zoom = 1.0; + xscale = 1.0; + const char *tmp = getenv("GLFB_FULLSCREEN"); + mFullscreen = !!(tmp); + + mState.blit = true; + last_apts = 0; + + /* linux framebuffer compat mode */ + si.bits_per_pixel = 32; + si.xres = mState.width; + si.xres_virtual = si.xres; + si.yres = mState.height; + si.yres_virtual = si.yres; + si.blue.length = 8; + si.blue.offset = 0; + si.green.length = 8; + si.green.offset = 8; + si.red.length = 8; + si.red.offset = 16; + si.transp.length = 8; + si.transp.offset = 24; + + unlink("/tmp/neutrino.input"); + mkfifo("/tmp/neutrino.input", 0600); + input_fd = open("/tmp/neutrino.input", O_RDWR|O_CLOEXEC|O_NONBLOCK); + if (input_fd < 0) + lt_info("%s: could not open /tmp/neutrino.input FIFO: %m\n", __func__); + initKeys(); +} + +GLFbPC::~GLFbPC() +{ + mShutDown = true; + if (input_fd >= 0) + close(input_fd); + osd_buf->clear(); +} + +void GLFbPC::initKeys() +{ + mKeyMap[CLUTTER_KEY_Up] = KEY_UP; + mKeyMap[CLUTTER_KEY_Down] = KEY_DOWN; + mKeyMap[CLUTTER_KEY_Left] = KEY_LEFT; + mKeyMap[CLUTTER_KEY_Right] = KEY_RIGHT; + + mKeyMap[CLUTTER_KEY_F1] = KEY_RED; + mKeyMap[CLUTTER_KEY_F2] = KEY_GREEN; + mKeyMap[CLUTTER_KEY_F3] = KEY_YELLOW; + mKeyMap[CLUTTER_KEY_F4] = KEY_BLUE; + + mKeyMap[CLUTTER_KEY_F5] = KEY_WWW; + mKeyMap[CLUTTER_KEY_F6] = KEY_SUBTITLE; + mKeyMap[CLUTTER_KEY_F7] = KEY_MOVE; + mKeyMap[CLUTTER_KEY_F8] = KEY_SLEEP; + + mKeyMap[CLUTTER_KEY_Page_Up] = KEY_PAGEUP; + mKeyMap[CLUTTER_KEY_Page_Down] = KEY_PAGEDOWN; + + mKeyMap[CLUTTER_KEY_Return] = KEY_OK; + mKeyMap[CLUTTER_KEY_Escape] = KEY_EXIT; + mKeyMap['e'] = KEY_EPG; + mKeyMap['i'] = KEY_INFO; + mKeyMap['m'] = KEY_MENU; + + mKeyMap['+'] = KEY_VOLUMEUP; + mKeyMap['-'] = KEY_VOLUMEDOWN; + mKeyMap['.'] = KEY_MUTE; + mKeyMap['h'] = KEY_HELP; + mKeyMap['p'] = KEY_POWER; + + mKeyMap['0'] = KEY_0; + mKeyMap['1'] = KEY_1; + mKeyMap['2'] = KEY_2; + mKeyMap['3'] = KEY_3; + mKeyMap['4'] = KEY_4; + mKeyMap['5'] = KEY_5; + mKeyMap['6'] = KEY_6; + mKeyMap['7'] = KEY_7; + mKeyMap['8'] = KEY_8; + mKeyMap['9'] = KEY_9; +} + +static ClutterActor *stage = NULL; +static ClutterActor *fb_actor = NULL; +static ClutterActor *vid_actor = NULL; +static ClutterTimeline *tl = NULL; +void GLFramebuffer::run() +{ + int argc = 1; + int x = glfb_priv->mState.width; + int y = glfb_priv->mState.height; + /* some dummy commandline for GLUT to be happy */ + char *a = (char *)"neutrino"; + char **argv = (char **)malloc(sizeof(char *) * 2); + argv[0] = a; + argv[1] = NULL; + lt_info("GLFB: GL thread starting x %d y %d\n", x, y); + if (clutter_init(&argc, &argv) != CLUTTER_INIT_SUCCESS) { + lt_info("GLFB: error initializing clutter\n"); + return; + } + lt_info("GLFB: %s:%d\n", __func__, __LINE__); + ClutterColor stage_color = { 0, 0, 0, 255 }; + stage = clutter_stage_new(); + clutter_actor_set_size(stage, x, y); + clutter_actor_set_background_color(stage, &stage_color); + clutter_actor_set_content_gravity(stage, CLUTTER_CONTENT_GRAVITY_RESIZE_ASPECT); + //g_signal_connect(stage, "destroy", G_CALLBACK(clutter_main_quit), NULL); + g_signal_connect(stage, "key-press-event", G_CALLBACK(GLFbPC::keyboardcb), (void *)1); + g_signal_connect(stage, "key-release-event", G_CALLBACK(GLFbPC::keyboardcb), NULL); + clutter_stage_set_user_resizable(CLUTTER_STAGE (stage), TRUE); + clutter_actor_grab_key_focus(stage); + clutter_actor_show(stage); + + /* 32bit FB depth, *2 because tuxtxt uses a shadow buffer */ + int fbmem = x * y * 4 * 2; + osd_buf.resize(fbmem); + lt_info("GLFB: OSD buffer set to %d bytes at 0x%p\n", fbmem, osd_buf.data()); + + /* video plane is below FB plane, so it comes first */ + vid_actor = clutter_actor_new(); + ClutterContent *fb = clutter_image_new(); + /* osd_buf, because it starts up black */ + if (!clutter_image_set_data(CLUTTER_IMAGE(fb), osd_buf.data(), COGL_PIXEL_FORMAT_BGR_888, x, y, x*3, NULL)) { + lt_info("GLFB::%s clutter_image_set_data failed? (vid)\n", __func__); + _exit(1); /* life is hard */ + } + clutter_actor_set_content(vid_actor, fb); + g_object_unref(fb); + clutter_actor_set_size(vid_actor, x, y); + clutter_actor_set_position(vid_actor, 0, 0); + clutter_actor_add_constraint(vid_actor, clutter_bind_constraint_new(stage, CLUTTER_BIND_WIDTH, 0)); + clutter_actor_add_constraint(vid_actor, clutter_bind_constraint_new(stage, CLUTTER_BIND_HEIGHT, 0)); + clutter_actor_add_constraint(vid_actor, clutter_bind_constraint_new(stage, CLUTTER_BIND_X, 0)); + clutter_actor_add_constraint(vid_actor, clutter_bind_constraint_new(stage, CLUTTER_BIND_Y, 0)); + clutter_actor_set_content_gravity(vid_actor, CLUTTER_CONTENT_GRAVITY_RESIZE_ASPECT); + clutter_actor_set_pivot_point(vid_actor, 0.5, 0.5); + clutter_actor_add_child(stage, vid_actor); + clutter_actor_show(vid_actor); + + fb_actor = clutter_actor_new(); + fb = clutter_image_new(); + if (!clutter_image_set_data(CLUTTER_IMAGE(fb), osd_buf.data(), COGL_PIXEL_FORMAT_BGRA_8888, x, y, x*4, NULL)) { + lt_info("GLFB::%s clutter_image_set_data failed? (osd)\n", __func__); + _exit(1); /* life is hard */ + } + clutter_actor_set_content(fb_actor, fb); + g_object_unref(fb); + clutter_actor_set_size(fb_actor, x, y); + clutter_actor_set_position(fb_actor, 0, 0); + clutter_actor_add_constraint(fb_actor, clutter_bind_constraint_new(stage, CLUTTER_BIND_WIDTH, 0)); + clutter_actor_add_constraint(fb_actor, clutter_bind_constraint_new(stage, CLUTTER_BIND_HEIGHT, 0)); + clutter_actor_add_constraint(fb_actor, clutter_bind_constraint_new(stage, CLUTTER_BIND_X, 0)); + clutter_actor_add_constraint(fb_actor, clutter_bind_constraint_new(stage, CLUTTER_BIND_Y, 0)); + clutter_actor_set_content_gravity(fb_actor, CLUTTER_CONTENT_GRAVITY_RESIZE_ASPECT); + clutter_actor_add_child(stage, fb_actor); + clutter_actor_show(fb_actor); + + glfb_priv->mInitDone = true; /* signal that setup is finished */ + tl = clutter_timeline_new(100); + g_signal_connect(tl, "new-frame", G_CALLBACK(GLFbPC::rendercb), NULL); + clutter_timeline_set_repeat_count(tl, -1); + clutter_timeline_start(tl); + clutter_main(); + lt_info("GLFB: GL thread stopping\n"); +} + +/* static */ void GLFbPC::rendercb() +{ + glfb_priv->render(); +} + +/* static */ bool GLFbPC::keyboardcb(ClutterActor * /*actor*/, ClutterEvent *event, gpointer user_data) +{ + guint key = clutter_event_get_key_symbol (event); + int keystate = user_data ? 1 : 0; + lt_info_c("GLFB::%s: 0x%x, %d\n", __func__, key, keystate); + + struct input_event ev; + if (key == 'f' && keystate) + { + lt_info_c("GLFB::%s: toggle fullscreen %s\n", __func__, glfb_priv->mFullscreen?"off":"on"); + glfb_priv->mFullscreen = !(glfb_priv->mFullscreen); + glfb_priv->mReInit = true; + return true; + } + std::map::const_iterator i = glfb_priv->mKeyMap.find(key); + if (i == glfb_priv->mKeyMap.end()) + return true; + ev.code = i->second; + ev.value = keystate; /* key own */ + ev.type = EV_KEY; + gettimeofday(&ev.time, NULL); + lt_debug_c("GLFB::%s: pushing 0x%x\n", __func__, ev.code); + write(glfb_priv->input_fd, &ev, sizeof(ev)); + return true; +} + +int sleep_us = 30000; + +void GLFbPC::render() +{ + if(mShutDown) + clutter_main_quit(); + + mReInitLock.lock(); + if (mReInit) + { + int xoff = 0; + int yoff = 0; + mVAchanged = true; + mReInit = false; +#if 0 + mX = &_mX[mFullscreen]; + mY = &_mY[mFullscreen]; +#endif + *mX = *mY * mOA.num / mOA.den; + if (mFullscreen) { + clutter_stage_set_fullscreen(CLUTTER_STAGE(stage), TRUE); + clutter_actor_show(stage); + clutter_stage_ensure_redraw(CLUTTER_STAGE(stage)); + } else { + clutter_stage_set_fullscreen(CLUTTER_STAGE(stage), FALSE); +// *mX = *mY * mOA.num / mOA.den; + clutter_actor_set_size(stage, *mX, *mY); + } + lt_info("%s: reinit mX:%d mY:%d xoff:%d yoff:%d fs %d\n", + __func__, *mX, *mY, xoff, yoff, mFullscreen); + } + mReInitLock.unlock(); + + bltDisplayBuffer(); /* decoded video stream */ + if (mState.blit) { + /* only blit manually after fb->blit(), this helps to find missed blit() calls */ + mState.blit = false; + lt_debug("GLFB::%s blit!\n", __func__); + bltOSDBuffer(); /* OSD */ + } + + if (mVAchanged) + { + mVAchanged = false; + zoom = 1.0; + float xzoom = 1.0; + //xscale = 1.0; + int cmp = av_cmp_q(mVA, mOA); + const AVRational a149 = { 14, 9 }; + switch (cmp) { + default: + case INT_MIN: /* invalid */ + case 0: /* identical */ + lt_debug("%s: mVA == mOA (or fullscreen mode :-)\n", __func__); + break; + case 1: /* mVA > mOA -- video is wider than display */ + lt_debug("%s: mVA > mOA\n", __func__); + switch (mCrop) { + case DISPLAY_AR_MODE_PANSCAN: + zoom = av_q2d(mVA) / av_q2d(mOA); + break; + case DISPLAY_AR_MODE_LETTERBOX: + break; + case DISPLAY_AR_MODE_PANSCAN2: + zoom = av_q2d(a149) / av_q2d(mOA); + break; + case DISPLAY_AR_MODE_NONE: + xzoom = av_q2d(mOA) / av_q2d(mVA); + zoom = av_q2d(mVA) / av_q2d(mOA); + break; + default: + break; + } + break; + case -1: /* mVA < mOA -- video is taller than display */ + lt_debug("%s: mVA < mOA\n", __func__); + switch (mCrop) { + case DISPLAY_AR_MODE_LETTERBOX: + break; + case DISPLAY_AR_MODE_PANSCAN2: + if (av_cmp_q(a149, mOA) < 0) { + zoom = av_q2d(mVA) * av_q2d(a149) / av_q2d(mOA); + break; + } + /* fallthrough for output format 14:9 */ + case DISPLAY_AR_MODE_PANSCAN: + zoom = av_q2d(mOA) / av_q2d(mVA); + break; + case DISPLAY_AR_MODE_NONE: + xzoom = av_q2d(mOA) / av_q2d(mVA); + break; + default: + break; + } + break; + } + lt_debug("zoom: %f xscale: %f xzoom: %f\n", zoom, xscale,xzoom); + clutter_actor_set_scale(vid_actor, xscale*zoom*xzoom, zoom); + } + clutter_timeline_stop(tl); + clutter_timeline_set_delay(tl, sleep_us/1000); + clutter_timeline_start(tl); +} + +void GLFbPC::bltOSDBuffer() +{ + // lt_info("%s\n", __func__); + int x = glfb_priv->mState.width; + int y = glfb_priv->mState.height; + ClutterContent *fb = clutter_image_new(); + if (!clutter_image_set_data(CLUTTER_IMAGE(fb), osd_buf->data(), COGL_PIXEL_FORMAT_BGRA_8888, x, y, x*4, NULL)) { + lt_info("GLFB::%s clutter_image_set_data failed?\n", __func__); + _exit(1); /* life is hard */ + } + clutter_actor_set_content(fb_actor, fb); + g_object_unref(fb); + clutter_actor_show(fb_actor); +} + +void GLFbPC::bltDisplayBuffer() +{ + // lt_info("GLFB::%s vdec: %p\n", __func__, vdec); + if (!vdec) /* cannot start yet */ + return; + static bool warn = true; + VDec::SWFramebuffer *buf = vdec->getDecBuf(); + if (!buf) { + if (warn) + lt_info("GLFB::%s did not get a buffer...\n", __func__); + warn = false; + return; + } + warn = true; + int w = buf->width(), h = buf->height(); + if (w == 0 || h == 0) + return; + + AVRational a = buf->AR(); + if (a.den != 0 && a.num != 0 && av_cmp_q(a, _mVA)) { + _mVA = a; + /* _mVA is the raw buffer's aspect, mVA is the real scaled output aspect */ + av_reduce(&mVA.num, &mVA.den, w * a.num, h * a.den, INT_MAX); + // mVA.num: 16 mVA.den: 9 w: 720 h: 576 + // 16*576/720/9 = 1.42222 + xscale = (double)mVA.num*h/(double)mVA.den/w; + mVAchanged = true; + } + + ClutterContent *fb = clutter_image_new(); + if (!clutter_image_set_data(CLUTTER_IMAGE(fb), &(*buf)[0], COGL_PIXEL_FORMAT_BGR_888, w, h, w*3, NULL)) { + lt_info("GLFB::%s clutter_image_set_data failed?\n", __func__); + _exit(1); /* life is hard */ + } + clutter_actor_set_content(vid_actor, fb); + g_object_unref(fb); + clutter_actor_show(vid_actor); + + /* "rate control" mechanism starts here... + * this implementation is pretty naive and not working too well, but + * better this than nothing... :-) */ + int64_t apts = 0; + int64_t vpts = buf->pts(); + if (adec) + apts = adec->getPts(); + if (apts != last_apts) { + int rate, dummy1, dummy2; + if (apts < vpts) + sleep_us = (sleep_us * 2 + (vpts - apts)*10/9) / 3; + else if (sleep_us > 1000) + sleep_us -= 1000; + last_apts = apts; + vdec->getPictureInfo(dummy1, dummy2, rate); + if (rate > 0) + rate = 2000000 / rate; /* limit to half the frame rate */ + else + rate = 50000; /* minimum 20 fps */ + if (sleep_us > rate) + sleep_us = rate; + else if (sleep_us < 1) + sleep_us = 1; + } + lt_debug("vpts: 0x%" PRIx64 " apts: 0x%" PRIx64 " diff: %6.3f sleep_us %d buf %d\n", + buf->pts(), apts, (buf->pts() - apts)/90000.0, sleep_us, vdec->buf_num); +} diff --git a/generic-pc/glfb.cpp b/generic-pc/glfb.cpp index 099f213..3811056 100644 --- a/generic-pc/glfb.cpp +++ b/generic-pc/glfb.cpp @@ -22,6 +22,7 @@ TODO: AV-Sync code is "experimental" at best */ +#include "config.h" #include #include diff --git a/generic-pc/glfb.h b/generic-pc/glfb.h index 78376ba..bc7b9f5 100644 --- a/generic-pc/glfb.h +++ b/generic-pc/glfb.h @@ -1,6 +1,6 @@ /* Copyright 2010 Carsten Juttner - Copyright 2012,2013 Stefan Seyfried + Copyright 2012,2013,2016 Stefan Seyfried This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,14 +18,20 @@ #ifndef __glthread__ #define __glthread__ +#include #include #include #include #include +#if USE_OPENGL #include #include #include #include /* for screeninfo etc. */ +#endif +#if USE_CLUTTER +#include +#endif extern "C" { #include } @@ -35,18 +41,15 @@ class GLFramebuffer : public OpenThreads::Thread public: GLFramebuffer(int x, int y); ~GLFramebuffer(); - void run(); std::vector *getOSDBuffer() { return &mOSDBuffer; } /* pointer to OSD bounce buffer */ - int getOSDWidth() { return mState.width; } int getOSDHeight() { return mState.height; } void blit() { mState.blit = true; } - + fb_var_screeninfo getScreenInfo() { return screeninfo; } void setOutputFormat(AVRational a, int h, int c) { mOA = a; *mY = h; mCrop = c; mReInit = true; } void clear(); - fb_var_screeninfo getScreenInfo() { return screeninfo; } int getWindowID() { return GLWinID; } private: @@ -74,33 +77,45 @@ private: std::vector mOSDBuffer; /* silly bounce buffer */ +#if USE_OPENGL std::map mKeyMap; std::map mSpecialMap; +#endif +#if USE_CLUTTER + std::map mKeyMap; +#endif int input_fd; int64_t last_apts; static void rendercb(); /* callback for GLUT */ void render(); /* actual render function */ +#if USE_OPENGL static void keyboardcb(unsigned char key, int x, int y); static void specialcb(int key, int x, int y); static void resizecb(int w, int h); void checkReinit(int w, int h); /* e.g. in case window was resized */ + void setupGLObjects(); /* PBOs, textures and stuff */ + void releaseGLObjects(); + void drawSquare(float size, float x_factor = 1); /* do not be square */ +#endif +#if USE_CLUTTER + static bool keyboardcb(ClutterActor *actor, ClutterEvent *event, gpointer user_data); +#endif void initKeys(); /* setup key bindings for window */ void setupCtx(); /* create the window and make the context current */ void setupOSDBuffer(); /* create the OSD buffer */ - void setupGLObjects(); /* PBOs, textures and stuff */ - void releaseGLObjects(); - void drawSquare(float size, float x_factor = 1); /* do not be square */ struct { int width; /* width and height, fixed for a framebuffer instance */ int height; + bool blit; +#if USE_OPENGL GLuint osdtex; /* holds the OSD texture */ GLuint pbo; /* PBO we use for transfer to texture */ GLuint displaytex; /* holds the display texture */ GLuint displaypbo; - bool blit; +#endif } mState; void bltOSDBuffer(); diff --git a/generic-pc/video.cpp b/generic-pc/video.cpp index dcfb341..8237305 100644 --- a/generic-pc/video.cpp +++ b/generic-pc/video.cpp @@ -23,6 +23,7 @@ * TODO: buffer handling surely needs some locking... */ +#include "config.h" #include #include #include @@ -39,6 +40,13 @@ extern "C" { /* my own buf 256k */ #define DMX_BUF_SZ 0x20000 +#if USE_OPENGL +#define VDEC_PIXFMT AV_PIX_FMT_RGB32 +#endif +#if USE_CLUTTER +#define VDEC_PIXFMT AV_PIX_FMT_BGR24 +#endif + #include "video_lib.h" #include "dmx_hal.h" #include "glfb.h" @@ -294,9 +302,9 @@ void cVideo::ShowPicture(const char *fname) if (avpkt.size > len) lt_info("%s: WARN: pkt->size %d != len %d\n", __func__, avpkt.size, len); if (got_frame) { - unsigned int need = av_image_get_buffer_size(AV_PIX_FMT_RGB32, c->width, c->height, 1); + unsigned int need = av_image_get_buffer_size(VDEC_PIXFMT, c->width, c->height, 1); struct SwsContext *convert = sws_getContext(c->width, c->height, c->pix_fmt, - c->width, c->height, AV_PIX_FMT_RGB32, + c->width, c->height, VDEC_PIXFMT, SWS_BICUBIC, 0, 0, 0); if (!convert) lt_info("%s: ERROR setting up SWS context\n", __func__); @@ -305,7 +313,7 @@ void cVideo::ShowPicture(const char *fname) SWFramebuffer *f = &buffers[buf_in]; if (f->size() < need) f->resize(need); - av_image_fill_arrays(rgbframe->data, rgbframe->linesize, &(*f)[0], AV_PIX_FMT_RGB32, + av_image_fill_arrays(rgbframe->data, rgbframe->linesize, &(*f)[0], VDEC_PIXFMT, c->width, c->height, 1); sws_scale(convert, frame->data, frame->linesize, 0, c->height, rgbframe->data, rgbframe->linesize); @@ -538,10 +546,10 @@ void cVideo::run(void) lt_info("%s: WARN: pkt->size %d != len %d\n", __func__, avpkt.size, len); still_m.lock(); if (got_frame && ! stillpicture) { - unsigned int need = av_image_get_buffer_size(AV_PIX_FMT_RGB32, c->width, c->height, 1); + unsigned int need = av_image_get_buffer_size(VDEC_PIXFMT, c->width, c->height, 1); convert = sws_getCachedContext(convert, c->width, c->height, c->pix_fmt, - c->width, c->height, AV_PIX_FMT_RGB32, + c->width, c->height, VDEC_PIXFMT, SWS_BICUBIC, 0, 0, 0); if (!convert) lt_info("%s: ERROR setting up SWS context\n", __func__); @@ -550,7 +558,7 @@ void cVideo::run(void) SWFramebuffer *f = &buffers[buf_in]; if (f->size() < need) f->resize(need); - av_image_fill_arrays(rgbframe->data, rgbframe->linesize, &(*f)[0], AV_PIX_FMT_RGB32, + av_image_fill_arrays(rgbframe->data, rgbframe->linesize, &(*f)[0], VDEC_PIXFMT, c->width, c->height, 1); sws_scale(convert, frame->data, frame->linesize, 0, c->height, rgbframe->data, rgbframe->linesize); From b33c55deef03e94f0619239107f4257de6e269ef Mon Sep 17 00:00:00 2001 From: max_10 Date: Fri, 21 Sep 2018 19:00:11 +0200 Subject: [PATCH 25/29] generic-pc: rework glfb (thx seife) Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/f2136cc7a6881791463d6fbc8cf051109a06be05 Author: max_10 Date: 2018-09-21 (Fri, 21 Sep 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- generic-pc/glfb.cpp | 179 +++++++++++++++++------------ generic-pc/{glfb.h => glfb_priv.h} | 38 +++--- generic-pc/init.cpp | 1 + generic-pc/video.cpp | 33 ++++-- generic-pc/video_lib.h | 4 +- include/glfb.h | 50 ++++++-- 6 files changed, 191 insertions(+), 114 deletions(-) rename generic-pc/{glfb.h => glfb_priv.h} (82%) diff --git a/generic-pc/glfb.cpp b/generic-pc/glfb.cpp index 3811056..19d1f29 100644 --- a/generic-pc/glfb.cpp +++ b/generic-pc/glfb.cpp @@ -38,8 +38,7 @@ #include #include #include -#include "glfb.h" -#include +#include "glfb_priv.h" #include "video_lib.h" #include "audio_lib.h" @@ -54,10 +53,36 @@ extern cVideo *videoDecoder; extern cAudio *audioDecoder; -static GLFramebuffer *gThiz = 0; /* GLUT does not allow for an arbitrary argument to the render func */ +/* the private class that does stuff only needed inside libstb-hal. + * is used e.g. by cVideo... */ +GLFbPC *glfb_priv = NULL; -GLFramebuffer::GLFramebuffer(int x, int y): mReInit(true), mShutDown(false), mInitDone(false) +GLFramebuffer::GLFramebuffer(int x, int y) { + Init(); + glfb_priv = new GLFbPC(x, y, osd_buf); + si = glfb_priv->getScreenInfo(); + start(); + while (!glfb_priv->mInitDone) + usleep(1); +} + +GLFramebuffer::~GLFramebuffer() +{ + glfb_priv->mShutDown = true; + join(); + delete glfb_priv; + glfb_priv = NULL; +} + +void GLFramebuffer::blit() +{ + glfb_priv->blit(); +} + +GLFbPC::GLFbPC(int x, int y, std::vector &buf): mReInit(true), mShutDown(false), mInitDone(false) +{ + osd_buf = &buf; mState.width = x; mState.height = y; mX = &_mX[0]; @@ -78,19 +103,19 @@ GLFramebuffer::GLFramebuffer(int x, int y): mReInit(true), mShutDown(false), mIn last_apts = 0; /* linux framebuffer compat mode */ - screeninfo.bits_per_pixel = 32; - screeninfo.xres = mState.width; - screeninfo.xres_virtual = screeninfo.xres; - screeninfo.yres = mState.height; - screeninfo.yres_virtual = screeninfo.yres; - screeninfo.blue.length = 8; - screeninfo.blue.offset = 0; - screeninfo.green.length = 8; - screeninfo.green.offset = 8; - screeninfo.red.length = 8; - screeninfo.red.offset = 16; - screeninfo.transp.length = 8; - screeninfo.transp.offset = 24; + si.bits_per_pixel = 32; + si.xres = mState.width; + si.xres_virtual = si.xres; + si.yres = mState.height; + si.yres_virtual = si.yres; + si.blue.length = 8; + si.blue.offset = 0; + si.green.length = 8; + si.green.offset = 8; + si.red.length = 8; + si.red.offset = 16; + si.transp.length = 8; + si.transp.offset = 24; unlink("/tmp/neutrino.input"); mkfifo("/tmp/neutrino.input", 0600); @@ -98,21 +123,22 @@ GLFramebuffer::GLFramebuffer(int x, int y): mReInit(true), mShutDown(false), mIn if (input_fd < 0) lt_info("%s: could not open /tmp/neutrino.input FIFO: %m\n", __func__); initKeys(); - OpenThreads::Thread::start(); - while (!mInitDone) - usleep(1); } -GLFramebuffer::~GLFramebuffer() +GLFbPC::~GLFbPC() { mShutDown = true; - OpenThreads::Thread::join(); if (input_fd >= 0) close(input_fd); + osd_buf->clear(); } -void GLFramebuffer::initKeys() +void GLFbPC::initKeys() { + /* + Keep in sync with initKeys() in clutterfb.cpp + */ + mSpecialMap[GLUT_KEY_UP] = KEY_UP; mSpecialMap[GLUT_KEY_DOWN] = KEY_DOWN; mSpecialMap[GLUT_KEY_LEFT] = KEY_LEFT; @@ -133,8 +159,8 @@ void GLFramebuffer::initKeys() mSpecialMap[GLUT_KEY_F11] = KEY_NEXT; mSpecialMap[GLUT_KEY_F12] = KEY_PREVIOUS; - mSpecialMap[GLUT_KEY_PAGE_UP] = KEY_PAGEUP; - mSpecialMap[GLUT_KEY_PAGE_DOWN] = KEY_PAGEDOWN; + mSpecialMap[GLUT_KEY_PAGE_UP] = KEY_PAGEUP; + mSpecialMap[GLUT_KEY_PAGE_DOWN] = KEY_PAGEDOWN; mKeyMap[0x0d] = KEY_OK; mKeyMap[0x1b] = KEY_EXIT; @@ -177,9 +203,21 @@ void GLFramebuffer::initKeys() void GLFramebuffer::run() { - setupCtx(); - setupOSDBuffer(); - mInitDone = true; /* signal that setup is finished */ + int argc = 1; + int x = glfb_priv->mState.width; + int y = glfb_priv->mState.height; + /* some dummy commandline for GLUT to be happy */ + char const *argv[2] = { "neutrino", 0 }; + lt_info("GLFB: GL thread starting x %d y %d\n", x, y); + glutInit(&argc, const_cast(argv)); + glutInitWindowSize(x, y); + glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); + glutCreateWindow("Neutrino"); + /* 32bit FB depth, *2 because tuxtxt uses a shadow buffer */ + int fbmem = x * y * 4 * 2; + osd_buf.resize(fbmem); + lt_info("GLFB: OSD buffer set to %d bytes at 0x%p\n", fbmem, osd_buf.data()); + glfb_priv->mInitDone = true; /* signal that setup is finished */ /* init the good stuff */ GLenum err = glewInit(); @@ -194,16 +232,15 @@ void GLFramebuffer::run() } else { - gThiz = this; glutSetCursor(GLUT_CURSOR_NONE); - glutDisplayFunc(GLFramebuffer::rendercb); - glutKeyboardFunc(GLFramebuffer::keyboardcb); - glutSpecialFunc(GLFramebuffer::specialcb); - glutReshapeFunc(GLFramebuffer::resizecb); - setupGLObjects(); /* needs GLEW prototypes */ + glutDisplayFunc(GLFbPC::rendercb); + glutKeyboardFunc(GLFbPC::keyboardcb); + glutSpecialFunc(GLFbPC::specialcb); + glutReshapeFunc(GLFbPC::resizecb); + glfb_priv->setupGLObjects(); /* needs GLEW prototypes */ glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION); glutMainLoop(); - releaseGLObjects(); + glfb_priv->releaseGLObjects(); } } else @@ -211,21 +248,20 @@ void GLFramebuffer::run() lt_info("GLFB: GL thread stopping\n"); } - -void GLFramebuffer::setupCtx() +#if 0 +void GLFbPC::setupCtx() { int argc = 1; /* some dummy commandline for GLUT to be happy */ char const *argv[2] = { "neutrino", 0 }; - lt_info("GLFB: GL thread starting\n"); + lt_info("GLFB: GL thread starting x %d y %d\n", mX[0], mY[0]); glutInit(&argc, const_cast(argv)); glutInitWindowSize(mX[0], mY[0]); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("Neutrino"); - GLWinID = glXGetCurrentDrawable(); // this was the holy grail to get the right window handle for gstreamer :D } -void GLFramebuffer::setupOSDBuffer() +void GLFbPC::setupOSDBuffer() { /* the OSD buffer size can be decoupled from the actual window size since the GL can blit-stretch with no trouble at all, ah, the luxury of ignorance... */ @@ -234,12 +270,13 @@ void GLFramebuffer::setupOSDBuffer() { /* 32bit FB depth, *2 because tuxtxt uses a shadow buffer */ int fbmem = mState.width * mState.height * 4 * 2; - mOSDBuffer.resize(fbmem); - lt_info("GLFB: OSD buffer set to %d bytes\n", fbmem); + osd_buf->resize(fbmem); + lt_info("GLFB: OSD buffer set to %d bytes at 0x%p\n", fbmem, osd_buf->data()); } } +#endif -void GLFramebuffer::setupGLObjects() +void GLFbPC::setupGLObjects() { unsigned char buf[4] = { 0, 0, 0, 0 }; /* 1 black pixel */ glGenTextures(1, &mState.osdtex); @@ -267,7 +304,7 @@ void GLFramebuffer::setupGLObjects() } -void GLFramebuffer::releaseGLObjects() +void GLFbPC::releaseGLObjects() { glDeleteBuffers(1, &mState.pbo); glDeleteBuffers(1, &mState.displaypbo); @@ -276,56 +313,56 @@ void GLFramebuffer::releaseGLObjects() } -/* static */ void GLFramebuffer::rendercb() +/* static */ void GLFbPC::rendercb() { - gThiz->render(); + glfb_priv->render(); } -/* static */ void GLFramebuffer::keyboardcb(unsigned char key, int /*x*/, int /*y*/) +/* static */ void GLFbPC::keyboardcb(unsigned char key, int /*x*/, int /*y*/) { lt_debug_c("GLFB::%s: 0x%x\n", __func__, key); struct input_event ev; if (key == 'f') { - lt_info_c("GLFB::%s: toggle fullscreen %s\n", __func__, gThiz->mFullscreen?"off":"on"); - gThiz->mFullscreen = !(gThiz->mFullscreen); - gThiz->mReInit = true; + lt_info_c("GLFB::%s: toggle fullscreen %s\n", __func__, glfb_priv->mFullscreen?"off":"on"); + glfb_priv->mFullscreen = !(glfb_priv->mFullscreen); + glfb_priv->mReInit = true; return; } - std::map::const_iterator i = gThiz->mKeyMap.find(key); - if (i == gThiz->mKeyMap.end()) + std::map::const_iterator i = glfb_priv->mKeyMap.find(key); + if (i == glfb_priv->mKeyMap.end()) return; ev.code = i->second; ev.value = 1; /* key own */ ev.type = EV_KEY; gettimeofday(&ev.time, NULL); lt_debug_c("GLFB::%s: pushing 0x%x\n", __func__, ev.code); - write(gThiz->input_fd, &ev, sizeof(ev)); + write(glfb_priv->input_fd, &ev, sizeof(ev)); ev.value = 0; /* neutrino is stupid, so push key up directly after key down */ - write(gThiz->input_fd, &ev, sizeof(ev)); + write(glfb_priv->input_fd, &ev, sizeof(ev)); } -/* static */ void GLFramebuffer::specialcb(int key, int /*x*/, int /*y*/) +/* static */ void GLFbPC::specialcb(int key, int /*x*/, int /*y*/) { lt_debug_c("GLFB::%s: 0x%x\n", __func__, key); struct input_event ev; - std::map::const_iterator i = gThiz->mSpecialMap.find(key); - if (i == gThiz->mSpecialMap.end()) + std::map::const_iterator i = glfb_priv->mSpecialMap.find(key); + if (i == glfb_priv->mSpecialMap.end()) return; ev.code = i->second; ev.value = 1; ev.type = EV_KEY; gettimeofday(&ev.time, NULL); lt_debug_c("GLFB::%s: pushing 0x%x\n", __func__, ev.code); - write(gThiz->input_fd, &ev, sizeof(ev)); + write(glfb_priv->input_fd, &ev, sizeof(ev)); ev.value = 0; - write(gThiz->input_fd, &ev, sizeof(ev)); + write(glfb_priv->input_fd, &ev, sizeof(ev)); } int sleep_us = 30000; -void GLFramebuffer::render() +void GLFbPC::render() { if(mShutDown) glutLeaveMainLoop(); @@ -453,12 +490,12 @@ void GLFramebuffer::render() glutPostRedisplay(); } -/* static */ void GLFramebuffer::resizecb(int w, int h) +/* static */ void GLFbPC::resizecb(int w, int h) { - gThiz->checkReinit(w, h); + glfb_priv->checkReinit(w, h); } -void GLFramebuffer::checkReinit(int x, int y) +void GLFbPC::checkReinit(int x, int y) { static int last_x = 0, last_y = 0; @@ -478,7 +515,7 @@ void GLFramebuffer::checkReinit(int x, int y) last_y = y; } -void GLFramebuffer::drawSquare(float size, float x_factor) +void GLFbPC::drawSquare(float size, float x_factor) { GLfloat vertices[] = { 1.0f, 1.0f, @@ -534,11 +571,11 @@ void GLFramebuffer::drawSquare(float size, float x_factor) } -void GLFramebuffer::bltOSDBuffer() +void GLFbPC::bltOSDBuffer() { /* FIXME: copy each time */ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, mState.pbo); - glBufferData(GL_PIXEL_UNPACK_BUFFER, mOSDBuffer.size(), &mOSDBuffer[0], GL_STREAM_DRAW_ARB); + glBufferData(GL_PIXEL_UNPACK_BUFFER, osd_buf->size(), osd_buf->data(), GL_STREAM_DRAW_ARB); glBindTexture(GL_TEXTURE_2D, mState.osdtex); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mState.width, mState.height, GL_BGRA, GL_UNSIGNED_BYTE, 0); @@ -546,7 +583,7 @@ void GLFramebuffer::bltOSDBuffer() glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); } -void GLFramebuffer::bltDisplayBuffer() +void GLFbPC::bltDisplayBuffer() { if (!videoDecoder) /* cannot start yet */ return; @@ -554,7 +591,7 @@ void GLFramebuffer::bltDisplayBuffer() cVideo::SWFramebuffer *buf = videoDecoder->getDecBuf(); if (!buf) { if (warn) - lt_debug("GLFB::%s did not get a buffer...\n", __func__); + lt_info("GLFB::%s did not get a buffer...\n", __func__); warn = false; return; } @@ -607,9 +644,3 @@ void GLFramebuffer::bltDisplayBuffer() lt_debug("vpts: 0x%" PRIx64 " apts: 0x%" PRIx64 " diff: %6.3f sleep_us %d buf %d\n", buf->pts(), apts, (buf->pts() - apts)/90000.0, sleep_us, videoDecoder->buf_num); } - -void GLFramebuffer::clear() -{ - /* clears front and back buffer */ - memset(&mOSDBuffer[0], 0, mOSDBuffer.size()); -} diff --git a/generic-pc/glfb.h b/generic-pc/glfb_priv.h similarity index 82% rename from generic-pc/glfb.h rename to generic-pc/glfb_priv.h index bc7b9f5..a51545a 100644 --- a/generic-pc/glfb.h +++ b/generic-pc/glfb_priv.h @@ -14,12 +14,14 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . + + ******************************************************************** + private stuff of the GLFB thread that is only used inside libstb-hal + and not exposed to the application. */ -#ifndef __glthread__ -#define __glthread__ -#include -#include +#ifndef __glfb_priv__ +#define __glfb_priv__ #include #include #include @@ -32,28 +34,26 @@ #if USE_CLUTTER #include #endif +#include "glfb.h" extern "C" { #include } -class GLFramebuffer : public OpenThreads::Thread +class GLFbPC { public: - GLFramebuffer(int x, int y); - ~GLFramebuffer(); - void run(); - std::vector *getOSDBuffer() { return &mOSDBuffer; } /* pointer to OSD bounce buffer */ + GLFbPC(int x, int y, std::vector &buf); + ~GLFbPC(); + std::vector *getOSDBuffer() { return osd_buf; } /* pointer to OSD bounce buffer */ int getOSDWidth() { return mState.width; } int getOSDHeight() { return mState.height; } - void blit() { mState.blit = true; } - fb_var_screeninfo getScreenInfo() { return screeninfo; } + void blit() { mState.blit = true; }; + fb_var_screeninfo getScreenInfo() { return si; } void setOutputFormat(AVRational a, int h, int c) { mOA = a; *mY = h; mCrop = c; mReInit = true; } - - void clear(); - int getWindowID() { return GLWinID; } - +/* just make everything public for simplicity - this is only used inside libstb-hal anyway private: - fb_var_screeninfo screeninfo; +*/ + fb_var_screeninfo si; int *mX; int *mY; int _mX[2]; /* output window size */ @@ -65,7 +65,6 @@ private: float zoom; /* for cropping */ float xscale; /* and aspect ratio */ int mCrop; /* DISPLAY_AR_MODE */ - int GLWinID; bool mFullscreen; /* fullscreen? */ bool mReInit; /* setup things for GL */ @@ -75,7 +74,7 @@ private: // OpenThreads::Condition mInitCond; /* condition variable for init */ // mutable OpenThreads::Mutex mMutex; /* lock our data */ - std::vector mOSDBuffer; /* silly bounce buffer */ + std::vector *osd_buf; /* silly bounce buffer */ #if USE_OPENGL std::map mKeyMap; @@ -86,6 +85,7 @@ private: #endif int input_fd; int64_t last_apts; + void run(); static void rendercb(); /* callback for GLUT */ void render(); /* actual render function */ @@ -103,8 +103,10 @@ private: #endif void initKeys(); /* setup key bindings for window */ +#if 0 void setupCtx(); /* create the window and make the context current */ void setupOSDBuffer(); /* create the OSD buffer */ +#endif struct { int width; /* width and height, fixed for a framebuffer instance */ diff --git a/generic-pc/init.cpp b/generic-pc/init.cpp index b641fd8..fa2a01c 100644 --- a/generic-pc/init.cpp +++ b/generic-pc/init.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "init_td.h" diff --git a/generic-pc/video.cpp b/generic-pc/video.cpp index 8237305..be89bf2 100644 --- a/generic-pc/video.cpp +++ b/generic-pc/video.cpp @@ -49,7 +49,7 @@ extern "C" { #include "video_lib.h" #include "dmx_hal.h" -#include "glfb.h" +#include "glfb_priv.h" #include "lt_debug.h" #define lt_debug(args...) _lt_debug(TRIPLE_DEBUG_VIDEO, this, args) #define lt_info(args...) _lt_info(TRIPLE_DEBUG_VIDEO, this, args) @@ -57,7 +57,7 @@ extern "C" { cVideo *videoDecoder = NULL; extern cDemux *videoDemux; -extern GLFramebuffer *glfb; +extern GLFbPC *glfb_priv; int system_rev = 0; extern bool HAL_nodec; @@ -111,7 +111,7 @@ int cVideo::setAspectRatio(int vformat, int cropping) if (cropping >= 0) display_crop = (DISPLAY_AR_MODE) cropping; if (display_aspect < DISPLAY_AR_RAW && output_h > 0) /* don't know what to do with this */ - glfb->setOutputFormat(aspect_ratios[display_aspect], output_h, display_crop); + glfb_priv->setOutputFormat(aspect_ratios[display_aspect], output_h, display_crop); return 0; } @@ -222,7 +222,7 @@ int cVideo::SetVideoSystem(int system, bool) // v_std = (VIDEO_STD) system; output_h = h; if (display_aspect < DISPLAY_AR_RAW && output_h > 0) /* don't know what to do with this */ - glfb->setOutputFormat(aspect_ratios[display_aspect], output_h, display_crop); + glfb_priv->setOutputFormat(aspect_ratios[display_aspect], output_h, display_crop); return 0; } @@ -369,6 +369,7 @@ void cVideo::Pig(int x, int y, int w, int h, int /*osd_w*/, int /*osd_h*/, int / pig_y = y; pig_w = w; pig_h = h; + pig_changed = true; } void cVideo::getPictureInfo(int &width, int &height, int &rate) @@ -572,10 +573,18 @@ void cVideo::run(void) f->width(c->width); f->height(c->height); int64_t vpts = av_frame_get_best_effort_timestamp(frame); + /* a/v delay determined experimentally :-) */ +#if USE_OPENGL if (v_format == VIDEO_FORMAT_MPEG2) vpts += 90000*4/10; /* 400ms */ else vpts += 90000*3/10; /* 300ms */ +#endif +#if USE_CLUTTER + /* no idea why there's a difference between OpenGL and clutter rendering... */ + if (v_format == VIDEO_FORMAT_MPEG2) + vpts += 90000*3/10; /* 300ms */ +#endif f->pts(vpts); AVRational a = av_guess_sample_aspect_ratio(avfc, avfc->streams[0], frame); f->AR(a); @@ -675,8 +684,8 @@ bool cVideo::GetScreenImage(unsigned char * &data, int &xres, int &yres, bool ge std::vector *osd = NULL; std::vector s_osd; /* scaled OSD */ int vid_w = 0, vid_h = 0; - int osd_w = glfb->getOSDWidth(); - int osd_h = glfb->getOSDHeight(); + int osd_w = glfb_priv->getOSDWidth(); + int osd_h = glfb_priv->getOSDHeight(); xres = osd_w; yres = osd_h; if (get_video) { @@ -700,24 +709,26 @@ bool cVideo::GetScreenImage(unsigned char * &data, int &xres, int &yres, bool ge yres = osd_h; } if (get_osd) - osd = glfb->getOSDBuffer(); + osd = glfb_priv->getOSDBuffer(); unsigned int need = av_image_get_buffer_size(AV_PIX_FMT_RGB32, xres, yres, 1); data = (unsigned char *)realloc(data, need); /* will be freed by caller */ if (data == NULL) /* out of memory? */ return false; if (get_video) { - //memcpy dont work with copy BGR24 to RGB32 +#if USE_OPENGL //memcpy dont work with copy BGR24 to RGB32 if (vid_w != xres || vid_h != yres){ /* scale video into data... */ - bool ret = swscale(&video[0], data, vid_w, vid_h, xres, yres, AV_PIX_FMT_RGB32); +#endif + bool ret = swscale(&video[0], data, vid_w, vid_h, xres, yres,VDEC_PIXFMT); if(!ret){ free(data); return false; } - //memcpy dont work with copy BGR24 to RGB32 - } else { /* get_video and no fancy scaling needed */ +#if USE_OPENGL //memcpy dont work with copy BGR24 to RGB32 + }else{ /* get_video and no fancy scaling needed */ memcpy(data, &video[0], xres * yres * sizeof(uint32_t)); } +#endif } if (get_osd && (osd_w != xres || osd_h != yres)) { diff --git a/generic-pc/video_lib.h b/generic-pc/video_lib.h index 694965c..1bec147 100644 --- a/generic-pc/video_lib.h +++ b/generic-pc/video_lib.h @@ -120,10 +120,10 @@ typedef enum } VIDEO_CONTROL; -#define VDEC_MAXBUFS 0x30 +#define VDEC_MAXBUFS 0x40 class cVideo : public OpenThreads::Thread { - friend class GLFramebuffer; + friend class GLFbPC; friend class cDemux; private: /* called from GL thread */ diff --git a/include/glfb.h b/include/glfb.h index ea7addd..5b95ce6 100644 --- a/include/glfb.h +++ b/include/glfb.h @@ -1,10 +1,42 @@ -#include -#if HAVE_GENERIC_HARDWARE -#if BOXMODEL_RASPI -#include "../raspi/glfb.h" -#else -#include "../generic-pc/glfb.h" -#endif -#else -#error glfb.h only works with HAVE_GENERIC_HARDWARE defined +/* + Copyright 2010 Carsten Juttner + Copyright 2012,2013 Stefan Seyfried + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef __glfb__ +#define __glfb__ +#include +#include +#include /* for screeninfo etc. */ + +class GLFramebuffer : public OpenThreads::Thread +{ +public: + GLFramebuffer(int x, int y); + ~GLFramebuffer(); + std::vector *getOSDBuffer() { return &osd_buf; } /* pointer to OSD bounce buffer */ + void blit(); + fb_var_screeninfo getScreenInfo() { return si; } + +private: + fb_var_screeninfo si; + std::vector osd_buf; /* silly bounce buffer */ + void run(); /* for OpenThreads::Thread */ + void setup(); + void blit_osd(); + void *pdata; /* not yet used */ +}; #endif From d290b6d2cd2591634aa7a6f5bf9b5bcbdfe1b70c Mon Sep 17 00:00:00 2001 From: BPanther Date: Tue, 28 Aug 2018 07:46:08 +0200 Subject: [PATCH 26/29] vusolo4k: small fix - but not yet ready Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/35f15585ed5fc227fd918b042276cb41a998ad3f Author: BPanther Date: 2018-08-28 (Tue, 28 Aug 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libarmbox/hardware_caps.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libarmbox/hardware_caps.c b/libarmbox/hardware_caps.c index 1190939..782e35d 100644 --- a/libarmbox/hardware_caps.c +++ b/libarmbox/hardware_caps.c @@ -7,6 +7,7 @@ * License: GPL v2 or later */ +#include #include #include #include @@ -28,6 +29,23 @@ hw_caps_t *get_hwcaps(void) memset(&caps, 0, sizeof(hw_caps_t)); +#if BOXMODEL_VUSOLO4K + initialized = 1; + caps.has_CI = 1; + caps.can_cec = 1; + caps.can_shutdown = 1; + caps.display_xres = 480; + caps.display_yres = 320; + caps.display_type = HW_DISPLAY_GFX; + caps.display_can_deepstandby = 1; + caps.display_can_set_brightness = 1; + caps.display_has_statusline = 1; + caps.has_button_timer = 1; + caps.has_HDMI = 1; + strcpy(caps.boxvendor, "VU"); + strcpy(caps.boxname, "SOLO4K"); + strcpy(caps.boxarch, "BCM7376"); +#else initialized = 1; caps.has_CI = 1; caps.can_cec = 1; @@ -42,5 +60,6 @@ hw_caps_t *get_hwcaps(void) strcpy(caps.boxvendor, "AX-Technologies"); strcpy(caps.boxname, "HD51"); strcpy(caps.boxarch, "BCM7251S"); +#endif return ∩︀ } From 53a2e1cb80448b150c3d19a8ca91e1d5e577c190 Mon Sep 17 00:00:00 2001 From: TangoCash Date: Tue, 25 Sep 2018 20:23:08 +0200 Subject: [PATCH 27/29] add frontpanel xres for sh4 (thx dbo) Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/b428f7fc42013f0a20c761c70503bd5d638bd51a Author: TangoCash Date: 2018-09-25 (Tue, 25 Sep 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libduckbox/hardware_caps.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libduckbox/hardware_caps.c b/libduckbox/hardware_caps.c index 56e9254..8550149 100644 --- a/libduckbox/hardware_caps.c +++ b/libduckbox/hardware_caps.c @@ -59,6 +59,8 @@ hw_caps_t *get_hwcaps(void) caps.has_fan = 0; caps.has_CI = 2; caps.display_can_set_brightness = 1; + caps.display_type = HW_DISPLAY_LINE_TEXT; + caps.display_xres = 16; } else if (!strncmp(buf, "ufs913", 6)) { strcpy(caps.boxvendor, "DUCKBOX"); @@ -70,6 +72,8 @@ hw_caps_t *get_hwcaps(void) caps.has_fan = 0; caps.has_CI = 2; caps.display_can_set_brightness = 1; + caps.display_type = HW_DISPLAY_LINE_TEXT; + caps.display_xres = 16; } else if (!strncmp(buf, "ufs922", 6)) { strcpy(caps.boxvendor, "DUCKBOX"); @@ -81,6 +85,8 @@ hw_caps_t *get_hwcaps(void) caps.has_fan = 1; caps.has_CI = 2; caps.display_can_set_brightness = 1; + caps.display_type = HW_DISPLAY_LINE_TEXT; + caps.display_xres = 16; } else if (!strncmp(buf, "ufs910", 6)) { strcpy(caps.boxvendor, "DUCKBOX"); @@ -92,6 +98,8 @@ hw_caps_t *get_hwcaps(void) caps.has_fan = 0; caps.has_CI = 2; caps.display_can_set_brightness = 1; + caps.display_type = HW_DISPLAY_LINE_TEXT; + caps.display_xres = 16; } else if (!strncmp(buf, "hdbox", 5)) { strcpy(caps.boxvendor, "DUCKBOX"); From 9242c9e1e4cc4c4e9f8ec6e1907a35bc2171ba65 Mon Sep 17 00:00:00 2001 From: max_10 Date: Mon, 1 Oct 2018 21:59:46 +0200 Subject: [PATCH 28/29] fix segfault subtitles selection - but not yet ready Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/abd93ba030056006abe6577fd9c2ad1ede56c835 Author: max_10 Date: 2018-10-01 (Mon, 01 Oct 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libarmbox/playback_libeplayer3.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libarmbox/playback_libeplayer3.cpp b/libarmbox/playback_libeplayer3.cpp index 0a2f1ed..78c21a5 100644 --- a/libarmbox/playback_libeplayer3.cpp +++ b/libarmbox/playback_libeplayer3.cpp @@ -69,6 +69,7 @@ bool cPlayback::Open(playmode_t PlayMode) { player->output->Command(player, OUTPUT_ADD, (void *)"audio"); player->output->Command(player, OUTPUT_ADD, (void *)"video"); + player->output->Command(player, OUTPUT_ADD, (void *)"subtitle"); } return 0; @@ -249,6 +250,7 @@ bool cPlayback::Stop(void) { player->output->Command(player, OUTPUT_DEL, (void *)"audio"); player->output->Command(player, OUTPUT_DEL, (void *)"video"); + player->output->Command(player, OUTPUT_DEL, (void *)"subtitle"); } if (player && player->playback) From 9e45bb2eb6b320b381dd5cf60b1fe5a757af9af0 Mon Sep 17 00:00:00 2001 From: redblue-pkt Date: Mon, 1 Oct 2018 21:55:31 +0200 Subject: [PATCH 29/29] fix backward Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/a7bba580e9135de79e3c497332240c1ad9f88ab4 Author: redblue-pkt Date: 2018-10-01 (Mon, 01 Oct 2018) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/playback/playback.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/libeplayer3-arm/playback/playback.c b/libeplayer3-arm/playback/playback.c index e2bfd7e..257fb67 100644 --- a/libeplayer3-arm/playback/playback.c +++ b/libeplayer3-arm/playback/playback.c @@ -304,7 +304,7 @@ static int PlaybackPlay(Context_t *context) context->playback->Speed = 0; if (context->container && context->container->selectedContainer) - context->container->selectedContainer->Command(context, CONTAINER_STOP, NULL); + ret = context->container->selectedContainer->Command(context, CONTAINER_STOP, NULL); } else { @@ -568,19 +568,29 @@ static int PlaybackFastBackward(Context_t *context, int *speed) return cERR_PLAYBACK_ERROR; } + PlaybackContinue(context); + if (*speed == 0) { - context->playback->BackWard = 0; - context->playback->Speed = 0; /* reverse end */ + context->playback->isPaused = 0; + //context->playback->isPlaying = 0; + context->playback->isForwarding = 0; + context->playback->BackWard = 0; + context->playback->SlowMotion = 0; + context->playback->Speed = 0; context->output->Command(context, OUTPUT_AUDIOMUTE, "0"); } else { - context->playback->isSeeking = 1; - context->playback->Speed = *speed; - context->playback->BackWard = 1; + context->playback->isPaused = 0; + //context->playback->isPlaying = 0; + context->playback->isForwarding = 0; + context->playback->BackWard = 1; + context->playback->SlowMotion = 0; + context->playback->Speed = *speed; + context->playback->isSeeking = 1; context->output->Command(context, OUTPUT_AUDIOMUTE, "1"); - playback_printf(1, "S %d B %d\n", context->playback->Speed, context->playback->BackWard); + playback_printf(1, "Speed: %d, Backward: %d\n", context->playback->Speed, context->playback->BackWard); } context->output->Command(context, OUTPUT_CLEAR, NULL);