demux_lavf: remove "internet radio hack"

It appears this is not needed anymore. ffmpeg can handle "chained" ogg
files fine. These can be created with "cat file1.ogg file2.ogg > chained.ogg",
and are similar (or equal) to some internet radio streams. Apparently
ffmpeg used to add new tracks when crossing boundaries in chained files,
and the hack in demux_lavf.c handled this. At some later point, ffmpeg's
ogg demuxer was improved, and stopped adding new tracks as long as the
codec doesn't change.

Since the hack in demux_lavf.c was hardcoded to Vorbis (i.e. only active
if the new and old track were both Vorbis), it's dead code, and we can
remove it. I couldn't find any stream that triggered this hack, or fails
without it.

Firefox had a similar issue, and its bug tracker makes a good reference:

    https://bugzilla.mozilla.org/show_bug.cgi?id=455165

NOTE: this doesn't update metadata on track changes anymore.
This commit is contained in:
wm4 2013-02-02 20:48:01 +01:00
parent 74b66862d7
commit d61408f0da
1 changed files with 1 additions and 39 deletions

View File

@ -79,7 +79,6 @@ typedef struct lavf_priv {
int sstreams[MAX_S_STREAMS]; int sstreams[MAX_S_STREAMS];
int cur_program; int cur_program;
int nb_streams_last; int nb_streams_last;
bool internet_radio_hack;
bool use_dts; bool use_dts;
bool seek_by_bytes; bool seek_by_bytes;
int bitrate; int bitrate;
@ -744,42 +743,6 @@ static demuxer_t *demux_open_lavf(demuxer_t *demuxer)
return demuxer; return demuxer;
} }
static void check_internet_radio_hack(struct demuxer *demuxer)
{
struct lavf_priv *priv = demuxer->priv;
struct AVFormatContext *avfc = priv->avfc;
if (!matches_avinputformat_name(priv, "ogg"))
return;
if (priv->nb_streams_last == avfc->nb_streams)
return;
if (avfc->nb_streams - priv->nb_streams_last == 1
&& priv->video_streams == 0 && priv->sub_streams == 0
&& demuxer->a_streams[priv->audio_streams - 1]->format == 0x566f // vorbis
&& (priv->audio_streams == 2 || priv->internet_radio_hack)
&& demuxer->a_streams[0]->format == 0x566f) {
// extradata match could be checked but would require parsing
// headers, as the comment section will vary
if (!priv->internet_radio_hack) {
mp_msg(MSGT_DEMUX, MSGL_V,
"[lavf] enabling internet ogg radio hack\n");
}
priv->internet_radio_hack = true;
// use new per-track metadata as global metadata
AVDictionaryEntry *t = NULL;
AVStream *stream = avfc->streams[avfc->nb_streams - 1];
while ((t = av_dict_get(stream->metadata, "", t,
AV_DICT_IGNORE_SUFFIX)))
demux_info_add(demuxer, t->key, t->value);
} else {
if (priv->internet_radio_hack)
mp_tmsg(MSGT_DEMUX, MSGL_WARN, "[lavf] Internet radio ogg hack "
"was enabled, but stream characteristics changed.\n"
"This may or may not work.\n");
priv->internet_radio_hack = false;
}
}
static int destroy_avpacket(void *pkt) static int destroy_avpacket(void *pkt)
{ {
av_free_packet(pkt); av_free_packet(pkt);
@ -806,7 +769,6 @@ static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds)
// handle any new streams that might have been added // handle any new streams that might have been added
for (id = priv->nb_streams_last; id < priv->avfc->nb_streams; id++) for (id = priv->nb_streams_last; id < priv->avfc->nb_streams; id++)
handle_stream(demux, priv->avfc, id); handle_stream(demux, priv->avfc, id);
check_internet_radio_hack(demux);
priv->nb_streams_last = priv->avfc->nb_streams; priv->nb_streams_last = priv->avfc->nb_streams;
@ -820,7 +782,7 @@ static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds)
demux->sub->id = id; demux->sub->id = id;
} }
if (id == demux->audio->id || priv->internet_radio_hack) { if (id == demux->audio->id) {
// audio // audio
ds = demux->audio; ds = demux->audio;
if (!ds->sh) { if (!ds->sh) {