From 5309fbef6c69026779e4586f66963ea8ff733919 Mon Sep 17 00:00:00 2001 From: TangoCash Date: Fri, 29 Dec 2017 19:48:12 +0100 Subject: [PATCH 1/4] armbox eplayer: fix playing files with subtitles Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/a769bdaa97011e7b22ef801b591eb28a6515b2a4 Author: TangoCash Date: 2017-12-29 (Fri, 29 Dec 2017) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/manager/subtitle.c | 345 ++++++++++++++--------------- 1 file changed, 169 insertions(+), 176 deletions(-) diff --git a/libeplayer3-arm/manager/subtitle.c b/libeplayer3-arm/manager/subtitle.c index 415da59..d6d7892 100644 --- a/libeplayer3-arm/manager/subtitle.c +++ b/libeplayer3-arm/manager/subtitle.c @@ -44,7 +44,7 @@ static short debug_level = 20; #define subtitle_mgr_printf(level, x...) do { \ - if (debug_level >= level) printf(x); } while (0) +if (debug_level >= level) printf(x); } while (0) #else #define subtitle_mgr_printf(level, x...) #endif @@ -71,7 +71,7 @@ static const char FILENAME[] = __FILE__; static Track_t *Tracks = NULL; static int TrackCount = 0; -static int CurrentTrack = -1; //no as default. +static int CurrentTrack = -1; //no as default. /* ***************************** */ /* Prototypes */ @@ -81,24 +81,28 @@ static int CurrentTrack = -1; //no as default. /* Functions */ /* ***************************** */ -static int ManagerAdd(Context_t *context, Track_t track) +static int ManagerAdd(Context_t * context __attribute__((unused)), Track_t track) { - uint32_t i = 0; - subtitle_mgr_printf(10, "%s::%s %s %s %d\n", FILENAME, __FUNCTION__, track.Name, track.Encoding, track.Id); + + subtitle_mgr_printf(10, "%s::%s %s %s %d\n", FILENAME, __FUNCTION__, + track.Name, track.Encoding, track.Id); + if (Tracks == NULL) { Tracks = malloc(sizeof(Track_t) * TRACKWRAP); - for (i = 0; i < TRACKWRAP; ++i) - { + int i; + for (i = 0; i < TRACKWRAP; i++) Tracks[i].Id = -1; - } } + if (Tracks == NULL) { subtitle_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__); return cERR_SUBTITLE_MGR_ERROR; } - for (i = 0; i < TRACKWRAP; ++i) + + int i; + for (i = 0; i < TRACKWRAP; i++) { if (Tracks[i].Id == track.Id) { @@ -106,6 +110,7 @@ static int ManagerAdd(Context_t *context, Track_t track) return cERR_SUBTITLE_MGR_NO_ERROR; } } + if (TrackCount < TRACKWRAP) { copyTrack(&Tracks[TrackCount], &track); @@ -113,219 +118,207 @@ static int ManagerAdd(Context_t *context, Track_t track) } else { - subtitle_mgr_err("%s:%s TrackCount out if range %d - %d\n", FILENAME, __FUNCTION__, TrackCount, TRACKWRAP); + + subtitle_mgr_err("%s:%s TrackCount out if range %d - %d\n", + FILENAME, __FUNCTION__, TrackCount, TRACKWRAP); return cERR_SUBTITLE_MGR_ERROR; } - if (TrackCount > 0) - { - context->playback->isSubtitle = 1; - } + subtitle_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__); + return cERR_SUBTITLE_MGR_NO_ERROR; } -static TrackDescription_t *ManagerList(Context_t *context __attribute__((unused))) +static char **ManagerList(Context_t * context __attribute__ ((unused))) { - int i = 0; - TrackDescription_t *tracklist = NULL; + char **tracklist = NULL; + int i = 0, j = 0; + subtitle_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__); + if (Tracks != NULL) { - tracklist = malloc(sizeof(TrackDescription_t) * ((TrackCount) + 1)); + tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1)); + if (tracklist == NULL) { - subtitle_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__); + subtitle_mgr_err("%s:%s malloc failed\n", FILENAME, + __FUNCTION__); return NULL; } - int j = 0; - for (i = 0; i < TrackCount; ++i) + + for (i = 0, j = 0; i < TrackCount; i++, j += 2) { - if (Tracks[i].pending || Tracks[i].Id < 0) - { + if (Tracks[i].pending) continue; - } - tracklist[j].Id = Tracks[i].Id; - tracklist[j].Name = strdup(Tracks[i].Name); - tracklist[j].Encoding = strdup(Tracks[i].Encoding); - ++j; + size_t len = strlen(Tracks[i].Name) + 20; + char tmp[len]; + snprintf(tmp, len, "%d %s\n", Tracks[i].Id, Tracks[i].Name); + tracklist[j] = strdup(tmp); + tracklist[j + 1] = strdup(Tracks[i].Encoding); } - tracklist[j].Id = -1; + + tracklist[j] = NULL; } + + subtitle_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, + __FUNCTION__, tracklist, j, TrackCount); + return tracklist; } -static int32_t ManagerDel(Context_t *context, int32_t onlycurrent) +static int ManagerDel(Context_t * context __attribute__((unused))) { - uint32_t i = 0; + + int i = 0; + subtitle_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__); - if (onlycurrent == 0) + + if (Tracks != NULL) { - if (Tracks != NULL) + for (i = 0; i < TrackCount; i++) { - for (i = 0; i < TrackCount; i++) - { - freeTrack(&Tracks[i]); - } - free(Tracks); - Tracks = NULL; + freeTrack(&Tracks[i]); } - else - { - subtitle_mgr_err("%s::%s nothing to delete!\n", FILENAME, __FUNCTION__); - return cERR_SUBTITLE_MGR_ERROR; - } - TrackCount = 0; - context->playback->isSubtitle = 0; + + free(Tracks); + Tracks = NULL; } + else + { + subtitle_mgr_err("%s::%s nothing to delete!\n", FILENAME, + __FUNCTION__); + return cERR_SUBTITLE_MGR_ERROR; + } + + TrackCount = 0; CurrentTrack = -1; - subtitle_mgr_printf(10, "%s::%s return no error\n", FILENAME, __FUNCTION__); + + subtitle_mgr_printf(10, "%s::%s return no error\n", FILENAME, + __FUNCTION__); + return cERR_SUBTITLE_MGR_NO_ERROR; } -static int32_t Command(void *_context, ManagerCmd_t command, void *argument) +static int Command(Context_t *context, ManagerCmd_t command, void *argument) { - Context_t *context = (Context_t *) _context; - int32_t ret = cERR_SUBTITLE_MGR_NO_ERROR; - subtitle_mgr_printf(50, "%s::%s %d\n", FILENAME, __FUNCTION__, command); + int ret = cERR_SUBTITLE_MGR_NO_ERROR; + + subtitle_mgr_printf(50, "%s::%s %d\n", FILENAME, __FUNCTION__, + command); + switch (command) { - case MANAGER_ADD: + case MANAGER_ADD: + { + Track_t *track = argument; + ret = ManagerAdd(context, *track); + break; + } + case MANAGER_LIST: + { + container_ffmpeg_update_tracks(context, context->playback->uri, 0); + *((char ***) argument) = (char **) ManagerList(context); + break; + } + case MANAGER_GET: + { + if (TrackCount > 0 && CurrentTrack >= 0) + *((int *) argument) = (int) Tracks[CurrentTrack].Id; + else + *((int *) argument) = (int) -1; + break; + } + case MANAGER_GET_TRACK: + { + //subtitle_mgr_printf(20, "%s::%s MANAGER_GET_TRACK\n", FILENAME, __FUNCTION__); + + if ((TrackCount > 0) && (CurrentTrack >= 0)) { - Track_t *track = argument; - ret = ManagerAdd(context, *track); + subtitle_mgr_printf(120, "return %d, %p\n", CurrentTrack, + &Tracks[CurrentTrack]); + *((Track_t **) argument) = + (Track_t *) & Tracks[CurrentTrack]; + } + else + { + subtitle_mgr_printf(20, "return NULL\n"); + *((Track_t **) argument) = NULL; + } + break; + } + case MANAGER_GETENCODING: + { + if (TrackCount > 0 && CurrentTrack >= 0) + *((char **) argument) = + (char *) strdup(Tracks[CurrentTrack].Encoding); + else + *((char **) argument) = (char *) strdup(""); + break; + } + case MANAGER_GETNAME: + { + if (TrackCount > 0 && CurrentTrack >= 0) + *((char **) argument) = + (char *) strdup(Tracks[CurrentTrack].Name); + else + *((char **) argument) = (char *) strdup(""); + break; + } + case MANAGER_SET: + { + int i; + subtitle_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", FILENAME, + __FUNCTION__, *((int *) argument)); + + if (*((int *) argument) < 0) + { + CurrentTrack = -1; break; } - case MANAGER_LIST: - { - container_ffmpeg_update_tracks(context, context->playback->uri, 0); - *((char ** *)argument) = (char **)ManagerList(context); - break; - } - case MANAGER_GET: - { - if (TrackCount > 0 && CurrentTrack >= 0) + + for (i = 0; i < TrackCount; i++) + if (Tracks[i].Id == *((int *) argument)) { - *((int *)argument) = (int)Tracks[CurrentTrack].Id; - } - else - { - *((int *)argument) = (int) - 1; - } - break; - } - case MANAGER_GET_TRACK_DESC: - { - if ((TrackCount > 0) && (CurrentTrack >= 0)) - { - TrackDescription_t *track = malloc(sizeof(TrackDescription_t)); - *((TrackDescription_t **)argument) = track; - 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); - } - } - else - { - *((TrackDescription_t **)argument) = NULL; - } - break; - } - case MANAGER_GET_TRACK: - { - if ((TrackCount > 0) && (CurrentTrack >= 0)) - { - *((Track_t **)argument) = (Track_t *) &Tracks[CurrentTrack]; - } - else - { - *((Track_t **)argument) = NULL; - } - break; - } - case MANAGER_GETENCODING: - { - if (TrackCount > 0 && CurrentTrack >= 0) - { - *((char **)argument) = (char *)strdup(Tracks[CurrentTrack].Encoding); - } - else - { - *((char **)argument) = (char *)strdup(""); - } - break; - } - case MANAGER_GETNAME: - { - if (TrackCount > 0 && CurrentTrack >= 0) - { - *((char **)argument) = (char *)strdup(Tracks[CurrentTrack].Name); - } - else - { - *((char **)argument) = (char *)strdup(""); - } - break; - } - case MANAGER_SET: - { - uint32_t i = 0; - int32_t requestedTrackId = *((int *)argument); - subtitle_mgr_printf(20, "%s::%s MANAGER_SET id=%d\n", FILENAME, __FUNCTION__, *((int *)argument)); - if (requestedTrackId == -1) - { - // track id -1 mean disable subtitle - CurrentTrack = -1; + CurrentTrack = i; break; } - for (i = 0; i < TrackCount; ++i) - { - if (Tracks[i].Id == requestedTrackId) - { - CurrentTrack = i; - break; - } - } - if (i == TrackCount) - { - subtitle_mgr_err("%s::%s track id %d unknown\n", FILENAME, __FUNCTION__, *((int *)argument)); - ret = cERR_SUBTITLE_MGR_ERROR; - } - break; - } - case MANAGER_DEL: + if (i == TrackCount) { - if (argument == NULL) - { - ret = ManagerDel(context, 0); - } - else - { - ret = ManagerDel(context, *((int *)argument)); - } - break; - } - case MANAGER_INIT_UPDATE: - { - uint32_t i; - for (i = 0; i < TrackCount; i++) - { - Tracks[i].pending = 1; - } - break; - } - default: - subtitle_mgr_err("%s:%s: ConatinerCmd not supported!", FILENAME, __FUNCTION__); + subtitle_mgr_err("%s::%s track id %d unknown\n", FILENAME, + __FUNCTION__, *((int *) argument)); ret = cERR_SUBTITLE_MGR_ERROR; - break; + } + break; } - subtitle_mgr_printf(50, "%s:%s: returning %d\n", FILENAME, __FUNCTION__, ret); + case MANAGER_DEL: + { + ret = ManagerDel(context); + break; + } + case MANAGER_INIT_UPDATE: + { + int i; + for (i = 0; i < TrackCount; i++) + //if (!Tracks[i].is_static) + Tracks[i].pending = 1; + break; + } + default: + subtitle_mgr_err("%s:%s: ConatinerCmd not supported!", FILENAME, + __FUNCTION__); + ret = cERR_SUBTITLE_MGR_ERROR; + break; + } + + subtitle_mgr_printf(50, "%s:%s: returning %d\n", FILENAME, + __FUNCTION__, ret); + return ret; } -Manager_t SubtitleManager = + +struct Manager_s SubtitleManager = { "Subtitle", &Command, From 6b56bcb6540809ae35fbec6008b124218c517463 Mon Sep 17 00:00:00 2001 From: max_10 Date: Sat, 30 Dec 2017 13:44:12 +0100 Subject: [PATCH 2/4] armbox eplayer: eplayer3 Binary adaptation to the changed manager list (thx DboxOldie) Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/5352007266f6df44798c7c5d7e8694e80bc7480b Author: max_10 Date: 2017-12-30 (Sat, 30 Dec 2017) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/main/exteplayer.c | 136 +++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/libeplayer3-arm/main/exteplayer.c b/libeplayer3-arm/main/exteplayer.c index b07ef63..e143fa3 100644 --- a/libeplayer3-arm/main/exteplayer.c +++ b/libeplayer3-arm/main/exteplayer.c @@ -220,6 +220,140 @@ static void SetNice(int prio) #endif } +static int HandleTracks(const Manager_t *ptrManager, const PlaybackCmd_t playbackSwitchCmd, const char *argvBuff) +{ + int commandRetVal = 0; + if (NULL == ptrManager || NULL == argvBuff || 2 != strnlen(argvBuff, 2)) + { + return -1; + } + switch (argvBuff[1]) + { + case 'l': + { + char **TrackList = NULL; + ptrManager->Command(g_player, MANAGER_LIST, &TrackList); + if (NULL != TrackList) + { + int i = 0, Id = -1; + char * pch; + char Name[] = " "; + fprintf(stderr, "{\"%c_%c\": [", argvBuff[0], argvBuff[1]); + for (i = 0; TrackList[i] != NULL; i+=2) + { + pch = strtok(TrackList[i], " "); + if (pch != NULL) { + Id = atoi(pch); + pch = strtok(NULL, " "); + if (pch != NULL) { + snprintf(Name, sizeof(Name), "%s", pch); + } + } + if (0 < i) + { + fprintf(stderr, ", "); + } + fprintf(stderr, "{\"id\":%d,\"e\":\"%s\",\"n\":\"%s\"}", Id, TrackList[i+1], Name); + free(TrackList[i]); + free(TrackList[i+1]); + } + fprintf(stderr, "]}\n"); + free(TrackList); + } + else + { + // not tracks + fprintf(stderr, "{\"%c_%c\": []}\n", argvBuff[0], argvBuff[1]); + } + break; + } + case 'c': + { + TrackDescription_t *track = NULL; + ptrManager->Command(g_player, MANAGER_GET_TRACK_DESC, &track); + if (NULL != track) + { + if ('a' == argvBuff[0] || 's' == argvBuff[0]) + { + fprintf(stderr, "{\"%c_%c\":{\"id\":%d,\"e\":\"%s\",\"n\":\"%s\"}}\n", argvBuff[0], argvBuff[1], track->Id, track->Encoding, track->Name); + } + 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); + } + free(track->Encoding); + free(track->Name); + free(track); + } + else + { + // no tracks + if ('a' == argvBuff[0] || 's' == argvBuff[0]) + { + fprintf(stderr, "{\"%c_%c\":{\"id\":%d,\"e\":\"%s\",\"n\":\"%s\"}}\n", argvBuff[0], argvBuff[1], -1, "", ""); + } + else // video + { + fprintf(stderr, "{\"%c_%c\":{\"id\":%d,\"e\":\"%s\",\"n\":\"%s\",\"w\":%d,\"h\":%d,\"f\":%u,\"p\":%d}}\n", argvBuff[0], argvBuff[1], -1, "", "", -1, -1, 0, -1); + } + } + break; + } + default: + { + /* switch command available only for audio and subtitle tracks */ + if ('a' == argvBuff[0] || 's' == argvBuff[0]) + { + int ok = 0; + int id = -1; + if ('i' == argvBuff[1]) + { + int idx = -1; + ok = sscanf(argvBuff + 2, "%d", &idx); + if (idx >= 0) + { + char **TrackList = NULL; + ptrManager->Command(g_player, MANAGER_LIST, &TrackList); + if (NULL != TrackList) + { + int i = 0; + char * pch; + for (i = 0; TrackList[i] != NULL; i+=2) + { + if (idx == i) + { + pch = strtok(TrackList[i], " "); + if (pch != NULL) + id = atoi(pch); + } + free(TrackList[i]); + free(TrackList[i+1]); + } + free(TrackList); + } + } + else + { + id = idx; + } + } + else + { + ok = sscanf(argvBuff + 1, "%d", &id); + } + if (id >= 0 || (1 == ok && id == -1)) + { + commandRetVal = g_player->playback->Command(g_player, playbackSwitchCmd, (void *)&id); + fprintf(stderr, "{\"%c_%c\":{\"id\":%d,\"sts\":%d}}\n", argvBuff[0], 's', id, commandRetVal); + } + } + break; + } + } + return commandRetVal; +} +#if 0 static int HandleTracks(const Manager_t *ptrManager, const PlaybackCmd_t playbackSwitchCmd, const char *argvBuff) { int commandRetVal = 0; @@ -340,7 +474,7 @@ static int HandleTracks(const Manager_t *ptrManager, const PlaybackCmd_t playbac } return commandRetVal; } - +#endif static void UpdateVideoTrack() { HandleTracks(g_player->manager->video, (PlaybackCmd_t) - 1, "vc"); From 22d148b351f16b92bd85f2c3bab7e8fe08383c0c Mon Sep 17 00:00:00 2001 From: max_10 Date: Sat, 30 Dec 2017 13:47:36 +0100 Subject: [PATCH 3/4] armbox eplayer: increase wait time (thx DboxOldie) Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/48be31fb6db723866f09d583982d26be2129e65e Author: max_10 Date: 2017-12-30 (Sat, 30 Dec 2017) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/container/container_ffmpeg.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libeplayer3-arm/container/container_ffmpeg.c b/libeplayer3-arm/container/container_ffmpeg.c index 871c541..b59d534 100644 --- a/libeplayer3-arm/container/container_ffmpeg.c +++ b/libeplayer3-arm/container/container_ffmpeg.c @@ -2198,7 +2198,11 @@ static int32_t container_ffmpeg_play(Context_t *context) static int32_t container_ffmpeg_stop(Context_t *context) { int32_t ret = cERR_CONTAINER_FFMPEG_NO_ERROR; - int32_t wait_time = 10; // we give 1s to close otherwise we will force close + int32_t wait_time = 50; + /* we give 5s max. to close otherwise we will force close + * in this case, ffmpeg thread will not be terminated + * and causes in most cases a segfault + */ ffmpeg_printf(10, "\n"); if (!isContainerRunning) { From c4b07217d98492d64cfe78c83ce07aaf7cad9a8d Mon Sep 17 00:00:00 2001 From: max_10 Date: Sat, 30 Dec 2017 13:48:41 +0100 Subject: [PATCH 4/4] armbox eplayer: noprobe for ts (thx DboxOldie) Origin commit data ------------------ Branch: master Commit: https://github.com/neutrino-images/ni-libstb-hal/commit/fb92b30581ef6cccd6036b57d447eabc6f843552 Author: max_10 Date: 2017-12-30 (Sat, 30 Dec 2017) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- libeplayer3-arm/playback/playback.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libeplayer3-arm/playback/playback.c b/libeplayer3-arm/playback/playback.c index 7c9f59a..9f1eb85 100644 --- a/libeplayer3-arm/playback/playback.c +++ b/libeplayer3-arm/playback/playback.c @@ -146,6 +146,10 @@ static int PlaybackOpen(Context_t *context, PlayFiles_t *pFiles) playback_err("Wrong extension (%s)\n", context->playback->uri + 7); return cERR_PLAYBACK_ERROR; } + else if (!strncmp("ts", extension, 2)) + { + context->playback->noprobe = 1; + } } else if (strstr(uri, "://")) {