#include "avformat.h"
#include "internal.h"
#include "subtitles.h"
+#include "libavcodec/internal.h"
#include "libavutil/avstring.h"
#include "libavutil/bprint.h"
#include "libavutil/intreadwrite.h"
SubViewerContext *subviewer = s->priv_data;
AVStream *st = avformat_new_stream(s, NULL);
AVBPrint header;
- int res = 0;
+ int res = 0, new_event = 1;
+ int64_t pts_start = AV_NOPTS_VALUE;
+ int duration = -1;
+ AVPacket *sub = NULL;
if (!st)
return AVERROR(ENOMEM);
while (!url_feof(s->pb)) {
char line[2048];
- const int64_t pos = avio_tell(s->pb);
+ int64_t pos = 0;
int len = ff_get_line(s->pb, line, sizeof(line));
if (!len)
break;
+ line[strcspn(line, "\r\n")] = 0;
+
if (line[0] == '[' && strncmp(line, "[br]", 4)) {
/* ignore event style, XXX: add to side_data? */
continue;
if (!st->codec->extradata) { // header not finalized yet
- av_bprintf(&header, "%s", line);
+ av_bprintf(&header, "%s\n", line);
if (!strncmp(line, "[END INFORMATION]", 17) || !strncmp(line, "[SUBTITLE]", 10)) {
/* end of header */
- av_bprint_finalize(&header, (char **)&st->codec->extradata);
- if (!st->codec->extradata) {
- res = AVERROR(ENOMEM);
+ res = avpriv_bprint_to_extradata(st->codec, &header);
+ if (res < 0)
goto end;
- }
- st->codec->extradata_size = header.len + 1;
} else if (strncmp(line, "[INFORMATION]", 13)) {
/* assume file metadata at this point */
int i, j = 0;
i++;
while (line[i] == ' ')
i++;
- while (j < sizeof(value) - 1 && line[i] && !strchr("]\r\n", line[i]))
+ while (j < sizeof(value) - 1 && line[i] && line[i] != ']')
value[j++] = line[i++];
value[j] = 0;
av_dict_set(&s->metadata, key, value, 0);
}
}
- } else {
- int64_t pts_start = AV_NOPTS_VALUE;
- int duration = -1;
- int timed_line = !read_ts(line, &pts_start, &duration);
- AVPacket *sub;
-
- sub = ff_subtitles_queue_insert(&subviewer->q, line, len, !timed_line);
+ } else if (read_ts(line, &pts_start, &duration) >= 0) {
+ new_event = 1;
+ pos = avio_tell(s->pb);
+ } else if (*line) {
+ if (!new_event) {
+ sub = ff_subtitles_queue_insert(&subviewer->q, "\n", 1, 1);
+ if (!sub) {
+ res = AVERROR(ENOMEM);
+ goto end;
+ }
+ }
+ sub = ff_subtitles_queue_insert(&subviewer->q, line, strlen(line), !new_event);
if (!sub) {
res = AVERROR(ENOMEM);
goto end;
}
- if (timed_line) {
+ if (new_event) {
sub->pos = pos;
sub->pts = pts_start;
sub->duration = duration;
}
+ new_event = 0;
}
}
.read_packet = subviewer_read_packet,
.read_seek2 = subviewer_read_seek,
.read_close = subviewer_read_close,
- .flags = AVFMT_GENERIC_INDEX,
.extensions = "sub",
};