You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-11-23 21:54:53 +02:00
ffplay: print new metadata
This commit is contained in:
committed by
Marton Balint
parent
32f73138f5
commit
c75ada5040
@@ -1613,3 +1613,28 @@ int check_avoptions(AVDictionary *m)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dump_dictionary(void *ctx, const AVDictionary *m,
|
||||||
|
const char *name, const char *indent,
|
||||||
|
int log_level)
|
||||||
|
{
|
||||||
|
const AVDictionaryEntry *tag = NULL;
|
||||||
|
|
||||||
|
if (!m)
|
||||||
|
return;
|
||||||
|
|
||||||
|
av_log(ctx, log_level, "%s%s:\n", indent, name);
|
||||||
|
while ((tag = av_dict_iterate(m, tag))) {
|
||||||
|
const char *p = tag->value;
|
||||||
|
av_log(ctx, log_level, "%s %-16s: ", indent, tag->key);
|
||||||
|
while (*p) {
|
||||||
|
size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
|
||||||
|
av_log(ctx, log_level, "%.*s", (int)(FFMIN(255, len)), p);
|
||||||
|
p += len;
|
||||||
|
if (*p == 0xd) av_log(ctx, log_level, " ");
|
||||||
|
if (*p == 0xa) av_log(ctx, log_level, "\n%s %-16s: ", indent, "");
|
||||||
|
if (*p) p++;
|
||||||
|
}
|
||||||
|
av_log(ctx, log_level, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -549,4 +549,12 @@ int check_avoptions(AVDictionary *m);
|
|||||||
|
|
||||||
int cmdutils_isalnum(char c);
|
int cmdutils_isalnum(char c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This does the same as libavformat/dump.c corresponding function
|
||||||
|
* and should probably be kept in sync when the other one changes.
|
||||||
|
*/
|
||||||
|
void dump_dictionary(void *ctx, const AVDictionary *m,
|
||||||
|
const char *name, const char *indent,
|
||||||
|
int log_level);
|
||||||
|
|
||||||
#endif /* FFTOOLS_CMDUTILS_H */
|
#endif /* FFTOOLS_CMDUTILS_H */
|
||||||
|
|||||||
@@ -2843,6 +2843,7 @@ static int read_thread(void *arg)
|
|||||||
int st_index[AVMEDIA_TYPE_NB];
|
int st_index[AVMEDIA_TYPE_NB];
|
||||||
AVPacket *pkt = NULL;
|
AVPacket *pkt = NULL;
|
||||||
int64_t stream_start_time;
|
int64_t stream_start_time;
|
||||||
|
char metadata_description[96];
|
||||||
int pkt_in_play_range = 0;
|
int pkt_in_play_range = 0;
|
||||||
const AVDictionaryEntry *t;
|
const AVDictionaryEntry *t;
|
||||||
SDL_mutex *wait_mutex = SDL_CreateMutex();
|
SDL_mutex *wait_mutex = SDL_CreateMutex();
|
||||||
@@ -2950,8 +2951,10 @@ static int read_thread(void *arg)
|
|||||||
|
|
||||||
is->realtime = is_realtime(ic);
|
is->realtime = is_realtime(ic);
|
||||||
|
|
||||||
if (show_status)
|
if (show_status) {
|
||||||
|
fprintf(stderr, "\x1b[2K\r");
|
||||||
av_dump_format(ic, 0, is->filename, 0);
|
av_dump_format(ic, 0, is->filename, 0);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < ic->nb_streams; i++) {
|
for (i = 0; i < ic->nb_streams; i++) {
|
||||||
AVStream *st = ic->streams[i];
|
AVStream *st = ic->streams[i];
|
||||||
@@ -2960,6 +2963,9 @@ static int read_thread(void *arg)
|
|||||||
if (type >= 0 && wanted_stream_spec[type] && st_index[type] == -1)
|
if (type >= 0 && wanted_stream_spec[type] && st_index[type] == -1)
|
||||||
if (avformat_match_stream_specifier(ic, st, wanted_stream_spec[type]) > 0)
|
if (avformat_match_stream_specifier(ic, st, wanted_stream_spec[type]) > 0)
|
||||||
st_index[type] = i;
|
st_index[type] = i;
|
||||||
|
// Clear all pre-existing metadata update flags to avoid printing
|
||||||
|
// initial metadata as update.
|
||||||
|
st->event_flags &= ~AVSTREAM_EVENT_FLAG_METADATA_UPDATED;
|
||||||
}
|
}
|
||||||
for (i = 0; i < AVMEDIA_TYPE_NB; i++) {
|
for (i = 0; i < AVMEDIA_TYPE_NB; i++) {
|
||||||
if (wanted_stream_spec[i] && st_index[i] == -1) {
|
if (wanted_stream_spec[i] && st_index[i] == -1) {
|
||||||
@@ -3128,6 +3134,19 @@ static int read_thread(void *arg)
|
|||||||
} else {
|
} else {
|
||||||
is->eof = 0;
|
is->eof = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (show_status && ic->streams[pkt->stream_index]->event_flags &
|
||||||
|
AVSTREAM_EVENT_FLAG_METADATA_UPDATED) {
|
||||||
|
fprintf(stderr, "\x1b[2K\r");
|
||||||
|
snprintf(metadata_description,
|
||||||
|
sizeof(metadata_description),
|
||||||
|
"\r New metadata for stream %d",
|
||||||
|
pkt->stream_index);
|
||||||
|
dump_dictionary(NULL, ic->streams[pkt->stream_index]->metadata,
|
||||||
|
metadata_description, " ", AV_LOG_INFO);
|
||||||
|
}
|
||||||
|
ic->streams[pkt->stream_index]->event_flags &= ~AVSTREAM_EVENT_FLAG_METADATA_UPDATED;
|
||||||
|
|
||||||
/* check if packet is in play range specified by user, then queue, otherwise discard */
|
/* check if packet is in play range specified by user, then queue, otherwise discard */
|
||||||
stream_start_time = ic->streams[pkt->stream_index]->start_time;
|
stream_start_time = ic->streams[pkt->stream_index]->start_time;
|
||||||
pkt_ts = pkt->pts == AV_NOPTS_VALUE ? pkt->dts : pkt->pts;
|
pkt_ts = pkt->pts == AV_NOPTS_VALUE ? pkt->dts : pkt->pts;
|
||||||
|
|||||||
Reference in New Issue
Block a user