summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2011-01-26 20:42:15 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2011-01-26 20:42:15 +0200
commitf50f34245efa1012855a693558680bcfb7c348e5 (patch)
tree76e8fc186a96fdc1106b5c634d5937e514a06037 /libmpdemux
parentec55a188e4d0232acd50fcabc0a3db3be2b9538e (diff)
parentc9026cb3210205b07e2e068467a18ee40f9259a3 (diff)
downloadmpv-f50f34245efa1012855a693558680bcfb7c348e5.tar.bz2
mpv-f50f34245efa1012855a693558680bcfb7c348e5.tar.xz
Merge branch 'sub'
* sub: sub/OSD: move some related files to sub/ subtitles: options: enable -ass by default subtitles: change default libass rendering style demux_mkv, chapters: change millisecond arithmetic to ns cleanup: rename ass_* functions to mp_ass_* subs: use correct font aspect ratio for libass + converted subs cleanup: some random minor code simplification and cleanup vf_vo: fix EOSD change detection bug sd_ass: remove subreader use, support plaintext markup subtitles: style support for common SubRip tags and MicroDVD core: ordered chapters: fix bad subtitle parameter subs/demux: don't try to enable sub track when creating it subtitles/demux: store duration instead of endpts in demux packets subtitles: add framework for subtitle decoders options: add special -leak-report option subtitles: remove code trying to handle text subs with libavcodec cleanup: move MP_NOPTS_VALUE definition to mpcommon.h subtitles: move global ass_track to struct osd_state core: move most mpcommon.c contents to mplayer.c core: move global "subdata" and "vo_sub_last" to mpctx subtitles: remove sub_last_pts hack options: move -noconfig to option struct, simplify
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_lavf.c10
-rw-r--r--libmpdemux/demux_mkv.c64
-rw-r--r--libmpdemux/demux_mov.c2
-rw-r--r--libmpdemux/demux_ogg.c4
-rw-r--r--libmpdemux/demux_ty.c2
-rw-r--r--libmpdemux/demux_ty_osd.c4
-rw-r--r--libmpdemux/demuxer.c38
-rw-r--r--libmpdemux/demuxer.h6
-rw-r--r--libmpdemux/stheader.h5
-rw-r--r--libmpdemux/video.c2
10 files changed, 53 insertions, 84 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 7f665a86bb..6a32240ebd 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -36,7 +36,7 @@
#include "demuxer.h"
#include "stheader.h"
#include "m_option.h"
-#include "libvo/sub.h"
+#include "sub/sub.h"
#include "libavformat/avformat.h"
#include "libavformat/avio.h"
@@ -588,8 +588,8 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){
for(i=0; i < avfc->nb_chapters; i++) {
AVChapter *c = avfc->chapters[i];
- uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000});
- uint64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,1000});
+ uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000000000});
+ uint64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,1000000000});
t = av_metadata_get(c->metadata, "title", NULL, 0);
demuxer_add_chapter(demuxer, t ? BSTR(t->value) : BSTR(NULL), start, end);
}
@@ -756,11 +756,11 @@ static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){
if(ts != AV_NOPTS_VALUE){
dp->pts = ts * av_q2d(priv->avfc->streams[id]->time_base);
priv->last_pts= dp->pts * AV_TIME_BASE;
- // always set endpts for subtitles, even if PKT_FLAG_KEY is not set,
+ // always set duration for subtitles, even if PKT_FLAG_KEY is not set,
// otherwise they will stay on screen to long if e.g. ASS is demuxed from mkv
if((ds == demux->sub || (pkt.flags & PKT_FLAG_KEY)) &&
pkt.convergence_duration > 0)
- dp->endpts = dp->pts + pkt.convergence_duration * av_q2d(priv->avfc->streams[id]->time_base);
+ dp->duration = pkt.convergence_duration * av_q2d(priv->avfc->streams[id]->time_base);
}
dp->pos=demux->filepos;
dp->flags= !!(pkt.flags&PKT_FLAG_KEY);
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 2414b01b4b..7432b59d46 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -41,11 +41,7 @@
#include "mp_msg.h"
-#include "vobsub.h"
-#include "subreader.h"
-#include "libvo/sub.h"
-
-#include "ass_mp.h"
+#include "sub/sub.h"
#include "libavutil/common.h"
@@ -184,7 +180,7 @@ typedef struct mkv_demuxer {
} *cluster_positions;
int num_cluster_pos;
- int64_t skip_to_timecode;
+ uint64_t skip_to_timecode;
int v_skip_to_keyframe, a_skip_to_keyframe;
int num_audio_tracks;
@@ -786,8 +782,8 @@ static int demux_mkv_read_chapters(struct demuxer *demuxer)
if (!ca->n_chapter_time_start)
mp_msg(MSGT_DEMUX, warn_level,
"[mkv] Chapter lacks start time\n");
- chapter.start = ca->chapter_time_start / 1000000;
- chapter.end = ca->chapter_time_end / 1000000;
+ chapter.start = ca->chapter_time_start;
+ chapter.end = ca->chapter_time_end;
if (ca->n_chapter_display) {
if (ca->n_chapter_display > 1)
@@ -824,14 +820,14 @@ static int demux_mkv_read_chapters(struct demuxer *demuxer)
mp_msg(MSGT_DEMUX, MSGL_V,
"[mkv] Chapter %u from %02d:%02d:%02d.%03d "
"to %02d:%02d:%02d.%03d, %.*s\n", i,
- (int) (chapter.start / 60 / 60 / 1000),
- (int) ((chapter.start / 60 / 1000) % 60),
- (int) ((chapter.start / 1000) % 60),
- (int) (chapter.start % 1000),
- (int) (chapter.end / 60 / 60 / 1000),
- (int) ((chapter.end / 60 / 1000) % 60),
- (int) ((chapter.end / 1000) % 60),
- (int) (chapter.end % 1000),
+ (int) (chapter.start / 60 / 60 / 1000000000),
+ (int) ((chapter.start / 60 / 1000000000) % 60),
+ (int) ((chapter.start / 1000000000) % 60),
+ (int) (chapter.start % 1000000000),
+ (int) (chapter.end / 60 / 60 / 1000000000),
+ (int) ((chapter.end / 60 / 1000000000) % 60),
+ (int) ((chapter.end / 1000000000) % 60),
+ (int) (chapter.end % 1000000000),
BSTR_P(name));
if (idx == selected_edition){
@@ -1883,13 +1879,13 @@ static void handle_subtitles(demuxer_t *demuxer, mkv_track_t *track,
sub_utf8 = 1;
dp = new_demux_packet(size);
memcpy(dp->buffer, block, size);
- dp->pts = timecode / 1000.0;
- dp->endpts = (timecode + block_duration) / 1000.0;
+ dp->pts = timecode / 1e9;
+ dp->duration = block_duration / 1e9;
ds_add_packet(demuxer->sub, dp);
}
static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
- uint8_t *buffer, uint32_t size, int block_bref)
+ uint8_t *buffer, uint32_t size, int64_t block_bref)
{
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
demux_packet_t *dp;
@@ -1915,7 +1911,7 @@ static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
}
static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
- uint8_t *buffer, uint32_t size, int block_bref)
+ uint8_t *buffer, uint32_t size, int64_t block_bref)
{
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
int sps = track->sub_packet_size;
@@ -2028,7 +2024,7 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
mkv_track_t *track = NULL;
demux_stream_t *ds = NULL;
uint64_t old_length;
- int64_t tc;
+ uint64_t tc;
uint32_t *lace_size;
uint8_t laces, flags;
int i, num, tmp, use_this_block = 1;
@@ -2048,10 +2044,8 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
return 0;
block += old_length - length;
- tc = (time * mkv_d->tc_scale + mkv_d->cluster_tc) / 1000000.0 + 0.5;
- if (tc < 0)
- tc = 0;
- current_pts = tc / 1000.0;
+ tc = time * mkv_d->tc_scale + mkv_d->cluster_tc;
+ current_pts = tc / 1e9;
for (i = 0; i < mkv_d->num_tracks; i++)
if (mkv_d->tracks[i]->tnum == num) {
@@ -2080,7 +2074,7 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
sh_audio_t *sh = (sh_audio_t *) ds->sh;
if (block_duration != 0) {
- sh->i_bps = length * 1000 / block_duration;
+ sh->i_bps = length * 1e9 / block_duration;
track->fix_i_bps = 0;
} else if (track->qt_last_a_pts == 0.0)
track->qt_last_a_pts = current_pts;
@@ -2186,8 +2180,7 @@ static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
free(block);
return 0;
}
- block_duration =
- block_duration * mkv_d->tc_scale / 1000000.0 + 0.5;
+ block_duration *= mkv_d->tc_scale;
break;
case MATROSKA_ID_BLOCK:
@@ -2387,7 +2380,7 @@ static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
* target time after the last entry - then still seek to the first/last
* entry if that's further in the direction wanted than mkv_d->last_pts.
*/
- int64_t min_diff = target_timecode - mkv_d->last_pts * 1000;
+ int64_t min_diff = target_timecode - (int64_t)(mkv_d->last_pts * 1e9 + 0.5);
if (flags & SEEK_BACKWARD)
min_diff = -min_diff;
min_diff = FFMAX(min_diff, 1);
@@ -2395,8 +2388,7 @@ static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
if (seek_id < 0 || mkv_d->indexes[i].tnum == seek_id) {
int64_t diff =
target_timecode -
- (int64_t) (mkv_d->indexes[i].timecode *
- mkv_d->tc_scale / 1000000.0 + 0.5);
+ (int64_t) (mkv_d->indexes[i].timecode * mkv_d->tc_scale);
if (flags & SEEK_BACKWARD)
diff = -diff;
if (diff <= 0) {
@@ -2442,9 +2434,8 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
if (!(flags & SEEK_ABSOLUTE)) /* relative seek */
rel_seek_secs += mkv_d->last_pts;
- int64_t target_timecode = rel_seek_secs * 1000.0;
- if (target_timecode < 0)
- target_timecode = 0;
+ rel_seek_secs = FFMAX(rel_seek_secs, 0);
+ int64_t target_timecode = rel_seek_secs * 1e9 + 0.5;
if (mkv_d->indexes == NULL) { /* no index was found */
if (seek_creating_index(demuxer, rel_seek_secs, flags) < 0)
@@ -2462,7 +2453,8 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
if (flags & SEEK_FORWARD)
mkv_d->skip_to_timecode = target_timecode;
else
- mkv_d->skip_to_timecode = index ? index->timecode : 0;
+ mkv_d->skip_to_timecode = index ? index->timecode * mkv_d->tc_scale
+ : 0;
mkv_d->a_skip_to_keyframe = 1;
demux_mkv_fill_buffer(demuxer, NULL);
@@ -2496,7 +2488,7 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
if (demuxer->video->id >= 0)
mkv_d->v_skip_to_keyframe = 1;
- mkv_d->skip_to_timecode = index->timecode;
+ mkv_d->skip_to_timecode = index->timecode * mkv_d->tc_scale;
mkv_d->a_skip_to_keyframe = 1;
demux_mkv_fill_buffer(demuxer, NULL);
diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c
index 3175ae34bd..5ecb076698 100644
--- a/libmpdemux/demux_mov.c
+++ b/libmpdemux/demux_mov.c
@@ -64,7 +64,7 @@
#include "libavutil/common.h"
#include "ffmpeg_files/intreadwrite.h"
-#include "libvo/sub.h"
+#include "sub/sub.h"
#include "demux_mov.h"
#include "qtpalette.h"
diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c
index 1883c36cd1..3ba2627414 100644
--- a/libmpdemux/demux_ogg.c
+++ b/libmpdemux/demux_ogg.c
@@ -166,8 +166,8 @@ typedef struct ogg_demuxer {
//-------- subtitle support - should be moved to decoder layer, and queue
// - subtitles up in demuxer buffer...
-#include "subreader.h"
-#include "libvo/sub.h"
+#include "sub/subreader.h"
+#include "sub/sub.h"
#define OGG_SUB_MAX_LINE 128
static subtitle ogg_sub;
diff --git a/libmpdemux/demux_ty.c b/libmpdemux/demux_ty.c
index 5d6958a970..4309ad1387 100644
--- a/libmpdemux/demux_ty.c
+++ b/libmpdemux/demux_ty.c
@@ -44,7 +44,7 @@
#include "demux_ty_osd.h"
#include "parse_es.h"
#include "stheader.h"
-#include "sub_cc.h"
+#include "sub/sub_cc.h"
#include "libavutil/avstring.h"
#include "ffmpeg_files/intreadwrite.h"
diff --git a/libmpdemux/demux_ty_osd.c b/libmpdemux/demux_ty_osd.c
index 0d419b0813..983c243f98 100644
--- a/libmpdemux/demux_ty_osd.c
+++ b/libmpdemux/demux_ty_osd.c
@@ -23,8 +23,8 @@
//#include "stheader.h"
//#include "mp3_hdr.h"
//#include "subreader.h"
-#include "sub_cc.h"
-#include "libvo/sub.h"
+#include "sub/sub_cc.h"
+#include "sub/sub.h"
#include "demux_ty_osd.h"
//#include "dvdauth.h"
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 056822e1ab..6607f2399f 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -43,8 +43,6 @@
#include "libmpcodecs/dec_teletext.h"
#include "libmpcodecs/vd_ffmpeg.h"
-#include "ass_mp.h"
-
#ifdef CONFIG_FFMPEG
#include "libavcodec/avcodec.h"
#if MP_INPUT_BUFFER_PADDING_SIZE < FF_INPUT_BUFFER_PADDING_SIZE
@@ -188,7 +186,7 @@ struct demux_packet *new_demux_packet(size_t len)
dp->len = len;
dp->next = NULL;
dp->pts = MP_NOPTS_VALUE;
- dp->endpts = MP_NOPTS_VALUE;
+ dp->duration = -1;
dp->stream_pts = MP_NOPTS_VALUE;
dp->pos = 0;
dp->flags = 0;
@@ -351,10 +349,6 @@ sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid)
sh->opts = demuxer->opts;
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
}
- if (sid == demuxer->opts->sub_id) {
- demuxer->sub->id = id;
- demuxer->sub->sh = demuxer->s_streams[id];
- }
return demuxer->s_streams[id];
}
@@ -373,10 +367,6 @@ static void free_sh_sub(sh_sub_t *sh)
{
mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_sub at %p\n", sh);
free(sh->extradata);
-#ifdef CONFIG_ASS
- if (sh->ass_track)
- ass_free_track(sh->ass_track);
-#endif
free(sh->lang);
#ifdef CONFIG_FFMPEG
clear_parser((sh_common_t *)sh);
@@ -1076,20 +1066,6 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts,
sh_video->fps, sh_video->i_bps * 0.008f,
sh_video->i_bps / 1024.0f);
}
-#ifdef CONFIG_ASS
- if (opts->ass_enabled && ass_library) {
- for (int i = 0; i < MAX_S_STREAMS; ++i) {
- sh_sub_t *sh = demuxer->s_streams[i];
- if (sh && sh->type == 'a') {
- sh->ass_track = ass_new_track(ass_library);
- if (sh->ass_track && sh->extradata)
- ass_process_codec_private(sh->ass_track, sh->extradata,
- sh->extradata_len);
- } else if (sh && sh->type != 'v')
- sh->ass_track = ass_default_track(ass_library);
- }
- }
-#endif
return demuxer;
}
@@ -1418,9 +1394,9 @@ int demuxer_add_chapter(demuxer_t *demuxer, struct bstr name,
talloc_strdup(demuxer->chapters, mp_gtext("unknown"));
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_ID=%d\n", demuxer->num_chapters);
- mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_START=%"PRIu64"\n", demuxer->num_chapters, start);
+ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_START=%"PRIu64"\n", demuxer->num_chapters, start / 1000000);
if (end)
- mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_END=%"PRIu64"\n", demuxer->num_chapters, end);
+ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_END=%"PRIu64"\n", demuxer->num_chapters, end / 1000000);
if (name.start)
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_NAME=%.*s\n", demuxer->num_chapters, BSTR_P(name));
@@ -1473,7 +1449,7 @@ int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, double *seek_pts,
if (chapter < 0)
chapter = 0;
- *seek_pts = demuxer->chapters[chapter].start / 1000.0;
+ *seek_pts = demuxer->chapters[chapter].start / 1e9;
if (chapter_name)
*chapter_name = talloc_strdup(NULL, demuxer->chapters[chapter].name);
@@ -1490,7 +1466,7 @@ int demuxer_get_current_chapter(demuxer_t *demuxer, double time_now)
&chapter) == STREAM_UNSUPPORTED)
chapter = -2;
} else {
- uint64_t now = time_now * 1000 + 0.5;
+ uint64_t now = time_now * 1e9 + 0.5;
for (chapter = demuxer->num_chapters - 1; chapter >= 0; --chapter) {
if (demuxer->chapters[chapter].start <= now)
break;
@@ -1533,8 +1509,8 @@ float demuxer_chapter_time(demuxer_t *demuxer, int chapter, float *end)
if (demuxer->num_chapters && demuxer->chapters && chapter >= 0
&& chapter < demuxer->num_chapters) {
if (end)
- *end = demuxer->chapters[chapter].end / 1000.0;
- return demuxer->chapters[chapter].start / 1000.0;
+ *end = demuxer->chapters[chapter].end / 1e9;
+ return demuxer->chapters[chapter].start / 1e9;
}
return -1.0;
}
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 742e42aa74..e66b8f8a12 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -27,6 +27,7 @@
#include "stream/stream.h"
#include "bstr.h"
+#include "mpcommon.h"
struct MPOpts;
@@ -96,9 +97,6 @@ struct MPOpts;
// A virtual demuxer type for the network code
#define DEMUXER_TYPE_PLAYLIST (2<<16)
-
-#define MP_NOPTS_VALUE (-1LL<<63) //both int64_t and double should be able to represent this exactly
-
enum timestamp_type {
TIMESTAMP_TYPE_PTS,
TIMESTAMP_TYPE_SORT,
@@ -129,7 +127,7 @@ enum timestamp_type {
typedef struct demux_packet {
int len;
double pts;
- double endpts;
+ double duration;
double stream_pts;
off_t pos; // position in index (AVI) or file (MPG)
unsigned char* buffer;
diff --git a/libmpdemux/stheader.h b/libmpdemux/stheader.h
index 4bb2da3ac7..dc84518abc 100644
--- a/libmpdemux/stheader.h
+++ b/libmpdemux/stheader.h
@@ -19,6 +19,8 @@
#ifndef MPLAYER_STHEADER_H
#define MPLAYER_STHEADER_H
+#include <stdbool.h>
+
#include "aviheader.h"
#include "ms_hdr.h"
struct MPOpts;
@@ -135,9 +137,10 @@ typedef struct sh_sub {
SH_COMMON
int sid;
char type; // t = text, v = VobSub, a = SSA/ASS
+ bool active; // after track switch decoder may stay initialized, not active
unsigned char* extradata; // extra header data passed from demuxer
int extradata_len;
- struct ass_track *ass_track; // for SSA/ASS streams (type == 'a')
+ const struct sd_functions *sd_driver;
} sh_sub_t;
// demuxer.c:
diff --git a/libmpdemux/video.c b/libmpdemux/video.c
index bda6e661ae..400a995d57 100644
--- a/libmpdemux/video.c
+++ b/libmpdemux/video.c
@@ -38,7 +38,7 @@
#include "mpeg_hdr.h"
/* sub_cc (closed captions)*/
-#include "sub_cc.h"
+#include "sub/sub_cc.h"
/* biCompression constant */
#define BI_RGB 0L