diff --git a/libarmbox/playback_libeplayer3.cpp b/libarmbox/playback_libeplayer3.cpp index 4cacd4c..21eac91 100644 --- a/libarmbox/playback_libeplayer3.cpp +++ b/libarmbox/playback_libeplayer3.cpp @@ -427,7 +427,6 @@ 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; player->manager->audio->Command(player, MANAGER_LIST, &TrackList); @@ -471,7 +470,7 @@ void cPlayback::FindAllPids(int *apids, unsigned int *ac3flags, unsigned int *nu free(TrackList); *numpida=j; } - }*/ + } } void cPlayback::FindAllSubtitlePids(int *pids, unsigned int *numpids, std::string *language) @@ -512,9 +511,9 @@ void cPlayback::FindAllSubtitlePids(int *pids, unsigned int *numpids, std::strin void cPlayback::FindAllTeletextsubtitlePids(int *pids, unsigned int *numpids, std::string *language, int *mags, int *pages) { lt_info("%s\n", __func__); - /* int max_numpids = *numpids; *numpids = 0; + /* if(player && player->manager && player->manager->teletext) { char ** TrackList = NULL; player->manager->teletext->Command(player, MANAGER_LIST, &TrackList); @@ -621,7 +620,7 @@ void cPlayback::GetMetadata(std::vector &keys, std::vectorplayback) { - //player->playback->Command(player, PLAYBACK_METADATA, &metadata); + player->playback->Command(player, PLAYBACK_METADATA, &metadata); if (metadata) { for (char **m = metadata; *m;) diff --git a/libeplayer3-arm/container/container_ffmpeg.c b/libeplayer3-arm/container/container_ffmpeg.c index 59c4f6d..ed1b6a4 100644 --- a/libeplayer3-arm/container/container_ffmpeg.c +++ b/libeplayer3-arm/container/container_ffmpeg.c @@ -2580,6 +2580,67 @@ 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) +{ + Track_t *videoTrack = NULL; + Track_t *audioTrack = NULL; + AVDictionaryEntry *tag = NULL; + size_t psize = 1; + char **pp; + + if (!context) { + fprintf(stderr, "BUG %s:%d\n", __func__, __LINE__); + return cERR_CONTAINER_FFMPEG_ERR; + } + + if (!p || *p) { + fprintf(stderr, "BUG %s:%d\n", __func__, __LINE__); + return cERR_CONTAINER_FFMPEG_ERR; + } + + context->manager->video->Command(context, MANAGER_GET_TRACK, &videoTrack); + context->manager->audio->Command(context, MANAGER_GET_TRACK, &audioTrack); + + if (avContextTab[0]->metadata) + psize += av_dict_count(avContextTab[0]->metadata); + if (videoTrack) + psize += av_dict_count(((AVStream *)(videoTrack->stream))->metadata); + if (audioTrack) + psize += av_dict_count(((AVStream *)(audioTrack->stream))->metadata); + + *p = malloc(sizeof(char *) * psize * 2); + if (!*p) { + fprintf(stderr, "MALLOC %s:%d\n", __func__, __LINE__); + return cERR_CONTAINER_FFMPEG_ERR; + } + pp = *p; + + if (avContextTab[0]->metadata) + while ((tag = av_dict_get(avContextTab[0]->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { + *pp++ = strdup(tag->key); + *pp++ = strdup(tag->value); + } + + if (videoTrack) { + tag = NULL; + while ((tag = av_dict_get(((AVStream *)(videoTrack->stream))->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { + *pp++ = strdup(tag->key); + *pp++ = strdup(tag->value); + } + } + if (audioTrack) { + tag = NULL; + while ((tag = av_dict_get(((AVStream *)(audioTrack->stream))->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { + *pp++ = strdup(tag->key); + *pp++ = strdup(tag->value); + } + } + *pp++ = NULL; + *pp = NULL; + + return cERR_CONTAINER_FFMPEG_NO_ERROR; +} + static int32_t Command(void *_context, ContainerCmd_t command, void *argument) { Context_t *context = (Context_t *) _context; @@ -2666,6 +2727,11 @@ static int32_t Command(void *_context, ContainerCmd_t command, void *argument) *((int32_t *)argument) = size; break; } + case CONTAINER_GET_METADATA: + { + ret = container_ffmpeg_get_metadata(context, (char ***) argument); + break; + } default: ffmpeg_err("ContainerCmd %d not supported!\n", command); ret = cERR_CONTAINER_FFMPEG_ERR; diff --git a/libeplayer3-arm/include/container.h b/libeplayer3-arm/include/container.h index e3f32a1..5a4b5fd 100644 --- a/libeplayer3-arm/include/container.h +++ b/libeplayer3-arm/include/container.h @@ -24,7 +24,8 @@ typedef enum CONTAINER_SET_BUFFER_SIZE, CONTAINER_GET_BUFFER_SIZE, CONTAINER_GET_BUFFER_STATUS, - CONTAINER_STOP_BUFFER + CONTAINER_STOP_BUFFER, + CONTAINER_GET_METADATA } ContainerCmd_t; typedef struct Container_s diff --git a/libeplayer3-arm/include/playback.h b/libeplayer3-arm/include/playback.h index 3664173..77781d6 100644 --- a/libeplayer3-arm/include/playback.h +++ b/libeplayer3-arm/include/playback.h @@ -3,7 +3,7 @@ #include #include -typedef enum {PLAYBACK_OPEN, PLAYBACK_CLOSE, PLAYBACK_PLAY, PLAYBACK_STOP, PLAYBACK_PAUSE, PLAYBACK_CONTINUE, PLAYBACK_FLUSH, PLAYBACK_TERM, PLAYBACK_FASTFORWARD, PLAYBACK_SEEK, PLAYBACK_SEEK_ABS, PLAYBACK_PTS, PLAYBACK_LENGTH, PLAYBACK_SWITCH_AUDIO, PLAYBACK_SWITCH_SUBTITLE, PLAYBACK_INFO, PLAYBACK_SLOWMOTION, PLAYBACK_FASTBACKWARD, PLAYBACK_GET_FRAME_COUNT} PlaybackCmd_t; +typedef enum {PLAYBACK_OPEN, PLAYBACK_CLOSE, PLAYBACK_PLAY, PLAYBACK_STOP, PLAYBACK_PAUSE, PLAYBACK_CONTINUE, PLAYBACK_FLUSH, PLAYBACK_TERM, PLAYBACK_FASTFORWARD, PLAYBACK_SEEK, PLAYBACK_SEEK_ABS, PLAYBACK_PTS, PLAYBACK_LENGTH, PLAYBACK_SWITCH_AUDIO, PLAYBACK_SWITCH_SUBTITLE, PLAYBACK_INFO, PLAYBACK_SLOWMOTION, PLAYBACK_FASTBACKWARD, PLAYBACK_GET_FRAME_COUNT, PLAYBACK_METADATA} PlaybackCmd_t; typedef struct PlaybackHandler_s { diff --git a/libeplayer3-arm/manager/audio.c b/libeplayer3-arm/manager/audio.c index a0ee8f2..e5cacf0 100644 --- a/libeplayer3-arm/manager/audio.c +++ b/libeplayer3-arm/manager/audio.c @@ -126,6 +126,41 @@ static int ManagerAdd(Context_t *context, Track_t track) return cERR_AUDIO_MGR_NO_ERROR; } +static char **ManagerList(Context_t * context __attribute__ ((unused))) +{ + int i = 0, j = 0; + char **tracklist = NULL; + + audio_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__); + + if (Tracks != NULL) { + + tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1)); + + if (tracklist == NULL) { + audio_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__); + return NULL; + } + + for (i = 0, j = 0; i < TrackCount; i++, j += 2) { + if (Tracks[i].pending) + continue; + 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] = NULL; + } + + audio_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, + __FUNCTION__, tracklist, j, TrackCount); + + return tracklist; +} + +#if 0 static TrackDescription_t *ManagerList(Context_t *context __attribute__((unused))) { int i = 0; @@ -156,6 +191,7 @@ static TrackDescription_t *ManagerList(Context_t *context __attribute__((unused //audio_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, __FUNCTION__, tracklist, j, TrackCount); return tracklist; } +#endif static int ManagerDel(Context_t *context) { diff --git a/libeplayer3-arm/manager/video.c b/libeplayer3-arm/manager/video.c index 32af5b5..f67ca1a 100644 --- a/libeplayer3-arm/manager/video.c +++ b/libeplayer3-arm/manager/video.c @@ -125,6 +125,41 @@ static int ManagerAdd(Context_t *context, Track_t track) return cERR_VIDEO_MGR_NO_ERROR; } +static char **ManagerList(Context_t * context __attribute__ ((unused))) +{ + int i = 0, j = 0; + char **tracklist = NULL; + + video_mgr_printf(10, "%s::%s\n", FILENAME, __FUNCTION__); + + if (Tracks != NULL) { + + tracklist = malloc(sizeof(char *) * ((TrackCount * 2) + 1)); + + if (tracklist == NULL) { + video_mgr_err("%s:%s malloc failed\n", FILENAME, __FUNCTION__); + return NULL; + } + + for (i = 0, j = 0; i < TrackCount; i++, j += 2) { + if (Tracks[i].pending) + continue; + 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] = NULL; + } + + video_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, + __FUNCTION__, tracklist, j, TrackCount); + + return tracklist; +} + +#if 0 static char **ManagerList(Context_t *context __attribute__((unused))) { int i = 0, j = 0; @@ -155,6 +190,7 @@ static char **ManagerList(Context_t *context __attribute__((unused))) video_mgr_printf(10, "%s::%s return %p (%d - %d)\n", FILENAME, __FUNCTION__, tracklist, j, TrackCount); return tracklist; } +#endif static int ManagerDel(Context_t *context) { diff --git a/libeplayer3-arm/playback/playback.c b/libeplayer3-arm/playback/playback.c index 2e3b449..ae8a139 100644 --- a/libeplayer3-arm/playback/playback.c +++ b/libeplayer3-arm/playback/playback.c @@ -583,6 +583,17 @@ static int32_t PlaybackInfo(Context_t *context, char **infoString) return ret; } +static int PlaybackMetadata(Context_t * context, char ***metadata) +{ + int ret = cERR_PLAYBACK_NO_ERROR; + + if (context->container && context->container->selectedContainer) + context->container->selectedContainer->Command(context, + CONTAINER_GET_METADATA, + metadata); + return ret; +} + static int32_t Command(void *_context, PlaybackCmd_t command, void *argument) { Context_t *context = (Context_t *) _context; /* to satisfy compiler */ @@ -665,6 +676,11 @@ static int32_t Command(void *_context, PlaybackCmd_t command, void *argument) ret = PlaybackGetFrameCount(context, (uint64_t *)argument); break; } + case PLAYBACK_METADATA: + { + ret = PlaybackMetadata(context, (char ***) argument); + break; + } default: playback_err("PlaybackCmd %d not supported!\n", command); ret = cERR_PLAYBACK_ERROR;