summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-04-15 21:25:21 +0200
committerwm4 <wm4@nowhere>2013-04-20 23:28:27 +0200
commit331982b99ce3b50b95ac340eb17c6116913480f3 (patch)
treeb0e0c14521f509a883c0420d9e6277c0329eb773 /demux
parent5ac50f88c90167e9ade0c998ac62e935e259acee (diff)
downloadmpv-331982b99ce3b50b95ac340eb17c6116913480f3.tar.bz2
mpv-331982b99ce3b50b95ac340eb17c6116913480f3.tar.xz
sub, demux: identify subtitle types with the codec name
Get rid of the 1-char subtitle type field. Use sh_stream->codec instead just like audio and video do. Use codec names as defined by libavcodec for simplicity, even if they're somewhat verbose and annoying. Note that ffmpeg might switch to "ass" as codec name for ASS, so we don't bother with the current silly "ssa" name.
Diffstat (limited to 'demux')
-rw-r--r--demux/demux.c15
-rw-r--r--demux/demux_lavf.c21
-rw-r--r--demux/demux_mkv.c37
-rw-r--r--demux/demux_mpg.c2
-rw-r--r--demux/demux_ts.c6
-rw-r--r--demux/stheader.h3
6 files changed, 25 insertions, 59 deletions
diff --git a/demux/demux.c b/demux/demux.c
index c23185c90b..b3cb078dcb 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -241,21 +241,6 @@ demuxer_t *new_demuxer(struct MPOpts *opts, stream_t *stream, int type,
return d;
}
-const char *sh_sub_type2str(int type)
-{
- switch (type) {
- case 't': return "text";
- case 'm': return "movtext";
- case 'a': return "ass";
- case 'v': return "vobsub";
- case 'x': return "xsub";
- case 'b': return "dvb";
- case 'd': return "dvb-teletext";
- case 'p': return "hdmv pgs";
- }
- return "unknown";
-}
-
static struct sh_stream *new_sh_stream_id(demuxer_t *demuxer,
enum stream_type type,
int stream_index,
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index 498f99e014..968e9e60c8 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -387,32 +387,11 @@ static void handle_stream(demuxer_t *demuxer, int i)
}
case AVMEDIA_TYPE_SUBTITLE: {
sh_sub_t *sh_sub;
- char type;
- if (codec->codec_id == AV_CODEC_ID_TEXT ||
- codec->codec_id == AV_CODEC_ID_SUBRIP)
- type = 't';
- else if (codec->codec_id == AV_CODEC_ID_MOV_TEXT)
- type = 'm';
- else if (codec->codec_id == AV_CODEC_ID_SSA)
- type = 'a';
- else if (codec->codec_id == AV_CODEC_ID_DVD_SUBTITLE)
- type = 'v';
- else if (codec->codec_id == AV_CODEC_ID_XSUB)
- type = 'x';
- else if (codec->codec_id == AV_CODEC_ID_DVB_SUBTITLE)
- type = 'b';
- else if (codec->codec_id == AV_CODEC_ID_DVB_TELETEXT)
- type = 'd';
- else if (codec->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE)
- type = 'p';
- else
- break;
sh = new_sh_stream(demuxer, STREAM_SUB);
if (!sh)
break;
sh_sub = sh->sub;
- sh_sub->type = type;
if (codec->extradata_size) {
sh_sub->extradata = malloc(codec->extradata_size);
memcpy(sh_sub->extradata, codec->extradata, codec->extradata_size);
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index 03789631dc..647f831630 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -133,8 +133,6 @@ typedef struct mkv_track {
int fix_i_bps;
double qt_last_a_pts;
- int subtitle_type;
-
/* generic content encoding support */
mkv_content_encoding_t *encodings;
int num_encodings;
@@ -602,18 +600,6 @@ static void parse_trackentry(struct demuxer *demuxer,
if (!strcmp(track->codec_id, MKV_V_MSCOMP)
|| !strcmp(track->codec_id, MKV_A_ACM))
track->ms_compat = 1;
- else if (!strcmp(track->codec_id, MKV_S_VOBSUB))
- track->subtitle_type = 'v';
- else if (!strcmp(track->codec_id, MKV_S_TEXTSSA)
- || !strcmp(track->codec_id, MKV_S_TEXTASS)
- || !strcmp(track->codec_id, MKV_S_SSA)
- || !strcmp(track->codec_id, MKV_S_ASS))
- track->subtitle_type = 'a';
- else if (!strcmp(track->codec_id, MKV_S_TEXTASCII)
- || !strcmp(track->codec_id, MKV_S_TEXTUTF8))
- track->subtitle_type = 't';
- else if (!strcmp(track->codec_id, MKV_S_PGS))
- track->subtitle_type = 'p';
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Codec ID: %s\n",
track->codec_id);
} else
@@ -1571,9 +1557,28 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
return 1;
}
+static const char *mkv_sub_tag[][2] = {
+ { MKV_S_VOBSUB, "dvd_subtitle" },
+ { MKV_S_TEXTSSA, "ass"},
+ { MKV_S_TEXTASS, "ass"},
+ { MKV_S_SSA, "ass"},
+ { MKV_S_ASS, "ass"},
+ { MKV_S_TEXTASCII, "subrip"},
+ { MKV_S_TEXTUTF8, "subrip"},
+ { MKV_S_PGS, "hdmv_pgs_subtitle"},
+ {0}
+};
+
static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track)
{
- if (track->subtitle_type) {
+ const char *subtitle_type = NULL;
+ for (int n = 0; mkv_sub_tag[n][0]; n++) {
+ if (strcmp(track->codec_id, mkv_sub_tag[n][0]) == 0) {
+ subtitle_type = mkv_sub_tag[n][1];
+ break;
+ }
+ }
+ if (subtitle_type) {
bstr in = (bstr){track->private_data, track->private_size};
struct sh_stream *gsh = new_sh_stream(demuxer, STREAM_SUB);
if (!gsh)
@@ -1582,7 +1587,7 @@ static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track)
sh_sub_t *sh = gsh->sub;
sh->gsh->demuxer_id = track->tnum;
track->sh_sub = sh;
- sh->type = track->subtitle_type;
+ sh->gsh->codec = subtitle_type;
bstr buffer = demux_mkv_decode(track, in, 2);
if (buffer.start && buffer.start != track->private_data) {
talloc_free(track->private_data);
diff --git a/demux/demux_mpg.c b/demux/demux_mpg.c
index 52153b9a6a..b30fb8e6e1 100644
--- a/demux/demux_mpg.c
+++ b/demux/demux_mpg.c
@@ -523,7 +523,7 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
if(!demux->s_streams[aid]){
sh_sub_t *sh = new_sh_sub(demux, aid);
- if (sh) sh->type = 'v';
+ if (sh) sh->gsh->codec = "dvd_subtitle";
mp_msg(MSGT_DEMUX,MSGL_V,"==> Found subtitle: %d\n",aid);
}
diff --git a/demux/demux_ts.c b/demux/demux_ts.c
index ac23f0e71b..6d41dfd939 100644
--- a/demux/demux_ts.c
+++ b/demux/demux_ts.c
@@ -415,11 +415,11 @@ static void ts_add_stream(demuxer_t * demuxer, ES_stream_t *es)
if (sh) {
switch (es->type) {
case SPU_DVB:
- sh->type = 'b'; break;
+ sh->gsh->codec = "dvb_subtitle"; break;
case SPU_DVD:
- sh->type = 'v'; break;
+ sh->gsh->codec = "dvd_subtitle"; break;
case SPU_PGS:
- sh->type = 'p'; break;
+ sh->gsh->codec = "hdmv_pgs_subtitle"; break;
}
priv->ts.streams[es->pid].id = priv->last_sid;
priv->ts.streams[es->pid].sh = sh;
diff --git a/demux/stheader.h b/demux/stheader.h
index 2fe1ac40c5..47dcf7a207 100644
--- a/demux/stheader.h
+++ b/demux/stheader.h
@@ -171,7 +171,6 @@ typedef struct sh_video {
typedef struct sh_sub {
SH_COMMON
- char type; // t = text, v = VobSub, a = SSA/ASS, m, x, b, d, p
bool active; // after track switch decoder may stay initialized, not active
unsigned char *extradata; // extra header data passed from demuxer
int extradata_len;
@@ -189,8 +188,6 @@ struct sh_sub *new_sh_sub_sid_lang(struct demuxer *demuxer, int id, int sid,
const char *lang);
struct sh_stream *new_sh_stream(struct demuxer *demuxer, enum stream_type type);
-const char *sh_sub_type2str(int type);
-
// video.c:
int video_read_properties(struct sh_video *sh_video);
int video_read_frame(struct sh_video *sh_video, float *frame_time_ptr,