demux_lavf: remove code duplication

Also move the lang field into the general stream header. (SH_COMMON is
an old hack to "share" code between audio/video/sub headers.)

There should be no functional changes, other than not printing stream
info in verbose mode or with slave mode. (The frontend already prints
stream info, and this is just a leftover when individual demuxers did
this, and slave mode remains broken.)
This commit is contained in:
wm4 2013-02-09 15:15:28 +01:00
parent 4d016a92c8
commit a0987186b9
5 changed files with 27 additions and 68 deletions

View File

@ -288,7 +288,7 @@ static void print_stream(struct MPContext *mpctx, struct track *t, int id)
const char *langopt = "?";
switch (t->type) {
case STREAM_VIDEO:
tname = "Video"; selopt = "vid"; langopt = "vlang";
tname = "Video"; selopt = "vid"; langopt = NULL;
break;
case STREAM_AUDIO:
tname = "Audio"; selopt = "aid"; langopt = "alang";
@ -300,7 +300,7 @@ static void print_stream(struct MPContext *mpctx, struct track *t, int id)
mp_msg(MSGT_CPLAYER, MSGL_INFO, "[stream] %-5s %3s",
tname, mpctx->current_track[t->type] == t ? "(+)" : "");
mp_msg(MSGT_CPLAYER, MSGL_INFO, " --%s=%d", selopt, t->user_tid);
if (t->lang)
if (t->lang && langopt)
mp_msg(MSGT_CPLAYER, MSGL_INFO, " --%s=%s", langopt, t->lang);
if (t->default_track)
mp_msg(MSGT_CPLAYER, MSGL_INFO, " (*)");
@ -877,7 +877,7 @@ static struct track *add_stream_track(struct MPContext *mpctx,
.title = stream->title,
.default_track = stream->default_track,
.attached_picture = stream->attached_picture,
.lang = stream->common_header->lang,
.lang = stream->lang,
.under_timeline = under_timeline,
.demuxer = stream->demuxer,
.stream = stream,

View File

@ -361,7 +361,7 @@ struct sh_sub *new_sh_sub_sid_lang(struct demuxer *demuxer, int id, int sid,
{
struct sh_sub *sh = new_sh_sub_sid(demuxer, id, sid);
if (lang && lang[0] && strcmp(lang, "und")) {
sh->lang = talloc_strdup(sh, lang);
sh->gsh->lang = talloc_strdup(sh, lang);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sid, lang);
}
return sh;

View File

@ -329,10 +329,7 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
lavf_priv_t *priv = demuxer->priv;
AVStream *st = avfc->streams[i];
AVCodecContext *codec = st->codec;
char *stream_type = NULL;
int stream_id;
AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
AVDictionaryEntry *title = av_dict_get(st->metadata, "title", NULL, 0);
struct sh_stream *sh = NULL;
// Work around collisions resulting from the hacks changing codec_tag.
int lavf_codec_tag = codec->codec_tag;
// Don't use native MPEG codec tag values with our generic tag tables.
@ -347,8 +344,6 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
const char *mp_codec = mp_codec_from_av_codec_id(codec->codec_id);
bool set_demuxer_id = matches_avinputformat_name(priv, "mpeg");
switch (codec->codec_type) {
case AVMEDIA_TYPE_AUDIO: {
WAVEFORMATEX *wf;
@ -356,12 +351,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
sh_audio = new_sh_audio_aid(demuxer, i, priv->audio_streams);
if (!sh_audio)
break;
if (set_demuxer_id)
sh_audio->gsh->demuxer_id = st->id;
stream_type = "audio";
sh = sh_audio->gsh;
priv->astreams[priv->audio_streams] = i;
sh_audio->gsh->codec = mp_codec;
sh_audio->gsh->lavf_codec_tag = lavf_codec_tag;
wf = calloc(sizeof(*wf) + codec->extradata_size, 1);
// mp4a tag is used for all mp4 files no matter what they actually contain
if (codec->codec_tag == MKTAG('m', 'p', '4', 'a'))
@ -405,22 +396,10 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
sh_audio->format = 0x7;
break;
}
if (title && title->value) {
sh_audio->gsh->title = talloc_strdup(sh_audio, title->value);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_NAME=%s\n",
priv->audio_streams, title->value);
}
if (lang && lang->value) {
sh_audio->lang = talloc_strdup(sh_audio, lang->value);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n",
priv->audio_streams, sh_audio->lang);
}
if (st->disposition & AV_DISPOSITION_DEFAULT)
sh_audio->gsh->default_track = 1;
if (mp_msg_test(MSGT_HEADER, MSGL_V))
print_wave_header(sh_audio->wf, MSGL_V);
st->discard = AVDISCARD_ALL;
stream_id = priv->audio_streams++;
priv->audio_streams++;
break;
}
case AVMEDIA_TYPE_VIDEO: {
@ -429,12 +408,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
sh_video = new_sh_video_vid(demuxer, i, priv->video_streams);
if (!sh_video)
break;
if (set_demuxer_id)
sh_video->gsh->demuxer_id = st->id;
stream_type = "video";
sh = sh_video->gsh;
priv->vstreams[priv->video_streams] = i;
sh_video->gsh->codec = mp_codec;
sh_video->gsh->lavf_codec_tag = lavf_codec_tag;
if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
sh_video->gsh->attached_picture = true;
bih = calloc(sizeof(*bih) + codec->extradata_size, 1);
@ -496,11 +471,7 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
sh_video->aspect = codec->width * codec->sample_aspect_ratio.num
/ (float)(codec->height * codec->sample_aspect_ratio.den);
sh_video->i_bps = codec->bit_rate / 8;
if (title && title->value) {
sh_video->gsh->title = talloc_strdup(sh_video, title->value);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n",
priv->video_streams, title->value);
}
mp_msg(MSGT_DEMUX, MSGL_DBG2, "aspect= %d*%d/(%d*%d)\n",
codec->width, codec->sample_aspect_ratio.num,
codec->height, codec->sample_aspect_ratio.den);
@ -517,7 +488,7 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
demuxer->video->id = i;
demuxer->video->sh = demuxer->v_streams[i];
}
stream_id = priv->video_streams++;
priv->video_streams++;
break;
}
case AVMEDIA_TYPE_SUBTITLE: {
@ -545,31 +516,15 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
sh_sub = new_sh_sub_sid(demuxer, i, priv->sub_streams);
if (!sh_sub)
break;
if (set_demuxer_id)
sh_sub->gsh->demuxer_id = st->id;
stream_type = "subtitle";
sh = sh_sub->gsh;
priv->sstreams[priv->sub_streams] = i;
sh_sub->gsh->codec = mp_codec;
sh_sub->gsh->lavf_codec_tag = lavf_codec_tag;
sh_sub->type = type;
if (codec->extradata_size) {
sh_sub->extradata = malloc(codec->extradata_size);
memcpy(sh_sub->extradata, codec->extradata, codec->extradata_size);
sh_sub->extradata_len = codec->extradata_size;
}
if (title && title->value) {
sh_sub->gsh->title = talloc_strdup(sh_sub, title->value);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n",
priv->sub_streams, title->value);
}
if (lang && lang->value) {
sh_sub->lang = talloc_strdup(sh_sub, lang->value);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n",
priv->sub_streams, sh_sub->lang);
}
if (st->disposition & AV_DISPOSITION_DEFAULT)
sh_sub->gsh->default_track = 1;
stream_id = priv->sub_streams++;
priv->sub_streams++;
break;
}
case AVMEDIA_TYPE_ATTACHMENT: {
@ -586,15 +541,19 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
default:
st->discard = AVDISCARD_ALL;
}
if (stream_type) {
mp_msg(MSGT_DEMUX, MSGL_V, "[lavf] stream %d: %s, -%cid %d",
i, stream_type, *stream_type, stream_id);
if (lang && lang->value && *stream_type != 'v')
mp_msg(MSGT_DEMUX, MSGL_V, ", -%clang %s",
*stream_type, lang->value);
if (sh) {
sh->codec = mp_codec;
sh->lavf_codec_tag = lavf_codec_tag;
if (st->disposition & AV_DISPOSITION_DEFAULT)
sh->default_track = 1;
if (matches_avinputformat_name(priv, "mpeg"))
sh->demuxer_id = st->id;
AVDictionaryEntry *title = av_dict_get(st->metadata, "title", NULL, 0);
if (title && title->value)
mp_msg(MSGT_DEMUX, MSGL_V, ", %s", title->value);
mp_msg(MSGT_DEMUX, MSGL_V, "\n");
sh->title = talloc_strdup(sh, title->value);
AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
if (lang && lang->value)
sh->lang = talloc_strdup(sh, lang->value);
}
}

View File

@ -1337,7 +1337,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
return 1;
if (track->language && (strcmp(track->language, "und") != 0))
sh_a->lang = talloc_strdup(sh_a, track->language);
sh_a->gsh->lang = talloc_strdup(sh_a, track->language);
sh_a->gsh->demuxer_id = track->tnum;
sh_a->gsh->title = talloc_strdup(sh_a, track->name);
sh_a->gsh->default_track = track->default_track;
@ -1602,7 +1602,7 @@ static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
memcpy(sh->extradata, track->private_data, track->private_size);
sh->extradata_len = track->private_size;
if (track->language && (strcmp(track->language, "und") != 0))
sh->lang = talloc_strdup(sh, track->language);
sh->gsh->lang = talloc_strdup(sh, track->language);
sh->gsh->title = talloc_strdup(sh, track->name);
sh->gsh->default_track = track->default_track;
} else {

View File

@ -63,6 +63,7 @@ struct sh_stream {
int lavf_codec_tag;
char *title;
char *lang; // language code
bool default_track; // container default track flag
bool attached_picture; // stream is a picture (such as album art)
@ -93,7 +94,6 @@ struct sh_stream {
double pts; \
/* decoder context */ \
void *context; \
char *lang; /* track language */ \
typedef struct sh_common {
SH_COMMON