diff --git a/libeplayer3/container/container_ass.c b/libeplayer3/container/container_ass.c index e7c89d9..33fcbc0 100644 --- a/libeplayer3/container/container_ass.c +++ b/libeplayer3/container/container_ass.c @@ -56,7 +56,7 @@ #ifdef ASS_DEBUG -static short debug_level = 10; +static short debug_level = 0; #define ass_printf(level, fmt, x...) do { \ if (debug_level >= level) printf("[%s:%s] " fmt, __FILE__, __FUNCTION__, ## x); } while (0) diff --git a/libeplayer3/container/container_ffmpeg.c b/libeplayer3/container/container_ffmpeg.c index 5e88e4b..348dbb3 100644 --- a/libeplayer3/container/container_ffmpeg.c +++ b/libeplayer3/container/container_ffmpeg.c @@ -1508,6 +1508,67 @@ static int container_ffmpeg_get_info(Context_t * context, char **infoString) } +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 (avContext->metadata) + psize += av_dict_count(avContext->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 (avContext->metadata) + while ((tag = av_dict_get(avContext->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 int Command(void *_context, ContainerCmd_t command, void *argument) { Context_t *context = (Context_t *) _context; @@ -1560,6 +1621,10 @@ static int Command(void *_context, ContainerCmd_t command, void *argument) ret = container_ffmpeg_get_info(context, (char **) argument); break; } + case CONTAINER_METADATA:{ + ret = container_ffmpeg_get_metadata(context, (char ***) argument); + break; + } case CONTAINER_STATUS:{ *((int *) argument) = hasPlayThreadStarted; break; diff --git a/libeplayer3/include/container.h b/libeplayer3/include/container.h index dac8709..21347d1 100644 --- a/libeplayer3/include/container.h +++ b/libeplayer3/include/container.h @@ -18,6 +18,7 @@ typedef enum { CONTAINER_SWITCH_DVBSUBTITLE, CONTAINER_SWITCH_TELETEXT, CONTAINER_INFO, + CONTAINER_METADATA, CONTAINER_STATUS, CONTAINER_LAST_PTS, CONTAINER_DATA diff --git a/libeplayer3/include/playback.h b/libeplayer3/include/playback.h index 3179d43..6654137 100644 --- a/libeplayer3/include/playback.h +++ b/libeplayer3/include/playback.h @@ -6,7 +6,7 @@ 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_SWITCH_SUBTITLE, PLAYBACK_INFO, PLAYBACK_METADATA, PLAYBACK_SLOWMOTION, PLAYBACK_FASTBACKWARD, PLAYBACK_GET_FRAME_COUNT, PLAYBACK_SWITCH_TELETEXT, PLAYBACK_SWITCH_DVBSUBTITLE, PLAYBACK_FRAMEBUFFER_LOCK, diff --git a/libeplayer3/playback/playback.c b/libeplayer3/playback/playback.c index b198702..271b74a 100644 --- a/libeplayer3/playback/playback.c +++ b/libeplayer3/playback/playback.c @@ -862,6 +862,17 @@ static int 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_METADATA, + metadata); + return ret; +} + static int Command(void *_context, PlaybackCmd_t command, void *argument) { Context_t *context = (Context_t *) _context; /* to satisfy compiler */ @@ -932,6 +943,10 @@ static int Command(void *_context, PlaybackCmd_t command, void *argument) ret = PlaybackInfo(context, (char **) argument); break; } + case PLAYBACK_METADATA:{ + ret = PlaybackMetadata(context, (char ***) argument); + break; + } case PLAYBACK_SLOWMOTION:{ ret = PlaybackSlowMotion(context, (int *) argument); break;