mirror of
https://github.com/mpv-player/mpv
synced 2025-01-17 12:31:25 +00:00
Make subtitle stream handling more similar to audio and video streams.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@20888 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
d189145a4a
commit
c5fa0bbf92
@ -1766,6 +1766,8 @@ static int
|
|||||||
demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid);
|
demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid);
|
||||||
static int
|
static int
|
||||||
demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid);
|
demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid);
|
||||||
|
static int
|
||||||
|
demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
display_create_tracks (demuxer_t *demuxer)
|
display_create_tracks (demuxer_t *demuxer)
|
||||||
@ -1796,7 +1798,7 @@ display_create_tracks (demuxer_t *demuxer)
|
|||||||
break;
|
break;
|
||||||
case MATROSKA_TRACK_SUBTITLE:
|
case MATROSKA_TRACK_SUBTITLE:
|
||||||
type = "subtitles";
|
type = "subtitles";
|
||||||
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
|
demux_mkv_open_sub(demuxer, mkv_d->tracks[i], sid);
|
||||||
if (mkv_d->tracks[i]->name)
|
if (mkv_d->tracks[i]->name)
|
||||||
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", sid, mkv_d->tracks[i]->name);
|
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", sid, mkv_d->tracks[i]->name);
|
||||||
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sid, mkv_d->tracks[i]->language);
|
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sid, mkv_d->tracks[i]->language);
|
||||||
@ -2408,18 +2410,18 @@ demux_mkv_parse_ass_data (demuxer_t *demuxer)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track)
|
demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid)
|
||||||
{
|
{
|
||||||
if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN)
|
if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN)
|
||||||
{
|
{
|
||||||
|
sh_sub_t *sh = new_sh_sub_sid(demuxer, track->tnum, sid);
|
||||||
if ((track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB) ||
|
if ((track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB) ||
|
||||||
(track->subtitle_type == MATROSKA_SUBTYPE_SSA))
|
(track->subtitle_type == MATROSKA_SUBTYPE_SSA))
|
||||||
{
|
{
|
||||||
if (track->private_data != NULL)
|
if (track->private_data != NULL)
|
||||||
{
|
{
|
||||||
demuxer->sub->sh = malloc(sizeof(sh_sub_t));
|
if (sh)
|
||||||
if (demuxer->sub->sh != NULL)
|
memcpy(sh, &track->sh_sub, sizeof(sh_sub_t));
|
||||||
memcpy(demuxer->sub->sh, &track->sh_sub, sizeof(sh_sub_t));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2680,7 +2682,7 @@ demux_mkv_open (demuxer_t *demuxer)
|
|||||||
track = demux_mkv_find_track_by_language (mkv_d, dvdsub_lang,
|
track = demux_mkv_find_track_by_language (mkv_d, dvdsub_lang,
|
||||||
MATROSKA_TRACK_SUBTITLE);
|
MATROSKA_TRACK_SUBTITLE);
|
||||||
|
|
||||||
if (track && !demux_mkv_open_sub (demuxer, track))
|
if (track)
|
||||||
{
|
{
|
||||||
mp_msg (MSGT_DEMUX, MSGL_INFO,
|
mp_msg (MSGT_DEMUX, MSGL_INFO,
|
||||||
MSGTR_MPDEMUX_MKV_WillDisplaySubtitleTrack, track->tnum);
|
MSGTR_MPDEMUX_MKV_WillDisplaySubtitleTrack, track->tnum);
|
||||||
|
@ -298,7 +298,7 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
|||||||
|
|
||||||
if(!demux->s_streams[aid]){
|
if(!demux->s_streams[aid]){
|
||||||
mp_msg(MSGT_DEMUX,MSGL_V,"==> Found subtitle: %d\n",aid);
|
mp_msg(MSGT_DEMUX,MSGL_V,"==> Found subtitle: %d\n",aid);
|
||||||
demux->s_streams[aid]=1;
|
new_sh_sub(demux, aid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(demux->sub->id > -1)
|
if(demux->sub->id > -1)
|
||||||
|
@ -201,6 +201,23 @@ demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id,char
|
|||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) {
|
||||||
|
if (id > MAX_S_STREAMS - 1 || id < 0) {
|
||||||
|
mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested sub stream id overflow (%d > %d)\n",
|
||||||
|
id, MAX_S_STREAMS);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (demuxer->s_streams[id])
|
||||||
|
mp_msg(MSGT_DEMUXER, MSGL_WARN, "Sub stream %i redefined\n", id);
|
||||||
|
else {
|
||||||
|
sh_sub_t *sh = calloc(1, sizeof(sh_sub_t));
|
||||||
|
demuxer->s_streams[id] = sh;
|
||||||
|
sh->sid = sid;
|
||||||
|
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
|
||||||
|
}
|
||||||
|
return demuxer->s_streams[id];
|
||||||
|
}
|
||||||
|
|
||||||
sh_audio_t* new_sh_audio_aid(demuxer_t *demuxer,int id,int aid){
|
sh_audio_t* new_sh_audio_aid(demuxer_t *demuxer,int id,int aid){
|
||||||
if(id > MAX_A_STREAMS-1 || id < 0)
|
if(id > MAX_A_STREAMS-1 || id < 0)
|
||||||
{
|
{
|
||||||
|
@ -128,6 +128,7 @@ typedef struct demuxer_info_st {
|
|||||||
} demuxer_info_t;
|
} demuxer_info_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
int sid;
|
||||||
char type; // t = text, v = VobSub, a = SSA/ASS
|
char type; // t = text, v = VobSub, a = SSA/ASS
|
||||||
int has_palette; // If we have a valid palette
|
int has_palette; // If we have a valid palette
|
||||||
unsigned int palette[16]; // for VobSubs
|
unsigned int palette[16]; // for VobSubs
|
||||||
@ -142,6 +143,7 @@ typedef struct {
|
|||||||
|
|
||||||
#define MAX_A_STREAMS 256
|
#define MAX_A_STREAMS 256
|
||||||
#define MAX_V_STREAMS 256
|
#define MAX_V_STREAMS 256
|
||||||
|
#define MAX_S_STREAMS 32
|
||||||
|
|
||||||
struct demuxer_st;
|
struct demuxer_st;
|
||||||
|
|
||||||
@ -199,7 +201,7 @@ typedef struct demuxer_st {
|
|||||||
// stream headers:
|
// stream headers:
|
||||||
void* a_streams[MAX_A_STREAMS]; // audio streams (sh_audio_t)
|
void* a_streams[MAX_A_STREAMS]; // audio streams (sh_audio_t)
|
||||||
void* v_streams[MAX_V_STREAMS]; // video sterams (sh_video_t)
|
void* v_streams[MAX_V_STREAMS]; // video sterams (sh_video_t)
|
||||||
char s_streams[32]; // dvd subtitles (flag)
|
void *s_streams[MAX_S_STREAMS]; // dvd subtitles (flag)
|
||||||
|
|
||||||
demux_chapter_t* chapters;
|
demux_chapter_t* chapters;
|
||||||
int num_chapters;
|
int num_chapters;
|
||||||
|
Loading…
Reference in New Issue
Block a user